diff --git a/core/hw/flashrom/flashrom.h b/core/hw/flashrom/flashrom.h index 15896eed4..cfc3588d4 100644 --- a/core/hw/flashrom/flashrom.h +++ b/core/hw/flashrom/flashrom.h @@ -197,6 +197,9 @@ struct SRamChip : MemChip // flash logical blocks #define FLASH_USER_SYSCFG 0x05 +#define FLASH_USER_INET 0x80 +#define FLASH_USER_ISP1 0xC0 +#define FLASH_USER_ISP2 0xC6 struct flash_syscfg_block { u16 block_id; @@ -211,6 +214,25 @@ struct flash_syscfg_block { u8 reserved[50]; }; +struct flash_isp1_block { + u16 block_id; + u8 _unknown[4]; + char sega[4]; + char username[28]; + char password[16]; + char phone[8]; + u16 crc; +}; + +struct flash_isp2_block { + u16 block_id; + char sega[4]; + char username[28]; + char password[16]; + char phone[12]; + u16 crc; +}; + // header block in block-allocated partition struct flash_header_block { char magic[16]; diff --git a/core/hw/holly/sb_mem.cpp b/core/hw/holly/sb_mem.cpp index fa8151bc4..209bb312d 100644 --- a/core/hw/holly/sb_mem.cpp +++ b/core/hw/holly/sb_mem.cpp @@ -39,6 +39,70 @@ static std::string getRomPrefix() } } +static void add_isp_to_nvmem(DCFlashChip *flash) +{ + u8 block[64]; + if (!flash->ReadBlock(FLASH_PT_USER, FLASH_USER_INET, block)) + { + memset(block, 0, sizeof(block)); + strcpy((char *)block + 2, "PWBrowser"); + block[12] = 0x1c; + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_INET, block); + + memset(block, 0, sizeof(block)); + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_INET + 1, block); + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_INET + 2, block); + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_INET + 3, block); + memset(block + 27, 0xFF, sizeof(block) - 27); + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_INET + 4, block); + memset(block, 0xFF, sizeof(block)); + for (u32 i = FLASH_USER_INET + 5; i <= 0xbf; i++) + flash->WriteBlock(FLASH_PT_USER, i, block); + + flash_isp1_block isp1; + memset(&isp1, 0, sizeof(isp1)); + isp1._unknown[0] = 0xFF; + isp1._unknown[1] = 0xFE; + isp1._unknown[2] = 0xFF; + isp1._unknown[3] = 0xFF; + memcpy(isp1.sega, "SEGA", 4); + strcpy(isp1.username, "flycast1"); + strcpy(isp1.password, "password"); + strcpy(isp1.phone, "1234567"); + if (flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP1, &isp1) != 1) + WARN_LOG(FLASHROM, "Failed to save ISP information to flash RAM"); + + memset(block, 0xFF, sizeof(block)); + block[34] = 0; + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP1 + 1, block); + memset(block, 0xFF, sizeof(block)); + block[9] = 0; + memset(block + 49, 0, 13); + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP1 + 2, block); + memset(block, 0xFF, sizeof(block)); + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP1 + 3, block); + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP1 + 4, block); + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP1 + 5, block); + + flash_isp2_block isp2; + memset(&isp2, 0, sizeof(isp2)); + memcpy(isp2.sega, "SEGA", 4); + strcpy(isp2.username, "flycast2"); + strcpy(isp2.password, "password"); + strcpy(isp2.phone, "1234567"); + if (flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP2, &isp2) != 1) + WARN_LOG(FLASHROM, "Failed to save ISP information to flash RAM"); + u8 block[64]; + memset(block, 0xFF, sizeof(block)); + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP2 + 1, block); + block[9] = 0; + memset(block + 49, 0, 13); + flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP2 + 2, block); + for (u32 i = FLASH_USER_ISP2 + 3; i <= 0xEA; i++) + flash->WriteBlock(FLASH_PT_USER, i, block); + } +} + static bool nvmem_load(const string& root) { bool rc; @@ -92,6 +156,8 @@ static bool nvmem_load(const string& root) if (static_cast(sys_nvmem)->WriteBlock(FLASH_PT_USER, FLASH_USER_SYSCFG, &syscfg) != 1) WARN_LOG(FLASHROM, "Failed to save time and language to flash RAM"); + + add_isp_to_nvmem(static_cast(sys_nvmem)); } if (settings.platform.system == DC_PLATFORM_ATOMISWAVE)