]> git.dujemihanovic.xyz Git - nameless-os.git/blobdiff - boot/x86/vbr-fat32.s
Rehaul the memory map
[nameless-os.git] / boot / x86 / vbr-fat32.s
index 061ca527afc3d585558c43b495c72a68536c6476..439157f3c4299b6f7bf116f3f519fcbb0d860deb 100644 (file)
@@ -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"