示例#1
0
        public Clock.ClockOp CreateFromStateFile(C64Interfaces.IFile stateFile)
        {
            switch (stateFile.ReadByte())
            {
            case (byte)Ops.Stall:
                return(new Clock.StallOp());

            case (byte)Ops.DecodeOpcode:
                return(new DecodeOpcodeOp(_cpu));

            case (byte)Ops.DecodeAddressing:
                return(new DecodeAddressOp(_cpu, stateFile));

            case (byte)Ops.ExecuteOpcode:
                return(new ExecuteOpcodeOp(_cpu, stateFile));

            case (byte)Ops.WriteResult:
                return(new WriteResultOp(_cpu));

            case (byte)Ops.Interrupt:
                return(new InterruptOp(_cpu, stateFile));

            case (byte)Ops.Reset:
                return(new ResetOp(_cpu, stateFile));
            }

            return(null);
        }
示例#2
0
        public void WriteDeviceState(C64Interfaces.IFile stateFile)
        {
            _portA.WriteDeviceState(stateFile);
            _portB.WriteDeviceState(stateFile);

            stateFile.Write(_latchPortA);
            stateFile.Write(_latchedValueA);
            stateFile.Write(_ca1);
            stateFile.Write(_ca2);
            stateFile.Write(_latchPortB);
            stateFile.Write(_latchedValueB);
            stateFile.Write(_cb1);
            stateFile.Write(_pulseCA2);
            stateFile.Write(_cb2);
            stateFile.Write(_pulseCB2);

            stateFile.Write(_t1Counter);
            stateFile.Write(_t1Latch);
            stateFile.Write(_t1Count);
            stateFile.Write(_t1OutPB);
            stateFile.Write(_t1FreeRun);
            stateFile.Write(_t2Counter);
            stateFile.Write(_t2Latch);
            stateFile.Write(_t2Count);
            stateFile.Write(_t2InPB);

            stateFile.Write(_functionControlRegister);
            stateFile.Write(_auxiliaryControlRegister);
            stateFile.Write(_interruptFlagRegister);
            stateFile.Write(_interruptEnabledRegister);
        }
示例#3
0
        public void ReadDeviceState(C64Interfaces.IFile stateFile)
        {
            _portA.ReadDeviceState(stateFile);
            _portB.ReadDeviceState(stateFile);

            _latchPortA    = stateFile.ReadBool();
            _latchedValueA = stateFile.ReadByte();
            _ca1           = stateFile.ReadBool();
            _ca2           = stateFile.ReadBool();
            _latchPortB    = stateFile.ReadBool();
            _latchedValueB = stateFile.ReadByte();
            _cb1           = stateFile.ReadBool();
            _pulseCA2      = stateFile.ReadBool();
            _cb2           = stateFile.ReadBool();
            _pulseCB2      = stateFile.ReadBool();

            _t1Counter = stateFile.ReadWord();
            _t1Latch   = stateFile.ReadWord();
            _t1Count   = stateFile.ReadBool();
            _t1OutPB   = stateFile.ReadBool();
            _t1FreeRun = stateFile.ReadBool();
            _t2Counter = stateFile.ReadWord();
            _t2Latch   = stateFile.ReadByte();
            _t2Count   = stateFile.ReadBool();
            _t2InPB    = stateFile.ReadBool();

            _functionControlRegister  = stateFile.ReadByte();
            _auxiliaryControlRegister = stateFile.ReadByte();
            _interruptFlagRegister    = stateFile.ReadByte();
            _interruptEnabledRegister = stateFile.ReadByte();
        }
示例#4
0
        public void WriteDeviceState(C64Interfaces.IFile stateFile)
        {
            _portA.WriteDeviceState(stateFile);
            _portB.WriteDeviceState(stateFile);

            stateFile.Write(_pcState);
            stateFile.Write(_todPause);
            stateFile.Write(_todLatch);
            stateFile.Write(_todClkCnt);
            stateFile.Write(_todLimits);

            for (int i = 0; i < _tod.GetLength(0); i++)
            {
                for (int j = 0; j < _tod.GetLength(1); j++)
                {
                    stateFile.Write(_tod[i, j]);
                }
            }

            stateFile.Write(_interruptRegisters);
            stateFile.Write(_serialRegister);
            stateFile.Write(_flag);
            stateFile.Write(_cntState);
            stateFile.Write(_cntEdge);

            _timerA.WriteDeviceState(stateFile);
            _timerB.WriteDeviceState(stateFile);
        }
示例#5
0
        public void ReadDeviceState(C64Interfaces.IFile stateFile)
        {
            _portA.ReadDeviceState(stateFile);
            _portB.ReadDeviceState(stateFile);

            _pcState   = stateFile.ReadBool();
            _todPause  = stateFile.ReadBool();
            _todLatch  = stateFile.ReadBool();
            _todClkCnt = stateFile.ReadByte();
            stateFile.ReadBytes(_todLimits);

            for (int i = 0; i < _tod.GetLength(0); i++)
            {
                for (int j = 0; j < _tod.GetLength(1); j++)
                {
                    _tod[i, j] = stateFile.ReadByte();
                }
            }

            stateFile.ReadBytes(_interruptRegisters);
            _serialRegister = stateFile.ReadByte();
            _flag           = stateFile.ReadBool();
            _cntState       = stateFile.ReadBool();
            _cntEdge        = stateFile.ReadBool();

            _timerA.ReadDeviceState(stateFile);
            _timerB.ReadDeviceState(stateFile);
        }
示例#6
0
        public virtual void WriteToStateFile(C64Interfaces.IFile stateFile)
        {
            stateFile.Write((byte)0);

            _op.WriteToStateFile(stateFile);
            stateFile.Write(_comboNext);
        }
示例#7
0
            public override void WriteToStateFile(C64Interfaces.IFile stateFile)
            {
                stateFile.Write((byte)TargetFactory.TargetTypes.ImmediateTarget);

                stateFile.Write(_address);
                stateFile.Write(_part);
            }
示例#8
0
        public virtual void WriteToStateFile(C64Interfaces.IFile stateFile)
        {
            stateFile.Write((byte)TargetFactory.TargetTypes.ReadableTarget);

            stateFile.Write(_address);
            stateFile.Write(_part);
        }
示例#9
0
        public override void WriteToStateFile(C64Interfaces.IFile stateFile)
        {
            stateFile.Write((byte)1);

            _op.WriteToStateFile(stateFile);

            stateFile.Write(_comboNext);
            stateFile.Write(_length);
            stateFile.Write(_cycle);
        }
示例#10
0
        public void ReadDeviceState(C64Interfaces.IFile stateFile)
        {
            byte trackCount = stateFile.ReadByte();

            for (int i = 0; i < _tracks.Length; i++)
            {
                ushort sectoirCount = stateFile.ReadWord();
                stateFile.ReadBytes(_tracks[i]);
            }
        }
示例#11
0
        public void WriteDeviceState(C64Interfaces.IFile stateFile)
        {
            stateFile.Write((byte)_tracks.Length);

            for (int i = 0; i < _tracks.Length; i++)
            {
                stateFile.Write((ushort)_tracks[i].Length);
                stateFile.Write(_tracks[i]);
            }
        }
示例#12
0
 public void ReadDeviceState(C64Interfaces.IFile stateFile)
 {
     _headTrackPos      = stateFile.ReadByte();
     _headSectorPos     = stateFile.ReadWord();
     _lastHeadDirection = stateFile.ReadByte();
     _spinning          = stateFile.ReadBool();
     _density           = stateFile.ReadByte();
     _cycleCount        = stateFile.ReadByte();
     _lastData          = stateFile.ReadByte();
 }
示例#13
0
 public void WriteDeviceState(C64Interfaces.IFile stateFile)
 {
     stateFile.Write(_headTrackPos);
     stateFile.Write(_headSectorPos);
     stateFile.Write(_lastHeadDirection);
     stateFile.Write(_spinning);
     stateFile.Write(_density);
     stateFile.Write(_cycleCount);
     stateFile.Write(_lastData);
 }
示例#14
0
        public void WriteDeviceState(C64Interfaces.IFile stateFile)
        {
            _ram.WriteDeviceState(stateFile);
            _driveCpu.WriteDeviceState(stateFile);
            _driveVias[0].WriteDeviceState(stateFile);
            _driveVias[1].WriteDeviceState(stateFile);
            _drive.WriteDeviceState(stateFile);
            _sAtnaConn.WriteDeviceState(stateFile);
            _sClockConn.WriteDeviceState(stateFile);
            _sDataConn.WriteDeviceState(stateFile);

            _driveClock.WriteDeviceState(stateFile);
        }
