Advertisement
vladikcomper

The Adventures of Batman & Robin - Decompressor Routine

May 23rd, 2014
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ROM:0000A23E DecompressArt:                          ; CODE XREF: ROM:00007118p
  2. ROM:0000A23E                 movea.l a0,a2
  3. ROM:0000A240                 adda.l  (a0)+,a2        ; a2 = Dictionary
  4. ROM:0000A242                 bra.s   @ReloadBitField
  5. ROM:0000A244 ; ---------------------------------------------------------------------------
  6. ROM:0000A244
  7. ROM:0000A244 @UncompressedByte:                      ; CODE XREF: DecompressArt+14j
  8. ROM:0000A244                 move.b  (a2)+,(a1)+
  9. ROM:0000A246
  10. ROM:0000A246 @NextBit:                               ; CODE XREF: DecompressArt+CCj
  11. ROM:0000A246                                         ; DecompressArt+FAj ...
  12. ROM:0000A246                 dbf     d7,@LoadBit
  13. ROM:0000A24A
  14. ROM:0000A24A @ReloadBitField:                        ; CODE XREF: DecompressArt+4j
  15. ROM:0000A24A                 move.w  (a0)+,d1        ; reload desc field
  16. ROM:0000A24C                 swap    d1
  17. ROM:0000A24E                 moveq   #$F,d7          ; reload bits counter
  18. ROM:0000A250
  19. ROM:0000A250 @LoadBit:                               ; CODE XREF: DecompressArt:@NextBitj
  20. ROM:0000A250                 add.l   d1,d1           ; load bit from the desc field
  21. ROM:0000A252                 bcc.s   @UncompressedByte ; if bit is 0 (uncompressed byte), branch
  22. ROM:0000A254                 moveq   #1,d2           ; d2 = Base copy count
  23. ROM:0000A256                 dbf     d7,@DecodeFlag  ; if bits in desc. field remain, branch
  24. ROM:0000A25A                 move.w  (a0)+,d1        ; reload desc field
  25. ROM:0000A25C                 swap    d1
  26. ROM:0000A25E                 moveq   #$F,d7
  27. ROM:0000A260
  28. ROM:0000A260 @DecodeFlag:                            ; CODE XREF: DecompressArt+18j
  29. ROM:0000A260                 add.l   d1,d1           ; load bit from the desc field
  30. ROM:0000A262                 bcc.s   @Code10         ; if bit is 0 (code 10), branch
  31. ROM:0000A264                 moveq   #2,d6           ; d6 = Argument length (in bits)
  32. ROM:0000A266                 clr.w   d1              ; d1 = %aa-- ---- ---- ---- 0000 0000 0000 0000
  33. ROM:0000A268                 sub.w   d6,d7           ; mark that we've fetched 2 bits
  34. ROM:0000A26A                 bgt.s   loc_A27C        ; if bits counter remains, branch
  35. ROM:0000A26C                 add.w   d6,d7           ; otherwise, fetch missing bits from the next desc field
  36. ROM:0000A26E                 sub.w   d7,d6
  37. ROM:0000A270                 rol.l   d7,d1
  38. ROM:0000A272                 swap    d1
  39. ROM:0000A274                 move.w  (a0)+,d1
  40. ROM:0000A276                 swap    d1
  41. ROM:0000A278                 moveq   #$10,d7
  42. ROM:0000A27A                 sub.w   d6,d7
  43. ROM:0000A27C
  44. ROM:0000A27C loc_A27C:                               ; CODE XREF: DecompressArt+2Cj
  45. ROM:0000A27C                 rol.l   d6,d1           ; d1 = %---- ---- ---- --00 0000 0000 0000 00aa
  46. ROM:0000A27E                 tst.w   d1              ; test argument
  47. ROM:0000A280                 bne.s   @Code11_ArgNonZero ; if argument is not zero, branch
  48. ROM:0000A282                 moveq   #4,d2           ; d2 = Base copy count
  49. ROM:0000A284                 moveq   #4,d6           ; d6 = Argument length (in bits)
  50. ROM:0000A286                 clr.w   d1              ; d1 = %aaaa ---- ---- ---- 0000 0000 0000 0000
  51. ROM:0000A288                 sub.w   d6,d7           ; mark that we've fetched 4 bits
  52. ROM:0000A28A                 bgt.s   loc_A29C        ; if bits counter remains, branch
  53. ROM:0000A28C                 add.w   d6,d7           ; otherwise, fetch missing bits from the next desc field
  54. ROM:0000A28E                 sub.w   d7,d6
  55. ROM:0000A290                 rol.l   d7,d1
  56. ROM:0000A292                 swap    d1
  57. ROM:0000A294                 move.w  (a0)+,d1
  58. ROM:0000A296                 swap    d1
  59. ROM:0000A298                 moveq   #$10,d7
  60. ROM:0000A29A                 sub.w   d6,d7
  61. ROM:0000A29C
  62. ROM:0000A29C loc_A29C:                               ; CODE XREF: DecompressArt+4Cj
  63. ROM:0000A29C                 rol.l   d6,d1           ; d1 = %---- ---- ---- 0000 0000 0000 0000 aaaa
  64. ROM:0000A29E                 tst.w   d1              ; test argument
  65. ROM:0000A2A0                 bne.s   @Code11_ArgNonZero ; if it's not zero, branch
  66. ROM:0000A2A2                 moveq   #$13,d2         ; d2 = Base copy count
  67. ROM:0000A2A4                 moveq   #8,d6           ; d6 = Argument length (in bits)
  68. ROM:0000A2A6                 clr.w   d1              ; d1 = %aaaa aaaa ---- ---- 0000 0000 0000 0000
  69. ROM:0000A2A8                 sub.w   d6,d7           ; mark that we've fetched 8 bits
  70. ROM:0000A2AA                 bgt.s   loc_A2BC        ; if bits counter remains, branch
  71. ROM:0000A2AC                 add.w   d6,d7           ; otherwise, fetch missing bits from the next desc field
  72. ROM:0000A2AE                 sub.w   d7,d6
  73. ROM:0000A2B0                 rol.l   d7,d1
  74. ROM:0000A2B2                 swap    d1
  75. ROM:0000A2B4                 move.w  (a0)+,d1
  76. ROM:0000A2B6                 swap    d1
  77. ROM:0000A2B8                 moveq   #$10,d7
  78. ROM:0000A2BA                 sub.w   d6,d7
  79. ROM:0000A2BC
  80. ROM:0000A2BC loc_A2BC:                               ; CODE XREF: DecompressArt+6Cj
  81. ROM:0000A2BC                 rol.l   d6,d1           ; d1 = %---- ---- 0000 0000 0000 0000 aaaa aaaa
  82. ROM:0000A2BE                 tst.w   d1              ; test argument
  83. ROM:0000A2C0                 beq.w   @Quit           ; if it's zero, branch
  84. ROM:0000A2C4
  85. ROM:0000A2C4 @Code11_ArgNonZero:                     ; CODE XREF: DecompressArt+42j
  86. ROM:0000A2C4                                         ; DecompressArt+62j
  87. ROM:0000A2C4                 add.w   d1,d2
  88. ROM:0000A2C6
  89. ROM:0000A2C6 @Code10:                                ; CODE XREF: DecompressArt+24j
  90. ROM:0000A2C6                 moveq   #2,d6           ; d6 = Argument length
  91. ROM:0000A2C8                 clr.w   d1              ; d1 = %aa-- ---- ---- ---- 0000 0000 0000 0000
  92. ROM:0000A2CA                 sub.w   d6,d7           ; mark that we've fetched 2 bits
  93. ROM:0000A2CC                 bgt.s   loc_A2DE        ; if bits counter remains, branch
  94. ROM:0000A2CE                 add.w   d6,d7           ; otherwise, fetch missing bits from the next desc field
  95. ROM:0000A2D0                 sub.w   d7,d6
  96. ROM:0000A2D2                 rol.l   d7,d1
  97. ROM:0000A2D4                 swap    d1
  98. ROM:0000A2D6                 move.w  (a0)+,d1
  99. ROM:0000A2D8                 swap    d1
  100. ROM:0000A2DA                 moveq   #$10,d7
  101. ROM:0000A2DC                 sub.w   d6,d7
  102. ROM:0000A2DE
  103. ROM:0000A2DE loc_A2DE:                               ; CODE XREF: DecompressArt+8Ej
  104. ROM:0000A2DE                 rol.l   d6,d1           ; d1 = %---- ---- ---- --00 0000 0000 0000 00aa
  105. ROM:0000A2E0                 subq.w  #1,d1           ; subtract 1 from argument
  106. ROM:0000A2E2                 bcc.s   loc_A30E        ; if it wasn't zero, branch
  107. ROM:0000A2E4                 moveq   #5,d6           ; d6 = Argument length
  108. ROM:0000A2E6                 clr.w   d1
  109. ROM:0000A2E8                 sub.w   d6,d7
  110. ROM:0000A2EA                 bgt.s   loc_A2FC
  111. ROM:0000A2EC                 add.w   d6,d7
  112. ROM:0000A2EE                 sub.w   d7,d6
  113. ROM:0000A2F0                 rol.l   d7,d1
  114. ROM:0000A2F2                 swap    d1
  115. ROM:0000A2F4                 move.w  (a0)+,d1
  116. ROM:0000A2F6                 swap    d1
  117. ROM:0000A2F8                 moveq   #$10,d7
  118. ROM:0000A2FA                 sub.w   d6,d7
  119. ROM:0000A2FC
  120. ROM:0000A2FC loc_A2FC:                               ; CODE XREF: DecompressArt+ACj
  121. ROM:0000A2FC                 rol.l   d6,d1
  122. ROM:0000A2FE                 addq.w  #1,d1
  123. ROM:0000A300                 movea.l a1,a3
  124. ROM:0000A302                 suba.w  d1,a3
  125. ROM:0000A304
  126. ROM:0000A304 loc_A304:                               ; CODE XREF: DecompressArt+C8j
  127. ROM:0000A304                 move.b  (a3)+,(a1)+
  128. ROM:0000A306                 dbf     d2,loc_A304
  129. ROM:0000A30A                 bra.w   @NextBit
  130. ROM:0000A30E ; ---------------------------------------------------------------------------
  131. ROM:0000A30E
  132. ROM:0000A30E loc_A30E:                               ; CODE XREF: DecompressArt+A4j
  133. ROM:0000A30E                 bne.s   loc_A33C        ; if argument wasn't 1, branch
  134. ROM:0000A310                 moveq   #7,d6
  135. ROM:0000A312                 clr.w   d1
  136. ROM:0000A314                 sub.w   d6,d7
  137. ROM:0000A316                 bgt.s   loc_A328
  138. ROM:0000A318                 add.w   d6,d7
  139. ROM:0000A31A                 sub.w   d7,d6
  140. ROM:0000A31C                 rol.l   d7,d1
  141. ROM:0000A31E                 swap    d1
  142. ROM:0000A320                 move.w  (a0)+,d1
  143. ROM:0000A322                 swap    d1
  144. ROM:0000A324                 moveq   #$10,d7
  145. ROM:0000A326                 sub.w   d6,d7
  146. ROM:0000A328
  147. ROM:0000A328 loc_A328:                               ; CODE XREF: DecompressArt+D8j
  148. ROM:0000A328                 rol.l   d6,d1
  149. ROM:0000A32A                 addi.w  #$21,d1
  150. ROM:0000A32E                 movea.l a1,a3
  151. ROM:0000A330                 suba.w  d1,a3
  152. ROM:0000A332
  153. ROM:0000A332 loc_A332:                               ; CODE XREF: DecompressArt+F6j
  154. ROM:0000A332                 move.b  (a3)+,(a1)+
  155. ROM:0000A334                 dbf     d2,loc_A332
  156. ROM:0000A338                 bra.w   @NextBit
  157. ROM:0000A33C ; ---------------------------------------------------------------------------
  158. ROM:0000A33C
  159. ROM:0000A33C loc_A33C:                               ; CODE XREF: DecompressArt:loc_A30Ej
  160. ROM:0000A33C                 subq.w  #1,d1           ; if argument wasn't 2, branch
  161. ROM:0000A33E                 bne.s   loc_A36C
  162. ROM:0000A340                 moveq   #9,d6
  163. ROM:0000A342                 clr.w   d1
  164. ROM:0000A344                 sub.w   d6,d7
  165. ROM:0000A346                 bgt.s   loc_A358
  166. ROM:0000A348                 add.w   d6,d7
  167. ROM:0000A34A                 sub.w   d7,d6
  168. ROM:0000A34C                 rol.l   d7,d1
  169. ROM:0000A34E                 swap    d1
  170. ROM:0000A350                 move.w  (a0)+,d1
  171. ROM:0000A352                 swap    d1
  172. ROM:0000A354                 moveq   #$10,d7
  173. ROM:0000A356                 sub.w   d6,d7
  174. ROM:0000A358
  175. ROM:0000A358 loc_A358:                               ; CODE XREF: DecompressArt+108j
  176. ROM:0000A358                 rol.l   d6,d1
  177. ROM:0000A35A                 addi.w  #$A1,d1
  178. ROM:0000A35E                 movea.l a1,a3
  179. ROM:0000A360                 suba.w  d1,a3
  180. ROM:0000A362
  181. ROM:0000A362 loc_A362:                               ; CODE XREF: DecompressArt+126j
  182. ROM:0000A362                 move.b  (a3)+,(a1)+
  183. ROM:0000A364                 dbf     d2,loc_A362
  184. ROM:0000A368                 bra.w   @NextBit
  185. ROM:0000A36C ; ---------------------------------------------------------------------------
  186. ROM:0000A36C
  187. ROM:0000A36C loc_A36C:                               ; CODE XREF: DecompressArt+100j
  188. ROM:0000A36C                 moveq   #$A,d6
  189. ROM:0000A36E                 clr.w   d1
  190. ROM:0000A370                 sub.w   d6,d7
  191. ROM:0000A372                 bgt.s   loc_A384
  192. ROM:0000A374                 add.w   d6,d7
  193. ROM:0000A376                 sub.w   d7,d6
  194. ROM:0000A378                 rol.l   d7,d1
  195. ROM:0000A37A                 swap    d1
  196. ROM:0000A37C                 move.w  (a0)+,d1
  197. ROM:0000A37E                 swap    d1
  198. ROM:0000A380                 moveq   #$10,d7
  199. ROM:0000A382                 sub.w   d6,d7
  200. ROM:0000A384
  201. ROM:0000A384 loc_A384:                               ; CODE XREF: DecompressArt+134j
  202. ROM:0000A384                 rol.l   d6,d1
  203. ROM:0000A386                 addi.w  #$2A1,d1
  204. ROM:0000A38A                 movea.l a1,a3
  205. ROM:0000A38C                 suba.w  d1,a3
  206. ROM:0000A38E
  207. ROM:0000A38E loc_A38E:                               ; CODE XREF: DecompressArt+152j
  208. ROM:0000A38E                 move.b  (a3)+,(a1)+
  209. ROM:0000A390                 dbf     d2,loc_A38E
  210. ROM:0000A394                 bra.w   @NextBit
  211. ROM:0000A398 ; ---------------------------------------------------------------------------
  212. ROM:0000A398
  213. ROM:0000A398 @Quit:                                  ; CODE XREF: DecompressArt+82j
  214. ROM:0000A398                 move.l  a1,(unk_FFFFE08E).w
  215. ROM:0000A39C                 ori     #$700,sr
  216. ROM:0000A3A0                 clr.b   (unk_FFFFF4BC).w
  217. ROM:0000A3A4                 clr.b   (unk_FFFFF4BD).w
  218. ROM:0000A3A8                 andi    #$F8FF,sr
  219. ROM:0000A3AC                 rts
  220. ROM:0000A3AC ; End of function DecompressArt
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement