Advertisement
W4mp3

Wings

Feb 18th, 2014
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.46 KB | None | 0 0
  1. ;========
  2. ;Cursor ;
  3. ;========
  4.  
  5. print "MAIN ",pc
  6. PHB
  7. PHK
  8. PLB
  9. JSR Spr
  10. PLB
  11. print "INIT ",pc
  12. RTL
  13. ;=============================================================================
  14. ;Sprite Main
  15. ;=============================================================================
  16. Spr:
  17. LDA $71
  18. CMP #$06
  19. BEQ Reutirn
  20. LDA #$80
  21. STA $1406
  22. LDA $16
  23. AND #$80
  24. BEQ SkipB
  25. LDA #$21
  26. STA $1DFC
  27. LDA #$CF
  28. STA $7D
  29. SkipB:
  30.  
  31. LDA $D2
  32. STA $14E0,x
  33. LDA $D4
  34. STA $14D4,x
  35.  
  36. LDA $76
  37. BNE FrameLeft
  38. LDA $D1
  39. CLC
  40. ADC #$09
  41. BRA FrameRight
  42. FrameLeft:
  43. LDA $D1
  44. SEC
  45. SBC #$09
  46. FrameRight:
  47. STA $E4,x
  48. LDA $D3
  49. CLC
  50. ADC #$0C
  51. STA $D8,x
  52. JSR Graphics
  53. Reutirn:
  54. RTS
  55. Frames:
  56. db $C6,$80
  57.  
  58. ;=============================================================================
  59. Graphics:
  60. ;=============================================================================
  61. JSR GET_DRAW_INFO
  62. LDA $00
  63. STA $0300,y
  64. LDA $01
  65. STA $0301,y
  66. LDA $14
  67. LSR
  68. LSR
  69. LSR
  70. AND #$01
  71. PHX
  72. TAX
  73. LDA Frames,x
  74. PLX
  75. SetTile:
  76. STA $0302,y
  77.  
  78.  
  79. LDA $76
  80. BNE YLeft
  81. ;YXPPCCCT
  82. ;00100110
  83. LDA #$26
  84. BRA Set
  85. YLeft:
  86. LDA #$66
  87. Set:
  88. STA $0303,y
  89.  
  90. ;YXPPCCCT
  91. ;00000010
  92. ;00000100
  93.  
  94. INY
  95. INY
  96. INY
  97. INY
  98. LDY #$02
  99. LDA #$00
  100. JSL $01B7B3
  101. RTS
  102. ;=================
  103. ;Borrowed Routines
  104. ;=================
  105.  
  106. ;org $03B817
  107.  
  108. 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
  109. LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  110. SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  111. SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  112. STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  113. LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  114. SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  115. BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  116. INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  117. LABEL16: RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
  118.  
  119.  
  120.  
  121.  
  122. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  123. ; GET_DRAW_INFO
  124. ; This is a helper for the graphics routine. It sets off screen flags, and sets up
  125. ; variables. It will return with the following:
  126. ;
  127. ; Y = index to sprite OAM ($300)
  128. ; $00 = sprite x position relative to screen boarder
  129. ; $01 = sprite y position relative to screen boarder
  130. ;
  131. ; It is adapted from the subroutine at $03B760
  132. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  133.  
  134. SPR_T1: db $0C,$1C
  135. SPR_T2: db $01,$02
  136.  
  137. GET_DRAW_INFO: STZ $186C,x ; reset sprite offscreen flag, vertical
  138. STZ $15A0,x ; reset sprite offscreen flag, horizontal
  139. LDA $E4,x ; \
  140. CMP $1A ; | set horizontal offscreen if necessary
  141. LDA $14E0,x ; |
  142. SBC $1B ; |
  143. BEQ ON_SCREEN_X ; |
  144. INC $15A0,x ; /
  145.  
  146. ON_SCREEN_X: LDA $14E0,x ; \
  147. XBA ; |
  148. LDA $E4,x ; |
  149. REP #$20 ; |
  150. SEC ; |
  151. SBC $1A ; | mark sprite invalid if far enough off screen
  152. CLC ; |
  153. ADC #$0040 ; |
  154. CMP #$0180 ; |
  155. SEP #$20 ; |
  156. ROL A ; |
  157. AND #$01 ; |
  158. STA $15C4,x ; /
  159. BNE INVALID ;
  160.  
  161. LDY #$00 ; \ set up loop:
  162. LDA $1662,x ; |
  163. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  164. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  165. INY ; /
  166. ON_SCREEN_LOOP: LDA $D8,x ; \
  167. CLC ; | set vertical offscreen if necessary
  168. ADC SPR_T1,y ; |
  169. PHP ; |
  170. CMP $1C ; | (vert screen boundry)
  171. ROL $00 ; |
  172. PLP ; |
  173. LDA $14D4,x ; |
  174. ADC #$00 ; |
  175. LSR $00 ; |
  176. SBC $1D ; |
  177. BEQ ON_SCREEN_Y ; |
  178. LDA $186C,x ; | (vert offscreen)
  179. ORA SPR_T2,y ; |
  180. STA $186C,x ; |
  181. ON_SCREEN_Y: DEY ; |
  182. BPL ON_SCREEN_LOOP ; /
  183.  
  184. LDY $15EA,x ; get offset to sprite OAM
  185. LDA $E4,x ; \
  186. SEC ; |
  187. SBC $1A ; | $00 = sprite x position relative to screen boarder
  188. STA $00 ; /
  189. LDA $D8,x ; \
  190. SEC ; |
  191. SBC $1C ; | $01 = sprite y position relative to screen boarder
  192. STA $01 ; /
  193. RTS ; return
  194.  
  195. INVALID: PLA ; \ return from *main gfx routine* subroutine...
  196. PLA ; | ...(not just this subroutine)
  197. RTS ; /
  198.  
  199.  
  200. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  201. ; SUB_OFF_SCREEN
  202. ; This subroutine deals with sprites that have moved off screen
  203. ; It is adapted from the subroutine at $01AC0D
  204. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  205.  
  206. SPR_T12: db $40,$B0
  207. SPR_T13: db $01,$FF
  208. SPR_T14: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
  209. db $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
  210. SPR_T15: db $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
  211. db $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes
  212.  
  213. SUB_OFF_SCREEN_X1: LDA #$02 ; \ entry point of routine determines value of $03
  214. BRA STORE_03 ; | (table entry to use on horizontal levels)
  215. SUB_OFF_SCREEN_X2: LDA #$04 ; |
  216. BRA STORE_03 ; |
  217. SUB_OFF_SCREEN_X3: LDA #$06 ; |
  218. BRA STORE_03 ; |
  219. SUB_OFF_SCREEN_X4: LDA #$08 ; |
  220. BRA STORE_03 ; |
  221. SUB_OFF_SCREEN_X5: LDA #$0A ; |
  222. BRA STORE_03 ; |
  223. SUB_OFF_SCREEN_X6: LDA #$0C ; |
  224. BRA STORE_03 ; |
  225. SUB_OFF_SCREEN_X7: LDA #$0E ; |
  226. STORE_03: STA $03 ; |
  227. BRA START_SUB ; |
  228. SUB_OFF_SCREEN_X0: STZ $03 ; /
  229.  
  230. START_SUB: JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
  231. BEQ RETURN_35 ; /
  232. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  233. AND #$01 ; |
  234. BNE VERTICAL_LEVEL ; /
  235. LDA $D8,x ; \
  236. CLC ; |
  237. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  238. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  239. ADC #$00 ; |
  240. CMP #$02 ; |
  241. BPL ERASE_SPRITE ; / ...erase the sprite
  242. LDA $167A,x ; \ if "process offscreen" flag is set, return
  243. AND #$04 ; |
  244. BNE RETURN_35 ; /
  245. LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
  246. AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
  247. ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
  248. STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
  249. TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
  250. LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
  251. CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
  252. ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
  253. ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
  254. CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
  255. PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
  256. LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
  257. LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
  258. ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
  259. PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
  260. SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
  261. STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
  262. LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
  263. BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
  264. EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
  265. STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
  266. SPR_L31: LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
  267. BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
  268. ERASE_SPRITE: LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  269. CMP #$08 ; |
  270. BCC KILL_SPRITE ; /
  271. LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
  272. CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
  273. BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
  274. LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
  275. STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
  276. KILL_SPRITE: STZ $14C8,x ; erase sprite
  277. RETURN_35: RTS ; return
  278.  
  279. VERTICAL_LEVEL: LDA $167A,x ; \ if "process offscreen" flag is set, return
  280. AND #$04 ; |
  281. BNE RETURN_35 ; /
  282. LDA $13 ; \
  283. LSR A ; |
  284. BCS RETURN_35 ; /
  285. LDA $E4,x ; \
  286. CMP #$00 ; | if the sprite has gone off the side of the level...
  287. LDA $14E0,x ; |
  288. SBC #$00 ; |
  289. CMP #$02 ; |
  290. BCS ERASE_SPRITE ; / ...erase the sprite
  291. LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
  292. LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
  293. AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
  294. STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
  295. TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
  296. LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
  297. CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
  298. ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
  299. ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
  300. CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
  301. PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
  302. LDA $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
  303. LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
  304. ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
  305. PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
  306. SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
  307. STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
  308. LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
  309. BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
  310. EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
  311. STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
  312. SPR_L38: LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
  313. BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
  314. BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490
  315.  
  316. SUB_IS_OFF_SCREEN: LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
  317. ORA $186C,x ; |
  318. RTS ; / return
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement