From 5d76d651dfc3aa0a2e810e6b6db2ae8a2e34c53e Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Sun, 24 Feb 2013 16:33:45 -0600 Subject: [PATCH] UI cleanups, added RAM randomization for main RAM & GPU local RAM. --- res/test-pattern.jpg | Bin 0 -> 12083 bytes src/dsp.cpp | 6 +---- src/gpu.cpp | 4 +++ src/gui/gamepad.cpp | 4 +-- src/gui/glwidget.cpp | 59 ++++++++++++++++++++--------------------- src/gui/glwidget.h | 8 +++--- src/gui/mainwin.cpp | 61 ++++++++++++++++++++++++++++++++++--------- src/gui/mainwin.h | 2 ++ src/jaguar.cpp | 16 +++++++++++- 9 files changed, 107 insertions(+), 53 deletions(-) create mode 100644 res/test-pattern.jpg diff --git a/res/test-pattern.jpg b/res/test-pattern.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e559cceb6fb270a73ea8053ea74584dbffe95333 GIT binary patch literal 12083 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 // Used only for SDL_GetTicks... #include -#include #include "dac.h" #include "gpu.h" #include "jagdasm.h" @@ -1279,7 +1278,6 @@ void DSPInit(void) dsp_build_branch_condition_table(); DSPReset(); - srand(time(NULL)); // For randomizing local RAM } void DSPReset(void) @@ -1306,12 +1304,10 @@ void DSPReset(void) IMASKCleared = false; FlushDSPPipeline(); dsp_reset_stats(); -// memset(dsp_ram_8, 0xFF, 0x2000); + // Contents of local RAM are quasi-stable; we simulate this by randomizing RAM contents for(uint32_t i=0; i<8192; i+=4) - { *((uint32_t *)(&dsp_ram_8[i])) = rand(); - } } void DSPDumpDisassembly(void) diff --git a/src/gpu.cpp b/src/gpu.cpp index b83051c..1f1bef9 100644 --- a/src/gpu.cpp +++ b/src/gpu.cpp @@ -1044,6 +1044,10 @@ void GPUReset(void) gpu_in_exec = 0; //not needed GPUInterruptPending = false; GPUResetStats(); + + // Contents of local RAM are quasi-stable; we simulate this by randomizing RAM contents + for(uint32_t i=0; i<4096; i+=4) + *((uint32_t *)(&gpu_ram_8[i])) = rand(); } uint32_t GPUReadPC(void) diff --git a/src/gui/gamepad.cpp b/src/gui/gamepad.cpp index 84307f8..62a6d7a 100644 --- a/src/gui/gamepad.cpp +++ b/src/gui/gamepad.cpp @@ -95,10 +95,10 @@ bool Gamepad::GetState(int joystickID, int buttonID) if (axis[joystickID][axisNum] != 0) { - if (axis[joystickID][axisNum] > 0 && (direction == 0)) + if (axis[joystickID][axisNum] > 16000 && (direction == 0)) return true; - if (axis[joystickID][axisNum] < 0 && (direction == 1)) + if (axis[joystickID][axisNum] < -16000 && (direction == 1)) return true; } } diff --git a/src/gui/glwidget.cpp b/src/gui/glwidget.cpp index af51f47..058f9e0 100644 --- a/src/gui/glwidget.cpp +++ b/src/gui/glwidget.cpp @@ -25,7 +25,7 @@ GLWidget::GLWidget(QWidget * parent/*= 0*/): QGLWidget(parent), texture(0), - textureWidth(0), textureHeight(0), buffer(0), rasterWidth(340), rasterHeight(240), + textureWidth(0), textureHeight(0), buffer(0), rasterWidth(326), rasterHeight(240), offset(0) { // Screen pitch has to be the texture width (in 32-bit pixels)... @@ -53,13 +53,15 @@ void GLWidget::initializeGL() glEnable(GL_DITHER); glEnable(GL_TEXTURE_2D); glClearColor(0.0, 0.0, 0.0, 0.0); + + CreateTextures(); } void GLWidget::paintGL() { -//kludge -rasterHeight = (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL); +//kludge [NO MORE!] +//rasterHeight = (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL); // If we're in fullscreen mode, we take the value of the screen width as // set by MainWin, since it may be wider than what our aspect ratio allows. @@ -113,34 +115,31 @@ rasterHeight = (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCRE void GLWidget::resizeGL(int width, int height) { - if (width > textureWidth || height > textureHeight) - { - // Seems that power of 2 sizes are still mandatory... - textureWidth = 1024; - textureHeight = 512; -#if 0 -printf("Resizing: new texture width/height = %i x %i\n", textureWidth, textureHeight); -printf("Resizing: new raster width/height = %i x %i\n", rasterWidth, rasterHeight); -#endif +//kludge [No, this is where it belongs!] + rasterHeight = (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL); - if (buffer) - { - delete[] buffer; - glDeleteTextures(1, &texture); - } - - buffer = new uint32_t[textureWidth * textureHeight]; - JaguarSetScreenBuffer(buffer); - -//??? -memset(buffer, 0xFF, textureWidth * textureHeight * sizeof(uint32_t)); - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - glPixelStorei(GL_UNPACK_ROW_LENGTH, textureWidth); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL); - } + return; +} + + +// At some point, we'll have to create more than one texture to handle +// cases like Doom. Or have another go at TV type rendering; it will +// require a 2048x512 texture though. (Note that 512 is the correct height for +// interlaced screens; we won't have to change much here to support it.) +void GLWidget::CreateTextures(void) +{ + // Seems that power of 2 sizes are still mandatory... + textureWidth = 1024; + textureHeight = 512; + buffer = new uint32_t[textureWidth * textureHeight]; + JaguarSetScreenBuffer(buffer); + + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glPixelStorei(GL_UNPACK_ROW_LENGTH, textureWidth); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL); } diff --git a/src/gui/glwidget.h b/src/gui/glwidget.h index 1b00079..1e8e113 100644 --- a/src/gui/glwidget.h +++ b/src/gui/glwidget.h @@ -24,11 +24,13 @@ class GLWidget: public QGLWidget // void clicked(); protected: - void initializeGL(); - void paintGL(); + void initializeGL(void); + void paintGL(void); void resizeGL(int width, int height); -// private: + private: + void CreateTextures(void); + public: GLuint texture; int textureWidth, textureHeight; diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index 0e19488..0fde969 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -52,7 +52,6 @@ #include "dac.h" #include "jaguar.h" -#include "tom.h" #include "log.h" #include "file.h" #include "jagbios.h" @@ -204,6 +203,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), frameAdvanceAct = new QAction(QIcon(":/res/frame-advance.png"), tr("&Frame Advance"), this); frameAdvanceAct->setShortcut(QKeySequence(tr("F7"))); + frameAdvanceAct->setDisabled(true); connect(frameAdvanceAct, SIGNAL(triggered()), this, SLOT(FrameAdvance())); fullScreenAct = new QAction(QIcon(":/res/fullscreen.png"), tr("F&ull Screen"), this); @@ -246,7 +246,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), fileMenu = menuBar()->addMenu(tr("&Jaguar")); fileMenu->addAction(powerAct); fileMenu->addAction(pauseAct); - fileMenu->addAction(frameAdvanceAct); +// fileMenu->addAction(frameAdvanceAct); fileMenu->addAction(filePickAct); fileMenu->addAction(useCDAct); fileMenu->addAction(configAct); @@ -269,6 +269,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), toolbar = addToolBar(tr("Stuff")); toolbar->addAction(powerAct); toolbar->addAction(pauseAct); + toolbar->addAction(frameAdvanceAct); toolbar->addAction(filePickAct); toolbar->addAction(useCDAct); toolbar->addSeparator(); @@ -300,6 +301,21 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), // Do this in case original size isn't correct (mostly for the first-run case) ResizeMainWindow(); + // Create our test pattern bitmap + QImage tempImg(":/res/test-pattern.jpg"); + QImage tempImgScaled = tempImg.scaled(VIRTUAL_SCREEN_WIDTH, VIRTUAL_SCREEN_HEIGHT_PAL, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + + for(uint32_t y=0; ysetChecked(false); pauseAct->setDisabled(true); showUntunedTankCircuit = true; + DACPauseAudioThread(); // This is just in case the ROM we were playing was in a narrow or wide field mode, // so the untuned tank sim doesn't look wrong. :-) - DACPauseAudioThread(); TOMReset(); + + if (plzDontKillMyComputer) + { + // We have to do it line by line, because the texture pitch is not the + // same as the picture buffer's pitch. + for(uint32_t y=0; yrasterHeight; y++) + { + memcpy(videoWidget->buffer + (y * videoWidget->textureWidth), testPattern + (y * VIRTUAL_SCREEN_WIDTH), VIRTUAL_SCREEN_WIDTH * sizeof(uint32_t)); + } + } } else { @@ -696,6 +720,8 @@ void MainWin::ToggleRunState(void) if (!running) { + frameAdvanceAct->setDisabled(false); + for(uint32_t i=0; i<(uint32_t)(videoWidget->textureWidth * 256); i++) { uint32_t pixel = videoWidget->buffer[i]; @@ -706,6 +732,8 @@ void MainWin::ToggleRunState(void) videoWidget->updateGL(); } + else + frameAdvanceAct->setDisabled(true); // Pause/unpause any running/non-running threads... DACPauseAudioThread(!running); @@ -846,6 +874,8 @@ void MainWin::FrameAdvance(void) // Execute 1 frame, then exit (only useful in Pause mode) JaguarExecuteNew(); videoWidget->updateGL(); + // Need to execute 1 frames' worth of DSP thread as well :-/ +#warning "!!! Need to execute the DSP thread for 1 frame too !!!" } @@ -854,7 +884,6 @@ void MainWin::SetFullScreen(bool state/*= true*/) if (state) { mainWinPosition = pos(); -// mainWinSize = size(); menuBar()->hide(); statusBar()->hide(); x1Act->setDisabled(true); @@ -865,18 +894,15 @@ void MainWin::SetFullScreen(bool state/*= true*/) // screen than screen 0: int screenNum = QApplication::desktop()->screenNumber(videoWidget); QRect r = QApplication::desktop()->availableGeometry(screenNum); -// double targetWidth = 320.0, targetHeight = (vjs.hardwareTypeNTSC ? 240.0 : 256.0); double targetWidth = (double)VIRTUAL_SCREEN_WIDTH, targetHeight = (double)(vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL); double aspectRatio = targetWidth / targetHeight; - // NOTE: Really should check here to see which dimension constrains the other. - // Right now, we assume that height is the constraint. + // NOTE: Really should check here to see which dimension constrains the + // other. Right now, we assume that height is the constraint. int newWidth = (int)(aspectRatio * (double)r.height()); videoWidget->offset = (r.width() - newWidth) / 2; videoWidget->fullscreen = true; videoWidget->outputWidth = newWidth; - -// videoWidget->setFixedSize(newWidth, r.height()); videoWidget->setFixedSize(r.width(), r.height()); showFullScreen(); } @@ -897,6 +923,8 @@ void MainWin::SetFullScreen(bool state/*= true*/) // For some reason, this doesn't work: If the emu is paused, toggling from // fullscreen to windowed (& vice versa) shows a white screen. + // (It was the ResizeGL() function in GLWidget: it was being called too + // much, causing the buffer to be deleted, remade & cleared.) // videoWidget->updateGL(); } @@ -945,9 +973,18 @@ void MainWin::ShowRISCDasmBrowserWin(void) void MainWin::ResizeMainWindow(void) { -// videoWidget->setFixedSize(zoomLevel * 320, zoomLevel * (vjs.hardwareTypeNTSC ? 240 : 256)); videoWidget->setFixedSize(zoomLevel * VIRTUAL_SCREEN_WIDTH, zoomLevel * (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL)); + + // Show the test pattern if user requested plzDontKillMyComputer mode + if (!powerButtonOn && plzDontKillMyComputer) + { + for(uint32_t y=0; yrasterHeight; y++) + { + memcpy(videoWidget->buffer + (y * videoWidget->textureWidth), testPattern + (y * VIRTUAL_SCREEN_WIDTH), VIRTUAL_SCREEN_WIDTH * sizeof(uint32_t)); + } + } + show(); for(int i=0; i<2; i++) diff --git a/src/gui/mainwin.h b/src/gui/mainwin.h index 80cfe93..1c7871c 100644 --- a/src/gui/mainwin.h +++ b/src/gui/mainwin.h @@ -10,6 +10,7 @@ //Hrm. uh??? I thought this wasn't the way to do this stuff...??? #include +#include "tom.h" // Forward declarations class GLWidget; @@ -136,6 +137,7 @@ class MainWin: public QMainWindow QIcon powerGreen; QIcon powerRed; + uint32_t testPattern[VIRTUAL_SCREEN_WIDTH * VIRTUAL_SCREEN_HEIGHT_PAL]; }; #endif // __MAINWIN_H__ diff --git a/src/jaguar.cpp b/src/jaguar.cpp index 72802f5..e1b95aa 100644 --- a/src/jaguar.cpp +++ b/src/jaguar.cpp @@ -16,6 +16,7 @@ #include "jaguar.h" +#include #include #include "SDL_opengl.h" #include "blitter.h" @@ -1758,12 +1759,19 @@ void JaguarSetScreenPitch(uint32_t pitch) // void JaguarInit(void) { + // For randomizing RAM + srand(time(NULL)); + + // Contents of local RAM are quasi-stable; we simulate this by randomizing RAM contents + for(uint32_t i=0; i<0x200000; i+=4) + *((uint32_t *)(&jaguarMainRAM[i])) = rand(); + #ifdef CPU_DEBUG_MEMORY memset(readMem, 0x00, 0x400000); memset(writeMemMin, 0xFF, 0x400000); memset(writeMemMax, 0x00, 0x400000); #endif - memset(jaguarMainRAM, 0x00, 0x200000); +// memset(jaguarMainRAM, 0x00, 0x200000); // memset(jaguar_mainRom, 0xFF, 0x200000); // & set it to all Fs... // memset(jaguar_mainRom, 0x00, 0x200000); // & set it to all 0s... //NOTE: This *doesn't* fix FlipOut... @@ -1784,11 +1792,16 @@ memset(jaguarMainRAM + 0x804, 0xFF, 4); CDROMInit(); } + //New timer based code stuffola... void HalflineCallback(void); void RenderCallback(void); void JaguarReset(void) { + // Contents of local RAM are quasi-stable; we simulate this by randomizing RAM contents + for(uint32_t i=0; i<0x200000; i+=4) + *((uint32_t *)(&jaguarMainRAM[i])) = rand(); + // New timer base code stuffola... InitializeEventList(); //Need to change this so it uses the single RAM space and load the BIOS @@ -1816,6 +1829,7 @@ void JaguarReset(void) SetCallbackTime(HalflineCallback, (vjs.hardwareTypeNTSC ? 31.777777777 : 32.0)); } + void JaguarDone(void) { #ifdef CPU_DEBUG_MEMORY -- 2.37.2