Merge branch 'TASEmulators:master' into master

This commit is contained in:
Cyneprepou4uk 2022-09-08 23:56:44 +03:00 committed by GitHub
commit 8cb8b6ef24
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
67 changed files with 1439 additions and 886 deletions

View File

@ -98,7 +98,7 @@ sudo apt-get --assume-yes install libavcodec-dev
sudo apt-get --assume-yes install libavformat-dev
sudo apt-get --assume-yes install libavutil-dev
sudo apt-get --assume-yes install libswscale-dev
sudo apt-get --assume-yes install libavresample-dev
sudo apt-get --assume-yes install libswresample-dev
# Install cppcheck
echo '****************************************'

View File

@ -85,6 +85,15 @@ else(WIN32)
#endif()
add_definitions( -D__QT_DRIVER__ -DQT_DEPRECATED_WARNINGS )
if ( ${ASAN_ENABLE} )
add_definitions( -fsanitize=address -fsanitize=bounds-strict )
add_definitions( -fsanitize=undefined -fno-sanitize=vptr )
set( ASAN_LDFLAGS -lasan -lubsan)
message( STATUS "Address Sanitizer Enabled" )
else()
message( STATUS "Address Sanitizer Disabled" )
endif()
# Check for libminizip
pkg_check_modules( MINIZIP REQUIRED minizip)
@ -578,7 +587,7 @@ set(SOURCES ${SRC_CORE} ${SRC_DRIVERS_COMMON} ${SRC_DRIVERS_SDL})
# the FCEUX_BUILD_TIMESTAMP preprocessor definition.
# Note: with CMake >= 3.8.0, this will respect SOURCE_DATE_EPOCH. For more info,
# see <https://reproducible-builds.org/docs/source-date-epoch/>.
string(TIMESTAMP BUILD_TS "%H:%M:%S %b %d %Y")
string(TIMESTAMP BUILD_TS "%H:%M:%S %b %d %Y" UTC)
add_definitions( -DFCEUX_BUILD_TIMESTAMP=\"${BUILD_TS}\" )
if (WIN32)
@ -613,7 +622,7 @@ add_executable( ${APP_NAME} ${SOURCES} ../resources.qrc
${CMAKE_CURRENT_BINARY_DIR}/fceux_git_info.cpp)
endif()
target_link_libraries( ${APP_NAME}
target_link_libraries( ${APP_NAME} ${ASAN_LDFLAGS}
${${Qt}Widgets_LIBRARIES}
${${Qt}Help_LIBRARIES}
${${Qt}OpenGL_LIBRARIES}

View File

@ -19,36 +19,79 @@
*/
#include "mapinc.h"
#include "ines.h"
static uint16 cmdreg = 0;
static uint8 openbus = 0;
// For carts with extra 128K prg rom (Contra)
static uint8 unrom = 0;
static uint8 unromData = 0;
static uint32 PRGROMSize = 0;
static uint16 cmdreg;
static SFORMAT StateRegs[] =
{
{ &cmdreg, 2, "CREG" },
{ &openbus, 1, "OB" },
{ &unrom, 1, "UROM" },
{ &unromData, 1, "UDTA" },
{ 0 }
};
static void Sync(void) {
if (cmdreg & 0x400)
setmirror(MI_0);
else
setmirror(((cmdreg >> 13) & 1) ^ 1);
if (cmdreg & 0x800) {
setprg16(0x8000, ((cmdreg & 0x300) >> 3) | ((cmdreg & 0x1F) << 1) | ((cmdreg >> 12) & 1));
setprg16(0xC000, ((cmdreg & 0x300) >> 3) | ((cmdreg & 0x1F) << 1) | ((cmdreg >> 12) & 1));
} else
setprg32(0x8000, ((cmdreg & 0x300) >> 4) | (cmdreg & 0x1F));
if (unrom) {
int PRGPageCount = PRGROMSize / (16 * 1024);
setprg16(0x8000, PRGPageCount & 0xC0 | (unromData & 7));
setprg16(0xC000, PRGPageCount & 0xC0 | 7);
setmirror(MI_V);
} else {
uint8 bank = ((cmdreg & 0x300) >> 3) | (cmdreg & 0x1F);
if (bank >= (PRGROMSize / (32 * 1024))) {
openbus = 1;
} else {
if (cmdreg & 0x400)
setmirror(MI_0);
else
setmirror(((cmdreg >> 13) & 1) ^ 1);
if (cmdreg & 0x800) {
setprg16(0x8000, (bank << 1) | ((cmdreg >> 12) & 1));
setprg16(0xC000, (bank << 1) | ((cmdreg >> 12) & 1));
} else
setprg32(0x8000, bank);
}
}
}
static DECLFR(M235Read) {
if (openbus) {
openbus = 0;
return X.DB;
}
return CartBR(A);
}
static DECLFW(M235Write) {
cmdreg = A;
unromData = V;
Sync();
}
static void M235Reset(void) {
cmdreg = 0;
unromData = 0;
if (PRGROMSize & 0x20000)
unrom = (unrom + 1) & 1;
Sync();
}
static void M235Power(void) {
setchr8(0);
SetWriteHandler(0x8000, 0xFFFF, M235Write);
SetReadHandler(0x8000, 0xFFFF, CartBR);
SetReadHandler(0x8000, 0xFFFF, M235Read);
cmdreg = 0;
unromData = 0;
unrom = 0;
Sync();
}
@ -57,7 +100,11 @@ static void M235Restore(int version) {
}
void Mapper235_Init(CartInfo *info) {
info->Reset = M235Reset;
info->Power = M235Power;
GameStateRestore = M235Restore;
AddExState(&StateRegs, ~0, 0, 0);
// needs raw, non-pow2 PRGROM size for comparison
PRGROMSize = head.ROM_size * 16384;
}

View File

@ -474,6 +474,39 @@ void Mapper203_Init(CartInfo *info) {
Latch_Init(info, M203Sync, 0, 0x8000, 0xFFFF, 0, 0);
}
//------------------ Map 218 ---------------------------
static void Mapper218_Power()
{
//doesn't really matter
SetReadHandler(0x6000, 0xFFFF, &CartBROB);
}
void Mapper218_Init(CartInfo *info)
{
info->Power = &Mapper218_Power;
//fixed PRG mapping
setprg32(0x8000, 0);
//this mapper is supposed to interpret the iNES header bits specially
static const uint8 mirrorings[] = {MI_V,MI_H,MI_0,MI_1};
SetupCartMirroring(mirrorings[info->mirrorAs2Bits],1,nullptr);
//cryptic logic to effect the CHR RAM mappings by mapping 1k blocks to NTARAM according to how the pins are wired
//this could be done by bit logic, but this is self-documenting
static const uint8 mapping[] = {
0,1,0,1,0,1,0,1, //mirrorAs2Bits==0
0,0,1,1,0,0,1,1, //mirrorAs2Bits==1
0,0,0,0,1,1,1,1, //mirrorAs2Bits==2
0,0,0,0,0,0,0,0 //mirrorAs2Bits==3
};
for(int i=0;i<8;i++)
VPageR[i] = &NTARAM[mapping[info->mirrorAs2Bits*8+i]];
PPUCHRRAM = 0xFF;
}
//------------------ Map 240 ---------------------------
static void M240Sync(void) {

View File

@ -15,6 +15,7 @@ typedef struct {
// to help support games like "Karnov"
// that are not really MMC3 but are
// set to mapper 4.
int mirrorAs2Bits;
int battery; // Presence of an actual battery.
int ines2;
int submapper; // Submappers as defined by NES 2.0

View File

@ -152,28 +152,23 @@ int FCEU_CalcCheatAffectedBytes(uint32 address, uint32 size) {
return count;
}
static int AddCheatEntry(const char *name, uint32 addr, uint8 val, int compare, int status, int type);
static void AddCheatEntry(const char *name, uint32 addr, uint8 val, int compare, int status, int type);
static void CheatMemErr(void)
{
FCEUD_PrintError("Error allocating memory for cheat data.");
}
static int AddCheatEntry(const char *name, uint32 addr, uint8 val, int compare, int status, int type)
static void AddCheatEntry(const char *name, uint32 addr, uint8 val, int compare, int status, int type)
{
struct CHEATF *temp;
if(!(temp = (struct CHEATF *)FCEU_dmalloc(sizeof(struct CHEATF))))
{
CheatMemErr();
return(0);
}
CHEATF *temp = new CHEATF();
temp->name = strcpy((char*) FCEU_dmalloc(strlen(name) + 1), name);
temp->name = name;
temp->addr = addr;
temp->val = val;
temp->status = status;
temp->compare = compare;
temp->type = type;
temp->next = 0;
temp->next = nullptr;
if(cheats)
{
@ -182,8 +177,6 @@ static int AddCheatEntry(const char *name, uint32 addr, uint8 val, int compare,
}
else
cheats = cheatsl = temp;
return (1);
}
/* The "override_existing" parameter is used only in cheat dialog import.
@ -306,14 +299,13 @@ void FCEU_SaveGameCheats(FILE* fp, int release)
fputc(':', fp);
if (next->compare >= 0)
fprintf(fp, "%04x:%02x:%02x:%s\n", next->addr, next->val, next->compare, next->name);
fprintf(fp, "%04x:%02x:%02x:%s\n", next->addr, next->val, next->compare, next->name.c_str());
else
fprintf(fp, "%04x:%02x:%s\n", next->addr, next->val, next->name);
fprintf(fp, "%04x:%02x:%s\n", next->addr, next->val, next->name.c_str());
if (release) free(next->name);
struct CHEATF *t = next;
next = next->next;
if (release) free(t);
if (release) delete t;
}
}
@ -333,8 +325,7 @@ void FCEU_FlushGameCheats(FILE *override, int nosave)
{
struct CHEATF *last=next;
next=next->next;
free(last->name);
free(last);
delete last;
if(!next) break;
}
cheats=cheatsl=0;
@ -379,9 +370,7 @@ void FCEU_FlushGameCheats(FILE *override, int nosave)
int FCEUI_AddCheat(const char *name, uint32 addr, uint8 val, int compare, int type)
{
if(!AddCheatEntry(name, addr, val, compare, 1, type))
return 0;
AddCheatEntry(name, addr, val, compare, 1, type);
savecheats = 1;
RebuildSubCheats();
@ -415,8 +404,7 @@ int FCEUI_DelCheat(uint32 which)
else
cheats=cheatsl=0; // No (more) cheats.
}
free(cur->name); // Now that all references to this cheat are removed,
free(cur); // free the memory.
delete cur; // free the memory.
break;
} // *END REMOVE THIS CHEAT*
@ -451,18 +439,18 @@ void FCEU_ApplyPeriodicCheats(void)
}
void FCEUI_ListCheats(int (*callb)(char *name, uint32 a, uint8 v, int compare, int s, int type, void *data), void *data)
void FCEUI_ListCheats(int (*callb)(const char *name, uint32 a, uint8 v, int compare, int s, int type, void *data), void *data)
{
struct CHEATF *next=cheats;
while(next)
{
if(!callb(next->name,next->addr,next->val,next->compare,next->status,next->type,data)) break;
if(!callb(next->name.c_str(),next->addr,next->val,next->compare,next->status,next->type,data)) break;
next=next->next;
}
}
int FCEUI_GetCheat(uint32 which, char **name, uint32 *a, uint8 *v, int *compare, int *s, int *type)
int FCEUI_GetCheat(uint32 which, std::string *name, uint32 *a, uint8 *v, int *compare, int *s, int *type)
{
struct CHEATF *next=cheats;
uint32 x=0;
@ -600,7 +588,7 @@ int FCEUI_DecodePAR(const char *str, int *a, int *v, int *c, int *type)
/* name can be NULL if the name isn't going to be changed. */
/* same goes for a, v, and s(except the values of each one must be <0) */
int FCEUI_SetCheat(uint32 which, const char *name, int32 a, int32 v, int c, int s, int type)
int FCEUI_SetCheat(uint32 which, const std::string *name, int32 a, int32 v, int c, int s, int type)
{
struct CHEATF *next = cheats;
uint32 x = 0;
@ -610,13 +598,7 @@ int FCEUI_SetCheat(uint32 which, const char *name, int32 a, int32 v, int c, int
if(x == which)
{
if(name)
{
char *t;
if((t = (char *)realloc(next->name, strlen(name) + 1)))
strcpy(next->name = t, name);
else
return 0;
}
next->name = *name;
if(a >= 0)
next->addr = a;
if(v >= 0)
@ -911,11 +893,7 @@ int FCEU_DeleteAllCheats(void)
while (cur)
{
next = cur->next;
if ( cur->name )
{
free(cur->name);
}
free(cur);
delete cur;
cur = next;
}
cheats = cheatsl = 0;

View File

@ -42,7 +42,7 @@ typedef struct {
struct CHEATF {
struct CHEATF *next;
char *name;
std::string name;
uint16 addr;
uint8 val;
int compare; /* -1 for no compare. */

View File

@ -207,10 +207,10 @@ void FCEUI_CheatSearchGetRange(uint32 first, uint32 last, int (*callb)(uint32 a,
void FCEUI_CheatSearchGet(int (*callb)(uint32 a, uint8 last, uint8 current, void *data), void *data);
void FCEUI_CheatSearchBegin(void);
void FCEUI_CheatSearchEnd(int type, uint8 v1, uint8 v2);
void FCEUI_ListCheats(int (*callb)(char *name, uint32 a, uint8 v, int compare, int s, int type, void *data), void *data);
void FCEUI_ListCheats(int (*callb)(const char *name, uint32 a, uint8 v, int compare, int s, int type, void *data), void *data);
int FCEUI_GetCheat(uint32 which, char **name, uint32 *a, uint8 *v, int *compare, int *s, int *type);
int FCEUI_SetCheat(uint32 which, const char *name, int32 a, int32 v, int compare,int s, int type);
int FCEUI_GetCheat(uint32 which, std::string *name, uint32 *a, uint8 *v, int *compare, int *s, int *type);
int FCEUI_SetCheat(uint32 which, const std::string *name, int32 a, int32 v, int compare,int s, int type);
void FCEUI_CheatSearchShowExcluded(void);
void FCEUI_CheatSearchSetCurrentAsOriginal(void);

View File

@ -841,6 +841,8 @@ static void log_callback( void *avcl, int level, const char *fmt, va_list vl)
va_copy( vl2, vl );
vfprintf( avLogFp, fmt, vl2 );
va_end(vl2);
}
av_log_default_callback( avcl, level, fmt, vl );

View File

@ -848,9 +848,11 @@ int AviRiffViewerDialog::processChunk( AviRiffTreeItem *item )
}
else if ( strcmp( strhType, "auds" ) == 0 )
{
data.malloc( item->getSize()+8 );
size_t dataSize = item->getSize()+8;
avi->getChunkData( item->filePos(), data.buf, item->getSize()+8 );
data.malloc( dataSize );
avi->getChunkData( item->filePos(), data.buf, dataSize );
sprintf( stmp, "%c%c%c%c", data.buf[0], data.buf[1], data.buf[2], data.buf[3] );
@ -907,13 +909,6 @@ int AviRiffViewerDialog::processChunk( AviRiffTreeItem *item )
twi->setText( 0, tr("nBitsPerSample") );
twi->setText( 2, tr(stmp) );
item->addChild(twi);
sprintf( stmp, "%u", data.readU16(24) );
twi = new QTreeWidgetItem();
twi->setText( 0, tr("cbSize") );
twi->setText( 2, tr(stmp) );
item->addChild(twi);
}
}
else if ( isRiffTag( item->getFourcc(), &riffIdx ) )

View File

@ -52,6 +52,9 @@ void openCheatDialog(QWidget *parent)
{
if (win != NULL)
{
win->activateWindow();
win->raise();
win->setFocus();
return;
}
win = new GuiCheatsDialog_t(parent);
@ -198,6 +201,18 @@ GuiCheatsDialog_t::GuiCheatsDialog_t(QWidget *parent)
vbox1->addLayout(hbox);
hbox = new QHBoxLayout();
lbl = new QLabel(tr("Type:"));
typeEntry = new QComboBox();
typeEntry->addItem(tr("0: Periodic Set (Every Frame)"), 0 );
typeEntry->addItem(tr("1: Substitute/Freeze"), 1 );
typeEntry->setCurrentIndex(1);
hbox->addWidget(lbl,1);
hbox->addWidget(typeEntry,10);
vbox1->addLayout(hbox);
hbox = new QHBoxLayout();
addCheatBtn = new QPushButton(tr("Add"));
@ -435,6 +450,8 @@ GuiCheatsDialog_t::GuiCheatsDialog_t(QWidget *parent)
setLayout(mainLayout);
modCheatBtn->setDefault(true);
connect(srchResetBtn, SIGNAL(clicked(void)), this, SLOT(resetSearchCallback(void)));
connect(knownValBtn, SIGNAL(clicked(void)), this, SLOT(knownValueCallback(void)));
connect(eqValBtn, SIGNAL(clicked(void)), this, SLOT(equalValueCallback(void)));
@ -670,7 +687,7 @@ void GuiCheatsDialog_t::lessThanValueCallback(void)
FCEU_WRAPPER_UNLOCK();
}
//----------------------------------------------------------------------------
int GuiCheatsDialog_t::activeCheatListCB(char *name, uint32 a, uint8 v, int c, int s, int type, void *data)
int GuiCheatsDialog_t::activeCheatListCB(const char *name, uint32 a, uint8 v, int c, int s, int type, void *data)
{
QTreeWidgetItem *item;
char codeStr[32];
@ -710,7 +727,7 @@ int GuiCheatsDialog_t::activeCheatListCB(char *name, uint32 a, uint8 v, int c, i
return 1;
}
//----------------------------------------------------------------------------
static int activeCheatListCB(char *name, uint32 a, uint8 v, int c, int s, int type, void *data)
static int activeCheatListCB(const char *name, uint32 a, uint8 v, int c, int s, int type, void *data)
{
return win->activeCheatListCB(name, a, v, c, s, type, data);
}
@ -719,6 +736,8 @@ void GuiCheatsDialog_t::showActiveCheatList(bool redraw)
{
win = this;
enaCheats->setChecked(!globalCheatDisabled);
actvCheatRedraw = redraw;
if (redraw)
@ -871,6 +890,7 @@ void GuiCheatsDialog_t::addActvCheat(void)
uint32 a = 0;
uint8 v = 0;
int c = -1;
int t = 1;
std::string name, cmpStr;
a = strtoul(cheatAddrEntry->displayText().toStdString().c_str(), NULL, 16);
@ -890,8 +910,10 @@ void GuiCheatsDialog_t::addActvCheat(void)
name = cheatNameEntry->text().toStdString();
t = typeEntry->currentData().toInt();
FCEU_WRAPPER_LOCK();
FCEUI_AddCheat(name.c_str(), a, v, c, 1);
FCEUI_AddCheat(name.c_str(), a, v, c, t);
FCEU_WRAPPER_UNLOCK();
showActiveCheatList(true);
@ -921,6 +943,7 @@ void GuiCheatsDialog_t::deleteActvCheat(void)
cheatAddrEntry->setText(tr(""));
cheatValEntry->setText(tr(""));
cheatCmpEntry->setText(tr(""));
typeEntry->setCurrentIndex(0);
}
//----------------------------------------------------------------------------
void GuiCheatsDialog_t::updateCheatParameters(void)
@ -969,9 +992,11 @@ void GuiCheatsDialog_t::updateCheatParameters(void)
//printf("Name: %s \n", name.c_str() );
type = typeEntry->currentData().toInt();
FCEU_WRAPPER_LOCK();
FCEUI_SetCheat(row, name.c_str(), a, v, c, s, type);
FCEUI_SetCheat(row, &name, a, v, c, s, type);
FCEU_WRAPPER_UNLOCK();
@ -983,7 +1008,7 @@ void GuiCheatsDialog_t::actvCheatItemClicked(QTreeWidgetItem *item, int column)
uint32 a = 0;
uint8 v = 0;
int c = -1, s = 0, type = 0;
char *name = NULL;
std::string name;
char stmp[64];
int row = actvCheatList->indexOfTopLevelItem(item);
@ -1021,14 +1046,9 @@ void GuiCheatsDialog_t::actvCheatItemClicked(QTreeWidgetItem *item, int column)
cheatCmpEntry->setText(tr(""));
}
if (name != NULL)
{
cheatNameEntry->setText(tr(name));
}
else
{
cheatNameEntry->setText(tr(""));
}
cheatNameEntry->setText(tr(name.c_str()));
typeEntry->setCurrentIndex(type);
}
//----------------------------------------------------------------------------
void GuiCheatsDialog_t::globalEnableCheats(int state)

View File

@ -30,7 +30,7 @@ public:
int addSearchResult(uint32_t a, uint8_t last, uint8_t current);
int activeCheatListCB(char *name, uint32 a, uint8 v, int c, int s, int type, void *data);
int activeCheatListCB(const char *name, uint32 a, uint8 v, int c, int s, int type, void *data);
void showActiveCheatList(bool redraw);
@ -67,6 +67,7 @@ protected:
QLineEdit *neValEntry;
QLineEdit *grValEntry;
QLineEdit *ltValEntry;
QComboBox *typeEntry;
QFont font;
int fontCharWidth;

View File

@ -84,6 +84,7 @@ ConsoleViewGL_t::ConsoleViewGL_t(QWidget *parent)
setMinimumWidth( 256 );
setMinimumHeight( 224 );
setFocusPolicy(Qt::StrongFocus);
//setAttribute(Qt::WA_OpaquePaintEvent);
localBufSize = (4 * GL_NES_WIDTH) * (4 * GL_NES_HEIGHT) * sizeof(uint32_t);
@ -272,6 +273,9 @@ void ConsoleViewGL_t::buildTextures(void)
GL_BGRA, GL_UNSIGNED_BYTE, 0 );
}
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
//glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//printf("Texture Built: %ix%i\n", w, h);
}
@ -347,7 +351,7 @@ void ConsoleViewGL_t::initializeGL(void)
initializeOpenGLFunctions();
// Set up the rendering context, load shaders and other resources, etc.:
//QOpenGLFunctions *gl = QOpenGLContext::currentContext()->functions();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
chkExtnsGL();
//printf("GL Init!\n");
@ -666,6 +670,9 @@ void ConsoleViewGL_t::paintGL(void)
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
//glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
if ( textureType == GL_TEXTURE_RECTANGLE )
{

View File

@ -862,6 +862,7 @@ void consoleWin_t::initHotKeys(void)
connect( Hotkeys[ HK_TOGGLE_BG ].getShortcut(), SIGNAL(activated()), this, SLOT(toggleBackground(void)) );
connect( Hotkeys[ HK_TOGGLE_FG ].getShortcut(), SIGNAL(activated()), this, SLOT(toggleForeground(void)) );
connect( Hotkeys[ HK_FKB_ENABLE ].getShortcut(), SIGNAL(activated()), this, SLOT(toggleFamKeyBrdEnable(void)) );
connect( Hotkeys[ HK_TOGGLE_ALL_CHEATS ].getShortcut(), SIGNAL(activated()), this, SLOT(toggleGlobalCheatEnable(void)) );
connect( Hotkeys[ HK_SAVE_STATE_0 ].getShortcut(), SIGNAL(activated()), this, SLOT(saveState0(void)) );
connect( Hotkeys[ HK_SAVE_STATE_1 ].getShortcut(), SIGNAL(activated()), this, SLOT(saveState1(void)) );
@ -1281,16 +1282,16 @@ void consoleWin_t::createMainMenu(void)
connect( Hotkeys[ HK_POWER ].getShortcut(), SIGNAL(activated()), this, SLOT(powerConsoleCB(void)) );
// Emulation -> Reset
resetAct = new QAction(tr("&Reset"), this);
resetAct = new QAction(tr("Hard &Reset"), this);
//resetAct->setShortcut( QKeySequence(tr("Ctrl+R")));
resetAct->setStatusTip(tr("Reset Console"));
resetAct->setStatusTip(tr("Hard Reset of Console"));
resetAct->setIcon( style()->standardIcon( QStyle::SP_DialogResetButton ) );
connect(resetAct, SIGNAL(triggered()), this, SLOT(consoleHardReset(void)) );
emuMenu->addAction(resetAct);
Hotkeys[ HK_RESET ].setAction( resetAct );
connect( Hotkeys[ HK_RESET ].getShortcut(), SIGNAL(activated()), this, SLOT(consoleHardReset(void)) );
Hotkeys[ HK_HARD_RESET ].setAction( resetAct );
connect( Hotkeys[ HK_HARD_RESET ].getShortcut(), SIGNAL(activated()), this, SLOT(consoleHardReset(void)) );
// Emulation -> Soft Reset
sresetAct = new QAction(tr("&Soft Reset"), this);
@ -1301,6 +1302,9 @@ void consoleWin_t::createMainMenu(void)
emuMenu->addAction(sresetAct);
Hotkeys[ HK_SOFT_RESET ].setAction( sresetAct );
connect( Hotkeys[ HK_SOFT_RESET ].getShortcut(), SIGNAL(activated()), this, SLOT(consoleSoftReset(void)) );
// Emulation -> Pause
pauseAct = new QAction(tr("&Pause"), this);
//pauseAct->setShortcut( QKeySequence(tr("Pause")));
@ -1730,10 +1734,10 @@ void consoleWin_t::createMainMenu(void)
debugMenu->addAction(ggEncodeAct);
// Debug -> iNES Header Editor
iNesEditAct = new QAction(tr("&iNES Header Editor..."), this);
// Debug -> NES Header Editor
iNesEditAct = new QAction(tr("NES Header Edito&r..."), this);
//iNesEditAct->setShortcut( QKeySequence(tr("Shift+F7")));
iNesEditAct->setStatusTip(tr("Open iNES Header Editor"));
iNesEditAct->setStatusTip(tr("Open NES Header Editor"));
connect(iNesEditAct, SIGNAL(triggered()), this, SLOT(openNesHeaderEditor(void)) );
debugMenu->addAction(iNesEditAct);
@ -3055,7 +3059,7 @@ void consoleWin_t::openNesHeaderEditor(void)
{
iNesHeaderEditor_t *win;
//printf("Open iNES Header Editor Window\n");
//printf("Open NES Header Editor Window\n");
win = new iNesHeaderEditor_t(this);
@ -3173,6 +3177,20 @@ void consoleWin_t::toggleFamKeyBrdEnable(void)
toggleFamilyKeyboardFunc();
}
extern int globalCheatDisabled;
void consoleWin_t::toggleGlobalCheatEnable(void)
{
FCEU_WRAPPER_LOCK();
FCEUI_GlobalToggleCheat(globalCheatDisabled);
FCEU_WRAPPER_UNLOCK();
g_config->setOption("SDL.CheatsDisabled", globalCheatDisabled);
g_config->save();
updateCheatDialog();
}
void consoleWin_t::warnAmbiguousShortcut( QShortcut *shortcut)
{
char stmp[256];

View File

@ -415,6 +415,7 @@ class consoleWin_t : public QMainWindow
void toggleBackground(void);
void toggleForeground(void);
void toggleFamKeyBrdEnable(void);
void toggleGlobalCheatEnable(void);
void saveState0(void);
void saveState1(void);
void saveState2(void);

View File

@ -322,6 +322,8 @@ static void PalettePoke(uint32 addr, uint8 data)
//----------------------------------------------------------------------------
static int writeMem( int mode, unsigned int addr, int value )
{
bool updateDebugger = false;
value = value & 0x000000ff;
switch ( mode )
@ -339,6 +341,8 @@ static int writeMem( int mode, unsigned int addr, int value )
{
wfunc ((uint32) addr,
(uint8) (value & 0x000000ff));
updateDebugger = true;
}
}
else
@ -374,7 +378,7 @@ static int writeMem( int mode, unsigned int addr, int value )
{
if (addr < 16)
{
fprintf( stdout, "You can't edit ROM header here, however you can use iNES Header Editor to edit the header if it's an iNES format file.");
fprintf( stdout, "You can't edit ROM header here, however you can use NES Header Editor to edit the header if it's an iNES or NES2.0 format file.");
}
else if ( (addr >= 16) && (addr < PRGsize[0]+16) )
{
@ -384,23 +388,32 @@ static int writeMem( int mode, unsigned int addr, int value )
{
*(uint8 *)(GetNesCHRPointer(addr-16-PRGsize[0])) = value;
}
updateDebugger = true;
}
break;
}
hexEditorRequestUpdateAll();
return 0;
if ( updateDebugger )
{
if (debuggerWindowIsOpen())
{
updateAllDebuggerWindows();
}
}
return 0;
}
//----------------------------------------------------------------------------
static int convToXchar( int i )
{
int c = 0;
int c = 0;
if ( (i >= 0) && (i < 10) )
{
c = i + '0';
c = i + '0';
}
else if ( i < 16 )
{
@ -3243,7 +3256,7 @@ void QHexEdit::addBookMarkCB(void)
}
}
//----------------------------------------------------------------------------
static int RamFreezeCB(char *name, uint32 a, uint8 v, int compare,int s,int type, void *data)
static int RamFreezeCB(const char *name, uint32 a, uint8 v, int compare,int s,int type, void *data)
{
return ((QHexEdit*)data)->FreezeRam( name, a, v, compare, s, type );
}
@ -4205,6 +4218,12 @@ int hexEditorOpenFromDebugger( int mode, int addr )
win->show();
}
else
{
win->activateWindow();
win->raise();
win->setFocus();
}
win->editor->setMode( mode );
win->editor->setAddr( addr );

View File

@ -26,6 +26,7 @@
#ifdef WIN32
#include <windows.h>
#else
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
@ -111,8 +112,11 @@ static int recBufHead = 0;
static int recBufNum = 0;
static traceRecord_t *logBuf = NULL;
static int logBufMax = 3000000;
static int logBufHead = 0;
static int logBufTail = 0;
// logBufHead and logBufTail are volatile because they are shared use by both the emulation and disk logger threads.
// Ensure that the compiler doesn't do any thread caching optimizations on them so that changes to these
// variables are immediately visible by the other thread.
static volatile int logBufHead = 0;
static volatile int logBufTail = 0;
static bool overrunWarningArmed = true;
static TraceLoggerDialog_t *traceLogWindow = NULL;
static void pushMsgToLogBuffer(const char *msg);
@ -2515,6 +2519,8 @@ void TraceLogDiskThread_t::run(void)
char buf[8192];
int i,idx=0;
int blockSize = 4 * 1024;
bool dataNeedsFlush = true;
bool isPaused = false;
//printf("Trace Log Disk Start\n");
@ -2557,6 +2563,8 @@ void TraceLogDiskThread_t::run(void)
while ( !isInterruptionRequested() )
{
isPaused = FCEUI_EmulationPaused() ? true : false;
while (logBufHead != logBufTail)
{
logBuf[logBufTail].convToText(line);
@ -2582,6 +2590,41 @@ void TraceLogDiskThread_t::run(void)
}
idx = 0;
#endif
dataNeedsFlush = true;
}
}
if (isPaused)
{
// If paused, the user might be at a breakpoint or doing some
// debugging. So make sure all data is flushed to disk for viewing.
// Only flush data when paused, to keep write efficiency up.
if ( idx > 0 )
{
#ifdef WIN32
DWORD bytesWritten;
WriteFile( logFile, buf, idx, &bytesWritten, NULL ); idx = 0;
#else
if ( write( logFile, buf, idx ) < 0 )
{
// HANDLE ERROR TODO
}
idx = 0;
#endif
dataNeedsFlush = true;
}
if (dataNeedsFlush)
{
//printf("Flushing Trace Log Disk Buffers\n");
#ifdef WIN32
FlushFileBuffers( logFile );
#else
if ( fsync( logFile ) )
{
printf("Trace Log fsync error\n");
}
#endif
dataNeedsFlush = false;
}
}
SDL_Delay(1);

View File

@ -83,6 +83,9 @@ int getHotKeyConfig( int i, const char **nameOut, const char **keySeqOut, const
case HK_CHEAT_MENU:
name = "CheatMenu"; keySeq = ""; title = "Open Cheat Window"; group = "Tools";
break;
case HK_TOGGLE_ALL_CHEATS:
name = "ToggleCheats"; keySeq = ""; title = "Toggle Global Cheat Enable"; group = "Tools";
break;
case HK_BIND_STATE:
name = "BindState"; keySeq = ""; title = "Bind Save State to Movie"; group = "Movie";
break;
@ -184,8 +187,11 @@ int getHotKeyConfig( int i, const char **nameOut, const char **keySeqOut, const
case HK_POWER:
name = "Power"; keySeq = ""; title = "Power"; group = "Emulation";
break;
case HK_RESET:
name = "Reset"; keySeq = "Ctrl+R"; title = "Reset"; group = "Emulation";
case HK_SOFT_RESET:
name = "SoftReset"; keySeq = "Ctrl+R"; title = "Soft Reset"; group = "Emulation";
break;
case HK_HARD_RESET:
name = "HardReset"; keySeq = "Ctrl+Shift+R"; title = "Hard Reset"; group = "Emulation";
break;
case HK_PAUSE:
name = "Pause"; keySeq = "Pause"; title = "Pause"; group = "Emulation";

View File

@ -14,7 +14,7 @@ enum HOTKEY {
HK_OPEN_ROM=0, HK_CLOSE_ROM,
// Emulation power, reset, pause, quit
HK_POWER, HK_RESET, HK_PAUSE, HK_QUIT,
HK_POWER, HK_SOFT_RESET, HK_HARD_RESET, HK_PAUSE, HK_QUIT,
// Emulation Execution Control
HK_FRAME_ADVANCE, HK_DECREASE_SPEED, HK_INCREASE_SPEED, HK_TURBO,
@ -53,7 +53,7 @@ enum HOTKEY {
// Display
HK_TOGGLE_FG, HK_TOGGLE_BG, HK_TOGGLE_INPUT_DISPLAY, HK_LAG_COUNTER_DISPLAY,
HK_CHEAT_MENU, HK_LOAD_LUA,
HK_CHEAT_MENU, HK_TOGGLE_ALL_CHEATS, HK_LOAD_LUA,
HK_MUTE_CAPTURE,
HK_FA_LAG_SKIP,
HK_VOLUME_DOWN, HK_VOLUME_UP,

View File

@ -39,6 +39,7 @@
#include "Qt/unix-netplay.h"
#include "Qt/AviRecord.h"
#include "Qt/HexEditor.h"
#include "Qt/CheatsConf.h"
#include "Qt/SymbolicDebug.h"
#include "Qt/CodeDataLogger.h"
#include "Qt/ConsoleDebugger.h"
@ -352,6 +353,8 @@ int LoadGame(const char *path, bool silent)
debugSymbolTable.loadGameSymbols();
updateCheatDialog();
CDLoggerROMChanged();
int state_to_load;
@ -642,6 +645,7 @@ static const char *DriverUsage =
static void ShowUsage(const char *prog)
{
int i,j;
FCEUD_Message("Starting " FCEU_NAME_AND_VERSION "...\n");
printf("\nUsage is as follows:\n%s <options> filename\n\n",prog);
puts(DriverUsage);
#ifdef _S9XLUA_H
@ -681,11 +685,9 @@ static void ShowUsage(const char *prog)
}
int fceuWrapperInit( int argc, char *argv[] )
// Pre-GUI initialization.
int fceuWrapperPreInit( int argc, char *argv[] )
{
int opt, error;
std::string s;
for (int i=0; i<argc; i++)
{
if ( (strcmp(argv[i], "--help") == 0) || (strcmp(argv[i],"-h") == 0) )
@ -693,7 +695,24 @@ int fceuWrapperInit( int argc, char *argv[] )
ShowUsage(argv[0]);
exit(0);
}
else if ( strcmp(argv[i], "--no-gui") == 0)
{
printf("Error: Qt/SDL version does not support --no-gui option.\n");
exit(1);
}
else if ( strcmp(argv[i], "--version") == 0)
{
printf("%i.%i.%i\n", FCEU_VERSION_MAJOR, FCEU_VERSION_MINOR, FCEU_VERSION_PATCH);
exit(0);
}
}
return 0;
}
int fceuWrapperInit( int argc, char *argv[] )
{
int opt, error;
std::string s;
FCEUD_Message("Starting " FCEU_NAME_AND_VERSION "...\n");

View File

@ -30,6 +30,7 @@ int CloseGame(void);
int reloadLastGame(void);
int LoadGameFromLua( const char *path );
int fceuWrapperPreInit( int argc, char *argv[] );
int fceuWrapperInit( int argc, char *argv[] );
int fceuWrapperMemoryCleanup( void );
int fceuWrapperClose( void );

View File

@ -189,7 +189,7 @@ iNesHeaderEditor_t::iNesHeaderEditor_t(QWidget *parent)
fontCharWidth = fm.width(QLatin1Char('2'));
#endif
setWindowTitle("iNES Header Editor");
setWindowTitle("NES Header Editor");
//resize( 512, 512 );
@ -197,7 +197,7 @@ iNesHeaderEditor_t::iNesHeaderEditor_t(QWidget *parent)
hdrLayout = new QVBoxLayout();
hbox1 = new QHBoxLayout();
hbox = new QHBoxLayout();
hdrBox = new QGroupBox( tr("iNES Header") );
hdrBox = new QGroupBox( tr("NES Header") );
box = new QGroupBox( tr("Version:") );
mainLayout->addWidget( hdrBox );
@ -550,7 +550,7 @@ iNesHeaderEditor_t::~iNesHeaderEditor_t(void)
//----------------------------------------------------------------------------
void iNesHeaderEditor_t::closeEvent(QCloseEvent *event)
{
//printf("iNES Header Editor Close Window Event\n");
//printf("NES Header Editor Close Window Event\n");
done(0);
deleteLater();
event->accept();
@ -701,21 +701,21 @@ bool iNesHeaderEditor_t::loadHeader(iNES_HEADER* header)
break;
}
case errors::INVALID_HEADER:
//MessageBox(parent, "Invalid iNES header.", "iNES Header Editor", MB_OK | MB_ICONERROR);
showErrorMsgWindow( "Invalid iNES header." );
//MessageBox(parent, "Invalid NES header.", "NES Header Editor", MB_OK | MB_ICONERROR);
showErrorMsgWindow( "Invalid NES header." );
break;
case errors::FDS_HEADER:
//MessageBox(parent, "Editing header of an FDS file is not supported.", "iNES Header Editor", MB_OK | MB_ICONERROR);
//MessageBox(parent, "Editing header of an FDS file is not supported.", "NES 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);
//MessageBox(parent, "Editing header of a UNIF file is not supported.", "NES 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);
//MessageBox(parent, "Editing header of an NSF file is not supported.", "NES Header Editor", MB_OK | MB_ICONERROR);
showErrorMsgWindow("Editing header of an NSF file is not supported.");
break;
}

View File

@ -158,6 +158,15 @@ int getKeyState(int k)
return 0;
}
const uint8_t *QtSDL_getKeyboardState( int *bufSize )
{
if (bufSize != nullptr)
{
*bufSize = SDL_NUM_SCANCODES;
}
return g_keyState;
}
//static int
//_keyonly(int a)
//{
@ -1909,7 +1918,7 @@ static void UpdateFKB(void)
}
}
const uint8 *getFamilyKeyboardState(void)
const uint8_t *getFamilyKeyboardState(void)
{
return fkbkeys;
}

View File

@ -148,7 +148,8 @@ int saveInputSettingsToFile( const char *fileBase = NULL );
int loadInputSettingsFromFile( const char *filename = NULL );
void toggleFamilyKeyboardFunc(void);
bool isFamilyKeyboardActv(void);
const uint8 *getFamilyKeyboardState(void);
const uint8_t *getFamilyKeyboardState(void);
const uint8_t *QtSDL_getKeyboardState( int *bufSize );
#endif

View File

@ -95,7 +95,10 @@ static bool showSplashScreen(void)
int main( int argc, char *argv[] )
{
int retval;
int retval = 0;
fceuWrapperPreInit(argc, argv);
qInstallMessageHandler(MessageOutput);
QApplication app(argc, argv);

View File

@ -1133,7 +1133,7 @@ void ppuPatternView_t::paintEvent(QPaintEvent *event)
xx = 0; yy = 0;
showSelector = (cycleCount < 20);
showSelector = (cycleCount < 20) && (selTile.x() >= 0) && (selTile.y() >= 0);
if ( mode == 1 )
{

View File

@ -199,7 +199,8 @@ static void ToggleCheat(int num)
static void ModifyCheat(int num)
{
char *name;
std::string name;
std::string *pName;
char buf[256];
uint32 A;
uint8 V;
@ -211,7 +212,7 @@ static void ModifyCheat(int num)
FCEUI_GetCheat(num, &name, &A, &V, &compare, &s, &type);
printf("Name [%s]: ",name);
printf("Name [%s]: ",name.c_str());
GetString(buf,256);
/* This obviously doesn't allow for cheats with no names. Bah. Who wants
@ -219,9 +220,9 @@ static void ModifyCheat(int num)
*/
if(buf[0])
name=buf; // Change name when FCEUI_SetCheat() is called.
pName=&name; // Change name when FCEUI_SetCheat() is called.
else
name=0; // Don't change name when FCEUI_SetCheat() is called.
pName=nullptr; // Don't change name when FCEUI_SetCheat() is called.
printf("Address [$%04x]: ",(unsigned int)A);
A=GetH16(A);
@ -240,7 +241,7 @@ static void ModifyCheat(int num)
if(t=='Y' || t=='y') s=1;
else if(t=='N' || t=='n') s=0;
FCEUI_SetCheat(num,name,A,V,compare,s,type);
FCEUI_SetCheat(num,pName,A,V,compare,s,type);
}
@ -320,7 +321,7 @@ static void AddCheat(void)
}
static int lid;
static int clistcallb(char *name, uint32 a, uint8 v, int compare, int s, int type, void *data)
static int clistcallb(const char *name, uint32 a, uint8 v, int compare, int s, int type, void *data)
{
char tmp[512];
int ret;

View File

@ -145,6 +145,11 @@ static void GetValueR(FILE *fp, char *str, void *v, int c)
{
if(!c) // String, allocate some memory.
{
// Windows enforces a 32767 character limit for text boxes by default
// If a string exceeds this length, it's probably a corrupt file
if (s > 32768)
goto gogl;
if(!(*(char **)v=(char*)malloc(s)))
goto gogl;

View File

@ -238,18 +238,18 @@ void KillBlitToHigh(void)
{
if(palettetranslate)
{
free(palettetranslate);
FCEU_free(palettetranslate);
palettetranslate=NULL;
}
if(specbuf8bpp)
{
free(specbuf8bpp);
FCEU_free(specbuf8bpp);
specbuf8bpp = NULL;
}
if(specbuf32bpp)
{
free(specbuf32bpp);
FCEU_free(specbuf32bpp);
specbuf32bpp = NULL;
}
if(specbuf)
@ -259,11 +259,11 @@ void KillBlitToHigh(void)
hq3x_Kill();
else
hq2x_Kill();
free(specbuf);
FCEU_free(specbuf);
specbuf=NULL;
}
if (nes_ntsc) {
free(nes_ntsc);
FCEU_free(nes_ntsc);
nes_ntsc = NULL;
}
if (ntscblit) {
@ -466,7 +466,7 @@ void Blit8To8(uint8 *src, uint8 *dest, int xr, int yr, int pitch, int xscale, in
/* Todo: Make sure 24bpp code works right with big-endian cpus */
//takes a pointer to XBuf and applies fully modern deemph palettizing
template<int SCALE> static u32 _ModernDeemphColorMap(u8* src, u8* srcbuf)
template<int SCALE> static u32 _ModernDeemphColorMap(const u8* src, const u8* srcbuf)
{
u8 pixel = *src;
@ -492,7 +492,7 @@ template<int SCALE> static u32 _ModernDeemphColorMap(u8* src, u8* srcbuf)
return color;
}
u32 ModernDeemphColorMap(u8* src, u8* srcbuf, int scale)
u32 ModernDeemphColorMap(const u8* src, const u8* srcbuf, int scale)
{
if(scale == 1) return _ModernDeemphColorMap<1>(src,srcbuf);
else if(scale == 2) return _ModernDeemphColorMap<2>(src,srcbuf);
@ -503,14 +503,14 @@ u32 ModernDeemphColorMap(u8* src, u8* srcbuf, int scale)
else if(scale == 7) return _ModernDeemphColorMap<7>(src,srcbuf);
else if(scale == 8) return _ModernDeemphColorMap<8>(src,srcbuf);
else if(scale == 9) return _ModernDeemphColorMap<9>(src,srcbuf);
else { abort(); return 0; }
else { FCEU_abort("unhandled ModernDeemphColorMap scale"); return 0; }
}
typedef u32 (*ModernDeemphColorMapFuncPtr)( u8*, u8* );
typedef u32 (*ModernDeemphColorMapFuncPtr)( const u8*, const u8* );
static ModernDeemphColorMapFuncPtr getModernDeemphColorMapFunc(int scale)
{
ModernDeemphColorMapFuncPtr ptr = NULL;
ModernDeemphColorMapFuncPtr ptr;
if(scale == 1) ptr = &_ModernDeemphColorMap<1>;
else if(scale == 2) ptr = &_ModernDeemphColorMap<2>;
@ -521,7 +521,7 @@ static ModernDeemphColorMapFuncPtr getModernDeemphColorMapFunc(int scale)
else if(scale == 7) ptr = &_ModernDeemphColorMap<7>;
else if(scale == 8) ptr = &_ModernDeemphColorMap<8>;
else if(scale == 9) ptr = &_ModernDeemphColorMap<9>;
else { abort(); ptr = NULL; }
else { FCEU_abort("unhandled ModernDeemphColorMap scale"); ptr = nullptr; }
return ptr;
}

View File

@ -29,4 +29,4 @@ void Blit32to16(uint32 *src, uint16 *dest, int xr, int yr, int dpitch,
int shiftr[3], int shiftl[3]);
u32 ModernDeemphColorMap(u8* src, u8* srcbuf, int scale);
u32 ModernDeemphColorMap(const u8* src, const u8* srcbuf, int scale);

View File

@ -277,7 +277,7 @@ struct memViewWin_t
{
if (addr < 16)
{
fprintf( stdout, "You can't edit ROM header here, however you can use iNES Header Editor to edit the header if it's an iNES format file.");
fprintf( stdout, "You can't edit ROM header here, however you can use NES Header Editor to edit the header if it's an iNES or NES2.0 format file.");
}
else if ( (addr >= 16) && (addr < PRGsize[0]+16) )
{

View File

@ -291,6 +291,8 @@ static void do_video_conversion(const unsigned char* buffer)
{
// memset(avi_file->convert_buffer, 0, VIDEO_WIDTH*(avi_file->end_scanline-avi_file->start_scanline)*3);
const unsigned char* mybuffer = buffer;
buffer += avi_file->start_scanline * VIDEO_WIDTH;
for(int y=avi_file->start_scanline; y<avi_file->end_scanline; ++y)
@ -300,10 +302,11 @@ static void do_video_conversion(const unsigned char* buffer)
for(int x=0; x<VIDEO_WIDTH; ++x)
{
uint8 *cp = (uint8*)(color_palette + *buffer++)+2;
*pix++ = *cp--;
*pix++ = *cp--;
*pix++ = *cp;
u32 color = ModernDeemphColorMap(buffer,mybuffer,1);
*pix++=(color>>0x00)&0xFF;
*pix++=(color>>0x08)&0xFF;
*pix++=(color>>0x10)&0xFF;
buffer++;
}
buffer = prevbuf + VIDEO_WIDTH;

View File

@ -108,7 +108,7 @@ char *U8ToStr(uint8 a)
}
//int RedoCheatsCallB(char *name, uint32 a, uint8 v, int s) { //bbit edited: this commented out line was changed to the below for the new fceud
int RedoCheatsCallB(char *name, uint32 a, uint8 v, int c, int s, int type, void* data)
int RedoCheatsCallB(const char *name, uint32 a, uint8 v, int c, int s, int type, void* data)
{
char str[256] = { 0 };
GetCheatStr(str, a, v, c);
@ -123,7 +123,7 @@ int RedoCheatsCallB(char *name, uint32 a, uint8 v, int c, int s, int type, void*
else
lvi.iItem = SendDlgItemMessage(hCheat, IDC_LIST_CHEATS, LVM_INSERTITEM, 0, (LPARAM)&lvi);
lvi.iSubItem = 1;
lvi.pszText = name;
lvi.pszText = (LPSTR)name;
SendDlgItemMessage(hCheat, IDC_LIST_CHEATS, LVM_SETITEM, 0, (LPARAM)&lvi);
lvi.mask = LVIF_STATE;
@ -483,11 +483,12 @@ INT_PTR CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
lvi.stateMask = LVIS_STATEIMAGEMASK;
int tmpsel = SendDlgItemMessage(hCheat, IDC_LIST_CHEATS, LVM_GETNEXTITEM, -1, LVNI_ALL | LVNI_SELECTED);
char* name = ""; int s;
std::string name;
int s;
while (tmpsel != -1)
{
FCEUI_GetCheat(tmpsel, &name, NULL, NULL, NULL, &s, NULL);
FCEUI_SetCheat(tmpsel, name, -1, -1, -2, s ^= 1, 1);
FCEUI_SetCheat(tmpsel, &name, -1, -1, -2, s ^= 1, 1);
lvi.iItem = tmpsel;
lvi.state = INDEXTOSTATEIMAGEMASK(s ? 2 : 1);
@ -645,12 +646,14 @@ INT_PTR CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
if (selcheat < 0)
break;
char name[256]; uint32 a; uint8 v; int s; int c;
GetUICheatInfo(hwndDlg, name, &a, &v, &c);
std::string name; uint32 a; uint8 v; int s; int c;
char namebuf[256] = {0};
GetUICheatInfo(hwndDlg, namebuf, &a, &v, &c);
name = namebuf;
FCEUI_SetCheat(selcheat, name, a, v, c, -1, 1);
FCEUI_GetCheat(selcheat, NULL, &a, &v, &c, &s, NULL);
RedoCheatsCallB(name, a, v, c, s, 1, &selcheat);
FCEUI_SetCheat(selcheat, &name, a, v, c, -1, 1);
FCEUI_GetCheat(selcheat, nullptr, &a, &v, &c, &s, NULL);
RedoCheatsCallB(name.c_str(), a, v, c, s, 1, &selcheat);
SendDlgItemMessage(hwndDlg, IDC_LIST_CHEATS, LVM_SETSELECTIONMARK, 0, selcheat);
SetDlgItemText(hwndDlg, IDC_CHEAT_ADDR, (LPCSTR)U16ToStr(a));
@ -902,9 +905,9 @@ INT_PTR CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
selcheat = pNMListView->iItem;
if (selcheat >= 0)
{
char* name = ""; uint32 a; uint8 v; int s; int c;
std::string name; uint32 a; uint8 v; int s; int c;
FCEUI_GetCheat(selcheat, &name, &a, &v, &c, &s, NULL);
SetDlgItemText(hwndDlg, IDC_CHEAT_NAME, (LPCSTR)name);
SetDlgItemText(hwndDlg, IDC_CHEAT_NAME, (LPCSTR)name.c_str());
SetDlgItemText(hwndDlg, IDC_CHEAT_ADDR, (LPCSTR)U16ToStr(a));
SetDlgItemText(hwndDlg, IDC_CHEAT_VAL, (LPCSTR)U8ToStr(v));
SetDlgItemText(hwndDlg, IDC_CHEAT_COM, (LPCSTR)(c == -1 ? "" : U8ToStr(c)));
@ -930,11 +933,11 @@ INT_PTR CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
pNMListView->uNewState & INDEXTOSTATEIMAGEMASK(2))
{
int tmpsel = pNMListView->iItem;
char* name = ""; int s;
std::string name; int s;
FCEUI_GetCheat(tmpsel, &name, NULL, NULL, NULL, &s, NULL);
if (!s)
{
FCEUI_SetCheat(tmpsel, name, -1, -1, -2, s ^= 1, 1);
FCEUI_SetCheat(tmpsel, &name, -1, -1, -2, s ^= 1, 1);
UpdateCheatRelatedWindow();
UpdateCheatListGroupBoxUI();
}
@ -944,11 +947,11 @@ INT_PTR CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
pNMListView->uNewState & INDEXTOSTATEIMAGEMASK(1))
{
int tmpsel = pNMListView->iItem;
char* name = ""; int s;
std::string name; int s;
FCEUI_GetCheat(tmpsel, &name, NULL, NULL, NULL, &s, NULL);
if (s)
{
FCEUI_SetCheat(tmpsel, name, -1, -1, -2, s ^= 1, 1);
FCEUI_SetCheat(tmpsel, &name, -1, -1, -2, s ^= 1, 1);
UpdateCheatRelatedWindow();
UpdateCheatListGroupBoxUI();
@ -1081,6 +1084,8 @@ void UpdateCheatListGroupBoxUI()
SetDlgItemText(hCheat, IDC_GROUPBOX_CHEATLIST, temp);
EnableWindow(GetDlgItem(hCheat, IDC_BTN_CHEAT_EXPORTTOFILE), cheats != 0);
CheckDlgButton(hCheat,IDC_CHEAT_GLOBAL_SWITCH,globalCheatDisabled?BST_UNCHECKED:BST_CHECKED);
}
//Used by cheats and external dialogs such as hex editor to update items in the cheat search dialog

View File

@ -1471,7 +1471,7 @@ INT_PTR CALLBACK PatcherCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
else
iapoffset = GetNesFileAddress(GetEditHex(hwndDlg,IDC_ROMPATCHER_OFFSET));
if((iapoffset < 16) && (iapoffset != -1)){
MessageBox(hDebug, "Sorry, iNES Header editing isn't supported by this tool. If you want to edit the header, please use iNES Header Editor", "Error", MB_OK | MB_ICONASTERISK);
MessageBox(hDebug, "Sorry, NES Header editing isn't supported by this tool. If you want to edit the header, please use NES Header Editor", "Error", MB_OK | MB_ICONASTERISK);
iapoffset = -1;
}
if((iapoffset > PRGsize[0]) && (iapoffset != -1)){

View File

@ -21,6 +21,7 @@
#include "common.h"
#include "utils/xstring.h"
#include "debuggersp.h"
#include "window.h"
#include "../../fceu.h"
#include "../../debug.h"
#include "../../conddebug.h"
@ -60,6 +61,7 @@ bool symbRegNames = true;
int debuggerWasActive = 0;
char temp_chr[40] = {0};
char delimiterChar[2] = "#";
INT_PTR CALLBACK nameDebuggerBookmarkCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
extern WNDPROC DefaultEditCtrlProc;
@ -153,10 +155,10 @@ int parseLine(char* line, Name* n)
if (llen == 5) // Offset size of normal lines of the form $XXXX
{
if (line[0] != '$'
|| !IsLetterLegalHex(line[1])
|| !IsLetterLegalHex(line[2])
|| !IsLetterLegalHex(line[3])
|| !IsLetterLegalHex(line[4])
|| !IsLetterLegalHex(0,line[1])
|| !IsLetterLegalHex(1,line[2])
|| !IsLetterLegalHex(2,line[3])
|| !IsLetterLegalHex(3,line[4])
)
{
return 4;
@ -166,10 +168,10 @@ int parseLine(char* line, Name* n)
{
int i;
if (line[0] != '$'
|| !IsLetterLegalHex(line[1])
|| !IsLetterLegalHex(line[2])
|| !IsLetterLegalHex(line[3])
|| !IsLetterLegalHex(line[4])
|| !IsLetterLegalHex(0,line[1])
|| !IsLetterLegalHex(1,line[2])
|| !IsLetterLegalHex(2,line[3])
|| !IsLetterLegalHex(3,line[4])
|| line[5] != '/'
)
{
@ -178,7 +180,7 @@ int parseLine(char* line, Name* n)
for (i=6;line[i];i++)
{
if (!IsLetterLegalHex(line[i]))
if (!IsLetterLegalHex(i,line[i]))
{
return 6;
}

View File

@ -61,7 +61,6 @@ void DeleteAllDebuggerBookmarks();
void FillDebuggerBookmarkListbox(HWND hwnd);
void GoToDebuggerBookmark(HWND hwnd);
extern bool IsLetterLegalHex(char c);
bool DoSymbolicDebugNaming(int offset, HWND parentHWND);
bool DoSymbolicDebugNaming(int offset, int size, HWND parentHWND);

View File

@ -186,22 +186,22 @@ bool LoadHeader(HWND parent, iNES_HEADER* header)
{
char buf[1024];
sprintf(buf, "Error opening %s!", LoadedRomFName);
MessageBox(parent, buf, "iNES Header Editor", MB_OK | MB_ICONERROR);
MessageBox(parent, buf, "NES Header Editor", MB_OK | MB_ICONERROR);
break;
}
case errors::INVALID_HEADER:
MessageBox(parent, "Invalid iNES header.", "iNES Header Editor", MB_OK | MB_ICONERROR);
MessageBox(parent, "Invalid NES header.", "NES Header Editor", MB_OK | MB_ICONERROR);
break;
case errors::FDS_HEADER:
MessageBox(parent, "Editing header of an FDS file is not supported.", "iNES Header Editor", MB_OK | MB_ICONERROR);
MessageBox(parent, "Editing header of an FDS file is not supported.", "NES Header Editor", MB_OK | MB_ICONERROR);
break;
case errors::UNIF_HEADER:
MessageBox(parent, "Editing header of a UNIF file is not supported.", "iNES Header Editor", MB_OK | MB_ICONERROR);
MessageBox(parent, "Editing header of a UNIF file is not supported.", "NES Header Editor", MB_OK | MB_ICONERROR);
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);
MessageBox(parent, "Editing header of an NSF file is not supported.", "NES Header Editor", MB_OK | MB_ICONERROR);
break;
}
return false;
@ -1735,7 +1735,7 @@ int GetComboBoxByteSize(HWND hwnd, UINT id, int* value, iNES_HEADER* header)
sprintf(buf, "The unit of %s size you entered is invalid, it must be B, KB or MB", name);
break;
case errors::MINUS_ERR:
sprintf(buf, "Negative value of %s is not supported by iNES header.", name);
sprintf(buf, "Negative value of %s is not supported by NES header.", name);
break;
}
@ -1880,7 +1880,7 @@ bool SaveINESFile(HWND hwnd, char* path, iNES_HEADER* header)
if (!source)
{
sprintf(buf, "Opening source file %s failed.", LoadedRomFName);
MessageBox(hwnd, buf, "iNES Header Editor", MB_OK | MB_ICONERROR);
MessageBox(hwnd, buf, "NES Header Editor", MB_OK | MB_ICONERROR);
return false;
}
@ -1889,7 +1889,7 @@ bool SaveINESFile(HWND hwnd, char* path, iNES_HEADER* header)
if (!target)
{
sprintf(buf, "Creating target file %s failed.", path);
MessageBox(hwnd, buf, "iNES Header Editor", MB_OK | MB_ICONERROR);
MessageBox(hwnd, buf, "NES Header Editor", MB_OK | MB_ICONERROR);
FCEU_fclose(source);
return false;
}

View File

@ -346,7 +346,7 @@ static int GetFileData(uint32 offset){
}
static int WriteFileData(uint32 addr,int data){
if (addr < 16) MessageBox(hMemView, "You can't edit ROM header here, however you can use iNES Header Editor to edit the header if it's an iNES format file.", "Sorry", MB_OK | MB_ICONERROR);
if (addr < 16) MessageBox(hMemView, "You can't edit ROM header here, however you can use NES Header Editor to edit the header if it's an iNES format file.", "Sorry", MB_OK | MB_ICONERROR);
if((addr >= 16) && (addr < PRGsize[0]+16)) *(uint8 *)(GetNesPRGPointer(addr-16)) = data;
if((addr >= PRGsize[0]+16) && (addr < CHRsize[0]+PRGsize[0]+16)) *(uint8 *)(GetNesCHRPointer(addr-16-PRGsize[0])) = data;
@ -736,7 +736,7 @@ void UpdateColorTable()
int temp_offset;
for (i = 0; i < DataAmount; i++)
{
temp_offset = CurOffset + i - 16; // (minus iNES header)
temp_offset = CurOffset + i - 16; // (minus NES header)
if (temp_offset >= 0)
{
if ((unsigned int)temp_offset < cdloggerdataSize)
@ -822,7 +822,7 @@ void UpdateColorTable()
int addrtodelete; // This is a very ugly hackish method of doing this
int cheatwasdeleted; // but it works and that is all that matters here.
int DeleteCheatCallB(char *name, uint32 a, uint8 v, int compare,int s,int type, void *data){ //mbg merge 6/29/06 - added arg
int DeleteCheatCallB(const char *name, uint32 a, uint8 v, int compare,int s,int type, void *data){ //mbg merge 6/29/06 - added arg
if(cheatwasdeleted == -1)return 1;
cheatwasdeleted++;
if(a == addrtodelete){
@ -901,7 +901,7 @@ void UnfreezeAllRam() {
int i=0;
char * Cname;
std::string Cname;
uint32 Caddr;
int Ctype;
@ -919,7 +919,7 @@ void UnfreezeAllRam() {
// would be added by the freeze command. Manual unfreeze should let them
// make that mistake once or twice, in case they like it that way.
FCEUI_GetCheat(i,&Cname,&Caddr,NULL,NULL,NULL,&Ctype);
if ((Cname[0] == '\0') && ((Caddr < 0x2000) || ((Caddr >= 0x6000) && (Caddr < 0x8000))) && (Ctype == 1)) {
if ((Cname.empty()) && ((Caddr < 0x2000) || ((Caddr >= 0x6000) && (Caddr < 0x8000))) && (Ctype == 1)) {
// Already Added, so consider it a success
FreezeRam(Caddr,-1,1);
@ -960,14 +960,14 @@ void FreezeRam(int address, int mode, int final){
//input is expected to be an ASCII string
void InputData(char *input){
//CursorEndAddy = -1;
int addr, i, j, datasize = 0;
int addr, datasize = 0;
unsigned char *data;
char inputc;
//char str[100];
//mbg merge 7/18/06 added cast:
data = (uint8 *)malloc(strlen(input) + 1); //it can't be larger than the input string, so use that as the size
for(i = 0;input[i] != 0;i++){
for(int i = 0;input[i] != 0;i++){
if(!EditingText){
inputc = -1;
if((input[i] >= 'a') && (input[i] <= 'f')) inputc = input[i]-('a'-0xA);
@ -983,9 +983,15 @@ void InputData(char *input){
{
TempData = inputc;
}
} else {
for(j = 0;j < 256;j++)if(chartable[j] == input[i])break;
if(j == 256)continue;
}
else
{
int j;
for(j = 0; j < 256; j++)
if(chartable[j] == input[i])
break;
if(j == 256)
continue;
data[datasize++] = j;
}
}
@ -1003,35 +1009,43 @@ void InputData(char *input){
//sprintf(str,"datasize = %d",datasize);
//MessageBox(hMemView,str, "debug", MB_OK);
for(i = 0;i < datasize;i++){
addr = CursorStartAddy+i;
if (addr >= MaxSize) continue;
switch(EditingMode)
if(EditingMode == MODE_NES_FILE)
{
ApplyPatch(CursorStartAddy, datasize, data);
}
else
{
for(int i = 0;i < datasize;i++)
{
case MODE_NES_MEMORY:
// RAM (system bus)
BWrite[addr](addr, data[i]);
break;
case MODE_NES_PPU:
// PPU
addr &= 0x3FFF;
if (addr < 0x2000)
VPage[addr >> 10][addr] = data[i]; //todo: detect if this is vrom and turn it red if so
if ((addr >= 0x2000) && (addr < 0x3F00))
vnapage[(addr >> 10) & 0x3][addr & 0x3FF] = data[i]; //todo: this causes 0x3000-0x3f00 to mirror 0x2000-0x2f00, is this correct?
if ((addr >= 0x3F00) && (addr < 0x3FFF))
PalettePoke(addr, data[i]);
break;
case MODE_NES_OAM:
addr &= 0xFF;
SPRAM[addr] = data[i];
break;
case MODE_NES_FILE:
// ROM
ApplyPatch(addr, 1, &data[i]);
break;
addr = CursorStartAddy+i;
if (addr >= MaxSize) continue;
switch(EditingMode)
{
case MODE_NES_MEMORY:
// RAM (system bus)
BWrite[addr](addr, data[i]);
break;
case MODE_NES_PPU:
// PPU
addr &= 0x3FFF;
if (addr < 0x2000)
VPage[addr >> 10][addr] = data[i]; //todo: detect if this is vrom and turn it red if so
if ((addr >= 0x2000) && (addr < 0x3F00))
vnapage[(addr >> 10) & 0x3][addr & 0x3FF] = data[i]; //todo: this causes 0x3000-0x3f00 to mirror 0x2000-0x2f00, is this correct?
if ((addr >= 0x3F00) && (addr < 0x3FFF))
PalettePoke(addr, data[i]);
break;
case MODE_NES_OAM:
addr &= 0xFF;
SPRAM[addr] = data[i];
break;
case MODE_NES_FILE:
// ROM
ApplyPatch(addr, 1, &data[i]);
break;
}
}
}
CursorStartAddy+=datasize;

View File

@ -3,6 +3,7 @@
#include "debugger.h"
#include "debuggersp.h"
#include "memwatch.h"
#include "window.h"
#include "../../fceu.h"
#include "../../debug.h"
#include "../../conddebug.h"
@ -120,7 +121,7 @@ BOOL updateResults(HWND hwndDlg, int rule)
for (unsigned int j=0;j<len;j++)
{
if (IsLetterLegalHex(input_buff[j]) == FALSE)
if (IsLetterLegalHex(j,input_buff[j]) == FALSE)
{
return FALSE;
}

View File

@ -90,7 +90,7 @@ public:
ptr = ::realloc(ptr,len);
return ptr;
}
void free(void *ptr) {
static void free(void *ptr) {
::free(ptr);
}

View File

@ -254,6 +254,9 @@ int loadDebuggerPreferences(FILE* f)
// Read the number of CPU bookmarks
if (fread(&size, sizeof(unsigned int), 1, f) != 1) return 1;
// If there's more than 65536 bookmarks (bookmarking every address in the whole 16-bit address space), we're probably reading a corrupt file
if (size > 65536) return 1;
bookmarks.resize(size);
// Read the data of those bookmarks
char buffer[256];
@ -295,6 +298,8 @@ int loadDebuggerPreferences(FILE* f)
// Read the length of the BP condition
if (fread(&len, sizeof(len), 1, f) != 1) return 1;
// Windows enforces 32767 max characters for a textbox by default, if it exceeds that, it's probably a corrupt file
if (len > 32767) return 1;
// Delete eventual older conditions
if (watchpoint[myNumWPs].condText)
@ -312,7 +317,9 @@ int loadDebuggerPreferences(FILE* f)
// Read length of the BP description
if (fread(&len, sizeof(len), 1, f) != 1) return 1;
// Windows enforces 32767 max characters for a textbox by default, if it exceeds that, it's probably a corrupt file
if (len > 32767) return 1;
// Delete eventual older description
if (watchpoint[myNumWPs].desc)
free(watchpoint[myNumWPs].desc);
@ -373,6 +380,8 @@ int loadHexPreferences(FILE* f, HexBookmarkList& target = hexBookmarks)
if (fread(&target[i].address, sizeof(target[i].address), 1, f) != 1) return 1;
// Read length of description
if (fread(&len, sizeof(len), 1, f) != 1) return 1;
const int max_len = sizeof(target[i].description)/sizeof(target[i].description[0]) - 1; //value of 50
if (len > max_len) return 1;
// Read the bookmark description
if (fread(target[i].description, 1, len, f) != len) return 1;
}
@ -384,6 +393,8 @@ int loadHexPreferences(FILE* f, HexBookmarkList& target = hexBookmarks)
if (!feof(f))
{
fread(&target.shortcutCount, sizeof(target.shortcutCount), 1, f);
const int max_shortcuts = sizeof(target.shortcuts) / sizeof(target.shortcuts[0]); //value of 10
if (target.shortcutCount > max_shortcuts) return 1;
unsigned int bookmark_index, shortcut_index;
// read the matching index list of the shortcuts

View File

@ -684,53 +684,53 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "",IDC_STATIC,3,0,126,200
GROUPBOX "",IDC_STATIC,131,0,128,200
EDITTEXT MW_ADDR00,6,17,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR00,6,17,30,14,0
EDITTEXT MW_NAME00,41,17,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR01,6,32,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR01,6,32,30,14,0
EDITTEXT MW_NAME01,41,32,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR02,6,47,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR02,6,47,30,14,0
EDITTEXT MW_NAME02,41,47,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR03,6,62,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR03,6,62,30,14,0
EDITTEXT MW_NAME03,41,62,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR04,6,77,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR04,6,77,30,14,0
EDITTEXT MW_NAME04,41,77,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR05,6,92,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR05,6,92,30,14,0
EDITTEXT MW_NAME05,41,92,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR06,6,107,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR06,6,107,30,14,0
EDITTEXT MW_NAME06,41,107,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR07,6,122,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR07,6,122,30,14,0
EDITTEXT MW_NAME07,41,122,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR08,6,137,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR08,6,137,30,14,0
EDITTEXT MW_NAME08,41,137,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR09,6,152,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR09,6,152,30,14,0
EDITTEXT MW_NAME09,41,152,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR10,6,167,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR10,6,167,30,14,0
EDITTEXT MW_NAME10,41,167,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR11,6,182,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR11,6,182,30,14,0
EDITTEXT MW_NAME11,41,182,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR12,135,17,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR12,135,17,30,14,0
EDITTEXT MW_NAME12,171,17,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR13,135,32,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR13,135,32,30,14,0
EDITTEXT MW_NAME13,171,32,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR14,135,47,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR14,135,47,30,14,0
EDITTEXT MW_NAME14,171,47,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR15,135,62,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR15,135,62,30,14,0
EDITTEXT MW_NAME15,171,62,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR16,135,77,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR16,135,77,30,14,0
EDITTEXT MW_NAME16,171,77,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR17,135,92,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR17,135,92,30,14,0
EDITTEXT MW_NAME17,171,92,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR18,135,107,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR18,135,107,30,14,0
EDITTEXT MW_NAME18,171,107,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR19,135,122,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR19,135,122,30,14,0
EDITTEXT MW_NAME19,171,122,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR20,135,137,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR20,135,137,30,14,0
EDITTEXT MW_NAME20,171,137,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR21,135,152,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR21,135,152,30,14,0
EDITTEXT MW_NAME21,171,152,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR22,135,167,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR22,135,167,30,14,0
EDITTEXT MW_NAME22,171,167,55,14,ES_AUTOHSCROLL
EDITTEXT MW_ADDR23,135,182,30,14,ES_UPPERCASE
EDITTEXT MW_ADDR23,135,182,30,14,0
EDITTEXT MW_NAME23,171,182,55,14,ES_AUTOHSCROLL
LTEXT "Name",IDC_STATIC,41,7,20,8
LTEXT "Address",IDC_STATIC,6,7,26,8

View File

@ -58,7 +58,7 @@ public:
Buffer(int size) { length = 0; this->size = size; data = OAKRA_Module::malloc(size); }
int getRemaining() { return size-length; }
void *data;
~Buffer() { delete data; }
~Buffer() { if (data){ OAKRA_Module::free(data); data = nullptr; } }
};
std::vector<Buffer*> liveBuffers;

View File

@ -38,6 +38,9 @@
#include "video.h"
#include "input.h"
#include "fceu.h"
#include "types.h"
#include "cart.h"
#include "ines.h"
#include "cheat.h"
#include "ram_search.h"
@ -404,7 +407,7 @@ void updateGameDependentMenus()
for (unsigned int i = 0; i < sizeof(menu_ids) / sizeof(*menu_ids); i++)
EnableMenuItem(fceumenu, menu_ids[i], MF_BYCOMMAND | enable ? MF_ENABLED : MF_GRAYED | MF_DISABLED);
// Special treatment for the iNES head editor, only when no game is loaded or an NES game is loaded
// Special treatment for the NES header editor, only when no game is loaded or an NES game is loaded
extern iNES_HEADER head;
enable = GameInfo == 0 || !strncmp((const char*)&head, "NES\x1A", 4);
EnableMenuItem(fceumenu, MENU_INESHEADEREDITOR, MF_BYCOMMAND | enable ? MF_ENABLED : MF_GRAYED | MF_DISABLED);
@ -1075,6 +1078,37 @@ void CloseGame()
bool ALoad(const char *nameo, char* innerFilename, bool silent)
{
FCEUFILE* patchTrial = FCEU_fopen(nameo,nullptr,"rb",nullptr,-1);
if(patchTrial)
{
char sig[10] = {0};
FCEU_fread(sig,1,5,patchTrial);
FCEU_fclose(patchTrial);
if(!strcmp(sig,"PATCH"))
{
//assuming it's a patch:
//if nothing's loaded, we can't load this
if(!LoadedRomFName[0])
return false;
//ok, set this as a patch and load it
//use a temp std::string to avoid problems copying from LoadedRomFName, to LoadedRomFName
//pass nullptr as innerFilename -- see, it's not used here anyway
strcpy(LoadedRomFNamePatchToUse,nameo);
std::string tmp_LoadedRomFName = LoadedRomFName;
bool ret = ALoad(tmp_LoadedRomFName.c_str(),nullptr,silent);
//clear the patch file. FCEUX doesn't seem to ever reload the roms (?) so it can't need to reuse it
//and if it does.. well.. it won't be patched.
//there's only so much we can do with this old framework
LoadedRomFNamePatchToUse[0] = 0;
return ret;
}
}
int oldPaused = EmulationPaused;
// loading is not started yet, so the game can continue;
@ -3283,176 +3317,97 @@ POINT CalcSubWindowPos(HWND hDlg, POINT* conf)
return pt;
}
LRESULT APIENTRY FilterEditCtrlProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lP)
static bool IsInputLegal(IsLetterLegalProc proc, int index, char letter)
{
bool through = true;
INT_PTR result = 0;
return !proc || letter == VK_BACK || GetKeyState(VK_CONTROL) & 0x8000 || proc(index,letter);
}
switch (msg)
bool IsLetterLegalGG(int index, char letter)
{
char ch = toupper(letter);
for (int i = 0; GameGenieLetters[i]; ++i)
if (GameGenieLetters[i] == ch)
return true;
return false;
}
bool IsLetterLegalHex(int index, char letter)
{
return letter >= '0' && letter <= '9' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f';
}
bool IsLetterLegalMemwatchAddress(int index, char letter)
{
//accept normal hex stuff
if(letter >= '0' && letter <= '9' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f')
return true;
//accept prefixes
if(index == 0)
{
case WM_PASTE:
{
bool (*IsLetterLegal)(char) = GetIsLetterLegal(GetDlgCtrlID(hwnd));
if (IsLetterLegal)
{
if (OpenClipboard(hwnd))
{
HANDLE handle = GetClipboardData(CF_TEXT);
if (handle)
{
// get the original clipboard string
char* clipStr = (char*)GlobalLock(handle);
// check if the text in clipboard has illegal characters
int len = strlen(clipStr);
for (int i = 0; i < len; ++i)
{
if (!IsLetterLegal(clipStr[i]))
{
through = false;
// Show Edit control tip, just like the control with ES_NUMBER do
ShowLetterIllegalBalloonTip(hwnd, IsLetterLegal);
break;
}
}
GlobalUnlock(handle);
CloseClipboard();
}
}
}
}
break;
case WM_CHAR:
{
bool(*IsLetterLegal)(char) = GetIsLetterLegal(GetDlgCtrlID(hwnd));
through = IsInputLegal(IsLetterLegal, wP);
if (!through)
ShowLetterIllegalBalloonTip(hwnd, IsLetterLegal);
}
if(letter == 'x' || letter == 'X' || letter == '!')
return true;
}
return through ? CallWindowProc(DefaultEditCtrlProc, hwnd, msg, wP, lP) : result;
return false;
}
// return a letter legal checking function for the specified control with the given id
bool inline (*GetIsLetterLegal(UINT id))(char letter)
bool IsLetterLegalHexList(int index, char letter)
{
switch (id)
{
// Game genie text in Cheat and Game Genie Encoder/Decoder
case IDC_CHEAT_GAME_GENIE_TEXT:
case IDC_GAME_GENIE_CODE:
return IsLetterLegalGG;
// Addresses in Debugger
case IDC_DEBUGGER_VAL_PCSEEK:
case IDC_DEBUGGER_VAL_PC:
case IDC_DEBUGGER_VAL_A:
case IDC_DEBUGGER_VAL_X:
case IDC_DEBUGGER_VAL_Y:
case IDC_DEBUGGER_BOOKMARK:
// Debugger -> Add breakpoint
case IDC_ADDBP_ADDR_START: case IDC_ADDBP_ADDR_END:
// Array Size, Init value in Symbolic Name in Debugger
case IDC_EDIT_SYMBOLIC_ARRAY: case IDC_EDIT_SYMBOLIC_INIT:
// Address, Value, Compare, Known Value, Note equal, Greater than and Less than in Cheat
case IDC_CHEAT_ADDR: case IDC_CHEAT_VAL: case IDC_CHEAT_COM:
case IDC_CHEAT_VAL_KNOWN: case IDC_CHEAT_VAL_NE_BY:
case IDC_CHEAT_VAL_GT_BY: case IDC_CHEAT_VAL_LT_BY:
// Address, Value and Compare in Game Genie Encoder/Decoder
case IDC_GAME_GENIE_ADDR: case IDC_GAME_GENIE_VAL: case IDC_GAME_GENIE_COMP:
// Address controls in Memory watch
case MW_ADDR00: case MW_ADDR01: case MW_ADDR02: case MW_ADDR03:
case MW_ADDR04: case MW_ADDR05: case MW_ADDR06: case MW_ADDR07:
case MW_ADDR08: case MW_ADDR09: case MW_ADDR10: case MW_ADDR11:
case MW_ADDR12: case MW_ADDR13: case MW_ADDR14: case MW_ADDR15:
case MW_ADDR16: case MW_ADDR17: case MW_ADDR18: case MW_ADDR19:
case MW_ADDR20: case MW_ADDR21: case MW_ADDR22: case MW_ADDR23:
case IDC_EDIT_COMPAREADDRESS:
return IsLetterLegalHex;
// Specific Address in RAM Search
// RAM Watch / RAM Search / Cheat -> Add watch (current only in adding watch operation)
case IDC_EDIT_COMPAREADDRESSES:
return IsLetterLegalHexList;
// Size multiplier and TV Aspect in Video Config
case IDC_WINSIZE_MUL_X: case IDC_WINSIZE_MUL_Y:
case IDC_TVASPECT_X: case IDC_TVASPECT_Y:
return IsLetterLegalFloat;
// Cheat code in Cheat
case IDC_CHEAT_TEXT:
return IsLetterLegalCheat;
// PRG ROM, PRG RAM, PRG NVRAM, CHR ROM, CHR RAM and CHR NVRAM in iNES Header Editor
case IDC_PRGROM_EDIT: case IDC_PRGRAM_EDIT: case IDC_PRGNVRAM_EDIT:
case IDC_CHRROM_EDIT: case IDC_CHRRAM_EDIT: case IDC_CHRNVRAM_EDIT:
return IsLetterLegalSize;
// Specific value, Different by and Modulo in RAM search
case IDC_EDIT_COMPAREVALUE:
case IDC_EDIT_DIFFBY:
case IDC_EDIT_MODBY:
{
extern char rs_t;
switch (rs_t)
{
case 's': return IsLetterLegalDecHexMixed;
case 'u': return IsLetterLegalUnsignedDecHexMixed;
case 'h': return IsLetterLegalHex;
}
}
}
return NULL;
return IsLetterLegalHex(index,letter) || letter == ',' || letter == ' ';
}
void ShowLetterIllegalBalloonTip(HWND hwnd, bool(*IsLetterLegal)(char letter))
bool IsLetterLegalCheat(int index, char letter)
{
wchar_t* title = L"Unacceptable Character";
wchar_t* msg = GetLetterIllegalErrMsg(IsLetterLegal);
EDITBALLOONTIP tip;
tip.cbStruct = sizeof(EDITBALLOONTIP);
tip.pszText = msg;
tip.pszTitle = title;
tip.ttiIcon = TTI_ERROR;
SendMessage(hwnd, EM_SHOWBALLOONTIP, 0, (LPARAM)&tip);
// make a sound
MessageBeep(0xFFFFFFFF);
return letter >= '0' && letter <= ':' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f' || letter == '?';
}
inline wchar_t* GetLetterIllegalErrMsg(bool(*IsLetterLegal)(char letter))
bool IsLetterLegalSize(int index, char letter)
{
if (IsLetterLegal == IsLetterLegalGG)
return letter >= '0' && letter <= '9' || letter == 'm' || letter == 'M' || letter == 'k' || letter == 'K' || letter == 'b' || letter == 'B';
}
bool IsLetterLegalDec(int index, char letter)
{
return letter >= '0' && letter <= '9' || letter == '-' || letter == '+';
}
bool IsLetterLegalFloat(int index, char letter)
{
return letter >= '0' && letter <= '9' || letter == '.' || letter == '-' || letter == '+';
}
bool IsLetterLegalDecHexMixed(int index, char letter)
{
return letter >= '0' && letter <= '9' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f' || letter == '$' || letter == '-' || letter == '+';
}
bool IsLetterLegalUnsignedDecHexMixed(int index, char letter)
{
return letter >= '0' && letter <= '9' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f' || letter == '$';
}
wchar_t* GetLetterIllegalErrMsg(IsLetterLegalProc proc)
{
if (proc == &IsLetterLegalGG)
return L"You can only type Game Genie characters:\nA P Z L G I T Y E O X U K S V N";
if (IsLetterLegal == IsLetterLegalHex)
if (proc == &IsLetterLegalHex)
return L"You can only type characters for hexadecimal number (0-9,A-F).";
if (IsLetterLegal == IsLetterLegalHexList)
if (proc == &IsLetterLegalHexList)
return L"You can only type characters for hexademical number (0-9,A-F), each number is separated by a comma (,)";
if (IsLetterLegal == IsLetterLegalCheat)
if (proc == &IsLetterLegalCheat)
return
L"The cheat code comes into the following 2 formats:\n"
"AAAA:VV freezes the value in Address $AAAA to $VV.\n"
"AAAA?CC:VV changes the value in Address $AAAA to $VV only when it's $CC.\n"
"All the characters are hexadecimal number (0-9,A-F).\n";
if (IsLetterLegal == IsLetterLegalFloat)
if (proc == &IsLetterLegalFloat)
return L"You can only type decimal number (decimal point is acceptable).";
if (IsLetterLegal == IsLetterLegalSize)
if (proc == &IsLetterLegalSize)
return L"You can only type decimal number followed with B, KB or MB.";
if (IsLetterLegal == IsLetterLegalDec)
if (proc == &IsLetterLegalDec)
return L"You can only type decimal number (sign character is acceptable).";
if (IsLetterLegal == IsLetterLegalDecHexMixed)
if (proc == &IsLetterLegalDecHexMixed)
return
L"You can only type decimal or hexademical number\n"
"(sign character is acceptable).\n\n"
@ -3463,7 +3418,7 @@ inline wchar_t* GetLetterIllegalErrMsg(bool(*IsLetterLegal)(char letter))
"you must add a $ prefix to prevent ambiguous.\n"
"eg. 10 is a decimal number,\n"
"$10 means a hexademical number that is 16 in decimal.";
if (IsLetterLegal == IsLetterLegalUnsignedDecHexMixed)
if (proc == &IsLetterLegalUnsignedDecHexMixed)
return
L"You can only type decimal or hexademical number.\n\n"
"When your number contains letter A-F,\n"
@ -3477,56 +3432,155 @@ inline wchar_t* GetLetterIllegalErrMsg(bool(*IsLetterLegal)(char letter))
return L"Your input contains invalid characters.";
}
inline bool IsInputLegal(bool (*IsLetterLegal)(char letter), char letter)
// return a letter legal checking function for the specified control with the given id
IsLetterLegalProc GetIsLetterLegalProc(UINT id)
{
return !IsLetterLegal || letter == VK_BACK || GetKeyState(VK_CONTROL) & 0x8000 || IsLetterLegal(letter);
switch (id)
{
// Game genie text in Cheat and Game Genie Encoder/Decoder
case IDC_CHEAT_GAME_GENIE_TEXT:
case IDC_GAME_GENIE_CODE:
return &IsLetterLegalGG;
// Addresses in Debugger
case IDC_DEBUGGER_VAL_PCSEEK:
case IDC_DEBUGGER_VAL_PC:
case IDC_DEBUGGER_VAL_A:
case IDC_DEBUGGER_VAL_X:
case IDC_DEBUGGER_VAL_Y:
case IDC_DEBUGGER_BOOKMARK:
// Debugger -> Add breakpoint
case IDC_ADDBP_ADDR_START: case IDC_ADDBP_ADDR_END:
// Array Size, Init value in Symbolic Name in Debugger
case IDC_EDIT_SYMBOLIC_ARRAY: case IDC_EDIT_SYMBOLIC_INIT:
// Address, Value, Compare, Known Value, Note equal, Greater than and Less than in Cheat
case IDC_CHEAT_ADDR: case IDC_CHEAT_VAL: case IDC_CHEAT_COM:
case IDC_CHEAT_VAL_KNOWN: case IDC_CHEAT_VAL_NE_BY:
case IDC_CHEAT_VAL_GT_BY: case IDC_CHEAT_VAL_LT_BY:
// Address, Value and Compare in Game Genie Encoder/Decoder
case IDC_GAME_GENIE_ADDR: case IDC_GAME_GENIE_VAL: case IDC_GAME_GENIE_COMP:
// Address controls in Memory watch
case MW_ADDR00: case MW_ADDR01: case MW_ADDR02: case MW_ADDR03:
case MW_ADDR04: case MW_ADDR05: case MW_ADDR06: case MW_ADDR07:
case MW_ADDR08: case MW_ADDR09: case MW_ADDR10: case MW_ADDR11:
case MW_ADDR12: case MW_ADDR13: case MW_ADDR14: case MW_ADDR15:
case MW_ADDR16: case MW_ADDR17: case MW_ADDR18: case MW_ADDR19:
case MW_ADDR20: case MW_ADDR21: case MW_ADDR22: case MW_ADDR23:
return &IsLetterLegalMemwatchAddress;
case IDC_EDIT_COMPAREADDRESS:
return &IsLetterLegalHex;
// Specific Address in RAM Search
// RAM Watch / RAM Search / Cheat -> Add watch (current only in adding watch operation)
case IDC_EDIT_COMPAREADDRESSES:
return &IsLetterLegalHexList;
// Size multiplier and TV Aspect in Video Config
case IDC_WINSIZE_MUL_X: case IDC_WINSIZE_MUL_Y:
case IDC_TVASPECT_X: case IDC_TVASPECT_Y:
return &IsLetterLegalFloat;
// Cheat code in Cheat
case IDC_CHEAT_TEXT:
return &IsLetterLegalCheat;
// PRG ROM, PRG RAM, PRG NVRAM, CHR ROM, CHR RAM and CHR NVRAM in NES Header Editor
case IDC_PRGROM_EDIT: case IDC_PRGRAM_EDIT: case IDC_PRGNVRAM_EDIT:
case IDC_CHRROM_EDIT: case IDC_CHRRAM_EDIT: case IDC_CHRNVRAM_EDIT:
return &IsLetterLegalSize;
// Specific value, Different by and Modulo in RAM search
case IDC_EDIT_COMPAREVALUE:
case IDC_EDIT_DIFFBY:
case IDC_EDIT_MODBY:
{
extern char rs_t;
switch (rs_t)
{
case 's': return &IsLetterLegalDecHexMixed;
case 'u': return &IsLetterLegalUnsignedDecHexMixed;
case 'h': return &IsLetterLegalHex;
}
}
}
return NULL;
}
inline bool IsLetterLegalGG(char letter)
LRESULT APIENTRY FilterEditCtrlProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lP)
{
char ch = toupper(letter);
for (int i = 0; GameGenieLetters[i]; ++i)
if (GameGenieLetters[i] == ch)
return true;
return false;
bool through = true;
INT_PTR result = 0;
switch (msg)
{
case WM_PASTE:
{
IsLetterLegalProc isLetterLegal = GetIsLetterLegalProc(GetDlgCtrlID(hwnd));
if (isLetterLegal)
{
if (OpenClipboard(hwnd))
{
HANDLE handle = GetClipboardData(CF_TEXT);
if (handle)
{
// get the original clipboard string
char* clipStr = (char*)GlobalLock(handle);
// check if the text in clipboard has illegal characters
int len = strlen(clipStr);
for (int i = 0; i < len; ++i)
{
if (!isLetterLegal(i,clipStr[i]))
{
through = false;
// Show Edit control tip, just like the control with ES_NUMBER do
ShowLetterIllegalBalloonTip(hwnd, isLetterLegal);
break;
}
}
GlobalUnlock(handle);
CloseClipboard();
}
}
}
}
break;
case WM_CHAR:
{
DWORD cpBegin, cpEnd;
SendMessage(hwnd, EM_GETSEL, (LPARAM)&cpBegin, (LPARAM)&cpEnd);
IsLetterLegalProc isLetterLegal = GetIsLetterLegalProc(GetDlgCtrlID(hwnd));
through = IsInputLegal(isLetterLegal, (int)cpBegin, wP);
if (!through)
ShowLetterIllegalBalloonTip(hwnd, isLetterLegal);
}
}
return through ? CallWindowProc(DefaultEditCtrlProc, hwnd, msg, wP, lP) : result;
}
inline bool IsLetterLegalHex(char letter)
void ShowLetterIllegalBalloonTip(HWND hwnd, IsLetterLegalProc proc)
{
return letter >= '0' && letter <= '9' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f';
}
wchar_t* title = L"Unacceptable Character";
wchar_t* msg = GetLetterIllegalErrMsg(proc);
inline bool IsLetterLegalHexList(char letter)
{
return IsLetterLegalHex(letter) || letter == ',' || letter == ' ';
}
EDITBALLOONTIP tip;
tip.cbStruct = sizeof(EDITBALLOONTIP);
tip.pszText = msg;
tip.pszTitle = title;
tip.ttiIcon = TTI_ERROR;
SendMessage(hwnd, EM_SHOWBALLOONTIP, 0, (LPARAM)&tip);
inline bool IsLetterLegalCheat(char letter)
{
return letter >= '0' && letter <= ':' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f' || letter == '?';
}
inline bool IsLetterLegalSize(char letter)
{
return letter >= '0' && letter <= '9' || letter == 'm' || letter == 'M' || letter == 'k' || letter == 'K' || letter == 'b' || letter == 'B';
}
inline bool IsLetterLegalDec(char letter)
{
return letter >= '0' && letter <= '9' || letter == '-' || letter == '+';
}
inline bool IsLetterLegalFloat(char letter)
{
return letter >= '0' && letter <= '9' || letter == '.' || letter == '-' || letter == '+';
}
inline bool IsLetterLegalDecHexMixed(char letter)
{
return letter >= '0' && letter <= '9' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f' || letter == '$' || letter == '-' || letter == '+';
}
inline bool IsLetterLegalUnsignedDecHexMixed(char letter)
{
return letter >= '0' && letter <= '9' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f' || letter == '$';
// make a sound
MessageBeep(0xFFFFFFFF);
}

View File

@ -128,19 +128,9 @@ struct HOTKEYMENUINDEX {
void UpdateMenuHotkeys(FCEUMENU_INDEX index);
int GetCurrentContextIndex();
inline bool (*GetIsLetterLegal(UINT id))(char letter);
inline wchar_t* GetLetterIllegalErrMsg(bool(*IsLetterLegal)(char letter));
void ShowLetterIllegalBalloonTip(HWND hwnd, bool(*IsLetterLegal)(char letter));
inline bool IsInputLegal(bool(*IsLetterLegal)(char letter), char letter);
inline bool IsLetterLegalGG(char letter);
inline bool IsLetterLegalHex(char letter);
inline bool IsLetterLegalHexList(char letter);
inline bool IsLetterLegalCheat(char letter);
inline bool IsLetterLegalDec(char letter);
inline bool IsLetterLegalSize(char letter);
inline bool IsLetterLegalFloat(char letter);
inline bool IsLetterLegalDecHexMixed(char letter);
inline bool IsLetterLegalUnsignedDecHexMixed(char letter);
typedef bool (*IsLetterLegalProc)(int index, char ch);
bool IsLetterLegalHex(int index, char letter);
void ShowLetterIllegalBalloonTip(HWND hwnd, IsLetterLegalProc);
extern WNDPROC DefaultEditCtrlProc;
extern LRESULT APIENTRY FilterEditCtrlProc(HWND hDlg, UINT msg, WPARAM wP, LPARAM lP);

View File

@ -431,7 +431,7 @@ FCEUGI *FCEUI_LoadGameVirtual(const char *name, int OverwriteVidMode, bool silen
// currently there's only one situation:
// the user clicked cancel form the open from archive dialog
int userCancel = 0;
fp = FCEU_fopen(name, 0, "rb", 0, -1, romextensions, &userCancel);
fp = FCEU_fopen(name, LoadedRomFNamePatchToUse[0] ? LoadedRomFNamePatchToUse : nullptr, "rb", 0, -1, romextensions, &userCancel);
if (!fp)
{

View File

@ -223,14 +223,23 @@ void FCEU_FDSSelect(void)
FCEU_DispMessage("Disk %d Side %c Selected", 0, SelectDisk >> 1, (SelectDisk & 1) ? 'B' : 'A');
}
#define IRQ_Repeat (IRQa & 0x01)
#define IRQ_Enabled (IRQa & 0x02)
#define IRQ_Repeat 0x01
#define IRQ_Enabled 0x02
static void FDSFix(int a) {
if ((IRQa & IRQ_Enabled) && IRQCount) {
if (IRQa & IRQ_Enabled) {
IRQCount -= a;
if (IRQCount <= 0) {
IRQCount = IRQLatch;
/* Puff Puff Golf notes:
Game freezes while music playing ingame after inserting Disk Side B.
IRQ is usually fired at scanline 169 and 183 for music to work.
At some point after inserting disk B, an IRQ is fired at scanline 174 which
will just freeze game while music plays.
If you ignore triggering IRQ altogether, game plays but no music
*/
X6502_IRQBegin(FCEU_IQEXT);
if (!(IRQa & IRQ_Repeat)) {
IRQa &= ~IRQ_Enabled;
@ -574,21 +583,30 @@ void FDSSoundReset(void) {
static DECLFW(FDSWrite) {
switch (A) {
case 0x4020:
X6502_IRQEnd(FCEU_IQEXT);
IRQLatch &= 0xFF00;
IRQLatch |= V;
break;
case 0x4021:
X6502_IRQEnd(FCEU_IQEXT);
IRQLatch &= 0xFF;
IRQLatch |= V << 8;
break;
case 0x4022:
X6502_IRQEnd(FCEU_IQEXT);
IRQCount = IRQLatch;
IRQa = V & 3;
if (FDSRegs[3] & 1) {
IRQa = V & 0x03;
if (IRQa & IRQ_Enabled) {
IRQCount = IRQLatch;
} else {
X6502_IRQEnd(FCEU_IQEXT);
}
}
break;
case 0x4023:
if (!(V & 0x01)) {
IRQa &= ~IRQ_Enabled;
X6502_IRQEnd(FCEU_IQEXT);
X6502_IRQEnd(FCEU_IQEXT2);
}
break;
case 0x4023: break;
case 0x4024:
if (mapperFDS_diskinsert && ~mapperFDS_control & 0x04) {

View File

@ -69,7 +69,7 @@ void ApplyIPS(FILE *ips, FCEUFILE* fp)
if(!ips) return;
char* buf = (char*)FCEU_dmalloc(fp->size);
char* buf = (char*)FCEU_malloc(fp->size);
memcpy(buf,fp->EnsureMemorystream()->buf(),fp->size);
@ -108,13 +108,7 @@ void ApplyIPS(FILE *ips, FCEUFILE* fp)
if((offset+size)>(uint32)fp->size)
{
// Probably a little slow.
char *newbuf=(char *)realloc(buf,offset+size);
if(!newbuf)
{
free(buf); buf=NULL;
FCEU_printf(" Oops. IPS patch %d(type RLE) goes beyond end of file. Could not allocate memory.\n",count);
goto end;
}
char *newbuf=(char *)FCEU_realloc(buf,offset+size);
buf=newbuf;
memset(buf+fp->size,0,offset+size-fp->size);
fp->size=offset+size;
@ -133,15 +127,10 @@ void ApplyIPS(FILE *ips, FCEUFILE* fp)
if((offset+size)>(uint32)fp->size)
{
// Probably a little slow.
char *newbuf=(char *)realloc(buf,offset+size);
if(!newbuf)
{
free(buf); buf=NULL;
FCEU_printf(" Oops. IPS patch %d(type normal) goes beyond end of file. Could not allocate memory.\n",count);
goto end;
}
char *newbuf=(char *)FCEU_realloc(buf,offset+size);
buf=newbuf;
memset(buf+fp->size,0,offset+size-fp->size);
fp->size=offset+size;
}
fread(buf+offset,1,size,ips);
}
@ -495,7 +484,7 @@ void FCEUI_SetDirOverride(int which, char *n)
va_list ap;
int ret;
if(!(*strp=(char*)FCEU_dmalloc(2048))) //mbg merge 7/17/06 cast to char*
if(!(*strp=(char*)FCEU_malloc(2048))) //mbg merge 7/17/06 cast to char*
return(0);
va_start(ap,fmt);
ret=vsnprintf(*strp,2048,fmt,ap);

View File

@ -54,9 +54,11 @@ iNES_HEADER head;
static CartInfo iNESCart;
uint8 Mirroring = 0;
uint8 MirroringAs2bits = 0;
uint32 ROM_size = 0;
uint32 VROM_size = 0;
char LoadedRomFName[2048]; //mbg merge 7/17/06 added
char LoadedRomFNamePatchToUse[2048];
static int CHRRAMSize = -1;
static int iNES_Init(int num);
@ -107,11 +109,11 @@ void iNESGI(GI h) { //bbit edited: removed static keyword
if (iNESCart.Close)
iNESCart.Close();
if (ROM) {
free(ROM);
FCEU_free(ROM);
ROM = NULL;
}
if (VROM) {
free(VROM);
FCEU_free(VROM);
VROM = NULL;
}
if (trainerpoo) {
@ -673,7 +675,7 @@ BMAPPINGLocal bmap[] = {
{"", 215, UNL8237_Init},
{"", 216, Mapper216_Init},
{"", 217, Mapper217_Init}, // Redefined to a new Discrete BMC mapper
// {"", 218, Mapper218_Init},
{"", 218, Mapper218_Init},
{"UNLA9746", 219, UNLA9746_Init},
{"Debug Mapper", 220, QTAi_Init},
{"UNLN625092", 221, UNLN625092_Init},
@ -766,6 +768,9 @@ int iNESLoad(const char *name, FCEUFILE *fp, int OverwriteVidMode) {
} else
Mirroring = (head.ROM_type & 1);
MirroringAs2bits = head.ROM_type & 1;
if (head.ROM_type & 8) MirroringAs2bits |= 2;
int not_round_size;
if (!iNES2) {
not_round_size = head.ROM_size;
@ -809,17 +814,11 @@ int iNESLoad(const char *name, FCEUFILE *fp, int OverwriteVidMode) {
}
}
if ((ROM = (uint8*)FCEU_malloc(ROM_size << 14)) == NULL)
return 0;
ROM = (uint8*)FCEU_malloc(ROM_size << 14);
memset(ROM, 0xFF, ROM_size << 14);
if (VROM_size) {
if ((VROM = (uint8*)FCEU_malloc(VROM_size << 13)) == NULL) {
free(ROM);
ROM = NULL;
FCEU_PrintError("Unable to allocate memory.");
return LOADER_HANDLED_ERROR;
}
VROM = (uint8*)FCEU_malloc(VROM_size << 13);
memset(VROM, 0xFF, VROM_size << 13);
}
@ -918,6 +917,7 @@ int iNESLoad(const char *name, FCEUFILE *fp, int OverwriteVidMode) {
iNESCart.battery = (head.ROM_type & 2) ? 1 : 0;
iNESCart.mirror = Mirroring;
iNESCart.mirrorAs2Bits = MirroringAs2bits;
int result = iNES_Init(MapperNo);
switch(result)

View File

@ -43,9 +43,11 @@ extern uint8 *VROM;
extern uint32 VROM_size;
extern uint32 ROM_size;
extern uint8 *ExtraNTARAM;
extern uint8 **VPageR;
extern int iNesSave(void); //bbit Edited: line added
extern int iNesSaveAs(const char* name);
extern char LoadedRomFName[2048]; //bbit Edited: line added
extern char LoadedRomFNamePatchToUse[2048];
extern char *iNesShortFName(void);
extern const TMasterRomInfo* MasterRomInfo;
extern TMasterRomInfoParams MasterRomInfoParams;
@ -242,6 +244,7 @@ void Mapper213_Init(CartInfo *);
void Mapper214_Init(CartInfo *);
void Mapper216_Init(CartInfo *);
void Mapper217_Init(CartInfo *);
void Mapper218_Init(CartInfo *);
void Mapper220_Init(CartInfo *);
void Mapper222_Init(CartInfo *);
void Mapper225_Init(CartInfo *);

View File

@ -798,6 +798,7 @@ static void RamSearchOpLTE(void);
static void RamSearchOpGTE(void);
static void RamSearchOpEQ(void);
static void RamSearchOpNE(void);
static void ToggleCheats(void);
static void DebuggerStepInto(void);
static void FA_SkipLag(void);
static void OpenRom(void);
@ -945,6 +946,7 @@ struct EMUCMDTABLE FCEUI_CommandTable[]=
{ EMUCMD_TOOL_RAMSEARCHGTE, EMUCMDTYPE_TOOL, RamSearchOpGTE, 0, 0, "Ram Search - Greater Than or Equal", 0},
{ EMUCMD_TOOL_RAMSEARCHEQ, EMUCMDTYPE_TOOL, RamSearchOpEQ, 0, 0, "Ram Search - Equal", 0},
{ EMUCMD_TOOL_RAMSEARCHNE, EMUCMDTYPE_TOOL, RamSearchOpNE, 0, 0, "Ram Search - Not Equal", 0},
{ EMUCMD_TOOL_TOGGLECHEATS, EMUCMDTYPE_TOOL, ToggleCheats, 0, 0, "Toggle Cheats", 0},
{ EMUCMD_RERECORD_DISPLAY_TOGGLE, EMUCMDTYPE_MISC, FCEUI_MovieToggleRerecordDisplay,0, 0, "Toggle Rerecord Display", EMUCMDFLAG_TASEDITOR },
{ EMUCMD_TASEDITOR_REWIND, EMUCMDTYPE_TASEDITOR, TaseditorRewindOn, TaseditorRewindOff, 0, "Frame Rewind", EMUCMDFLAG_TASEDITOR },
@ -1268,6 +1270,18 @@ static void RamSearchOpNE(void) {
#endif
}
extern int globalCheatDisabled;
extern unsigned int FrozenAddressCount;
static void ToggleCheats()
{
FCEUI_GlobalToggleCheat(globalCheatDisabled);
FCEU_DispMessage("%d cheats active", 0, FrozenAddressCount);
#ifdef __WIN_DRIVER__
UpdateCheatRelatedWindow();
UpdateCheatListGroupBoxUI();
#endif
}
static void DebuggerStepInto()
{
#ifdef __WIN_DRIVER__

View File

@ -259,6 +259,8 @@ enum EMUCMD
EMUCMD_MOVIE_RECORD_MODE_OVERWRITE,
EMUCMD_MOVIE_RECORD_MODE_INSERT,
EMUCMD_TOOL_TOGGLECHEATS,
EMUCMD_MAX
};

View File

@ -54,6 +54,9 @@ extern TASEDITOR_LUA taseditor_lua;
#ifdef __SDL__
#ifdef __QT_DRIVER__
#include "drivers/Qt/sdl.h"
#include "drivers/Qt/main.h"
#include "drivers/Qt/input.h"
#include "drivers/Qt/fceuWrapper.h"
#include "drivers/Qt/TasEditor/selection.h"
#include "drivers/Qt/TasEditor/laglog.h"
@ -773,7 +776,7 @@ static int emu_delgamegenie(lua_State *L) {
int GGaddr, GGcomp, GGval;
uint32 i=0;
char * Cname;
std::string Cname;
uint32 Caddr;
uint8 Cval;
int Ccompare, Ctype;
@ -786,7 +789,7 @@ static int emu_delgamegenie(lua_State *L) {
while (FCEUI_GetCheat(i,&Cname,&Caddr,&Cval,&Ccompare,NULL,&Ctype)) {
if ((!strcmp(msg,Cname)) && (GGaddr == Caddr) && (GGval == Cval) && (GGcomp == Ccompare) && (Ctype == 1)) {
if ((Cname == msg) && (GGaddr == Caddr) && (GGval == Cval) && (GGcomp == Ccompare) && (Ctype == 1)) {
// Delete cheat code
if (FCEUI_DelCheat(i)) {
lua_pushboolean(L, true);
@ -2638,6 +2641,113 @@ static int input_get(lua_State *L) {
}
}
}
#elif defined(__QT_DRIVER__)
// Qt/SDL
{
const uint8_t *keyBuf = QtSDL_getKeyboardState(nullptr);
if (keyBuf)
{
int i=0;
char keyName[64];
const char *keyOut = nullptr;
for (int i=0; i<SDL_NUM_SCANCODES; i++)
{
if (keyBuf[i])
{
SDL_Keycode k = SDL_GetKeyFromScancode( static_cast<SDL_Scancode>(i) );
const char* name = SDL_GetKeyName(k);
//printf("Key:%i '%s'\n", i, name);
if ( isalpha(name[0]) || isdigit(name[0]) )
{ // If name starts with letters or number, copy name without spaces
int ii=0, jj=0;
while (name[ii] != 0)
{
if ( isalpha(name[ii]) || isdigit(name[ii]) || (name[ii] == '_') )
{
keyName[jj] = name[ii]; jj++;
}
ii++;
}
keyName[jj] = 0;
keyOut = keyName;
}
else
{ // Handle special char names
switch (name[0])
{
case '[':
keyOut = "LeftBracket";
break;
case ']':
keyOut = "RightBracket";
break;
case '{':
keyOut = "LeftBrace";
break;
case '}':
keyOut = "RightBrace";
break;
case ',':
keyOut = "Comma";
break;
case '.':
keyOut = "Period";
break;
case '~':
keyOut = "Tilde";
break;
case '`':
keyOut = "Backtick";
break;
case '|':
keyOut = "VerticalBar";
break;
case '/':
keyOut = "Slash";
break;
case '\\':
keyOut = "BackSlash";
break;
case '+':
keyOut = "Plus";
break;
case '=':
keyOut = "Equals";
break;
case '_':
keyOut = "Underscore";
break;
case '-':
keyOut = "Minus";
break;
case ';':
keyOut = "SemiColon";
break;
case ':':
keyOut = "Colon";
break;
case '\'':
case '\"':
keyOut = "Quote";
break;
default:
keyOut = name;
break;
}
}
lua_pushboolean(L, true);
lua_setfield(L, -2, keyOut);
}
}
}
}
#else
//SDL TODO: implement this for keyboard!!
#endif

View File

@ -409,6 +409,7 @@ MovieData::MovieData()
, rerecordCount(0)
, binaryFlag(false)
, loadFrameCount(-1)
, fourscore(false)
, microphone(false)
, RAMInitOption(0)
, RAMInitSeed(0)

View File

@ -4,6 +4,9 @@
#define EMPTY_PALETTE_64 EMPTY_PALETTE_16 EMPTY_PALETTE_16 EMPTY_PALETTE_16 EMPTY_PALETTE_16
#define EMPTY_PALETTE_DEEMPH_X_7 EMPTY_PALETTE_64 EMPTY_PALETTE_64 EMPTY_PALETTE_64 EMPTY_PALETTE_64 EMPTY_PALETTE_64 EMPTY_PALETTE_64 EMPTY_PALETTE_64
//this assumes the color is already shifted <<2, as it is in these cases
#define P64RPC(x) ( ((x)&~3) | (((x)>>6)&3))
pal rp2c04001[512] = {
#include "rp2c04001.h"
EMPTY_PALETTE_DEEMPH_X_7
@ -23,12 +26,14 @@ pal rp2c05004[512] = {
EMPTY_PALETTE_DEEMPH_X_7
};
#undef P64RPC
// Fixed palette entries used by the GUI
pal palette_unvarying[] = {
{ 0x00<<2,0x00<<2,0x00<<2}, // 0 = Black
{ 0x3F<<2,0x3F<<2,0x34<<2}, // 1 = White
{ 0x00<<2,0x00<<2,0x00<<2}, // 2 = Black
{ 0x1d<<2,0x1d<<2,0x24<<2}, // 3 = Greyish
{ 0x00,0x00,0x00}, // 0 = Black
{ 0xFF,0xFF,0xD3}, // 1 = White
{ 0x00,0x00,0x00}, // 2 = Black
{ 0x75,0x75,0x92}, // 3 = Greyish
{ 190, 0, 0}, // 4 = Reddish
{ 51,255, 51}, // 5 = Bright green
{ 49, 14,200}, // 6 = Ultramarine Blue
@ -52,73 +57,76 @@ pal palette_unvarying[] = {
};
#define P64(x) (((x)<<2)|((x>>4)&3))
// Default palette
pal palette[512] = {
{ P64(0x1D), P64(0x1D), P64(0x1D)}, /* Value 0 */
{ P64(0x09), P64(0x06), P64(0x23)}, /* Value 1 */
{ P64(0x00), P64(0x00), P64(0x2A)}, /* Value 2 */
{ P64(0x11), P64(0x00), P64(0x27)}, /* Value 3 */
{ P64(0x23), P64(0x00), P64(0x1D)}, /* Value 4 */
{ P64(0x2A), P64(0x00), P64(0x04)}, /* Value 5 */
{ P64(0x29), P64(0x00), P64(0x00)}, /* Value 6 */
{ P64(0x1F), P64(0x02), P64(0x00)}, /* Value 7 */
{ P64(0x10), P64(0x0B), P64(0x00)}, /* Value 8 */
{ P64(0x00), P64(0x11), P64(0x00)}, /* Value 9 */
{ P64(0x00), P64(0x14), P64(0x00)}, /* Value 10 */
{ P64(0x00), P64(0x0F), P64(0x05)}, /* Value 11 */
{ P64(0x06), P64(0x0F), P64(0x17)}, /* Value 12 */
{ P64(0x00), P64(0x00), P64(0x00)}, /* Value 13 */
{ P64(0x00), P64(0x00), P64(0x00)}, /* Value 14 */
{ P64(0x00), P64(0x00), P64(0x00)}, /* Value 15 */
{ P64(0x2F), P64(0x2F), P64(0x2F)}, /* Value 16 */
{ P64(0x00), P64(0x1C), P64(0x3B)}, /* Value 17 */
{ P64(0x08), P64(0x0E), P64(0x3B)}, /* Value 18 */
{ P64(0x20), P64(0x00), P64(0x3C)}, /* Value 19 */
{ P64(0x2F), P64(0x00), P64(0x2F)}, /* Value 20 */
{ P64(0x39), P64(0x00), P64(0x16)}, /* Value 21 */
{ P64(0x36), P64(0x0A), P64(0x00)}, /* Value 22 */
{ P64(0x32), P64(0x13), P64(0x03)}, /* Value 23 */
{ P64(0x22), P64(0x1C), P64(0x00)}, /* Value 24 */
{ P64(0x00), P64(0x25), P64(0x00)}, /* Value 25 */
{ P64(0x00), P64(0x2A), P64(0x00)}, /* Value 26 */
{ P64(0x00), P64(0x24), P64(0x0E)}, /* Value 27 */
{ P64(0x00), P64(0x20), P64(0x22)}, /* Value 28 */
{ P64(0x00), P64(0x00), P64(0x00)}, /* Value 29 */
{ P64(0x00), P64(0x00), P64(0x00)}, /* Value 30 */
{ P64(0x00), P64(0x00), P64(0x00)}, /* Value 31 */
{ P64(0x3F), P64(0x3F), P64(0x3F)}, /* Value 32 */
{ P64(0x0F), P64(0x2F), P64(0x3F)}, /* Value 33 */
{ P64(0x17), P64(0x25), P64(0x3F)}, /* Value 34 */
{ P64(0x33), P64(0x22), P64(0x3F)}, /* Value 35 */
{ P64(0x3D), P64(0x1E), P64(0x3F)}, /* Value 36 */
{ P64(0x3F), P64(0x1D), P64(0x2D)}, /* Value 37 */
{ P64(0x3F), P64(0x1D), P64(0x18)}, /* Value 38 */
{ P64(0x3F), P64(0x26), P64(0x0E)}, /* Value 39 */
{ P64(0x3C), P64(0x2F), P64(0x0F)}, /* Value 40 */
{ P64(0x20), P64(0x34), P64(0x04)}, /* Value 41 */
{ P64(0x13), P64(0x37), P64(0x12)}, /* Value 42 */
{ P64(0x16), P64(0x3E), P64(0x26)}, /* Value 43 */
{ P64(0x00), P64(0x3A), P64(0x36)}, /* Value 44 */
{ P64(0x1E), P64(0x1E), P64(0x1E)}, /* Value 45 */
{ P64(0x00), P64(0x00), P64(0x00)}, /* Value 46 */
{ P64(0x00), P64(0x00), P64(0x00)}, /* Value 47 */
{ P64(0x3F), P64(0x3F), P64(0x3F)}, /* Value 48 */
{ P64(0x2A), P64(0x39), P64(0x3F)}, /* Value 49 */
{ P64(0x31), P64(0x35), P64(0x3F)}, /* Value 50 */
{ P64(0x35), P64(0x32), P64(0x3F)}, /* Value 51 */
{ P64(0x3F), P64(0x31), P64(0x3F)}, /* Value 52 */
{ P64(0x3F), P64(0x31), P64(0x36)}, /* Value 53 */
{ P64(0x3F), P64(0x2F), P64(0x2C)}, /* Value 54 */
{ P64(0x3F), P64(0x36), P64(0x2A)}, /* Value 55 */
{ P64(0x3F), P64(0x39), P64(0x28)}, /* Value 56 */
{ P64(0x38), P64(0x3F), P64(0x28)}, /* Value 57 */
{ P64(0x2A), P64(0x3C), P64(0x2F)}, /* Value 58 */
{ P64(0x2C), P64(0x3F), P64(0x33)}, /* Value 59 */
{ P64(0x27), P64(0x3F), P64(0x3C)}, /* Value 60 */
{ P64(0x31), P64(0x31), P64(0x31)}, /* Value 61 */
{ P64(0x00), P64(0x00), P64(0x00)}, /* Value 62 */
{ P64(0x00), P64(0x00), P64(0x00)}, /* Value 63 */
{ 0x1D<<2, 0x1D<<2, 0x1D<<2 }, /* Value 0 */
{ 0x09<<2, 0x06<<2, 0x23<<2 }, /* Value 1 */
{ 0x00<<2, 0x00<<2, 0x2A<<2 }, /* Value 2 */
{ 0x11<<2, 0x00<<2, 0x27<<2 }, /* Value 3 */
{ 0x23<<2, 0x00<<2, 0x1D<<2 }, /* Value 4 */
{ 0x2A<<2, 0x00<<2, 0x04<<2 }, /* Value 5 */
{ 0x29<<2, 0x00<<2, 0x00<<2 }, /* Value 6 */
{ 0x1F<<2, 0x02<<2, 0x00<<2 }, /* Value 7 */
{ 0x10<<2, 0x0B<<2, 0x00<<2 }, /* Value 8 */
{ 0x00<<2, 0x11<<2, 0x00<<2 }, /* Value 9 */
{ 0x00<<2, 0x14<<2, 0x00<<2 }, /* Value 10 */
{ 0x00<<2, 0x0F<<2, 0x05<<2 }, /* Value 11 */
{ 0x06<<2, 0x0F<<2, 0x17<<2 }, /* Value 12 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 13 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 14 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 15 */
{ 0x2F<<2, 0x2F<<2, 0x2F<<2 }, /* Value 16 */
{ 0x00<<2, 0x1C<<2, 0x3B<<2 }, /* Value 17 */
{ 0x08<<2, 0x0E<<2, 0x3B<<2 }, /* Value 18 */
{ 0x20<<2, 0x00<<2, 0x3C<<2 }, /* Value 19 */
{ 0x2F<<2, 0x00<<2, 0x2F<<2 }, /* Value 20 */
{ 0x39<<2, 0x00<<2, 0x16<<2 }, /* Value 21 */
{ 0x36<<2, 0x0A<<2, 0x00<<2 }, /* Value 22 */
{ 0x32<<2, 0x13<<2, 0x03<<2 }, /* Value 23 */
{ 0x22<<2, 0x1C<<2, 0x00<<2 }, /* Value 24 */
{ 0x00<<2, 0x25<<2, 0x00<<2 }, /* Value 25 */
{ 0x00<<2, 0x2A<<2, 0x00<<2 }, /* Value 26 */
{ 0x00<<2, 0x24<<2, 0x0E<<2 }, /* Value 27 */
{ 0x00<<2, 0x20<<2, 0x22<<2 }, /* Value 28 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 29 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 30 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 31 */
{ 0x3F<<2, 0x3F<<2, 0x3F<<2 }, /* Value 32 */
{ 0x0F<<2, 0x2F<<2, 0x3F<<2 }, /* Value 33 */
{ 0x17<<2, 0x25<<2, 0x3F<<2 }, /* Value 34 */
{ 0x33<<2, 0x22<<2, 0x3F<<2 }, /* Value 35 */
{ 0x3D<<2, 0x1E<<2, 0x3F<<2 }, /* Value 36 */
{ 0x3F<<2, 0x1D<<2, 0x2D<<2 }, /* Value 37 */
{ 0x3F<<2, 0x1D<<2, 0x18<<2 }, /* Value 38 */
{ 0x3F<<2, 0x26<<2, 0x0E<<2 }, /* Value 39 */
{ 0x3C<<2, 0x2F<<2, 0x0F<<2 }, /* Value 40 */
{ 0x20<<2, 0x34<<2, 0x04<<2 }, /* Value 41 */
{ 0x13<<2, 0x37<<2, 0x12<<2 }, /* Value 42 */
{ 0x16<<2, 0x3E<<2, 0x26<<2 }, /* Value 43 */
{ 0x00<<2, 0x3A<<2, 0x36<<2 }, /* Value 44 */
{ 0x1E<<2, 0x1E<<2, 0x1E<<2 }, /* Value 45 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 46 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 47 */
{ 0x3F<<2, 0x3F<<2, 0x3F<<2 }, /* Value 48 */
{ 0x2A<<2, 0x39<<2, 0x3F<<2 }, /* Value 49 */
{ 0x31<<2, 0x35<<2, 0x3F<<2 }, /* Value 50 */
{ 0x35<<2, 0x32<<2, 0x3F<<2 }, /* Value 51 */
{ 0x3F<<2, 0x31<<2, 0x3F<<2 }, /* Value 52 */
{ 0x3F<<2, 0x31<<2, 0x36<<2 }, /* Value 53 */
{ 0x3F<<2, 0x2F<<2, 0x2C<<2 }, /* Value 54 */
{ 0x3F<<2, 0x36<<2, 0x2A<<2 }, /* Value 55 */
{ 0x3F<<2, 0x39<<2, 0x28<<2 }, /* Value 56 */
{ 0x38<<2, 0x3F<<2, 0x28<<2 }, /* Value 57 */
{ 0x2A<<2, 0x3C<<2, 0x2F<<2 }, /* Value 58 */
{ 0x2C<<2, 0x3F<<2, 0x33<<2 }, /* Value 59 */
{ 0x27<<2, 0x3F<<2, 0x3C<<2 }, /* Value 60 */
{ 0x31<<2, 0x31<<2, 0x31<<2 }, /* Value 61 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 62 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 63 */
#undef P64
//luke's .16+ palette
//{0x60, 0x60, 0x60}, /* Value 0 */

View File

@ -1,64 +1,64 @@
{0xfc, 0xc4, 0xd8},
{0x40, 0x88, 0xfc},
{0xd8, 0x28, 0x00},
{0x5c, 0x94, 0xfc},
{0x00, 0x80, 0x88},
{0x00, 0x44, 0x00},
{0x00, 0x00, 0x00},
{0xe4, 0x00, 0x58},
{0xfc, 0xfc, 0xfc},
{0x74, 0x74, 0x74},
{0xfc, 0x98, 0x38},
{0xa8, 0x00, 0x10},
{0x8c, 0x00, 0x74},
{0xfc, 0x98, 0x38},
{0x40, 0x2c, 0x00},
{0xfc, 0xfc, 0xfc},
{0x3c, 0xbc, 0xfc},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x80, 0xd0, 0x10},
{0x9c, 0xfc, 0xf0},
{0xc4, 0xd4, 0xfc},
{0xfc, 0xbc, 0xb0},
{0x20, 0x38, 0xec},
{0x00, 0x00, 0x00},
{0x58, 0xf8, 0x98},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0xfc, 0xfc, 0xfc},
{0xbc, 0xbc, 0xbc},
{0xf4, 0x78, 0xfc},
{0x24, 0x18, 0x8c},
{0x00, 0x00, 0x00},
{0xa8, 0xe4, 0xfc},
{0x00, 0x00, 0x00},
{0x4c, 0xdc, 0x48},
{0x00, 0xe8, 0xd8},
{0x18, 0x3c, 0x5c},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x7c, 0x08, 0x00},
{0xfc, 0xc4, 0xfc},
{0xa4, 0x00, 0x00},
{0x80, 0x00, 0xf0},
{0x00, 0x00, 0xa8},
{0xfc, 0x74, 0x60},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x94, 0x00},
{0xbc, 0xbc, 0xbc},
{0x00, 0x50, 0x00},
{0xe0, 0xfc, 0xa0},
{0x00, 0x00, 0x00},
{0xfc, 0xd8, 0xa8},
{0xc8, 0x4c, 0x0c},
{0x00, 0x00, 0x00},
{0x00, 0x70, 0xec},
{0x00, 0x44, 0x00},
{0x00, 0x00, 0x00},
{0xe0, 0xfc, 0xa0},
{0xfc, 0x74, 0xb4},
{0x88, 0x70, 0x00},
{0x00, 0x00, 0x00},
{P64RPC(0xfc), P64RPC(0xc4), P64RPC(0xd8)},
{P64RPC(0x40), P64RPC(0x88), P64RPC(0xfc)},
{P64RPC(0xd8), P64RPC(0x28), P64RPC(0x00)},
{P64RPC(0x5c), P64RPC(0x94), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x80), P64RPC(0x88)},
{P64RPC(0x00), P64RPC(0x44), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xe4), P64RPC(0x00), P64RPC(0x58)},
{P64RPC(0xfc), P64RPC(0xfc), P64RPC(0xfc)},
{P64RPC(0x74), P64RPC(0x74), P64RPC(0x74)},
{P64RPC(0xfc), P64RPC(0x98), P64RPC(0x38)},
{P64RPC(0xa8), P64RPC(0x00), P64RPC(0x10)},
{P64RPC(0x8c), P64RPC(0x00), P64RPC(0x74)},
{P64RPC(0xfc), P64RPC(0x98), P64RPC(0x38)},
{P64RPC(0x40), P64RPC(0x2c), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xfc), P64RPC(0xfc)},
{P64RPC(0x3c), P64RPC(0xbc), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x80), P64RPC(0xd0), P64RPC(0x10)},
{P64RPC(0x9c), P64RPC(0xfc), P64RPC(0xf0)},
{P64RPC(0xc4), P64RPC(0xd4), P64RPC(0xfc)},
{P64RPC(0xfc), P64RPC(0xbc), P64RPC(0xb0)},
{P64RPC(0x20), P64RPC(0x38), P64RPC(0xec)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x58), P64RPC(0xf8), P64RPC(0x98)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xfc), P64RPC(0xfc)},
{P64RPC(0xbc), P64RPC(0xbc), P64RPC(0xbc)},
{P64RPC(0xf4), P64RPC(0x78), P64RPC(0xfc)},
{P64RPC(0x24), P64RPC(0x18), P64RPC(0x8c)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xa8), P64RPC(0xe4), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x4c), P64RPC(0xdc), P64RPC(0x48)},
{P64RPC(0x00), P64RPC(0xe8), P64RPC(0xd8)},
{P64RPC(0x18), P64RPC(0x3c), P64RPC(0x5c)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x7c), P64RPC(0x08), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xc4), P64RPC(0xfc)},
{P64RPC(0xa4), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x80), P64RPC(0x00), P64RPC(0xf0)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0xa8)},
{P64RPC(0xfc), P64RPC(0x74), P64RPC(0x60)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x94), P64RPC(0x00)},
{P64RPC(0xbc), P64RPC(0xbc), P64RPC(0xbc)},
{P64RPC(0x00), P64RPC(0x50), P64RPC(0x00)},
{P64RPC(0xe0), P64RPC(0xfc), P64RPC(0xa0)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xd8), P64RPC(0xa8)},
{P64RPC(0xc8), P64RPC(0x4c), P64RPC(0x0c)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x70), P64RPC(0xec)},
{P64RPC(0x00), P64RPC(0x44), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xe0), P64RPC(0xfc), P64RPC(0xa0)},
{P64RPC(0xfc), P64RPC(0x74), P64RPC(0xb4)},
{P64RPC(0x88), P64RPC(0x70), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},

View File

@ -1,64 +1,64 @@
{0x00, 0x00, 0x00},
{0xfc, 0x98, 0x38},
{0x88, 0x70, 0x00},
{0x00, 0x00, 0x00},
{0xa8, 0xf0, 0xbc},
{0xfc, 0x74, 0xb4},
{0x00, 0x00, 0x00},
{0xa8, 0xe4, 0xfc},
{0xd8, 0x28, 0x00},
{0x80, 0x00, 0xf0},
{0xfc, 0xe4, 0xa0},
{0xfc, 0xc4, 0xfc},
{0xfc, 0xfc, 0xfc},
{0x40, 0x88, 0xfc},
{0x00, 0x00, 0x00},
{0x00, 0x3c, 0x14},
{0x00, 0x00, 0x00},
{0x3c, 0xbc, 0xfc},
{0xa4, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x90, 0x38},
{0x80, 0xd0, 0x10},
{0x00, 0x00, 0x00},
{0x5c, 0x94, 0xfc},
{0x00, 0x00, 0x00},
{0xf4, 0x78, 0xfc},
{0x00, 0x00, 0x00},
{0x58, 0xf8, 0x98},
{0x00, 0x00, 0x00},
{0x40, 0x2c, 0x00},
{0x00, 0x00, 0x00},
{0x44, 0x00, 0x9c},
{0x00, 0x00, 0x00},
{0xfc, 0xbc, 0xb0},
{0xfc, 0x74, 0x60},
{0xd4, 0xc8, 0xfc},
{0x00, 0x70, 0xec},
{0x00, 0x00, 0x00},
{0xbc, 0xbc, 0xbc},
{0x00, 0x00, 0xa8},
{0xbc, 0x00, 0xbc},
{0x00, 0x00, 0x00},
{0x74, 0x74, 0x74},
{0x00, 0x44, 0x00},
{0x20, 0x38, 0xec},
{0x00, 0x00, 0x00},
{0xfc, 0xd8, 0xa8},
{0xfc, 0xfc, 0xfc},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x4c, 0xdc, 0x48},
{0xc8, 0x4c, 0x0c},
{0x18, 0x3c, 0x5c},
{0x24, 0x18, 0x8c},
{0xe4, 0x00, 0x58},
{0x00, 0x94, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0xe8, 0xd8},
{0x7c, 0x08, 0x00},
{0xfc, 0xd8, 0xa8},
{0x00, 0x00, 0x00},
{0xa8, 0x00, 0x10},
{0x00, 0x50, 0x00},
{0x74, 0x74, 0x74},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0x98), P64RPC(0x38)},
{P64RPC(0x88), P64RPC(0x70), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xa8), P64RPC(0xf0), P64RPC(0xbc)},
{P64RPC(0xfc), P64RPC(0x74), P64RPC(0xb4)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xa8), P64RPC(0xe4), P64RPC(0xfc)},
{P64RPC(0xd8), P64RPC(0x28), P64RPC(0x00)},
{P64RPC(0x80), P64RPC(0x00), P64RPC(0xf0)},
{P64RPC(0xfc), P64RPC(0xe4), P64RPC(0xa0)},
{P64RPC(0xfc), P64RPC(0xc4), P64RPC(0xfc)},
{P64RPC(0xfc), P64RPC(0xfc), P64RPC(0xfc)},
{P64RPC(0x40), P64RPC(0x88), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x3c), P64RPC(0x14)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x3c), P64RPC(0xbc), P64RPC(0xfc)},
{P64RPC(0xa4), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x90), P64RPC(0x38)},
{P64RPC(0x80), P64RPC(0xd0), P64RPC(0x10)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x5c), P64RPC(0x94), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xf4), P64RPC(0x78), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x58), P64RPC(0xf8), P64RPC(0x98)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x40), P64RPC(0x2c), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x44), P64RPC(0x00), P64RPC(0x9c)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xbc), P64RPC(0xb0)},
{P64RPC(0xfc), P64RPC(0x74), P64RPC(0x60)},
{P64RPC(0xd4), P64RPC(0xc8), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x70), P64RPC(0xec)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xbc), P64RPC(0xbc), P64RPC(0xbc)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0xa8)},
{P64RPC(0xbc), P64RPC(0x00), P64RPC(0xbc)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x74), P64RPC(0x74), P64RPC(0x74)},
{P64RPC(0x00), P64RPC(0x44), P64RPC(0x00)},
{P64RPC(0x20), P64RPC(0x38), P64RPC(0xec)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xd8), P64RPC(0xa8)},
{P64RPC(0xfc), P64RPC(0xfc), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x4c), P64RPC(0xdc), P64RPC(0x48)},
{P64RPC(0xc8), P64RPC(0x4c), P64RPC(0x0c)},
{P64RPC(0x18), P64RPC(0x3c), P64RPC(0x5c)},
{P64RPC(0x24), P64RPC(0x18), P64RPC(0x8c)},
{P64RPC(0xe4), P64RPC(0x00), P64RPC(0x58)},
{P64RPC(0x00), P64RPC(0x94), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0xe8), P64RPC(0xd8)},
{P64RPC(0x7c), P64RPC(0x08), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xd8), P64RPC(0xa8)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xa8), P64RPC(0x00), P64RPC(0x10)},
{P64RPC(0x00), P64RPC(0x50), P64RPC(0x00)},
{P64RPC(0x74), P64RPC(0x74), P64RPC(0x74)},

View File

@ -1,64 +1,64 @@
{0x44, 0x00, 0x9c},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x74, 0x74, 0x74},
{0x00, 0xa8, 0x00},
{0xfc, 0xfc, 0xfc},
{0xa8, 0xe4, 0xfc},
{0x00, 0x44, 0x00},
{0x24, 0x18, 0x8c},
{0x00, 0x00, 0x00},
{0xfc, 0xbc, 0xb0},
{0x40, 0x2c, 0x00},
{0xe4, 0x00, 0x58},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0xfc, 0xfc, 0xfc},
{0x5c, 0x94, 0xfc},
{0x00, 0x80, 0x88},
{0x00, 0x00, 0x00},
{0x20, 0x38, 0xec},
{0x00, 0x94, 0x00},
{0x88, 0x70, 0x00},
{0xc8, 0x4c, 0x0c},
{0x00, 0x90, 0x38},
{0x74, 0x74, 0x74},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0xa8},
{0xd8, 0x28, 0x00},
{0xa4, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0xfc, 0xc4, 0xd8},
{0x40, 0x88, 0xfc},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0xfc, 0xd8, 0xa8},
{0x00, 0x00, 0x00},
{0xfc, 0x98, 0x38},
{0xfc, 0x74, 0x60},
{0xfc, 0xfc, 0xfc},
{0x80, 0xd0, 0x10},
{0x00, 0x00, 0x00},
{0x3c, 0xbc, 0xfc},
{0xf4, 0x78, 0xfc},
{0x00, 0x70, 0xec},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0xe8, 0xd8},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x7c, 0x08, 0x00},
{0x4c, 0xdc, 0x48},
{0xf0, 0xbc, 0x3c},
{0x00, 0x00, 0x00},
{0x00, 0x50, 0x00},
{0x00, 0x00, 0x00},
{0xc4, 0xd4, 0xfc},
{0xfc, 0xd8, 0xa8},
{0x80, 0x00, 0xf0},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x18, 0x3c, 0x5c},
{P64RPC(0x44), P64RPC(0x00), P64RPC(0x9c)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x74), P64RPC(0x74), P64RPC(0x74)},
{P64RPC(0x00), P64RPC(0xa8), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xfc), P64RPC(0xfc)},
{P64RPC(0xa8), P64RPC(0xe4), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x44), P64RPC(0x00)},
{P64RPC(0x24), P64RPC(0x18), P64RPC(0x8c)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xbc), P64RPC(0xb0)},
{P64RPC(0x40), P64RPC(0x2c), P64RPC(0x00)},
{P64RPC(0xe4), P64RPC(0x00), P64RPC(0x58)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xfc), P64RPC(0xfc)},
{P64RPC(0x5c), P64RPC(0x94), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x80), P64RPC(0x88)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x20), P64RPC(0x38), P64RPC(0xec)},
{P64RPC(0x00), P64RPC(0x94), P64RPC(0x00)},
{P64RPC(0x88), P64RPC(0x70), P64RPC(0x00)},
{P64RPC(0xc8), P64RPC(0x4c), P64RPC(0x0c)},
{P64RPC(0x00), P64RPC(0x90), P64RPC(0x38)},
{P64RPC(0x74), P64RPC(0x74), P64RPC(0x74)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0xa8)},
{P64RPC(0xd8), P64RPC(0x28), P64RPC(0x00)},
{P64RPC(0xa4), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xc4), P64RPC(0xd8)},
{P64RPC(0x40), P64RPC(0x88), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xd8), P64RPC(0xa8)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0x98), P64RPC(0x38)},
{P64RPC(0xfc), P64RPC(0x74), P64RPC(0x60)},
{P64RPC(0xfc), P64RPC(0xfc), P64RPC(0xfc)},
{P64RPC(0x80), P64RPC(0xd0), P64RPC(0x10)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x3c), P64RPC(0xbc), P64RPC(0xfc)},
{P64RPC(0xf4), P64RPC(0x78), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x70), P64RPC(0xec)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0xe8), P64RPC(0xd8)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x7c), P64RPC(0x08), P64RPC(0x00)},
{P64RPC(0x4c), P64RPC(0xdc), P64RPC(0x48)},
{P64RPC(0xf0), P64RPC(0xbc), P64RPC(0x3c)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x50), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xc4), P64RPC(0xd4), P64RPC(0xfc)},
{P64RPC(0xfc), P64RPC(0xd8), P64RPC(0xa8)},
{P64RPC(0x80), P64RPC(0x00), P64RPC(0xf0)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x18), P64RPC(0x3c), P64RPC(0x5c)},

