; ***************************** ; * MULTI.SRC1 * ; * (C) 1992, ERIC RANGELL * ; ***************************** ; ; ; CHKEND - CHECK FOR END OF PART ; CHKEND LDX CURRTRK ;MOVE TO 1ST DATA BYTE LDA CURADRL,X STA DATAPTR LDA CURADRH,X STA DATAPTR+1 LDY #$00 FINDPOS LDA (DATAPTR),Y ;SKIP OVER THE DELAY BPL POSBYTE JSR INCDATAP CLV BVC FINDPOS POSBYTE JSR INCDATAP LDA DATAPTR ;NOW POINTING TO MIDI INSTRUCTION STA CURADRL,X LDA DATAPTR+1 STA CURADRH,X LDA #$00 ;ASSUME NOT EOF STA EOFFLAG ; LDX CURRTRK ;(REDUNDANT CODE) ; LDA CURADRL,X ; STA DATAPTR ; LDA CURADRH,X ; STA DATAPTR+1 LDY #$00 LDA (DATAPTR),Y ; GET MIDI BYTE BPL RUNNING ; IF POSITIVE -> RUNNING STATUS STA CURRSTS ; ELSE WE GOT A STATUS BYTE AND #$7F ; TAX ; MASK HI BIT AND TRANSFER TO X LDA DBTABLE,X ; LOOK UP # DATA BYTES BMI SPECIAL ; IF SPECIAL CASE PROCESS F0 OR FF STA CURRDB ; STORE # DATABYTES LDX CURRTRK STA DBYTES,X LDA CURRSTS ; AND STATUS STA LASTSTAT,X RUNNING LDA DBYTES,X ; ADD NUMBER OF DATABYTES... STA CONVOUT+3 LDA #$00 STA CONVOUT+2 STA CONVOUT+1 STA CONVOUT CLC ADDIT LDA DATAPTR ; TO CURRENT DATA POINTER ADC CONVOUT+3 STA ENDPTR LDA DATAPTR+1 ADC CONVOUT+2 STA ENDPTR+1 LDA ENDPTR+1 ; COMPARE NEW ADRS TO UPPER LIMIT LDX CURRTRK CMP UPLIMH,X BNE ALLOK LDA ENDPTR CMP UPLIML,X BCC ALLOK SEC ;SIGNAL THAT NEED MORE DATA RTS ; OR ALLOK CLC ;EVERYTHINGS FINE RTS ; ; SPECIAL LOGIC HANDLES META EVENTS AND SYSEX EVENTS ; (CURRENTLY IGNORES ALL SYSEX AND META, EXCEPT END OF TRACK EVENT) ; CLC SPECIAL CMP #$FF ; IS IT A META EVENT? BNE SYSEX INY ; YES- GET NEXT BYTE (TYPE OF EVENT) LDA (DATAPTR),Y CMP #$2F ; IS IT END OF TRACK? BNE IGNORE ; NO - IGNORE THE EVENT LDA #$01 ; YES - SIGNAL EOF STA EOFFLAG SEC RTS IGNORE JSR INCDATAP ; SKIP OVER THE FF SYSEX JSR INCDATAP ; SKIP OVER THE F0 OR META EVENT TYPE JSR DELTA ; CONVERT THE VLQ FOR THE LENGTH LDA #$01 STA METAFLAG ; SIGNAL PROCESSES NOT TO XMIT SEC BCS ADDIT ; RESUME PROCESSING ABOVE ; ; ADDS LENGTH TO CURRENT ADRS ;>>>> WE MAY HAVE PROBLEMS WITH SYSEX/META BOUNDARY TESTING AT END OF PAGE ; ; ; INCDATAP - ADD 1 TO DATA POINTER ; INCDATAP INC DATAPTR BNE INCDEXIT INC DATAPTR+1 INCDEXIT RTS ; ; ENABLE ANY TRANSMISSIONS DISABLED BY METAFLAG ; ENBLXMIT LDA #$00 STA METAFLAG RTS ; ; ; APPLE DELAY ROUTINE ; APPLEDLY LDY SMALLEST+2 LDX SMALLEST+3 DONEYET CPY #$00 BNE APPLED1 CPX #$00 BNE APPLED1 RTS ; APPLED1 LDA SPEED JSR WAIT DEX CPX #$FF BNE DONEYET DEY CLV BVC DONEYET ; ; APPLSEND STA $C0A9 WAITXMIT LDA $C0A8 AND #$02 BEQ WAITXMIT RTS ; ASAVE DFB $00 XSAVE DFB $00 YSAVE DFB $00 PREVSTAT DFB $00 ; ; QUEUEIT - IF ONE BYTE DELAY USE $FD XX, IF TWO USE $FF HI LO ; QUEUEIT STA ASAVE STX XSAVE STY YSAVE LDA SMALLEST+2 BNE TWODUR LDA SMALLEST+3 BNE ONEDUR RTS ;DON'T WRITE ZERO DURS ; TWODUR LDA #$FF JSR WRITEQ LDA SMALLEST+2 JSR WRITEQ LODUR LDA SMALLEST+3 JSR WRITEQ LDA ASAVE LDX XSAVE LDY YSAVE RTS ONEDUR LDA #$FD JSR WRITEQ CLV BVC LODUR ; WRITEQ LDY #QREG STA (BASL),Y LDA #QSUB JSR USRVECT RTS ; ; PRCSDLY JSR ADJDRTN ;ADJUST BY SMALL RANDOM AMOUNT LDA FUNCTION AND #$7F ;STRIP OFF HI BIT CMP #$02 BNE NOQUEUE JSR QUEUEIT RTS NOQUEUE JSR APPLEDLY RTS ; ; SENDIT STA ASAVE STX XSAVE STY YSAVE JSR ADJVOL ;CHECK FOR VOL BYTE, IF YES, ADJ BY SMALL RND AMT ;WILL ADJUST ASAVE IF IT IS A VOL BYTE ; LDA FUNCTION AND #$7F CMP #$01 ;FUNCTION 1 BNE FUNC02 LDY #MSREG ;GET BYTE INTO PSEUDO ZP REGISTER LDA ASAVE STA (BASL),Y LDA #MSEND ;CALL MIDI SEND SUBROUTINE JSR USRVECT LDA ASAVE LDX XSAVE LDY YSAVE RTS ; FUNC02 CMP #$02 ;WHEN INSERTING INTO Q, CHECK FOR RUNNING STS BNE FUNC0 LDA ASAVE BPL OUTQ CMP PREVSTAT BEQ RESTORE STA PREVSTAT ; OUTQ JSR WRITEQ ; RESTORE LDA ASAVE LDX XSAVE LDY YSAVE RTS ; FUNC0 LDA ASAVE JSR APPLSEND LDA ASAVE LDX XSAVE LDY YSAVE RTS ; PRCSMIDI LDA METAFLAG CMP #$01 BNE NOTMETA JMP METAHNDL NOTMETA LDA (DATAPTR),Y BPL RUNNSTAT JSR INCDATAP ;SKIP STATUS BYTE RUNNSTAT LDX CURRTRK LDA LASTSTAT,X JSR SENDIT LDA DBYTES,X ;GET # DATABYTES IN X TAX SLOOP LDY #$00 LDA (DATAPTR),Y JSR SENDIT ;SEND EACH DATA BYTE JSR INCDATAP DEX BNE SLOOP LDX CURRTRK LDA DATAPTR STA CURADRL,X LDA DATAPTR+1 STA CURADRH,X JSR DELTA ;GET NEXT DELTA TIME LDX CURRTRK LDA CONVOUT STA DELAYH,X ;INTO DELAY REGISTER LDA CONVOUT+1 STA DELAYMH,X LDA CONVOUT+2 STA DELAYML,X LDA CONVOUT+3 STA DELAYL,X RTS ; METAHNDL LDX CURRTRK ;PUT ENDPTR INTO DATAPTR & CURADRS LDA ENDPTR STA DATAPTR STA CURADRL,X LDA ENDPTR+1 STA DATAPTR+1 STA CURADRH,X LDA #$00 STA METAFLAG RTS ; ; ; MAINLINE JSR DOPAGE ;PROCESS UNTIL PAGE FAULT OR USER STOP REQUEST LDA EOFFLAG CMP #$FF BNE NOTSTOP ;IF USER STOPPED IT, EXIT NOW RTS NOTSTOP CMP #$01 BNE PGFAULT LDX CURRTRK ;NOT A PAGE FAULT- IT WAS EOF MARKER ON A TRACK LDA #$00 ;DEACTIVATE TRACK STA ACTIVE,X SEC ;CHECK IF ANY TRACKS STILL ACTIVE LDX #MAXTRACK CKTLOOP LDA ACTIVE,X BEQ NOTACTIV CLC ;IF ACTIVE, CLEAR CARRY FLAG NOTACTIV DEX BPL CKTLOOP ;LOOP INCLUDING TRK 0 BCC MAINLINE ;IF NOT EOF, REPEAT MAINLINE RTS ; ; *** END OF MAINLINE *** ; ;DECREMENT BACK POINTER ; DECRBACK SEC LDA BACKPTR SBC #$01 STA BACKPTR LDA BACKPTR+1 SBC #$00 STA BACKPTR+1 RTS ; CHN MULTIADJ.SC2