;=============================================================== ; BOOT SECTOR ; [http://www.karig.net/0015.html] ;=============================================================== [ORG 0x7C00] [BITS 16] main: ; ------ Straighten out segment registers. ; ------ [http://www.karig.net/0002.html] jmp word 0:segzero segzero: mov ax, cs mov ds, ax mov es, ax mov fs, ax mov gs, ax ; ------ Set up call stack. cli mov ax, 0x1000 mov ss, ax mov sp, 0xFFFE sti ; ------ Clear text screen. ; ------ [http://www.karig.net/0011.html] ; set 80x25 text mode and clear screen mov ax, 3 int 0x10 ; ------ Test hex_to_byte and dump results. ; ------ [http://www.karig.net/0015.html] mov bx, 15 .1: push bx add bx, bx mov ax, [newwords+bx] mov [newword], ax call hex_to_byte pop bx mov [0x8000+bx], al dec bx jns .1 mov bx, 0x8000 call dump_16 ; ------ Halt computer. jmp short $ ; VARIABLES: newword: db 'c,' newwords: db '01','23','45','67','89','AB','CD','EF' db '65','74','83','92','a1','b0','cf','de' ; ROUTINE: hex_to_byte ; ------ [http://www.karig.net/0015.html] hex_to_byte: mov bx, [newword] mov al, bh call .1 shl al, 4 mov ah, al mov al, bl call .1 or al, ah ret .1: cmp al, '9' ja .2 sub al, '0' ret .2 and al, 0x5F sub al, ('A'-10) ret ; ROUTINES to print to the screen. ; ------ [http://www.karig.net/0008.html] clear_screen: mov ax, 3 int 0x10 xor bh, bh xor dx, dx mov ah, 2 int 0x10 ret ; ------ [http://www.karig.net/000f.html] scroll_up: mov bh, 7 xor cx, cx mov dx, (24*0x100) + 79 mov ax, (0x0600 + 1) int 0x10 ret ; ROUTINES needed to support hex dumps. ; ------ [http://www.karig.net/0009.html] byte_to_hex: xor bh, bh mov bl, al and bl, 0x0F mov ah, [.digits + bx] mov bl, al shr bl, 4 mov al, [.digits + bx] ret .digits: db "0123456789ABCDEF" print_colon: mov al, ':' jmp print_char print_space: mov al, ' ' jmp print_char print_vbar: mov al, '|' jmp print_char print_word: ; pass word in AX push ax mov al, ah call print_byte pop ax print_byte: ; pass byte in AL call byte_to_hex push ax call print_char pop ax mov al, ah ;jmp print_char print_char: xor bh, bh xor cx, cx inc cx mov ah, 0x0A int 0x10 get_pos: xor bh, bh mov ah, 3 int 0x10 next_column: inc dl cmp dl, 80 jb set_pos next_row: xor dl, dl inc dh cmp dh, 25 jb set_pos dec dh push dx call scroll_up pop dx set_pos: xor bh, bh mov ah, 2 int 0x10 ret ; ROUTINE to dump bytes to the screen. ; ------ [http://www.karig.net/0009.html] dump_16: push bx mov ax, fs call print_word call print_colon pop ax push ax call print_word call print_colon call print_space pop bx xor si, si .1: mov al, [fs:bx+si] push si push bx call print_byte call print_space pop bx pop si inc si cmp si, 16 jb .1 push bx call print_vbar call print_space pop bx xor si, si .2: mov al, [fs:bx+si] push si push bx call print_char pop bx pop si inc si cmp si, 16 jb .2 push bx call get_pos call next_row pop bx add bx, 16 ret ; ------ (Required to make this a boot sector.) ; ------ [http://www.karig.net/000d.html] times 508 - ($-$$) db 0x90 ; nop jmp short $+4 db 0x55, 0xAA