X-Git-Url: http://git.dujemihanovic.xyz/posts?a=blobdiff_plain;f=boot%2Fx86%2Fvbr-fat32.s;h=439157f3c4299b6f7bf116f3f519fcbb0d860deb;hb=5138270e466cf2dd21bf0aa6356672fdcc85fee6;hp=061ca527afc3d585558c43b495c72a68536c6476;hpb=dad65146188909b9568ed39b3b3fbc5e88e158c3;p=nameless-os.git diff --git a/boot/x86/vbr-fat32.s b/boot/x86/vbr-fat32.s index 061ca52..439157f 100644 --- a/boot/x86/vbr-fat32.s +++ b/boot/x86/vbr-fat32.s @@ -2,14 +2,19 @@ ; This is what's going to be on most USB sticks and HDDs, for now bits 16 -org 0x7c00 +org 0xfe00 cpu 686 -STAGE3_ADDRESS equ 0x8000 +STAGE3_ADDRESS equ 0x1800 STAGE3_SEGMENT equ STAGE3_ADDRESS >> 4 STAGE3_OFFSET equ STAGE3_ADDRESS & 0xf -%include "fat32-structs.s" +%include "fat32/fat32-structs.s" + +%macro print 1 + mov si, %1 + call print_str +%endmacro _start: jmp short real_start @@ -20,11 +25,10 @@ times 0x57 db 0 ; skip past BPB real_start: sti ; no need to set up segments and stack again, because MBR did it for us - mov bp, 0x7c00 + mov bp, 0xfe00 ; we expect the boot drive to be in DL and our partition table entry in DS:SI mov [BOOT_DRIVE], dl - mov [part_table_entry], si ; calculate the 1st sector of the data area call get_1st_data_sec @@ -37,7 +41,9 @@ real_start: mov eax, BPB_RootClus call read_cluster_chain + push cx mov cx, 11 + push si .find_stage_3: mov si, STAGE3_NAME cmp byte [es:di], 0 ; we have no more entries to look at @@ -53,29 +59,33 @@ real_start: add bx, 0x1000 mov es, bx .stage3_found: - sub di, 0xb ; "repe cmpsb" incremented this + pop si + pop cx + add di, 9 ; knowing that cmpsb incremented this by 11, we can also increment it by 9 + ; right here so we can use 1 less offset below ; stage 3 has been found and ES:DI points to its directory entry - mov ax, [es:di+dir_entry.firstclushi] ; load high half of the 1st cluster + mov ax, [es:di] ; load high half of the 1st cluster shl eax, 16 - mov ax, [es:di+dir_entry.firstcluslo] ; load low half of the 1st cluster + mov ax, [es:di+(dir_entry.firstcluslo-dir_entry.firstclushi)] ; load low half of the 1st cluster mov bx, STAGE3_SEGMENT mov es, bx mov di, STAGE3_OFFSET call read_cluster_chain ; read stage 3 - mov ds, bx - call STAGE3_SEGMENT:STAGE3_OFFSET ; call stage 3 + mov dl, [BOOT_DRIVE] + call STAGE3_ADDRESS ; call stage 3 jmp .halt ; halt in case we return, which should never happen .stage3_missing: - mov si, stage3_missing - call print + print stage3_missing + jmp .halt +.error: + print read_error .halt: - cli hlt jmp short $-1 ; ds:si - string -print: +print_str: pusha mov ah, 0xe xor bh, bh @@ -93,7 +103,7 @@ print: popa ret -%include "fat32.s" +%include "fat32/fat32.s" stage3_missing: db "LOADER.BIN is missing", 0 STAGE3_NAME: db "LOADER BIN"