Exemplo n.º 1
0
        private void OnMemoryAccess(object sender, MemoryAccessEventArgs e)
        {
            switch (e.EventType)
            {
            case MemoryAccessEventType.BeforePortRead:
                if (e.Address == PortVdpData)
                {
                    e.Value = _vdp.ReadData();
                    e.CancelMemoryAccess = true;
                }
                else if (e.Address == PortVdpControl)
                {
                    e.Value = _vdp.ReadControl();
                    e.CancelMemoryAccess = true;
                }

                break;

            case MemoryAccessEventType.AfterPortWrite:
                if (e.Address == PortVdpData)
                {
                    _vdp.WriteData(e.Value);
                }
                else if (e.Address == PortVdpControl)
                {
                    _vdp.WriteControl(e.Value);
                }

                break;

            default:
                return;
            }
        }
Exemplo n.º 2
0
        private void HandlePortRead(MemoryAccessEventArgs args)
        {
            if (args.CancelMemoryAccess)
            {
                return; //Value already set by a plugin
            }
            switch (args.Address)
            {
            case 0x98:
                args.Value = hardware.Vdp.ReadFromPort(0);
                break;

            case 0x99:
                args.Value = hardware.Vdp.ReadFromPort(1);
                break;

            case 0xA8:
                args.Value = hardware.SlotsSystem.ReadSlotSelectionRegister();
                break;

            case 0xA9:
                args.Value = hardware.KeyboardController.ReadFromKeyboardMatrixRowInputRegister();
                break;

            default:
                args.Value = 0xFF;
                break;
            }

            args.CancelMemoryAccess = true;
        }
Exemplo n.º 3
0
        private void HandlePortWrite(MemoryAccessEventArgs args)
        {
            if (args.CancelMemoryAccess)
            {
                return; //Value already handled by a plugin
            }
            switch (args.Address)
            {
            case 0x98:
                hardware.Vdp.WriteToPort(0, args.Value);
                break;

            case 0x99:
                hardware.Vdp.WriteToPort(1, args.Value);
                break;

            case 0x9A:
                hardware.Vdp.WriteToPort(2, args.Value);
                break;

            case 0x9B:
                hardware.Vdp.WriteToPort(3, args.Value);
                break;

            case 0xA8:
                hardware.SlotsSystem.WriteToSlotSelectionRegister(args.Value);
                break;

            case 0xAA:
                hardware.KeyboardController.WriteToKeyboardMatrixRowSelectionRegister(args.Value);
                break;
            }
        }
Exemplo n.º 4
0
 private void Z80OnMemoryAccess(object sender, MemoryAccessEventArgs args)
 {
     if (args.EventType == MemoryAccessEventType.BeforePortRead)
     {
         HandlePortRead(args);
     }
     else if (args.EventType == MemoryAccessEventType.BeforePortWrite)
     {
         HandlePortWrite(args);
     }
 }
Exemplo n.º 5
0
        private void Cpu_MemoryAccess(object sender, MemoryAccessEventArgs e)
        {
            if (e.EventType != MemoryAccessEventType.BeforePortWrite)
            {
                return;
            }

            if (e.Address < 0xFC || e.Address > 0xFF)
            {
                return;
            }

            var page = e.Address - 0xFC;

            mappedRam.WriteToSegmentSelectionRegister(page, e.Value);
        }
Exemplo n.º 6
0
 private void Cpu_MemoryAccess(object sender, MemoryAccessEventArgs e)
 {
     if (e.EventType == MemoryAccessEventType.BeforePortRead && e.Address == 0xB5)
     {
         e.Value = ReadData();
         e.CancelMemoryAccess = true;
     }
     else if (e.EventType == MemoryAccessEventType.BeforePortWrite)
     {
         if (e.Address == 0xB5)
         {
             WriteData(e.Value);
         }
         else if (e.Address == 0xB4)
         {
             SelectRegister(e.Value);
         }
     }
 }
Exemplo n.º 7
0
        private byte *HandleNullPteWrite(long position)
        {
            long key = position >> PageBits;

            MemoryAccessEventArgs e = new MemoryAccessEventArgs(position);

            if (_observedPages.TryGetValue(key, out IntPtr ptr))
            {
                SetPtEntry(position, (byte *)ptr);

                ObservedAccess?.Invoke(this, e);

                return((byte *)ptr + (position & PageMask));
            }

            InvalidAccess?.Invoke(this, e);

            throw new VmmPageFaultException(position);
        }
