Ejemplo n.º 1
0
        public void ComputeChecksum()
        {
            _writer.Seek(0, SeekOrigin.End);

            long fileSize = _writer.Position;

            byte[] allBytes = new byte[fileSize];

            _writer.Seek(0, SeekOrigin.Begin);

            _writer.Read(allBytes, 0, allBytes.Length);

            uint checksum = 0;

            for (int i = 0; i < allBytes.Length; ++i)
            {
                checksum += (uint)allBytes[i];
            }

            uint checksumComplement = checksum ^ uint.MaxValue;

            _writer.Seek(CpuAddressConverter.RAMToPhysical(SfcRomHeader.Checksum, Driver.Header.MapMode), SeekOrigin.Begin);

            using (BinaryWriter binWriter = new BinaryWriter(_writer))
            {
                binWriter.Write((ushort)checksumComplement);
                binWriter.Write((ushort)checksum);
            }
        }
Ejemplo n.º 2
0
        public void Generate()
        {
            foreach (var instruction in Instructions)
            {
                var opcodes = instruction.Opcode.GetAttributes <OpcodeAttribute>();

                var opcode = opcodes.Where(x => x.AddressingMode == instruction.AddressingMode).First();

                switch (instruction.AddressingMode)
                {
                // Instruction size of 1
                case CpuAddressingMode.Implied:
                    _stream.WriteByte(opcode.Opcode);
                    break;

                case CpuAddressingMode.Immediate:
                case CpuAddressingMode.Direct:
                case CpuAddressingMode.Absolute:
                case CpuAddressingMode.Relative:
                {
                    _stream.WriteByte(opcode.Opcode);

                    if (instruction.Arguments[0] is NumberInstructionArgument)
                    {
                        var numberArgument = instruction.Arguments[0] as NumberInstructionArgument;

                        if (numberArgument.Size == ArgumentSize.Word ||
                            numberArgument.Size == ArgumentSize.LongWord)
                        {
                            writeWord(numberArgument.Number);
                        }
                        else
                        {
                            _stream.WriteByte((byte)numberArgument.Number);
                        }
                    }
                    else if (instruction.Arguments[0] is LabelInstructionArgument)
                    {
                        var  labelArgument        = instruction.Arguments[0] as LabelInstructionArgument;
                        long labelPhysicalAddress = Scope.AddressFor(labelArgument.Label);

                        if (instruction.AddressingMode == CpuAddressingMode.Relative)
                        {
                            byte relativeAddress = Convert.ToByte((labelPhysicalAddress - (_stream.Position + 1)) & 0xFF);
                            _stream.WriteByte(relativeAddress);
                        }
                        else if (instruction.AddressingMode == CpuAddressingMode.Absolute)
                        {
                            int ramAddress = CpuAddressConverter.PhysicalToRAM((int)labelPhysicalAddress, Header.MapMode, Header.RomSpeed);
                            writeWord(ramAddress & 0xFFFF);
                        }
                    }
                    break;
                }
                }
            }
        }
Ejemplo n.º 3
0
        private void writeCatridgeHeader()
        {
            MapMode map = Driver.Header.MapMode;

            _writer.Seek(CpuAddressConverter.RAMToPhysical(SfcRomHeader.CatridgeHeader, map), SeekOrigin.Begin);

            // Write cartridge title
            byte[] cartridgeTitle = new byte[21];
            for (int i = 0; i < cartridgeTitle.Length; ++i)
            {
                cartridgeTitle[i] = (byte)' ';
            }
            Array.Copy(Encoding.ASCII.GetBytes(Driver.Header.CartridgeName), cartridgeTitle, Encoding.ASCII.GetByteCount(Driver.Header.CartridgeName));

            _writer.Write(cartridgeTitle, 0, cartridgeTitle.Length);

            // Write ROM Makeup / ROM Speed and map mode
            int romMakeup = 0;

            romMakeup = (byte)Driver.Header.MapMode
                        | ((byte)Driver.Header.RomSpeed << 4)
                        | 1 << 5
            ;

            _writer.WriteByte((byte)romMakeup);

            // Write Chipset
            byte chipset = 0;

            if (Driver.Header.SramSize > 0)
            {
                chipset = 0x2;
            }

            _writer.WriteByte(chipset);

            // Write ROM size
            byte romSize = (byte)Math.Log(32, 2);

            _writer.WriteByte(romSize);

            // Write RAM size
            _writer.WriteByte((byte)Math.Log(Driver.Header.SramSize, 2));

            // Write Country
            _writer.WriteByte((byte)Driver.Header.Country);

            // Write Developer ID
            _writer.WriteByte((byte)Driver.Header.Developer);

            // Write ROM version
            _writer.WriteByte((byte)Driver.Header.Version);

            // Write initial checksum complement
            _writer.WriteByte(0xFF);
            _writer.WriteByte(0xFF);

            // Write initial checksum
            _writer.WriteByte(0);
            _writer.WriteByte(0);
        }
Ejemplo n.º 4
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);
            }
        }