#include <SDL.h> // Used only for SDL_GetTicks...
#include <stdlib.h>
-#include <time.h>
#include "dac.h"
#include "gpu.h"
#include "jagdasm.h"
dsp_build_branch_condition_table();
DSPReset();
- srand(time(NULL)); // For randomizing local RAM
}
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)
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)
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;
}
}
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)...
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.
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);
}
// 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;
#include "dac.h"
#include "jaguar.h"
-#include "tom.h"
#include "log.h"
#include "file.h"
#include "jagbios.h"
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);
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);
toolbar = addToolBar(tr("Stuff"));
toolbar->addAction(powerAct);
toolbar->addAction(pauseAct);
+ toolbar->addAction(frameAdvanceAct);
toolbar->addAction(filePickAct);
toolbar->addAction(useCDAct);
toolbar->addSeparator();
// 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; y<VIRTUAL_SCREEN_HEIGHT_PAL; y++)
+ {
+ const QRgb * scanline = (QRgb *)tempImgScaled.constScanLine(y);
+
+ for(uint32_t x=0; x<VIRTUAL_SCREEN_WIDTH; x++)
+ {
+ uint32_t pixel = (qRed(scanline[x]) << 24) | (qGreen(scanline[x]) << 16) | (qBlue(scanline[x]) << 8) | 0xFF;
+ testPattern[(y * VIRTUAL_SCREEN_WIDTH) + x] = pixel;
+ }
+ }
+
// Set up timer based loop for animation...
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(Timer()));
if (showUntunedTankCircuit)
{
// Some machines can't handle this, so we give them the option to disable it. :-)
-#warning "!!! Add test pattern here for -z option !!!"
-// Actually, should put test pattern in buffer in function below :-P
if (!plzDontKillMyComputer)
{
// Random hash & trash
pauseAct->setChecked(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; y<videoWidget->rasterHeight; y++)
+ {
+ memcpy(videoWidget->buffer + (y * videoWidget->textureWidth), testPattern + (y * VIRTUAL_SCREEN_WIDTH), VIRTUAL_SCREEN_WIDTH * sizeof(uint32_t));
+ }
+ }
}
else
{
if (!running)
{
+ frameAdvanceAct->setDisabled(false);
+
for(uint32_t i=0; i<(uint32_t)(videoWidget->textureWidth * 256); i++)
{
uint32_t pixel = videoWidget->buffer[i];
videoWidget->updateGL();
}
+ else
+ frameAdvanceAct->setDisabled(true);
// Pause/unpause any running/non-running threads...
DACPauseAudioThread(!running);
// 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 !!!"
}
if (state)
{
mainWinPosition = pos();
-// mainWinSize = size();
menuBar()->hide();
statusBar()->hide();
x1Act->setDisabled(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();
}
// 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();
}
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; y<videoWidget->rasterHeight; 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++)
//Hrm. uh??? I thought this wasn't the way to do this stuff...???
#include <QtGui>
+#include "tom.h"
// Forward declarations
class GLWidget;
QIcon powerGreen;
QIcon powerRed;
+ uint32_t testPattern[VIRTUAL_SCREEN_WIDTH * VIRTUAL_SCREEN_HEIGHT_PAL];
};
#endif // __MAINWIN_H__
#include "jaguar.h"
+#include <time.h>
#include <SDL.h>
#include "SDL_opengl.h"
#include "blitter.h"
//
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...
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
SetCallbackTime(HalflineCallback, (vjs.hardwareTypeNTSC ? 31.777777777 : 32.0));
}
+
void JaguarDone(void)
{
#ifdef CPU_DEBUG_MEMORY