Advertisement
Telinc1

Ginat Thwomp SP3

Dec 23rd, 2011
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; Giant Thwomp
  3. ; by Sonikku
  4. ; Description: A Thwomp twice the size as the original.
  5. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6. ; init JSL
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8.  
  9.     dcb "INIT"
  10.     LDA $D8,x
  11.     STA $151C,x
  12.     RTL
  13.  
  14. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  15. ; main sprite JSL
  16. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  17.  
  18.     dcb "MAIN"
  19.     PHB  ; \
  20.     PHK  ;  | main sprite function, just calls local subroutine
  21.     PLB  ;  |
  22.     JSR START_HB_CODE       ;  |
  23.     PLB  ;  |
  24.     RTL  ; /
  25.  
  26. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  27. ; main sprite routine
  28. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  29. BXPOS   dcb $F0,$00,$10
  30. BXPOS2  dcb $FF,$00,$00
  31. RETURN  RTS
  32. START_HB_CODE
  33.     JSR SUB_GFX
  34.     JSR SUB_OFF_SCREEN_X0
  35.     LDA $9D
  36.     BNE RETURN
  37.     LDA #$08
  38.     CMP $14C8,x
  39.     BNE RETURN
  40. ;   JSL $01802A
  41.     JSL $03B664
  42.     JSR GetSpriteClipping
  43.     JSL $03B72B
  44.     BCC NOCON
  45.     JSR SUB_VERT_POS
  46.     LDA $0E
  47.     CMP #$ED
  48.     BPL HURT
  49.     LDA $140D
  50.     BEQ HURT
  51.     LDA $7D
  52.     BMI NOCON
  53.     LDA #$02
  54.     STA $1DF9
  55.     LDA #$08
  56.     STA $154C,x
  57.     JSL $01AA33
  58.     JSL $01AB99
  59.     BRA NOCON
  60. HURT    LDA $154C,x
  61.     BNE NOCON
  62.     JSL $00F5B7
  63. NOCON   LDA $C2,x
  64.     JSL $0086DF
  65.     dcw HOVER&$FFFF
  66.     dcw FALL&$FFFF
  67.     dcw RISE&$FFFF
  68. ;; hover, state 0
  69. HOVER   STZ $AA,x
  70.     JSR SUB_HORZ_POS
  71.     TYA
  72.     STA $157C,x
  73.     STZ $1602,x
  74.     LDA $15A0,x
  75.     BNE RETURN0
  76.     LDA $0F
  77.     CLC
  78.     ADC #$30
  79.     CMP #$80
  80.     BCS THWOMP
  81.     LDA #$01
  82.     STA $1602,x
  83. THWOMP  LDA $0F
  84.     CLC
  85.     ADC #$10
  86.     CMP #$40
  87.     BCS RETURN0
  88.     LDA #$02
  89.     STA $1602,x
  90.     LDA #$01
  91.     STA $C2,x
  92. RETURN0 RTS
  93. ;; falling, state 1
  94. FALL    JSL $01801A
  95.     JSL $019138
  96.     LDA #$3E
  97.     CMP $AA,x
  98.     BCC CHKGND
  99.     INC $AA,x
  100.     INC $AA,x
  101. CHKGND  LDA $1588,x
  102.     AND #$04
  103.     BEQ RETURN1
  104.     LDA $1540,x
  105.     BNE RETURN1
  106.     LDA #$50
  107.     STA $1540,x
  108.     LDA #$40
  109.     STA $1887
  110.     LDA #$18
  111.     STA $1DFC
  112.     LDA #$01
  113.     STA $1DF9
  114.     LDA #$02
  115.     STA $C2,x
  116.     STZ $AA,x
  117.     LDA $77
  118.     AND #$04
  119.     BEQ RETURN1
  120.     LDA $1887
  121.     STA $18BD
  122. RETURN1 RTS
  123. ;; rising, state 2
  124. RISE    JSL $01801A
  125.     LDA $1540,x
  126.     BNE RETURN2
  127.     STZ $1602,x
  128.     LDA $151C,x
  129.     CMP $D8,x
  130.     BNE YSPD
  131.     STZ $AA,x
  132.     STZ $C2,x
  133. RETURN2 RTS
  134. YSPD    LDA #$F0
  135.     STA $AA,x
  136.     RTS
  137. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  138. ; sprite clipping routine
  139. ; ripped and modified by Roy, then modified more by Sonikku
  140. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  141. GetSpriteClipping:
  142. PHY
  143. PHX
  144. TXY
  145. LDA $00E4,y
  146. CLC
  147. ADC #$04        ; Starting X pos of sprite clipping = sprite center position - $0C ($0C pixels to the left)
  148. STA $04
  149. LDA $14E0,y
  150. ADC #$00
  151. STA $0A
  152. LDA #$2C                ; Width of sprite clipping
  153. STA $06
  154. LDA $00D8,y
  155. SEC
  156. SBC #$20                ; Starting Y pos of sprite clipping = sprite center position - $2C ($2C pixels above)
  157. STA $05
  158. LDA $14D4,y
  159. SBC #$00
  160. STA $0B
  161. LDA #$40                ; Height of sprite clipping
  162. STA $07
  163. PLX
  164. PLY
  165. RTS
  166. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  167. ; graphics routine
  168. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  169. TILEMAP     dcb $80,$82,$80,$A0,$A2,$A0,$C0,$C2,$C0,$E0,$E2,$E0,$A1,$A1,$C1,$C1
  170.         dcb $80,$82,$80,$A0,$A2,$A0,$C0,$C2,$C0,$E0,$E2,$E0,$84,$86,$A4,$A6
  171.         dcb $80,$82,$80,$A0,$A2,$A0,$C0,$C2,$C0,$E0,$E2,$E0,$C4,$C4,$E4,$E4
  172. X_OFFSET    dcb $00,$10,$20,$00,$10,$20,$00,$10,$20,$00,$10,$20,$08,$18,$08,$18
  173. Y_OFFSET    dcb $E0,$E0,$E0,$F0,$F0,$F0,$00,$00,$00,$10,$10,$10,$F0,$F0,$00,$00
  174. PROPERTIES  dcb $00,$00,$40,$00,$00,$40,$00,$00,$40,$00,$00,$40,$00,$40,$00,$40
  175. SUB_GFX             JSR GET_DRAW_INFO       ; sets y = OAM offset
  176.                     LDA $157C,x             ; \ $02 = direction
  177.                     ASL A
  178.                     ASL A
  179.                     STA $02                 ; /    
  180.                     LDA $1602,x
  181.                     ASL A
  182.                     ASL A
  183.                     ASL A
  184.                     ASL A
  185.                     STA $03            
  186.                    
  187.                     PHX
  188.                     LDX #$0F
  189. LOOP_START          PHX
  190.  
  191.                     LDA X_OFFSET,x
  192.                     CLC
  193.                     ADC $00                 ; \ tile x position = sprite y location ($01)
  194.                     STA $0300,y             ; /
  195.  
  196.                     LDA Y_OFFSET,x
  197.                     CLC
  198.                     ADC $01                 ; \ tile y position = sprite x location ($00)
  199.                     STA $0301,y             ; /
  200.  
  201.                     TXA
  202.                     CLC
  203.                     ADC $03
  204.                     TAX
  205.                    
  206.                     LDA TILEMAP,x
  207.                     STA $0302,y
  208.  
  209.                     LDX $15E9
  210.                     LDA $15F6,x             ; tile properties xyppccct, format
  211.                     PLX
  212.                     ORA PROPERTIES,x
  213.                     ORA $64                 ; add in tile priority of level
  214.                     STA $0303,y             ; store tile properties
  215.                     INY                     ; \ increase index to sprite tile map ($300)...
  216.                     INY                     ;  |    ...we wrote 1 16x16 tile...
  217.                     INY                     ;  |    ...sprite OAM is 8x8...
  218.                     INY                     ; /    ...so increment 4 times
  219.                     DEX
  220.                     BPL LOOP_START
  221.  
  222.                     PLX
  223.                     LDY #$02                ; \ 460 = 2 (all 16x16 tiles)
  224.                     LDA #$0F               ;  | A = (number of tiles drawn - 1)
  225.                     JSL $01B7B3             ; / don't draw if offscreen
  226.                     RTS                     ; return
  227.  
  228. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  229. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  230. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  231. ; ROUTINES FROM THE LIBRARY ARE PASTED BELOW
  232. ; You should never have to modify this code
  233. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  234. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  235. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  236.  
  237.  
  238.  
  239. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  240. ; GET_DRAW_INFO
  241. ; This is a helper for the graphics routine.  It sets off screen flags, and sets up
  242. ; variables.  It will return with the following:
  243. ;
  244. ;       Y = index to sprite OAM ($300)
  245. ;       $00 = sprite x position relative to screen boarder
  246. ;       $01 = sprite y position relative to screen boarder  
  247. ;
  248. ; It is adapted from the subroutine at $03B760
  249. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  250.  
  251. SPR_T1              dcb $0C,$1C
  252. SPR_T2              dcb $01,$02
  253.  
  254. GET_DRAW_INFO       STZ $186C,x             ; reset sprite offscreen flag, vertical
  255.                     STZ $15A0,x             ; reset sprite offscreen flag, horizontal
  256.                     LDA $E4,x               ; \
  257.                     CMP $1A                 ;  | set horizontal offscreen if necessary
  258.                     LDA $14E0,x             ;  |
  259.                     SBC $1B                 ;  |
  260.                     BEQ ON_SCREEN_X         ;  |
  261.                     INC $15A0,x             ; /
  262.  
  263. ON_SCREEN_X         LDA $14E0,x             ; \
  264.                     XBA                     ;  |
  265.                     LDA $E4,x               ;  |
  266.                     REP #$20                ;  |
  267.                     SEC                     ;  |
  268.                     SBC $1A                 ;  | mark sprite invalid if far enough off screen
  269.                     CLC                     ;  |
  270.                     ADC.W #$0040            ;  |
  271.                     CMP.W #$0180            ;  |
  272.                     SEP #$20                ;  |
  273.                     ROL A                   ;  |
  274.                     AND #$01                ;  |
  275.                     STA $15C4,x             ; /
  276.                     BNE INVALID             ;
  277.                    
  278.                     LDY #$00                ; \ set up loop:
  279.                     LDA $1662,x             ;  |
  280.                     AND #$20                ;  | if not smushed (1662 & 0x20), go through loop twice
  281.                     BEQ ON_SCREEN_LOOP      ;  | else, go through loop once
  282.                     INY                     ; /
  283. ON_SCREEN_LOOP      LDA $D8,x               ; \
  284.                     CLC                     ;  | set vertical offscreen if necessary
  285.                     ADC SPR_T1,y            ;  |
  286.                     PHP                     ;  |
  287.                     CMP $1C                 ;  | (vert screen boundry)
  288.                     ROL $00                 ;  |
  289.                     PLP                     ;  |
  290.                     LDA $14D4,x             ;  |
  291.                     ADC #$00                ;  |
  292.                     LSR $00                 ;  |
  293.                     SBC $1D                 ;  |
  294.                     BEQ ON_SCREEN_Y         ;  |
  295.                     LDA $186C,x             ;  | (vert offscreen)
  296.                     ORA SPR_T2,y            ;  |
  297.                     STA $186C,x             ;  |
  298. ON_SCREEN_Y         DEY                     ;  |
  299.                     BPL ON_SCREEN_LOOP      ; /
  300.  
  301.                     LDY $15EA,x             ; get offset to sprite OAM
  302.                     LDA $E4,x               ; \
  303.                     SEC                     ;  |
  304.                     SBC $1A                 ;  | $00 = sprite x position relative to screen boarder
  305.                     STA $00                 ; /
  306.                     LDA $D8,x               ; \
  307.                     SEC                     ;  |
  308.                     SBC $1C                 ;  | $01 = sprite y position relative to screen boarder
  309.                     STA $01                 ; /
  310.                     RTS                     ; return
  311.  
  312. INVALID             PLA                     ; \ return from *main gfx routine* subroutine...
  313.                     PLA                     ;  |    ...(not just this subroutine)
  314.                     RTS                     ; /
  315.  
  316.  
  317. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  318. ; SUB_OFF_SCREEN
  319. ; This subroutine deals with sprites that have moved off screen
  320. ; It is adapted from the subroutine at $01AC0D
  321. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  322.                    
  323. SPR_T12             dcb $40,$B0
  324. SPR_T13             dcb $01,$FF
  325. SPR_T14             dcb $30,$C0,$A0,$C0,$A0,$F0,$60,$90     ;bank 1 sizes
  326.                     dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0     ;bank 3 sizes
  327. SPR_T15             dcb $01,$FF,$01,$FF,$01,$FF,$01,$FF     ;bank 1 sizes
  328.                     dcb $01,$FF,$01,$FF,$01,$00,$01,$FF     ;bank 3 sizes
  329.  
  330. SUB_OFF_SCREEN_X1   LDA #$02                ; \ entry point of routine determines value of $03
  331.                     BRA STORE_03            ;  | (table entry to use on horizontal levels)
  332. SUB_OFF_SCREEN_X2   LDA #$04                ;  |
  333.                     BRA STORE_03            ;  |
  334. SUB_OFF_SCREEN_X3   LDA #$06                ;  |
  335.                     BRA STORE_03            ;  |
  336. SUB_OFF_SCREEN_X4   LDA #$08                ;  |
  337.                     BRA STORE_03            ;  |
  338. SUB_OFF_SCREEN_X5   LDA #$0A                ;  |
  339.                     BRA STORE_03            ;  |
  340. SUB_OFF_SCREEN_X6   LDA #$0C                ;  |
  341.                     BRA STORE_03            ;  |
  342. SUB_OFF_SCREEN_X7   LDA #$0E                ;  |
  343. STORE_03            STA $03                 ;  |            
  344.                     BRA START_SUB           ;  |
  345. SUB_OFF_SCREEN_X0   STZ $03                 ; /
  346.  
  347. START_SUB           JSR SUB_IS_OFF_SCREEN   ; \ if sprite is not off screen, return
  348.                     BEQ RETURN_35           ; /
  349.                     LDA $5B                 ; \  goto VERTICAL_LEVEL if vertical level
  350.                     AND #$01                ; |
  351.                     BNE VERTICAL_LEVEL      ; /    
  352.                     LDA $D8,x               ; \
  353.                     CLC                     ; |
  354.                     ADC #$50                ; | if the sprite has gone off the bottom of the level...
  355.                     LDA $14D4,x             ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  356.                     ADC #$00                ; |
  357.                     CMP #$02                ; |
  358.                     BPL ERASE_SPRITE        ; /    ...erase the sprite
  359.                     LDA $167A,x             ; \ if "process offscreen" flag is set, return
  360.                     AND #$04                ; |
  361.                     BNE RETURN_35           ; /
  362.                     LDA $13                 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
  363.                     AND #$01                ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
  364.                     ORA $03                 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
  365.                     STA $01                 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
  366.                     TAY                     ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
  367.                     LDA $1A                 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
  368.                     CLC                     ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
  369.                     ADC SPR_T14,y           ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
  370.                     ROL $00                 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
  371.                     CMP $E4,x               ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
  372.                     PHP                     ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
  373.                     LDA $1B                 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
  374.                     LSR $00                 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
  375.                     ADC SPR_T15,y           ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
  376.                     PLP                     ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
  377.                     SBC $14E0,x             ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
  378.                     STA $00                 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
  379.                     LSR $01                 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
  380.                     BCC SPR_L31             ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
  381.                     EOR #$80                ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
  382.                     STA $00                 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
  383. SPR_L31             LDA $00                 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
  384.                     BPL RETURN_35           ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
  385. ERASE_SPRITE        LDA $14C8,x             ; \ if sprite status < 8, permanently erase sprite
  386.                     CMP #$08                ; |
  387.                     BCC KILL_SPRITE         ; /    
  388.                     LDY $161A,x             ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
  389.                     CPY #$FF                ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
  390.                     BEQ KILL_SPRITE         ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
  391.                     LDA #$00                ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
  392.                     STA $1938,y             ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
  393. KILL_SPRITE         STZ $14C8,x             ; erase sprite
  394. RETURN_35           RTS                     ; return
  395.  
  396. VERTICAL_LEVEL      LDA $167A,x             ; \ if "process offscreen" flag is set, return
  397.                     AND #$04                ; |
  398.                     BNE RETURN_35           ; /
  399.                     LDA $13                 ; \
  400.                     LSR A                   ; |
  401.                     BCS RETURN_35           ; /
  402.                     LDA $E4,x               ; \
  403.                     CMP #$00                ;  | if the sprite has gone off the side of the level...
  404.                     LDA $14E0,x             ;  |
  405.                     SBC #$00                ;  |
  406.                     CMP #$02                ;  |
  407.                     BCS ERASE_SPRITE        ; /  ...erase the sprite
  408.                     LDA $13                 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
  409.                     LSR A                   ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
  410.                     AND #$01                ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
  411.                     STA $01                 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
  412.                     TAY                     ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
  413.                     LDA $1C                 ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
  414.                     CLC                     ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
  415.                     ADC SPR_T12,y           ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
  416.                     ROL $00                 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
  417.                     CMP $D8,x               ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
  418.                     PHP                     ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
  419.                     LDA.W $001D             ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
  420.                     LSR $00                 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
  421.                     ADC SPR_T13,y           ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
  422.                     PLP                     ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
  423.                     SBC $14D4,x             ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
  424.                     STA $00                 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
  425.                     LDY $01                 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
  426.                     BEQ SPR_L38             ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
  427.                     EOR #$80                ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
  428.                     STA $00                 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
  429. SPR_L38             LDA $00                 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
  430.                     BPL RETURN_35           ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
  431.                     BMI ERASE_SPRITE        ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490
  432.  
  433. SUB_IS_OFF_SCREEN   LDA $15A0,x             ; \ if sprite is on screen, accumulator = 0
  434.                     ORA $186C,x             ; |  
  435.                     RTS                     ; / return
  436.  
  437. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  438. ; SUB_VERT_POS
  439. ; This routine determines if Mario is above or below the sprite.  It sets the Y register
  440. ; to the direction such that the sprite would face Mario
  441. ; It is ripped from $03B829
  442. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  443.  
  444. SUB_VERT_POS        LDY #$00               ;A:25A1 X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizCHC:0130 VC:085 00 FL:924
  445.                     LDA $96                ;A:25A1 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdiZCHC:0146 VC:085 00 FL:924
  446.                     SEC                    ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0170 VC:085 00 FL:924
  447.                     SBC $D8,x              ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0184 VC:085 00 FL:924
  448.                     CLC
  449.                     ADC #$20
  450.                     STA $0E                ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0214 VC:085 00 FL:924
  451.                     LDA $97                ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0238 VC:085 00 FL:924
  452.                     SBC $14D4,x            ;A:2501 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizcHC:0262 VC:085 00 FL:924
  453.                     BPL SPR_L11            ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0294 VC:085 00 FL:924
  454.                     INY                    ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0310 VC:085 00 FL:924
  455. SPR_L11             RTS                    ;A:25FF X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizcHC:0324 VC:085 00 FL:924
  456.  
  457.  
  458. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  459. ; SUB_HORZ_POS
  460. ; This routine determines which side of the sprite Mario is on.  It sets the Y register
  461. ; to the direction such that the sprite would face Mario
  462. ; It is ripped from $03B817
  463. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  464.  
  465. 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
  466.                     LDA $94                 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  467.                     SEC                     ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  468.                     SBC $E4,x               ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  469.                     STA $0F                 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  470.                     LDA $95                 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  471.                     SBC $14E0,x             ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  472.                     BPL SPR_L16             ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  473.                     INY                     ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  474. SPR_L16             RTS                     ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement