CSEG
PUBLIC NOTE_
NOTE_: ; plays a tune
      ; ax, cx, sx, si change

push bp  ; save frame pointer
mov bp, sp

mov ah, byte 01h
int 16h            ; check for key pressed
jnz endtune         ; if so, skip playing note

mov ax, [bp+4] ;
cmp ax, 0ffffh ; do we have -1 ?
jnz dosound     ; if not make sound

call delay     ; otherwise do a rest
mov sp, bp     ; restore stack pointer
pop bp
ret

dosound:

in al, 61h
push ax
or al, 03h
out 61h, al ; turn speaker on
xor si, si

mov ax, [bp+4] ; timer interval
push ax
mov al, 0B6h
out 43h, al
pop ax
out 42h, al
mov al, ah
out 42h, al   ; set up interval

call delay

pop ax
out 61h, al ; turn speaker off

endtune:

mov sp, bp ; restore stack pointer
pop bp
ret

delay:

mov cx, word [bp+8] ; high word
mov dx, word [bp+6] ; low word
mov ah, 86h
int 15h
ret         

PUBLIC clearkey_
clearkey_:

mov ah, byte 01h
int 16h            ; check for key pressed
jz nokey          ; if so

mov ah, byte 00h
int 16h            ; clear key buffer

nokey:
ret