示例#15
0
        public void ReadDeviceState(C64Interfaces.IFile stateFile)
        {
            _ram.ReadDeviceState(stateFile);
            _driveCpu.ReadDeviceState(stateFile);
            _driveVias[0].ReadDeviceState(stateFile);
            _driveVias[1].ReadDeviceState(stateFile);
            _drive.ReadDeviceState(stateFile);
            _sAtnaConn.ReadDeviceState(stateFile);
            _sClockConn.ReadDeviceState(stateFile);
            _sDataConn.ReadDeviceState(stateFile);

            _driveClock.ReadDeviceState(stateFile);
        }
示例#16
0
        public void SaveState(C64Interfaces.IFile stateFile)
        {
            lock (_systemClock)
            {
                if (_currentStateFile != null)
                {
                    throw new System.InvalidOperationException();
                }

                _currentStateFile      = stateFile;
                _pendingStateOperation = PendingStateOperations.Save;
            }
        }
示例#17
0
            public void WriteDeviceState(C64Interfaces.IFile stateFile)
            {
                stateFile.Write(_controlReg);
                stateFile.Write(_active);
                stateFile.Write(_mode);
                stateFile.Write(_oneTime);

                stateFile.Write(_output);
                stateFile.Write(_pulsing);
                stateFile.Write(_pulsed);

                stateFile.Write(_current);
                stateFile.Write(_latch);
            }
示例#18
0
            public void ReadDeviceState(C64Interfaces.IFile stateFile)
            {
                _controlReg = stateFile.ReadByte();
                _active     = stateFile.ReadBool();
                _mode       = stateFile.ReadByte();
                _oneTime    = stateFile.ReadBool();

                _output  = stateFile.ReadBool();
                _pulsing = stateFile.ReadBool();
                _pulsed  = stateFile.ReadBool();

                _current = stateFile.ReadWord();
                _latch   = stateFile.ReadWord();
            }
示例#19
0
        public void ReadDeviceState(C64Interfaces.IFile stateFile)
        {
            _systemRam.ReadDeviceState(stateFile);
            _systemCpu.ReadDeviceState(stateFile);
            _systemVic.ReadDeviceState(stateFile);
            _systemCias[0].ReadDeviceState(stateFile);
            _systemCias[1].ReadDeviceState(stateFile);
            _serial.ReadDeviceState(stateFile);
            _sDataConn.ReadDeviceState(stateFile);
            _sClockConn.ReadDeviceState(stateFile);

            CpuPort_OnMemoryMapChanged(stateFile.ReadByte());

            _systemClock.ReadDeviceState(stateFile);
        }
示例#20
0
        public void WriteDeviceState(C64Interfaces.IFile stateFile)
        {
            _systemRam.WriteDeviceState(stateFile);
            _systemCpu.WriteDeviceState(stateFile);
            _systemVic.WriteDeviceState(stateFile);
            _systemCias[0].WriteDeviceState(stateFile);
            _systemCias[1].WriteDeviceState(stateFile);
            _serial.WriteDeviceState(stateFile);
            _sDataConn.WriteDeviceState(stateFile);
            _sClockConn.WriteDeviceState(stateFile);

            stateFile.Write(_currentMap);

            _systemClock.WriteDeviceState(stateFile);
        }
示例#21
0
        protected void WritePhaseToDeviceState(C64Interfaces.IFile stateFile, byte phase)
        {
            byte opCount = 0;

            for (ClockEntry op = _currentOps[phase]; op != null; op = op.Next)
            {
                opCount++;
            }

            stateFile.Write(opCount);

            for (ClockEntry op = _currentOps[phase]; op != null; op = op.Next)
            {
                op.WriteToStateFile(stateFile);
            }
        }
