implement no-mem test and start validating / tuning with real hardware

This commit is contained in:
2026-03-15 22:18:42 +01:00
parent 3ba8a3a985
commit c363aa6284
22 changed files with 2780 additions and 546 deletions

169
Draw.c
View File

@@ -28,64 +28,157 @@ static inline uint32_t f32u(const float f)
}
void
drawRect( const SstRegs * const sst,
drawRect( const SstRegs * const sstregs,
const unsigned char ucNumTMU,
const int16_t x,
const int16_t y,
const int16_t tSizeX,
const int16_t tSizeY)
{
ISET(sst->sARGB,0xFFFFFFFF);
ISET(sst->sOowfbi,f32u(1.0f));
ISET(sst->sVx, f32u((float)x));
ISET(sst->sVy, f32u((float)y));
ISET(sst->sSow0,f32u(0.0f));
ISET(sst->sTow0,f32u(0.0f));
ISET(sstregs->sSetupMode, 0x0020);
ISET(SST_TREX(sstregs,ucNumTMU)->sARGB,0xFFFFFFFF);
ISET(SST_TREX(sstregs,ucNumTMU)->sVx, f32u((float)x));
ISET(SST_TREX(sstregs,ucNumTMU)->sVy, f32u((float)y));
ISET(SST_TREX(sstregs,ucNumTMU)->sOowfbi,f32u(1.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sSow0,f32u(0.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sTow0,f32u(0.0f));
/* 0b10 0000 (Update only S0/T0), doc page 76 */
ISET(sst->sSetupMode, 0x0020);
ISET(sst->sBeginTriCMD, 1);
ISET(sstregs->sBeginTriCMD, 1);
ISET(sst->sVx, f32u((float)(x+tSizeX)));
ISET(sst->sVy, f32u((float)y));
ISET(sst->sSow0,f32u((float)tSizeX));
ISET(sst->sTow0,f32u(0.0f));
ISET(sst->sDrawTriCMD, 1);
ISET(SST_TREX(sstregs,ucNumTMU)->sVx, f32u((float)(x+tSizeX)));
ISET(SST_TREX(sstregs,ucNumTMU)->sVy, f32u((float)y));
ISET(SST_TREX(sstregs,ucNumTMU)->sSow0,f32u((float)tSizeX));
ISET(SST_TREX(sstregs,ucNumTMU)->sTow0,f32u(0.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sDrawTriCMD, 1);
ISET(sst->sVx, f32u((float)x));
ISET(sst->sVy, f32u((float)y+tSizeY));
ISET(sst->sSow0,f32u(0.0f));
ISET(sst->sTow0,f32u((float)tSizeY));
ISET(sst->sDrawTriCMD, 1);
ISET(SST_TREX(sstregs,ucNumTMU)->sVx, f32u((float)x));
ISET(SST_TREX(sstregs,ucNumTMU)->sVy, f32u((float)y+tSizeY));
ISET(SST_TREX(sstregs,ucNumTMU)->sSow0,f32u(0.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sTow0,f32u((float)tSizeY));
ISET(SST_TREX(sstregs,ucNumTMU)->sDrawTriCMD, 1);
ISET(sst->sVx, f32u((float)x+tSizeX));
ISET(sst->sVy, f32u((float)y+tSizeY));
ISET(sst->sSow0,f32u((float)tSizeX));
ISET(sst->sTow0,f32u((float)tSizeY));
ISET(sst->sDrawTriCMD, 1);
ISET(SST_TREX(sstregs,ucNumTMU)->sVx, f32u((float)x+tSizeX));
ISET(SST_TREX(sstregs,ucNumTMU)->sVy, f32u((float)y+tSizeY));
ISET(SST_TREX(sstregs,ucNumTMU)->sSow0,f32u((float)tSizeX));
ISET(SST_TREX(sstregs,ucNumTMU)->sTow0,f32u((float)tSizeY));
ISET(SST_TREX(sstregs,ucNumTMU)->sDrawTriCMD, 1);
ISET(sst->nopCMD, 0x1);
ISET(sstregs->nopCMD, 0x1);
}
void
drawRect2( const SstRegs * const sstregs,
const unsigned char ucNumTMU,
const int16_t x,
const int16_t y,
const int16_t tSizeX,
const int16_t tSizeY)
{
ISET(sstregs->sSetupMode, 0x0020);
//ISET(SST_TREX(sstregs,ucNumTMU)->sARGB,0xFF55AA55);
ISET(SST_TREX(sstregs,ucNumTMU)->sOowfbi, f32u(1.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sVx, f32u((float)x));
ISET(SST_TREX(sstregs,ucNumTMU)->sVy, f32u((float)y));
ISET(SST_TREX(sstregs,ucNumTMU)->sSow0, f32u(0.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sTow0, f32u(0.0f));
/* 0b10 0000 (Update only S0/T0), doc page 76 */
ISET(sstregs->sBeginTriCMD, 1);
ISET(SST_TREX(sstregs,ucNumTMU)->sVx, f32u((float)(x+tSizeX)));
ISET(SST_TREX(sstregs,ucNumTMU)->sVy, f32u((float)y));
ISET(SST_TREX(sstregs,ucNumTMU)->sSow0, f32u((float)tSizeX));
ISET(SST_TREX(sstregs,ucNumTMU)->sTow0, f32u(0.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sDrawTriCMD, 1);
ISET(SST_TREX(sstregs,ucNumTMU)->sVx, f32u((float)x));
ISET(SST_TREX(sstregs,ucNumTMU)->sVy, f32u((float)y+tSizeY));
ISET(SST_TREX(sstregs,ucNumTMU)->sSow0, f32u(0.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sTow0, f32u((float)tSizeY));
ISET(SST_TREX(sstregs,ucNumTMU)->sDrawTriCMD, 1);
ISET(SST_TREX(sstregs,ucNumTMU)->sVx, f32u((float)x+tSizeX));
ISET(SST_TREX(sstregs,ucNumTMU)->sVy, f32u((float)y+tSizeY));
ISET(SST_TREX(sstregs,ucNumTMU)->sSow0, f32u((float)tSizeX));
ISET(SST_TREX(sstregs,ucNumTMU)->sTow0, f32u((float)tSizeY));
ISET(SST_TREX(sstregs,ucNumTMU)->sDrawTriCMD, 1);
ISET(sstregs->nopCMD, 0x1);
}
void
clearScreen( const SstRegs * const sst,
clearScreen( const SstRegs * const sstregs,
const uint32_t u32Color,
const int16_t u16SizeX,
const int16_t u16SizeY)
{
ISET(sst->clipLeftRight, u16SizeX);
ISET(sst->clipBottomTop, u16SizeY);
ISET(sst->zaColor, u32Color);
//ISET(sst->zaColor, 0x0000);
ISET(sstregs->clipLeftRight, u16SizeX);
ISET(sstregs->clipBottomTop, u16SizeY);
ISET(sstregs->zaColor, u32Color);
//ISET(sstregs->zaColor, 0x0000);
const uint32_t fbz_saved = IGET(sst->fbzMode);
ISET(sst->c1,u32Color);
ISET(sst->c0,0x0);
ISET(sst->zaColor,0x0);
ISET(sst->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK);
ISET(sst->fastfillCMD, 0);
ISET(sst->nopCMD, 0x1);
ISET(sst->fbzMode, fbz_saved);
const uint32_t fbz_saved = IGET(sstregs->fbzMode);
ISET(sstregs->c1,u32Color);
ISET(sstregs->c0,0x0);
ISET(sstregs->zaColor,0x0F);
ISET(sstregs->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK);
ISET(sstregs->fastfillCMD, 0);
ISET(sstregs->nopCMD, 0x1);
ISET(sstregs->fbzMode, fbz_saved);
}
#define XY_ONE (1<<SST_XY_FRACBITS)
void
drawPixel( const SstRegs *sstregs,
const unsigned char ucNumTMU,
const int x,
const int y)
{
ISET( SST_TREX(sstregs,ucNumTMU)->vA.x,x*XY_ONE);
ISET(SST_TREX(sstregs,ucNumTMU)->vA.y,y*XY_ONE);
ISET(SST_TREX(sstregs,ucNumTMU)->vB.x,(x+2)*XY_ONE);
ISET(SST_TREX(sstregs,ucNumTMU)->vB.y,y*XY_ONE);
ISET(SST_TREX(sstregs,ucNumTMU)->vC.x,x*XY_ONE);
ISET(SST_TREX(sstregs,ucNumTMU)->vC.y,(y+1)*XY_ONE);
ISET(SST_TREX(sstregs,ucNumTMU)->triangleCMD,0);
}
void
drawTriangle( const SstRegs * const sstregs,
const unsigned char ucNumTMU,
const int16_t x,
const int16_t y,
const int16_t tSizeX,
const int16_t tSizeY)
{
ISET(sstregs->sSetupMode, 0x0020);
//ISET(SST_TREX(sstregs,ucNumTMU)->sARGB,0xFF55AA55);
ISET(SST_TREX(sstregs,ucNumTMU)->sOowfbi, f32u(1.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sVx, f32u((float)x));
ISET(SST_TREX(sstregs,ucNumTMU)->sVy, f32u((float)y));
ISET(SST_TREX(sstregs,ucNumTMU)->sSow0, f32u(0.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sTow0, f32u(0.0f));
/* 0b10 0000 (Update only S0/T0), doc page 76 */
ISET(sstregs->sBeginTriCMD, 1);
ISET(SST_TREX(sstregs,ucNumTMU)->sVx, f32u((float)(x+tSizeX)));
ISET(SST_TREX(sstregs,ucNumTMU)->sVy, f32u((float)y));
ISET(SST_TREX(sstregs,ucNumTMU)->sSow0, f32u((float)tSizeX));
ISET(SST_TREX(sstregs,ucNumTMU)->sTow0, f32u(0.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sDrawTriCMD, 1);
ISET(SST_TREX(sstregs,ucNumTMU)->sVx, f32u((float)x));
ISET(SST_TREX(sstregs,ucNumTMU)->sVy, f32u((float)y+tSizeY));
ISET(SST_TREX(sstregs,ucNumTMU)->sSow0, f32u(0.0f));
ISET(SST_TREX(sstregs,ucNumTMU)->sTow0, f32u((float)tSizeY));
ISET(SST_TREX(sstregs,ucNumTMU)->sDrawTriCMD, 1);
ISET(sstregs->nopCMD, 0x1);
}