public static (ulong @ref, ulong start) GetFreeAddress(this IMemoryRange range) { var address = range.read(0x899); var result = address == 0x0 ? 0x900 : address + 1; return(result, result); }
public static void AssertLengthAndOffsets( IMemoryRange range, long length, long relativeOffset, long absoluteOffset) { Assert.AreEqual(length, range.SizeInBytes); Assert.AreEqual(relativeOffset, range.GetRelativeOffsetInBytes()); Assert.AreEqual(absoluteOffset, range.GetAbsoluteOffsetInBytes()); }
public static void writeString(this IMemoryRange range, ref ulong point, string value) { var size = value.Length; range.write(point++, size); for (var i = 0; i != size; i++) { range.write(point++, MarshalChar(value[i])); } }
public static string readString(this IMemoryRange range, ref ulong point) { var size = range.read(point++); var chars = new char[size]; for (var i = 0ul; i != size; i++) { chars[i] = MarshalChar(range.read(point++)); } return(string.Join("", chars)); }
public Mbc2Ram(string saveFileName) : base(null, null) { banks = new IMemoryRange[1]; var ram = new IMemory[RAMSize]; for (int i = 0; i < RAMSize; i++) { ram[i] = new MaskedRegister(0xF0); } banks[0] = new MemoryRange(ram); PrepareSaveFile(saveFileName); }
public MBC3(string romPath, bool hasRam, int romBankCount, RamSize ramSize, byte[] cartridgeData) : base(romPath) { this.romBankCount = romBankCount; MemoryRange[] switchableBanks = new MemoryRange[romBankCount]; for (int i = 0; i < romBankCount; i++) { int startAddress = RomSizePerBank * i; var bankData = GetCartridgeChunk(startAddress, RomSizePerBank, cartridgeData); switchableBanks[i] = new MemoryRange(bankData, true); } romBanks = new Bank(switchableBanks); romBanks.Switch(1); byte count; ushort size; if (!hasRam) { count = 0; size = 0; } else { count = ramSize.Banks; size = ramSize.SizePerBank; } IMemoryRange[] ramAndClock = new IMemoryRange[0xD]; var clock = new RTC(); for (int i = 0; i < ramAndClock.Length; i++) { if (i > 0x07) { ramAndClock[i] = clock; } else { if (i <= count) { ramAndClock[i] = new MemoryRange(size); } else { ramAndClock[i] = new DummyRange(); } } } ramBanks = new MbcRam(ramAndClock, GetSaveFilePath()); }
private void UpdateBanks() { ramBanks.Switch(mode * RamBankNumber); romBanks.Switch(GetRomBankPointer()); if (mode == 1) { Bank0 = romBanks.GetBank((RamBankNumber << 5) % romBankCount); } else { Bank0 = romBanks.GetBank(0); } bus.RouteMemory(ROM_bank_0_StartAddress, Bank0, OnBank0Write); }
public VMRef Write(IMemoryRange range) { var(free, start) = range.GetFreeAddress(); range.writeString(ref free, "main.module"); range.writeString(ref free, Name); range.write(free++, Args.Length); foreach (var arg in Args) { range.writeString(ref free, arg.Type.Name.Replace("_Type", "")); range.write(free++, arg.Value); } range.writeString(ref free, ReturnType.ShortName); return(new VMRef(start, (free - start))); }
public RoutedMemory(Address offset, IMemoryRange memory, Action <Address, Byte> onWrite = null) { this.offset = offset; this.memory = memory; this.onWrite = onWrite; }