View File

@ -1,64 +1,64 @@
{0x88, 0x70, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x80, 0x88},
{0xf0, 0xbc, 0x3c},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x24, 0x18, 0x8c},
{0xc8, 0x4c, 0x0c},
{0xbc, 0xbc, 0xbc},
{0x00, 0x00, 0x00},
{0x4c, 0xdc, 0x48},
{0x00, 0x00, 0x00},
{0xfc, 0xbc, 0xb0},
{0xfc, 0xd8, 0xa8},
{0x00, 0xa8, 0x00},
{0x00, 0x00, 0x00},
{0xfc, 0x74, 0xb4},
{0x00, 0x00, 0x00},
{0x20, 0x38, 0xec},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0xfc, 0x74, 0x60},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x5c, 0x94, 0xfc},
{0x00, 0x94, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0xa8, 0xf0, 0xbc},
{0x3c, 0xbc, 0xfc},
{0xa8, 0x00, 0x10},
{0x00, 0x50, 0x00},
{0x7c, 0x08, 0x00},
{0x00, 0x00, 0xa8},
{0x80, 0x00, 0xf0},
{0x00, 0x00, 0x00},
{0x74, 0x74, 0x74},
{0xe4, 0x00, 0x58},
{0x18, 0x3c, 0x5c},
{0x00, 0x00, 0x00},
{0x00, 0x70, 0xec},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0xfc, 0xe4, 0xa0},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0x40, 0x2c, 0x00},
{0xd8, 0x28, 0x00},
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x00},
{0xfc, 0xfc, 0xfc},
{0x9c, 0xfc, 0xf0},
{0x00, 0x00, 0x00},
{0xfc, 0x98, 0x38},
{0x00, 0x00, 0x00},
{0xa8, 0xe4, 0xfc},
{0x80, 0xd0, 0x10},
{0x00, 0x00, 0x00},
{0xfc, 0xfc, 0xfc},
{0x00, 0x44, 0x00},
{P64RPC(0x88), P64RPC(0x70), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x80), P64RPC(0x88)},
{P64RPC(0xf0), P64RPC(0xbc), P64RPC(0x3c)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x24), P64RPC(0x18), P64RPC(0x8c)},
{P64RPC(0xc8), P64RPC(0x4c), P64RPC(0x0c)},
{P64RPC(0xbc), P64RPC(0xbc), P64RPC(0xbc)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x4c), P64RPC(0xdc), P64RPC(0x48)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xbc), P64RPC(0xb0)},
{P64RPC(0xfc), P64RPC(0xd8), P64RPC(0xa8)},
{P64RPC(0x00), P64RPC(0xa8), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0x74), P64RPC(0xb4)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x20), P64RPC(0x38), P64RPC(0xec)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0x74), P64RPC(0x60)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x5c), P64RPC(0x94), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x94), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xa8), P64RPC(0xf0), P64RPC(0xbc)},
{P64RPC(0x3c), P64RPC(0xbc), P64RPC(0xfc)},
{P64RPC(0xa8), P64RPC(0x00), P64RPC(0x10)},
{P64RPC(0x00), P64RPC(0x50), P64RPC(0x00)},
{P64RPC(0x7c), P64RPC(0x08), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0xa8)},
{P64RPC(0x80), P64RPC(0x00), P64RPC(0xf0)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x74), P64RPC(0x74), P64RPC(0x74)},
{P64RPC(0xe4), P64RPC(0x00), P64RPC(0x58)},
{P64RPC(0x18), P64RPC(0x3c), P64RPC(0x5c)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x70), P64RPC(0xec)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xe4), P64RPC(0xa0)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x40), P64RPC(0x2c), P64RPC(0x00)},
{P64RPC(0xd8), P64RPC(0x28), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xfc), P64RPC(0xfc)},
{P64RPC(0x9c), P64RPC(0xfc), P64RPC(0xf0)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0x98), P64RPC(0x38)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xa8), P64RPC(0xe4), P64RPC(0xfc)},
{P64RPC(0x80), P64RPC(0xd0), P64RPC(0x10)},
{P64RPC(0x00), P64RPC(0x00), P64RPC(0x00)},
{P64RPC(0xfc), P64RPC(0xfc), P64RPC(0xfc)},
{P64RPC(0x00), P64RPC(0x44), P64RPC(0x00)},

