; ;disk_load_16 ; [bits 16] STR_LBA: db "LBA Support Detected",0 STR_CHS: db "No CHS Support!)",0 STR_ERROR: db "Disk Read Error",0 STR_DONE: db "Stage 2 Loaded",0 disk_load_16: pusha ; check if LBA is supported mov ah,0x41 mov bx,0x55aa int 0x13 jnc disk_load_lba jmp disk_load_chs disk_load_lba: mov bx, STR_LBA call print_string call print_nextline mov dl,[BOOT_DRIVE] xor ah,ah mov ah,0x42 mov bx,0 mov ds,bx lea si,[lba_adr] int 0x13 jnc disk_load_finish jmp disk_load_error disk_load_chs: mov bx, STR_CHS call print_string call print_nextline jmp $ mov bx,0 ;target es:bx mov es,bx mov bx,0x7e00 mov al,50 ;number of sectors to read mov ah,0x02 ;BIOS read sector func mov cl,2 ; sector mov ch,0 ; cylinder mov dl,[BOOT_DRIVE] mov dh,0 ;head int 0x13 ;bios interrupt jnc disk_load_finish disk_load_error: call print_nextline mov bx, STR_ERROR call print_string call print_nextline jmp $ disk_load_finish: call print_nextline mov bx, STR_DONE call print_string call print_nextline popa ret ;; here we hold the lba addr lba_adr: dw 0x10 ; size of packet ( 16 byte) dw 16 ; number of sectors to read ; target is 0x7e00 dw 0x7e00 ; target addr. offset dw 0x0000 ; target addr. sector dd 1 ; first sector to read dd 0