public static int ConvertPCtoSnes(int offset, RomMapMode romMapMode, RomSpeed romSpeed) { switch (romMapMode) { case RomMapMode.LoRom: offset = ((offset & 0x3F8000) << 1) | 0x8000 | (offset & 0x7FFF); if (romSpeed == RomSpeed.FastRom || offset >= 0x7E0000) { offset |= 0x800000; } return(offset); case RomMapMode.HiRom: offset |= 0x400000; if (romSpeed == RomSpeed.FastRom || offset >= 0x7E0000) { offset |= 0x800000; } return(offset); case RomMapMode.ExHiRom when offset < 0x40000: offset |= 0xC00000; return(offset); case RomMapMode.ExHiRom: if (offset >= 0x7E0000) { offset &= 0x3FFFFF; } return(offset); case RomMapMode.ExSa1Rom when offset >= 0x400000: offset += 0x800000; return(offset); } offset = ((offset & 0x3F8000) << 1) | 0x8000 | (offset & 0x7FFF); if (offset >= 0x400000) { offset += 0x400000; } return(offset); }
public static int PhysicalToRAM(int address, MapMode mode, RomSpeed romSpeed) { int bank = 0; switch (mode) { case MapMode.LoROM: { switch (romSpeed) { case RomSpeed.SlowROM: bank = 0x00; break; case RomSpeed.FastROM: bank = 0x80; break; } int result = (bank << 16) | ((address & 0xFF8000) << 1) | (address & 0xFFFF) | 0x8000 ; return(result); } case MapMode.HiROM: { switch (romSpeed) { case RomSpeed.SlowROM: case RomSpeed.FastROM: bank = 0xC0; break; } return((bank << 16) | (address & 0xFFFFFF)); } } return(address); }
public static int PhysicalToRAM(int address, MapMode mode, RomSpeed romSpeed) { int bank = 0; switch(mode) { case MapMode.LoROM: { switch (romSpeed) { case RomSpeed.SlowROM: bank = 0x00; break; case RomSpeed.FastROM: bank = 0x80; break; } int result = (bank << 16) | ((address & 0xFF8000) << 1) | (address & 0xFFFF) | 0x8000 ; return result; } case MapMode.HiROM: { switch (romSpeed) { case RomSpeed.SlowROM: case RomSpeed.FastROM: bank = 0xC0; break; } return (bank << 16) | (address & 0xFFFFFF); } } return address; }
public override void ExitHeaderDeclaration([NotNull] ZealCpuParser.HeaderDeclarationContext context) { foreach (var info in context.headerInfo()) { switch (info.headerType.Text) { case "CartridgeName": if (info.headerValue.STRING_LITERAL() == null) { addErrorMesage("CartridgeName excepts a string literal.", info.headerValue.Start); } else { _driver.Header.CartridgeName = parseStringLiteral(info.headerValue.STRING_LITERAL()); } break; case "RomSpeed": { RomSpeed speed = RomSpeed.SlowROM; if (Enum.TryParse <RomSpeed>(info.headerValue.IDENTIFIER().GetText(), out speed)) { _driver.Header.RomSpeed = speed; } else { string validInput = String.Join(", ", Enum.GetNames(typeof(RomSpeed))); addErrorMesage(String.Format("'{0}' is not a valid RomSpeed. Valid inputs are: {1}", info.headerValue.IDENTIFIER().GetText(), validInput), info.headerValue.IDENTIFIER().Symbol); } break; } case "MapMode": { MapMode mode = MapMode.LoROM; if (Enum.TryParse <MapMode>(info.headerValue.IDENTIFIER().GetText(), out mode)) { _driver.Header.MapMode = mode; } else { string validInput = String.Join(", ", Enum.GetNames(typeof(MapMode))); addErrorMesage(String.Format("'{0}' is not a valid MapMode. Valid inputs are: {1}", info.headerValue.IDENTIFIER().GetText(), validInput), info.headerValue.IDENTIFIER().Symbol); } break; } case "SramSize": if (info.headerValue.numberLiteral() == null) { addErrorMesage("SramSize expects a number literal.", info.headerValue.Start); } else { _driver.Header.SramSize = (uint)parseNumberLiteral(info.headerValue.numberLiteral()); } break; case "Country": { Country country = Country.Japan; if (Enum.TryParse <Country>(info.headerValue.IDENTIFIER().GetText(), out country)) { _driver.Header.Country = country; } else { string validInput = String.Join(", ", Enum.GetNames(typeof(Country))); addErrorMesage(String.Format("'{0}' is not a valid Country. Valid inputs are: {1}", info.headerValue.IDENTIFIER().GetText(), validInput), info.headerValue.IDENTIFIER().Symbol); } break; } case "Developer": { if (info.headerValue.numberLiteral() == null) { addErrorMesage("Developer expects a number literal.", info.headerValue.Start); } else { _driver.Header.Developer = (uint)parseNumberLiteral(info.headerValue.numberLiteral()); } break; } case "Version": { if (info.headerValue.numberLiteral() == null) { addErrorMesage("Version expects a number literal.", info.headerValue.Start); } else { _driver.Header.Version = (uint)parseNumberLiteral(info.headerValue.numberLiteral()); } break; } default: addErrorMesage(String.Format("'{0}' is not a valid entry name for the header statement.", info.headerType.Text), info.headerType); break; } } }
public static Data PopulateFrom(this Data data, IReadOnlyCollection <byte> actualRomBytes, RomMapMode romMapMode, RomSpeed romSpeed) { var mapping = RomUtil.CreateRomMappingFromRomRawBytes(actualRomBytes, romMapMode, romSpeed); return(PopulateFrom(data, mapping)); }
public static Data InitializeEmptyRomMapping(this Data data, int size, RomMapMode mode, RomSpeed speed) { var romByteSource = new ByteSource { Bytes = new StorageList <ByteEntry>(size), Name = "Snes ROM" }; PopulateFromRom(data, romByteSource, mode, speed); return(data); }
public static Data PopulateFromRom(this Data data, ByteSource romByteSource, RomMapMode romMapMode, RomSpeed romSpeed) { var mapping = RomUtil.CreateRomMappingFromRomByteSource(romByteSource, romMapMode, romSpeed); return(PopulateFrom(data, mapping)); }
private void writeVectors() { MapMode map = Driver.Header.MapMode; _writer.Seek(CpuAddressConverter.RAMToPhysical(SfcRomHeader.NativeVectors, map), SeekOrigin.Begin); using (BinaryWriter binWriter = new BinaryWriter(_writer)) { Vectors vectors = Driver.Vectors; RomSpeed speed = Driver.Header.RomSpeed; // ========================== // = Native (65816 vectors) = // ========================== // Use BRK version for COP vector int brk = (int)GlobalScope.AddressFor(vectors.BRK); brk = CpuAddressConverter.PhysicalToRAM(brk, map, speed); binWriter.Write((ushort)brk); // BRK vector binWriter.Write((ushort)brk); // Use BRK for ABORT vector binWriter.Write((ushort)brk); // NMI vector int nmi = (int)GlobalScope.AddressFor(vectors.NMI); nmi = CpuAddressConverter.PhysicalToRAM(nmi, map, speed); binWriter.Write((ushort)nmi); // RESET vector int reset = (int)GlobalScope.AddressFor(vectors.Reset); reset = CpuAddressConverter.PhysicalToRAM(reset, map, speed); binWriter.Write((ushort)reset); // IRQ vector int irq = (int)GlobalScope.AddressFor(vectors.IRQ); irq = CpuAddressConverter.PhysicalToRAM(irq, map, speed); binWriter.Write((ushort)irq); // ============================ // = Emulation (6502 vectors) = // ============================ // COP vector binWriter.Seek(CpuAddressConverter.RAMToPhysical(SfcRomHeader.EmulationCopVector, map), SeekOrigin.Begin); binWriter.Write((ushort)brk); // Rest of 6502 vectors binWriter.Seek(CpuAddressConverter.RAMToPhysical(SfcRomHeader.EmulationVectors, map), SeekOrigin.Begin); // ABORT binWriter.Write((ushort)brk); // NMI binWriter.Write((ushort)nmi); // RESET binWriter.Write((ushort)reset); // IRQ binWriter.Write((ushort)irq); } }