Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;
- ; Ceiling Thwimp
- ; by Mandew
- ; based on mikeyk's Thwimp disassembly
- ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; DEFINES
- !MaxFallSpeed = $C0
- !JumpSpeed = #$60
- ; GRAPHICS
- !Tile = $A2
- ; SPRITE TABLES
- !SpriteYSpeed = !AA
- !SpriteXSpeed = !B6
- !SpriteBehavior = !C2
- !SpriteStatus = !14C8
- !SpriteStunTimer = !1528
- !SpriteObjectsStatus = !1588
- !SpriteSlopeStatus = !15B8
- !SpriteYPosLo = !D8
- !SpriteYPosHi = !14D4
- ; ENGINE
- !LockFlag = $9D
- ; ROUTINES
- !MarioInteract = $01A7DC
- !UpdateYPos = $01801A
- !UpdateXPos = $018022
- !ObjectsInteract = $019138
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; CODE START
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- print "INIT ",pc
- RTL
- print "MAIN ",pc
- PHB
- PHK
- PLB
- JSR MainCode
- PLB
- RTL
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Main
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- Return:
- LDA #$01 ;x movement related
- JSL $018042 ; I don't know what this is for, but it sounds important
- RTS
- MainCode:
- JSR DrawGFX
- LDA !SpriteStatus,x
- CMP #$08
- BNE Return
- LDA !LockFlag
- BNE Return
- LDY #$00
- %SubOffScreen()
- JSL !MarioInteract
- JSL !UpdateYPos
- JSL !UpdateXPos
- JSL !ObjectsInteract
- LDA !SpriteYSpeed,x
- ;BEQ YoureFine
- BPL GoingDownwards
- ;YoureFine:
- CMP #$C0
- BCC MaximumSpeed
- SEC
- SBC #$08
- BRA CheckCeilings
- GoingDownwards:
- SEC
- SBC #$03
- BRA CheckCeilings
- MaximumSpeed:
- LDA #$C0
- CheckCeilings:
- STA !SpriteYSpeed,x
- LDA !SpriteObjectsStatus,x
- AND #$04
- BEQ CheckFloors
- LDA #$F0
- STA !SpriteYSpeed,x
- CheckFloors:
- LDA !SpriteObjectsStatus,x
- AND #$08
- BEQ Return2
- LDA !SpriteYSpeed,x
- BPL NotShtick
- Shtick:
- STZ !SpriteXSpeed,x
- STZ !SpriteYSpeed,x
- JSR CeilingShtick
- NotShtick:
- LDA !SpriteStunTimer,x
- BEQ SetTimer ; If this branches, that means the timer hasn't been set yet.
- DEC
- STA !SpriteStunTimer,x
- BNE Return2
- LDA #$60
- STA !SpriteYSpeed,x
- INC !SpriteBehavior,x
- LDA !SpriteBehavior,x
- LSR
- LDA #$10
- BCC GoingRight
- GoingLeft:
- LDA #$F0
- GoingRight:
- STA !SpriteXSpeed,x
- BRA Return2
- SetTimer:
- LDA #$01 ;
- STA $1DF9|!Base2 ; Play 'thump' sound (Thwimp has landed)
- LDA #$10
- STA !SpriteStunTimer,x ; Set timer for next jump
- Return2:
- LDA #$01 ;x movement related
- JSL $018042 ; I don't know what this is for, but it sounds important
- RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;
- ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- CeilingShtick:
- LDA !SpriteYPosLo,x
- AND #$F0
- CLC
- ADC #$0E
- STA !SpriteYPosLo,x
- LDA !SpriteYPosHi,x
- ADC #$00
- STA !SpriteYPosHi,x
- RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Sub_9A04
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- Sub_9A04:
- LDA !SpriteObjectsStatus,x
- BMI Sub_9A04_L1
- LDA #$00
- LDY !SpriteSlopeStatus,x
- BEQ Sub_9A04_L2
- Sub_9A04_L1:
- LDA #$E8
- Sub_9A04_L2:
- STA !SpriteYSpeed,x
- RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; GENERIC GRAPHICS ROUTINE
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- DrawGFX: %GetDrawInfo() ; after: Y = index to sprite OAM ($300)
- ; $00 = sprite x position relative to screen boarder
- ; $01 = sprite y position relative to screen boarder
- LDA $00 ; set x position of the tile
- STA $0300|!Base2,y
- LDA $01 ; set y position of the tile
- STA $0301|!Base2,y
- LDA #!Tile
- STA $0302|!Base2,y
- LDA !15F6,x ; get sprite palette info
- ORA $64 ; add in the priority bits from the level settings
- STA $0303|!Base2,y ; set properties
- LDY #$00 ; #$02 means the tiles are 16x16
- LDA #$00 ; This means we drew one tile
- JSL $01B7B3
- RTS
Add Comment
Please, Sign In to add comment