bin = bootcard.img
+QEMU_FLAGS = -soundhw pcspk
+
$(bin): bootcard.asm
nasm -f bin -o $@ $<
.PHONY: run
run: $(bin)
- qemu-system-i386 -hda $<
+ qemu-system-i386 -hda $< $(QEMU_FLAGS)
.PHONY: debug
debug: $(bin)
- qemu-system-i386 -S -s -hda $<
+ qemu-system-i386 -S -s -hda $< $(QEMU_FLAGS)
.PHONY: disasm
disasm: $(bin)
; ---- boot me! ----
; nasm -f bin -o bootcard.img bootcard.asm
-; cat bootcard.img >/dev/<usbstickdevice>
+; cat bootcard.img >/dev/<usbstick>
; reboot
org 7c00h
bits 16
+data_start equ 7e00h
+osc_freq equ 1193182
+PIT_DATA0 equ 40h
+PIT_DATA2 equ 42h
+PIT_CMD equ 43h
+PIT_CMD_CHAN0 equ 00h
+PIT_CMD_CHAN1 equ 40h
+PIT_CMD_CHAN2 equ 80h
+PIT_CMD_HILO equ 30h
+PIT_CMD_SQWAVE equ 06h
+KB_CTRL equ 61h
+
+%define DIV_ROUND(a, b) ((a) / (b) + ((a) % (b)) / ((b) / 2))
+
+%macro setcursor 2
+ mov dl, %1
+ mov dh, %2
+ xor bx, bx
+ mov ah, 2
+ int 10h
+%endmacro
+
+%macro spkon 0
+ in al, KB_CTRL
+ or al, 3
+ out KB_CTRL, al
+%endmacro
+%macro spkoff 0
+ in al, KB_CTRL
+ and al, 0fch
+ out KB_CTRL, al
+%endmacro
+
xor ax, ax
mov ds, ax
mov ss, ax
+ mov sp, 7c00h
+
+ call init_spk
mov ax, 13h
int 10h
-
mov ax, 0a000h
mov es, ax
+
mov ax, 0303h
mov cx, 32000
+ xor di, di
rep stosw
+ setcursor 10, 12
+ mov si, str1
+ call textout
+ setcursor 12, 13
+ mov si, str2
+ call textout
+
infloop:
hlt
jmp infloop
- times 446-($-$$) db 0
- db 80h ; active partition
- db 20h ; start head
- db 21h ; start cylinder
- db 0 ; start sector
- db 0ch ; type
- db 28h ; last head
- db 20h ; last cylinder
- db 08h ; last sector
- dd 00000800h ; first lba
- dd 0001f800h ; number of sectors (lba)
+init_spk:
+ xor ax, ax
+ mov [32], ax
+ mov word [34], timer_intr
+
+ mov al, PIT_CMD_CHAN2 | PIT_CMD_HILO | PIT_CMD_SQWAVE
+ out PIT_CMD, al
+ mov ax, DIV_ROUND(osc_freq, 440)
+ out PIT_DATA2, al
+ mov al, ah
+ out PIT_DATA2, al
+ spkon
+ sti
+ ret
+
+textout:
+ mov al, [si]
+ and al, al
+ jz .done
+ mov ah, 0eh
+ mov bx, 0fh
+ int 10h
+ inc si
+ jmp textout
+.done: ret
+
+timer_intr:
+ spkoff
+ mov al, 20h
+ out 20h, al ; EOI
+ iret
+
+str1: db 'message message blah',0
+str2: db 'Michael & Athina',0
+
+ times 446-($-$$) db 0
+ dd 00212080h
+ dd 0820280ch
+ dd 00000800h
+ dd 0001f800h
times 510-($-$$) db 0
dw 0aa55h