sprite acching removed in asm too

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@518 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2008-07-03 21:25:28 +00:00
parent ee4f03ae86
commit e352c3af64
4 changed files with 146 additions and 136 deletions

View file

@ -144,6 +144,8 @@ TileFlipMaker(TileFlip,pix_just_write)
#endif #endif
#ifndef _ASM_DRAW_C
// draw a sprite pixel, process operator colors // draw a sprite pixel, process operator colors
#define pix_sh(x) \ #define pix_sh(x) \
if (!t); \ if (!t); \
@ -154,7 +156,6 @@ TileFlipMaker(TileFlip,pix_just_write)
TileNormMaker(TileNormSH, pix_sh) TileNormMaker(TileNormSH, pix_sh)
TileFlipMaker(TileFlipSH, pix_sh) TileFlipMaker(TileFlipSH, pix_sh)
#ifndef _ASM_DRAW_C
// draw a sprite pixel ignoring operator colors // draw a sprite pixel ignoring operator colors
#define pix_sh_noop(x) \ #define pix_sh_noop(x) \
if (t && t < 0xe) \ if (t && t < 0xe) \
@ -162,7 +163,6 @@ TileFlipMaker(TileFlipSH, pix_sh)
TileNormMaker(TileNormSH_noop, pix_sh_noop) TileNormMaker(TileNormSH_noop, pix_sh_noop)
TileFlipMaker(TileFlipSH_noop, pix_sh_noop) TileFlipMaker(TileFlipSH_noop, pix_sh_noop)
#endif
// process operator pixels only, apply only on low pri tiles // process operator pixels only, apply only on low pri tiles
#define pix_sh_onlyop(x) \ #define pix_sh_onlyop(x) \
@ -172,6 +172,8 @@ TileFlipMaker(TileFlipSH_noop, pix_sh_noop)
TileNormMaker(TileNormSH_onlyop_lp, pix_sh_onlyop) TileNormMaker(TileNormSH_onlyop_lp, pix_sh_onlyop)
TileFlipMaker(TileFlipSH_onlyop_lp, pix_sh_onlyop) TileFlipMaker(TileFlipSH_onlyop_lp, pix_sh_onlyop)
#endif
// draw a sprite pixel (AS) // draw a sprite pixel (AS)
#define pix_as(x) \ #define pix_as(x) \
if (t && !(pd[x]&0x80)) pd[x]=pal|t if (t && !(pd[x]&0x80)) pd[x]=pal|t
@ -985,6 +987,9 @@ void PrepareSprites(int full)
HighLnSpr[y][2+cnt] = entry; HighLnSpr[y][2+cnt] = entry;
HighLnSpr[y][0] = cnt + 1; HighLnSpr[y][0] = cnt + 1;
found:; found:;
if (entry & 0x80)
rendstatus |= PDRAW_HAVE_HI_SPR;
else rendstatus |= PDRAW_HAVE_LO_SPR;
} }
} }

View file

@ -947,12 +947,26 @@ DrawTilesFromCache:
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.global DrawSpritesFromCache @ int *hc, int prio_unused, int sh .global DrawSpritesSHi @ int prio_unused, int sh
DrawSpritesSHi:
ldr r3, =DrawScanline
ldr r2, =HighLnSpr
ldr r12,[r3]
mov r3, #(MAX_LINE_SPRITES+2)
mla r2, r12, r3, r2
ldr r3, [r2]
ands r3, r3, #0x7f
bxeq lr
DrawSpritesFromCache:
stmfd sp!, {r4-r11,lr} stmfd sp!, {r4-r11,lr}
mov r12,#0xff
strb r12,[r2,#1] @ set end marker
add r10,r2, #2
add r10,r10,r3 @ r10=HighLnSpr end
str r1, [sp, #-4] @ no calls after this point
@ cache some stuff to avoid mem access
.if OVERRIDE_HIGHCOL .if OVERRIDE_HIGHCOL
ldr r11,=HighCol ldr r11,=HighCol
mov r12,#0xf mov r12,#0xf
@ -962,165 +976,189 @@ DrawSpritesFromCache:
mov r12,#0xf mov r12,#0xf
.endif .endif
ldr lr, =(Pico+0x10000) @ lr=Pico.vram ldr lr, =(Pico+0x10000) @ lr=Pico.vram
mov r6, r2, lsl #31
orr r6, r6, #1<<30
mov r10, r0
.dsfc_loop: DrawSpriteSHi:
ldr r9, [r10], #4 @ read code @ draw next sprite
bic r6, r6, #7 @ using pipeline ldrb r0, [r10,#-1]!
tst r9, r9 ldr r1, =HighPreSpr
ldmeqfd sp!, {r4-r11,pc} ldr r8, [sp, #-4]
cmp r0, #0xff
ldmeqfd sp!, {r4-r11,pc} @ end of list
and r0, r0, #0x7f
add r0, r1, r0, lsl #3
mov r4, r9, lsl #28 ldr r9, [r0, #4] @ sprite[1]
orr r6, r6, r4, lsr #30 mov r2, r9, asr #16 @ r2=sx
add r6, r6, #1 @ r6=s1cc???? ... ?????www (s=shadow/hilight, cc=pal, w=width)
and r5, r9, #3 mov r9, r9, lsl #16
add r5, r5, #1 @ r5=delta mov r3, r9, lsr #31 @ priority
tst r9, #0x10000 mov r9, r9, lsr #16
rsbne r5, r5, #0 @ Flip X orr r9, r9, r8, lsl #31 @ r9=code|sh[31]
mov r5, r5, lsl #4 and r4, r9, #0x6000
orr r9, r9, r4, lsl #16
orr r9, r9, #0x10000000 @ r9=scc1 ???? ... <code> (s=shadow/hilight, cc=pal)
cmp r12,r9, lsr #28 @ sh/hi with pal3?
cmpne r3, #1 @ if not, is hi prio
bne DrawSpriteSHi @ non-operator low sprite, already drawn
mov r2, r9, lsr #17 ldr r3, [r0] @ sprite[0]
mov r8, r2, lsl #1 @ tile=((unsigned int)code>>17)<<1; ldr r7, =DrawScanline
mov r6, r3, lsr #28
sub r6, r6, #1 @ r6=width-1 (inc later)
mov r5, r3, lsr #24
and r5, r5, #7 @ r5=height
and r3, r9, #0x30 @ r3=pal=(code&0x30); mov r0, r3, lsl #16 @ r4=sy<<16 (tmp)
bic r6, r6, #3<<28 ldr r7, [r7]
orr r6, r6, r3, lsl #24 sub r7, r7, r0, asr #16 @ r7=row=DrawScanline-sy
mov r0, r9, lsl #16 tst r9, #0x1000
mov r0, r0, asr #22 @ sx=(code<<16)>>22 movne r0, r5, lsl #3
adds r0, r0, #0 @ set ZV subne r0, r0, #1
b .dsfc_inloop_enter subne r7, r0, r7 @ if (code&0x1000) row=(height<<3)-1-row; // Flip Y
@ scratch: r4, r7 add r8, r9, r7, lsr #3 @ tile+=row>>3; // Tile number increases going down
.dsfc_inloop: tst r9, #0x0800
sub r6, r6, #1 mlane r8, r5, r6, r8 @ if (code&0x0800) { tile+=delta*(width-1);
tst r6, #7 rsbne r5, r5, #0 @ delta=-delta; } // r5=delta now
beq .dsfc_loop
adds r0, r0, #8
add r8, r8, r5
.dsfc_inloop_enter: mov r8, r8, lsl #21
ble .dsfc_inloop mov r8, r8, lsr #17
and r7, r7, #7
add r8, r8, r7, lsl #1 @ tile+=(row&7)<<1; // Tile address
mov r5, r5, lsl #4 @ delta<<=4; // Delta of address
orrs r3, r9, r9, lsl #4
mov r3, r4, lsr #9 @ r3=pal=((code>>9)&0x30);
add r6, r6, #1 @ inc now
adds r0, r2, #0 @ mov sx to r0 and set ZV flags
b .dsprShi_loop_enter
.dsprShi_loop:
subs r6, r6, #1 @ width--
beq DrawSpriteSHi
adds r0, r0, #8 @ sx+=8
add r8, r8, r5 @ tile+=delta
.dsprShi_loop_enter:
ble .dsprShi_loop @ sx <= 0
cmp r0, #328 cmp r0, #328
bge .dsfc_loop bge DrawSpriteSHi
mov r8, r8, lsl #17 mov r8, r8, lsl #17
mov r8, r8, lsr #17 @ tile&=0x7fff; // Clip tile address mov r8, r8, lsr #17 @ tile&=0x7fff; // Clip tile address
ldr r2, [lr, r8, lsl #1] @ pack=*(unsigned int *)(Pico.vram+tile); // Get 8 pixels ldr r2, [lr, r8, lsl #1] @ pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels
add r1, r11, r0 @ r1=pdest add r1, r11, r0 @ r1=pdest
tst r2, r2 tst r2, r2
beq .dsfc_inloop beq .dsprShi_loop
cmp r12, r6, lsr #28 cmp r12, r9, lsr #28
beq .dsfc_shadow beq .dsprShi_shadow
cmp r2, r2, ror #4 cmp r2, r2, ror #4
beq .dsfc_SingleColor @ tileline singlecolor beq .dsprShi_SingleColor @ tileline singlecolor
tst r9, #0x10000 tst r9, #0x0800
bne .dsfc_TileFlip bne .dsprShi_TileFlip
@ TileFlip (r1=pdest, r2=pixels8, r3=pal) r4: scratch, r12: helper pattern @ (r1=pdest, r2=pixels8, r3=pal) r4: scratch, r12: helper pattern
.dsfc_TileNorm: @ scratch: r4, r7
.dsprShi_TileNorm:
TileNorm r12 TileNorm r12
b .dsfc_inloop b .dsprShi_loop
.dsfc_TileFlip: .dsprShi_TileFlip:
TileFlip r12 TileFlip r12
b .dsfc_inloop b .dsprShi_loop
.dsfc_SingleColor: .dsprShi_SingleColor:
tst r0, #1 @ not aligned?
and r4, r2, #0xf and r4, r2, #0xf
orr r4, r3, r4 orr r4, r3, r4
orr r4, r4, r4, lsl #8 orr r4, r4, r4, lsl #8
tst r0, #1 @ not aligned?
strneb r4, [r1], #1 strneb r4, [r1], #1
streqh r4, [r1], #2 streqh r4, [r1], #2
strh r4, [r1], #2 strh r4, [r1], #2
strh r4, [r1], #2 strh r4, [r1], #2
strh r4, [r1], #2 strh r4, [r1], #2
strneb r4, [r1], #1 strneb r4, [r1], #1
b .dsfc_inloop b .dsprShi_loop
.dsfc_shadow: .dsprShi_shadow:
tst r9, #0x80000000 tst r9, #0x8000
beq .dsfc_shadow_lowpri beq .dsprShi_shadow_lowpri
cmp r2, r2, ror #4 cmp r2, r2, ror #4
beq .dsfc_singlec_sh beq .dsprShi_singlec_sh
tst r9, #0x10000 tst r9, #0x0800
bne .dsfc_TileFlip_sh bne .dsprShi_TileFlip_sh
@ (r1=pdest, r2=pixels8, r3=pal) r4: scratch, r12: helper pattern @ (r1=pdest, r2=pixels8, r3=pal) r4: scratch, r12: helper pattern
.dsfc_TileNorm_sh: .dsprShi_TileNorm_sh:
TileNormSh TileNormSh
b .dsfc_inloop b .dsprShi_loop
.dsfc_TileFlip_sh: .dsprShi_TileFlip_sh:
TileFlipSh TileFlipSh
b .dsfc_inloop b .dsprShi_loop
.dsfc_singlec_sh: .dsprShi_singlec_sh:
cmp r2, #0xe0000000 cmp r2, #0xe0000000
bcc .dsfc_SingleColor @ normal singlecolor tileline (carry inverted in ARM) bcc .dsprShi_SingleColor @ normal singlecolor tileline (carry inverted in ARM)
tst r2, #0x10000000 tst r2, #0x10000000
bne .dsfc_sh_sh bne .dsprShi_sh_sh
TileSingleHi TileSingleHi
b .dsfc_inloop b .dsprShi_loop
.dsfc_sh_sh: .dsprShi_sh_sh:
TileSingleSh TileSingleSh
b .dsfc_inloop b .dsprShi_loop
.dsfc_shadow_lowpri: .dsprShi_shadow_lowpri:
tst r9, #0x10000 tst r9, #0x800
bne .dsfc_TileFlip_sh_lp bne .dsprShi_TileFlip_sh_lp
.dsfc_TileNorm_sh_lp: .dsprShi_TileNorm_sh_lp:
TileNormSh_onlyop_lp TileNormSh_onlyop_lp
b .dsfc_inloop b .dsprShi_loop
.dsfc_TileFlip_sh_lp: .dsprShi_TileFlip_sh_lp:
TileFlipSh_onlyop_lp TileFlipSh_onlyop_lp
b .dsfc_inloop b .dsprShi_loop
.pool .pool
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.global DrawAllSprites @ int *hcache, int prio, int sh .global DrawAllSprites @ int prio, int sh
DrawAllSprites: DrawAllSprites:
ldr r3, =rendstatus ldr r3, =rendstatus
orr r1, r1, r0, lsl #1
ldr r12,[r3] ldr r12,[r3]
tst r12,#(PDRAW_ACC_SPRITES|PDRAW_SPRITES_MOVED) tst r12,#(PDRAW_ACC_SPRITES|PDRAW_SPRITES_MOVED)
beq das_no_prep beq das_no_prep
stmfd sp!, {r0,r2,lr} stmfd sp!, {r1,lr}
and r0, r12,#PDRAW_DIRTY_SPRITES and r0, r12,#PDRAW_DIRTY_SPRITES
bic r12,r12,#(PDRAW_ACC_SPRITES|PDRAW_SPRITES_MOVED) bic r12,r12,#(PDRAW_ACC_SPRITES|PDRAW_SPRITES_MOVED)
str r12,[r3] str r12,[r3]
bl PrepareSprites bl PrepareSprites
ldmfd sp!, {r0,r2,lr} ldmfd sp!, {r1,lr}
das_no_prep: das_no_prep:
ldr r12,=HighCacheS_ptr
ldr r3, =DrawScanline ldr r3, =DrawScanline
ldr r1, =HighLnSpr ldr r2, =HighLnSpr
str r0, [r12]
ldr r12,[r3] ldr r12,[r3]
mov r3, #(MAX_LINE_SPRITES+2) mov r3, #(MAX_LINE_SPRITES+2)
mla r1, r12, r3, r1 mla r2, r12, r3, r2
mov r12,#0 ldr r3, [r2]
ldr r3, [r1]
ands r3, r3, #0x7f ands r3, r3, #0x7f
streq r12,[r0]
bxeq lr bxeq lr
@ time to do some real work @ time to do some real work
@ -1128,11 +1166,11 @@ das_no_prep:
ldr r4, =rendstatus ldr r4, =rendstatus
mov r12,#0xff mov r12,#0xff
ldr r4, [r4] ldr r4, [r4]
strb r12,[r1,#1] @ end marker strb r12,[r2,#1] @ set end marker
add r10,r1, #2 add r10,r2, #2
add r10,r10,r3 @ r10=HighLnSpr end add r10,r10,r3 @ r10=HighLnSpr end
mov r8, r2, lsl #4 mov r8, r1, lsl #4
tst r4, #PDRAW_ACC_SPRITES tst r4, #PDRAW_ACC_SPRITES
orrne r8, r8, #1 orrne r8, r8, #1
str r8, [sp, #-4] @ no calls after this point str r8, [sp, #-4] @ no calls after this point
@ -1154,13 +1192,12 @@ DrawSprite: @ was: unsigned int *sprite, int sh, int acc_sprites
@ draw next sprite @ draw next sprite
ldrb r0, [r10,#-1]! ldrb r0, [r10,#-1]!
ldr r1, =HighPreSpr ldr r1, =HighPreSpr
mov r8, #0
cmp r0, #0xff
ldreq r4, =HighCacheS_ptr
ldreq r4, [r4]
streq r8, [r4]
ldmeqfd sp!, {r4-r11,pc}
ldr r8, [sp, #-4] ldr r8, [sp, #-4]
mov r2, r0, lsr #7
cmp r0, #0xff
ldmeqfd sp!, {r4-r11,pc} @ end of list
cmp r2, r8, lsr #5
bne DrawSprite @ wrong priority
and r0, r0, #0x7f and r0, r0, #0x7f
add r0, r1, r0, lsl #3 add r0, r1, r0, lsl #3
@ -1200,23 +1237,16 @@ DrawSprite: @ was: unsigned int *sprite, int sh, int acc_sprites
and r7, r7, #7 and r7, r7, #7
add r8, r8, r7, lsl #1 @ tile+=(row&7)<<1; // Tile address add r8, r8, r7, lsl #1 @ tile+=(row&7)<<1; // Tile address
tst r9, #0x8000
tsteq r9, #(1<<27)
bne .dspr_cache @ if(code&0x8000) || as
tst r9, #0x4000
tstne r9, #0x2000
tstne r9, #(1<<31)
bne .dspr_cache @ (sh && pal == 0x30)
.dspr_continue: .dspr_continue:
@ cache some stuff to avoid mem access @ cache some stuff to avoid mem access
mov r5, r5, lsl #4 @ delta<<=4; // Delta of address mov r5, r5, lsl #4 @ delta<<=4; // Delta of address
and r4, r9, #0x6000 and r4, r9, #0x6000
orr r9, r9, r4, lsl #16 orr r9, r9, r4, lsl #16
orrs r9, r9, #0x10000000 @ r9=scc1 a??? ... <code> (s=shadow/hilight, cc=pal, a=acc_spr) orr r9, r9, #0x10000000 @ r9=scc1 a??? ... <code> (s=shadow/hilight, cc=pal, a=acc_spr)
orrs r3, r9, r9, lsl #4
mov r3, r4, lsr #9 @ r3=pal=((code>>9)&0x30); mov r3, r4, lsr #9 @ r3=pal=((code>>9)&0x30);
orrmi r3, r3, #0x40 @ shadow by default orrmi r3, r3, #0x40 @ for shadow|as
add r6, r6, #1 @ inc now add r6, r6, #1 @ inc now
adds r0, r2, #0 @ mov sx to r0 and set ZV flags adds r0, r2, #0 @ mov sx to r0 and set ZV flags
@ -1294,31 +1324,6 @@ DrawSprite: @ was: unsigned int *sprite, int sh, int acc_sprites
b .dspr_loop b .dspr_loop
.dspr_cache:
@ *HighCacheS_ptr++ = ((code&0x8000)<<16)|(tile<<16)|((code&0x0800)<<5)|((sx<<6)&0x0000ffc0)|pal|((sprite[0]>>16)&0xf);
ldr r1, =HighCacheS_ptr
mov r4, r8, lsl #16 @ tile
tst r9, #0x0800
orrne r4, r4, #0x10000 @ code&0x0800
mov r0, r2, lsl #22
orr r4, r4, r0, lsr #16 @ (sx<<6)&0x0000ffc0
and r0, r9, #0x6000
orr r4, r4, r0, lsr #9 @ (code>>9)&0x30
mov r3, r3, lsl #12
orr r4, r4, r3, lsr #28 @ (sprite[0]>>24)&0xf
ldr r0, [r1]
tst r9, #0x8000
orrne r4, r4, #0x80000000 @ prio
str r4, [r0], #4
str r0, [r1]
and r0, r9, #(1<<27) @ as
teqne r0, #(1<<27) @ (code&0x8000) && !as
bne DrawSprite
b .dspr_continue @ draw anyway if accurate sprites enabled
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.global DrawWindow @ int tstart, int tend, int prio, int sh // int *hcache .global DrawWindow @ int tstart, int tend, int prio, int sh // int *hcache

View file

@ -203,7 +203,7 @@ up: PicoDrive.gpe
../../cpu/musashi/m68kops.c : ../../cpu/musashi/m68kops.c :
@make -C ../../cpu/musashi @make -C ../../cpu/musashi
../../Pico/Pico.o : ../../Pico/PicoFrameHints.c ../../Pico/PicoInt.h ../../Pico/Pico.o ../../Pico/cd/Pico.o: ../../Pico/PicoFrameHints.c ../../Pico/PicoInt.h
../../Pico/Memory.o Pico/cd/Memory.o : ../../Pico/MemoryCmn.c ../../Pico/PicoInt.h ../../Pico/Memory.o Pico/cd/Memory.o : ../../Pico/MemoryCmn.c ../../Pico/PicoInt.h
# build helix libs # build helix libs

View file

@ -99,7 +99,7 @@ mkdirs:
mkdir -p $(DIRS) mkdir -p $(DIRS)
Pico/carthw/svp/compiler.o : ../../Pico/carthw/svp/gen_arm.c Pico/carthw/svp/compiler.o : ../../Pico/carthw/svp/gen_arm.c
Pico/Pico.o : ../../Pico/PicoFrameHints.c ../../Pico/PicoInt.h Pico/Pico.o Pico/cd/Pico.o : ../../Pico/PicoFrameHints.c ../../Pico/PicoInt.h
Pico/Memory.o Pico/cd/Memory.o : ../../Pico/MemoryCmn.c ../../Pico/PicoInt.h Pico/Memory.o Pico/cd/Memory.o : ../../Pico/MemoryCmn.c ../../Pico/PicoInt.h
../../cpu/musashi/m68kops.c : ../../cpu/musashi/m68kops.c :