Exemple #1
0
        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;
        }
Exemple #4
0
        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));
        }
Exemple #8
0
        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);
            }
        }