// // Copyright (c) Adrian Conlon. All rights reserved. // namespace EightBit { using System; public sealed class InputOutput { private readonly byte[] input = new byte[0x100]; private readonly byte[] output = new byte[0x100]; public InputOutput() { } public event EventHandler? ReadingPort; public event EventHandler? ReadPort; public event EventHandler? WritingPort; public event EventHandler? WrittenPort; public byte Read(byte port) => this.ReadInputPort(port); public void Write(byte port, byte value) => this.WriteOutputPort(port, value); public byte ReadInputPort(byte port) { this.OnReadingPort(port); var value = this.input[port]; this.OnReadPort(port); return value; } public void WriteInputPort(byte port, byte value) => this.input[port] = value; public byte ReadOutputPort(byte port) => this.output[port]; public void WriteOutputPort(byte port, byte value) { this.OnWritingPort(port); this.output[port] = value; this.OnWrittenPort(port); } private void OnReadingPort(byte port) => this.ReadingPort?.Invoke(this, new PortEventArgs(port)); private void OnReadPort(byte port) => this.ReadPort?.Invoke(this, new PortEventArgs(port)); private void OnWritingPort(byte port) => this.WritingPort?.Invoke(this, new PortEventArgs(port)); private void OnWrittenPort(byte port) => this.WrittenPort?.Invoke(this, new PortEventArgs(port)); } }