Revamp MBR

New features:
- ES:DI (potential PnP structure) is preserved
- FAT detection now works by checking for BPB values
- Uses booterr procedure
This commit is contained in:
Nero 2020-04-21 23:23:37 +02:00
parent bbfcd42f61
commit abc7b563cd
1 changed files with 119 additions and 113 deletions

View File

@ -1,51 +1,65 @@
; Memory layout:
%define self 0x00600 ; 1 sector
%define prog 0x07C00 ; 1 sector
; FDC fields in VBR ; FDC fields in VBR
%define spt (prog + 0x18) %define bps (bs + 0x0B)
%define nos (prog + 0x1A) %define md (bs + 0x15)
%define po (prog + 0x1C) %define spt (bs + 0x18)
%define nos (bs + 0x1A)
%define po (bs + 0x1C)
; blah dont judge me, i miss 8080
%macro retnz 0
jz short ($+3)
ret
%endmacro
%macro callc 1
jnc short ($+5)
call %1
%endmacro
org self
cpu 8086 cpu 8086
org 0x0600
bs: equ 0x7C00
init: init: cli
cli
; Stack grows down from PSP + 64k
xor ax, ax xor ax, ax
mov ss, ax mov ss, ax
mov sp, ax xor sp, sp
; save driver number
push dx push dx
; Relocate from [prog] to [self] ; save PnP ptr
push es
push di
; Relocate away from bootsector loading area
mov ds, ax mov ds, ax
mov es, ax mov es, ax
mov si, prog mov si, bs
mov di, self mov di, $$
mov cx, 0x100 mov cx, 0x100
rep movsw rep movsw
jmp 0:main jmp 0:main
main: %include "inc/booterr.asm"
mov bp, 0x3335
mov si, part1 ; find active partition or bail out
; result in si
findp: mov si, part1
mov cx, 4 mov cx, 4
.loop: .loop: test BYTE [si], 0x80
test BYTE [si], 0x80 retnz
jnz loadpart
add si, 0x10 add si, 0x10
loop .loop loop .loop
jmp error call errcll
main: ; find active partition
call findp
loadpart:
; transfer starting address into DAP ; transfer starting address into DAP
push si push si
add si, 0x08 add si, 0x08
mov di, dap.blocknum mov di, dap.num
movsw movsw
movsw movsw
pop si pop si
@ -53,24 +67,30 @@ loadpart:
; load sector ; load sector
push si push si
mov si, dap mov si, dap
mov bp, 0x3336
mov ah, 0x42 mov ah, 0x42
stc stc
int 0x13 int 0x13
jc error callc errcll
pop si pop si
cmp BYTE [si+4], 0x01 ; FAT bpb has "bytes per sector" at this place
jne jump ; we support only 512 byte sectors anyways
cmp word [bps], 512
jne chain
adjust: ; Media descriptor byte is never smaller than 0xF0
push dx cmp byte [md], 0xF0
jc chain
mov bp, 0x3337 ; ask BIOS what our disk geometry is
mov ah, 0x08 mov ah, 0x08
stc stc
int 0x13 int 0x13
jc error jc chain
; ES might be messed up from int 13h, fix it
push cs
pop es
; update sectors per track ; update sectors per track
xor ax, ax xor ax, ax
@ -90,47 +110,33 @@ adjust:
movsw movsw
pop si pop si
chain: ; restore PnP structure
pop di
pop es
pop dx pop dx
xor cx, cx
jump: mov bp, si
jmp 0:prog ; chain into partition boot sector
jmp 0:bs
error:
mov ax, bp
mov ah, 0x0e
mov bx, 7
int 0x10
mov al, 0x21
int 0x10
xor ax, ax
int 0x16
int 0x19
dap: dap:
.size: .size: db 0
db 0 db 0
db 0 .count: dw 1
.count: .buf: dw bs
dw 1
.buffer:
dw prog
dw 0 dw 0
.blocknum: .num: dq 0
dq 0
times (0x1BE - ($-$$)) db 0 times (0x1BE - ($-$$)) db 0
part1:
db 0x80 part1: db 0x80
.chs_start:
db 0xFF, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF
.type:
db 0x01 db 0x01
.chs_end:
db 0xFF, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF
.begin:
dd 1 dd 1
.end:
dd (FLOPPY * 2) dd (FLOPPY * 2)
times (0x1FE - ($-$$)) db 0 times (0x1FE - ($-$$)) db 0
; Boot signature
dw 0xAA55 dw 0xAA55