Advertisement
Erik557

Untitled

Jun 11th, 2016
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;; Foliage the Para-Plant
  3. ;; For Morton's Empire
  4. ;;;;;;;;;;;;;;;;;;;;;;;;;
  5.  
  6. !RAM_SprClipXDisp = $7FABAA     ; 12 bytes of free RAM used for the X displacement of a custom sprite clipping field
  7. !RAM_SprClipYDisp = $7FABB6     ; 12 bytes of free RAM used for the Y displacement of a custom sprite clipping field
  8. !RAM_SprClipWidth = $7FABC2     ; 12 bytes of free RAM used for the width of a custom sprite clipping field
  9. !RAM_SprClipHeight = $7FABCE        ; 12 bytes of free RAM used for the height of a custom sprite clipping field
  10.  
  11. ;;; INIT Routine wrapper
  12. print "INIT ",pc
  13.     LDA #$FF            ; |
  14.     STA $15AC,x         ;/
  15.  
  16.     STZ $1528,x         ;/
  17.     STZ $18BB
  18.     STZ $18B4
  19.    
  20.     LDA #$00
  21.     STA !RAM_SprClipXDisp,x
  22.     LDA #$00
  23.     STA !RAM_SprClipYDisp,x
  24.    
  25.     LDA #32
  26.     STA !RAM_SprClipWidth,x
  27.     LDA #48
  28.     STA !RAM_SprClipHeight,x
  29. RTL
  30.  
  31. ;;; Main Routine wrapper
  32. print "MAIN ",pc
  33.     PHB
  34.     PHK
  35.     PLB
  36.     JSR MainRt
  37.     PLB
  38. RTL
  39.  
  40. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  41. ;;Main routine
  42. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  43.  
  44. MainRt:
  45.     JSR SubGFX
  46.  
  47.     LDA $1528,x
  48.     CMP #$04
  49.     BNE .Normal
  50.     LDY $1594,x
  51.     LDA .DeadYSpd,y
  52.     STA $AA,x
  53.     JSL $01802A
  54.    
  55.     LDA $14D4,x
  56.     BEQ .Return
  57.     LDA $D8,x
  58.     CMP #$21
  59.     BCS .Return
  60.  
  61.     LDA $15AC,x
  62.     BNE +
  63.     LDA #$35
  64.     STA $15AC,x
  65. +
  66.     LDA #$01
  67.     STA $1594,x
  68.     LDA #$23
  69.     STA $1DF9
  70.    
  71.     LDA $15AC,x
  72.     CMP #$04
  73.     BCS .Return
  74.  
  75.     JSR KillSprites
  76.    
  77.     LDA #$01
  78.     STA $18B4
  79.     LDA #$02
  80.     STA $1594,x
  81.    
  82.     LDA #$80
  83.     STA $1DFB
  84.     LDA #$FF
  85.     STA $1493 ; activate "end level" flag
  86.     LDA #$00
  87.     STA $141C ; normal path
  88.     LDA #$0B
  89.     STA $71
  90. .Return
  91.     RTS
  92.    
  93. .DeadYSpd
  94.     db $F0,$00,$40
  95.    
  96. .Normal
  97.     LDA $14C8,x         ;\ Return if status ain't normal
  98.     CMP #$08            ; |
  99.     BNE .Return         ;/
  100.     LDA $9D             ;\ If sprites locked, return
  101.     BNE .Return         ;/
  102.    
  103.     JSL $01A7DC
  104.     BCC .NoInteraction
  105.  
  106.     LDA $7D
  107.     BMI +
  108.  
  109.     LDA $140D
  110.     ORA $187A
  111.     BNE .SpinJump
  112. +
  113.     JSL $00F5B7
  114.     BRA .NoInteraction
  115. .SpinJump
  116.     LDA #$02
  117.     STA $1DF9
  118.    
  119.     JSL $01AA33
  120.     JSL $01AB99
  121. .NoInteraction
  122.     LDA $C2,x           ; Set pointers
  123.     ASL
  124.     TAX
  125.     JMP (pointers,x)
  126.    
  127. pointers:
  128.     dw Init
  129.     dw SetXPos
  130.     dw Fireballs
  131.     dw Bombs
  132.     dw FireAttack
  133.     dw Hit
  134.  
  135. YSpeed:
  136.     db $FA,$EC
  137. FastY:
  138.     db $F0,$DC
  139.    
  140. ;===================================================
  141. ; State 0: Facing Mario
  142.   Init:
  143. ;===================================================
  144.    
  145.     LDX $15E9
  146.    
  147.     LDA $15AC,x
  148.     BEQ .IncreaseState
  149.  
  150.     STZ $76
  151.     STZ $7B
  152.     STZ $7D
  153.     LDA #$B5
  154.     STA $13E0
  155.    
  156.     LDY $1594,x
  157.     LDA YSpeed,y
  158.     STA $AA,x
  159.     JSL $01802A
  160.    
  161.     LDA $15AC,x
  162.     CMP #$7F
  163.     BCS +
  164.     LDA #$01
  165.     STA $1594,x
  166. +
  167.     BRA .Return
  168. .IncreaseState
  169.     LDA #$04
  170.     STA $1DF9
  171.     INC $C2,x
  172. .Return
  173.     RTS
  174.  
  175. ;===================================================
  176. ; State 1: Sets the X positions, choose an attack
  177.   SetXPos:
  178. ;===================================================
  179.  
  180.     LDX $15E9
  181.     STZ $1594,x
  182.    
  183.     LDA $1528,x
  184.     CMP #$02
  185.     BCC .NormalTimers
  186.     LDA #$A5
  187.     STA $15AC,x
  188.     LDA #$2F
  189.     STA $154C,x
  190.     BRA +
  191. .NormalTimers
  192.     LDA #$D5
  193.     STA $15AC,x
  194.     LDA #$45
  195.     STA $154C,x
  196. +
  197.     LDA #$02
  198.     JSR Random
  199.     TAY
  200.     LDA .XPos,y
  201.     STA $E4,x
  202.     LDA #$01
  203.     STA $14D4,x
  204.     LDA #$80
  205.     STA $D8,x
  206.  
  207.     LDA $1528,x
  208.     CMP #$02
  209.     BCC .NotAngry
  210.     LDA #$02
  211.     BRA +
  212. .NotAngry
  213.     LDA #$01
  214. +   JSR Random
  215.     TAY
  216.     LDA .Attacks,y
  217.     CMP #$04
  218.     BNE .SetAttack
  219.     LDA #$D0
  220.     STA $D8,x
  221.     STZ $14D4,x
  222.     LDA #$04
  223. .SetAttack
  224.     STA $C2,x
  225.     RTS
  226.  
  227. .Attacks
  228.     db $02,$03,$04
  229. .XPos
  230.     db $30,$70,$B0
  231.    
  232. ;===================================================
  233. ; State 2: Actual attacks
  234.   Fireballs:
  235.   Bombs:
  236. ;===================================================
  237.  
  238.     LDX $15E9
  239.    
  240.     LDA $15AC,x
  241.     BEQ .SetState
  242.    
  243.     LDY $1594,x
  244.     LDA $1528,x
  245.     CMP #$02
  246.     BCC .NormalSpeed
  247.     LDA FastY,y
  248.     BRA +
  249. .NormalSpeed
  250.     LDA YSpeed,y
  251. +   STA $AA,x
  252.     JSL $01802A
  253.    
  254.     LDA $15AC,x
  255.     CMP #$7F
  256.     BCS +
  257.     LDA #$01
  258.     STA $1594,x
  259. +
  260.     LDA $1564,x
  261.     BNE .Immunity
  262.     JSR BobOmb
  263. .Immunity
  264.     LDA $C2,x
  265.     CMP #$02
  266.     BEQ .SpitFire
  267.  
  268.     LDA $154C,x
  269.     BNE .Return
  270.    
  271.     LDA $1528,x
  272.     CMP #$02
  273.     BCC .NormalSpawn
  274.     LDA #$40
  275.     BRA +
  276. .NormalSpawn
  277.     LDY $18BB
  278.     LDA .Sprite,y
  279. +   JSR Spawn
  280.     BRA .Return
  281.  
  282. .Sprite
  283.     db $14,$40
  284.  
  285. .SpitFire
  286.     LDA $154C,x
  287.     BNE .Return
  288.     LDA #$10
  289.     JSR SpitFire
  290.     LDA #$F0
  291.     JSR SpitFire
  292.     BRA .Return
  293.  
  294. .SetState
  295.     LDA #$04
  296.     STA $1DF9
  297.     LDA #$01
  298.     STA $C2,x
  299. .Return
  300.     RTS
  301.  
  302. ;=======================================================
  303. ; Part of State 2 (Only executes when hit twice or more)
  304.   FireAttack:
  305. ;=======================================================
  306.  
  307.     LDX $15E9
  308.    
  309.     LDA $15AC,x
  310.     BEQ .SetState
  311.    
  312.     LDY $1594,x
  313.     LDA .DownY,y
  314.     STA $AA,x
  315.     JSL $01802A
  316.    
  317.     LDA $15AC,x
  318.     CMP #$7F
  319.     BCS +
  320.     LDA #$01
  321.     STA $1594,x
  322. +
  323.     LDA $1564,x
  324.     BNE .Immunity
  325.     JSR BobOmb
  326. .Immunity
  327.     LDA $154C,x
  328.     BNE .Return
  329.     JSR FireSpawn
  330.     BRA .Return
  331.    
  332. .SetState
  333.     LDA #$01
  334.     STA $C2,x
  335.     LDA #$04
  336.     STA $1DF9
  337. .Return
  338.     RTS
  339.  
  340. .DownY
  341.     db $10,$24
  342.    
  343. ;===================================================
  344. ; State 3: Hit
  345.   Hit:
  346. ;===================================================
  347.  
  348.     LDX $15E9
  349.    
  350.     LDA $14D4,x
  351.     BNE +
  352.     LDA $D8,x
  353.     CMP #$C1
  354.     BCC .Done
  355. +   LDY $1594,x
  356.     LDA .YSpeed,y
  357.     STA $AA,x
  358.     JSL $01802A
  359.    
  360.     LDA $15AC,x
  361.     CMP #$40
  362.     BCS .Return
  363.     LDA #$01
  364.     STA $1594,x
  365.     BRA .Return
  366.    
  367. .Done
  368.     JSR KillSprites
  369.     LDA #$04
  370.     STA $1DF9
  371.     LDA #$01
  372.     STA $C2,x
  373. .Return
  374.     RTS
  375.  
  376. .YSpeed
  377.     db $00,$E9
  378.  
  379. ;=========================================
  380. ; Misc Routines
  381. ;=========================================
  382.  
  383. ;==================================================================
  384. ; Spit Fireball Subroutine
  385. ;==================================================================
  386. SpitFire:
  387.     XBA
  388.    
  389.     LDA $1528,x
  390.     CMP #$02
  391.     BCC .NormalTimer
  392.     LDA #$35
  393.     STA $154C,x
  394.     BRA +
  395. .NormalTimer
  396.     LDA #$50                ;\ Set a timer
  397.     STA $154C,x             ;/
  398. +
  399.     LDA #$06
  400.     STA $1DFC
  401.        
  402.     LDY #$07                ; 8 extended sprite indexes to loop through
  403. .Loop
  404.     LDA $170B,y             ; check this slot
  405.     BEQ .Spawn              ; if the slot is free, we can use it for a fireball
  406.     DEY                     ; if not, decrement the index
  407.     BPL .Loop               ; and try again
  408.     RTS
  409. .Spawn
  410.     LDA $1528,x
  411.     CMP #$02
  412.     BCC .NormalFire
  413.     LDA #$04                ; extended sprite number = 0B
  414.     BRA +
  415. .NormalFire
  416.     LDA #$0B                ; extended sprite number = 0B
  417. +   STA $170B,y             ; piranha fireball
  418.    
  419.     LDA $E4,x               ; sprite X position
  420.     CLC
  421.     ADC #8
  422.     STA $171F,y
  423.     LDA $14E0,x
  424.     STA $1733,y
  425.  
  426.     LDA $D8,x
  427.     STA $1715,y             ; same Y position as the plant
  428.     LDA $14D4,x
  429.     STA $1729,y
  430.  
  431.     LDA #$D0                ; extended sprite Y speed = D0
  432.     STA $173D,y
  433.     XBA
  434.     STA $1747,y
  435.     RTS
  436.  
  437. ;============================
  438. ; Spawn the fireball
  439. FireSpawn:
  440. ;============================
  441.  
  442.     LDA #$C0
  443.     STA $154C,x
  444.    
  445.     LDA #$06
  446.     STA $1DFC
  447.    
  448.     LDA $186C,x
  449.     BNE EndSpawn
  450.  
  451.     JSL $02A9DE
  452.     BMI EndSpawn
  453.     LDA #$01                ; Sprite state ($14C8,x).
  454.     STA $14C8,y
  455.     PHX
  456.     TYX
  457.     LDA #$6A                ; This the sprite number to spawn.
  458.     STA $7FAB9E,x
  459.     PLX
  460.     LDA $E4,x
  461.     CLC
  462.     ADC #8
  463.     STA $00E4,y
  464.     LDA $14E0,x
  465.     STA $14E0,y
  466.     LDA $D8,x
  467.     CLC
  468.     ADC #24
  469.     STA $00D8,y
  470.     LDA $14D4,x
  471.     STA $14D4,y
  472.     PHX
  473.     TYX
  474.     JSL $07F7D2
  475.     JSL $0187A7
  476.     LDA #$08
  477.     STA $7FAB10,x
  478.     PLX
  479. EndSpawn:
  480.     RTS
  481.    
  482. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  483. ;; Spawn Sprite
  484. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  485. SprXPos: db $10,$D0
  486. Spawn:
  487.     XBA
  488.     LDA #$C0
  489.     STA $154C,x
  490.  
  491.     LDA $186C,x
  492.     BNE .EndSpawn
  493.     JSL $02A9DE
  494.     BMI .EndSpawn
  495.     LDA #$08
  496.     STA $14C8,y
  497.     XBA
  498.     STA $009E,y
  499.     LDA #$01
  500.     JSR Random
  501.     TAX
  502.     LDA SprXPos,x
  503.     STA $00E4,y
  504.     LDA $14E0,x
  505.     STA $14E0,y
  506.     LDA #$00
  507.     STA $00D8,y
  508.     LDA #$01
  509.     STA $14D4,y
  510.     PHX
  511.     TYX
  512.     JSL $07F7D2
  513.     PLX
  514.     LDA $18BB
  515.     BNE +
  516.     INC $18BB
  517. .EndSpawn
  518.     RTS
  519. +   DEC $18BB
  520.     BRA .EndSpawn
  521.  
  522. ;============;
  523. ;RNG by 1024
  524. ;============;
  525.  
  526. Random:
  527.     PHX
  528.     PHP
  529.     SEP #$30
  530.     PHA
  531.     JSL $01ACF9
  532.     PLX
  533.     CPX #$FF
  534.     BNE NORMALRT
  535.     LDA $148D
  536.     BRA ENDRANDOM
  537. NORMALRT:
  538.     INX
  539.     LDA $148D
  540.     STA $4202
  541.     STX $4203
  542.     NOP #4
  543.     LDA $4217  
  544. ENDRANDOM:
  545.     PLP
  546.     PLX
  547.     RTS
  548.    
  549. ;============================
  550. KillSprites:
  551. ;============================
  552.  
  553.     LDY #$09                    ; setup loop
  554. -   LDA $14C8,y                 ;\ if sprite non-existent,
  555.     BEQ ++                      ;/ branch
  556.  
  557.     LDA $1528,x
  558.     CMP #$03
  559.     BEQ .Return
  560.     CMP #$04
  561.     BEQ .NormalKill
  562.     LDA.w $9E,y
  563.     CMP #$14
  564.     BEQ +
  565.     CMP #$13
  566.     BNE ++
  567. +   PHX : BRA .Kill
  568. .NormalKill
  569.     LDA.w $9E,y                 ;
  570.     CMP #$A9                    ;\ if sprite is Reznor,
  571.     BEQ ++                      ;/ branch
  572.     CMP #$29                    ;\ if sprite is Koopa Kid,
  573.     BEQ ++                      ;/ branch
  574.     CMP #$A0                    ;\ if sprite is Bowser,
  575.     BEQ ++                      ;/ branch
  576.     CMP #$C5                    ;\ if sprite is Big Boo Boss,
  577.     BEQ ++                      ;/ branch
  578.     LDA $7FAB9E,x               ;\ if custom sprite is same number as this one (i.e. one of the dummies),
  579.     PHX                         ; |
  580.     TYX                         ; |
  581.     CMP $7FAB9E,x               ; |
  582.     BEQ +                       ;/ branch
  583. .Kill
  584.     LDA #$04                    ;\ set sprite status (killed by spinjump)
  585.     STA $14C8,y                 ;/
  586.     LDA #$1F                    ;\ set time to show smoke cloud
  587.     STA $1540,y                 ;/
  588. +   PLX
  589. ++  DEY                         ; decrease sprite index
  590.     BPL -                       ; if still sprites left to check, branch
  591. .Return
  592.     RTS                         ; return
  593.  
  594. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  595. ;; Be killed by bob-ombs
  596. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  597. BobOmb:
  598.         LDY #$09                ; \ Loop over sprites:
  599. --
  600.         LDA $1534,y             ; \ Bomb-omb is exploding!
  601.         BNE .HandleExplode      ; /
  602. -
  603.         DEY                     ; |
  604.         BPL --                  ; /
  605. .ReturnBob
  606.         RTS                     ; Return
  607.  
  608. .HandleExplode
  609.         LDA $00E4,Y             ; \
  610.         SEC                     ; | This is all mikey's code...
  611.         SBC #$1A                ; |
  612.         STA $00                 ; |
  613.         LDA $14E0,Y             ; | ...I don't know what it does...
  614.         SBC #$00                ; |
  615.         STA $08                 ; |
  616.         LDA #$44                ; | ...lols...
  617.         STA $02                 ; |
  618.         LDA $00D8,Y             ; |
  619.         STA $01                 ; | ...but it seems to detect item proximity...
  620.         LDA $14D4,Y             ; |
  621.         STA $09                 ; |
  622.         LDA #$10                ; | ...so I'm using it for the bob-omb check.
  623.         STA $03                 ; |
  624.         JSL $03B69F             ; |
  625.         JSL $03B72B             ; /
  626.         BCC -                   ; If not close to bomb, go back to main loop
  627.        
  628.         LDA $14C8,y             ; \
  629.         CMP #$08                ; | If the bob-omb is dead, don't count it (this is important!!)
  630.         BNE .ReturnBob          ; /
  631.        
  632.         LDA #$A0                ; \ Grant brief immunity to bombs
  633.         STA $1564,x     ; /
  634.         INC $1528,x     ; Increase hit counter
  635.        
  636.         LDA #$6F
  637.         STA $15AC,x
  638.         LDA #$28                ; \ Play hit sound
  639.         STA $1DFC               ; /
  640.         STZ $1594,x
  641.         LDA #$05
  642.         STA $C2,x
  643.         RTS
  644.  
  645. ;====================================================
  646. ;================Graphics Routine====================
  647. ;====================================================
  648.  
  649. SubGFX:
  650.     JSR GetDrawInfo
  651.    
  652.     LDA $14
  653.     LSR #3
  654.     AND #$01
  655.     ASL #3
  656.     STA $03
  657.    
  658.     PHX
  659.     LDX #$05
  660. .Loop
  661.     PHX
  662.     TXA
  663.     ORA $03
  664.     TAX
  665.    
  666.     LDA $00
  667.     CLC
  668.     ADC .XDisp,x
  669.     STA $0300,y
  670.    
  671.     LDA $01
  672.     CLC
  673.     ADC .YDisp,x
  674.     STA $0301,y
  675.    
  676.     PHX
  677.     LDX $15E9
  678.     LDA $C2,x
  679.     CMP #$04
  680.     BEQ .FlipTilemap
  681.     LDA $18B4
  682.     BNE .FlipTilemap
  683.     PLX
  684.     LDA .Tilemap,x
  685.     BRA +
  686. .FlipTilemap
  687.     PLX
  688.     LDA .FlippedTilemap,x
  689. +   STA $0302,y
  690.    
  691.     PHX
  692.     LDX $15E9
  693.     LDA $C2,x
  694.     CMP #$04
  695.     BEQ .FlipProps
  696.     LDA $18B4
  697.     BNE .FlipProps
  698.     LDA $C2,x
  699.     CMP #$05
  700.     BNE .NormalProps
  701.     PLX
  702.     LDA .HitProps,x
  703.     BRA +
  704. .FlipProps
  705.     PLX
  706.     LDA .FlippedProps,x
  707.     BRA +
  708. .NormalProps
  709.     PLX
  710.     LDA .Props,x
  711. +   STA $0303,y
  712.    
  713.     INY #4
  714.     PLX
  715.     DEX
  716.     BPL .Loop
  717.     PLX
  718.    
  719.     LDY #$02
  720.     LDA #$05
  721.     JSL $01B7B3
  722.     RTS
  723.    
  724. .Tilemap
  725.     db $C0,$E0,$A0,$EE,$88,$8A,$00,$00
  726.     db $C4,$86,$A4,$A6,$8C,$8E,$00,$00
  727. .FlippedTilemap
  728.     db $88,$8A,$A0,$EE,$C0,$E0,$00,$00
  729.     db $8C,$8E,$A4,$A6,$C4,$86,$00,$00
  730. .XDisp
  731.     db $00,$10,$00,$10,$00,$10,$00,$00
  732.     db $00,$10,$00,$10,$00,$10,$00,$00
  733. .YDisp
  734.     db $00,$00,$10,$10,$20,$20,$00,$00
  735.     db $00,$00,$10,$10,$20,$20,$00,$00
  736. .FlippedProps
  737.     db $AB,$AB,$A9,$A9,$A9,$A9,$00,$00
  738.     db $AB,$AB,$A9,$A9,$A9,$A9,$00,$00
  739. .Props
  740.     db $29,$29,$29,$29,$2B,$2B,$00,$00
  741.     db $29,$29,$29,$29,$2B,$2B,$00,$00
  742. .HitProps
  743.     db $25,$25,$25,$25,$2B,$2B,$00,$00 
  744.     db $25,$25,$25,$25,$2B,$2B,$00,$00
  745. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  746. ; GET_DRAW_INFO
  747. ; This is a helper for the graphics routine.  It sets off screen flags, and sets up
  748. ; variables.  It will return with the following:
  749. ;
  750. ;       Y = index to sprite OAM ($300)
  751. ;       $00 = sprite x position relative to screen boarder
  752. ;       $01 = sprite y position relative to screen boarder  
  753. ;
  754. ; It is adapted from the subroutine at $03B760
  755. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  756.  
  757. SPR_T1:              db $0C,$1C
  758. SPR_T2:              db $01,$02
  759.  
  760. GetDrawInfo:
  761.     STZ $186C,x             ; reset sprite offscreen flag, vertical
  762.     STZ $15A0,x             ; reset sprite offscreen flag, horizontal
  763.     LDA $E4,x               ; \
  764.     CMP $1A                 ;  | set horizontal offscreen if necessary
  765.     LDA $14E0,x             ;  |
  766.     SBC $1B                 ;  |
  767.     BEQ .ON_SCREEN_X        ;  |
  768.     INC $15A0,x             ; /
  769.  
  770. .ON_SCREEN_X
  771.     LDA $14E0,x             ; \
  772.     XBA                     ;  |
  773.     LDA $E4,x               ;  |
  774.     REP #$20                ;  |
  775.     SEC                     ;  |
  776.     SBC $1A                 ;  | mark sprite invalid if far enough off screen
  777.     CLC                     ;  |
  778.     ADC.w #$0040            ;  |
  779.     CMP.w #$0180            ;  |
  780.     SEP #$20                ;  |
  781.     ROL A                   ;  |
  782.     AND #$01                ;  |
  783.     STA $15C4,x             ; /
  784.     BNE .INVALID           ;
  785.    
  786.     LDY #$00                ; \ set up loop:
  787.     LDA $1662,x             ;  |
  788.     AND #$20                ;  | if not smushed (1662 & 0x20), go through loop twice
  789.     BEQ .ON_SCREEN_LOOP     ;  | else, go through loop once
  790.     INY                     ; /
  791. .ON_SCREEN_LOOP
  792.     LDA $D8,x               ; \
  793.     CLC                     ;  | set vertical offscreen if necessary
  794.     ADC SPR_T1,y            ;  |
  795.     PHP                     ;  |
  796.     CMP $1C                 ;  | (vert screen boundry)
  797.     ROL $00                 ;  |
  798.     PLP                     ;  |
  799.     LDA $14D4,x             ;  |
  800.     ADC #$00                ;  |
  801.     LSR $00                 ;  |
  802.     SBC $1D                 ;  |
  803.     BEQ .ON_SCREEN_Y        ;  |
  804.     LDA $186C,x             ;  | (vert offscreen)
  805.     ORA SPR_T2,y            ;  |
  806.     STA $186C,x             ;  |
  807. .ON_SCREEN_Y
  808.     DEY                     ;  |
  809.     BPL .ON_SCREEN_LOOP     ; /
  810.  
  811.     LDY $15EA,x             ; get offset to sprite OAM
  812.     LDA $E4,x               ; \
  813.     SEC                     ;  |
  814.     SBC $1A                 ;  | $00 = sprite x position relative to screen boarder
  815.     STA $00                 ; /
  816.     LDA $D8,x               ; \
  817.     SEC                     ;  |
  818.     SBC $1C                 ;  | $01 = sprite y position relative to screen boarder
  819.     STA $01                 ; /
  820.     RTS  ; return
  821.  
  822. .INVALID
  823.     PLA                     ; \ return from *main gfx routine* subroutine...
  824.     PLA                     ;  |    ...(not just this subroutine)
  825.     RTS                     ; /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement