Example #1
0
        void WriteMemorySGX(int addr, byte value)
        {
            if (addr >= 0x1F0000 && addr < 0x1F8000) // write RAM.
                Ram[addr & 0x7FFF] = value;

            else if (addr >= 0x1FE000) // hardware page.
            {
                if (addr < 0x1FE400)
                {
                    addr &= 0x1F;
                    if (addr <= 0x07) VDC1.WriteVDC(addr, value);
                    else if (addr <= 0x0F) VPC.WriteVPC(addr, value);
                    else if (addr <= 0x17) VDC2.WriteVDC(addr, value);
                }
                else if (addr < 0x1FE800) { Cpu.PendingCycles--; VCE.WriteVCE(addr, value); }
                else if (addr < 0x1FEC00) { IOBuffer = value; PSG.WritePSG((byte)addr, value, Cpu.TotalExecutedCycles); }
                else if (addr == 0x1FEC00) { IOBuffer = value; Cpu.WriteTimer(value); }
                else if (addr == 0x1FEC01) { IOBuffer = value; Cpu.WriteTimerEnable(value); }
                else if (addr >= 0x1FF000 &&
                         addr < 0x1FF400) { IOBuffer = value; WriteInput(value); }
                else if (addr == 0x1FF402) { IOBuffer = value; Cpu.WriteIrqControl(value); }
                else if (addr == 0x1FF403) { IOBuffer = value; Cpu.WriteIrqStatus(); }
                else Log.Error("MEM", "unhandled hardware write [{0:X6}] : {1:X2}", addr, value);
            }
            else
                Log.Error("MEM", "UNHANDLED WRITE: {0:X6}:{1:X2}", addr, value);
        }
Example #2
0
        // The SuperGrafx has 32K of RAM and a different port configuration to allow
        // I/O access to VDC1, VDC2, and the VPC.
        byte ReadMemorySGX(int addr)
        {
            if (addr < 0xFFFFF) // read ROM
                return RomData[addr % RomLength];

            if (addr >= 0x1F0000 && addr < 0x1F8000) // read RAM
                return Ram[addr & 0x7FFF];

            if (addr >= 0x1FE000) // hardware page.
            {
                if (addr < 0x1FE400)
                {
                    addr &= 0x1F;
                    if (addr <= 0x07) return VDC1.ReadVDC(addr);
                    if (addr <= 0x0F) return VPC.ReadVPC(addr);
                    if (addr <= 0x17) return VDC2.ReadVDC(addr);
                    return 0xFF;
                }

                if (addr < 0x1FE800) { Cpu.PendingCycles--; return VCE.ReadVCE(addr); }
                if (addr < 0x1FEC00) return IOBuffer;
                if (addr < 0x1FF000) { IOBuffer = (byte)(Cpu.ReadTimerValue() | (IOBuffer & 0x80)); return IOBuffer; }
                if (addr >= 0x1FF000 &&
                    addr < 0x1FF400) { IOBuffer = ReadInput(); return IOBuffer; }
                if ((addr & ~1) == 0x1FF400) return IOBuffer;
                if (addr == 0x1FF402) { IOBuffer = Cpu.IRQControlByte; return IOBuffer; }
                if (addr == 0x1FF403) { IOBuffer = (byte)(Cpu.ReadIrqStatus() | (IOBuffer & 0xF8)); return IOBuffer; }
            }

            Log.Error("MEM", "UNHANDLED READ: {0:X6}", addr);
            return 0xFF;
        }
Example #3
0
        void SyncState(Serializer ser)
        {
            ser.BeginSection("PCEngine");
            Cpu.SyncState(ser);
            VCE.SyncState(ser);
            VDC1.SyncState(ser, 1);
            PSG.SyncState(ser);

            if (SuperGrafx)
            {
                VPC.SyncState(ser);
                VDC2.SyncState(ser, 2);
            }

            if (TurboCD)
            {
                ADPCM.SyncState(ser);
                CDAudio.SyncState(ser);
                SCSI.SyncState(ser);

                ser.Sync("CDRAM", ref CDRam, false);
                if (SuperRam != null)
                {
                    ser.Sync("SuperRAM", ref SuperRam, false);
                }
                if (ArcadeCard)
                {
                    ArcadeCardSyncState(ser);
                }
            }

            ser.Sync("RAM", ref Ram, false);
            ser.Sync("IOBuffer", ref IOBuffer);
            ser.Sync("CdIoPorts", ref CdIoPorts, false);
            ser.Sync("BramLocked", ref BramLocked);

            ser.Sync("Frame", ref frame);
            ser.Sync("Lag", ref lagCount);
            ser.Sync("IsLag", ref isLag);
            if (Cpu.ReadMemory21 == ReadMemorySF2)
            {
                ser.Sync("SF2MapperLatch", ref SF2MapperLatch);
            }
            if (PopulousRAM != null)
            {
                ser.Sync("PopulousRAM", ref PopulousRAM, false);
            }
            if (BRAM != null)
            {
                ser.Sync("BRAM", ref BRAM, false);
            }

            ser.EndSection();

            if (ser.IsReader)
            {
                SyncAllByteArrayDomains();
            }
        }