Romano338

Thwomp right

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