示例#22
0
        public virtual void ReadDeviceState(C64Interfaces.IFile stateFile)
        {
            _state.A.Value  = stateFile.ReadByte();
            _state.X.Value  = stateFile.ReadByte();
            _state.Y.Value  = stateFile.ReadByte();
            _state.PC.Value = stateFile.ReadWord();
            _state.S.Value  = stateFile.ReadWord();
            _state.P.Value  = stateFile.ReadByte();

            _opcode = stateFile.ReadByte();
            _result = stateFile.ReadByte();

            _target = TargetFactory.ReadTargetFromStateFile(this, stateFile);

            _irq.ReadDeviceState(stateFile);
            _nmi.ReadDeviceState(stateFile);
        }
示例#23
0
        public virtual void WriteDeviceState(C64Interfaces.IFile stateFile)
        {
            stateFile.Write(_state.A.Value);
            stateFile.Write(_state.X.Value);
            stateFile.Write(_state.Y.Value);
            stateFile.Write(_state.PC.Value);
            stateFile.Write(_state.S.Value);
            stateFile.Write(_state.P.Value);

            stateFile.Write(_opcode);
            stateFile.Write(_result);

            _target.WriteToStateFile(stateFile);

            _irq.WriteDeviceState(stateFile);
            _nmi.WriteDeviceState(stateFile);
        }
示例#24
0
        public CBM1541(C64Interfaces.IFile kernel, IO.SerialPort serial)
        {
            _driveCpu             = new CPU.MOS6502(_memory, 0);
            _driveClock.OpFactory = _driveCpu.OpFactory;

            _driveVias = new VIA[2]
            {
                new VIA((ushort)Map.Via1RegistersAddress, (ushort)Map.Via1RegistersSize, _driveCpu.IRQ),
                new VIA((ushort)Map.Via2RegistersAddress, (ushort)Map.Via2RegistersSize, _driveCpu.IRQ)
            };

            _drive              = new DiskDrive.Drive(_driveVias[1]);
            _drive.OnDataReady += new DiskDrive.Drive.DateReadyDelegate(drive_OnDataReady);

            _ram = new Memory.RAM((ushort)Map.RamAddress, (ushort)Map.RamSize);
            _rom = new Memory.ROM((ushort)Map.RomAddress, (ushort)Map.RomSize, kernel);

            _rom.Patch(IDLE_TRAP_ADDRES, IDLE_TRAP_OPCODE);
            for (int i = 0; i < PATCH_MAP.Length; i++)
            {
                _rom.Patch(PATCH_MAP[i], NOP_OPCODE);
            }

            _memory.Map(_ram, true);
            _memory.Map(_driveVias[0], true);
            _memory.Map(_driveVias[1], true);
            _memory.Map(_rom, Memory.MemoryMapEntry.AccessType.Read, true);

            _serial = serial;

            _sAtnaConn  = new IO.SerialPort.BusLineConnection(_serial.DataLine);
            _sDataConn  = new IO.SerialPort.BusLineConnection(_serial.DataLine);
            _sClockConn = new IO.SerialPort.BusLineConnection(_serial.ClockLine);

            _serial.OnAtnLineChanged        += new IO.SerialPort.LineChangedDelegate(serial_OnAtnLineChanged);
            _serial.ClockLine.OnLineChanged += new IO.SerialPort.LineChangedDelegate(ClockLine_OnLineChanged);
            _serial.DataLine.OnLineChanged  += new IO.SerialPort.LineChangedDelegate(DataLine_OnLineChanged);

            _driveVias[0].PortB.OnPortOut += new IO.IOPort.PortOutDelegate(PortB_OnPortOut);

            _driveCpu.Restart(_driveClock, 0);
            _driveClock.QueueOpsStart(_driveVias[0].CreateOps(), 1);
            _driveClock.QueueOpsStart(_driveVias[1].CreateOps(), 2);
            _driveClock.QueueOpsStart(_drive.CreateOps(), 3);
        }
示例#25
0
        protected void ReadPhaseFromDeviceState(C64Interfaces.IFile stateFile, byte phase)
        {
            ClockEntry previousOp = null;
            byte       opCount    = stateFile.ReadByte();

            for (byte i = 0; i < opCount; i++)
            {
                ClockEntry op = stateFile.ReadByte() == 0 ? new ClockEntry(stateFile, _opFactory) : new ClockEntryRep(stateFile, _opFactory);

                if (previousOp == null)
                {
                    _currentOps[phase] = op;
                }
                else
                {
                    previousOp.Next = op;
                }

                previousOp = op;
            }
        }
