Erik557

Untitled

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