diff --git a/Core/sprite_macros.asm b/Core/sprite_macros.asm index ed7f62d..34619b0 100644 --- a/Core/sprite_macros.asm +++ b/Core/sprite_macros.asm @@ -50,6 +50,35 @@ macro SetFrame(frame) LDA.b # : STA.w SprFrame, X endmacro +macro JumpTable(index, ...) + LDA.w + JSL JumpTableLocal + + !a #= 0 + while !a < sizeof(...) + dw <...[!a]> + !a #= !a+1 + endwhile +endmacro + +macro SetMode(bit_mode) + if == "16bit" + REP #$30 + elseif == "8bit" + SEP #$30 + endif +endmacro + +macro ScopedMode(bit_mode, body) + SetMode bit_mode + body + if == "16bit" + SetMode "8bit" + elseif == "8bit" + SetMode "16bit" + endif +endmacro + macro SpriteJumpTable(...) LDA.w SprAction, X JSL JumpTableLocal @@ -61,12 +90,38 @@ macro SpriteJumpTable(...) endwhile endmacro +macro SetFlag(flag_addr, bit_pos) + LDA.b flag_addr + ORA.b #(1 << bit_pos) + STA.b flag_addr +endmacro + +macro ClearFlag(flag_addr, bit_pos) + LDA.b flag_addr + AND.b #~(1 << bit_pos) + STA.b flag_addr +endmacro + +macro ToggleFlag(flag_addr, bit_pos) + LDA.b flag_addr + EOR.b #(1 << bit_pos) + STA.b flag_addr +endmacro + +macro CheckFlag(flag_addr, bit_pos, set_label, clear_label) + LDA.b flag_addr + AND.b #(1 << bit_pos) + BEQ clear_label + BRA set_label +endmacro + ; Increase the sprite frame every (frames_wait) frames ; reset to (frame_start) when reaching (frame_end) ; This is using SprTimerB macro PlayAnimation(frame_start, frame_end, frame_wait) LDA.w SprTimerB, X : BNE + - LDA.w SprFrame, X : INC : STA.w SprFrame, X : CMP.b #+1 : BCC .noframereset + LDA.w SprFrame, X : INC : STA.w SprFrame, X + CMP.b #+1 : BCC .noframereset LDA.b # : STA.w SprFrame, X .noframereset LDA.b # : STA.w SprTimerB, X @@ -75,7 +130,8 @@ endmacro macro PlayAnimBackwards(frame_start, frame_end, frame_wait) LDA.w SprTimerB, X : BNE + - LDA.w SprFrame, X : DEC : STA.w SprFrame, X : CMP.b # : BCS .noframereset + LDA.w SprFrame, X : DEC : STA.w SprFrame, X + CMP.b # : BCS .noframereset LDA.b # : STA.w SprFrame, X .noframereset LDA.b # : STA.w SprTimerB, X