home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 8 / AU_CD8.iso / CoverDiscs / November_1999 / rtr / software / Drum.L < prev    next >
Text File  |  1999-08-30  |  11KB  |  331 lines

  1. PIC 16C84 Assembler V1.4 by Mike Cook
  2. File:- ADFS::Square.$.Develop.Drum.Drum
  3. Assembled on :- Mon,30 Aug 1999 at 10:42:29
  4.  
  5. ;MIDI Drum
  6. ;For an 10 MHz clock
  7. ;A0 - MIDI Serial out
  8. ;
  9. ;0838 - A/D converter
  10. ;B0 - ~CS not Chip Select
  11. ;B1 - Clock
  12. ;B2 - Data output (multiplex select)
  13. ;B3 - Data input (converted value)
  14.  
  15. ;Note for 16F84 invert the state of the PWRTE
  16.               list   P=16C84
  17.  
  18.  
  19.        C             equ 0          
  20.        PCL           equ 2          
  21.        Z             equ 2          
  22.        PORTB         equ 6          
  23.        PORTA         equ 5          
  24.        TRISB         equ 86H          
  25.        TRISA         equ 85H          
  26.        EECON1        equ 88H          
  27.        INTCON        equ 0BH          
  28.        EEDATA        equ 8          
  29.        EEADR         equ 9          
  30.        STATUS        equ 3          
  31.        RP0           equ 5          
  32.        INC           equ 1          
  33.        cts           equ 2          
  34.        rts           equ 3          
  35.        sBuf          equ 0ch          ;Serial send buffer
  36.        Scount        equ 0dh          ;Tempory Counter
  37.        Cdown         equ 0eh          ;Time delay countdown
  38.        rBuf          equ 0fh          ;Recieve buffer
  39.        val           equ 10h          ;Value from A/D
  40.        chan          equ 11h          ;Channel to digitise
  41.        Tcount        equ 12h          ;Tempory loop counter
  42.        Ccount        equ 13h          ;Channel counter
  43.  
  44. ;
  45.               org    0
  46. 0000   2821   goto   Start          
  47.  
  48.  
  49. ;Send a serial byte
  50. Send:
  51.  
  52. 0001   3009   movlw  9              ;Number of data bits to send
  53. 0002   008D   movwf  Scount         
  54. 0003   1005   bcf    PORTA,0        ;Start bit
  55. 0004   2013   call   cDelay         ;Extra delay compensation
  56. Sloop:
  57. 0005   201C   call   Delay          
  58. 0006   180C   btfsc  sBuf,0         ;Set the next bit
  59. 0007   1405   bsf    PORTA,0        
  60. 0008   1C0C   btfss  sBuf,0         
  61. 0009   1005   bcf    PORTA,0        
  62. 000A   0C8C   rrf    sBuf,f         ;Shift for next time
  63. 000B   0B8D   decfsz Scount,f       
  64. 000C   2805   goto   Sloop          ;Round until finished
  65. 000D   1405   bsf    PORTA,0        ;Stop bit
  66. 000E   2013   call   cDelay         ;Extra delay compensation
  67. 000F   201C   call   Delay          
  68. 0010   201C   call   Delay          
  69. 0011   2013   call   cDelay         ;For good measure
  70. 0012   0008   return                
  71.  
  72. cDelay:
  73.  
  74. 0013   3002   movlw  2              ;Small delay at end of send
  75. 0014   008E   movwf  Cdown          
  76. 0015   281E   goto   Dloop          
  77.  
  78. hDelay:
  79.  
  80. 0016   300A   movlw  10             ;half delay for serial recieve 10MHz clock
  81. 0017   008E   movwf  Cdown          ; 31,250 Baud rate
  82. 0018   281E   goto   Dloop          
  83.  
  84. rDelay:
  85.  
  86. 0019   3015   movlw  21             ;Delay for serial recieve 10MHz clock
  87. 001A   008E   movwf  Cdown          ; 31,250 Baud rate
  88. 001B   281E   goto   Dloop          
  89.  
  90. Delay:
  91.  
  92. 001C   3016   movlw  22             ;Delay for serial send 10MHz clock
  93. 001D   008E   movwf  Cdown          ; 31,250 Baud rate
  94. Dloop:
  95. 001E   0B8E   decfsz Cdown,f        
  96. 001F   281E   goto   Dloop          
  97. 0020   0008   return                
  98.  
  99.  
  100. Start:
  101.  
  102. 0021   1683   bsf    STATUS,RP0     ;SELECT REGISTER BANK 1
  103. 0022   300A   movlw  0Ah            ;Bits 3 & 2 inputs
  104. 0023   0085   movwf  TRISA^80H      
  105. 0024   30F8   movlw  0F8h           ;port B I/O
  106. 0025   0086   movwf  TRISB^80H      
  107. 0026   3000   movlw  00H            ;Enable Pull ups on inputs
  108. 0027   0081   movwf  1              ;Option register
  109.  
  110. 0028   1283   bcf    STATUS,RP0     ;SELECT REGISTER BANK 0
  111.  
  112. 0029   1505   bsf    PORTA,cts      ;CTS disabled
  113. 002A   3005   movlw  5              ;Inital state of outputs
  114. 002B   0086   movwf  PORTB          
  115.  
  116. 002C   3020   movlw  20h            ;Fill buffer with FFs
  117.  
  118. 002D   0084   movwf  4              
  119. 002E   3008   movlw  8              
  120. 002F   0093   movwf  Ccount         
  121. pml:
  122. 0030   0180   clrf   0              
  123. 0031   0980   comf   0,f            
  124. 0032   0A84   incf   4,f            
  125. 0033   0B93   decfsz Ccount,f       
  126. 0034   2830   goto   pml            
  127.  
  128. Main:
  129.  
  130. 0035   3020   movlw  20h            ;Start of buffer
  131. 0036   0084   movwf  4              ;Indirect register
  132. 0037   3008   movlw  8              ;Number of channels to read
  133. 0038   0093   movwf  Ccount         ;Into counter
  134. Ml:
  135. 0039   2044   call   conv           ;do conversion
  136. 003A   2081   call   hyst           ;Add in hystrisis
  137. 003B   0200   subwf  0,w            ;test to see if more than last time
  138. 003C   1C03   btfss  STATUS,C       
  139. 003D   2067   call   play           ;Call play if bigger than last time
  140. 003E   0810   movf   val,w          ;Get current reading
  141. 003F   0080   movwf  0              ;save in buffer
  142. 0040   0A84   incf   4,f            ;Move to next buffer position
  143. 0041   0B93   decfsz Ccount,f       
  144. 0042   2839   goto   Ml             ;Read all 8 channels
  145. 0043   2835   goto   Main           ;Loop
  146.  
  147. conv:
  148.  
  149. 0044   3005   movlw  5              ;Bits to send
  150. 0045   0092   movwf  Tcount         
  151. 0046   0813   movf   Ccount,w       ;Get channel           
  152. 0047   3818   iorlw  18h            ;Add start bit and single conversion bit
  153. 0048   0091   movwf  chan           ;Channel to convert
  154. 0049   1006   bcf    PORTB,0        ;Lower ~CS
  155. clop:
  156. 004A   1E11   btfss  chan,4         ;Put data on output
  157. 004B   1106   bcf    PORTB,2        ;Put a zero
  158. 004C   1A11   btfsc  chan,4         
  159. 004D   1506   bsf    PORTB,2        ;Or a one
  160. 004E   1486   bsf    PORTB,1        ;Raise clock
  161. 004F   2066   call   ckd            ;Clock delay
  162. 0050   1086   bcf    PORTB,1        ;Lower clock
  163. 0051   0D91   rlf    chan,f         ;Move sending bit pattern
  164. 0052   0B92   decfsz Tcount,f       ;loop round five times
  165. 0053   284A   goto   clop           
  166. 0054   2066   call   ckd            
  167. 0055   2066   call   ckd            ;Multiplexer settiling time
  168. 0056   3009   movlw  9              ;bits to recieve + 1
  169. 0057   0092   movwf  Tcount         
  170. 0058   0190   clrf   val            
  171. ilop:
  172. 0059   0D90   rlf    val,f          ;Shift up pattern to recieve the next bit
  173. 005A   1010   bcf    val,0          ;make it a zero
  174. 005B   1986   btfsc  PORTB,3        
  175. 005C   1410   bsf    val,0          ;make it a one if need be
  176. 005D   1486   bsf    PORTB,1        ;Clock up
  177. 005E   2066   call   ckd            ;Clock delay
  178. 005F   1086   bcf    PORTB,1        ;Clock down
  179. 0060   0B92   decfsz Tcount,f       
  180. 0061   2859   goto   ilop           ;Round again
  181. 0062   1506   bsf    PORTB,2        ;Data to the converter set to a one
  182. 0063   1406   bsf    PORTB,0        ;Raise ~CS as we are finished
  183. 0064   0810   movf   val,w          ;Get value in w
  184. 0065   0008   return                
  185.  
  186. ckd:
  187.  
  188. 0066   0008   return                ;1.25 uS delay
  189.  
  190. play:
  191.  
  192. 0067   1903   btfsc  STATUS,Z       ;Return if they are the same
  193. 0068   0008   return                
  194. sag:
  195. 0069   0810   movf   val,w          ;get the value
  196. 006A   0080   movwf  0              ;put it in the buffer
  197. 006B   2044   call   conv           ;Get same channel again
  198. 006C   0200   subwf  0,w            ;Test to see if more than last time
  199. 006D   1903   btfsc  STATUS,Z       ;It is the same so don't play it
  200. 006E   2869   goto   sag            
  201. 006F   1C03   btfss  STATUS,C       ;Is it greater (still rising)
  202. 0070   2869   goto   sag            ;Go round if it is bigger
  203. 0071   3099   movlw  99h            ;Note On Channel 10 (drums)
  204. 0072   008C   movwf  sBuf           
  205. 0073   2001   call   Send           
  206. 0074   0C06   rrf    PORTB,w        ;Get mapping shift switches
  207. 0075   3918   andlw  18h            ;Look at only 2 bits (4 mappings)
  208. 0076   0713   addwf  Ccount,w       ;add in the channel
  209. 0077   208B   call   map            ;Map channel number to note (instrument)
  210. 0078   008C   movwf  sBuf           ;Send it
  211. 0079   2001   call   Send           
  212. 007A   0183   clrf   STATUS         C        ;Adjust velocity to 7 bits
  213. 007B   0C00   rrf    0,w            
  214. 007C   008C   movwf  sBuf           ;Send velocity
  215. 007D   2001   call   Send           
  216. 007E   0190   clrf   val            ;Set val to FF to inhibit firing next time round
  217. 007F   0990   comf   val,f          
  218. 0080   0008   return                ;back with it
  219.  
  220. hyst:
  221.  
  222. 0081   0A80   incf   0,f            ;Add hystresis to stored value
  223. 0082   1903   btfsc  STATUS,Z       ;Make sure it does not wrap round to 0
  224. 0083   0980   comf   0,f            
  225. 0084   0A80   incf   0,f            ;Add hystresis to stored value
  226. 0085   1903   btfsc  STATUS,Z       ;Make sure it does not wrap round to 0
  227. 0086   0980   comf   0,f            
  228. 0087   0A80   incf   0,f            ;Add hystresis to stored value
  229. 0088   1903   btfsc  STATUS,Z       ;Make sure it does not wrap round to 0
  230. 0089   0980   comf   0,f            
  231. 008A   0008   return                
  232.  
  233. map:
  234.  
  235. ;Map a MIDI drum sound to a channel number
  236. ;Change this to suite yourself
  237. 008B   0782   addwf  PCL,f          
  238. ;Mapping 0
  239. 008C   343B   retlw  59             ;Ch0 Ride cymbal 2
  240. 008D   3439   retlw  57             ;Ch1 Crash cymbal 2
  241. 008E   343A   retlw  58             ;Ch2 Vibraslap
  242. 008F   3438   retlw  56             ;Ch3 Cow bell
  243. 0090   3436   retlw  54             ;Ch4 Tambourine
  244. 0091   3432   retlw  50             ;Ch5 Hi tom
  245. 0092   3430   retlw  48             ;Ch6 Hi hat open
  246. 0093   3427   retlw  39             ;Ch7 Hand clap
  247. ;Mapping 1
  248. 0094   3420   retlw  32             ;Ch0 Sticks
  249. 0095   3416   retlw  22             ;Ch1 Metronome bell
  250. 0096   341D   retlw  29             ;Ch2 Snare roll
  251. 0097   3425   retlw  37             ;Ch3 Side stick
  252. 0098   3426   retlw  38             ;Ch4 Snare M
  253. 0099   342A   retlw  42             ;Ch5 Hi hat closed
  254. 009A   341E   retlw  30             ;Ch6 Castanet
  255. 009B   3412   retlw  18             ;Ch7 Scratch pull
  256. ;Mapping 2        
  257. 009C   3414   retlw  20             ;Ch0 Click noise
  258. 009D   3413   retlw  19             ;Ch1 Finger snap
  259. 009E   3410   retlw  16             ;Ch2 Whip slap
  260. 009F   3419   retlw  25             ;Ch3 Brush tap
  261. 00A0   341A   retlw  26             ;Ch4 Brush swirl
  262. 00A1   3422   retlw  34             ;Ch5 Open rim shot
  263. 00A2   3423   retlw  35             ;Ch6 Bass drum M
  264. 00A3   3424   retlw  36             ;Ch7 Bass drum H
  265. ;Mapping 3
  266. 00A4   3423   retlw  35             ;Ch0 Bass drum
  267. 00A5   3426   retlw  38             ;Ch1 Snare
  268. 00A6   342E   retlw  46             ;Ch2 Hi hat open
  269. 00A7   3431   retlw  49             ;Ch3 Crash cymbal
  270. 00A8   3433   retlw  51             ;Ch4 Ride cymbal
  271. 00A9   3437   retlw  55             ;Ch5 Splash Cymbal
  272. 00AA   3429   retlw  41             ;Ch6 Floor Tom L
  273. 00AB   342B   retlw  43             ;Ch7 Floor Tom H
  274.  
  275.  
  276.  
  277. end
  278.  
  279. Memory Usage Map ('X' = Used, '-' = Unused)
  280.  
  281. 0000   : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
  282. 0040   : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
  283. 0080   : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX---- ----------------
  284.  
  285. 43 Lables & Constants:-
  286. Hex    Name
  287. 0000   C
  288. 0002   PCL
  289. 0002   Z
  290. 0006   PORTB
  291. 0005   PORTA
  292. 0086   TRISB
  293. 0085   TRISA
  294. 0088   EECON1
  295. 000B   INTCON
  296. 0008   EEDATA
  297. 0009   EEADR
  298. 0003   STATUS
  299. 0005   RP0
  300. 0001   INC
  301. 0002   cts
  302. 0003   rts
  303. 000C   sBuf
  304. 000D   Scount
  305. 000E   Cdown
  306. 000F   rBuf
  307. 0010   val
  308. 0011   chan
  309. 0012   Tcount
  310. 0013   Ccount
  311. 0001   Send
  312. 0005   Sloop
  313. 0013   cDelay
  314. 0016   hDelay
  315. 0019   rDelay
  316. 001C   Delay
  317. 001E   Dloop
  318. 0021   Start
  319. 0030   pml
  320. 0035   Main
  321. 0039   Ml
  322. 0044   conv
  323. 004A   clop
  324. 0059   ilop
  325. 0066   ckd
  326. 0067   play
  327. 0069   sag
  328. 0081   hyst
  329. 008B   map
  330.  
  331. 0 Errors