Qt iNES header editor in work.
This commit is contained in:
parent
461d3f88cd
commit
91f035fbf2
src/drivers/Qt
|
@ -8,6 +8,7 @@
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
#include <QCloseEvent>
|
#include <QCloseEvent>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
#include "../../types.h"
|
#include "../../types.h"
|
||||||
#include "../../fceu.h"
|
#include "../../fceu.h"
|
||||||
|
@ -24,14 +25,121 @@
|
||||||
|
|
||||||
extern BMAPPINGLocal bmap[];
|
extern BMAPPINGLocal bmap[];
|
||||||
|
|
||||||
|
// VS System type
|
||||||
|
static const char* vsSysList[] = {
|
||||||
|
"Normal",
|
||||||
|
"RBI Baseball",
|
||||||
|
"TKO Boxing",
|
||||||
|
"Super Xevious",
|
||||||
|
"Ice Climber",
|
||||||
|
"Dual Normal",
|
||||||
|
"Dual Raid on Bungeling Bay",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
// VS PPU type
|
||||||
|
static const char* vsPPUList[] = {
|
||||||
|
"RP2C03B",
|
||||||
|
"RP2C03G",
|
||||||
|
"RP2C04-0001",
|
||||||
|
"RP2C04-0002",
|
||||||
|
"RP2C04-0003",
|
||||||
|
"RP2C04-0004",
|
||||||
|
"RC2C03B",
|
||||||
|
"RC2C03C",
|
||||||
|
"RC2C05-01 ($2002 AND $\?\?=$1B)",
|
||||||
|
"RC2C05-02 ($2002 AND $3F=$3D)",
|
||||||
|
"RC2C05-03 ($2002 AND $1F=$1C)",
|
||||||
|
"RC2C05-04 ($2002 AND $1F=$1B)",
|
||||||
|
"RC2C05-05 ($2002 AND $1F=$\?\?)",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
// Extend console type
|
||||||
|
static const char* extConsoleList[] = {
|
||||||
|
"Normal",
|
||||||
|
"VS. System",
|
||||||
|
"Playchoice 10",
|
||||||
|
"Bit Corp. Creator",
|
||||||
|
"V.R. Tech. VT01 monochrome",
|
||||||
|
"V.R. Tech. VT01 red / cyan",
|
||||||
|
"V.R. Tech. VT02",
|
||||||
|
"V.R. Tech. VT03",
|
||||||
|
"V.R. Tech. VT09",
|
||||||
|
"V.R. Tech. VT32",
|
||||||
|
"V.R. Tech. VT369",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
// Default input device list
|
||||||
|
static const char* inputDevList[] = {
|
||||||
|
"Unspecified",
|
||||||
|
"Standard NES / Famicom Controllers",
|
||||||
|
"Four-score (NES)",
|
||||||
|
"Four-score (Famicom)",
|
||||||
|
"VS. System",
|
||||||
|
"VS. System (controllers swapped)",
|
||||||
|
"VS. Pinball (J)",
|
||||||
|
"VS. Zapper",
|
||||||
|
"Zapper",
|
||||||
|
"Double Zappers",
|
||||||
|
"Bandai Hyper Shot",
|
||||||
|
"Power Pad Side A",
|
||||||
|
"Power Pad Side B",
|
||||||
|
"Family Trainer Side A",
|
||||||
|
"Family Trainer Side B",
|
||||||
|
"Arkanoid Paddle (NES)",
|
||||||
|
"Arkanoid Paddle (Famicom)",
|
||||||
|
"Double Arkanoid Paddle",
|
||||||
|
"Konami Hyper Shot",
|
||||||
|
"Pachinko",
|
||||||
|
"Exciting Boxing Punching Bag",
|
||||||
|
"Jissen Mahjong",
|
||||||
|
"Party Tap",
|
||||||
|
"Oeka Kids Tablet",
|
||||||
|
"Barcode Reader",
|
||||||
|
"Miracle Piano",
|
||||||
|
"Pokkun Moguraa",
|
||||||
|
"Top Rider",
|
||||||
|
"Double-Fisted",
|
||||||
|
"Famicom 3D",
|
||||||
|
"Doremikko Keyboard",
|
||||||
|
"R.O.B. Gyro Set",
|
||||||
|
"Famicom Data Recorder",
|
||||||
|
"ASCII Turbo File",
|
||||||
|
"IGS Storage Battle Box",
|
||||||
|
"Family BASIC Keyboard",
|
||||||
|
"PEC-586 Keyboard",
|
||||||
|
"Bit Corp. Keyboard",
|
||||||
|
"Subor Keyboard",
|
||||||
|
"Subor Keyboard + Mouse A",
|
||||||
|
"Subor Keyboard + Mouse B",
|
||||||
|
"SNES Mouse",
|
||||||
|
"Multicart",
|
||||||
|
"Double SNES controllers",
|
||||||
|
"RacerMate Bicycle",
|
||||||
|
"U-Force",
|
||||||
|
"R.O.B. Stack-Up",
|
||||||
|
0
|
||||||
|
};
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
iNesHeaderEditor_t::iNesHeaderEditor_t(QWidget *parent)
|
iNesHeaderEditor_t::iNesHeaderEditor_t(QWidget *parent)
|
||||||
: QDialog( parent )
|
: QDialog( parent )
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
QVBoxLayout *mainLayout, *hdrLayout;
|
QVBoxLayout *mainLayout, *hdrLayout;
|
||||||
QVBoxLayout *vbox, *vbox1, *vbox2, *vbox3, *vbox4, *vbox5;
|
QVBoxLayout *vbox, *vbox1, *vbox2, *vbox3, *vbox4, *vbox5;
|
||||||
QHBoxLayout *hbox, *hbox1, *hbox2, *hbox3;
|
QHBoxLayout *hbox, *hbox1, *hbox2, *hbox3;
|
||||||
QGroupBox *box, *hdrBox;
|
QGroupBox *box, *hdrBox;
|
||||||
|
QGridLayout *grid;
|
||||||
char stmp[128];
|
char stmp[128];
|
||||||
|
|
||||||
setWindowTitle("iNES Header Editor");
|
setWindowTitle("iNES Header Editor");
|
||||||
|
@ -70,7 +178,7 @@ iNesHeaderEditor_t::iNesHeaderEditor_t(QWidget *parent)
|
||||||
hbox->addWidget( new QLabel( tr("Sub #:") ) );
|
hbox->addWidget( new QLabel( tr("Sub #:") ) );
|
||||||
hbox->addWidget( mapperSubEdit );
|
hbox->addWidget( mapperSubEdit );
|
||||||
|
|
||||||
for (int i = 0; bmap[i].init; ++i)
|
for (i = 0; bmap[i].init; ++i)
|
||||||
{
|
{
|
||||||
sprintf(stmp, "%d %s", bmap[i].number, bmap[i].name);
|
sprintf(stmp, "%d %s", bmap[i].number, bmap[i].name);
|
||||||
|
|
||||||
|
@ -79,38 +187,52 @@ iNesHeaderEditor_t::iNesHeaderEditor_t(QWidget *parent)
|
||||||
hdrLayout->addLayout( hbox1 );
|
hdrLayout->addLayout( hbox1 );
|
||||||
|
|
||||||
box = new QGroupBox( tr("PRG") );
|
box = new QGroupBox( tr("PRG") );
|
||||||
hbox = new QHBoxLayout();
|
grid = new QGridLayout();
|
||||||
|
|
||||||
box->setLayout( hbox );
|
box->setLayout( grid );
|
||||||
hdrLayout->addWidget( box );
|
hdrLayout->addWidget( box );
|
||||||
|
|
||||||
prgRomBox = new QComboBox();
|
prgRomBox = new QComboBox();
|
||||||
prgRamBox = new QComboBox();
|
prgRamBox = new QComboBox();
|
||||||
prgNvRamBox = new QComboBox();
|
prgNvRamBox = new QComboBox();
|
||||||
|
battNvRamBox= new QCheckBox( tr("Battery-backed NVRAM") );
|
||||||
|
|
||||||
|
hbox = new QHBoxLayout();
|
||||||
|
grid->addLayout( hbox, 0, 0 );
|
||||||
hbox->addWidget( new QLabel( tr("PRG ROM:") ), 0, Qt::AlignRight );
|
hbox->addWidget( new QLabel( tr("PRG ROM:") ), 0, Qt::AlignRight );
|
||||||
hbox->addWidget( prgRomBox );
|
hbox->addWidget( prgRomBox, 0, Qt::AlignLeft );
|
||||||
|
hbox = new QHBoxLayout();
|
||||||
|
grid->addLayout( hbox, 0, 1 );
|
||||||
hbox->addWidget( new QLabel( tr("PRG RAM:") ), 0, Qt::AlignRight );
|
hbox->addWidget( new QLabel( tr("PRG RAM:") ), 0, Qt::AlignRight );
|
||||||
hbox->addWidget( prgRamBox );
|
hbox->addWidget( prgRamBox, 0, Qt::AlignLeft );
|
||||||
hbox->addWidget( new QLabel( tr("PRG NVRAM:") ), 0, Qt::AlignRight );
|
hbox = new QHBoxLayout();
|
||||||
hbox->addWidget( prgNvRamBox );
|
grid->addLayout( hbox, 0, 2 );
|
||||||
|
hbox->addWidget( prgNvRamLbl = new QLabel( tr("PRG NVRAM:") ), 0, Qt::AlignRight );
|
||||||
|
hbox->addWidget( prgNvRamBox, 0, Qt::AlignLeft );
|
||||||
|
hbox->addWidget( battNvRamBox, 0, Qt::AlignRight );
|
||||||
|
|
||||||
box = new QGroupBox( tr("CHR") );
|
box = new QGroupBox( tr("CHR") );
|
||||||
hbox = new QHBoxLayout();
|
grid = new QGridLayout();
|
||||||
|
|
||||||
box->setLayout( hbox );
|
box->setLayout( grid );
|
||||||
hdrLayout->addWidget( box );
|
hdrLayout->addWidget( box );
|
||||||
|
|
||||||
chrRomBox = new QComboBox();
|
chrRomBox = new QComboBox();
|
||||||
chrRamBox = new QComboBox();
|
chrRamBox = new QComboBox();
|
||||||
chrNvRamBox = new QComboBox();
|
chrNvRamBox = new QComboBox();
|
||||||
|
|
||||||
|
hbox = new QHBoxLayout();
|
||||||
|
grid->addLayout( hbox, 0, 0 );
|
||||||
hbox->addWidget( new QLabel( tr("CHR ROM:") ), 0, Qt::AlignRight );
|
hbox->addWidget( new QLabel( tr("CHR ROM:") ), 0, Qt::AlignRight );
|
||||||
hbox->addWidget( chrRomBox );
|
hbox->addWidget( chrRomBox, 0, Qt::AlignLeft );
|
||||||
|
hbox = new QHBoxLayout();
|
||||||
|
grid->addLayout( hbox, 0, 1 );
|
||||||
hbox->addWidget( new QLabel( tr("CHR RAM:") ), 0, Qt::AlignRight );
|
hbox->addWidget( new QLabel( tr("CHR RAM:") ), 0, Qt::AlignRight );
|
||||||
hbox->addWidget( chrRamBox );
|
hbox->addWidget( chrRamBox, 0, Qt::AlignLeft );
|
||||||
|
hbox = new QHBoxLayout();
|
||||||
|
grid->addLayout( hbox, 0, 2 );
|
||||||
hbox->addWidget( new QLabel( tr("CHR NVRAM:") ), 0, Qt::AlignRight );
|
hbox->addWidget( new QLabel( tr("CHR NVRAM:") ), 0, Qt::AlignRight );
|
||||||
hbox->addWidget( chrNvRamBox );
|
hbox->addWidget( chrNvRamBox, 0, Qt::AlignLeft );
|
||||||
|
|
||||||
// add usually used size strings
|
// add usually used size strings
|
||||||
strcpy(stmp, "0 B");
|
strcpy(stmp, "0 B");
|
||||||
|
@ -206,21 +328,21 @@ iNesHeaderEditor_t::iNesHeaderEditor_t(QWidget *parent)
|
||||||
iNesBusCfltBox = new QCheckBox( tr("Bus Conflict") );
|
iNesBusCfltBox = new QCheckBox( tr("Bus Conflict") );
|
||||||
iNesPrgRamBox = new QCheckBox( tr("PRG RAM Exists") );
|
iNesPrgRamBox = new QCheckBox( tr("PRG RAM Exists") );
|
||||||
|
|
||||||
box = new QGroupBox( tr("iNES 1.0 Unofficial Properties:") );
|
iNesUnOfGroupBox = new QGroupBox( tr("iNES 1.0 Unofficial Properties:") );
|
||||||
vbox = new QVBoxLayout();
|
vbox = new QVBoxLayout();
|
||||||
|
|
||||||
vbox->addWidget( iNesDualRegBox );
|
vbox->addWidget( iNesDualRegBox );
|
||||||
vbox->addWidget( iNesBusCfltBox );
|
vbox->addWidget( iNesBusCfltBox );
|
||||||
vbox->addWidget( iNesPrgRamBox );
|
vbox->addWidget( iNesPrgRamBox );
|
||||||
|
|
||||||
box->setLayout( vbox );
|
iNesUnOfGroupBox->setLayout( vbox );
|
||||||
vbox1->addWidget( iNesUnOfBox );
|
vbox1->addWidget( iNesUnOfBox );
|
||||||
vbox1->addWidget( box );
|
vbox1->addWidget( iNesUnOfGroupBox );
|
||||||
|
|
||||||
hbox = new QHBoxLayout();
|
hbox = new QHBoxLayout();
|
||||||
box = new QGroupBox( tr("System") );
|
sysGroupBox = new QGroupBox( tr("System") );
|
||||||
hbox2->addWidget( box );
|
hbox2->addWidget( sysGroupBox );
|
||||||
box->setLayout( vbox3 );
|
sysGroupBox->setLayout( vbox3 );
|
||||||
vbox3->addLayout( hbox );
|
vbox3->addLayout( hbox );
|
||||||
|
|
||||||
normSysbtn = new QRadioButton( tr("Normal") );
|
normSysbtn = new QRadioButton( tr("Normal") );
|
||||||
|
@ -234,9 +356,9 @@ iNesHeaderEditor_t::iNesHeaderEditor_t(QWidget *parent)
|
||||||
hbox->addWidget( extSysbtn );
|
hbox->addWidget( extSysbtn );
|
||||||
|
|
||||||
hbox = new QHBoxLayout();
|
hbox = new QHBoxLayout();
|
||||||
box = new QGroupBox( tr("VS. System") );
|
vsGroupBox = new QGroupBox( tr("VS. System") );
|
||||||
box->setLayout( vbox4 );
|
vsGroupBox->setLayout( vbox4 );
|
||||||
vbox3->addWidget( box );
|
vbox3->addWidget( vsGroupBox );
|
||||||
vbox4->addLayout( hbox );
|
vbox4->addLayout( hbox );
|
||||||
|
|
||||||
vsHwBox = new QComboBox();
|
vsHwBox = new QComboBox();
|
||||||
|
@ -253,9 +375,9 @@ iNesHeaderEditor_t::iNesHeaderEditor_t(QWidget *parent)
|
||||||
hbox->addWidget( vsPpuBox );
|
hbox->addWidget( vsPpuBox );
|
||||||
|
|
||||||
hbox = new QHBoxLayout();
|
hbox = new QHBoxLayout();
|
||||||
box = new QGroupBox( tr("Extend System") );
|
extGroupBox = new QGroupBox( tr("Extend System") );
|
||||||
vbox3->addWidget( box );
|
vbox3->addWidget( extGroupBox );
|
||||||
box->setLayout( hbox );
|
extGroupBox->setLayout( hbox );
|
||||||
|
|
||||||
hbox->addWidget( new QLabel( tr("Console:") ) );
|
hbox->addWidget( new QLabel( tr("Console:") ) );
|
||||||
hbox->addWidget( extCslBox );
|
hbox->addWidget( extCslBox );
|
||||||
|
@ -269,12 +391,63 @@ iNesHeaderEditor_t::iNesHeaderEditor_t(QWidget *parent)
|
||||||
hbox->addWidget( new QLabel( tr("Input Device:") ) );
|
hbox->addWidget( new QLabel( tr("Input Device:") ) );
|
||||||
hbox->addWidget( inputDevBox );
|
hbox->addWidget( inputDevBox );
|
||||||
|
|
||||||
|
grid = new QGridLayout();
|
||||||
|
restoreBtn = new QPushButton( tr("Restore") );
|
||||||
|
saveAsBtn = new QPushButton( tr("Save As") );
|
||||||
|
closeBtn = new QPushButton( tr("Close") );
|
||||||
|
|
||||||
|
grid->addWidget( restoreBtn, 0, 0, Qt::AlignLeft );
|
||||||
|
grid->addWidget( saveAsBtn , 0, 1, Qt::AlignRight );
|
||||||
|
grid->addWidget( closeBtn , 0, 2, Qt::AlignRight );
|
||||||
|
|
||||||
|
mainLayout->addLayout( grid );
|
||||||
|
|
||||||
setLayout( mainLayout );
|
setLayout( mainLayout );
|
||||||
|
|
||||||
|
i=0;
|
||||||
|
while ( vsSysList[i] != NULL )
|
||||||
|
{
|
||||||
|
vsHwBox->addItem( vsSysList[i], i ); i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
i=0;
|
||||||
|
while ( vsPPUList[i] != NULL )
|
||||||
|
{
|
||||||
|
vsPpuBox->addItem( vsPPUList[i], i ); i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
i=0;
|
||||||
|
while ( extConsoleList[i] != NULL )
|
||||||
|
{
|
||||||
|
extCslBox->addItem( extConsoleList[i], i ); i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
i=0;
|
||||||
|
while ( inputDevList[i] != NULL )
|
||||||
|
{
|
||||||
|
inputDevBox->addItem( inputDevList[i], i ); i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
iNesHdr = (iNES_HEADER*)::malloc( sizeof(iNES_HEADER) );
|
||||||
|
|
||||||
|
::memset( iNesHdr, 0, sizeof(iNES_HEADER) );
|
||||||
|
|
||||||
|
if (GameInfo)
|
||||||
|
{
|
||||||
|
loadHeader( iNesHdr );
|
||||||
|
}
|
||||||
|
|
||||||
|
setHeaderData( iNesHdr );
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
iNesHeaderEditor_t::~iNesHeaderEditor_t(void)
|
iNesHeaderEditor_t::~iNesHeaderEditor_t(void)
|
||||||
{
|
{
|
||||||
printf("Destroy Header Editor Config Window\n");
|
printf("Destroy Header Editor Config Window\n");
|
||||||
|
|
||||||
|
if ( iNesHdr )
|
||||||
|
{
|
||||||
|
free( iNesHdr ); iNesHdr = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void iNesHeaderEditor_t::closeEvent(QCloseEvent *event)
|
void iNesHeaderEditor_t::closeEvent(QCloseEvent *event)
|
||||||
|
@ -292,3 +465,378 @@ void iNesHeaderEditor_t::closeWindow(void)
|
||||||
deleteLater();
|
deleteLater();
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
void iNesHeaderEditor_t::showErrorMsgWindow(const char *str)
|
||||||
|
{
|
||||||
|
QMessageBox msgBox(this);
|
||||||
|
|
||||||
|
msgBox.setIcon( QMessageBox::Critical );
|
||||||
|
msgBox.setText( tr(str) );
|
||||||
|
msgBox.show();
|
||||||
|
msgBox.exec();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool iNesHeaderEditor_t::loadHeader(iNES_HEADER* header)
|
||||||
|
{
|
||||||
|
int error = 0;
|
||||||
|
enum errors {
|
||||||
|
OK,
|
||||||
|
OPEN_FAILED,
|
||||||
|
INVALID_HEADER,
|
||||||
|
FDS_HEADER,
|
||||||
|
UNIF_HEADER,
|
||||||
|
NSF_HEADER//,
|
||||||
|
// NSFE_HEADER,
|
||||||
|
// NSF2_HEADER
|
||||||
|
};
|
||||||
|
|
||||||
|
FCEUFILE* fp = FCEU_fopen(LoadedRomFName, NULL, "rb", NULL);
|
||||||
|
if (!GameInfo)
|
||||||
|
{
|
||||||
|
strcpy(LoadedRomFName, fp->fullFilename.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fp)
|
||||||
|
{
|
||||||
|
if (FCEU_fread(header, 1, sizeof(iNES_HEADER), fp) == sizeof(iNES_HEADER) && !memcmp(header, "NES\x1A", 4))
|
||||||
|
{
|
||||||
|
header->cleanup();
|
||||||
|
}
|
||||||
|
else if (!memcmp(header, "FDS\x1A", 4))
|
||||||
|
{
|
||||||
|
error = errors::FDS_HEADER;
|
||||||
|
}
|
||||||
|
else if (!memcmp(header, "UNIF", 4))
|
||||||
|
{
|
||||||
|
error = errors::UNIF_HEADER;
|
||||||
|
}
|
||||||
|
else if (!memcmp(header, "NESM", 4))
|
||||||
|
{
|
||||||
|
error = errors::NSF_HEADER;
|
||||||
|
}
|
||||||
|
/* else if (!memcmp(header, "NSFE", 4))
|
||||||
|
error = errors::NSFE_HEADER;
|
||||||
|
else if (!memcmp(header, "NESM\2", 4))
|
||||||
|
error = errors::NSF2_HEADER;
|
||||||
|
*/ else
|
||||||
|
{
|
||||||
|
error = errors::INVALID_HEADER;
|
||||||
|
}
|
||||||
|
FCEU_fclose(fp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error = errors::OPEN_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
switch (error)
|
||||||
|
{
|
||||||
|
case errors::OPEN_FAILED:
|
||||||
|
{
|
||||||
|
char buf[2200];
|
||||||
|
sprintf(buf, "Error opening %s!", LoadedRomFName);
|
||||||
|
showErrorMsgWindow( buf );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case errors::INVALID_HEADER:
|
||||||
|
//MessageBox(parent, "Invalid iNES header.", "iNES Header Editor", MB_OK | MB_ICONERROR);
|
||||||
|
showErrorMsgWindow( "Invalid iNES header." );
|
||||||
|
break;
|
||||||
|
case errors::FDS_HEADER:
|
||||||
|
//MessageBox(parent, "Editing header of an FDS file is not supported.", "iNES Header Editor", MB_OK | MB_ICONERROR);
|
||||||
|
showErrorMsgWindow("Editing header of an FDS file is not supported.");
|
||||||
|
break;
|
||||||
|
case errors::UNIF_HEADER:
|
||||||
|
//MessageBox(parent, "Editing header of a UNIF file is not supported.", "iNES Header Editor", MB_OK | MB_ICONERROR);
|
||||||
|
showErrorMsgWindow("Editing header of a UNIF file is not supported.");
|
||||||
|
break;
|
||||||
|
case errors::NSF_HEADER:
|
||||||
|
// case errors::NSF2_HEADER:
|
||||||
|
// case errors::NSFE_HEADER:
|
||||||
|
//MessageBox(parent, "Editing header of an NSF file is not supported.", "iNES Header Editor", MB_OK | MB_ICONERROR);
|
||||||
|
showErrorMsgWindow("Editing header of an NSF file is not supported.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Opened File: '%s'\n", LoadedRomFName );
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void iNesHeaderEditor_t::setHeaderData(iNES_HEADER* header)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
// Temporary buffers
|
||||||
|
char buf[256];
|
||||||
|
|
||||||
|
bool ines20 = (header->ROM_type2 & 0xC) == 8;
|
||||||
|
bool unofficial = false;
|
||||||
|
|
||||||
|
ToggleINES20( ines20 );
|
||||||
|
|
||||||
|
iNes1Btn->setChecked( !ines20 );
|
||||||
|
iNes2Btn->setChecked( ines20 );
|
||||||
|
|
||||||
|
// Mapper#
|
||||||
|
int mapper = header->ROM_type >> 4 | header->ROM_type2 & 0xF0;
|
||||||
|
if (ines20)
|
||||||
|
{
|
||||||
|
mapper |= (header->ROM_type3 & 0xF0) << 4;
|
||||||
|
}
|
||||||
|
mapperComboBox->setCurrentIndex( mapper );
|
||||||
|
|
||||||
|
// Sub Mapper
|
||||||
|
sprintf(buf, "%d", ines20 ? header->ROM_type3 >> 4 : 0);
|
||||||
|
|
||||||
|
mapperSubEdit->setText( buf );
|
||||||
|
|
||||||
|
// PRG ROM
|
||||||
|
int prg_rom = header->ROM_size;
|
||||||
|
if (ines20)
|
||||||
|
{
|
||||||
|
if ((header->Upper_ROM_VROM_size & 0xF) == 0xF)
|
||||||
|
prg_rom = pow(2, header->ROM_size >> 2) * ((header->ROM_size & 3) * 2 + 1);
|
||||||
|
else {
|
||||||
|
prg_rom |= (header->Upper_ROM_VROM_size & 0xF) << 8;
|
||||||
|
prg_rom *= 1024 * 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prg_rom *= 1024 * 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<prgRomBox->count(); i++)
|
||||||
|
{
|
||||||
|
if ( prgRomBox->itemData(i).toInt() == prg_rom )
|
||||||
|
{
|
||||||
|
prgRomBox->setCurrentIndex(i); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PRG RAM
|
||||||
|
int prg_ram = 0;
|
||||||
|
if (ines20)
|
||||||
|
{
|
||||||
|
int shift = header->RAM_size & 0xF;
|
||||||
|
if (shift)
|
||||||
|
{
|
||||||
|
prg_ram = 64 << shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!(header->RAM_size & 0x10) && header->ROM_type3)
|
||||||
|
{
|
||||||
|
prg_ram = (header->ROM_type3 ? 1 : header->ROM_type3 * 8) * 1024;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<prgRamBox->count(); i++)
|
||||||
|
{
|
||||||
|
if ( prgRamBox->itemData(i).toInt() == prg_ram )
|
||||||
|
{
|
||||||
|
prgRamBox->setCurrentIndex(i); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PRG NVRAM
|
||||||
|
int prg_nvram = 0;
|
||||||
|
if (ines20)
|
||||||
|
{
|
||||||
|
int shift = header->RAM_size >> 4;
|
||||||
|
if (shift)
|
||||||
|
{
|
||||||
|
prg_nvram = 64 << shift;
|
||||||
|
}
|
||||||
|
battNvRamBox->hide();
|
||||||
|
prgNvRamLbl->show();
|
||||||
|
prgNvRamBox->show();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prgNvRamLbl->hide();
|
||||||
|
prgNvRamBox->hide();
|
||||||
|
battNvRamBox->show();
|
||||||
|
battNvRamBox->setChecked( header->ROM_type & 0x2 ? true : false );
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<prgNvRamBox->count(); i++)
|
||||||
|
{
|
||||||
|
if ( prgNvRamBox->itemData(i).toInt() == prg_nvram )
|
||||||
|
{
|
||||||
|
prgNvRamBox->setCurrentIndex(i); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHR ROM
|
||||||
|
int chr_rom = header->VROM_size;
|
||||||
|
if (ines20)
|
||||||
|
{
|
||||||
|
if ((header->Upper_ROM_VROM_size & 0xF0) == 0xF0)
|
||||||
|
{
|
||||||
|
chr_rom = pow(2, header->VROM_size >> 2) * (((header->VROM_size & 3) * 2) + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
chr_rom |= (header->Upper_ROM_VROM_size & 0xF0) << 4;
|
||||||
|
chr_rom *= 8 * 1024;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
chr_rom *= 8 * 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<chrRomBox->count(); i++)
|
||||||
|
{
|
||||||
|
if ( chrRomBox->itemData(i).toInt() == chr_rom )
|
||||||
|
{
|
||||||
|
chrRomBox->setCurrentIndex(i); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHR RAM
|
||||||
|
int chr_ram = 0;
|
||||||
|
if (ines20)
|
||||||
|
{
|
||||||
|
int shift = header->VRAM_size & 0xF;
|
||||||
|
if (shift)
|
||||||
|
{
|
||||||
|
chr_ram = 64 << shift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<chrRamBox->count(); i++)
|
||||||
|
{
|
||||||
|
if ( chrRamBox->itemData(i).toInt() == chr_ram )
|
||||||
|
{
|
||||||
|
chrRamBox->setCurrentIndex(i); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHR NVRAM
|
||||||
|
int chr_nvram = 0;
|
||||||
|
if (ines20)
|
||||||
|
{
|
||||||
|
int shift = header->VRAM_size >> 4;
|
||||||
|
if (shift)
|
||||||
|
{
|
||||||
|
chr_nvram = 64 << shift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<chrNvRamBox->count(); i++)
|
||||||
|
{
|
||||||
|
if ( chrNvRamBox->itemData(i).toInt() == chr_nvram )
|
||||||
|
{
|
||||||
|
chrNvRamBox->setCurrentIndex(i); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mirroring
|
||||||
|
if ( header->ROM_type & 8 )
|
||||||
|
{
|
||||||
|
horzMirrorBtn->setChecked(false);
|
||||||
|
vertMirrorBtn->setChecked(false);
|
||||||
|
fourMirrorBtn->setChecked(true);
|
||||||
|
}
|
||||||
|
else if ( header->ROM_type & 1 )
|
||||||
|
{
|
||||||
|
horzMirrorBtn->setChecked(false);
|
||||||
|
vertMirrorBtn->setChecked(true);
|
||||||
|
fourMirrorBtn->setChecked(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
horzMirrorBtn->setChecked(true);
|
||||||
|
vertMirrorBtn->setChecked(false);
|
||||||
|
fourMirrorBtn->setChecked(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Region
|
||||||
|
if (ines20)
|
||||||
|
{
|
||||||
|
int region = header->TV_system & 3;
|
||||||
|
switch (region)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
// NTSC
|
||||||
|
ntscRegionBtn->setChecked(true);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
// PAL
|
||||||
|
palRegionBtn->setChecked(true);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
// Dual
|
||||||
|
dualRegionBtn->setChecked(true);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
// Dendy
|
||||||
|
dendyRegionBtn->setChecked(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Only the unofficial 10th byte has a dual region, we must check it first.
|
||||||
|
int region = header->RAM_size & 3;
|
||||||
|
if (region == 3 || region == 1)
|
||||||
|
{
|
||||||
|
// Check the unofficial checkmark and the region code
|
||||||
|
dualRegionBtn->setChecked(true);
|
||||||
|
unofficial = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// When the region in unofficial byte is inconsistent with the official byte, based on the official byte
|
||||||
|
if ( header->Upper_ROM_VROM_size & 1 )
|
||||||
|
{
|
||||||
|
palRegionBtn->setChecked(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ntscRegionBtn->setChecked(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void iNesHeaderEditor_t::ToggleINES20(bool ines20)
|
||||||
|
{
|
||||||
|
// only ines 2.0 has these values
|
||||||
|
// these are always have when in 2.0
|
||||||
|
// Submapper#
|
||||||
|
//EnableWindow(GetDlgItem(hwnd, IDC_SUBMAPPER_TEXT), ines20);
|
||||||
|
mapperSubEdit->setEnabled(ines20);
|
||||||
|
// PRG NVRAM
|
||||||
|
prgNvRamBox->setEnabled(ines20);
|
||||||
|
//EnableWindow(GetDlgItem(hwnd, IDC_PRGNVRAM_TEXT), ines20);
|
||||||
|
// CHR RAM
|
||||||
|
chrRamBox->setEnabled(ines20);
|
||||||
|
//EnableWindow(GetDlgItem(hwnd, IDC_CHRRAM_TEXT), ines20);
|
||||||
|
// CHR NVRAM
|
||||||
|
chrNvRamBox->setEnabled(ines20);
|
||||||
|
//EnableWindow(GetDlgItem(hwnd, IDC_CHRNVRAM_TEXT), ines20);
|
||||||
|
// Dendy in Region Groupbox
|
||||||
|
dendyRegionBtn->setEnabled(ines20);
|
||||||
|
// Multiple in Regtion Groupbox
|
||||||
|
dualRegionBtn->setEnabled(ines20);
|
||||||
|
// Extend in System Groupbox
|
||||||
|
extGroupBox->setEnabled(ines20);
|
||||||
|
// Input Device
|
||||||
|
inputDevBox->setEnabled(ines20);
|
||||||
|
//EnableWindow(GetDlgItem(hwnd, IDC_INPUT_DEVICE_TEXT), ines20);
|
||||||
|
// Miscellaneous ROMs
|
||||||
|
miscRomsEdit->setEnabled(ines20);
|
||||||
|
//EnableWindow(GetDlgItem(hwnd, IDC_MISCELLANEOUS_ROMS_TEXT), ines20);
|
||||||
|
//
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
|
|
||||||
#include "Qt/main.h"
|
#include "Qt/main.h"
|
||||||
|
|
||||||
|
class iNES_HEADER;
|
||||||
|
|
||||||
class iNesHeaderEditor_t : public QDialog
|
class iNesHeaderEditor_t : public QDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -49,6 +51,7 @@ class iNesHeaderEditor_t : public QDialog
|
||||||
QCheckBox *iNesDualRegBox;
|
QCheckBox *iNesDualRegBox;
|
||||||
QCheckBox *iNesBusCfltBox;
|
QCheckBox *iNesBusCfltBox;
|
||||||
QCheckBox *iNesPrgRamBox;
|
QCheckBox *iNesPrgRamBox;
|
||||||
|
QCheckBox *battNvRamBox;
|
||||||
QRadioButton *horzMirrorBtn;
|
QRadioButton *horzMirrorBtn;
|
||||||
QRadioButton *vertMirrorBtn;
|
QRadioButton *vertMirrorBtn;
|
||||||
QRadioButton *fourMirrorBtn;
|
QRadioButton *fourMirrorBtn;
|
||||||
|
@ -60,8 +63,22 @@ class iNesHeaderEditor_t : public QDialog
|
||||||
QRadioButton *vsSysbtn;
|
QRadioButton *vsSysbtn;
|
||||||
QRadioButton *plySysbtn;
|
QRadioButton *plySysbtn;
|
||||||
QRadioButton *extSysbtn;
|
QRadioButton *extSysbtn;
|
||||||
|
QPushButton *restoreBtn;
|
||||||
|
QPushButton *saveAsBtn;
|
||||||
|
QPushButton *closeBtn;
|
||||||
|
QGroupBox *iNesUnOfGroupBox;
|
||||||
|
QGroupBox *sysGroupBox;
|
||||||
|
QGroupBox *vsGroupBox;
|
||||||
|
QGroupBox *extGroupBox;
|
||||||
|
QLabel *prgNvRamLbl;
|
||||||
|
iNES_HEADER *iNesHdr;
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
bool loadHeader(iNES_HEADER *header);
|
||||||
|
void setHeaderData(iNES_HEADER *header);
|
||||||
|
void showErrorMsgWindow(const char *str);
|
||||||
|
void ToggleINES20(bool ines20);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void closeWindow(void);
|
void closeWindow(void);
|
||||||
private slots:
|
private slots:
|
||||||
|
|
Loading…
Reference in New Issue