108 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			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 |