puae 2.3.1

parent 48918717
#-------------------------------------------------
#
# Project created by QtCreator 2010-10-11T09:11:05
#
#-------------------------------------------------
QT += core gui
TARGET = PUAE
TEMPLATE = app
SOURCES += main.cpp\
puae_mainwindow.cpp
HEADERS += puae_mainwindow.h
FORMS += puae_mainwindow.ui
<!DOCTYPE QtCreatorProject>
<qtcreator>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value key="EditorConfiguration.Codec" type="QByteArray">System</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Desktop</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Target.DesktopTarget</value>
<value key="ProjectExplorer.Target.ActiveBuildConfiguration" type="int">0</value>
<value key="ProjectExplorer.Target.ActiveRunConfiguration" type="int">0</value>
<valuemap key="ProjectExplorer.Target.BuildConfiguration.0" type="QVariantMap">
<valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.0" type="QVariantMap">
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">qmake</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">QtProjectManager.QMakeBuildStep</value>
<valuelist key="QtProjectManager.QMakeBuildStep.QMakeArguments" type="QVariantList"/>
</valuemap>
<valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.1" type="QVariantMap">
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
<value key="Qt4ProjectManager.MakeStep.Clean" type="bool">false</value>
<valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList"/>
<value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
</valuemap>
<value key="ProjectExplorer.BuildConfiguration.BuildStepsCount" type="int">2</value>
<valuemap key="ProjectExplorer.BuildConfiguration.CleanStep.0" type="QVariantMap">
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
<value key="Qt4ProjectManager.MakeStep.Clean" type="bool">true</value>
<valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList">
<value type="QString">clean</value>
</valuelist>
<value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
</valuemap>
<value key="ProjectExplorer.BuildConfiguration.CleanStepsCount" type="int">1</value>
<value key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment" type="bool">false</value>
<valuelist key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges" type="QVariantList"/>
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Debug</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration" type="int">2</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory" type="QString">/home/gnostic/qt_workspace/PUAE/PUAE-build-desktop</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId" type="int">5</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.ToolChain" type="int">0</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild" type="bool">true</value>
</valuemap>
<valuemap key="ProjectExplorer.Target.BuildConfiguration.1" type="QVariantMap">
<valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.0" type="QVariantMap">
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">qmake</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">QtProjectManager.QMakeBuildStep</value>
<valuelist key="QtProjectManager.QMakeBuildStep.QMakeArguments" type="QVariantList"/>
</valuemap>
<valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.1" type="QVariantMap">
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
<value key="Qt4ProjectManager.MakeStep.Clean" type="bool">false</value>
<valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList"/>
<value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
</valuemap>
<value key="ProjectExplorer.BuildConfiguration.BuildStepsCount" type="int">2</value>
<valuemap key="ProjectExplorer.BuildConfiguration.CleanStep.0" type="QVariantMap">
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
<value key="Qt4ProjectManager.MakeStep.Clean" type="bool">true</value>
<valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList">
<value type="QString">clean</value>
</valuelist>
<value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
</valuemap>
<value key="ProjectExplorer.BuildConfiguration.CleanStepsCount" type="int">1</value>
<value key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment" type="bool">false</value>
<valuelist key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges" type="QVariantList"/>
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Release</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration" type="int">0</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory" type="QString">/Users/GnoStiC/Desktop/qt_workspace/PUAE/PUAE-build-desktop</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId" type="int">2</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.ToolChain" type="int">0</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild" type="bool">true</value>
</valuemap>
<value key="ProjectExplorer.Target.BuildConfigurationCount" type="int">2</value>
<valuemap key="ProjectExplorer.Target.RunConfiguration.0" type="QVariantMap">
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">PUAE</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4RunConfiguration</value>
<value key="Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase" type="int">2</value>
<valuelist key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments" type="QVariantList"/>
<value key="Qt4ProjectManager.Qt4RunConfiguration.ProFile" type="QString">PUAE.pro</value>
<value key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix" type="bool">false</value>
<value key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal" type="bool">false</value>
<valuelist key="Qt4ProjectManager.Qt4RunConfiguration.UserEnvironmentChanges" type="QVariantList"/>
<value key="Qt4ProjectManager.Qt4RunConfiguration.UserSetName" type="bool">false</value>
<value key="Qt4ProjectManager.Qt4RunConfiguration.UserSetWorkingDirectory" type="bool">false</value>
<value key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory" type="QString"></value>
</valuemap>
<value key="ProjectExplorer.Target.RunConfigurationCount" type="int">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">4</value>
</data>
</qtcreator>
#include <QtGui/QApplication>
#include "puae_mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
puae_MainWindow w;
w.show();
return a.exec();
}
#include "puae_mainwindow.h"
#include "ui_puae_mainwindow.h"
#include <QMessageBox>
#include <QDir>
#include <QFileDialog>
struct uae_prefs workprefs;
// Paths Tab
QString PATHS_ROM, PATHS_CONFIG, PATHS_SCREENSHOT, PATHS_SAVESTATE, PATHS_AVIOUTPUT, PATHS_SAVEIMAGE, PATHS_RIP;
// mem
static const char *memsize_names[] = {
/* 0 */ "none",
/* 1 */ "256 K",
/* 2 */ "512 K",
/* 3 */ "1 MB",
/* 4 */ "2 MB",
/* 5 */ "4 MB",
/* 6 */ "8 MB",
/* 7 */ "16 MB",
/* 8 */ "32 MB",
/* 9 */ "64 MB",
/* 10*/ "128 MB",
/* 11*/ "256 MB",
/* 12*/ "512 MB",
/* 13*/ "1 GB",
/* 14*/ "1.5MB",
/* 15*/ "1.8MB",
/* 16*/ "2 GB",
/* 17*/ "384 MB",
/* 18*/ "768 MB",
/* 19*/ "1.5 GB",
/* 20*/ "2.5 GB",
/* 21*/ "3 GB"
};
static unsigned long memsizes[] = {
/* 0 */ 0,
/* 1 */ 0x00040000, /* 256K */
/* 2 */ 0x00080000, /* 512K */
/* 3 */ 0x00100000, /* 1M */
/* 4 */ 0x00200000, /* 2M */
/* 5 */ 0x00400000, /* 4M */
/* 6 */ 0x00800000, /* 8M */
/* 7 */ 0x01000000, /* 16M */
/* 8 */ 0x02000000, /* 32M */
/* 9 */ 0x04000000, /* 64M */
/* 10*/ 0x08000000, //128M
/* 11*/ 0x10000000, //256M
/* 12*/ 0x20000000, //512M
/* 13*/ 0x40000000, //1GB
/* 14*/ 0x00180000, //1.5MB
/* 15*/ 0x001C0000, //1.8MB
/* 16*/ 0x80000000, //2GB
/* 17*/ 0x18000000, //384M
/* 18*/ 0x30000000, //768M
/* 19*/ 0x60000000, //1.5GB
/* 20*/ 0xA8000000, //2.5GB
/* 21*/ 0xC0000000, //3GB
};
static int msi_chip[] = { 1, 2, 3, 14, 4, 5, 6 };
static int msi_bogo[] = { 0, 2, 3, 14, 15 };
static int msi_fast[] = { 0, 3, 4, 5, 6 };
static int msi_z3fast[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 17, 12, 18, 13, 19, 16, 20, 21 };
static int msi_z3chip[] = { 0, 7, 8, 9, 10, 11, 12, 13 };
static int msi_gfx[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
puae_MainWindow::puae_MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::puae_MainWindow)
{
ui->setupUi(this);
QString myPath;
myPath = QDir::currentPath();
// Paths Tab
PATHS_ROM = myPath;
PATHS_CONFIG = myPath;
PATHS_SCREENSHOT = myPath;
PATHS_SAVESTATE = myPath;
PATHS_AVIOUTPUT = myPath;
PATHS_SAVEIMAGE = myPath;
PATHS_RIP = myPath;
}
puae_MainWindow::~puae_MainWindow()
{
delete ui;
}
//
//
//
QString puae_MainWindow::GetPath(QWidget *who, QString what, QString where)
{
QString path = QFileDialog::getExistingDirectory(who, what, where, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if ( path.isNull() ) {
path = "./";
}
return path;
}
QString puae_MainWindow::GetFile(QWidget *who, QString what, QString extensions)
{
QString file = QFileDialog::getOpenFileName(who, what, PATHS_ROM, extensions);
// if ( !file.isNull() ) {
return file;
}
//*************************************************
// PATHS TAB
//*************************************************
/* Choose System ROMS Path */
void puae_MainWindow::on_IDC_PATHS_ROMS_clicked()
{
PATHS_ROM = GetPath(this, "Select System ROMS Path", PATHS_ROM);
ui->IDC_PATHS_ROM->setText (PATHS_ROM);
}
/* Choose Configuration Files Path */
void puae_MainWindow::on_IDC_PATHS_CONFIGS_clicked()
{
PATHS_CONFIG = GetPath(this, "Select Config Path", PATHS_CONFIG);
ui->IDC_PATHS_CONFIG->setText (PATHS_CONFIG);
}
/* Choose Screenshot Path */
void puae_MainWindow::on_IDC_PATHS_SCREENSHOTS_clicked()
{
PATHS_SCREENSHOT = GetPath(this, "Select Screenshot Path", PATHS_SCREENSHOT);
ui->IDC_PATHS_SCREENSHOT->setText (PATHS_SCREENSHOT);
}
/* Choose Savestate Path */
void puae_MainWindow::on_IDC_PATHS_SAVESTATES_clicked()
{
PATHS_SAVESTATE = GetPath(this, "Select Savestate Path", PATHS_SAVESTATE);
ui->IDC_PATHS_SAVESTATE->setText (PATHS_SAVESTATE);
}
/* Choose AVI Output Path */
void puae_MainWindow::on_IDC_PATHS_AVIOUTPUTS_clicked()
{
PATHS_AVIOUTPUT = GetPath(this, "Select AVI Output Path", PATHS_AVIOUTPUT);
ui->IDC_PATHS_AVIOUTPUT->setText (PATHS_AVIOUTPUT);
}
/* Choose Save Images Path */
void puae_MainWindow::on_IDC_PATHS_SAVEIMAGES_clicked()
{
PATHS_SAVEIMAGE = GetPath(this, "Select Save Image Path", PATHS_SAVEIMAGE);
ui->IDC_PATHS_SAVEIMAGE->setText (PATHS_SAVEIMAGE);
}
/* Choose RIP Path */
void puae_MainWindow::on_IDC_PATHS_RIPS_clicked()
{
PATHS_RIP = GetPath(this, "Select RIP Path", PATHS_RIP);
ui->IDC_PATHS_RIP->setText (PATHS_RIP);
}
//*************************************************
// ROMS TAB
//*************************************************
/* Choose Main ROM File */
void puae_MainWindow::on_IDC_KICKCHOOSER_clicked()
{
QString fileName = GetFile (this, "Select Main ROM", "ROM Files (*.rom)");
//ui->IDC_ROMFILE->setText(fileName);
}
/* Choose Extended ROM File */
void puae_MainWindow::on_IDC_ROMCHOOSER2_clicked()
{
QString fileName = GetFile (this, "Select Extended ROM", "ROM Files (*.rom)");
}
/* Choose Cartridge ROM File */
void puae_MainWindow::on_IDC_CARTCHOOSER_clicked()
{
QString fileName = GetFile (this, "Select Cartridge ROM File", "ROM Files (*.rom)");
}
/* Choose Flash RAM File */
void puae_MainWindow::on_IDC_FLASHCHOOSER_clicked()
{
QString fileName = GetFile (this, "Select Flash RAM File", "RAM Files (*.ram)");
}
/* Map ROM Emulation */
void puae_MainWindow::on_IDC_MAPROM_toggled(bool ischecked)
{
workprefs.maprom = ischecked ? 0x0f000000 : 0;
}
/* Shapeshifter support */
void puae_MainWindow::on_IDC_KICKSHIFTER_toggled(bool ischecked)
{
workprefs.kickshifter = ischecked;
}
//*************************************************
// HW-CPU
//*************************************************
/* CPU 68000 */
void puae_MainWindow::on_IDC_CPU0_clicked()
{
workprefs.cpu_model = 0;
}
/* CPU 68010 */
void puae_MainWindow::on_IDC_CPU1_clicked()
{
workprefs.cpu_model = 1;
}
/* CPU 68020 */
void puae_MainWindow::on_IDC_CPU2_clicked()
{
workprefs.cpu_model = 2;
}
/* CPU 68030 */
void puae_MainWindow::on_IDC_CPU3_clicked()
{
workprefs.cpu_model = 3;
}
/* CPU 68040 */
void puae_MainWindow::on_IDC_CPU4_clicked()
{
workprefs.cpu_model = 4;
}
/* CPU 68060 */
void puae_MainWindow::on_IDC_CPU5_clicked()
{
workprefs.cpu_model = 5;
}
/* 24-bit Addressing */
void puae_MainWindow::on_IDC_COMPATIBLE24_toggled(bool ischecked)
{
workprefs.address_space_24 = ischecked;
}
/* More Compatible */
void puae_MainWindow::on_IDC_COMPATIBLE_toggled(bool ischecked)
{
workprefs.cpu_compatible = ischecked;
}
/* JIT Enable */
void puae_MainWindow::on_IDC_JITENABLE_toggled(bool ischecked)
{
// cachesize_prev = workprefs.cachesize;
// trust_prev = workprefs.comptrustbyte;
workprefs.cachesize = 0;
}
/*68040 MMU Enable */
void puae_MainWindow::on_IDC_MMUENABLE_toggled(bool ischecked)
{
//workprefs
}
/* FPU None */
void puae_MainWindow::on_IDC_FPU0_clicked()
{
workprefs.mmu_model = 0;
}
/* FPU 68881 */
void puae_MainWindow::on_IDC_FPU1_clicked()
{
workprefs.mmu_model = 1;
}
/* FPU 68882 */
void puae_MainWindow::on_IDC_FPU2_clicked()
{
workprefs.mmu_model = 2;
}
/* FPU Internal */
void puae_MainWindow::on_IDC_FPU3_clicked()
{
workprefs.mmu_model = 3;
}
/* FPU More Compatible */
void puae_MainWindow::on_IDC_COMPATIBLE_FPU_toggled(bool ischecked)
{
//workprefs.fpu_strict = ischecked;
}
/* CPU Fastest Possible */
void puae_MainWindow::on_IDC_CS_HOST_clicked()
{
workprefs.m68k_speed = -1;
}
/* CPU Cycle-Exact */
void puae_MainWindow::on_IDC_CS_68000_clicked()
{
workprefs.m68k_speed = 0;
}
/* CPU Adjustable */
void puae_MainWindow::on_IDC_CS_ADJUSTABLE_clicked()
{
workprefs.m68k_speed = 1;
}
/* CPU CPU<-->Chipset */
void puae_MainWindow::on_IDC_SPEED_valueChanged(int value)
{
}
/* CPU CPU Idle*/
void puae_MainWindow::on_IDC_CPUIDLE_sliderMoved(int position)
{
}
/* CPU CE */
void puae_MainWindow::on_IDC_CPU_FREQUENCY_currentIndexChanged(int index)
{
}
//*************************************************
// HW-Chipset
//*************************************************
/* OCS */
void puae_MainWindow::on_IDC_OCS_clicked()
{
workprefs.chipset_mask = 0;
}
/* ECS AGNUS */
void puae_MainWindow::on_IDC_ECS_AGNUS_clicked()
{
workprefs.chipset_mask = 1;
}
/* ECS DENISE */
void puae_MainWindow::on_IDC_ECS_DENISE_clicked()
{
workprefs.chipset_mask = 2;
}
/* ECS FULL = AGNUS + DENISE */
void puae_MainWindow::on_IDC_ECS_clicked()
{
workprefs.chipset_mask = 3;
}
/* AGA */
void puae_MainWindow::on_IDC_AGA_clicked()
{
workprefs.chipset_mask = 4;
}
/* NTSC */
void puae_MainWindow::on_IDC_NTSC_toggled(bool ischecked)
{
workprefs.ntscmode = ischecked;
}
/* Chipset Extra */
void puae_MainWindow::on_IDC_CS_EXT_currentIndexChanged(int index)
{
}
/* Blitter Immediate */
void puae_MainWindow::on_IDC_BLITIMM_toggled(bool ischecked)
{
workprefs.immediate_blits = ischecked;
}
/* Cycle Exact */
void puae_MainWindow::on_IDC_CYCLEEXACT_toggled(bool ischecked)
{
workprefs.cpu_cycle_exact = ischecked;
}
/* Genlock Enabled */
void puae_MainWindow::on_IDC_GENLOCK_toggled(bool ischecked)
{
workprefs.genlock = ischecked;
}
/* Sprite Collision None */
void puae_MainWindow::on_IDC_COLLISION0_clicked()
{
workprefs.collision_level = 0;
}
/* Sprites Only */
void puae_MainWindow::on_IDC_COLLISION1_clicked()
{
workprefs.collision_level = 1;
}
/* Sprites and Sprites vs Playfield */
void puae_MainWindow::on_IDC_COLLISION2_clicked()
{
workprefs.collision_level = 2;
}
/* Collision Full */
void puae_MainWindow::on_IDC_COLLISION3_clicked()
{
workprefs.collision_level = 3;
}
/* Sound Disabled */
void puae_MainWindow::on_IDC_CS_SOUND0_clicked()
{
workprefs.produce_sound = 0;
}
/* Sound Emulated */
void puae_MainWindow::on_IDC_CS_SOUND1_clicked()
{
workprefs.produce_sound = 1;
}
/* Sound Emulated %100 */
void puae_MainWindow::on_IDC_CS_SOUND2_clicked()
{
workprefs.produce_sound = 2;
}
//*************************************************
// Advanced Chipset
//*************************************************
/* Compatible Settings */
void puae_MainWindow::on_IDC_CS_COMPATIBLE_toggled(bool ischecked)
{
workprefs.cs_compatible = ischecked;
}
/* Battery Backed Real Time Clock None */
void puae_MainWindow::on_IDC_CS_RTC1_clicked()
{
workprefs.cs_rtc = 0;
}
/* Battery Backed Real Time Clock None */
void puae_MainWindow::on_IDC_CS_RTC2_clicked()
{
workprefs.cs_rtc = 1;
}
/* Battery Backed Real Time Clock None */
void puae_MainWindow::on_IDC_CS_RTC3_clicked()
{
workprefs.cs_rtc = 2;
}
/* CIA-A TOD Clock Source */
void puae_MainWindow::on_IDC_CS_CIAA_TOD1_clicked()
{
workprefs.cs_ciaatod = 0;
}
/* CIA-A TOD Clock Source */
void puae_MainWindow::on_IDC_CS_CIAA_TOD2_clicked()
{
workprefs.cs_ciaatod = 1;
}
/* CIA-A TOD Clock Source */
void puae_MainWindow::on_IDC_CS_CIAA_TOD3_clicked()
{
workprefs.cs_ciaatod = 2;
}
/* CIA ROM Overlay */
void puae_MainWindow::on_IDC_CS_CIAOVERLAY_toggled(bool ischecked)
{
workprefs.cs_ciaoverlay = ischecked;
}
/* CD32 CD */
void puae_MainWindow::on_IDC_CS_CD32CD_toggled(bool ischecked)
{
workprefs.cs_cd32cd = ischecked;
}
void puae_MainWindow::on_IDC_CS_CD32C2P_toggled(bool ischecked)
{
workprefs.cs_cd32c2p = ischecked;
}
void puae_MainWindow::on_IDC_CS_CD32NVRAM_toggled(bool ischecked)
{
workprefs.cs_cd32nvram = ischecked;
}
void puae_MainWindow::on_IDC_CS_CDTVCD_toggled(bool ischecked)
{
workprefs.cs_cdtvcd = ischecked;
}
void puae_MainWindow::on_IDC_CS_CDTVRAM_toggled(bool ischecked)
{
workprefs.cs_cdtvram = ischecked;
}
void puae_MainWindow::on_IDC_CS_IDE1_toggled(bool ischecked)
{
workprefs.cs_ide = (ui->IDC_CS_IDE1->checkState()) ? 1 : ((ui->IDC_CS_IDE2->checkState()) ? 2 : 0);
}
void puae_MainWindow::on_IDC_CS_IDE2_toggled(bool ischecked)
{
workprefs.cs_ide = (ui->IDC_CS_IDE1->checkState()) ? 1 : ((ui->IDC_CS_IDE2->checkState()) ? 2 : 0);
}
/* ROM Mirror E0 */
void puae_MainWindow::on_IDC_CS_KSMIRROR_E0_toggled(bool ischecked)
{
workprefs.cs_ksmirror_e0 = ischecked;
}
/* ROM Mirror A8 */
void puae_MainWindow::on_IDC_CS_KSMIRROR_A8_toggled(bool ischecked)
{
workprefs.cs_ksmirror_a8 = ischecked;
}
/* C00000 is Fast RAM */
void puae_MainWindow::on_IDC_CS_SLOWISFAST_toggled(bool ischecked)
{
workprefs.cs_slowmemisfast = ischecked;
}
/* A1000 Boot ROM/RAM */
void puae_MainWindow::on_IDC_CS_A1000RAM_toggled(bool ischecked)
{
workprefs.cs_a1000ram = ischecked;
}
/* DF0: ID Hardware */
void puae_MainWindow::on_IDC_CS_DF0IDHW_toggled(bool ischecked)
{
workprefs.cs_df0idhw = ischecked;
}
/* CDTV SRAM Expansion */
void puae_MainWindow::on_IDC_CS_CDTVRAMEXP_toggled(bool ischecked)
{
workprefs.cs_cdtvram = ischecked;
}
/* PCMCIA */
void puae_MainWindow::on_IDC_CS_PCMCIA_toggled(bool ischecked)
{
workprefs.cs_pcmcia = ischecked;
}
/* KB Reset Warning */
void puae_MainWindow::on_IDC_CS_RESETWARNING_toggled(bool ischecked)
{
workprefs.cs_resetwarning = ischecked;
}
/* No-EHB DENISE */
void puae_MainWindow::on_IDC_CS_NOEHB_toggled(bool ischecked)
{
workprefs.cs_denisenoehb = ischecked;
}
/* A1000 Agnus */
void puae_MainWindow::on_IDC_CS_DIPAGNUS_toggled(bool ischecked)
{
workprefs.cs_dipagnus = ischecked;
}
/* A590/A2091 SCSI */
void puae_MainWindow::on_IDC_CS_A2091_toggled(bool ischecked)
{
workprefs.cs_a2091 = ischecked;
}
/* A3000 SCSI */
void puae_MainWindow::on_IDC_CS_DMAC_toggled(bool ischecked)
{
workprefs.cs_mbdmac = (ui->IDC_CS_DMAC->checkState()) ? 1 : ((ui->IDC_CS_DMAC2->checkState()) ? 2 : 0);
}
/* A4000T SCSI */
void puae_MainWindow::on_IDC_CS_DMAC2_toggled(bool ischecked)
{
workprefs.cs_mbdmac = (ui->IDC_CS_DMAC->checkState()) ? 1 : ((ui->IDC_CS_DMAC2->checkState()) ? 2 : 0);
}
/* A4901 SCSI */
void puae_MainWindow::on_IDC_CS_A4091_toggled(bool ischecked)
{
workprefs.cs_a4091 = ischecked;
}
/* CDTV SCSI */
void puae_MainWindow::on_IDC_CS_CDTVSCSI_toggled(bool ischecked)
{
workprefs.cs_cdtvscsi = ischecked;
}
/* Ramsey Revision */
void puae_MainWindow::on_IDC_CS_RAMSEY_toggled(bool ischecked)
{
workprefs.cs_ramseyrev = ischecked ? 0x0f : -1;
//ui->IDC_CS_RAMSEYREV->setText(workprefs.cs_ramseyrev);
}
/* Fat Gary Revision */
void puae_MainWindow::on_IDC_CS_FATGARY_toggled(bool ischecked)
{
workprefs.cs_fatgaryrev = ischecked ? 0x00 : -1;
}
/* Agnus/Alice Revision */
void puae_MainWindow::on_IDC_CS_AGNUS_toggled(bool checked)
{
}
/* Denise/Lisa Revision */
void puae_MainWindow::on_IDC_CS_DENISE_toggled(bool checked)
{
}
//*************************************************
// RAM
//*************************************************
/* Chip RAM */
void puae_MainWindow::on_IDC_CHIPMEM_valueChanged(int value)
{
workprefs.chipmem_size = memsizes[msi_chip[value]];
ui->IDC_CHIPRAM->setText(memsize_names[msi_chip[value]]);
}
/* Fast RAM */
void puae_MainWindow::on_IDC_FASTMEM_valueChanged(int value)
{
workprefs.fastmem_size = memsizes[msi_fast[value]];
ui->IDC_FASTRAM->setText(memsize_names[msi_fast[value]]);
}
/* Slow RAM */
void puae_MainWindow::on_IDC_SLOWMEM_valueChanged(int value)
{
workprefs.bogomem_size = memsizes[msi_bogo[value]];
ui->IDC_SLOWRAM->setText(memsize_names[msi_bogo[value]]);
}
/* Z3 Fast RAM */
void puae_MainWindow::on_IDC_Z3FASTMEM_valueChanged(int value)
{
workprefs.z3chipmem_size = memsizes[msi_z3fast[value]];
ui->IDC_Z3FASTRAM->setText(memsize_names[msi_z3fast[value]]);
}
/* Motherboard Fast RAM */
void puae_MainWindow::on_IDC_MBMEM1_valueChanged(int value)
{
workprefs.mbresmem_low_size = memsizes[msi_gfx[value]];
ui->IDC_MBRAM1->setText(memsize_names[msi_gfx[value]]);
}
/* Processor Slot RAM */
void puae_MainWindow::on_IDC_MBMEM2_valueChanged(int value)
{
workprefs.mbresmem_high_size = memsizes[msi_gfx[value]];
ui->IDC_MBRAM2->setText(memsize_names[msi_gfx[value]]);
}
void puae_MainWindow::on_IDC_FLOPPYSPD_valueChanged(int value)
{
workprefs.floppy_speed = value;
if (workprefs.floppy_speed > 0) {
workprefs.floppy_speed--;
workprefs.floppy_speed = 1 << workprefs.floppy_speed;
workprefs.floppy_speed *= 100;
}
out_floppyspeed();
}
//
// Santa's Little Helpers
//
void puae_MainWindow::fix_values_memorydlg()
{
if (workprefs.chipmem_size > 0x200000)
workprefs.fastmem_size = 0;
}
void puae_MainWindow::updatez3 (unsigned int *size1p, unsigned int *size2p)
{
int i;
unsigned int s1, s2;
// no 2GB Z3 size so we need 2x1G
if (*size1p >= 0x80000000) {
*size2p = *size1p - 0x40000000;
*size1p = 0x40000000;
return;
}
s1 = *size1p;
*size1p = 0;
*size2p = 0;
s2 = 0;
for (i = 32; i >= 0; i--) {
if (s1 & (1 << i))
break;
}
if (i < 20)
return;
if (s1 == (1 << i)) {
*size1p = s1;
return;
}
s2 = s1 & ((1 << i) - 1);
s1 = 1 << i;
i--;
while (i >= 0) {
if (s2 & (1 << i)) {
s2 = 1 << i;
break;
}
i--;
}
if (i < 19)
s2 = 0;
*size1p = s1;
*size2p = s2;
}
void puae_MainWindow::out_floppyspeed()
{
char spe[30];
if (workprefs.floppy_speed)
sprintf (spe, "%d%%%s", workprefs.floppy_speed, workprefs.floppy_speed == 100 ? " (compatible)" : "");
else
strcpy (spe, "Turbo");
ui->IDC_FLOPPYSPDTEXT->setText(spe);
}
void puae_MainWindow::values_to_memorydlg()
{
unsigned int mem_size = 0;
unsigned long v;
switch (workprefs.chipmem_size) {
case 0x00040000: mem_size = 0; break;
case 0x00080000: mem_size = 1; break;
case 0x00100000: mem_size = 2; break;
case 0x00180000: mem_size = 3; break;
case 0x00200000: mem_size = 4; break;
case 0x00400000: mem_size = 5; break;
case 0x00800000: mem_size = 6; break;
}
ui->IDC_CHIPMEM->setValue(mem_size);
mem_size = 0;
switch (workprefs.fastmem_size) {
case 0x00000000: mem_size = 0; break;
case 0x00100000: mem_size = 1; break;
case 0x00200000: mem_size = 2; break;
case 0x00400000: mem_size = 3; break;
case 0x00800000: mem_size = 4; break;
case 0x01000000: mem_size = 5; break;
}
ui->IDC_FASTMEM->setValue(mem_size);
mem_size = 0;
switch (workprefs.bogomem_size) {
case 0x00000000: mem_size = 0; break;
case 0x00080000: mem_size = 1; break;
case 0x00100000: mem_size = 2; break;
case 0x00180000: mem_size = 3; break;
case 0x001C0000: mem_size = 4; break;
}
ui->IDC_SLOWMEM->setValue(mem_size);
mem_size = 0;
v = workprefs.z3fastmem_size + workprefs.z3fastmem2_size;
if (v < 0x00100000)
mem_size = 0;
else if (v < 0x00200000)
mem_size = 1;
else if (v < 0x00400000)
mem_size = 2;
else if (v < 0x00800000)
mem_size = 3;
else if (v < 0x01000000)
mem_size = 4;
else if (v < 0x02000000)
mem_size = 5;
else if (v < 0x04000000)
mem_size = 6;
else if (v < 0x08000000)
mem_size = 7;
else if (v < 0x10000000)
mem_size = 8;
else if (v < 0x18000000)
mem_size = 9;
else if (v < 0x20000000)
mem_size = 10;
else if (v < 0x30000000)
mem_size = 11;
else if (v < 0x40000000) // 1GB
mem_size = 12;
else if (v < 0x60000000) // 1.5GB
mem_size = 13;
else if (v < 0x80000000) // 2GB
mem_size = 14;
else if (v < 0xA8000000) // 2.5GB
mem_size = 15;
else if (v < 0xC0000000) // 3GB
mem_size = 16;
else
mem_size = 17;
ui->IDC_Z3FASTMEM->setValue(mem_size);
mem_size = 0;
switch (workprefs.gfxmem_size) {
case 0x00000000: mem_size = 0; break;
case 0x00100000: mem_size = 1; break;
case 0x00200000: mem_size = 2; break;
case 0x00400000: mem_size = 3; break;
case 0x00800000: mem_size = 4; break;
case 0x01000000: mem_size = 5; break;
case 0x02000000: mem_size = 6; break;
case 0x04000000: mem_size = 7; break;
case 0x08000000: mem_size = 8; break;
case 0x10000000: mem_size = 9; break;
case 0x20000000: mem_size = 10; break;
case 0x40000000: mem_size = 11; break;
}
//ui->IDC_P96MEM->setValue(mem_size);
//ui->IDC_P96RAM->setValue(memsize_names[msi_gfx[mem_size]]);
}
void puae_MainWindow::enable_for_memorydlg ()
{
int z3 = ! workprefs.address_space_24;
int fast = workprefs.chipmem_size <= 0x200000;
int rtg = workprefs.gfxmem_size; //&& full_property_sheet;
int rtg2 = workprefs.gfxmem_size;
#ifndef AUTOCONFIG
z3 = FALSE;
fast = FALSE;
#endif
ui->IDC_Z3FASTRAM->setEnabled(z3);
ui->IDC_Z3FASTMEM->setEnabled(z3);
ui->IDC_FASTMEM->setEnabled(fast);
ui->IDC_FASTRAM->setEnabled(fast);
// ui->IDC_FASTTEXT->setEnabled(fast);
// ui->IDC_GFXCARDTEXT->setEnabled(z3);
ui->IDC_P96RAM->setEnabled(z3);
ui->IDC_P96MEM->setEnabled(z3);
ui->IDC_MBRAM1->setEnabled(z3);
ui->IDC_MBMEM1->setEnabled(z3);
ui->IDC_MBRAM2->setEnabled(z3);
ui->IDC_MBMEM2->setEnabled(z3);
ui->IDC_RTG_8BIT->setEnabled(rtg);
ui->IDC_RTG_16BIT->setEnabled(rtg);
ui->IDC_RTG_24BIT->setEnabled(rtg);
ui->IDC_RTG_32BIT->setEnabled(rtg);
ui->IDC_RTG_MATCH_DEPTH->setEnabled(rtg2);
ui->IDC_RTG_SCALE->setEnabled(rtg2);
ui->IDC_RTG_SCALE_ALLOW->setEnabled(rtg2);
ui->IDC_RTG_SCALE_ASPECTRATIO->setEnabled(rtg2);
ui->IDC_RTG_VBLANKRATE->setEnabled(rtg2);
}
#ifndef PUAE_MAINWINDOW_H
#define PUAE_MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class puae_MainWindow;
}
class puae_MainWindow : public QMainWindow
{
Q_OBJECT
public:
QString GetPath(QWidget *who, QString what, QString where);
QString GetFile(QWidget *who, QString what, QString extensions);
explicit puae_MainWindow(QWidget *parent = 0);
~puae_MainWindow();
private:
Ui::puae_MainWindow *ui;
private slots:
void on_IDC_MBMEM2_valueChanged(int value);
void on_IDC_FLOPPYSPD_valueChanged(int value);
void on_IDC_MBMEM1_valueChanged(int value);
void on_IDC_Z3FASTMEM_valueChanged(int value);
void on_IDC_SLOWMEM_valueChanged(int value);
void on_IDC_FASTMEM_valueChanged(int value);
void on_IDC_CHIPMEM_valueChanged(int value);
void on_IDC_CS_DENISE_toggled(bool checked);
void on_IDC_CS_AGNUS_toggled(bool checked);
void on_IDC_CS_FATGARY_toggled(bool checked);
void on_IDC_CS_RAMSEY_toggled(bool checked);
void on_IDC_CS_CDTVSCSI_toggled(bool checked);
void on_IDC_CS_DMAC2_toggled(bool checked);
void on_IDC_CS_A4091_toggled(bool checked);
void on_IDC_CS_DMAC_toggled(bool checked);
void on_IDC_CS_A2091_toggled(bool checked);
void on_IDC_CS_DIPAGNUS_toggled(bool checked);
void on_IDC_CS_NOEHB_toggled(bool checked);
void on_IDC_CS_RESETWARNING_toggled(bool checked);
void on_IDC_CS_PCMCIA_toggled(bool checked);
void on_IDC_CS_CDTVRAMEXP_toggled(bool checked);
void on_IDC_CS_DF0IDHW_toggled(bool checked);
void on_IDC_CS_A1000RAM_toggled(bool checked);
void on_IDC_CS_SLOWISFAST_toggled(bool checked);
void on_IDC_CS_KSMIRROR_A8_toggled(bool checked);
void on_IDC_CS_KSMIRROR_E0_toggled(bool checked);
void on_IDC_CS_CIAA_TOD3_clicked();
void on_IDC_CS_CIAA_TOD2_clicked();
void on_IDC_CS_RTC3_clicked();
void on_IDC_CS_RTC2_clicked();
void on_IDC_CS_SOUND2_clicked();
void on_IDC_CS_SOUND1_clicked();
void on_IDC_COLLISION3_clicked();
void on_IDC_COLLISION2_clicked();
void on_IDC_COLLISION1_clicked();
void on_IDC_FPU2_clicked();
void on_IDC_FPU3_clicked();
void on_IDC_FPU1_clicked();
void on_IDC_CPU5_clicked();
void on_IDC_CPU3_clicked();
void on_IDC_CPU4_clicked();
void on_IDC_CPU2_clicked();
void on_IDC_CS_CDTVRAM_toggled(bool checked);
void on_IDC_CS_CD32NVRAM_toggled(bool checked);
void on_IDC_CS_CD32C2P_toggled(bool checked);
void on_IDC_CS_IDE2_toggled(bool checked);
void on_IDC_CS_IDE1_toggled(bool checked);
void on_IDC_CS_CDTVCD_toggled(bool checked);
void on_IDC_CS_CD32CD_toggled(bool checked);
void on_IDC_CS_CIAOVERLAY_toggled(bool checked);
void on_IDC_CS_CIAA_TOD1_clicked();
void on_IDC_CS_RTC1_clicked();
void on_IDC_CS_COMPATIBLE_toggled(bool checked);
void on_IDC_CS_SOUND0_clicked();
void on_IDC_COLLISION0_clicked();
void on_IDC_NTSC_toggled(bool checked);
void on_IDC_GENLOCK_toggled(bool checked);
void on_IDC_CYCLEEXACT_toggled(bool checked);
void on_IDC_BLITIMM_toggled(bool checked);
void on_IDC_CS_EXT_currentIndexChanged(int index);
void on_IDC_AGA_clicked();
void on_IDC_ECS_clicked();
void on_IDC_ECS_DENISE_clicked();
void on_IDC_ECS_AGNUS_clicked();
void on_IDC_OCS_clicked();
void on_IDC_CPU_FREQUENCY_currentIndexChanged(int index);
void on_IDC_CPUIDLE_sliderMoved(int position);
void on_IDC_SPEED_valueChanged(int value);
void on_IDC_CS_ADJUSTABLE_clicked();
void on_IDC_CS_68000_clicked();
void on_IDC_CS_HOST_clicked();
void on_IDC_COMPATIBLE_FPU_toggled(bool checked);
void on_IDC_FPU0_clicked();
void on_IDC_MMUENABLE_toggled(bool checked);
void on_IDC_JITENABLE_toggled(bool checked);
void on_IDC_COMPATIBLE_toggled(bool checked);
void on_IDC_COMPATIBLE24_toggled(bool checked);
void on_IDC_CPU1_clicked();
void on_IDC_CPU0_clicked();
void on_IDC_KICKSHIFTER_toggled(bool checked);
void on_IDC_MAPROM_toggled(bool checked);
void on_IDC_FLASHCHOOSER_clicked();
void on_IDC_CARTCHOOSER_clicked();
void on_IDC_ROMCHOOSER2_clicked();
void on_IDC_PATHS_RIPS_clicked();
void on_IDC_PATHS_SAVEIMAGES_clicked();
void on_IDC_PATHS_AVIOUTPUTS_clicked();
void on_IDC_PATHS_SAVESTATES_clicked();
void on_IDC_KICKCHOOSER_clicked();
void on_IDC_PATHS_SCREENSHOTS_clicked();
void on_IDC_PATHS_CONFIGS_clicked();
void on_IDC_PATHS_ROMS_clicked();
//macros
void values_to_memorydlg();
void out_floppyspeed();
void fix_values_memorydlg();
void updatez3 (unsigned int *size1p, unsigned int *size2p);
void enable_for_memorydlg ();
};
// ************************************************
// for now
// REMOVEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
// ************************************************
struct uae_prefs {
char description[256];
char info[256];
int config_version;
char config_hardware_path[100];
char config_host_path[100];
bool illegal_mem;
bool use_serial;
bool serial_demand;
bool serial_hwctsrts;
bool serial_direct;
bool parallel_demand;
int parallel_matrix_emulation;
bool parallel_postscript_emulation;
bool parallel_postscript_detection;
int parallel_autoflush_time;
char ghostscript_parameters[256];
bool use_gfxlib;
bool socket_emu;
#ifdef DEBUGGER
bool start_debugger;
#endif
bool start_gui;
int produce_sound;
int sound_stereo;
int sound_stereo_separation;
int sound_mixed_stereo_delay;
int sound_freq;
int sound_maxbsiz;
int sound_latency;
int sound_interpol;
int sound_filter;
int sound_filter_type;
int sound_volume;
bool sound_stereo_swap_paula;
bool sound_stereo_swap_ahi;
bool sound_auto;
#ifdef JIT
int comptrustbyte;
int comptrustword;
int comptrustlong;
int comptrustnaddr;
bool compnf;
bool compfpu;
bool comp_midopt;
bool comp_lowopt;
bool fpu_strict;
bool comp_hardflush;
bool comp_constjump;
bool comp_oldsegv;
int optcount[10];
#endif
int cachesize;
bool avoid_cmov;
int gfx_display;
char gfx_display_name[256];
int gfx_framerate, gfx_autoframerate;
bool gfx_autoresolution;
bool gfx_scandoubler;
int gfx_refreshrate;
int gfx_avsync, gfx_pvsync;
int gfx_resolution;
int gfx_vresolution;
int gfx_lores_mode;
int gfx_scanlines;
int gfx_afullscreen, gfx_pfullscreen;
int gfx_xcenter, gfx_ycenter;
int gfx_xcenter_pos, gfx_ycenter_pos;
int gfx_xcenter_size, gfx_ycenter_size;
int gfx_max_horizontal, gfx_max_vertical;
int gfx_saturation, gfx_luminance, gfx_contrast, gfx_gamma;
bool gfx_blackerthanblack;
int gfx_backbuffers;
int gfx_api;
int color_mode;
int gfx_gl_x_offset; //koko
int gfx_gl_y_offset; //koko
int gfx_gl_smoothing; //koko
int gfx_gl_panscan; //koko
int gfx_filter;
int gfx_filteroverlay_overscan;
int gfx_filter_scanlines;
int gfx_filter_scanlineratio;
int gfx_filter_scanlinelevel;
int gfx_filter_horiz_zoom, gfx_filter_vert_zoom;
int gfx_filter_horiz_zoom_mult, gfx_filter_vert_zoom_mult;
int gfx_filter_horiz_offset, gfx_filter_vert_offset;
int gfx_filter_filtermode;
int gfx_filter_bilinear;
int gfx_filter_noise, gfx_filter_blur;
int gfx_filter_saturation, gfx_filter_luminance, gfx_filter_contrast, gfx_filter_gamma;
int gfx_filter_keep_aspect, gfx_filter_aspect;
int gfx_filter_autoscale;
bool immediate_blits;
unsigned int chipset_mask;
bool ntscmode;
bool genlock;
int chipset_refreshrate;
int collision_level;
int leds_on_screen;
int keyboard_leds[3];
bool keyboard_leds_in_use;
int scsi;
bool sana2;
bool uaeserial;
int catweasel;
int catweasel_io;
int cpu_idle;
bool cpu_cycle_exact;
int cpu_clock_multiplier;
int cpu_frequency;
bool blitter_cycle_exact;
int floppy_speed;
int floppy_write_length;
int floppy_random_bits_min;
int floppy_random_bits_max;
bool tod_hack;
unsigned long maprom;
int turbo_emulation;
bool headless;
int cs_compatible;
int cs_ciaatod;
int cs_rtc;
int cs_rtc_adjust;
int cs_rtc_adjust_mode;
bool cs_ksmirror_e0;
bool cs_ksmirror_a8;
bool cs_ciaoverlay;
bool cs_cd32cd;
bool cs_cd32c2p;
bool cs_cd32nvram;
bool cs_cdtvcd;
bool cs_cdtvram;
int cs_cdtvcard;
int cs_ide;
bool cs_pcmcia;
bool cs_a1000ram;
int cs_fatgaryrev;
int cs_ramseyrev;
int cs_agnusrev;
int cs_deniserev;
int cs_mbdmac;
bool cs_cdtvscsi;
bool cs_a2091, cs_a4091;
bool cs_df0idhw;
bool cs_slowmemisfast;
bool cs_resetwarning;
bool cs_denisenoehb;
bool cs_dipagnus;
bool cs_agnusbltbusybug;
char romfile[100];
char romident[256];
char romextfile[100];
char romextident[256];
char keyfile[256];
char flashfile[100];
#ifdef ACTION_REPLAY
char cartfile[100];
char cartident[256];
int cart_internal;
#endif
char pci_devices[256];
char prtname[256];
char sername[256];
char amaxromfile[100];
char a2065name[100];
char quitstatefile[100];
char statefile[100];
#ifndef WIN32
char scsi_device[256];
#endif
char path_floppy[256];
char path_hardfile[256];
char path_rom[256];
char path_savestate[256];
int m68k_speed;
int cpu_model;
int mmu_model;
int cpu060_revision;
int fpu_model;
int fpu_revision;
bool cpu_compatible;
bool address_space_24;
bool picasso96_nocustom;
int picasso96_modeflags;
#ifdef HAVE_MACHDEP_TIMER
int use_processor_clock;
#endif
unsigned long z3fastmem_size, z3fastmem2_size;
unsigned long z3fastmem_start;
unsigned long z3chipmem_size;
unsigned long z3chipmem_start;
unsigned long fastmem_size;
unsigned long chipmem_size;
unsigned long bogomem_size;
unsigned long mbresmem_low_size;
unsigned long mbresmem_high_size;
unsigned long gfxmem_size;
unsigned long custom_memory_addrs[10];
unsigned long custom_memory_sizes[10];
bool kickshifter;
bool filesys_no_uaefsdb;
bool filesys_custom_uaefsdb;
bool mmkeyboard;
int uae_hide;
int nr_floppies;
char dfxlist[10][100];
#ifdef DRIVESOUND
int dfxclickvolume;
int dfxclickchannelmask;
#endif
int hide_cursor; /* Whether to hide host WM cursor or not */
/* Target specific options */
#ifdef USE_X11_GFX
int x11_use_low_bandwidth;
int x11_use_mitshm;
int x11_use_dgamode;
int x11_hide_cursor;
#endif
#ifdef USE_SVGALIB_GFX
int svga_no_linear;
#endif
#ifdef _WIN32
bool win32_middle_mouse;
bool win32_logfile;
bool win32_notaskbarbutton;
bool win32_alwaysontop;
bool win32_powersavedisabled;
bool win32_minimize_inactive;
int win32_statusbar;
int win32_active_priority;
int win32_inactive_priority;
bool win32_inactive_pause;
bool win32_inactive_nosound;
int win32_iconified_priority;
bool win32_iconified_pause;
bool win32_iconified_nosound;
bool win32_rtgmatchdepth;
bool win32_rtgscaleifsmall;
bool win32_rtgallowscaling;
int win32_rtgscaleaspectratio;
bool win32_borderless;
bool win32_ctrl_F11_is_quit;
bool win32_automount_removable;
bool win32_automount_drives;
bool win32_automount_cddrives;
bool win32_automount_netdrives;
bool win32_automount_removabledrives;
int win32_midioutdev;
int win32_midiindev;
int win32_uaescsimode;
int win32_soundcard;
int win32_samplersoundcard;
bool win32_soundexclusive;
bool win32_norecyclebin;
int win32_specialkey;
int win32_guikey;
int win32_kbledmode;
char win32_commandpathstart[100];
char win32_commandpathend[100];
char win32_parjoyport0[100];
char win32_parjoyport1[100];
#endif
int win32_rtgvblankrate;
#ifdef USE_CURSES_GFX
int curses_reverse_video;
#endif
#if defined USE_SDL_GFX || defined USE_X11_GFX
int map_raw_keys;
#endif
int use_gl;
#ifdef USE_AMIGA_GFX
int amiga_screen_type;
char amiga_publicscreen[256];
int amiga_use_grey;
int amiga_use_dither;
#endif
#ifdef SAVESTATE
bool statecapture;
int statecapturerate, statecapturebuffersize;
#endif
/* input */
int input_selected_setting;
int input_joymouse_multiplier;
int input_joymouse_deadzone;
int input_joystick_deadzone;
int input_joymouse_speed;
int input_analog_joystick_mult;
int input_analog_joystick_offset;
int input_autofire_linecnt;
int input_mouse_speed;
int input_tablet;
bool input_magic_mouse;
int input_magic_mouse_cursor;
int dongle;
};
#endif // PUAE_MAINWINDOW_H
This source diff could not be displayed because it is too large. You can view the blob instead.
/*
* UAE - The Un*x Amiga Emulator
*
* Input recording and playback
*
* Copyright 2010 Toni Wilen
*/
extern int inputrecord_debug;
//#define INPREC_JOYPORT 1
//#define INPREC_JOYBUTTON 2
//#define INPREC_KEY 3
#define INPREC_DISKINSERT 4
#define INPREC_DISKREMOVE 5
//#define INPREC_VSYNC 6
//#define INPREC_CIAVSYNC 7
#define INPREC_EVENT 8
#define INPREC_CIADEBUG 0x61
#define INPREC_DEBUG 0x62
#define INPREC_DEBUG2 0x63
#define INPREC_STOP 0x7d
#define INPREC_END 0x7e
#define INPREC_QUIT 0x7f
#define INPREC_RECORD_START 1
#define INPREC_RECORD_NORMAL 2
#define INPREC_RECORD_RERECORD 3
#define INPREC_RECORD_PLAYING 4
#define INPREC_PLAY_NORMAL 1
#define INPREC_PLAY_RERECORD 2
extern int input_record, input_play;
extern void inprec_close (bool);
extern void inprec_save (const TCHAR*, const TCHAR*);
extern int inprec_open (const TCHAR*, const TCHAR*);
extern bool inprec_prepare_record (const TCHAR*);
extern void inprec_playtorecord (void);
extern void inprec_startup (void);
extern bool inprec_playevent (int *nr, int *state, int *max, int *autofire);
extern void inprec_playdiskchange (void);
extern void inprec_recordevent (int nr, int state, int max, int autofire);
extern void inprec_recorddiskchange (int nr, const TCHAR *fname, bool writeprotected);
extern void inprec_recorddebug (uae_u32);
extern void inprec_playdebug (uae_u32);
extern void inprec_recorddebug_cpu (int);
extern void inprec_playdebug_cpu (int);
extern void inprec_recorddebug_cia (uae_u32, uae_u32, uae_u32);
extern void inprec_playdebug_cia (uae_u32, uae_u32, uae_u32);
extern int inprec_getposition (void);
extern void inprec_setposition (int offset, int replaycounter);
extern bool inprec_realtime (void);
extern void inprec_getstatus (TCHAR*);
\ No newline at end of file
/*
* UAE - The Un*x Amiga Emulator
*
* Input record/playback
*
* Copyright 2010 Toni Wilen
*
*/
#define INPUTRECORD_DEBUG 1
#define ENABLE_DEBUGGER 0
#define HEADERSIZE 12
#include "sysconfig.h"
#include "sysdeps.h"
#include "options.h"
#include "inputrecord.h"
#include "zfile.h"
#include "custom.h"
#include "savestate.h"
#include "cia.h"
#include "events.h"
#include "uae.h"
#include "disk.h"
#if INPUTRECORD_DEBUG > 0
#include "memory.h"
#include "newcpu.h"
#endif
int inputrecord_debug = 3;
extern int inputdevice_logging;
#define INPREC_BUFFER_SIZE 10000
static uae_u8 *inprec_buffer, *inprec_p;
static struct zfile *inprec_zf;
static int inprec_size;
int input_record = 0;
int input_play = 0;
static uae_u8 *inprec_plast, *inprec_plastptr;
static int header_end, header_end2;
static int replaypos;
static int lasthsync, endhsync;
static TCHAR inprec_path[MAX_DPATH];
static uae_u32 seed;
static uae_u32 lastcycle;
static uae_u32 cycleoffset;
static uae_u32 pcs[16];
static uae_u32 pcs2[16];
extern void activate_debugger (void);
static int warned;
extern void refreshtitle (void);
static void setlasthsync (void)
{
if (lasthsync / current_maxvpos () != hsync_counter / current_maxvpos ()) {
lasthsync = hsync_counter;
refreshtitle ();
}
}
static void flush (void)
{
if (inprec_p > inprec_buffer) {
zfile_fwrite (inprec_buffer, inprec_p - inprec_buffer, 1, inprec_zf);
inprec_p = inprec_buffer;
}
}
static void inprec_ru8 (uae_u8 v)
{
if (!input_record || !inprec_zf)
return;
*inprec_p++= v;
}
static void inprec_ru16 (uae_u16 v)
{
if (!input_record || !inprec_zf)
return;
inprec_ru8 ((uae_u8)(v >> 8));
inprec_ru8 ((uae_u8)v);
}
void inprec_ru32 (uae_u32 v)
{
if (!input_record || !inprec_zf)
return;
inprec_ru16 ((uae_u16)(v >> 16));
inprec_ru16 ((uae_u16)v);
}
static void inprec_rstr (const TCHAR *src)
{
if (!input_record || !inprec_zf)
return;
char *s = uutf8 (src);
char *ss = s;
while (*s) {
inprec_ru8 (*s);
s++;
}
inprec_ru8 (0);
xfree (ss);
}
static bool inprec_rstart (uae_u8 type)
{
if (!input_record || !inprec_zf || input_record == INPREC_RECORD_PLAYING)
return false;
lastcycle = get_cycles ();
int mvp = current_maxvpos ();
if ((type != INPREC_DEBUG && type != INPREC_DEBUG2 && type != INPREC_CIADEBUG) || (0 && vsync_counter >= 49 && vsync_counter <= 51))
write_log ("INPREC: %010d/%03d: %d (%d/%d) %08x\n", hsync_counter, current_hpos (), type, hsync_counter % mvp, mvp, lastcycle);
inprec_plast = inprec_p;
inprec_ru8 (type);
inprec_ru16 (0xffff);
inprec_ru32 (hsync_counter);
inprec_ru8 (current_hpos ());
inprec_ru32 (lastcycle);
return true;
}
static void inprec_rend (void)
{
if (!input_record || !inprec_zf)
return;
int size = inprec_p - inprec_plast;
inprec_plast[1] = size >> 8;
inprec_plast[2] = size >> 0;
flush ();
endhsync = hsync_counter;
setlasthsync ();
}
static bool inprec_realtime (bool stopstart)
{
if (input_record == INPREC_RECORD_RERECORD)
gui_message ("INPREC error");
write_log ("INPREC: play -> record\n");
input_record = INPREC_RECORD_RERECORD;
input_play = 0;
int offset = inprec_p - inprec_buffer;
zfile_fseek (inprec_zf, offset, SEEK_SET);
zfile_truncate (inprec_zf, offset);
xfree (inprec_buffer);
inprec_size = INPREC_BUFFER_SIZE;
inprec_buffer = inprec_p = xmalloc (uae_u8, inprec_size);
clear_inputstate ();
return true;
}
static int inprec_pstart (uae_u8 type)
{
uae_u8 *p = inprec_p;
uae_u32 hc = hsync_counter;
uae_u8 hpos = current_hpos ();
uae_u32 cycles = get_cycles ();
static uae_u8 *lastp;
uae_u32 hc_orig, hc2_orig;
int mvp = current_maxvpos ();
if (!input_play || !inprec_zf)
return 0;
if (savestate_state || hsync_counter > 0xffff0000)
return 0;
if (p == inprec_buffer + inprec_size) {
write_log ("INPREC: STOP\n");
if (input_play == INPREC_PLAY_RERECORD) {
input_play = 0;
inprec_realtime (true);
} else {
inprec_close (true);
}
return 0;
} else if (p > inprec_buffer + inprec_size) {
write_log ("INPREC: buffer error\n");
gui_message ("INPREC error");
}
if (p[0] == INPREC_END) {
inprec_close (true);
return 0;
} else if (p[0] == INPREC_QUIT) {
inprec_close (true);
uae_quit ();
return 0;
}
hc_orig = hc;
for (;;) {
uae_u32 type2 = p[0];
uae_u32 hc2 = (p[3] << 24) | (p[4] << 16) | (p[5] << 8) | p[6];
uae_u32 hpos2 = p[7];
uae_u32 cycles2 = (p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11];
if (p >= inprec_buffer + inprec_size)
break;
#if 0
if (p > lastp) {
write_log ("INPREC: Next %010d/%03d, %010d/%03d (%d/%d): %d (%d)\n",
hc2, hpos2, hc, hpos, hc2 - hc, hpos2 - hpos, p[5 + 1], p[5]);
lastp = p;
}
#endif
hc2_orig = hc2;
if (type2 == type && hc > hc2) {
write_log ("INPREC: %010d/%03d > %010d/%03d: %d missed!\n", hc, hpos, hc2, hpos2, p[0]);
#if ENABLE_DEBUGGER == 0
gui_message ("INPREC missed error");
#else
activate_debugger ();
#endif
lastcycle = cycles;
inprec_plast = p;
inprec_plastptr = p + 12;
setlasthsync ();
return 1;
}
if (hc2 != hc) {
lastp = p;
break;
}
if (type2 == type) {
if (type != INPREC_DEBUG && type != INPREC_DEBUG2 && type != INPREC_CIADEBUG && cycles != cycles2)
write_log ("INPREC: %010d/%03d: %d (%d/%d) (%d/%d) %08X/%08X\n", hc, hpos, type, hc % mvp, mvp, hc_orig - hc2_orig, hpos - hpos2, cycles, cycles2);
if (cycles != cycles2 + cycleoffset) {
if (warned > 0) {
warned--;
for (int i = 0; i < 7; i++)
write_log ("%08x (%08x) ", pcs[i], pcs2[i]);
write_log ("\n");
}
cycleoffset = cycles - cycles2;
#if ENABLE_DEBUGGER == 0
gui_message ("INPREC OFFSET=%d\n", (int)cycleoffset / CYCLE_UNIT);
#else
activate_debugger ();
#endif
}
lastcycle = cycles;
inprec_plast = p;
inprec_plastptr = p + 12;
setlasthsync ();
return 1;
}
if (type2 == INPREC_END || type2 == INPREC_QUIT)
break;
p += (p[1] << 8) | (p[2] << 0);
}
inprec_plast = NULL;
return 0;
}
static void inprec_pend (void)
{
uae_u8 *p = inprec_p;
uae_u32 hc = hsync_counter;
uae_u32 hpos = current_hpos ();
if (!input_play || !inprec_zf)
return;
if (!inprec_plast)
return;
inprec_plast[0] |= 0x80;
inprec_plast = NULL;
inprec_plastptr = NULL;
for (;;) {
uae_u32 hc2 = (p[3] << 24) | (p[4] << 16) | (p[5] << 8) | p[6];
uae_u32 hpos2 = p[7];
if (hc2 != hc)
break;
if ((p[0] & 0x80) == 0)
return;
p += (p[1] << 8) | (p[2] << 0);
inprec_p = p;
}
}
static uae_u8 inprec_pu8 (void)
{
return *inprec_plastptr++;
}
static uae_u16 inprec_pu16 (void)
{
uae_u16 v = inprec_pu8 () << 8;
v |= inprec_pu8 ();
return v;
}
static uae_s16 inprec_ps16 (void)
{
uae_u16 v = inprec_pu8 () << 8;
v |= inprec_pu8 ();
return (uae_s16)v;
}
static uae_u32 inprec_pu32 (void)
{
uae_u32 v = inprec_pu16 () << 16;
v |= inprec_pu16 ();
return v;
}
static int inprec_pstr (TCHAR *dst)
{
char tmp[MAX_DPATH];
char *s;
int len = 0;
*dst = 0;
s = tmp;
for(;;) {
char v = inprec_pu8 ();
*s++ = v;
if (!v)
break;
len++;
}
if (tmp[0]) {
TCHAR *d = utf8u (tmp);
_tcscpy (dst, d);
xfree (d);
}
return len;
}
static void findlast (void)
{
uae_u32 hsync = 0;
uae_u8 *p = inprec_p;
while (p < inprec_buffer + inprec_size) {
hsync = (p[3] << 24) | (p[4] << 16) | (p[5] << 8) | p[6];
uae_u16 len = (p[1] << 8) | (p[2] << 0);
p += len;
}
endhsync = hsync;
}
int inprec_open (const TCHAR *fname, const TCHAR *statefilename)
{
int i;
inprec_close (false);
if (fname == NULL)
inprec_zf = zfile_fopen_empty (NULL, "inp");
else
inprec_zf = zfile_fopen (fname, input_record ? "wb" : "rb", ZFD_NORMAL);
if (inprec_zf == NULL)
return 0;
currprefs.cs_rtc = changed_prefs.cs_rtc = 0;
inprec_path[0] = 0;
if (fname)
getpathpart (inprec_path, sizeof inprec_path / sizeof (TCHAR), fname);
seed = (uae_u32)time(0);
inprec_size = INPREC_BUFFER_SIZE;
lasthsync = 0;
endhsync = 0;
warned = 10;
cycleoffset = 0;
header_end2 = 0;
if (input_play) {
uae_u32 id;
zfile_fseek (inprec_zf, 0, SEEK_END);
inprec_size = zfile_ftell (inprec_zf);
zfile_fseek (inprec_zf, 0, SEEK_SET);
inprec_buffer = inprec_p = xmalloc (uae_u8, inprec_size);
zfile_fread (inprec_buffer, inprec_size, 1, inprec_zf);
inprec_plastptr = inprec_buffer;
id = inprec_pu32();
if (id != 'UAE\0') {
inprec_close (true);
return 0;
}
int v = inprec_pu8 ();
if (v != 2) {
inprec_close (true);
return 0;
}
inprec_pu8 ();
inprec_pu8 ();
inprec_pu8 ();
seed = inprec_pu32();
seed = uaesrand (seed);
vsync_counter = inprec_pu32 ();
hsync_counter = inprec_pu32 ();
i = inprec_pu32 ();
while (i-- > 0)
inprec_pu8 ();
header_end = inprec_plastptr - inprec_buffer;
inprec_pstr (savestate_fname);
if (savestate_fname[0]) {
savestate_state = STATE_RESTORE;
for (;;) {
TCHAR tmp[MAX_DPATH];
_tcscpy (tmp, fname);
_tcscat (tmp, ".uss");
if (zfile_exists (tmp)) {
_tcscpy (savestate_fname, tmp);
break;
}
if (zfile_exists (savestate_fname))
break;
TCHAR *p = _tcsrchr (savestate_fname, '\\');
if (!p)
p = _tcsrchr (savestate_fname, '/');
if (!p)
p = savestate_fname;
else
p++;
if (zfile_exists (p)) {
_tcscpy (savestate_fname, p);
break;
}
fetch_statefilepath (tmp, sizeof tmp / sizeof (TCHAR));
_tcscat (tmp, p);
if (zfile_exists (tmp)) {
_tcscpy (savestate_fname, tmp);
break;
}
fetch_inputfilepath (tmp, sizeof tmp / sizeof (TCHAR));
_tcscat (tmp, p);
if (zfile_exists (tmp)) {
_tcscpy (savestate_fname, tmp);
break;
}
write_log ("Failed to open linked statefile '%s'\n", savestate_fname);
savestate_fname[0] = 0;
savestate_state = 0;
break;
}
}
inprec_p = inprec_plastptr;
header_end2 = inprec_plastptr - inprec_buffer;
findlast ();
} else if (input_record) {
seed = uaesrand (seed);
inprec_buffer = inprec_p = xmalloc (uae_u8, inprec_size);
inprec_ru32 ('UAE\0');
inprec_ru8 (2);
inprec_ru8 (UAEMAJOR);
inprec_ru8 (UAEMINOR);
inprec_ru8 (UAESUBREV);
inprec_ru32 (seed);
inprec_ru32 (vsync_counter);
inprec_ru32 (hsync_counter);
inprec_ru32 (0); // extra header size
flush ();
header_end2 = header_end = zfile_ftell (inprec_zf);
} else {
input_record = input_play = 0;
return 0;
}
if (inputrecord_debug) {
if (disk_debug_logging < 1)
disk_debug_logging = 1 | 2;
}
write_log ("inprec initialized '%s', play=%d rec=%d\n", fname ? fname : "<internal>", input_play, input_record);
refreshtitle ();
return 1;
}
void inprec_startup (void)
{
uaesrand (seed);
}
bool inprec_prepare_record (const TCHAR *statefilename)
{
TCHAR state[MAX_DPATH];
int mode = statefilename ? 2 : 1;
state[0] = 0;
if (statefilename)
_tcscpy (state, statefilename);
if (hsync_counter > 0 && savestate_state == 0) {
TCHAR *s = _tcsrchr (changed_prefs.inprecfile, '\\');
if (!s)
s = _tcsrchr (changed_prefs.inprecfile, '/');
if (s) {
fetch_statefilepath (state, sizeof state / sizeof (TCHAR));
_tcscat (state, s + 1);
} else {
_tcscpy (state, changed_prefs.inprecfile);
}
_tcscat (state, ".uss");
savestate_initsave (state, 1, 1, true);
save_state (state, "input recording test");
mode = 2;
}
input_record = INPREC_RECORD_NORMAL;
inprec_open (changed_prefs.inprecfile, state);
changed_prefs.inprecfile[0] = currprefs.inprecfile[0] = 0;
return true;
}
void inprec_close (bool clear)
{
if (clear)
input_play = input_record = 0;
if (!inprec_zf)
return;
if (inprec_buffer && input_record) {
if (inprec_rstart (INPREC_END))
inprec_rend ();
}
zfile_fclose (inprec_zf);
inprec_zf = NULL;
xfree (inprec_buffer);
inprec_buffer = NULL;
input_play = input_record = 0;
write_log ("inprec finished\n");
refreshtitle ();
}
static void setwriteprotect (const TCHAR *fname, bool readonly)
{
struct _stat64 st;
int mode, oldmode;
if (stat (fname, &st))
return;
oldmode = mode = st.st_mode;
mode &= ~FILEFLAG_WRITE;
if (!readonly)
mode |= FILEFLAG_WRITE;
if (mode != oldmode)
chmod (fname, mode);
}
void inprec_playdiskchange (void)
{
if (!input_play)
return;
while (inprec_pstart (INPREC_DISKREMOVE)) {
int drv = inprec_pu8 ();
inprec_pend ();
write_log ("INPREC: disk eject drive %d\n", drv);
disk_eject (drv);
}
while (inprec_pstart (INPREC_DISKINSERT)) {
int drv = inprec_pu8 ();
bool wp = inprec_pu8 () != 0;
TCHAR tmp[MAX_DPATH], tmp2[MAX_DPATH];
inprec_pstr (tmp);
_tcscpy (tmp2, tmp);
if (!zfile_exists (tmp)) {
TCHAR tmp3[MAX_DPATH];
_tcscpy (tmp3, inprec_path);
_tcscat (tmp3, tmp);
_tcscpy (tmp, tmp3);
}
if (!zfile_exists (tmp)) {
gui_message ("INPREC: Disk image\n'%s'\nnot found!\n", tmp2);
}
_tcscpy (currprefs.floppyslots[drv].df, tmp);
_tcscpy (changed_prefs.floppyslots[drv].df, tmp);
setwriteprotect (tmp, wp);
disk_insert_force (drv, tmp, wp);
write_log ("INPREC: disk insert drive %d '%s'\n", drv, tmp);
inprec_pend ();
}
}
bool inprec_playevent (int *nr, int *state, int *max, int *autofire)
{
if (inprec_pstart (INPREC_EVENT)) {
*nr = inprec_ps16 ();
*state = inprec_ps16 ();
*max = inprec_pu16 ();
*autofire = inprec_ps16 () & 1;
inprec_pend ();
return true;
}
return false;
}
void inprec_recorddebug_cia (uae_u32 v1, uae_u32 v2, uae_u32 v3)
{
#if INPUTRECORD_DEBUG > 0
if (inprec_rstart (INPREC_CIADEBUG)) {
inprec_ru32 (v1);
inprec_ru32 (v2);
inprec_ru32 (v3);
inprec_rend ();
}
#endif
}
void inprec_playdebug_cia (uae_u32 v1, uae_u32 v2, uae_u32 v3)
{
#if INPUTRECORD_DEBUG > 0
int err = 0;
if (inprec_pstart (INPREC_CIADEBUG)) {
uae_u32 vv1 = inprec_pu32 ();
uae_u32 vv2 = inprec_pu32 ();
uae_u32 vv3 = inprec_pu32 ();
if (vv1 != v1 || vv2 != v2 || vv3 != v3)
write_log ("CIA SYNC ERROR %08x,%08x %08x,%08x %08x,%08x\n", vv1, v1, vv2, v2, vv3, v3);
inprec_pend ();
}
#endif
}
void inprec_recorddebug_cpu (int mode)
{
#if INPUTRECORD_DEBUG > 0
if (inprec_rstart (INPREC_DEBUG2)) {
inprec_ru32 (m68k_getpc ());
inprec_ru32 (get_cycles () | mode);
inprec_rend ();
}
#endif
}
void inprec_playdebug_cpu (int mode)
{
#if INPUTRECORD_DEBUG > 0
int err = 0;
if (inprec_pstart (INPREC_DEBUG2)) {
uae_u32 pc1 = m68k_getpc ();
uae_u32 pc2 = inprec_pu32 ();
uae_u32 v1 = get_cycles () | mode;
uae_u32 v2 = inprec_pu32 ();
if (pc1 != pc2) {
if (warned > 0) {
warned--;
write_log ("SYNC ERROR2 PC %08x != %08x\n", pc1, pc2);
for (int i = 0; i < 15; i++)
write_log ("%08x ", pcs[i]);
write_log ("\n");
}
err = 1;
} else {
memmove (pcs + 1, pcs, 15 * 4);
pcs[0] = pc1;
memmove (pcs2 + 1, pcs2, 15 * 4);
pcs2[0] = get_cycles ();
}
if (v1 != v2) {
if (warned > 0) {
warned--;
write_log ("SYNC ERROR2 %08x != %08x\n", v1, v2);
for (int i = 0; i < 15; i++)
write_log ("%08x ", pcs[i]);
write_log ("\n");
}
err = 1;
}
inprec_pend ();
} else if (input_play > 0) {
if (warned > 0) {
warned--;
write_log ("SYNC ERROR2 debug event missing!?\n");
}
}
#endif
}
void inprec_recorddebug (uae_u32 val)
{
#if INPUTRECORD_DEBUG > 0
if (inprec_rstart (INPREC_DEBUG)) {
inprec_ru32 (uaerandgetseed ());
inprec_ru32 (val);
inprec_rend ();
}
#endif
}
void inprec_playdebug (uae_u32 val)
{
#if INPUTRECORD_DEBUG > 0
extern void activate_debugger (void);
static uae_u32 pcs[16];
int err = 0;
if (inprec_pstart (INPREC_DEBUG)) {
uae_u32 seed1 = uaerandgetseed ();
uae_u32 seed2 = inprec_pu32 ();
if (seed1 != seed2) {
write_log ("SYNC ERROR seed %08x != %08x\n", seed1, seed2);
err = 1;
}
uae_u32 val2 = inprec_pu32 ();
if (val != val2) {
write_log ("SYNC ERROR val %08x != %08x\n", val, val2);
err = 1;
}
inprec_pend ();
} else if (input_play > 0) {
gui_message ("SYNC ERROR debug event missing!?\n");
}
#endif
}
void inprec_recordevent (int nr, int state, int max, int autofire)
{
if (savestate_state)
return;
if (input_record < INPREC_RECORD_NORMAL)
return;
if (inprec_rstart (INPREC_EVENT)) {
inprec_ru16 (nr);
inprec_ru16 (state);
inprec_ru16 (max);
inprec_ru16 (autofire ? 1 : 0);
inprec_rend ();
if (input_record == INPREC_RECORD_NORMAL)
input_record = INPREC_RECORD_RERECORD;
}
}
void inprec_recorddiskchange (int nr, const TCHAR *fname, bool writeprotected)
{
if (savestate_state)
return;
if (input_record < INPREC_RECORD_NORMAL)
return;
if (fname && fname[0]) {
if (inprec_rstart (INPREC_DISKINSERT)) {
inprec_ru8 (nr);
inprec_ru8 (writeprotected ? 1 : 0);
inprec_rstr (fname);
write_log ("INPREC: disk insert %d '%s'\n", nr, fname);
inprec_rend ();
}
} else {
if (inprec_rstart (INPREC_DISKREMOVE)) {
inprec_ru8 (nr);
write_log ("INPREC: disk eject %d\n", nr);
inprec_rend ();
}
}
}
int inprec_getposition (void)
{
int pos = -1;
if (input_play == INPREC_PLAY_RERECORD) {
pos = inprec_p - inprec_buffer;
} else if (input_record) {
pos = zfile_ftell (inprec_zf);
}
write_log ("INPREC: getpos=%d cycles=%08X\n", pos, lastcycle);
if (pos < 0) {
write_log ("INPREC: getpos failure\n");
gui_message ("INPREC error");
}
return pos;
}
// normal play to re-record
void inprec_playtorecord (void)
{
write_log ("INPREC: PLAY to RE-RECORD\n");
replaypos = 0;
findlast ();
input_play = INPREC_PLAY_RERECORD;
input_record = INPREC_RECORD_PLAYING;
zfile_fclose (inprec_zf);
inprec_zf = zfile_fopen_empty (NULL, "inp");
zfile_fwrite (inprec_buffer, header_end2, 1, inprec_zf);
uae_u8 *p = inprec_buffer + header_end2;
uae_u8 *end = inprec_buffer + inprec_size;
while (p < end) {
int len = (p[1] << 8) | (p[2] << 0);
p[0] &= ~0x80;
p += len;
}
zfile_fwrite (inprec_buffer + header_end2, inprec_size - header_end2, 1, inprec_zf);
inprec_realtime (false);
savestate_capture_request ();
}
void inprec_setposition (int offset, int replaycounter)
{
if (!inprec_buffer)
return;
replaypos = replaycounter;
write_log ("INPREC: setpos=%d\n", offset);
if (offset < header_end || offset > zfile_size (inprec_zf)) {
write_log ("INPREC: buffer corruption. offset=%d, size=%d\n", offset, zfile_size (inprec_zf));
gui_message ("INPREC error");
}
zfile_fseek (inprec_zf, 0, SEEK_SET);
xfree (inprec_buffer);
inprec_size = zfile_size (inprec_zf);
inprec_buffer = xmalloc (uae_u8, inprec_size);
zfile_fread (inprec_buffer, inprec_size, 1, inprec_zf);
inprec_p = inprec_plastptr = inprec_buffer + offset;
findlast ();
input_play = INPREC_PLAY_RERECORD;
input_record = INPREC_RECORD_PLAYING;
if (currprefs.inprec_autoplay == false)
inprec_realtime (false);
}
static void savelog (const TCHAR *path, const TCHAR *file)
{
TCHAR tmp[MAX_DPATH];
_tcscpy (tmp, path);
_tcscat (tmp, file);
_tcscat (tmp, ".log.txt");
struct zfile *zfd = zfile_fopen (tmp, "wb");
if (zfd) {
int loglen;
uae_u8 *log;
loglen = 0;
log = save_log (TRUE, &loglen);
if (log)
zfile_fwrite (log, loglen, 1, zfd);
xfree (log);
loglen = 0;
log = save_log (FALSE, &loglen);
if (log)
zfile_fwrite (log, loglen, 1, zfd);
xfree (log);
zfile_fclose (zfd);
write_log ("log '%s' saved\n", tmp);
}
}
static int savedisk (const TCHAR *path, const TCHAR *file, uae_u8 *data, uae_u8 *outdata)
{
int len = 0;
TCHAR *fname = utf8u ((const char*)data + 2);
if (fname[0]) {
TCHAR tmp[MAX_DPATH];
TCHAR filename[MAX_DPATH];
filename[0] = 0;
struct zfile *zf = zfile_fopen (fname, "rb", ZFD_NORMAL);
if (!zf) {
_tcscpy (tmp, path);
_tcscat (tmp, fname);
zf = zfile_fopen (tmp, "rb", ZFD_NORMAL);
if (!zf)
write_log ("failed to open '%s'\n", tmp);
}
if (zf) {
_tcscpy (tmp, path);
_tcscpy (filename, file);
_tcscat (filename, ".");
getfilepart (filename + _tcslen (filename), MAX_DPATH, zfile_getname (zf));
_tcscat (tmp, filename);
struct zfile *zfd = zfile_fopen (tmp, "wb");
if (zfd) {
int size = zfile_size (zf);
uae_u8 *data = zfile_getdata (zf, 0, size);
zfile_fwrite (data, size, 1, zfd);
zfile_fclose (zfd);
xfree (data);
}
zfile_fclose (zf);
setwriteprotect (fname, data[1] != 0);
}
if (filename[0]) {
outdata[0] = data[0];
char *fn = uutf8 (filename);
strcpy ((char*)outdata + 2, fn);
xfree (fn);
len = 2 + strlen ((char*)outdata + 2) + 1;
}
}
xfree (fname);
return len;
}
void inprec_save (const TCHAR *filename, const TCHAR *statefilename)
{
TCHAR path[MAX_DPATH], file[MAX_DPATH];
if (!inprec_buffer)
return;
getpathpart (path, sizeof path / sizeof (TCHAR), filename);
getfilepart (file, sizeof file / sizeof (TCHAR), filename);
struct zfile *zf = zfile_fopen (filename, "wb", 0);
if (zf) {
TCHAR fn[MAX_DPATH];
uae_u8 *data;
data = zfile_getdata (inprec_zf, 0, header_end);
zfile_fwrite (data, header_end, 1, zf);
xfree (data);
getfilepart (fn, MAX_DPATH, statefilename);
char *s = uutf8 (fn);
zfile_fwrite (s, strlen (s) + 1, 1, zf);
int len = zfile_size (inprec_zf) - header_end2;
data = zfile_getdata (inprec_zf, header_end2, len);
uae_u8 *p = data;
uae_u8 *end = data + len;
while (p < end) {
uae_u8 tmp[MAX_DPATH];
int plen = (p[1] << 8) | (p[2] << 0);
int wlen = plen - HEADERSIZE;
memcpy (tmp, p + HEADERSIZE, wlen);
if (p[0] == INPREC_DISKINSERT) {
wlen = savedisk (path, file, p + HEADERSIZE, tmp);
}
if (wlen) {
wlen += HEADERSIZE;
p[1] = wlen >> 8;
p[2] = wlen;
zfile_fwrite (p, HEADERSIZE, 1, zf);
zfile_fwrite (tmp, wlen - HEADERSIZE, 1, zf);
} else {
zfile_fwrite (p, plen, 1, zf);
}
p += plen;
}
xfree (data);
zfile_fclose (zf);
savelog (path, file);
write_log ("inputfile '%s' saved\n", filename);
} else {
write_log ("failed to open '%s'\n", filename);
}
}
bool inprec_realtime (void)
{
if (input_record != INPREC_RECORD_PLAYING || input_play != INPREC_PLAY_RERECORD)
return false;
//clear_inputstate ();
return inprec_realtime (false);
}
void inprec_getstatus (TCHAR *title)
{
TCHAR *p;
if (!input_record && !input_play)
return;
_tcscat (title, "[");
if (input_record) {
if (input_record != INPREC_RECORD_PLAYING)
_tcscat (title, "-REC-");
else
_tcscat (title, "REPLAY");
} else if (input_play) {
_tcscat (title, "PLAY-");
}
_tcscat (title, " ");
p = title + _tcslen (title);
int mvp = current_maxvpos ();
_stprintf (p, "%03d %02d:%02d:%02d/%02d:%02d:%02d", replaypos,
lasthsync / (vblank_hz * mvp * 60), (lasthsync / (vblank_hz * mvp) % 60), (lasthsync / mvp) % vblank_hz,
endhsync / (vblank_hz * mvp * 60), (endhsync / (vblank_hz * mvp) % 60), (endhsync / mvp) % vblank_hz);
p += _tcslen (p);
_tcscat (p, "] ");
}
#include "sysconfig.h"
#include "sysdeps.h"
#include <ctype.h>
#include <assert.h>
#include "options.h"
#include "uae.h"
#include "xwin.h"
#include "gui.h"
#include "custom.h"
#include "drawing.h"
#include "statusline.h"
/*
* Some code to put status information on the screen.
*/
static const char *numbers = { /* ugly 0123456789CHD%+- */
"+++++++--++++-+++++++++++++++++-++++++++++++++++++++++++++++++++++++++++++++-++++++-++++----++---+--------------"
"+xxxxx+--+xx+-+xxxxx++xxxxx++x+-+x++xxxxx++xxxxx++xxxxx++xxxxx++xxxxx++xxxx+-+x++x+-+xxx++-+xx+-+x---+----------"
"+x+++x+--++x+-+++++x++++++x++x+++x++x++++++x++++++++++x++x+++x++x+++x++x++++-+x++x+-+x++x+--+x++x+--+x+----+++--"
"+x+-+x+---+x+-+xxxxx++xxxxx++xxxxx++xxxxx++xxxxx+--++x+-+xxxxx++xxxxx++x+----+xxxx+-+x++x+----+x+--+xxx+--+xxx+-"
"+x+++x+---+x+-+x++++++++++x++++++x++++++x++x+++x+--+x+--+x+++x++++++x++x++++-+x++x+-+x++x+---+x+x+--+x+----+++--"
"+xxxxx+---+x+-+xxxxx++xxxxx+----+x++xxxxx++xxxxx+--+x+--+xxxxx++xxxxx++xxxx+-+x++x+-+xxx+---+x++xx--------------"
"+++++++---+++-++++++++++++++----+++++++++++++++++--+++--++++++++++++++++++++-++++++-++++------------------------"
};
STATIC_INLINE uae_u32 ledcolor (uae_u32 c, uae_u32 *rc, uae_u32 *gc, uae_u32 *bc, uae_u32 *a)
{
uae_u32 v = rc[(c >> 16) & 0xff] | gc[(c >> 8) & 0xff] | bc[(c >> 0) & 0xff];
if (a)
v |= a[255 - ((c >> 24) & 0xff)];
return v;
}
static void write_tdnumber (uae_u8 *buf, int bpp, int x, int y, int num, uae_u32 c1, uae_u32 c2)
{
int j;
const char *numptr;
numptr = numbers + num * TD_NUM_WIDTH + NUMBERS_NUM * TD_NUM_WIDTH * y;
for (j = 0; j < TD_NUM_WIDTH; j++) {
if (*numptr == 'x')
putpixel (buf, bpp, x + j, c1, 1);
else if (*numptr == '+')
putpixel (buf, bpp, x + j, c2, 0);
numptr++;
}
}
void draw_status_line_single (uae_u8 *buf, int bpp, int y, int totalwidth, uae_u32 *rc, uae_u32 *gc, uae_u32 *bc, uae_u32 *alpha)
{
int x_start, j, led, border;
uae_u32 c1, c2, cb;
c1 = ledcolor (0x00ffffff, rc, gc, bc, alpha);
c2 = ledcolor (0x00000000, rc, gc, bc, alpha);
cb = ledcolor (TD_BORDER, rc, gc, bc, alpha);
if (td_pos & TD_RIGHT)
x_start = totalwidth - TD_PADX - VISIBLE_LEDS * TD_WIDTH;
else
x_start = TD_PADX;
for (led = 0; led < LED_MAX; led++) {
int side, pos, num1 = -1, num2 = -1, num3 = -1, num4 = -1;
int x, c, on = 0, am = 2;
xcolnr on_rgb, on_rgb2, off_rgb, pen_rgb;
int half = 0;
pen_rgb = c1;
if (led >= LED_DF0 && led <= LED_DF3) {
int pled = led - LED_DF0;
int track = gui_data.drive_track[pled];
pos = 6 + pled;
on_rgb = 0x00cc00;
on_rgb2 = 0x006600;
off_rgb = 0x003300;
if (!gui_data.drive_disabled[pled]) {
num1 = -1;
num2 = track / 10;
num3 = track % 10;
on = gui_data.drive_motor[pled];
if (gui_data.drive_writing[pled]) {
on_rgb = 0xcc0000;
on_rgb2 = 0x880000;
}
half = gui_data.drive_side ? 1 : -1;
if (gui_data.df[pled][0] == 0)
pen_rgb = ledcolor (0x00aaaaaa, rc, gc, bc, alpha);
}
side = gui_data.drive_side;
} else if (led == LED_POWER) {
pos = 3;
on_rgb = ((gui_data.powerled_brightness * 10 / 16) + 0x33) << 16;
on = 1;
off_rgb = 0x330000;
} else if (led == LED_CD) {
pos = 5;
on = gui_data.cd & (LED_CD_AUDIO | LED_CD_ACTIVE);
on_rgb = (on & LED_CD_AUDIO) ? 0x00cc00 : 0x0000cc;
if ((gui_data.cd & LED_CD_ACTIVE2) && !(gui_data.cd & LED_CD_AUDIO)) {
on_rgb &= 0xfefefe;
on_rgb >>= 1;
}
off_rgb = 0x000033;
num1 = -1;
num2 = 10;
num3 = 12;
} else if (led == LED_HD) {
pos = 4;
on = gui_data.hd;
on_rgb = on == 2 ? 0xcc0000 : 0x0000cc;
off_rgb = 0x000033;
num1 = -1;
num2 = 11;
num3 = 12;
} else if (led == LED_FPS) {
int fps = (gui_data.fps + 5) / 10;
pos = 2;
on_rgb = 0x000000;
off_rgb = 0x000000;
if (fps > 999)
fps = 999;
num1 = fps / 100;
num2 = (fps - num1 * 100) / 10;
num3 = fps % 10;
am = 3;
if (num1 == 0)
am = 2;
} else if (led == LED_CPU) {
int idle = (gui_data.idle + 5) / 10;
pos = 1;
on = framecnt && !picasso_on;
on_rgb = 0xcc0000;
off_rgb = 0x000000;
num1 = idle / 100;
num2 = (idle - num1 * 100) / 10;
num3 = idle % 10;
num4 = num1 == 0 ? 13 : -1;
am = 3;
} else if (led == LED_SND) {
int snd = abs(gui_data.sndbuf + 5) / 10;
if (snd > 99)
snd = 99;
pos = 0;
on = gui_data.sndbuf_status;
if (on < 3) {
num1 = gui_data.sndbuf < 0 ? 15 : 14;
num2 = snd / 10;
num3 = snd % 10;
}
on_rgb = 0x000000;
if (on < 0)
on_rgb = 0xcccc00; // underflow
else if (on == 2)
on_rgb = 0xcc0000; // really big overflow
else if (on == 1)
on_rgb = 0x0000cc; // "normal" overflow
off_rgb = 0x000000;
am = 3;
} else if (led == LED_MD && gui_data.drive_disabled[3]) {
// DF3 reused as internal non-volatile ram led (cd32/cdtv)
pos = 6 + 3;
on = gui_data.md;
on_rgb = on == 2 ? 0xcc0000 : 0x00cc00;
off_rgb = 0x003300;
num1 = -1;
num2 = -1;
num3 = -1;
} else
return;
on_rgb |= 0x33000000;
off_rgb |= 0x33000000;
if (half > 0) {
c = ledcolor (on ? (y >= TD_TOTAL_HEIGHT / 2 ? on_rgb2 : on_rgb) : off_rgb, rc, gc, bc, alpha);
} else if (half < 0) {
c = ledcolor (on ? (y < TD_TOTAL_HEIGHT / 2 ? on_rgb2 : on_rgb) : off_rgb, rc, gc, bc, alpha);
} else {
c = ledcolor (on ? on_rgb : off_rgb, rc, gc, bc, alpha);
}
border = 0;
if (y == 0 || y == TD_TOTAL_HEIGHT - 1) {
c = ledcolor (TD_BORDER, rc, gc, bc, alpha);
border = 1;
}
x = x_start + pos * TD_WIDTH;
if (!border)
putpixel (buf, bpp, x - 1, cb, 0);
for (j = 0; j < TD_LED_WIDTH; j++)
putpixel (buf, bpp, x + j, c, 0);
if (!border)
putpixel (buf, bpp, x + j, cb, 0);
if (y >= TD_PADY && y - TD_PADY < TD_NUM_HEIGHT) {
if (num3 >= 0) {
x += (TD_LED_WIDTH - am * TD_NUM_WIDTH) / 2;
if (num1 > 0) {
write_tdnumber (buf, bpp, x, y - TD_PADY, num1, pen_rgb, c2);
x += TD_NUM_WIDTH;
}
write_tdnumber (buf, bpp, x, y - TD_PADY, num2, pen_rgb, c2);
x += TD_NUM_WIDTH;
write_tdnumber (buf, bpp, x, y - TD_PADY, num3, pen_rgb, c2);
x += TD_NUM_WIDTH;
if (num4 > 0)
write_tdnumber (buf, bpp, x, y - TD_PADY, num4, pen_rgb, c2);
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment