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