CMTファイル [[xevi.zip>https://img.atwikiimg.com/www32.atwiki.jp/sampleisbest/attach/576/80/xevi.zip]] mon *L *GD000 #highlight(asm){{ 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 }}