<ul>
<li>Power</li>
<li>Pause</li>
+<li>Frame Advance</li>
<li>Insert Cartridge...</li>
<li>Use CD Unit</li>
<li>Configure</li>
<p><b>Pause</b> does the same as the toolbar button; see the “Pause” toolbar button description for details.</p>
+<p><b>Frame Advance</b> causes <i>Virtual Jaguar</i> to run for one frame (1/60th of a second for NTSC, 1/50th for PAL), and update the screen. This option only works when <i>Virtual Jaguar</i> is paused.</p>
+
<p><b>Insert Cartridge...</b> does the same as the toolbar button; see the “Insert Cartridge” toolbar button description for details.</p>
<p><b>Use CD Unit</b> does the same as the toolbar button; see the “Use CD Unit” toolbar button description for details.</p>
<p>Under the Controller tab, there are the following options:</p>
<ul>
-<li>A picture of a Jaguar controller showing which keys are defined</li>
-<li>A button labeled “Define All Keys”</li>
+<li>A picture of a Jaguar controller showing which inputs are defined</li>
+<li>A button labeled “Define All Inputs”</li>
</ul>
-<p>Hovering over a letter on the picture of the Jaguar controller will highlight it; clicking on the letter will let you redefine that key. If you prefer, you can define all the keys at once by clicking on the “Define All Keys” button. It will then step through each button on the controller, one at a time, and wait for you to press the key that you wish to set it to. You can exit the key redefinition process at any time by pressing the <b>Esc</b> key on your keyboard.</p>
+<p>Hovering over a letter on the picture of the Jaguar controller will highlight it; clicking on the letter will let you redefine that input by pressing a key on the keyboard or button on a connected gamepad. If you prefer, you can define all inputs at once by clicking on the “Define All Inputs” button. It will then step through each input on the controller, one at a time, and wait for you to press the key/button that you wish to set it to. You can exit the key redefinition process at any time by pressing the <b>Esc</b> key on your keyboard.</p>
+
+<p>NOTE: For gamepads to be detected, they must be connected to the computer before starting <i>Virtual Jaguar</i>.</p>
<h2>EEPROMs</h2>
<p><b>ABS to load</b> is the path to a Jaguar executable file that will be loaded in the Jaguar’s main RAM. This file must have valid headers, otherwise <i>Virtual Jaguar</i> won’t be able to load it. Assuming the file exists and has the correct headers in it, it will be loaded and run when <i>Virtual Jaguar</i> is first run.</p>
+<p>Also, when in Alpine mode, extra toolbar buttons are defined (also found under the extra “Debug” menu):</p>
+
+<ul>
+<li>Memory Browser</li>
+<li>CPU Browser</li>
+<li>OP Browser</li>
+<li>M68K Disassembly Browser</li>
+<li>RISC Disassembly Browser</li>
+</ul>
+
+<h3>Memory Browser</h3>
+
+<p>This window lets you inspect <i>Virtual Jaguar</i>’s emulated memory space. The <b>PgDn</b> key will advance the top of the window’s memory location by 480 bytes, and <b>PgUp</b> will go back by the same amount. The <b>Plus (+)</b> key will advance the top of the window’s memory location by 16 bytes, and <b>Minus (-)</b> will go back by the same amount. Entering a memory location, in hexadecimal, in the edit field and pressing the <b>Go</b> button will display memory from that location. It can be dismissed by clicking on the “X” in the upper corner of the dialog, or by pressing the <b>Esc</b> key on your keyboard.</p>
+
+<h3>CPU Browser</h3>
+
+<p>This window shows the state of the various CPUs in the emulated Jaguar. It can be dismissed by clicking on the “X” in the upper corner of the dialog, or by pressing the <b>Esc</b> key on your keyboard.</p>
+
+<h3>OP Browser</h3>
+
+<p>This window shows the current state of object list that the Object Processor is pointing to. Note that most of the time, this will likely show an object list that has had its objects processed. It can be dismissed by clicking on the “X” in the upper corner of the dialog, or by pressing the <b>Esc</b> key on your keyboard.</p>
+
+<h3>M68K Disassembly Browser</h3>
+
+<p>This window provides a disassembly of 68000 opcodes. It can be dismissed by clicking on the “X” in the upper corner of the dialog, or by pressing the <b>Esc</b> key on your keyboard.</p>
+
+<h3>RISC Disassembly Browser</h3>
+
+<p>This window provides a disassembly of RISC opcodes. It can be dismissed by clicking on the “X” in the upper corner of the dialog, or by pressing the <b>Esc</b> key on your keyboard.</p>
+
<p>The aforementioned options will only work when <i>Virtual Jaguar</i> is run in Alpine mode, that is, when the --alpine flag is passed in. If you do not pass in the --alpine flag, <i>Virtual Jaguar</i> will run as it normally does, i.e., as a stock Jaguar, and nothing will be loaded by default.</p>
<h2>For The Curious</h2>
ControllerTab::ControllerTab(QWidget * parent/*= 0*/): QWidget(parent)
{
controllerWidget = new ControllerWidget(this);
- redefineAll = new QPushButton(tr("Define All Keys"));
+ redefineAll = new QPushButton(tr("Define All Inputs"));
QVBoxLayout * layout = new QVBoxLayout;
layout->addWidget(controllerWidget);
void CPUBrowserWindow::keyPressEvent(QKeyEvent * e)
{
- if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Return)
+ if (e->key() == Qt::Key_Escape)
hide();
else if (e->key() == Qt::Key_PageUp)
{
// layout(new QVBoxLayout), text(new QTextBrowser),
layout(new QVBoxLayout), text(new QLabel),
refresh(new QPushButton(tr("Refresh"))),
+ address(new QLineEdit),
+ go(new QPushButton(tr("Go"))),
memBase(0x4000)
{
setWindowTitle(tr("M68K Disassembly Browser"));
+ address->setInputMask("hhhhhh");
+ QHBoxLayout * hbox1 = new QHBoxLayout;
+ hbox1->addWidget(refresh);
+ hbox1->addWidget(address);
+ hbox1->addWidget(go);
+
// Need to set the size as well...
// resize(560, 480);
setLayout(layout);
layout->addWidget(text);
- layout->addWidget(refresh);
+// layout->addWidget(refresh);
+ layout->addLayout(hbox1);
connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents()));
+ connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress()));
}
}
#endif
}
+
+
+void M68KDasmBrowserWindow::GoToAddress(void)
+{
+ bool ok;
+ QString newAddress = address->text();
+ memBase = newAddress.toUInt(&ok, 16);
+ RefreshContents();
+}
+
public slots:
// void DefineAllKeys(void);
void RefreshContents(void);
+ void GoToAddress(void);
protected:
void keyPressEvent(QKeyEvent *);
// QTextBrowser * text;
QLabel * text;
QPushButton * refresh;
+ QLineEdit * address;
+ QPushButton * go;
int32_t memBase;
};
// layout(new QVBoxLayout), text(new QTextBrowser),
layout(new QVBoxLayout), text(new QLabel),
refresh(new QPushButton(tr("Refresh"))),
+ address(new QLineEdit),
+ go(new QPushButton(tr("Go"))),
memBase(0)
{
setWindowTitle(tr("Memory Browser"));
+ address->setInputMask("hhhhhh");
+ QHBoxLayout * hbox1 = new QHBoxLayout;
+ hbox1->addWidget(refresh);
+ hbox1->addWidget(address);
+ hbox1->addWidget(go);
+
// Need to set the size as well...
// resize(560, 480);
setLayout(layout);
layout->addWidget(text);
- layout->addWidget(refresh);
+// layout->addWidget(refresh);
+ layout->addLayout(hbox1);
connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents()));
+ connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress()));
}
void MemoryBrowserWindow::keyPressEvent(QKeyEvent * e)
{
- if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Return)
+ if (e->key() == Qt::Key_Escape)
hide();
else if (e->key() == Qt::Key_PageUp)
{
RefreshContents();
}
}
+
+
+void MemoryBrowserWindow::GoToAddress(void)
+{
+ bool ok;
+ QString newAddress = address->text();
+ memBase = newAddress.toUInt(&ok, 16);
+ RefreshContents();
+}
+
public slots:
// void DefineAllKeys(void);
void RefreshContents(void);
+ void GoToAddress(void);
protected:
void keyPressEvent(QKeyEvent *);
// QTextBrowser * text;
QLabel * text;
QPushButton * refresh;
+ QLineEdit * address;
+ QPushButton * go;
int32_t memBase;
};
OPBrowserWindow::OPBrowserWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog),
-// layout(new QVBoxLayout), text(new QTextBrowser),
layout(new QVBoxLayout), text(new QLabel),
- refresh(new QPushButton(tr("Refresh")))//,
-// memBase(0)
+ refresh(new QPushButton(tr("Refresh")))
{
setWindowTitle(tr("OP Browser"));
//// layout->setSizeConstraint(QLayout::SetFixedSize);
setLayout(layout);
- layout->addWidget(text);
+ QScrollArea * scrollArea = new QScrollArea;
+ scrollArea->setWidgetResizable(true);
+ scrollArea->setWidget(text);
+ layout->addWidget(scrollArea);
layout->addWidget(refresh);
connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents()));
char string[1024];//, buf[64];
QString opDump;
-#if 0
- for(uint32_t i=0; i<480; i+=16)
- {
- sprintf(string, "%s%06X: ", (i != 0 ? "<br>" : ""), memBase + i);
-
- for(uint32_t j=0; j<16; j++)
- {
- sprintf(buf, "%02X ", jaguarMainRAM[memBase + i + j]);
- strcat(string, buf);
- }
-
- sprintf(buf, "| ");
- strcat(string, buf);
-
- for(uint32_t j=0; j<16; j++)
- {
- uint8_t c = jaguarMainRAM[memBase + i + j];
- sprintf(buf, "&#%i;", c);
-
- if (c == 0x20)
- sprintf(buf, " ");
-
- if ((c < 0x20) || ((c > 0x7F) && (c < 0xA0)))
- sprintf(buf, ".");
-
- strcat(string, buf);
- }
-
- memDump += QString(string);
- }
-#endif
uint32_t olp = OPGetListPointer();
- sprintf(string, "OLP = $%08X<br><br>", olp);
+ sprintf(string, "OLP = $%X<br>", olp);
opDump += QString(string);
numberOfObjects = 0;
void OPBrowserWindow::keyPressEvent(QKeyEvent * e)
{
- if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Return)
+ if (e->key() == Qt::Key_Escape)
hide();
-#if 0
- else if (e->key() == Qt::Key_PageUp)
- {
- memBase -= 480;
-
- if (memBase < 0)
- memBase = 0;
-
+ else if (e->key() == Qt::Key_Enter)
RefreshContents();
- }
- else if (e->key() == Qt::Key_PageDown)
- {
- memBase += 480;
-
- if (memBase > (0x200000 - 480))
- memBase = 0x200000 - 480;
-
- RefreshContents();
- }
- else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus)
- {
- memBase -= 16;
-
- if (memBase < 0)
- memBase = 0;
-
- RefreshContents();
- }
- else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal)
- {
- memBase += 16;
-
- if (memBase > (0x200000 - 480))
- memBase = 0x200000 - 480;
-
- RefreshContents();
- }
-#endif
}
uint8_t objectType = lo & 0x07;
uint32_t link = ((hi << 11) | (lo >> 21)) & 0x3FFFF8;
// WriteLog("%08X: %08X %08X %s", address, hi, lo, opType[objectType]);
- sprintf(buf, "%08X: %08X %08X %s -> %08X", address, hi, lo, opType[objectType], link);
+ sprintf(buf, "<br>%06X: %08X %08X %s -> %06X", address, hi, lo, opType[objectType], link);
list += QString(buf);
if (objectType == 3)
{
// Runaway recursive link is bad!
// WriteLog("***** SELF REFERENTIAL LINK *****\n\n");
- sprintf(buf, "***** SELF REFERENTIAL LINK *****<br><br>");
+ sprintf(buf, "***** SELF REFERENTIAL LINK *****<br>");
list += QString(buf);
}
}
char buf[512];
// WriteLog(" %08X %08X\n", (uint32)(p1>>32), (uint32)(p1&0xFFFFFFFF));
- sprintf(buf, "_________ %08X %08X<br>", (uint32)(p1>>32), (uint32)(p1&0xFFFFFFFF));
+ sprintf(buf, " %08X %08X<br>", (uint32)(p1>>32), (uint32)(p1&0xFFFFFFFF));
list += QString(buf);
// WriteLog(" %08X %08X\n", (uint32)(p2>>32), (uint32)(p2&0xFFFFFFFF));
- sprintf(buf, "_________ %08X %08X<br>", (uint32)(p2>>32), (uint32)(p2&0xFFFFFFFF));
+ sprintf(buf, " %08X %08X<br>", (uint32)(p2>>32), (uint32)(p2&0xFFFFFFFF));
list += QString(buf);
DumpBitmapCore(list, p0, p1);
uint32 hscale = p2 & 0xFF;
uint32 vscale = (p2 >> 8) & 0xFF;
uint32 remainder = (p2 >> 16) & 0xFF;
// WriteLog(" [hsc: %02X, vsc: %02X, rem: %02X]\n", hscale, vscale, remainder);
- sprintf(buf, "[hsc: %02X, vsc: %02X, rem: %02X]<br>", hscale, vscale, remainder);
+ sprintf(buf, " [hsc: %02X, vsc: %02X, rem: %02X]<br>", hscale, vscale, remainder);
list += QString(buf);
}
char buf[512];
// WriteLog(" %08X %08X\n", (uint32)(p1>>32), (uint32)(p1&0xFFFFFFFF));
- sprintf(buf, " %08X %08X<br>", (uint32)(p1>>32), (uint32)(p1&0xFFFFFFFF));
+ sprintf(buf, " %08X %08X<br>", (uint32)(p1>>32), (uint32)(p1&0xFFFFFFFF));
list += QString(buf);
DumpBitmapCore(list, p0, p1);
}
// ptr, firstPix, (flags&OPFLAG_REFLECT ? "REFLECT " : ""),
// (flags&OPFLAG_RMW ? "RMW " : ""), (flags&OPFLAG_TRANS ? "TRANS " : ""),
// (flags&OPFLAG_RELEASE ? "RELEASE" : ""), idx, pitch);
- sprintf(buf, " [%u x %u @ (%i, %u) (iw:%u, dw:%u) (%u bpp), p:%08X fp:%02X, fl:%s%s%s%s, idx:%02X, pt:%02X]<br>",
+ sprintf(buf, " [%u x %u @ (%i, %u) (iw:%u, dw:%u) (%u bpp), p:%06X fp:%02X, fl:%s%s%s%s, idx:%02X, pt:%02X]<br>",
iwidth * bdMultiplier[bitdepth],
height, xpos, ypos, iwidth, dwidth, op_bitmap_bit_depth[bitdepth],
ptr, firstPix, (flags&OPFLAG_REFLECT ? "REFLECT " : ""),
(flags&OPFLAG_RELEASE ? "RELEASE" : ""), idx, pitch);
list += QString(buf);
}
+
hbox1->addWidget(address);
hbox1->addWidget(go);
-
// Need to set the size as well...
// resize(560, 480);
palAct->setCheckable(true);
connect(palAct, SIGNAL(triggered()), this, SLOT(SetPAL()));
- blurAct = new QAction(QIcon(":/res/generic.png"), tr("Blur"), this);
+ blurAct = new QAction(QIcon(":/res/blur.png"), tr("Blur"), this);
blurAct->setStatusTip(tr("Sets OpenGL rendering to GL_NEAREST"));
blurAct->setCheckable(true);
connect(blurAct, SIGNAL(triggered()), this, SLOT(ToggleBlur()));
frameAdvanceAct->setShortcut(QKeySequence(tr("F7")));
connect(frameAdvanceAct, SIGNAL(triggered()), this, SLOT(FrameAdvance()));
- fullScreenAct = new QAction(QIcon(":/res/generic.png"), tr("F&ull Screen"), this);
+ fullScreenAct = new QAction(QIcon(":/res/fullscreen.png"), tr("F&ull Screen"), this);
fullScreenAct->setShortcut(QKeySequence(tr("F9")));
+ fullScreenAct->setCheckable(true);
connect(fullScreenAct, SIGNAL(triggered()), this, SLOT(ToggleFullScreen()));
// Debugger Actions
- memBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("Memory Browser"), this);
+ memBrowseAct = new QAction(QIcon(":/res/tool-memory.png"), tr("Memory Browser"), this);
memBrowseAct->setStatusTip(tr("Shows the Jaguar memory browser window"));
// memBrowseAct->setCheckable(true);
connect(memBrowseAct, SIGNAL(triggered()), this, SLOT(ShowMemoryBrowserWin()));
- cpuBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("CPU Browser"), this);
+ cpuBrowseAct = new QAction(QIcon(":/res/tool-cpu.png"), tr("CPU Browser"), this);
cpuBrowseAct->setStatusTip(tr("Shows the Jaguar CPU browser window"));
// memBrowseAct->setCheckable(true);
connect(cpuBrowseAct, SIGNAL(triggered()), this, SLOT(ShowCPUBrowserWin()));
- opBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("OP Browser"), this);
+ opBrowseAct = new QAction(QIcon(":/res/tool-op.png"), tr("OP Browser"), this);
opBrowseAct->setStatusTip(tr("Shows the Jaguar OP browser window"));
// memBrowseAct->setCheckable(true);
connect(opBrowseAct, SIGNAL(triggered()), this, SLOT(ShowOPBrowserWin()));
- m68kDasmBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("68K Listing Browser"), this);
+ m68kDasmBrowseAct = new QAction(QIcon(":/res/tool-68k-dis.png"), tr("68K Listing Browser"), this);
m68kDasmBrowseAct->setStatusTip(tr("Shows the 68K disassembly browser window"));
// memBrowseAct->setCheckable(true);
connect(m68kDasmBrowseAct, SIGNAL(triggered()), this, SLOT(ShowM68KDasmBrowserWin()));
- riscDasmBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("RISC Listing Browser"), this);
+ riscDasmBrowseAct = new QAction(QIcon(":/res/tool-risc-dis.png"), tr("RISC Listing Browser"), this);
riscDasmBrowseAct->setStatusTip(tr("Shows the RISC disassembly browser window"));
// memBrowseAct->setCheckable(true);
connect(riscDasmBrowseAct, SIGNAL(triggered()), this, SLOT(ShowRISCDasmBrowserWin()));
<file>../../res/zoom100.png</file>
<file>../../res/zoom200.png</file>
<file>../../res/zoom300.png</file>
+ <file>../../res/blur.png</file>
+ <file>../../res/fullscreen.png</file>
+ <file>../../res/tool-memory.png</file>
+ <file>../../res/tool-cpu.png</file>
+ <file>../../res/tool-op.png</file>
+ <file>../../res/tool-68k-dis.png</file>
+ <file>../../res/tool-risc-dis.png</file>
<file>../../res/generic.png</file>
<file>../../res/cart-blank.png</file>
<file>../../res/label-blank.png</file>
struct regstruct regs;
+
//
// Make displacement effective address for 68000
//
#endif
}
+
//
// Create the Status Register from the flags
//
| (GET_NFLG << 3) | (GET_ZFLG << 2) | (GET_VFLG << 1) | GET_CFLG);
}
+
//
// Set up the flags from Status Register
//
// set_special(SPCFLAG_DOINT);
}
+
//
// Rudimentary exception handling. This is really stripped down from what
// was in Hatari.
//
void Exception(int nr, uint32_t oldpc, int ExceptionSource)
{
+ uint32_t currpc = m68k_getpc(), newpc;
+
+// Need to figure out how to report this stuff without using printf on stdout :-/
+#if 0
char excNames[33][64] = {
"???", "???", "Bus Error", "Address Error",
"Illegal Instruction", "Zero Divide", "CHK", "TrapV",
printf("Exception #%i occurred! (%s)\n", nr, (nr < 32 ? excNames[nr] : (nr < 48 ? "Trap #" : "????")));
printf("Vector @ #%i = %08X\n", nr, m68k_read_memory_32(nr * 4));
//abort();
- uint32_t currpc = m68k_getpc(), newpc;
printf("PC = $%08X\n", currpc);
printf("A0 = $%08X A1 = $%08X A2 = $%08X A3 = $%08X\n", m68k_areg(regs, 0), m68k_areg(regs, 1), m68k_areg(regs, 2), m68k_areg(regs, 3));
printf("A4 = $%08X A5 = $%08X A6 = $%08X A7 = $%08X\n", m68k_areg(regs, 4), m68k_areg(regs, 5), m68k_areg(regs, 6), m68k_areg(regs, 7));
printf("%s%08X: %s\n", (oldpc == currpc ? ">" : " "), oldpc, buffer);
}
while (disPC < (currpc + 10));
+#endif
/*if( nr>=2 && nr<10 ) fprintf(stderr,"Exception (-> %i bombs)!\n",nr);*/
#endif
}
+
/*
The routines below take dividend and divisor as parameters.
They return 0 if division by zero, or exact number of cycles otherwise.
return mcycles * 2;
}
+
// This is called by cpuemu.c
int getDivu68kCycles(uint32_t dividend, uint16_t divisor)
{
return v;
}
+
//
// DIVS
// Signed division
//
-
STATIC_INLINE int getDivs68kCycles_2(int32_t dividend, int16_t divisor)
{
int mcycles;
return mcycles * 2;
}
+
// This is called by cpuemu.c
int getDivs68kCycles(int32_t dividend, int16_t divisor)
{
// write_log ("S%d ", v);
return v;
}
+
return numberOfBytes;
}
+
//
// Disasemble one instruction at pc and store in str_buff
//
{
return m68k_disasm(str_buff, pc, 0, 1);
}
+
#endif
#define CPU_DEBUG
+
+
void Dasm(uint32_t offset, uint32_t qt)
{
#ifdef CPU_DEBUG
#endif
}
+
#ifdef CPU_DEBUG
void DumpRegisters(void)
{
{
}
+
// Pulse the RESET line on the CPU
void m68k_pulse_reset(void)
{
#endif
}
+
int m68k_execute(int num_cycles)
{
#if 0
#endif
}
+
/* ASG: rewrote so that the int_level is a mask of the IPL0/IPL1/IPL2 bits */
void m68k_set_irq(unsigned int intLevel)
{
#endif
}
+
// Check for interrupts
STATIC_INLINE void m68ki_check_interrupts(void)
{
#endif
}
+
// Service an interrupt request and start exception processing
void m68ki_exception_interrupt(uint32_t intLevel)
{
#endif
}
+
// Initiate exception processing
STATIC_INLINE uint32_t m68ki_init_exception(void)
{
#endif
}
+
// 3 word stack frame (68000 only)
STATIC_INLINE void m68ki_stack_frame_3word(uint32_t pc, uint32_t sr)
{
#endif
}
+
unsigned int m68k_get_reg(void * context, m68k_register_t reg)
{
if (reg <= M68K_REG_A7)
return 0;
}
+
void m68k_set_reg(m68k_register_t reg, unsigned int value)
{
if (reg <= M68K_REG_A7)
regs.regs[15] = value;
}
+
//
// Check if the instruction is a valid one
//
return 1;
}
+
// Dummy functions, for now, until we prove the concept here. :-)
// Temp, while we're using the Musashi disassembler...
void m68k_modify_timeslice(int cycles) {} /* Modify cycles left */
//void m68k_end_timeslice(void) {} /* End timeslice now */
+
void m68k_end_timeslice(void)
{
#if 0
{ i_ILLG, "" },
};
-struct instr *table68k;
+
+struct instr * table68k;
+
STATIC_INLINE amodes mode_from_str(const char * str)
{
return 0;
}
+
STATIC_INLINE amodes mode_from_mr(int mode, int reg)
{
switch (mode)
return 0;
}
+
static void build_insn(int insn)
{
int find = -1;
build_insn(i);
}
+
static int mismatch;
+
static void handle_merges (long int opcode)
{
uint16_t smsk;
}
}
+
// What this really does is expand the # of handlers, which is why the
// opcode has to be passed into the opcode handler...
// E.g., $F620 maps into $F621-F627 as well; this code does this expansion.
nr_cpuop_funcs = nr;
}
+
int get_no_mismatches(void)
{
return mismatch;
}
+
# Need to add libcdio stuffola (checking/including)...
+# Translations. None yet. :-(
+#TRANSLATIONS = virtualjaguar_fr.ts \
+# virtualjaguar_gr.ts
+
INCLUDEPATH += \
src \
src/gui