Merge branch 'TASEmulators:master' into master
This commit is contained in:
commit
00772532b9
4
README
4
README
|
@ -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
|
||||
-----------------
|
||||
|
|
3
TODO-SDL
3
TODO-SDL
|
@ -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.
|
||||
|
|
BIN
output/fceux.chm
BIN
output/fceux.chm
Binary file not shown.
|
@ -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";
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
@ -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
|
@ -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 );
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
//----------------------------------------------------
|
||||
|
|
|
@ -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", "");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)};
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
14
src/fds.cpp
14
src/fds.cpp
|
@ -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) {
|
||||
|
|
|
@ -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.
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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). </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">×</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>
|
||||
|
|
@ -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">×</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
|
@ -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>
|
||||
|
|
@ -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
|
@ -53,10 +53,10 @@
|
|||
<p> </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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue