home *** CD-ROM | disk | FTP | other *** search
/ Set of Apple II Hard Drive Images / eric.hdv / ANNMIDI:BACKOUT / MIDIDRVR.SRC.txt < prev    next >
Text File  |  2020-08-13  |  8KB  |  196 lines

  1. ;-------------------------------------------------------------------------
  2. ; APPLE MIDI DRIVER THROUGH ANNUNCIATOR 0
  3. ; COPYRIGHT 1998, ERIC RANGELL
  4. ;-------------------------------------------------------------------------
  5. ; THIS DRIVER IMPLEMENTS ASYNCHRONOUS SERIAL DATA TRANSMISSION 
  6. ; THROUGH THE APPLE ANNUNCIATOR 0 OUTPUT PORT OF THE GAME CONNECTOR
  7. ; USING 32 CYCLES PER BIT TO ACHIEVE A 31.25K MIDI BAUD RATE.
  8. ;
  9. ; THE OUTPUT IS INITIALIZED TO A HIGH LOGIC VOLTAGE.  WHEN IT GOES
  10. ; LOW FOR 32 MICROSECONDS, THAT INDICATES THE START BIT OF A MIDI BYTE.
  11. ; THEN 8 BYTES OF DATA ARE TRANSMITTED, FOLLOWED BY A HIGH STOP BIT.
  12. ; THE DATA BYTES REPRESENT MIDI MESSAGES WHICH CAN BE INTERPRETED BY
  13. ; ANY MUSICAL INSTRUMENT THAT IMPLEMENTS MIDI.
  14. ;
  15. ; ENTRY POINTS:
  16. ;
  17. ; $9000 = INITIALIZE - TURNS ON ANNUNCIATOR 0 - MUST BE CALLED ONCE
  18. ; $9003 = APPLESOFT CALL TO SEND ONE MIDI BYTE.  POKE THE BYTE IN $9004.
  19. ; $9005 = ASSEMBLY CALL TO SEND ONE MIDI BYTE FROM ACCUMULATOR
  20. ; $9008 = APPLESOFT OR ASSEMBLY CALL TO SEND SEVERAL BYTES AT ONCE:
  21. ;         THE CALLER POPULATES LOCATION $D7 WITH THE NUMBER OF BYTES TO BE
  22. ;         TRANSMITTED, AND A POINTER IN $CE,CF (LO,HI) WITH THE ADDRESS OF
  23. ;         THE DATA BYTES, THEN CALLS THE ENTRY POINT "SENDMSG" TO TRANSMIT 
  24. ;         THE MESSAGE.
  25. ; $900B = SEND A TEST MESSAGE - C MAJOR CHORD NOTE ONS
  26. ; $900E = SEND A TEST MESSAGE - C MAJOR CHORD NOTE OFFS
  27. ;-------------------------------------------------------------------------
  28.          ORG $9000
  29. ;
  30. AN0OFF   EQU $C058           ;APPLE ADDRESSES THAT CONTROL ANNUNCIATOR OUTPUTS
  31. AN0ON    EQU $C059
  32. AN1OFF   EQU $C05A
  33. AN1ON    EQU $C05B
  34. AN2OFF   EQU $C05C
  35. AN2ON    EQU $C05D
  36. AN3OFF   EQU $C05E
  37. AN3ON    EQU $C05F
  38. ;
  39. ; CALLER MUST POPULATE THE FOLLOWING TWO ZERO PAGE LOCATIONS FOR SENDMSG:
  40. ;
  41. NUMBYTES EQU $D7             ;NUMBER OF BYTES TO BE TRANSMITTED NOW (1-256)
  42. ;                            ;THE VALUE 0 WILL TRANSMIT 256 BYTES.
  43. DATAPTR  EQU $CE             ;POINTER TO THE BYTES TO BE TRANSMITTED NOW
  44. ;---------------------------------------------------------------------------
  45. START    JMP INIT            ;MAIN ENTRY POINT - INITIALIZES ANNUNCIATORS
  46. SENDFP   LDA #$90            ;ENTRY POINT FOR APPLESOFT: POKE BYTE AND CALL
  47. SENDONE  JMP XMITONE         ;ENTRY POINT FOR TRANSMITTING ONE BYTE FROM ACCUM
  48. SENDMSG  JMP XMITMSG         ;ENTRY POINT FOR TRANSMITTING A MIDI MESSAGE
  49. ALLNOFF  JMP QUIET           ;TURN ALL NOTES OFF
  50. TEST1    JMP TESTMSG1        ;SEND TEST MESSAGE 1 - C MAJOR CHORD ON
  51. TEST2    JMP TESTMSG2        ;SEND TEST MESSAGE 2 - C MAJOR CHORD OFF
  52. SAVENBYT DFB $00             ;SAVE AREA FOR NUMBYTES
  53. TEMPA    DFB $00
  54. TEMPX    DFB $00
  55. ;---------------------------------------------------------------------------
  56. INIT     BIT AN0ON
  57.          RTS
  58. ;---------------------------------------------------------------------------
  59. XMITMSG  LDA NUMBYTES        ;SAVE NUMBER OF BYTES
  60.          STA SAVENBYT        ;BECAUSE WE WILL CLOBBER IT
  61.          LDY #$00            ;Y WILL BE AN INDEX INTO THE DATA AREA
  62. XMITLOOP LDA (DATAPTR),Y     ;GET A DATA BYTE
  63.          JSR XMITONE
  64.          INY                 ;POINT TO NEXT BYTE
  65.          DEC NUMBYTES        ;DECREMENT COUNTER
  66.          LDA NUMBYTES        ;CHECK IF ZERO
  67.          BNE XMITLOOP        ;LOOP UNTIL DONE SENDING ALL BYTES
  68.          LDA SAVENBYT
  69.          STA NUMBYTES        ;RESTORE ORIGINAL VALUE OF NUMBYTES
  70.          RTS
  71. ;---------------------------------------------------------------------------
  72. XMITONE  STA TEMPA           ;SAVE A AND X REGISTERS
  73.          STX TEMPX
  74. ;
  75.          ASL A               ;SHIFT BIT INTO CARRY
  76.          TAX                 ;SAVE CURRENT IMAGE OF DATA BYTE
  77.          LDA #$00            ;ZERO OUT ACCUMULATOR FOR ADD
  78.          ADC #>AN0OFF        ;ADD CARRY TO ANNUNCIATOR ADDRESS
  79.          STA BIT7+1          ;MODIFY THE XMITBITS SUBROUTINE
  80.          TXA                 ;RESTORE ACCUMULATOR
  81. ;
  82.          ASL A               ;SHIFT BIT INTO CARRY
  83.          TAX                 ;SAVE CURRENT IMAGE OF DATA BYTE
  84.          LDA #$00            ;ZERO OUT ACCUMULATOR FOR ADD
  85.          ADC #>AN0OFF        ;ADD CARRY TO ANNUNCIATOR ADDRESS
  86.          STA BIT6+1          ;MODIFY THE XMITBITS SUBROUTINE
  87.          TXA                 ;RESTORE ACCUMULATOR
  88. ;
  89.          ASL A               ;SHIFT BIT INTO CARRY
  90.          TAX                 ;SAVE CURRENT IMAGE OF DATA BYTE
  91.          LDA #$00            ;ZERO OUT ACCUMULATOR FOR ADD
  92.          ADC #>AN0OFF        ;ADD CARRY TO ANNUNCIATOR ADDRESS
  93.          STA BIT5+1          ;MODIFY THE XMITBITS SUBROUTINE
  94.          TXA                 ;RESTORE ACCUMULATOR
  95. ;
  96.          ASL A               ;SHIFT BIT INTO CARRY
  97.          TAX                 ;SAVE CURRENT IMAGE OF DATA BYTE
  98.          LDA #$00            ;ZERO OUT ACCUMULATOR FOR ADD
  99.          ADC #>AN0OFF        ;ADD CARRY TO ANNUNCIATOR ADDRESS
  100.          STA BIT4+1          ;MODIFY THE XMITBITS SUBROUTINE
  101.          TXA                 ;RESTORE ACCUMULATOR
  102. ;
  103.          ASL A               ;SHIFT BIT INTO CARRY
  104.          TAX                 ;SAVE CURRENT IMAGE OF DATA BYTE
  105.          LDA #$00            ;ZERO OUT ACCUMULATOR FOR ADD
  106.          ADC #>AN0OFF        ;ADD CARRY TO ANNUNCIATOR ADDRESS
  107.          STA BIT3+1          ;MODIFY THE XMITBITS SUBROUTINE
  108.          TXA                 ;RESTORE ACCUMULATOR
  109. ;
  110.          ASL A               ;SHIFT BIT INTO CARRY
  111.          TAX                 ;SAVE CURRENT IMAGE OF DATA BYTE
  112.          LDA #$00            ;ZERO OUT ACCUMULATOR FOR ADD
  113.          ADC #>AN0OFF        ;ADD CARRY TO ANNUNCIATOR ADDRESS
  114.          STA BIT2+1          ;MODIFY THE XMITBITS SUBROUTINE
  115.          TXA                 ;RESTORE ACCUMULATOR
  116. ;
  117.          ASL A               ;SHIFT BIT INTO CARRY
  118.          TAX                 ;SAVE CURRENT IMAGE OF DATA BYTE
  119.          LDA #$00            ;ZERO OUT ACCUMULATOR FOR ADD
  120.          ADC #>AN0OFF        ;ADD CARRY TO ANNUNCIATOR ADDRESS
  121.          STA BIT1+1          ;MODIFY THE XMITBITS SUBROUTINE
  122.          TXA                 ;RESTORE ACCUMULATOR
  123. ;
  124.          ASL A               ;SHIFT BIT INTO CARRY
  125.          TAX                 ;SAVE CURRENT IMAGE OF DATA BYTE
  126.          LDA #$00            ;ZERO OUT ACCUMULATOR FOR ADD
  127.          ADC #>AN0OFF        ;ADD CARRY TO ANNUNCIATOR ADDRESS
  128.          STA BIT0+1          ;MODIFY THE XMITBITS SUBROUTINE
  129.          TXA                 ;RESTORE ACCUMULATOR
  130. ;
  131.          JSR XMITBITS        ;SEND THE BYTE OUT 
  132.          LDX TEMPX
  133.          LDA TEMPA           ;RESTORE X AND A
  134.          RTS
  135. ;-----------------------------------------------------------------------
  136. XMITBITS BIT AN0OFF          ;4 CYCLES - TRANSMIT START BIT - ALWAYS LOW
  137.          JSR DELAY22         ;6+22
  138. BIT0     BIT AN0OFF          ;4
  139.          JSR DELAY22         ;6+22
  140. BIT1     BIT AN0OFF          ;4
  141.          JSR DELAY22         ;6+22
  142. BIT2     BIT AN0OFF          ;4
  143.          JSR DELAY22         ;6+22
  144. BIT3     BIT AN0OFF          ;4
  145.          JSR DELAY22         ;6+22
  146. BIT4     BIT AN0OFF          ;4
  147.          JSR DELAY22         ;6+22
  148. BIT5     BIT AN0OFF          ;4
  149.          JSR DELAY22         ;6+22
  150. BIT6     BIT AN0OFF          ;4
  151.          JSR DELAY22         ;6+22
  152. BIT7     BIT AN0OFF          ;4
  153.          JSR DELAY22         ;6+22
  154.          BIT AN0ON           ;4        ;TRANSMIT STOP BIT - ALWAYS HIGH
  155.          JSR DELAY22         ;6+22
  156.          RTS
  157. ;-----------------------------------------------------------------------
  158. DELAY22  NOP       ;WAIT 22 CYCLES
  159.          NOP
  160.          NOP
  161.          NOP
  162.          NOP
  163.          NOP
  164.          NOP
  165.          NOP
  166.          RTS
  167. ;-----------------------------------------------------------------------
  168. TESTMSG1 LDA #7    
  169.          STA NUMBYTES
  170.          LDA #>TESTDAT1
  171.          STA DATAPTR
  172.          LDA #<TESTDAT1
  173.          STA DATAPTR+1
  174.          JSR SENDMSG
  175.          RTS
  176. ;-----------------------------------------------------------------------
  177. TESTMSG2 LDA #7
  178.          STA NUMBYTES
  179.          LDA #>TESTDAT2
  180.          STA DATAPTR
  181.          LDA #<TESTDAT2
  182.          STA DATAPTR+1
  183.          JSR SENDMSG
  184.          RTS
  185. ;-----------------------------------------------------------------------
  186. QUIET    LDA #$90
  187.          STA NUMBYTES
  188.          LDA #>QUIETMSG
  189.          STA DATAPTR
  190.          LDA #<QUIETMSG
  191.          STA DATAPTR+1
  192.          JSR SENDMSG
  193.          RTS
  194. ;-----------------------------------------------------------------------
  195.          CHN MIDIDRVR.SC0
  196.