[org 0x7c00]
;main code-----------------------------------------------------
mov bp, 0x8000
mov sp, bp
mov si, msg
call print
mov bx, 0x9000 ;where to load (ES:BX)
mov dh, 0x02
mov dl, [boot_drive]
call disk_load
mov dx, [0x9000]
call print_hex
mov dx, [0x9200]
call print_hex
;hang--------------------------
cli
jmp $
;functions-----------------------------------------------------
;print-------------------------------------------
print:
pusha
mov ah, 0x0e ;teletype output
a:
mov al, [si] ;char to print
cmp al, 0x0
je b
int 0x10
inc si
jmp a
b:
popa
ret
;print_hex---------------------------------------
print_hex:
pusha
;manipulate hex_out----------
mov bx, dx
shr bx, 12
and bx, 0x000f
mov bx, [hex + bx]
mov [hex_out + 2], bl
mov bx, dx
shr bx, 8
and bx, 0x000f
mov bx, [hex + bx]
mov [hex_out + 3], bl
mov bx, dx
shr bx, 4
and bx, 0x000f
mov bx, [hex + bx]
mov [hex_out + 4], bl
mov bx, dx
shr bx, 0
and bx, 0x000f
mov bx, [hex + bx]
mov [hex_out + 5], bl
;end of manipulation---------
mov si, hex_out
call print
popa
ret
;load to memory------------------------------------------------
disk_load:
pusha
push dx ;save to cmp later
;dh-num_sec, dl-floppy/hdd/cd
mov ah, 0x02 ;read sectors from drive
mov al, dh ;number of sectors to read
mov dh, 0x00 ;head
mov ch, 0x00 ;cylinder
mov cl, 0x02 ;sector (second sector)
int 0x13
jc disk_err
pop dx
cmp dh, al
jne disk_err
popa
ret
disk_err:
mov si, lerr
call print
mov dx, ax
call print_hex
cli
jmp $
;data----------------------------------------------------------
msg: db "Data loaded from boot drive:", 0x0a, 0x0d, 0x0
hex_out: db "0x0000", 0x0a, 0x0d, 0x0
hex: db "0123456789ABCDEF"
lerr: db "Error: INT 13H -> AX: ", 0x0
boot_drive: db 0x80 ;floppy-iso(0x00) or hdd-qemu(0x80)
;boot number---------------------------------------------------
times 510-($-$$) db 0
dw 0xaa55
;other sectors-------------------------------------------------
times 256 dw 0xb10c
times 256 dw 0xcafe