Unify dreamcast, naomi and atomiswave builds WIP

This commit is contained in:
Flyinghead 2019-07-09 23:52:19 +02:00
parent 632aa95c2d
commit f3a91de1af
38 changed files with 2857 additions and 689 deletions

42
.cproject Normal file
View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="cdt.managedbuild.toolchain.gnu.base.561256944">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.base.561256944" moduleId="org.eclipse.cdt.core.settings" name="Default">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration buildProperties="" id="cdt.managedbuild.toolchain.gnu.base.561256944" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
<folderInfo id="cdt.managedbuild.toolchain.gnu.base.561256944.1159063585" name="/" resourcePath="">
<toolChain id="cdt.managedbuild.toolchain.gnu.base.1876419875" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.base">
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.GNU_ELF" id="cdt.managedbuild.target.gnu.platform.base.1672145497" name="Debug Platform" osList="linux,hpux,aix,qnx" superClass="cdt.managedbuild.target.gnu.platform.base"/>
<builder id="cdt.managedbuild.target.gnu.builder.base.782452746" managedBuildOn="false" name="Gnu Make Builder.Default" superClass="cdt.managedbuild.target.gnu.builder.base"/>
<tool id="cdt.managedbuild.tool.gnu.archiver.base.1192189541" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.base.1508781103" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base"/>
<tool id="cdt.managedbuild.tool.gnu.c.compiler.base.129279683" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.base"/>
<tool id="cdt.managedbuild.tool.gnu.c.linker.base.436312589" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.base"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.base.895089303" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.base"/>
<tool id="cdt.managedbuild.tool.gnu.assembler.base.1639000963" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.base"/>
</toolChain>
</folderInfo>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="flycast-unified.null.998677973" name="flycast-unified"/>
</storageModule>
<storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
</cproject>

27
.project Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>flycast-unified</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
<triggers>full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project>
<configuration id="cdt.managedbuild.toolchain.gnu.base.561256944" name="Default">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-379634980750180479" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
</extension>
</configuration>
</project>

View File

@ -345,94 +345,7 @@
#define RAM_SIZE_MAX (32*1024*1024) #define RAM_SIZE_MAX (32*1024*1024)
#define VRAM_SIZE_MAX (16*1024*1024) #define VRAM_SIZE_MAX (16*1024*1024)
#define ARAM_SIZE_MAX (8*1024*1024) #define ARAM_SIZE_MAX (8*1024*1024)
#define BUILD_DREAMCAST 1
#if (DC_PLATFORM==DC_PLATFORM_DREAMCAST)
#define BUILD_DREAMCAST 1
//DC : 16 mb ram, 8 mb vram, 2 mb aram, 2 mb bios, 128k flash
#define RAM_SIZE (16*1024*1024)
#define VRAM_SIZE (8*1024*1024)
#define ARAM_SIZE (2*1024*1024)
#define BIOS_SIZE (2*1024*1024)
#define FLASH_SIZE (128*1024)
#define ROM_PREFIX "dc_"
#define ROM_NAMES
#define NVR_OPTIONAL 0
#elif (DC_PLATFORM==DC_PLATFORM_DEV_UNIT)
#define BUILD_DEV_UNIT 1
//Devkit : 32 mb ram, 8? mb vram, 2? mb aram, 2? mb bios, ? flash
#define RAM_SIZE (32*1024*1024)
#define VRAM_SIZE (8*1024*1024)
#define ARAM_SIZE (2*1024*1024)
#define BIOS_SIZE (2*1024*1024)
#define FLASH_SIZE (128*1024)
#define ROM_PREFIX "hkt_"
#define ROM_NAMES
#define NVR_OPTIONAL 0
#elif (DC_PLATFORM==DC_PLATFORM_NAOMI)
//Naomi : 32 mb ram, 16 mb vram, 8 mb aram, 2 mb bios, ? flash
#define RAM_SIZE (32*1024*1024)
#define VRAM_SIZE (16*1024*1024)
#define ARAM_SIZE (8*1024*1024)
#define BIOS_SIZE (2*1024*1024)
#define BBSRAM_SIZE (32*1024)
#define ROM_PREFIX "naomi_"
#define ROM_NAMES ";epr-21576d.bin"
#define NVR_OPTIONAL 1
#elif (DC_PLATFORM==DC_PLATFORM_NAOMI2)
//Naomi2 : 32 mb ram, 16 mb vram, 8 mb aram, 2 mb bios, ? flash
#define RAM_SIZE (32*1024*1024)
#define VRAM_SIZE (16*1024*1024)
#define ARAM_SIZE (8*1024*1024)
#define BIOS_SIZE (2*1024*1024)
#define BBSRAM_SIZE (32*1024)
#define ROM_PREFIX "n2_"
#define ROM_NAMES
#define NVR_OPTIONAL 1
#elif (DC_PLATFORM==DC_PLATFORM_ATOMISWAVE)
#define BUILD_ATOMISWAVE 1
//Atomiswave : 16 mb ram, 8 mb vram, 8 mb aram, 128kb bios on flash, 128kb battery-backed ram
#define RAM_SIZE (16*1024*1024)
#define VRAM_SIZE (8*1024*1024)
#define ARAM_SIZE (8*1024*1024)
#define BIOS_SIZE (128*1024)
#define BBSRAM_SIZE (128*1024)
#define ROM_PREFIX "aw_"
#define ROM_NAMES ";bios.ic23_l"
#define NVR_OPTIONAL 1
#else
#error invalid build config
#endif
#define RAM_MASK (RAM_SIZE-1)
#define VRAM_MASK (VRAM_SIZE-1)
#define ARAM_MASK (ARAM_SIZE-1)
#define BIOS_MASK (BIOS_SIZE-1)
#ifdef FLASH_SIZE
#define FLASH_MASK (FLASH_SIZE-1)
#endif
#ifdef BBSRAM_SIZE
#define BBSRAM_MASK (BBSRAM_SIZE-1)
#endif
#define GD_CLOCK 33868800 //GDROM XTAL -- 768fs #define GD_CLOCK 33868800 //GDROM XTAL -- 768fs

View File

@ -133,8 +133,7 @@ bool ParseCommandLine(int argc,wchar* argv[])
if (extension if (extension
&& (stricmp(extension, ".cdi") == 0 || stricmp(extension, ".chd") == 0 && (stricmp(extension, ".cdi") == 0 || stricmp(extension, ".chd") == 0
|| stricmp(extension, ".gdi") == 0 || stricmp(extension, ".lst") == 0 || stricmp(extension, ".gdi") == 0 || stricmp(extension, ".cue") == 0))
|| stricmp(extension, ".cue") == 0))
{ {
INFO_LOG(COMMON, "Using '%s' as cd image", *arg); INFO_LOG(COMMON, "Using '%s' as cd image", *arg);
cfgSetVirtual("config", "image", *arg); cfgSetVirtual("config", "image", *arg);
@ -147,12 +146,8 @@ bool ParseCommandLine(int argc,wchar* argv[])
} }
else else
{ {
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
INFO_LOG(COMMON, "Using '%s' as rom", *arg); INFO_LOG(COMMON, "Using '%s' as rom", *arg);
cfgSetVirtual("config", "image", *arg); cfgSetVirtual("config", "image", *arg);
#else
WARN_LOG(COMMON, "wtf %s is supposed to do ?",*arg);
#endif
} }
} }
arg++; arg++;

View File

@ -33,7 +33,7 @@ extern "C" {
} }
#define VIXL_CODE_BUFFER_MALLOC #define VIXL_CODE_BUFFER_MALLOC
#define VIXL_DEBUG
#if defined(_ANDROID) && defined(VIXL_DEBUG) #if defined(_ANDROID) && defined(VIXL_DEBUG)
#include <android/log.h> #include <android/log.h>

View File

@ -40,6 +40,11 @@ struct MemChip
return rv; return rv;
} }
virtual void Write(u32 addr, u32 data, u32 size)
{
die("Method not supported");
}
bool Load(const string& file) bool Load(const string& file)
{ {
FILE* f=fopen(file.c_str(),"rb"); FILE* f=fopen(file.c_str(),"rb");
@ -119,20 +124,20 @@ struct MemChip
INFO_LOG(FLASHROM, "Saved %s as %s", path, title.c_str()); INFO_LOG(FLASHROM, "Saved %s as %s", path, title.c_str());
} }
virtual void Reset() {} virtual void Reset() {}
virtual bool Serialize(void **data, unsigned int *total_size) { return true; }
virtual bool Unserialize(void **data, unsigned int *total_size) { return true; }
}; };
struct RomChip : MemChip struct RomChip : MemChip
{ {
RomChip(u32 sz, u32 write_protect_size = 0) : MemChip(sz, write_protect_size) {} RomChip(u32 sz, u32 write_protect_size = 0) : MemChip(sz, write_protect_size) {}
void Write(u32 addr,u32 data,u32 sz)
{
die("Write to RomChip is not possible, address=%x, data=%x, size=%d");
}
}; };
struct SRamChip : MemChip struct SRamChip : MemChip
{ {
SRamChip(u32 sz, u32 write_protect_size = 0) : MemChip(sz, write_protect_size) {} SRamChip(u32 sz, u32 write_protect_size = 0) : MemChip(sz, write_protect_size) {}
void Write(u32 addr,u32 val,u32 sz) void Write(u32 addr,u32 val,u32 sz) override
{ {
addr&=mask; addr&=mask;
if (addr < write_protect_size) if (addr < write_protect_size)
@ -152,6 +157,18 @@ struct SRamChip : MemChip
die("invalid access size"); die("invalid access size");
} }
} }
virtual bool Serialize(void **data, unsigned int *total_size)
{
REICAST_SA(&this->data[write_protect_size], size - write_protect_size);
return true;
}
virtual bool Unserialize(void **data, unsigned int *total_size)
{
REICAST_USA(&this->data[write_protect_size], size - write_protect_size);
return true;
}
}; };
// //
@ -235,26 +252,27 @@ struct DCFlashChip : MemChip
virtual u8 Read8(u32 addr) override virtual u8 Read8(u32 addr) override
{ {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST if (settings.platform.system == DC_PLATFORM_DREAMCAST)
switch (addr)
{ {
case 0x1A002: switch (addr)
case 0x1A0A2: {
if (settings.dreamcast.region <= 2) case 0x1A002:
return '0' + settings.dreamcast.region; case 0x1A0A2:
break; if (settings.dreamcast.region <= 2)
case 0x1A003: return '0' + settings.dreamcast.region;
case 0x1A0A3: break;
if (settings.dreamcast.language <= 5) case 0x1A003:
return '0' + settings.dreamcast.language; case 0x1A0A3:
break; if (settings.dreamcast.language <= 5)
case 0x1A004: return '0' + settings.dreamcast.language;
case 0x1A0A4: break;
if (settings.dreamcast.broadcast <= 3) case 0x1A004:
return '0' + settings.dreamcast.broadcast; case 0x1A0A4:
break; if (settings.dreamcast.broadcast <= 3)
return '0' + settings.dreamcast.broadcast;
break;
}
} }
#endif
u32 rv=MemChip::Read8(addr); u32 rv=MemChip::Read8(addr);
@ -262,7 +280,7 @@ struct DCFlashChip : MemChip
} }
void Write(u32 addr,u32 val,u32 sz) void Write(u32 addr,u32 val,u32 sz) override
{ {
if (sz != 1) if (sz != 1)
die("invalid access size"); die("invalid access size");
@ -283,7 +301,7 @@ struct DCFlashChip : MemChip
state = FS_ReadAMDID1; state = FS_ReadAMDID1;
break; break;
default: default:
EMUERROR("Unknown FlashWrite mode: %x\n", val); INFO_LOG(FLASHROM, "Unknown FlashWrite mode: %x\n", val);
break; break;
} }
break; break;
@ -357,15 +375,13 @@ struct DCFlashChip : MemChip
{ {
// chip erase // chip erase
INFO_LOG(FLASHROM, "Erasing Chip!"); INFO_LOG(FLASHROM, "Erasing Chip!");
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
u8 save[0x2000]; u8 save[0x2000];
// this area is write-protected on AW if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
memcpy(save, data + 0x1a000, 0x2000); // this area is write-protected on AW
#endif memcpy(save, data + 0x1a000, 0x2000);
memset(data + write_protect_size, 0xff, size - write_protect_size); memset(data + write_protect_size, 0xff, size - write_protect_size);
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
memcpy(data + 0x1a000, save, 0x2000); memcpy(data + 0x1a000, save, 0x2000);
#endif
state = FS_Normal; state = FS_Normal;
} }
else if ((val & 0xff) == 0x30) else if ((val & 0xff) == 0x30)
@ -373,16 +389,14 @@ struct DCFlashChip : MemChip
// sector erase // sector erase
if (addr >= write_protect_size) if (addr >= write_protect_size)
{ {
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
u8 save[0x2000]; u8 save[0x2000];
// this area is write-protected on AW if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
memcpy(save, data + 0x1a000, 0x2000); // this area is write-protected on AW
#endif memcpy(save, data + 0x1a000, 0x2000);
INFO_LOG(FLASHROM, "Erase Sector %08X! (%08X)", addr, addr & ~0x3FFF); INFO_LOG(FLASHROM, "Erase Sector %08X! (%08X)", addr, addr & ~0x3FFF);
memset(&data[addr&(~0x3FFF)],0xFF,0x4000); memset(&data[addr&(~0x3FFF)],0xFF,0x4000);
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
memcpy(data + 0x1a000, save, 0x2000); memcpy(data + 0x1a000, save, 0x2000);
#endif
} }
state = FS_Normal; state = FS_Normal;
} }
@ -627,4 +641,18 @@ private:
return result; return result;
} }
virtual bool Serialize(void **data, unsigned int *total_size)
{
REICAST_SA(&this->data[write_protect_size], size - write_protect_size);
REICAST_S(state);
return true;
}
virtual bool Unserialize(void **data, unsigned int *total_size)
{
REICAST_USA(&this->data[write_protect_size], size - write_protect_size);
REICAST_US(state);
return true;
}
}; };

View File

@ -1121,20 +1121,9 @@ void GDROM_DmaEnable(u32 addr, u32 data)
//Init/Term/Res //Init/Term/Res
void gdrom_reg_Init() void gdrom_reg_Init()
{ {
sb_rio_register(SB_GDST_addr, RIO_WF, 0, &GDROM_DmaStart);
/*
sb_regs[(SB_GDST_addr-SB_BASE)>>2].flags=REG_32BIT_READWRITE | REG_READ_DATA;
sb_regs[(SB_GDST_addr-SB_BASE)>>2].writeFunction=GDROM_DmaStart;
*/
sb_rio_register(SB_GDEN_addr, RIO_WF, 0, &GDROM_DmaEnable);
/*
sb_regs[(SB_GDEN_addr-SB_BASE)>>2].flags=REG_32BIT_READWRITE | REG_READ_DATA;
sb_regs[(SB_GDEN_addr-SB_BASE)>>2].writeFunction=GDROM_DmaEnable;
*/
gdrom_schid = sh4_sched_register(0, &GDRomschd); gdrom_schid = sh4_sched_register(0, &GDRomschd);
} }
void gdrom_reg_Term() void gdrom_reg_Term()
{ {
@ -1142,6 +1131,8 @@ void gdrom_reg_Term()
void gdrom_reg_Reset(bool Manual) void gdrom_reg_Reset(bool Manual)
{ {
sb_rio_register(SB_GDST_addr, RIO_WF, 0, &GDROM_DmaStart);
sb_rio_register(SB_GDEN_addr, RIO_WF, 0, &GDROM_DmaEnable);
SB_GDST = 0; SB_GDST = 0;
SB_GDEN = 0; SB_GDEN = 0;
} }

View File

@ -773,32 +773,26 @@ void sb_Init()
asic_reg_Init(); asic_reg_Init();
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
gdrom_reg_Init(); gdrom_reg_Init();
#else
naomi_reg_Init(); naomi_reg_Init();
#endif
pvr_sb_Init(); pvr_sb_Init();
maple_Init(); maple_Init();
aica_sb_Init(); aica_sb_Init();
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST && defined(ENABLE_MODEM) #ifdef ENABLE_MODEM
ModemInit(); ModemInit();
#endif #endif
} }
void sb_Reset(bool Manual) void sb_Reset(bool Manual)
{ {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST && defined(ENABLE_MODEM) #ifdef ENABLE_MODEM
ModemTerm(); ModemTerm();
#endif #endif
asic_reg_Reset(Manual); asic_reg_Reset(Manual);
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
gdrom_reg_Reset(Manual); gdrom_reg_Reset(Manual);
#else
naomi_reg_Reset(Manual); naomi_reg_Reset(Manual);
#endif
pvr_sb_Reset(Manual); pvr_sb_Reset(Manual);
maple_Reset(Manual); maple_Reset(Manual);
aica_sb_Reset(Manual); aica_sb_Reset(Manual);
@ -806,16 +800,13 @@ void sb_Reset(bool Manual)
void sb_Term() void sb_Term()
{ {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST && defined(ENABLE_MODEM) #ifdef ENABLE_MODEM
ModemTerm(); ModemTerm();
#endif #endif
aica_sb_Term(); aica_sb_Term();
maple_Term(); maple_Term();
pvr_sb_Term(); pvr_sb_Term();
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
gdrom_reg_Term(); gdrom_reg_Term();
#else
naomi_reg_Term(); naomi_reg_Term();
#endif
asic_reg_Term(); asic_reg_Term();
} }

View File

@ -18,132 +18,139 @@
#include "hw/flashrom/flashrom.h" #include "hw/flashrom/flashrom.h"
#include "reios/reios.h" #include "reios/reios.h"
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE MemChip *sys_rom;
DCFlashChip sys_rom(BIOS_SIZE, BIOS_SIZE / 2); MemChip *sys_nvmem;
#else
RomChip sys_rom(BIOS_SIZE);
#endif
#ifdef FLASH_SIZE
DCFlashChip sys_nvmem(FLASH_SIZE);
#endif
#ifdef BBSRAM_SIZE
SRamChip sys_nvmem(BBSRAM_SIZE);
#endif
extern bool bios_loaded; extern bool bios_loaded;
static std::string getRomPrefix()
{
switch (settings.platform.system)
{
case DC_PLATFORM_DREAMCAST:
return "dc_";
case DC_PLATFORM_NAOMI:
return "naomi_";
case DC_PLATFORM_ATOMISWAVE:
return "aw_";
default:
die("Unsupported platform");
return "";
}
}
static bool nvmemOptional()
{
return settings.platform.system != DC_PLATFORM_DREAMCAST;
}
bool LoadRomFiles(const string& root) bool LoadRomFiles(const string& root)
{ {
#if DC_PLATFORM != DC_PLATFORM_ATOMISWAVE if (settings.platform.system != DC_PLATFORM_ATOMISWAVE)
if (!sys_rom.Load(root, ROM_PREFIX, "%boot.bin;%boot.bin.bin;%bios.bin;%bios.bin.bin" ROM_NAMES, "bootrom"))
{ {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST if (!sys_rom->Load(root, getRomPrefix(), "%boot.bin;%boot.bin.bin;%bios.bin;%bios.bin.bin", "bootrom"))
// Dreamcast absolutely needs a BIOS {
msgboxf("Unable to find bios in %s. Exiting...", MBX_ICONERROR, root.c_str()); if (settings.platform.system == DC_PLATFORM_DREAMCAST)
return false; {
#endif // Dreamcast absolutely needs a BIOS
msgboxf("Unable to find bios in %s. Exiting...", MBX_ICONERROR, root.c_str());
return false;
}
}
else
bios_loaded = true;
} }
bool rc;
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
rc = sys_nvmem->Load(root, getRomPrefix(), "%nvmem.bin;%flash_wb.bin;%flash.bin;%flash.bin.bin", "nvram");
else else
bios_loaded = true; rc = sys_nvmem->Load(get_game_save_prefix() + ".nvmem");
#endif if (!rc)
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
if (!sys_nvmem.Load(root, ROM_PREFIX, "%nvmem.bin;%flash_wb.bin;%flash.bin;%flash.bin.bin", "nvram"))
#else
if (!sys_nvmem.Load(get_game_save_prefix() + ".nvmem"))
#endif
{ {
if (NVR_OPTIONAL) if (nvmemOptional())
{ {
INFO_LOG(FLASHROM, "flash/nvmem is missing, will create new file..."); INFO_LOG(FLASHROM, "flash/nvmem is missing, will create new file...");
} }
else else
{ {
msgboxf("Unable to find flash/nvmem in \n%s\nExiting...", MBX_ICONERROR, root.c_str()); msgboxf("Unable to find flash/nvmem in %s. Exiting...", MBX_ICONERROR, root.c_str());
return false; return false;
} }
} }
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST if (settings.platform.system == DC_PLATFORM_DREAMCAST)
struct flash_syscfg_block syscfg;
int res = sys_nvmem.ReadBlock(FLASH_PT_USER, FLASH_USER_SYSCFG, &syscfg);
if (!res)
{ {
// write out default settings struct flash_syscfg_block syscfg;
memset(&syscfg, 0xff, sizeof(syscfg)); int res = static_cast<DCFlashChip*>(sys_nvmem)->ReadBlock(FLASH_PT_USER, FLASH_USER_SYSCFG, &syscfg);
syscfg.time_lo = 0;
syscfg.time_hi = 0; if (!res)
syscfg.lang = 0; {
syscfg.mono = 0; // write out default settings
syscfg.autostart = 1; memset(&syscfg, 0xff, sizeof(syscfg));
syscfg.time_lo = 0;
syscfg.time_hi = 0;
syscfg.lang = 0;
syscfg.mono = 0;
syscfg.autostart = 1;
}
u32 time = GetRTC_now();
syscfg.time_lo = time & 0xffff;
syscfg.time_hi = time >> 16;
if (settings.dreamcast.language <= 5)
syscfg.lang = settings.dreamcast.language;
if (static_cast<DCFlashChip*>(sys_nvmem)->WriteBlock(FLASH_PT_USER, FLASH_USER_SYSCFG, &syscfg) != 1)
WARN_LOG(FLASHROM, "Failed to save time and language to flash RAM");
} }
u32 time = GetRTC_now();
syscfg.time_lo = time & 0xffff;
syscfg.time_hi = time >> 16;
if (settings.dreamcast.language <= 5)
syscfg.lang = settings.dreamcast.language;
if (sys_nvmem.WriteBlock(FLASH_PT_USER, FLASH_USER_SYSCFG, &syscfg) != 1) if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
WARN_LOG(FLASHROM, "Failed to save time and language to flash RAM"); sys_rom->Load(get_game_save_prefix() + ".nvmem2");
#endif
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
sys_rom.Load(get_game_save_prefix() + ".nvmem2");
#endif
return true; return true;
} }
void SaveRomFiles(const string& root) void SaveRomFiles(const string& root)
{ {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST if (settings.platform.system == DC_PLATFORM_DREAMCAST)
sys_nvmem.Save(root, ROM_PREFIX, "nvmem.bin", "nvmem"); sys_nvmem->Save(root, getRomPrefix(), "nvmem.bin", "nvmem");
#else else
sys_nvmem.Save(get_game_save_prefix() + ".nvmem"); sys_nvmem->Save(get_game_save_prefix() + ".nvmem");
#endif if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE sys_rom->Save(get_game_save_prefix() + ".nvmem2");
sys_rom.Save(get_game_save_prefix() + ".nvmem2");
#endif
} }
bool LoadHle(const string& root) { bool LoadHle(const string& root) {
if (!sys_nvmem.Load(root, ROM_PREFIX, "%nvmem.bin;%flash_wb.bin;%flash.bin;%flash.bin.bin", "nvram")) { if (!sys_nvmem->Load(root, getRomPrefix(), "%nvmem.bin;%flash_wb.bin;%flash.bin;%flash.bin.bin", "nvram")) {
INFO_LOG(FLASHROM, "No nvmem loaded"); INFO_LOG(FLASHROM, "No nvmem loaded");
} }
return reios_init(sys_rom.data, sys_nvmem.data); return reios_init(sys_rom->data, sys_nvmem->data);
} }
u32 ReadFlash(u32 addr,u32 sz) { return sys_nvmem.Read(addr,sz); } u32 ReadFlash(u32 addr,u32 sz) { return sys_nvmem->Read(addr,sz); }
void WriteFlash(u32 addr,u32 data,u32 sz) { sys_nvmem.Write(addr,data,sz); } void WriteFlash(u32 addr,u32 data,u32 sz) { sys_nvmem->Write(addr,data,sz); }
#if (DC_PLATFORM == DC_PLATFORM_DREAMCAST) || (DC_PLATFORM == DC_PLATFORM_DEV_UNIT) || (DC_PLATFORM == DC_PLATFORM_NAOMI) || (DC_PLATFORM == DC_PLATFORM_NAOMI2) u32 ReadBios(u32 addr,u32 sz)
{
return sys_rom->Read(addr, sz);
}
u32 ReadBios(u32 addr,u32 sz) { return sys_rom.Read(addr,sz); } void WriteBios(u32 addr,u32 data,u32 sz)
void WriteBios(u32 addr,u32 data,u32 sz) { INFO_LOG(MEMORY, "Write to [Boot ROM] is not possible, addr=%x, data=%x, size=%d", addr, data, sz); } {
if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
#elif (DC_PLATFORM == DC_PLATFORM_ATOMISWAVE)
u32 ReadBios(u32 addr,u32 sz)
{
return sys_rom.Read(addr, sz);
}
void WriteBios(u32 addr,u32 data,u32 sz)
{ {
if (sz != 1) if (sz != 1)
{ {
INFO_LOG(MEMORY, "Invalid access size @%08x data %x sz %d", addr, data, sz); INFO_LOG(MEMORY, "Invalid access size @%08x data %x sz %d", addr, data, sz);
return; return;
} }
sys_rom.Write(addr, data, sz); sys_rom->Write(addr, data, sz);
} }
else
#else {
#error unknown flash INFO_LOG(MEMORY, "Write to [Boot ROM] is not possible, addr=%x, data=%x, size=%d", addr, data, sz);
#endif }
}
//Area 0 mem map //Area 0 mem map
//0x00000000- 0x001FFFFF :MPX System/Boot ROM //0x00000000- 0x001FFFFF :MPX System/Boot ROM
@ -174,11 +181,9 @@ T DYNACALL ReadMem_area0(u32 addr)
//map 0x0000 to 0x01FF to Default handler //map 0x0000 to 0x01FF to Default handler
//mirror 0x0200 to 0x03FF , from 0x0000 to 0x03FFF //mirror 0x0200 to 0x03FF , from 0x0000 to 0x03FFF
//map 0x0000 to 0x001F //map 0x0000 to 0x001F
#if DC_PLATFORM != DC_PLATFORM_ATOMISWAVE
if (base<=0x001F)// :MPX System/Boot ROM // :MPX System/Boot ROM
#else if (base <= (settings.platform.system == DC_PLATFORM_ATOMISWAVE ? 0x0001 : 0x001F)) // Only 128k BIOS on AtomisWave
if (base<=0x0001) // Only 128k BIOS on AtomisWave
#endif
{ {
return ReadBios(addr,sz); return ReadBios(addr,sz);
} }
@ -196,11 +201,10 @@ T DYNACALL ReadMem_area0(u32 addr)
} }
else if ((addr>= 0x005F7000) && (addr<= 0x005F70FF)) // GD-ROM else if ((addr>= 0x005F7000) && (addr<= 0x005F70FF)) // GD-ROM
{ {
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE if (settings.platform.system != DC_PLATFORM_DREAMCAST)
return (T)ReadMem_naomi(addr,sz); return (T)ReadMem_naomi(addr, sz);
#else else
return (T)ReadMem_gdrom(addr,sz); return (T)ReadMem_gdrom(addr, sz);
#endif
} }
else if (likely((addr>= 0x005F6800) && (addr<=0x005F7CFF))) // /*:PVR i/f Control Reg.*/ -> ALL SB registers now else if (likely((addr>= 0x005F6800) && (addr<=0x005F7CFF))) // /*:PVR i/f Control Reg.*/ -> ALL SB registers now
{ {
@ -217,12 +221,13 @@ T DYNACALL ReadMem_area0(u32 addr)
//map 0x0060 to 0x0060 //map 0x0060 to 0x0060
else if ((base ==0x0060) /*&& (addr>= 0x00600000)*/ && (addr<= 0x006007FF)) // :MODEM else if ((base ==0x0060) /*&& (addr>= 0x00600000)*/ && (addr<= 0x006007FF)) // :MODEM
{ {
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE if (settings.platform.system != DC_PLATFORM_DREAMCAST)
return (T)libExtDevice_ReadMem_A0_006(addr, sz); return (T)libExtDevice_ReadMem_A0_006(addr, sz);
#elif defined(ENABLE_MODEM) else
return (T)ModemReadMem_A0_006(addr, sz); #if defined(ENABLE_MODEM)
return (T)ModemReadMem_A0_006(addr, sz);
#else #else
return (T)0; return (T)0;
#endif #endif
} }
//map 0x0060 to 0x006F //map 0x0060 to 0x006F
@ -261,12 +266,8 @@ void DYNACALL WriteMem_area0(u32 addr,T data)
const u32 base=(addr>>16); const u32 base=(addr>>16);
//map 0x0000 to 0x001F //map 0x0000 to 0x001F
#if DC_PLATFORM != DC_PLATFORM_ATOMISWAVE // :MPX System/Boot ROM
if ((base <=0x001F) /*&& (addr<=0x001FFFFF)*/)// :MPX System/Boot ROM if (base <= (settings.platform.system == DC_PLATFORM_ATOMISWAVE ? 0x0001 : 0x001F)) // Only 128k BIOS on AtomisWave
#else
if (base <= 0x0001) // Only 128k BIOS on AtomisWave
#endif
{ {
WriteBios(addr,data,sz); WriteBios(addr,data,sz);
} }
@ -285,11 +286,10 @@ void DYNACALL WriteMem_area0(u32 addr,T data)
} }
else if ((addr>= 0x005F7000) && (addr<= 0x005F70FF)) // GD-ROM else if ((addr>= 0x005F7000) && (addr<= 0x005F70FF)) // GD-ROM
{ {
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE if (settings.platform.system != DC_PLATFORM_DREAMCAST)
WriteMem_naomi(addr,data,sz); WriteMem_naomi(addr,data,sz);
#else else
WriteMem_gdrom(addr,data,sz); WriteMem_gdrom(addr,data,sz);
#endif
} }
else if ( likely((addr>= 0x005F6800) && (addr<=0x005F7CFF)) ) // /*:PVR i/f Control Reg.*/ -> ALL SB registers else if ( likely((addr>= 0x005F6800) && (addr<=0x005F7CFF)) ) // /*:PVR i/f Control Reg.*/ -> ALL SB registers
{ {
@ -304,10 +304,11 @@ void DYNACALL WriteMem_area0(u32 addr,T data)
//map 0x0060 to 0x0060 //map 0x0060 to 0x0060
else if ((base ==0x0060) /*&& (addr>= 0x00600000)*/ && (addr<= 0x006007FF)) // MODEM else if ((base ==0x0060) /*&& (addr>= 0x00600000)*/ && (addr<= 0x006007FF)) // MODEM
{ {
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE if (settings.platform.system != DC_PLATFORM_DREAMCAST)
libExtDevice_WriteMem_A0_006(addr, data, sz); libExtDevice_WriteMem_A0_006(addr, data, sz);
#elif defined(ENABLE_MODEM) #if defined(ENABLE_MODEM)
ModemWriteMem_A0_006(addr, data, sz); else
ModemWriteMem_A0_006(addr, data, sz);
#endif #endif
} }
//map 0x0060 to 0x006F //map 0x0060 to 0x006F
@ -347,17 +348,57 @@ void sh4_area0_Init()
sb_Init(); sb_Init();
} }
void sh4_area0_Reset(bool Manual) void sh4_area0_Reset(bool manual)
{ {
sb_Reset(Manual); if (manual)
sys_rom.Reset(); {
#if defined(FLASH_SIZE) || defined(BBSRAM_SIZE) if (sys_rom != NULL)
sys_nvmem.Reset(); {
#endif delete sys_rom;
sys_rom = NULL;
}
if (sys_nvmem != NULL)
{
delete sys_nvmem;
sys_nvmem = NULL;
}
switch (settings.platform.system)
{
case DC_PLATFORM_DREAMCAST:
sys_rom = new RomChip(settings.platform.bios_size);
sys_nvmem = new DCFlashChip(settings.platform.flash_size);
break;
case DC_PLATFORM_NAOMI:
sys_rom = new RomChip(settings.platform.bios_size);
sys_nvmem = new SRamChip(settings.platform.bbsram_size);
break;
case DC_PLATFORM_ATOMISWAVE:
sys_rom = new DCFlashChip(settings.platform.bios_size, settings.platform.bios_size / 2);
sys_nvmem = new SRamChip(settings.platform.bbsram_size);
break;
}
}
else
{
sys_rom->Reset();
sys_nvmem->Reset();
}
sb_Reset(manual);
} }
void sh4_area0_Term() void sh4_area0_Term()
{ {
if (sys_rom != NULL)
{
delete sys_rom;
sys_rom = NULL;
}
if (sys_nvmem != NULL)
{
delete sys_nvmem;
sys_nvmem = NULL;
}
sb_Term(); sb_Term();
} }

