X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ftom.cpp;h=82062bd1a7517baba30c081d2236687375f2af5c;hb=253f7b2713969c4982a3149c55e378db51d7791d;hp=046547248d5c41372490a2a99784e7fa476ee179;hpb=166019baeee39e3867ecf6c4eddd0855dc3507a4;p=virtualjaguar diff --git a/src/tom.cpp b/src/tom.cpp index 0465472..82062bd 100644 --- a/src/tom.cpp +++ b/src/tom.cpp @@ -332,7 +332,11 @@ uint32 tomTimerDivider; int32 tomTimerCounter; uint16 tom_jerry_int_pending, tom_timer_int_pending, tom_object_int_pending, tom_gpu_int_pending, tom_video_int_pending; -uint32 * TOMBackbuffer; + +// These are set by the "user" of the Jaguar core lib, since these are +// OS/system dependent. +uint32 * screenBuffer; +uint32 screenPitch; static const char * videoMode_to_str[8] = { "16 BPP CRY", "24 BPP RGB", "16 BPP DIRECT", "16 BPP RGB", @@ -755,15 +759,14 @@ void tom_render_16bpp_rgb_scanline(uint32 * backbuffer) } -void TOMResetBackbuffer(uint32 * backbuffer) +/*void TOMResetBackbuffer(uint32 * backbuffer) { TOMBackbuffer = backbuffer; -} +}*/ // // Process a single scanline // -uint32 tomDeviceWidth;//kludge void TOMExecScanline(uint16 scanline, bool render) { bool inActiveDisplayArea = true; @@ -776,8 +779,19 @@ void TOMExecScanline(uint16 scanline, bool render) // And it works! But need to do some optimizations in the OP to keep it from attempting // to do a scanline render in the non-display area... [DONE] //this seems to cause a regression in certain games, like rayman +//which means I have to dig thru the asic nets to see what's wrong... +/* +No, the OP doesn't start until VDB, that much is certain. The thing is, VDB is the +HALF line that the OP starts on--which means that it needs to start at VDB / 2!!! + +Hrm, doesn't seem to be enough, though it should be... still sticks for 20 frames. +*/ #if 1 +// 16 isn't enough, and neither is 32 for raptgun. 32 fucks up Rayman +// if (scanline >= ((uint16)GET16(tomRam8, VDB) / 2) && scanline < ((uint16)GET16(tomRam8, VDE) / 2)) if (scanline >= (uint16)GET16(tomRam8, VDB) && scanline < (uint16)GET16(tomRam8, VDE)) +// if (scanline >= ((uint16)GET16(tomRam8, VDB) - 16) && scanline < (uint16)GET16(tomRam8, VDE)) +// if (scanline >= 20 && scanline < (uint16)GET16(tomRam8, VDE)) { if (render) { @@ -818,10 +832,11 @@ void TOMExecScanline(uint16 scanline, bool render) } #endif - // Try to take PAL into account... + // Try to take PAL into account... [We do now!] uint16 topVisible = (vjs.hardwareTypeNTSC ? TOP_VISIBLE_VC : TOP_VISIBLE_VC_PAL), bottomVisible = (vjs.hardwareTypeNTSC ? BOTTOM_VISIBLE_VC : BOTTOM_VISIBLE_VC_PAL); + uint32 * TOMCurrentLine = &(screenBuffer[((scanline - topVisible) / 2) * screenPitch]); // Here's our virtualized scanline code... @@ -832,7 +847,8 @@ void TOMExecScanline(uint16 scanline, bool render) //NOTE: The following doesn't put BORDER color on the sides... !!! FIX !!! #warning "The following doesn't put BORDER color on the sides... !!! FIX !!!" if (vjs.renderType == RT_NORMAL) - scanline_render[TOMGetVideoMode()](TOMBackbuffer); +// scanline_render[TOMGetVideoMode()](TOMBackbuffer); + scanline_render[TOMGetVideoMode()](TOMCurrentLine); else//TV type render { /* @@ -896,7 +912,7 @@ void tom_render_24bpp_scanline(uint32 * backbuffer) else { // If outside of VDB & VDE, then display the border color - uint32 * currentLineBuffer = TOMBackbuffer; + uint32 * currentLineBuffer = TOMCurrentLine; uint8 g = tomRam8[BORD1], r = tomRam8[BORD1 + 1], b = tomRam8[BORD2 + 1]; //Hm. uint32 pixel = 0xFF000000 | (b << 16) | (g << 8) | r; uint32 pixel = 0x000000FF | (r << 24) | (g << 16) | (b << 8); @@ -904,10 +920,6 @@ void tom_render_24bpp_scanline(uint32 * backbuffer) for(uint32 i=0; i