Merge branch 'TASEmulators:master' into master

This commit is contained in:
Cyneprepou4uk 2022-04-19 21:10:40 +03:00 committed by GitHub
commit 00772532b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
59 changed files with 3068 additions and 104 deletions

4
README
View File

@ -1,4 +1,4 @@
FCEUX SDL 2.6.2 SDL README
FCEUX SDL 2.6.4 SDL README
==========================
Originally By Lukas Sabota (sf: punkrockguy318)
Updated By mjbudd77
@ -7,7 +7,7 @@ Updated By mjbudd77
http://www.fceux.com
Last Modified: February 4, 2022
Last Modified: March 24, 2022
Table of Contents
-----------------

View File

@ -2,8 +2,7 @@ Priorities
==========
* Clean out old unused files - scons build system is dead, cmake is the way to go.
* GTK GUI was not cross-platform. A Qt5 version of the GUI has been created to meet this need.
I will keep the GTK GUI around for Linux users who prefer it, but when it comes to adding new features
the Qt GUI is where I plan to add them first (if at all).
The GTK GUI has been retired and is no longer supported.
* The Qt GUI has by far exceeded the capabilities of the older GTK version. Below is a GUI capability
matrix showing the differences between the two. I HIGHLY RECOMMEND USING THE Qt GUI.
* Code cleanup. Lots of compiler warnings with newer GCC. Maybe I'm OCD... but these warnings bother me.

Binary file not shown.

View File

@ -2,7 +2,7 @@
use strict;
my $VERSION="2.6.3";
my $VERSION="2.6.4";
my $INSTALL_PREFIX="/tmp/fceux";
my $CTL_FILENAME="$INSTALL_PREFIX/DEBIAN/control";
my $ARCH="amd64";

View File

@ -10,7 +10,7 @@ QT_MAJOR=5;
QT_PKGNAME=qt$QT_MAJOR;
FCEUX_VERSION_MAJOR=2
FCEUX_VERSION_MINOR=6
FCEUX_VERSION_PATCH=3
FCEUX_VERSION_PATCH=4
SDL2_VERSION=2.0.20
SCRIPT_DIR=$( cd $(dirname $BASH_SOURCE[0]); pwd );

View File

