gigatron/rom/Contrib/at67/gasm/tetronis/audio.i
2025-01-28 19:17:01 +03:00

108 lines
3.9 KiB
OpenEdge ABL

resetAudio LDWI 0x0000
STW midiCommand
STW midiDelay
STW midiNote
LDWI giga_soundChan1
STW midiScratch
LDWI title_screenMidi00 ; midi score
STW midiStreamPtr
LDI 0x04
ST ii
resetA_loop LDI giga_soundChan1 ; reset low byte
ST midiScratch
LDWI 0x0200
DOKE midiScratch ; wavA and wavX
INC midiScratch
INC midiScratch
LDWI 0x0000
DOKE midiScratch ; keyL and keyH
INC midiScratch
INC midiScratch
DOKE midiScratch ; oscL and oscH
INC midiScratch + 1 ; increment high byte
LoopCounter ii resetA_loop
RET
playMidi LDI 0x05 ; keep pumping soundTimer, so that global sound stays alive
ST giga_soundTimer
LD giga_frameCount
SUBW midiDelay
BEQ playM_start
RET
playM_start PUSH
playM_process LDW midiStreamPtr
PEEK ; get midi stream byte
STW midiCommand
LDW midiStreamPtr
ADDI 0x01
STW midiStreamPtr
LDI 0xF0
ANDW midiCommand
XORI 0x90 ; check for start note
BNE playM_endnote
CALL midiStartNote ; start note
BRA playM_process
playM_endnote XORI 0x10 ; check for end note
BNE playM_segment
CALL midiEndNote ; end note
BRA playM_process
playM_segment XORI 0x50 ; check for new segment
BNE playM_delay
LDW midiStreamPtr ; midi score
DEEK
STW midiStreamPtr ; 0xD0 new midi segment address
BRA playM_process
playM_delay LD giga_frameCount ; midiDelay = (midiCommand + peek(frameCount)) & 0x00FF
ADDW midiCommand
ST midiDelay
POP
RET
midiStartNote LDWI giga_notesTable ; note table in ROM
STW midiScratch
LDW midiStreamPtr ; midi score
PEEK
SUBI 11
LSLW
ADDW midiScratch
STW midiScratch
LUP 0x00 ; get ROM midi note low byte
ST midiNote
LDW midiScratch
LUP 0x01 ; get ROM midi note high byte
ST midiNote + 1
LDW midiCommand
ANDI 0x03 ; get channel
ADDI 0x01
ST midiScratch + 1
LDI 0xFC
ST midiScratch ; channels address 0x01FC <-> 0x04FC
LDW midiNote
DOKE midiScratch ; set note
LDW midiStreamPtr
ADDI 0x01 ; midiStreamPtr++
STW midiStreamPtr
RET
midiEndNote LDW midiCommand
ANDI 0x03 ; get channel
ADDI 0x01
ST midiScratch + 1
LDI 0xFC
ST midiScratch ; channels address 0x01FC <-> 0x04FC
LDWI 0x0000
DOKE midiScratch ; end note
RET