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