dsp_base_noirq.inc 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. ; This is the trojan program we send to the DSP from DSPSpy to figure it out.
  2. REGS_BASE: equ 0x0f80
  3. MEM_HI: equ 0x0f7E
  4. MEM_LO: equ 0x0f7F
  5. WARNPC 0x10
  6. ORG 0x10
  7. ; Main code (and normal entrypoint) at 0x10
  8. ; It is expected that IRQs were listed beforehand
  9. ; (e.g. by including dsp_base.inc instead of dsp_base_noirq.inc)
  10. sbset #0x02
  11. sbset #0x03
  12. sbclr #0x04
  13. sbset #0x05
  14. sbset #0x06
  15. s16
  16. lri $CR, #0x00ff
  17. clr $acc1
  18. clr $acc0
  19. ; get address of memory dump and copy it to DRAM
  20. call 0x807e
  21. si @DMBH, #0x8888
  22. si @DMBL, #0xdead
  23. si @DIRQ, #0x0001
  24. call 0x8078
  25. andi $ac0.m, #0x7fff
  26. lrs $ac1.m, @CMBL
  27. sr @MEM_HI, $ac0.m
  28. sr @MEM_LO, $ac1.m
  29. lri $ax0.l, #0
  30. lri $ax1.l, #0 ;(DSP_CR_IMEM | DSP_CR_TO_CPU)
  31. lri $ax0.h, #0x2000
  32. lr $ac0.l, @MEM_HI
  33. lr $ac0.m, @MEM_LO
  34. call do_dma
  35. ; get address of registers and DMA them to ram
  36. call 0x807e
  37. si @DMBH, #0x8888
  38. si @DMBL, #0xbeef
  39. si @DIRQ, #0x0001
  40. call 0x8078
  41. andi $ac0.m, #0x7fff
  42. lrs $ac1.m, @CMBL
  43. sr @MEM_HI, $ac0.m
  44. sr @MEM_LO, $ac1.m
  45. lri $ax0.l, #REGS_BASE
  46. lri $ax1.l, #0 ;(DSP_CR_IMEM | DSP_CR_TO_CPU)
  47. lri $ax0.h, #0x80
  48. lr $ac0.l, @MEM_HI
  49. lr $ac0.m, @MEM_LO
  50. call do_dma
  51. ; Read in all the registers from RAM
  52. lri $ar0, #REGS_BASE+1
  53. lrri $ar1, @$ar0
  54. lrri $ar2, @$ar0
  55. lrri $ar3, @$ar0
  56. lrri $ix0, @$ar0
  57. lrri $ix1, @$ar0
  58. lrri $ix2, @$ar0
  59. lrri $ix3, @$ar0
  60. lrri $wr0, @$ar0
  61. lrri $wr1, @$ar0
  62. lrri $wr2, @$ar0
  63. lrri $wr3, @$ar0
  64. lrri $st0, @$ar0
  65. lrri $st1, @$ar0
  66. lrri $st2, @$ar0
  67. lrri $st3, @$ar0
  68. lrri $ac0.h, @$ar0
  69. lrri $ac1.h, @$ar0
  70. lrri $cr, @$ar0
  71. lrri $sr, @$ar0
  72. lrri $prod.l, @$ar0
  73. lrri $prod.m1, @$ar0
  74. lrri $prod.h, @$ar0
  75. lrri $prod.m2, @$ar0
  76. lrri $ax0.l, @$ar0
  77. lrri $ax1.l, @$ar0
  78. lrri $ax0.h, @$ar0
  79. lrri $ax1.h, @$ar0
  80. lrri $ac0.l, @$ar0
  81. lrri $ac1.l, @$ar0
  82. lrri $ac0.m, @$ar0
  83. lrri $ac1.m, @$ar0
  84. lr $ar0, @REGS_BASE
  85. jmp test_main
  86. ; This is where we jump when we're done testing, see above.
  87. ; We just fall into a loop, playing dead until someone resets the DSP.
  88. end_of_test:
  89. nop
  90. jmp end_of_test
  91. ; Utility function to do DMA.
  92. do_dma:
  93. sr @DSMAH, $ac0.l
  94. sr @DSMAL, $ac0.m
  95. sr @DSPA, $ax0.l
  96. sr @DSCR, $ax1.l
  97. sr @DSBL, $ax0.h ; This kicks off the DMA.
  98. wait_dma_finish:
  99. lr $ac1.m, @DSCR
  100. andcf $ac1.m, #0x4
  101. jlz wait_dma_finish
  102. ret
  103. ; IRQ handlers. Just send back exception# and die
  104. irq0:
  105. lri $ac0.m, #0x0000
  106. jmp irq
  107. irq1:
  108. lri $ac0.m, #0x0001
  109. jmp irq
  110. irq2:
  111. lri $ac0.m, #0x0002
  112. jmp irq
  113. irq3:
  114. lri $ac0.m, #0x0003
  115. jmp irq
  116. irq4:
  117. lri $ac0.m, #0x0004
  118. jmp irq
  119. irq5:
  120. lrs $ac0.m, @DMBH
  121. andcf $ac0.m, #0x8000
  122. jlz irq5
  123. si @DMBH, #0x8005
  124. si @DMBL, #0x0000
  125. si @DIRQ, #0x0001
  126. lri $ac0.m, #0xbbbb
  127. sr @0xffda, $ac0.m ; pred scale
  128. sr @0xffdb, $ac0.m ; yn1
  129. lr $ix2, @ARAM
  130. sr @0xffdc, $ac0.m ; yn2
  131. rti
  132. irq6:
  133. lri $ac0.m, #0x0006
  134. jmp irq
  135. irq7:
  136. lri $ac0.m, #0x0007
  137. irq:
  138. lrs $ac1.m, @DMBH
  139. andcf $ac1.m, #0x8000
  140. jlz irq
  141. si @DMBH, #0x8bad
  142. ;sr @DMBL, $wr3 ; ???
  143. sr @DMBL, $ac0.m ; Exception number
  144. si @DIRQ, #0x0001
  145. halt ; Through some magic this allows us to properly ack the exception in dspspy
  146. ;rti ; allow dumping of ucodes which cause exceptions...probably not safe at all
  147. ; DMA:s the current state of the registers back to the PowerPC. To do this,
  148. ; it must write the contents of all regs to DRAM.
  149. send_back:
  150. ; first, store $sr so we can modify it
  151. sr @(REGS_BASE + 19), $sr
  152. set16
  153. ; Now store $wr0, as it must be 0xffff for srri to work as we expect
  154. sr @(REGS_BASE + 8), $wr0
  155. lri $wr0, #0xffff
  156. ; store registers to reg table
  157. sr @REGS_BASE, $ar0
  158. lri $ar0, #(REGS_BASE + 1)
  159. srri @$ar0, $ar1
  160. srri @$ar0, $ar2
  161. srri @$ar0, $ar3
  162. srri @$ar0, $ix0
  163. srri @$ar0, $ix1
  164. srri @$ar0, $ix2
  165. srri @$ar0, $ix3
  166. ; skip $wr0 since we already stored and modified it
  167. iar $ar0
  168. srri @$ar0, $wr1
  169. srri @$ar0, $wr2
  170. srri @$ar0, $wr3
  171. srri @$ar0, $st0
  172. srri @$ar0, $st1
  173. srri @$ar0, $st2
  174. srri @$ar0, $st3
  175. srri @$ar0, $ac0.h
  176. srri @$ar0, $ac1.h
  177. srri @$ar0, $cr
  178. ; skip $sr since we already stored and modified it
  179. iar $ar0
  180. srri @$ar0, $prod.l
  181. srri @$ar0, $prod.m1
  182. srri @$ar0, $prod.h
  183. srri @$ar0, $prod.m2
  184. srri @$ar0, $ax0.l
  185. srri @$ar0, $ax1.l
  186. srri @$ar0, $ax0.h
  187. srri @$ar0, $ax1.h
  188. srri @$ar0, $ac0.l
  189. srri @$ar0, $ac1.l
  190. srri @$ar0, $ac0.m
  191. srri @$ar0, $ac1.m
  192. ; Regs are stored. Prepare DMA.
  193. ; $cr must be 0x00ff because the ROM uses lrs and srs with the assumption that
  194. ; they will modify hardware registers.
  195. lri $cr, #0x00ff
  196. lri $ax0.l, #0x0000
  197. lri $ax1.l, #1 ;(DSP_CR_IMEM | DSP_CR_TO_CPU)
  198. lri $ax0.h, #0x200
  199. lr $ac0.l, @MEM_HI
  200. lr $ac0.m, @MEM_LO
  201. ; Now, why are we looping here?
  202. lri $ar1, #8+8
  203. bloop $ar1, dma_copy
  204. call do_dma
  205. addi $ac0.m, #0x200
  206. mrr $ac1.m, $ax0.l
  207. addi $ac1.m, #0x100
  208. dma_copy:
  209. mrr $ax0.l, $ac1.m
  210. ; Wait for the CPU to send us a mail.
  211. call 0x807e
  212. si @DMBH, #0x8888
  213. si @DMBL, #0xfeeb
  214. si @DIRQ, #0x0001
  215. ; wait for the CPU to recieve our response before we execute the next op
  216. call 0x8078
  217. andi $ac0.m, #0x7fff
  218. lrs $ac1.m, @CMBL
  219. ; Restore all regs again so we're ready to execute another op.
  220. lri $ar0, #REGS_BASE+1
  221. lrri $ar1, @$ar0
  222. lrri $ar2, @$ar0
  223. lrri $ar3, @$ar0
  224. lrri $ix0, @$ar0
  225. lrri $ix1, @$ar0
  226. lrri $ix2, @$ar0
  227. lrri $ix3, @$ar0
  228. ; leave $wr for later
  229. iar $ar0
  230. lrri $wr1, @$ar0
  231. lrri $wr2, @$ar0
  232. lrri $wr3, @$ar0
  233. lrri $st0, @$ar0
  234. lrri $st1, @$ar0
  235. lrri $st2, @$ar0
  236. lrri $st3, @$ar0
  237. lrri $ac0.h, @$ar0
  238. lrri $ac1.h, @$ar0
  239. lrri $cr, @$ar0
  240. ; leave $sr for later
  241. iar $ar0
  242. lrri $prod.l, @$ar0
  243. lrri $prod.m1, @$ar0
  244. lrri $prod.h, @$ar0
  245. lrri $prod.m2, @$ar0
  246. lrri $ax0.l, @$ar0
  247. lrri $ax1.l, @$ar0
  248. lrri $ax0.h, @$ar0
  249. lrri $ax1.h, @$ar0
  250. lrri $ac0.l, @$ar0
  251. lrri $ac1.l, @$ar0
  252. lrri $ac0.m, @$ar0
  253. lrri $ac1.m, @$ar0
  254. lr $ar0, @REGS_BASE
  255. lr $wr0, @(REGS_BASE+8)
  256. lr $sr, @(REGS_BASE+19)
  257. ret ; from send_back