Advertisement
Guest User

Untitled

a guest
Sep 24th, 2011
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.31 KB | None | 0 0
  1. dcb "INIT"
  2. RTL
  3.  
  4. dcb "MAIN"
  5.  
  6. PHB ;\
  7. PHK ; | Change the data bank to the one our code is running from.
  8. PLB ; | This is a good practice.
  9. JSR SpriteCode ; | Jump to the sprite's function.
  10. PLB ; | Restore old data bank.
  11. RTL ;/ And return.
  12.  
  13. ;===================================
  14. ;Sprite Function
  15. ;===================================
  16.  
  17. RETURN:
  18. RTS
  19.  
  20. SpriteCode:
  21. JSR Graphics
  22.  
  23. LDA $14C8,x
  24. CMP #$08
  25. BNE RETURN
  26. LDA $9D
  27. BNE RETURN
  28.  
  29. JSR SUB_OFF_SCREEN_X0
  30. ;===================================
  31. ;Graphics Code
  32. ;===================================
  33.  
  34. TILEMAP: dcb $CA,$CC
  35.  
  36. Graphics:
  37. JSR GET_DRAW_INFO ; Before actually coding the graphics, we need a routine that will get the current sprite's value
  38. ; into the OAM.
  39. ; The OAM being a place where the tile data for the current sprite will be stored.
  40. LDA $00 ;\
  41. STA $0300,y ;/ Draw the X position of the sprite
  42.  
  43. LDA $01 ;\
  44. STA $0301,y ;/ Draw the Y position of the sprite
  45.  
  46.  
  47. ;Those 2 above are always needed to figure out the X/Y position of the sprite
  48.  
  49.  
  50. PHX
  51. LDA $14
  52. AND #$01
  53. TAX
  54. LDA TILEMAP,x
  55. STA $0302,y
  56. PLX
  57.  
  58.  
  59. LDA #$07
  60. ORA $64
  61. STA $0303,y ; Write the YXPPCCCT property byte of the sprite
  62. ; See this part of the tutorial again for more info
  63.  
  64. INY ;\
  65. INY ; | The OAM is 8x8, but our sprite is 16x16 ..
  66. INY ; | So increment it 4 times.
  67. INY ;/
  68.  
  69. LDY #$02 ; Y ends with the tile size .. 02 means it's 16x16
  70. LDA #$00 ; A -> number of tiles drawn - 1.
  71. ; I drew only 1 tile so I put in 1-1 = 00.
  72.  
  73. JSL $01B7B3 ; Call the routine that draws the sprite.
  74. RTS ; Never forget this!
  75. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  76. ; GET_DRAW_INFO
  77. ; This is a helper for the graphics routine. It sets off screen flags, and sets up
  78. ; variables. It will return with the following:
  79. ;
  80. ; Y = index to sprite OAM ($300)
  81. ; $00 = sprite x position relative to screen boarder
  82. ; $01 = sprite y position relative to screen boarder
  83. ;
  84. ; It is adapted from the subroutine at $03B760
  85. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  86.  
  87. SPR_T1 dcb $0C,$1C
  88. SPR_T2 dcb $01,$02
  89.  
  90. GET_DRAW_INFO STZ $186C,x ; reset sprite offscreen flag, vertical
  91. STZ $15A0,x ; reset sprite offscreen flag, horizontal
  92. LDA $E4,x ; \
  93. CMP $1A ; | set horizontal offscreen if necessary
  94. LDA $14E0,x ; |
  95. SBC $1B ; |
  96. BEQ ON_SCREEN_X ; |
  97. INC $15A0,x ; /
  98.  
  99. ON_SCREEN_X LDA $14E0,x ; \
  100. XBA ; |
  101. LDA $E4,x ; |
  102. REP #$20 ; |
  103. SEC ; |
  104. SBC $1A ; | mark sprite invalid if far enough off screen
  105. CLC ; |
  106. ADC.W #$0040 ; |
  107. CMP.W #$0180 ; | IF YOU READ THIS, YOU WIN A COOKIE! PM ME AND I'LL GIVE YOU A FREE ASM HACK WOOHOO!
  108. SEP #$20 ; |
  109. ROL A ; |
  110. AND #$01 ; |
  111. STA $15C4,x ; /
  112. BNE INVALID ;
  113.  
  114. LDY #$00 ; \ set up loop:
  115. LDA $1662,x ; |
  116. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  117. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  118. INY ; /
  119. ON_SCREEN_LOOP LDA $D8,x ; \
  120. CLC ; | set vertical offscreen if necessary
  121. ADC SPR_T1,y ; |
  122. PHP ; |
  123. CMP $1C ; | (vert screen boundry)
  124. ROL $00 ; |
  125. PLP ; |
  126. LDA $14D4,x ; |
  127. ADC #$00 ; |
  128. LSR $00 ; |
  129. SBC $1D ; |
  130. BEQ ON_SCREEN_Y ; |
  131. LDA $186C,x ; | (vert offscreen)
  132. ORA SPR_T2,y ; |
  133. STA $186C,x ; |
  134. ON_SCREEN_Y DEY ; |
  135. BPL ON_SCREEN_LOOP ; /
  136.  
  137. LDY $15EA,x ; get offset to sprite OAM
  138. LDA $E4,x ; \
  139. SEC ; |
  140. SBC $1A ; | $00 = sprite x position relative to screen boarder
  141. STA $00 ; /
  142. LDA $D8,x ; \
  143. SEC ; |
  144. SBC $1C ; | $01 = sprite y position relative to screen boarder
  145. STA $01 ; /
  146. RTS ; return
  147.  
  148. INVALID PLA ; \ return from *main gfx routine* subroutine...
  149. PLA ; | ...(not just this subroutine)
  150. RTS ; /
  151.  
  152. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  153. ; SUB_OFF_SCREEN
  154. ; This subroutine deals with sprites that have moved off screen
  155. ; It is adapted from the subroutine at $01AC0D
  156. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  157.  
  158. SPR_T12 dcb $40,$B0
  159. SPR_T13 dcb $01,$FF
  160. SPR_T14 dcb $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
  161. dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
  162. SPR_T15 dcb $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
  163. dcb $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes
  164.  
  165. SUB_OFF_SCREEN_X1 LDA #$02 ; \ entry point of routine determines value of $03
  166. BRA STORE_03 ; | (table entry to use on horizontal levels)
  167. SUB_OFF_SCREEN_X2 LDA #$04 ; |
  168. BRA STORE_03 ; |
  169. SUB_OFF_SCREEN_X3 LDA #$06 ; |
  170. BRA STORE_03 ; |
  171. SUB_OFF_SCREEN_X4 LDA #$08 ; |
  172. BRA STORE_03 ; |
  173. SUB_OFF_SCREEN_X5 LDA #$0A ; |
  174. BRA STORE_03 ; |
  175. SUB_OFF_SCREEN_X6 LDA #$0C ; |
  176. BRA STORE_03 ; |
  177. SUB_OFF_SCREEN_X7 LDA #$0E ; |
  178. STORE_03 STA $03 ; |
  179. BRA START_SUB ; |
  180. SUB_OFF_SCREEN_X0 STZ $03 ; /
  181.  
  182. START_SUB JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
  183. BEQ RETURN_35 ; /
  184. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  185. AND #$01 ; |
  186. BNE VERTICAL_LEVEL ; /
  187. LDA $D8,x ; \
  188. CLC ; |
  189. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  190. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  191. ADC #$00 ; |
  192. CMP #$02 ; |
  193. BPL ERASE_SPRITE ; / ...erase the sprite
  194. LDA $167A,x ; \ if "process offscreen" flag is set, return
  195. AND #$04 ; |
  196. BNE RETURN_35 ; /
  197. LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
  198. AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
  199. ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
  200. STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
  201. TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
  202. LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
  203. CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
  204. ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
  205. ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
  206. CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
  207. PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
  208. LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
  209. LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
  210. ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
  211. PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
  212. SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
  213. STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
  214. LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
  215. BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
  216. EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
  217. STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
  218. SPR_L31 LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
  219. BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
  220. ERASE_SPRITE LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  221. CMP #$08 ; |
  222. BCC KILL_SPRITE ; /
  223. LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
  224. CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
  225. BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
  226. LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
  227. STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
  228. KILL_SPRITE STZ $14C8,x ; erase sprite
  229. RETURN_35 RTS ; return
  230.  
  231. VERTICAL_LEVEL LDA $167A,x ; \ if "process offscreen" flag is set, return
  232. AND #$04 ; |
  233. BNE RETURN_35 ; /
  234. LDA $13 ; \
  235. LSR A ; |
  236. BCS RETURN_35 ; /
  237. LDA $E4,x ; \
  238. CMP #$00 ; | if the sprite has gone off the side of the level...
  239. LDA $14E0,x ; |
  240. SBC #$00 ; |
  241. CMP #$02 ; |
  242. BCS ERASE_SPRITE ; / ...erase the sprite
  243. LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
  244. LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
  245. AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
  246. STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
  247. TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
  248. LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
  249. CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
  250. ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
  251. ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
  252. CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
  253. PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
  254. LDA.W $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
  255. LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
  256. ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
  257. PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
  258. SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
  259. STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
  260. LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
  261. BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
  262. EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
  263. STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
  264. SPR_L38 LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
  265. BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
  266. BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490
  267.  
  268. SUB_IS_OFF_SCREEN LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
  269. ORA $186C,x ; |
  270. RTS ; / return
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement