Advertisement
Guest User

Untitled

a guest
Aug 18th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.23 KB | None | 0 0
  1. ========================================
  2. BEGIN_TBF_COMMS
  3. 0x479F ROM BANK 0x1C
  4.  
  5. Seems to start the whole process of
  6. communicating with the Turbo File
  7. ========================================
  8.  
  9. 0x479f :: LD HL, 0x4813
  10. 0x47a2 :: LD DE, 0xD001
  11. 0x47a5 :: LD B, 0x02
  12. 0x47a7 :: CALL COPY_TO_D001 //CALL 0x4DDC
  13.  
  14. 0x47aa :: LD HL, 0xD001
  15. 0x47ad :: LD B, 0x02
  16. 0x47af :: CALL D001_CHECKSUM //CALL 0x4CBB
  17.  
  18. 0x47b2 :: LD (0xD003), A
  19. 0x47b5 :: LD B, 0x03
  20. 0x47b7 :: LD HL, 0xD001
  21. 0x47ba :: DI
  22. 0x47bb :: CALL TURBO_HANDSHAKE //CALL 0x4BCA
  23.  
  24. 0x47be :: OR A //Check results of TURBO_HANDSHAKE. 0 for success, 1 for failure
  25. 0x47bf :: JR NZ, 0x4D
  26.  
  27. 0x47c1 :: LD HL, 0xD001
  28. 0x47c4 :: LD B, 0x0A
  29. 0x47c6 :: CALL AUX_TURBO_HANSHAKE //CALL 0x4C22
  30.  
  31. 0x47c9 :: EI //SIO IRQ enabled now?
  32. 0x47ca :: OR A //Check results of AUX_TURBO_HANDSHAKE. 0 for success, 1 for failure
  33. 0x47cb :: JR NZ, 0x42
  34.  
  35. 0x47cd :: LD B, 0x0A
  36. 0x47cf :: LD HL, 0xD001
  37. 0x47d2 :: LD DE, 0x4815
  38. 0x47d5 :: CALL CHECK_HEADER //CALL 0x4B88
  39.  
  40. 0x47d8 :: OR A
  41. 0x47d9 :: JR NZ, 0x34
  42.  
  43. 0x47db :: LD A, (0xD005)
  44. 0x47de :: LD (0xD141), A
  45. 0x47e1 :: SRL A
  46. 0x47e3 :: SRL A
  47. 0x47e5 :: AND 0x01
  48. 0x47e7 :: LD (0xD13D), A
  49. 0x47ea :: XOR A
  50. 0x47eb :: LD (0xD13C), A
  51. 0x47ee :: LD A, (0xD005)
  52. 0x47f1 :: AND 0x03
  53. 0x47f3 :: JR Z, 0x15
  54.  
  55. 0x47f5 :: CP 0x03
  56. 0x47f7 :: JR Z, 0x11
  57.  
  58. 0x47f9 :: LD A, (0xD006)
  59. 0x47fc :: LD (0xD13F), A
  60. 0x47ff :: LD A, (0xD007)
  61. 0x4802 :: LD (0xD140), A
  62. 0x4805 :: XOR A
  63. 0x4806 :: LD (0xD096), A
  64. 0x4809 :: RET
  65.  
  66.  
  67.  
  68. ========================================
  69. CHECK_HEADER
  70. 0x4B88 ROM BANK 0x1C
  71.  
  72. Seems to check the header returned from
  73. the Turbo file and do processing
  74. ========================================
  75.  
  76. 0x4b88 :: PUSH DE
  77. 0x4b89 :: PUSH HL
  78. 0x4b8a :: DEC B
  79. 0x4b8b :: PUSH BC
  80. 0x4b8c :: CALL D001_CHECKSUM //CALL 0x4CBB
  81.  
  82. 0x4b8f :: POP BC
  83. 0x4b90 :: LD E, B
  84. 0x4b91 :: LD D, 0x00 //D = 0x00, E = B
  85. 0x4b93 :: POP HL
  86. 0x4b94 :: PUSH HL
  87.  
  88. 0x4b95 :: ADD HL, DE //HL should be 0xD001, DE should be 0x0009
  89. 0x4b96 :: LD B, (HL)
  90. 0x4b97 :: CP B //Compares B to 0xD00A
  91. 0x4b98 :: JR NZ, HEADER_CHECK_FAILED //JR NZ, 0x19
  92.  
  93. 0x4b9a :: POP HL
  94. 0x4b9b :: POP DE
  95. 0x4b9c :: LD B, (HL)
  96. 0x4b9d :: LD A, (DE)
  97. 0x4b9e :: CP B //Compares B to 0xD001
  98. 0x4b9f :: JR NZ, 0x17
  99.  
  100. 0x4ba1 :: INC HL
  101. 0x4ba2 :: INC DE
  102. 0x4ba3 :: LD B, (HL)
  103. 0x4ba4 :: LD A, (DE)
  104. 0x4ba5 :: CP B //Compares B to 0xD002
  105. 0x4ba6 :: JR NZ, 0x13
  106.  
  107. 0x4ba8 :: INC HL
  108. 0x4ba9 :: LDI A, (HL)
  109. 0x4baa :: CP 0x00 //Compares 0xD003 to 0x00
  110. 0x4bac :: JR NZ, 0x10
  111.  
  112. 0x4bae :: LD A, (HL) //A = [0xD004]
  113. 0x4baf :: CALL FUNCTION_1 //CALL 0x4CC6
  114. 0x4bb2 :: RET
  115.  
  116. .HEADER_CHECK_FAILED
  117. 0x4bb3 :: POP HL
  118. 0x4bb4 :: POP DE
  119. 0x4bb5 :: LD A, 0x0E
  120. 0x4bb7 :: RET
  121.  
  122.  
  123.  
  124. ========================================
  125. TURBO_HANDSHAKE
  126. 0x4BCA ROM BANK 0x1C
  127.  
  128. Primary handshake with Turbo File
  129. ========================================
  130.  
  131. 0x4bca :: LD C, 0x02
  132. 0x4bcc :: LD DE, 0x00
  133.  
  134.  
  135. .WAIT_FOR_C6
  136. 0x4bcf :: DEC DE
  137. 0x4bd0 :: LD A, D
  138. 0x4bd1 :: OR E
  139. 0x4bd2 :: JR Z, 0x48
  140.  
  141. .CHECK_SC_LOOP_AUX
  142. 0x4bd4 :: LDH A, (0xFF02)
  143. 0x4bd5 :: AND 0x80
  144. 0x4bd7 :: CHECK_SC_LOOP_AUX //JR NZ, 0xF6
  145.  
  146. 0x4bd9 :: LD A, 0x6C //Setup SB and SC
  147. 0x4bdb :: LDH (0xFF01), A
  148. 0x4bdd :: XOR A
  149. 0x4bde :: LDH (0xFF02), A
  150. 0x4bdf :: LD A, 0x80
  151. 0x4be1 :: LDH (0xFF02), A
  152. 0x4be2 :: LD DE, 0x00
  153.  
  154. .CHECK_SC_LOOP_1
  155. 0x4be5 :: DEC DE //Setup DE as timeout counter
  156. 0x4be6 :: LD A, D
  157. 0x4be7 :: OR E
  158. 0x4be8 :: JR Z, 0x35
  159.  
  160. 0x4bea :: LDH A, (0xFF02)
  161. 0x4beb :: AND 0x80
  162. 0x4bed :: JR NZ, CHECK_SC_LOOP_1 //JR NZ, 0xF6
  163.  
  164. 0x4bef :: LDH A, (0xFF01) //Check SB if equal to 0xC6
  165. 0x4bf1 :: CP 0xC6
  166. 0x4bf3 :: JR NZ, WAIT_FOR_C6 //JR NZ, 0xDA
  167. 0x4bf5 :: LD DE, 0x00
  168.  
  169. .CHECK_SC_LOOP_2
  170. 0x4bf8 :: DEC DE
  171. 0x4bf9 :: LD A, D
  172. 0x4bfa :: OR E
  173. 0x4bfb :: JR Z, 0x1F
  174.  
  175. 0x4bfd :: LDH A, (0xFF02)
  176. 0x4bfe :: AND 0x80
  177. 0x4c00 :: JR NZ, CHECK_SC_LOOP_2 //JR NZ, 0xF6
  178.  
  179. 0x4c02 :: LDI A, (HL) //Should load 0x5A into A
  180. 0x4c03 :: LDH (0xFF01), A //Looks like zeroing out SC and SB
  181. 0x4c05 :: XOR A
  182. 0x4c06 :: LDH (0xFF02), A
  183.  
  184. 0x4c07 :: LD A, 0x80
  185. 0x4c09 :: LDH (0xFF02), A
  186. 0x4c0a :: LD DE, 0x00
  187.  
  188. .CHECK_SC_LOOP_3
  189. 0x4c0d :: DEC DE
  190. 0x4c0e :: LD A, D
  191. 0x4c0f :: OR E
  192. 0x4c10 :: JR Z, 0x0A
  193.  
  194. 0x4c12 :: LDH A, (0xFF02)
  195. 0x4c13 :: AND 0x80
  196. 0x4c15 :: CHECK_SC_LOOP_3 //JR NZ, 0xF6
  197.  
  198. 0x4c17 :: DEC B //B initially = 3. C initially = 2
  199. 0x4c18 :: JR NZ, CHECK_SC_LOOP_2 //JR NZ, 0xDE
  200.  
  201. 0x4c1a :: XOR A
  202. 0x4c1b :: RET
  203.  
  204.  
  205.  
  206. ========================================
  207. AUX_TURBO_HANDSHAKE
  208. 0x4C22 ROM BANK 0x1C
  209.  
  210. Secondary handshake with Turbo File
  211. Retrieves device header
  212. ========================================
  213.  
  214. 0x4c22 :: PUSH BC
  215. 0x4c23 :: LD C, 0x02
  216. 0x4c25 :: LD B, 0x05
  217. 0x4c27 :: LD DE, 0x00
  218.  
  219. .CHECK_SC_LOOP_4
  220. 0x4c2a :: DEC DE
  221. 0x4c2b :: LD A, D
  222. 0x4c2c :: OR E
  223. 0x4c2d :: JR NZ, DE_NOT_ZERO_1 //JR NZ, 0x03
  224.  
  225. .DE_NOT_ZERO_1
  226. 0x4c32 :: LDH A, (0xFF02)
  227. 0x4c33 :: AND 0x80
  228. 0x4c35 :: JR NZ CHECK_SC_LOOP_4 //JR NZ, 0xF3
  229.  
  230. 0x4c37 :: LD B, 0x08
  231. 0x4c39 :: LD DE, 0x00
  232.  
  233. .SEND_F1
  234. 0x4c3c :: LD A, 0xF1
  235. 0x4c3e :: LDH (0xFF01), A //SB = 0xF1
  236. 0x4c40 :: XOR A
  237. 0x4c41 :: LDH (0xFF02), A
  238. 0x4c42 :: LD A, 0x80
  239. 0x4c44 :: LDH (0xFF02), A
  240.  
  241. .CHECK_SC_LOOP_5
  242. 0x4c45 :: DEC DE
  243. 0x4c46 :: LD A, D
  244. 0x4c47 :: OR E
  245. 0x4c48 :: JR NZ, DE_NOT_ZERO_2 //JR NZ, 0x03
  246.  
  247. .DE_NOT_ZERO_2
  248. 0x4c4d :: LDH A, (0xFF02)
  249. 0x4c4e :: AND 0x80
  250. 0x4c50 :: JR NZ, CHECK_SC_LOOP_5 //JR NZ, 0xF3
  251.  
  252. 0x4c52 :: LDH A, (0xFF01)
  253. 0x4c54 :: CP 0xE7 //After sending 0xF1, Game Boy expects to receive 0xE7
  254. 0x4c56 :: JR NZ, SEND_F1 //JR NZ, 0xE4
  255.  
  256. 0x4c58 :: POP BC
  257. 0x4c59 :: LD DE, 0x00
  258.  
  259. .SEND_7E
  260. 0x4c5c :: LD A, 0x7E
  261. 0x4c5e :: LDH (0xFF01), A
  262. 0x4c60 :: XOR A
  263. 0x4c61 :: LDH (0xFF02), A
  264. 0x4c62 :: LD A, 0x80
  265. 0x4c64 :: LDH (0xFF02), A
  266.  
  267. .CHECK_SC_LOOP_6
  268. 0x4c65 :: DEC DE
  269. 0x4c66 :: LD A, D
  270. 0x4c67 :: OR E
  271. 0x4c68 :: JR Z, 0x45
  272.  
  273. 0x4c6a :: LDH A, (0xFF02)
  274. 0x4c6b :: AND 0x80
  275. 0x4c6d :: JR NZ CHECK_SC_LOOP_6 //JR NZ, 0xF6
  276.  
  277. 0x4c6f :: LDH A, (0xFF01)
  278. 0x4c71 :: CP 0xA5 //After sending 0x7E, Game Boy expects to receive 0xA5
  279. 0x4c73 :: JR NZ, SEND_7E //JR NZ, 0xE7
  280.  
  281. 0x4c75 :: LDI (HL), A //Should load 0xA5 into 0xD001
  282. 0x4c76 :: DEC B
  283. 0x4c77 :: LD DE, 0x00
  284.  
  285. .CHECK_SC_LOOP_7
  286. 0x4c7a :: DEC DE
  287. 0x4c7b :: LD A, D
  288. 0x4c7c :: OR E
  289. 0x4c7d :: JR Z, 0x33
  290.  
  291. 0x4c7f :: LDH A, (0xFF02)
  292. 0x4c80 :: AND 0x80
  293. 0x4c82 :: CHECK_SC_LOOP_7 //JR NZ, 0xF6
  294.  
  295. .SEND_F2
  296. 0x4c84 :: LD A, 0xF2
  297. 0x4c86 :: LDH (0xFF01), A
  298. 0x4c88 :: XOR A
  299. 0x4c89 :: LDH (0xFF02), A
  300. 0x4c8a :: LD A, 0x80
  301. 0x4c8c :: LDH (0xFF02), A
  302.  
  303. .CHECK_SC_LOOP_8
  304. 0x4c8d :: DEC DE
  305. 0x4c8e :: LD A, D
  306. 0x4c8f :: OR E
  307. 0x4c90 :: JR Z, 0x23
  308.  
  309. 0x4c92 :: LDH A, (0xFF02)
  310. 0x4c93 :: AND 0x80
  311. 0x4c95 :: CHECK_SC_LOOP_8 //JR NZ, 0xF6
  312.  
  313. 0x4c97 :: LDH A, (0xFF01) //Should load F2 response into 0xD002
  314. 0x4c99 :: LDI (HL), A //Keep loading responses into 0xD000+ for device header
  315. 0x4c9a :: DEC B
  316. 0x4c9b :: JR Z, B_EQ_ZERO //JR Z, 0x05
  317. 0x4c9d :: LD DE, 0x00
  318. 0x4ca0 :: JR CHECK_SC_LOOP_7 //JR 0xD8
  319.  
  320. .B_EQ_ZERO
  321. 0x4ca2 :: XOR A
  322. 0x4ca3 :: RET
  323.  
  324.  
  325.  
  326. ========================================
  327. D001_CHECKSUM
  328. 0x4CBB ROM BANK 0x1C
  329.  
  330. 8-bit sum of 0xD001 through 0xD009
  331. Checksum = (0x100 - (SUM + 0x45))
  332. ========================================
  333.  
  334. 0x4cbb :: LD C, 0x00
  335.  
  336. .REG_C_ADD_LOOP
  337. 0x4cbd :: LDI A, (HL) //Seems to be an 8-bit checksum on 0xD001+ values from AUX_TURBO_HANDSHAKE
  338. 0x4cbe :: ADD A, C
  339. 0x4cbf :: LD C, A
  340. 0x4cc0 :: DEC B
  341. 0x4cc1 :: JR NZ, REG_C_ADD_LOOP //JR NZ, 0xFA
  342.  
  343. 0x4cc3 :: XOR A
  344. 0x4cc4 :: SUB A, C
  345. 0x4cc5 :: RET
  346.  
  347.  
  348.  
  349. ========================================
  350. FUNCTION_1
  351. 0x4CC6
  352.  
  353. Appears to check the status of 0xD004
  354. Sets A as output
  355. ========================================
  356.  
  357. 0x4cc6 :: LD (0xD13E), A
  358. 0x4cc9 :: LD B, A
  359. 0x4cca :: AND 0x03
  360. 0x4ccc :: CP 0x01 //Checks to see if (0xD004 & 0x3) > 1
  361. 0x4cce :: JR NC, A_GT_01 //JR NC, 0x04
  362.  
  363. .A_GT_01
  364. 0x4cd4 :: BIT 6, B
  365. 0x4cd6 :: JR Z, NO_BIT_SIX //JR Z, 0x04
  366.  
  367. .NO_BIT_SIX
  368. 0x4cdc :: XOR A
  369. 0x4cdd :: RET
  370.  
  371.  
  372.  
  373. ========================================
  374. COPY_TO_D001
  375. 0x4DDC
  376.  
  377. Copies values into 0xD001+
  378. ========================================
  379.  
  380. 0x4ddc :: LDI A, (HL) //Loads value at address DE into address HL
  381. 0x4ddd :: LD (DE), A //When starting the TBF it pulls 3 values from ROM into 0xD001 - 0xD003
  382. 0x4dde :: INC DE
  383. 0x4ddf :: DEC B
  384. 0x4de0 :: JR COPY_TO_D001 //JR NZ, 0xFA
  385. 0x4de2 :: RET
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement