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
mov ah, 2
int 10h
%endmacro
-
%macro spkon 0
in al, KB_CTRL
or al, 3
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
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
.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