mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
sms, improve changing of video mode
This commit is contained in:
parent
6396f46107
commit
c180662e07
2 changed files with 16 additions and 13 deletions
|
@ -1943,7 +1943,7 @@ PICO_INTERNAL void PicoFrameStart(void)
|
||||||
|
|
||||||
if (est->rendstatus != rendstatus_old || lines != rendlines) {
|
if (est->rendstatus != rendstatus_old || lines != rendlines) {
|
||||||
rendlines = lines;
|
rendlines = lines;
|
||||||
// mode_change() might reset rendstatus_old by calling SetColorFormat
|
// mode_change() might reset rendstatus_old by calling SetOutFormat
|
||||||
int rendstatus = est->rendstatus;
|
int rendstatus = est->rendstatus;
|
||||||
emu_video_mode_change(loffs, lines, coffs, columns);
|
emu_video_mode_change(loffs, lines, coffs, columns);
|
||||||
rendstatus_old = rendstatus;
|
rendstatus_old = rendstatus;
|
||||||
|
|
27
pico/mode4.c
27
pico/mode4.c
|
@ -728,11 +728,12 @@ static void FinalizeLine8bitSMS(int line);
|
||||||
|
|
||||||
void PicoFrameStartSMS(void)
|
void PicoFrameStartSMS(void)
|
||||||
{
|
{
|
||||||
|
struct PicoEState *est = &Pico.est;
|
||||||
int lines = 192, columns = 256, loffs, coffs;
|
int lines = 192, columns = 256, loffs, coffs;
|
||||||
|
|
||||||
skip_next_line = 0;
|
skip_next_line = 0;
|
||||||
loffs = screen_offset = 24; // 192 lines is really 224 with top/bottom bars
|
loffs = screen_offset = 24; // 192 lines is really 224 with top/bottom bars
|
||||||
Pico.est.rendstatus = PDRAW_32_COLS;
|
est->rendstatus = PDRAW_32_COLS;
|
||||||
|
|
||||||
// if mode changes make palette dirty since some modes switch to a fixed one
|
// if mode changes make palette dirty since some modes switch to a fixed one
|
||||||
if (mode != ((Pico.video.reg[0]&0x06) | (Pico.video.reg[1]&0x18))) {
|
if (mode != ((Pico.video.reg[0]&0x06) | (Pico.video.reg[1]&0x18))) {
|
||||||
|
@ -753,14 +754,14 @@ void PicoFrameStartSMS(void)
|
||||||
} else {
|
} else {
|
||||||
if ((mode & 4) && (Pico.video.reg[0] & 0x20)) {
|
if ((mode & 4) && (Pico.video.reg[0] & 0x20)) {
|
||||||
// SMS mode 4 with 1st column blanked
|
// SMS mode 4 with 1st column blanked
|
||||||
Pico.est.rendstatus |= PDRAW_SMS_BLANK_1;
|
est->rendstatus |= PDRAW_SMS_BLANK_1;
|
||||||
columns = 248;
|
columns = 248;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
// SMS2 only 224/240 line modes, e.g. Micro Machines
|
// SMS2 only 224/240 line modes, e.g. Micro Machines
|
||||||
case 0x06|0x08:
|
case 0x06|0x08:
|
||||||
Pico.est.rendstatus |= PDRAW_30_ROWS;
|
est->rendstatus |= PDRAW_30_ROWS;
|
||||||
loffs = screen_offset = 0;
|
loffs = screen_offset = 0;
|
||||||
lines = 240;
|
lines = 240;
|
||||||
break;
|
break;
|
||||||
|
@ -776,32 +777,34 @@ void PicoFrameStartSMS(void)
|
||||||
coffs = (FinalizeLineSMS == NULL && columns == 248 ? 8 : 0);
|
coffs = (FinalizeLineSMS == NULL && columns == 248 ? 8 : 0);
|
||||||
if (FinalizeLineSMS != NULL && (PicoIn.opt & POPT_EN_SOFTSCALE)) {
|
if (FinalizeLineSMS != NULL && (PicoIn.opt & POPT_EN_SOFTSCALE)) {
|
||||||
// softscaling always generates 320px, but no scaling in 8bit fast
|
// softscaling always generates 320px, but no scaling in 8bit fast
|
||||||
Pico.est.rendstatus |= PDRAW_SOFTSCALE;
|
est->rendstatus |= PDRAW_SOFTSCALE;
|
||||||
coffs = 0;
|
coffs = 0;
|
||||||
columns = 320;
|
columns = 320;
|
||||||
} else if (!(PicoIn.opt & POPT_DIS_32C_BORDER)) {
|
} else if (!(PicoIn.opt & POPT_DIS_32C_BORDER)) {
|
||||||
Pico.est.rendstatus |= PDRAW_BORDER_32;
|
est->rendstatus |= PDRAW_BORDER_32;
|
||||||
line_offset -= coffs;
|
line_offset -= coffs;
|
||||||
coffs = (320-columns) / 2;
|
coffs = (320-columns) / 2;
|
||||||
if (FinalizeLineSMS == NULL)
|
if (FinalizeLineSMS == NULL)
|
||||||
line_offset += coffs; // ... else centering done in FinalizeLine
|
line_offset += coffs; // ... else centering done in FinalizeLine
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Pico.est.rendstatus != rendstatus_old || lines != rendlines) {
|
if (est->rendstatus != rendstatus_old || lines != rendlines) {
|
||||||
|
// mode_change() might reset rendstatus_old by calling SetOutFormat
|
||||||
|
int rendstatus = est->rendstatus;
|
||||||
emu_video_mode_change(loffs, lines, coffs, columns);
|
emu_video_mode_change(loffs, lines, coffs, columns);
|
||||||
rendstatus_old = Pico.est.rendstatus;
|
rendstatus_old = rendstatus;
|
||||||
rendlines = lines;
|
rendlines = lines;
|
||||||
sprites = 0;
|
sprites = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Pico.est.HighCol = HighColBase + screen_offset * HighColIncrement;
|
est->HighCol = HighColBase + screen_offset * HighColIncrement;
|
||||||
Pico.est.DrawLineDest = (char *)DrawLineDestBase + screen_offset * DrawLineDestIncrement;
|
est->DrawLineDest = (char *)DrawLineDestBase + screen_offset * DrawLineDestIncrement;
|
||||||
|
|
||||||
if (FinalizeLineSMS == FinalizeLine8bitSMS) {
|
if (FinalizeLineSMS == FinalizeLine8bitSMS) {
|
||||||
Pico.m.dirtyPal = (Pico.m.dirtyPal || Pico.est.SonicPalCount ? 2 : 0);
|
Pico.m.dirtyPal = (Pico.m.dirtyPal || est->SonicPalCount ? 2 : 0);
|
||||||
memcpy(Pico.est.SonicPal, PicoMem.cram, 0x40*2);
|
memcpy(est->SonicPal, PicoMem.cram, 0x40*2);
|
||||||
}
|
}
|
||||||
Pico.est.SonicPalCount = 0;
|
est->SonicPalCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PicoParseSATSMS(int line)
|
void PicoParseSATSMS(int line)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue