new sprite function lib cleanup

This commit is contained in:
scawful
2024-06-27 19:04:02 -04:00
parent 99cf2085ac
commit ce0b6772cc

View File

@@ -1,26 +1,22 @@
; ========================================================= ; =========================================================
;Long function, return Carry Set if Active ; return carry set if active
Sprite_CheckActive: Sprite_CheckActive:
{ {
; Deactivates the sprite in certain situations ; Deactivates the sprite in certain situations
LDA $0DD0, X : CMP.b #$09 : BNE .inactive LDA $0DD0, X : CMP.b #$09 : BNE .inactive
LDA $0FC1 : BNE .inactive LDA $0FC1 : BNE .inactive
LDA $11 : BNE .inactive
LDA $11 : BNE .inactive LDA $0CAA, X : BMI .active
LDA $0F00, X : BEQ .active
LDA $0CAA, X : BMI .active
LDA $0F00, X : BEQ .active
.inactive .inactive
CLC CLC
RTL RTL
.active .active
SEC SEC
RTL RTL
} }
; ========================================================= ; =========================================================
@@ -28,23 +24,23 @@ Sprite_CheckActive:
Sprite_MoveHoriz: Sprite_MoveHoriz:
{ {
LDA.w $0D50, X : BEQ .no_velocity LDA.w SprXSpeed, X : BEQ .no_velocity
ASL : ASL : ASL : ASL ASL : ASL : ASL : ASL
CLC : ADC.w $0D70,X : STA.w $0D70,X CLC : ADC.w $0D70, X : STA.w $0D70, X
LDY.b #$00 LDY.b #$00
LDA.w $0D50, X LDA.w SprXSpeed, X
PHP : LSR : LSR : LSR : LSR : PLP PHP : LSR : LSR : LSR : LSR : PLP
BPL ++ BPL ++
ORA.b #$F0 ORA.b #$F0
DEY DEY
++ ADC.w $0D10,X : STA.w $0D10,X ++ ADC.w $0D10, X : STA.w $0D10, X
TYA : ADC.w $0D30,X : STA.w $0D30,X TYA : ADC.w $0D30, X : STA.w $0D30, X
.no_velocity .no_velocity
RTL RTL
} }
; ========================================================= ; =========================================================
@@ -61,23 +57,23 @@ Sprite_Move:
Sprite_MoveVert: Sprite_MoveVert:
{ {
LDA.w $0D40, X : BEQ .no_velocity LDA.w SprYSpeed, X : BEQ .no_velocity
ASL : ASL : ASL : ASL ASL : ASL : ASL : ASL
CLC : ADC.w $0D60,X : STA.w $0D60,X CLC : ADC.w $0D60,X : STA.w $0D60,X
LDY.b #$00 LDY.b #$00
LDA.w $0D40, X LDA.w SprYSpeed, X
PHP : LSR : LSR : LSR : LSR : PLP PHP : LSR : LSR : LSR : LSR : PLP
BPL ++ BPL ++
ORA.b #$F0 ORA.b #$F0
DEY DEY
++ ADC.w $0D00,X : STA.w $0D00,X ++ ADC.w $0D00,X : STA.w $0D00,X
TYA : ADC.w $0D20,X : STA.w $0D20,X TYA : ADC.w $0D20,X : STA.w $0D20,X
.no_velocity .no_velocity
RTL RTL
} }
; ========================================================= ; =========================================================
@@ -86,19 +82,17 @@ Sprite_MoveVert:
Sprite_MoveZ: Sprite_MoveZ:
Sprite_MoveAltitude: Sprite_MoveAltitude:
{ {
LDA.w $0F80, X : ASL : ASL : ASL : ASL LDA.w $0F80, X : ASL : ASL : ASL : ASL
CLC : ADC.w $0F90,X : STA.w $0F90,X CLC : ADC.w $0F90, X : STA.w $0F90, X
LDA.w $0F80, X : PHP
LSR : LSR : LSR : LSR
PLP : BPL .positive
LDA.w $0F80, X : PHP
LSR : LSR : LSR : LSR
PLP : BPL .positive
ORA.b #$F0 ORA.b #$F0
.positive .positive
ADC.w $0F70,X : STA.w $0F70,X ADC.w $0F70,X : STA.w $0F70,X
RTL RTL
} }
@@ -140,45 +134,51 @@ Sprite_BounceTowardPlayer:
; TODO: Use Y index for height ; TODO: Use Y index for height
Sprite_FloatTowardPlayer: Sprite_FloatTowardPlayer:
{ {
JSL Sprite_ApplySpeedTowardsPlayer JSL Sprite_ApplySpeedTowardsPlayer
; Update horizontal position ; Update horizontal position
JSL Sprite_MoveHoriz JSL Sprite_MoveHoriz
; Update vertical position ; Update vertical position
JSL Sprite_MoveVert JSL Sprite_MoveVert
; Check for tile collisions and adjust if necessary ; Check for tile collisions and adjust if necessary
JSL Sprite_CheckTileCollision JSL Sprite_CheckTileCollision
; Maintain altitude (float effect) ; Maintain altitude (float effect)
LDA #$10 : STA.w SprHeight, X LDA #$10 : STA.w SprHeight, X
JSL Sprite_MoveAltitude JSL Sprite_MoveAltitude
RTL RTL
} }
Sprite_FloatAwayFromPlayer: Sprite_FloatAwayFromPlayer:
{ {
LDA $0D50, X : EOR.b #$FF : INC : STA $0D50, X LDA SprXSpeed, X : EOR.b #$FF : INC : STA SprXSpeed, X
LDA $0D40, X : EOR.b #$FF : INC : STA $0D40, X LDA SprYSpeed, X : EOR.b #$FF : INC : STA SprYSpeed, X
JSL Sprite_MoveAltitude JSL Sprite_MoveAltitude
RTL RTL
} }
Sprite_BounceFromTileCollision: Sprite_BounceFromTileCollision:
{ {
JSL Sprite_CheckTileCollision : AND.b #$03 : BEQ ++ JSL Sprite_CheckTileCollision : AND.b #$03 : BEQ ++
LDA.w $0D50,X : EOR.b #$FF : INC : STA.w $0D50,X LDA.w SprXSpeed, X : EOR.b #$FF : INC : STA.w SprXSpeed, X
INC.w $0ED0, X INC.w $0ED0, X
++ LDA.w $0E70, X : AND.b #$0C : BEQ ++ ++ LDA.w $0E70, X : AND.b #$0C : BEQ ++
LDA.w $0D40,X : EOR.b #$FF : INC : STA.w $0D40,X LDA.w SprYSpeed, X : EOR.b #$FF : INC : STA.w SprYSpeed, X
INC.w $0ED0, X INC.w $0ED0, X
++ RTL
}
Sprite_ProjectSpeedRandomly:
{
++ RTL
} }
; ========================================================= ; =========================================================
@@ -254,38 +254,36 @@ DragPlayer:
Intro_Dungeon_Main: Intro_Dungeon_Main:
{ {
;test to see if we are at a place where a guardian is present LDA $0E20 : CMP.b #$92 : BNE .not_sprite_body_boss
LDA $0E20 : CMP.b #$92 : BNE .notGuardian LDA $0E30 : BEQ .not_sprite_body_boss
LDA $0E30 : BEQ .notGuardian LDA $1C : AND.b #$FE : STA $1C ;turn off BG2 (Body)
LDA $1C : AND.b #$FE : STA $1C ;turn off BG2 (Body) ; free ram used to check if the sprite ran this frame, if 0, it didn't run
LDA.b SpriteRanCheck : BEQ .didNotRun
LDA $1C : ORA.b #$01 : STA $1C ;turn on BG2 (Body)
;free ram used to check if the sprite ran this frame, if 0, it didn't run .didNotRun
LDA.b SpriteRanCheck : BEQ .didNotRun
LDA $1C : ORA.b #$01 : STA $1C ;turn on BG2 (Body) STZ.b SpriteRanCheck
.didNotRun .not_sprite_body_boss
STZ.b SpriteRanCheck
.notGuardian REP #$21 : LDA.w DungeonMainCheck : BNE .intro ;<- load that free ram you are using if it's not zero then we're doing intro thing
LDA $E2 : RTL ;return to normal intro
REP #$21 : LDA.w DungeonMainCheck : BNE .intro ;<- load that free ram you are using if it's not zero then we're doing intro thing .intro
LDA $E2 : RTL ;return to normal intro
.intro PLA ;Pop 2byte from stack
;skip all the BGs codes
PLA ;Pop 2byte from stack SEP #$20
;skip all the BGs codes PLA ;Pop 1 byte from the stack
JSL $07F0AC ; $3F0AC IN ROM. Handle the sprites of pushed blocks.
JSL $068328 ;Sprite_Main
JSL $0DA18E ;PlayerOam_Main
JSL $0DDB75 ;HUD.RefillLogicLong
SEP #$20 JML $0AFD0C ;FloorIndicator ; $57D0C IN ROM. Handles HUD floor indicator
PLA ;Pop 1 byte from the stack
JSL $07F0AC ; $3F0AC IN ROM. Handle the sprites of pushed blocks.
JSL $068328 ;Sprite_Main
JSL $0DA18E ;PlayerOam_Main
JSL $0DDB75 ;HUD.RefillLogicLong
JML $0AFD0C ;FloorIndicator ; $57D0C IN ROM. Handles HUD floor indicator
} }
;uses $00 as the Y coordinate and $02 as the X ;uses $00 as the Y coordinate and $02 as the X
@@ -298,26 +296,26 @@ MoveCamera:
BCS .CameraBelowPointY BCS .CameraBelowPointY
;CameraAbovePoint ;CameraAbovePoint
ADC.w #$0001 : STA $E8 : STA $E6 : STA $0122 : STA $0124 ;move the camera down by 1 ADC.w #$0001 : STA $E8 : STA $E6 : STA $0122 : STA $0124 ;move the camera down by 1
BRA .dontMoveY BRA .dontMoveY
.CameraBelowPointY .CameraBelowPointY
SEC : SBC.w #$0001 : STA $E8 : STA $E6 : STA $0122 : STA $0124 ;move the camera up by 1 SEC : SBC.w #$0001 : STA $E8 : STA $E6 : STA $0122 : STA $0124 ;move the camera up by 1
.dontMoveY .dontMoveY
;move the camera right or left until a point is reached ;move the camera right or left until a point is reached
LDA $E2 : CMP.w $02 : BEQ .dontMoveX ;if equals that point, dont move x LDA $E2 : CMP.w $02 : BEQ .dontMoveX ;if equals that point, dont move x
BCS .CameraBelowPointX ;left BCS .CameraBelowPointX ;left
;CameraAbovePoint ;right ;CameraAbovePoint ;right
ADC.w #$0001 : STA $E2 : STA $E0 : STA $011E : STA $0120 ;move the camera right by 1 ADC.w #$0001 : STA $E2 : STA $E0 : STA $011E : STA $0120 ;move the camera right by 1
BRA .dontMoveX BRA .dontMoveX
.CameraBelowPointX .CameraBelowPointX
SEC : SBC.w #$0001 : STA $E2 : STA $E0 : STA $011E : STA $0120 ;move the camera left by 1 SEC : SBC.w #$0001 : STA $E2 : STA $E0 : STA $011E : STA $0120 ;move the camera left by 1
.dontMoveX .dontMoveX
;if link is outside of a certain range of the camera, make him dissapear so he doesnt appear on the other side ;if link is outside of a certain range of the camera, make him dissapear so he doesnt appear on the other side
LDA $20 : SEC : SBC $E8 : CMP.w #$00E0 : BCS .MakeLinkInvisible LDA $20 : SEC : SBC $E8 : CMP.w #$00E0 : BCS .MakeLinkInvisible
@@ -327,7 +325,7 @@ MoveCamera:
LDA.b #$00 : STA $4B ;make link visible LDA.b #$00 : STA $4B ;make link visible
RTS RTS
.MakeLinkInvisible .MakeLinkInvisible
SEP #$20 SEP #$20
LDA.b #$0C : STA $4B ;make link invisible LDA.b #$0C : STA $4B ;make link invisible
@@ -361,81 +359,81 @@ MovieEffectE = $7EF90E ;0x01
SetupMovieEffect: SetupMovieEffect:
{ {
;setup HDMA RAM ;setup HDMA RAM
;Top Dark Row ;Top Dark Row
LDA.b #$01 : STA.l MovieEffect0 LDA.b #$01 : STA.l MovieEffect0
LDA.b #$00 : STA.l MovieEffect1 LDA.b #$00 : STA.l MovieEffect1
;Top Dark Row Buffer ;Top Dark Row Buffer
LDA.b #$1F : STA.l MovieEffect2 LDA.b #$1F : STA.l MovieEffect2
LDA.b #$0F : STA.l MovieEffect3 LDA.b #$0F : STA.l MovieEffect3
;Middle Unaffected Area ;Middle Unaffected Area
LDA.b #$50 : STA.l MovieEffect4 LDA.b #$50 : STA.l MovieEffect4
LDA.b #$0F : STA.l MovieEffect5 LDA.b #$0F : STA.l MovieEffect5
LDA.b #$50 : STA.l MovieEffect6 LDA.b #$50 : STA.l MovieEffect6
LDA.b #$0F : STA.l MovieEffect7 LDA.b #$0F : STA.l MovieEffect7
;Bottom Drak Row Buffer ;Bottom Drak Row Buffer
LDA.b #$1F : STA.l MovieEffect8 LDA.b #$1F : STA.l MovieEffect8
LDA.b #$0F : STA.l MovieEffect9 LDA.b #$0F : STA.l MovieEffect9
;Bottom Dark Row ;Bottom Dark Row
LDA.b #$01 : STA.l MovieEffectA LDA.b #$01 : STA.l MovieEffectA
LDA.b #$00 : STA.l MovieEffectB LDA.b #$00 : STA.l MovieEffectB
;Below screen ;Below screen
LDA.b #$20 : STA.l MovieEffectC LDA.b #$20 : STA.l MovieEffectC
LDA.b #$0F : STA.l MovieEffectD LDA.b #$0F : STA.l MovieEffectD
;End ;End
LDA.b #$00 : STA.l MovieEffectE LDA.b #$00 : STA.l MovieEffectE
;start timer ;start timer
LDA.b #$01 : STA.l MovieEffectTimer LDA.b #$01 : STA.l MovieEffectTimer
RTS RTS
} }
; ========================================================= ; =========================================================
MovieEffect: MovieEffect:
{ {
REP #$20 REP #$20
LDX #$00 : STX $4350 ;Set the transfer mode into 1 byte to 1 register LDX #$00 : STX $4350 ;Set the transfer mode into 1 byte to 1 register
LDX #$00 : STX $4351 ;Set register to 00 ($21 00) LDX #$00 : STX $4351 ;Set register to 00 ($21 00)
LDA.w #MovieEffectArray : STA $4352 ;set address of the hdma table LDA.w #MovieEffectArray : STA $4352 ;set address of the hdma table
LDX.b #MovieEffectBank : STX $4354 ;set the bank of HDMA table LDX.b #MovieEffectBank : STX $4354 ;set the bank of HDMA table
SEP #$20 SEP #$20
LDA.b #$20 : STA $9B ;Do the HDMA instead of $420C LDA.b #$20 : STA $9B ;Do the HDMA instead of $420C
; LDA $9B : ORA #$20 : STA $9B ; LDA $9B : ORA #$20 : STA $9B
; LDA.b #$02 : STA $13 ;controls the brightness of the screen ; LDA.b #$02 : STA $13 ;controls the brightness of the screen
RTS RTS
HDMATable: ;values cannot go above 80 or it will read as continuous mode HDMATable: ;values cannot go above 80 or it will read as continuous mode
db $20, $00 ;for $20 line set screen brightness to 0 db $20, $00 ;for $20 line set screen brightness to 0
db $50, $0F ;for $A0 line set screen brightness to 15 full db $50, $0F ;for $A0 line set screen brightness to 15 full
db $50, $0F ;for $A0 line set screen brightness to 15 full db $50, $0F ;for $A0 line set screen brightness to 15 full
db $3F, $00 ;for $20 line set screen brightness to 0 db $3F, $00 ;for $20 line set screen brightness to 0
db $00 ;end the HDMA db $00 ;end the HDMA
} }
Link_CheckNewY_ButtonPress_Long: Link_CheckNewY_ButtonPress_Long:
{ {
BIT.b $3A : BVS .fail BIT.b $3A : BVS .fail
LDA.b $46 : BNE .fail LDA.b $46 : BNE .fail
LDA.b $F4 : AND.b #$40 : BEQ .fail LDA.b $F4 : AND.b #$40 : BEQ .fail
TSB.b $3A TSB.b $3A
SEC SEC
RTL RTL
.fail .fail
CLC CLC
RTL RTL
} }
Link_SetupHitBox: Link_SetupHitBox:
@@ -453,61 +451,35 @@ Link_SetupHitBox:
Sprite_SetupHitBox: Sprite_SetupHitBox:
{
PHB : PHK : PLB PHB : PHK : PLB
LDA.w $0F70, X LDA.w $0F70, X : BMI .too_high
BMI .too_high
PHY PHY
LDA.w $0F60, X : AND.b #$1F : TAY
LDA.w $0D10, X : CLC : ADC.w .offset_x_low, Y : STA.b $04
LDA.w $0F60, X LDA.w $0D30, X : ADC.w .offset_x_high, Y : STA.b $0A
AND.b #$1F
TAY
LDA.w $0D10, X LDA.w $0D00, X : CLC : ADC.w .offset_y_low, Y
CLC
ADC.w .offset_x_low, Y
STA.b $04
LDA.w $0D30, X PHP
ADC.w .offset_x_high, Y SEC : SBC.w $0F70, X : STA.b $05
STA.b $0A LDA.w $0D20, X : SBC.b #$00
LDA.w $0D00, X PLP
CLC ADC.w .offset_y_high, Y : STA.b $0B
ADC.w .offset_y_low, Y
PHP
SEC
SBC.w $0F70, X
STA.b $05
LDA.w $0D20, X
SBC.b #$00
PLP
ADC.w .offset_y_high, Y
STA.b $0B
LDA.w .width, Y
STA.b $06
LDA.w .height, Y
STA.b $07
LDA.w .width, Y : STA.b $06
LDA.w .height, Y : STA.b $07
PLY PLY
PLB PLB
RTL RTL
; ---------------------------------------------------------
.too_high
LDA.b #$80
STA.b $0A
.too_high
LDA.b #$80 : STA.b $0A
PLB PLB
RTL RTL
.offset_x_low .offset_x_low
@@ -729,7 +701,9 @@ Sprite_SetupHitBox:
db 48 ; 0x1D db 48 ; 0x1D
db 8 ; 0x1E db 8 ; 0x1E
db 12 ; 0x1F db 12 ; 0x1F
}
; =========================================================
Sprite_ApplySpeedTowardsPlayerXOrY_Long: Sprite_ApplySpeedTowardsPlayerXOrY_Long:
{ {
@@ -830,8 +804,8 @@ GetDistance8bit_Long:
+ +
STA $00 ; Distance X (ABS) STA $00 ; Distance X (ABS)
LDA $05 ; Sprite Y LDA $05 ; Sprite Y
SEC : SBC $03 ; - Player Y SEC : SBC $03 ; - Player Y
BPL + BPL +
EOR.b #$FF : INC EOR.b #$FF : INC
+ +