void InitEEPROMMapper() { ReadMemoryMapper = ReadMemoryEEPROM; WriteMemoryMapper = WriteMemoryEEPROM; MapMemory = MapMemoryEEPROM; WriteMemoryEEPROM(0xFFFC, 0); WriteMemoryEEPROM(0xFFFD, 0); WriteMemoryEEPROM(0xFFFE, 1); WriteMemoryEEPROM(0xFFFF, 2); EEPROM = new EEPROM93c46(); }
CDLog_MapResults MapMemoryEEPROM(ushort address, bool write) { if (address < 0xC000) { if ((Port3E & 0x48) == 0x48) // cart and bios disabled, return empty bus { return(new CDLog_MapResults()); } if (BiosMapped && BiosRom != null) { return(new CDLog_MapResults()); //bios tracking of CDL is not supported } if (address < 1024) { return new CDLog_MapResults { Type = CDLog_AddrType.ROM, Address = address } } ; if (address < 0x4000) { return new CDLog_MapResults { Type = CDLog_AddrType.ROM, Address = (RomBank0 * BankSize) + address } } ; if (address < 0x8000) { return new CDLog_MapResults { Type = CDLog_AddrType.ROM, Address = (RomBank1 * BankSize) + (address & BankSizeMask) } } ; switch (SaveRamBank) { case 0: return(new CDLog_MapResults { Type = CDLog_AddrType.ROM, Address = (RomBank2 * BankSize) + (address & BankSizeMask) }); case 1: return(new CDLog_MapResults()); // a serial IO port case 2: return(new CDLog_MapResults()); // a serial IO port default: return(new CDLog_MapResults { Type = CDLog_AddrType.MainRAM, Address = address & RamSizeMask }); } } return(new CDLog_MapResults { Type = CDLog_AddrType.MainRAM, Address = address & RamSizeMask }); } void WriteMemoryEEPROM(ushort address, byte value) { if (address >= 0xC000) { SystemRam[address & RamSizeMask] = value; } else if (address >= 0x8000) { if (SaveRAM != null) { SaveRamModified = true; EEPROM.Write(value, SaveRAM); return; } Console.WriteLine("Game attempt to use SRAM but SRAM not present"); } if (address >= 0xFFFC) { if (address == 0xFFFC) { if ((value & 8) != 0) { SaveRamBank = (byte)((value & 4) == 0 ? 1 : 2); // SaveRAM selected } else { SaveRamBank = 0; // ROM bank selected } } else if (address == 0xFFFD) { RomBank0 = (byte)(value % RomBanks); } else if (address == 0xFFFE) { RomBank1 = (byte)(value % RomBanks); } else if (address == 0xFFFF) { RomBank2 = (byte)(value % RomBanks); } } } void InitEEPROMMapper() { ReadMemoryMapper = ReadMemoryEEPROM; WriteMemoryMapper = WriteMemoryEEPROM; MapMemory = MapMemoryEEPROM; WriteMemoryEEPROM(0xFFFC, 0); WriteMemoryEEPROM(0xFFFD, 0); WriteMemoryEEPROM(0xFFFE, 1); WriteMemoryEEPROM(0xFFFF, 2); EEPROM = new EEPROM93c46(); } } }