;=============================================================== ; BOOT SECTOR ; [http://www.karig.net/0016.html] ;=============================================================== [ORG 0x0800] ; (Boot sector is loaded at 0x7C00 but moves itself.) [BITS 16] stage_1: ; CODE EXECUTED FROM ADDRESS 0x7C00 ; ------ Straighten out segment registers. ; ------ [http://www.karig.net/0016.html] xor ax, ax mov ds, ax mov es, ax mov fs, ax mov gs, ax ; ------ Set up call stack. cli mov ss, ax mov sp, 0x0800 mov di, sp sti ; ------ Move this boot sector lower in memory. cld mov cx, 256 mov si, 0x7C00 rep movsw ; ------ Test accuracy of jump, part 1: Initialize counter. xor bx, bx ; ------ Jump to new location. jmp 0:0x0800 + (stage_2 - stage_1) ; ------ Jump over the following to "stage_2". ; random garbage dd 0x12345678, 0x9ABCDEF0 ; ------ Test accuracy of jump, part 2: ; ------ If jump is short, counter will not equal one. inc bx inc bx inc bx stage_2: ; CODE EXECUTED FROM ADDRESS 0x0800 ; ------ Test accuracy of jump, part 3: Increment counter. inc bx ; ------ Fill boot sector area with zeroes. cld xor al, al mov di, 0x7C00 mov cx, 256 rep stosw ; ------ Test accuracy of jump, part 4: Store counter into the ; ------ memory just blanked out, so that dump_16 reveals it. mov [0x7C00], bx ; ------ Dump area to which boot sector was copied. call clear_screen mov bx, 0x0800 call dump_16 call dump_16 call dump_16 call dump_16 ; ------ Dump area from which boot sector was copied. ; ------ Test accuracy of jump, part 5: Display counter. mov bx, 0x7C00 call dump_16 call dump_16 call dump_16 call dump_16 ; ------ Halt computer. jmp short $ ; ROUTINES to print to the screen. ; ------ [http://www.karig.net/0008.html] clear_screen: mov ax, 3 int 0x10 mov ax, 0x0500 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