Advertisement
Erik557

Untitled

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