@ -29,8 +29,8 @@ Interim builds:
* Win32: [fceux.zip](https://ci.appveyor.com/api/projects/zeromus/fceux/artifacts/fceux.zip?branch=master&job=Windows%2032)
* Win64: [fceux64.zip](https://ci.appveyor.com/api/projects/zeromus/fceux/artifacts/fceux64.zip?branch=master&job=Windows%2064)
* Win64 Qt/SDL: [qfceux64.zip](https://ci.appveyor.com/api/projects/zeromus/fceux/artifacts/qfceux64.zip?branch=master&job=Win64%20Qt)
* Ubuntu: [fceux-2.6.3-amd64.deb](https://ci.appveyor.com/api/projects/zeromus/fceux/artifacts/fceux-2.6.3-amd64.deb?branch=master&job=Ubuntu)
* MacOSX: [fceux-2.6.3-Darwin.dmg](https://ci.appveyor.com/api/projects/zeromus/fceux/artifacts/fceux-2.6.3-Darwin.dmg?branch=master&job=MacOS)
* Ubuntu: [fceux-2.6.4-amd64.deb](https://ci.appveyor.com/api/projects/zeromus/fceux/artifacts/fceux-2.6.4-amd64.deb?branch=master&job=Ubuntu)
* MacOSX: [fceux-2.6.4-Darwin.dmg](https://ci.appveyor.com/api/projects/zeromus/fceux/artifacts/fceux-2.6.4-Darwin.dmg?branch=master&job=MacOS)
* Status: [Appveyor](https://ci.appveyor.com/project/zeromus/fceux/)
But you might like mesen more: https://github.com/SourMesen/Mesen
@ -39,4 +39,4 @@ You should get releases from here: https://sourceforge.net/projects/fceultra/fil
That's because github forces us to use tags we don't have for releases.
2.6.2 is the most recent release but most people are using the autobuilds.
2.6.4 is the most recent release but most people are using the autobuilds.

View File

@ -2,6 +2,7 @@
CLEAN_BUILD=0;
MAKE_ARGS="";
QT_MAJOR_VERSION=5;
while test $# -gt 0
do
@ -16,6 +17,9 @@ do
-j) shift; MAKE_ARGS+=" -j$1 ";
;;
-qt) shift; QT_MAJOR_VERSION="$1";
;;
esac
shift;
done
@ -45,9 +49,24 @@ CMAKE_ARGS="\
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ";
if [[ "$OSTYPE" == "darwin"* ]]; then
export Qt5_DIR=`brew --prefix qt5`
echo "Qt5_DIR=$Qt5_DIR";
CMAKE_ARGS+=" -DCMAKE_PREFIX_PATH=`brew --prefix qt5` ";
if [ "$QT_MAJOR_VERSION" == "6" ]; then
export Qt6_DIR=`brew --prefix qt6`
echo "Qt6_DIR=$Qt6_DIR";
CMAKE_ARGS+=" -DCMAKE_PREFIX_PATH=`brew --prefix qt6` ";
else
export Qt5_DIR=`brew --prefix qt5`
echo "Qt5_DIR=$Qt5_DIR";
CMAKE_ARGS+=" -DCMAKE_PREFIX_PATH=`brew --prefix qt5` ";
fi
fi
if [ ! -z "$Qt_DIR" ]; then
CMAKE_ARGS+=" -DCMAKE_PREFIX_PATH=$Qt_DIR ";
fi
if [ "$QT_MAJOR_VERSION" == "6" ]; then
CMAKE_ARGS+=" -DQT6=1 ";
fi
#echo $CMAKE_ARGS;

View File

@ -114,6 +114,22 @@ else(WIN32)
add_definitions( -D_USE_LIBAV ${LIBAV_CFLAGS} )
endif()
#find_package(X11)
pkg_check_modules( X11 x11)
if ( ${X11_FOUND} )
message( STATUS "Has X11 Library ${X11_VERSION}" )
add_definitions( -D_HAS_X11 )
include_directories( ${X11_INCLUDE_DIR} )
endif()
pkg_check_modules( XKB xkbcommon)
if ( ${XKB_FOUND} )
message( STATUS "Has XKB Library ${XKB_VERSION}" )
add_definitions( -D_HAS_XKB ${XKB_CFLAGS} )
endif()
#pkg_check_modules( GL gl) # Use built in find package instead for OpenGL
# Check for OpenGL
@ -490,6 +506,7 @@ set(SRC_DRIVERS_SDL
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/ConsoleViewerSDL.cpp
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/InputConf.cpp
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/GamePadConf.cpp
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/FamilyKeyboard.cpp
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/HotKeyConf.cpp
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/TimingConf.cpp
${CMAKE_CURRENT_SOURCE_DIR}/drivers/Qt/FrameTimingStats.cpp

View File

@ -52,15 +52,23 @@ static DECLFW(M225Write) {
}
static DECLFW(M225LoWrite) {
if (A & 0x800) {
prot[A & 0x03] = V;
}
}
static DECLFR(M225LoRead) {
return 0;
if (A & 0x800) {
return prot[A & 3] & 0x0F;
}
return X.DB;
}
static void M225Power(void) {
prg = 0;
chr = 0;
mode = 0;
mirr = 0;
Sync();
SetReadHandler(0x5000, 0x5FFF, M225LoRead);
SetWriteHandler(0x5000, 0x5FFF, M225LoWrite);
@ -70,7 +78,9 @@ static void M225Power(void) {
static void M225Reset(void) {
prg = 0;
chr = 0;
mode = 0;
mirr = 0;
Sync();
}

View File

@ -23,13 +23,13 @@ const char *FCEUI_GetAboutString(void)
const char *aboutTemplate =
FCEU_NAME_AND_VERSION "\n\n"
"Administrators:\n"
"zeromus, mjbudd77, feos\n"
"zeromus, feos\n"
"\n"
"Current Contributors:\n"
"CaH4e3, rainwarrior, owomomo, punkrockguy318\n"
"\n"
"Past Contributors:\n"
"xhainingx, gocha, AnS\n"
"xhainingx, gocha, AnS, mjbudd77\n"
"\n"
"FCEUX 2.0:\n"
"mz, nitsujrehtona, SP, Ugly Joe,\n"

View File

@ -62,6 +62,7 @@ static const char *Authors[] = {
"\t mjbudd77",
"\t Lukas Sabota //punkrockguy318", "\t Soules", "\t Bryan Cain", "\t radsaq",
"\t Shinydoofy",
"\nQt GUI written by mjbudd77\n",
"FceuX 2.0 Developers:",
"\t SP", "\t zeromus", "\t adelikat", "\t caH4e3", "\t qfox",
"\t Luke Gustafson", "\t _mz", "\t UncombedCoconut", "\t DwEdit", "\t AnS",
@ -253,7 +254,7 @@ AboutWindow::~AboutWindow(void)
//----------------------------------------------------------------------------
void AboutWindow::closeEvent(QCloseEvent *event)
{
printf("About Window Close Event\n");
//printf("About Window Close Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -148,7 +148,7 @@ AviRiffViewerDialog::AviRiffViewerDialog(QWidget *parent)
//----------------------------------------------------------------------------
AviRiffViewerDialog::~AviRiffViewerDialog(void)
{
printf("Destroy AVI RIFF Viewer Window\n");
//printf("Destroy AVI RIFF Viewer Window\n");
if ( avi )
{
@ -158,7 +158,7 @@ AviRiffViewerDialog::~AviRiffViewerDialog(void)
//----------------------------------------------------------------------------
void AviRiffViewerDialog::closeEvent(QCloseEvent *event)
{
printf("AVI RIFF Viewer Window Event\n");
//printf("AVI RIFF Viewer Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -5298,7 +5298,10 @@ bool QAsmView::event(QEvent *event)
addr, bank, romOfs );
}
static_cast<asmLookAheadPopup*>(fceuCustomToolTipShow( helpEvent->globalPos(), new asmLookAheadPopup(addr, this) ));
if ( static_cast<asmLookAheadPopup*>(fceuCustomToolTipShow( helpEvent->globalPos(), new asmLookAheadPopup(addr, this) )) == NULL )
{
printf("ASM Lookahead Popup Error\n");
}
//QToolTip::showText(helpEvent->globalPos(), tr(stmp), this );
QToolTip::hideText();
event->ignore();

View File

@ -288,13 +288,13 @@ ConsoleSndConfDialog_t::ConsoleSndConfDialog_t(QWidget *parent)
//----------------------------------------------------
ConsoleSndConfDialog_t::~ConsoleSndConfDialog_t(void)
{
printf("Destroy Sound Config Window\n");
//printf("Destroy Sound Config Window\n");
updateTimer->stop();
}
//----------------------------------------------------------------------------
void ConsoleSndConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Sound Config Close Window Event\n");
//printf("Sound Config Close Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -534,14 +534,14 @@ ConsoleVideoConfDialog_t::ConsoleVideoConfDialog_t(QWidget *parent)
//----------------------------------------------------
ConsoleVideoConfDialog_t::~ConsoleVideoConfDialog_t(void)
{
printf("Destroy Video Config Window\n");
//printf("Destroy Video Config Window\n");
updateTimer->stop();
}
//----------------------------------------------------------------------------
void ConsoleVideoConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Video Config Close Window Event\n");
//printf("Video Config Close Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -66,6 +66,7 @@
#include "Qt/ConsoleWindow.h"
#include "Qt/InputConf.h"
#include "Qt/GamePadConf.h"
#include "Qt/FamilyKeyboard.h"
#include "Qt/HotKeyConf.h"
#include "Qt/PaletteConf.h"
#include "Qt/PaletteEditor.h"
@ -100,6 +101,10 @@
#include "Qt/nes_shm.h"
#include "Qt/TasEditor/TasEditorWindow.h"
#ifdef __APPLE__
void qt_set_sequence_auto_mnemonic(bool enable);
#endif
consoleWin_t::consoleWin_t(QWidget *parent)
: QMainWindow( parent )
{
@ -110,6 +115,12 @@ consoleWin_t::consoleWin_t(QWidget *parent)
//QString libpath = QLibraryInfo::location(QLibraryInfo::PluginsPath);
//printf("LibPath: '%s'\n", libpath.toStdString().c_str() );
#ifdef __APPLE__
qt_set_sequence_auto_mnemonic(true);
#endif
printf("Running on Platform: %s\n", QGuiApplication::platformName().toStdString().c_str() );
QApplication::setStyle( new fceuStyle() );
initHotKeys();
@ -1405,6 +1416,16 @@ void consoleWin_t::createMainMenu(void)
emuMenu->addSeparator();
// Emulation -> Virtual Family Keyboard
act = new QAction(tr("Virtual Family Keyboard"), this);
//act->setShortcut( QKeySequence(tr("Ctrl+G")));
act->setStatusTip(tr("Virtual Family Keyboard"));
connect(act, SIGNAL(triggered()), this, SLOT(openFamilyKeyboard(void)) );
emuMenu->addAction(act);
emuMenu->addSeparator();
// Emulation -> Insert Coin
insCoinAct = new QAction(tr("&Insert Coin"), this);
//insCoinAct->setShortcut( QKeySequence(tr("Ctrl+G")));
@ -3367,6 +3388,12 @@ void consoleWin_t::loadGameGenieROM(void)
return;
}
void consoleWin_t::openFamilyKeyboard(void)
{
openFamilyKeyboardDialog(this);
return;
}
void consoleWin_t::insertCoin(void)
{
FCEU_WRAPPER_LOCK();
@ -4669,6 +4696,8 @@ void consoleMenuBar::keyPressEvent(QKeyEvent *event)
{
QMenuBar::keyPressEvent(event);
pushKeyEvent( event, 1 );
// Force de-focus of menu bar when escape key is pressed.
// This prevents the menubar from hi-jacking keyboard input focus
// when using menu accelerators
@ -4683,6 +4712,8 @@ void consoleMenuBar::keyReleaseEvent(QKeyEvent *event)
{
QMenuBar::keyReleaseEvent(event);
pushKeyEvent( event, 0 );
event->accept();
}
//-----------------------------------------------------------------------------

View File

@ -348,6 +348,7 @@ class consoleWin_t : public QMainWindow
void openMovieOptWin(void);
void openCodeDataLogger(void);
void openTraceLogger(void);
void openFamilyKeyboard(void);
void toggleAutoResume(void);
void updatePeriodic(void);
void changeState0(void);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,187 @@
#include <QRect>
#include <QWidget>
#include <QDialog>
#include <QPushButton>
#include <QMouseEvent>
#include <QTreeWidget>
#include <QAction>
#include <QMenuBar>
#include <QMenu>
#include <QLabel>
#include <QTimer>
#include <QFont>
#include <QPropertyAnimation>
#include "Qt/main.h"
class FKB_Key_t
{
public:
FKB_Key_t(void)
{
vState = hwState = 0;
toggleOnPress = 0;
}
char isDown(void)
{
return vState || hwState;
}
char pressed(void)
{
if ( toggleOnPress )
{
vState = !vState;
}
else
{
vState = 1;
}
return vState;
}
char released(void)
{
if ( !toggleOnPress )
{
vState = 0;
}
return vState;
}
QRect rect;
char vState;
char hwState;
char toggleOnPress;
};
class FamilyKeyboardWidget : public QWidget
{
Q_OBJECT
public:
FamilyKeyboardWidget( QWidget *parent = 0);
~FamilyKeyboardWidget(void);
static const unsigned int NUM_KEYS = 0x48;
FKB_Key_t key[NUM_KEYS];
void setFont( const QFont &newFont );
protected:
void keyPressEvent(QKeyEvent *event) override;
void keyReleaseEvent(QKeyEvent *event) override;
void paintEvent(QPaintEvent *event) override;
void mousePressEvent(QMouseEvent * event) override;
void mouseReleaseEvent(QMouseEvent * event) override;
void mouseMoveEvent(QMouseEvent * event) override;
void mouseDoubleClickEvent(QMouseEvent * event) override;
void leaveEvent(QEvent *event) override;
void contextMenuEvent(QContextMenuEvent *event) override;
int getKeyAtPoint( QPoint p );
void calcFontData(void);
void updateHardwareStatus(void);
void drawButton( QPainter &painter, int idx, int x, int y, int w, int h );
int ctxMenuKey;
int keyUnderMouse;
int keyPressed;
int pxCharWidth;
int pxCharHeight;
int pxBtnGridX;
int pxBtnGridY;
QTimer *updateTimer;
private slots:
void updatePeriodic(void);
void ctxMapPhysicalKey(void);
void ctxChangeToggleOnPress(void);
};
class FKBKeyMapDialog : public QDialog
{
Q_OBJECT
public:
FKBKeyMapDialog(int idx, QWidget *parent = 0);
~FKBKeyMapDialog(void);
int buttonConfigStatus;
void enterButtonLoop(void);
protected:
void closeEvent(QCloseEvent *event) override;
void keyPressEvent(QKeyEvent *event) override;
void keyReleaseEvent(QKeyEvent *event) override;
int keyIdx;
QLabel *msgLbl;
QLabel *curMapLbl;
bool waitingForButton;
public slots:
void closeWindow(void);
};
class FKBConfigDialog : public QDialog
{
Q_OBJECT
public:
FKBConfigDialog(QWidget *parent = 0);
~FKBConfigDialog(void);
FamilyKeyboardWidget *keyboard;
void updateBindingList(void);
protected:
void closeEvent(QCloseEvent *event);
QMenuBar *buildMenuBar(void);
QTreeWidget *keyTree;
QLabel *statLbl;
QPushButton *fkbEnaBtn;
QTimer *updateTimer;
QPropertyAnimation *keyTreeHgtAnimation;
std::string saveFileName;
int getButtonIndexFromName( const char *buttonName );
int convText2ButtConfig( const char *txt, ButtConfig *bmap );
void mappingLoad(const char *filepath);
public slots:
void closeWindow(void);
private slots:
void updatePeriodic(void);
void updateStatusLabel(void);
void openFontDialog(void);
void mappingLoad(void);
void mappingSave(void);
void mappingSaveAs(void);
void toggleTreeView(bool);
void SaveCurrentMapping(void);
void resetDefaultMapping(void);
void toggleFamilyKeyboardEnable(void);
void keyTreeResizeDone(void);
void keyTreeHeightChange(const QVariant &);
void keyTreeItemActivated(QTreeWidgetItem *item, int column);
};
int openFamilyKeyboardDialog( QWidget *parent );
char getFamilyKeyboardVirtualKey( int idx );

View File

@ -243,7 +243,7 @@ GameGenieDialog_t::~GameGenieDialog_t(void)
//----------------------------------------------------------------------------
void GameGenieDialog_t::closeEvent(QCloseEvent *event)
{
printf("Game Genie Close Window Event\n");
//printf("Game Genie Close Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -935,7 +935,7 @@ void GamePadConfDialog_t::closeEvent(QCloseEvent *event)
return;
}
printf("GamePad Close Window Event\n");
//printf("GamePad Close Window Event\n");
buttonConfigStatus = 0;
done(0);
deleteLater();
@ -959,7 +959,7 @@ void GamePadConfDialog_t::closeWindow(void)
return;
}
printf("Close Window\n");
//printf("Close Window\n");
buttonConfigStatus = 0;
done(0);
deleteLater();

View File

@ -263,12 +263,12 @@ GuiConfDialog_t::GuiConfDialog_t(QWidget *parent)
//----------------------------------------------------
GuiConfDialog_t::~GuiConfDialog_t(void)
{
printf("Destroy GUI Config Close Window\n");
//printf("Destroy GUI Config Close Window\n");
}
//----------------------------------------------------------------------------
void GuiConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("GUI Config Close Window Event\n");
//printf("GUI Config Close Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -1018,7 +1018,7 @@ HexEditorFindDialog_t::~HexEditorFindDialog_t(void)
//----------------------------------------------------------------------------
void HexEditorFindDialog_t::closeEvent(QCloseEvent *event)
{
printf("Hex Editor Close Window Event\n");
//printf("Hex Editor Close Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -104,12 +104,12 @@ HotKeyConfDialog_t::HotKeyConfDialog_t(QWidget *parent)
//----------------------------------------------------------------------------
HotKeyConfDialog_t::~HotKeyConfDialog_t(void)
{
printf("Destroy Hot Key Config Window\n");
//printf("Destroy Hot Key Config Window\n");
}
//----------------------------------------------------------------------------
void HotKeyConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Hot Key Close Window Event\n");
//printf("Hot Key Close Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -38,9 +38,11 @@
#include "Qt/fceuWrapper.h"
#include "Qt/ConsoleWindow.h"
#include "Qt/ConsoleUtilities.h"
#include "Qt/FamilyKeyboard.h"
#include "Qt/InputConf.h"
static InputConfDialog_t *win = NULL;
//----------------------------------------------------------------------------
void openInputConfWindow(QWidget *parent)
{
@ -244,6 +246,7 @@ InputConfDialog_t::InputConfDialog_t(QWidget *parent)
connect(nesPortConfButton[0], SIGNAL(clicked(void)), this, SLOT(port1Configure(void)));
connect(nesPortConfButton[1], SIGNAL(clicked(void)), this, SLOT(port2Configure(void)));
connect(expPortConfButton , SIGNAL(clicked(void)), this, SLOT(expPortConfigure(void)));
connect(loadConfigButton, SIGNAL(clicked(void)), this, SLOT(openLoadPresetFile(void)));
connect(saveConfigButton, SIGNAL(clicked(void)), this, SLOT(openSavePresetFile(void)));
@ -256,7 +259,7 @@ InputConfDialog_t::InputConfDialog_t(QWidget *parent)
//----------------------------------------------------------------------------
InputConfDialog_t::~InputConfDialog_t(void)
{
printf("Destroy Input Config Window\n");
//printf("Destroy Input Config Window\n");
inputTimer->stop();
if (win == this)
@ -267,7 +270,7 @@ InputConfDialog_t::~InputConfDialog_t(void)
//----------------------------------------------------------------------------
void InputConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Input Config Close Window Event\n");
//printf("Input Config Close Window Event\n");
done(0);
deleteLater();
event->accept();
@ -329,6 +332,8 @@ void InputConfDialog_t::updatePortLabels(void)
expPortLabel->setText(expPortComboxBox->itemText(j));
}
}
expPortConfButton->setEnabled( curNesInput[2] == SIFC_FKB );
}
//----------------------------------------------------------------------------
void InputConfDialog_t::updatePortComboBoxes(void)
@ -381,7 +386,7 @@ void InputConfDialog_t::expSelect(int index)
void InputConfDialog_t::fourScoreChanged(int state)
{
int value = (state == Qt::Unchecked) ? 0 : 1;
printf("Set 'SDL.FourScore' = %i\n", value);
//printf("Set 'SDL.FourScore' = %i\n", value);
g_config->setOption("SDL.FourScore", value);
setInputs();
@ -428,6 +433,14 @@ void InputConfDialog_t::port2Configure(void)
openPortConfig(1);
}
//----------------------------------------------------------------------------
void InputConfDialog_t::expPortConfigure(void)
{
if ( curNesInput[2] == SIFC_FKB )
{
openFamilyKeyboardDialog( consoleWindow );
}
}
//----------------------------------------------------------------------------
void InputConfDialog_t::openLoadPresetFile(void)
{
int ret, useNativeFileDialogVal;

View File

@ -58,6 +58,7 @@ public slots:
private slots:
void port1Configure(void);
void port2Configure(void);
void expPortConfigure(void);
void port1Select(int index);
void port2Select(int index);
void expSelect(int index);

View File

@ -172,12 +172,12 @@ MovieOptionsDialog_t::MovieOptionsDialog_t(QWidget *parent)
//----------------------------------------------------------------------------
MovieOptionsDialog_t::~MovieOptionsDialog_t(void)
{
printf("Destroy Movie Options Window\n");
//printf("Destroy Movie Options Window\n");
}
//----------------------------------------------------------------------------
void MovieOptionsDialog_t::closeEvent(QCloseEvent *event)
{
printf("Movie Options Close Window Event\n");
//printf("Movie Options Close Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -326,13 +326,13 @@ PaletteConfDialog_t::PaletteConfDialog_t(QWidget *parent)
//----------------------------------------------------
PaletteConfDialog_t::~PaletteConfDialog_t(void)
{
printf("Destroy Palette Config Window\n");
//printf("Destroy Palette Config Window\n");
updateTimer->stop();
}
//----------------------------------------------------------------------------
void PaletteConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Palette Config Close Window Event\n");
//printf("Palette Config Close Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -1369,7 +1369,7 @@ nesPalettePickerDialog::nesPalettePickerDialog( int idx, QWidget *parent)
//----------------------------------------------------------------------------
nesPalettePickerDialog::~nesPalettePickerDialog(void)
{
printf("Destroy Palette Editor Config Window\n");
//printf("Destroy Palette Editor Config Window\n");
}
//----------------------------------------------------------------------------
void nesPalettePickerDialog::closeEvent(QCloseEvent *event)

View File

@ -530,7 +530,7 @@ RamSearchDialog_t::~RamSearchDialog_t(void)
//----------------------------------------------------------------------------
void RamSearchDialog_t::closeEvent(QCloseEvent *event)
{
printf("RAM Search Close Window Event\n");
//printf("RAM Search Close Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -1362,7 +1362,7 @@ SymbolEditWindow::~SymbolEditWindow(void)
//--------------------------------------------------------------
void SymbolEditWindow::closeEvent(QCloseEvent *event)
{
printf("Debugger Close Window Event\n");
//printf("Symbolic Debug Close Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -6261,7 +6261,7 @@ void QPianoRoll::paintEvent(QPaintEvent *event)
FCEU_CRITICAL_SECTION( emuLock );
int x, y, row, nrow, lineNum;
QPainter painter(this);
QColor white(255,255,255), black(0,0,0), blkColor, rowTextColor, hdrGridColor;
QColor /*white(255,255,255),*/ black(0,0,0), blkColor, rowTextColor, hdrGridColor;
static const char *buttonNames[] = { "A", "B", "S", "T", "U", "D", "L", "R", NULL };
char stmp[32];
char rowIsSel=0;

View File

@ -525,7 +525,7 @@ void BOOKMARKS::paintEvent(QPaintEvent *event)
FCEU_CRITICAL_SECTION( emuLock );
QPainter painter(this);
int x, y, item, cell_y;
QColor white(255,255,255), black(0,0,0), blkColor;
QColor white(255,255,255), /*black(0,0,0),*/ blkColor;
char txt[256];
bool timeColBgDone = false;

View File

@ -26,8 +26,8 @@ extern uint32 GetGamepadPressedImmediate();
extern char lagFlag;
// resources
static const char recordingCheckbox[11] = " Recording";
static const char recordingCheckboxBlankPattern[17] = " Recording blank";
//static const char recordingCheckbox[11] = " Recording";
//static const char recordingCheckboxBlankPattern[17] = " Recording blank";
static const char recordingModes[5][4] = { "All",
"1P",

View File

@ -265,14 +265,14 @@ TimingConfDialog_t::TimingConfDialog_t(QWidget *parent)
//----------------------------------------------------------------------------
TimingConfDialog_t::~TimingConfDialog_t(void)
{
printf("Destroy Timing Config Window\n");
//printf("Destroy Timing Config Window\n");
updateTimer->stop();
saveValues();
}
//----------------------------------------------------------------------------
void TimingConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Timing Close Window Event\n");
//printf("Timing Close Window Event\n");
done(0);
deleteLater();
event->accept();

View File

@ -406,7 +406,7 @@ TraceLoggerDialog_t::~TraceLoggerDialog_t(void)
traceLogWindow = NULL;
printf("Trace Logger Window Deleted\n");
//printf("Trace Logger Window Deleted\n");
}
//----------------------------------------------------
void TraceLoggerDialog_t::closeEvent(QCloseEvent *event)
@ -558,7 +558,7 @@ void TraceLoggerDialog_t::openLogFile(void)
QString filename;
QFileDialog dialog(this, tr("Select Log File"));
printf("Log File Select\n");
//printf("Log File Select\n");
dialog.setFileMode(QFileDialog::AnyFile);
@ -2481,7 +2481,7 @@ TraceLogDiskThread_t::TraceLogDiskThread_t( QObject *parent )
//----------------------------------------------------
TraceLogDiskThread_t::~TraceLogDiskThread_t(void)
{
printf("Disk Thread Cleanup\n");
//printf("Disk Thread Cleanup\n");
#ifdef WIN32
if (logFile != INVALID_HANDLE_VALUE)
{
@ -2509,7 +2509,7 @@ void TraceLogDiskThread_t::run(void)
int i,idx=0;
int blockSize = 4 * 1024;
printf("Trace Log Disk Start\n");
//printf("Trace Log Disk Start\n");
setPriority( QThread::HighestPriority );
@ -2606,7 +2606,7 @@ void TraceLogDiskThread_t::run(void)
}
#endif
printf("Trace Log Disk Exit\n");
//printf("Trace Log Disk Exit\n");
emit finished();
}
//----------------------------------------------------

View File

@ -695,6 +695,7 @@ InitConfig()
config->addOption("no-config", "SDL.NoConfig", 0);
config->addOption("autoresume", "SDL.AutoResume", 0);
config->addOption("SDL.FamilyKeyboardFont" , "");
// video playback
config->addOption("playmov", "SDL.Movie", "");

View File

@ -240,7 +240,7 @@ iNesHeaderEditor_t::iNesHeaderEditor_t(QWidget *parent)
{
sprintf(stmp, "%d %s", bmap[i].number, bmap[i].name);
mapperComboBox->addItem( tr(stmp), i );
mapperComboBox->addItem( tr(stmp), bmap[i].number );
}
hdrLayout->addLayout( hbox1 );
@ -904,7 +904,21 @@ void iNesHeaderEditor_t::setHeaderData(iNES_HEADER* header)
{
mapper |= (header->ROM_type3 & 0x0F) << 8;
}
mapperComboBox->setCurrentIndex( mapper );
for (i=0; i<mapperComboBox->count(); i++)
{
if ( mapperComboBox->itemData(i).toInt() > mapper )
{
sprintf( buf, "%i Unknown/unsupported", i);
mapperComboBox->insertItem( i, tr(buf), mapper);
mapperComboBox->setCurrentIndex(i);
break;
}
else if ( mapperComboBox->itemData(i).toInt() == mapper )
{
mapperComboBox->setCurrentIndex(i);
break;
}
}
// Sub Mapper
sprintf(buf, "%d", ines20 ? header->ROM_type3 >> 4 : 0);

View File

@ -30,6 +30,7 @@
#include "Qt/ConsoleWindow.h"
#include "Qt/ConsoleUtilities.h"
#include "Qt/CheatsConf.h"
#include "Qt/FamilyKeyboard.h"
#include "Qt/TasEditor/TasEditorWindow.h"
#include "Qt/sdl.h"
@ -140,7 +141,7 @@ static void UpdateTopRider(void);
static uint32 JSreturn = 0;
#include "keyscan.h"
static uint8 g_keyState[SDL_NUM_SCANCODES];
static uint8_t g_keyState[SDL_NUM_SCANCODES];
static int keyModifier = 0;
//static int DIPS = 0;
@ -1321,13 +1322,43 @@ UpdatePhysicalInput()
//printf("SDL_Event.type: %i Keysym: %i ScanCode: %i\n",
// event.type, event.key.keysym.sym, event.key.keysym.scancode );
#ifdef WIN32
g_keyState[SDL_SCANCODE_LSHIFT] = win32GetKeyState( SDL_SCANCODE_LSHIFT );
g_keyState[SDL_SCANCODE_RSHIFT] = win32GetKeyState( SDL_SCANCODE_RSHIFT );
g_keyState[SDL_SCANCODE_LALT ] = win32GetKeyState( SDL_SCANCODE_LALT );
g_keyState[SDL_SCANCODE_RALT ] = win32GetKeyState( SDL_SCANCODE_RALT );
g_keyState[SDL_SCANCODE_LCTRL ] = win32GetKeyState( SDL_SCANCODE_LCTRL );
g_keyState[SDL_SCANCODE_RCTRL ] = win32GetKeyState( SDL_SCANCODE_RCTRL );
g_keyState[SDL_SCANCODE_LGUI ] = win32GetKeyState( SDL_SCANCODE_LGUI );
g_keyState[SDL_SCANCODE_RGUI ] = win32GetKeyState( SDL_SCANCODE_RGUI );
#endif
keyModifier = event.key.keysym.mod;
g_keyState[SDL_SCANCODE_LSHIFT] = (event.key.keysym.mod & KMOD_LSHIFT) ? 1 : 0;
g_keyState[SDL_SCANCODE_RSHIFT] = (event.key.keysym.mod & KMOD_RSHIFT) ? 1 : 0;
g_keyState[SDL_SCANCODE_LALT] = (event.key.keysym.mod & KMOD_LALT) ? 1 : 0;
g_keyState[SDL_SCANCODE_RALT] = (event.key.keysym.mod & KMOD_RALT) ? 1 : 0;
g_keyState[SDL_SCANCODE_LCTRL] = (event.key.keysym.mod & KMOD_LCTRL) ? 1 : 0;
g_keyState[SDL_SCANCODE_RCTRL] = (event.key.keysym.mod & KMOD_RCTRL) ? 1 : 0;
if ( (event.key.keysym.mod & KMOD_LSHIFT) == 0 )
{
g_keyState[SDL_SCANCODE_LSHIFT] = 0;
}
if ( (event.key.keysym.mod & KMOD_RSHIFT) == 0 )
{
g_keyState[SDL_SCANCODE_RSHIFT] = 0;
}
if ( (event.key.keysym.mod & KMOD_LALT) == 0 )
{
g_keyState[SDL_SCANCODE_LALT] = 0;
}
if ( (event.key.keysym.mod & KMOD_RALT) == 0 )
{
g_keyState[SDL_SCANCODE_RALT] = 0;
}
if ( (event.key.keysym.mod & KMOD_LCTRL) == 0 )
{
g_keyState[SDL_SCANCODE_LCTRL] = 0;
}
if ( (event.key.keysym.mod & KMOD_RCTRL) == 0 )
{
g_keyState[SDL_SCANCODE_RCTRL] = 0;
}
g_keyState[event.key.keysym.scancode] = (event.type == SDL_KEYDOWN) ? 1 : 0;
@ -1811,7 +1842,7 @@ void InitInputInterface()
FCEUI_SetInputFourscore((eoptions & EO_FOURSCORE) != 0);
}
static ButtConfig fkbmap[0x48] = {
ButtConfig fkbmap[FAMILYKEYBOARD_NUM_BUTTONS] = {
/* 0 */ MK(SDLK_F1), MK(SDLK_F2), MK(SDLK_F3), MK(SDLK_F4), MK(SDLK_F5), MK(SDLK_F6), MK(SDLK_F7), MK(SDLK_F8),
/* 8 */ MK(SDLK_1), MK(SDLK_2), MK(SDLK_3), MK(SDLK_4), MK(SDLK_5), MK(SDLK_6), MK(SDLK_7), MK(SDLK_8), MK(SDLK_9),
/* 17 */ MK(SDLK_0),
@ -1832,15 +1863,17 @@ static ButtConfig fkbmap[0x48] = {
/**
* Update the status of the Family KeyBoard.
*/
static void UpdateFKB()
static void UpdateFKB(void)
{
int x;
char leftShiftDown;
char leftShiftDown, vkeyDown;
//static char lp[0x48];
leftShiftDown = DTestButton(&fkbmap[50]);
vkeyDown = getFamilyKeyboardVirtualKey(50);
for (x = 0; x < 0x48; x++)
leftShiftDown = DTestButton(&fkbmap[50]) || vkeyDown;
for (x = 0; x < FAMILYKEYBOARD_NUM_BUTTONS; x++)
{
if ( leftShiftDown && (x == 62) )
{ // Family BASIC appears to not like when both shift keys are pressed at the
@ -1852,7 +1885,9 @@ static void UpdateFKB()
continue;
}
if (DTestButton(&fkbmap[x]))
vkeyDown = getFamilyKeyboardVirtualKey(x);
if (DTestButton(&fkbmap[x]) || vkeyDown)
{
fkbkeys[x] = 1;
@ -1874,6 +1909,11 @@ static void UpdateFKB()
}
}
const uint8 *getFamilyKeyboardState(void)
{
return fkbkeys;
}
static ButtConfig HyperShotButtons[4] = {
MK(SDLK_Q), MK(SDLK_W), MK(SDLK_E), MK(SDLK_R)};

View File

@ -129,6 +129,7 @@ extern bool replaceP2StartWithMicrophone;
//extern ButtConfig powerpadsc[2][12];
//extern ButtConfig QuizKingButtons[6];
//extern ButtConfig FTrainerButtons[12];
extern ButtConfig fkbmap[FAMILYKEYBOARD_NUM_BUTTONS];
void IncreaseEmulationSpeed(void);
void DecreaseEmulationSpeed(void);
@ -147,6 +148,7 @@ int saveInputSettingsToFile( const char *fileBase = NULL );
int loadInputSettingsFromFile( const char *filename = NULL );
void toggleFamilyKeyboardFunc(void);
bool isFamilyKeyboardActv(void);
const uint8 *getFamilyKeyboardState(void);
#endif

View File

@ -27,7 +27,51 @@
using namespace Qt;
SDL_Scancode convQtKey2SDLScanCode(Qt::Key q)
#if defined(WIN32)
#include <windows.h>
#include <winuser.h>
static uint32_t ShiftKeyCodeR = VK_RSHIFT;
static uint32_t CtrlKeyCodeR = VK_RCONTROL;
static uint32_t AltKeyCodeR = VK_RMENU;
static uint32_t MetaKeyCodeR = VK_RWIN;
static BYTE keyBuf[256];
#elif defined(__linux__)
#if defined(_HAS_XKB)
#include <xkbcommon/xkbcommon.h>
static uint32_t ShiftKeyCodeR = XKB_KEY_Shift_R;
static uint32_t CtrlKeyCodeR = XKB_KEY_Control_R;
static uint32_t AltKeyCodeR = XKB_KEY_Alt_R;
static uint32_t MetaKeyCodeR = XKB_KEY_Meta_R;
#elif defined(_HAS_X11)
#include <X11/keysym.h>
static uint32_t ShiftKeyCodeR = XK_Shift_R;
static uint32_t CtrlKeyCodeR = XK_Control_R;
static uint32_t AltKeyCodeR = XK_Alt_R;
static uint32_t MetaKeyCodeR = XK_Meta_R;
#else
static uint32_t ShiftKeyCodeR = 0xffe2;
static uint32_t CtrlKeyCodeR = 0xffe4;
static uint32_t AltKeyCodeR = 0xffea;
static uint32_t MetaKeyCodeR = 0xffe8;
#endif
#elif defined(__APPLE__)
static uint32_t ShiftKeyCodeR = 0x003C;
static uint32_t CtrlKeyCodeR = 0x003E;
static uint32_t AltKeyCodeR = 0x003D;
static uint32_t MetaKeyCodeR = 0x0036;
#else
static uint32_t ShiftKeyCodeR = 0xffe2;
static uint32_t CtrlKeyCodeR = 0xffe4;
static uint32_t AltKeyCodeR = 0xffea;
static uint32_t MetaKeyCodeR = 0xffe8;
#endif
SDL_Scancode convQtKey2SDLScanCode(Qt::Key q, uint32_t nativeVirtualKey)
{
SDL_Scancode s = SDL_SCANCODE_UNKNOWN;
@ -90,16 +134,106 @@ SDL_Scancode convQtKey2SDLScanCode(Qt::Key q)
s = SDL_SCANCODE_PAGEDOWN;
break;
case Key_Shift:
s = SDL_SCANCODE_LSHIFT;
#if defined(WIN32)
if ( keyBuf[ShiftKeyCodeR] & 0x80 )
{
s = SDL_SCANCODE_RSHIFT;
}
else
{
s = SDL_SCANCODE_LSHIFT;
}
#else
if ( nativeVirtualKey == ShiftKeyCodeR )
{
s = SDL_SCANCODE_RSHIFT;
}
else
{
s = SDL_SCANCODE_LSHIFT;
}
#endif
break;
case Key_Control:
s = SDL_SCANCODE_LCTRL;
#ifdef __APPLE__
if ( nativeVirtualKey == MetaKeyCodeR )
{
s = SDL_SCANCODE_RGUI;
}
else
{
s = SDL_SCANCODE_LGUI;
}
#elif defined(WIN32)
if ( keyBuf[CtrlKeyCodeR] & 0x80 )
{
s = SDL_SCANCODE_RCTRL;
}
else
{
s = SDL_SCANCODE_LCTRL;
}
#else
if ( nativeVirtualKey == CtrlKeyCodeR )
{
s = SDL_SCANCODE_RCTRL;
}
else
{
s = SDL_SCANCODE_LCTRL;
}
#endif
break;
case Key_Meta:
s = SDL_SCANCODE_LGUI;
#ifdef __APPLE__
if ( nativeVirtualKey == CtrlKeyCodeR )
{
s = SDL_SCANCODE_RCTRL;
}
else
{
s = SDL_SCANCODE_LCTRL;
}
#elif defined(WIN32)
if ( keyBuf[MetaKeyCodeR] & 0x80 )
{
s = SDL_SCANCODE_RGUI;
}
else
{
s = SDL_SCANCODE_LGUI;
}
#else
if ( nativeVirtualKey == MetaKeyCodeR )
{
s = SDL_SCANCODE_RGUI;
}
else
{
s = SDL_SCANCODE_LGUI;
}
#endif
break;
case Key_Alt:
s = SDL_SCANCODE_LALT;
#if defined(WIN32)
if ( keyBuf[AltKeyCodeR] & 0x80 )
{
s = SDL_SCANCODE_RALT;
}
else
{
s = SDL_SCANCODE_LALT;
}
#else
if ( nativeVirtualKey == AltKeyCodeR )
{
s = SDL_SCANCODE_RALT;
}
else
{
s = SDL_SCANCODE_LALT;
}
#endif
break;
case Key_CapsLock:
s = SDL_SCANCODE_CAPSLOCK;
@ -497,7 +631,7 @@ SDL_Scancode convQtKey2SDLScanCode(Qt::Key q)
return s;
}
SDL_Keycode convQtKey2SDLKeyCode(Qt::Key q)
SDL_Keycode convQtKey2SDLKeyCode(Qt::Key q, uint32_t nativeVirtualKey)
{
SDL_Keycode s = SDLK_UNKNOWN;
@ -562,16 +696,115 @@ SDL_Keycode convQtKey2SDLKeyCode(Qt::Key q)
s = SDLK_PAGEDOWN;
break;
case Key_Shift:
s = SDLK_LSHIFT;
#if defined(WIN32)
if ( keyBuf[ShiftKeyCodeR] & 0x80)
{
s = SDLK_RSHIFT;
}
else
{
s = SDLK_LSHIFT;
}
#elif defined(WIN32)
if ( keyBuf[ShiftKeyCodeR] & 0x80 )
{
s = SDLK_RSHIFT;
}
else
{
s = SDLK_LSHIFT;
}
#else
if ( nativeVirtualKey == ShiftKeyCodeR )
{
s = SDLK_RSHIFT;
}
else
{
s = SDLK_LSHIFT;
}
#endif
break;
case Key_Control:
s = SDLK_LCTRL;
#ifdef __APPLE__
if ( nativeVirtualKey == MetaKeyCodeR )
{
s = SDLK_RGUI;
}
else
{
s = SDLK_LGUI;
}
#elif defined(WIN32)
if ( keyBuf[CtrlKeyCodeR] & 0x80 )
{
s = SDLK_RCTRL;
}
else
{
s = SDLK_LCTRL;
}
#else
if ( nativeVirtualKey == CtrlKeyCodeR )
{
s = SDLK_RCTRL;
}
else
{
s = SDLK_LCTRL;
}
#endif
break;
case Key_Meta:
s = SDLK_LGUI;
#ifdef __APPLE__
if ( nativeVirtualKey == CtrlKeyCodeR )
{
s = SDLK_RCTRL;
}
else
{
s = SDLK_LCTRL;
}
#elif defined(WIN32)
if ( keyBuf[MetaKeyCodeR] & 0x80 )
{
s = SDLK_RGUI;
}
else
{
s = SDLK_LGUI;
}
#else
if ( nativeVirtualKey == MetaKeyCodeR )
{
s = SDLK_RGUI;
}
else
{
s = SDLK_LGUI;
}
#endif
break;
case Key_Alt:
s = SDLK_LALT;
#if defined(WIN32)
if ( keyBuf[AltKeyCodeR] & 0x80 )
{
s = SDLK_RALT;
}
else
{
s = SDLK_LALT;
}
#else
if ( nativeVirtualKey == AltKeyCodeR )
{
s = SDLK_RALT;
}
else
{
s = SDLK_LALT;
}
#endif
break;
case Key_CapsLock:
s = SDLK_CAPSLOCK;
@ -1061,9 +1294,49 @@ int convKeyEvent2Sequence( QKeyEvent *event )
return (m | k);
}
#ifdef WIN32
uint8_t win32GetKeyState( unsigned int vkey )
{
uint8_t state = 0;
switch ( vkey )
{
case SDL_SCANCODE_LSHIFT:
state = (keyBuf[VK_LSHIFT] & 0x80) ? 1 : 0;
break;
case SDL_SCANCODE_RSHIFT:
state = (keyBuf[VK_RSHIFT] & 0x80) ? 1 : 0;
break;
case SDL_SCANCODE_LALT:
state = (keyBuf[VK_LMENU] & 0x80) ? 1 : 0;
break;
case SDL_SCANCODE_RALT:
state = (keyBuf[VK_RMENU] & 0x80) ? 1 : 0;
break;
case SDL_SCANCODE_LCTRL:
state = (keyBuf[VK_LCONTROL] & 0x80) ? 1 : 0;
break;
case SDL_SCANCODE_RCTRL:
state = (keyBuf[VK_RCONTROL] & 0x80) ? 1 : 0;
break;
case SDL_SCANCODE_LGUI:
state = (keyBuf[VK_LWIN] & 0x80) ? 1 : 0;
break;
case SDL_SCANCODE_RGUI:
state = (keyBuf[VK_RWIN] & 0x80) ? 1 : 0;
break;
default:
state = 0;
break;
}
return state;
}
#endif
int pushKeyEvent(QKeyEvent *event, int pressDown)
{
SDL_Event sdlev;
uint32_t vkey;
if (pressDown)
{
@ -1076,12 +1349,20 @@ int pushKeyEvent(QKeyEvent *event, int pressDown)
sdlev.key.state = SDL_RELEASED;
}
sdlev.key.keysym.sym = convQtKey2SDLKeyCode((Qt::Key)event->key());
#ifdef WIN32
GetKeyboardState( keyBuf );
#endif
vkey = event->nativeVirtualKey();
sdlev.key.keysym.sym = convQtKey2SDLKeyCode((Qt::Key)event->key(), vkey);
sdlev.key.keysym.scancode = SDL_GetScancodeFromKey(sdlev.key.keysym.sym);
//printf("Native ScanCode: x%08X %i \n", event->nativeScanCode(), event->nativeScanCode() );
//printf("Scancode: 0x%08X %i \n", sdlev.key.keysym.scancode, sdlev.key.keysym.scancode );
//printf("Key %s: x%08X %i\n", (sdlev.type == SDL_KEYUP) ? "UP" : "DOWN", event->key(), event->key() );
//printf(" Native ScanCode: x%08X %i \n", event->nativeScanCode(), event->nativeScanCode() );
//printf(" Virtual ScanCode: x%08X %i \n", event->nativeVirtualKey(), event->nativeVirtualKey() );
//printf(" Scancode: 0x%08X %i \n", sdlev.key.keysym.scancode, sdlev.key.keysym.scancode );
// SDL Docs say this code should never happen, but it does...
// so force it to alternative scancode algorithm if it occurs.
@ -1094,7 +1375,7 @@ int pushKeyEvent(QKeyEvent *event, int pressDown)
if ( sdlev.key.keysym.scancode == SDL_SCANCODE_UNKNOWN )
{ // If scancode is unknown, the key may be dual function via the shift key.
sdlev.key.keysym.scancode = convQtKey2SDLScanCode( (Qt::Key)event->key() );
sdlev.key.keysym.scancode = convQtKey2SDLScanCode( (Qt::Key)event->key(), vkey );
//printf("Dual Scancode: 0x%08X %i \n", sdlev.key.keysym.scancode, sdlev.key.keysym.scancode );
}

View File

@ -48,12 +48,16 @@
#include <QKeySequence>
#include <SDL.h>
SDL_Keycode convQtKey2SDLKeyCode( Qt::Key q );
SDL_Keycode convQtKey2SDLKeyCode( Qt::Key q, uint32_t nativeVirtualKey = 0 );
SDL_Scancode convQtKey2SDLScanCode( Qt::Key q );
SDL_Scancode convQtKey2SDLScanCode( Qt::Key q, uint32_t nativeVirtualKey = 0 );
SDL_Keymod convQtKey2SDLModifier( Qt::KeyboardModifiers m );
int convKeyEvent2Sequence( QKeyEvent *event );
int pushKeyEvent( QKeyEvent *event, int pressDown );
#ifdef WIN32
uint8_t win32GetKeyState( unsigned int vkey );
#endif

View File

@ -223,16 +223,18 @@ 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)
static void FDSFix(int a) {
if ((IRQa & 2) && IRQCount) {
if ((IRQa & IRQ_Enabled) && IRQCount) {
IRQCount -= a;
if (IRQCount <= 0) {
if (!(IRQa & 1)) {
IRQa &= ~2;
IRQCount = IRQLatch = 0;
} else
IRQCount = IRQLatch;
IRQCount = IRQLatch;
X6502_IRQBegin(FCEU_IQEXT);
if (!(IRQa & IRQ_Repeat)) {
IRQa &= ~IRQ_Enabled;
}
}
}
if (DiskSeekIRQ > 0) {

View File

@ -62,14 +62,14 @@
#define FCEU_VERSION_MAJOR 2
#define FCEU_VERSION_MINOR 6
#define FCEU_VERSION_PATCH 3
#define FCEU_VERSION_PATCH 4
#define FCEU_VERSION_NUMERIC ( (FCEU_VERSION_MAJOR*10000) + (FCEU_VERSION_MINOR*100) + (FCEU_VERSION_PATCH) )
#define FCEU_VERSION_MAJOR_DECODE(x) ( (x / 10000) )
#define FCEU_VERSION_MINOR_DECODE(x) ( (x / 100) % 100 )
#define FCEU_VERSION_PATCH_DECODE(x) (x % 100)
#define FCEU_VERSION_STRING "2.6.3" FCEU_SUBVERSION_STRING FCEU_FEATURE_STRING FCEU_COMPILER
#define FCEU_VERSION_STRING "2.6.4" FCEU_SUBVERSION_STRING FCEU_FEATURE_STRING FCEU_COMPILER
#define FCEU_NAME_AND_VERSION FCEU_NAME " " FCEU_VERSION_STRING
#endif

Binary file not shown.

View File

@ -73,10 +73,10 @@
<h3>Download</h3>
<ul>
<li><a href="http://sourceforge.net/projects/fceultra/files/Binaries/2.6.2/fceux-2.6.2-win32.zip/download">FCEUX 2.6.2 win32 Binary</a></li>
<li><a href="http://sourceforge.net/projects/fceultra/files/Binaries/2.6.2/qfceux-2.6.2-win64.zip/download">FCEUX 2.6.2 Qt/SDL win64 Binary</a></li>
<li><a href="http://sourceforge.net/projects/fceultra/files/Binaries/2.6.2/fceux-2.6.2-Darwin.dmg/download">FCEUX 2.6.2 MacOSX Binary</a></li>
<li><a href="https://sourceforge.net/projects/fceultra/files/latest/download">FCEUX 2.6.2 src</a></li>
<li><a href="http://sourceforge.net/projects/fceultra/files/Binaries/2.6.4/fceux-2.6.4-win32.zip/download">FCEUX 2.6.4 win32 Binary</a></li>
<li><a href="http://sourceforge.net/projects/fceultra/files/Binaries/2.6.4/qfceux-2.6.4-win64.zip/download">FCEUX 2.6.4 Qt/SDL win64 Binary</a></li>
<li><a href="http://sourceforge.net/projects/fceultra/files/Binaries/2.6.4/fceux-2.6.4-Darwin.dmg/download">FCEUX 2.6.4 MacOSX Binary</a></li>
<li><a href="https://sourceforge.net/projects/fceultra/files/latest/download">FCEUX 2.6.4 src</a></li>
</ul>
<p>If you would like to test the current in-development version of FCEUX, interim builds are available here:</p>

View File

@ -173,7 +173,7 @@
<li><a href="Intro.html">Introduction</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group" role="group"><a class="btn btn-default" href="Intro.html" title="Introduction" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="Overview.html" title="Overview" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="WhatsNew262.html" title="What's New? 2.6.2 (changelog)" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
<div class="btn-group btn-group" role="group"><a class="btn btn-default" href="Intro.html" title="Introduction" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="Overview.html" title="Overview" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="WhatsNew264.html" title="What's New? 2.6.4 (changelog)" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>

View File

@ -173,7 +173,7 @@
<li><a href="Intro.html">Introduction</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group" role="group"><a class="btn btn-default" href="Intro.html" title="Introduction" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="FCEUltraVersionHistory.html" title="FCE Ultra Version History" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="WhatsNew261.html" title="What's New? 2.6.1 (changelog)" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
<div class="btn-group btn-group" role="group"><a class="btn btn-default" href="Intro.html" title="Introduction" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="WhatsNew263.html" title="What's New? 2.6.3 (changelog)" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="WhatsNew261.html" title="What's New? 2.6.1 (changelog)" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>

304
web/help/WhatsNew263.html Normal file
View File

@ -0,0 +1,304 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="generator" content="HelpNDoc Personal Edition 7.3.0.348">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="favicon.ico"/>
<title>What's New? 2.6.3 (changelog)</title>
<meta name="description" content="" />
<meta name="keywords" content="">
<!-- Twitter Card data -->
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="What's New? 2.6.3 (changelog)">
<meta name="twitter:description" content="">
<!-- Open Graph data -->
<meta property="og:title" content="What's New? 2.6.3 (changelog)" />
<meta property="og:type" content="article" />
<meta property="og:description" content="" />
<meta property="og:site_name" content="FCEUX Help" />
<!-- Bootstrap core CSS -->
<link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head>
<body class="md-nav-expanded">
<div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>FCEUX Help</h1>
</header>
<nav id="panel-left" class="md-nav-expanded">
<!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="WhatsNew263"
data-hnd-context="91"
data-hnd-title="What's New? 2.6.3 (changelog)"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="Intro.html">Introduction</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group" role="group"><a class="btn btn-default" href="Intro.html" title="Introduction" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="WhatsNew264.html" title="What's New? 2.6.4 (changelog)" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="WhatsNew262.html" title="What's New? 2.6.2 (changelog)" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>What's New? 2.6.3 (changelog)</h2>
<div class="main-content">
<p class="rvps2"><span class="rvts22">What's New? </span><span class="rvts26">2.6.3</span></p>
<p class="rvps2"><span class="rvts6">Released -- 7 March 2022</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts29">The 2.6.3 release is a maintenance update that fixes a few bugs for both the Win32 and Qt/SDL ports.</span></p>
<p class="rvps2"><span class="rvts29"><br/></span></p>
<p class="rvps2"><span class="rvts27">Common</span></p>
<p class="rvps2"><span class="rvts27"><br/></span></p>
<p class="rvps2"><span class="rvts28">Mappers</span></p>
<ul style="text-indent: 0px; padding: 0; margin: 0 0 0 24px; list-style-position: outside; list-style-type: disc;">
<li class="rvps2"><span class="rvts30">Bug fix for mapper 16 submapper 4, allow writes to address range $6000 - $600D.</span></li>
<li class="rvps2"><span class="rvts30">Bug fix for mapper 3 bus conflict logic. Bus conflicts are now only enabled for submapper 2.</span></li>
<li class="rvps2"><span class="rvts30">FDS IRQ emulation improvement.</span></li>
<li class="rvps2"><span class="rvts30">Implemented extra RAM for mapper 225.</span></li>
</ul>
<p class="rvps2"><span class="rvts29"><br/></span></p>
<p class="rvps2"><span class="rvts27">Win32</span></p>
<p class="rvps2"><span class="rvts28"><br/></span></p>
<p class="rvps2"><span class="rvts28">Debugger</span></p>
<ul style="text-indent: 0px; padding: 0; margin: 0 0 0 24px; list-style-position: outside; list-style-type: disc;">
<li class="rvps2"><span class="rvts29">Fixed loading of saved debugger breakpoint data from previous sessions. This bug started occurring when the saved binary file format changed due to the address fields changing from 16 to 32 bit values.</span></li>
<li class="rvps2"><span class="rvts29">Fixed bug in address validation logic.</span></li>
</ul>
<p class="rvps2"><span class="rvts29"><br/></span></p>
<p class="rvps2"><span class="rvts28">Input</span></p>
<ul style="text-indent: 0px; padding: 0; margin: 0 0 0 24px; list-style-position: outside; list-style-type: disc;">
<li class="rvps2"><span class="rvts29">Fixed Meta keys combination issues.</span></li>
</ul>
<p class="rvps2"><span class="rvts29"><br/></span></p>
<p class="rvps2"><span class="rvts27">Qt/SDL</span></p>
<p class="rvps2"><span class="rvts28"><br/></span></p>
<p class="rvps2"><span class="rvts28">Input</span></p>
<ul style="text-indent: 0px; padding: 0; margin: 0 0 0 24px; list-style-position: outside; list-style-type: disc;">
<li class="rvps2"><span class="rvts29">Added a virtual family keyboard dialog window. This allows functionality such as emulating key presses via mouse and remapping keys to physical keyboard.</span></li>
<li class="rvps2"><span class="rvts29">Added code differentiate between left/right modifier key presses (shift, alt, ctrl, meta).&nbsp;</span></li>
<li class="rvps2"><span class="rvts29">Fixed keyboard bindings for Famicom family keyboard emulation.</span></li>
<li class="rvps2"><span class="rvts29">Fixed a couple bugs for some uncommonly used Qt to SDL key code conversions.</span></li>
</ul>
<p class="rvps2"><span class="rvts29"><br/></span></p>
<p class="rvps2"><span class="rvts28">GUI</span></p>
<ul style="text-indent: 0px; padding: 0; margin: 0 0 0 24px; list-style-position: outside; list-style-type: disc;">
<li class="rvps2"><span class="rvts29">Fixed keyboard menu accelerator functionality for Mac OSX (non-native menu bars only)</span></li>
</ul>
<p class="rvps2"><span class="rvts28"><br/></span></p>
<p class="rvps2"><span class="rvts27"></span><span class="rvts6"></span></p>
<p class="rvps4" style="clear: both;"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="https://www.helpndoc.com/help-authoring-tool">Full-featured multi-format Help generator</a></p>
</div>
<div id="topic_footer"><div id="topic_footer_content">2020</div></div>
</div> <!-- /#topic-content -->
</article>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html>

277
web/help/WhatsNew264.html Normal file
View File

@ -0,0 +1,277 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="generator" content="HelpNDoc Personal Edition 7.3.0.348">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="favicon.ico"/>
<title>What's New? 2.6.4 (changelog)</title>
<meta name="description" content="" />
<meta name="keywords" content="">
<!-- Twitter Card data -->
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="What's New? 2.6.4 (changelog)">
<meta name="twitter:description" content="">
<!-- Open Graph data -->
<meta property="og:title" content="What's New? 2.6.4 (changelog)" />
<meta property="og:type" content="article" />
<meta property="og:description" content="" />
<meta property="og:site_name" content="FCEUX Help" />
<!-- Bootstrap core CSS -->
<link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head>
<body class="md-nav-expanded">
<div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>FCEUX Help</h1>
</header>
<nav id="panel-left" class="md-nav-expanded">
<!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="WhatsNew264"
data-hnd-context="92"
data-hnd-title="What's New? 2.6.4 (changelog)"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="Intro.html">Introduction</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group" role="group"><a class="btn btn-default" href="Intro.html" title="Introduction" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="FCEUltraVersionHistory.html" title="FCE Ultra Version History" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="WhatsNew263.html" title="What's New? 2.6.3 (changelog)" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>What's New? 2.6.4 (changelog)</h2>
<div class="main-content">
<p class="rvps2"><span class="rvts22">What's New? </span><span class="rvts26">2.6.4</span></p>
<p class="rvps2"><span class="rvts6">Released -- 24 March 2022</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts29">The 2.6.4 release is a maintenance update that fixes a couple bugs for the Qt/SDL port.</span></p>
<p class="rvps2"><span class="rvts29"><br/></span></p>
<p class="rvps2"><span class="rvts29"><br/></span></p>
<p class="rvps2"><span class="rvts27">Qt/SDL</span></p>
<p class="rvps2"><span class="rvts28"><br/></span></p>
<p class="rvps2"><span class="rvts28">GUI</span></p>
<ul style="text-indent: 0px; padding: 0; margin: 0 0 0 24px; list-style-position: outside; list-style-type: disc;">
<li class="rvps2"><span class="rvts29">Fixed crash that sometimes occurs when cancelling a key mapping sub-dialog for virtual family keyboard window (Crash occurred most often on MacOS).</span></li>
</ul>
<p class="rvps2"><span class="rvts29"><br/></span></p>
<p class="rvps2"><span class="rvts28">NES Header Editor</span></p>
<ul style="text-indent: 0px; padding: 0; margin: 0 0 0 24px; list-style-position: outside; list-style-type: disc;">
<li class="rvps2"><span class="rvts29">Fixed mapper combo box indexing issue.</span><span class="rvts6"></span></li>
</ul>
<p class="rvps4" style="clear: both;"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="https://www.helpauthoringsoftware.com">Benefits of a Help Authoring Tool</a></p>
</div>
<div id="topic_footer"><div id="topic_footer_content">2020</div></div>
</div> <!-- /#topic-content -->
</article>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html>

File diff suppressed because one or more lines are too long

14
web/help/context/91.html Normal file
View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "What's New? 2.6.3 (changelog)"</title>
<link rel="canonical" href="../WhatsNew263.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../WhatsNew263.html" />
</head>
</html>

14
web/help/context/92.html Normal file
View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "What's New? 2.6.4 (changelog)"</title>
<link rel="canonical" href="../WhatsNew264.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../WhatsNew264.html" />
</head>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -53,10 +53,10 @@
<p>&nbsp;</p>
<h1>Latest Release</h1>
<p><span class="largerfont">FCEUX 2.6.2</span><br/>
04 February 2022</p>
<p>The 2.6.2 is a maintenance update that adds a couple minor features and fixes a few bugs for the Qt/SDL port.</p>
<p><a href="help/WhatsNew262.html">Full changelog</a></p>
<p><span class="largerfont">FCEUX 2.6.4</span><br/>
24 March 2022</p>
<p>The 2.6.4 release is a maintenance update that fixes a couple bugs for the Qt/SDL port.</p>
<p><a href="help/WhatsNew264.html">Full changelog</a></p>
<p>
<hr>
<br>Windows Port Debugging Environment for Version 2.2.0<br><a href="assets/debugging_environment_1900px.png"><img alt="FCEUX as a debugging environment" src="assets/debugging_environment_640px.png"></a></p>

View File

@ -0,0 +1,92 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<link href="fceux.css" rel="stylesheet" type="text/css" />
<title>Press Release 2.6.3</title>
</head>
<body>
<div id="masthead">
<span class="largerfont">FCEUX<br/></span>The all in one NES/Famicom/Dendy Emulator
</div>
<div id="top_nav">
<a href="home.html">Home</a>
<a href="download.html">Download</a>
<a href="documentation.html">Documentation</a>
<a href="version.html">Versions</a>
<a href="contact.html">Contact</a>
<a href="links.html">Links</a>
</div>
<div id="container">
<div id="left_col">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
style="display:inline-block;width:180px;height:150px"
data-ad-client="ca-pub-0764229755985190"
data-ad-slot="7648866201"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
style="display:inline-block;width:180px;height:150px"
data-ad-client="ca-pub-0764229755985190"
data-ad-slot="7648866201"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
<div id="page_content">
<h1>FCEUX 2.6.3 Maintenance Release</h1>
<p>07 March 2022</p>
<p>
The 2.6.3 release is a maintenance update that fixes a few bugs for both the Win32 and Qt/SDL ports.
This release features significant family keyboard emulation improvements for the Qt GUI.
</p>
<h2>Common</h2>
<h3>Core</h3>
FDS IRQ emulation improvement.<br>
<h3>Mappers</h3>
Bug fix for mapper 16 submapper 4, allow writes to address range $6000 - $600D.<br>
Bug fix for mapper 3 bus conflict logic. Bus conflicts are now only enabled for submapper 2.<br>
Implemented extra RAM for mapper 225.<br>
<h2>Win32</h2>
<h3>Debugger</h3>
Fixed loading of saved debugger breakpoint data from previous sessions. This bug started occurring when the saved binary file format changed due to the address fields changing from 16 to 32 bit values.<br>
Fixed bug in address validation logic.<br>
<h3>Input</h3>
Fixed Meta keys combination issues.<br>
<h2>Qt/SDL</h2>
<h3>Input</h3>
Added a virtual family keyboard dialog window. This allows functionality such as emulating key presses via mouse and remapping keys to physical keyboard.<br>
Added code differentiate between left/right modifier key presses (shift, alt, ctrl, meta).<br>
Fixed keyboard bindings for Famicom family keyboard emulation.<br>
Fixed a couple bugs for some uncommonly used Qt to SDL key code conversions.<br>
<h3>GUI</h3>
Fixed keyboard menu accelerator functionality for Mac OSX (non-native menu bars only)<br>
</div>
<p>
<hr>
<div id="footer">
<a href="home.html">Home</a> | <a href="download.html">Download</a> |
<a href="documentation.html">Documentation</a> | <a href="version.html">
Version History</a> | <a href="contact.html">Contact</a> | <a href="links.html">Links</a>
<br/>We are in no way affiliated or endorsed by Nintendo or Nintendo of America. "Nintendo" is a registered trademark of Nintendo of America Inc.
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,69 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<link href="fceux.css" rel="stylesheet" type="text/css" />
<title>Press Release 2.6.4</title>
</head>
<body>
<div id="masthead">
<span class="largerfont">FCEUX<br/></span>The all in one NES/Famicom/Dendy Emulator
</div>
<div id="top_nav">
<a href="home.html">Home</a>
<a href="download.html">Download</a>
<a href="documentation.html">Documentation</a>
<a href="version.html">Versions</a>
<a href="contact.html">Contact</a>
<a href="links.html">Links</a>
</div>
<div id="container">
<div id="left_col">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
style="display:inline-block;width:180px;height:150px"
data-ad-client="ca-pub-0764229755985190"
data-ad-slot="7648866201"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
style="display:inline-block;width:180px;height:150px"
data-ad-client="ca-pub-0764229755985190"
data-ad-slot="7648866201"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
<div id="page_content">
<h1>FCEUX 2.6.4 Maintenance Release</h1>
<p>24 March 2022</p>
<p>
The 2.6.4 release is a maintenance update that fixes a couple bugs for Qt/SDL port.
</p>
<h2>Qt/SDL</h2>
<h3>GUI</h3>
Fixed crash that sometimes occurs when cancelling a key mapping sub-dialog for virtual family keyboard window (Crash occurred most often on MacOS).<br>
<h3>NES Header Editor</h3>
Fixed mapper combo box indexing issue.<br>
</div>
<p>
<hr>
<div id="footer">
<a href="home.html">Home</a> | <a href="download.html">Download</a> |
<a href="documentation.html">Documentation</a> | <a href="version.html">
Version History</a> | <a href="contact.html">Contact</a> | <a href="links.html">Links</a>
<br/>We are in no way affiliated or endorsed by Nintendo or Nintendo of America. "Nintendo" is a registered trademark of Nintendo of America Inc.
</div>
</div>
</body>
</html>

View File

@ -55,6 +55,8 @@
FCEU rerecording, FCEUXD, and FCEUXDSP as well as many new mappers from
FCEU-mm.</p>
<h3>FCEUX version history</h3>
<dd><li><a href="pressrelease-2.6.4.html">FCEUX 2.6.4</a> - 24 March 2022</li></dd>
<dd><li><a href="pressrelease-2.6.3.html">FCEUX 2.6.3</a> - 07 March 2022</li></dd>
<dd><li><a href="pressrelease-2.6.2.html">FCEUX 2.6.2</a> - 04 February 2022</li></dd>
<dd><li><a href="pressrelease-2.6.1.html">FCEUX 2.6.1</a> - 17 January 2022</li></dd>
<dd><li><a href="pressrelease-2.6.0.html">FCEUX 2.6.0</a> - 12 January 2022</li></dd>