Guest User

Custom Object Clipping

a guest
Apr 7th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.12 KB | None | 0 0
  1. ;~@sa1 <-- DO NOT REMOVE THIS LINE!
  2. header
  3. lorom
  4.  
  5. !Freespace = $13C000
  6. !ramaddress = $C2
  7. !ramaddress2 = $0DD7
  8. !ramaddress3 = $0DD9
  9.  
  10. org $019140
  11. JML Main
  12. NOP #2
  13.  
  14. org $019457
  15. JSL YOffset
  16.  
  17. org $01946E
  18. JSL XOffset
  19.  
  20. org $0194C1
  21. JSL YOffset
  22.  
  23. org $0194DF
  24. JSL XOffset
  25.  
  26. org $01936A
  27. JSL Slope
  28. NOP
  29.  
  30. org $01940A
  31. JSL Customfix
  32.  
  33.  
  34. org !Freespace
  35.  
  36. YOffset:
  37. PHB
  38. PHK
  39. PLB ;use current bank
  40.  
  41. PHX
  42. PHA ;push A (sprite position) and X (sprite index)
  43. LDA $75D0,x
  44. AND #$0F
  45. CMP #$0F ;$0F = custom object clipping
  46. BEQ CustomY
  47. PLA
  48. TYX ;pull A and use original index to object clipping table...
  49. CLC
  50. ADC $0190F7,x ;...to load original values
  51. PLX
  52. PLB ;back to previous bank
  53. RTL
  54.  
  55. XOffset:
  56. PHB
  57. PHK
  58. PLB ;use current bank
  59.  
  60. PHX
  61. PHA ;push A (sprite position) and X (sprite index)
  62. LDA $75D0,x
  63. AND #$0F
  64. CMP #$0F ;$0F = custom object clipping
  65. BEQ CustomX
  66. PLA
  67. TYX ;pull A and use original index to object clipping table (Y)...
  68. CLC
  69. ADC $0190BA,x ;...to load original values
  70. PLX
  71. PLB ;back to previous bank
  72. RTL
  73.  
  74. CustomY:
  75. LDA !ramaddress,x
  76. ASL
  77. CLC
  78. ADC !ramaddress,x
  79. ASL ; *6
  80. TAY ;use custom index
  81. LDA $B6,x
  82. BPL sprtgoesrightthere
  83. INY
  84. INY
  85. INY
  86. sprtgoesrightthere:
  87. LDA $0F
  88. CMP #$02
  89. BCC horzsoreturn
  90. INY
  91. LDA $9E,x
  92. BPL sprtgoesdownthere
  93. INY
  94. sprtgoesdownthere:
  95. horzsoreturn:
  96.  
  97. LDA #$00
  98. LDX !ramaddress2 ;save width value
  99. PHY
  100. LDY $0F
  101. CPY #$02
  102. BCS nothorz ;if it is horinzontal clipping, add width
  103. TXA
  104. nothorz:
  105. PLY
  106. CLC
  107. ADC YTable,y ;add custom Y offset
  108. BMI substractY
  109. STA !ramaddress2 ;use width as a freeram for addition
  110. PLA ;pull sprite position
  111. CLC
  112. ADC !ramaddress2 ;add offsets
  113.  
  114. STX !ramaddress2 ;restore width value
  115. PLX ;restore sprite index
  116.  
  117. PLB ;back to previous bank
  118. RTL
  119.  
  120. substractY:
  121. EOR #$FF
  122. INC ;two's complement
  123. STA !ramaddress2 ;use width as a freeram for addition
  124. LDA $04,s
  125. CLC
  126. ADC #$0B
  127. STA $04,s ;modify return address
  128.  
  129. PLA
  130. SEC
  131. SBC !ramaddress2
  132.  
  133. STX !ramaddress2 ;restore height value
  134. PLX ;restore sprite index
  135.  
  136. STA $0C
  137. AND.b #$F0
  138. STA $00
  139. LDA $3258,x
  140. SBC #$00 ;hijacked restore/modify
  141.  
  142. PLB
  143. RTL
  144.  
  145.  
  146.  
  147. CustomX:
  148. LDA #$00 ;see above for this part
  149. LDX !ramaddress3
  150. PHY
  151. LDY $0F
  152. CPY #$02
  153. BCC notvert
  154. TXA
  155. notvert:
  156. PLY
  157. CLC
  158. ADC XTable,y
  159. BMI substractX
  160. STA !ramaddress3
  161. PLA ;pull sprite position
  162. CLC
  163. ADC !ramaddress3 ;add offsets
  164.  
  165. STX !ramaddress3 ;restore height value
  166. PLX ;restore sprite index
  167.  
  168. PLB
  169. RTL
  170.  
  171. substractX:
  172. EOR #$FF
  173. INC
  174. STA !ramaddress3
  175. LDA $04,s
  176. CLC
  177. ADC #$09
  178. STA $04,s
  179.  
  180. PLA
  181. SEC
  182. SBC !ramaddress3
  183.  
  184. STX !ramaddress3 ;restore height value
  185. PLX ;restore sprite index
  186.  
  187. STA $0A
  188. STA $01
  189. LDA $326E,x
  190. SBC #$00
  191.  
  192. PLB
  193. RTL
  194.  
  195. Slope:
  196. PHA
  197. LDA $7520,x
  198. BNE donotwriteslope ; if sprite was already marked as "on slope", don't overwrite it
  199. PLA
  200. STA $7520,x
  201. CMP #$04
  202. RTL
  203. donotwriteslope:
  204. PLA
  205. CMP #$04
  206. RTL
  207.  
  208. Customfix:
  209. PHY
  210. PHX
  211. LDA $75D0,x
  212. AND #$0F
  213. CMP #$0F ;$0F = custom object clipping
  214. BEQ Offsetfix
  215. PLX
  216. PLY
  217. LDA $3216,x
  218. AND.b #$F0
  219. RTL
  220.  
  221. Offsetfix:
  222.  
  223. LDA !ramaddress,x
  224. ASL
  225. CLC
  226. ADC !ramaddress,x
  227. ASL
  228. TAY
  229. LDA $B6,x
  230. BPL sprtgoesrightherehere
  231. INY
  232. INY
  233. INY
  234. sprtgoesrightherehere:
  235. INY
  236.  
  237. LDA $3216,x
  238. PHA
  239. LDA $04,s
  240. CLC
  241. ADC #$04
  242. STA $04,s ; modify return address
  243. LDX !ramaddress2 ; use freeram
  244.  
  245. PHB
  246. PHK
  247. PLB ;use current bank
  248. LDA YTable,y
  249. AND #$0F
  250. STA !ramaddress2
  251. BEQ dontmodify
  252. LDA #$10
  253. SEC
  254. SBC !ramaddress2
  255. STA !ramaddress2
  256. dontmodify:
  257. PLB
  258.  
  259. PLA
  260. SEC
  261. SBC !ramaddress2
  262. AND #$F0
  263. CLC
  264. ADC !ramaddress2
  265. CLC
  266. ADC $7694
  267.  
  268. STX !ramaddress2
  269. PLX
  270.  
  271. CMP #$D0
  272. BCC dontclearhigh
  273. STZ $3258,x
  274. dontclearhigh:
  275.  
  276. PLY
  277. RTL
  278.  
  279.  
  280.  
  281. Main:
  282. LDA $75D0,x
  283. AND #$0F
  284. CMP #$0F
  285. BEQ Customobjectclip ; 0F = custom object clipping
  286. STZ $7694
  287. STZ $334A,x
  288. JML $019146 ; restore and return
  289.  
  290.  
  291. Customobjectclip:
  292.  
  293. PHY
  294. STZ $7520,x
  295. STZ $334A,x
  296.  
  297. PHB
  298. PHK
  299. PLB
  300. LDA !ramaddress,x
  301. ASL
  302. CLC
  303. ADC !ramaddress,x
  304. ASL
  305. TAY
  306. LDA $B6,x
  307. BPL sprtgoesright
  308. INY
  309. INY
  310. INY
  311. sprtgoesright:
  312. LDA widthheight,y
  313. STA !ramaddress2
  314. INY
  315. LDA $9E,x
  316. BPL sprtgoesdown
  317. INY
  318. sprtgoesdown:
  319. LDA widthheight,y
  320. STA !ramaddress3
  321. PLB
  322.  
  323. loop:
  324.  
  325. STZ $7694
  326. STZ $785E
  327. LDA $75BA,x
  328. STA $7695
  329. STZ $75BA,x
  330.  
  331. PHK ;push return bank
  332. PER ReturnAddress-1 ;push return address minus 1
  333. PHB ;push data bank
  334. LDA #$01 ;bank 01
  335. PHA ;push A on the stack
  336. PLB ;new data bank (bank 01)
  337. PEA $913D ;push return address minus 1, containing PLB + RTL
  338. JML $019155 ;long jump to local routine ending with RTS
  339. ReturnAddress: ;Return here
  340.  
  341.  
  342.  
  343. LDA !ramaddress2
  344. ORA !ramaddress3
  345. BEQ exitloop
  346. LDA !ramaddress2
  347. BPL substractheight
  348. CLC
  349. ADC #$10
  350. BCS Xoutbound
  351. readytogoY:
  352. STA !ramaddress2
  353. BRA goY
  354.  
  355. substractheight:
  356. SEC
  357. SBC #$10
  358. BCS readytogoY
  359. Xoutbound:
  360. STZ !ramaddress2
  361. goY:
  362.  
  363. LDA !ramaddress3
  364. BPL substractwidth
  365. CLC
  366. ADC #$10
  367. BCS Youtbound
  368. readytogoloop:
  369. STA !ramaddress3
  370. BRA goloop
  371.  
  372. substractwidth:
  373. SEC
  374. SBC #$10
  375. BCS readytogoloop
  376. Youtbound:
  377. STZ !ramaddress3
  378. goloop:
  379.  
  380. BRA loop
  381.  
  382. exitloop:
  383. PLY
  384. JML $01920B ;back
  385.  
  386.  
  387. ;Format: R,DR,UR,L,DL,UL
  388.  
  389. widthheight:
  390. db $2E,$10,$27,$2E,$F0,$D9 ;custom object clipping index (to store at !ramaddress): 0
  391.  
  392.  
  393. YTable:
  394. db $FC,$38,$F8,$FC,$38,$F8 ;0
  395.  
  396.  
  397. XTable:
  398. db $2E,$08,$08,$F2,$18,$18 ;0
Add Comment
Please, Sign In to add comment