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

  1. ; ********************************************
  2. ; * INTHAND.SRC - BACKGROUND QUEUE PLAYER (INTERRUPT HANDLER) 
  3. ; * (C) 1993, ERIC RANGELL
  4. ; ********************************************
  5. ;
  6. ;------------GLOBAL EQUATES
  7. RECEIVER EQU $FA
  8. MSG      EQU $FB
  9. MYOBJ    EQU $FD
  10. MYADRS   EQU $FE             ;WILL POINT TO 'BASE' WHEN OBJECT INVOKED
  11. ;
  12. USRVECT  EQU $0A             ;APPLESOFT USR VECTOR - USED TO CALL OBJECTS
  13. ;
  14. ;------------OBJECTS REFERENCED
  15. AUXQUEUE EQU  08             ;AUX MEMORY QUEUE MANAGER
  16. MIDIFILT EQU  15             ;MIDI STREAM FILTER
  17. INTRFACE EQU  16             ;MIDI INTERFACE CONTROLLER
  18. INTRUPT  EQU  17             ;INTERRUPT ALLOCATOR
  19. ;==================================
  20.          ORG  $9500          ;UNDERNEATH ROUTER CODE
  21.          CLV
  22.          BVC  HOOK
  23. ;==================================
  24. ; INTERNAL DATA
  25. ;==================================
  26. USERFLAG DFB $00
  27. ;
  28. MIDISLOT DFB $20
  29. COUNTLO  DFB $00
  30. COUNTHI  DFB $00
  31. DLYSTAT  DFB $00
  32. ;
  33. INTRPMSG ASC 'A'
  34. ADRSLO   DFB $00
  35. ADRSHI   DFB $00 
  36. INTNUMBR DFB $00
  37. ;
  38. DEQUEMSG ASC 'D'
  39. QOUTREG  DFB $00
  40. ;
  41. XMITMSG  ASC 'X'
  42. XMITBYTE DFB $00
  43.          DFB $FF
  44. ;
  45. TEMPOMSG ASC 'T'
  46. TIMERHI  DFB $00
  47. TIMERLO  DFB $00
  48. ;
  49. ;==========================================                                   
  50. HOOK     LDA #>INTHAND
  51.          STA ADRSLO
  52.          LDA #<INTHAND
  53.          STA ADRSHI
  54. ;
  55.          LDA #INTRUPT
  56.          STA RECEIVER
  57.          LDA #>INTRPMSG
  58.          STA MSG
  59.          LDA #<INTRPMSG
  60.          STA MSG+1
  61.          JSR USRVECT
  62.          BCC ALLOK
  63. ;
  64.          LDY #$03
  65.          LDA (USRVECT+1),Y
  66.          JSR $FDDA
  67. ;
  68. ALLOK    RTS
  69. ;----------------
  70. INTHAND  CLD
  71.          PHP
  72.          SEI
  73. ;
  74.          LDX MIDISLOT
  75.          LDA #$01
  76.          STA $C080,X                   ;PLUG CLOCK
  77. ;
  78.          LDA DLYSTAT
  79.          BPL TDRE            ;IF DLYSTAT = $80
  80.          LDA COUNTLO           ;DELAY IS IN PROGRESS
  81.          SEC                   ;SO COUNT DOWN YOUR DELTA TIME
  82.          SBC #$01
  83.          STA COUNTLO
  84.          CMP #$FF
  85.          BNE GETOUT          
  86. ;
  87.          LDA COUNTHI
  88.          SEC
  89.          SBC #$01
  90.          STA COUNTHI
  91.          CMP #$FF
  92.          BNE GETOUT
  93. ;
  94.          LDA #$00            ;DONE COUNTING-DLYSTAT=0
  95.          STA DLYSTAT
  96.          STA COUNTHI
  97.          STA COUNTLO
  98.          STA USERFLAG
  99. ;
  100. GETOUT   LDX MIDISLOT
  101.          LDA #$00 
  102.          STA $C080,X                   ;UNPLUG CLOCK
  103.          PLP                           ;RESTORE PREVIOUS INTERRUPT FLAG
  104.          CLC
  105.          RTS
  106. ;
  107. TDRE     LDA DLYSTAT         ;DLYSTAT < $80.  
  108.          BNE CHKDLY          ;IF DLYSTAT < 0, SET UP THE DELAY
  109. ;                            ; ELSE IT IS TIME TO XMIT THE DATA
  110. ;
  111.          LDA #AUXQUEUE       ;DEQUEUE ONE BYTE
  112.          STA RECEIVER
  113.          LDA #>DEQUEMSG
  114.          STA MSG
  115.          LDA #<DEQUEMSG
  116.          STA MSG+1
  117.          JSR USRVECT
  118.          BCS GETOUT          ;IF ERROR, TRY LATER
  119. ;
  120.          LDA QOUTREG         ;GET THE BYTE
  121.          CMP #$FD            ;IS IT = $FD?
  122.          BCS SIGNAL1          ;YES - CHECK FOR TEMPO OR DURATION CHANGE
  123. ;
  124.          STA XMITBYTE
  125. ;
  126.          LDA #MIDIFILT       ;SEND IT TO MIDI FILTER
  127.          STA RECEIVER
  128.          LDA #>XMITMSG
  129.          STA MSG
  130.          LDA #<XMITMSG
  131.          STA MSG+1
  132.          JSR USRVECT
  133. ;
  134.          CLV
  135.          BVC TDRE            ;REPEAT UNTIL STATUS CHANGES
  136. ;
  137. BOOST    CLV
  138.          BVC GETOUT
  139. ;
  140. CHKDLY   LDA DLYSTAT
  141.          CMP #$02            ;ARE WE READING THE SECOND BYTE?
  142.          BEQ TWO
  143. ;
  144.          LDA #AUXQUEUE
  145.          STA RECEIVER
  146.          LDA #>DEQUEMSG
  147.          STA MSG
  148.          LDA #<DEQUEMSG
  149.          STA MSG+1
  150.          JSR USRVECT
  151.          BCC GOTIT
  152. ;                            ;IF EMPTY QUEUE
  153.          LDA #$01            ;DLYSTAT = 1
  154.          STA DLYSTAT         ;GET OUT
  155.          CLV
  156.          BVC BOOST
  157. ;
  158. SIGNAL1  CLV
  159.          BVC SIGNAL
  160. ;
  161. GOTIT    LDA #$02
  162.          STA DLYSTAT             ;DLYSTAT = 2
  163.          LDA QOUTREG             ;GET THE BYTE
  164.          STA COUNTHI            ;FOR THE HI COUNTER
  165. ;
  166. TWO      LDA #AUXQUEUE
  167.          STA RECEIVER
  168.          LDA #>DEQUEMSG
  169.          STA MSG
  170.          LDA #<DEQUEMSG
  171.          STA MSG+1
  172.          JSR USRVECT
  173.          BCS BOOST
  174. ;
  175.          LDA QOUTREG             ;PUT THE DATA
  176.          STA COUNTLO             ;INTO COUNTLO
  177.          LDA #$FF            ;SET DLYSTAT = FF
  178.          STA DLYSTAT
  179. BOOST3   CLV
  180.          BVC BOOST
  181. ;
  182. DURATION CMP #$FF            ;TWO BYTE DURATION (FF)
  183.          BEQ CHKDLY          ;  CONTINUE NORMALLY
  184. ;                            ;ONE BYTE DURATION (FD)
  185.          LDA #$00            ;  ZERO OUT HI COUNTER
  186.          STA COUNTHI
  187.          LDA #$02            ;SET DLYSTAT = 2
  188.          STA DLYSTAT
  189.          CLV
  190.          BVC TWO             ;PROCESS THE ONE BYTE
  191. ;
  192. SIGNAL   CMP #$FE
  193.          BNE DURATION
  194.          LDA DLYSTAT       ;TEMPO CHANGE (FE).  
  195.          CMP #$02
  196.          BEQ TEMPO2
  197. ;
  198.          LDA #AUXQUEUE
  199.          STA RECEIVER
  200.          LDA #>DEQUEMSG
  201.          STA MSG
  202.          LDA #<DEQUEMSG
  203.          STA MSG+1
  204.          JSR USRVECT
  205.          BCC GOODQ
  206. ;
  207.          LDA #$01            ;IF ERR READING Q, DLYSTAT=1 AND EXIT
  208.          STA DLYSTAT
  209. BOOST1   CLV
  210.          BVC BOOST3
  211. ;
  212. GOODQ    LDA #$02            ;DLYSTAT=2        
  213.          STA DLYSTAT
  214. ;
  215.          LDA QOUTREG       ;PUT BYTE IN TIMER HI REGISTER
  216.          STA TIMERHI
  217. ;
  218. TEMPO2   LDA #AUXQUEUE
  219.          STA RECEIVER
  220.          LDA #>DEQUEMSG
  221.          STA MSG
  222.          LDA #<DEQUEMSG
  223.          STA MSG+1
  224.          JSR USRVECT
  225.          BCS BOOST1
  226. ;
  227.          LDA QOUTREG
  228.          STA TIMERLO
  229.          LDA #$00
  230.          STA DLYSTAT
  231. ;
  232.          LDA #INTRFACE
  233.          STA RECEIVER
  234.          LDA #>TEMPOMSG
  235.          STA MSG
  236.          LDA #<TEMPOMSG
  237.          STA MSG+1
  238.          JSR USRVECT
  239. ;
  240.          CLV
  241.          BVC BOOST1
  242.