]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/tom.cpp
Added RISC disassembly browser.
[virtualjaguar] / src / tom.cpp
index f9054f6769067aa6fcd9796409d640fdcb570a8d..9569252d7441e0f5f8594fb1ffa3c31136e5089e 100644 (file)
@@ -3,10 +3,10 @@
 //
 // Originally by David Raingeard (cal2)
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
-// Cleanups and endian wrongness amelioration by James L. Hammons
+// Cleanups and endian wrongness amelioration by James Hammons
 // (C) 2010 Underground Software
 //
-// JLH = James L. Hammons <jlhamm@acm.org>
+// JLH = James Hammons <jlhamm@acm.org>
 //
 // Who  When        What
 // ---  ----------  -------------------------------------------------------------
 #include "gpu.h"
 #include "jaguar.h"
 #include "log.h"
-#include "m68k.h"
+#include "m68000/m68kinterface.h"
 //#include "memory.h"
-#include "objectp.h"
+#include "op.h"
 #include "settings.h"
 
 #define NEW_TIMER_SYSTEM
 #define MEMCON2                0x02
 #define HC                     0x04
 #define VC                     0x06
+#define OLP                    0x20            // Object list pointer
+#define OBF                    0x26            // Object processor flag
 #define VMODE          0x28
 #define   MODE         0x0006          // Line buffer to video generator mode
 #define   BGEN         0x0080          // Background enable (CRY & RGB16 only)
 #define BORD1          0x2A            // Border green/red values (8 BPP)
 #define BORD2          0x2C            // Border blue value (8 BPP)
 #define HP                     0x2E            // Values range from 1 - 1024 (value written + 1)
-#define HBB                    0x30
+#define HBB                    0x30            // Horizontal blank begin
 #define HBE                    0x32
+#define HS                     0x34            // Horizontal sync
+#define HVS                    0x36            // Horizontal vertical sync
 #define HDB1           0x38            // Horizontal display begin 1
 #define HDB2           0x3A
 #define HDE                    0x3C
 #define VP                     0x3E            // Value ranges from 1 - 2048 (value written + 1)
-#define VBB                    0x40
+#define VBB                    0x40            // Vertical blank begin
 #define VBE                    0x42
-#define VS                     0x44
-#define VDB                    0x46
+#define VS                     0x44            // Vertical sync
+#define VDB                    0x46            // Vertical display begin
 #define VDE                    0x48
-#define VI                     0x4E
-#define BG                     0x58
+#define VEB                    0x4A            // Vertical equalization begin
+#define VEE                    0x4C            // Vertical equalization end
+#define VI                     0x4E            // Vertical interrupt
+#define PIT0           0x50
+#define PIT1           0x52
+#define HEQ                    0x54            // Horizontal equalization end
+#define BG                     0x58            // Background color
 #define INT1           0xE0
 
-//NOTE: These arbitrary cutoffs are NOT taken into account for PAL jaguar screens. !!! FIX !!!
+//NOTE: These arbitrary cutoffs are NOT taken into account for PAL jaguar screens. !!! FIX !!! [DONE]
 
 // Arbitrary video cutoff values (i.e., first/last visible spots on a TV, in HC ticks)
+// Also note that VC is in *half* lines, i.e. divide by 2 to get the scanline
 /*#define LEFT_VISIBLE_HC                      208
 #define RIGHT_VISIBLE_HC               1528//*/
-#define LEFT_VISIBLE_HC                        208
-#define RIGHT_VISIBLE_HC               1488
+// These were right for Rayman, but that one is offset on a real TV too.
+//#define LEFT_VISIBLE_HC                      208
+//#define RIGHT_VISIBLE_HC             1488
+// This is more like a real TV display...
+//#define LEFT_VISIBLE_HC                      (208 - 32)
+//#define RIGHT_VISIBLE_HC             (1488 - 32)
+// Split the difference? (Seems to be OK for the most part...)
+
+// (-10 +10)*4 is for opening up the display by 16 pixels (may go to 20). Need to change VIRTUAL_SCREEN_WIDTH to match this as well (went from 320 to 340; this is 4 HCs per one of those pixels).
+#define LEFT_VISIBLE_HC                        (208 - 16 - (8 * 4))
+//#define RIGHT_VISIBLE_HC             (1488 - 16 + (10 * 4))
+#define RIGHT_VISIBLE_HC               (LEFT_VISIBLE_HC + (VIRTUAL_SCREEN_WIDTH * 4))
 //#define TOP_VISIBLE_VC               25
 //#define BOTTOM_VISIBLE_VC            503
 #define TOP_VISIBLE_VC                 31
 //Are these PAL horizontals correct?
 //They seem to be for the most part, but there are some games that seem to be
 //shifted over to the right from this "window".
