]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/jaguar.cpp
Virtual Jaguar 2.0.0 release.
[virtualjaguar] / src / jaguar.cpp
index 98adae1bb8300ae86b4f851c3ceec7a14857f07e..268befde8a1066121820e6219c06a47cbf6bbde1 100644 (file)
@@ -59,14 +59,15 @@ extern int effect_start;
 extern int effect_start2, effect_start3, effect_start4, effect_start5, effect_start6;
 #endif
 
-uint32 jaguar_active_memory_dumps = 0;
+// Really, need to include memory.h for this, but it might interfere with some stuff...
+extern uint8 jagMemSpace[];
 
-uint32 jaguarMainROMCRC32, jaguarROMSize, jaguarRunAddress;
+// Internal variables
 
-bool BIOSLoaded = false;
-bool CDBIOSLoaded = false;
+uint32 jaguar_active_memory_dumps = 0;
 
-uint32 * backbuffer;
+uint32 jaguarMainROMCRC32, jaguarROMSize, jaguarRunAddress;
+bool jaguarCartInserted = false;
 
 #ifdef CPU_DEBUG_MEMORY
 uint8 writeMemMax[0x400000], writeMemMin[0x400000];
@@ -109,12 +110,21 @@ void M68KInstructionHook(void)
                WriteLog("M68K: Top of stack: %08X. Stack trace:\n", JaguarReadLong(topOfStack));
                for(int i=0; i<10; i++)
                        WriteLog("%06X: %08X\n", topOfStack - (i * 4), JaguarReadLong(topOfStack - (i * 4)));
-               WriteLog("Jaguar: VBL interrupt is %s\n", ((TOMIRQEnabled(IRQ_VBLANK)) && (JaguarInterruptHandlerIsValid(64))) ? "enabled" : "disabled");
+               WriteLog("Jaguar: VBL interrupt is %s\n", ((TOMIRQEnabled(IRQ_VIDEO)) && (JaguarInterruptHandlerIsValid(64))) ? "enabled" : "disabled");
                M68K_show_context();
                LogDone();
                exit(0);
        }
 
+       // Disassemble everything
+/*     {
+               static char buffer[2048];
+               m68k_disassemble(buffer, m68kPC, M68K_CPU_TYPE_68000);
+               WriteLog("%08X: %s", m68kPC, buffer);
+               WriteLog("\t\tA0=%08X, A1=%08X, D0=%08X, D1=%08X\n",
+                       m68k_get_reg(NULL, M68K_REG_A0), m68k_get_reg(NULL, M68K_REG_A1),
+                       m68k_get_reg(NULL, M68K_REG_D0), m68k_get_reg(NULL, M68K_REG_D1));
+       }//*/
 /*     if (m68kPC >= 0x807EC4 && m68kPC <= 0x807EDB)
        {
                static char buffer[2048];
@@ -336,7 +346,7 @@ CD_switch:: -> $306C
                WriteLog("M68K: Top of stack: %08X. Stack trace:\n", JaguarReadLong(topOfStack));
                for(int i=0; i<10; i++)
                        WriteLog("%06X: %08X\n", topOfStack - (i * 4), JaguarReadLong(topOfStack - (i * 4)));
-               WriteLog("Jaguar: VBL interrupt is %s\n", ((TOMIRQEnabled(IRQ_VBLANK)) && (JaguarInterruptHandlerIsValid(64))) ? "enabled" : "disabled");
+               WriteLog("Jaguar: VBL interrupt is %s\n", ((TOMIRQEnabled(IRQ_VIDEO)) && (JaguarInterruptHandlerIsValid(64))) ? "enabled" : "disabled");
                M68K_show_context();
 
 //temp
@@ -349,33 +359,6 @@ CD_switch::        -> $306C
                exit(0);
        }//*/
 #endif
