home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Set of Apple II Hard Drive Images
/
eric.hdv
/
SOURCE
/
MULTIADJ.SC0.txt
< prev
next >
Wrap
Text File
|
2020-08-13
|
7KB
|
283 lines
; *****************************
; * 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