X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2F32x%2Fdraw.c;fp=pico%2F32x%2Fdraw.c;h=7e0911e953fb06161a021fc4c64b3b1414f057ce;hb=266c6afa84bde8d77a54d61ced8f227480247e24;hp=1e2f57c67c36e5f16bab22ce72234bdb8e9e1568;hpb=acd35d4c08522db8cd6714c95c022be98f0889d7;p=picodrive.git diff --git a/pico/32x/draw.c b/pico/32x/draw.c index 1e2f57c..7e0911e 100644 --- a/pico/32x/draw.c +++ b/pico/32x/draw.c @@ -27,7 +27,8 @@ void FinalizeLine32xRGB555(int sh, int line) unsigned short *pd = DrawLineDest; unsigned short *pal = Pico32xMem->pal_native; unsigned char *pb = HighCol + 8; - unsigned short cram0; + unsigned short *dram, *ps, cram0; + int i; // this is a bit hackish: // we swap cram color 0 with color that is used for background, @@ -44,14 +45,30 @@ void FinalizeLine32xRGB555(int sh, int line) if (!(PicoDrawMask & PDRAW_32X_ON)) return; + dram = (void *)Pico32xMem->dram[Pico32x.vdp_regs[0x0a/2] & P32XV_FS]; + ps = dram + dram[line]; + + if ((Pico32x.vdp_regs[0] & P32XV_Mx) == 2) { // Direct Color Mode + int inv = (Pico32x.vdp_regs[0] & P32XV_PRI) ? 0x8000 : 0; + unsigned int m1 = 0x001f001f; + unsigned int m2 = 0x03e003e0; + unsigned int m3 = 0xfc00fc00; + + for (i = 320; i > 0; i--, ps++, pd++, pb++) { + unsigned short t = *ps; + if (*pb != 0 && !((t ^ inv) & 0x8000)) + continue; + + *pd = ((t & m1) << 11) | ((t & m2) << 1) | ((t & m3) >> 10); + } + return; + } + if (Pico32x.dirty_pal) convert_pal555(Pico32x.vdp_regs[0] & P32XV_PRI); - if ((Pico32x.vdp_regs[0] & P32XV_Mx) == 1) { - unsigned short *dram = (void *)Pico32xMem->dram[Pico32x.vdp_regs[0x0a/2] & P32XV_FS]; - unsigned short *ps = dram + dram[line]; + if ((Pico32x.vdp_regs[0] & P32XV_Mx) == 1) { // Packed Pixel Mode unsigned short t; - int i; for (i = 320/2; i > 0; i--, ps++, pd += 2, pb += 2) { t = pal[*ps >> 8]; if (pb[0] == 0 || (t & 0x20)) @@ -61,5 +78,8 @@ void FinalizeLine32xRGB555(int sh, int line) pd[1] = t; } } + else { // Run Length Mode + + } }