mirror of
https://github.com/lscharen/iigs-game-engine.git
synced 2024-09-29 17:57:15 +00:00
328 lines
7.4 KiB
ArmAsm
328 lines
7.4 KiB
ArmAsm
; Alternate entry point that takes arguments in registers instead of using a _Sprite
|
|
; record
|
|
;
|
|
; Y = VBUFF address
|
|
; X = Tile Data address
|
|
; A = Sprite Flags
|
|
DISP_VFLIP equ $0004 ; hard code these because they are internal values
|
|
DISP_HFLIP equ $0002
|
|
DISP_MASK equ $0018 ; Preserve the size bits
|
|
|
|
_DrawSpriteStamp
|
|
sty tmp1
|
|
stx tmp2
|
|
xba
|
|
and #DISP_MASK ; dispatch to all of the different orientations
|
|
sta tmp3
|
|
|
|
phb
|
|
pea #^tiledata ; Set the bank to the tile data
|
|
plb
|
|
|
|
; X = sprite ID
|
|
; Y = Tile Data
|
|
; A = VBUFF address
|
|
ldx tmp3
|
|
ldy tmp2
|
|
lda tmp1
|
|
jsr _DrawSprite
|
|
|
|
lda tmp3
|
|
ora #DISP_HFLIP
|
|
tax
|
|
ldy tmp2
|
|
lda tmp1
|
|
clc
|
|
adc #3*4
|
|
jsr _DrawSprite
|
|
|
|
lda tmp3
|
|
ora #DISP_VFLIP
|
|
tax
|
|
ldy tmp2
|
|
lda tmp1
|
|
clc
|
|
adc #6*4
|
|
jsr _DrawSprite
|
|
|
|
lda tmp3
|
|
ora #DISP_HFLIP+DISP_VFLIP
|
|
tax
|
|
ldy tmp2
|
|
lda tmp1
|
|
clc
|
|
adc #9*4
|
|
jsr _DrawSprite
|
|
|
|
; Restore bank
|
|
plb ; pop extra byte
|
|
plb
|
|
rts
|
|
;
|
|
; X = _Sprites array offset
|
|
_DrawSprite
|
|
jmp (draw_sprite,x)
|
|
|
|
draw_sprite dw draw_8x8,draw_8x8h,draw_8x8v,draw_8x8hv
|
|
dw draw_8x16,draw_8x16h,draw_8x16v,draw_8x16hv
|
|
dw draw_16x8,draw_16x8h,draw_16x8v,draw_16x8hv
|
|
dw draw_16x16,draw_16x16h,draw_16x16v,draw_16x16hv
|
|
|
|
dw :rtn,:rtn,:rtn,:rtn ; hidden bit is set
|
|
dw :rtn,:rtn,:rtn,:rtn
|
|
dw :rtn,:rtn,:rtn,:rtn
|
|
dw :rtn,:rtn,:rtn,:rtn
|
|
:rtn rts
|
|
|
|
draw_8x8
|
|
draw_8x8h
|
|
tax
|
|
jmp _DrawTile8x8
|
|
|
|
draw_8x8v
|
|
draw_8x8hv
|
|
tax
|
|
jmp _DrawTile8x8V
|
|
|
|
draw_8x16
|
|
draw_8x16h
|
|
tax
|
|
jsr _DrawTile8x8
|
|
clc
|
|
txa
|
|
adc #{8*SPRITE_PLANE_SPAN}
|
|
tax
|
|
tya
|
|
adc #{128*32} ; 32 tiles to the next vertical one, each tile is 128 bytes
|
|
tay
|
|
jmp _DrawTile8x8
|
|
|
|
draw_8x16v
|
|
draw_8x16hv
|
|
tax
|
|
jsr _DrawTile8x8V
|
|
clc
|
|
txa
|
|
adc #{8*SPRITE_PLANE_SPAN}
|
|
tax
|
|
tya
|
|
adc #{128*32}
|
|
tay
|
|
jmp _DrawTile8x8V
|
|
|
|
draw_16x8
|
|
tax
|
|
jsr _DrawTile8x8
|
|
clc
|
|
txa
|
|
adc #4
|
|
tax
|
|
tya
|
|
adc #128 ; Next tile is 128 bytes away
|
|
tay
|
|
jmp _DrawTile8x8
|
|
|
|
draw_16x8h
|
|
clc
|
|
tax
|
|
tya
|
|
pha
|
|
adc #128
|
|
tay
|
|
jsr _DrawTile8x8
|
|
txa
|
|
adc #4
|
|
tax
|
|
ply
|
|
jmp _DrawTile8x8
|
|
|
|
draw_16x8v
|
|
tax
|
|
jsr _DrawTile8x8V
|
|
clc
|
|
txa
|
|
adc #4
|
|
tax
|
|
tya
|
|
adc #128
|
|
tay
|
|
jmp _DrawTile8x8V
|
|
|
|
draw_16x8hv
|
|
clc
|
|
tax
|
|
tya
|
|
pha
|
|
adc #128
|
|
tay
|
|
jsr _DrawTile8x8V
|
|
txa
|
|
adc #4
|
|
tax
|
|
ply
|
|
jmp _DrawTile8x8V
|
|
|
|
; X = sprite ID
|
|
; Y = Tile Data
|
|
; A = VBUFF address
|
|
draw_16x16
|
|
clc
|
|
tax
|
|
jsr _DrawTile8x8
|
|
txa
|
|
adc #4
|
|
tax
|
|
tya
|
|
adc #128
|
|
tay
|
|
jsr _DrawTile8x8
|
|
txa
|
|
adc #{8*SPRITE_PLANE_SPAN}-4
|
|
tax
|
|
tya
|
|
adc #{128*{32-1}}
|
|
tay
|
|
jsr _DrawTile8x8
|
|
txa
|
|
adc #4
|
|
tax
|
|
tya
|
|
adc #128
|
|
tay
|
|
jmp _DrawTile8x8
|
|
|
|
draw_16x16h
|
|
clc
|
|
tax
|
|
tya
|
|
adc #64
|
|
pha
|
|
adc #128
|
|
tay
|
|
jsr _DrawTile8x8
|
|
|
|
txa
|
|
adc #4
|
|
tax
|
|
ply
|
|
jsr _DrawTile8x8
|
|
|
|
txa
|
|
adc #{8*SPRITE_PLANE_SPAN}-4
|
|
tax
|
|
tya
|
|
adc #{128*32}
|
|
pha
|
|
adc #128
|
|
tay
|
|
jsr _DrawTile8x8
|
|
|
|
txa
|
|
adc #4
|
|
tax
|
|
ply
|
|
jmp _DrawTile8x8
|
|
|
|
draw_16x16v
|
|
clc
|
|
tax
|
|
tya
|
|
pha ; store some copies
|
|
phx
|
|
pha
|
|
adc #{128*32}
|
|
tay
|
|
jsr _DrawTile8x8V
|
|
|
|
txa
|
|
adc #{8*SPRITE_PLANE_SPAN}
|
|
tax
|
|
ply
|
|
jsr _DrawTile8x8V
|
|
|
|
pla
|
|
adc #4
|
|
tax
|
|
lda 1,s
|
|
adc #{128*{32+1}}
|
|
tay
|
|
jsr _DrawTile8x8V
|
|
|
|
txa
|
|
adc #{8*SPRITE_PLANE_SPAN}
|
|
tax
|
|
pla
|
|
adc #128
|
|
tay
|
|
jmp _DrawTile8x8V
|
|
|
|
draw_16x16hv
|
|
clc
|
|
tax
|
|
tya
|
|
pha
|
|
adc #{128*{32+1}}+64 ; Bottom-right source to top-left
|
|
tay
|
|
jsr _DrawTile8x8V
|
|
|
|
txa
|
|
adc #4
|
|
tax
|
|
lda 1,s
|
|
adc #{128*32}+64
|
|
tay
|
|
jsr _DrawTile8x8V
|
|
|
|
txa
|
|
adc #{8*SPRITE_PLANE_SPAN}-4
|
|
tax
|
|
lda 1,s
|
|
adc #128+64
|
|
tay
|
|
jsr _DrawTile8x8V
|
|
|
|
txa
|
|
adc #4
|
|
tax
|
|
pla
|
|
adc #64
|
|
tay
|
|
jmp _DrawTile8x8V
|
|
|
|
|
|
; X = sprite vbuff address
|
|
; Y = tile data pointer
|
|
_DrawTile8x8
|
|
_CopyTile8x8
|
|
]line equ 0
|
|
lup 8
|
|
lda: tiledata+32+{]line*4},y
|
|
stal spritemask+{]line*SPRITE_PLANE_SPAN},x
|
|
lda: tiledata+{]line*4},y
|
|
stal spritedata+{]line*SPRITE_PLANE_SPAN},x
|
|
|
|
lda: tiledata+32+{]line*4}+2,y
|
|
stal spritemask+{]line*SPRITE_PLANE_SPAN}+2,x
|
|
lda: tiledata+{]line*4}+2,y
|
|
stal spritedata+{]line*SPRITE_PLANE_SPAN}+2,x
|
|
]line equ ]line+1
|
|
--^
|
|
rts
|
|
|
|
_DrawTile8x8V
|
|
_CopyTile8x8V
|
|
]line equ 0
|
|
lup 8
|
|
lda: tiledata+32+{{7-]line}*4},y
|
|
stal spritemask+{]line*SPRITE_PLANE_SPAN},x
|
|
lda: tiledata+{{7-]line}*4},y
|
|
stal spritedata+{]line*SPRITE_PLANE_SPAN},x
|
|
|
|
lda: tiledata+32+{{7-]line}*4}+2,y
|
|
stal spritemask+{]line*SPRITE_PLANE_SPAN}+2,x
|
|
lda: tiledata+{{7-]line}*4}+2,y
|
|
stal spritedata+{]line*SPRITE_PLANE_SPAN}+2,x
|
|
]line equ ]line+1
|
|
--^
|
|
rts
|