use16 jmp short _start nop BS_OEMName db "XXXXXXXX" BPB_BytsPerSec dw 0 BPB_SecPerClus db 0 BPB_RsvdSecCnt dw 0 BPB_NumFATs db 0 BPB_RootEntCnt dw 0 BPB_TotSec16 dw 0 BPB_Media db 0 BPB_FATSz16 dw 0 BPB_SecPerTrk dw 18 ; required BPB_NumHeads dw 2 ; required BPB_HiddSec dd 0 BPB_TotSec32 dd 0 BS_DrvNum db 0 BS_Reserved1 db 0 BS_BootSig db 29h ; required BS_VolID dd 0 BS_VolLab db "XXXXXXXXXXX" BS_FilSysType db "XXXXXXXX" _start: cli mov ax, 07c0h ; set data segment mov ds, ax mov ax, 09e0h mov ss, ax mov sp, 1000h sti mov [bootdrive], dl ; save boot drive information mov si, bootdrive call dump8hex ; get drive parameter mov dl, [bootdrive] mov ah, 0x08 int 13h mov si, buffer + 16 mov [si + 0], ch ; cylinder & 0xff mov [si + 4], dh ; head mov al, cl and al, 3fh mov [si + 8], al ; sector shr cl, 6 mov [si + 1], cl ; (cylinder & 0x300) >> 2 call dump8hex call dump8hex call dump8hex ; get drive parameter mov dl, [bootdrive] mov si, buffer mov ah, 0x48 int 13h jc die mov si, buffer + 4 call dump8hex call dump8hex call dump8hex die: hlt jmp die ; dump 32bit word dump8hex: ; SI: address mov di, hexchar mov bh, 0 mov ah, 0eh mov cx, 4 add si, 3 dump8hex_loop: mov dl, [si] mov dh, dl and dx, 0ff0h shr dl, 4 mov bl, dl mov al, byte [bx + di] int 10h mov bl, dh mov al, byte [bx + di] int 10h dec si loop dump8hex_loop mov al, 20h int 10h add si, 5 ret hexchar: db "0123456789ABCDEF" ; workarea bootdrive: dd 0 buffer: dw 32 times 30 db 0 ; padding, boot signature times 510-($-$$) db 0 dw 0aa55h