X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ftom.cpp;h=4b109b46965cc4b46c527e471347d7c8177b019f;hb=85fb2fe5f5a002a261e6b873b8393e085990a700;hp=b3882a09f3fbe645e4b1b17ba6d6c2aaf21f9483;hpb=94e1e961b57f253b760298ab0bae96a7de6d20fa;p=virtualjaguar diff --git a/src/tom.cpp b/src/tom.cpp index b3882a0..4b109b4 100644 --- a/src/tom.cpp +++ b/src/tom.cpp @@ -11,9 +11,10 @@ // Who When What // --- ---------- ------------------------------------------------------------- // JLH 01/16/2010 Created this log ;-) +// JLH 01/20/2011 Change rendering to RGBA, removed unnecessary code // // Note: Endian wrongness probably stems from the MAME origins of this emu and -// the braindead way in which MAME handles memory. :-) +// the braindead way in which MAME used to handle memory. :-} // // Note: TOM has only a 16K memory space // @@ -328,12 +329,8 @@ uint32 tomWidth, tomHeight; uint32 tomTimerPrescaler; uint32 tomTimerDivider; int32 tomTimerCounter; -//uint32 tom_scanline; -//uint32 hblankWidthInPixels = 0; uint16 tom_jerry_int_pending, tom_timer_int_pending, tom_object_int_pending, tom_gpu_int_pending, tom_video_int_pending; -//uint16 * tom_cry_rgb_mix_lut; -//int16 * TOMBackbuffer; uint32 * TOMBackbuffer; static const char * videoMode_to_str[8] = @@ -350,13 +347,8 @@ void tom_render_16bpp_direct_scanline(uint32 * backbuffer); void tom_render_16bpp_rgb_scanline(uint32 * backbuffer); void tom_render_16bpp_cry_rgb_mix_scanline(uint32 * backbuffer); -void tom_render_16bpp_cry_stretch_scanline(uint32 * backbuffer); -void tom_render_24bpp_stretch_scanline(uint32 * backbuffer); -void tom_render_16bpp_direct_stretch_scanline(uint32 * backbuffer); -void tom_render_16bpp_rgb_stretch_scanline(uint32 * backbuffer); -void tom_render_16bpp_cry_rgb_mix_stretch_scanline(uint32 * backbuffer); - -render_xxx_scanline_fn * scanline_render_normal[] = +//render_xxx_scanline_fn * scanline_render_normal[] = +render_xxx_scanline_fn * scanline_render[] = { tom_render_16bpp_cry_scanline, tom_render_24bpp_scanline, @@ -368,21 +360,6 @@ render_xxx_scanline_fn * scanline_render_normal[] = tom_render_16bpp_rgb_scanline }; -render_xxx_scanline_fn * scanline_render_stretch[] = -{ - tom_render_16bpp_cry_stretch_scanline, - tom_render_24bpp_stretch_scanline, - tom_render_16bpp_direct_stretch_scanline, - tom_render_16bpp_rgb_stretch_scanline, - tom_render_16bpp_cry_rgb_mix_stretch_scanline, - tom_render_24bpp_stretch_scanline, - tom_render_16bpp_direct_stretch_scanline, - tom_render_16bpp_rgb_stretch_scanline, -}; - -render_xxx_scanline_fn * scanline_render[8]; - - // Screen info for various games [PAL]... /* BIOS @@ -560,30 +537,32 @@ uint32 MIX16ToRGB32[0x10000]; #warning "This is not endian-safe. !!! FIX !!!" void TOMFillLookupTables(void) { + // NOTE: Jaguar 16-bit (non-CRY) color is RBG 556 like so: + // RRRR RBBB BBGG GGGG for(uint32 i=0; i<0x10000; i++) - RGB16ToRGB32[i] = 0xFF000000 - | ((i & 0xF100) >> 8) | ((i & 0xE000) >> 13) - | ((i & 0x07C0) << 13) | ((i & 0x0700) << 8) - | ((i & 0x003F) << 10) | ((i & 0x0030) << 4); - +//hm. RGB16ToRGB32[i] = 0xFF000000 +// | ((i & 0xF100) >> 8) | ((i & 0xE000) >> 13) +// | ((i & 0x07C0) << 13) | ((i & 0x0700) << 8) +// | ((i & 0x003F) << 10) | ((i & 0x0030) << 4); + RGB16ToRGB32[i] = 0x000000FF + | ((i & 0xF100) << 16) // Red + | ((i & 0x003F) << 18) // Green + | ((i & 0x07C0) << 5); // Blue for(uint32 i=0; i<0x10000; i++) { - uint32 chrm = (i & 0xF000) >> 12, - chrl = (i & 0x0F00) >> 8, - y = (i & 0x00FF); + uint32 cyan = (i & 0xF000) >> 12, + red = (i & 0x0F00) >> 8, + intensity = (i & 0x00FF); - uint32 r = (((uint32)redcv[chrm][chrl]) * y) >> 8, - g = (((uint32)greencv[chrm][chrl]) * y) >> 8, - b = (((uint32)bluecv[chrm][chrl]) * y) >> 8; + uint32 r = (((uint32)redcv[cyan][red]) * intensity) >> 8, + g = (((uint32)greencv[cyan][red]) * intensity) >> 8, + b = (((uint32)bluecv[cyan][red]) * intensity) >> 8; - CRY16ToRGB32[i] = 0xFF000000 | (b << 16) | (g << 8) | r; +//hm. CRY16ToRGB32[i] = 0xFF000000 | (b << 16) | (g << 8) | r; + CRY16ToRGB32[i] = 0x000000FF | (r << 24) | (g << 16) | (b << 8); MIX16ToRGB32[i] = (i & 0x01 ? RGB16ToRGB32[i] : CRY16ToRGB32[i]); } - -// for(uint32 i=0; i<0x10000; i++) -// if (i & 0x01) -// MIX16ToRGB32[i] = RGB16ToRGB32[i]; } void TOMSetPendingJERRYInt(void) @@ -717,7 +696,8 @@ void tom_render_24bpp_scanline(uint32 * backbuffer) uint32 r = *current_line_buffer++; current_line_buffer++; uint32 b = *current_line_buffer++; - *backbuffer++ = 0xFF000000 | (b << 16) | (g << 8) | r; +//hm. *backbuffer++ = 0xFF000000 | (b << 16) | (g << 8) | r; + *backbuffer++ = 0x000000FF | (r << 24) | (g << 16) | (r << 8); width--; } } @@ -773,132 +753,6 @@ void tom_render_16bpp_rgb_scanline(uint32 * backbuffer) } } -///////////////////////////////////////////////////////////////////// -// This stuff may just go away by itself, especially if we do some // -// good old OpenGL goodness... // -///////////////////////////////////////////////////////////////////// - -void tom_render_16bpp_cry_rgb_mix_stretch_scanline(uint32 *backbuffer) -{ - uint16 width=tomWidth; - uint8 *current_line_buffer=(uint8*)&tomRam8[0x1800]; - - while (width) - { - uint16 color = *current_line_buffer++; - color <<= 8; - color |= *current_line_buffer++; - *backbuffer++ = MIX16ToRGB32[color]; - current_line_buffer += 2; - width--; - } -} - -void tom_render_16bpp_cry_stretch_scanline(uint32 *backbuffer) -{ - uint32 chrm, chrl, y; - - uint16 width=tomWidth; - uint8 *current_line_buffer=(uint8*)&tomRam8[0x1800]; - - while (width) - { - uint16 color; - color=*current_line_buffer++; - color<<=8; - color|=*current_line_buffer++; - - chrm = (color & 0xF000) >> 12; - chrl = (color & 0x0F00) >> 8; - y = (color & 0x00FF); - - uint16 red = ((((uint32)redcv[chrm][chrl])*y)>>11); - uint16 green = ((((uint32)greencv[chrm][chrl])*y)>>11); - uint16 blue = ((((uint32)bluecv[chrm][chrl])*y)>>11); - - uint16 color2; - color2=*current_line_buffer++; - color2<<=8; - color2|=*current_line_buffer++; - - chrm = (color2 & 0xF000) >> 12; - chrl = (color2 & 0x0F00) >> 8; - y = (color2 & 0x00FF); - - uint16 red2 = ((((uint32)redcv[chrm][chrl])*y)>>11); - uint16 green2 = ((((uint32)greencv[chrm][chrl])*y)>>11); - uint16 blue2 = ((((uint32)bluecv[chrm][chrl])*y)>>11); - - red=(red+red2)>>1; - green=(green+green2)>>1; - blue=(blue+blue2)>>1; - - *backbuffer++=(red<<10)|(green<<5)|blue; - width--; - } -} - -void tom_render_24bpp_stretch_scanline(uint32 *backbuffer) -{ - uint16 width=tomWidth; - uint8 *current_line_buffer=(uint8*)&tomRam8[0x1800]; - - while (width) - { - uint16 green=*current_line_buffer++; - uint16 red=*current_line_buffer++; - /*uint16 nc=*/current_line_buffer++; - uint16 blue=*current_line_buffer++; - red>>=3; - green>>=3; - blue>>=3; - *backbuffer++=(red<<10)|(green<<5)|blue; - current_line_buffer+=4; - width--; - } -} - -void tom_render_16bpp_direct_stretch_scanline(uint32 *backbuffer) -{ - uint16 width=tomWidth; - uint8 *current_line_buffer=(uint8*)&tomRam8[0x1800]; - - while (width) - { - uint16 color=*current_line_buffer++; - color<<=8; - color|=*current_line_buffer++; - color>>=1; - *backbuffer++=color; - current_line_buffer+=2; - width--; - } -} - -void tom_render_16bpp_rgb_stretch_scanline(uint32 *backbuffer) -{ - uint16 width=tomWidth; - uint8 *current_line_buffer=(uint8*)&tomRam8[0x1800]; - - while (width) - { - uint16 color1=*current_line_buffer++; - color1<<=8; - color1|=*current_line_buffer++; - color1>>=1; - uint16 color2=*current_line_buffer++; - color2<<=8; - color2|=*current_line_buffer++; - color2>>=1; - uint16 red=(((color1&0x7c00)>>10)+((color2&0x7c00)>>10))>>1; - uint16 green=(((color1&0x00003e0)>>5)+((color2&0x00003e0)>>5))>>1; - uint16 blue=(((color1&0x0000001f))+((color2&0x0000001f)))>>1; - - color1=(red<<10)|(blue<<5)|green; - *backbuffer++=color1; - width--; - } -} void TOMResetBackbuffer(uint32 * backbuffer) { @@ -908,6 +762,7 @@ void TOMResetBackbuffer(uint32 * backbuffer) // // Process a single scanline // +uint32 tomDeviceWidth;//kludge void TOMExecScanline(uint16 scanline, bool render) { bool inActiveDisplayArea = true; @@ -1014,13 +869,16 @@ void tom_render_24bpp_scanline(uint32 * backbuffer) // If outside of VDB & VDE, then display the border color uint32 * currentLineBuffer = TOMBackbuffer; uint8 g = tomRam8[BORD1], r = tomRam8[BORD1 + 1], b = tomRam8[BORD2 + 1]; - uint32 pixel = 0xFF000000 | (b << 16) | (g << 8) | r; +//Hm. uint32 pixel = 0xFF000000 | (b << 16) | (g << 8) | r; + uint32 pixel = 0x000000FF | (r << 24) | (g << 16) | (b << 8); for(uint32 i=0; i