Exemplo n.º 8
0
        private void OnMemoryAccess(object sender, MemoryAccessEventArgs e)
        {
            if (e.EventType == MemoryAccessEventType.BeforePortRead ||
                e.EventType == MemoryAccessEventType.BeforePortWrite)
            {
                var port = Ports.FirstOrDefault(p => p.HandledPorts.Contains(e.Address));
                if (port != null)
                {
                    if (e.EventType == MemoryAccessEventType.BeforePortRead)
                    {
                        e.Value = port.GetData(e.Address);
                    }
                    else
                    {
                        port.SetData(e.Address, e.Value);
                    }

                    e.CancelMemoryAccess = true;
                }
            }
        }
Exemplo n.º 9
0
        private void MemoryAccessHandler(object sender, MemoryAccessEventArgs e)
        {
            long pa = _memory.GetPhysicalAddress(e.Position);

            CachedPages[pa >> PageBits]?.Clear();
        }
Exemplo n.º 10
0
 private void InvalidAccessHandler(object sender, MemoryAccessEventArgs e)
 {
     PrintCurrentThreadStackTrace();
 }
Exemplo n.º 11
0
        private void Cpu_MemoryAccess(object sender, MemoryAccessEventArgs e)
        {
            if (e.Address == 0x20)
            {
                if (e.EventType == MemoryAccessEventType.BeforePortRead)
                {
                    e.CancelMemoryAccess = true;
                    if (waitingMultiDataTransferLength)
                    {
                        waitingMultiDataTransferLength = false;
                        e.Value = chPorts.ReadData();
                        multiDataTransferRemaining = e.Value;
                        multiDataTransferPointer   = 0;
                        if (e.Value > 0)
                        {
                            multiDataTransferBuffer = chPorts.ReadMultipleData(multiDataTransferRemaining);
                        }
                    }
                    else if (multiDataTransferRemaining > 0)
                    {
                        e.Value = multiDataTransferBuffer[multiDataTransferPointer];
                        multiDataTransferPointer++;
                        multiDataTransferRemaining--;
                    }
                    else
                    {
                        e.Value = chPorts.ReadData();
                    }
                }
                else if (e.EventType == MemoryAccessEventType.BeforePortWrite)
                {
                    e.CancelMemoryAccess = true;

                    if (waitingMultiDataTransferLength)
                    {
                        waitingMultiDataTransferLength = false;
                        multiDataTransferBuffer        = new byte[e.Value];
                        multiDataTransferPointer       = 0;
                        multiDataTransferRemaining     = e.Value;
                        chPorts.WriteData(e.Value);
                    }
                    else if (multiDataTransferRemaining > 0)
                    {
                        multiDataTransferBuffer[multiDataTransferPointer] = e.Value;
                        multiDataTransferPointer++;
                        multiDataTransferRemaining--;
                        if (multiDataTransferRemaining == 0)
                        {
                            chPorts.WriteMultipleData(multiDataTransferBuffer);
                        }
                    }
                    else
                    {
                        chPorts.WriteData(e.Value);
                    }
                }
            }
            else if (e.Address == 0x21)
            {
                if (e.EventType == MemoryAccessEventType.BeforePortRead)
                {
                    e.CancelMemoryAccess = true;
                    e.Value = chPorts.ReadStatus();
                }
                else if (e.EventType == MemoryAccessEventType.BeforePortWrite)
                {
                    e.CancelMemoryAccess = true;
                    chPorts.WriteCommand(e.Value);

                    if (e.Value == CMD_RD_USB_DATA0 || e.Value == CMD_WR_HOST_DATA)
                    {
                        waitingMultiDataTransferLength = true;
                    }
                }
            }
            else if (e.Address == 0xAA)
            {
                if (e.EventType == MemoryAccessEventType.AfterPortWrite)
                {
                    var wasOn = (aaPortValue & 0x40) == 0;
                    var on    = (e.Value & 0x40) == 0;
                    if (on != wasOn)
                    {
                        Debug.WriteLine("CAPS " + (on ? "ON" : "OFF"));
                    }
                    aaPortValue = e.Value;
                }
                else if (e.EventType == MemoryAccessEventType.AfterPortRead)
                {
                    e.Value = aaPortValue;
                }
            }
        }
 private void Sut_MemoryAccess(object sender, MemoryAccessEventArgs e)
 {
     throw new NotImplementedException();
 }