View File

@ -57,6 +57,7 @@
#define PPU_status (PPU[2])
#define READPALNOGS(ofs) (PALRAM[(ofs)])
#define READPAL(ofs) (PALRAM[(ofs)] & (GRAYSCALE ? 0x30 : 0xFF))
#define READUPAL(ofs) (UPALRAM[(ofs)] & (GRAYSCALE ? 0x30 : 0xFF))
@ -1987,6 +1988,7 @@ void runppu(int x) {
struct BGData {
struct Record {
uint8 nt, pecnt, at, pt[2], qtnt;
uint8 ppu1[8];
INLINE void Read() {
NTRefreshAddr = RefreshAddr = ppur.get_ntread();
@ -1998,7 +2000,12 @@ struct BGData {
}
pecnt = (RefreshAddr & 1) << 3;
nt = CALL_PPUREAD(RefreshAddr);
runppu(kFetchTime);
ppu1[0] = PPU[1];
runppu(1);
ppu1[1] = PPU[1];
runppu(1);
RefreshAddr = ppur.get_atread();
at = CALL_PPUREAD(RefreshAddr);
@ -2010,37 +2017,57 @@ struct BGData {
at <<= 2;
//horizontal scroll clocked at cycle 3 and then
//vertical scroll at 251
ppu1[2] = PPU[1];
runppu(1);
if (PPUON) {
ppur.increment_hsc();
if (ppur.status.cycle == 251)
ppur.increment_vs();
}
ppu1[3] = PPU[1];
runppu(1);
ppur.par = nt;
RefreshAddr = ppur.get_ptread();
if (PEC586Hack) {
pt[0] = CALL_PPUREAD(RefreshAddr | pecnt);
runppu(kFetchTime);
ppu1[4] = PPU[1];
runppu(1);
ppu1[5] = PPU[1];
runppu(1);
pt[1] = CALL_PPUREAD(RefreshAddr | pecnt);
runppu(kFetchTime);
ppu1[6] = PPU[1];
runppu(1);
ppu1[7] = PPU[1];
runppu(1);
} else if (QTAIHack && (qtnt & 0x40)) {
pt[0] = *(CHRptr[0] + RefreshAddr);
runppu(kFetchTime);
ppu1[4] = PPU[1];
runppu(1);
ppu1[5] = PPU[1];
runppu(1);
RefreshAddr |= 8;
pt[1] = *(CHRptr[0] + RefreshAddr);
runppu(kFetchTime);
ppu1[6] = PPU[1];
runppu(1);
ppu1[7] = PPU[1];
runppu(1);
} else {
if (ScreenON)
RENDER_LOG(RefreshAddr);
pt[0] = CALL_PPUREAD(RefreshAddr);
runppu(kFetchTime);
ppu1[4] = PPU[1];
runppu(1);
ppu1[5] = PPU[1];
runppu(1);
RefreshAddr |= 8;
if (ScreenON)
RENDER_LOG(RefreshAddr);
pt[1] = CALL_PPUREAD(RefreshAddr);
runppu(kFetchTime);
ppu1[6] = PPU[1];
runppu(1);
ppu1[7] = PPU[1];
runppu(1);
}
}
};
@ -2216,7 +2243,7 @@ int FCEUX_PPU_Loop(int skip) {
pixel = ((pt[0] >> (7 - bgpx)) & 1) | (((pt[1] >> (7 - bgpx)) & 1) << 1) | bgdata.main[bgtile].at;
}
if (renderbg)
pixelcolor = READPAL(pixel);
pixelcolor = READPALNOGS(pixel);
//look for a sprite to be drawn
bool havepixel = false;
@ -2261,12 +2288,25 @@ int FCEUX_PPU_Loop(int skip) {
spixel |= (oam[2] & 3) << 2;
if (rendersprites)
pixelcolor = READPAL(0x10 + spixel);
pixelcolor = READPALNOGS(0x10 + spixel);
}
}
*ptr++ = PaletteAdjustPixel(pixelcolor);
*dptr++= PPU[1]>>5; //grab deemph
//apply grayscale.. kind of clunky
//really we need to read the entire palette instead of just ppu1
//this will be needed for special color effects probably (very fine rainbows and whatnot?)
//are you allowed to chang the palette mid-line anyway? well you can definitely change the grayscale flag as we know from the FF1 "polygon" effect
if(bgdata.main[xt+2].ppu1[xp]&1)
pixelcolor &= 0x30;
//this does deemph stuff inside it.. which is probably wrong...
*ptr = PaletteAdjustPixel(pixelcolor);
ptr++;
//grab deemph..
//I guess this works the same way as the grayscale, ideally?
*dptr++ = bgdata.main[xt+2].ppu1[xp]>>5;
}
}
}

