naomi: add fallback bios files. Proper region names
ui: use proper region names for arcade (export, korea) naomi: add previous version of BIOS files and fall back if latest ver not found fall back to use multiregion bios hack for korea add CRC for all bios files
This commit is contained in:
parent
c0a286532a
commit
63686eeee1
|
@ -56,10 +56,10 @@ bool atomiswaveForceFeedback;
|
|||
static bool loadBios(const char *filename, Archive *child_archive, Archive *parent_archive, int region)
|
||||
{
|
||||
int biosid = 0;
|
||||
for (; BIOS[biosid].name != NULL; biosid++)
|
||||
for (; BIOS[biosid].name != nullptr; biosid++)
|
||||
if (!stricmp(BIOS[biosid].name, filename))
|
||||
break;
|
||||
if (BIOS[biosid].name == NULL)
|
||||
if (BIOS[biosid].name == nullptr)
|
||||
{
|
||||
WARN_LOG(NAOMI, "Unknown BIOS %s", filename);
|
||||
return false;
|
||||
|
@ -74,94 +74,53 @@ static bool loadBios(const char *filename, Archive *child_archive, Archive *pare
|
|||
DEBUG_LOG(NAOMI, "Loading BIOS from %s", path.c_str());
|
||||
std::unique_ptr<Archive> bios_archive(OpenArchive(path));
|
||||
|
||||
MD5Sum md5;
|
||||
|
||||
bool found_region = false;
|
||||
u8 *biosData = nvmem::getBiosData();
|
||||
|
||||
for (int romid = 0; bios->blobs[romid].filename != NULL; romid++)
|
||||
for (int romid = 0; bios->blobs[romid].filename != nullptr && !found_region; romid++)
|
||||
{
|
||||
if (region == -1)
|
||||
{
|
||||
region = bios->blobs[romid].region;
|
||||
config::Region.override(region);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bios->blobs[romid].region != (u32)region)
|
||||
continue;
|
||||
else if (bios->blobs[romid].region != (u32)region)
|
||||
continue;
|
||||
|
||||
std::unique_ptr<ArchiveFile> file;
|
||||
// Find by CRC
|
||||
if (child_archive != nullptr)
|
||||
file.reset(child_archive->OpenFileByCrc(bios->blobs[romid].crc));
|
||||
if (!file && parent_archive != nullptr)
|
||||
file.reset(parent_archive->OpenFileByCrc(bios->blobs[romid].crc));
|
||||
if (!file && bios_archive != nullptr)
|
||||
file.reset(bios_archive->OpenFileByCrc(bios->blobs[romid].crc));
|
||||
// Fallback to find by filename
|
||||
if (!file && child_archive != nullptr)
|
||||
file.reset(child_archive->OpenFile(bios->blobs[romid].filename));
|
||||
if (!file && parent_archive != nullptr)
|
||||
file.reset(parent_archive->OpenFile(bios->blobs[romid].filename));
|
||||
if (!file && bios_archive != nullptr)
|
||||
file.reset(bios_archive->OpenFile(bios->blobs[romid].filename));
|
||||
if (!file) {
|
||||
WARN_LOG(NAOMI, "%s: Cannot open %s", filename, bios->blobs[romid].filename);
|
||||
continue;
|
||||
}
|
||||
verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE);
|
||||
u32 read = file->Read(biosData + bios->blobs[romid].offset, bios->blobs[romid].length);
|
||||
if (config::GGPOEnable)
|
||||
{
|
||||
MD5Sum md5;
|
||||
md5.add(biosData + bios->blobs[romid].offset, bios->blobs[romid].length);
|
||||
md5.getDigest(settings.network.md5.bios);
|
||||
}
|
||||
DEBUG_LOG(NAOMI, "Mapped %s: %x bytes at %07x", bios->blobs[romid].filename, read, bios->blobs[romid].offset);
|
||||
found_region = true;
|
||||
if (bios->blobs[romid].blob_type == Copy)
|
||||
{
|
||||
verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE);
|
||||
verify(bios->blobs[romid].src_offset + bios->blobs[romid].length <= BIOS_SIZE);
|
||||
memcpy(biosData + bios->blobs[romid].offset, biosData + 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
|
||||
{
|
||||
std::unique_ptr<ArchiveFile> file;
|
||||
// Find by CRC
|
||||
if (child_archive != NULL)
|
||||
file.reset(child_archive->OpenFileByCrc(bios->blobs[romid].crc));
|
||||
if (!file && parent_archive != NULL)
|
||||
file.reset(parent_archive->OpenFileByCrc(bios->blobs[romid].crc));
|
||||
if (!file && bios_archive != NULL)
|
||||
file.reset(bios_archive->OpenFileByCrc(bios->blobs[romid].crc));
|
||||
// Fallback to find by filename
|
||||
if (!file && child_archive != NULL)
|
||||
file.reset(child_archive->OpenFile(bios->blobs[romid].filename));
|
||||
if (!file && parent_archive != NULL)
|
||||
file.reset(parent_archive->OpenFile(bios->blobs[romid].filename));
|
||||
if (!file && bios_archive != NULL)
|
||||
file.reset(bios_archive->OpenFile(bios->blobs[romid].filename));
|
||||
if (!file) {
|
||||
WARN_LOG(NAOMI, "%s: Cannot open %s", filename, bios->blobs[romid].filename);
|
||||
return false;
|
||||
}
|
||||
switch (bios->blobs[romid].blob_type)
|
||||
{
|
||||
case Normal:
|
||||
{
|
||||
verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE);
|
||||
u32 read = file->Read(biosData + bios->blobs[romid].offset, bios->blobs[romid].length);
|
||||
if (config::GGPOEnable)
|
||||
md5.add(biosData + 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);
|
||||
}
|
||||
break;
|
||||
|
||||
case InterleavedWord:
|
||||
{
|
||||
u8 *buf = (u8 *)malloc(bios->blobs[romid].length);
|
||||
if (buf == nullptr)
|
||||
throw NaomiCartException("Memory allocation failed");
|
||||
|
||||
verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE);
|
||||
u32 read = file->Read(buf, bios->blobs[romid].length);
|
||||
u16 *to = (u16 *)(biosData + bios->blobs[romid].offset);
|
||||
u16 *from = (u16 *)buf;
|
||||
for (int i = bios->blobs[romid].length / 2; --i >= 0; to++)
|
||||
*to++ = *from++;
|
||||
free(buf);
|
||||
if (config::GGPOEnable)
|
||||
md5.add(biosData + bios->blobs[romid].offset, bios->blobs[romid].length);
|
||||
DEBUG_LOG(NAOMI, "Mapped %s: %x bytes (interleaved word) at %07x", bios->blobs[romid].filename, read, bios->blobs[romid].offset);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
die("Unknown blob type\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (config::GGPOEnable)
|
||||
md5.getDigest(settings.network.md5.bios);
|
||||
|
||||
// Reload the writeable portion of the FlashROM
|
||||
nvmem::reloadAWBios();
|
||||
if (found_region)
|
||||
nvmem::reloadAWBios();
|
||||
|
||||
return found_region;
|
||||
}
|
||||
|
|
|
@ -29,9 +29,10 @@ const BIOS_t BIOS[] =
|
|||
{
|
||||
"airlbios",
|
||||
{
|
||||
{ 2, "epr-21802.ic27", 0x000000, 0x200000 },
|
||||
{ 1, "epr-21801.ic27", 0x000000, 0x200000 },
|
||||
{ 0, NULL, 0, 0 },
|
||||
// Airline Pilots Deluxe (Export)
|
||||
{ 2, "epr-21802.ic27", 0x000000, 0x200000, 0xa77c6b1c },
|
||||
// Airline Pilots Deluxe (USA)
|
||||
{ 1, "epr-21801.ic27", 0x000000, 0x200000, 0xa21bef24 },
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -40,53 +41,52 @@ const BIOS_t BIOS[] =
|
|||
{ 0, "bios0.ic23", 0x000000, 0x020000 },
|
||||
//or
|
||||
//{ "bios1.ic23", 0x000000, 0x020000 },
|
||||
{ 0, NULL, 0, 0 },
|
||||
}
|
||||
},
|
||||
{
|
||||
"f355bios",
|
||||
{
|
||||
{ 2, "epr-22851.ic27", 0x000000, 0x200000 },
|
||||
{ 1, "epr-22850.ic27", 0x000000, 0x200000 },
|
||||
{ 0, "epr-22849.ic27", 0x000000, 0x200000 },
|
||||
{ 0, NULL, 0, 0 },
|
||||
// Ferrari F355 (Export)
|
||||
{ 2, "epr-22851.ic27", 0x000000, 0x200000, 0x62483677 },
|
||||
// Ferrari F355 (USA)
|
||||
{ 1, "epr-22850.ic27", 0x000000, 0x200000, 0x28aa539d },
|
||||
// Ferrari F355 (Japan)
|
||||
{ 0, "epr-22849.ic27", 0x000000, 0x200000, 0x121e009c },
|
||||
}
|
||||
},
|
||||
{
|
||||
"f355dlx",
|
||||
{
|
||||
// Ferrari F355 Deluxe (Export)
|
||||
{ 2, "epr-21864.ic27", 0x000000, 0x200000 },
|
||||
{ 2, "epr-21864.ic27", 0x000000, 0x200000, 0x12ed7c66 },
|
||||
// Ferrari F355 Deluxe (USA)
|
||||
{ 1, "epr-21863.ic27", 0x000000, 0x200000 },
|
||||
{ 1, "epr-21863.ic27", 0x000000, 0x200000, 0x0615a4d1 },
|
||||
// Ferrari F355 Deluxe (Japan)
|
||||
{ 0, "epr-21862.ic27", 0x000000, 0x200000 },
|
||||
{ 0, "epr-21862.ic27", 0x000000, 0x200000, 0x1f630716 },
|
||||
// Ferrari F355 Deluxe (Export, prototype)
|
||||
//{ 2, "epr-21864p.ic27", 0x000000, 0x200000 },
|
||||
// Ferrari F355 Deluxe (Japan, prototype)
|
||||
//{ 0, "epr-21862p.ic27", 0x000000, 0x200000 },
|
||||
{ 0, NULL, 0, 0 },
|
||||
}
|
||||
},
|
||||
{
|
||||
"hod2bios",
|
||||
{
|
||||
//export
|
||||
{ 2, "epr-21331.ic27", 0x000000, 0x200000 },
|
||||
//usa
|
||||
{ 1, "epr-21330.ic27", 0x000000, 0x200000 },
|
||||
//japan
|
||||
{ 0, "epr-21329.ic27", 0x000000, 0x200000 },
|
||||
{ 0, NULL, 0, 0 },
|
||||
// HOTD2 (Export)
|
||||
{ 2, "epr-21331.ic27", 0x000000, 0x200000, 0x065f8500 },
|
||||
// HOTD2 (USA)
|
||||
{ 1, "epr-21330.ic27", 0x000000, 0x200000, 0x9e3bfa1b },
|
||||
// HOTD2 (Japan)
|
||||
{ 0, "epr-21329.ic27", 0x000000, 0x200000, 0xd99e5b9b },
|
||||
}
|
||||
},
|
||||
{
|
||||
"naomi",
|
||||
{
|
||||
//ROM_SYSTEM_BIOS( 0, "bios0", "epr-21576h (Japan)" )
|
||||
{ 0, "epr-21576h.ic27", 0x000000, 0x200000 },
|
||||
{ 0, "epr-21576h.ic27", 0x000000, 0x200000, 0xd4895685 },
|
||||
//ROM_SYSTEM_BIOS( 1, "bios1", "epr-21576g (Japan)" )
|
||||
//{ 0, "epr-21576g.ic27", 0x000000, 0x200000 },
|
||||
{ 0, "epr-21576g.ic27", 0x000000, 0x200000, 0xd2a1c6bf },
|
||||
//ROM_SYSTEM_BIOS( 2, "bios2", "epr-21576e (Japan)" )
|
||||
//{ 0, "epr-21576e.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 3, "bios3", "epr-21576d (Japan)" )
|
||||
|
@ -100,9 +100,9 @@ const BIOS_t BIOS[] =
|
|||
//ROM_SYSTEM_BIOS( 7, "bios7", "epr-21576 (Japan)" )
|
||||
//{ 0, "epr-21576.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 8, "bios8", "epr-21578h (Export)" )
|
||||
{ 2, "epr-21578h.ic27", 0x000000, 0x200000 },
|
||||
{ 2, "epr-21578h.ic27", 0x000000, 0x200000, 0x7b452946 },
|
||||
//ROM_SYSTEM_BIOS( 9, "bios9", "epr-21578g (Export)" )
|
||||
//{ 2, "epr-21578g.ic27", 0x000000, 0x200000 },
|
||||
{ 2, "epr-21578g.ic27", 0x000000, 0x200000, 0x55413214 },
|
||||
//ROM_SYSTEM_BIOS( 10, "bios10", "epr-21578f (Export)" )
|
||||
//{ 2, "epr-21578f.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 11, "bios11", "epr-21578e (Export)" )
|
||||
|
@ -112,9 +112,9 @@ const BIOS_t BIOS[] =
|
|||
//ROM_SYSTEM_BIOS( 13, "bios13", "epr-21578a (Export)" )
|
||||
//{ 2, "epr-21578a.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 14, "bios14", "epr-21577h (USA)" )
|
||||
{ 1, "epr-21577h.ic27", 0x000000, 0x200000 },
|
||||
{ 1, "epr-21577h.ic27", 0x000000, 0x200000, 0xfdf17452 },
|
||||
//ROM_SYSTEM_BIOS( 15, "bios15", "epr-21577g (USA)" )
|
||||
//{ 1, "epr-21577g.ic27", 0x000000, 0x200000 },
|
||||
{ 1, "epr-21577g.ic27", 0x000000, 0x200000, 0x25f64af7 },
|
||||
//ROM_SYSTEM_BIOS( 16, "bios16", "epr-21577e (USA)" )
|
||||
//{ 1, "epr-21577e.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 17, "bios17", "epr-21577d (USA)" )
|
||||
|
@ -122,7 +122,7 @@ const BIOS_t BIOS[] =
|
|||
//ROM_SYSTEM_BIOS( 18, "bios18", "epr-21577a (USA)" )
|
||||
//{ 1, "epr-21577a.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 19, "bios19", "epr-21579d (Korea)" )
|
||||
{ 3, "epr-21579d.ic27", 0x000000, 0x200000 },
|
||||
{ 3, "epr-21579d.ic27", 0x000000, 0x200000, 0x33513691 },
|
||||
//ROM_SYSTEM_BIOS( 20, "bios20", "epr-21579 (Korea)" )
|
||||
//{ 3, "epr-21579.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 21, "bios21", "Set4 Dev BIOS" )
|
||||
|
@ -134,40 +134,30 @@ const BIOS_t BIOS[] =
|
|||
//ROM_SYSTEM_BIOS( 24, "bios24", "Development ROM Board" )
|
||||
//{ 3, "zukinver0930.ic25", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 25, "bios25", "epr-21576h (multi-region hack)" )
|
||||
//{ 3, "epr-21576h_multi.ic27", 0x000000, 0x200000 },
|
||||
{ 0, NULL, 0, 0 },
|
||||
}
|
||||
},
|
||||
{
|
||||
"naomigd",
|
||||
{
|
||||
//ROM_SYSTEM_BIOS( 0, "bios0", "epr-21576e (Japan)" )
|
||||
//{ 0, "epr-21576e.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 1, "bios1", "epr-21576g (Japan)" )
|
||||
//{ 0, "epr-21576g.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 2, "bios2", "epr-21576h (Japan)" )
|
||||
{ 0, "epr-21576h.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 3, "bios3", "epr-21578h (Export)" )
|
||||
{ 2, "epr-21578h.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 4, "bios4", "epr-21578g (Export)" )
|
||||
//{ 0, "epr-21578g.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 5, "bios5", "epr-21578e (Export)" )
|
||||
//{ 0, "epr-21578e.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 6, "bios6", "epr-21577h (USA)" )
|
||||
{ 1, "epr-21577h.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 7, "bios7", "epr-21577g (USA)" )
|
||||
//{ 0, "epr-21577g.ic27", 0x000000, 0x200000 },
|
||||
//ROM_SYSTEM_BIOS( 8, "bios8", "epr-21577e (USA)" )
|
||||
//{ 0, "epr-21577e.ic27", 0x000000, 0x200000 },
|
||||
{ 0, NULL, 0, 0 },
|
||||
// The default dipswitch configuration selects Korea for the multiregion hacked BIOS
|
||||
// See hw/maple/maple_jvs.cpp
|
||||
{ 3, "epr-21576h_multi.ic27", 0x000000, 0x200000, 0xcce01f1f },
|
||||
}
|
||||
},
|
||||
{
|
||||
"naomi2",
|
||||
{
|
||||
{ 0, "epr-23605c.ic27", 0x000000, 0x200000 },
|
||||
{ 1, "epr-23607c.ic27", 0x000000, 0x200000 },
|
||||
{ 2, "epr-23608c.ic27", 0x000000, 0x200000 },
|
||||
// epr-23605c (Japan)
|
||||
{ 0, "epr-23605c.ic27", 0x000000, 0x200000, 0x297ea6ed },
|
||||
// epr-23605b (Japan)
|
||||
{ 0, "epr-23605b.ic27", 0x000000, 0x200000, 0x3a3242d4 },
|
||||
// epr-23607c (USA)
|
||||
{ 1, "epr-23607c.ic27", 0x000000, 0x200000, 0x750e254b },
|
||||
// epr-23607b (USA)
|
||||
{ 1, "epr-23607b.ic27", 0x000000, 0x200000, 0xf308c5e9 },
|
||||
// epr-23608c (Export)
|
||||
{ 2, "epr-23608c.ic27", 0x000000, 0x200000, 0x6ef1dd8e },
|
||||
// epr-23608b (Export)
|
||||
{ 2, "epr-23608b.ic27", 0x000000, 0x200000, 0xa554b1e3 },
|
||||
// epr-23609b (Korea)
|
||||
{ 3, "epr-23609b.ic27", 0x000000, 0x200000, 0x99e3751f },
|
||||
// epr-23605c (multi-region hack)
|
||||
{ 3, "epr-23605c_multi.ic27", 0x000000, 0x200000, 0x353fdbcd },
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -59,8 +59,6 @@ struct BIOS_t
|
|||
u32 offset;
|
||||
u32 length;
|
||||
u32 crc;
|
||||
BlobType blob_type;
|
||||
u32 src_offset; // For copy
|
||||
} blobs[MAX_GAME_FILES];
|
||||
};
|
||||
extern const BIOS_t BIOS[];
|
||||
|
|
|
@ -1461,21 +1461,27 @@ static void gui_display_settings()
|
|||
if (ImGui::BeginTabItem("General"))
|
||||
{
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, normal_padding);
|
||||
const char *languages[] = { "Japanese", "English", "German", "French", "Spanish", "Italian", "Default" };
|
||||
OptionComboBox("Language", config::Language, languages, std::size(languages),
|
||||
"The language as configured in the Dreamcast BIOS");
|
||||
{
|
||||
DisabledScope scope(settings.platform.isArcade());
|
||||
|
||||
const char *broadcast[] = { "NTSC", "PAL", "PAL/M", "PAL/N", "Default" };
|
||||
OptionComboBox("Broadcast", config::Broadcast, broadcast, std::size(broadcast),
|
||||
"TV broadcasting standard for non-VGA modes");
|
||||
const char *languages[] = { "Japanese", "English", "German", "French", "Spanish", "Italian", "Default" };
|
||||
OptionComboBox("Language", config::Language, languages, std::size(languages),
|
||||
"The language as configured in the Dreamcast BIOS");
|
||||
|
||||
const char *region[] = { "Japan", "USA", "Europe", "Default" };
|
||||
OptionComboBox("Region", config::Region, region, std::size(region),
|
||||
const char *broadcast[] = { "NTSC", "PAL", "PAL/M", "PAL/N", "Default" };
|
||||
OptionComboBox("Broadcast", config::Broadcast, broadcast, std::size(broadcast),
|
||||
"TV broadcasting standard for non-VGA modes");
|
||||
}
|
||||
|
||||
const char *consoleRegion[] = { "Japan", "USA", "Europe", "Default" };
|
||||
const char *arcadeRegion[] = { "Japan", "USA", "Export", "Korea" };
|
||||
const char **region = settings.platform.isArcade() ? arcadeRegion : consoleRegion;
|
||||
OptionComboBox("Region", config::Region, region, std::size(consoleRegion),
|
||||
"BIOS region");
|
||||
|
||||
const char *cable[] = { "VGA", "RGB Component", "TV Composite" };
|
||||
{
|
||||
DisabledScope scope(config::Cable.isReadOnly());
|
||||
DisabledScope scope(config::Cable.isReadOnly() || settings.platform.isArcade());
|
||||
|
||||
const char *value = config::Cable == 0 ? cable[0]
|
||||
: config::Cable > 0 && config::Cable <= (int)std::size(cable) ? cable[config::Cable - 1]
|
||||
|
@ -1492,9 +1498,9 @@ static void gui_display_settings()
|
|||
}
|
||||
ImGui::EndCombo();
|
||||
}
|
||||
ImGui::SameLine();
|
||||
ShowHelpMarker("Video connection type");
|
||||
}
|
||||
ImGui::SameLine();
|
||||
ShowHelpMarker("Video connection type");
|
||||
|
||||
#if !defined(TARGET_IPHONE)
|
||||
ImVec2 size;
|
||||
|
|
Loading…
Reference in New Issue