-#define LEFT_VISIBLE_HC_PAL            208
-#define RIGHT_VISIBLE_HC_PAL   1488
+#define LEFT_VISIBLE_HC_PAL            (208 - 16 - (4 * 4))
+//#define RIGHT_VISIBLE_HC_PAL (1488 - 16 + (10 * 4))
+#define RIGHT_VISIBLE_HC_PAL   (LEFT_VISIBLE_HC_PAL + (VIRTUAL_SCREEN_WIDTH * 4))
 #define TOP_VISIBLE_VC_PAL             67
 #define BOTTOM_VISIBLE_VC_PAL  579
 
@@ -330,7 +351,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,28 +778,97 @@ void tom_render_16bpp_rgb_scanline(uint32 * backbuffer)
 }
 
 
-void TOMResetBackbuffer(uint32 * backbuffer)
+/*void TOMResetBackbuffer(uint32 * backbuffer)
 {
        TOMBackbuffer = backbuffer;
-}
+}*/
 
 //
 // Process a single scanline
+// (this is bad terminology; each tick of the VC is actually a half-line)
 //
-uint32 tomDeviceWidth;//kludge
-void TOMExecScanline(uint16 scanline, bool render)
+void TOMExecHalfline(uint16 halfline, bool render)
 {
+#warning "!!! Need to handle multiple fields properly !!!"
+       // We ignore the problem for now
+       halfline &= 0x7FF;
+
        bool inActiveDisplayArea = true;
 
 //Interlacing is still not handled correctly here... !!! FIX !!!
-       if (scanline & 0x01)                                                    // Execute OP only on even lines (non-interlaced only!)
+       if (halfline & 0x01)                                                    // Execute OP only on even halflines (non-interlaced only!)
                return;
 
 //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
-       if (scanline >= (uint16)GET16(tomRam8, VDB) && scanline < (uint16)GET16(tomRam8, VDE))
+//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.
+
+
+What triggers this is writing $FFFF to VDE. This causes the OP start signal in VID to 
+latch on, which in effect sets VDB to zero. So that much is correct. But the thing with
+Rayman is that it shouldn't cause the graphical glitches seen there, so still have to
+investigate what's going on there. By all rights, it shouldn't glitch because:
+
+00006C00: 0000000D 82008F73 (BRANCH) YPOS=494, CC=">", link=$00006C10
+00006C08: 000003FF 00008173 (BRANCH) YPOS=46, CC=">", link=$001FF800
+00006C10: 00000000 0000000C (STOP)
+001FF800: 12FC2BFF 02380000 (BITMAP)
+          00008004 8180CFF1
+
+Even if the OP is running all the time, the link should tell it to stop at the right
+place (which it seems to do). But we still get glitchy screen.
+
+Seems the glitchy screen went away... Maybe the GPU alignment fixes fixed it???
+Just need to add the proper checking here then.
+
+Some numbers, courtesy of the Jaguar BIOS:
+// NTSC:
+VP, 523                        // Vertical Period (1-based; in this case VP = 524)
+VBE, 24                        // Vertical Blank End
+VDB, 38                        // Vertical Display Begin
+VDE, 518               // Vertical Display End
+VBB, 500               // Vertical Blank Begin
+VS, 517                        // Vertical Sync
+
+// PAL Jaguar
+VP, 623                        // Vertical Period (1-based; in this case VP = 624)
+VBE, 34                        // Vertical Blank End
+VDB, 38                        // Vertical Display Begin
+VDE, 518               // Vertical Display End
+VBB, 600               // Vertical Blank Begin
+VS, 618                        // Vertical Sync
+
+Numbers for KM, NTSC:
+KM: (Note that with VDE <= 507, the OP starts at VDB as expected)
+TOM: Vertical Display Begin written by M68K: 41
+TOM: Vertical Display End written by M68K: 2047
+TOM: Vertical Interrupt written by M68K: 491
+*/
+#if 1
+       // Initial values that "well behaved" programs use
+       uint16 startingHalfline = GET16(tomRam8, VDB);
+       uint16 endingHalfline = GET16(tomRam8, VDE);
+
+       // Simulate the OP start bug here!
+       // Really, this value is somewhere around 507 for an NTSC Jaguar. But this
+       // should work in a majority of cases, at least until we can figure it out properly.
+       if (endingHalfline > GET16(tomRam8, VP))
+               startingHalfline = 0;
+
+       if (halfline >= startingHalfline && halfline < endingHalfline)
+//     if (halfline >= 0 && halfline < (uint16)GET16(tomRam8, VDE))
+// 16 isn't enough, and neither is 32 for raptgun. 32 fucks up Rayman
+//     if (halfline >= ((uint16)GET16(tomRam8, VDB) / 2) && halfline < ((uint16)GET16(tomRam8, VDE) / 2))
+//     if (halfline >= ((uint16)GET16(tomRam8, VDB) - 16) && halfline < (uint16)GET16(tomRam8, VDE))
+//     if (halfline >= 20 && halfline < (uint16)GET16(tomRam8, VDE))
+//     if (halfline >= (uint16)GET16(tomRam8, VDB) && halfline < (uint16)GET16(tomRam8, VDE))
        {
                if (render)
                {
@@ -786,17 +880,17 @@ void TOMExecScanline(uint16 scanline, bool render)
                                for(uint32 i=0; i<720; i++)
                                        *current_line_buffer++ = bgHI, *current_line_buffer++ = bgLO;
 
-                       OPProcessList(scanline, render);
+                       OPProcessList(halfline, render);
                }
        }
        else
                inActiveDisplayArea = false;
 #else
        inActiveDisplayArea =
-               (scanline >= (uint16)GET16(tomRam8, VDB) && scanline < (uint16)GET16(tomRam8, VDE)
+               (halfline >= (uint16)GET16(tomRam8, VDB) && halfline < (uint16)GET16(tomRam8, VDE)
                        ? true : false);
 
-       if (scanline < (uint16)GET16(tomRam8, VDE))
+       if (halfline < (uint16)GET16(tomRam8, VDE))
        {
                if (render)//With JaguarExecuteNew() this is always true...
                {
@@ -808,28 +902,30 @@ void TOMExecScanline(uint16 scanline, bool render)
                                for(uint32 i=0; i<720; i++)
                                        *current_line_buffer++ = bgHI, *current_line_buffer++ = bgLO;
 
-//                     OPProcessList(scanline, render);
+//                     OPProcessList(halfline, render);
 //This seems to take care of it...
-                       OPProcessList(scanline, inActiveDisplayArea);
+                       OPProcessList(halfline, inActiveDisplayArea);
                }
        }
 #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[((halfline - topVisible) / 2) * screenPitch]);
 
        // Here's our virtualized scanline code...
 
-       if (scanline >= topVisible && scanline < bottomVisible)
+       if (halfline >= topVisible && halfline < bottomVisible)
        {
                if (inActiveDisplayArea)
                {
 //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 +989,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 +997,6 @@ void tom_render_24bpp_scanline(uint32 * backbuffer)
                        for(uint32 i=0; i<tomWidth; i++)
                                *currentLineBuffer++ = pixel;
                }
-
-#warning "!!! Need to move this to an interface file !!! FIX !!!"
-//             TOMBackbuffer += GetSDLScreenWidthInPixels();
-               TOMBackbuffer += tomDeviceWidth;
        }
 }
 
@@ -1031,6 +1123,50 @@ uint32 TOMGetVideoModeHeight(void)
 // TOM reset code
 // Now PAL friendly!
 //
+/*
+The values in TOMReset come from the Jaguar BIOS.
+These values are from BJL:
+
+NSTC:
+CLK2    181
+HP              844
+HBB             1713
+HBE             125
+HS              1741
+HVS             651
+HEQ             784
+HDE             1696
+HDB1    166
+HDB2    166
+VP              523
+VEE             6
+VBE             24
+VDB             46
+VDE             496
+VBB             500
+VEB             511
+VS              517
+
+PAL:
+CLK2    226
+HP              850
+HBB             1711
+HBE             158
+HS              1749
+HVS             601
+HEQ             787
+HDE             1696
+HDB1    166
+HDB2    166
+VP              625
+VEE             6
+VBE             34
+VDB             46
+VDE             429
+VBB             600
+VEB             613
+VS              618
+*/
 void TOMReset(void)
 {
        OPReset();
@@ -1041,34 +1177,34 @@ void TOMReset(void)
        {
                SET16(tomRam8, MEMCON1, 0x1861);
                SET16(tomRam8, MEMCON2, 0x35CC);
-               SET16(tomRam8, HP, 844);                                // Horizontal Period (1-based; HP=845)
+               SET16(tomRam8, HP, 844);                        // Horizontal Period (1-based; HP=845)
                SET16(tomRam8, HBB, 1713);                      // Horizontal Blank Begin
-               SET16(tomRam8, HBE, 125);                               // Horizontal Blank End
+               SET16(tomRam8, HBE, 125);                       // Horizontal Blank End
                SET16(tomRam8, HDE, 1665);                      // Horizontal Display End
                SET16(tomRam8, HDB1, 203);                      // Horizontal Display Begin 1
-               SET16(tomRam8, VP, 523);                                // Vertical Period (1-based; in this case VP = 524)
-               SET16(tomRam8, VBE, 24);                                // Vertical Blank End
-               SET16(tomRam8, VDB, 38);                                // Vertical Display Begin
-               SET16(tomRam8, VDE, 518);                               // Vertical Display End
-               SET16(tomRam8, VBB, 500);                               // Vertical Blank Begin
-               SET16(tomRam8, VS, 517);                                // Vertical Sync
+               SET16(tomRam8, VP, 523);                        // Vertical Period (1-based; in this case VP = 524)
+               SET16(tomRam8, VBE, 24);                        // Vertical Blank End
+               SET16(tomRam8, VDB, 38);                        // Vertical Display Begin
+               SET16(tomRam8, VDE, 518);                       // Vertical Display End
+               SET16(tomRam8, VBB, 500);                       // Vertical Blank Begin
+               SET16(tomRam8, VS, 517);                        // Vertical Sync
                SET16(tomRam8, VMODE, 0x06C1);
        }
        else    // PAL Jaguar
        {
                SET16(tomRam8, MEMCON1, 0x1861);
                SET16(tomRam8, MEMCON2, 0x35CC);
-               SET16(tomRam8, HP, 850);                                // Horizontal Period
+               SET16(tomRam8, HP, 850);                        // Horizontal Period
                SET16(tomRam8, HBB, 1711);                      // Horizontal Blank Begin
-               SET16(tomRam8, HBE, 158);                               // Horizontal Blank End
+               SET16(tomRam8, HBE, 158);                       // Horizontal Blank End
                SET16(tomRam8, HDE, 1665);                      // Horizontal Display End
                SET16(tomRam8, HDB1, 203);                      // Horizontal Display Begin 1
-               SET16(tomRam8, VP, 623);                                // Vertical Period (1-based; in this case VP = 624)
-               SET16(tomRam8, VBE, 34);                                // Vertical Blank End
-               SET16(tomRam8, VDB, 38);                                // Vertical Display Begin
-               SET16(tomRam8, VDE, 518);                               // Vertical Display End
-               SET16(tomRam8, VBB, 600);                               // Vertical Blank Begin
-               SET16(tomRam8, VS, 618);                                // Vertical Sync
+               SET16(tomRam8, VP, 623);                        // Vertical Period (1-based; in this case VP = 624)
+               SET16(tomRam8, VBE, 34);                        // Vertical Blank End
+               SET16(tomRam8, VDB, 38);                        // Vertical Display Begin
+               SET16(tomRam8, VDE, 518);                       // Vertical Display End
+               SET16(tomRam8, VBB, 600);                       // Vertical Blank Begin
+               SET16(tomRam8, VS, 618);                        // Vertical Sync
                SET16(tomRam8, VMODE, 0x06C1);
        }
 
@@ -1132,10 +1268,11 @@ uint16 TOMReadWord(uint32 offset, uint32 who/*=UNKNOWN*/)
        WriteLog("TOM: Reading word at %06X for %s\n", offset, whoName[who]);
 #endif
 if (offset >= 0xF02000 && offset <= 0xF020FF)
-       WriteLog("TOM: Read attempted from GPU register file by %s (unimplemented)!\n", whoName[who]);
+       WriteLog("TOM: ReadWord attempted from GPU register file by %s (unimplemented)!\n", whoName[who]);
 
        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);
@@ -1287,12 +1424,12 @@ void TOMWriteWord(uint32 offset, uint16 data, uint32 who/*=UNKNOWN*/)
                return;
 #endif
 
-if (offset == 0xF00000 + MEMCON1)
-       WriteLog("TOM: Memory Configuration 1 written by %s: %04X\n", whoName[who], data);
-if (offset == 0xF00000 + MEMCON2)
-       WriteLog("TOM: Memory Configuration 2 written by %s: %04X\n", whoName[who], data);
+//if (offset == 0xF00000 + MEMCON1)
+//     WriteLog("TOM: Memory Configuration 1 written by %s: %04X\n", whoName[who], data);
+//if (offset == 0xF00000 + MEMCON2)
+//     WriteLog("TOM: Memory Configuration 2 written by %s: %04X\n", whoName[who], data);
 if (offset >= 0xF02000 && offset <= 0xF020FF)
-       WriteLog("TOM: Write attempted to GPU register file by %s (unimplemented)!\n", whoName[who]);
+       WriteLog("TOM: WriteWord attempted to GPU register file by %s (unimplemented)!\n", whoName[who]);
 
        if ((offset >= GPU_CONTROL_RAM_BASE) && (offset < GPU_CONTROL_RAM_BASE+0x20))
        {
@@ -1340,6 +1477,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 +1490,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);
        }
