; number of sectors to be read ; 3 * 512 for bootloader stage2 and the kernel code ; (note: the first sector gets loaded by the BIOS, so ; subtract 1 here!) NOF_LOAD_SECTORS equ 13 ; IN bx: begin of memory area to dump ; IN ax: number of words to dump dump_range: mov dx, bx call print_hex mov dx, [bx] call print_hex call print_newline add bx, 2 dec ax cmp ax, 0 jnz dump_range ret ; IN dx: hex value to print print_hex: push bx push si mov si, HEX_TEMPLATE mov bx, dx shr bx, 12 mov bx, [HEXABET+bx] mov [HEX_TEMPLATE+2], bl mov bx, dx and bx, 0x0FFF shr bx, 8 mov bx, [HEXABET+bx] mov [HEX_TEMPLATE+3], bl mov bx, dx and bx, 0x00FF shr bx, 4 mov bx, [HEXABET+bx] mov [HEX_TEMPLATE+4], bl mov bx, dx and bx, 0x000F mov bx, [HEXABET+bx] mov [HEX_TEMPLATE+5], bl call print_string pop si pop bx ret HEX_TEMPLATE: db '0x???? ', 0 HEXABET: db '0123456789ABCDEF' print_newline: push ax mov al, 10 call print_char mov al, 13 call print_char pop ax ret ; IN si print_string: push ax _loop_print_string: lodsb cmp al, 0 je print_string_fini call print_char jmp _loop_print_string print_string_fini: pop ax ret ; IN al: character to print ; MOD ah print_char: mov ah, 0x0e int 0x10 ret fat_cursor: push ax push cx mov ah, 0x01 mov cx, 0x0007 int 0x10 pop cx pop ax ret ; OUT: current row current_row: push ax push bx push cx mov ah, 0x03 mov bh, 0 int 0x10 pop cx pop bx pop ax ret ; IN dl: drive to read from read_from_disk: mov ah, 0x02 ; read sectors from drive mov al, NOF_LOAD_SECTORS ; read 1 sector mov ch, 0 ; select first cylinder mov dh, 0 ; first head mov cl, 2 ; second sector after boot sector mov bx, 0 ; where to store the data mov es, bx mov bx, 0x7e00 ; 512 bytes after first sector int 0x13 jc read_error cmp al, NOF_LOAD_SECTORS ; 1 sector read? jne short_read ; if not, short read ret read_error: mov si, DISK_ERROR call print_string mov dh, 0 mov dl, ah call print_hex jmp $ short_read: mov si, SHORT_READ call print_string jmp $