; Memory layout: %define self 0x00600 ; 1 sector %define prog 0x07C00 ; 1 sector ; FDC fields in VBR %define spt (prog + 0x18) %define nos (prog + 0x1A) %define po (prog + 0x1C) 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, 0x3335 mov si, part1 mov cx, 4 .loop: test BYTE [si], 0x80 jnz loadpart add si, 0x10 loop .loop jmp error loadpart: ; transfer starting address into DAP push si add si, 0x08 mov di, dap.blocknum movsw movsw pop si ; load sector push si mov si, dap mov bp, 0x3336 mov ah, 0x42 stc int 0x13 jc error pop si cmp BYTE [si+4], 0x01 jne jump adjust: push dx mov bp, 0x3337 mov ah, 0x08 stc int 0x13 jc error ; 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 pop dx jump: jmp 0:prog 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