diff --git a/bootdef.inc b/bootdef.inc index 163e18b..c27e404 100644 --- a/bootdef.inc +++ b/bootdef.inc @@ -1,9 +1,17 @@ -%define BOOT_FAT_SEG 0x07E0 ;right after boot sector -%define BOOT_ROOT_SEG 0x0900 ;right after FAT -%define BOOT_STAGE2_SEG 0x0B00 ;right after KERNEL_SEG -%define BOOT_STAGE2_ADD 0xB000 ;address of stage2 to jump to, org at -%define BOOT_KERNEL_SEG 0x0AC0 ;right after ROOT_DIR -%define BOOT_KERNEL_ADD 0x100000 ;final pmode kernel destination - physical +%define VERSION "0.1.2" ;HOS version + +%define BOOT_FAT_SEG 0x07E0 ;right after boot sector +%define BOOT_ROOT_SEG 0x0900 ;right after FAT +%define BOOT_KERNEL_SEG 0x0AC0 ;right after ROOT_DIR +%define BOOT_STAGE2_SEG 0x0B00 ;right after KERNEL_SEG +%define BOOT_STAGE2_ADD 0xB000 ;address of stage2 to jump to, org at +%define BOOT_KERNEL_ADD 0x100000 ;final pmode kernel destination - physical + +%define BOOT_DATA_SEG 0x9000 ;data gathered by stage2 loader goes here + +%define BOOT_HASRD 0x0000 ;1 +%define BOOT_RD_ADD 0x200000 ;2mb for ram disk +%define BOOT_DRIVE 0x7C24 ;1 - boot drive diff --git a/kernel.asm b/kernel.asm index 633befb..7c230c7 100644 --- a/kernel.asm +++ b/kernel.asm @@ -1,7 +1,11 @@ +%include "bootdef.inc" + bits 32 -org 0x100000 +org BOOT_KERNEL_ADD + + call cls mov esi, msg mov edi, 0xb8000 @@ -19,6 +23,24 @@ msg_done: jmp $ +cls: + push eax + push ecx + push edi + + mov edi, 0xb8000 + mov ecx, 2000 + mov eax, 0x0700 +cls_loop: + stosw + loop cls_loop + + pop edi + pop ecx + pop eax + + ret + msg: db "This kernel is located at 0x100000! Aren't you glad?", 0 diff --git a/stage1.asm b/stage1.asm index 264c450..2df5de7 100644 --- a/stage1.asm +++ b/stage1.asm @@ -33,6 +33,8 @@ brFSID DB 'FAT12 ' ; 0036h - File System ID ;------------------------------------------------------------------------ start: + jmp 0:jmphere ;ensure that cs=0 and ip=0x7c... +jmphere: ;dl=drive number, save it! xor ax, ax mov ds, ax @@ -133,6 +135,8 @@ error: jmp $ ;halt! no kernel file found! found_file: ;ds:si points to root dir entry + xor ax, ax + mov gs, ax mov ax, BOOT_STAGE2_SEG mov es, ax @@ -148,7 +152,7 @@ readstage2_loop: push ax call getCHSfromCluster mov ax, 0x0201 - mov dl, 0 ;[brDrive] + mov dl, [gs:BOOT_DRIVE] xor bx, bx int 0x13 mov bx, es diff --git a/stage2.asm b/stage2.asm index 0b34bd2..c6539f2 100644 --- a/stage2.asm +++ b/stage2.asm @@ -33,6 +33,8 @@ error: jmp $ ;halt! no kernel file found! found_file: ;ds:si points to root dir entry of kernel file + xor ax, ax + mov gs, ax mov ax, [ds:si+26] mov bx, BOOT_FAT_SEG mov ds, bx ;ds points to beginning of FAT @@ -44,7 +46,7 @@ readkernel_loop: push ax call getCHSfromCluster mov ax, 0x0201 - mov dl, 0 ;[brDrive] + mov dl, [gs:BOOT_DRIVE] mov bx, BOOT_KERNEL_SEG mov es, bx xor bx, bx @@ -81,10 +83,146 @@ odd_cluster: got_cluster: jmp readkernel_loop -readkernel_done: +;------------------------------------------------------ +readkernel_done: ;-------------put more real mode init stuff here! + ;----ask to load RD from floppy + mov ax, 0xb800 + mov es, ax + xor ax, ax + mov ds, ax + xor di, di + mov cx, 2000 + mov ax, 0x0700 +cls_loop: + stosw + loop cls_loop + + mov dx, 0x3d4 ;move cursor off screen... + mov al, 0x0e + out dx, al + inc dx + mov al, 0xff + out dx, al + dec dx + mov al, 0x0f + out dx, al + inc dx + out dx, al + + xor di, di + mov si, txt_welcome + mov ah, 0x1f + call puts + + mov di, 160 + mov si, txt_rd1 + mov ah, 7 + call puts + + mov si, txt_rd2 + mov di, 160*2 + call puts + + mov di, 160*3 + mov si, txt_input + call puts + +get_rd: + xor ax, ax + int 0x16 + cmp al, '1' + jz got_rd + cmp al, '2' + jnz get_rd +got_rd: + stosb + sub al, '1' + push ds + mov bx, BOOT_DATA_SEG ;segment for data to send kernel + mov ds, bx + mov [ds:BOOT_HASRD], al + pop ds ;ds=0 + cmp al, 0 ;dont load rd + jz no_rd + + mov cx, 80 + mov edi, 0xb8000+160*4 +filler_loop: + mov word [ds:edi], 0x0400+176 + inc edi + inc edi + loop filler_loop + mov cx, 80 ;80 cylinders to read + xor si, si + mov edi, BOOT_RD_ADD ;ram disk address +read_cylinder: + push cx + mov bx, 0x0100 + mov es, bx + xor bx, bx + mov ax, 0x0224 + mov cx, si + mov ch, cl + mov cl, 1 + xor dx, dx + mov dl, [gs:BOOT_DRIVE] + int 0x13 + + mov ebx, 0xb8000 + add bx, si + shl bl, 1 + mov word [ds:ebx+160*4], 0x0200+219 + + push si + mov esi, 0x1000 + mov cx, 0x2400 +copydisk_loop: + mov ax, [ds:esi] + inc esi + inc esi + mov [ds:edi], ax + inc edi + inc edi + loop copydisk_loop + + pop si ;what cylinder# we are on... + inc si + pop cx + loop read_cylinder + +no_rd: + xor ax, ax + mov ds, ax + mov ax, 0xb800 + mov es, ax + mov si, txt_vesa + mov di, 160*5 + mov ah, 7 + call puts + + + xor ax, ax + int 0x16 jmp go_pm +puts: + lodsb + or al, al + jz puts_done + stosb + mov al, ah + stosb + jmp puts +puts_done: + ret + +txt_welcome: db " Welcome to HOS v", VERSION, "! ", 0 +txt_rd1: db "1. Do not load an initial ram disk", 0 +txt_rd2: db "2. Load initial ram disk from floppy", 0 +txt_input: db "Enter your selection: ", 0 +txt_vesa: db "VESA version: ", 0 + ;------------------------------------------------------ getCHSfromCluster: ;input: ax=lba of sector on floppy (0-2879) @@ -148,12 +286,10 @@ pmode: mov ax, KERNEL_DATA mov es, ax mov ds, ax + mov fs, ax + mov gs, ax jmp KERNEL_CODE:BOOT_KERNEL_ADD kernel: db "KERNEL BIN" -k_count: dw 0 -times 510-($-$$) db 0 - -db 0x55, 0xaa