iigs-game-engine/src/render/Sprite2.s

103 lines
3.3 KiB
ArmAsm

; Specialize routines for handling two sprites. Like Sprite3.s and Sprite4.s there are four
; variants -- one to handle over / under sprite orders and one each for whether the mask needs
; to be used or not.
TwoSpriteLine mac
db $37,sprite_ptr1 ; and [sprite_ptr1],y
ora (sprite_ptr1),y
db $37,sprite_ptr0 ; and [sprite_ptr0],y
ora (sprite_ptr0),y
<<<
TwoSpriteData mac
lda (sprite_ptr1),y
db $37,sprite_ptr0 ; and [sprite_ptr0],y
ora (sprite_ptr0),y
<<<
TwoSpriteMask mac
db $B7,sprite_ptr1 ; lda [sprite_ptr1],y
db $37,sprite_ptr0 ; and [sprite_ptr0],y
<<<
TwoSpritesOver
tyx ; save after compositing the sprites
phb ; save the current bank
jsr CopyTileToDPSprite ; copy necessary tile data to the direct page
]line equ 0
lup 8
ldy #{]line*SPRITE_PLANE_SPAN}
lda tmp_tile_data+{]line*4}
TwoSpriteLine
sta tmp_tile_data+{]line*4}
ldy #{]line*SPRITE_PLANE_SPAN}+2
lda tmp_tile_data+{]line*4}+2
TwoSpriteLine
sta tmp_tile_data+{]line*4}+2
]line equ ]line+1
--^
plb
jmp (K_TS_APPLY_TILE_DATA,x)
TwoSpritesUnderFast
tyx ; save after compositing the sprites
phb ; save the current bank
jsr CopyTwoSpritesDataToDP ; copy necessary sprite data to the direct page
jmp MergeSpriteWithTileFast
]line equ 0
lup 8
ldy #{]line*SPRITE_PLANE_SPAN}
lda tmp_tile_data+{]line*4}
TwoSpriteLine
sta tmp_tile_data+{]line*4}
ldy #{]line*SPRITE_PLANE_SPAN}+2
lda tmp_tile_data+{]line*4}+2
TwoSpriteLine
sta tmp_tile_data+{]line*4}+2
]line equ ]line+1
--^
plb
jmp (K_TS_APPLY_TILE_DATA,x)
;---------------------------------
; Helper functions for two Sprites
CopyTwoSpritesDataToDP
]line equ 0
lup 8
ldy #{]line*SPRITE_PLANE_SPAN}
TwoSpriteData
sta tmp_sprite_data+{]line*4}
ldy #{]line*SPRITE_PLANE_SPAN}+2
TwoSpriteData
sta tmp_sprite_data+{]line*4}+2
]line equ ]line+1
--^
rts
CopyFourSpritesDataAndMaskToDP
CopyThreeSpritesDataAndMaskToDP
CopyTwoSpritesDataAndMaskToDP
]line equ 0
lup 8
ldy #{]line*SPRITE_PLANE_SPAN}
TwoSpriteData
sta tmp_sprite_data+{]line*4}
TwoSpriteMask
sta tmp_sprite_mask+{]line*4}
ldy #{]line*SPRITE_PLANE_SPAN}+2
TwoSpriteData
sta tmp_sprite_data+{]line*4}+2
TwoSpriteMask
sta tmp_sprite_mask+{]line*4}+2
]line equ ]line+1
--^
jmp (K_TS_SPRITE_TILE_DISP,x)