示例#26
0
        private void _checkPendingStateOperations_OnTimeSlice()
        {
            lock (_systemClock)
            {
                if (_currentStateFile != null)
                {
                    switch (_pendingStateOperation)
                    {
                    case PendingStateOperations.Load:

                        ReadDeviceState(_currentStateFile);

                        if (OnLoadState != null)
                        {
                            OnLoadState(_currentStateFile);
                        }

                        _currentStateFile.Close();
                        _currentStateFile = null;

                        break;

                    case PendingStateOperations.Save:

                        WriteDeviceState(_currentStateFile);

                        if (OnSaveState != null)
                        {
                            OnSaveState(_currentStateFile);
                        }

                        _currentStateFile.Close();
                        _currentStateFile = null;

                        break;
                    }
                }
            }
        }
示例#27
0
        public static AddressedTarget ReadTargetFromStateFile(MOS6502 cpu, C64Interfaces.IFile stateFile)
        {
            switch (stateFile.ReadByte())
            {
            case (byte)TargetTypes.ReadableTarget:
                return(new ReadableTarget(cpu, stateFile));

            case (byte)TargetTypes.WritableTarget:
                return(new WritableTarget(cpu, stateFile));

            case (byte)TargetTypes.IndirectTarget:
                return(new IndirectTarget(cpu, stateFile));

            case (byte)TargetTypes.AccumulatorTarget:
                return(new AccAddressing.Target(cpu));

            case (byte)TargetTypes.ImmediateTarget:
                return(new ImmAddressing.Target(cpu, stateFile));
            }

            return(null);
        }
示例#28
0
        public GCRImage(C64Interfaces.IFile diskImage)
        {
            ushort id = 0;

            byte[] sector = new byte[RAW_SECT_LEN];
            int    offset = 0;

            _tracks = new byte[TRACK_COUNT][];
            for (byte i = 0; i < TRACK_COUNT; i++)
            {
                byte track = (byte)(i >> 1);
                _tracks[i] = new byte[SPT[track] * GCR_SECTOR_LEN];

                if ((i & 1) == 0)
                {
                    if ((ulong)offset < diskImage.Size)
                    {
                        ushort start = 0;
                        for (byte j = 0; j < SPT[track]; j++)
                        {
                            diskImage.Read(sector, offset, RAW_SECT_LEN);
                            ConvertSectorToGCR(sector, _tracks[i], ref start, j, (byte)(track + 1), id);

                            offset += RAW_SECT_LEN;
                        }
                    }
                }
                else
                {
                    ushort start = 0;

                    for (byte j = 0; j < SPT[track]; j++)
                    {
                        ConvertSectorToGCR(sector, _tracks[i], ref start, j, (byte)(track + 1), id);
                    }
                }
            }
        }
示例#29
0
 public void WriteDeviceState(C64Interfaces.IFile stateFile)
 {
     stateFile.Write(_state);
 }
示例#30
0
 public void ReadDeviceState(C64Interfaces.IFile stateFile)
 {
     _state = stateFile.ReadByte();
 }
示例#31
0
        private void _checkPendingStateOperations_OnTimeSlice()
        {
            lock (_systemClock)
            {
                if (_currentStateFile != null)
                {
                    switch (_pendingStateOperation)
                    {
                        case PendingStateOperations.Load:

                            ReadDeviceState(_currentStateFile);

                            if (OnLoadState != null)
                                OnLoadState(_currentStateFile);

                            _currentStateFile.Close();
                            _currentStateFile = null;

                            break;

                        case PendingStateOperations.Save:

                            WriteDeviceState(_currentStateFile);

                            if (OnSaveState != null)
                                OnSaveState(_currentStateFile);

                            _currentStateFile.Close();
                            _currentStateFile = null;

                            break;
                    }
                }
            }
        }
示例#32
0
        public void SaveState(C64Interfaces.IFile stateFile)
        {
            lock (_systemClock)
            {
                if (_currentStateFile != null)
                    throw new System.InvalidOperationException();

                _currentStateFile = stateFile;
                _pendingStateOperation = PendingStateOperations.Save;
            }
        }