View File

@ -77,33 +77,36 @@ struct MapleConfigMap : IMapleConfigMap
UpdateInputState(player_num); UpdateInputState(player_num);
pjs->kcode=kcode[player_num]; pjs->kcode=kcode[player_num];
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST if (settings.platform.system == DC_PLATFORM_DREAMCAST)
pjs->kcode |= 0xF901; // mask off DPad2, C, D and Z
pjs->joy[PJAI_X1]=GetBtFromSgn(joyx[player_num]);
pjs->joy[PJAI_Y1]=GetBtFromSgn(joyy[player_num]);
pjs->trigger[PJTI_R]=rt[player_num];
pjs->trigger[PJTI_L]=lt[player_num];
#elif DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
pjs->kcode = 0xFFFF;
for (int i = 0; i < 16; i++)
{ {
if ((kcode[player_num] & (1 << i)) == 0) pjs->kcode |= 0xF901; // mask off DPad2, C, D and Z
pjs->kcode &= ~awave_button_mapping[i]; pjs->joy[PJAI_X1]=GetBtFromSgn(joyx[player_num]);
pjs->joy[PJAI_Y1]=GetBtFromSgn(joyy[player_num]);
pjs->trigger[PJTI_R]=rt[player_num];
pjs->trigger[PJTI_L]=lt[player_num];
} }
pjs->joy[PJAI_X1] = GetBtFromSgn(joyx[player_num]); else if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
if (NaomiGameInputs != NULL && NaomiGameInputs->axes[1].name != NULL && NaomiGameInputs->axes[1].type == Half)
{ {
// Driving games: put axis 2 on RT (accel) and axis 3 on LT (brake) pjs->kcode = 0xFFFF;
pjs->joy[PJAI_Y1] = rt[player_num]; for (int i = 0; i < 16; i++)
pjs->joy[PJAI_X2] = lt[player_num]; {
if ((kcode[player_num] & (1 << i)) == 0)
pjs->kcode &= ~awave_button_mapping[i];
}
pjs->joy[PJAI_X1] = GetBtFromSgn(joyx[player_num]);
if (NaomiGameInputs != NULL && NaomiGameInputs->axes[1].name != NULL && NaomiGameInputs->axes[1].type == Half)
{
// Driving games: put axis 2 on RT (accel) and axis 3 on LT (brake)
pjs->joy[PJAI_Y1] = rt[player_num];
pjs->joy[PJAI_X2] = lt[player_num];
}
else
{
pjs->joy[PJAI_Y1] = GetBtFromSgn(joyy[player_num]);
pjs->joy[PJAI_X2] = rt[player_num];
pjs->joy[PJAI_Y2] = lt[player_num];
}
} }
else
{
pjs->joy[PJAI_Y1] = GetBtFromSgn(joyy[player_num]);
pjs->joy[PJAI_X2] = rt[player_num];
pjs->joy[PJAI_Y2] = lt[player_num];
}
#endif
} }
void SetImage(void* img) void SetImage(void* img)
{ {
@ -134,12 +137,16 @@ void mcfg_Create(MapleDeviceType type, u32 bus, u32 port, s32 player_num = -1)
void mcfg_CreateNAOMIJamma() void mcfg_CreateNAOMIJamma()
{ {
printf("mcfg_CreateNAOMIJamma\n");
mcfg_DestroyDevices();
mcfg_Create(MDT_NaomiJamma, 0, 5); mcfg_Create(MDT_NaomiJamma, 0, 5);
// mcfg_Create(MDT_Keyboard, 2, 5); // mcfg_Create(MDT_Keyboard, 2, 5);
} }
void mcfg_CreateAtomisWaveControllers() void mcfg_CreateAtomisWaveControllers()
{ {
printf("mcfg_CreateAtomisWaveControllers\n");
mcfg_DestroyDevices();
// Looks like two controllers needs to be on bus 0 and 1 for digital inputs // Looks like two controllers needs to be on bus 0 and 1 for digital inputs
// Then other devices on port 2 and 3 for analog axes, light guns, ... // Then other devices on port 2 and 3 for analog axes, light guns, ...
mcfg_Create(MDT_SegaController, 0, 5); mcfg_Create(MDT_SegaController, 0, 5);
@ -174,6 +181,7 @@ void mcfg_CreateAtomisWaveControllers()
void mcfg_CreateDevices() void mcfg_CreateDevices()
{ {
printf("mcfg_CreateDevices\n");
for (int bus = 0; bus < MAPLE_PORTS; ++bus) for (int bus = 0; bus < MAPLE_PORTS; ++bus)
{ {
switch ((MapleDeviceType)settings.input.maple_devices[bus]) switch ((MapleDeviceType)settings.input.maple_devices[bus])
@ -205,6 +213,7 @@ void mcfg_CreateDevices()
void mcfg_DestroyDevices() void mcfg_DestroyDevices()
{ {
printf("mcfg_DestroyDevices\n");
for (int i = 0; i < MAPLE_PORTS; i++) for (int i = 0; i < MAPLE_PORTS; i++)
for (int j=0;j<=5;j++) for (int j=0;j<=5;j++)
{ {

View File

@ -58,12 +58,9 @@ struct IMapleConfigMap
virtual ~IMapleConfigMap() {} virtual ~IMapleConfigMap() {}
}; };
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
void mcfg_CreateDevices(); void mcfg_CreateDevices();
#else
void mcfg_CreateNAOMIJamma(); void mcfg_CreateNAOMIJamma();
void mcfg_CreateAtomisWaveControllers(); void mcfg_CreateAtomisWaveControllers();
#endif
void mcfg_DestroyDevices(); void mcfg_DestroyDevices();
void mcfg_SerializeDevices(void **data, unsigned int *total_size); void mcfg_SerializeDevices(void **data, unsigned int *total_size);

View File

@ -2619,11 +2619,10 @@ maple_device* maple_Create(MapleDeviceType type)
switch(type) switch(type)
{ {
case MDT_SegaController: case MDT_SegaController:
#if DC_PLATFORM != DC_PLATFORM_ATOMISWAVE if (settings.platform.system != DC_PLATFORM_ATOMISWAVE)
rv = new maple_sega_controller(); rv = new maple_sega_controller();
#else else
rv = new maple_atomiswave_controller(); rv = new maple_atomiswave_controller();
#endif
break; break;
case MDT_Microphone: case MDT_Microphone:
@ -2647,11 +2646,10 @@ maple_device* maple_Create(MapleDeviceType type)
break; break;
case MDT_LightGun: case MDT_LightGun:
#if DC_PLATFORM != DC_PLATFORM_ATOMISWAVE if (settings.platform.system != DC_PLATFORM_ATOMISWAVE)
rv = new maple_lightgun(); rv = new maple_lightgun();
#else else
rv = new atomiswave_lightgun(); rv = new atomiswave_lightgun();
#endif
break; break;
case MDT_NaomiJamma: case MDT_NaomiJamma:

View File

@ -71,9 +71,8 @@ void maple_vblank()
maple_ddt_pending_reset=false; maple_ddt_pending_reset=false;
} }
} }
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST if (settings.platform.system == DC_PLATFORM_DREAMCAST)
maple_handle_reconnect(); maple_handle_reconnect();
#endif
} }
void maple_SB_MSHTCL_Write(u32 addr, u32 data) void maple_SB_MSHTCL_Write(u32 addr, u32 data)
{ {
@ -277,7 +276,6 @@ void maple_Term()
} }
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
static u64 reconnect_time; static u64 reconnect_time;
void maple_ReconnectDevices() void maple_ReconnectDevices()
@ -294,4 +292,3 @@ static void maple_handle_reconnect()
mcfg_CreateDevices(); mcfg_CreateDevices();
} }
} }
#endif

View File

@ -441,6 +441,7 @@ void _vmem_term() {}
u8* virt_ram_base; u8* virt_ram_base;
bool vmem_4gb_space; bool vmem_4gb_space;
static VMemType vmemstatus;
void* malloc_pages(size_t size) { void* malloc_pages(size_t size) {
#if HOST_OS == OS_WINDOWS #if HOST_OS == OS_WINDOWS
@ -512,14 +513,49 @@ bool _vmem_reserve() {
// TODO: Static assert? // TODO: Static assert?
verify((sizeof(Sh4RCB)%PAGE_SIZE)==0); verify((sizeof(Sh4RCB)%PAGE_SIZE)==0);
VMemType vmemstatus = MemTypeError; vmemstatus = MemTypeError;
// Use vmem only if settings mandate so, and if we have proper exception handlers. // Use vmem only if settings mandate so, and if we have proper exception handlers.
#ifndef TARGET_NO_EXCEPTIONS #ifndef TARGET_NO_EXCEPTIONS
if (!settings.dynarec.disable_nvmem) if (!settings.dynarec.disable_nvmem)
vmemstatus = vmem_platform_init((void**)&virt_ram_base, (void**)&p_sh4rcb); vmemstatus = vmem_platform_init((void**)&virt_ram_base, (void**)&p_sh4rcb);
#endif #endif
return true;
}
void _vmem_term_mappings()
{
if (vmemstatus == MemTypeError) {
if (p_sh4rcb != NULL)
{
free(p_sh4rcb);
p_sh4rcb = NULL;
}
if (mem_b.data != NULL)
{
free(mem_b.data);
mem_b.data = NULL;
}
if (vram.data != NULL)
{
free(vram.data);
vram.data = NULL;
}
if (aica_ram.data != NULL)
{
free(aica_ram.data);
aica_ram.data = NULL;
}
}
else
{
//vmem_platform_destroy(); // FIXME Needed for Windows
}
}
void _vmem_init_mappings()
{
_vmem_term_mappings();
// Fallback to statically allocated buffers, this results in slow-ops being generated. // Fallback to statically allocated buffers, this results in slow-ops being generated.
if (vmemstatus == MemTypeError) { if (vmemstatus == MemTypeError) {
WARN_LOG(VMEM, "Warning! nvmem is DISABLED (due to failure or not being built-in"); WARN_LOG(VMEM, "Warning! nvmem is DISABLED (due to failure or not being built-in");
@ -627,8 +663,6 @@ bool _vmem_reserve() {
aica_ram.Zero(); aica_ram.Zero();
vram.Zero(); vram.Zero();
mem_b.Zero(); mem_b.Zero();
return true;
} }
#define freedefptr(x) \ #define freedefptr(x) \

View File

@ -55,6 +55,7 @@ typedef u32 _vmem_handler;
void _vmem_init(); void _vmem_init();
void _vmem_reset(); void _vmem_reset();
void _vmem_term(); void _vmem_term();
void _vmem_init_mappings();
//functions to register and map handlers/memory //functions to register and map handlers/memory
_vmem_handler _vmem_register_handler(_vmem_ReadMem8FP* read8,_vmem_ReadMem16FP* read16,_vmem_ReadMem32FP* read32, _vmem_WriteMem8FP* write8,_vmem_WriteMem16FP* write16,_vmem_WriteMem32FP* write32); _vmem_handler _vmem_register_handler(_vmem_ReadMem8FP* read8,_vmem_ReadMem16FP* read16,_vmem_ReadMem32FP* read32, _vmem_WriteMem8FP* write8,_vmem_WriteMem16FP* write16,_vmem_WriteMem32FP* write32);

View File

@ -66,7 +66,7 @@ struct vram_lock {
u32 start; u32 start;
u32 end; u32 end;
}; };
static std::vector<vram_lock> vram_blocks[VRAM_SIZE / VRAM_PROT_SEGMENT]; static std::vector<vram_lock> vram_blocks[VRAM_SIZE_MAX / VRAM_PROT_SEGMENT];
static u8 sram_mapped_pages[USER_SPACE / PAGE_SIZE / 8]; // bit set to 1 if page is mapped static u8 sram_mapped_pages[USER_SPACE / PAGE_SIZE / 8]; // bit set to 1 if page is mapped
bool vmem32_inited; bool vmem32_inited;

View File

@ -534,10 +534,6 @@ void naomi_reg_Init()
} }
#endif #endif
NaomiInit(); NaomiInit();
sb_rio_register(SB_GDST_addr, RIO_WF, 0, &Naomi_DmaStart);
sb_rio_register(SB_GDEN_addr, RIO_WF, 0, &Naomi_DmaEnable);
} }
void naomi_reg_Term() void naomi_reg_Term()
@ -555,6 +551,9 @@ void naomi_reg_Term()
} }
void naomi_reg_Reset(bool Manual) void naomi_reg_Reset(bool Manual)
{ {
sb_rio_register(SB_GDST_addr, RIO_WF, 0, &Naomi_DmaStart);
sb_rio_register(SB_GDEN_addr, RIO_WF, 0, &Naomi_DmaEnable);
NaomiDataRead = false; NaomiDataRead = false;
aw_ram_test_skipped = false; aw_ram_test_skipped = false;
GSerialBuffer = 0; GSerialBuffer = 0;

View File

@ -55,7 +55,7 @@ char naomi_game_id[33];
InputDescriptors *NaomiGameInputs; InputDescriptors *NaomiGameInputs;
u8 *naomi_default_eeprom; u8 *naomi_default_eeprom;
extern RomChip sys_rom; extern MemChip *sys_rom;
static bool naomi_LoadBios(const char *filename, Archive *child_archive, Archive *parent_archive, int region) static bool naomi_LoadBios(const char *filename, Archive *child_archive, Archive *parent_archive, int region)
{ {
@ -94,7 +94,7 @@ static bool naomi_LoadBios(const char *filename, Archive *child_archive, Archive
{ {
verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE); verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE);
verify(bios->blobs[romid].src_offset + bios->blobs[romid].length <= BIOS_SIZE); verify(bios->blobs[romid].src_offset + bios->blobs[romid].length <= BIOS_SIZE);
memcpy(sys_rom.data + bios->blobs[romid].offset, sys_rom.data + bios->blobs[romid].src_offset, bios->blobs[romid].length); memcpy(sys_rom->data + bios->blobs[romid].offset, sys_rom->data + bios->blobs[romid].src_offset, bios->blobs[romid].length);
DEBUG_LOG(NAOMI, "Copied: %x bytes from %07x to %07x", bios->blobs[romid].length, bios->blobs[romid].src_offset, bios->blobs[romid].offset); DEBUG_LOG(NAOMI, "Copied: %x bytes from %07x to %07x", bios->blobs[romid].length, bios->blobs[romid].src_offset, bios->blobs[romid].offset);
} }
else else
@ -113,7 +113,7 @@ static bool naomi_LoadBios(const char *filename, Archive *child_archive, Archive
if (bios->blobs[romid].blob_type == Normal) if (bios->blobs[romid].blob_type == Normal)
{ {
verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE); verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE);
u32 read = file->Read(sys_rom.data + bios->blobs[romid].offset, bios->blobs[romid].length); u32 read = file->Read(sys_rom->data + bios->blobs[romid].offset, bios->blobs[romid].length);
DEBUG_LOG(NAOMI, "Mapped %s: %x bytes at %07x", bios->blobs[romid].filename, read, bios->blobs[romid].offset); DEBUG_LOG(NAOMI, "Mapped %s: %x bytes at %07x", bios->blobs[romid].filename, read, bios->blobs[romid].offset);
} }
else if (bios->blobs[romid].blob_type == InterleavedWord) else if (bios->blobs[romid].blob_type == InterleavedWord)
@ -127,7 +127,7 @@ static bool naomi_LoadBios(const char *filename, Archive *child_archive, Archive
} }
verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE); verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE);
u32 read = file->Read(buf, bios->blobs[romid].length); u32 read = file->Read(buf, bios->blobs[romid].length);
u16 *to = (u16 *)(sys_rom.data + bios->blobs[romid].offset); u16 *to = (u16 *)(sys_rom->data + bios->blobs[romid].offset);
u16 *from = (u16 *)buf; u16 *from = (u16 *)buf;
for (int i = bios->blobs[romid].length / 2; --i >= 0; to++) for (int i = bios->blobs[romid].length / 2; --i >= 0; to++)
*to++ = *from++; *to++ = *from++;
@ -143,10 +143,9 @@ static bool naomi_LoadBios(const char *filename, Archive *child_archive, Archive
if (bios_archive != NULL) if (bios_archive != NULL)
delete bios_archive; delete bios_archive;
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
// Reload the writeable portion of the FlashROM // Reload the writeable portion of the FlashROM
sys_rom.Reload(); sys_rom->Reload();
#endif
return found_region; return found_region;
@ -156,9 +155,9 @@ error:
return false; return false;
} }
static bool naomi_cart_LoadZip(char *filename) static Game *FindGame(const char *filename)
{ {
char *p = strrchr(filename, '/'); const char *p = strrchr(filename, '/');
#ifdef _WIN32 #ifdef _WIN32
p = strrchr(p == NULL ? filename : p, '\\'); p = strrchr(p == NULL ? filename : p, '\\');
#endif #endif
@ -178,25 +177,19 @@ static bool naomi_cart_LoadZip(char *filename)
if (!stricmp(Games[gameid].name, game_name)) if (!stricmp(Games[gameid].name, game_name))
break; break;
if (Games[gameid].name == NULL) if (Games[gameid].name == NULL)
return NULL;
return &Games[gameid];
}
static bool naomi_cart_LoadZip(char *filename)
{
Game *game = FindGame(filename);
if (game == NULL)
{ {
ERROR_LOG(NAOMI, "Unknown game %s", filename); ERROR_LOG(NAOMI, "Unknown game %s", filename);
return false; return false;
} }
struct Game *game = &Games[gameid];
#if DC_PLATFORM == DC_PLATFORM_NAOMI
if (game->cart_type == AW)
{
msgboxf("Atomiswave cartridges are not supported by NAOMI", 0);
return false;
}
#else
if (game->cart_type != AW)
{
msgboxf("NAOMI cartridges are not supported by Atomiswave", 0);
return false;
}
#endif
Archive *archive = OpenArchive(filename); Archive *archive = OpenArchive(filename);
if (archive != NULL) if (archive != NULL)
INFO_LOG(NAOMI, "Opened %s", filename); INFO_LOG(NAOMI, "Opened %s", filename);
@ -650,6 +643,17 @@ bool naomi_cart_SelectFile()
return true; return true;
} }
int naomi_cart_GetPlatform(const char *path)
{
Game *game = FindGame(path);
if (game == NULL)
return DC_PLATFORM_NAOMI;
else if (game->cart_type == AW)
return DC_PLATFORM_ATOMISWAVE;
else
return DC_PLATFORM_NAOMI;
}
Cartridge::Cartridge(u32 size) Cartridge::Cartridge(u32 size)
{ {
RomPtr = (u8 *)malloc(size); RomPtr = (u8 *)malloc(size);

View File

@ -95,6 +95,7 @@ public:
bool naomi_cart_SelectFile(); bool naomi_cart_SelectFile();
void naomi_cart_Close(); void naomi_cart_Close();
int naomi_cart_GetPlatform(const char *path);
extern char naomi_game_id[]; extern char naomi_game_id[];
extern u8 *naomi_default_eeprom; extern u8 *naomi_default_eeprom;

View File

@ -412,15 +412,18 @@ void bm_Reset()
// Windows cannot lock/unlock a region spanning more than one VirtualAlloc or MapViewOfFile // Windows cannot lock/unlock a region spanning more than one VirtualAlloc or MapViewOfFile
// so we have to unlock each region individually // so we have to unlock each region individually
// No need for this mess in 4GB mode since windows doesn't use it // No need for this mess in 4GB mode since windows doesn't use it
#if RAM_SIZE == 16 * 1024 * 1024 if (settings.platform.ram_size == 16 * 1024 * 1024)
mem_region_unlock(virt_ram_base + 0x0C000000, RAM_SIZE); {
mem_region_unlock(virt_ram_base + 0x0D000000, RAM_SIZE); mem_region_unlock(virt_ram_base + 0x0C000000, RAM_SIZE);
mem_region_unlock(virt_ram_base + 0x0E000000, RAM_SIZE); mem_region_unlock(virt_ram_base + 0x0D000000, RAM_SIZE);
mem_region_unlock(virt_ram_base + 0x0F000000, RAM_SIZE); mem_region_unlock(virt_ram_base + 0x0E000000, RAM_SIZE);
#else mem_region_unlock(virt_ram_base + 0x0F000000, RAM_SIZE);
mem_region_unlock(virt_ram_base + 0x0C000000, RAM_SIZE); }
mem_region_unlock(virt_ram_base + 0x0E000000, RAM_SIZE); else
#endif {
mem_region_unlock(virt_ram_base + 0x0C000000, RAM_SIZE);
mem_region_unlock(virt_ram_base + 0x0E000000, RAM_SIZE);
}
if (_nvmem_4gb_space()) if (_nvmem_4gb_space())
{ {
mem_region_unlock(virt_ram_base + 0x8C000000, 0x90000000 - 0x8C000000); mem_region_unlock(virt_ram_base + 0x8C000000, 0x90000000 - 0x8C000000);

View File

@ -11,11 +11,10 @@ BSC_PDTRA_type BSC_PDTRA;
void write_BSC_PCTRA(u32 addr, u32 data) void write_BSC_PCTRA(u32 addr, u32 data)
{ {
BSC_PCTRA.full=(u16)data; BSC_PCTRA.full=(u16)data;
#if DC_PLATFORM == DC_PLATFORM_NAOMI if (settings.platform.system == DC_PLATFORM_NAOMI)
NaomiBoardIDWriteControl((u16)data); NaomiBoardIDWriteControl((u16)data);
#else //else
//printf("C:BSC_PCTRA = %08X\n",data); //printf("C:BSC_PCTRA = %08X\n",data);
#endif
} }
//u32 port_out_data; //u32 port_out_data;
void write_BSC_PDTRA(u32 addr, u32 data) void write_BSC_PDTRA(u32 addr, u32 data)
@ -23,19 +22,18 @@ void write_BSC_PDTRA(u32 addr, u32 data)
BSC_PDTRA.full=(u16)data; BSC_PDTRA.full=(u16)data;
//printf("D:BSC_PDTRA = %08X\n",data); //printf("D:BSC_PDTRA = %08X\n",data);
#if DC_PLATFORM == DC_PLATFORM_NAOMI if (settings.platform.system == DC_PLATFORM_NAOMI)
NaomiBoardIDWrite((u16)data); NaomiBoardIDWrite((u16)data);
#endif
} }
u32 read_BSC_PDTRA(u32 addr) u32 read_BSC_PDTRA(u32 addr)
{ {
#if DC_PLATFORM == DC_PLATFORM_NAOMI if (settings.platform.system == DC_PLATFORM_NAOMI)
{
return NaomiBoardIDRead(); return NaomiBoardIDRead();
}
#else else
{
/* as seen on chankast */ /* as seen on chankast */
u32 tpctra = BSC_PCTRA.full; u32 tpctra = BSC_PCTRA.full;
u32 tpdtra = BSC_PDTRA.full; u32 tpdtra = BSC_PDTRA.full;
@ -57,8 +55,7 @@ u32 read_BSC_PDTRA(u32 addr)
tfinal |= settings.dreamcast.cable <<8; tfinal |= settings.dreamcast.cable <<8;
return tfinal; return tfinal;
}
#endif
} }
//Init term res //Init term res
@ -113,14 +110,10 @@ void bsc_init()
sh4_rio_reg(BSC,BSC_GPIOIC_addr,RIO_DATA,16); sh4_rio_reg(BSC,BSC_GPIOIC_addr,RIO_DATA,16);
//note: naomi//aw might depend on rfcr //note: naomi//aw might depend on rfcr
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
sh4_rio_reg(BSC, BSC_RFCR_addr, RIO_RO, 16); sh4_rio_reg(BSC, BSC_RFCR_addr, RIO_RO, 16);
BSC_RFCR.full = 17; BSC_RFCR.full = 17;
#endif
} }
void bsc_reset() void bsc_reset()
{ {
/* /*
@ -160,10 +153,10 @@ void bsc_reset()
BSC_PCTRB.full=0x0; BSC_PCTRB.full=0x0;
//BSC_PDTRB.full; undef //BSC_PDTRB.full; undef
BSC_GPIOIC.full=0x0; BSC_GPIOIC.full=0x0;
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
BSC_RFCR.full = 17; BSC_RFCR.full = 17;
#endif
} }
void bsc_term() void bsc_term()
{ {
} }

View File

@ -70,10 +70,8 @@ void libGDR_Reset(bool Manual)
//called when entering sh4 thread , from the new thread context (for any thread specific init) //called when entering sh4 thread , from the new thread context (for any thread specific init)
s32 libGDR_Init() s32 libGDR_Init()
{ {
if (!InitDrive())
return rv_serror;
libCore_gdrom_disc_change(); libCore_gdrom_disc_change();
settings.imgread.PatchRegion=true; settings.imgread.PatchRegion = true;
return rv_ok; return rv_ok;
} }

View File

@ -11,7 +11,6 @@
#include <sys/param.h> #include <sys/param.h>
#include <sys/time.h> #include <sys/time.h>
#include "hw/sh4/dyna/blockmanager.h" #include "hw/sh4/dyna/blockmanager.h"
#include "hw/maple/maple_cfg.h"
#include "log/LogManager.h" #include "log/LogManager.h"
#include <unistd.h> #include <unistd.h>
@ -107,10 +106,6 @@ void os_SetupInput()
#if defined(USE_SDL) #if defined(USE_SDL)
input_sdl_init(); input_sdl_init();
#endif #endif
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
mcfg_CreateDevices();
#endif
} }
void UpdateInputState(u32 port) void UpdateInputState(u32 port)

View File

@ -132,175 +132,178 @@ void plugins_Reset(bool Manual)
void LoadSpecialSettings() void LoadSpecialSettings()
{ {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST if (settings.platform.system == DC_PLATFORM_DREAMCAST)
INFO_LOG(BOOT, "Game ID is [%s]", reios_product_number); {
rtt_to_buffer_game = false; INFO_LOG(BOOT, "Game ID is [%s]", reios_product_number);
safemode_game = false; rtt_to_buffer_game = false;
tr_poly_depth_mask_game = false; safemode_game = false;
extra_depth_game = false; tr_poly_depth_mask_game = false;
full_mmu_game = false; extra_depth_game = false;
disable_vmem32_game = false; full_mmu_game = false;
disable_vmem32_game = false;
if (reios_windows_ce || !strncmp("T26702N", reios_product_number, 7)) // PBA Tour Bowling 2001 if (reios_windows_ce || !strncmp("T26702N", reios_product_number, 7)) // PBA Tour Bowling 2001
{ {
INFO_LOG(BOOT, "Enabling Full MMU and Extra depth scaling for Windows CE game"); INFO_LOG(BOOT, "Enabling Full MMU and Extra depth scaling for Windows CE game");
settings.rend.ExtraDepthScale = 0.1; settings.rend.ExtraDepthScale = 0.1;
extra_depth_game = true; extra_depth_game = true;
settings.dreamcast.FullMMU = true; settings.dreamcast.FullMMU = true;
full_mmu_game = true; full_mmu_game = true;
settings.aica.NoBatch = true; settings.aica.NoBatch = true;
} }
// Tony Hawk's Pro Skater 2 // Tony Hawk's Pro Skater 2
if (!strncmp("T13008D", reios_product_number, 7) || !strncmp("T13006N", reios_product_number, 7) if (!strncmp("T13008D", reios_product_number, 7) || !strncmp("T13006N", reios_product_number, 7)
// Tony Hawk's Pro Skater 1 // Tony Hawk's Pro Skater 1
|| !strncmp("T40205N", reios_product_number, 7) || !strncmp("T40205N", reios_product_number, 7)
// Tony Hawk's Skateboarding // Tony Hawk's Skateboarding
|| !strncmp("T40204D", reios_product_number, 7) || !strncmp("T40204D", reios_product_number, 7)
// Skies of Arcadia // Skies of Arcadia
|| !strncmp("MK-51052", reios_product_number, 8) || !strncmp("MK-51052", reios_product_number, 8)
// Eternal Arcadia (JP) // Eternal Arcadia (JP)
|| !strncmp("HDR-0076", reios_product_number, 8) || !strncmp("HDR-0076", reios_product_number, 8)
// Flag to Flag (US) // Flag to Flag (US)
|| !strncmp("MK-51007", reios_product_number, 8) || !strncmp("MK-51007", reios_product_number, 8)
// Super Speed Racing (JP) // Super Speed Racing (JP)
|| !strncmp("HDR-0013", reios_product_number, 8) || !strncmp("HDR-0013", reios_product_number, 8)
// Yu Suzuki Game Works Vol. 1 // Yu Suzuki Game Works Vol. 1
|| !strncmp("6108099", reios_product_number, 7) || !strncmp("6108099", reios_product_number, 7)
// L.O.L // L.O.L
|| !strncmp("T2106M", reios_product_number, 6) || !strncmp("T2106M", reios_product_number, 6)
// Miss Moonlight // Miss Moonlight
|| !strncmp("T18702M", reios_product_number, 7) || !strncmp("T18702M", reios_product_number, 7)
// Tom Clancy's Rainbow Six (US) // Tom Clancy's Rainbow Six (US)
|| !strncmp("T40401N", reios_product_number, 7) || !strncmp("T40401N", reios_product_number, 7)
// Tom Clancy's Rainbow Six incl. Eagle Watch Missions (EU) // Tom Clancy's Rainbow Six incl. Eagle Watch Missions (EU)
|| !strncmp("T-45001D05", reios_product_number, 10)) || !strncmp("T-45001D05", reios_product_number, 10))
{ {
settings.rend.RenderToTextureBuffer = 1; settings.rend.RenderToTextureBuffer = 1;
rtt_to_buffer_game = true; rtt_to_buffer_game = true;
}
if (!strncmp("HDR-0176", reios_product_number, 8) || !strncmp("RDC-0057", reios_product_number, 8))
{
// Cosmic Smash
settings.rend.TranslucentPolygonDepthMask = 1;
tr_poly_depth_mask_game = true;
}
// Demolition Racer
if (!strncmp("T15112N", reios_product_number, 7)
// Ducati World - Racing Challenge (NTSC)
|| !strncmp("T-8113N", reios_product_number, 7)
// Ducati World (PAL)
|| !strncmp("T-8121D-50", reios_product_number, 10))
{
INFO_LOG(BOOT, "Enabling Dynarec safe mode for game %s", reios_product_number);
settings.dynarec.safemode = 1;
safemode_game = true;
}
// NHL 2K2
if (!strncmp("MK-51182", reios_product_number, 8))
{
INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", reios_product_number);
settings.rend.ExtraDepthScale = 10000;
extra_depth_game = true;
}
// Re-Volt (US, EU)
else if (!strncmp("T-8109N", reios_product_number, 7) || !strncmp("T8107D 50", reios_product_number, 10))
{
INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", reios_product_number);
settings.rend.ExtraDepthScale = 100;
extra_depth_game = true;
}
// Super Producers
if (!strncmp("T14303M", reios_product_number, 7)
// Giant Killers
|| !strncmp("T45401D 50", reios_product_number, 10)
// Wild Metal (US)
|| !strncmp("T42101N 00", reios_product_number, 10)
// Wild Metal (EU)
|| !strncmp("T40501D-50", reios_product_number, 10)
// Resident Evil 2 (US)
|| !strncmp("T1205N", reios_product_number, 6)
// Resident Evil 2 (EU)
|| !strncmp("T7004D 50", reios_product_number, 10)
// Rune Jade
|| !strncmp("T14304M", reios_product_number, 7)
// Marionette Company
|| !strncmp("T5202M", reios_product_number, 6)
// Marionette Company 2
|| !strncmp("T5203M", reios_product_number, 6)
// Maximum Pool (for online support)
|| !strncmp("T11010N", reios_product_number, 7)
// StarLancer (US) (for online support)
|| !strncmp("T40209N", reios_product_number, 7)
// StarLancer (EU) (for online support)
|| !strncmp("T17723D 05", reios_product_number, 10)
)
{
INFO_LOG(BOOT, "Disabling 32-bit virtual memory for game %s", reios_product_number);
settings.dynarec.disable_vmem32 = true;
disable_vmem32_game = true;
}
} }
if (!strncmp("HDR-0176", reios_product_number, 8) || !strncmp("RDC-0057", reios_product_number, 8)) else if (settings.platform.system == DC_PLATFORM_NAOMI || settings.platform.system == DC_PLATFORM_ATOMISWAVE)
{ {
// Cosmic Smash INFO_LOG(BOOT, "Game ID is [%s]", naomi_game_id);
settings.rend.TranslucentPolygonDepthMask = 1;
tr_poly_depth_mask_game = true;
}
// Demolition Racer
if (!strncmp("T15112N", reios_product_number, 7)
// Ducati World - Racing Challenge (NTSC)
|| !strncmp("T-8113N", reios_product_number, 7)
// Ducati World (PAL)
|| !strncmp("T-8121D-50", reios_product_number, 10))
{
INFO_LOG(BOOT, "Enabling Dynarec safe mode for game %s", reios_product_number);
settings.dynarec.safemode = 1;
safemode_game = true;
}
// NHL 2K2
if (!strncmp("MK-51182", reios_product_number, 8))
{
INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", reios_product_number);
settings.rend.ExtraDepthScale = 10000;
extra_depth_game = true;
}
// Re-Volt (US, EU)
else if (!strncmp("T-8109N", reios_product_number, 7) || !strncmp("T8107D 50", reios_product_number, 10))
{
INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", reios_product_number);
settings.rend.ExtraDepthScale = 100;
extra_depth_game = true;
}
// Super Producers
if (!strncmp("T14303M", reios_product_number, 7)
// Giant Killers
|| !strncmp("T45401D 50", reios_product_number, 10)
// Wild Metal (US)
|| !strncmp("T42101N 00", reios_product_number, 10)
// Wild Metal (EU)
|| !strncmp("T40501D-50", reios_product_number, 10)
// Resident Evil 2 (US)
|| !strncmp("T1205N", reios_product_number, 6)
// Resident Evil 2 (EU)
|| !strncmp("T7004D 50", reios_product_number, 10)
// Rune Jade
|| !strncmp("T14304M", reios_product_number, 7)
// Marionette Company
|| !strncmp("T5202M", reios_product_number, 6)
// Marionette Company 2
|| !strncmp("T5203M", reios_product_number, 6)
// Maximum Pool (for online support)
|| !strncmp("T11010N", reios_product_number, 7)
// StarLancer (US) (for online support)
|| !strncmp("T40209N", reios_product_number, 7)
// StarLancer (EU) (for online support)
|| !strncmp("T17723D 05", reios_product_number, 10)
)
{
INFO_LOG(BOOT, "Disabling 32-bit virtual memory for game %s", reios_product_number);
settings.dynarec.disable_vmem32 = true;
disable_vmem32_game = true;
}
#elif DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
INFO_LOG(BOOT, "Game ID is [%s]", naomi_game_id);
if (!strcmp("METAL SLUG 6", naomi_game_id) || !strcmp("WAVE RUNNER GP", naomi_game_id)) if (!strcmp("METAL SLUG 6", naomi_game_id) || !strcmp("WAVE RUNNER GP", naomi_game_id))
{ {
INFO_LOG(BOOT, "Enabling Dynarec safe mode for game %s", naomi_game_id); INFO_LOG(BOOT, "Enabling Dynarec safe mode for game %s", naomi_game_id);
settings.dynarec.safemode = 1; settings.dynarec.safemode = 1;
safemode_game = true; safemode_game = true;
}
if (!strcmp("SAMURAI SPIRITS 6", naomi_game_id))
{
INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", naomi_game_id);
settings.rend.ExtraDepthScale = 1e26;
extra_depth_game = true;
}
if (!strcmp("DYNAMIC GOLF", naomi_game_id)
|| !strcmp("SHOOTOUT POOL", naomi_game_id)
|| !strcmp("OUTTRIGGER JAPAN", naomi_game_id)
|| !strcmp("CRACKIN'DJ ver JAPAN", naomi_game_id)
|| !strcmp("CRACKIN'DJ PART2 ver JAPAN", naomi_game_id)
|| !strcmp("KICK '4' CASH", naomi_game_id))
{
INFO_LOG(BOOT, "Enabling JVS rotary encoders for game %s", naomi_game_id);
settings.input.JammaSetup = 2;
}
else if (!strcmp("POWER STONE 2 JAPAN", naomi_game_id) // Naomi
|| !strcmp("GUILTY GEAR isuka", naomi_game_id)) // AW
{
INFO_LOG(BOOT, "Enabling 4-player setup for game %s", naomi_game_id);
settings.input.JammaSetup = 1;
}
else if (!strcmp("SEGA MARINE FISHING JAPAN", naomi_game_id)
|| !strcmp(naomi_game_id, "BASS FISHING SIMULATOR VER.A")) // AW
{
INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", naomi_game_id);
settings.input.JammaSetup = 3;
}
else if (!strcmp("RINGOUT 4X4 JAPAN", naomi_game_id))
{
INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", naomi_game_id);
settings.input.JammaSetup = 4;
}
else if (!strcmp("NINJA ASSAULT", naomi_game_id)
|| !strcmp(naomi_game_id, "Sports Shooting USA") // AW
|| !strcmp(naomi_game_id, "SEGA CLAY CHALLENGE")) // AW
{
INFO_LOG(BOOT, "Enabling lightgun setup for game %s", naomi_game_id);
settings.input.JammaSetup = 5;
}
else if (!strcmp(" BIOHAZARD GUN SURVIVOR2", naomi_game_id))
{
INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", naomi_game_id);
settings.input.JammaSetup = 7;
}
if (!strcmp("COSMIC SMASH IN JAPAN", naomi_game_id))
{
INFO_LOG(BOOT, "Enabling translucent depth multipass for game %s", naomi_game_id);
settings.rend.TranslucentPolygonDepthMask = true;
tr_poly_depth_mask_game = true;
}
} }
if (!strcmp("SAMURAI SPIRITS 6", naomi_game_id))
{
INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", naomi_game_id);
settings.rend.ExtraDepthScale = 1e26;
extra_depth_game = true;
}
if (!strcmp("DYNAMIC GOLF", naomi_game_id)
|| !strcmp("SHOOTOUT POOL", naomi_game_id)
|| !strcmp("OUTTRIGGER JAPAN", naomi_game_id)
|| !strcmp("CRACKIN'DJ ver JAPAN", naomi_game_id)
|| !strcmp("CRACKIN'DJ PART2 ver JAPAN", naomi_game_id)
|| !strcmp("KICK '4' CASH", naomi_game_id))
{
INFO_LOG(BOOT, "Enabling JVS rotary encoders for game %s", naomi_game_id);
settings.input.JammaSetup = 2;
}
else if (!strcmp("POWER STONE 2 JAPAN", naomi_game_id) // Naomi
|| !strcmp("GUILTY GEAR isuka", naomi_game_id)) // AW
{
INFO_LOG(BOOT, "Enabling 4-player setup for game %s", naomi_game_id);
settings.input.JammaSetup = 1;
}
else if (!strcmp("SEGA MARINE FISHING JAPAN", naomi_game_id)
|| !strcmp(naomi_game_id, "BASS FISHING SIMULATOR VER.A")) // AW
{
INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", naomi_game_id);
settings.input.JammaSetup = 3;
}
else if (!strcmp("RINGOUT 4X4 JAPAN", naomi_game_id))
{
INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", naomi_game_id);
settings.input.JammaSetup = 4;
}
else if (!strcmp("NINJA ASSAULT", naomi_game_id)
|| !strcmp(naomi_game_id, "Sports Shooting USA") // AW
|| !strcmp(naomi_game_id, "SEGA CLAY CHALLENGE")) // AW
{
INFO_LOG(BOOT, "Enabling lightgun setup for game %s", naomi_game_id);
settings.input.JammaSetup = 5;
}
else if (!strcmp(" BIOHAZARD GUN SURVIVOR2", naomi_game_id))
{
INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", naomi_game_id);
settings.input.JammaSetup = 7;
}
if (!strcmp("COSMIC SMASH IN JAPAN", naomi_game_id))
{
INFO_LOG(BOOT, "Enabling translucent depth multipass for game %s", naomi_game_id);
settings.rend.TranslucentPolygonDepthMask = true;
tr_poly_depth_mask_game = true;
}
#endif
} }
void dc_reset(bool manual) void dc_reset(bool manual)
@ -358,12 +361,58 @@ int reicast_init(int argc, char* argv[])
#define DATA_PATH "/" #define DATA_PATH "/"
#endif #endif
void set_platform(int platform)
{
switch (platform)
{
case DC_PLATFORM_DREAMCAST:
printf("Starting Dreamcast game\n");
settings.platform.ram_size = 16 * 1024 * 1024;
settings.platform.vram_size = 8 * 1024 * 1024;
settings.platform.aram_size = 2 * 1024 * 1024;
settings.platform.bios_size = 2 * 1024 * 1024;
settings.platform.flash_size = 128 * 1024;
settings.platform.bbsram_size = 0;
break;
case DC_PLATFORM_NAOMI:
printf("Starting Naomi game\n");
settings.platform.ram_size = 32 * 1024 * 1024;
settings.platform.vram_size = 16 * 1024 * 1024;
settings.platform.aram_size = 8 * 1024 * 1024;
settings.platform.bios_size = 2 * 1024 * 1024;
settings.platform.flash_size = 0;
settings.platform.bbsram_size = 32 * 1024;
break;
case DC_PLATFORM_ATOMISWAVE:
printf("Starting Atomiswave game\n");
settings.platform.ram_size = 16 * 1024 * 1024;
settings.platform.vram_size = 8 * 1024 * 1024;
settings.platform.aram_size = 8 * 1024 * 1024;
settings.platform.bios_size = 128 * 1024;
settings.platform.flash_size = 0;
settings.platform.bbsram_size = 128 * 1024;
break;
default:
die("Unsupported platform");
break;
}
settings.platform.system = platform;
settings.platform.ram_mask = settings.platform.ram_size - 1;
settings.platform.vram_mask = settings.platform.vram_size - 1;
settings.platform.aram_mask = settings.platform.aram_size - 1;
_vmem_init_mappings();
}
static int dc_init() static int dc_init()
{ {
static bool init_done; static bool init_done;
if (init_done) if (init_done)
return 0; return 0;
// Default platform
set_platform(DC_PLATFORM_DREAMCAST);
if (plugins_Init()) if (plugins_Init())
return -3; return -3;
#if FEAT_SHREC != DYNAREC_NONE #if FEAT_SHREC != DYNAREC_NONE
@ -382,7 +431,6 @@ static int dc_init()
} }
mem_Init(); mem_Init();
mem_map_default(); // TODO needs to be called again if changing platform
init_done = true; init_done = true;
@ -391,6 +439,23 @@ static int dc_init()
bool game_started; bool game_started;
static int get_game_platform(const char *path)
{
if (path == NULL)
// Dreamcast BIOS
return DC_PLATFORM_DREAMCAST;
const char *dot = strrchr(path, '.');
if (dot == NULL)
return DC_PLATFORM_DREAMCAST; // unknown
if (!stricmp(dot, ".zip") || !stricmp(dot, ".7z"))
return naomi_cart_GetPlatform(path);
if (!stricmp(dot, ".bin") || !stricmp(dot, ".dat"))
return DC_PLATFORM_NAOMI;
return DC_PLATFORM_DREAMCAST;
}
int dc_start_game(const char *path) int dc_start_game(const char *path)
{ {
if (path != NULL) if (path != NULL)
@ -400,57 +465,64 @@ int dc_start_game(const char *path)
if (rc != 0) if (rc != 0)
return rc; return rc;
set_platform(get_game_platform(path));
mem_map_default();
InitSettings(); InitSettings();
dc_reset(true); dc_reset(true);
LoadSettings(false); LoadSettings(false);
if (!LoadRomFiles(get_readonly_data_path(DATA_PATH))) if (!LoadRomFiles(get_readonly_data_path(DATA_PATH)))
{ {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST if (settings.platform.system == DC_PLATFORM_DREAMCAST)
#ifdef USE_REIOS
if (settings.bios.UseReios)
{ {
if (!LoadHle(get_readonly_data_path(DATA_PATH))) #ifdef USE_REIOS
if (settings.bios.UseReios)
{ {
ERROR_LOG(BOOT, "Cannot init HLE BIOS"); if (!LoadHle(get_readonly_data_path(DATA_PATH)))
return -5; {
ERROR_LOG(BOOT, "Cannot init HLE BIOS");
return -5;
}
else
{
NOTICE_LOG(BOOT, "Did not load bios, using reios");
}
} }
else else
#endif
{ {
NOTICE_LOG(BOOT, "Did not load bios, using reios"); ERROR_LOG(BOOT, "Cannot find BIOS files");
return -5;
} }
} }
else }
#endif
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
{
mcfg_CreateDevices();
if (path == NULL)
{ {
ERROR_LOG(BOOT, "Cannot find BIOS files"); // Boot BIOS
return -5; TermDrive();
InitDrive();
}
else
{
if (DiscSwap())
LoadCustom();
} }
#endif
} }
else if (settings.platform.system == DC_PLATFORM_NAOMI || settings.platform.system == DC_PLATFORM_ATOMISWAVE)
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
if (path == NULL)
{ {
// Boot BIOS if (!naomi_cart_SelectFile())
TermDrive(); return -6;
InitDrive(); LoadCustom();
if (settings.platform.system == DC_PLATFORM_NAOMI)
mcfg_CreateNAOMIJamma();
else if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
mcfg_CreateAtomisWaveControllers();
} }
else
{
if (DiscSwap())
LoadCustom();
}
#elif DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
if (!naomi_cart_SelectFile())
return -6;
LoadCustom();
#if DC_PLATFORM == DC_PLATFORM_NAOMI
mcfg_CreateNAOMIJamma();
#elif DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
mcfg_CreateAtomisWaveControllers();
#endif
#endif
game_started = true; game_started = true;
dc_resume(); dc_resume();
@ -502,9 +574,8 @@ void* dc_run(void*)
void dc_term() void dc_term()
{ {
sh4_cpu.Term(); sh4_cpu.Term();
#if DC_PLATFORM != DC_PLATFORM_DREAMCAST if (settings.platform.system != DC_PLATFORM_DREAMCAST)
naomi_cart_Close(); naomi_cart_Close();
#endif
plugins_Term(); plugins_Term();
mem_Term(); mem_Term();
_vmem_release(); _vmem_release();
@ -736,18 +807,22 @@ void LoadSettings(bool game_specific)
void LoadCustom() void LoadCustom()
{ {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST char *reios_id;
char *reios_id = reios_disk_id(); if (settings.platform.system == DC_PLATFORM_DREAMCAST)
{
reios_id = reios_disk_id();
char *p = reios_id + strlen(reios_id) - 1; char *p = reios_id + strlen(reios_id) - 1;
while (p >= reios_id && *p == ' ') while (p >= reios_id && *p == ' ')
*p-- = '\0'; *p-- = '\0';
if (*p == '\0') if (*p == '\0')
return; return;
#elif DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE }
char *reios_id = naomi_game_id; else if (settings.platform.system == DC_PLATFORM_NAOMI || settings.platform.system == DC_PLATFORM_ATOMISWAVE)
char *reios_software_name = naomi_game_id; {
#endif reios_id = naomi_game_id;
char *reios_software_name = naomi_game_id;
}
// Default per-game settings // Default per-game settings
LoadSpecialSettings(); LoadSpecialSettings();

View File

@ -598,13 +598,13 @@ void reios_boot() {
reios_setup_state(0x8C010000); reios_setup_state(0x8C010000);
} }
else { else {
if (DC_PLATFORM == DC_PLATFORM_DREAMCAST) { if (settings.platform.system == DC_PLATFORM_DREAMCAST) {
if (!bootfile_inited) if (!bootfile_inited)
msgboxf("Failed to locate bootfile", MBX_ICONERROR); msgboxf("Failed to locate bootfile", MBX_ICONERROR);
reios_setup_state(0xac008300); reios_setup_state(0xac008300);
} }
else { else {
verify(DC_PLATFORM == DC_PLATFORM_NAOMI); verify(settings.platform.system == DC_PLATFORM_NAOMI);
if (CurrentCartridge == NULL) if (CurrentCartridge == NULL)
{ {
WARN_LOG(REIOS, "No cartridge loaded"); WARN_LOG(REIOS, "No cartridge loaded");

View File

@ -125,7 +125,7 @@ void palette_update()
using namespace std; using namespace std;
vector<vram_block*> VramLocks[VRAM_SIZE/PAGE_SIZE]; vector<vram_block*> VramLocks[VRAM_SIZE_MAX / PAGE_SIZE];
VLockedMemory vram; // vram 32-64b VLockedMemory vram; // vram 32-64b
//List functions //List functions

View File

@ -653,10 +653,11 @@ static void gui_display_settings()
if (maple_devices_changed) if (maple_devices_changed)
{ {
maple_devices_changed = false; maple_devices_changed = false;
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST if (game_started && settings.platform.system == DC_PLATFORM_DREAMCAST)
maple_ReconnectDevices(); {
reset_vmus(); maple_ReconnectDevices();
#endif reset_vmus();
}
} }
SaveSettings(); SaveSettings();
} }
@ -811,14 +812,12 @@ static void gui_display_settings()
if (ImGui::BeginTabItem("Controls")) if (ImGui::BeginTabItem("Controls"))
{ {
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, normal_padding); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, normal_padding);
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
if (ImGui::CollapsingHeader("Dreamcast Devices", ImGuiTreeNodeFlags_DefaultOpen)) if (ImGui::CollapsingHeader("Dreamcast Devices", ImGuiTreeNodeFlags_DefaultOpen))
{ {
for (int bus = 0; bus < MAPLE_PORTS; bus++) for (int bus = 0; bus < MAPLE_PORTS; bus++)
{ {
ImGui::Text("Device %c", bus + 'A'); ImGui::Text("Device %c", bus + 'A');
ImGui::SameLine(); ImGui::SameLine();
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
char device_name[32]; char device_name[32];
sprintf(device_name, "##device%d", bus); sprintf(device_name, "##device%d", bus);
float w = ImGui::CalcItemWidth() / 3; float w = ImGui::CalcItemWidth() / 3;
@ -862,14 +861,9 @@ static void gui_display_settings()
ImGui::PopID(); ImGui::PopID();
} }
ImGui::PopItemWidth(); ImGui::PopItemWidth();
#elif DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
if (MapleDevices[bus][5] != NULL)
ImGui::Text("%s", maple_device_name(MapleDevices[bus][5]->get_device_type()));
#endif
} }
ImGui::Spacing(); ImGui::Spacing();
} }
#endif
if (ImGui::CollapsingHeader("Physical Devices", ImGuiTreeNodeFlags_DefaultOpen)) if (ImGui::CollapsingHeader("Physical Devices", ImGuiTreeNodeFlags_DefaultOpen))
{ {
ImGui::Columns(4, "renderers", false); ImGui::Columns(4, "renderers", false);
@ -1253,15 +1247,14 @@ static void gui_display_settings()
ImGui::Text("Git Hash: %s", GIT_HASH); ImGui::Text("Git Hash: %s", GIT_HASH);
ImGui::Text("Build Date: %s", BUILD_DATE); ImGui::Text("Build Date: %s", BUILD_DATE);
ImGui::Text("Target: %s", ImGui::Text("Target: %s",
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST settings.platform.system == DC_PLATFORM_DREAMCAST ?
"Dreamcast" "Dreamcast"
#elif DC_PLATFORM == DC_PLATFORM_NAOMI : settings.platform.system == DC_PLATFORM_NAOMI ?
"Naomi" "Naomi"
#elif DC_PLATFORM == DC_PLATFORM_ATOMISWAVE : settings.platform.system == DC_PLATFORM_ATOMISWAVE ?
"Atomiswave" "Atomiswave"
#else :
"Unknown" "Unknown"
#endif
); );
} }
if (ImGui::CollapsingHeader("Platform", ImGuiTreeNodeFlags_DefaultOpen)) if (ImGui::CollapsingHeader("Platform", ImGuiTreeNodeFlags_DefaultOpen))
@ -1379,25 +1372,17 @@ static void add_game_directory(const std::string& path, std::vector<GameMedia>&
} }
else else
{ {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
if (name.size() >= 4)
{
std::string extension = name.substr(name.size() - 4).c_str();
//printf(" found game %s ext %s\n", entry->d_name, extension.c_str());
if (stricmp(extension.c_str(), ".cdi") && stricmp(extension.c_str(), ".gdi") && stricmp(extension.c_str(), ".chd") && stricmp(extension.c_str(), ".cue"))
continue;
game_list.push_back({ name, child_path });
}
#else
std::string::size_type dotpos = name.find_last_of("."); std::string::size_type dotpos = name.find_last_of(".");
if (dotpos == std::string::npos || dotpos == name.size() - 1) if (dotpos == std::string::npos || dotpos == name.size() - 1)
continue; continue;
std::string extension = name.substr(dotpos); std::string extension = name.substr(dotpos);
if (stricmp(extension.c_str(), ".zip") && stricmp(extension.c_str(), ".7z") && stricmp(extension.c_str(), ".bin") if (stricmp(extension.c_str(), ".zip") && stricmp(extension.c_str(), ".7z")
&& stricmp(extension.c_str(), ".lst") && stricmp(extension.c_str(), ".dat")) && stricmp(extension.c_str(), ".bin") && stricmp(extension.c_str(), ".lst")
&& stricmp(extension.c_str(), ".dat")
&& stricmp(extension.c_str(), ".cdi") && stricmp(extension.c_str(), ".gdi")
&& stricmp(extension.c_str(), ".chd") && stricmp(extension.c_str(), ".cue"))
continue; continue;
game_list.push_back({ name, child_path }); game_list.push_back({ name, child_path });
#endif
} }
} }
closedir(dir); closedir(dir);
@ -1484,7 +1469,6 @@ static void gui_display_content()
{ {
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(8 * scaling, 20 * scaling)); // from 8, 4 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(8 * scaling, 20 * scaling)); // from 8, 4
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
ImGui::PushID("bios"); ImGui::PushID("bios");
if (ImGui::Selectable("Dreamcast BIOS")) if (ImGui::Selectable("Dreamcast BIOS"))
{ {
@ -1493,7 +1477,6 @@ static void gui_display_content()
gui_start_game(""); gui_start_game("");
} }
ImGui::PopID(); ImGui::PopID();
#endif
for (auto& game : game_list) for (auto& game : game_list)
if (filter.PassFilter(game.name.c_str())) if (filter.PassFilter(game.name.c_str()))

View File

@ -157,19 +157,8 @@ extern u32 SB_FFST;
//static HollyInterruptID dmatmp2; //static HollyInterruptID dmatmp2;
//static HollyInterruptID OldDmaId; //static HollyInterruptID OldDmaId;
//this is one-time init, no updates - don't need to serialize extern MemChip *sys_rom;
//extern RomChip sys_rom; extern MemChip *sys_nvmem;
#ifdef FLASH_SIZE
extern DCFlashChip sys_nvmem;
#endif
#ifdef BBSRAM_SIZE
extern SRamChip sys_nvmem;
#endif
//this is one-time init, no updates - don't need to serialize
//extern _vmem_handler area0_handler;
//./core/hw/gdrom/gdrom_response.o //./core/hw/gdrom/gdrom_response.o
@ -831,20 +820,16 @@ bool dc_serialize(void **data, unsigned int *total_size)
REICAST_S(SB_FFST); REICAST_S(SB_FFST);
sys_rom->Serialize(data, total_size);
//this is one-time init, no updates - don't need to serialize sys_nvmem->Serialize(data, total_size);
//extern RomChip sys_rom; /*
REICAST_S(sys_nvmem.size); REICAST_S(sys_nvmem->size);
REICAST_S(sys_nvmem.mask); REICAST_S(sys_nvmem->mask);
#ifdef FLASH_SIZE #ifdef FLASH_SIZE
REICAST_S(sys_nvmem.state); REICAST_S(sys_nvmem->state);
#endif #endif
REICAST_SA(sys_nvmem.data,sys_nvmem.size); REICAST_SA(sys_nvmem->data, sys_nvmem->size);
*/
//this is one-time init, no updates - don't need to serialize
//extern _vmem_handler area0_handler;
REICAST_SA(reply_11,16) ; REICAST_SA(reply_11,16) ;
@ -1198,15 +1183,14 @@ static bool dc_unserialize_libretro(void **data, unsigned int *total_size)
REICAST_US(i); //LIBRETRO_S(sys_nvmem_sram.mask); REICAST_US(i); //LIBRETRO_S(sys_nvmem_sram.mask);
//LIBRETRO_SA(sys_nvmem_sram.data,sys_nvmem_sram.size); //LIBRETRO_SA(sys_nvmem_sram.data,sys_nvmem_sram.size);
REICAST_US(sys_nvmem.size); REICAST_US(sys_nvmem->size);
REICAST_US(sys_nvmem.mask); REICAST_US(sys_nvmem->mask);
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST if (settings.platform.system == DC_PLATFORM_DREAMCAST)
REICAST_US(sys_nvmem.state); REICAST_US(static_cast<DCFlashChip*>(sys_nvmem)->state);
#else else
// FIXME // FIXME
die("Naomi/Atomiswave libretro savestates are not supported"); die("Naomi/Atomiswave libretro savestates are not supported");
#endif REICAST_USA(sys_nvmem->data, sys_nvmem->size);
REICAST_USA(sys_nvmem.data,sys_nvmem.size);
//this is one-time init, no updates - don't need to serialize //this is one-time init, no updates - don't need to serialize
@ -1580,15 +1564,16 @@ bool dc_unserialize(void **data, unsigned int *total_size)
REICAST_US(SB_FFST_rc); REICAST_US(SB_FFST_rc);
REICAST_US(SB_FFST); REICAST_US(SB_FFST);
//this is one-time init, no updates - don't need to serialize sys_rom->Unserialize(data, total_size);
//extern RomChip sys_rom; sys_nvmem->Unserialize(data, total_size);
/*
REICAST_US(sys_nvmem.size); REICAST_US(sys_nvmem.size);
REICAST_US(sys_nvmem.mask); REICAST_US(sys_nvmem.mask);
#ifdef FLASH_SIZE #ifdef FLASH_SIZE
REICAST_US(sys_nvmem.state); REICAST_US(sys_nvmem.state);
#endif #endif
REICAST_USA(sys_nvmem.data,sys_nvmem.size); REICAST_USA(sys_nvmem.data,sys_nvmem.size);
*/
//this is one-time init, no updates - don't need to serialize //this is one-time init, no updates - don't need to serialize
//extern _vmem_handler area0_handler; //extern _vmem_handler area0_handler;

View File

@ -421,8 +421,8 @@ bool dc_unserialize(void **data, unsigned int *total_size);
#define REICAST_S(v) rc_serialize(&(v), sizeof(v), data, total_size) #define REICAST_S(v) rc_serialize(&(v), sizeof(v), data, total_size)
#define REICAST_US(v) rc_unserialize(&(v), sizeof(v), data, total_size) #define REICAST_US(v) rc_unserialize(&(v), sizeof(v), data, total_size)
#define REICAST_SA(v_arr,num) rc_serialize(v_arr, sizeof(v_arr[0])*num, data, total_size) #define REICAST_SA(v_arr,num) rc_serialize((v_arr), sizeof((v_arr)[0])*(num), data, total_size)
#define REICAST_USA(v_arr,num) rc_unserialize(v_arr, sizeof(v_arr[0])*num, data, total_size) #define REICAST_USA(v_arr,num) rc_unserialize((v_arr), sizeof((v_arr)[0])*(num), data, total_size)
enum enum
{ {
@ -605,6 +605,19 @@ enum LimitFPSEnum {
struct settings_t struct settings_t
{ {
struct {
int system;
u32 ram_size;
u32 ram_mask;
u32 vram_size;
u32 vram_mask;
u32 aram_size;
u32 aram_mask;
u32 bios_size;
u32 flash_size;
u32 bbsram_size;
} platform;
struct { struct {
bool UseReios; bool UseReios;
} bios; } bios;
@ -738,6 +751,16 @@ struct settings_t
extern settings_t settings; extern settings_t settings;
#define RAM_SIZE settings.platform.ram_size
#define RAM_MASK settings.platform.ram_mask
#define ARAM_SIZE settings.platform.aram_size
#define ARAM_MASK settings.platform.aram_mask
#define VRAM_SIZE settings.platform.vram_size
#define VRAM_MASK settings.platform.vram_mask
#define BIOS_SIZE settings.platform.bios_size
#define FLASH_SIZE settings.platform.flash_size
#define BBSRAM_SIZE settings.platform.bbsram_size
void InitSettings(); void InitSettings();
void LoadSettings(bool game_specific); void LoadSettings(bool game_specific);
void SaveSettings(); void SaveSettings();

View File

@ -14,7 +14,6 @@
#include <windowsx.h> #include <windowsx.h>
#include <xinput.h> #include <xinput.h>
#include "hw/maple/maple_cfg.h"
#pragma comment(lib, "XInput9_1_0.lib") #pragma comment(lib, "XInput9_1_0.lib")
PCHAR* PCHAR*
@ -122,9 +121,6 @@ static std::shared_ptr<WinMouseGamepadDevice> mouse_gamepad;
void os_SetupInput() void os_SetupInput()
{ {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
mcfg_CreateDevices();
#endif
XInputGamepadDevice::CreateDevices(); XInputGamepadDevice::CreateDevices();
kb_gamepad = std::make_shared<WinKbGamepadDevice>(0); kb_gamepad = std::make_shared<WinKbGamepadDevice>(0);
GamepadDevice::Register(kb_gamepad); GamepadDevice::Register(kb_gamepad);

1994
p.patch Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,8 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'com.github.triplet.play' apply plugin: 'com.github.triplet.play'
apply from: 'profiling.gradle'
def getBuildId = { -> def getBuildId = { ->
def build_id = System.getenv("TRAVIS_JOB_ID") ?: "8" def build_id = System.getenv("TRAVIS_JOB_ID") ?: "8"
return Integer.parseInt( build_id ) return Integer.parseInt( build_id )
@ -38,7 +40,7 @@ android {
ndk { ndk {
moduleName "dc" moduleName "dc"
abiFilters 'armeabi-v7a', 'arm64-v8a' abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86'
} }
} }
@ -70,11 +72,12 @@ android {
flavorDimensions "systemtype" flavorDimensions "systemtype"
productFlavors { productFlavors {
dreamcast { dreamcast {
externalNativeBuild { ndkBuild { arguments "-j8" } }
} }
naomi { naomi {
applicationId = "com.flycast.emulator.naomi" applicationId = "com.flycast.emulator.naomi"
versionNameSuffix " Naomi" versionNameSuffix " Naomi"
externalNativeBuild { ndkBuild { arguments "NAOMI=1" } } externalNativeBuild { ndkBuild { arguments "NAOMI=1", "-j8" } }
} }
} }
@ -87,6 +90,12 @@ android {
lintOptions { lintOptions {
abortOnError false abortOnError false
} }
packagingOptions{
doNotStrip "*/armeabi/*.so"
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/arm64-v8a/*.so"
}
} }
afterEvaluate { afterEvaluate {
@ -117,4 +126,3 @@ dependencies {
} }
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
} }

View File

@ -192,9 +192,6 @@ void common_linux_setup();
void os_SetupInput() void os_SetupInput()
{ {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
mcfg_CreateDevices();
#endif
} }
void os_SetWindowText(char const *Text) void os_SetWindowText(char const *Text)

View File

@ -89,9 +89,6 @@ void os_CreateWindow() {
} }
void os_SetupInput() { void os_SetupInput() {
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
mcfg_CreateDevices();
#endif
} }
void UpdateInputState(u32 port) { void UpdateInputState(u32 port) {

View File

@ -64,10 +64,6 @@ void os_SetupInput() {
GamepadDevice::Register(kb_gamepad); GamepadDevice::Register(kb_gamepad);
mouse_gamepad = std::make_shared<OSXMouseGamepadDevice>(0); mouse_gamepad = std::make_shared<OSXMouseGamepadDevice>(0);
GamepadDevice::Register(mouse_gamepad); GamepadDevice::Register(mouse_gamepad);
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
mcfg_CreateDevices();
#endif
} }
void* libPvr_GetRenderTarget() { void* libPvr_GetRenderTarget() {

42
shell/linux/.gdb_history Normal file
View File

@ -0,0 +1,42 @@
r
q
r
bt
r
bt
info threads
q
r
bt
q
break GetFile
r
bt
q
r
bt
up
up
up
up
up
up
p buffer
p data
p offset
up
p child_archive
p *child_archive
p *parent_archive
q
r
q
break mcfg_CreateDevices
r
q
r
q
r
q
r
q

0
shell/linux/flycast.log Normal file
View File