diff --git a/boot/mbr.asm b/boot/mbr.asm new file mode 100644 index 0000000..48109f0 --- /dev/null +++ b/boot/mbr.asm @@ -0,0 +1,77 @@ +; Memory layout: +%define self 0x00600 ; 1 sector +%define prog 0x07C00 ; 1 sector + +org self +cpu 8086 + +init: + cli + + ; Stack grows down from PSP + 64k + xor ax, ax + mov ss, ax + mov sp, ax + + push dx + + ; Relocate from [prog] to [self] + mov ds, ax + mov es, ax + mov si, prog + mov di, self + mov cx, 0x100 + rep movsw + + jmp 0:main + +main: + mov bp, 0x0035 + mov WORD [dap.blocknum], 1 + mov si, dap + mov ah, 0x42 + stc + int 0x13 + jc error + mov cx, [dap.blocknum] + int3 + +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: +.size: + db 0 + db 0 +.count: + dw 1 +.buffer: + dw prog + dw 0 +.blocknum: + dq 0 + +times (0x1BE - ($-$$)) db 0 +part1: + db 0x80 +.chs_start: + db 0xFF, 0xFF, 0xFF +.type: + db 0x01 +.chs_end: + db 0xFF, 0xFF, 0xFF +.begin: + dd 1 +.end: + dd (FLOPPY * 2) + +times (0x1FE - ($-$$)) db 0 +dw 0xAA55