settimer macro
[bootcard] / bootcard.asm
index e0955ed..e582ebd 100644 (file)
@@ -7,6 +7,9 @@
        bits 16
 
 data_start     equ 7e00h
+nticks         equ data_start
+muscur         equ nticks + 4
+
 osc_freq       equ 1193182
 PIT_DATA0      equ 40h
 PIT_DATA2      equ 42h
@@ -27,7 +30,6 @@ KB_CTRL               equ 61h
        mov ah, 2
        int 10h
 %endmacro
-
 %macro spkon 0
        in al, KB_CTRL
        or al, 3
@@ -38,13 +40,26 @@ KB_CTRL             equ 61h
        and al, 0fch
        out KB_CTRL, al
 %endmacro
+%macro settimer 2
+       mov al, (PIT_CMD_CHAN0 + (%1 << 6)) | PIT_CMD_HILO | PIT_CMD_SQWAVE
+       out PIT_CMD, al
+       mov ax, %2
+       out PIT_DATA0 + %1, al
+       mov al, ah
+       out PIT_DATA0 + %1, al
+%endmacro
 
        xor ax, ax
        mov ds, ax
        mov ss, ax
        mov sp, 7c00h
 
-       call init_spk
+       mov dword [nticks], 0
+       mov dword [muscur], 0
+       mov word [32], timer_intr
+       mov word [34], 0
+
+       settimer 0, DIV_ROUND(osc_freq, 250)
 
        mov ax, 13h
        int 10h
@@ -63,27 +78,12 @@ KB_CTRL             equ 61h
        mov si, str2
        call textout
 
+       sti
+
 infloop:
        hlt
        jmp infloop
 
-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
@@ -96,14 +96,48 @@ textout:
 .done: ret
 
 timer_intr:
-       spkoff
-       mov al, 20h
+       mov ax, [nticks]
+       inc ax
+       mov [nticks], ax
+
+       mov bx, [muscur]
+       shl bx, 2
+       mov cx, [music + bx]
+       cmp cx, 0ffffh
+       jz .off
+       cmp ax, cx
+       jb .eoi
+
+       inc dword [muscur]
+       mov ax, [music + 2 + bx] ; grab timeout
+       test ax, ax
+       jz .off
+       mov bx, ax
+
+       settimer 2, bx
+       spkon
+       jmp .eoi
+
+.off:  spkoff
+
+.eoi:  mov al, 20h
        out 20h, al     ; EOI
        iret
 
 str1:  db 'message message blah',0
 str2:  db 'Michael & Athina',0
 
+music:
+       dw 0, 500
+       dw 10, 0
+       dw 20, 2000
+       dw 30, 0
+       dw 40, 500
+       dw 50, 0
+       dw 60, 2000
+       dw 70, 0
+       dw 0ffffh, 0
+
        times 446-($-$$) db 0
        dd 00212080h
        dd 0820280ch