@@ -1370,32 +1510,66 @@ if (offset >= 0xF02000 && offset <= 0xF020FF)
        TOMWriteByte(0xF00000 | offset, data >> 8, who);
        TOMWriteByte(0xF00000 | (offset+1), data & 0xFF, who);
 
-if (offset == VDB)
-       WriteLog("TOM: Vertical Display Begin written by %s: %u\n", whoName[who], data);
-if (offset == VDE)
-       WriteLog("TOM: Vertical Display End written by %s: %u\n", whoName[who], data);
-if (offset == VP)
-       WriteLog("TOM: Vertical Period written by %s: %u (%sinterlaced)\n", whoName[who], data, (data & 0x01 ? "non-" : ""));
+if (offset == MEMCON1)
+       WriteLog("TOM: Memory Config 1 written by %s: $%04X\n", whoName[who], data);
+if (offset == MEMCON2)
+       WriteLog("TOM: Memory Config 2 written by %s: $%04X\n", whoName[who], data);
+//if (offset == OLP)
+//     WriteLog("TOM: Object List Pointer written by %s: $%04X\n", whoName[who], data);
+//if (offset == OLP + 2)
+//     WriteLog("TOM: Object List Pointer +2 written by %s: $%04X\n", whoName[who], data);
+//if (offset == OBF)
+//     WriteLog("TOM: Object Processor Flag 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 == BORD1)
+       WriteLog("TOM: Border 1 written by %s: $%04X\n", whoName[who], data);
+if (offset == BORD2)
+       WriteLog("TOM: Border 2 written by %s: $%04X\n", whoName[who], data);
+if (offset == HP)
+       WriteLog("TOM: Horizontal Period written by %s: %u (+1*2 = %u)\n", whoName[who], data, (data + 1) * 2);
+if (offset == HBB)
+       WriteLog("TOM: Horizontal Blank Begin written by %s: %u\n", whoName[who], data);
+if (offset == HBE)
+       WriteLog("TOM: Horizontal Blank End written by %s: %u\n", whoName[who], data);
+if (offset == HS)
+       WriteLog("TOM: Horizontal Sync written by %s: %u\n", whoName[who], data);
+if (offset == HVS)
+       WriteLog("TOM: Horizontal Vertical Sync written by %s: %u\n", whoName[who], data);
 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 Period written by %s: %u (+1*2 = %u)\n", whoName[who], data, (data + 1) * 2);
