📄 memmap.cpp
字号:
ZeroMemory (BlockIsROM, MEMMAP_NUM_BLOCKS); ::SRAM = SRAM; memset (ROMId, 0, 5); memset (CompanyId, 0, 3); if (Memory.HiROM) { Memory.SRAMSize = ROM [0xffd8]; strncpy (ROMName, (char *) &ROM[0xffc0], ROM_NAME_LEN - 1); ROMSpeed = ROM [0xffd5]; ROMType = ROM [0xffd6]; ROMSize = ROM [0xffd7]; ROMChecksum = ROM [0xffde] + (ROM [0xffdf] << 8); ROMComplementChecksum = ROM [0xffdc] + (ROM [0xffdd] << 8); memmove (ROMId, &ROM [0xffb2], 4); memmove (CompanyId, &ROM [0xffb0], 2); // Try to auto-detect the DSP1 chip if (!Settings.ForceNoDSP1 && (ROMType & 0xf) >= 3 && (ROMType & 0xf0) == 0) Settings.DSP1Master = TRUE; Settings.SDD1 = Settings.ForceSDD1; if ((ROMType & 0xf0) == 0x40) Settings.SDD1 = !Settings.ForceNoSDD1; if (Settings.BS) BSHiROMMap (); else if ((ROMSpeed & ~0x10) == 0x25) TalesROMMap (Interleaved); else if ((ROMSpeed & ~0x10) == 0x22 && strncmp (ROMName, "Super Street Fighter", 20) != 0) { AlphaROMMap (); } else HiROMMap (); } else { Memory.HiROM = FALSE; Memory.SRAMSize = ROM [0x7fd8]; ROMSpeed = ROM [0x7fd5]; ROMType = ROM [0x7fd6]; ROMSize = ROM [0x7fd7]; ROMChecksum = ROM [0x7fde] + (ROM [0x7fdf] << 8); ROMComplementChecksum = ROM [0x7fdc] + (ROM [0x7fdd] << 8); memmove (ROMId, &ROM [0x7fb2], 4); memmove (CompanyId, &ROM [0x7fb0], 2); strncpy (ROMName, (char *) &ROM[0x7fc0], ROM_NAME_LEN - 1); Settings.SuperFX = Settings.ForceSuperFX; if ((ROMType & 0xf0) == 0x10) Settings.SuperFX = !Settings.ForceNoSuperFX; // Try to auto-detect the DSP1 chip if (!Settings.ForceNoDSP1 && (ROMType & 0xf) >= 3 && (ROMType & 0xf0) == 0) Settings.DSP1Master = TRUE; Settings.SDD1 = Settings.ForceSDD1; if ((ROMType & 0xf0) == 0x40) Settings.SDD1 = !Settings.ForceNoSDD1; Settings.C4 = Settings.ForceC4; if ((ROMType & 0xf0) == 0xf0 && (strncmp (ROMName, "MEGAMAN X", 9) == 0 || strncmp (ROMName, "ROCKMAN X", 9) == 0)) { Settings.C4 = !Settings.ForceNoC4; } if (Settings.SuperFX) { //::SRAM = ROM + 1024 * 1024 * 4; SuperFXROMMap (); Settings.MultiPlayer5Master = FALSE; //Settings.MouseMaster = FALSE; //Settings.SuperScopeMaster = FALSE; Settings.DSP1Master = FALSE; Settings.SA1 = FALSE; Settings.C4 = FALSE; Settings.SDD1 = FALSE; } else if (Settings.ForceSA1 || (!Settings.ForceNoSA1 && (ROMSpeed & ~0x10) == 0x23 && (ROMType & 0xf) > 3 && (ROMType & 0xf0) == 0x30)) { Settings.SA1 = TRUE; Settings.MultiPlayer5Master = FALSE; //Settings.MouseMaster = FALSE; //Settings.SuperScopeMaster = FALSE; Settings.DSP1Master = FALSE; Settings.C4 = FALSE; Settings.SDD1 = FALSE; SA1ROMMap (); } else if ((ROMSpeed & ~0x10) == 0x25) TalesROMMap (Interleaved); else if (strncmp ((char *) &Memory.ROM [0x7fc0], "SOUND NOVEL-TCOOL", 17) == 0 || strncmp ((char *) &Memory.ROM [0x7fc0], "DERBY STALLION 96", 17) == 0) { LoROM24MBSMap (); Settings.DSP1Master = FALSE; } else if (strncmp ((char *) &Memory.ROM [0x7fc0], "THOROUGHBRED BREEDER3", 21) == 0 || strncmp ((char *) &Memory.ROM [0x7fc0], "RPG-TCOOL 2", 11) == 0) { SRAM512KLoROMMap (); Settings.DSP1Master = FALSE; } else if (strncmp ((char *) &Memory.ROM [0x7fc0], "DEZAEMON ", 10) == 0) { Settings.DSP1Master = FALSE; SRAM1024KLoROMMap (); } else if (strncmp ((char *) &Memory.ROM [0x7fc0], "ADD-ON BASE CASSETE", 19) == 0) { Settings.MultiPlayer5Master = FALSE; Settings.MouseMaster = FALSE; Settings.SuperScopeMaster = FALSE; Settings.DSP1Master = FALSE; SufamiTurboLoROMMap(); Memory.SRAMSize = 3; } else if ((ROMSpeed & ~0x10) == 0x22 && strncmp (ROMName, "Super Street Fighter", 20) != 0) { AlphaROMMap (); } else LoROMMap (); } int power2 = 0; int size = CalculatedSize; while (size >>= 1) power2++; size = 1 << power2; uint32 remainder = CalculatedSize - size; uint32 sum1 = 0; uint32 sum2 = 0; int i; for (i = 0; i < size; i++) sum1 += ROM [i]; for (i = 0; i < (int) remainder; i++) sum2 += ROM [size + i]; if (remainder) sum1 += sum2 * (size / remainder); sum1 &= 0xffff; if (Settings.ForceNTSC) Settings.PAL = FALSE; else if (Settings.ForcePAL) Settings.PAL = TRUE; else if (Memory.HiROM) // Country code Settings.PAL = ROM [0xffd9] >= 2; else Settings.PAL = ROM [0x7fd9] >= 2; if (Settings.PAL) { Settings.FrameTime = Settings.FrameTimePAL; Memory.ROMFramesPerSecond = 50; } else { Settings.FrameTime = Settings.FrameTimeNTSC; Memory.ROMFramesPerSecond = 60; } ROMName[ROM_NAME_LEN - 1] = 0; if (strlen (ROMName)) { char *p = ROMName + strlen (ROMName) - 1; while (p > ROMName && *(p - 1) == ' ') p--; *p = 0; } if (Settings.SuperFX) { SRAMMask = 0xffff; Memory.SRAMSize = 16; } else { SRAMMask = Memory.SRAMSize ? ((1 << (Memory.SRAMSize + 3)) * 128) - 1 : 0; } IAPU.OneCycle = ONE_APU_CYCLE; Settings.Shutdown = Settings.ShutdownMaster; ApplyROMFixes (); sprintf (ROMName, "%s", Safe (ROMName)); sprintf (ROMId, "%s", Safe (ROMId)); sprintf (CompanyId, "%s", Safe (CompanyId)); sprintf (String, "\"%s\" [%s] %s, %s, Type: %s, Mode: %s, TV: %s, S-RAM: %s, ROMId: %s Company: %2.2s", ROMName, (ROMChecksum + ROMComplementChecksum != 0xffff || ROMChecksum != sum1) ? "bad checksum" : "checksum ok", MapType (), Size (), KartContents (), MapMode (), TVStandard (), StaticRAMSize (), ROMId, CompanyId); S9xMessage (S9X_INFO, S9X_ROM_INFO, String);}bool8 CMemory::LoadSRAM (const char *filename){ int size = Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0; memset (SRAM, 0x60, 0x20000); if (size > 0x20000) size = 0x20000; if (size) { FILE *file; if ((file = fopen (filename, "rb"))) { int len = fread ((char*) ::SRAM, 1, 0x20000, file); fclose (file); if (len - size == 512) { // S-RAM file has a header - remove it memmove (::SRAM, ::SRAM + 512, size); } if (len == size + SRTC_SRAM_PAD) { S9xSRTCPostLoadState (); S9xResetSRTC (); rtc.index = -1; rtc.mode = MODE_READ; } else S9xHardResetSRTC (); return (TRUE); } S9xHardResetSRTC (); return (FALSE); } return (TRUE);}bool8 CMemory::SaveSRAM (const char *filename){ int size = Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0; if (Settings.SRTC) { size += SRTC_SRAM_PAD; S9xSRTCPreSaveState (); } if (size > 0x20000) size = 0x20000; if (size && *Memory.ROMFilename) { FILE *file; if ((file = fopen (filename, "wb"))) { fwrite ((char *) ::SRAM, size, 1, file); fclose (file);#if defined(__linux) chown (filename, getuid (), getgid ());#endif return (TRUE); } return (FALSE); } return (TRUE);}void CMemory::FixROMSpeed (){ int c; for (c = 0x800; c < 0x1000; c++) { if (BlockIsROM [c]) MemorySpeed [c] = (uint8) CPU.FastROMSpeed; }}void CMemory::WriteProtectROM (){ memmove ((void *) WriteMap, (void *) Map, sizeof (Map)); for (int c = 0; c < 0x1000; c++) { if (BlockIsROM [c]) WriteMap [c] = (uint8 *) MAP_NONE; }}void CMemory::MapRAM (){ int c; // Banks 7e->7f, RAM for (c = 0; c < 16; c++) { Map [c + 0x7e0] = RAM; Map [c + 0x7f0] = RAM + 0x10000; BlockIsRAM [c + 0x7e0] = TRUE; BlockIsRAM [c + 0x7f0] = TRUE; BlockIsROM [c + 0x7e0] = FALSE; BlockIsROM [c + 0x7f0] = FALSE; } // Banks 70->77, S-RAM for (c = 0; c < 0x80; c++) { Map [c + 0x700] = (uint8 *) MAP_LOROM_SRAM; BlockIsRAM [c + 0x700] = TRUE; BlockIsROM [c + 0x700] = FALSE; }}void CMemory::MapExtraRAM (){ int c; // Banks 7e->7f, RAM for (c = 0; c < 16; c++) { Map [c + 0x7e0] = RAM; Map [c + 0x7f0] = RAM + 0x10000; BlockIsRAM [c + 0x7e0] = TRUE; BlockIsRAM [c + 0x7f0] = TRUE; BlockIsROM [c + 0x7e0] = FALSE; BlockIsROM [c + 0x7f0] = FALSE; } // Banks 70->73, S-RAM for (c = 0; c < 16; c++) { Map [c + 0x700] = ::SRAM; Map [c + 0x710] = ::SRAM + 0x8000; Map [c + 0x720] = ::SRAM + 0x10000; Map [c + 0x730] = ::SRAM + 0x18000; BlockIsRAM [c + 0x700] = TRUE; BlockIsROM [c + 0x700] = FALSE; BlockIsRAM [c + 0x710] = TRUE; BlockIsROM [c + 0x710] = FALSE; BlockIsRAM [c + 0x720] = TRUE; BlockIsROM [c + 0x720] = FALSE; BlockIsRAM [c + 0x730] = TRUE; BlockIsROM [c + 0x730] = FALSE; }}void CMemory::LoROMMap (){ int c; int i; // Banks 00->3f and 80->bf for (c = 0; c < 0x400; c += 16) { Map [c + 0] = Map [c + 0x800] = RAM; Map [c + 1] = Map [c + 0x801] = RAM; BlockIsRAM [c + 0] = BlockIsRAM [c + 0x800] = TRUE; BlockIsRAM [c + 1] = BlockIsRAM [c + 0x801] = TRUE; Map [c + 2] = Map [c + 0x802] = (uint8 *) MAP_PPU; Map [c + 3] = Map [c + 0x803] = (uint8 *) MAP_PPU; Map [c + 4] = Map [c + 0x804] = (uint8 *) MAP_CPU; Map [c + 5] = Map [c + 0x805] = (uint8 *) MAP_CPU; if (Settings.DSP1Master) { Map [c + 6] = Map [c + 0x806] = (uint8 *) MAP_DSP; Map [c + 7] = Map [c + 0x807] = (uint8 *) MAP_DSP; } else if (Settings.C4) { Map [c + 6] = Map [c + 0x806] = (uint8 *) MAP_C4; Map [c + 7] = Map [c + 0x807] = (uint8 *) MAP_C4; } else { Map [c + 6] = Map [c + 0x806] = (uint8 *) bytes256 - 0x6000; Map [c + 7] = Map [c + 0x807] = (uint8 *) bytes256 - 0x7000; } for (i = c + 8; i < c + 16; i++) { Map [i] = Map [i + 0x800] = &ROM [c << 11] - 0x8000; BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; } for (i = c; i < c + 16; i++) { int ppu = i & 15; MemorySpeed [i] = MemorySpeed [i + 0x800] = ppu >= 2 && ppu <= 3 ? ONE_CYCLE : 8; } } if (Settings.DSP1Master) { // Banks 30->3f and b0->bf for (c = 0x300; c < 0x400; c += 16) { for (i = c + 8; i < c + 16; i++) { Map [i] = Map [i + 0x800] = (uint8 *) MAP_DSP; BlockIsROM [i] = BlockIsROM [i + 0x800] = FALSE; } } } // Banks 40->7f and c0->ff for (c = 0; c < 0x400; c += 16) { for (i = c; i < c + 8; i++) Map [i + 0x400] = Map [i + 0xc00] = &ROM [(c << 11) ]; for (i = c + 8; i < c + 16; i++) Map [i + 0x400] = Map [i + 0xc00] = &ROM [(c << 11) + 0x200000 - 0x8000]; for (i = c; i < c + 16; i++) { MemorySpeed [i + 0x400] = MemorySpeed [i + 0xc00] = 8; BlockIsROM [i + 0x400] = BlockIsROM [i + 0xc00] = TRUE; } } if (Settings.DSP1Master) { for (c = 0; c < 0x100; c++) { Map [c + 0xe00] = (uint8 *) MAP_DSP; MemorySpeed [c + 0xe00] = 8; BlockIsROM [c + 0xe00] = FALSE; } } MapRAM (); WriteProtectROM ();}void CMemory::HiROMMap (){ int c; int i; // Banks 00->3f and 80->bf for (c = 0; c < 0x400; c += 16) { Map [c + 0] = Map [c + 0x800] = RAM; BlockIsRAM [c + 0] = BlockIsRAM [c + 0x800] = TRUE; Map [c + 1] = Map [c + 0x801] = RAM; BlockIsRAM [c + 1] = BlockIsRAM [c + 0x801] = TRUE; Map [c + 2] = Map [c + 0x802] = (uint8 *) MAP_PPU; Map [c + 3] = Map [c + 0x803] = (uint8 *) MAP_PPU; Map [c + 4] = Map [c + 0x804] = (uint8 *) MAP_CPU; Map [c + 5] = Map [c + 0x805] = (uint8 *) MAP_CPU; if (Settings.DSP1Master) { Map [c + 6] = Map [c + 0x806] = (uint8 *) MAP_DSP; Map [c + 7] = Map [c + 0x807] = (uint8 *) MAP_DSP; } else { Map [c + 6] = Map [c + 0x806] = (uint8 *) MAP_NONE; Map [c + 7] = Map [c + 0x807] = (uint8 *) MAP_NONE; } for (i = c + 8; i < c + 16; i++) { Map [i] = Map [i + 0x800] = &ROM [(c << 12) % CalculatedSize]; BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE; } for (i = c; i < c + 16; i++) { int ppu = i & 15; MemorySpeed [i] = MemorySpeed [i + 0x800] = ppu >= 2 && ppu <= 3 ? ONE_CYCLE : 8; } } // Banks 30->3f and b0->bf, address ranges 6000->7fff is S-RAM. for (c = 0; c < 16; c++) { Map [0x306 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; Map [0x307 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; Map [0xb06 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; Map [0xb07 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM; BlockIsRAM [0x306 + (c << 4)] = TRUE; BlockIsRAM [0x307 + (c << 4)] = TRUE; BlockIsRAM [0xb06 + (c << 4)] = TRUE; BlockIsRAM [0xb07 + (c << 4)] = TRUE; } // Banks 40->7f and c0->ff for (c = 0; c < 0x400; c += 16) { for (i = c; i < c + 16; i++) { Map [i + 0x400] = Map [i + 0xc00] = &ROM [(c << 12) % CalculatedSize]; MemorySpeed [i + 0x400] = MemorySpeed [i + 0xc00] = 8; BlockIsROM [i + 0x400] = BlockIsROM [i + 0xc00] = TRUE; } } MapRAM (); WriteProtectROM ();}void CMemory::TalesROMMap (bool8 Interleaved){ int c; int i; uint32 OFFSET0 = 0x400000; uint32 OFFSET1 = 0x400000; uint32 OFFSET2 = 0x000000; if (Interleaved) { OFFSET0 = 0x000000; OFFSET1 = 0x000000; OFFSET2 = 0x200000; } // Banks 00->3f and 80->bf for (c = 0; c < 0x400; c += 16) { Map [c + 0] = Map [c + 0x800] = RAM; Map [c + 1] = Map [c + 0x801] = RAM; BlockIsRAM [c + 0] = BlockIsRAM [c + 0x800] = TRUE; BlockIsRAM [c + 1] = BlockIsRAM [c + 0x801] = TRUE; Map [c + 2] = Map [c + 0x802] = (uint8 *) MAP_PPU;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -