X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fmode4.c;h=4abace6b7c0ef120a0f6836d322cbaba6375fbda;hb=40d22a8e7610b2fdde5cfe6178605262ef0d61d7;hp=095250f9f0ac54631270b68175c73543c8be114f;hpb=87b0845f3733166b491ae236feb8bc2eb0fca2ec;p=picodrive.git diff --git a/pico/mode4.c b/pico/mode4.c index 095250f..4abace6 100644 --- a/pico/mode4.c +++ b/pico/mode4.c @@ -1,3 +1,10 @@ +/* + * mode4/SMS renderer + * (C) notaz, 2009-2010 + * + * This work is licensed under the terms of MAME license. + * See COPYING file in the top-level directory. + */ /* * TODO: * - TMS9918 modes? @@ -8,7 +15,7 @@ */ #include "pico_int.h" -static void (*FinalizeLineM4)(void); +static void (*FinalizeLineM4)(int line); static int skip_next_line; static int screen_offset; @@ -21,7 +28,7 @@ static int screen_offset; static int TileNormM4(int sx, int addr, int pal) { - unsigned char *pd = HighCol + sx; + unsigned char *pd = Pico.est.HighCol + sx; unsigned int pack, t; pack = *(unsigned int *)(Pico.vram + addr); /* Get 4 bitplanes / 8 pixels */ @@ -43,7 +50,7 @@ static int TileNormM4(int sx, int addr, int pal) static int TileFlipM4(int sx,int addr,int pal) { - unsigned char *pd = HighCol + sx; + unsigned char *pd = Pico.est.HighCol + sx; unsigned int pack, t; pack = *(unsigned int *)(Pico.vram + addr); /* Get 4 bitplanes / 8 pixels */ @@ -185,23 +192,34 @@ static void DrawDisplayM4(int scanline) if (pv->reg[0] & 0x20) // first column masked - ((int *)HighCol)[2] = ((int *)HighCol)[3] = 0xe0e0e0e0; + ((int *)Pico.est.HighCol)[2] = ((int *)Pico.est.HighCol)[3] = 0xe0e0e0e0; } void PicoFrameStartMode4(void) { + int lines = 192; skip_next_line = 0; screen_offset = 24; - rendstatus = PDRAW_192LINES; + Pico.est.rendstatus = PDRAW_32_COLS; + if ((Pico.video.reg[0] & 6) == 6 && (Pico.video.reg[1] & 0x18)) { - rendstatus &= ~PDRAW_192LINES; if (Pico.video.reg[1] & 0x08) { screen_offset = 0; - rendstatus |= PDRAW_240LINES; + lines = 240; } - else // it's 224 lines + else { screen_offset = 8; + lines = 224; + } } + + if (Pico.est.rendstatus != rendstatus_old || lines != rendlines) { + emu_video_mode_change(screen_offset, lines, 1); + rendstatus_old = Pico.est.rendstatus; + rendlines = lines; + } + + Pico.est.DrawLineDest = (char *)DrawLineDestBase + screen_offset * DrawLineDestIncrement; } void PicoLineMode4(int line) @@ -215,21 +233,23 @@ void PicoLineMode4(int line) skip_next_line = PicoScanBegin(line + screen_offset); // Draw screen: - BackFill(Pico.video.reg[7] & 0x0f, 0); + BackFill(Pico.video.reg[7] & 0x0f, 0, &Pico.est); if (Pico.video.reg[1] & 0x40) DrawDisplayM4(line); if (FinalizeLineM4 != NULL) - FinalizeLineM4(); + FinalizeLineM4(line); if (PicoScanEnd != NULL) skip_next_line = PicoScanEnd(line + screen_offset); + + Pico.est.DrawLineDest = (char *)Pico.est.DrawLineDest + DrawLineDestIncrement; } void PicoDoHighPal555M4(void) { unsigned int *spal=(void *)Pico.cram; - unsigned int *dpal=(void *)HighPal; + unsigned int *dpal=(void *)Pico.est.HighPal; unsigned int t; int i; @@ -247,41 +267,36 @@ void PicoDoHighPal555M4(void) t |= (t >> 4) & 0x08610861; *dpal = t; } + Pico.est.HighPal[0xe0] = 0; } -static void FinalizeLineRGB555M4(void) +static void FinalizeLineRGB555M4(int line) { - unsigned short *pd=DrawLineDest; - unsigned char *ps=HighCol+8; - unsigned short *pal=HighPal; - int i; - if (Pico.m.dirtyPal) PicoDoHighPal555M4(); - if (!(PicoOpt & POPT_DIS_32C_BORDER)) - pd += 32; - - for (i = 256/4; i > 0; i--) { - *pd++ = pal[*ps++]; - *pd++ = pal[*ps++]; - *pd++ = pal[*ps++]; - *pd++ = pal[*ps++]; - } + // standard FinalizeLine can finish it for us, + // with features like scaling and such + FinalizeLine555(0, line, &Pico.est); } -static void FinalizeLine8bitM4(void) +static void FinalizeLine8bitM4(int line) { - memcpy32(DrawLineDest, (int *)(HighCol+8), 256/4); + unsigned char *pd = Pico.est.DrawLineDest; + + if (!(PicoOpt & POPT_DIS_32C_BORDER)) + pd += 32; + + memcpy32((int *)pd, (int *)(Pico.est.HighCol+8), 256/4); } -void PicoDrawSetColorFormatMode4(int which) +void PicoDrawSetOutputMode4(pdso_t which) { switch (which) { - case 2: FinalizeLineM4 = FinalizeLine8bitM4; break; - case 1: FinalizeLineM4 = FinalizeLineRGB555M4; break; - default:FinalizeLineM4 = NULL; break; + case PDF_8BIT: FinalizeLineM4 = FinalizeLine8bitM4; break; + case PDF_RGB555: FinalizeLineM4 = FinalizeLineRGB555M4; break; + default: FinalizeLineM4 = NULL; break; } }