asm for DrawAllSprites

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@516 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2008-07-03 13:29:16 +00:00
parent 947fb5f96a
commit 283fec1b0f
2 changed files with 94 additions and 33 deletions

View file

@ -35,11 +35,11 @@ void *DrawLineDest=DefOutBuff; // pointer to dest buffer where to draw this line
static int HighCacheA[41+1]; // caches for high layers static int HighCacheA[41+1]; // caches for high layers
static int HighCacheB[41+1]; static int HighCacheB[41+1];
static int HighCacheS[80+1]; // and sprites static int HighCacheS[80+1]; // and sprites
static int HighPreSpr[80*2+1]; // slightly preprocessed sprites int HighPreSpr[80*2+1]; // slightly preprocessed sprites
int *HighCacheS_ptr; int *HighCacheS_ptr;
#define MAX_LINE_SPRITES 30 #define MAX_LINE_SPRITES 30
static unsigned char HighLnSpr[240][2 + MAX_LINE_SPRITES]; // sprite_count, tile_count, [spritep]... unsigned char HighLnSpr[240][2 + MAX_LINE_SPRITES]; // sprite_count, tile_count, [spritep]...
int rendstatus = 0; int rendstatus = 0;
int DrawScanline = 0; int DrawScanline = 0;
@ -65,7 +65,7 @@ struct TileStrip
#ifdef _ASM_DRAW_C #ifdef _ASM_DRAW_C
void DrawWindow(int tstart, int tend, int prio, int sh); void DrawWindow(int tstart, int tend, int prio, int sh);
void BackFill(int reg7, int sh); void BackFill(int reg7, int sh);
void DrawSprite(int *sprite, int sh, int as); void DrawAllSprites(int *hcache, int prio, int sh);
void DrawTilesFromCache(int *hc, int sh, int rlim); void DrawTilesFromCache(int *hc, int sh, int rlim);
void DrawSpritesFromCache(int *hc, int prio, int sh); void DrawSpritesFromCache(int *hc, int prio, int sh);
void DrawLayer(int plane_sh, int *hcache, int cellskip, int maxcells); void DrawLayer(int plane_sh, int *hcache, int cellskip, int maxcells);
@ -929,7 +929,7 @@ static void DrawSpritesFromCacheAS(int *hc, int prio, int sh)
// Index + 0 : hhhhvvvv ----hhvv yyyyyyyy yyyyyyyy // v, h: vert./horiz. size // Index + 0 : hhhhvvvv ----hhvv yyyyyyyy yyyyyyyy // v, h: vert./horiz. size
// Index + 4 : xxxxxxxx xxxxxxxx pccvhnnn nnnnnnnn // x: x coord + 8 // Index + 4 : xxxxxxxx xxxxxxxx pccvhnnn nnnnnnnn // x: x coord + 8
static void PrepareSprites(int full) void PrepareSprites(int full)
{ {
struct PicoVideo *pvid=&Pico.video; struct PicoVideo *pvid=&Pico.video;
int u,link=0; int u,link=0;
@ -1071,6 +1071,7 @@ found:;
} }
} }
#ifndef _ASM_DRAW_C
static void DrawAllSprites(int *hcache, int prio, int sh) static void DrawAllSprites(int *hcache, int prio, int sh)
{ {
int rs = rendstatus, scan = DrawScanline; int rs = rendstatus, scan = DrawScanline;
@ -1106,7 +1107,6 @@ static void DrawAllSprites(int *hcache, int prio, int sh)
// -------------------------------------------- // --------------------------------------------
#ifndef _ASM_DRAW_C
static void BackFill(int reg7, int sh) static void BackFill(int reg7, int sh)
{ {
unsigned int back; unsigned int back;

View file

@ -14,10 +14,18 @@
.extern DrawScanline .extern DrawScanline
.extern HighSprZ .extern HighSprZ
.extern rendstatus .extern rendstatus
.extern HighPreSpr
.extern DrawLineDest .extern DrawLineDest
.extern DrawStripInterlace .extern DrawStripInterlace
.extern HighCacheS_ptr .extern HighCacheS_ptr
.equ PDRAW_SPRITES_MOVED, (1<<0)
.equ PDRAW_WND_DIFF_PRIO, (1<<1)
.equ PDRAW_ACC_SPRITES, (1<<2)
.equ PDRAW_DIRTY_SPRITES, (1<<4)
.equ PDRAW_PLANE_HI_PRIO, (1<<6)
.equ PDRAW_SHHI_DONE, (1<<7)
.equ MAX_LINE_SPRITES, 30
@ helper @ helper
.macro TilePixel pat lsrr offs .macro TilePixel pat lsrr offs
@ -499,7 +507,7 @@ DrawLayer:
mov r0, #0 mov r0, #0
ldreq r2, [r1] ldreq r2, [r1]
str r0, [r6] @ terminate the cache list str r0, [r6] @ terminate the cache list
orreq r2, r2, #0x40 @ had a layer with all hi-prio tiles orreq r2, r2, #PDRAW_PLANE_HI_PRIO @ had a layer with all hi-prio tiles
streq r2, [r1] streq r2, [r1]
ldmfd sp!, {r4-r11,lr} ldmfd sp!, {r4-r11,lr}
@ -674,7 +682,7 @@ DrawLayer:
mov r0, #0 mov r0, #0
ldreq r2, [r1] ldreq r2, [r1]
str r0, [r6] @ terminate the cache list str r0, [r6] @ terminate the cache list
orreq r2, r2, #0x40 @ had a layer with all hi-prio tiles orreq r2, r2, #PDRAW_PLANE_HI_PRIO @ had a layer with all hi-prio tiles
streq r2, [r1] streq r2, [r1]
ldmfd sp!, {r4-r11,lr} ldmfd sp!, {r4-r11,lr}
@ -908,12 +916,12 @@ DrawTilesFromCache:
.dtfc_check_rendflags: .dtfc_check_rendflags:
ldr r1, =rendstatus ldr r1, =rendstatus
ldr r2, [r1] ldr r2, [r1]
tst r2, #0xc0 tst r2, #(PDRAW_PLANE_HI_PRIO|PDRAW_SHHI_DONE)
beq .dtfc_loop beq .dtfc_loop
bic r8, r8, #1 @ sh/hi mode off bic r8, r8, #1 @ sh/hi mode off
tst r2, #0x80 tst r2, #PDRAW_SHHI_DONE
bne .dtfc_loop @ already processed bne .dtfc_loop @ already processed
orr r2, r2, #0x80 orr r2, r2, #PDRAW_SHHI_DONE
str r2, [r1] str r2, [r1]
add r1, r11,#8 add r1, r11,#8
@ -939,7 +947,7 @@ DrawTilesFromCache:
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.global DrawSpritesFromCache @ int *hc, int maxwidth, int prio, int sh .global DrawSpritesFromCache @ int *hc, int prio_unused, int sh
DrawSpritesFromCache: DrawSpritesFromCache:
stmfd sp!, {r4-r11,lr} stmfd sp!, {r4-r11,lr}
@ -954,7 +962,7 @@ 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, r3, lsl #31 mov r6, r2, lsl #31
orr r6, r6, #1<<30 orr r6, r6, #1<<30
mov r10, r0 mov r10, r0
@ -1087,15 +1095,78 @@ DrawSpritesFromCache:
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ + 0 : hhhhvvvv ab--hhvv yyyyyyyy yyyyyyyy // a: offscreen h, b: offs. v, h: horiz. size .global DrawAllSprites @ int *hcache, int prio, int sh
DrawAllSprites:
ldr r3, =rendstatus
ldr r12,[r3]
tst r12,#(PDRAW_ACC_SPRITES|PDRAW_SPRITES_MOVED)
beq das_no_prep
stmfd sp!, {r0,r2,lr}
and r0, r12,#PDRAW_DIRTY_SPRITES
bic r12,r12,#(PDRAW_ACC_SPRITES|PDRAW_SPRITES_MOVED)
str r12,[r3]
bl PrepareSprites
ldmfd sp!, {r0,r2,lr}
das_no_prep:
ldr r12,=HighCacheS_ptr
ldr r3, =DrawScanline
ldr r1, =HighLnSpr
str r0, [r12]
ldr r12,[r3]
mov r3, #(MAX_LINE_SPRITES+2)
mla r1, r12, r3, r1
mov r12,#0
ldr r3, [r1]
ands r3, r3, #0x7f
streq r12,[r0]
bxeq lr
@ time to do some real work
stmfd sp!, {r4-r11,lr}
ldr r4, =rendstatus
mov r12,#0xff
ldr r4, [r4]
strb r12,[r1,#1] @ end marker
add r10,r1, #2
add r10,r10,r3 @ r10=HighLnSpr end
mov r8, r2, lsl #4
tst r4, #PDRAW_ACC_SPRITES
orrne r8, r8, #1
str r8, [sp, #-4] @ no calls after this point
.if OVERRIDE_HIGHCOL
ldr r11,=HighCol
mov r12,#0xf
ldr r11,[r11]
.else
ldr r11,=HighCol
mov r12,#0xf
.endif
ldr lr, =(Pico+0x10000) @ lr=Pico.vram
@ + 0 : hhhhvvvv ----hhvv yyyyyyyy yyyyyyyy // v, h: horiz. size
@ + 4 : xxxxxxxx xxxxxxxx pccvhnnn nnnnnnnn // x: x coord + 8 @ + 4 : xxxxxxxx xxxxxxxx pccvhnnn nnnnnnnn // x: x coord + 8
.global DrawSprite @ unsigned int *sprite, int sh, int acc_sprites DrawSprite: @ was: unsigned int *sprite, int sh, int acc_sprites
@ draw next sprite
ldrb r0, [r10,#-1]!
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]
and r0, r0, #0x7f
add r0, r1, r0, lsl #3
DrawSprite: @ stmfd sp!, {r4-r9,r11,lr}
stmfd sp!, {r4-r9,r11,lr} @ orr r8, r2, r1, lsl #4
orr r8, r2, r1, lsl #4
ldr r3, [r0] @ sprite[0] ldr r3, [r0] @ sprite[0]
ldr r7, =DrawScanline ldr r7, =DrawScanline
mov r6, r3, lsr #28 mov r6, r3, lsr #28
@ -1139,16 +1210,6 @@ DrawSprite:
.dspr_continue: .dspr_continue:
@ cache some stuff to avoid mem access @ cache some stuff to avoid mem access
.if OVERRIDE_HIGHCOL
ldr r11,=HighCol
mov r12,#0xf
ldr r11,[r11]
.else
ldr r11,=HighCol
mov r12,#0xf
.endif
ldr lr, =(Pico+0x10000) @ lr=Pico.vram
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
@ -1163,14 +1224,14 @@ DrawSprite:
.dspr_loop: .dspr_loop:
subs r6, r6, #1 @ width-- subs r6, r6, #1 @ width--
ldmeqfd sp!, {r4-r9,r11,pc}@ return beq DrawSprite
adds r0, r0, #8 @ sx+=8 adds r0, r0, #8 @ sx+=8
add r8, r8, r5 @ tile+=delta add r8, r8, r5 @ tile+=delta
.dspr_loop_enter: .dspr_loop_enter:
ble .dspr_loop @ sx <= 0 ble .dspr_loop @ sx <= 0
cmp r0, #328 cmp r0, #328
ldmgefd sp!, {r4-r9,r11,pc}@ return bge DrawSprite
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
@ -1255,7 +1316,7 @@ DrawSprite:
and r0, r9, #(1<<27) @ as and r0, r9, #(1<<27) @ as
teqne r0, #(1<<27) @ (code&0x8000) && !as teqne r0, #(1<<27) @ (code&0x8000) && !as
ldmnefd sp!, {r4-r9,r11,pc} bne DrawSprite
b .dspr_continue @ draw anyway if accurate sprites enabled b .dspr_continue @ draw anyway if accurate sprites enabled
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ -1291,7 +1352,7 @@ DrawWindow:
@ fetch the first code now @ fetch the first code now
ldrh r7, [lr, r12] ldrh r7, [lr, r12]
ands r6, r6, #2 @ we care about bit 1 only ands r6, r6, #PDRAW_WND_DIFF_PRIO
orr r6, r6, r2 orr r6, r6, r2
eoreq r8, r2, r7, lsr #15 @ do prio bits differ? eoreq r8, r2, r7, lsr #15 @ do prio bits differ?
@ -1508,7 +1569,7 @@ FinalizeLineBGR444:
eors r6, r6, #1 @ sh is 0 eors r6, r6, #1 @ sh is 0
ldr r12,[r12] ldr r12,[r12]
mov lr, #0xff mov lr, #0xff
tstne r12,#(1<<2) @ and PDRAW_ACC_SPRITES tstne r12,#PDRAW_ACC_SPRITES
.if OVERRIDE_HIGHCOL .if OVERRIDE_HIGHCOL
ldr r1, =HighCol ldr r1, =HighCol
@ -1677,7 +1738,7 @@ FinalizeLineRGB555:
eors r6, r6, #1 @ sh is 0 eors r6, r6, #1 @ sh is 0
ldr r12,[r12] ldr r12,[r12]
mov lr, #0xff mov lr, #0xff
tstne r12,#(1<<2) @ and PDRAW_ACC_SPRITES tstne r12,#PDRAW_ACC_SPRITES
movne lr, #0x3f movne lr, #0x3f
.if OVERRIDE_HIGHCOL .if OVERRIDE_HIGHCOL