Advertisement
Romano338

Thwomp mad

Jul 30th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.04 KB | None | 0 0
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;; Mad Thwomp, by yoshicookiezeus
  3. ;; Based on mikeyk's Thwomp disassembly and smwedit's Reverse Thwomp
  4. ;;
  5. ;; Description: A Thwomp that, when triggered, keeps smashing up and down.
  6. ;;
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8.  
  9. ; symbolic names for RAM addresses (don't change these)
  10. !SPRITE_Y_SPEED = $AA
  11. !SPRITE_X_SPEED = $B6
  12. !SPRITE_STATE = $C2
  13. !SPRITE_Y_POS = $D8
  14. !ORIG_Y_POS = $151C
  15. !EXPRESSION = $1528
  16. !FREEZE_TIMER = $1540
  17. !SPR_OBJ_STATUS = $1588
  18. !H_OFFSCREEN = $15A0
  19. !V_OFFSCREEN = $186C
  20.  
  21. ; definitions of bits (don't change these)
  22. !IS_ON_GROUND = $04
  23. !IS_ON_CEILING = $08
  24.  
  25. ; sprite data
  26. !SPRITE_GRAVITY = $08
  27. !MAX_Y_SPEED1 = $4E
  28. !MAX_Y_SPEED2 = $C2
  29. !RISE_SPEED = $FF
  30. !TIME_TO_SHAKE = $00
  31. !SOUND_EFFECT = $09
  32. !TIME_ON_GROUND = $0C
  33. !ANGRY_TILE = $CA
  34.  
  35. X_OFFSET: db $FC,$04,$FC,$04,$00
  36. Y_OFFSET: db $00,$00,$10,$10,$08
  37. TILE_MAP: db $8E,$8E,$AE,$AE,$C8
  38. PROPERTIES: db $03,$43,$03,$43,$03
  39.  
  40. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  41. ; sprite init JSL
  42. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  43.  
  44. PRINT "INIT ",pc
  45. LDA !SPRITE_Y_POS,x
  46. STA !ORIG_Y_POS,x
  47. LDA $E4,x
  48. CLC
  49. ADC #$08
  50. STA $E4,x
  51. RTL
  52.  
  53.  
  54. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  55. ; sprite code JSL
  56. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  57.  
  58. PRINT "MAIN ",pc
  59. PHB
  60. PHK
  61. PLB
  62. JSR SPRITE_CODE_START
  63. PLB
  64. RTL
  65.  
  66.  
  67. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  68. ; sprite main code
  69. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  70.  
  71. RETURN: RTS
  72.  
  73. SPRITE_CODE_START: JSR SUB_GFX
  74.  
  75. LDA $14C8,x ; RETURN if sprite status != 8
  76. CMP #$08
  77. BNE RETURN
  78.  
  79. LDA $9D ; RETURN if sprites locked
  80. BNE RETURN
  81.  
  82. JSR SUB_OFF_SCREEN_X0 ; only process sprite while on screen
  83.  
  84. JSL $01A7DC ; interact with mario
  85.  
  86. LDA !SPRITE_STATE,x
  87. CMP #$01
  88. BEQ FALLING
  89. CMP #$02
  90. BEQ RISING
  91.  
  92. ;-----------------------------------------------------------------------------------------
  93. ; state 0
  94. ;-----------------------------------------------------------------------------------------
  95.  
  96. HOVERING: LDA !V_OFFSCREEN,x ;fall if offscreen vertically
  97. BNE SET_FALLING
  98.  
  99. LDA !H_OFFSCREEN,x ;RETURN if offscreen horizontally
  100. BNE RETURN0
  101.  
  102. JSR SUB_HORZ_POS ;determine if mario is close and act accordingly
  103. TYA
  104. STA $157C,x
  105. STZ !EXPRESSION,x
  106. LDA $0F
  107. CLC
  108. ADC #$40
  109. CMP #$80
  110. BCS THWOMP_4
  111. LDA #$01
  112. STA !EXPRESSION,x
  113. THWOMP_4: LDA $0F
  114. CLC
  115. ADC #$24
  116. CMP #$50
  117. BCS RETURN0
  118.  
  119. SET_FALLING: LDA #$02 ;set expression
  120. STA !EXPRESSION,x
  121.  
  122. INC !SPRITE_STATE,x ;chage state to FALLING
  123.  
  124. LDA #$00
  125. STA !SPRITE_Y_SPEED,x ;set initial speed
  126.  
  127. RETURN0: RTS
  128.  
  129. ;-----------------------------------------------------------------------------------------
  130. ; state 1
  131. ;-----------------------------------------------------------------------------------------
  132.  
  133. FALLING: LDA !FREEZE_TIMER,x ;if we're still waiting on the ground, RETURN
  134. BNE RETURN2
  135. JSL $01801A ;apply speed
  136.  
  137. LDA !SPRITE_Y_SPEED,x ;increase speed if below the max
  138. CMP #!MAX_Y_SPEED1
  139. BCS DONT_INC_SPEED1
  140. ADC #!SPRITE_GRAVITY
  141. STA !SPRITE_Y_SPEED,x
  142. DONT_INC_SPEED1:
  143. JSL $019138 ;interact with objects
  144.  
  145. LDA !SPR_OBJ_STATUS,x ;RETURN if not on the ground
  146. AND #!IS_ON_GROUND
  147. BEQ RETURN1
  148.  
  149. JSR SUB_9A04 ; ?? speed related
  150.  
  151. LDA #!TIME_TO_SHAKE ;shake ground
  152. STA $1887
  153.  
  154. LDA #!SOUND_EFFECT ;play sound effect
  155. STA $1DFC
  156.  
  157. LDA #!TIME_ON_GROUND ;set time to stay on ground
  158. STA !FREEZE_TIMER,x
  159.  
  160. INC !SPRITE_STATE,x ;go to RISING state
  161. RETURN1: RTS
  162.  
  163. ;-----------------------------------------------------------------------------------------
  164. ; state 2
  165. ;-----------------------------------------------------------------------------------------
  166.  
  167. RISING: LDA !FREEZE_TIMER,x ;if we're still waiting on the ground, RETURN
  168. BNE RETURN2
  169. JSL $01801A ;apply speed
  170.  
  171. LDA !SPRITE_Y_SPEED,x ;increase speed if below the max
  172. CMP #!MAX_Y_SPEED2
  173. BMI DONT_INC_SPEED2
  174. SBC #!SPRITE_GRAVITY
  175. STA !SPRITE_Y_SPEED,x
  176. DONT_INC_SPEED2:
  177. JSL $019138 ;interact with objects
  178.  
  179. LDA !SPR_OBJ_STATUS,x ;RETURN if not on the ceiling
  180. AND #!IS_ON_CEILING
  181. BEQ RETURN2
  182.  
  183. JSR SUB_9A04 ; ?? speed related
  184.  
  185. LDA #!TIME_TO_SHAKE ;shake ground
  186. STA $1887
  187.  
  188. LDA #!SOUND_EFFECT ;play sound effect
  189. STA $1DFC
  190.  
  191. LDA #!TIME_ON_GROUND ;set time to stay on ground
  192. STA !FREEZE_TIMER,x
  193.  
  194. DEC !SPRITE_STATE,x ;go to FALLING state
  195. RETURN2: RTS
  196.  
  197.  
  198. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  199. ; graphics routine
  200. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  201.  
  202. SUB_GFX: JSR GET_DRAW_INFO
  203.  
  204. LDA !EXPRESSION,x
  205. STA $02
  206. PHX
  207. LDX #$03
  208. CMP #$00
  209. BEQ LOOP_START
  210. INX
  211. LOOP_START: LDA $00
  212. CLC
  213. ADC X_OFFSET,x
  214. STA $0300,y
  215.  
  216. LDA $01
  217. CLC
  218. ADC Y_OFFSET,x
  219. STA $0301,y
  220.  
  221. LDA PROPERTIES,x
  222. ORA $64
  223. STA $0303,y
  224.  
  225. LDA TILE_MAP,x
  226. CPX #$04
  227. BNE NORMAL_TILE
  228. PHX
  229. LDX $02
  230. CPX #$02
  231. BNE NOT_ANGRY
  232. LDA #!ANGRY_TILE
  233. NOT_ANGRY: PLX
  234. NORMAL_TILE: STA $0302,y
  235.  
  236. INY
  237. INY
  238. INY
  239. INY
  240. DEX
  241. BPL LOOP_START
  242.  
  243. PLX
  244.  
  245. LDY #$02 ; \ 460 = 2 (all 16x16 tiles)
  246. LDA #$04 ; | A = (number of tiles drawn - 1)
  247. JSL $01B7B3 ; / don't draw if offscreen
  248. RTS ; RETURN
  249.  
  250.  
  251. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  252. ; speed related
  253. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  254.  
  255. SUB_9A04: LDA !SPR_OBJ_STATUS,x
  256. BMI THWOMP_1
  257. LDA #$00
  258. LDY $15B8,x
  259. BEQ THWOMP_2
  260. THWOMP_1: LDA #$18
  261. THWOMP_2: STA !SPRITE_Y_SPEED,x
  262. RTS
  263.  
  264.  
  265. ;###############################################################################################
  266. ;###############################################################################################
  267. ;###############################################################################################
  268. ; ROUTINES FROM THE LIBRARY ARE PASTED BELOW
  269. ; You should never have to modify this code
  270. ;###############################################################################################
  271. ;###############################################################################################
  272. ;###############################################################################################
  273.  
  274.  
  275. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  276. ; SUB_HORZ_POS
  277. ; This routine determines which side of the sprite Mario is on. It sets the Y register
  278. ; to the direction such that the sprite would face Mario
  279. ; It is ripped from $03B817
  280. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  281.  
  282. SUB_HORZ_POS: LDY #$00 ;A:25D0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1020 VC:097 00 FL:31642
  283. LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  284. SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  285. SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  286. STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  287. LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  288. SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  289. BPL SPR_L16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  290. INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  291. SPR_L16: RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
  292.  
  293.  
  294. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  295. ; SUB_OFF_SCREEN
  296. ; This subroutine deals with sprites that have moved off screen
  297. ; It is adapted from the subroutine at $01AC0D
  298. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  299.  
  300. SPR_T12: db $40,$B0
  301. SPR_T13: db $01,$FF
  302. SPR_T14: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
  303. db $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
  304. SPR_T15: db $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
  305. db $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes
  306.  
  307. SUB_OFF_SCREEN_X1: LDA #$02 ; \ entry point of routine determines value of $03
  308. BRA STORE_03 ; | (table entry to use on horizontal levels)
  309. SUB_OFF_SCREEN_X2: LDA #$04 ; |
  310. BRA STORE_03 ; |
  311. SUB_OFF_SCREEN_X3: LDA #$06 ; |
  312. BRA STORE_03 ; |
  313. SUB_OFF_SCREEN_X4: LDA #$08 ; |
  314. BRA STORE_03 ; |
  315. SUB_OFF_SCREEN_X5: LDA #$0A ; |
  316. BRA STORE_03 ; |
  317. SUB_OFF_SCREEN_X6: LDA #$0C ; |
  318. BRA STORE_03 ; |
  319. SUB_OFF_SCREEN_X7: LDA #$0E ; |
  320. STORE_03: STA $03 ; |
  321. BRA START_SUB ; |
  322. SUB_OFF_SCREEN_X0: STZ $03 ; /
  323.  
  324. START_SUB: JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, RETURN
  325. BEQ RETURN_35 ; /
  326. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  327. AND #$01 ; |
  328. BNE VERTICAL_LEVEL ; /
  329. LDA !SPRITE_Y_POS,x ; \
  330. CLC ; |
  331. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  332. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  333. ADC #$00 ; |
  334. CMP #$02 ; |
  335. BPL ERASE_SPRITE ; / ...erase the sprite
  336. LDA $167A,x ; \ if "process offscreen" flag is set, RETURN
  337. AND #$04 ; |
  338. BNE RETURN_35 ; /
  339. LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
  340. AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
  341. ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
  342. STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
  343. TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
  344. LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
  345. CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
  346. ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
  347. ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
  348. CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
  349. PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
  350. LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
  351. LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
  352. ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
  353. PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
  354. SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
  355. STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
  356. LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
  357. BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
  358. EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
  359. STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
  360. SPR_L31: LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
  361. BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
  362. ERASE_SPRITE: LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  363. CMP #$08 ; |
  364. BCC KILL_SPRITE ; /
  365. LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
  366. CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
  367. BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
  368. LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
  369. STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
  370. KILL_SPRITE: STZ $14C8,x ; erase sprite
  371. RETURN_35: RTS ; RETURN
  372.  
  373. VERTICAL_LEVEL: LDA $167A,x ; \ if "process offscreen" flag is set, RETURN
  374. AND #$04 ; |
  375. BNE RETURN_35 ; /
  376. LDA $13 ; \
  377. LSR A ; |
  378. BCS RETURN_35 ; /
  379. LDA $E4,x ; \
  380. CMP #$00 ; | if the sprite has gone off the side of the level...
  381. LDA $14E0,x ; |
  382. SBC #$00 ; |
  383. CMP #$02 ; |
  384. BCS ERASE_SPRITE ; / ...erase the sprite
  385. LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
  386. LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
  387. AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
  388. STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
  389. TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
  390. LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
  391. CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
  392. ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
  393. ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
  394. CMP !SPRITE_Y_POS,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
  395. PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
  396. LDA.w $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
  397. LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
  398. ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
  399. PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
  400. SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
  401. STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
  402. LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
  403. BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
  404. EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
  405. STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
  406. SPR_L38: LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
  407. BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
  408. BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490
  409.  
  410. SUB_IS_OFF_SCREEN: LDA !H_OFFSCREEN,x ; \ if sprite is on screen, accumulator = 0
  411. ORA !V_OFFSCREEN,x ; |
  412. RTS ; / RETURN
  413.  
  414.  
  415. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  416. ; GET_DRAW_INFO
  417. ; This is a helper for the graphics routine. It sets off screen flags, and sets up
  418. ; variables. It will RETURN with the following:
  419. ;
  420. ; Y = index to sprite OAM ($300)
  421. ; $00 = sprite x position relative to screen boarder
  422. ; $01 = sprite y position relative to screen boarder
  423. ;
  424. ; It is adapted from the subroutine at $03B760
  425. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  426.  
  427. SPR_T1: db $0C,$1C
  428. SPR_T2: db $01,$02
  429.  
  430. GET_DRAW_INFO: STZ !V_OFFSCREEN,x ; reset sprite offscreen flag, vertical
  431. STZ !H_OFFSCREEN,x ; reset sprite offscreen flag, horizontal
  432. LDA $E4,x ; \
  433. CMP $1A ; | set horizontal offscreen if necessary
  434. LDA $14E0,x ; |
  435. SBC $1B ; |
  436. BEQ ON_SCREEN_X ; |
  437. INC !H_OFFSCREEN,x ; /
  438.  
  439. ON_SCREEN_X: LDA $14E0,x ; \
  440. XBA ; |
  441. LDA $E4,x ; |
  442. REP #$20 ; |
  443. SEC ; |
  444. SBC $1A ; | mark sprite INVALID if far enough off screen
  445. CLC ; |
  446. ADC.w #$0040 ; |
  447. CMP.w #$0180 ; |
  448. SEP #$20 ; |
  449. ROL A ; |
  450. AND #$01 ; |
  451. STA $15C4,x ; /
  452. BNE INVALID ;
  453.  
  454. LDY #$00 ; \ set up loop:
  455. LDA $1662,x ; |
  456. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  457. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  458. INY ; /
  459. ON_SCREEN_LOOP: LDA !SPRITE_Y_POS,x ; \
  460. CLC ; | set vertical offscreen if necessary
  461. ADC SPR_T1,y ; |
  462. PHP ; |
  463. CMP $1C ; | (vert screen boundry)
  464. ROL $00 ; |
  465. PLP ; |
  466. LDA $14D4,x ; |
  467. ADC #$00 ; |
  468. LSR $00 ; |
  469. SBC $1D ; |
  470. BEQ ON_SCREEN_Y ; |
  471. LDA !V_OFFSCREEN,x ; | (vert offscreen)
  472. ORA SPR_T2,y ; |
  473. STA !V_OFFSCREEN,x ; |
  474. ON_SCREEN_Y: DEY ; |
  475. BPL ON_SCREEN_LOOP ; /
  476.  
  477. LDY $15EA,x ; get offset to sprite OAM
  478. LDA $E4,x ; \
  479. SEC ; |
  480. SBC $1A ; | $00 = sprite x position relative to screen boarder
  481. STA $00 ; /
  482. LDA !SPRITE_Y_POS,x ; \
  483. SEC ; |
  484. SBC $1C ; | $01 = sprite y position relative to screen boarder
  485. STA $01 ; /
  486. RTS ; RETURN
  487.  
  488. INVALID: PLA ; \ RETURN from *main gfx routine* subroutine...
  489. PLA ; | ...(not just this subroutine)
  490. RTS ; /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement