org $d000
call init
L1:
in a, ($40)
and $20
jp nz, L1
L2:
in a, ($40)
and $20
jp z, L2
call play
jp L1
;-------+-------+-------+-------+-------+
init proc
ld a, $0c
ld (param1+0), a
ld hl, data1
ld (param1+1), hl
ld (param1+3), hl
ld a, 1
ld (param1+5), a
ld a, $0d
ld (param2+0), a
ld hl, data2
ld (param2+1), hl
ld (param2+3), hl
ld a, 1
ld (param2+5), a
ld a, $0e
ld (param3+0), a
ld hl, data3
ld (param3+1), hl
ld (param3+3), hl
ld a, 1
ld (param3+5), a
ld c, $0f
ld a, $36
out (c), a
ld a, $76
out (c), a
ld a, $b6
out (c), a
ld a, $c8
out ($02), a
ret
endp
;-------+-------+-------+-------+-------+
play proc
ld ix, param1
call playch
ld ix, param2
call playch
ld ix, param3
call playch
ret
endp
;-------+-------+-------+-------+-------+
playch proc
local L1,L2,L3,EXIT
ld a, (ix+5)
dec a
jp nz, L3
; tickが0ならdata処理
ld l, (ix+3)
ld h, (ix+4)
L1:
ld e, (hl) ; 音番号
inc hl
ld a, (hl) ; 音長
inc hl
cp $ff
jp nz, L2
; 音長が$ffなら先頭に戻る
ld l, (ix+1)
ld h, (ix+2)
jp L1
L2:
ld (ix+3), l
ld (ix+4), h
ld (ix+5), a
ld a, e
add a, a
ld h, 0
ld l, a
ld de, tone
add hl, de ; hl = tone + 2 * 音番号
ld c, (ix+0)
outi
outi
jp EXIT
L3:
ld (ix+5), a
cp 2
jp nz, EXIT
; tickがxならnote off
ld c, (ix+0)
xor a
out (c), a
out (c), a
EXIT:
ret
endp
;-------+-------+-------+-------+-------+
; +0 出力ポート番号
; +1 元のdataアドレス
; +3 次のdataアドレス
; +5 tick
param1 ds 6
param2 ds 6
param3 ds 6
; C C# D D# E F F# G G# A A# B
tone dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,64793 ; O1
dw 61156,57724,54484,51426,48540,45815,43244,40817,38526,36364,34323,32396 ; O2
dw 30578,28862,27242,25713,24270,22908,21622,20408,19263,18182,17161,16198 ; O3
dw 15289,14431,13621,12857,12135,11454,10811,10204, 9631, 9091, 8581, 8099 ; O4
dw 7645, 7215, 6810, 6428, 6067, 5727, 5405, 5102, 4816, 4545, 4290, 4050 ; O5
dw 3822, 3608, 3405, 3214, 3034, 2863, 2703, 2551, 2408, 2273, 2145, 2025 ; O6
; 音番号,音長
data1 db 53,24, 0,16, 48,8, 53,8, 57,8, 60,8, 57,8, 0,8, 53,8
db 55,8, 0,8, 55,8, 55,8, 0,8, 50,8+8, 0,8, 55,8, 53,8, 0,8, 52,8
db 53,24, 0,16, 48,8, 53,8, 57,8, 60,8, 57,8, 0,8, 53,8
db 54,8, 0,8, 54,8, 54,8, 0,8, 53,8+48
db $ff,$ff
data2 db 45,24, 0,16, 45,8, 45,8, 48,8, 53,8, 48,8, 0,8, 45,8
db 46,8, 0,8, 46,8, 46,8, 0,8, 46,8+8, 0,8, 46,8, 46,8, 0,8, 46,8
db 45,24, 0,16, 45,8, 45,8, 45,8, 45,8, 45,8, 0,8, 45,8
db 46,8, 0,8, 46,8, 46,8, 0,8, 45,8+48
db $ff,$ff
data3 db 29,8, 29,8, 29,8, 29,8, 0,16, 29,8, 29,8, 29,8, 29,8, 0,16
db 29,8, 29,8, 29,8, 29,8, 0,16, 29,8, 29,8, 29,8, 29,8, 0,16
db 29,8, 29,8, 29,8, 29,8, 0,16, 29,8, 29,8, 29,8, 29,8, 0,16
db 29,8, 29,8, 29,8, 29,8, 0,8, 29,8, 0,48
db $ff,$ff