diff options
Diffstat (limited to 'stage1/main.asm')
-rw-r--r-- | stage1/main.asm | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/stage1/main.asm b/stage1/main.asm new file mode 100644 index 0000000..97ff7c7 --- /dev/null +++ b/stage1/main.asm @@ -0,0 +1,60 @@ +[org 0x7C00] + +%define KSTART 0x7E00 +%define KSECTORS (KSIZE + 511) / 512 + +boot: + ; init segment registers + xor ax, ax + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + + ; init stack + mov bp, KSTART ; stack grows down, overwriting MBR + mov sp, bp + + ; print message + mov ebx, .msg + call print_str + + ; load stage2 and stage3 + call load_stages + + ; jump into stage2 + jmp KSTART + +.msg: db 10, 13, "nyax stage1", 10, 13, 0 + + +load_stages: + mov ebx, .msg + call print_str + + mov ah, 0x02 ; read sectors from drive + mov al, KSECTORS ; number of sectors + xor ch, ch ; cylinder=0 + mov cl, 2 ; sector=2 + xor dh, dh ; head=0 + mov bx, KSTART ; buffer + int 0x13 + jc .fail ; CF set on error + cmp al, KSECTORS ; check read sectors count + jne .fail + + ret + +.fail: + mov ebx, .fail_msg + call print_str + hlt + +.msg: db "loading stage2 and stage3 from disk", 10, 13, 0 +.fail_msg: db "disk failure, try rebooting", 10, 13, 0 + +%include "stage1/print.asm" + +times 510-($-$$) db 0 +dw 0xAA55 |