#include "log.h"
#include "m68k.h"
//#include "memory.h"
-#include "objectp.h"
+#include "op.h"
#include "settings.h"
#define NEW_TIMER_SYSTEM
#define VDB 0x46
#define VDE 0x48
#define VI 0x4E
+#define PIT0 0x50
+#define PIT1 0x52
#define BG 0x58
#define INT1 0xE0
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",
}
-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;
//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...
+/*
+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)
{
}
#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...
//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
{
/*
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);
for(uint32 i=0; i<tomWidth; i++)
*currentLineBuffer++ = pixel;
}
-
-#warning "!!! Need to move this to an interface file !!! FIX !!!"
-// TOMBackbuffer += GetSDLScreenWidthInPixels();
- TOMBackbuffer += tomDeviceWidth;
}
}
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);
tom_timer_int_pending = 0;
if (data & 0x1000)
tom_jerry_int_pending = 0;
+
+// return;
}
else if ((offset >= 0xF02200) && (offset <= 0xF0229F))
{
// 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);
}
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)
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...
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();
}
// 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();
}