rdos/boot/mbr.asm
Ain abc7b563cd Revamp MBR
New features:
- ES:DI (potential PnP structure) is preserved
- FAT detection now works by checking for BPB values
- Uses booterr procedure
2020-04-21 23:27:00 +02:00

143 lines
1.9 KiB
NASM

; FDC fields in VBR
%define bps (bs + 0x0B)
%define md (bs + 0x15)
%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
cpu 8086
org 0x0600
bs: equ 0x7C00
init: cli
xor ax, ax
mov ss, ax
xor sp, sp
; save driver number
push dx
; save PnP ptr
push es
push di
; Relocate away from bootsector loading area
mov ds, ax
mov es, ax
mov si, bs
mov di, $$
mov cx, 0x100
rep movsw
jmp 0:main
%include "inc/booterr.asm"
; find active partition or bail out
; result in si
findp: mov si, part1
mov cx, 4
.loop: test BYTE [si], 0x80
retnz
add si, 0x10
loop .loop
call errcll
main: ; find active partition
call findp
; transfer starting address into DAP
push si
add si, 0x08
mov di, dap.num
movsw
movsw
pop si
; load sector
push si
mov si, dap
mov ah, 0x42
stc
int 0x13
callc errcll
pop si
; FAT bpb has "bytes per sector" at this place
; we support only 512 byte sectors anyways
cmp word [bps], 512
jne chain
; Media descriptor byte is never smaller than 0xF0
cmp byte [md], 0xF0
jc chain
; ask BIOS what our disk geometry is
mov ah, 0x08
stc
int 0x13
jc chain
; ES might be messed up from int 13h, fix it
push cs
pop es
; update sectors per track
xor ax, ax
mov al, cl
mov [spt], ax
; update number of sides
xor ax, ax
mov al, dh
mov [nos], ax
; update partition offset
push si
add si, 0x08
mov di, po
movsw
movsw
pop si
chain: ; restore PnP structure
pop di
pop es
pop dx
xor cx, cx
mov bp, si
; chain into partition boot sector
jmp 0:bs
dap:
.size: db 0
db 0
.count: dw 1
.buf: dw bs
dw 0
.num: dq 0
times (0x1BE - ($-$$)) db 0
part1: db 0x80
db 0xFF, 0xFF, 0xFF
db 0x01
db 0xFF, 0xFF, 0xFF
dd 1
dd (FLOPPY * 2)
times (0x1FE - ($-$$)) db 0
; Boot signature
dw 0xAA55