; load 'dh' sectors from drive 'dl' into ES:BX disk_load: pusha push dx ; save dx to stack for later use, as it needs to be overwritten mov ah, 0x02 ; ah: int 0x13 function. 0x02 = 'read' mov al, dh ; al: number of sectors to read (0x01 .. 0x80) mov cl, 0x02 ; cl: sector (0x01 .. 0x11). 0x01 is boot sector, 0x02 is first 'avaliable' sector mov ch, 0x00 ; ch: cylinder (0x0 .. 0x3FF, upper 2 bits in 'cl') ; dl: drive number. caller sets it as param and gets it from bios ; 0 = floppy, 1 = floppy2, 0x80 = hdd, 0x81 = hdd2 mov dh, 0x00 ; dh: head number (0x0 .. 0xF) ; [es:bx] pointer to buf where data is stored ; caller sets it up, and is standard location for int 13h int 13h jc disk_error ; if error (in carry) pop dx cmp al, dh ; al is # of sectors read. compare it jne sectors_error popa ret disk_error: mov bx, DISK_ERROR call print call print_nl mov dh, ah ; ah = error code, dl = disk drive that caused error call print_hex sectors_error: mov bx, SECTORS_ERROR call print disk_loop: jmp $ DISK_ERROR: db "Disk read error", 0 SECTORS_ERROR: db "Incorrect number of sectors read", 0