home *** CD-ROM | disk | FTP | other *** search
/ Set of Apple II Hard Drive Images / eric.hdv / SOURCE / AUXMIDI.SR.txt < prev    next >
Text File  |  2020-08-13  |  28KB  |  990 lines

  1. ; ********************************************
  2. ; * AUXMIDI.SRC - BACKGROUND MIDI MUSIC QUEUE
  3. ; * (C) 1994, ERIC RANGELL
  4. ; ********************************************
  5. ;
  6.          ORG $2000
  7. ;
  8. ; *** CONSTANTS ***
  9. ;
  10. JMPINST  EQU $4C             ; JMP INSTRUCTION
  11. RTSINST  EQU $60             ; RTS INSTRUCTION
  12. OFFSET   EQU $06             ; BYTES FROM BEGINNING OF PGM ON STACK
  13. MAXSUBS  EQU $40             ; MAX ENTRIES IN SUBROUTINE TABLE (64*2=128)
  14. ;
  15. ; *** ZERO PAGE ***
  16. ;
  17. MYADRS   EQU $06             ;POINTER TO MY CODE
  18. MEMPTR   EQU $08             ;POINTER TO MEMORY ADDRESS FOR RELOCATION
  19. ;
  20. USRVECT  EQU $0A             ;APPLESOFT USR VECTOR
  21. BASL     EQU $0B             ;WILL HOLD POINTER TO
  22. BASH     EQU $0C             ;BEGINNING OF RELOCATED PROGRAM
  23. ;
  24. OLDSTRT  EQU $3C             ;START ADRS FOR MOVE
  25. OLDEND   EQU $3E             ;END ADRS FOR MOVE
  26. NEWSTRT  EQU $42             ;DESTINATION FOR MOVE
  27. ;
  28. LINNUM   EQU $50             ;CONVERTED USR ARGUMENT
  29. ;
  30. ;*** PARM AREA FOR CALLING SUBROUTINES ***
  31. ADRS1L   EQU $FA
  32. ADRS1H   EQU $FB
  33. ADRS2L   EQU $FC
  34. ADRS2H   EQU $FD
  35. FUNCTION EQU $FE
  36. RETCODE  EQU $FE
  37. FLAG     EQU $FF
  38. ;
  39. ; *** ADDRESSES ***
  40. ;
  41. STACK    EQU $100
  42. MLIALLOC EQU $BEF5           ;MEMORY ALLOCATION
  43. PRINTHEX EQU $FDDA           ;PRINT ACCUM IN HEX
  44. MOVE     EQU $FE2C           ;MONITOR MOVE ROUTINE
  45. MLI      EQU $BF00           ;MLI INTERFACE
  46. GETADR   EQU $E752           ;FIX FAC TO LINNUM ($50,$51)
  47. GIVAYF   EQU $E2F2           ;FLOAT A,Y TO FAC
  48. AUXMOVE  EQU $C311           ;AUX MEMORY MOVE ROUTINE
  49. ;
  50. ;
  51. ; *** BEGINNING OF CODE ***
  52. ;
  53. ; FIND OUT WHERE THIS CODE IS LOCATED IN MEMORY
  54. ;
  55. START    LDA #RTSINST        ;STORE AN RTS IN
  56.          STA MYADRS          ;ZERO PG LOCATION
  57.          JSR MYADRS
  58.          TSX                 ;CHECK STACK
  59.          DEX
  60.          LDA STACK,X         ;GET LOW BYTE OF ADRS
  61.          SEC
  62.          SBC #OFFSET         ;ADJUST IT
  63.          STA MYADRS          ;SET UP POINTER LO
  64.          LDA STACK+1,X
  65.          STA MYADRS+1        ;AND HI
  66. ;
  67. ; CALL PRODOS ROUTINE TO ALLOCATE MEMORY FOR RELOCATED PORTION
  68. ;
  69.          LDA #<EOF           ;CALC # PAGES TO MOVE: EOF-ROUTER+1
  70.          SEC
  71.          SBC #<ROUTER
  72.          CLC
  73.          ADC #1
  74.          STA PAGES
  75.          LDA PAGES
  76.          JSR MLIALLOC        ;ALLOCATE MEMORY
  77.          BCS ALLOCERR
  78.          STA MEMPTR+1        ;SAVE HI BYTE OF ADDRESS
  79.          LDA #00
  80.          STA MEMPTR          ;LO BYTE = 0
  81. ;
  82. ;
  83. ; USE RETURNED ADDRESS TO ADJUST HARDCODED ADDRESSES FOR INTERRUPT ROUTINES
  84. ;
  85.          LDA MEMPTR+1        ;A=HI BYTE OF RELOCATED PROGRAM
  86.          STA ALLPTRH         ;-->HI BYTE OF ADRS IN MLI ALLOC CALL
  87.          STA DEALPTRH        ;-->HI BYTE OF ADRS IN MLI DEALLOC CALL
  88.          LDA #>INTHAND        ;A=LO ADDRESS OF INT HANDLER
  89.          STA ALLADRSL        ;-->PARM LO BYTE OF ADRS OF INT HANDLER
  90.          LDA MEMPTR+1        ;A=HI ADRS WHERE INT HANDLER WILL BE RELOCATED
  91.          STA ALLADRSH        ;-->PARM HI BYTE OF ADRS OF INT HANDLER
  92. ;
  93. ; MOVE THE ADJUSTED CODE INTO THE ALLOCATED MEMORY AREA
  94. ;
  95.          LDA MYADRS          ;PREPARE FOR MEMORY MOVE
  96.          STA OLDSTRT
  97.          LDX MYADRS+1
  98.          INX
  99.          STX OLDSTRT+1       ;FROM MYADRS
  100.          LDA MYADRS
  101.          CLC
  102.          ADC #$FF
  103.          STA OLDEND
  104.          LDA PAGES           ;TO MYADRS + PAGES*256 + $FF
  105.          ADC MYADRS+1
  106.          STA OLDEND+1
  107.          LDA MEMPTR          ;MOVE TO ADRS RETURNED BY MEMORY ALLOCATOR
  108.          STA NEWSTRT
  109.          LDA MEMPTR+1
  110.          STA NEWSTRT+1
  111.          LDY #$00
  112.          JSR MOVE            ;MOVE COMPLETED
  113. ;
  114. ; SET UP USER VECTOR AND PREPARE INTERRUPT ROUTINES, THEN EXIT
  115. ;
  116.          LDA MEMPTR+1        ;GET OUR NEW ADDRESS
  117.          STA MYADRS+1
  118.          LDA MEMPTR          
  119.          STA MYADRS   
  120.          LDA #JMPINST        ;SET UP USR VECTOR      
  121.          STA USRVECT         ;TO POINT TO NEW ADDRESS
  122.          LDA MYADRS
  123.          STA BASL            ;BASL AND BASH ARE OUR NEW HOOKS TO THE ROUTINES
  124.          LDA MYADRS+1
  125.          STA BASH
  126. ;
  127.          LDA #STOPSONG        ;DEACTIVATE MIDI INTERRUPTS
  128.          STA FUNCTION
  129.          JSR USRVECT         ;(CALL SUBROUTINE ROUTER)
  130. ;
  131.          LDA #ALLOCINT       ;ALLOCATE INTERRUPTS
  132.          STA FUNCTION
  133.          JSR USRVECT
  134.          RTS
  135. ;
  136. PAGES    DFB $05             ;LENGTH OF ALLOCATION (RECALCULATED BY PGM)
  137. ;
  138. ALLOCERR JSR PRINTHEX        ;PRINT ERROR CODE
  139.          BRK                 ;AND STOP
  140. ;
  141. ;
  142. ;
  143. ;****************************************
  144. ;* SUBROUTINE ROUTER & PSEUDO ZERO PAGE
  145. ;****************************************
  146. ;
  147.          ORG START+$100
  148. ;
  149. ; THIS IS THE CODE THAT WILL BE RELOCATED TO HIGH MEMORY
  150. ;
  151. ROUTER   CLV
  152.          BVC ROUTER1
  153. ;
  154. ; MAKE SPACE FOR VARIABLES THAT CAN BE CONTROLLED BY CALLER
  155. ;
  156. ;
  157. MIDISLOT DFB $20             ;SLOT # TIMES 16
  158. TIMERLO  DFB $88             ;SEED FOR TIMER - SEE ACTIVATE SUBROUTINE
  159. TIMERHI  DFB $08
  160. ;
  161. QINSREG  DFB $00
  162. QOUTREG  DFB $00             ;OUTPUT DATA REGISTER
  163. ;
  164. COUNTHI  DFB $00
  165. COUNTLO  DFB $00
  166. ;
  167. QBEGIN   DFB $00,$08         ;AUX MEM BEGIN OF QUEUE
  168. QEND     DFB $00,$C0         ;AUX MEM END OF QUEUE + 1
  169. QSTAT    DFB $00             ;QUEUE STATUS: 0=EMPTY, FF=FULL, 1=IN USE
  170. QHEAD    DFB $00,$08         ;HEAD POINTER
  171. QTAIL    DFB $00,$08         ;TAIL POINTER
  172. DLYSTAT  DFB $00             ;FF=DELAY IN PROGRESS, 00=NO DELAY,
  173. ;                            ;1,2=DELAY BEING READ
  174. ;
  175. LASTSTAT DFB $90             ;LAST STATUS BYTE READ
  176. LASTDATA DFB $90             ;LAST DATA BYTE PROCESSED
  177. CODEFLAG DFB $00             ;FLAG TO DETERMINE WHETHER TO EXECUTE USER CODE
  178. CODEHOOK DFB $00,$00         ;IF CODEFLAG IS NON-ZERO, PROGRAM WILL USE THIS
  179. ;                            ;ADDRESS AS A JUMP VECTOR WHENEVER A MIDI BYTE
  180. ;                            ;IS TRANSMITTED
  181. MIDIBYTE DFB $00             ;MIDI OUTPUT REGISTER.  
  182. TEMPREQ  DFB $00             ;TO REQUEST TEMPO CHANGE, POPULATE TIMERLO AND HI
  183. ;                            ;THEN PUT NON-ZERO VALUE IN TEMPREQ
  184. USERFLAG DFB $FF             ;FOR BASIC PROGRAMS, TO DETECT WHEN NOTES PLAYED.
  185. ;
  186. FORMAT   DFB $00             ;$00 TO PLAY ALBUM FILES, $01 TO PLAY MFF0 FILES
  187. ;
  188. ;
  189. ; *** PARM AREAS ***
  190. ;
  191. ALLOCPRM DFB $02   ;PARM AREA FOR ALLOC INTERRUPT
  192. ALINTNUM DFB $00   ;INTERRUPT NUMBER
  193. ALLADRSL DFB >INTHAND   ;LOW BYTE OF INTERRUPT HANDLER ADRS
  194. ALLADRSH DFB <INTHAND   ;HI BYTE OF INTERRUPT HANDLER ADRS
  195. ;
  196. DEALPRM  DFB $01   ;PARM AREA FOR DEALLOC INTERRUPT
  197. DEINTNUM DFB $00
  198. ;
  199. ;                            ;offset = $22
  200. ROUTER1  LDA FUNCTION
  201.          ASL A               ;MULTIPLY SUB # BY 2
  202.          ADC #>SUBTABLE      ;ADD OFFSET OF SUBROUTINE TABLE
  203.          PHA                 ;SAVE ON STACK
  204.          TAY                 
  205.          LDA (BASL),Y        ;GET LO BYTE OFFSET OF SUB FROM TABLE
  206.          LDY #>SUBJMPL
  207.          STA (BASL),Y        ;STORE AT SUB JUMP VECTOR LOW
  208.          PLA                 ;GET OFFSET
  209.          TAY
  210.          INY                 ;ADD 1
  211.          LDA (BASL),Y        ;GET HI BYTE OFFSET OF SUB FROM TABLE
  212.          SEC
  213.          SBC #<ROUTER        ;SUBTRACT ROUTER HI ADDRESS TO GET PURE OFFSET
  214.          CLC
  215.          ADC BASH            ;ADD BASE ADDRESS TO GET RELOC ADRS OF SUBROUTINE
  216.          LDY #>SUBJMPH       ;STORE AT SUB VECTOR HIGH
  217.          STA (BASL),Y
  218.          DFB $4C             ;JMP TO SPECIFIED ADRS
  219. SUBJMPL  DFB $00
  220. SUBJMPH  DFB $00
  221. ;
  222. ; *** SUBROUTINE - ALLOCATE INTERRUPT (#4)
  223. ; offset=$41
  224. ALLOCIN1 JSR MLI             ;ALLOCATE INTERRUPT
  225.          DFB $40             
  226. ALLPTRL  DFB >ALLOCPRM       ;ADRS OF PARM LIST
  227. ALLPTRH  DFB <ALLOCPRM       ;HI BYTE WILL BE MODIFIED BY PGM        
  228.          BCS ERRBRK          ;IF ERROR - BREAK OUT
  229.          LDY #>ALINTNUM       ;GET LO BYTE OF ADRS OF INTERRUPT NUMBER
  230.          LDA (BASL),Y        ;GET THE INTERRUPT NUMBER
  231.          LDY #>DEINTNUM       ;GET LO BYTE OF ADRS OF DEALLOC INT NUMBER
  232.          STA (BASL),Y        ;STORE INT NUMBER AT THAT ADDRESS (PSEUDO ZP)
  233.          RTS
  234. ;
  235. ERRBRK   JSR PRINTHEX        ;ANY ERROR - BREAK OUT
  236.          BRK
  237. ;
  238. ; *** SUBROUTINE: DEALLOCATE INTERRUPT  (#5)
  239. ;offset = $55
  240. DEALLIN1 JSR MLI             ;MLI DEALLOC
  241.          DFB $41             ;CODE FOR DEALLOC
  242. DEALPTRL DFB >DEALPRM        ;ADRS OF PARM LIST
  243. DEALPTRH DFB <DEALPRM
  244.          BCS ERRBRK          ;ERRORS? BREAK OUT
  245.          RTS
  246. ;offset=$5e
  247. INTHAND  CLD                 ; FOR PRODOS
  248.          LDA #INTHANDL       ; GET SUBROUTINE # OF INTERRUPT HANDLER
  249.          STA FUNCTION
  250.          JMP USRVECT
  251. ;offset=$66
  252. ;
  253. ;
  254. ; DEFINE SUBROUTINE NUMBERS RECOGNIZED BY USR VECTOR
  255. USRHOOK  EQU $00   
  256. INTHANDL EQU $01
  257. ;
  258. ACTMIDI  EQU $02
  259. STOPSONG EQU $03
  260. ALLOCINT EQU $04
  261. DEALLINT EQU $05
  262. ;
  263. ENQBYTE  EQU $06
  264. DEQBYTE  EQU $07
  265. INCHEAD  EQU $08
  266. INCTAIL  EQU $09
  267. CMPHDTL  EQU $0A
  268. STORHEAD EQU $0B
  269. GETTAIL  EQU $0C
  270. ;
  271. XMITHOOK EQU $0D
  272. SENDMIDI EQU $0E
  273. OUTHOOK  EQU $0F
  274. ;
  275. MIDIOUT  EQU $10
  276. AUXPEEK  EQU $11
  277. AUXPOKE  EQU $12
  278. ;
  279. ENQEVENT EQU $13
  280. ENQDELTA EQU $14
  281. DEQDELTA EQU $15
  282. DEQINSTR EQU $16
  283. NOTEOFF  EQU $17
  284. NOTEON   EQU $18
  285. AFTERTO  EQU $19
  286. CTRLCHG  EQU $20
  287. PROGCHG  EQU $21
  288. PRESSUR  EQU $22
  289. BENDER   EQU $23
  290. SYSEXF0  EQU $24
  291. SYSEXF7  EQU $25
  292. META     EQU $26
  293. CONVDLTA EQU $27
  294. PLAYEVNT EQU $28
  295. PLAYSONG EQU $29
  296. ;
  297. ;
  298. SUBTABLE DFB >USRHOOK1,<USRHOOK1                
  299.          DFB >INTHAND1,<INTHAND1                   
  300.          DFB >ACTMIDI1,<ACTMIDI1        
  301.          DFB >STOPSON1,<STOPSON1          
  302.          DFB >ALLOCIN1,<ALLOCIN1        
  303.          DFB >DEALLIN1,<DEALLIN1        
  304.          DFB >ENQBYTE1,<ENQBYTE1
  305.          DFB >DEQBYTE1,<DEQBYTE1
  306.          DFB >INCHEAD1,<INCHEAD1
  307.          DFB >INCTAIL1,<INCTAIL1
  308.          DFB >CMPHDTL1,<CMPHDTL1
  309.          DFB >STORHEA1,<STORHEA1
  310.          DFB >GETTAIL1,<GETTAIL1
  311.          DFB >XMITHOO1,<XMITHOO1
  312.          DFB >SENDMID1,<SENDMID1
  313.          DFB >OUTHOOK1,<OUTHOOK1
  314.          DFB >MIDIOUT1,<MIDIOUT1
  315.          DFB >AUXPEEK1,<AUXPEEK1
  316.          DFB >AUXPOKE1,<AUXPOKE1
  317.          DFB >ENQEVEN1,<ENQEVEN1
  318.          DFB >ENQDELT1,<ENQDELT1
  319.          DFB >DEQDELT1,<DEQDELT1
  320.          DFB >DEQINST1,<DEQINST1 
  321.          DFB >NOTEOFF1,<NOTEOFF1
  322.          DFB >NOTEON1,<NOTEON1
  323.          DFB >AFTERTO1,<AFTERTO1
  324.          DFB >CTRLCHG1,<CTRLCHG1
  325.          DFB >PROGCHG1,<PROGCHG1
  326.          DFB >PRESSUR1,<PRESSUR1
  327.          DFB >BENDER1,<BENDER1
  328.          DFB >SYSEXF01,<SYSEXF01
  329.          DFB >SYSEXF71,<SYSEXF71
  330.          DFB >META1,<META1
  331.          DFB >CONVDLT1,<CONVDLT1
  332.          DFB >PLAYEVN1,<PLAYEVN1
  333.          DFB >PLAYSON1,<PLAYSON1
  334. ;
  335. ;
  336. ; SUBROUTINE: SENDMIDI - TRANSMITS MIDI BYTE TO MIDI OUT
  337. ;
  338. SENDMID1 LDY #>MIDISLOT      ;GET MIDI SLOT IN X
  339.          LDA (BASL),Y
  340.          TAX
  341.          LDA FLAG            ;GET BYTE TO XMIT IN A
  342.          STA $C089,X         ;SEND BYTE OUT VIA MIDI
  343. WAITTDRE LDA $C088,X
  344.          AND #$02
  345.          BEQ WAITTDRE
  346.          RTS
  347. ;
  348. ; *** SUBROUTINE: MIDIOUT - SEND SEVERAL BYTES OUT TO MIDIOUT
  349. ;
  350. ; ADRS1 = START ADRS, ADRS2=END ADRS OR 0 TO XMIT UNTIL FF REACHED
  351. ;
  352. MIDIOUT1 LDA ADRS2H
  353.          CMP ADRS1H
  354.          BCC MIDIOUT2
  355.          LDA ADRS2H
  356.          CMP ADRS1H
  357.          BCC MIDIOUT2        ;IF HI < LO ADRS, USE MIDIOUT2 ROUTINE
  358. ;
  359. MIDILOOP LDY #$00
  360.          LDA (ADRS1L),Y      ;SEND BYTE AT ADDRESS 1
  361.          STA FLAG
  362.          LDA #SENDMIDI
  363.          STA FUNCTION
  364.          JSR USRVECT
  365. ;
  366.          LDA ADRS1L          ;ADD 1 TO ADDRESS 1
  367.          ADC #$01
  368.          STA ADRS1L
  369.          LDA ADRS1H
  370.          ADC #$00
  371.          STA ADRS1H
  372. ;
  373.          LDA ADRS1H          ;IF ADDRESS1 <= ADDRESS2, LOOP AGAIN
  374.          CMP ADRS2H
  375.          BCC MIDILOOP
  376.          LDA ADRS1L
  377.          CMP ADRS2L
  378.          BCC MIDILOOP
  379.          BEQ MIDILOOP
  380. MIDIDONE RTS
  381. ;
  382. MIDIOUT2 LDY #$00            ;IF ADDRESS1 = FF, GET OUT
  383.          LDA (ADRS1L),Y
  384.          CMP #$FF
  385.          BEQ MIDIDONE
  386.          STA FLAG            ;ELSE SEND THE BYTE
  387.          LDA #SENDMIDI
  388.          STA FUNCTION
  389.          JSR USRVECT
  390. ;
  391.          LDA ADRS1L          ;ADD 1 AND LOOP AGAIN
  392.          ADC #$01
  393.          STA ADRS1L
  394.          LDA ADRS1H
  395.          ADC #$00
  396.          STA ADRS1H
  397.          CLV
  398.          BVC MIDIOUT2
  399. ;
  400. ;
  401. ; *** AUXPEEK ***
  402. ;
  403. AUXPEEK1 LDA ADRS1L
  404.          STA OLDSTRT
  405.          STA OLDEND
  406.          LDA ADRS1H
  407.          STA OLDSTRT+1
  408.          STA OLDEND+1
  409.          LDA #>FLAG
  410.          STA NEWSTRT
  411.          LDA #<FLAG
  412.          STA NEWSTRT+1
  413.          CLC
  414.          JSR AUXMOVE
  415.          RTS
  416. ;
  417. ; *** AUXPOKE ***
  418. ;
  419. AUXPOKE1 LDA #>FLAG
  420.          STA OLDSTRT
  421.          STA OLDEND
  422.          LDA #<FLAG
  423.          STA OLDSTRT+1
  424.          STA OLDEND+1
  425.          LDA ADRS1L
  426.          STA NEWSTRT
  427.          LDA ADRS1H
  428.          STA NEWSTRT+1
  429.          SEC
  430.          JSR AUXMOVE
  431.          RTS
  432. ;
  433. ; *** SUBROUTINE: STOPSONG: DEACTIVATE INTERRUPTS 
  434. ;
  435. STOPSON1 SEI                 ;STOP INTERRUPTS
  436.          LDY #>MIDISLOT       ;X=SLOT * 16
  437.          LDA (BASL),Y
  438.          TAX
  439.          LDA #$01            ;PLUG THE TIMER
  440.          STA $C080,X
  441.          LDA #$13            ;RESET THE MIDI PORTS (MASTER RESET)
  442.          STA $C088,X         ;  8 BITS NO PARITY 2 STOP BITS
  443.          LDA #$11            ;
  444.          STA $C088,X
  445.          CLI                 ;RESUME BUSINESS
  446.          RTS
  447. ;
  448. ; *** SUBROUTINE: ACTIVATE INTERRUPTS
  449. ;
  450. ACTMIDI1 LDY #>MIDISLOT
  451.          LDA (BASL),Y        ;GET SLOT*16 IN X
  452.          TAX
  453.          LDA #$01            ;STOP TIMER
  454.          STA $C080,X
  455.          SEI                 ;STOP INTERRUPTS
  456.          LDA #$43            ;RESET THE 6840 PTM
  457.          STA $C081,X         ;INITIALIZE TIMER
  458.          LDA #$04 
  459.          STA $C080,X         ;REGISTER=4
  460.          LDY #>TIMERHI       ;WRITE HI BYTE
  461.          LDA (BASL),Y
  462.          STA $C084,X
  463.          LDA #$05            ;REGISTER=5
  464.          STA $C080,X         
  465.          LDY #>TIMERLO       ;WRITE LO BYTE
  466.          LDA (BASL),Y
  467.          STA $C085,X
  468.          LDA #$1             ;WRITE CONTROL REG 2
  469.          STA $C080,X
  470.          LDA #$C3            ;CONTINUOUS, IRQ AND TIMER OUTPUT ENABLED
  471.          STA $C080,X         ;
  472. ;         LDA #$31            ;TDRE INT?
  473. ;         STA $C088,X
  474.          CLI                 ;GET READY
  475.          LDA #$0             ;TO ACTIVATE (ZERO IN CTRL REG 1)
  476.          STA $C080,X         ;NOW!
  477.          RTS
  478. ;
  479. ; SUBROUTINE 0: USER HOOK
  480. ;
  481. USRHOOK1 JSR GETADR          ;CONVERT USR ARGUMENT TO INTEGER
  482.          LDA LINNUM+1        ;CHECK HI BYTE
  483.          BEQ GOODBYT
  484. BADBYT   LDY BASL            ;IF >255, RETURN BASE ADDRESS
  485.          LDA BASH
  486.          JSR GIVAYF
  487.          RTS   
  488. GOODBYT  LDA LINNUM
  489.          BEQ BADBYT           ;IF OUT OF RANGE, RETURN BASE ADRS
  490.          CMP #MAXSUBS
  491.          BCS BADBYT
  492.          STA FUNCTION
  493.          JMP USRVECT
  494. ;
  495. ;SUBROUTINE #1: INTERRUPT HANDLER
  496. ;  
  497. INTHAND1 CLD                 ;FOR PRODOS
  498.          LDY #>MIDISLOT      
  499.          LDA (BASL),Y
  500.          TAX
  501.          LDA $C081,X         ;CHECK CLOCK INTERRUPT FLAG
  502.          BPL NOTCLOCK
  503.          LDA #$01            ;STOP CLOCK AND PROCESS THE PULSE
  504.          STA $C080,X
  505.          CLV
  506.          BVC PULSENOW
  507. ;
  508. NOTCLOCK LDA $C088,X         ;CHECK BIT 2 OF ACIA CONTROL REG
  509.          AND #$02            ;TO SEE IF TDRE CONDITION EXISTS
  510.          BNE TDRE
  511.          LDA #$00            ;NOT OUR INTERRUPT - GET OUT
  512.          STA $C080,X
  513.          SEC                 ;DON'T CLAIM IT
  514.          RTS
  515. ;
  516. GETOUT   LDY #>MIDISLOT
  517.          LDA (BASL),Y
  518.          TAX
  519.          LDA #$00            ;START THE CLOCK AGAIN
  520.          STA $C080,X
  521.          CLC                 ;CLAIM THE INTERRUPT
  522.          RTS
  523. ;
  524. PULSENOW LDY #>DLYSTAT       ;FIND OUT WHERE TO GO 
  525.          LDA (BASL),Y        
  526.          BPL TDRE            ;IF DLYSTAT >= $80 
  527.          LDY #>COUNTLO       ;DELAY IS IN PROGRESS
  528.          LDA (BASL),Y        ;SO COUNT DOWN YOUR DELTA TIME
  529.          SEC
  530.          SBC #$01
  531.          STA (BASL),Y
  532.          CMP #$FF
  533.          BNE GETOUT          
  534. ;
  535.          LDY #>COUNTHI
  536.          LDA (BASL),Y
  537.          SEC
  538.          SBC #$01
  539.          STA (BASL),Y
  540.          CMP #$FF
  541.          BNE GETOUT
  542. ;
  543.          LDA #$00            ;DONE COUNTING-DLYSTAT=0
  544.          LDY #>DLYSTAT
  545.          STA (BASL),Y
  546.          LDY #>COUNTHI
  547.          STA (BASL),Y
  548.          LDY #>COUNTLO
  549.          STA (BASL),Y
  550. ;
  551.          LDY #>USERFLAG
  552.          STA (BASL),Y
  553.          CLV
  554.          BVC GETOUT
  555. ;
  556. TDRE     LDY #>FORMAT
  557.          LDA (BASL),Y
  558.          BEQ OLDFORM
  559. ;                            ; NEW FORMAT: TO PLAY MIDI FORMAT 0
  560.          LDA #PLAYEVNT
  561.          STA FUNCTION
  562.          JSR USRVECT
  563.          BCS GETOUT
  564. ;
  565.          LDA #DEQDELTA
  566.          STA FUNCTION
  567.          JSR USRVECT
  568.          BCS GETOUT
  569. ;
  570.          LDA #CONVDLTA
  571.          STA FUNCTION
  572.          JSR USRVECT
  573. ;
  574.          LDA ADRS2L          ;SET COUNTER BASED ON NEW DELTA TIME
  575.          LDY #>COUNTHI
  576.          STA (BASL),Y
  577.          LDA ADRSH
  578.          LDY #>COUNTLO
  579.          STA (BASL),Y
  580.          LDA #$FF            ;SET MODE TO COUNTING
  581.          LDY #>DLYSTAT
  582.          STA (BASL),Y
  583.          RTS
  584. ;
  585. OLDFORM  LDY #>DLYSTAT       ;DLYSTAT < $80.  
  586.          LDA (BASL),Y
  587.          BNE CHKDLY          ;IF DLYSTAT <> 0, SET UP THE DELAY
  588. ;                            ; ELSE IT IS TIME TO XMIT THE DATA
  589.          LDA #DEQBYTE            ;GET BYTE FROM QUEUE
  590.          STA FUNCTION
  591.          JSR USRVECT
  592.          BCS GETOUT          ;IF ERROR, TRY LATER
  593.          LDY #>QOUTREG
  594.          LDA (BASL),Y        ;GET THE BYTE
  595.          CMP #$FD            ;IS IT >= $FD?
  596.          BCS SIGNAL          ;YES - CHECK FOR TEMPO OR DURATION CHANGE
  597.          LDA #XMITHOOK       ;NO - CALL SUB13 TO PROCESS TRANSMISSION
  598.          STA FUNCTION
  599.          JSR USRVECT         ;     
  600.          CLV
  601.          BVC TDRE            ;REPEAT UNTIL STATUS CHANGES
  602. BOOST    CLV
  603.          BVC GETOUT
  604. ;
  605. CHKDLY   LDY #>DLYSTAT       
  606.          LDA (BASL),Y
  607.          CMP #$02            ;ARE WE READING THE SECOND BYTE?
  608.          BEQ TWO
  609.          LDA #DEQBYTE            ;NO - READ QUEUE
  610.          STA FUNCTION
  611.          JSR USRVECT
  612.          BCC GOTIT           ;IF EMPTY QUEUE
  613.          LDA #$01            ;DLYSTAT = 1
  614.          LDY #>DLYSTAT       ;GET OUT
  615.          STA (BASL),Y
  616.          CLV
  617.          BVC BOOST
  618. GOTIT    LDA #$02
  619.          LDY #>DLYSTAT       ;DLYSTAT = 2
  620.          STA (BASL),Y
  621.          LDY #>QOUTREG       ;GET THE BYTE
  622.          LDA (BASL),Y
  623.          LDY #>COUNTHI       ;FOR THE HI COUNTER
  624.          STA (BASL),Y
  625. TWO      LDA #DEQBYTE            ; READ QUEUE
  626.          STA FUNCTION
  627.          JSR USRVECT
  628.          BCS BOOST
  629.          LDY #>QOUTREG       ;PUT THE DATA
  630.          LDA (BASL),Y
  631.          LDY #>COUNTLO       ;INTO COUNTLO
  632.          STA (BASL),Y
  633.          LDA #$FF            ;SET DLYSTAT = FF
  634.          LDY #>DLYSTAT
  635.          STA (BASL),Y
  636.          CLV
  637.          BVC BOOST
  638. ;
  639. DURATION CMP #$FF            ;TWO BYTE DURATION (FF)
  640.          BEQ CHKDLY          ;  CONTINUE NORMALLY
  641. ;                            ;ONE BYTE DURATION (FD)
  642.          LDA #$00            ;  ZERO OUT HI COUNTER
  643.          LDY #>COUNTHI       
  644.          STA (BASL),Y           
  645.          LDA #$02            ;SET DLYSTAT = 2
  646.          LDY #>DLYSTAT
  647.          STA (BASL),Y                 
  648.          CLV
  649.          BVC TWO             ;PROCESS THE ONE BYTE
  650. ;
  651. SIGNAL   CMP #$FE
  652.          BNE DURATION
  653.          LDY #>DLYSTAT       ;TEMPO CHANGE (FE).  
  654.          LDA (BASL),Y        ;DOES DLYSTAT = 2?
  655.          CMP #$02
  656.          BEQ TEMPO2 
  657.          LDA #DEQBYTE
  658.          STA FUNCTION
  659.          JSR USRVECT
  660.          BCC GOODQ
  661.          LDA #$01            ;IF ERR READING Q, DLYSTAT=1 AND EXIT
  662.          LDY #>DLYSTAT
  663.          STA (BASL),Y
  664. BOOST1   CLV
  665.          BVC BOOST
  666. GOODQ    LDA #$02            ;DLYSTAT=2        
  667.          LDY #>DLYSTAT
  668.          STA (BASL),Y
  669.          LDY #>QOUTREG       ;PUT BYTE IN TIMER HI REGISTER
  670.          LDA (BASL),Y
  671.          LDY #>TIMERHI
  672.          STA (BASL),Y
  673. TEMPO2   LDA #DEQBYTE
  674.          STA FUNCTION
  675.          JSR USRVECT
  676.          BCS BOOST1
  677.          LDY #>QOUTREG
  678.          LDA (BASL),Y
  679.          LDY #>TIMERLO
  680.          STA (BASL),Y
  681.          LDA #$00
  682.          LDY #>DLYSTAT
  683.          STA (BASL),Y
  684.          LDA #ACTMIDI
  685.          STA FUNCTION
  686.          JSR USRVECT
  687.          CLV
  688.          BVC BOOST1
  689. ;
  690.          CHN INTRUPT.SRC2
  691. ; ********************************************
  692. ; * INTRUPT.SRC2 - BACKGROUND MIDI MUSIC QUEUE
  693. ; * (C) 1992, ERIC RANGELL
  694. ; ********************************************
  695. ;
  696. ;
  697. ; SUBROUTINE - XMITHOOK
  698. ;
  699. XMITHOO1 LDY #>DLYSTAT       ;SET DLYSTAT = 0
  700.          LDA #$00
  701.          STA (BASL),Y
  702.          LDY #>QOUTREG       
  703.          LDA (BASL),Y
  704.          BPL RUNSTAT         ;CHECK IF STATUS BYTE
  705.          LDY #>LASTSTAT      ;IF YES - STORE IT AS LAST STATUS BYTE
  706.          STA (BASL),Y
  707. RUNSTAT  LDY #>LASTDATA      ;STORE CURR BYTE AS LAST DATA BYTE
  708.          STA (BASL),Y
  709.          LDY #>MIDIBYTE
  710.          STA (BASL),Y        ;FOR MIDI OUTPUT SUBROUTINE
  711.          LDA #OUTHOOK        ;PROCESS THE MIDI BYTE
  712.          STA FUNCTION
  713.          JSR USRVECT
  714.          RTS
  715. ;                  
  716. ENQBYTE1            LDY   #>QSTAT
  717.                     LDA   (BASL),Y
  718.                     BPL   DOENQ
  719.                     LDA   #$FF
  720.                     STA   RETCODE
  721.                     SEC   
  722.                     RTS   
  723. ;
  724. DOENQ               SEI   
  725.                     LDA   FLAG
  726.                     LDY   #>QINSREG
  727.                     STA   (BASL),Y
  728. ;
  729.                     LDA   #INCHEAD
  730.                     STA   FUNCTION
  731.                     JSR   USRVECT
  732. ;
  733.                     LDA   #STORHEAD
  734.                     STA   FUNCTION
  735.                     JSR   USRVECT
  736. ;
  737.                     LDA   #$01         ;SET QSTAT = 1 (IN USE)
  738.                     LDY   #>QSTAT
  739.                     STA   (BASL),Y
  740. ;
  741.                     LDA   #CMPHDTL
  742.                     STA   FUNCTION
  743.                     JSR   USRVECT
  744. ;
  745.                     BCC   QNOTFULL
  746.                     LDA   #$FF         ;SET QSTAT = FF (FULL)
  747.                     LDY   #>QSTAT
  748.                     STA   (BASL),Y
  749. ;
  750. QNOTFULL            CLC   
  751.                     CLI   
  752.                     RTS   
  753. ;
  754. ;
  755. DEQBYTE1            LDY   #>QSTAT
  756.                     LDA   (BASL),Y
  757.                     BNE   DODEQ
  758.                     LDA   #$01
  759.                     STA   RETCODE
  760.                     SEC   
  761.                     RTS   
  762. DODEQ               SEI   
  763.                     LDA   #INCTAIL
  764.                     STA   FUNCTION
  765.                     JSR   USRVECT
  766. ;
  767.                     LDA   #GETTAIL
  768.                     STA   FUNCTION
  769.                     JSR   USRVECT
  770. ;
  771.                     LDA   #$01         ;SET QSTAT=1
  772.                     LDY   #>QSTAT
  773.                     STA   (BASL),Y
  774. ;
  775.                     LDA   #CMPHDTL
  776.                     STA   FUNCTION
  777.                     JSR   USRVECT
  778. ;
  779.                     BCC   QNOTEMTY
  780.                     LDA   #$00         ;SET QSTAT = 0 (EMPTY)
  781.                     LDY   #>QSTAT
  782.                     STA   (BASL),Y
  783. ;
  784. QNOTEMTY            CLC   
  785.                     CLI   
  786.                     RTS   
  787. ;
  788. ;
  789. INCHEAD1            LDY   #>QHEAD
  790.                     LDA   (BASL),Y
  791.                     CLC   
  792.                     ADC   #$01
  793.                     STA   (BASL),Y
  794.                     LDY   #>QHEAD+1
  795.                     LDA   (BASL),Y
  796.                     ADC   #$00
  797.                     STA   (BASL),Y
  798.                     LDY   #>QEND+1
  799.                     LDA   (BASL),Y
  800.                     LDY   #>QHEAD+1
  801.                     CMP   (BASL),Y
  802.                     BNE   EXITHD
  803.                     LDY   #>QEND
  804.                     LDA   (BASL),Y
  805.                     LDY   #>QHEAD
  806.                     CMP   (BASL),Y
  807.                     BNE   EXITHD
  808.                     LDY   #>QBEGIN
  809.                     LDA   (BASL),Y
  810.                     LDY   #>QHEAD
  811.                     STA   (BASL),Y
  812.                     LDY   #>QBEGIN+1
  813.                     LDA   (BASL),Y
  814.                     LDY   #>QHEAD+1
  815.                     STA   (BASL),Y
  816. EXITHD              RTS   
  817. ;
  818. ;
  819. INCTAIL1            LDY   #>QTAIL
  820.                     LDA   (BASL),Y
  821.                     CLC   
  822.                     ADC   #$01
  823.                     STA   (BASL),Y
  824.                     LDY   #>QTAIL+1
  825.                     LDA   (BASL),Y
  826.                     ADC   #$00
  827.                     STA   (BASL),Y
  828.                     LDY   #>QEND+1
  829.                     LDA   (BASL),Y
  830.                     LDY   #>QTAIL+1
  831.                     CMP   (BASL),Y
  832.                     BNE   EXITTL
  833.                     LDY   #>QEND
  834.                     LDA   (BASL),Y
  835.                     LDY   #>QTAIL
  836.                     CMP   (BASL),Y
  837.                     BNE   EXITTL
  838.                     LDY   #>QBEGIN
  839.                     LDA   (BASL),Y
  840.                     LDY   #>QTAIL
  841.                     STA   (BASL),Y
  842.                     LDY   #>QBEGIN+1
  843.                     LDA   (BASL),Y
  844.                     LDY   #>QTAIL+1
  845.                     STA   (BASL),Y
  846. EXITTL              RTS   
  847. ;
  848. ;
  849. CMPHDTL1            LDY   #>QHEAD+1
  850.                     LDA   (BASL),Y
  851.                     LDY   #>QTAIL+1
  852.                     CMP   (BASL),Y
  853.                     BNE   GOODCMP
  854.                     LDY   #>QHEAD
  855.                     LDA   (BASL),Y
  856.                     LDY   #>QTAIL
  857.                     CMP   (BASL),Y
  858.                     BNE   GOODCMP
  859.                     SEC   
  860.                     RTS   
  861. GOODCMP             CLC   
  862.                     RTS   
  863. ;
  864. ;
  865. STORHEAD            LDY   #>QINSREG
  866.                     LDA   (BASL),Y
  867.                     STA   FLAG
  868.                     LDY   #>QHEAD
  869.                     LDA   (BASL),Y
  870.                     STA   ADRS1L
  871.                     LDY   #>QHEAD+1
  872.                     LDA   (BASL),Y
  873.                     STA   ADRS1H
  874.                     LDA   #AUXPOKE
  875.                     STA   FUNCTION
  876.                     JSR   USRVECT
  877.                     RTS   
  878. ;                  
  879. ;
  880. GETTAIL1            LDY   #>QTAIL
  881.                     LDA   (BASL),Y
  882.                     STA   ADRS1L
  883.                     LDY   #>QTAIL+1
  884.                     LDA   (BASL),Y
  885.                     STA   ADRS1H
  886.                     LDA   #AUXPEEK
  887.                     STA   FUNCTION
  888.                     JSR   USRVECT
  889.                     LDA   FLAG
  890.                     LDY   #>QOUTREG
  891.                     STA   (BASL),Y
  892.                     RTS
  893. ;                                      
  894.                     CHN   INTRUPT.SRC3
  895. ; ********************************************
  896. ; * INTRUPT.SRC3-  MIDI FILTERING ROUTINE
  897. ; ********************************************
  898. ;
  899. ;
  900. ; SUBROUTINE: OUTHOOK - LOOK AT MIDI STREAM AND PROCESS ACCORDINGLY
  901. ;             CALL THE SENDMIDI SUBROUTINE IF WANT TO XMIT THE BYTE
  902. ;
  903. OUTHOOK1 LDY #>CODEFLAG      ;CHECK IF USER SET UP OWN CODE
  904.          LDA (BASL),Y
  905.          BEQ SENDIT          ;IF NO CHECK FOR TEMPO REQUEST
  906.          LDA #JMPINST        ;STORE A JMP IN ZERO PAGE VECTOR
  907.          STA MYADRS
  908.          LDY #>CODEHOOK      ;STORE LO BYTE OF USER'S ADRS
  909.          LDA (BASL),Y
  910.          STA MYADRS+1
  911.          LDY #>CODEHOOK+1    ;STORE HI BYTE
  912.          LDA (BASL),Y
  913.          STA MYADRS+2
  914.          JSR MYADRS          ;PERFORM USER'S CODE
  915.          BCS CHKTEMP         ;IF USER DOESN'T WANT BYTE SENT, GET OUT
  916. ;
  917. SENDIT   LDA #SENDMIDI       ;ELSE SEND THE BYTE       
  918.          STA FUNCTION
  919.          LDY #>MIDIBYTE
  920.          LDA (BASL),Y
  921.          STA FLAG
  922.          JSR USRVECT
  923. ;
  924. ;
  925. ;;;;;NEW SUB: TEMPOCHG
  926. ;
  927. CHKTEMP  LDY #>TEMPREQ
  928.          LDA (BASL),Y
  929.          BEQ ESCAPE          ; PROCESS REQUESTS TO CHANGE TEMPO
  930.          LDA #$0
  931.          STA (BASL),Y        ;RESET TEMPREQ FLAG TO 0 SO ONLY CALLED ONCE
  932. ;
  933.          LDY #>MIDISLOT
  934.          LDA (BASL),Y
  935.          TAX
  936.          LDA #$04 
  937.          STA $C080,X         ;REGISTER=4
  938.          LDY #>TIMERHI       ;WRITE HI BYTE
  939.          LDA (BASL),Y
  940.          STA $C084,X
  941.          LDA #$05            ;REGISTER=5
  942.          STA $C080,X         
  943.          LDY #>TIMERLO       ;WRITE LO BYTE
  944.          LDA (BASL),Y
  945.          STA $C085,X 
  946. ESCAPE   RTS
  947. ;
  948. ;
  949. ENQEVEN1 NOP
  950. ;
  951. ENQDELT1 NOP
  952. ;
  953. DEQDELT1 NOP
  954. ;
  955. ;
  956. DEQINST1 NOP
  957. ;
  958. NOTEOFF1 NOP
  959. ;
  960. NOTEON1  NOP
  961. ;
  962. AFTERTO1 NOP
  963. ;
  964. CTRLCHG1 NOP
  965. ;
  966. PROGCHG1 NOP
  967. ;
  968. PRESSUR1 NOP
  969. ;
  970. BENDER1  NOP
  971. ;
  972. SYSEXF01 NOP
  973. ;
  974. SYSEXF71 NOP
  975. ;
  976. META1    NOP
  977. ;
  978. CONVDLT1 NOP
  979. ;
  980. PLAYEVN1 NOP
  981. ;
  982. PLAYSON1 NOP
  983. ;
  984. ;
  985. ;
  986. EOF      BRK
  987.