Guest User

TotC sound driver

a guest
May 24th, 2012
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 0000: F3            di
  2. 0001: C3 D5 01      jp   $01D5
  3.  
  4. ;sends d to port 4, e to port 5
  5. 0004: F5            push af
  6. 0005: 00            nop
  7. 0006: 00            nop
  8. 0007: 7A            ld   a,d
  9. 0008: D3 04         out  ($04),a
  10. 000A: 7B            ld   a,e
  11. 000B: D3 05         out  ($05),a
  12. 000D: F1            pop  af
  13. 000E: 00            nop
  14. 000F: 00            nop
  15. 0010: C9            ret
  16.  
  17. ;sends d to port 6, e to port 7
  18. 0011: 00            nop
  19. 0012: 00            nop
  20. 0013: F5            push af
  21. 0014: 7A            ld   a,d
  22. 0015: D3 06         out  ($06),a
  23. 0017: 7B            ld   a,e
  24. 0018: D3 07         out  ($07),a
  25. 001A: F1            pop  af
  26. 001B: 00            nop
  27. 001C: 00            nop
  28. 001D: C9            ret
  29.  
  30. 001E: 00            nop
  31. ;nops
  32. 0037: 00            nop
  33.  
  34. 0038: ED 4D         reti        ;IRQ
  35. 003A: 00            nop
  36. 003B: 00            nop
  37. 003C: 00            nop
  38. 003D: 00            nop
  39. 003E: 00            nop
  40. 003F: 00            nop
  41. ;"LeCorTHX v9.05c\0"
  42. 0040: 4C 65 43 6F 72 54 48 58 20 76 39 2E 30 35 63 00
  43.  
  44. 0050: 00            nop
  45. ;nops
  46. 0065: 00            nop
  47.  
  48. ;command from 68k
  49. 0066: F5            push af
  50. 0067: 3E FF         ld   a,$FF
  51. 0069: D3 0C         out  ($0C),a    ;reply 0xff to 68k
  52. 006B: C5            push bc
  53. 006C: D5            push de
  54. 006D: E5            push hl
  55. 006E: DB 00         in   a,($00)    ;get the cmd # (after answering it, lulz)
  56. 0070: FE 01         cp   $01
  57. 0072: 28 76         jr   z,$00EA    ;slot switch CMD
  58. 0074: FE 03         cp   $03
  59. 0076: CA F4 00      jp   z,$00F4    ;reset z80
  60. 0079: 47            ld   b,a        ;b=CMD
  61. 007A: 21 00 F8      ld   hl,$F800   ;hl=0xf800 (queue base)
  62. 007D: 3A 29 F8      ld   a,($F829)  ;a=$f829 (queue ptr)
  63. 0080: 6F            ld   l,a        ;add ptr to base
  64. 0081: 70            ld   (hl),b     ;write cmd into queue
  65. 0082: 3C            inc  a
  66. 0083: E6 1F         and  $1F
  67. 0085: 32 29 F8      ld   ($F829),;inc queue ptr, crop to 0x1f (32 slots queue)
  68. 0088: E1            pop  hl
  69. 0089: D1            pop  de
  70. 008A: C1            pop  bc
  71. 008B: 3E 01         ld   a,$01
  72. 008D: D3 0C         out  ($0C),a    ;answer 01
  73. 008F: F1            pop  af
  74. 0090: ED 45         retn
  75.  
  76. 0092: 00            nop
  77. ;nops
  78. 00CF: 00            nop
  79.  
  80. ;seems unused
  81. 00D0: F5            push af
  82. 00D1: C5            push bc
  83. 00D2: DB 06         in   a,($06)
  84. 00D4: 06 30         ld   b,$30
  85. 00D6: 10 FE         djnz $00D6
  86. 00D8: DB 04         in   a,($04)
  87. 00DA: 06 30         ld   b,$30
  88. 00DC: 10 FE         djnz $00DC
  89. 00DE: C1            pop  bc
  90. 00DF: F1            pop  af
  91. 00E0: FB            ei
  92. 00E1: ED 4D         reti
  93. 00E3: DB 04         in   a,($04)
  94. 00E5: A7            and  a
  95. 00E6: FA E3 00      jp   m,$00E3
  96. 00E9: C9            ret
  97.  
  98. ;CMD 01 (slot switch)
  99. 00EA: F3            di
  100. 00EB: 3E 01         ld   a,$01
  101. 00ED: D3 0C         out  ($0C),a    ;answer 01
  102. 00EF: D3 00         out  ($00),a
  103. 00F1: C3 00 00      jp   $0000      ;let's reboot! (lolwut?)
  104.  
  105. ;CMD 03 (z80 reset)
  106. 00F4: AF            xor  a
  107. 00F5: D3 0C         out  ($0C),a    ;answer 0
  108. 00F7: D3 00         out  ($00),a
  109. 00F9: C3 00 00      jp   $0000      ;reboot
  110.  
  111. ;play CMD (#in a)
  112. 00FC: CB 7F         bit  7,a
  113. 00FE: 20 18         jr   nz,$0118   ;bit7 set? => 0x118
  114. 0100: FE 10         cp   $10        ;cmd==0x10?
  115. 0102: 28 01         jr   z,$0105    ;yes => 105
  116. 0104: C9            ret
  117.  
  118. ;cmd 0x10
  119. 0105: 11 01 10      ld   de,$1001   ;stops ADPCM-B
  120. 0108: CD 04 00      call $0004
  121. 010B: 11 00 10      ld   de,$1000   ;nothing
  122. 010E: CD 04 00      call $0004
  123. 0111: 11 00 11      ld   de,$1100   ;clears L+R channel. useless.
  124. 0114: CD 04 00      call $0004
  125. 0117: C9            ret
  126.  
  127. ;execute CMD with bit 7 set
  128. 0118: E6 7F         and  $7F        ;clear bit7 from CMD#
  129. 011A: 32 27 F8      ld   ($F827),;$f827=cmd
  130. 011D: CD 58 02      call $0258      ;ix=cmd data ptr
  131. 0120: DD 7E 04      ld   a,(ix+$04) ;a=data[4]
  132. 0123: CB 47         bit  0,a
  133. 0125: C2 77 01      jp   nz,$0177   ;bit 0 set => ADPCM-B
  134. 0128: 3A 27 F8      ld   a,($F827)  ;get back masked cmd#
  135. 012B: CD 6D 02      call $026D      ;get a "free" ADPCM-A channel
  136. 012E: 11 3F 01      ld   de,$013F   ;master volume
  137. 0131: CD 11 00      call $0011
  138. 0134: 78            ld   a,b
  139. 0135: C6 08         add  a,$08
  140. 0137: 57            ld   d,a
  141. 0138: 1E DF         ld   e,$DF      ;L+R channel, full volume on channel (a)
  142. 013A: CD 11 00      call $0011
  143. 013D: 78            ld   a,b
  144. 013E: C6 10         add  a,$10
  145. 0140: 57            ld   d,a
  146. 0141: DD 5E 00      ld   e,(ix+$00) ;channel start address LSB
  147. 0144: CD 11 00      call $0011
  148. 0147: C6 08         add  a,$08
  149. 0149: 57            ld   d,a
  150. 014A: DD 5E 01      ld   e,(ix+$01) ;channel start address MSB
  151. 014D: CD 11 00      call $0011
  152. 0150: C6 08         add  a,$08
  153. 0152: 57            ld   d,a
  154. 0153: DD 5E 02      ld   e,(ix+$02) ;channel end address LSB
  155. 0156: CD 11 00      call $0011
  156. 0159: C6 08         add  a,$08
  157. 015B: 57            ld   d,a
  158. 015C: DD 5E 03      ld   e,(ix+$03) ;channel end address MSB
  159. 015F: CD 11 00      call $0011
  160. 0162: 78            ld   a,b
  161. 0163: 6F            ld   l,a
  162. 0164: 26 00         ld   h,$00      ;hl=00channel
  163. 0166: 11 71 01      ld   de,$0171   ;de=0x0171
  164. 0169: 19            add  hl,de         
  165. 016A: 5E            ld   e,(hl)
  166. 016B: 16 00         ld   d,$00      ;play the channel
  167. 016D: CD 11 00      call $0011
  168. 0170: C9            ret
  169. ;data, ADPCM-A channel flags
  170. 0171: 01 02 04 08 10 20
  171.  
  172. ;sends stuff + CMD data to ports 4&5, done the shitty way - ADPCM-B stuff
  173. 0177: 11 01 10      ld   de,$1001   ;resets ADPMC-B
  174. 017A: CD 04 00      call $0004
  175. 017D: 11 00 10      ld   de,$1000   ;let's do nothing!
  176. 0180: CD 04 00      call $0004
  177. 0183: 11 00 1C      ld   de,$1C00   ;reset flags
  178. 0186: CD 04 00      call $0004
  179. 0189: 11 C0 11      ld   de,$11C0   ;L+R channels
  180. 018C: CD 04 00      call $0004
  181. 018F: 11 21 19      ld   de,$1921   ;frequency
  182. 0192: CD 04 00      call $0004
  183. 0195: 11 55 1A      ld   de,$1A55   ;frequency (18.050 KHz)
  184. 0198: CD 04 00      call $0004
  185. 019B: 11 00 12      ld   de,$1200  
  186. 019E: DD 5E 00      ld   e,(ix+$00) ;sets start & end address from data
  187. 01A1: CD 04 00      call $0004
  188. 01A4: 11 00 13      ld   de,$1300
  189. 01A7: DD 5E 01      ld   e,(ix+$01) ;"
  190. 01AA: CD 04 00      call $0004
  191. 01AD: 11 00 14      ld   de,$1400
  192. 01B0: DD 5E 02      ld   e,(ix+$02) ;"
  193. 01B3: CD 04 00      call $0004
  194. 01B6: 11 00 15      ld   de,$1500
  195. 01B9: DD 5E 03      ld   e,(ix+$03) ;"
  196. 01BC: CD 04 00      call $0004
  197. 01BF: 11 7F 1B      ld   de,$1B7F   ;half volume
  198. 01C2: CD 04 00      call $0004
  199. 01C5: 11 80 10      ld   de,$1080   ;de=play command
  200. 01C8: DD 7E 04      ld   a,(ix+$04)
  201. 01CB: CB 4F         bit  1,a
  202. 01CD: 28 02         jr   z,$01D1    ;needs repeat? (data[4] bit 1)
  203. 01CF: CB E3         set  4,e        ;yes => adds it to play cmd
  204. 01D1: CD 04 00      call $0004  ;play!
  205. 01D4: C9            ret
  206.  
  207. ;entry point
  208. 01D5: 31 F0 FF      ld   sp,$FFF0   ;stack ptr
  209. 01D8: ED 56         im   1      ;interrupt mode 1
  210. 01DA: AF            xor  a      ;a=0
  211. 01DB: 32 26 F8      ld   ($F826),;$f826=0
  212. 01DE: 32 28 F8      ld   ($F828),;$f828=0
  213. 01E1: 32 29 F8      ld   ($F829),;$f829=0
  214. ; sends  2801 2802 2805 2806 0800 0900 0a00 1001 1c00 1000 2730 to ports 4&5 (setup YM2610), done the shitty way.
  215. ;ADPCM-A better be silent because we ain't reseting it!
  216. 01E4: 11 01 28      ld   de,$2801   ;silence FM channel 1
  217. 01E7: CD 04 00      call $0004
  218. 01EA: 11 02 28      ld   de,$2802   ;silence FM channel 2
  219. 01ED: CD 04 00      call $0004
  220. 01F0: 11 05 28      ld   de,$2805   ;silence FM channel 3
  221. 01F3: CD 04 00      call $0004
  222. 01F6: 11 06 28      ld   de,$2806   ;silence FM channel 4
  223. 01F9: CD 04 00      call $0004
  224. 01FC: 11 00 08      ld   de,$0800   ;silence SSG  channel A
  225. 01FF: CD 04 00      call $0004
  226. 0202: 11 00 09      ld   de,$0900   ;silence SSG  channel B
  227. 0205: CD 04 00      call $0004
  228. 0208: 11 00 0A      ld   de,$0A00   ;silence SSG  channel C
  229. 020B: CD 04 00      call $0004
  230. 020E: 11 01 10      ld   de,$1001   ;resets ADPCM-B
  231. 0211: CD 04 00      call $0004
  232. 0214: 11 00 1C      ld   de,$1C00   ;clears ADPCM-B flags
  233. 0217: CD 04 00      call $0004
  234. 021A: 11 00 10      ld   de,$1000   ;nothing!
  235. 021D: CD 04 00      call $0004
  236. 0220: 11 30 27      ld   de,$2730   ;reset timers
  237. 0223: CD 04 00      call $0004
  238.  
  239. 0226: 3E 1E         ld   a,$1E      ;important banks setup for this 827 bytes driver
  240. 0228: DB 08         in   a,($08)
  241. 022A: 3E 0E         ld   a,$0E
  242. 022C: DB 09         in   a,($09)
  243. 022E: 3E 06         ld   a,$06
  244. 0230: DB 0A         in   a,($0A)
  245. 0232: 3E 02         ld   a,$02
  246. 0234: DB 0B         in   a,($0B)
  247. 0236: D3 08         out  ($08),a
  248. 0238: FB            ei          ;enable interrupts
  249. 0239: 3E 55         ld   a,$55
  250. 023B: D3 0C         out  ($0C),a    ;let's say 0x55 to 68k
  251.  
  252. ;main loop
  253. 023D: 3A 29 F8      ld   a,($F829)
  254. 0240: 47            ld   b,a        ;b=exectuted queue ptr
  255. 0241: 3A 28 F8      ld   a,($F828)  ;a=queue ptr
  256. 0244: B8            cp   b
  257. 0245: 28 F6         jr   z,$023D    ;up to date with last cmd? yes => loop
  258.  
  259. 0247: 21 00 F8      ld   hl,$F800
  260. 024A: 6F            ld   l,a
  261. 024B: 46            ld   b,(hl)     ;b=cmd in queue
  262. 024C: 3C            inc  a
  263. 024D: E6 1F         and  $1F
  264. 024F: 32 28 F8      ld   ($F828),;inc executed queue ptr, crop to 0x1f
  265. 0252: 78            ld   a,b        ;a=cmd
  266. 0253: CD FC 00      call $00FC      ;let's play it
  267. 0256: 18 E5         jr   $023D      ;loop
  268.  
  269. ;gets cmd data ptr in ix
  270. 0258: F5            push af
  271. 0259: E6 7F         and  $7F        ;clears bit 7 again, better safe than sorry
  272. 025B: 6F            ld   l,a
  273. 025C: 26 00         ld   h,$00
  274. 025E: 29            add  hl,hl
  275. 025F: 29            add  hl,hl
  276. 0260: 16 00         ld   d,$00
  277. 0262: 5F            ld   e,a        ;de=0x00CMD
  278. 0263: 19            add  hl,de      ;hl=cmd#*5
  279. 0264: 11 9B 02      ld   de,$029B   ;de=data ptr
  280. 0267: 19            add  hl,de      ;adds it
  281. 0268: E5            push hl
  282. 0269: DD E1         pop  ix     ;ix=data ptr
  283. 026B: F1            pop  af
  284. 026C: C9            ret
  285.  
  286. ;gets a "free" ADPCM-A channel, returns it in a
  287. ;free as in let's cycle them, not check if they are done with playing sample
  288. 026D: 21 20 F8      ld   hl,$F820   ;hl=0xf820
  289. 0270: 06 00         ld   b,$00      ;b=0
  290.  
  291. 0272: 3A 27 F8      ld   a,($F827)  ;get back masked cmd#
  292. 0275: 5E            ld   e,(hl)
  293. 0276: BB            cp   e      ;compare $f820 with current cmd#
  294. 0277: CA 8F 02      jp   z,$028F    ;same => 028f
  295. 027A: 23            inc  hl     ;hl++
  296. 027B: 04            inc  b      ;b++
  297. 027C: 78            ld   a,b        ;a=b
  298. 027D: FE 06         cp   $06        ;==06?
  299. 027F: C2 72 02      jp   nz,$0272   ;no => loop
  300.  
  301. 0282: 3A 26 F8      ld   a,($F826)
  302. 0285: 47            ld   b,a
  303. 0286: 3C            inc  a
  304. 0287: FE 06         cp   $06
  305. 0289: 20 01         jr   nz,$028C
  306. 028B: AF            xor  a
  307. 028C: 32 26 F8      ld   ($F826),;increase $f826, back to 0 if ==6
  308.  
  309. 028F: 21 20 F8      ld   hl,$F820
  310. 0292: 16 00         ld   d,$00
  311. 0294: 58            ld   e,b
  312. 0295: 19            add  hl,de
  313. 0296: 3A 27 F8      ld   a,($F827)
  314. 0299: 77            ld   (hl),a
  315. 029A: C9            ret
  316.  
  317. ;commands data, 5bytes blocks, everything is eiher ADPCM-A or ADPCM-B
  318. ;start address (2 bytes, swapped), end address (2 bytes, swapped), control (bit0=A/B type ADPCM, bit1=repeat flag for B type)
  319. 029B: 00 00 06 09 03        ;start 0x000000, end 0x090600, B type, repeat
  320. 02A0: 07 09 CD 0F 03
  321. 02A5: CE 0F F9 0F 00
  322. 02AA: FA 0F FD 0F 00
  323. 02AF: 00 10 A0 18 03
  324. 02B4: A1 18 63 1F 03
  325. 02B9: 64 1F F7 1F 01
  326. 02BE: F8 1F FF 1F 00
  327. 02C3: 00 20 55 28 03
  328. 02C8: 56 28 17 2F 03
  329. 02CD: 18 2F F3 2F 01
  330. 02D2: F4 2F FB 2F 00
  331. 02D7: 00 30 6A 35 03
  332. 02DC: 6B 35 57 3A 03
  333. 02E1: 58 3A 68 3E 03
  334. 02E6: 69 3E 7C 3F 01
  335. 02EB: 7D 3F E4 3F 00
  336. 02F0: E5 3F FC 3F 00
  337. 02F5: 00 40 41 42 03
  338. 02FA: 42 42 83 44 03
  339. 02FF: 84 44 35 46 03
  340. 0304: 36 46 E9 46 01
  341. 0309: EA 46 9D 47 01
  342. 030E: 9E 47 31 48 01
  343. 0313: 32 48 C2 48 03
  344. 0318: C3 48 4A 49 01
  345. 031D: 4B 49 82 49 00
  346. 0322: 83 49 B7 49 00
  347. 0327: B8 49 D3 49 00
  348. 032C: D4 49 EF 49 00
  349. 0331: F0 49 03 4A 00
  350. 0336: 04 4A 13 4A 00
  351. ;last sample end addr=4a1300
Advertisement
Add Comment
Please, Sign In to add comment