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 VRAM_SIZE_MAX (16*1024*1024)
#define ARAM_SIZE_MAX (8*1024*1024)
#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 BUILD_DREAMCAST 1
#define GD_CLOCK 33868800 //GDROM XTAL -- 768fs

View File

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

View File

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

View File

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

View File

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

View File

@ -18,132 +18,139 @@
#include "hw/flashrom/flashrom.h"
#include "reios/reios.h"
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
DCFlashChip sys_rom(BIOS_SIZE, BIOS_SIZE / 2);
#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
MemChip *sys_rom;
MemChip *sys_nvmem;
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)
{
#if DC_PLATFORM != DC_PLATFORM_ATOMISWAVE
if (!sys_rom.Load(root, ROM_PREFIX, "%boot.bin;%boot.bin.bin;%bios.bin;%bios.bin.bin" ROM_NAMES, "bootrom"))
if (settings.platform.system != DC_PLATFORM_ATOMISWAVE)
{
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
// Dreamcast absolutely needs a BIOS
msgboxf("Unable to find bios in %s. Exiting...", MBX_ICONERROR, root.c_str());
return false;
#endif
if (!sys_rom->Load(root, getRomPrefix(), "%boot.bin;%boot.bin.bin;%bios.bin;%bios.bin.bin", "bootrom"))
{
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
{
// 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
bios_loaded = true;
#endif
#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
rc = sys_nvmem->Load(get_game_save_prefix() + ".nvmem");
if (!rc)
{
if (NVR_OPTIONAL)
if (nvmemOptional())
{
INFO_LOG(FLASHROM, "flash/nvmem is missing, will create new file...");
}
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;
}
}
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
struct flash_syscfg_block syscfg;
int res = sys_nvmem.ReadBlock(FLASH_PT_USER, FLASH_USER_SYSCFG, &syscfg);
if (!res)
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
{
// write out default settings
memset(&syscfg, 0xff, sizeof(syscfg));
syscfg.time_lo = 0;
syscfg.time_hi = 0;
syscfg.lang = 0;
syscfg.mono = 0;
syscfg.autostart = 1;
struct flash_syscfg_block syscfg;
int res = static_cast<DCFlashChip*>(sys_nvmem)->ReadBlock(FLASH_PT_USER, FLASH_USER_SYSCFG, &syscfg);
if (!res)
{
// write out default settings
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)
WARN_LOG(FLASHROM, "Failed to save time and language to flash RAM");
#endif
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
sys_rom.Load(get_game_save_prefix() + ".nvmem2");
#endif
if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
sys_rom->Load(get_game_save_prefix() + ".nvmem2");
return true;
}
void SaveRomFiles(const string& root)
{
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
sys_nvmem.Save(root, ROM_PREFIX, "nvmem.bin", "nvmem");
#else
sys_nvmem.Save(get_game_save_prefix() + ".nvmem");
#endif
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
sys_rom.Save(get_game_save_prefix() + ".nvmem2");
#endif
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
sys_nvmem->Save(root, getRomPrefix(), "nvmem.bin", "nvmem");
else
sys_nvmem->Save(get_game_save_prefix() + ".nvmem");
if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
sys_rom->Save(get_game_save_prefix() + ".nvmem2");
}
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");
}
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); }
void WriteFlash(u32 addr,u32 data,u32 sz) { sys_nvmem.Write(addr,data,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); }
#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) { INFO_LOG(MEMORY, "Write to [Boot ROM] is not possible, addr=%x, data=%x, size=%d", addr, data, sz); }
#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)
void WriteBios(u32 addr,u32 data,u32 sz)
{
if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
{
if (sz != 1)
{
INFO_LOG(MEMORY, "Invalid access size @%08x data %x sz %d", addr, data, sz);
return;
}
sys_rom.Write(addr, data, sz);
sys_rom->Write(addr, data, sz);
}
#else
#error unknown flash
#endif
else
{
INFO_LOG(MEMORY, "Write to [Boot ROM] is not possible, addr=%x, data=%x, size=%d", addr, data, sz);
}
}
//Area 0 mem map
//0x00000000- 0x001FFFFF :MPX System/Boot ROM
@ -174,11 +181,9 @@ T DYNACALL ReadMem_area0(u32 addr)
//map 0x0000 to 0x01FF to Default handler
//mirror 0x0200 to 0x03FF , from 0x0000 to 0x03FFF
//map 0x0000 to 0x001F
#if DC_PLATFORM != DC_PLATFORM_ATOMISWAVE
if (base<=0x001F)// :MPX System/Boot ROM
#else
if (base<=0x0001) // Only 128k BIOS on AtomisWave
#endif
// :MPX System/Boot ROM
if (base <= (settings.platform.system == DC_PLATFORM_ATOMISWAVE ? 0x0001 : 0x001F)) // Only 128k BIOS on AtomisWave
{
return ReadBios(addr,sz);
}
@ -196,11 +201,10 @@ T DYNACALL ReadMem_area0(u32 addr)
}
else if ((addr>= 0x005F7000) && (addr<= 0x005F70FF)) // GD-ROM
{
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
return (T)ReadMem_naomi(addr,sz);
#else
return (T)ReadMem_gdrom(addr,sz);
#endif
if (settings.platform.system != DC_PLATFORM_DREAMCAST)
return (T)ReadMem_naomi(addr, sz);
else
return (T)ReadMem_gdrom(addr, sz);
}
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
else if ((base ==0x0060) /*&& (addr>= 0x00600000)*/ && (addr<= 0x006007FF)) // :MODEM
{
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
return (T)libExtDevice_ReadMem_A0_006(addr, sz);
#elif defined(ENABLE_MODEM)
return (T)ModemReadMem_A0_006(addr, sz);
if (settings.platform.system != DC_PLATFORM_DREAMCAST)
return (T)libExtDevice_ReadMem_A0_006(addr, sz);
else
#if defined(ENABLE_MODEM)
return (T)ModemReadMem_A0_006(addr, sz);
#else
return (T)0;
return (T)0;
#endif
}
//map 0x0060 to 0x006F
@ -261,12 +266,8 @@ void DYNACALL WriteMem_area0(u32 addr,T data)
const u32 base=(addr>>16);
//map 0x0000 to 0x001F
#if DC_PLATFORM != DC_PLATFORM_ATOMISWAVE
if ((base <=0x001F) /*&& (addr<=0x001FFFFF)*/)// :MPX System/Boot ROM
#else
if (base <= 0x0001) // Only 128k BIOS on AtomisWave
#endif
// :MPX System/Boot ROM
if (base <= (settings.platform.system == DC_PLATFORM_ATOMISWAVE ? 0x0001 : 0x001F)) // Only 128k BIOS on AtomisWave
{
WriteBios(addr,data,sz);
}
@ -285,11 +286,10 @@ void DYNACALL WriteMem_area0(u32 addr,T data)
}
else if ((addr>= 0x005F7000) && (addr<= 0x005F70FF)) // GD-ROM
{
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
WriteMem_naomi(addr,data,sz);
#else
WriteMem_gdrom(addr,data,sz);
#endif
if (settings.platform.system != DC_PLATFORM_DREAMCAST)
WriteMem_naomi(addr,data,sz);
else
WriteMem_gdrom(addr,data,sz);
}
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
else if ((base ==0x0060) /*&& (addr>= 0x00600000)*/ && (addr<= 0x006007FF)) // MODEM
{
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
libExtDevice_WriteMem_A0_006(addr, data, sz);
#elif defined(ENABLE_MODEM)
ModemWriteMem_A0_006(addr, data, sz);
if (settings.platform.system != DC_PLATFORM_DREAMCAST)
libExtDevice_WriteMem_A0_006(addr, data, sz);
#if defined(ENABLE_MODEM)
else
ModemWriteMem_A0_006(addr, data, sz);
#endif
}
//map 0x0060 to 0x006F
@ -347,17 +348,57 @@ void sh4_area0_Init()
sb_Init();
}
void sh4_area0_Reset(bool Manual)
void sh4_area0_Reset(bool manual)
{
sb_Reset(Manual);
sys_rom.Reset();
#if defined(FLASH_SIZE) || defined(BBSRAM_SIZE)
sys_nvmem.Reset();
#endif
if (manual)
{
if (sys_rom != NULL)
{
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()
{
if (sys_rom != NULL)
{
delete sys_rom;
sys_rom = NULL;
}
if (sys_nvmem != NULL)
{
delete sys_nvmem;
sys_nvmem = NULL;
}
sb_Term();
}

View File

@ -77,33 +77,36 @@ struct MapleConfigMap : IMapleConfigMap
UpdateInputState(player_num);
pjs->kcode=kcode[player_num];
#if DC_PLATFORM == 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 (settings.platform.system == DC_PLATFORM_DREAMCAST)
{
if ((kcode[player_num] & (1 << i)) == 0)
pjs->kcode &= ~awave_button_mapping[i];
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];
}
pjs->joy[PJAI_X1] = GetBtFromSgn(joyx[player_num]);
if (NaomiGameInputs != NULL && NaomiGameInputs->axes[1].name != NULL && NaomiGameInputs->axes[1].type == Half)
else if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
{
// 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];
pjs->kcode = 0xFFFF;
for (int i = 0; i < 16; i++)
{
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)
{
@ -134,12 +137,16 @@ void mcfg_Create(MapleDeviceType type, u32 bus, u32 port, s32 player_num = -1)
void mcfg_CreateNAOMIJamma()
{
printf("mcfg_CreateNAOMIJamma\n");
mcfg_DestroyDevices();
mcfg_Create(MDT_NaomiJamma, 0, 5);
// mcfg_Create(MDT_Keyboard, 2, 5);
}
void mcfg_CreateAtomisWaveControllers()
{
printf("mcfg_CreateAtomisWaveControllers\n");
mcfg_DestroyDevices();
// 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, ...
mcfg_Create(MDT_SegaController, 0, 5);
@ -174,6 +181,7 @@ void mcfg_CreateAtomisWaveControllers()
void mcfg_CreateDevices()
{
printf("mcfg_CreateDevices\n");
for (int bus = 0; bus < MAPLE_PORTS; ++bus)
{
switch ((MapleDeviceType)settings.input.maple_devices[bus])
@ -205,6 +213,7 @@ void mcfg_CreateDevices()
void mcfg_DestroyDevices()
{
printf("mcfg_DestroyDevices\n");
for (int i = 0; i < MAPLE_PORTS; i++)
for (int j=0;j<=5;j++)
{

View File

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

View File

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

View File

@ -71,9 +71,8 @@ void maple_vblank()
maple_ddt_pending_reset=false;
}
}
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
maple_handle_reconnect();
#endif
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
maple_handle_reconnect();
}
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;
void maple_ReconnectDevices()
@ -294,4 +292,3 @@ static void maple_handle_reconnect()
mcfg_CreateDevices();
}
}
#endif

View File

@ -441,6 +441,7 @@ void _vmem_term() {}
u8* virt_ram_base;
bool vmem_4gb_space;
static VMemType vmemstatus;
void* malloc_pages(size_t size) {
#if HOST_OS == OS_WINDOWS
@ -512,14 +513,49 @@ bool _vmem_reserve() {
// TODO: Static assert?
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.
#ifndef TARGET_NO_EXCEPTIONS
#ifndef TARGET_NO_EXCEPTIONS
if (!settings.dynarec.disable_nvmem)
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.
if (vmemstatus == MemTypeError) {
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();
vram.Zero();
mem_b.Zero();
return true;
}
#define freedefptr(x) \

View File

@ -55,6 +55,7 @@ typedef u32 _vmem_handler;
void _vmem_init();
void _vmem_reset();
void _vmem_term();
void _vmem_init_mappings();
//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);

View File

@ -66,7 +66,7 @@ struct vram_lock {
u32 start;
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
bool vmem32_inited;

View File

@ -534,10 +534,6 @@ void naomi_reg_Init()
}
#endif
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()
@ -555,6 +551,9 @@ void naomi_reg_Term()
}
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;
aw_ram_test_skipped = false;
GSerialBuffer = 0;

View File

@ -55,7 +55,7 @@ char naomi_game_id[33];
InputDescriptors *NaomiGameInputs;
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)
{
@ -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].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);
}
else
@ -113,7 +113,7 @@ static bool naomi_LoadBios(const char *filename, Archive *child_archive, Archive
if (bios->blobs[romid].blob_type == Normal)
{
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);
}
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);
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;
for (int i = bios->blobs[romid].length / 2; --i >= 0; to++)
*to++ = *from++;
@ -143,10 +143,9 @@ static bool naomi_LoadBios(const char *filename, Archive *child_archive, Archive
if (bios_archive != NULL)
delete bios_archive;
#if DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
// Reload the writeable portion of the FlashROM
sys_rom.Reload();
#endif
if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)
// Reload the writeable portion of the FlashROM
sys_rom->Reload();
return found_region;
@ -156,9 +155,9 @@ error:
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
p = strrchr(p == NULL ? filename : p, '\\');
#endif
@ -178,25 +177,19 @@ static bool naomi_cart_LoadZip(char *filename)
if (!stricmp(Games[gameid].name, game_name))
break;
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);
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);
if (archive != NULL)
INFO_LOG(NAOMI, "Opened %s", filename);
@ -650,6 +643,17 @@ bool naomi_cart_SelectFile()
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)
{
RomPtr = (u8 *)malloc(size);

View File

@ -95,6 +95,7 @@ public:
bool naomi_cart_SelectFile();
void naomi_cart_Close();
int naomi_cart_GetPlatform(const char *path);
extern char naomi_game_id[];
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
// so we have to unlock each region individually
// No need for this mess in 4GB mode since windows doesn't use it
#if 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 + 0x0E000000, RAM_SIZE);
mem_region_unlock(virt_ram_base + 0x0F000000, RAM_SIZE);
#else
mem_region_unlock(virt_ram_base + 0x0C000000, RAM_SIZE);
mem_region_unlock(virt_ram_base + 0x0E000000, RAM_SIZE);
#endif
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 + 0x0E000000, RAM_SIZE);
mem_region_unlock(virt_ram_base + 0x0F000000, RAM_SIZE);
}
else
{
mem_region_unlock(virt_ram_base + 0x0C000000, RAM_SIZE);
mem_region_unlock(virt_ram_base + 0x0E000000, RAM_SIZE);
}
if (_nvmem_4gb_space())
{
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)
{
BSC_PCTRA.full=(u16)data;
#if DC_PLATFORM == DC_PLATFORM_NAOMI
if (settings.platform.system == DC_PLATFORM_NAOMI)
NaomiBoardIDWriteControl((u16)data);
#else
//else
//printf("C:BSC_PCTRA = %08X\n",data);
#endif
}
//u32 port_out_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;
//printf("D:BSC_PDTRA = %08X\n",data);
#if DC_PLATFORM == DC_PLATFORM_NAOMI
if (settings.platform.system == DC_PLATFORM_NAOMI)
NaomiBoardIDWrite((u16)data);
#endif
}
u32 read_BSC_PDTRA(u32 addr)
{
#if DC_PLATFORM == DC_PLATFORM_NAOMI
if (settings.platform.system == DC_PLATFORM_NAOMI)
{
return NaomiBoardIDRead();
#else
}
else
{
/* as seen on chankast */
u32 tpctra = BSC_PCTRA.full;
u32 tpdtra = BSC_PDTRA.full;
@ -57,8 +55,7 @@ u32 read_BSC_PDTRA(u32 addr)
tfinal |= settings.dreamcast.cable <<8;
return tfinal;
#endif
}
}
//Init term res
@ -113,14 +110,10 @@ void bsc_init()
sh4_rio_reg(BSC,BSC_GPIOIC_addr,RIO_DATA,16);
//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);
BSC_RFCR.full = 17;
#endif
}
void bsc_reset()
{
/*
@ -160,10 +153,10 @@ void bsc_reset()
BSC_PCTRB.full=0x0;
//BSC_PDTRB.full; undef
BSC_GPIOIC.full=0x0;
#if DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
BSC_RFCR.full = 17;
#endif
}
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)
s32 libGDR_Init()
{
if (!InitDrive())
return rv_serror;
libCore_gdrom_disc_change();
settings.imgread.PatchRegion=true;
settings.imgread.PatchRegion = true;
return rv_ok;
}

View File

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

View File

@ -132,175 +132,178 @@ void plugins_Reset(bool Manual)
void LoadSpecialSettings()
{
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
INFO_LOG(BOOT, "Game ID is [%s]", reios_product_number);
rtt_to_buffer_game = false;
safemode_game = false;
tr_poly_depth_mask_game = false;
extra_depth_game = false;
full_mmu_game = false;
disable_vmem32_game = false;
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
{
INFO_LOG(BOOT, "Game ID is [%s]", reios_product_number);
rtt_to_buffer_game = false;
safemode_game = false;
tr_poly_depth_mask_game = false;
extra_depth_game = false;
full_mmu_game = false;
disable_vmem32_game = false;
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");
settings.rend.ExtraDepthScale = 0.1;
extra_depth_game = true;
settings.dreamcast.FullMMU = true;
full_mmu_game = true;
settings.aica.NoBatch = true;
}
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");
settings.rend.ExtraDepthScale = 0.1;
extra_depth_game = true;
settings.dreamcast.FullMMU = true;
full_mmu_game = true;
settings.aica.NoBatch = true;
}
// Tony Hawk's Pro Skater 2
if (!strncmp("T13008D", reios_product_number, 7) || !strncmp("T13006N", reios_product_number, 7)
// Tony Hawk's Pro Skater 1
|| !strncmp("T40205N", reios_product_number, 7)
// Tony Hawk's Skateboarding
|| !strncmp("T40204D", reios_product_number, 7)
// Skies of Arcadia
|| !strncmp("MK-51052", reios_product_number, 8)
// Eternal Arcadia (JP)
|| !strncmp("HDR-0076", reios_product_number, 8)
// Flag to Flag (US)
|| !strncmp("MK-51007", reios_product_number, 8)
// Super Speed Racing (JP)
|| !strncmp("HDR-0013", reios_product_number, 8)
// Yu Suzuki Game Works Vol. 1
|| !strncmp("6108099", reios_product_number, 7)
// L.O.L
|| !strncmp("T2106M", reios_product_number, 6)
// Miss Moonlight
|| !strncmp("T18702M", reios_product_number, 7)
// Tom Clancy's Rainbow Six (US)
|| !strncmp("T40401N", reios_product_number, 7)
// Tom Clancy's Rainbow Six incl. Eagle Watch Missions (EU)
|| !strncmp("T-45001D05", reios_product_number, 10))
{
settings.rend.RenderToTextureBuffer = 1;
rtt_to_buffer_game = true;
// Tony Hawk's Pro Skater 2
if (!strncmp("T13008D", reios_product_number, 7) || !strncmp("T13006N", reios_product_number, 7)
// Tony Hawk's Pro Skater 1
|| !strncmp("T40205N", reios_product_number, 7)
// Tony Hawk's Skateboarding
|| !strncmp("T40204D", reios_product_number, 7)
// Skies of Arcadia
|| !strncmp("MK-51052", reios_product_number, 8)
// Eternal Arcadia (JP)
|| !strncmp("HDR-0076", reios_product_number, 8)
// Flag to Flag (US)
|| !strncmp("MK-51007", reios_product_number, 8)
// Super Speed Racing (JP)
|| !strncmp("HDR-0013", reios_product_number, 8)
// Yu Suzuki Game Works Vol. 1
|| !strncmp("6108099", reios_product_number, 7)
// L.O.L
|| !strncmp("T2106M", reios_product_number, 6)
// Miss Moonlight
|| !strncmp("T18702M", reios_product_number, 7)
// Tom Clancy's Rainbow Six (US)
|| !strncmp("T40401N", reios_product_number, 7)
// Tom Clancy's Rainbow Six incl. Eagle Watch Missions (EU)
|| !strncmp("T-45001D05", reios_product_number, 10))
{
settings.rend.RenderToTextureBuffer = 1;
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
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);
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))
{
INFO_LOG(BOOT, "Enabling Dynarec safe mode for game %s", naomi_game_id);
settings.dynarec.safemode = 1;
safemode_game = true;
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);
settings.dynarec.safemode = 1;
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)
@ -358,12 +361,58 @@ int reicast_init(int argc, char* argv[])
#define DATA_PATH "/"
#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 bool init_done;
if (init_done)
return 0;
// Default platform
set_platform(DC_PLATFORM_DREAMCAST);
if (plugins_Init())
return -3;
#if FEAT_SHREC != DYNAREC_NONE
@ -382,7 +431,6 @@ static int dc_init()
}
mem_Init();
mem_map_default(); // TODO needs to be called again if changing platform
init_done = true;
@ -391,6 +439,23 @@ static int dc_init()
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)
{
if (path != NULL)
@ -400,57 +465,64 @@ int dc_start_game(const char *path)
if (rc != 0)
return rc;
set_platform(get_game_platform(path));
mem_map_default();
InitSettings();
dc_reset(true);
LoadSettings(false);
if (!LoadRomFiles(get_readonly_data_path(DATA_PATH)))
{
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
#ifdef USE_REIOS
if (settings.bios.UseReios)
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
{
if (!LoadHle(get_readonly_data_path(DATA_PATH)))
#ifdef USE_REIOS
if (settings.bios.UseReios)
{
ERROR_LOG(BOOT, "Cannot init HLE BIOS");
return -5;
if (!LoadHle(get_readonly_data_path(DATA_PATH)))
{
ERROR_LOG(BOOT, "Cannot init HLE BIOS");
return -5;
}
else
{
NOTICE_LOG(BOOT, "Did not load bios, using reios");
}
}
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");
return -5;
// Boot BIOS
TermDrive();
InitDrive();
}
else
{
if (DiscSwap())
LoadCustom();
}
#endif
}
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
if (path == NULL)
else if (settings.platform.system == DC_PLATFORM_NAOMI || settings.platform.system == DC_PLATFORM_ATOMISWAVE)
{
// Boot BIOS
TermDrive();
InitDrive();
if (!naomi_cart_SelectFile())
return -6;
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;
dc_resume();
@ -502,9 +574,8 @@ void* dc_run(void*)
void dc_term()
{
sh4_cpu.Term();
#if DC_PLATFORM != DC_PLATFORM_DREAMCAST
naomi_cart_Close();
#endif
if (settings.platform.system != DC_PLATFORM_DREAMCAST)
naomi_cart_Close();
plugins_Term();
mem_Term();
_vmem_release();
@ -736,18 +807,22 @@ void LoadSettings(bool game_specific)
void LoadCustom()
{
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
char *reios_id = reios_disk_id();
char *reios_id;
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
{
reios_id = reios_disk_id();
char *p = reios_id + strlen(reios_id) - 1;
while (p >= reios_id && *p == ' ')
*p-- = '\0';
if (*p == '\0')
return;
#elif DC_PLATFORM == DC_PLATFORM_NAOMI || DC_PLATFORM == DC_PLATFORM_ATOMISWAVE
char *reios_id = naomi_game_id;
char *reios_software_name = naomi_game_id;
#endif
char *p = reios_id + strlen(reios_id) - 1;
while (p >= reios_id && *p == ' ')
*p-- = '\0';
if (*p == '\0')
return;
}
else if (settings.platform.system == DC_PLATFORM_NAOMI || settings.platform.system == DC_PLATFORM_ATOMISWAVE)
{
reios_id = naomi_game_id;
char *reios_software_name = naomi_game_id;
}
// Default per-game settings
LoadSpecialSettings();

View File

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

View File

@ -125,7 +125,7 @@ void palette_update()
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
//List functions

View File

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

View File

@ -157,19 +157,8 @@ extern u32 SB_FFST;
//static HollyInterruptID dmatmp2;
//static HollyInterruptID OldDmaId;
//this is one-time init, no updates - don't need to serialize
//extern RomChip sys_rom;
#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;
extern MemChip *sys_rom;
extern MemChip *sys_nvmem;
//./core/hw/gdrom/gdrom_response.o
@ -831,20 +820,16 @@ bool dc_serialize(void **data, unsigned int *total_size)
REICAST_S(SB_FFST);
//this is one-time init, no updates - don't need to serialize
//extern RomChip sys_rom;
REICAST_S(sys_nvmem.size);
REICAST_S(sys_nvmem.mask);
sys_rom->Serialize(data, total_size);
sys_nvmem->Serialize(data, total_size);
/*
REICAST_S(sys_nvmem->size);
REICAST_S(sys_nvmem->mask);
#ifdef FLASH_SIZE
REICAST_S(sys_nvmem.state);
REICAST_S(sys_nvmem->state);
#endif
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(sys_nvmem->data, sys_nvmem->size);
*/
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);
//LIBRETRO_SA(sys_nvmem_sram.data,sys_nvmem_sram.size);
REICAST_US(sys_nvmem.size);
REICAST_US(sys_nvmem.mask);
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
REICAST_US(sys_nvmem.state);
#else
// FIXME
die("Naomi/Atomiswave libretro savestates are not supported");
#endif
REICAST_USA(sys_nvmem.data,sys_nvmem.size);
REICAST_US(sys_nvmem->size);
REICAST_US(sys_nvmem->mask);
if (settings.platform.system == DC_PLATFORM_DREAMCAST)
REICAST_US(static_cast<DCFlashChip*>(sys_nvmem)->state);
else
// FIXME
die("Naomi/Atomiswave libretro savestates are not supported");
REICAST_USA(sys_nvmem->data, sys_nvmem->size);
//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);
//this is one-time init, no updates - don't need to serialize
//extern RomChip sys_rom;
sys_rom->Unserialize(data, total_size);
sys_nvmem->Unserialize(data, total_size);
/*
REICAST_US(sys_nvmem.size);
REICAST_US(sys_nvmem.mask);
#ifdef FLASH_SIZE
REICAST_US(sys_nvmem.state);
#endif
REICAST_USA(sys_nvmem.data,sys_nvmem.size);
*/
//this is one-time init, no updates - don't need to serialize
//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_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_USA(v_arr,num) rc_unserialize(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)
enum
{
@ -605,6 +605,19 @@ enum LimitFPSEnum {
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 {
bool UseReios;
} bios;
@ -738,6 +751,16 @@ struct settings_t
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 LoadSettings(bool game_specific);
void SaveSettings();

View File

@ -14,7 +14,6 @@
#include <windowsx.h>
#include <xinput.h>
#include "hw/maple/maple_cfg.h"
#pragma comment(lib, "XInput9_1_0.lib")
PCHAR*
@ -122,9 +121,6 @@ static std::shared_ptr<WinMouseGamepadDevice> mouse_gamepad;
void os_SetupInput()
{
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
mcfg_CreateDevices();
#endif
XInputGamepadDevice::CreateDevices();
kb_gamepad = std::make_shared<WinKbGamepadDevice>(0);
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.github.triplet.play'
apply from: 'profiling.gradle'
def getBuildId = { ->
def build_id = System.getenv("TRAVIS_JOB_ID") ?: "8"
return Integer.parseInt( build_id )
@ -38,7 +40,7 @@ android {
ndk {
moduleName "dc"
abiFilters 'armeabi-v7a', 'arm64-v8a'
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86'
}
}
@ -70,11 +72,12 @@ android {
flavorDimensions "systemtype"
productFlavors {
dreamcast {
externalNativeBuild { ndkBuild { arguments "-j8" } }
}
naomi {
applicationId = "com.flycast.emulator.naomi"
versionNameSuffix " Naomi"
externalNativeBuild { ndkBuild { arguments "NAOMI=1" } }
externalNativeBuild { ndkBuild { arguments "NAOMI=1", "-j8" } }
}
}
@ -87,6 +90,12 @@ android {
lintOptions {
abortOnError false
}
packagingOptions{
doNotStrip "*/armeabi/*.so"
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/arm64-v8a/*.so"
}
}
afterEvaluate {
@ -117,4 +126,3 @@ dependencies {
}
implementation fileTree(include: ['*.jar'], dir: 'libs')
}

View File

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

View File

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

View File

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