Advertisement
Romano338

Thwomp left down

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