AS = yasm # choose yasm or nasm here
ASFLAGS = -f bin # compile a raw binary
-boot: boot.s print.s
+boot: boot.s print.s disk.s
$(AS) $(ASFLAGS) -o $@ boot.s
clean:
org 7c00h ; boot sector is loaded at 0x7c00
_start
- mov di, printing_numbers
- call print
+ mov [boot_drive], dl ; BIOS sets dl to number of boot drive, we don't want to forget this
- or bl, 1
- mov dx, 0DEADh ; number to print
- call print_word
-
- mov di, space
- call print
-
- xor bl, bl
- mov dx, 0BEEFh
- call print_word
-
- mov di, waiting
- call print
+ mov bp, 8000h ; Move the stack away
+ mov sp, bp
- mov di, keystroke
- mov bl, 1
+ push cs
+ pop es
+ mov bx, 9000h ; Load at 0000:9000
+ mov dh, 2 ; Load 5 sectors
+ mov dl, [boot_drive] ; Load from boot drive
+ call read_sectors
-.loop
- mov ah, 0
- int 16h
- cmp ah, 1Ch
- je .enterpressed
- jmp .continue
- cmp ah, 0Eh
- je .backspace
- jmp .continue
-.enterpressed
- pusha
- mov ah, 0Eh
- mov al, 0Dh
- int 10h
- mov al, 0Ah
- int 10h
- popa
- jmp .loop
-.backspace
- pusha
- mov ah, 03h
- mov bh, 0
- int 10h
- dec dl
- mov ah, 02h
- int 10h
- mov ah, 0Eh
- mov al, ' '
- int 10h
- mov ah, 02h
- int 10h
- popa
- jmp .loop
-.continue
- mov [keystroke], al
- call print
- jmp .loop
+ mov dx, [9000h] ; Print value at 9000h, should be 0xDEAD
+ call print_word
+ mov dx, [9000h + 512] ; Print value at 9200h, should be 0xBEEF
+ call print_word
-printing_numbers db "Printing some random hex numbers", 0
-waiting db "I await keystrokes", 0
-keystroke db "$", 0
-space db " ", 0
+ jmp $ ; Endless loop
%include "print.s"
+%include "disk.s"
+
+boot_drive resb 1 ; Reserve 1 byte for boot drive number
+
+times 510-($-$$) db 0 ; fill with 0 until 0x1fc is reached
+dw 0AA55h ; BIOS MBR signature
- times 510-($-$$) db 0 ; fill with 0 until 0x1fc is reached
- dw 0AA55h ; BIOS MBR signature
+times 256 dw 0DEADh ; Fill in 2nd sector with 0xDEAD
+times 256 dw 0BEEFh ; Fill in 3rd sector with 0xBEEF