private void WriteMBC1(int address, byte value) { if (address >= 0x0000 && address <= 0x1FFF) { _enableRamWrite = ((value & 0x0F) == 0x0A); } else if (address >= 0x2000 && address <= 0x3FFF) { SwitchRomBank(value, 0x1F); } else if (address >= 0x4000 && address <= 0x5FFF) { if (_mbc1Type == MBC1Type._4_32 && _enableRamWrite) { SwitchRamBank(value, 0x03); } else if (_mbc1Type == MBC1Type._16_8) { // Quand on écrit dans la plage 0x4000 - 0x5FFF (qui est normalement une plage Readonly), on indique à la gameboy qu'on veut changer de bank // La bank choisit correspond à la bank voulue et les bit 5 et 6 correspondent aux bits 0 et 1 de la valeur qu'on a voulu écrire. // Exemple : ROMNumber = 29, valeur écrite dans la plage 0x4000-0x5FFF = 2 // ROMNumber = 0001 1101, valeur = 0000 0010 => Nouveau ROMNumber = 0001 1101 & (10 << 5) = 0101 1101 = 93 byte newValue = (byte)(((value & 0x03) << 5) & ROMNumber); SwitchRomBank(newValue, 0xFF); } } else if (address >= 0x6000 && address <= 0x7FFF) { _mbc1Type = (MBC1Type)(value & 0x01); } else { _data[address] = value; } }
public Memory(MBCType mbc, Processor owner) { _mbc1Type = MBC1Type._16_8; _mbc = mbc; _data = new byte[0x10000]; ROMNumber = 0; RAMNumber = 0; Array.Copy(SharpEmulator._data, _data, 0x8000); RAMData = new byte[SharpEmulator.GetRAMCountFromData() * 1024]; for (int i = 0; i < RAMData.Length; i++) { RAMData[i] = 0xFF; } if (RAMData.Length > 0) { Array.Copy(RAMData, 0x0000, _data, 0xA000, 0x2000); } LoadSavedGame(ROM.SavePath); InitMemory(); _owner = owner; }