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:
parent
bbfcd42f61
commit
abc7b563cd
136
boot/mbr.asm
136
boot/mbr.asm
@ -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)
|
||||||
|
|
||||||
org self
|
; blah dont judge me, i miss 8080
|
||||||
cpu 8086
|
%macro retnz 0
|
||||||
|
jz short ($+3)
|
||||||
|
ret
|
||||||
|
%endmacro
|
||||||
|
%macro callc 1
|
||||||
|
jnc short ($+5)
|
||||||
|
call %1
|
||||||
|
%endmacro
|
||||||
|
|
||||||
init:
|
cpu 8086
|
||||||
cli
|
org 0x0600
|
||||||
|
bs: equ 0x7C00
|
||||||
|
|
||||||
; Stack grows down from PSP + 64k
|
init: cli
|
||||||
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
|
||||||
dw 0xAA55
|
|
||||||
|
; Boot signature
|
||||||
|
dw 0xAA55
|
||||||
|
Loading…
Reference in New Issue
Block a user