-
-#if 0
-//001A0110: move.w  #$0, $F000E2.l             ; Restore Blitter/GPU bus priorities
-//001A015C: rte                                                        ; Return from the interrupt
-static bool disassembleGo = false;
-       if (m68kPC == 0x1A0110)
-       {
-               static char buffer[2048];
-               m68k_disassemble(buffer, m68kPC, M68K_CPU_TYPE_68000);
-               WriteLog("--> [M68K IRQ Routine start] %08X: %s", m68kPC, buffer);
-               WriteLog("\t\tA0=%08X, A1=%08X, D0=%08X(cmd), D1=%08X(# bytes), D2=%08X\n",
-                       m68k_get_reg(NULL, M68K_REG_A0), m68k_get_reg(NULL, M68K_REG_A1),
-                       m68k_get_reg(NULL, M68K_REG_D0), m68k_get_reg(NULL, M68K_REG_D1), m68k_get_reg(NULL, M68K_REG_D2));
-               disassembleGo = true;
-       }
-       else if (m68kPC == 0x1A015C)
-               WriteLog("--> [M68K IRQ Routine end]\n");
-
-       if (disassembleGo)
-       {
-               static char buffer[2048];
-               m68k_disassemble(buffer, m68kPC, M68K_CPU_TYPE_68000);
-               WriteLog("%08X: %s", m68kPC, buffer);
-               WriteLog("\tD0=$%08X, D1=$%08X, D2=$%08X\n",
-                       m68k_get_reg(NULL, M68K_REG_D0), m68k_get_reg(NULL, M68K_REG_D1), m68k_get_reg(NULL, M68K_REG_D2));
-       }
-#endif
 }
 
 #if 0
@@ -912,7 +895,9 @@ unsigned int m68k_read_memory_8(unsigned int address)
        else if ((address >= 0x800000) && (address <= 0xDFFEFF))
                retVal = jaguarMainROM[address - 0x800000];
        else if ((address >= 0xE00000) && (address <= 0xE3FFFF))
-               retVal = jaguarBootROM[address - 0xE00000];
+//             retVal = jaguarBootROM[address - 0xE00000];
+//             retVal = jaguarDevBootROM1[address - 0xE00000];
+               retVal = jagMemSpace[address];
        else if ((address >= 0xDFFF00) && (address <= 0xDFFFFF))
                retVal = CDROMReadByte(address);
        else if ((address >= 0xF00000) && (address <= 0xF0FFFF))
@@ -1007,7 +992,9 @@ unsigned int m68k_read_memory_16(unsigned int address)
        else if ((address >= 0x800000) && (address <= 0xDFFEFE))
                retVal = (jaguarMainROM[address - 0x800000] << 8) | jaguarMainROM[address - 0x800000 + 1];
        else if ((address >= 0xE00000) && (address <= 0xE3FFFE))
-               retVal = (jaguarBootROM[address - 0xE00000] << 8) | jaguarBootROM[address - 0xE00000 + 1];
+//             retVal = (jaguarBootROM[address - 0xE00000] << 8) | jaguarBootROM[address - 0xE00000 + 1];
+//             retVal = (jaguarDevBootROM1[address - 0xE00000] << 8) | jaguarDevBootROM1[address - 0xE00000 + 1];
+               retVal = (jagMemSpace[address] << 8) | jagMemSpace[address + 1];
        else if ((address >= 0xDFFF00) && (address <= 0xDFFFFE))
                retVal = CDROMReadWord(address, M68K);
        else if ((address >= 0xF00000) && (address <= 0xF0FFFE))
@@ -1059,6 +1046,8 @@ void m68k_write_memory_8(unsigned int address, unsigned int value)
                }
        }
 #endif
+/*if (address == 0x4E00)
+       WriteLog("M68K: Writing %02X at %08X, PC=%08X\n", value, address, m68k_get_reg(NULL, M68K_REG_PC));//*/
 //if ((address >= 0x1FF020 && address <= 0x1FF03F) || (address >= 0x1FF820 && address <= 0x1FF83F))
 //     WriteLog("M68K: Writing %02X at %08X\n", value, address);
 //WriteLog("[WM8  PC=%08X] Addr: %08X, val: %02X\n", m68k_get_reg(NULL, M68K_REG_PC), address, value);
@@ -1103,6 +1092,8 @@ void m68k_write_memory_16(unsigned int address, unsigned int value)
                }
        }
 #endif
+/*if (address == 0x4E00)
+       WriteLog("M68K: Writing %02X at %08X, PC=%08X\n", value, address, m68k_get_reg(NULL, M68K_REG_PC));//*/
 //if ((address >= 0x1FF020 && address <= 0x1FF03F) || (address >= 0x1FF820 && address <= 0x1FF83F))
 //     WriteLog("M68K: Writing %04X at %08X\n", value, address);
 //WriteLog("[WM16 PC=%08X] Addr: %08X, val: %04X\n", m68k_get_reg(NULL, M68K_REG_PC), address, value);
