; ***************************** ; * SOURCE CODE FOR MULTI.OBJ * ; * (C) 1992, ERIC RANGELL * ; ***************************** ; ; ; CONSTANTS ; QSUB EQU $06 ;SUBROUTINE # OF INSERT QUEUE MSEND EQU $0F ;SUBROUTINE OF SEND MIDI THROUGH DISPLAY ROUTINE QREG EQU $06 ;REGISTER IN PSEUDO ZP FOR INSERT QUEUE MSREG EQU $19 ;REGISTER IN PSEUDO ZP FOR MSEND SUBROUTINE ; MAXTRACK EQU $07 ;MAXIMUM TRACK NUMBER ; ; ZERO PAGE STUFF ; USRVECT EQU $0A ;USED IF INTERRUPT ROUTINE IS INSTALLED BASL EQU $0B BASH EQU $0C ; DATAPTR EQU $19 ENDPTR EQU $1B BACKPTR EQU $FC METAFLAG EQU $FE SPEED EQU $FF ; ; ;ADDRESS OF CONTROL PANEL PROGRAM CNTLPANL EQU $6E00 KRETCODE EQU $6E08 ; ; APPLE ADDRESSES WAIT EQU $FCA8 MLI EQU $BF00 ; ORG $6000 ; START JMP MAINLINE ; FUNCTION DFB $81 ;FUNCTION CODE: ; ; 00 = APPLE DELAY & MIDI WITHOUT DISPLAY ROUTINE(DEFAULT) ; ; 01 = APPLE DELAY & MIDI WITH DISPLAY ROUTINE (VIA SUB15) ; ; 02 = STORE DELAY AND MIDI ON QUEUE ; ; HI BIT (80,81,82 = PROCESS USER'S KEYSTROKES-CNTLPANL) ; ; PROGRAM DATA ADDRESSES ; CURRSTS DFB $00 ;CURRENT STATUS BYTE CURRDB DFB $00 ;# OF DATA BYTES IN CURR STATUS EOFFLAG DFB $00 ;SIGNAL WHEN DONE WITH ALL PARTS CURRTRK DFB $00 ;CURRENT TRACK BEING PROCESSED (0-7) ; ACTIVE DFB $00,$00,$00,$00,$00,$00,$00,$00 CURADRL DFB $00,$00,$00,$00,$00,$00,$00,$00 CURADRH DFB $00,$00,$00,$00,$00,$00,$00,$00 UPLIML DFB $00,$00,$00,$00,$00,$00,$00,$00 UPLIMH DFB $28,$30,$38,$40,$48,$50,$58,$60 DELAYH DFB $00,$00,$00,$00,$00,$00,$00,$00 DELAYMH DFB $00,$00,$00,$00,$00,$00,$00,$00 DELAYML DFB $00,$00,$00,$00,$00,$00,$00,$00 DELAYL DFB $00,$00,$00,$00,$00,$00,$00,$00 ; SMALLEST DFB $00,$00,$00,$00 ALU DFB $00,$00,$00,$00 CONVOUT DFB $00,$00,$00,$00 CONVIN DFB $00,$00,$00,$00 BUFRADRL DFB $00,$00,$00,$00,$00,$00,$00,$00 BUFRADRH DFB $00,$00,$00,$00,$00,$00,$00,$00 LASTSTAT DFB $00,$00,$00,$00,$00,$00,$00,$00 DBYTES DFB $00,$00,$00,$00,$00,$00,$00,$00 ; DBTABLE DFB $02,$02,$02,$02,$02,$02,$02,$02 DFB $02,$02,$02,$02,$02,$02,$02,$02 DFB $02,$02,$02,$02,$02,$02,$02,$02 DFB $02,$02,$02,$02,$02,$02,$02,$02 DFB $02,$02,$02,$02,$02,$02,$02,$02 DFB $02,$02,$02,$02,$02,$02,$02,$02 DFB $02,$02,$02,$02,$02,$02,$02,$02 DFB $02,$02,$02,$02,$02,$02,$02,$02 DFB $01,$01,$01,$01,$01,$01,$01,$01 DFB $01,$01,$01,$01,$01,$01,$01,$01 DFB $01,$01,$01,$01,$01,$01,$01,$01 DFB $01,$01,$01,$01,$01,$01,$01,$01 DFB $02,$02,$02,$02,$02,$02,$02,$02 DFB $02,$02,$02,$02,$02,$02,$02,$02 DFB $F0,$00,$02,$01,$00,$00,$00,$F7 DFB $00,$00,$00,$00,$00,$00,$00,$FF ; POSPTRL DFB $00,$00,$00,$00,$00,$00,$00,$00 POSPTRM DFB $00,$00,$00,$00,$00,$00,$00,$00 POSPTRH DFB $00,$00,$00,$00,$00,$00,$00,$00 BUFRLENL DFB $00,$00,$00,$00,$00,$00,$00,$00 BUFRLENH DFB $00,$00,$00,$00,$00,$00,$00,$00 ; DOPAGE JSR GETSMALL ;GET SMALLEST DURATION AND ITS TRACK # JSR SUBSMALL ;SUBTRACT SMALLEST FROM EACH TRACK DRTN JSR ENBLXMIT ;ZERO THE META EVENT FLAG JSR CHKEND ;CHECK IF END OF PART REACHED BCS NEEDNEW ; EXIT IF NEW PART NEEDS TO BE LOADED JSR PRCSDLY ;PROCESS THE DELAY JSR PRCSMIDI ;PROCESS THE MIDI INSTRUCTION LDA FUNCTION ;IF FUNCTION CODE >=128 THEN PROCESS KEYSTROKES BPL DOPAGE JSR CNTLPANL LDA KRETCODE BEQ DOPAGE ;IF GOOD RETURN CODE (0) CONTINUE WORKING LDA #$FF STA EOFFLAG ;ELSE STOP THE SONG NEEDNEW RTS ; ; CONVERT DELTA TIME FROM VARIABLE LENGTH QTY (VLQ) TO 4 BYTE INTEGER ; DELTA LDY #$00 STY CONVOUT STY CONVOUT+1 STY CONVOUT+2 STY CONVOUT+3 LDA (DATAPTR),Y ;READ CURRENT BYTE OF TRACK STA CONVIN,Y BPL MASK1 ;IF END OF VLQ - USE MASK1 ROUTINE INY LDA (DATAPTR),Y STA CONVIN,Y BPL MASK2 INY LDA (DATAPTR),Y STA CONVIN,Y BPL MASK3 INY LDA (DATAPTR),Y STA CONVIN,Y BPL MASK4 BRK ;ABEND IF MORE THAN 4 BYTE VLQ MASK4 LDA CONVOUT+1,Y AND #$07 CLC ROR A ROR A ROR A ROR A STA CONVOUT+1 LDA CONVOUT+1,Y AND #$7F LSR A LSR A LSR A ORA CONVOUT STA CONVOUT MASK3 LDA CONVOUT+2,Y AND #$03 CLC ROR A ROR A ROR A STA CONVOUT+2 LDA CONVOUT+2,Y AND #$7F LSR A LSR A ORA CONVOUT+1 STA CONVOUT+1 MASK2 LDA CONVOUT+3,Y AND #$01 CLC ROR A ROR A STA CONVOUT+3 LDA CONVOUT+3,Y AND #$7F LSR A ORA CONVOUT+2 STA CONVOUT+2 MASK1 LDA CONVIN,Y AND #$7F ORA CONVOUT+3 STA CONVOUT+3 RTS ; ; COMPARE TO SMALLEST - IF SMALLER, MAKE THIS ONE THE SMALLEST. ; CMPSMALL LDA ALU CMP SMALLEST BCC SMALLER BNE NOPE LDA ALU+1 CMP SMALLEST+1 BCC SMALLER BNE NOPE LDA ALU+2 CMP SMALLEST+2 BCC SMALLER BNE NOPE LDA ALU+3 CMP SMALLEST+3 BCC SMALLER BNE NOPE BCS NOPE SMALLER LDA ALU STA SMALLEST LDA ALU+1 STA SMALLEST+1 LDA ALU+2 STA SMALLEST+2 LDA ALU+3 STA SMALLEST+3 SEC RTS NOPE CLC RTS ; ; SUBSM SEC LDA ALU+3 SBC SMALLEST+3 STA ALU+3 LDA ALU+2 SBC SMALLEST+2 STA ALU+2 LDA ALU+1 SBC SMALLEST+1 STA ALU+1 LDA ALU SBC SMALLEST STA ALU RTS ; ; LOOP TO FIND TRACK WITH SMALLEST DURATION ; GETSMALL LDA #$FF STA SMALLEST STA SMALLEST+1 STA SMALLEST+2 STA SMALLEST+3 LDX #$00 CHKLOOP LDA ACTIVE,X BEQ NEXTX LDA DELAYH,X STA ALU LDA DELAYMH,X STA ALU+1 LDA DELAYML,X STA ALU+2 LDA DELAYL,X STA ALU+3 JSR CMPSMALL BCC NEXTX STX CURRTRK NEXTX INX CPX #$08 BNE CHKLOOP RTS ; ; SUBSMALL - SUBTRACT SMALLEST DUR FROM EACH TRK ; SUBSMALL LDX #$00 SUBLOOP LDA ACTIVE,X BEQ NEXTTRK LDA DELAYH,X STA ALU LDA DELAYMH,X STA ALU+1 LDA DELAYML,X STA ALU+2 LDA DELAYL,X STA ALU+3 JSR SUBSM LDA ALU STA DELAYH,X LDA ALU+1 STA DELAYMH,X LDA ALU+2 STA DELAYML,X LDA ALU+3 STA DELAYL,X NEXTTRK INX CPX #$08 BNE SUBLOOP RTS ; ; CHN MULTIADJ.SC1