From d40603ac7d88abe40f8875763d463538f83281ef Mon Sep 17 00:00:00 2001 From: Folkert van Heusden Date: Wed, 26 Feb 2025 18:16:58 +0100 Subject: [PATCH] 16 bit IO (IN, OUT) --- CGA.cs | 18 +++++++++--------- Device.cs | 4 ++-- Display.cs | 4 ++-- IO.cs | 2 +- MDA.cs | 6 +++--- MIDI.cs | 6 +++--- PPI.cs | 9 +++------ RTC.cs | 6 +++--- XTIDE.cs | 14 +++++++++----- floppy.cs | 8 ++++---- i8253.cs | 12 ++++++------ keyboard.cs | 10 +++++----- 12 files changed, 50 insertions(+), 49 deletions(-) diff --git a/CGA.cs b/CGA.cs index 87416ba..967fea1 100644 --- a/CGA.cs +++ b/CGA.cs @@ -99,22 +99,22 @@ public override bool HasAddress(uint addr) return false; } - public override bool IO_Write(ushort port, byte value) + public override bool IO_Write(ushort port, ushort value) { - Log.DoLog($"CGA::IO_Write {port:X4} {value:X2}", true); + Log.DoLog($"CGA::IO_Write {port:X4} {value:X4}", true); if (port == 0x3d4 || port == 0x3d6 || port == 0x3d0 || port == 0x3d2) - _m6845_reg = value; + _m6845_reg = (byte)value; else if (port == 0x3d5 || port == 0x3d7 || port == 0x3d1 || port == 0x3d3) { - _m6845.Write(_m6845_reg, value); + _m6845.Write(_m6845_reg, (byte)value); _display_address = (uint)(_m6845.Read(12) << 8) | _m6845.Read(13); Log.DoLog($"Set base address to {_display_address:X04}", true); Redraw(); } else if (port == 0x3d8) { - if (_graphics_mode != value) + if (_graphics_mode != (byte)value) { if ((value & 2) == 2) // graphics 320x200 { @@ -146,14 +146,14 @@ public override bool IO_Write(ushort port, byte value) _gf.height = font_descr.height * 25; } _gf.rgb_pixels = new byte[_gf.width * _gf.height * 3]; - _graphics_mode = value; - Log.DoLog($"CGA mode is now {value:X02} ({_cga_mode}), {_gf.width}x{_gf.height}", true); + _graphics_mode = (byte)value; + Log.DoLog($"CGA mode is now {value:X04} ({_cga_mode}), {_gf.width}x{_gf.height}", true); Redraw(); } } else if (port == 0x3d9) { - _color_configuration = value; + _color_configuration = (byte)value; Log.DoLog($"CGA color configuration: {_color_configuration:X02}", true); } else @@ -164,7 +164,7 @@ public override bool IO_Write(ushort port, byte value) return false; } - public override (byte, bool) IO_Read(ushort port) + public override (ushort, bool) IO_Read(ushort port) { Log.DoLog("CGA::IO_Read", true); diff --git a/Device.cs b/Device.cs index 659c845..c1229c2 100644 --- a/Device.cs +++ b/Device.cs @@ -7,8 +7,8 @@ abstract class Device public abstract String GetName(); public abstract void RegisterDevice(Dictionary mappings); - public abstract bool IO_Write(ushort port, byte value); - public abstract (byte, bool) IO_Read(ushort port); + public abstract bool IO_Write(ushort port, ushort value); + public abstract (ushort, bool) IO_Read(ushort port); public int GetWaitStateCycles() { diff --git a/Display.cs b/Display.cs index a774370..d7d5649 100644 --- a/Display.cs +++ b/Display.cs @@ -94,7 +94,7 @@ public void SyncClock(int clock) public abstract override bool HasAddress(uint addr); - public abstract override bool IO_Write(ushort port, byte value); + public abstract override bool IO_Write(ushort port, ushort value); protected bool IsHsync() { @@ -107,7 +107,7 @@ protected bool IsHsync() return hsync; } - public abstract override (byte, bool) IO_Read(ushort port); + public abstract override (ushort, bool) IO_Read(ushort port); protected void EmulateTextDisplay(uint x, uint y, byte character, byte attributes) { diff --git a/IO.cs b/IO.cs index fc448c1..843183b 100644 --- a/IO.cs +++ b/IO.cs @@ -94,7 +94,7 @@ public bool Out(ushort addr, ushort value) else { if (_io_map.ContainsKey(addr)) - return _io_map[addr].IO_Write(addr, (byte)value); + return _io_map[addr].IO_Write(addr, value); } #if DEBUG diff --git a/MDA.cs b/MDA.cs index 8339928..468806b 100644 --- a/MDA.cs +++ b/MDA.cs @@ -51,14 +51,14 @@ public override bool HasAddress(uint addr) return addr >= 0xb0000 && addr < 0xb8000; } - public override bool IO_Write(ushort port, byte value) + public override bool IO_Write(ushort port, ushort value) { - Log.DoLog($"MDA::IO_Write {port:X4} {value:X2}", true); + Log.DoLog($"MDA::IO_Write {port:X4} {value:X4}", true); return false; } - public override (byte, bool) IO_Read(ushort port) + public override (ushort, bool) IO_Read(ushort port) { byte rc = 0; diff --git a/MIDI.cs b/MIDI.cs index aee1185..0d033e8 100644 --- a/MIDI.cs +++ b/MIDI.cs @@ -30,7 +30,7 @@ public override void RegisterDevice(Dictionary mappings) mappings[0x0331] = this; } - public override (byte, bool) IO_Read(ushort port) + public override (ushort, bool) IO_Read(ushort port) { if (port == 0x331) return (0, false); @@ -38,7 +38,7 @@ public override (byte, bool) IO_Read(ushort port) return (0xaa, false); } - public override bool IO_Write(ushort port, byte value) + public override bool IO_Write(ushort port, ushort value) { // maybe buffer upto the expected byte-count first? if (port == 0x330) @@ -51,7 +51,7 @@ public override bool IO_Write(ushort port, byte value) if (_buffer_offset < _buffer.Length) { - _buffer[_buffer_offset++] = value; + _buffer[_buffer_offset++] = (byte)value; } if (_buffer_offset == _buffer.Length) diff --git a/PPI.cs b/PPI.cs index 6aa50b6..2546f28 100644 --- a/PPI.cs +++ b/PPI.cs @@ -2,7 +2,6 @@ internal class PPI : Device { private byte _control = 0; private bool _dipswitches_high = false; - private byte [] _cache = new byte[4]; private Keyboard _kb = null; public PPI(Keyboard kb) @@ -28,7 +27,7 @@ public override void RegisterDevice(Dictionary mappings) mappings[0x0063] = this; } - public override (byte, bool) IO_Read(ushort port) + public override (ushort, bool) IO_Read(ushort port) { Log.DoLog($"PPI::IO_Read: {port:X4}", true); @@ -45,12 +44,10 @@ public override (byte, bool) IO_Read(ushort port) return _kb.IO_Read(port); } - public override bool IO_Write(ushort port, byte value) + public override bool IO_Write(ushort port, ushort value) { Log.DoLog($"PPI::IO_Write: {port:X4} {value:X2}", true); - _cache[port - 0x0060] = value; - if (port == 0x0061) { if ((_control & 4) == 4) // dipswitches selection @@ -62,7 +59,7 @@ public override bool IO_Write(ushort port, byte value) } else if (port == 0x0063) { - _control = value; + _control = (byte)value; return false; } diff --git a/RTC.cs b/RTC.cs index ef83961..97a2ee0 100644 --- a/RTC.cs +++ b/RTC.cs @@ -37,7 +37,7 @@ private byte ToBCD(int v) return (byte)((d1 << 4) | d2); } - public override (byte, bool) IO_Read(ushort port) + public override (ushort, bool) IO_Read(ushort port) { byte rc = 0xff; @@ -85,7 +85,7 @@ public override (byte, bool) IO_Read(ushort port) return (rc, false); } - public override bool IO_Write(ushort port, byte value) + public override bool IO_Write(ushort port, ushort value) { Log.DoLog($"RTC OUT {port:X04}, value {value:X02} (index: {_cmos_ram_index:X02})"); @@ -93,7 +93,7 @@ public override bool IO_Write(ushort port, byte value) _cmos_ram_index = (byte)(value & 127); else { - _ram[_cmos_ram_index] = value; + _ram[_cmos_ram_index] = (byte)value; } return false; diff --git a/XTIDE.cs b/XTIDE.cs index 796eb12..a78facd 100644 --- a/XTIDE.cs +++ b/XTIDE.cs @@ -12,7 +12,7 @@ class XTIDE : Device private ushort _cylinder_count = 614; private ushort _head_count = 4; private ushort _sectors_per_track = 17; - private byte[] _registers = new byte[8]; + private ushort[] _registers = new ushort[8]; public XTIDE(List disk_filenames) { @@ -272,12 +272,12 @@ private void ResetStatusRegister() SetDRDY(); } - public override (byte, bool) IO_Read(ushort port) + public override (ushort, bool) IO_Read(ushort port) { int register = (port - 0x300) / 2; string name = _io_names[register]; - byte rc = 0xee; + ushort rc = 0xee; if (port == 0x300) // Data register { @@ -318,7 +318,7 @@ private void StoreSectorBuffer() } } - public override bool IO_Write(ushort port, byte value) + public override bool IO_Write(ushort port, ushort value) { int register = (port - 0x300) / 2; string name = _io_names[register]; @@ -330,7 +330,11 @@ public override bool IO_Write(ushort port, byte value) { if (_sector_buffer_offset < _sector_buffer.Length) { - _sector_buffer[_sector_buffer_offset++] = value; + _sector_buffer[_sector_buffer_offset++] = (byte)value; // FIXME + if (value > 255) + Log.DoLog($"XT-IDE DATAREGISTER GREP {_sector_buffer_offset-1}: {value:X04}"); + else + Log.DoLog($"XT-IDE DATAREGISTER {_sector_buffer_offset-1}: {value:X04}"); } else if (_target_drive != 255) { diff --git a/floppy.cs b/floppy.cs index bd4e363..3007ec4 100644 --- a/floppy.cs +++ b/floppy.cs @@ -2,7 +2,7 @@ internal enum DataState { NotSet, WaitCmd, HaveData, WantData } class FloppyDisk : Device { - private byte [] _registers = new byte[8]; + private ushort [] _registers = new ushort[8]; private i8237 _dma_controller = null; protected int _irq_nr = 6; private bool _dma = false; @@ -110,7 +110,7 @@ public bool FifoExpectsData() return _data_state == DataState.WantData; } - public override (byte, bool) IO_Read(ushort port) + public override (ushort, bool) IO_Read(ushort port) { int bytes_left = _data == null ? 0 : (_data.Length - _data_offset); Log.DoLog($"Floppy-IN {_io_names[port - 0x3f0]}: {port:X4} {_data_state}, bytes left: {bytes_left}", true); @@ -280,7 +280,7 @@ public void DumpReply() #endif } - public override bool IO_Write(ushort port, byte value) + public override bool IO_Write(ushort port, ushort value) { if (_data_state == DataState.WantData || _data_state == DataState.HaveData) Log.DoLog($"Floppy-OUT {_io_names[port - 0x3f0]}: {port:X4} {value:X2} {_data_state} cmd:{_data[0]:X} data left:{_data.Length - _data_offset}", true); @@ -382,7 +382,7 @@ public override bool IO_Write(ushort port, byte value) return false; } - _data[_data_offset++] = value; + _data[_data_offset++] = (byte)value; // FIXME if (_data_offset == _data.Length) { if (_data[0] == 0x06) // READ DATA diff --git a/i8253.cs b/i8253.cs index 59a6624..a0e4ec5 100644 --- a/i8253.cs +++ b/i8253.cs @@ -47,7 +47,7 @@ public override void RegisterDevice(Dictionary mappings) mappings[0x0043] = this; } - public override (byte, bool) IO_Read(ushort port) + public override (ushort, bool) IO_Read(ushort port) { if (port == 0x0040) return (GetCounter(0), _timers[0].is_pending); @@ -61,16 +61,16 @@ public override (byte, bool) IO_Read(ushort port) return (0xaa, false); } - public override bool IO_Write(ushort port, byte value) + public override bool IO_Write(ushort port, ushort value) { if (port == 0x0040) - LatchCounter(0, value); + LatchCounter(0, (byte)value); else if (port == 0x0041) - LatchCounter(1, value); + LatchCounter(1, (byte)value); else if (port == 0x0042) - LatchCounter(2, value); + LatchCounter(2, (byte)value); else if (port == 0x0043) - Command(value); + Command((byte)value); return _timers[0].is_pending || _timers[1].is_pending || _timers[2].is_pending; } diff --git a/keyboard.cs b/keyboard.cs index c5f1ea3..0d7797f 100644 --- a/keyboard.cs +++ b/keyboard.cs @@ -42,22 +42,22 @@ public override void RegisterDevice(Dictionary mappings) // see PPI } - public override bool IO_Write(ushort port, byte value) + public override bool IO_Write(ushort port, ushort value) { if (port == 0x0061) { - _0x61_bits = value; + _0x61_bits = (byte)value; if ((value & 0x40) == 0x00) { - Log.DoLog($"Keyboard::IO_Write: clock low ({value:X2})"); + Log.DoLog($"Keyboard::IO_Write: clock low ({value:X4})"); _clock_low = true; } else if (_clock_low) { _clock_low = false; - Log.DoLog($"Keyboard::IO_Write: reset triggered; clock high ({value:X2})"); + Log.DoLog($"Keyboard::IO_Write: reset triggered; clock high ({value:X4})"); _keyboard_buffer_lock.WaitOne(); _keyboard_buffer.Clear(); _keyboard_buffer.Enqueue(0xaa); // power on reset reply @@ -70,7 +70,7 @@ public override bool IO_Write(ushort port, byte value) return false; } - public override (byte, bool) IO_Read(ushort port) + public override (ushort, bool) IO_Read(ushort port) { if (port == 0x60) {