]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/jaguar.cpp
Virtual Jaguar 2.0.0 release.
[virtualjaguar] / src / jaguar.cpp
index c4cdc94f6d297fe6207fb8f8c29a78ca92f2ef7e..268befde8a1066121820e6219c06a47cbf6bbde1 100644 (file)
@@ -67,11 +67,7 @@ extern uint8 jagMemSpace[];
 uint32 jaguar_active_memory_dumps = 0;
 
 uint32 jaguarMainROMCRC32, jaguarROMSize, jaguarRunAddress;
-
-bool BIOSLoaded = false;
-bool CDBIOSLoaded = false;
-
-uint32 * backbuffer;
+bool jaguarCartInserted = false;
 
 #ifdef CPU_DEBUG_MEMORY
 uint8 writeMemMax[0x400000], writeMemMin[0x400000];
@@ -114,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];
@@ -341,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
@@ -1041,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);
@@ -1085,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);
@@ -1138,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);//*/
@@ -1190,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);
@@ -1384,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))
@@ -1417,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)
@@ -1568,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
 //
@@ -1598,15 +1625,15 @@ void JaguarInit(void)
 //New timer based code stuffola...
 void ScanlineCallback(void);
 void RenderCallback(void);
-//extern uint32 * backbuffer;
 void JaguarReset(void)
 {
 //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!)
-       if (vjs.useJaguarBIOS)
-               memcpy(jaguarMainRAM, &jagMemSpace[0xE00000], 8);
+       // 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);
 
@@ -1621,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
@@ -1703,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
@@ -1747,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");//*/
 }
 
 //
@@ -1777,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);//*/
@@ -1787,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...
@@ -1817,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)
                {
@@ -1854,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
@@ -1968,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)
                {
@@ -1979,11 +1910,6 @@ void JaguarExecuteNew(void)
                }
 
                HandleNextEvent();
-
-//             if (keystate[SDLK_ESCAPE])
-//                     break;
-
-//         SDL_PumpEvents();   // Needed to keep the keystate current...
        }
        while (!frameDone);
 }
@@ -2004,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...
@@ -2020,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
 }