X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ftom.cpp;h=08832a8ce3ccb3b3ed9c304c26cd5ca3e54df7a9;hb=22e4f2eeba52ba2a1f2808e82147dc57a9e4e44f;hp=f9054f6769067aa6fcd9796409d640fdcb570a8d;hpb=fcdc03c5e732a7e4461c817c3c315a11ed87d3b9;p=virtualjaguar diff --git a/src/tom.cpp b/src/tom.cpp index f9054f6..08832a8 100644 --- a/src/tom.cpp +++ b/src/tom.cpp @@ -265,7 +265,7 @@ #include "log.h" #include "m68k.h" //#include "memory.h" -#include "objectp.h" +#include "op.h" #include "settings.h" #define NEW_TIMER_SYSTEM @@ -296,6 +296,8 @@ #define VDB 0x46 #define VDE 0x48 #define VI 0x4E +#define PIT0 0x50 +#define PIT1 0x52 #define BG 0x58 #define INT1 0xE0 @@ -330,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", @@ -753,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; @@ -773,8 +778,12 @@ void TOMExecScanline(uint16 scanline, bool render) //Hm, it seems that the OP needs to execute from zero, so let's try it: // 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] -#if 0 +//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... +#if 1 +// 16 isn't enough, and neither is 32 for raptgun. 32 fucks up Rayman if (scanline >= (uint16)GET16(tomRam8, VDB) && scanline < (uint16)GET16(tomRam8, VDE)) +// if (scanline >= ((uint16)GET16(tomRam8, VDB) - 32) && scanline < (uint16)GET16(tomRam8, VDE)) { if (render) { @@ -815,10 +824,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... @@ -829,7 +839,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 { /* @@ -893,7 +904,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); @@ -901,10 +912,6 @@ void tom_render_24bpp_scanline(uint32 * backbuffer) for(uint32 i=0; i= 0xF02000 && offset <= 0xF020FF) if (offset == 0xF000E0) { + // For reading, should only return the lower 5 bits... uint16 data = (tom_jerry_int_pending << 4) | (tom_timer_int_pending << 3) | (tom_object_int_pending << 2) | (tom_gpu_int_pending << 1) | (tom_video_int_pending << 0); @@ -1340,6 +1348,8 @@ if (offset >= 0xF02000 && offset <= 0xF020FF) tom_timer_int_pending = 0; if (data & 0x1000) tom_jerry_int_pending = 0; + +// return; } else if ((offset >= 0xF02200) && (offset <= 0xF0229F)) { @@ -1351,6 +1361,7 @@ if (offset >= 0xF02000 && offset <= 0xF020FF) // Writing to one CLUT writes to the other offset &= 0x5FF; // Mask out $F00600 (restrict to $F00400-5FF) // Watch out for unaligned writes here! (Not fixed yet) +#warning "!!! Watch out for unaligned writes here !!! FIX !!!" SET16(tomRam8, offset, data); SET16(tomRam8, offset + 0x200, data); } @@ -1378,6 +1389,8 @@ if (offset == VP) WriteLog("TOM: Vertical Period written by %s: %u (%sinterlaced)\n", whoName[who], data, (data & 0x01 ? "non-" : "")); if (offset == HDB1) WriteLog("TOM: Horizontal Display Begin 1 written by %s: %u\n", whoName[who], data); +if (offset == HDB2) + WriteLog("TOM: Horizontal Display Begin 2 written by %s: %u\n", whoName[who], data); if (offset == HDE) WriteLog("TOM: Horizontal Display End written by %s: %u\n", whoName[who], data); if (offset == HP) @@ -1396,6 +1409,12 @@ if (offset == HBE) WriteLog("TOM: Horizontal Blank End written by %s: %u\n", whoName[who], data); if (offset == VMODE) WriteLog("TOM: Video Mode written by %s: %04X. PWIDTH = %u, MODE = %s, flags:%s%s (VC = %u)\n", whoName[who], data, ((data >> 9) & 0x07) + 1, videoMode_to_str[(data & MODE) >> 1], (data & BGEN ? " BGEN" : ""), (data & VARMOD ? " VARMOD" : ""), GET16(tomRam8, VC)); +if (offset == PIT0) + WriteLog("TOM: PIT0 written by %s: %u\n", whoName[who], data); +if (offset == PIT1) + WriteLog("TOM: PIT1 written by %s: %u\n", whoName[who], data); +//if (offset == INT1) +// WriteLog("TOM: CPU Interrupt Control written by %s: $%04X (%s%s%s%s%s)\n", whoName[who], data, (data & 0x01 ? "Video" : ""), (data & 0x02 ? " GPU" : ""), (data & 0x04 ? " OP" : ""), (data & 0x08 ? " TOMPIT" : ""), (data & 0x10 ? " Jerry" : "")); // detect screen resolution changes //This may go away in the future, if we do the virtualized screen thing... @@ -1476,7 +1495,7 @@ void TOMExecPIT(uint32 cycles) GPUSetIRQLine(GPUIRQ_TIMER, ASSERT_LINE); // GPUSetIRQLine does the 'IRQ enabled' checking if (TOMIRQEnabled(IRQ_TIMER)) - m68k_set_irq(7); // Cause a 68000 NMI... + m68k_set_irq(2); // Cause a 68000 IPL 2... TOMResetPIT(); } @@ -1491,7 +1510,7 @@ void TOMPITCallback(void) // if (INT1_WREG & 0x08) if (TOMIRQEnabled(IRQ_TIMER)) - m68k_set_irq(7); // Generate 68K NMI + m68k_set_irq(2); // Generate a 68K IPL 2... TOMResetPIT(); }