Beispiel #1
0
        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);
        }
Beispiel #2
0
 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());
 }
Beispiel #3
0
        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]));
            }
        }
Beispiel #4
0
        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));
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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());
        }
Beispiel #7
0
 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);
 }
Beispiel #8
0
            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)));
            }
Beispiel #9
0
 public RoutedMemory(Address offset, IMemoryRange memory, Action <Address, Byte> onWrite = null)
 {
     this.offset  = offset;
     this.memory  = memory;
     this.onWrite = onWrite;
 }