Esempio n. 1
0
 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;
     }
 }
Esempio n. 2
0
 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;
 }