From b13944c81c40b857907e1cb5720ef1975eda73b4 Mon Sep 17 00:00:00 2001 From: Josh Dersch Date: Thu, 19 Nov 2015 17:41:16 -0800 Subject: [PATCH] Implemented proper video timing, basic mouse support and fixed microcode RAM loading. MARTEST now passes with flying colors; more things are running. Suspect disk timing for other failures. --- Contralto/AltoSystem.cs | 12 +- Contralto/CPU/CPU.cs | 2 +- Contralto/CPU/MicroInstruction.cs | 58 ++- Contralto/CPU/Tasks/CursorTask.cs | 16 +- Contralto/CPU/Tasks/DiskTask.cs | 7 + Contralto/CPU/Tasks/DisplayHorizontalTask.cs | 12 + Contralto/CPU/Tasks/DisplayWordTask.cs | 24 +- Contralto/CPU/Tasks/MemoryRefreshTask.cs | 12 +- Contralto/CPU/Tasks/Task.cs | 63 +-- Contralto/CPU/UCodeMemory.cs | 31 +- Contralto/Contralto.csproj | 1 + Contralto/Debugger.Designer.cs | 255 +++++------ Contralto/Debugger.cs | 109 ++++- Contralto/Display/DisplayController.cs | 439 ++++++++++++------- Contralto/Display/FakeDisplayController.cs | 8 +- Contralto/IO/DiskController.cs | 13 +- Contralto/IO/Mouse.cs | 191 ++++++++ Contralto/Logging/Log.cs | 2 +- Contralto/Memory/Memory.cs | 5 +- Contralto/Memory/MemoryBus.cs | 7 +- 20 files changed, 889 insertions(+), 378 deletions(-) create mode 100644 Contralto/IO/Mouse.cs diff --git a/Contralto/AltoSystem.cs b/Contralto/AltoSystem.cs index 3fc6fbe..42782ec 100644 --- a/Contralto/AltoSystem.cs +++ b/Contralto/AltoSystem.cs @@ -24,11 +24,13 @@ namespace Contralto _keyboard = new Keyboard(); _diskController = new DiskController(this); _displayController = new DisplayController(this); + _mouse = new Mouse(); //_fakeDisplayController = new FakeDisplayController(this); // Attach memory-mapped devices to the bus _memBus.AddDevice(_mem); _memBus.AddDevice(_keyboard); + _memBus.AddDevice(_mouse); // Register devices that need clocks _clockableDevices = new List(); @@ -56,7 +58,9 @@ namespace Contralto ALU.Reset(); Shifter.Reset(); _diskController.Reset(); - _displayController.Reset(); + _displayController.Reset(); + _keyboard.Reset(); + _mouse.Reset(); } /// @@ -110,6 +114,11 @@ namespace Contralto get { return _keyboard; } } + public Mouse Mouse + { + get { return _mouse; } + } + public Scheduler Scheduler { get { return _scheduler; } @@ -136,6 +145,7 @@ namespace Contralto private MemoryBus _memBus; private Contralto.Memory.Memory _mem; private Keyboard _keyboard; + private Mouse _mouse; private DiskController _diskController; private DisplayController _displayController; // private FakeDisplayController _fakeDisplayController; diff --git a/Contralto/CPU/CPU.cs b/Contralto/CPU/CPU.cs index 931fc05..ca9985d 100644 --- a/Contralto/CPU/CPU.cs +++ b/Contralto/CPU/CPU.cs @@ -144,7 +144,7 @@ namespace Contralto.CPU { if (_tasks[(int)task] != null) { - _tasks[(int)task].WakeupTask(); + _tasks[(int)task].WakeupTask(); } } diff --git a/Contralto/CPU/MicroInstruction.cs b/Contralto/CPU/MicroInstruction.cs index d26b654..1a3fff7 100644 --- a/Contralto/CPU/MicroInstruction.cs +++ b/Contralto/CPU/MicroInstruction.cs @@ -1,4 +1,5 @@ -using System; +using Contralto.Memory; +using System; namespace Contralto.CPU { @@ -157,6 +158,7 @@ namespace Contralto.CPU { public MicroInstruction(UInt32 code) { + // Parse fields RSELECT = (code & 0xf8000000) >> 27; ALUF = (AluFunction)((code & 0x07800000) >> 23); BS = (BusSource)((code & 0x00700000) >> 20); @@ -165,6 +167,54 @@ namespace Contralto.CPU LoadT = ((code & 0x00000800) >> 11) == 0 ? false : true; LoadL = ((code & 0x00000400) >> 10) == 0 ? false : true; NEXT = (ushort)(code & 0x3ff); + + // Parse metadata: + + // Whether this instruction references constant memory + ConstantAccess = + F1 == SpecialFunction1.Constant || + F2 == SpecialFunction2.Constant; + + // Whether this instruction accesses memory + MemoryAccess = + (BS == BusSource.ReadMD && !ConstantAccess) || // ReadMD only occurs if not reading from constant ROM. + F1 == SpecialFunction1.LoadMAR || + F2 == SpecialFunction2.StoreMD; + + // What kind of memory access this instruction performs, if any. + if (MemoryAccess) + { + if (BS == BusSource.ReadMD) + { + MemoryOperation = MemoryOperation.Read; + } + else if (F1 == SpecialFunction1.LoadMAR) + { + MemoryOperation = MemoryOperation.LoadAddress; + } + else + { + MemoryOperation = MemoryOperation.Store; + } + } + else + { + MemoryOperation = MemoryOperation.None; + } + + // Whether to load T from the ALU or the bus. + switch (ALUF) + { + case AluFunction.Bus: + case AluFunction.BusOrT: + case AluFunction.BusPlus1: + case AluFunction.BusMinus1: + case AluFunction.BusPlusTPlus1: + case AluFunction.BusPlusSkip: + case AluFunction.AluBusAndT: + LoadTFromALU = true; + break; + } } public override string ToString() @@ -188,5 +238,11 @@ namespace Contralto.CPU public bool LoadT; public bool LoadL; public ushort NEXT; + + // Metadata about the instruction that can be precalculated and used during execution + public bool ConstantAccess; + public bool MemoryAccess; + public MemoryOperation MemoryOperation; + public bool LoadTFromALU; } } diff --git a/Contralto/CPU/Tasks/CursorTask.cs b/Contralto/CPU/Tasks/CursorTask.cs index d96c280..edee40c 100644 --- a/Contralto/CPU/Tasks/CursorTask.cs +++ b/Contralto/CPU/Tasks/CursorTask.cs @@ -13,19 +13,29 @@ namespace Contralto.CPU { _taskType = TaskType.Cursor; _wakeup = false; - } - + } + + protected override bool ExecuteInstruction(MicroInstruction instruction) + { + // We put ourselves back to sleep immediately once we've started running + _wakeup = false; + + return base.ExecuteInstruction(instruction); + } + protected override void ExecuteSpecialFunction2(MicroInstruction instruction) { CursorF2 cf2 = (CursorF2)instruction.F2; switch (cf2) { case CursorF2.LoadXPREG: - // TODO: load cursor X-position register from bus + // Load cursor X-position register from bus + _cpu._system.DisplayController.LoadXPREG(_busData); break; case CursorF2.LoadCSR: // TODO: load cursor shift register from bus + _cpu._system.DisplayController.LoadCSR(_busData); break; default: diff --git a/Contralto/CPU/Tasks/DiskTask.cs b/Contralto/CPU/Tasks/DiskTask.cs index 7907b82..de333cf 100644 --- a/Contralto/CPU/Tasks/DiskTask.cs +++ b/Contralto/CPU/Tasks/DiskTask.cs @@ -34,8 +34,15 @@ namespace Contralto.CPU { // Sector task is running; clear enable for seclate signal _cpu._system.DiskController.DisableSeclate(); + } + /* + if (_taskType == TaskType.DiskWord) + { + _wakeup = false; + } */ + return task; } diff --git a/Contralto/CPU/Tasks/DisplayHorizontalTask.cs b/Contralto/CPU/Tasks/DisplayHorizontalTask.cs index 5ce6ac1..eb8a6c5 100644 --- a/Contralto/CPU/Tasks/DisplayHorizontalTask.cs +++ b/Contralto/CPU/Tasks/DisplayHorizontalTask.cs @@ -34,12 +34,24 @@ namespace Contralto.CPU case DisplayHorizontalF2.SETMODE: _cpu._system.DisplayController.SETMODE(_busData); + + // "If bit 0 = 1, the bit clock rate is set to 100ns period (at the start of the next scan line), + // and a 1 is merged into NEXT[9]." + if ((_busData & 0x8000) != 0) + { + _nextModifier |= 1; + } break; default: throw new InvalidOperationException(String.Format("Unhandled display word F2 {0}.", dh2)); } } + + protected override void ExecuteBlock() + { + _cpu._system.DisplayController.DHTBLOCK = true; + } } } } diff --git a/Contralto/CPU/Tasks/DisplayWordTask.cs b/Contralto/CPU/Tasks/DisplayWordTask.cs index 7867459..46b0464 100644 --- a/Contralto/CPU/Tasks/DisplayWordTask.cs +++ b/Contralto/CPU/Tasks/DisplayWordTask.cs @@ -12,14 +12,17 @@ namespace Contralto.CPU { public DisplayWordTask(AltoCPU cpu) : base(cpu) { - _taskType = TaskType.DisplayWord; - _wakeup = false; + _taskType = TaskType.DisplayWord; + _wakeup = false; } protected override bool ExecuteInstruction(MicroInstruction instruction) { - // We put ourselves back to sleep immediately once we've started running - _wakeup = false; + // We remove our wakeup only if there isn't a wakeup being generated for us by the + // display controller. + _wakeup = (!_cpu._system.DisplayController.FIFOFULL && + !_cpu._system.DisplayController.DHTBLOCK && + !_cpu._system.DisplayController.DWTBLOCK); return base.ExecuteInstruction(instruction); } @@ -37,6 +40,19 @@ namespace Contralto.CPU throw new InvalidOperationException(String.Format("Unhandled display word F2 {0}.", dw2)); } } + + protected override void ExecuteBlock() + { + _cpu._system.DisplayController.DWTBLOCK = true; + + // + // Wake up DHT if it has not blocked itself. + // + if (!_cpu._system.DisplayController.DHTBLOCK) + { + _cpu.WakeupTask(TaskType.DisplayHorizontal); + } + } } } } diff --git a/Contralto/CPU/Tasks/MemoryRefreshTask.cs b/Contralto/CPU/Tasks/MemoryRefreshTask.cs index 7cc0927..d00348b 100644 --- a/Contralto/CPU/Tasks/MemoryRefreshTask.cs +++ b/Contralto/CPU/Tasks/MemoryRefreshTask.cs @@ -12,7 +12,17 @@ _taskType = TaskType.MemoryRefresh; _wakeup = false; - } + } + + protected override bool ExecuteInstruction(MicroInstruction instruction) + { + // + // Based on readings of the MRT microcode, the MRT keeps its wakeup + // until it executes a BLOCK. + // "; This version assumes MRTACT is cleared by BLOCK, not MAR<- R37" + // + return base.ExecuteInstruction(instruction); + } } } } diff --git a/Contralto/CPU/Tasks/Task.cs b/Contralto/CPU/Tasks/Task.cs index 746cdd4..0bf521b 100644 --- a/Contralto/CPU/Tasks/Task.cs +++ b/Contralto/CPU/Tasks/Task.cs @@ -68,7 +68,7 @@ namespace Contralto.CPU public bool ExecuteNext() { // TODO: cache microinstructions (or pre-decode them) to save consing all these up every time. - MicroInstruction instruction = UCodeMemory.GetInstruction(_mpc); + MicroInstruction instruction = UCodeMemory.GetInstruction(_mpc, _taskType); // Grab BLOCK bit so that other tasks / hardware can look at it _block = instruction.F1 == SpecialFunction1.Block; @@ -105,30 +105,10 @@ namespace Contralto.CPU // Wait for memory state machine if a memory operation is requested by this instruction and // the memory isn't ready yet. // TODO: this needs to be seriously cleaned up. - // - bool constantAccess = - instruction.F1 == SpecialFunction1.Constant || - instruction.F2 == SpecialFunction2.Constant; - if ((instruction.BS == BusSource.ReadMD && !constantAccess) || // ReadMD only occurs if not reading from constant ROM. - instruction.F1 == SpecialFunction1.LoadMAR || - instruction.F2 == SpecialFunction2.StoreMD) - { - MemoryOperation op; - - if (instruction.BS == BusSource.ReadMD) - { - op = MemoryOperation.Read; - } - else if (instruction.F1 == SpecialFunction1.LoadMAR) - { - op = MemoryOperation.LoadAddress; - } - else - { - op = MemoryOperation.Store; - } - - if (!_cpu._system.MemoryBus.Ready(op)) + // + if (instruction.MemoryAccess) + { + if (!_cpu._system.MemoryBus.Ready(instruction.MemoryOperation)) { // Suspend operation for this cycle. return false; @@ -145,7 +125,7 @@ namespace Contralto.CPU ExecuteSpecialFunction2Early(instruction); // Select BUS data. - if (!constantAccess) + if (!instruction.ConstantAccess) { // Normal BUS data (not constant ROM access). switch (instruction.BS) @@ -172,9 +152,8 @@ namespace Contralto.CPU _busData = _cpu._system.MemoryBus.ReadMD(); break; - case BusSource.ReadMouse: - //throw new NotImplementedException("ReadMouse bus source not implemented."); - _busData = 0; // TODO: implement; + case BusSource.ReadMouse: + _busData = _cpu._system.Mouse.PollMouseBits(); break; case BusSource.ReadDisp: @@ -217,7 +196,7 @@ namespace Contralto.CPU // selection of R; they do not affect the address supplied to the constant ROM." // Hence we use the unmodified RSELECT value here and above. if ((int)instruction.BS > 4 || - constantAccess) + instruction.ConstantAccess) { _busData &= ControlROM.ConstantROM[(instruction.RSELECT << 3) | ((uint)instruction.BS)]; } @@ -372,7 +351,6 @@ namespace Contralto.CPU ExecuteSpecialFunction2(instruction); break; } - // We always do the shifter operation; DNS may need its output. // @@ -397,30 +375,15 @@ namespace Contralto.CPU // Load T if (instruction.LoadT) { - // Does this operation change the source for T? - bool loadTFromALU = false; - switch (instruction.ALUF) - { - case AluFunction.Bus: - case AluFunction.BusOrT: - case AluFunction.BusPlus1: - case AluFunction.BusMinus1: - case AluFunction.BusPlusTPlus1: - case AluFunction.BusPlusSkip: - case AluFunction.AluBusAndT: - loadTFromALU = true; - break; - } - - _cpu._t = loadTFromALU ? aluData : _busData; + // Does this operation change the source for T? + _cpu._t = instruction.LoadTFromALU ? aluData : _busData; // // Control RAM: "...the control RAM address is specified by the control RAM // address register... which is loaded from the ALU output whenver T is loaded // from its source." // - UCodeMemory.LoadControlRAMAddress(aluData); - + UCodeMemory.LoadControlRAMAddress(aluData); } // Load L (and M) from ALU outputs. @@ -444,7 +407,7 @@ namespace Contralto.CPU // if (swMode) { - Console.WriteLine("SWMODE NEXT {0} Modifier {1}", Conversion.ToOctal(instruction.NEXT), Conversion.ToOctal(nextModifier)); + //Console.WriteLine("SWMODE NEXT {0} Modifier {1}", Conversion.ToOctal(instruction.NEXT), Conversion.ToOctal(nextModifier)); UCodeMemory.SwitchMode((ushort)(instruction.NEXT | nextModifier)); } diff --git a/Contralto/CPU/UCodeMemory.cs b/Contralto/CPU/UCodeMemory.cs index 55c2d01..2aaa5ef 100644 --- a/Contralto/CPU/UCodeMemory.cs +++ b/Contralto/CPU/UCodeMemory.cs @@ -50,6 +50,12 @@ namespace Contralto.CPU // Precache ROM CacheMicrocodeROM(); + // Precache (empty) RAM + for(ushort i=0;i<_uCodeRam.Length;i++) + { + UpdateRAMCache(i); + } + // Start in ROM0 -- TODO: need to implement reset logic _microcodeBank = MicrocodeBank.ROM0; _ramAddr = 0; @@ -128,7 +134,7 @@ namespace Contralto.CPU if (_ramBank > 0) { //throw new InvalidOperationException("RAM bank > 0, unexpected."); - return 0xffff; + _ramBank = 0; } // pretend no ram for the moment @@ -162,7 +168,7 @@ namespace Contralto.CPU if (_ramBank > 0) { //throw new InvalidOperationException("RAM bank > 0, unexpected."); - return; + _ramBank = 0; } Logging.Log.Write(Logging.LogComponent.Microcode, "CRAM address for write: Bank {0}, addr {1}", @@ -186,9 +192,19 @@ namespace Contralto.CPU /// /// /// - public static MicroInstruction GetInstruction(ushort address) + public static MicroInstruction GetInstruction(ushort address, TaskType task) { - return _decodeCache[address + (int)_microcodeBank * 1024]; + // Only RAM-enabled tasks can execute from anything other than ROM (right now) + if (task == TaskType.Emulator) + { + // banked + return _decodeCache[address + (int)_microcodeBank * 1024]; + } + else + { + // ROM only + return _decodeCache[address]; + } } private static void LoadMicrocode(RomFile[] romInfo) @@ -244,9 +260,8 @@ namespace Contralto.CPU // Invert the requisite bits just to make things easier; the high bits of F1 and F2 and the Load L bit are inverted // already; we leave those alone. const UInt32 bitMask = 0x00088400; - - UInt32 masked = ~word & bitMask; - word = (word & ~bitMask) | masked; + + word ^= bitMask; return word; } @@ -270,7 +285,7 @@ namespace Contralto.CPU UInt32 instructionWord = _uCodeRam[address]; _decodeCache[2048 + address] = new MicroInstruction(MapRAMWord(instructionWord)); - Console.WriteLine(_decodeCache[2048 + address]); + //Console.WriteLine(_decodeCache[2048 + address]); } private static RomFile[] _uCodeRoms = diff --git a/Contralto/Contralto.csproj b/Contralto/Contralto.csproj index 60aebbb..ddd4168 100644 --- a/Contralto/Contralto.csproj +++ b/Contralto/Contralto.csproj @@ -92,6 +92,7 @@ + diff --git a/Contralto/Debugger.Designer.cs b/Contralto/Debugger.Designer.cs index b7076b7..1e82650 100644 --- a/Contralto/Debugger.Designer.cs +++ b/Contralto/Debugger.Designer.cs @@ -28,31 +28,31 @@ /// private void InitializeComponent() { - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle10 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle7 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle8 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle9 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle11 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle15 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle12 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle13 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle14 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle16 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle17 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle18 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle19 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle20 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle21 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle22 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle23 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle24 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle25 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle76 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle80 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle77 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle78 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle79 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle81 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle85 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle82 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle83 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle84 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle86 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle90 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle87 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle88 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle89 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle91 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle92 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle93 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle94 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle95 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle96 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle97 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle98 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle99 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle100 = new System.Windows.Forms.DataGridViewCellStyle(); this.Microcode = new System.Windows.Forms.GroupBox(); this.SourceTabs = new System.Windows.Forms.TabControl(); this.Rom0Page = new System.Windows.Forms.TabPage(); @@ -173,8 +173,8 @@ this._rom0SourceViewer.AllowUserToDeleteRows = false; this._rom0SourceViewer.AllowUserToResizeColumns = false; this._rom0SourceViewer.AllowUserToResizeRows = false; - dataGridViewCellStyle1.BackColor = System.Drawing.Color.Silver; - this._rom0SourceViewer.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1; + dataGridViewCellStyle76.BackColor = System.Drawing.Color.Silver; + this._rom0SourceViewer.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle76; this._rom0SourceViewer.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleVertical; this._rom0SourceViewer.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this._rom0SourceViewer.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { @@ -187,14 +187,14 @@ this._rom0SourceViewer.Name = "_rom0SourceViewer"; this._rom0SourceViewer.ReadOnly = true; this._rom0SourceViewer.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; - dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle5.BackColor = System.Drawing.SystemColors.Control; - dataGridViewCellStyle5.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle5.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle5.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle5.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this._rom0SourceViewer.RowHeadersDefaultCellStyle = dataGridViewCellStyle5; + dataGridViewCellStyle80.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle80.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle80.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle80.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle80.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle80.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle80.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this._rom0SourceViewer.RowHeadersDefaultCellStyle = dataGridViewCellStyle80; this._rom0SourceViewer.RowHeadersVisible = false; this._rom0SourceViewer.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; this._rom0SourceViewer.RowTemplate.Height = 18; @@ -223,9 +223,9 @@ // T // this.T.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader; - dataGridViewCellStyle2.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.T.DefaultCellStyle = dataGridViewCellStyle2; + dataGridViewCellStyle77.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle77.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.T.DefaultCellStyle = dataGridViewCellStyle77; this.T.HeaderText = "T"; this.T.Name = "T"; this.T.ReadOnly = true; @@ -236,8 +236,8 @@ // Addr // this.Addr.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader; - dataGridViewCellStyle3.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.Addr.DefaultCellStyle = dataGridViewCellStyle3; + dataGridViewCellStyle78.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Addr.DefaultCellStyle = dataGridViewCellStyle78; this.Addr.HeaderText = "Addr"; this.Addr.Name = "Addr"; this.Addr.ReadOnly = true; @@ -248,8 +248,8 @@ // Source // this.Source.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - dataGridViewCellStyle4.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.Source.DefaultCellStyle = dataGridViewCellStyle4; + dataGridViewCellStyle79.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Source.DefaultCellStyle = dataGridViewCellStyle79; this.Source.HeaderText = "Source Code"; this.Source.Name = "Source"; this.Source.ReadOnly = true; @@ -273,8 +273,8 @@ this._rom1SourceViewer.AllowUserToDeleteRows = false; this._rom1SourceViewer.AllowUserToResizeColumns = false; this._rom1SourceViewer.AllowUserToResizeRows = false; - dataGridViewCellStyle6.BackColor = System.Drawing.Color.Silver; - this._rom1SourceViewer.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle6; + dataGridViewCellStyle81.BackColor = System.Drawing.Color.Silver; + this._rom1SourceViewer.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle81; this._rom1SourceViewer.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleVertical; this._rom1SourceViewer.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this._rom1SourceViewer.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { @@ -287,14 +287,14 @@ this._rom1SourceViewer.Name = "_rom1SourceViewer"; this._rom1SourceViewer.ReadOnly = true; this._rom1SourceViewer.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; - dataGridViewCellStyle10.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle10.BackColor = System.Drawing.SystemColors.Control; - dataGridViewCellStyle10.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle10.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle10.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle10.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle10.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this._rom1SourceViewer.RowHeadersDefaultCellStyle = dataGridViewCellStyle10; + dataGridViewCellStyle85.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle85.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle85.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle85.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle85.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle85.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle85.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this._rom1SourceViewer.RowHeadersDefaultCellStyle = dataGridViewCellStyle85; this._rom1SourceViewer.RowHeadersVisible = false; this._rom1SourceViewer.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; this._rom1SourceViewer.RowTemplate.Height = 18; @@ -322,8 +322,8 @@ // dataGridViewTextBoxColumn4 // this.dataGridViewTextBoxColumn4.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader; - dataGridViewCellStyle7.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.dataGridViewTextBoxColumn4.DefaultCellStyle = dataGridViewCellStyle7; + dataGridViewCellStyle82.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.dataGridViewTextBoxColumn4.DefaultCellStyle = dataGridViewCellStyle82; this.dataGridViewTextBoxColumn4.HeaderText = "Addr"; this.dataGridViewTextBoxColumn4.Name = "dataGridViewTextBoxColumn4"; this.dataGridViewTextBoxColumn4.ReadOnly = true; @@ -334,9 +334,9 @@ // dataGridViewTextBoxColumn3 // this.dataGridViewTextBoxColumn3.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader; - dataGridViewCellStyle8.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle8.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.dataGridViewTextBoxColumn3.DefaultCellStyle = dataGridViewCellStyle8; + dataGridViewCellStyle83.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle83.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridViewTextBoxColumn3.DefaultCellStyle = dataGridViewCellStyle83; this.dataGridViewTextBoxColumn3.HeaderText = "Word"; this.dataGridViewTextBoxColumn3.Name = "dataGridViewTextBoxColumn3"; this.dataGridViewTextBoxColumn3.ReadOnly = true; @@ -347,8 +347,8 @@ // dataGridViewTextBoxColumn5 // this.dataGridViewTextBoxColumn5.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - dataGridViewCellStyle9.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.dataGridViewTextBoxColumn5.DefaultCellStyle = dataGridViewCellStyle9; + dataGridViewCellStyle84.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.dataGridViewTextBoxColumn5.DefaultCellStyle = dataGridViewCellStyle84; this.dataGridViewTextBoxColumn5.HeaderText = "Disassembly"; this.dataGridViewTextBoxColumn5.Name = "dataGridViewTextBoxColumn5"; this.dataGridViewTextBoxColumn5.ReadOnly = true; @@ -372,8 +372,8 @@ this._ram0SourceViewer.AllowUserToDeleteRows = false; this._ram0SourceViewer.AllowUserToResizeColumns = false; this._ram0SourceViewer.AllowUserToResizeRows = false; - dataGridViewCellStyle11.BackColor = System.Drawing.Color.Silver; - this._ram0SourceViewer.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle11; + dataGridViewCellStyle86.BackColor = System.Drawing.Color.Silver; + this._ram0SourceViewer.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle86; this._ram0SourceViewer.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleVertical; this._ram0SourceViewer.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this._ram0SourceViewer.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { @@ -386,14 +386,14 @@ this._ram0SourceViewer.Name = "_ram0SourceViewer"; this._ram0SourceViewer.ReadOnly = true; this._ram0SourceViewer.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; - dataGridViewCellStyle15.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle15.BackColor = System.Drawing.SystemColors.Control; - dataGridViewCellStyle15.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle15.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle15.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle15.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle15.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this._ram0SourceViewer.RowHeadersDefaultCellStyle = dataGridViewCellStyle15; + dataGridViewCellStyle90.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle90.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle90.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle90.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle90.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle90.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle90.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this._ram0SourceViewer.RowHeadersDefaultCellStyle = dataGridViewCellStyle90; this._ram0SourceViewer.RowHeadersVisible = false; this._ram0SourceViewer.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; this._ram0SourceViewer.RowTemplate.Height = 18; @@ -421,8 +421,8 @@ // dataGridViewTextBoxColumn7 // this.dataGridViewTextBoxColumn7.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader; - dataGridViewCellStyle12.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.dataGridViewTextBoxColumn7.DefaultCellStyle = dataGridViewCellStyle12; + dataGridViewCellStyle87.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.dataGridViewTextBoxColumn7.DefaultCellStyle = dataGridViewCellStyle87; this.dataGridViewTextBoxColumn7.HeaderText = "Addr"; this.dataGridViewTextBoxColumn7.Name = "dataGridViewTextBoxColumn7"; this.dataGridViewTextBoxColumn7.ReadOnly = true; @@ -433,9 +433,9 @@ // dataGridViewTextBoxColumn6 // this.dataGridViewTextBoxColumn6.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader; - dataGridViewCellStyle13.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle13.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.dataGridViewTextBoxColumn6.DefaultCellStyle = dataGridViewCellStyle13; + dataGridViewCellStyle88.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle88.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridViewTextBoxColumn6.DefaultCellStyle = dataGridViewCellStyle88; this.dataGridViewTextBoxColumn6.HeaderText = "Word"; this.dataGridViewTextBoxColumn6.Name = "dataGridViewTextBoxColumn6"; this.dataGridViewTextBoxColumn6.ReadOnly = true; @@ -446,8 +446,8 @@ // dataGridViewTextBoxColumn8 // this.dataGridViewTextBoxColumn8.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - dataGridViewCellStyle14.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.dataGridViewTextBoxColumn8.DefaultCellStyle = dataGridViewCellStyle14; + dataGridViewCellStyle89.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.dataGridViewTextBoxColumn8.DefaultCellStyle = dataGridViewCellStyle89; this.dataGridViewTextBoxColumn8.HeaderText = "Disassembly"; this.dataGridViewTextBoxColumn8.Name = "dataGridViewTextBoxColumn8"; this.dataGridViewTextBoxColumn8.ReadOnly = true; @@ -488,21 +488,21 @@ this._registerData.AllowUserToDeleteRows = false; this._registerData.AllowUserToResizeColumns = false; this._registerData.AllowUserToResizeRows = false; - dataGridViewCellStyle16.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); - this._registerData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle16; + dataGridViewCellStyle91.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this._registerData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle91; this._registerData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this._registerData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.RegNum, this.R, this.S}); - dataGridViewCellStyle17.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle17.BackColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle17.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle17.ForeColor = System.Drawing.SystemColors.ControlText; - dataGridViewCellStyle17.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle17.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle17.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this._registerData.DefaultCellStyle = dataGridViewCellStyle17; + dataGridViewCellStyle92.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle92.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle92.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle92.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle92.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle92.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle92.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this._registerData.DefaultCellStyle = dataGridViewCellStyle92; this._registerData.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically; this._registerData.Location = new System.Drawing.Point(7, 19); this._registerData.MultiSelect = false; @@ -608,21 +608,21 @@ // this._taskData.AllowUserToAddRows = false; this._taskData.AllowUserToDeleteRows = false; - dataGridViewCellStyle18.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); - this._taskData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle18; + dataGridViewCellStyle93.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this._taskData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle93; this._taskData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this._taskData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.TaskName, this.TaskState, this.TaskPC}); - dataGridViewCellStyle19.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle19.BackColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle19.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle19.ForeColor = System.Drawing.SystemColors.ControlText; - dataGridViewCellStyle19.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle19.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle19.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this._taskData.DefaultCellStyle = dataGridViewCellStyle19; + dataGridViewCellStyle94.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle94.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle94.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle94.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle94.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle94.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle94.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this._taskData.DefaultCellStyle = dataGridViewCellStyle94; this._taskData.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically; this._taskData.Location = new System.Drawing.Point(7, 19); this._taskData.MultiSelect = false; @@ -679,20 +679,20 @@ // this._otherRegs.AllowUserToAddRows = false; this._otherRegs.AllowUserToDeleteRows = false; - dataGridViewCellStyle20.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); - this._otherRegs.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle20; + dataGridViewCellStyle95.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this._otherRegs.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle95; this._otherRegs.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this._otherRegs.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.Reg, this.RegValue}); - dataGridViewCellStyle21.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle21.BackColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle21.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle21.ForeColor = System.Drawing.SystemColors.ControlText; - dataGridViewCellStyle21.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle21.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle21.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this._otherRegs.DefaultCellStyle = dataGridViewCellStyle21; + dataGridViewCellStyle96.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle96.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle96.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle96.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle96.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle96.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle96.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this._otherRegs.DefaultCellStyle = dataGridViewCellStyle96; this._otherRegs.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically; this._otherRegs.Location = new System.Drawing.Point(7, 19); this._otherRegs.MultiSelect = false; @@ -745,8 +745,8 @@ this._memoryData.AllowUserToAddRows = false; this._memoryData.AllowUserToDeleteRows = false; this._memoryData.AllowUserToResizeRows = false; - dataGridViewCellStyle22.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); - this._memoryData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle22; + dataGridViewCellStyle97.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this._memoryData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle97; this._memoryData.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.EnableWithoutHeaderText; this._memoryData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this._memoryData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { @@ -754,14 +754,14 @@ this.Address, this.Data, this.Disassembly}); - dataGridViewCellStyle23.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle23.BackColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle23.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle23.ForeColor = System.Drawing.SystemColors.ControlText; - dataGridViewCellStyle23.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle23.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle23.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this._memoryData.DefaultCellStyle = dataGridViewCellStyle23; + dataGridViewCellStyle98.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle98.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle98.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle98.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle98.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle98.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle98.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this._memoryData.DefaultCellStyle = dataGridViewCellStyle98; this._memoryData.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically; this._memoryData.Location = new System.Drawing.Point(6, 19); this._memoryData.MultiSelect = false; @@ -858,20 +858,20 @@ // this._diskData.AllowUserToAddRows = false; this._diskData.AllowUserToDeleteRows = false; - dataGridViewCellStyle24.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); - this._diskData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle24; + dataGridViewCellStyle99.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this._diskData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle99; this._diskData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this._diskData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.dataGridViewTextBoxColumn1, this.dataGridViewTextBoxColumn2}); - dataGridViewCellStyle25.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle25.BackColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle25.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle25.ForeColor = System.Drawing.SystemColors.ControlText; - dataGridViewCellStyle25.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle25.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle25.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this._diskData.DefaultCellStyle = dataGridViewCellStyle25; + dataGridViewCellStyle100.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle100.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle100.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle100.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle100.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle100.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle100.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this._diskData.DefaultCellStyle = dataGridViewCellStyle100; this._diskData.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically; this._diskData.Location = new System.Drawing.Point(6, 19); this._diskData.MultiSelect = false; @@ -957,6 +957,9 @@ this.DisplayBox.Size = new System.Drawing.Size(606, 808); this.DisplayBox.TabIndex = 0; this.DisplayBox.TabStop = false; + this.DisplayBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OnDisplayMouseDown); + this.DisplayBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.OnDisplayMouseMove); + this.DisplayBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnDisplayMouseUp); this.DisplayBox.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.DisplayBox_PreviewKeyDown); // // Debugger diff --git a/Contralto/Debugger.cs b/Contralto/Debugger.cs index c6a200e..c5ef512 100644 --- a/Contralto/Debugger.cs +++ b/Contralto/Debugger.cs @@ -91,7 +91,7 @@ namespace Contralto DisplayBox.Refresh(); // If you want interlacing to be more visible: - Array.Clear(_displayData, 0, _displayData.Length); + //Array.Clear(_displayData, 0, _displayData.Length); } /// @@ -100,18 +100,59 @@ namespace Contralto /// /// /// - public void DrawDisplayWord(int scanline, int wordOffset, ushort word) + public void DrawDisplayWord(int scanline, int wordOffset, ushort word, bool lowRes) { // TODO: move magic numbers to constants - int address = scanline * 76 + wordOffset * 2; - if (address > _displayData.Length) + if (lowRes) { - throw new InvalidOperationException("Display word address is out of bounds."); + // Low resolution; double up pixels. + int address = scanline * 76 + wordOffset * 4; + + if (address > _displayData.Length) + { + throw new InvalidOperationException("Display word address is out of bounds."); + } + + UInt32 stretched = StretchWord(word); + + _displayData[address] = (byte)(stretched >> 24); + _displayData[address + 1] = (byte)(stretched >> 16); + _displayData[address + 2] = (byte)(stretched >> 8); + _displayData[address + 3] = (byte)(stretched); + } + else + { + int address = scanline * 76 + wordOffset * 2; + + if (address > _displayData.Length) + { + throw new InvalidOperationException("Display word address is out of bounds."); + } + + _displayData[address] = (byte)(word >> 8); + _displayData[address + 1] = (byte)(word); + } + } + + /// + /// "Stretches" a 16 bit word into a 32-bit word (for low-res display purposes). + /// + /// + /// + private UInt32 StretchWord(ushort word) + { + UInt32 stretched = 0; + + for(int i=0x8000, j=15;j>=0; i=i>>1, j--) + { + uint bit = (uint)(word & i) >> j; + + stretched |= (bit << (j * 2 + 1)); + stretched |= (bit << (j * 2)); } - _displayData[address] = (byte)(word >> 8); - _displayData[address + 1] = (byte)(word); + return stretched; } private void RefreshUI() @@ -925,6 +966,56 @@ namespace Contralto } } + private void OnDisplayMouseMove(object sender, MouseEventArgs e) + { + _system.Mouse.MouseMove(e.X, e.Y); + } + + private void OnDisplayMouseDown(object sender, MouseEventArgs e) + { + AltoMouseButton button = AltoMouseButton.None; + + switch(e.Button) + { + case MouseButtons.Left: + button = AltoMouseButton.Left; + break; + + case MouseButtons.Right: + button = AltoMouseButton.Right; + break; + + case MouseButtons.Middle: + button = AltoMouseButton.Middle; + break; + } + + _system.Mouse.MouseDown(button); + + } + + private void OnDisplayMouseUp(object sender, MouseEventArgs e) + { + AltoMouseButton button = AltoMouseButton.None; + + switch (e.Button) + { + case MouseButtons.Left: + button = AltoMouseButton.Left; + break; + + case MouseButtons.Right: + button = AltoMouseButton.Right; + break; + + case MouseButtons.Middle: + button = AltoMouseButton.Middle; + break; + } + + _system.Mouse.MouseUp(button); + } + private void InitKeymap() { _keyMap = new Dictionary(); @@ -1034,6 +1125,8 @@ namespace Contralto private Rectangle _displayRect = new Rectangle(0, 0, 608, 808); // Keyboard mapping from windows vkeys to Alto keys - private Dictionary _keyMap; + private Dictionary _keyMap; + + } } diff --git a/Contralto/Display/DisplayController.cs b/Contralto/Display/DisplayController.cs index ad94721..b9d123d 100644 --- a/Contralto/Display/DisplayController.cs +++ b/Contralto/Display/DisplayController.cs @@ -27,194 +27,294 @@ namespace Contralto.Display set { _fields = value; } } + public bool DWTBLOCK + { + get { return _dwtBlocked; } + set { _dwtBlocked = value; } + } + + public bool DHTBLOCK + { + get { return _dhtBlocked; } + set { _dhtBlocked = value; } + } + + public bool FIFOFULL + { + get + { + return _dataBuffer.Count >= 16; + } + } + public void Reset() { - _evenField = true; - _clocks = 0; - _totalClocks = 0; - _state = DisplayState.VerticalBlank; + _evenField = false; _scanline = 0; _word = 0; _dwtBlocked = true; _dhtBlocked = false; - _whiteOnBlack = false; - _lowRes = false; + _whiteOnBlack = _whiteOnBlackLatch = false; + _lowRes = _lowResLatch = false; + _swModeLatch = false; + + _cursorReg = 0; + _cursorX = 0; + _cursorRegLatch = false; + _cursorXLatch = false; + + _verticalBlankEndWakeup = new Event(_verticalBlankDuration, null, VerticalBlankEndCallback); + _horizontalWakeup = new Event(_horizontalBlankDuration, null, HorizontalBlankEndCallback); + _wordWakeup = new Event(_wordDuration, null, WordCallback); + + // Kick things off + FieldStart(); + } + + private void FieldStart() + { + // Start of Vertical Blanking (end of last field). This lasts for 16 scanline times or so. + _evenField = !_evenField; // Wakeup DVT _system.CPU.WakeupTask(TaskType.DisplayVertical); + + // Block DHT, DWT _system.CPU.BlockTask(TaskType.DisplayHorizontal); _system.CPU.BlockTask(TaskType.DisplayWord); + + _fields++; + + _scanline = _evenField ? 0 : 1; + + // Schedule wakeup for end of vblank + _verticalBlankEndWakeup.TimestampNsec = _verticalBlankDuration; + _system.Scheduler.Schedule(_verticalBlankEndWakeup); + } + + private void VerticalBlankEndCallback(ulong timeNsec, ulong skewNsec, object context) + { + // End of VBlank, start new visible frame at beginning of first horizontal blanking period. + + // Wake up DHT + _system.CPU.WakeupTask(TaskType.DisplayHorizontal); + + _dataBuffer.Clear(); + + _dwtBlocked = false; + _dhtBlocked = false; + + // Schedule HBlank wakeup for end of first HBlank + _horizontalWakeup.TimestampNsec = _horizontalBlankDuration - skewNsec; + _system.Scheduler.Schedule(_horizontalWakeup); + + // Run MRT + //_system.CPU.WakeupTask(TaskType.MemoryRefresh); + + // Run CURT + _system.CPU.WakeupTask(TaskType.Cursor); + } + + private void HorizontalBlankEndCallback(ulong timeNsec, ulong skewNsec, object context) + { + // Reset scanline word counter + _word = 0; + + // Deal with SWMODE latches for the scanline we're about to draw + if (_swModeLatch) + { + _lowRes = _lowResLatch; + _whiteOnBlack = _whiteOnBlackLatch; + _swModeLatch = false; + } + + if (_cursorRegLatch) + { + _cursorRegLatched = _cursorReg; + _cursorRegLatch = false; + } + + if (_cursorXLatch) + { + _cursorXLatched = _cursorX; + _cursorXLatch = false; + } + + // Run MRT on end of hsync + _system.CPU.WakeupTask(TaskType.MemoryRefresh); + + // Schedule immediate wakeup for first word on this scanline + _wordWakeup.TimestampNsec = 0; + _system.Scheduler.Schedule(_wordWakeup); + } + + private void WordCallback(ulong timeNsec, ulong skewNsec, object context) + { + // Dequeue a word (if available) and draw it to the screen. + ushort displayWord = (ushort)(_whiteOnBlack ? 0 : 0xffff); + if (_dataBuffer.Count > 0) + { + displayWord = _whiteOnBlack ? _dataBuffer.Dequeue() : (ushort)~_dataBuffer.Dequeue(); + } + + // Merge in cursor word: + // Calculate X offset of current word + int xOffset = _word * (_lowRes ? 32 : 16); + + // Is cursor within this range? (Note cursor is always 16 bits wide regardless of + // display mode, but may span two 16-bit display words.) + if ((_cursorXLatched >= xOffset && _cursorXLatched < xOffset + 16) || + (_cursorXLatched + 16 >= xOffset & _cursorXLatched + 16 < xOffset + 16)) + { + // Yes. Merge bits in the appropriate place. + int shift = (_cursorXLatched - xOffset); + + // Which half of the 32-bit word the cursor will appear in are we in? + if (shift > 0) + { + // Take the cursor word shifted by the current offset + displayWord ^= (ushort)((_cursorRegLatched) >> shift); + } + else + { + // Take the cursor word shifted left + displayWord ^= (ushort)((_cursorRegLatched) << (-shift)); + } + } + + _display.DrawDisplayWord(_scanline, _word, displayWord, _lowRes); + + _word++; + + if (_word == (_lowRes ? _scanlineWords / 4 : _scanlineWords / 2)) + { + // Run MRT + //_system.CPU.WakeupTask(TaskType.MemoryRefresh); + } + + if (_word >= (_lowRes ? _scanlineWords / 2 : _scanlineWords)) + { + // End of scanline. + // Move to next. + _scanline += 2; + + if (_scanline > 807) + { + // Done with field. + + // Draw the completed field to the emulated display. + _display.RefreshAltoDisplay(); + + // And start over + FieldStart(); + } + else + { + // More scanlines to do. + + // Run CURT at end of scanline + _system.CPU.WakeupTask(TaskType.Cursor); + + // Schedule HBlank wakeup for end of next HBlank + _horizontalWakeup.TimestampNsec = _horizontalBlankDuration - skewNsec; + _system.Scheduler.Schedule(_horizontalWakeup); + _dwtBlocked = false; + _dataBuffer.Clear(); + + } + } + else + { + // More words to do. + // Schedule wakeup for next word + if (_lowRes) + { + _wordWakeup.TimestampNsec = _wordDuration * 2 - skewNsec; + } + else + { + _wordWakeup.TimestampNsec = _wordDuration - skewNsec; + } + _system.Scheduler.Schedule(_wordWakeup); + } } public void Clock() - { - - // - // Move the electron beam appropriately and wake up the display tasks - // as necessary. Render the display at the end of the field. - // - - // - // "The display control hardware also generates wakeup requests to the microprocessor - // tasking hardware. The vertical task DVT is awakened once per field, at the beginning - // of vertical retrace. The display horizontal task is awakened once at the beginning of - // each field, and thereafter whenever the display word task blocks. DHT can block itself, - // in which case neither it nor the word task can be awakened until the start of the next - // field. The wakeup request for the display word task (DWT) is controlled by the state - // of the 16 word buffer. If DWT has not executed a BLOCK, if DHT is not blocked, and if - // the buffer is not full, DWT wakeups are generated. The hardware sets the buffer empty - // and clears the DWT block flip-flop at the beginning of horizontal retrace for every - // scan line." - // - - // - // Check the BLOCK status of the DWT and DHT tasks for the last executed uInstruction. - // - - if (_system.CPU.CurrentTask.Priority == (int)CPU.TaskType.DisplayHorizontal && - _system.CPU.CurrentTask.BLOCK) - { - _dhtBlocked = true; - } - - if (_system.CPU.CurrentTask.Priority == (int)CPU.TaskType.DisplayWord && - _system.CPU.CurrentTask.BLOCK) - { - _dwtBlocked = true; - - // - // Wake up DHT if it has not blocked itself. - // - if (!_dhtBlocked) - { - _system.CPU.WakeupTask(TaskType.DisplayHorizontal); - } - } - - _clocks++; - _totalClocks++; - + { // // "If the DWT has not executed a BLOCK, if DHT is not blocked, and if the // buffer is not full, DWT wakeups are generated." // + // TODO: move this logic elsewhere so it doesn't have to be polled. if (_dataBuffer.Count < 16 && !_dhtBlocked && !_dwtBlocked) { _system.CPU.WakeupTask(TaskType.DisplayWord); } - - switch (_state) - { - case DisplayState.VerticalBlank: - // Just killing time - if (_clocks > _verticalBlankClocks) - { - // End of VBlank, start new visible frame - _clocks -= _verticalBlankClocks; - _scanline = _evenField ? 0 : 1; - _word = 0; - _dataBuffer.Clear(); - - // Wake up DVT, DHT - _dwtBlocked = false; - _dhtBlocked = false; - _system.CPU.WakeupTask(TaskType.DisplayHorizontal); - - _state = DisplayState.HorizontalBlank; - } - break; - - case DisplayState.VisibleScanline: - // - // A scanline is 38 words wide; we clock in each word - // from the buffer (if present). - // - if (_clocks > _wordClocks) - { - _clocks -= _wordClocks; - - ushort displayWord = (ushort)(_whiteOnBlack ? 0 : 0xffff); - if (_dataBuffer.Count > 0) - { - // Dequeue a word and draw it to the screen - displayWord = _whiteOnBlack ? _dataBuffer.Dequeue() : (ushort)~_dataBuffer.Dequeue(); - } - - _display.DrawDisplayWord(_scanline, _word, displayWord); - - _word++; - if (_word > 37) - { - // Done with this line - _dwtBlocked = false; - _dataBuffer.Clear(); - _state = DisplayState.HorizontalBlank; - } - } - break; - - case DisplayState.HorizontalBlank: - // Kill time until end of HBlank - if (_clocks > _horizontalBlankClocks) - { - _clocks -= _horizontalBlankClocks; - - // Move to next scanline - _scanline += 2; - _word = 0; - - if (_scanline > 807) - { - // Done with field, move to vblank, tell display to render - _state = DisplayState.VerticalBlank; - _evenField = !_evenField; - - // Wakeup DVT - _system.CPU.WakeupTask(TaskType.DisplayVertical); - - // Block DHT, DWT - _system.CPU.BlockTask(TaskType.DisplayHorizontal); - _system.CPU.BlockTask(TaskType.DisplayWord); - - _display.RefreshAltoDisplay(); - - _fields++; - //Log.Write(LogComponent.Display, "Display field completed. {0} total clocks elapsed.", _totalClocks); - _totalClocks = 0; - } - else - { - _state = DisplayState.VisibleScanline; - - // Run MRT - _system.CPU.WakeupTask(TaskType.MemoryRefresh); - } - } - break; - } } public void LoadDDR(ushort word) - { - _dataBuffer.Enqueue(word); + { - //Console.WriteLine("Enqueue {0}, scanline {1}", word, _scanline); + if (_dataBuffer.Count < 20) + { + _dataBuffer.Enqueue(word); + } + /* // Sanity check: data length should never exceed 16 words. - if (_dataBuffer.Count > 16) - { + if (_dataBuffer.Count >= 16) + { + //_dataBuffer.Dequeue(); //_system.CPU.BlockTask(TaskType.DisplayWord); - } + } */ + } + + public void LoadXPREG(ushort word) + { + if (!_cursorXLatch) + { + _cursorXLatch = true; + _cursorX = (ushort)(~word); + + //System.Console.WriteLine("XPREG {0}, scanline {1} word {2}", word, _scanline, _word); + } + } + + public void LoadCSR(ushort word) + { + /* + if (_cursorReg != 0 && word == 0) + { + System.Console.WriteLine("csr disabled, scanline {0}", _scanline); + } */ + + if (!_cursorRegLatch) + { + _cursorRegLatch = true; + _cursorReg = (ushort)word; + + if (word != 0) + { + //System.Console.WriteLine("csr {0} scanline {1}, word {2}", Conversion.ToOctal(word), _scanline, _word); + } + } + + } public void SETMODE(ushort word) { - _lowRes = (word & 0x8000) != 0; - _whiteOnBlack = (word & 0x4000) != 0; + // These take effect at the beginning of the next scanline. + if (!_swModeLatch) + { + _lowResLatch = (word & 0x8000) != 0; + _whiteOnBlackLatch = (word & 0x4000) != 0; + _swModeLatch = true; + } } public bool EVENFIELD @@ -230,13 +330,21 @@ namespace Contralto.Display HorizontalBlank, } + // MODE data private bool _evenField; private bool _lowRes; + private bool _lowResLatch; private bool _whiteOnBlack; - private double _clocks; - private double _totalClocks; - private int _fields; - private DisplayState _state; + private bool _whiteOnBlackLatch; + private bool _swModeLatch; + + // Cursor data + private bool _cursorRegLatch; + private ushort _cursorReg; + private ushort _cursorRegLatched; + private bool _cursorXLatch; + private ushort _cursorX; + private ushort _cursorXLatched; // Indicates whether the DWT or DHT blocked itself // in which case they cannot be reawakened until the next field. @@ -245,19 +353,28 @@ namespace Contralto.Display private int _scanline; private int _word; + private const int _scanlineWords = 38; private Queue _dataBuffer = new Queue(16); private AltoSystem _system; private Debugger _display; + private int _fields; + // Timing constants - // 38uS per scanline; 4uS for hblank. + // 38uS per scanline; 6uS for hblank. // ~35 scanlines for vblank (1330uS) - private const double _wordClocks = (34.0 / 38.0) / 0.060; // uSec to clocks - private const double _horizontalBlankClocks = 4.0 / 0.060; - private const double _verticalBlankClocks = 1333.0 / 0.060; - - + private const double _scale = 1.0; + private const ulong _verticalBlankDuration = (ulong)(665000.0 * _scale); // 665uS + private const ulong _horizontalBlankDuration = (ulong)(6084 * _scale); // 6uS + private const ulong _wordDuration = (ulong)(842.0 * _scale); // 32/38uS + + // + // Scheduler events + // + private Event _verticalBlankEndWakeup; + private Event _horizontalWakeup; + private Event _wordWakeup; } } diff --git a/Contralto/Display/FakeDisplayController.cs b/Contralto/Display/FakeDisplayController.cs index 19a184a..f0e8cd6 100644 --- a/Contralto/Display/FakeDisplayController.cs +++ b/Contralto/Display/FakeDisplayController.cs @@ -47,7 +47,7 @@ { for (int word = 0; word < 38; word++) { - _display.DrawDisplayWord(scanline, word, 0xffff); + _display.DrawDisplayWord(scanline, word, 0xffff, false); } } @@ -65,7 +65,7 @@ // fill in HTAB for(int htab = 0;htab= _sectorWordCount) + { + return; + } + ushort diskWord = _sectorData[_sectorWordIndex].Data; bool bWakeup = false; @@ -639,9 +645,10 @@ namespace Contralto.IO // $MIR0BL $177775; DISK INTERRECORD PREAMBLE IS 3 WORDS <<-- writing // $MRPAL $177775; DISK READ POSTAMBLE LENGTH IS 3 WORDS // $MWPAL $177773; DISK WRITE POSTAMBLE LENGTH IS 5 WORDS <<-- writing, clearly. - private static ulong _sectorDuration = (ulong)((40.0 / 12.0) * Conversion.MsecToNsec); // time in nsec for one sector + private static double _scale = 1.0; + private static ulong _sectorDuration = (ulong)((40.0 / 12.0) * Conversion.MsecToNsec * _scale); // time in nsec for one sector private static int _sectorWordCount = 269 + 22 + 34; // Based on : 269 data words (+ cksums) / sector, + X words for delay / preamble / sync - private static ulong _wordDuration = (ulong)(_sectorDuration / (ulong)(_sectorWordCount + 1)); // time in nsec for one word + private static ulong _wordDuration = (ulong)((_sectorDuration / (ulong)(_sectorWordCount + 1)) * _scale); // time in nsec for one word private int _sectorWordIndex; // current word being read private Event _sectorEvent; diff --git a/Contralto/IO/Mouse.cs b/Contralto/IO/Mouse.cs new file mode 100644 index 0000000..e914bc1 --- /dev/null +++ b/Contralto/IO/Mouse.cs @@ -0,0 +1,191 @@ +using Contralto.CPU; +using Contralto.Memory; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; + +namespace Contralto.IO +{ + [Flags] + public enum AltoMouseButton + { + None = 0x0, + Middle = 0x1, + Right = 0x2, + Left = 0x4, + } + + public class Mouse : IMemoryMappedDevice + { + public Mouse() + { + _lock = new ReaderWriterLockSlim(); + Reset(); + } + + public void Reset() + { + // cheat for synchronization: this is approximately where the mouse is initialized to + // at alto boot. + _mouseY = 80; + _mouseX = 0; + } + + public ushort Read(int address, TaskType task, bool extendedMemoryReference) + { + return (ushort)(~_buttons); + } + + public void Load(int address, ushort data, TaskType task, bool extendedMemoryReference) + { + // nothing + } + + public void MouseMove(int x, int y) + { + _lock.EnterWriteLock(); + _destX = x; + _destY = y; + + // Calculate number of steps in x and y to be decremented every call to PollMouseBits + _xSteps = Math.Abs(_destX - _mouseX); + _xDir = Math.Sign(_destX - _mouseX); + + _ySteps = Math.Abs(_destY - _mouseY); + _yDir = Math.Sign(_destY - _mouseY); + + //Console.WriteLine("Mouse move from ({0},{1}) to ({2},{3}).", _mouseX, _mouseY, _destX, _destY); + _lock.ExitWriteLock(); + } + + public void MouseDown(AltoMouseButton button) + { + _buttons |= button; + } + + public void MouseUp(AltoMouseButton button) + { + _buttons ^= button; + } + + /// + /// Gets the bits read by the "<-MOUSE" special function, and moves + /// the pointer one step closer to its final destination (if it has moved at all). + /// + /// + public ushort PollMouseBits() + { + // + // The bits returned correspond to the delta incurred by mouse movement in the X and Y direction + // and map to: + // 0 : no change in X or Y + // 1 : dy = -1 + // 2 : dy = 1 + // 3 : dx = -1 + // 4 : dy = -1, dx = -1 + // 5 : dy = 1, dx = -1 + // 6 : dx = 1 + // 7 : dy = -1, dx = 1 + // 8 : dy = 1, dx =1 + ushort bits = 0; + + _lock.EnterReadLock(); + // TODO: optimize this + if (_yDir == -1 && _xDir == 0) + { + bits = 1; + } + else if (_yDir == 1 && _xDir == 0) + { + bits = 2; + } + else if (_yDir == 0 && _xDir == -1) + { + bits = 3; + } + else if (_yDir == -1 && _xDir == -1) + { + bits = 4; + } + else if (_yDir == 1 && _xDir == -1) + { + bits = 5; + } + else if (_yDir == 0 && _xDir == 1) + { + bits = 6; + } + else if (_yDir == -1 && _xDir == 1) + { + bits = 7; + } + else if (_yDir == 1 && _xDir == 1) + { + bits = 8; + } + + //Console.WriteLine("Mouse poll: xdir {0}, ydir {1}, bits {2}", _xDir, _yDir, Conversion.ToOctal(bits)); + + // Move the mouse closer to its destination + if (_xSteps > 0) + { + _mouseX += _xDir; + _xSteps--; + + if (_xSteps == 0) + { + _xDir = 0; + } + } + + if (_ySteps > 0) + { + _mouseY += _yDir; + _ySteps--; + + if (_ySteps == 0) + { + _yDir = 0; + } + } + _lock.ExitReadLock(); + + return bits; + } + + public MemoryRange[] Addresses + { + get { return _addresses; } + } + + private readonly MemoryRange[] _addresses = + { + new MemoryRange(0xfe18, 0xfe1b), // UTILIN: 177030-177033 + }; + + // Mouse buttons: + AltoMouseButton _buttons; + + /// + /// Where the mouse is currently reported to be + /// + private int _mouseX; + private int _mouseY; + + /// + /// Where the mouse is moving to every time PollMouseBits is called. + /// + private int _destX; + private int _destY; + + private int _xSteps; + private int _xDir; + private double _ySteps; + private int _yDir; + + private ReaderWriterLockSlim _lock; + } +} + diff --git a/Contralto/Logging/Log.cs b/Contralto/Logging/Log.cs index 12f6d72..643d3e0 100644 --- a/Contralto/Logging/Log.cs +++ b/Contralto/Logging/Log.cs @@ -44,7 +44,7 @@ namespace Contralto.Logging static Log() { // TODO: make configurable - _components = LogComponent.None; + _components = LogComponent.None; //LogComponent.Memory; // | LogComponent.Microcode; _type = LogType.Normal | LogType.Warning | LogType.Error; } diff --git a/Contralto/Memory/Memory.cs b/Contralto/Memory/Memory.cs index 1cc69f5..c436f2b 100644 --- a/Contralto/Memory/Memory.cs +++ b/Contralto/Memory/Memory.cs @@ -13,7 +13,7 @@ namespace Contralto.Memory /// /// The top address of main memory (above which lies the I/O space) /// - public static ushort MemTop + public static ushort RamTop { get { return _memTop; } } @@ -35,8 +35,7 @@ namespace Contralto.Memory else { address += 0x10000 * GetBankNumber(task, extendedMemory); - ushort data = _mem[address]; - return data; + return _mem[address]; } } diff --git a/Contralto/Memory/MemoryBus.cs b/Contralto/Memory/MemoryBus.cs index b39c11c..de1f2cb 100644 --- a/Contralto/Memory/MemoryBus.cs +++ b/Contralto/Memory/MemoryBus.cs @@ -6,6 +6,7 @@ namespace Contralto.Memory { public enum MemoryOperation { + None, LoadAddress, Read, Store @@ -33,7 +34,7 @@ namespace Contralto.Memory if (_bus.ContainsKey(addr)) { throw new InvalidOperationException( - String.Format("Memory mapped address collision for dev {0} at address {1}", dev, Conversion.ToOctal(addr))); + String.Format("Memory mapped address collision for dev {0} at address {1} with {2}", dev, Conversion.ToOctal(addr), _bus[addr])); } else { @@ -269,7 +270,7 @@ namespace Contralto.Memory /// private ushort ReadFromBus(ushort address, TaskType task, bool extendedMemoryReference) { - if (address <= Memory.MemTop) + if (address <= Memory.RamTop) { // Main memory access; shortcut hashtable lookup for performance reasons. return _mainMemory.Read(address, task, extendedMemoryReference); @@ -301,7 +302,7 @@ namespace Contralto.Memory /// private void WriteToBus(ushort address, ushort data, TaskType task, bool extendedMemoryReference) { - if (address <= Memory.MemTop) + if (address <= Memory.RamTop) { // Main memory access; shortcut hashtable lookup for performance reasons. _mainMemory.Load(address, data, task, extendedMemoryReference);