View File

@ -534,9 +534,10 @@ static INLINE void DMCDMA(void)
PrepDPCM();
else
{
SIRQStat|=0x80;
if(DMCFormat&0x80)
if(DMCFormat&0x80) {
SIRQStat|=0x80;
X6502_IRQBegin(FCEU_IQDPCM);
}
}
}
}

View File

@ -110,7 +110,7 @@ SFORMAT SFCPU[]={
{ &X.Y, 1, "Y\0\0"},
{ &X.S, 1, "S\0\0"},
{ &X.P, 1, "P\0\0"},
{ &X.DB, 1, "DB"},
{ &X.DB, 1, "DB\0"},
{ &RAM, 0x800 | FCEUSTATE_INDIRECT, "RAM", },
{ 0 }
};
@ -307,13 +307,24 @@ static bool ReadStateChunks(EMUFILE* is, int32 totalsize)
// load back buffer
{
extern uint8 *XBackBuf;
if(is->fread((char*)XBackBuf,size) != size)
ret = false;
//ignore 8 garbage bytes, whose idea was it to write these or even have them there in the first place
if(size == 256*256+8)
{
if(is->fread((char*)XBackBuf,256*256) != 256*256)
ret = false;
is->fseek(8,SEEK_CUR);
}
else
{
if(is->fread((char*)XBackBuf,size) != size)
ret = false;
}
//MBG TODO - can this be moved to a better place?
//does it even make sense, displaying XBuf when its XBackBuf we just loaded?
#ifdef __WIN_DRIVER__
else
if(ret)
{
FCEUD_BlitScreen(XBuf);
UpdateFCEUWindow();
@ -404,7 +415,7 @@ bool FCEUSS_SaveMS(EMUFILE* outstream, int compressionLevel)
// save back buffer
{
extern uint8 *XBackBuf;
uint32 size = 256 * 256 + 8;
uint32 size = 256 * 256;
os->fputc(8);
write32le(size, os);
os->fwrite((char*)XBackBuf,size);
@ -848,7 +859,7 @@ void ResetExState(void (*PreSave)(void), void (*PostSave)(void))
for(x=0;x<SFEXINDEX;x++)
{
if(SFMDATA[x].desc)
free( (void*)SFMDATA[x].desc);
FCEU_free( (void*)SFMDATA[x].desc);
}
// adelikat, 3/14/09: had to add this to clear out the size parameter. NROM(mapper 0) games were having savestate crashes if loaded after a non NROM game because the size variable was carrying over and causing savestates to save too much data
SFMDATA[0].s = 0;
@ -1103,7 +1114,7 @@ string GetBackupFileName()
string filename;
int x;
filename = strdup(FCEU_MakeFName(FCEUMKF_STATE,CurrentState,0).c_str()); //Generate normal savestate filename
filename = FCEU_MakeFName(FCEUMKF_STATE,CurrentState,0); //Generate normal savestate filename
x = filename.find_last_of("."); //Find last dot
filename = filename.substr(0,x); //Chop off file extension
filename.append(".bak.fc0"); //add .bak

View File

@ -28,53 +28,90 @@
#include "../fceu.h"
#include "memory.h"
///allocates the specified number of bytes. exits process if this fails
void *FCEU_amalloc(size_t size, size_t alignment)
{
size = (size + alignment - 1) & ~(alignment-1);
#ifdef _MSC_VER
void *ret = _aligned_malloc(size,alignment);
#else
void *ret = aligned_alloc(alignment,size);
#endif
if(!ret)
FCEU_abort("Error allocating memory!");
return ret;
}
void FCEU_afree(void* ptr)
{
#ifdef _MSC_VER
_aligned_free(ptr);
#else
free(ptr);
#endif
}
static void *_FCEU_malloc(uint32 size)
{
void* ret = malloc(size);
if(!ret)
FCEU_abort("Error allocating memory!");
return ret;
}
static void _FCEU_free(void* ptr)
{
free(ptr);
}
void *FCEU_gmalloc(uint32 size)
{
void *ret;
ret=malloc(size);
if(!ret)
{
FCEU_PrintError("Error allocating memory! Doing a hard exit.");
exit(1);
}
FCEU_MemoryRand((uint8*)ret,size,true); // initialize according to RAMInitOption, default zero
return ret;
void *ret = _FCEU_malloc(size);
// initialize according to RAMInitOption, default zero
FCEU_MemoryRand((uint8*)ret,size,true);
return ret;
}
///allocates the specified number of bytes. returns null if this fails
void *FCEU_malloc(uint32 size)
{
void *ret;
ret=malloc(size);
if(!ret)
{
FCEU_PrintError("Error allocating memory!");
return(0);
}
memset(ret,0,size); // initialize to 0
return ret;
void *ret = _FCEU_malloc(size);
memset(ret, 0, size);
return ret;
}
///frees memory allocated with FCEU_gmalloc
void FCEU_gfree(void *ptr)
{
free(ptr);
_FCEU_free(ptr);
}
///frees memory allocated with FCEU_malloc
void FCEU_free(void *ptr) // Might do something with this and FCEU_malloc later...
void FCEU_free(void *ptr)
{
free(ptr);
_FCEU_free(ptr);
}
void *FCEU_dmalloc(uint32 size)
{
return malloc(size);
return FCEU_malloc(size);
}
void FCEU_dfree(void *ptr)
{
free(ptr);
return FCEU_free(ptr);
}
void* FCEU_realloc(void* ptr, size_t size)
{
return realloc(ptr,size);
}
void FCEU_abort(const char* message)
{
if(message) FCEU_PrintError(message);
abort();
}

View File

@ -24,13 +24,34 @@
#define FCEU_dwmemset(d,c,n) {int _x; for(_x=n-4;_x>=0;_x-=4) *(uint32 *)&(d)[_x]=c;}
void *FCEU_malloc(uint32 size); // initialized to 0
void *FCEU_gmalloc(uint32 size); // used by boards for WRAM etc, initialized to 0 (default) or other via RAMInitOption
void FCEU_gfree(void *ptr);
void FCEU_free(void *ptr);
void FCEU_memmove(void *d, void *s, uint32 l);
//returns a buffer initialized to 0
void *FCEU_malloc(uint32 size);
// wrapper for debugging when its needed, otherwise act like
// normal malloc/free
//returns a buffer, with jumbled initial contents
//used by boards for WRAM etc, initialized to 0 (default) or other via RAMInitOption
void *FCEU_gmalloc(uint32 size);
//free memory allocated with FCEU_gmalloc
void FCEU_gfree(void *ptr);
//returns an aligned buffer, initialized to 0
//the alignment will default to the largest thing you could ever sensibly want for massively aligned cache friendly buffers
void *FCEU_amalloc(size_t size, size_t alignment = 256);
//frees memory allocated with FCEU_amalloc
void FCEU_afree(void* ptr);
//free memory allocated with FCEU_malloc
void FCEU_free(void *ptr);
//reallocate memory allocated with FCEU_malloc
void* FCEU_realloc(void* ptr, size_t size);
//don't use these. change them if you find them.
void *FCEU_dmalloc(uint32 size);
//don't use these. change them if you find them.
void FCEU_dfree(void *ptr);
//aborts the process for fatal errors
void FCEU_abort(const char* message = nullptr);

View File

@ -91,19 +91,19 @@ void FCEU_KillVirtualVideo(void)
{
if ( XBuf )
{
FCEU_free(XBuf); XBuf = NULL;
FCEU_afree(XBuf); XBuf = NULL;
}
if ( XBackBuf )
{
FCEU_free(XBackBuf); XBackBuf = NULL;
FCEU_afree(XBackBuf); XBackBuf = NULL;
}
if ( XDBuf )
{
FCEU_free(XDBuf); XDBuf = NULL;
FCEU_afree(XDBuf); XDBuf = NULL;
}
if ( XDBackBuf )
{
FCEU_free(XDBackBuf); XDBackBuf = NULL;
FCEU_afree(XDBackBuf); XDBackBuf = NULL;
}
//printf("Video Core Cleanup\n");
}
@ -116,28 +116,18 @@ void FCEU_KillVirtualVideo(void)
int FCEU_InitVirtualVideo(void)
{
//Some driver code may allocate XBuf externally.
//256 bytes per scanline, * 240 scanline maximum, +16 for alignment,
//256 bytes per scanline, * 240 scanline maximum
if(XBuf)
return 1;
XBuf = (u8*)FCEU_malloc(256 * 256 + 16);
XBackBuf = (u8*)FCEU_malloc(256 * 256 + 16);
XDBuf = (u8*)FCEU_malloc(256 * 256 + 16);
XDBackBuf = (u8*)FCEU_malloc(256 * 256 + 16);
if(!XBuf || !XBackBuf || !XDBuf || !XDBackBuf)
{
return 0;
}
XBuf = (u8*)FCEU_amalloc(256 * 256);
XBackBuf = (u8*)FCEU_amalloc(256 * 256);
XDBuf = (u8*)FCEU_amalloc(256 * 256);
XDBackBuf = (u8*)FCEU_amalloc(256 * 256);
xbsave = XBuf;
if( sizeof(uint8*) == 4 )
{
uintptr_t m = (uintptr_t)XBuf;
m = ( 8 - m) & 7;
XBuf+=m;
}
memset(XBuf,128,256*256);
memset(XBackBuf,128,256*256);
memset(XBuf,128,256*256);

View File

@ -7,10 +7,20 @@ int SaveSnapshot(char[]);
void ResetScreenshotsCounter();
uint32 GetScreenPixel(int x, int y, bool usebackup);
int GetScreenPixelPalette(int x, int y, bool usebackup);
//in case we need more flags in the future we can change the size here
//bit0 : monochrome bit
//bit5 : emph red
//bit6 : emph green
//bit7 : emph blue
typedef uint8 xfbuf_t;
extern uint8 *XBuf;
extern uint8 *XBackBuf;
extern uint8 *XDBuf;
extern uint8 *XDBackBuf;
extern xfbuf_t *XFBuf;
extern int ClipSidesOffset;
struct GUIMESSAGE

View File

@ -146,7 +146,7 @@
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<PreBuildEvent>
<Command>"%windir%\Sysnative\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
<Command>"%windir%\system32\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
</PreBuildEvent>
<ClCompile>
<Optimization>Disabled</Optimization>
@ -186,7 +186,7 @@ xcopy /y /d "$(ProjectDir)\..\src\drivers\win\7z_64.dll" "$(OutDir)"</Command>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<PreBuildEvent>
<Command>"%windir%\Sysnative\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
<Command>"%windir%\system32\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
<Message>write current revision number to placeholders</Message>
</PreBuildEvent>
<ClCompile>
@ -229,7 +229,7 @@ xcopy /y /d "$(ProjectDir)\..\src\drivers\win\7z_64.dll" "$(OutDir)"</Command>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PublicRelease|Win32'">
<PreBuildEvent>
<Command>"%windir%\Sysnative\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
<Command>"%windir%\system32\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
<Message>write current revision number to placeholders</Message>
</PreBuildEvent>
<ClCompile>
@ -298,7 +298,7 @@ xcopy /y /d "$(ProjectDir)\..\src\drivers\win\7z_64.dll" "$(OutDir)"</Command>
<DelayLoadDLLs>lua51.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Link>
<PreBuildEvent>
<Command>"%windir%\Sysnative\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
<Command>"%windir%\system32\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
</PreBuildEvent>
<PostBuildEvent>
<Command>xcopy /y /d "$(ProjectDir)\..\src\drivers\win\7z.dll" "$(OutDir)"
@ -335,7 +335,7 @@ xcopy /y /d "$(ProjectDir)\..\src\drivers\win\7z_64.dll" "$(OutDir)"</Command>
<DelayLoadDLLs>lua51.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Link>
<PreBuildEvent>
<Command>"%windir%\Sysnative\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
<Command>"%windir%\system32\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
</PreBuildEvent>
<PostBuildEvent>
<Command>xcopy /y /d "$(ProjectDir)\..\src\drivers\win\7z.dll" "$(OutDir)"
@ -372,7 +372,7 @@ xcopy /y /d "$(ProjectDir)\..\src\drivers\win\7z_64.dll" "$(OutDir)"</Command>
<DelayLoadDLLs>lua51.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Link>
<PreBuildEvent>
<Command>"%windir%\Sysnative\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
<Command>"%windir%\system32\cscript" /nologo /E:JScript "defaultconfig\make_scmrev.h.js"</Command>
</PreBuildEvent>
<PostBuildEvent>
<Command>xcopy /y /d "$(ProjectDir)\..\src\drivers\win\7z.dll" "$(OutDir)"