diff --git a/core/hw/maple/maple_devs.cpp b/core/hw/maple/maple_devs.cpp index f6188b298..699c45ca7 100755 --- a/core/hw/maple/maple_devs.cpp +++ b/core/hw/maple/maple_devs.cpp @@ -1418,9 +1418,33 @@ struct atomiswave_lightgun : maple_lightgun } }; -char EEPROM[0x100]; +u8 EEPROM[0x100]; bool EEPROM_loaded = false; +void load_naomi_eeprom() +{ + if (!EEPROM_loaded) + { + EEPROM_loaded = true; + std::string nvmemSuffix = cfgLoadStr("net", "nvmem", ""); + std::string eeprom_file = get_game_save_prefix() + nvmemSuffix + ".eeprom"; + FILE* f = fopen(eeprom_file.c_str(), "rb"); + if (f) + { + fread(EEPROM, 1, 0x80, f); + fclose(f); + DEBUG_LOG(MAPLE, "Loaded EEPROM from %s", eeprom_file.c_str()); + } + else if (naomi_default_eeprom != NULL) + { + DEBUG_LOG(MAPLE, "Using default EEPROM file"); + memcpy(EEPROM, naomi_default_eeprom, 0x80); + } + else + DEBUG_LOG(MAPLE, "EEPROM file not found at %s and no default found", eeprom_file.c_str()); + } +} + u32 naomi_button_mapping[] = { NAOMI_SERVICE_KEY, // DC_BTN_C NAOMI_BTN1_KEY, // DC_BTN_B @@ -2153,6 +2177,7 @@ struct maple_naomi_jamma : maple_sega_controller case 0x0B: //EEPROM write { + load_naomi_eeprom(); int address = dma_buffer_in[1]; int size = dma_buffer_in[2]; DEBUG_LOG(MAPLE, "EEprom write %08X %08X\n", address, size); @@ -2183,26 +2208,7 @@ struct maple_naomi_jamma : maple_sega_controller case 0x3: //EEPROM read { - if (!EEPROM_loaded) - { - EEPROM_loaded = true; - std::string nvmemSuffix = cfgLoadStr("net", "nvmem", ""); - std::string eeprom_file = get_game_save_prefix() + nvmemSuffix + ".eeprom"; - FILE* f = fopen(eeprom_file.c_str(), "rb"); - if (f) - { - fread(EEPROM, 1, 0x80, f); - fclose(f); - DEBUG_LOG(MAPLE, "Loaded EEPROM from %s", eeprom_file.c_str()); - } - else if (naomi_default_eeprom != NULL) - { - DEBUG_LOG(MAPLE, "Using default EEPROM file"); - memcpy(EEPROM, naomi_default_eeprom, 0x80); - } - else - DEBUG_LOG(MAPLE, "EEPROM file not found at %s and no default found", eeprom_file.c_str()); - } + load_naomi_eeprom(); //printf("EEprom READ\n"); int address = dma_buffer_in[1]; //printState(Command,buffer_in,buffer_in_len); diff --git a/core/hw/maple/maple_devs.h b/core/hw/maple/maple_devs.h index 88b750907..d1505381f 100755 --- a/core/hw/maple/maple_devs.h +++ b/core/hw/maple/maple_devs.h @@ -133,6 +133,9 @@ void limit_joystick_magnitude(s8& joyx, s8& joyy) } } +extern u8 EEPROM[0x100]; +void load_naomi_eeprom(); + // Mouse position and buttons extern u32 mo_buttons; extern s32 mo_x_abs; diff --git a/core/hw/maple/maple_helper.cpp b/core/hw/maple/maple_helper.cpp index 12b57c197..095dd5fb9 100644 --- a/core/hw/maple/maple_helper.cpp +++ b/core/hw/maple/maple_helper.cpp @@ -1,11 +1,6 @@ #include "maple_helper.h" #include "maple_if.h" -u32 maple_GetBusId(u32 addr) -{ - return addr>>6; -} - u32 maple_GetPort(u32 addr) { for (int i=0;i<6;i++) @@ -26,12 +21,3 @@ u32 maple_GetAttachedDevices(u32 bus) return rv; } - -//device : 0 .. 4 -> subdevice , 5 -> main device :) -u32 maple_GetAddress(u32 bus,u32 port) -{ - u32 rv=bus<<6; - rv|=1<> 6; +} + u32 maple_GetPort(u32 addr); u32 maple_GetAttachedDevices(u32 bus); -u32 maple_GetAddress(u32 bus,u32 port); \ No newline at end of file + +//device : 0 .. 4 -> subdevice , 5 -> main device :) +static inline u32 maple_GetAddress(u32 bus, u32 port) +{ + u32 rv = bus << 6; + rv |= 1 << port; + + return rv; +} diff --git a/core/hw/naomi/naomi_flashrom.cpp b/core/hw/naomi/naomi_flashrom.cpp new file mode 100644 index 000000000..d52e39624 --- /dev/null +++ b/core/hw/naomi/naomi_flashrom.cpp @@ -0,0 +1,124 @@ +/* + Created on: Apr 19, 2020 + + Copyright 2020 flyinghead + + This file is part of flycast. + + flycast is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + flycast is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with flycast. If not, see . + */ +#include "naomi_flashrom.h" +#include "hw/flashrom/flashrom.h" +#include "hw/holly/sb_mem.h" +#include "hw/maple/maple_devs.h" + +extern MemChip *sys_nvmem; + +static u16 eeprom_crc(const u8 *buf, int size) +{ + int n = 0xdebdeb00; + + for (int i = 0; i < size; i++) + { + n &= 0xffffff00; + n += buf[i]; + + for (int c = 0; c < 8; c++) + { + if (n & 0x80000000) + n = (n << 1) + 0x10210000; + else + n <<= 1; + } + } + for (int c = 0; c < 8; c++) + { + if (n & 0x80000000) + n = (n << 1) + 0x10210000; + else + n <<= 1; + } + + return n >> 16; +} + +// +// bbsram layout: +// not totally reveng'ed but there's one fixed-size record, +// followed by a variable-size record starting at 1F8 +// where the interesting stuff is. +// Offset Size +// 0x1f8 2 CRC of bytes [218,218+size[ +// 0x1fa 2 0 +// 0x1fc 4 record size +// 0x200 4 record padded size (crc is done on this) +// 0x204 4 0 +// 0x208 16 Same header repeated +// 0x218 size*2 Record data, repeated twice +// +void write_naomi_flash(u32 addr, u8 value) +{ + addr &= sys_nvmem->mask; + verify(addr >= 0x218); + u32 block_size = sys_nvmem->Read(0x200, 4); + if (addr >= 0x218 + block_size || 0x218 + block_size * 2 > sys_nvmem->size) + { + WARN_LOG(NAOMI, "NVMEM record doesn't exist or is too short"); + return; + } + sys_nvmem->data[addr] = value; + sys_nvmem->data[addr + block_size] = value; + u16 crc = eeprom_crc(&sys_nvmem->data[0x218], block_size); + *(u16 *)&sys_nvmem->data[0x1f8] = crc; + *(u16 *)&sys_nvmem->data[0x208] = crc; +} + +// +// eeprom layout: +// Offset Size +// 0 2 CRC of bytes [2,17] +// 2 1 size of record (16, sometimes 1, ignored) +// 3 15 data +// 18 18 same record repeated +// 36 2 CRC of bytes [44,44+size[ +// 38 1 record size +// 39 1 record padded size (crc is done on this) +// 40 4 Same header repeated +// 44 size*2 Record data, repeated twice +// +// The first record contains naomi bios settings, and the second one game-specific settings +// +void write_naomi_eeprom(u32 offset, u8 value) +{ + load_naomi_eeprom(); + if (offset >= 3 && offset < 20) + { + EEPROM[offset] = value; + EEPROM[offset + 18] = value; + + u16 crc = eeprom_crc((u8 *)EEPROM + 2, 16); + *(u16 *)&EEPROM[0] = crc; + *(u16 *)&EEPROM[18] = crc; + } + else if (offset >= 44 && (int)offset - 44 < EEPROM[39]) + { + EEPROM[offset] = value; + EEPROM[offset + EEPROM[39]] = value; + u16 crc = eeprom_crc((u8 *)EEPROM + 44, EEPROM[39]); + *(u16 *)&EEPROM[36] = crc; + *(u16 *)&EEPROM[40] = crc; + } + else + die("Invalid offset"); +} diff --git a/core/hw/naomi/naomi_flashrom.h b/core/hw/naomi/naomi_flashrom.h new file mode 100644 index 000000000..4bede04bb --- /dev/null +++ b/core/hw/naomi/naomi_flashrom.h @@ -0,0 +1,25 @@ +/* + Created on: Apr 19, 2020 + + Copyright 2020 flyinghead + + This file is part of flycast. + + flycast is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + flycast is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with flycast. If not, see . + */ +#pragma once +#include "types.h" + +void write_naomi_flash(u32 addr, u8 value); +void write_naomi_eeprom(u32 offset, u8 value); diff --git a/core/hw/naomi/naomi_roms.h b/core/hw/naomi/naomi_roms.h index 003935e02..f3db5e3dd 100644 --- a/core/hw/naomi/naomi_roms.h +++ b/core/hw/naomi/naomi_roms.h @@ -3291,7 +3291,10 @@ Games[] = { "mpr-23339.ic16s",0x8000000, 0x0800000 }, { "mpr-23340.ic17s",0x8800000, 0x0800000 }, { NULL, 0, 0 }, - } + }, + NULL, + NULL, + slashout_eeprom_dump }, // Sega Marine Fishing { @@ -3828,7 +3831,8 @@ Games[] = { NULL, 0, 0 }, }, NULL, - &vonot_inputs + &vonot_inputs, + vonot_eeprom_dump }, // Virtua Striker 2 Ver. 2000 (JPN, USA, EXP, KOR, AUS) (Rev C) { @@ -3942,6 +3946,7 @@ Games[] = }, NULL, &wrungp_inputs, + wrungp_eeprom_dump }, // Wave Runner GP (USA, Rev A) { @@ -3972,6 +3977,7 @@ Games[] = }, NULL, &wrungp_inputs, + wrungp_eeprom_dump }, // World Kicks (WK2 Ver. A) { @@ -4938,10 +4944,12 @@ Games[] = ROT0, { { "317-5069-com.pic", 0, 0x4000 }, - { "gundmgd-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, + //{ "gundmgd-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, { NULL, 0, 0 }, }, "gdl-0001", + NULL, + gundmct_eeprom_dump }, // Mobile Suit Gundam: Federation Vs. Zeon DX (USA, Japan) (GDL-0006) { @@ -4956,10 +4964,12 @@ Games[] = ROT0, { { "317-5079-com.pic", 0, 0x4000 }, - { "gundmxgd-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, + //{ "gundmxgd-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, { NULL, 0, 0 }, }, "gdl-0006", + NULL, + gundmxgd_eeprom_dump }, // Ikaruga (GDL-0010) { @@ -5485,6 +5495,8 @@ Games[] = { NULL, 0, 0 }, }, "gds-0004", + NULL, + slashout_eeprom_dump }, // Spikers Battle (GDS-0005) { @@ -5502,6 +5514,8 @@ Games[] = { NULL, 0, 0 }, }, "gds-0005", + NULL, + spkrbtl_eeprom_dump }, // Sports Jam (GDS-0003) { diff --git a/core/hw/naomi/naomi_roms_eeprom.h b/core/hw/naomi/naomi_roms_eeprom.h index 8941e656e..01cf39b71 100644 --- a/core/hw/naomi/naomi_roms_eeprom.h +++ b/core/hw/naomi/naomi_roms_eeprom.h @@ -89,12 +89,23 @@ static u8 alienfnt_eeprom_dump[] = { }; static u8 gundmct_eeprom_dump[] = { - 0xC1, 0xC1, 0x10, 0x42, 0x43, 0x56, 0x30, 0x09, 0x00, 0x0B, 0x02, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, - 0xC1, 0xC1, 0x10, 0x42, 0x43, 0x56, 0x30, 0x09, 0x00, 0x0B, 0x02, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xbe, 0x46, 0x10, 0x42, 0x43, 0x56, 0x30, 0x18, 0x00, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0xbe, 0x46, 0x10, 0x42, 0x43, 0x56, 0x30, 0x18, 0x00, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x78, 0x1e, 0x10, 0x10, 0x78, 0x1e, 0x10, 0x10, 0x30, 0x56, 0x43, 0x42, 0x01, 0x05, 0x01, 0x01, 0x01, 0x00, + 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x30, 0x56, 0x43, 0x42, 0x01, 0x05, 0x01, 0x01, 0x01, 0x00, 0x02, 0x00, + 0x02, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 +}; + +static u8 gundmxgd_eeprom_dump[] = { + 0xd9, 0xd2, 0x10, 0x42, 0x44, 0x55, 0x30, 0x18, 0x00, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0xd9, 0xd2, 0x10, 0x42, 0x44, 0x55, 0x30, 0x18, 0x00, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x65, 0x4b, 0x20, 0x20, 0x65, 0x4b, 0x20, 0x20, 0x30, 0x55, 0x44, 0x42, 0x01, 0x05, 0x01, 0x01, 0x01, 0x00, + 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x55, 0x44, 0x42, 0x01, 0x05, 0x01, 0x01, 0x01, 0x00, 0x02, 0x00, 0x02, 0x02, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -111,11 +122,11 @@ static u8 kick4csh_eeprom_dump[] = { }; static u8 hmgeo_eeprom_dump[] = { - 0xCA, 0xFB, 0x10, 0x42, 0x43, 0x57, 0x30, 0x09, 0x10, 0x00, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, - 0xCA, 0xFB, 0x10, 0x42, 0x43, 0x57, 0x30, 0x09, 0x10, 0x00, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, - 0xED, 0x2A, 0x20, 0x20, 0xED, 0x2A, 0x20, 0x20, 0x06, 0x06, 0x01, 0x20, 0x03, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x6d, 0x46, 0x10, 0x42, 0x43, 0x57, 0x30, 0x18, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x6d, 0x46, 0x10, 0x42, 0x43, 0x57, 0x30, 0x18, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x69, 0x61, 0x20, 0x20, 0x69, 0x61, 0x20, 0x20, 0x06, 0x06, 0x01, 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x01, 0x20, 0x03, 0x00, 0x00, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x01, 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 @@ -143,4 +154,48 @@ static u8 ringout_eeprom_dump[] = { 0x00, 0x00 }; +static u8 slashout_eeprom_dump[] = { + 0x7f, 0x5d, 0x10, 0x42, 0x43, 0x45, 0x30, 0x18, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x7f, 0x5d, 0x10, 0x42, 0x43, 0x45, 0x30, 0x18, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0xc6, 0xa4, 0x08, 0x08, 0xc6, 0xa4, 0x08, 0x08, 0x42, 0x43, 0x45, 0x30, 0x00, 0x02, 0x00, 0x00, 0x42, 0x43, + 0x45, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 +}; + +static u8 spkrbtl_eeprom_dump[] = { + 0x42, 0xec, 0x10, 0x42, 0x43, 0x5a, 0x30, 0x18, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x42, 0xec, 0x10, 0x42, 0x43, 0x5a, 0x30, 0x18, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0xd5, 0x9f, 0x10, 0x10, 0xd5, 0x9f, 0x10, 0x10, 0x42, 0x43, 0x5a, 0x30, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, + 0xc0, 0x12, 0x2c, 0x01, 0x01, 0x00, 0x42, 0x43, 0x5a, 0x30, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0xc0, 0x12, + 0x2c, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 +}; + +static u8 vonot_eeprom_dump[] = { + 0x93, 0xac, 0x10, 0x42, 0x42, 0x56, 0x30, 0x18, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x93, 0xac, 0x10, 0x42, 0x42, 0x56, 0x30, 0x18, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0xb7, 0x0a, 0x1c, 0x1c, 0xb7, 0x0a, 0x1c, 0x1c, 0x66, 0x05, 0x4f, 0x56, 0x06, 0x00, 0x08, 0x00, 0x02, 0x02, + 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, + 0x66, 0x05, 0x4f, 0x56, 0x06, 0x00, 0x08, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 +}; + +static u8 wrungp_eeprom_dump[] = { + 0x53, 0x45, 0x10, 0x42, 0x44, 0x44, 0x34, 0x18, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x53, 0x45, 0x10, 0x42, 0x44, 0x44, 0x34, 0x18, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x89, 0x55, 0x22, 0x24, 0x89, 0x55, 0x22, 0x24, 0x42, 0x44, 0x44, 0x34, 0x01, 0x01, 0x01, 0x00, 0x01, 0x02, + 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x81, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, 0x44, 0x34, 0x01, 0x01, 0x01, 0x00, 0x01, 0x02, + 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x81, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 +}; + #endif /* CORE_HW_NAOMI_NAOMI_ROMS_EEPROM_H_ */ diff --git a/core/network/naomi_network.cpp b/core/network/naomi_network.cpp index 81d1fdf2c..908689659 100644 --- a/core/network/naomi_network.cpp +++ b/core/network/naomi_network.cpp @@ -24,6 +24,8 @@ #include #include #include "rend/gui.h" +#include "hw/naomi/naomi_cart.h" +#include "hw/naomi/naomi_flashrom.h" sock_t NaomiNetwork::createAndBind(int protocol) { @@ -55,6 +57,8 @@ sock_t NaomiNetwork::createAndBind(int protocol) bool NaomiNetwork::init() { + if (!settings.network.Enable) + return false; #ifdef _WIN32 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) @@ -474,3 +478,70 @@ void NaomiNetwork::terminate() server_sock = INVALID_SOCKET; } } + +// Sets the game network config using MIE eeprom or bbsram: +// Node -1 disables network +// Node 0 is master, nodes 1+ are slave +void SetNaomiNetworkConfig(int node) +{ + if (!strcmp("ALIEN FRONT", naomi_game_id)) + { + // no way to disable the network + write_naomi_eeprom(0x3f, node == 0 ? 0 : 1); + } + else if (!strcmp("MOBILE SUIT GUNDAM JAPAN", naomi_game_id) // gundmct + || !strcmp("MOBILE SUIT GUNDAM DELUXE JAPAN", naomi_game_id)) // gundmxgd + { + write_naomi_eeprom(0x38, node == -1 ? 2 + : node == 0 ? 0 : 1); + } + else if (!strcmp(" BIOHAZARD GUN SURVIVOR2", naomi_game_id)) + { + // FIXME need default flash + write_naomi_flash(0x21c, node == 0 ? 0 : 1); // CPU ID - 1 + write_naomi_flash(0x22a, node == -1 ? 0 : 1); // comm link on + } + else if (!strcmp("HEAVY METAL JAPAN", naomi_game_id)) + { + write_naomi_eeprom(0x31, node == -1 ? 0 : node == 0 ? 1 : 2); + } + else if (!strcmp("OUTTRIGGER JAPAN", naomi_game_id)) + { + // FIXME need default flash + write_naomi_flash(0x21a, node == -1 ? 0 : 1); // network on + write_naomi_flash(0x21b, node); // node id + } + else if (!strcmp("SLASHOUT JAPAN VERSION", naomi_game_id)) + { + write_naomi_eeprom(0x30, node == -1 ? 0 + : node == 0 ? 1 : 2); + } + else if (!strcmp("SPAWN JAPAN", naomi_game_id)) + { + write_naomi_eeprom(0x44, node == -1 ? 0 : 1); // network on + write_naomi_eeprom(0x30, node <= 0 ? 1 : 2); // node id + } + else if (!strcmp("SPIKERS BATTLE JAPAN VERSION", naomi_game_id)) + { + write_naomi_eeprom(0x30, node == -1 ? 0 + : node == 0 ? 1 : 2); + } + else if (!strcmp("VIRTUAL-ON ORATORIO TANGRAM", naomi_game_id)) + { + write_naomi_eeprom(0x45, node == -1 ? 3 + : node == 0 ? 0 : 1); + write_naomi_eeprom(0x47, node == 0 ? 0 : 1); + } + else if (!strcmp("WAVE RUNNER GP", naomi_game_id)) + { + write_naomi_eeprom(0x33, node); + write_naomi_eeprom(0x35, node == -1 ? 2 + : node == 0 ? 0 : 1); + } + else if (!strcmp("WORLD KICKS", naomi_game_id)) + { + // FIXME need default flash + write_naomi_flash(0x224, node == -1 ? 0 : 1); // network on + write_naomi_flash(0x220, node == 0 ? 0 : 1); // node id + } +} diff --git a/core/network/naomi_network.h b/core/network/naomi_network.h index e219204b4..f24c609f3 100644 --- a/core/network/naomi_network.h +++ b/core/network/naomi_network.h @@ -73,3 +73,5 @@ private: static const uint16_t SERVER_PORT = 37391; }; + +void SetNaomiNetworkConfig(int node); diff --git a/core/nullDC.cpp b/core/nullDC.cpp index 8ac2f1aa3..9f7bd5481 100755 --- a/core/nullDC.cpp +++ b/core/nullDC.cpp @@ -28,6 +28,7 @@ #include "cheats.h" #include "rend/CustomTexture.h" #include "hw/maple/maple_devs.h" +#include "network/naomi_network.h" void FlushCache(); void LoadCustom(); @@ -635,7 +636,11 @@ void dc_start_game(const char *path) naomi_cart_LoadRom(path); LoadCustom(); if (settings.platform.system == DC_PLATFORM_NAOMI) + { mcfg_CreateNAOMIJamma(); + SetNaomiNetworkConfig(settings.network.Enable ? settings.network.ActAsServer ? 0 : 1 // FIXME more than 2 nodes + : -1); + } else if (settings.platform.system == DC_PLATFORM_ATOMISWAVE) mcfg_CreateAtomisWaveControllers(); } @@ -798,6 +803,7 @@ void InitSettings() settings.input.maple_expansion_devices[i][0] = i == 0 ? MDT_SegaVMU : MDT_None; settings.input.maple_expansion_devices[i][1] = i == 0 ? MDT_SegaVMU : MDT_None; } + settings.network.Enable = false; settings.network.ActAsServer = false; settings.network.dns = "46.101.91.123"; // Dreamcast Live DNS settings.network.server = ""; @@ -904,6 +910,7 @@ void LoadSettings(bool game_specific) sprintf(device_name, "device%d.2", i + 1); settings.input.maple_expansion_devices[i][1] = (MapleDeviceType)cfgLoadInt(input_section, device_name, settings.input.maple_expansion_devices[i][1]); } + settings.network.Enable = cfgLoadBool("network", "Enable", settings.network.Enable); settings.network.ActAsServer = cfgLoadBool("network", "ActAsServer", settings.network.ActAsServer); settings.network.dns = cfgLoadStr("network", "DNS", settings.network.dns.c_str()); settings.network.server = cfgLoadStr("network", "server", settings.network.server.c_str()); @@ -1064,6 +1071,7 @@ void SaveSettings() } cfgSaveStr("config", "Dreamcast.ContentPath", paths.c_str()); cfgSaveBool("config", "Dreamcast.HideLegacyNaomiRoms", settings.dreamcast.HideLegacyNaomiRoms); + cfgSaveBool("network", "Enable", settings.network.Enable); cfgSaveBool("network", "ActAsServer", settings.network.ActAsServer); cfgSaveStr("network", "DNS", settings.network.dns.c_str()); cfgSaveStr("network", "server", settings.network.server.c_str()); diff --git a/core/rend/gui.cpp b/core/rend/gui.cpp index 5058a21b3..f587b0639 100644 --- a/core/rend/gui.cpp +++ b/core/rend/gui.cpp @@ -1304,15 +1304,21 @@ static void gui_display_settings() } if (ImGui::CollapsingHeader("Network", ImGuiTreeNodeFlags_DefaultOpen)) { - ImGui::Checkbox("Act as Server", &settings.network.ActAsServer); - ImGui::SameLine(); - ShowHelpMarker("Create a local server for Naomi network games"); - char server_name[256]; - strcpy(server_name, settings.network.server.c_str()); - ImGui::InputText("Server", server_name, sizeof(server_name), ImGuiInputTextFlags_CharsNoBlank, nullptr, nullptr); - ImGui::SameLine(); - ShowHelpMarker("The server to connect to. Leave blank to find a server automatically"); - settings.network.server = server_name; + ImGui::Checkbox("Enable", &settings.network.Enable); + ImGui::SameLine(); + ShowHelpMarker("Enable networking for supported Naomi games"); + if (settings.network.Enable) + { + ImGui::Checkbox("Act as Server", &settings.network.ActAsServer); + ImGui::SameLine(); + ShowHelpMarker("Create a local server for Naomi network games"); + char server_name[256]; + strcpy(server_name, settings.network.server.c_str()); + ImGui::InputText("Server", server_name, sizeof(server_name), ImGuiInputTextFlags_CharsNoBlank, nullptr, nullptr); + ImGui::SameLine(); + ShowHelpMarker("The server to connect to. Leave blank to find a server automatically"); + settings.network.server = server_name; + } } if (ImGui::CollapsingHeader("Other", ImGuiTreeNodeFlags_DefaultOpen)) { diff --git a/core/serialize.cpp b/core/serialize.cpp index 010de1931..12c5f50fd 100644 --- a/core/serialize.cpp +++ b/core/serialize.cpp @@ -98,7 +98,7 @@ extern GD_StatusT GDStatus; extern ByteCount_t ByteCount ; //./core/hw/maple/maple_devs.o -extern char EEPROM[0x100]; +extern u8 EEPROM[0x100]; extern bool EEPROM_loaded; //./core/hw/maple/maple_if.o diff --git a/core/types.h b/core/types.h index 698659028..6ba597aa8 100644 --- a/core/types.h +++ b/core/types.h @@ -534,6 +534,7 @@ struct settings_t } input; struct { + bool Enable; bool ActAsServer; std::string dns; std::string server; diff --git a/shell/apple/emulator-osx/reicast-osx.xcodeproj/project.pbxproj b/shell/apple/emulator-osx/reicast-osx.xcodeproj/project.pbxproj index 6c72d2fa8..c28b68b53 100644 --- a/shell/apple/emulator-osx/reicast-osx.xcodeproj/project.pbxproj +++ b/shell/apple/emulator-osx/reicast-osx.xcodeproj/project.pbxproj @@ -250,6 +250,7 @@ AE8C274321122E2500D4D8F4 /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE8C273D21122E2500D4D8F4 /* xbrz.cpp */; }; AE90679B235B6F6400CE473C /* gl_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE90679A235B6F6400CE473C /* gl_context.cpp */; }; AE90679D235DF80400CE473C /* osd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE90679C235DF80400CE473C /* osd.cpp */; }; + AEA94931244CDF50001134C7 /* naomi_flashrom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AEA9492F244CDF50001134C7 /* naomi_flashrom.cpp */; }; AED73BAE22FC0E9600ECDB64 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = AED73BAD22FC0E9600ECDB64 /* README.md */; }; AED73DC42303E19200ECDB64 /* sdl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AED73DC02303E19100ECDB64 /* sdl.cpp */; }; AED73DCC233ACC9800ECDB64 /* cheats.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AED73DCB233ACC9800ECDB64 /* cheats.cpp */; }; @@ -815,6 +816,8 @@ AE8C274021122E2500D4D8F4 /* xbrz_tools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbrz_tools.h; sourceTree = ""; }; AE90679A235B6F6400CE473C /* gl_context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gl_context.cpp; sourceTree = ""; }; AE90679C235DF80400CE473C /* osd.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = osd.cpp; sourceTree = ""; }; + AEA9492F244CDF50001134C7 /* naomi_flashrom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = naomi_flashrom.cpp; sourceTree = ""; }; + AEA94930244CDF50001134C7 /* naomi_roms_eeprom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = naomi_roms_eeprom.h; sourceTree = ""; }; AED73BAD22FC0E9600ECDB64 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../../../core/README.md; sourceTree = ""; }; AED73DC02303E19100ECDB64 /* sdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sdl.cpp; sourceTree = ""; }; AED73DC12303E19100ECDB64 /* sdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sdl.h; sourceTree = ""; }; @@ -2070,8 +2073,10 @@ AE2A2D5021D6846F004B308D /* m1cartridge.h */, AE2A2D5621D68470004B308D /* m4cartridge.cpp */, AE2A2D5421D68470004B308D /* m4cartridge.h */, + AEA9492F244CDF50001134C7 /* naomi_flashrom.cpp */, AE7BCB6C24460910007285F8 /* naomi_m3comm.cpp */, AE7BCB6D24460910007285F8 /* naomi_m3comm.h */, + AEA94930244CDF50001134C7 /* naomi_roms_eeprom.h */, AE2A2D5821D68470004B308D /* naomi_roms_input.h */, AE2A2D5521D68470004B308D /* naomi_roms.h */, AE80EDB92157D4E600F7800F /* naomi.cpp */, @@ -2754,6 +2759,7 @@ 8491687F1B782B2D00F3F2B4 /* ini.cpp in Sources */, 84B7BF341B72720200F9733F /* maple_cfg.cpp in Sources */, AE649C2D218C553A00EF4A81 /* LzmaDec.c in Sources */, + AEA94931244CDF50001134C7 /* naomi_flashrom.cpp in Sources */, AE649C3D218C555600EF4A81 /* chd.c in Sources */, AED73E762348E45000ECDB64 /* Scan.cpp in Sources */, AE649C25218C553A00EF4A81 /* Bra.c in Sources */, @@ -2990,7 +2996,7 @@ "USE_SDL=1", XXH_INLINE_ALL, VK_USE_PLATFORM_MACOS_MVK, - Z_HAVE_UNISTD_H + Z_HAVE_UNISTD_H, ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -3045,7 +3051,7 @@ "USE_SDL=1", XXH_INLINE_ALL, VK_USE_PLATFORM_MACOS_MVK, - Z_HAVE_UNISTD_H + Z_HAVE_UNISTD_H, ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;