From: Shamus Hammons Date: Mon, 17 Jan 2011 18:40:04 +0000 (+0000) Subject: Initial attempt to get Jaguar core to run in the new GUI. X-Git-Tag: 2.0.0~34^2~28 X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bfca68337bb71d75f7848922c2d0a73837c923cb;p=virtualjaguar Initial attempt to get Jaguar core to run in the new GUI. --- diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index 7b7a2de..24c3dc4 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -32,6 +32,25 @@ #include "settings.h" #include "filepicker.h" +#include "jaguar.h" +#include "video.h" +#include "tom.h" +#include "log.h" +#include "file.h" + +// Uncomment this to use built-in BIOS/CD-ROM BIOS +// You'll need a copy of jagboot.h & jagcd.h for this to work...! +//#define USE_BUILT_IN_BIOS + +// Uncomment this for an official Virtual Jaguar release +//#define VJ_RELEASE_VERSION "2.0.0" +#warning !!! FIX !!! Figure out how to use this in GUI.CPP as well! + +#ifdef USE_BUILT_IN_BIOS +#include "jagboot.h" +#include "jagcd.h" +#endif + // The way BSNES controls things is by setting a timer with a zero // timeout, sleeping if not emulating anything. Seems there has to be a // better way. @@ -155,6 +174,44 @@ MainWin::MainWin() timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(Timer())); timer->start(20); + +#ifdef VJ_RELEASE_VERSION + WriteLog("Virtual Jaguar %s (Last full build was on %s %s)\n", VJ_RELEASE_VERSION, __DATE__, __TIME__); +#else + WriteLog("Virtual Jaguar SVN %s (Last full build was on %s %s)\n", __DATE__, __DATE__, __TIME__); +#endif + WriteLog("Initializing jaguar subsystem...\n"); + JaguarInit(); + + // Get the BIOS ROM +#ifdef USE_BUILT_IN_BIOS + WriteLog("VJ: Using built in BIOS/CD BIOS...\n"); + memcpy(jaguarBootROM, jagBootROM, 0x20000); + memcpy(jaguarCDBootROM, jagCDROM, 0x40000); + BIOSLoaded = CDBIOSLoaded = true; +#else +// What would be nice here would be a way to check if the BIOS was loaded so that we +// could disable the pushbutton on the Misc Options menu... !!! FIX !!! [DONE here, but needs to be fixed in GUI as well!] +WriteLog("About to attempt to load BIOSes...\n"); +#if 1 +//This is short-circuiting the file finding thread... ??? WHY ??? + BIOSLoaded = (JaguarLoadROM(jaguarBootROM, vjs.jagBootPath) == 0x20000 ? true : false); +#else + BIOSLoaded = false; +#endif + WriteLog("VJ: BIOS is %savailable...\n", (BIOSLoaded ? "" : "not ")); + CDBIOSLoaded = (JaguarLoadROM(jaguarCDBootROM, vjs.CDBootPath) == 0x40000 ? true : false); + WriteLog("VJ: CD BIOS is %savailable...\n", (CDBIOSLoaded ? "" : "not ")); +#endif + + SET32(jaguarMainRAM, 0, 0x00200000); // Set top of stack... + +//This is crappy!!! !!! FIX !!! +//Is this even needed any more? Hmm. Maybe. Dunno. +//Seems like it is... But then again, maybe not. Have to test it to see. +WriteLog("GUI: Resetting Jaguar...\n"); + JaguarReset(); + } void MainWin::closeEvent(QCloseEvent * event) @@ -167,11 +224,15 @@ void MainWin::Open(void) { } +// +// Here's the main emulator loop +// void MainWin::Timer(void) { if (!running) return; +#if 0 // Random hash & trash // We try to simulate an untuned tank circuit here... :-) for(uint32_t x=0; xrasterWidth; x++) @@ -182,22 +243,149 @@ void MainWin::Timer(void) // buffer[(y * textureWidth) + x] = x*y; } } +#else + JaguarExecuteNew(); + memcpy(videoWidget->buffer, backbuffer, videoWidget->rasterHeight * videoWidget->rasterWidth); +// memcpy(surface->pixels, backbuffer, TOMGetVideoModeWidth() * TOMGetVideoModeHeight() * 4); +#endif videoWidget->updateGL(); } +#if 0 +Window * RunEmu(void) +{ +// extern uint32 * backbuffer; + uint32 * overlayPixels = (uint32 *)sdlemuGetOverlayPixels(); + memset(overlayPixels, 0x00, 640 * 480 * 4); // Clear out overlay... + +//This is crappy... !!! FIX !!! +// extern bool finished, showGUI; + + sdlemuDisableOverlay(); + +// uint32 nFrame = 0, nFrameskip = 0; + uint32 totalFrames = 0; + finished = false; + bool showMessage = true; + uint32 showMsgFrames = 120; + uint8 transparency = 0xFF; + // Pass a message to the "joystick" code to debounce the ESC key... + debounceRunKey = true; + + uint32 cartType = 4; + if (jaguarRomSize == 0x200000) + cartType = 0; + else if (jaguarRomSize == 0x400000) + cartType = 1; + else if (jaguarMainRomCRC32 == 0x687068D5) + cartType = 2; + else if (jaguarMainRomCRC32 == 0x55A0669C) + cartType = 3; + + const char * cartTypeName[5] = { "2M Cartridge", "4M Cartridge", "CD BIOS", "CD Dev BIOS", "Homebrew" }; + uint32 elapsedTicks = SDL_GetTicks(), frameCount = 0, framesPerSecond = 0; + + while (!finished) + { + // Set up new backbuffer with new pixels and data + JaguarExecuteNew(); + totalFrames++; +//WriteLog("Frame #%u...\n", totalFrames); +//extern bool doDSPDis; +//if (totalFrames == 373) +// doDSPDis = true; + +//Problem: Need to do this *only* when the state changes from visible to not... +//Also, need to clear out the GUI when not on (when showMessage is active...) +if (showGUI || showMessage) + sdlemuEnableOverlay(); +else + sdlemuDisableOverlay(); + +//Add in a new function for clearing patches of screen (ClearOverlayRect) + +// Also: Take frame rate into account when calculating fade time... + + // Some QnD GUI stuff here... + if (showGUI) + { + FillScreenRectangle(overlayPixels, 8, 1*FONT_HEIGHT, 128, 4*FONT_HEIGHT, 0x00000000); + extern uint32 gpu_pc, dsp_pc; + DrawString(overlayPixels, 8, 1*FONT_HEIGHT, false, "GPU PC: %08X", gpu_pc); + DrawString(overlayPixels, 8, 2*FONT_HEIGHT, false, "DSP PC: %08X", dsp_pc); + DrawString(overlayPixels, 8, 4*FONT_HEIGHT, false, "%u FPS", framesPerSecond); + } + + if (showMessage) + { + DrawString2(overlayPixels, 8, 24*FONT_HEIGHT, 0x007F63FF, transparency, "Running..."); + DrawString2(overlayPixels, 8, 26*FONT_HEIGHT, 0x001FFF3F, transparency, "%s, run address: %06X", cartTypeName[cartType], jaguarRunAddress); + DrawString2(overlayPixels, 8, 27*FONT_HEIGHT, 0x001FFF3F, transparency, "CRC: %08X", jaguarMainRomCRC32); + + if (showMsgFrames == 0) + { + transparency--; + + if (transparency == 0) +{ + showMessage = false; +/*extern bool doGPUDis; +doGPUDis = true;//*/ +} + + } + else + showMsgFrames--; + } + + frameCount++; + + if (SDL_GetTicks() - elapsedTicks > 250) + elapsedTicks += 250, framesPerSecond = frameCount * 4, frameCount = 0; + } + + // Save the background for the GUI... + // In this case, we squash the color to monochrome, then force it to blue + green... + for(uint32 i=0; i> 16) & 0xFF, g = (pixel >> 8) & 0xFF, r = pixel & 0xFF; + pixel = ((r + g + b) / 3) & 0x00FF; + backbuffer[i] = 0xFF000000 | (pixel << 16) | (pixel << 8); + } + + sdlemuEnableOverlay(); + + return NULL; +} +#endif + void MainWin::ToggleRunState(void) { running = !running; if (!running) { +#if 0 for(uint32_t x=0; xrasterWidth; x++) for(uint32_t y=0; yrasterHeight; y++) videoWidget->buffer[(y * videoWidget->textureWidth) + x] = 0x00000000; +#else + for(uint32_t i=0; i> 16) & 0xFF, g = (pixel >> 8) & 0xFF, r = pixel & 0xFF; + pixel = ((r + g + b) / 3) & 0x00FF; + backbuffer[i] = 0xFF000000 | (pixel << 16) | (pixel << 8); + } + + memcpy(videoWidget->buffer, backbuffer, videoWidget->rasterHeight * videoWidget->rasterWidth); +#endif videoWidget->updateGL(); } + } void MainWin::SetZoom100(void) @@ -279,10 +467,10 @@ void MainWin::ReadSettings(void) vjs.useOpenGL = settings.value("useOpenGL", true).toBool(); vjs.glFilter = settings.value("glFilterType", 0).toInt(); vjs.renderType = settings.value("renderType", 0).toInt(); - - // Hardcoded, !!! FIX !!! -#warning "!!! FIX !!! ROMPath is hardcoded!" - strcpy(vjs.ROMPath, "./software"); + strcpy(vjs.jagBootPath, settings.value("JagBootROM", "./bios/jagboot.rom").toString().toAscii().data()); + strcpy(vjs.CDBootPath, settings.value("CDBootROM", "./bios/jagcd.rom").toString().toAscii().data()); + strcpy(vjs.EEPROMPath, settings.value("EEPROMs", "./eeproms").toString().toAscii().data()); + strcpy(vjs.ROMPath, settings.value("ROMs", "./software").toString().toAscii().data()); } void MainWin::WriteSettings(void) @@ -304,6 +492,10 @@ void MainWin::WriteSettings(void) settings.setValue("useOpenGL", vjs.useOpenGL); settings.setValue("glFilterType", vjs.glFilter); settings.setValue("renderType", vjs.renderType); + settings.setValue("JagBootROM", vjs.jagBootPath); + settings.setValue("CDBootROM", vjs.CDBootPath); + settings.setValue("EEPROMs", vjs.EEPROMPath); + settings.setValue("ROMs", vjs.ROMPath); } // Here's how Byuu does it... diff --git a/src/jaguar.cpp b/src/jaguar.cpp index cc1a5ac..796d9ee 100644 --- a/src/jaguar.cpp +++ b/src/jaguar.cpp @@ -5,7 +5,7 @@ // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Carwin Jones (BeOS) // Cleanups and endian wrongness amelioration by James L. Hammons // Note: Endian wrongness probably stems from the MAME origins of this emu and -// the braindead way in which MAME handles memory. :-) +// the braindead way in which MAME handled memory when this was written. :-) // // JLH = James L. Hammons // @@ -1891,7 +1891,8 @@ void ScanlineCallback(void) // if (vc == vbb) { JoystickExec(); - RenderBackbuffer(); +//We comment this out so that the GUI can manage this instead. Which is how it should be anyway. +// RenderBackbuffer(); TOMResetBackbuffer(backbuffer); frameDone = true; }//*/