home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-07-31 | 5.6 KB | 243 lines | [04] ASCII Text (0x0000) |
- ; ********************************************
- ; * INTHAND.SRC - BACKGROUND QUEUE PLAYER (INTERRUPT HANDLER)
- ; * (C) 1993, ERIC RANGELL
- ; ********************************************
- ;
- ;------------GLOBAL EQUATES
- RECEIVER EQU $FA
- MSG EQU $FB
- MYOBJ EQU $FD
- MYADRS EQU $FE ;WILL POINT TO 'BASE' WHEN OBJECT INVOKED
- ;
- USRVECT EQU $0A ;APPLESOFT USR VECTOR - USED TO CALL OBJECTS
- ;
- ;------------OBJECTS REFERENCED
- AUXQUEUE EQU 08 ;AUX MEMORY QUEUE MANAGER
- MIDIFILT EQU 15 ;MIDI STREAM FILTER
- INTRFACE EQU 16 ;MIDI INTERFACE CONTROLLER
- INTRUPT EQU 17 ;INTERRUPT ALLOCATOR
- ;==================================
- ORG $9500 ;UNDERNEATH ROUTER CODE
- CLV
- BVC HOOK
- ;==================================
- ; INTERNAL DATA
- ;==================================
- USERFLAG DFB $00
- ;
- MIDISLOT DFB $20
- COUNTLO DFB $00
- COUNTHI DFB $00
- DLYSTAT DFB $00
- ;
- INTRPMSG ASC 'A'
- ADRSLO DFB $00
- ADRSHI DFB $00
- INTNUMBR DFB $00
- ;
- DEQUEMSG ASC 'D'
- QOUTREG DFB $00
- ;
- XMITMSG ASC 'X'
- XMITBYTE DFB $00
- DFB $FF
- ;
- TEMPOMSG ASC 'T'
- TIMERHI DFB $00
- TIMERLO DFB $00
- ;
- ;==========================================
- HOOK LDA #>INTHAND
- STA ADRSLO
- LDA #<INTHAND
- STA ADRSHI
- ;
- LDA #INTRUPT
- STA RECEIVER
- LDA #>INTRPMSG
- STA MSG
- LDA #<INTRPMSG
- STA MSG+1
- JSR USRVECT
- BCC ALLOK
- ;
- LDY #$03
- LDA (USRVECT+1),Y
- JSR $FDDA
- ;
- ALLOK RTS
- ;----------------
- INTHAND CLD
- PHP
- SEI
- ;
- LDX MIDISLOT
- LDA #$01
- STA $C080,X ;PLUG CLOCK
- ;
- LDA DLYSTAT
- BPL TDRE ;IF DLYSTAT = $80
- ;
- LDA COUNTLO ;DELAY IS IN PROGRESS
- SEC ;SO COUNT DOWN YOUR DELTA TIME
- SBC #$01
- STA COUNTLO
- CMP #$FF
- BNE GETOUT
- ;
- LDA COUNTHI
- SEC
- SBC #$01
- STA COUNTHI
- CMP #$FF
- BNE GETOUT
- ;
- LDA #$00 ;DONE COUNTING-DLYSTAT=0
- STA DLYSTAT
- STA COUNTHI
- STA COUNTLO
- STA USERFLAG
- ;
- GETOUT LDX MIDISLOT
- LDA #$00
- STA $C080,X ;UNPLUG CLOCK
- PLP ;RESTORE PREVIOUS INTERRUPT FLAG
- CLC
- RTS
- ;
- TDRE LDA DLYSTAT ;DLYSTAT < $80.
- BNE CHKDLY ;IF DLYSTAT < 0, SET UP THE DELAY
- ; ; ELSE IT IS TIME TO XMIT THE DATA
- ;
- LDA #AUXQUEUE ;DEQUEUE ONE BYTE
- STA RECEIVER
- LDA #>DEQUEMSG
- STA MSG
- LDA #<DEQUEMSG
- STA MSG+1
- JSR USRVECT
- BCS GETOUT ;IF ERROR, TRY LATER
- ;
- LDA QOUTREG ;GET THE BYTE
- CMP #$FD ;IS IT = $FD?
- BCS SIGNAL1 ;YES - CHECK FOR TEMPO OR DURATION CHANGE
- ;
- STA XMITBYTE
- ;
- LDA #MIDIFILT ;SEND IT TO MIDI FILTER
- STA RECEIVER
- LDA #>XMITMSG
- STA MSG
- LDA #<XMITMSG
- STA MSG+1
- JSR USRVECT
- ;
- CLV
- BVC TDRE ;REPEAT UNTIL STATUS CHANGES
- ;
- BOOST CLV
- BVC GETOUT
- ;
- CHKDLY LDA DLYSTAT
- CMP #$02 ;ARE WE READING THE SECOND BYTE?
- BEQ TWO
- ;
- LDA #AUXQUEUE
- STA RECEIVER
- LDA #>DEQUEMSG
- STA MSG
- LDA #<DEQUEMSG
- STA MSG+1
- JSR USRVECT
- BCC GOTIT
- ; ;IF EMPTY QUEUE
- LDA #$01 ;DLYSTAT = 1
- STA DLYSTAT ;GET OUT
- CLV
- BVC BOOST
- ;
- SIGNAL1 CLV
- BVC SIGNAL
- ;
- GOTIT LDA #$02
- STA DLYSTAT ;DLYSTAT = 2
- LDA QOUTREG ;GET THE BYTE
- STA COUNTHI ;FOR THE HI COUNTER
- ;
- TWO LDA #AUXQUEUE
- STA RECEIVER
- LDA #>DEQUEMSG
- STA MSG
- LDA #<DEQUEMSG
- STA MSG+1
- JSR USRVECT
- BCS BOOST
- ;
- LDA QOUTREG ;PUT THE DATA
- STA COUNTLO ;INTO COUNTLO
- LDA #$FF ;SET DLYSTAT = FF
- STA DLYSTAT
- BOOST3 CLV
- BVC BOOST
- ;
- DURATION CMP #$FF ;TWO BYTE DURATION (FF)
- BEQ CHKDLY ; CONTINUE NORMALLY
- ; ;ONE BYTE DURATION (FD)
- LDA #$00 ; ZERO OUT HI COUNTER
- STA COUNTHI
- LDA #$02 ;SET DLYSTAT = 2
- STA DLYSTAT
- CLV
- BVC TWO ;PROCESS THE ONE BYTE
- ;
- SIGNAL CMP #$FE
- BNE DURATION
- LDA DLYSTAT ;TEMPO CHANGE (FE).
- CMP #$02
- BEQ TEMPO2
- ;
- LDA #AUXQUEUE
- STA RECEIVER
- LDA #>DEQUEMSG
- STA MSG
- LDA #<DEQUEMSG
- STA MSG+1
- JSR USRVECT
- BCC GOODQ
- ;
- LDA #$01 ;IF ERR READING Q, DLYSTAT=1 AND EXIT
- STA DLYSTAT
- BOOST1 CLV
- BVC BOOST3
- ;
- GOODQ LDA #$02 ;DLYSTAT=2
- STA DLYSTAT
- ;
- LDA QOUTREG ;PUT BYTE IN TIMER HI REGISTER
- STA TIMERHI
- ;
- TEMPO2 LDA #AUXQUEUE
- STA RECEIVER
- LDA #>DEQUEMSG
- STA MSG
- LDA #<DEQUEMSG
- STA MSG+1
- JSR USRVECT
- BCS BOOST1
- ;
- LDA QOUTREG
- STA TIMERLO
- LDA #$00
- STA DLYSTAT
- ;
- LDA #INTRFACE
- STA RECEIVER
- LDA #>TEMPOMSG
- STA MSG
- LDA #<TEMPOMSG
- STA MSG+1
- JSR USRVECT
- ;
- CLV
- BVC BOOST1
- ;