home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-04-10 | 7.2 KB | 283 lines | [04] ASCII Text (0x0000) |
- ; *****************************
- ; * 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 $6F00
- KRETCODE EQU $6F08
- ;
- ; 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 MULTI.SRC1
-