32x, fix softscale enabled by 32x

also some streamlining cleanup in the drawing code
This commit is contained in:
kub 2023-06-11 19:11:18 +00:00
parent f81718cbb8
commit 17c1401b44
5 changed files with 62 additions and 59 deletions

View file

@ -348,9 +348,6 @@ void PicoDrawSetOutFormat32x(pdso_t which, int use_32x_line_mode)
PicoDrawSetInternalBuf(NULL, 0); PicoDrawSetInternalBuf(NULL, 0);
PicoDrawSetOutBufMD(Pico.est.Draw2FB, 328); PicoDrawSetOutBufMD(Pico.est.Draw2FB, 328);
} }
// always need upscaling for H32, before mixing in 32X layer
PicoIn.opt |= POPT_EN_SOFTSCALE;
PicoIn.opt &= ~POPT_DIS_32C_BORDER;
if (use_32x_line_mode) if (use_32x_line_mode)
// we'll draw via FinalizeLine32xRGB555 (rare) // we'll draw via FinalizeLine32xRGB555 (rare)

View file

@ -519,7 +519,7 @@ void DrawStripInterlace(struct TileStrip *ts, int plane_sh)
static void DrawLayer(int plane_sh, u32 *hcache, int cellskip, int maxcells, static void DrawLayer(int plane_sh, u32 *hcache, int cellskip, int maxcells,
struct PicoEState *est) struct PicoEState *est)
{ {
struct PicoVideo *pvid=&Pico.video; struct PicoVideo *pvid=&est->Pico->video;
const char shift[4]={5,6,5,7}; // 32,64 or 128 sized tilemaps (2 is invalid) const char shift[4]={5,6,5,7}; // 32,64 or 128 sized tilemaps (2 is invalid)
struct TileStrip ts; struct TileStrip ts;
int width, height, ymask; int width, height, ymask;
@ -593,8 +593,8 @@ static void DrawLayer(int plane_sh, u32 *hcache, int cellskip, int maxcells,
static void DrawWindow(int tstart, int tend, int prio, int sh, static void DrawWindow(int tstart, int tend, int prio, int sh,
struct PicoEState *est) struct PicoEState *est)
{ {
unsigned char *pd = Pico.est.HighCol; unsigned char *pd = est->HighCol;
struct PicoVideo *pvid = &Pico.video; struct PicoVideo *pvid = &est->Pico->video;
int tilex,ty,nametab,code=0; int tilex,ty,nametab,code=0;
int blank=-1; // The tile we know is blank int blank=-1; // The tile we know is blank
@ -713,7 +713,7 @@ static void DrawTilesFromCacheShPrep(void)
static void DrawTilesFromCache(u32 *hc, int sh, int rlim, struct PicoEState *est) static void DrawTilesFromCache(u32 *hc, int sh, int rlim, struct PicoEState *est)
{ {
unsigned char *pd = Pico.est.HighCol; unsigned char *pd = est->HighCol;
u32 code, dx; u32 code, dx;
u32 pack; u32 pack;
int pal; int pal;
@ -919,7 +919,7 @@ static NOINLINE void DrawAllSpritesInterlace(int pri, int sh)
struct PicoVideo *pvid=&Pico.video; struct PicoVideo *pvid=&Pico.video;
int i,u,table,link=0,sline=Pico.est.DrawScanline<<1; int i,u,table,link=0,sline=Pico.est.DrawScanline<<1;
u32 *sprites[80]; // Sprite index u32 *sprites[80]; // Sprite index
int max_sprites = Pico.video.reg[12]&1 ? 80 : 64; int max_sprites = pvid->reg[12]&1 ? 80 : 64;
table=pvid->reg[5]&0x7f; table=pvid->reg[5]&0x7f;
if (pvid->reg[12]&1) table&=0x7e; // Lowest bit 0 in 40-cell mode if (pvid->reg[12]&1) table&=0x7e; // Lowest bit 0 in 40-cell mode
@ -1252,7 +1252,7 @@ void DrawStripInterlaceForced(struct TileStrip *ts)
static void DrawLayerForced(int plane_sh, int cellskip, int maxcells, static void DrawLayerForced(int plane_sh, int cellskip, int maxcells,
struct PicoEState *est) struct PicoEState *est)
{ {
struct PicoVideo *pvid=&Pico.video; struct PicoVideo *pvid=&est->Pico->video;
const char shift[4]={5,6,5,7}; // 32,64 or 128 sized tilemaps (2 is invalid) const char shift[4]={5,6,5,7}; // 32,64 or 128 sized tilemaps (2 is invalid)
struct TileStrip ts; struct TileStrip ts;
int width, height, ymask; int width, height, ymask;
@ -1411,8 +1411,8 @@ static void DrawSpritesForced(unsigned char *sprited)
// Sprite parsing 1 line in advance: determine sprites on line by Y pos // Sprite parsing 1 line in advance: determine sprites on line by Y pos
static NOINLINE void ParseSprites(int max_lines, int limit) static NOINLINE void ParseSprites(int max_lines, int limit)
{ {
const struct PicoVideo *pvid=&Pico.video;
const struct PicoEState *est=&Pico.est; const struct PicoEState *est=&Pico.est;
const struct PicoVideo *pvid=&est->Pico->video;
int u,link=0,sh; int u,link=0,sh;
int table=0; int table=0;
s32 *pd = HighPreSpr + HighPreSprBank*2; s32 *pd = HighPreSpr + HighPreSprBank*2;
@ -1429,12 +1429,12 @@ static NOINLINE void ParseSprites(int max_lines, int limit)
// line are limited if display was disabled during HBLANK before current line // line are limited if display was disabled during HBLANK before current line
if (limit) limit = 16; // max sprites/pixels processed if (limit) limit = 16; // max sprites/pixels processed
if (!(Pico.video.reg[12]&1)) if (!(pvid->reg[12]&1))
max_sprites = 64, max_line_sprites = 16, max_width = 264; max_sprites = 64, max_line_sprites = 16, max_width = 264;
if (*est->PicoOpt & POPT_DIS_SPRITE_LIM) if (*est->PicoOpt & POPT_DIS_SPRITE_LIM)
max_line_sprites = MAX_LINE_SPRITES; max_line_sprites = MAX_LINE_SPRITES;
sh = Pico.video.reg[0xC]&8; // shadow/hilight? sh = pvid->reg[0xC]&8; // shadow/hilight?
table=pvid->reg[5]&0x7f; table=pvid->reg[5]&0x7f;
if (pvid->reg[12]&1) table&=0x7e; // Lowest bit 0 in 40-cell mode if (pvid->reg[12]&1) table&=0x7e; // Lowest bit 0 in 40-cell mode
@ -1606,8 +1606,8 @@ void PicoDoHighPal555_8bit(int sh, int line, struct PicoEState *est)
unsigned int t, i; unsigned int t, i;
// reset dirty only if there are no outstanding changes // reset dirty only if there are no outstanding changes
if (Pico.m.dirtyPal == 2) if (est->Pico->m.dirtyPal == 2)
Pico.m.dirtyPal = 0; est->Pico->m.dirtyPal = 0;
// In Sonic render mode palettes were backuped in SonicPal // In Sonic render mode palettes were backuped in SonicPal
spal = (void *)est->SonicPal; spal = (void *)est->SonicPal;
@ -1646,7 +1646,7 @@ void PicoDoHighPal555(int sh, int line, struct PicoEState *est)
unsigned int *spal, *dpal; unsigned int *spal, *dpal;
unsigned int t, i; unsigned int t, i;
Pico.m.dirtyPal = 0; est->Pico->m.dirtyPal = 0;
spal = (void *)PicoMem.cram; spal = (void *)PicoMem.cram;
dpal = (void *)est->HighPal; dpal = (void *)est->HighPal;
@ -1688,14 +1688,14 @@ void FinalizeLine555(int sh, int line, struct PicoEState *est)
PicoDrawUpdateHighPal(); PicoDrawUpdateHighPal();
len = 256; len = 256;
if (!(PicoIn.AHW & PAHW_8BIT) && (Pico.video.reg[12]&1)) if (!(PicoIn.AHW & PAHW_8BIT) && (est->Pico->video.reg[12]&1))
len = 320; len = 320;
else if ((PicoIn.AHW & PAHW_GG) && (Pico.m.hardware & PMS_HW_LCD)) else if ((PicoIn.AHW & PAHW_GG) && (est->Pico->m.hardware & PMS_HW_LCD))
len = 160; len = 160;
else if ((PicoIn.AHW & PAHW_SMS) && (Pico.video.reg[0] & 0x20)) else if ((PicoIn.AHW & PAHW_SMS) && (est->Pico->video.reg[0] & 0x20))
len -= 8, ps += 8; len -= 8, ps += 8;
if ((*est->PicoOpt & POPT_EN_SOFTSCALE) && len < 320) { if ((est->rendstatus & PDRAW_SOFTSCALE) && len < 320) {
if (len >= 240 && len <= 256) { if (len >= 240 && len <= 256) {
pd += (256-len)>>1; pd += (256-len)>>1;
switch (PicoIn.filter) { switch (PicoIn.filter) {
@ -1715,7 +1715,7 @@ void FinalizeLine555(int sh, int line, struct PicoEState *est)
default: h_upscale_nn_1_2(pd, 320, ps, 160, len, f_pal); break; default: h_upscale_nn_1_2(pd, 320, ps, 160, len, f_pal); break;
} }
} else { } else {
if (!(*est->PicoOpt & POPT_DIS_32C_BORDER) && len < 320) if ((est->rendstatus & PDRAW_BORDER_32) && len < 320)
pd += (320-len) / 2; pd += (320-len) / 2;
#if 1 #if 1
h_copy(pd, 320, ps, 320, len, f_pal); h_copy(pd, 320, ps, 320, len, f_pal);
@ -1738,7 +1738,7 @@ void FinalizeLine8bit(int sh, int line, struct PicoEState *est)
static int dirty_line; static int dirty_line;
// a hack for mid-frame palette changes // a hack for mid-frame palette changes
if (Pico.m.dirtyPal == 1) if (est->Pico->m.dirtyPal == 1)
{ {
// store a maximum of 3 additional palettes in SonicPal // store a maximum of 3 additional palettes in SonicPal
if (est->SonicPalCount < 3 && if (est->SonicPalCount < 3 &&
@ -1748,21 +1748,21 @@ void FinalizeLine8bit(int sh, int line, struct PicoEState *est)
est->rendstatus |= PDRAW_SONIC_MODE; est->rendstatus |= PDRAW_SONIC_MODE;
} }
blockcpy(est->SonicPal+est->SonicPalCount*0x40, PicoMem.cram, 0x40*2); blockcpy(est->SonicPal+est->SonicPalCount*0x40, PicoMem.cram, 0x40*2);
Pico.m.dirtyPal = 2; est->Pico->m.dirtyPal = 2;
} }
len = 256; len = 256;
if (!(PicoIn.AHW & PAHW_8BIT) && (Pico.video.reg[12]&1)) if (!(PicoIn.AHW & PAHW_8BIT) && (est->Pico->video.reg[12]&1))
len = 320; len = 320;
else if ((PicoIn.AHW & PAHW_GG) && (Pico.m.hardware & PMS_HW_LCD)) else if ((PicoIn.AHW & PAHW_GG) && (est->Pico->m.hardware & PMS_HW_LCD))
len = 160; len = 160;
else if ((PicoIn.AHW & PAHW_SMS) && (Pico.video.reg[0] & 0x20)) else if ((PicoIn.AHW & PAHW_SMS) && (est->Pico->video.reg[0] & 0x20))
len -= 8, ps += 8; len -= 8, ps += 8;
if (DrawLineDestIncrement == 0) if (DrawLineDestIncrement == 0)
pd = est->HighCol+8; pd = est->HighCol+8;
if ((PicoIn.opt & POPT_EN_SOFTSCALE) && len < 320) { if ((est->rendstatus & PDRAW_SOFTSCALE) && len < 320) {
unsigned char pal = 0; unsigned char pal = 0;
if (!sh && (est->rendstatus & PDRAW_SONIC_MODE)) if (!sh && (est->rendstatus & PDRAW_SONIC_MODE))
@ -1774,7 +1774,7 @@ void FinalizeLine8bit(int sh, int line, struct PicoEState *est)
else else
rh_upscale_nn_1_2(pd, 320, ps, 256, len, f_or); rh_upscale_nn_1_2(pd, 320, ps, 256, len, f_or);
} else { } else {
if (!(*est->PicoOpt & POPT_DIS_32C_BORDER) && len < 320) if ((est->rendstatus & PDRAW_BORDER_32) && len < 320)
pd += (320-len) / 2; pd += (320-len) / 2;
if (!sh && (est->rendstatus & PDRAW_SONIC_MODE)) if (!sh && (est->rendstatus & PDRAW_SONIC_MODE))
// select active backup palette // select active backup palette
@ -1792,7 +1792,7 @@ static int DrawDisplay(int sh)
{ {
struct PicoEState *est=&Pico.est; struct PicoEState *est=&Pico.est;
unsigned char *sprited = &HighLnSpr[est->DrawScanline][0]; unsigned char *sprited = &HighLnSpr[est->DrawScanline][0];
struct PicoVideo *pvid=&Pico.video; struct PicoVideo *pvid=&est->Pico->video;
int win=0, edge=0, hvwind=0, lflags; int win=0, edge=0, hvwind=0, lflags;
int maxw, maxcells; int maxw, maxcells;
@ -1872,7 +1872,7 @@ static int DrawDisplay(int sh)
else if (est->rendstatus & PDRAW_INTERLACE) else if (est->rendstatus & PDRAW_INTERLACE)
DrawAllSpritesInterlace(1, sh); DrawAllSpritesInterlace(1, sh);
// have sprites without layer pri bit ontop of sprites with that bit // have sprites without layer pri bit ontop of sprites with that bit
else if ((sprited[1] & SPRL_LO_ABOVE_HI) && (PicoIn.opt & POPT_ACC_SPRITES)) else if ((sprited[1] & SPRL_LO_ABOVE_HI) && (*est->PicoOpt & POPT_ACC_SPRITES))
DrawSpritesHiAS(sprited, sh); DrawSpritesHiAS(sprited, sh);
else if (sh && (sprited[1] & SPRL_MAY_HAVE_OP)) else if (sh && (sprited[1] & SPRL_MAY_HAVE_OP))
DrawSpritesSHi(sprited, est); DrawSpritesSHi(sprited, est);
@ -1914,21 +1914,31 @@ PICO_INTERNAL void PicoFrameStart(void)
// prepare to do this frame // prepare to do this frame
est->rendstatus = 0; est->rendstatus = 0;
if ((Pico.video.reg[12] & 6) == 6)
if ((PicoIn.AHW & PAHW_32X) && (*est->PicoOpt & POPT_ALT_RENDERER))
est->rendstatus |= PDRAW_BORDER_32; // no scaling for fastest
else if (PicoIn.AHW & PAHW_32X) // H32 upscaling, before mixing in 32X layer
est->rendstatus |= PDRAW_32X_SCALE|PDRAW_SOFTSCALE;
else if (PicoIn.opt & POPT_EN_SOFTSCALE)
est->rendstatus |= PDRAW_SOFTSCALE;
else if (!(PicoIn.opt & POPT_DIS_32C_BORDER))
est->rendstatus |= PDRAW_BORDER_32;
if ((est->Pico->video.reg[12] & 6) == 6)
est->rendstatus |= PDRAW_INTERLACE; // interlace mode est->rendstatus |= PDRAW_INTERLACE; // interlace mode
if (!(Pico.video.reg[12] & 1)) { if (!(est->Pico->video.reg[12] & 1)) {
est->rendstatus |= PDRAW_32_COLS; est->rendstatus |= PDRAW_32_COLS;
if (!(PicoIn.opt & POPT_EN_SOFTSCALE)) { if (est->rendstatus & PDRAW_BORDER_32) {
columns = 256; columns = 256;
coffs = 32; coffs = 32;
} }
} }
if (Pico.video.reg[1] & 8) { if (est->Pico->video.reg[1] & 8) {
est->rendstatus |= PDRAW_30_ROWS; est->rendstatus |= PDRAW_30_ROWS;
lines = 240; lines = 240;
loffs = 0; loffs = 0;
} }
if (PicoIn.opt & POPT_DIS_32C_BORDER) if (!(est->rendstatus & PDRAW_BORDER_32))
coffs = 0; coffs = 0;
if (est->rendstatus != rendstatus_old || lines != rendlines) { if (est->rendstatus != rendstatus_old || lines != rendlines) {
@ -1946,8 +1956,6 @@ PICO_INTERNAL void PicoFrameStart(void)
est->rendstatus |= PDRAW_SKIP_FRAME; est->rendstatus |= PDRAW_SKIP_FRAME;
if (sprep | skipped) if (sprep | skipped)
est->rendstatus |= PDRAW_PARSE_SPRITES; est->rendstatus |= PDRAW_PARSE_SPRITES;
if (PicoIn.AHW & PAHW_32X)
est->rendstatus |= PDRAW_32X_SCALE;
est->HighCol = HighColBase + loffs * HighColIncrement; est->HighCol = HighColBase + loffs * HighColIncrement;
est->DrawLineDest = (char *)DrawLineDestBase + loffs * DrawLineDestIncrement; est->DrawLineDest = (char *)DrawLineDestBase + loffs * DrawLineDestIncrement;
@ -1956,7 +1964,7 @@ PICO_INTERNAL void PicoFrameStart(void)
if (FinalizeLine == FinalizeLine8bit) { if (FinalizeLine == FinalizeLine8bit) {
// make a backup of the current palette in case Sonic mode is detected later // make a backup of the current palette in case Sonic mode is detected later
Pico.m.dirtyPal = (Pico.m.dirtyPal || est->SonicPalCount ? 2 : 0); est->Pico->m.dirtyPal = (est->Pico->m.dirtyPal || est->SonicPalCount ? 2 : 0);
blockcpy(est->SonicPal, PicoMem.cram, 0x40*2); blockcpy(est->SonicPal, PicoMem.cram, 0x40*2);
} }
est->SonicPalCount = 0; est->SonicPalCount = 0;
@ -2001,13 +2009,13 @@ static void PicoLine(int line, int offs, int sh, int bgc, int off, int on)
return; return;
} }
if (Pico.video.debug_p & (PVD_FORCE_A | PVD_FORCE_B | PVD_FORCE_S)) if (est->Pico->video.debug_p & (PVD_FORCE_A | PVD_FORCE_B | PVD_FORCE_S))
bgc = 0x3f; bgc = 0x3f;
// Draw screen: // Draw screen:
BackFill(bgc, sh, est); BackFill(bgc, sh, est);
if (Pico.video.reg[1]&0x40) { if (est->Pico->video.reg[1]&0x40) {
int width = (Pico.video.reg[12]&1) ? 320 : 256; int width = (est->Pico->video.reg[12]&1) ? 320 : 256;
DrawDisplay(sh); DrawDisplay(sh);
// partial line blanking (display on or off inside the line) // partial line blanking (display on or off inside the line)
if (unlikely(off|on)) { if (unlikely(off|on)) {
@ -2032,8 +2040,8 @@ void PicoDrawSync(int to, int off, int on)
{ {
struct PicoEState *est = &Pico.est; struct PicoEState *est = &Pico.est;
int line, offs = 0; int line, offs = 0;
int sh = (Pico.video.reg[0xC] & 8) >> 3; // shadow/hilight? int sh = (est->Pico->video.reg[0xC] & 8) >> 3; // shadow/hilight?
int bgc = Pico.video.reg[7] & 0x3f; int bgc = est->Pico->video.reg[7] & 0x3f;
pprof_start(draw); pprof_start(draw);
@ -2060,7 +2068,7 @@ void PicoDrawSync(int to, int off, int on)
// last line // last line
if (line <= to) if (line <= to)
{ {
int width2 = (Pico.video.reg[12]&1) ? 160 : 128; int width2 = (est->Pico->video.reg[12]&1) ? 160 : 128;
// technically, VDP starts active display output at slot 12 // technically, VDP starts active display output at slot 12
if (unlikely(on|off) && (off >= width2 || if (unlikely(on|off) && (off >= width2 ||
@ -2106,9 +2114,9 @@ void PicoDrawRefreshSprites(void)
void PicoDrawUpdateHighPal(void) void PicoDrawUpdateHighPal(void)
{ {
struct PicoEState *est = &Pico.est; struct PicoEState *est = &Pico.est;
if (Pico.m.dirtyPal) { if (est->Pico->m.dirtyPal) {
int sh = (Pico.video.reg[0xC] & 8) >> 3; // shadow/hilight? int sh = (est->Pico->video.reg[0xC] & 8) >> 3; // shadow/hilight?
if ((PicoIn.opt & POPT_ALT_RENDERER) | (est->rendstatus & PDRAW_SONIC_MODE)) if ((*est->PicoOpt & POPT_ALT_RENDERER) | (est->rendstatus & PDRAW_SONIC_MODE))
sh = 0; // no s/h support sh = 0; // no s/h support
if (PicoIn.AHW & PAHW_SMS) if (PicoIn.AHW & PAHW_SMS)

View file

@ -597,11 +597,6 @@ static void DrawDisplayFull(void)
} }
est->Draw2Start = scrstart; est->Draw2Start = scrstart;
// 32C border for centering? (for asm)
est->rendstatus &= ~PDRAW_BORDER_32;
if ((est->rendstatus&PDRAW_32_COLS) && !(PicoIn.opt&POPT_DIS_32C_BORDER))
est->rendstatus |= PDRAW_BORDER_32;
planestart = scrstart, planeend = scrend; planestart = scrstart, planeend = scrend;
winstart = scrstart, winend = scrend; winstart = scrstart, winend = scrend;

View file

@ -18,7 +18,9 @@
.equ PDRAW_WND_DIFF_PRIO, (1<<1) .equ PDRAW_WND_DIFF_PRIO, (1<<1)
.equ PDRAW_PLANE_HI_PRIO, (1<<6) .equ PDRAW_PLANE_HI_PRIO, (1<<6)
.equ PDRAW_SHHI_DONE, (1<<7) .equ PDRAW_SHHI_DONE, (1<<7)
.equ PDRAW_BORDER_32, (1<<9)
.equ PDRAW_32X_SCALE, (1<<12) .equ PDRAW_32X_SCALE, (1<<12)
.equ PDRAW_SOFTSCALE, (1<<15)
@ helpers @ helpers
.macro add_c24 d s c .macro add_c24 d s c
@ -1642,7 +1644,7 @@ FinalizeLine555:
ldr r5, [r11, #OFS_EST_PicoOpt] ldr r5, [r11, #OFS_EST_PicoOpt]
ldr r1, [r11, #OFS_EST_HighCol] ldr r1, [r11, #OFS_EST_HighCol]
ldr r0, [r11, #OFS_EST_DrawLineDest] ldr r0, [r11, #OFS_EST_DrawLineDest]
ldr r4, [r5] ldr r4, [r11, #OFS_EST_rendstatus]
ldr r7, [r5, #OFS_PicoIn_AHW-OFS_PicoIn_opt] ldr r7, [r5, #OFS_PicoIn_AHW-OFS_PicoIn_opt]
ldrb r12,[r8, #OFS_Pico_video_reg+12] ldrb r12,[r8, #OFS_Pico_video_reg+12]
ldrb r6, [r8, #OFS_Pico_video_reg+0] ldrb r6, [r8, #OFS_Pico_video_reg+0]
@ -1664,7 +1666,7 @@ FinalizeLine555:
.fl_gg20col: .fl_gg20col:
mov r2, #160/8 @ len = 160 mov r2, #160/8 @ len = 160
tst r4, #0x4000 @ EN_SOFTSCALE? tst r4, #PDRAW_SOFTSCALE
bne .fl_20scale_RGB555 @ scale 160->320 bne .fl_20scale_RGB555 @ scale 160->320
b .fl_checkborder b .fl_checkborder
@ -1675,15 +1677,15 @@ FinalizeLine555:
mov r2, #256/8 @ len = 256 mov r2, #256/8 @ len = 256
.fl_check32scaling: .fl_check32scaling:
tst r4, #0x4000 @ EN_SOFTSCALE? tst r4, #PDRAW_SOFTSCALE
rsbne r7, r2, #256/8 rsbne r7, r2, #256/8
addne r0, r0, r7, lsl #3 @ pd += (256-len)>>1 addne r0, r0, r7, lsl #3 @ pd += (256-len)>>1
bne .fl_32scale_RGB555 @ scale 256->320 bne .fl_32scale_RGB555 @ scale 256->320
.fl_checkborder: .fl_checkborder:
tst r4, #0x0100 @ DIS_32C_BORDER? tst r4, #PDRAW_BORDER_32
rsbeq r7, r2, #320/8 @ pd += (320-len)/2 rsbne r7, r2, #320/8 @ pd += (320-len)/2
addeq r0, r0, r7, lsl #3 addne r0, r0, r7, lsl #3
.fl_40colRGB555: .fl_40colRGB555:
#ifdef UNALIGNED_DRAWLINEDEST #ifdef UNALIGNED_DRAWLINEDEST

View file

@ -223,7 +223,6 @@ void vidConvCpyRGB565(void *to, void *from, int pixels);
#endif #endif
void PicoDoHighPal555(int sh, int line, struct PicoEState *est); void PicoDoHighPal555(int sh, int line, struct PicoEState *est);
// internals, NB must keep in sync with ASM draw functions // internals, NB must keep in sync with ASM draw functions
#define PDRAW_SYNC_NEEDED (1<<0) // redraw needed
#define PDRAW_WND_DIFF_PRIO (1<<1) // not all window tiles use same priority #define PDRAW_WND_DIFF_PRIO (1<<1) // not all window tiles use same priority
#define PDRAW_PARSE_SPRITES (1<<2) // SAT needs parsing #define PDRAW_PARSE_SPRITES (1<<2) // SAT needs parsing
#define PDRAW_INTERLACE (1<<3) #define PDRAW_INTERLACE (1<<3)
@ -237,7 +236,9 @@ void PicoDoHighPal555(int sh, int line, struct PicoEState *est);
#define PDRAW_30_ROWS (1<<11) // 30 rows mode (240 lines) #define PDRAW_30_ROWS (1<<11) // 30 rows mode (240 lines)
#define PDRAW_32X_SCALE (1<<12) // scale CLUT layer for 32X #define PDRAW_32X_SCALE (1<<12) // scale CLUT layer for 32X
#define PDRAW_SMS_BLANK_1 (1<<13) // 1st column blanked #define PDRAW_SMS_BLANK_1 (1<<13) // 1st column blanked
#define PDRAW_SYNC_NEXT (1<<14) // sync next frame #define PDRAW_SOFTSCALE (1<<15) // H32 upscaling
#define PDRAW_SYNC_NEEDED (1<<16) // redraw needed
#define PDRAW_SYNC_NEXT (1<<17) // redraw next frame
extern int rendstatus_old; extern int rendstatus_old;
extern int rendlines; extern int rendlines;