+if (offset == VP)
+       WriteLog("TOM: Vertical Period written by %s: %u (%sinterlaced)\n", whoName[who], data, (data & 0x01 ? "non-" : ""));
 if (offset == VBB)
        WriteLog("TOM: Vertical Blank Begin written by %s: %u\n", whoName[who], data);
 if (offset == VBE)
        WriteLog("TOM: Vertical Blank End written by %s: %u\n", whoName[who], data);
 if (offset == VS)
        WriteLog("TOM: Vertical Sync written by %s: %u\n", whoName[who], data);
+if (offset == VDB)
+       WriteLog("TOM: Vertical Display Begin written by %s: %u\n", whoName[who], data);
+if (offset == VDE)
+       WriteLog("TOM: Vertical Display End written by %s: %u\n", whoName[who], data);
+if (offset == VEB)
+       WriteLog("TOM: Vertical Equalization Begin written by %s: %u\n", whoName[who], data);
+if (offset == VEE)
+       WriteLog("TOM: Vertical Equalization End written by %s: %u\n", whoName[who], data);
 if (offset == VI)
        WriteLog("TOM: Vertical Interrupt written by %s: %u\n", whoName[who], data);
-if (offset == HBB)
-       WriteLog("TOM: Horizontal Blank Begin written by %s: %u\n", whoName[who], data);
-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 == HEQ)
+       WriteLog("TOM: Horizontal Equalization End written by %s: %u\n", whoName[who], data);
+//if (offset == BG)
+//     WriteLog("TOM: Background 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 +1650,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 +1665,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();
 }