@@ -1156,6 +1147,8 @@ if (address == 0xF02110)
 
 void m68k_write_memory_32(unsigned int address, unsigned int value)
 {
+/*if (address == 0x4E00)
+       WriteLog("M68K: Writing %02X at %08X, PC=%08X\n", value, address, m68k_get_reg(NULL, M68K_REG_PC));//*/
 //WriteLog("--> [WM32]\n");
 /*if (address == 0x0100)//64*4)
        WriteLog("M68K: Wrote dword to VI vector value %08X...\n", value);//*/
@@ -1208,7 +1201,7 @@ void M68K_show_context(void)
 
        WriteLog("..................\n");
 
-       if (TOMIRQEnabled(IRQ_VBLANK))
+       if (TOMIRQEnabled(IRQ_VIDEO))
        {
                WriteLog("video int: enabled\n");
                JaguarDasm(JaguarGetHandler(64), 0x200);
@@ -1360,7 +1353,9 @@ uint8 JaguarReadByte(uint32 offset, uint32 who/*=UNKNOWN*/)
        else if ((offset >= 0xDFFF00) && (offset <= 0xDFFFFF))
                data = CDROMReadByte(offset, who);
        else if ((offset >= 0xE00000) && (offset < 0xE40000))
-               data = jaguarBootROM[offset & 0x3FFFF];
+//             data = jaguarBootROM[offset & 0x3FFFF];
+//             data = jaguarDevBootROM1[offset & 0x3FFFF];
+               data = jagMemSpace[offset];
        else if ((offset >= 0xF00000) && (offset < 0xF10000))
                data = TOMReadByte(offset, who);
        else if ((offset >= 0xF10000) && (offset < 0xF20000))
@@ -1387,7 +1382,9 @@ uint16 JaguarReadWord(uint32 offset, uint32 who/*=UNKNOWN*/)
        else if ((offset >= 0xDFFF00) && (offset <= 0xDFFFFE))
                return CDROMReadWord(offset, who);
        else if ((offset >= 0xE00000) && (offset <= 0xE3FFFE))
-               return (jaguarBootROM[(offset+0) & 0x3FFFF] << 8) | jaguarBootROM[(offset+1) & 0x3FFFF];
+//             return (jaguarBootROM[(offset+0) & 0x3FFFF] << 8) | jaguarBootROM[(offset+1) & 0x3FFFF];
+//             return (jaguarDevBootROM1[(offset+0) & 0x3FFFF] << 8) | jaguarDevBootROM1[(offset+1) & 0x3FFFF];
+               return (jagMemSpace[offset + 0] << 8) | jagMemSpace[offset + 1];
        else if ((offset >= 0xF00000) && (offset <= 0xF0FFFE))
                return TOMReadWord(offset, who);
        else if ((offset >= 0xF10000) && (offset <= 0xF1FFFE))
@@ -1398,6 +1395,8 @@ uint16 JaguarReadWord(uint32 offset, uint32 who/*=UNKNOWN*/)
 
 void JaguarWriteByte(uint32 offset, uint8 data, uint32 who/*=UNKNOWN*/)
 {
+/*     if (offset >= 0x4E00 && offset < 0x4E04)
+               WriteLog("JWB: Byte %02X written at %08X by %s\n", data, offset, whoName[who]);//*/
 //Need to check for writes in the range of $18FA70 + 8000...
 /*if (effect_start)
        if (offset >= 0x18FA70 && offset < (0x18FA70 + 8000))
@@ -1431,6 +1430,8 @@ void JaguarWriteByte(uint32 offset, uint8 data, uint32 who/*=UNKNOWN*/)
 uint32 starCount;
 void JaguarWriteWord(uint32 offset, uint16 data, uint32 who/*=UNKNOWN*/)
 {
+/*     if (offset >= 0x4E00 && offset < 0x4E04)
+               WriteLog("JWW: Word %04X written at %08X by %s\n", data, offset, whoName[who]);//*/
 /*if (offset == 0x0100)//64*4)
        WriteLog("M68K: %s wrote word to VI vector value %04X...\n", whoName[who], data);
 if (offset == 0x0102)//64*4)
@@ -1582,6 +1583,18 @@ void JaguarWriteLong(uint32 offset, uint32 data, uint32 who/*=UNKNOWN*/)
        JaguarWriteWord(offset+2, data & 0xFFFF, who);
 }
 
+void JaguarSetScreenBuffer(uint32 * buffer)
+{
+       // This is in TOM, but we set it here...
+       screenBuffer = buffer;
+}
+
+void JaguarSetScreenPitch(uint32 pitch)
+{
+       // This is in TOM, but we set it here...
+       screenPitch = pitch;
+}
+
 //
 // Jaguar console initialization
 //
@@ -1612,18 +1625,18 @@ void JaguarInit(void)
 //New timer based code stuffola...
 void ScanlineCallback(void);
 void RenderCallback(void);
-//extern uint32 * backbuffer;
 void JaguarReset(void)
 {
-       // Only use the system BIOS if it's available...!
-       if (vjs.useJaguarBIOS && (biosAvailable & (BIOS_NORMAL | BIOS_STUB1 | BIOS_STUB2)))
-               memcpy(jaguarMainRAM, jaguarBootROM, 8);
+//Need to change this so it uses the single RAM space and load the BIOS
+//into it somewhere...
+//Also, have to change this here and in JaguarReadXX() currently
+       // Only use the system BIOS if it's available...! (it's always available now!)
+       // AND only if a jaguar cartridge has been inserted.
+       if (vjs.useJaguarBIOS && jaguarCartInserted && !vjs.hardwareTypeAlpine)
+               memcpy(jaguarMainRAM, jagMemSpace + 0xE00000, 8);
        else
                SET32(jaguarMainRAM, 4, jaguarRunAddress);
 
-       if (vjs.useJaguarBIOS && !(biosAvailable & (BIOS_NORMAL | BIOS_STUB1 | BIOS_STUB2)))
-               WriteLog("Jaguar: Requested BIOS, but none available.\n");
-
 //     WriteLog("jaguar_reset():\n");
        TOMReset();
        JERRYReset();
@@ -1635,7 +1648,6 @@ void JaguarReset(void)
 
        // New timer base code stuffola...
        InitializeEventList();
-       TOMResetBackbuffer(backbuffer);
 //     SetCallbackTime(ScanlineCallback, 63.5555);
        SetCallbackTime(ScanlineCallback, 31.77775);
 //     SetCallbackTime(RenderCallback, 33303.082);     // # Scanlines * scanline time
@@ -1717,7 +1729,7 @@ void JaguarDone(void)
 
 //     WriteLog("Jaguar: CD BIOS version %04X\n", JaguarReadWord(0x3004));
        WriteLog("Jaguar: Interrupt enable = $%02X\n", TOMReadByte(0xF000E1, JAGUAR) & 0x1F);
-       WriteLog("Jaguar: Video interrupt is %s (line=%u)\n", ((TOMIRQEnabled(IRQ_VBLANK))
+       WriteLog("Jaguar: Video interrupt is %s (line=%u)\n", ((TOMIRQEnabled(IRQ_VIDEO))
                && (JaguarInterruptHandlerIsValid(64))) ? "enabled" : "disabled", TOMReadWord(0xF0004E, JAGUAR));
        M68K_show_context();
 //#endif
@@ -1761,7 +1773,13 @@ void JaguarDone(void)
        JaguarDasm(0x89CA56, 0x200);
        WriteLog("-------------------------------------------\n");
        JaguarDasm(0x802B48, 0x200);
+       WriteLog("\n\nM68000 disassembly at $802000...\n");
+       JaguarDasm(0x802000, 6000);
+       WriteLog("\n");//*/
 #endif
+/*     WriteLog("\n\nM68000 disassembly at $080000...\n");
+       JaguarDasm(0x080000, 10000);
+       WriteLog("\n");//*/
 }
 
 //
@@ -1791,7 +1809,6 @@ void JaguarExecute(uint32 * backbuffer, bool render)
        uint32 M68KCyclesPerScanline = m68kClockRate / (vp * refreshRate);
        uint32 RISCCyclesPerScanline = m68kClockRate / (vp * refreshRate);
 
-       TOMResetBackbuffer(backbuffer);
 /*extern int effect_start;
 if (effect_start)
        WriteLog("JagExe: VP=%u, VI=%u, CPU CPS=%u, GPU CPS=%u\n", vp, vi, M68KCyclesPerScanline, RISCCyclesPerScanline);//*/
@@ -1801,14 +1818,12 @@ if (effect_start)
        {
                // Increment the horizontal count (why? RNG? Besides which, this is *NOT* cycle accurate!)
                TOMWriteWord(0xF00004, (TOMReadWord(0xF00004, JAGUAR) + 1) & 0x7FF, JAGUAR);
-
                TOMWriteWord(0xF00006, i, JAGUAR);                      // Write the VC
 
-//             if (i == vi)                                                            // Time for Vertical Interrupt?
 //Not sure if this is correct...
 //Seems to be, kinda. According to the JTRM, this should only fire on odd lines in non-interlace mode...
 //Which means that it normally wouldn't go when it's zero.
-               if (i == vi && i > 0 && TOMIRQEnabled(IRQ_VBLANK))      // Time for Vertical Interrupt?
+               if (i == vi && i > 0 && TOMIRQEnabled(IRQ_VIDEO))       // Time for Vertical Interrupt?
                {
                        // We don't have to worry about autovectors & whatnot because the Jaguar
                        // tells you through its HW registers who sent the interrupt...
@@ -1831,7 +1846,8 @@ if (effect_start)
                BUTCHExec(RISCCyclesPerScanline);
 //if (start_logging)
 //     WriteLog("About to execute GPU (%u)...\n", i);
-               GPUExec(RISCCyclesPerScanline);
+               if (vjs.GPUEnabled)
+                       GPUExec(RISCCyclesPerScanline);
 
                if (vjs.DSPEnabled)
                {
@@ -1868,112 +1884,11 @@ uint8 * GetRamPtr(void)
 
 //
 // New Jaguar execution stack
+// This executes 1 frame's worth of code.
 //
-
-#if 0
-
-void JaguarExecuteNew(void)
-{
-       extern bool finished, showGUI;
-       extern bool debounceRunKey;
-       // Pass a message to the "joystick" code to debounce the ESC key...
-       debounceRunKey = true;
-       finished = false;
-/*     InitializeEventList();
-       TOMResetBackbuffer(backbuffer);
-//     SetCallbackTime(ScanlineCallback, 63.5555);
-       SetCallbackTime(ScanlineCallback, 31.77775);
-//     SetCallbackTime(RenderCallback, 33303.082);     // # Scanlines * scanline time
-//     SetCallbackTime(RenderCallback, 16651.541);     // # Scanlines * scanline time//*/
-//     uint8 * keystate = SDL_GetKeyState(NULL);
-
-       do
-       {
-               double timeToNextEvent = GetTimeToNextEvent();
-//WriteLog("JEN: Time to next event (%u) is %f usec (%u RISC cycles)...\n", nextEvent, timeToNextEvent, USEC_TO_RISC_CYCLES(timeToNextEvent));
-
-               m68k_execute(USEC_TO_M68K_CYCLES(timeToNextEvent));
-               gpu_exec(USEC_TO_RISC_CYCLES(timeToNextEvent));
-
-               if (vjs.DSPEnabled)
-               {
-                       if (vjs.usePipelinedDSP)
-                               DSPExecP2(USEC_TO_RISC_CYCLES(timeToNextEvent));        // Pipelined DSP execution (3 stage)...
-                       else
-                               DSPExec(USEC_TO_RISC_CYCLES(timeToNextEvent));          // Ordinary non-pipelined DSP
-               }
-
-               HandleNextEvent();
-
-//             if (keystate[SDLK_ESCAPE])
-//                     break;
-
-//         SDL_PumpEvents();   // Needed to keep the keystate current...
-       }
-       while (!finished);
-}
-
-void ScanlineCallback(void)
-{
-       uint16 vc = TOMReadWord(0xF00006, JAGUAR);
-       uint16 vp = TOMReadWord(0xF0003E, JAGUAR) + 1;
-       uint16 vi = TOMReadWord(0xF0004E, JAGUAR);
-//     uint16 vbb = TOMReadWord(0xF00040, JAGUAR);
-       vc++;
-
-       if (vc >= vp)
-               vc = 0;
-
-//WriteLog("SLC: Currently on line %u (VP=%u)...\n", vc, vp);
-       TOMWriteWord(0xF00006, vc, JAGUAR);
-
-//This is a crappy kludge, but maybe it'll work for now...
-//Maybe it's not so bad, since the IRQ happens on a scanline boundary...
-       if (vc == vi && vc > 0 && tom_irq_enabled(IRQ_VBLANK))  // Time for Vertical Interrupt?
-       {
-               // We don't have to worry about autovectors & whatnot because the Jaguar
-               // tells you through its HW registers who sent the interrupt...
-               tom_set_pending_video_int();
-               m68k_set_irq(2);
-       }
-
-       TOMExecScanline(vc, true);
-
-//Change this to VBB???
-//Doesn't seem to matter (at least for Flip Out & I-War)
-       if (vc == 0)
-//     if (vc == vbb)
-       {
-joystick_exec();
-
-               RenderBackbuffer();
-               TOMResetBackbuffer(backbuffer);
-       }//*/
-
-//     if (vc == 0)
-//             TOMResetBackbuffer(backbuffer);
-
-//     SetCallbackTime(ScanlineCallback, 63.5555);
-       SetCallbackTime(ScanlineCallback, 31.77775);
-}
-
-#else
-
 bool frameDone;
 void JaguarExecuteNew(void)
 {
-//     extern bool finished, showGUI;
-//     extern bool debounceRunKey;
-       // Pass a message to the "joystick" code to debounce the ESC key...
-//     debounceRunKey = true;
-//     finished = false;
-/*     InitializeEventList();
-       TOMResetBackbuffer(backbuffer);
-//     SetCallbackTime(ScanlineCallback, 63.5555);
-       SetCallbackTime(ScanlineCallback, 31.77775);
-//     SetCallbackTime(RenderCallback, 33303.082);     // # Scanlines * scanline time
-//     SetCallbackTime(RenderCallback, 16651.541);     // # Scanlines * scanline time//*/
-//     uint8 * keystate = SDL_GetKeyState(NULL);
        frameDone = false;
 
        do
@@ -1982,7 +1897,9 @@ void JaguarExecuteNew(void)
 //WriteLog("JEN: Time to next event (%u) is %f usec (%u RISC cycles)...\n", nextEvent, timeToNextEvent, USEC_TO_RISC_CYCLES(timeToNextEvent));
 
                m68k_execute(USEC_TO_M68K_CYCLES(timeToNextEvent));
-               GPUExec(USEC_TO_RISC_CYCLES(timeToNextEvent));
+
+               if (vjs.GPUEnabled)
+                       GPUExec(USEC_TO_RISC_CYCLES(timeToNextEvent));
 
                if (vjs.DSPEnabled)
                {
@@ -1993,11 +1910,6 @@ void JaguarExecuteNew(void)
                }
 
                HandleNextEvent();
-
-//             if (keystate[SDLK_ESCAPE])
-//                     break;
-
-//         SDL_PumpEvents();   // Needed to keep the keystate current...
        }
        while (!frameDone);
 }
@@ -2018,7 +1930,7 @@ void ScanlineCallback(void)
 
 //This is a crappy kludge, but maybe it'll work for now...
 //Maybe it's not so bad, since the IRQ happens on a scanline boundary...
-       if (vc == vi && vc > 0 && TOMIRQEnabled(IRQ_VBLANK))    // Time for Vertical Interrupt?
+       if (vc == vi && vc > 0 && TOMIRQEnabled(IRQ_VIDEO))     // Time for Vertical Interrupt?
        {
                // We don't have to worry about autovectors & whatnot because the Jaguar
                // tells you through its HW registers who sent the interrupt...
@@ -2034,26 +1946,20 @@ void ScanlineCallback(void)
 //     if (vc == vbb)
        {
                JoystickExec();
-//We comment this out so that the GUI can manage this instead. Which is how it should be anyway.
-//             RenderBackbuffer();
-               TOMResetBackbuffer(backbuffer);
                frameDone = true;
        }//*/
 
-//     if (vc == 0)
-//             TOMResetBackbuffer(backbuffer);
-
 //     SetCallbackTime(ScanlineCallback, 63.5555);
        SetCallbackTime(ScanlineCallback, 31.77775);
 }
 
-#endif
-
 // This isn't currently used, but maybe it should be...
+/*
+Nah, the scanline based code is good enough, and runs in 1 frame. The GUI
+handles all the rest, so this isn't needed. :-P
+*/
 void RenderCallback(void)
 {
-//     RenderBackbuffer();
-       TOMResetBackbuffer(backbuffer);
 //     SetCallbackTime(RenderCallback, 33303.082);     // # Scanlines * scanline time
        SetCallbackTime(RenderCallback, 16651.541);     // # Scanlines * scanline time
 }