mirror of
https://github.com/livingcomputermuseum/ContrAlto.git
synced 2026-01-19 17:37:59 +00:00
Implemented temporary "fake" display controller which renders Alto DCBs to the screen, bypassing the display microcode. Alto is booting! Rough keyboard implementation.
This commit is contained in:
parent
ca638f1d6e
commit
47a2ee4b2b
@ -25,6 +25,7 @@ namespace Contralto
|
||||
_keyboard = new Keyboard();
|
||||
_diskController = new DiskController(this);
|
||||
_displayController = new DisplayController(this);
|
||||
_fakeDisplayController = new FakeDisplayController(this);
|
||||
|
||||
// Attach memory-mapped devices to the bus
|
||||
_memBus.AddDevice(_mem);
|
||||
@ -35,6 +36,7 @@ namespace Contralto
|
||||
_clockableDevices.Add(_memBus);
|
||||
_clockableDevices.Add(_diskController);
|
||||
_clockableDevices.Add(_displayController);
|
||||
_clockableDevices.Add(_fakeDisplayController);
|
||||
_clockableDevices.Add(_cpu);
|
||||
|
||||
Reset();
|
||||
@ -60,6 +62,7 @@ namespace Contralto
|
||||
public void AttachDisplay(Debugger d)
|
||||
{
|
||||
_displayController.AttachDisplay(d);
|
||||
_fakeDisplayController.AttachDisplay(d);
|
||||
}
|
||||
|
||||
public void SingleStep()
|
||||
@ -91,6 +94,11 @@ namespace Contralto
|
||||
get { return _displayController; }
|
||||
}
|
||||
|
||||
public Keyboard Keyboard
|
||||
{
|
||||
get { return _keyboard; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Time (in msec) for one system clock
|
||||
/// </summary>
|
||||
@ -106,6 +114,7 @@ namespace Contralto
|
||||
private Keyboard _keyboard;
|
||||
private DiskController _diskController;
|
||||
private DisplayController _displayController;
|
||||
private FakeDisplayController _fakeDisplayController;
|
||||
|
||||
private List<IClockable> _clockableDevices;
|
||||
}
|
||||
|
||||
@ -33,8 +33,8 @@ namespace Contralto.CPU
|
||||
_tasks[(int)TaskType.DiskWord] = new DiskTask(this, false);
|
||||
//_tasks[(int)TaskType.DisplayWord] = new DisplayWordTask(this);
|
||||
//_tasks[(int)TaskType.DisplayHorizontal] = new DisplayHorizontalTask(this);
|
||||
//_tasks[(int)TaskType.DisplayVertical] = new DisplayVerticalTask(this);
|
||||
//_tasks[(int)TaskType.Cursor] = new CursorTask(this);
|
||||
_tasks[(int)TaskType.DisplayVertical] = new DisplayVerticalTask(this);
|
||||
_tasks[(int)TaskType.Cursor] = new CursorTask(this);
|
||||
_tasks[(int)TaskType.MemoryRefresh] = new MemoryRefreshTask(this);
|
||||
|
||||
Reset();
|
||||
@ -43,14 +43,14 @@ namespace Contralto.CPU
|
||||
public void Hack()
|
||||
{
|
||||
_tasks[(int)TaskType.DisplayWord] = new DisplayWordTask(this);
|
||||
_tasks[(int)TaskType.DisplayHorizontal] = new DisplayHorizontalTask(this);
|
||||
_tasks[(int)TaskType.DisplayVertical] = new DisplayVerticalTask(this);
|
||||
_tasks[(int)TaskType.Cursor] = new CursorTask(this);
|
||||
//_tasks[(int)TaskType.DisplayHorizontal] = new DisplayHorizontalTask(this);
|
||||
//_tasks[(int)TaskType.DisplayVertical] = new DisplayVerticalTask(this);
|
||||
//_tasks[(int)TaskType.Cursor] = new CursorTask(this);
|
||||
|
||||
_tasks[(int)TaskType.DisplayWord].Reset();
|
||||
_tasks[(int)TaskType.DisplayHorizontal].Reset();
|
||||
_tasks[(int)TaskType.DisplayVertical].Reset();
|
||||
_tasks[(int)TaskType.Cursor].Reset();
|
||||
//_tasks[(int)TaskType.DisplayHorizontal].Reset();
|
||||
//_tasks[(int)TaskType.DisplayVertical].Reset();
|
||||
//_tasks[(int)TaskType.Cursor].Reset();
|
||||
}
|
||||
|
||||
public Task[] Tasks
|
||||
|
||||
@ -151,6 +151,12 @@ namespace Contralto.CPU
|
||||
EVENFIELD = 8,
|
||||
}
|
||||
|
||||
enum CursorF2
|
||||
{
|
||||
LoadXPREG = 8,
|
||||
LoadCSR = 9,
|
||||
}
|
||||
|
||||
public class MicroInstruction
|
||||
{
|
||||
public MicroInstruction(UInt32 code)
|
||||
|
||||
@ -4,8 +4,6 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Contralto.Memory;
|
||||
|
||||
namespace Contralto.CPU
|
||||
{
|
||||
public partial class AltoCPU
|
||||
@ -17,23 +15,25 @@ namespace Contralto.CPU
|
||||
{
|
||||
public CursorTask(AltoCPU cpu) : base(cpu)
|
||||
{
|
||||
_taskType = TaskType.DisplayWord;
|
||||
|
||||
// The Wakeup signal is always true for the Emulator task.
|
||||
_taskType = TaskType.Cursor;
|
||||
_wakeup = false;
|
||||
}
|
||||
|
||||
protected override void ExecuteSpecialFunction2(MicroInstruction instruction)
|
||||
{
|
||||
DisplayWordF2 ef2 = (DisplayWordF2)instruction.F2;
|
||||
switch (ef2)
|
||||
CursorF2 cf2 = (CursorF2)instruction.F2;
|
||||
switch (cf2)
|
||||
{
|
||||
case DisplayWordF2.LoadDDR:
|
||||
case CursorF2.LoadXPREG:
|
||||
// TODO: load cursor X-position register from bus
|
||||
break;
|
||||
|
||||
case CursorF2.LoadCSR:
|
||||
// TODO: load cursor shift register from bus
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new InvalidOperationException(String.Format("Unhandled display word F2 {0}.", ef2));
|
||||
throw new InvalidOperationException(String.Format("Unhandled cursor F2 {0}.", cf2));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,8 +4,6 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Contralto.Memory;
|
||||
|
||||
namespace Contralto.CPU
|
||||
{
|
||||
public partial class AltoCPU
|
||||
@ -23,8 +21,8 @@ namespace Contralto.CPU
|
||||
|
||||
protected override void ExecuteSpecialFunction2(MicroInstruction instruction)
|
||||
{
|
||||
DisplayHorizontalF2 ef2 = (DisplayHorizontalF2)instruction.F2;
|
||||
switch (ef2)
|
||||
DisplayHorizontalF2 dh2 = (DisplayHorizontalF2)instruction.F2;
|
||||
switch (dh2)
|
||||
{
|
||||
case DisplayHorizontalF2.EVENFIELD:
|
||||
_nextModifier |= (ushort)(_cpu._system.DisplayController.EVENFIELD ? 1 : 0);
|
||||
@ -35,7 +33,7 @@ namespace Contralto.CPU
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new InvalidOperationException(String.Format("Unhandled display word F2 {0}.", ef2));
|
||||
throw new InvalidOperationException(String.Format("Unhandled display word F2 {0}.", dh2));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,8 +4,6 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Contralto.Memory;
|
||||
|
||||
namespace Contralto.CPU
|
||||
{
|
||||
public partial class AltoCPU
|
||||
@ -31,15 +29,15 @@ namespace Contralto.CPU
|
||||
|
||||
protected override void ExecuteSpecialFunction2(MicroInstruction instruction)
|
||||
{
|
||||
DisplayVerticalF2 ef2 = (DisplayVerticalF2)instruction.F2;
|
||||
switch (ef2)
|
||||
DisplayVerticalF2 dv2 = (DisplayVerticalF2)instruction.F2;
|
||||
switch (dv2)
|
||||
{
|
||||
case DisplayVerticalF2.EVENFIELD:
|
||||
_nextModifier |= (ushort)(_cpu._system.DisplayController.EVENFIELD ? 1 : 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new InvalidOperationException(String.Format("Unhandled display vertical F2 {0}.", ef2));
|
||||
throw new InvalidOperationException(String.Format("Unhandled display vertical F2 {0}.", dv2));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,7 +4,6 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Contralto.Memory;
|
||||
|
||||
namespace Contralto.CPU
|
||||
{
|
||||
@ -23,15 +22,15 @@ namespace Contralto.CPU
|
||||
|
||||
protected override void ExecuteSpecialFunction2(MicroInstruction instruction)
|
||||
{
|
||||
DisplayWordF2 ef2 = (DisplayWordF2)instruction.F2;
|
||||
switch (ef2)
|
||||
DisplayWordF2 dw2 = (DisplayWordF2)instruction.F2;
|
||||
switch (dw2)
|
||||
{
|
||||
case DisplayWordF2.LoadDDR:
|
||||
_cpu._system.DisplayController.LoadDDR(_busData);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new InvalidOperationException(String.Format("Unhandled display word F2 {0}.", ef2));
|
||||
throw new InvalidOperationException(String.Format("Unhandled display word F2 {0}.", dw2));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -66,6 +66,7 @@
|
||||
<Compile Include="Debugger.Designer.cs">
|
||||
<DependentUpon>Debugger.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Display\FakeDisplayController.cs" />
|
||||
<Compile Include="Display\DisplayController.cs" />
|
||||
<Compile Include="IClockable.cs" />
|
||||
<Compile Include="IO\DiskController.cs" />
|
||||
|
||||
183
Contralto/Debugger.Designer.cs
generated
183
Contralto/Debugger.Designer.cs
generated
@ -28,21 +28,21 @@
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle16 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle20 = 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 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 dataGridViewCellStyle26 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle27 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle28 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle29 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle30 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle31 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle35 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle32 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle33 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle34 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle36 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle37 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle38 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle39 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle40 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle41 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle42 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle43 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle44 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle45 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
this.Microcode = new System.Windows.Forms.GroupBox();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.JumpToAddress = new System.Windows.Forms.TextBox();
|
||||
@ -130,6 +130,7 @@
|
||||
this.JumpToAddress.Name = "JumpToAddress";
|
||||
this.JumpToAddress.Size = new System.Drawing.Size(48, 20);
|
||||
this.JumpToAddress.TabIndex = 12;
|
||||
this.JumpToAddress.TabStop = false;
|
||||
this.JumpToAddress.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnJumpAddressKeyDown);
|
||||
//
|
||||
// _sourceViewer
|
||||
@ -138,8 +139,8 @@
|
||||
this._sourceViewer.AllowUserToDeleteRows = false;
|
||||
this._sourceViewer.AllowUserToResizeColumns = false;
|
||||
this._sourceViewer.AllowUserToResizeRows = false;
|
||||
dataGridViewCellStyle16.BackColor = System.Drawing.Color.Silver;
|
||||
this._sourceViewer.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle16;
|
||||
dataGridViewCellStyle31.BackColor = System.Drawing.Color.Silver;
|
||||
this._sourceViewer.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle31;
|
||||
this._sourceViewer.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleVertical;
|
||||
this._sourceViewer.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
this._sourceViewer.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
|
||||
@ -152,14 +153,14 @@
|
||||
this._sourceViewer.Name = "_sourceViewer";
|
||||
this._sourceViewer.ReadOnly = true;
|
||||
this._sourceViewer.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;
|
||||
dataGridViewCellStyle20.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle20.BackColor = System.Drawing.SystemColors.Control;
|
||||
dataGridViewCellStyle20.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle20.ForeColor = System.Drawing.SystemColors.WindowText;
|
||||
dataGridViewCellStyle20.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle20.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle20.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
|
||||
this._sourceViewer.RowHeadersDefaultCellStyle = dataGridViewCellStyle20;
|
||||
dataGridViewCellStyle35.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle35.BackColor = System.Drawing.SystemColors.Control;
|
||||
dataGridViewCellStyle35.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle35.ForeColor = System.Drawing.SystemColors.WindowText;
|
||||
dataGridViewCellStyle35.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle35.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle35.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
|
||||
this._sourceViewer.RowHeadersDefaultCellStyle = dataGridViewCellStyle35;
|
||||
this._sourceViewer.RowHeadersVisible = false;
|
||||
this._sourceViewer.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing;
|
||||
this._sourceViewer.RowTemplate.Height = 18;
|
||||
@ -169,6 +170,7 @@
|
||||
this._sourceViewer.ShowRowErrors = false;
|
||||
this._sourceViewer.Size = new System.Drawing.Size(584, 571);
|
||||
this._sourceViewer.TabIndex = 1;
|
||||
this._sourceViewer.TabStop = false;
|
||||
this._sourceViewer.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.SourceViewCellClick);
|
||||
//
|
||||
// Breakpoint
|
||||
@ -187,9 +189,9 @@
|
||||
// T
|
||||
//
|
||||
this.T.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
|
||||
dataGridViewCellStyle17.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle17.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this.T.DefaultCellStyle = dataGridViewCellStyle17;
|
||||
dataGridViewCellStyle32.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle32.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this.T.DefaultCellStyle = dataGridViewCellStyle32;
|
||||
this.T.HeaderText = "T";
|
||||
this.T.Name = "T";
|
||||
this.T.ReadOnly = true;
|
||||
@ -200,8 +202,8 @@
|
||||
// Addr
|
||||
//
|
||||
this.Addr.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
|
||||
dataGridViewCellStyle18.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.Addr.DefaultCellStyle = dataGridViewCellStyle18;
|
||||
dataGridViewCellStyle33.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.Addr.DefaultCellStyle = dataGridViewCellStyle33;
|
||||
this.Addr.HeaderText = "Addr";
|
||||
this.Addr.Name = "Addr";
|
||||
this.Addr.ReadOnly = true;
|
||||
@ -212,8 +214,8 @@
|
||||
// Source
|
||||
//
|
||||
this.Source.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
|
||||
dataGridViewCellStyle19.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.Source.DefaultCellStyle = dataGridViewCellStyle19;
|
||||
dataGridViewCellStyle34.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.Source.DefaultCellStyle = dataGridViewCellStyle34;
|
||||
this.Source.HeaderText = "Source Code";
|
||||
this.Source.Name = "Source";
|
||||
this.Source.ReadOnly = true;
|
||||
@ -236,21 +238,21 @@
|
||||
this._registerData.AllowUserToDeleteRows = false;
|
||||
this._registerData.AllowUserToResizeColumns = false;
|
||||
this._registerData.AllowUserToResizeRows = false;
|
||||
dataGridViewCellStyle21.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this._registerData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle21;
|
||||
dataGridViewCellStyle36.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this._registerData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle36;
|
||||
this._registerData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
this._registerData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
|
||||
this.RegNum,
|
||||
this.R,
|
||||
this.S});
|
||||
dataGridViewCellStyle22.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle22.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle22.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle22.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle22.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle22.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle22.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this._registerData.DefaultCellStyle = dataGridViewCellStyle22;
|
||||
dataGridViewCellStyle37.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle37.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle37.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle37.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle37.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle37.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle37.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this._registerData.DefaultCellStyle = dataGridViewCellStyle37;
|
||||
this._registerData.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
|
||||
this._registerData.Location = new System.Drawing.Point(7, 19);
|
||||
this._registerData.MultiSelect = false;
|
||||
@ -267,6 +269,7 @@
|
||||
this._registerData.ShowRowErrors = false;
|
||||
this._registerData.Size = new System.Drawing.Size(123, 600);
|
||||
this._registerData.TabIndex = 0;
|
||||
this._registerData.TabStop = false;
|
||||
//
|
||||
// RegNum
|
||||
//
|
||||
@ -303,6 +306,7 @@
|
||||
this.StepButton.Name = "StepButton";
|
||||
this.StepButton.Size = new System.Drawing.Size(44, 23);
|
||||
this.StepButton.TabIndex = 3;
|
||||
this.StepButton.TabStop = false;
|
||||
this.StepButton.Text = "Step";
|
||||
this.StepButton.UseVisualStyleBackColor = true;
|
||||
this.StepButton.Click += new System.EventHandler(this.OnStepButtonClicked);
|
||||
@ -313,6 +317,7 @@
|
||||
this.AutoStep.Name = "AutoStep";
|
||||
this.AutoStep.Size = new System.Drawing.Size(47, 23);
|
||||
this.AutoStep.TabIndex = 4;
|
||||
this.AutoStep.TabStop = false;
|
||||
this.AutoStep.Text = "Auto";
|
||||
this.AutoStep.UseVisualStyleBackColor = true;
|
||||
this.AutoStep.Click += new System.EventHandler(this.OnAutoStepButtonClicked);
|
||||
@ -323,6 +328,7 @@
|
||||
this.RunButton.Name = "RunButton";
|
||||
this.RunButton.Size = new System.Drawing.Size(41, 23);
|
||||
this.RunButton.TabIndex = 5;
|
||||
this.RunButton.TabStop = false;
|
||||
this.RunButton.Text = "Run";
|
||||
this.RunButton.UseVisualStyleBackColor = true;
|
||||
this.RunButton.Click += new System.EventHandler(this.RunButton_Click);
|
||||
@ -333,6 +339,7 @@
|
||||
this.StopButton.Name = "StopButton";
|
||||
this.StopButton.Size = new System.Drawing.Size(43, 23);
|
||||
this.StopButton.TabIndex = 6;
|
||||
this.StopButton.TabStop = false;
|
||||
this.StopButton.Text = "Stop";
|
||||
this.StopButton.UseVisualStyleBackColor = true;
|
||||
this.StopButton.Click += new System.EventHandler(this.OnStopButtonClicked);
|
||||
@ -351,21 +358,21 @@
|
||||
//
|
||||
this._taskData.AllowUserToAddRows = false;
|
||||
this._taskData.AllowUserToDeleteRows = false;
|
||||
dataGridViewCellStyle23.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this._taskData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle23;
|
||||
dataGridViewCellStyle38.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this._taskData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle38;
|
||||
this._taskData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
this._taskData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
|
||||
this.TaskName,
|
||||
this.TaskState,
|
||||
this.TaskPC});
|
||||
dataGridViewCellStyle24.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle24.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle24.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle24.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle24.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle24.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle24.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this._taskData.DefaultCellStyle = dataGridViewCellStyle24;
|
||||
dataGridViewCellStyle39.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle39.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle39.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle39.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle39.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle39.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle39.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this._taskData.DefaultCellStyle = dataGridViewCellStyle39;
|
||||
this._taskData.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
|
||||
this._taskData.Location = new System.Drawing.Point(7, 19);
|
||||
this._taskData.MultiSelect = false;
|
||||
@ -381,6 +388,7 @@
|
||||
this._taskData.ShowRowErrors = false;
|
||||
this._taskData.Size = new System.Drawing.Size(123, 319);
|
||||
this._taskData.TabIndex = 0;
|
||||
this._taskData.TabStop = false;
|
||||
//
|
||||
// TaskName
|
||||
//
|
||||
@ -421,20 +429,20 @@
|
||||
//
|
||||
this._otherRegs.AllowUserToAddRows = false;
|
||||
this._otherRegs.AllowUserToDeleteRows = false;
|
||||
dataGridViewCellStyle25.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this._otherRegs.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle25;
|
||||
dataGridViewCellStyle40.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this._otherRegs.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle40;
|
||||
this._otherRegs.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
this._otherRegs.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
|
||||
this.Reg,
|
||||
this.RegValue});
|
||||
dataGridViewCellStyle26.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle26.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle26.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle26.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle26.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle26.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle26.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this._otherRegs.DefaultCellStyle = dataGridViewCellStyle26;
|
||||
dataGridViewCellStyle41.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle41.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle41.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle41.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle41.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle41.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle41.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this._otherRegs.DefaultCellStyle = dataGridViewCellStyle41;
|
||||
this._otherRegs.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
|
||||
this._otherRegs.Location = new System.Drawing.Point(7, 19);
|
||||
this._otherRegs.MultiSelect = false;
|
||||
@ -487,8 +495,8 @@
|
||||
this._memoryData.AllowUserToAddRows = false;
|
||||
this._memoryData.AllowUserToDeleteRows = false;
|
||||
this._memoryData.AllowUserToResizeRows = false;
|
||||
dataGridViewCellStyle27.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this._memoryData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle27;
|
||||
dataGridViewCellStyle42.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this._memoryData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle42;
|
||||
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[] {
|
||||
@ -496,14 +504,14 @@
|
||||
this.Address,
|
||||
this.Data,
|
||||
this.Disassembly});
|
||||
dataGridViewCellStyle28.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle28.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle28.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle28.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle28.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle28.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle28.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this._memoryData.DefaultCellStyle = dataGridViewCellStyle28;
|
||||
dataGridViewCellStyle43.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle43.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle43.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle43.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle43.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle43.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle43.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this._memoryData.DefaultCellStyle = dataGridViewCellStyle43;
|
||||
this._memoryData.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
|
||||
this._memoryData.Location = new System.Drawing.Point(6, 19);
|
||||
this._memoryData.MultiSelect = false;
|
||||
@ -520,6 +528,7 @@
|
||||
this._memoryData.ShowRowErrors = false;
|
||||
this._memoryData.Size = new System.Drawing.Size(279, 273);
|
||||
this._memoryData.TabIndex = 0;
|
||||
this._memoryData.TabStop = false;
|
||||
this._memoryData.VirtualMode = true;
|
||||
this._memoryData.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.MemoryViewCellClick);
|
||||
this._memoryData.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler(this.OnMemoryCellValueNeeded);
|
||||
@ -556,20 +565,20 @@
|
||||
//
|
||||
this._diskData.AllowUserToAddRows = false;
|
||||
this._diskData.AllowUserToDeleteRows = false;
|
||||
dataGridViewCellStyle29.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this._diskData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle29;
|
||||
dataGridViewCellStyle44.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
|
||||
this._diskData.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle44;
|
||||
this._diskData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
this._diskData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
|
||||
this.dataGridViewTextBoxColumn1,
|
||||
this.dataGridViewTextBoxColumn2});
|
||||
dataGridViewCellStyle30.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle30.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle30.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle30.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle30.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle30.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle30.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this._diskData.DefaultCellStyle = dataGridViewCellStyle30;
|
||||
dataGridViewCellStyle45.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle45.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle45.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle45.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle45.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle45.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle45.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this._diskData.DefaultCellStyle = dataGridViewCellStyle45;
|
||||
this._diskData.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
|
||||
this._diskData.Location = new System.Drawing.Point(6, 19);
|
||||
this._diskData.MultiSelect = false;
|
||||
@ -585,6 +594,7 @@
|
||||
this._diskData.ShowRowErrors = false;
|
||||
this._diskData.Size = new System.Drawing.Size(147, 273);
|
||||
this._diskData.TabIndex = 1;
|
||||
this._diskData.TabStop = false;
|
||||
//
|
||||
// dataGridViewTextBoxColumn1
|
||||
//
|
||||
@ -609,6 +619,7 @@
|
||||
this.ResetButton.Name = "ResetButton";
|
||||
this.ResetButton.Size = new System.Drawing.Size(57, 23);
|
||||
this.ResetButton.TabIndex = 12;
|
||||
this.ResetButton.TabStop = false;
|
||||
this.ResetButton.Text = "Reset";
|
||||
this.ResetButton.UseVisualStyleBackColor = true;
|
||||
this.ResetButton.Click += new System.EventHandler(this.ResetButton_Click);
|
||||
@ -619,6 +630,7 @@
|
||||
this.RunToNextTaskButton.Name = "RunToNextTaskButton";
|
||||
this.RunToNextTaskButton.Size = new System.Drawing.Size(51, 23);
|
||||
this.RunToNextTaskButton.TabIndex = 13;
|
||||
this.RunToNextTaskButton.TabStop = false;
|
||||
this.RunToNextTaskButton.Text = "Run T";
|
||||
this.RunToNextTaskButton.UseVisualStyleBackColor = true;
|
||||
this.RunToNextTaskButton.Click += new System.EventHandler(this.RunToNextTaskButton_Click);
|
||||
@ -629,6 +641,7 @@
|
||||
this.NovaStep.Name = "NovaStep";
|
||||
this.NovaStep.Size = new System.Drawing.Size(66, 23);
|
||||
this.NovaStep.TabIndex = 14;
|
||||
this.NovaStep.TabStop = false;
|
||||
this.NovaStep.Text = "Nova Step";
|
||||
this.NovaStep.UseVisualStyleBackColor = true;
|
||||
this.NovaStep.Click += new System.EventHandler(this.NovaStep_Click);
|
||||
@ -694,6 +707,7 @@
|
||||
this.DisplayBox.Size = new System.Drawing.Size(606, 808);
|
||||
this.DisplayBox.TabIndex = 0;
|
||||
this.DisplayBox.TabStop = false;
|
||||
this.DisplayBox.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.DisplayBox_PreviewKeyDown);
|
||||
//
|
||||
// button1
|
||||
//
|
||||
@ -701,6 +715,7 @@
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(75, 23);
|
||||
this.button1.TabIndex = 1;
|
||||
this.button1.TabStop = false;
|
||||
this.button1.Text = "HACK";
|
||||
this.button1.UseVisualStyleBackColor = true;
|
||||
this.button1.Click += new System.EventHandler(this.button1_Click);
|
||||
@ -727,9 +742,13 @@
|
||||
this.Controls.Add(this.StepButton);
|
||||
this.Controls.Add(this.groupBox1);
|
||||
this.Controls.Add(this.Microcode);
|
||||
this.KeyPreview = true;
|
||||
this.Name = "Debugger";
|
||||
this.Text = "Debugger";
|
||||
this.Load += new System.EventHandler(this.Debugger_Load);
|
||||
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Debugger_KeyDown);
|
||||
this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Debugger_KeyUp);
|
||||
this.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.Debugger_PreviewKeyDown);
|
||||
this.Microcode.ResumeLayout(false);
|
||||
this.Microcode.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this._sourceViewer)).EndInit();
|
||||
|
||||
@ -11,6 +11,7 @@ using System.Windows.Forms;
|
||||
using Contralto.CPU;
|
||||
using System.Threading;
|
||||
using System.Drawing.Imaging;
|
||||
using Contralto.IO;
|
||||
|
||||
namespace Contralto
|
||||
{
|
||||
@ -27,7 +28,8 @@ namespace Contralto
|
||||
|
||||
InitializeComponent();
|
||||
InitControls();
|
||||
RefreshUI();
|
||||
InitKeymap();
|
||||
RefreshUI();
|
||||
}
|
||||
|
||||
public void LoadSourceCode(string path)
|
||||
@ -773,6 +775,98 @@ namespace Contralto
|
||||
}
|
||||
|
||||
|
||||
// Hacky initial implementation of keyboard input.
|
||||
private void Debugger_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
e.SuppressKeyPress = true;
|
||||
if (_keyMap.ContainsKey(e.KeyCode))
|
||||
{
|
||||
_system.Keyboard.KeyDown(_keyMap[e.KeyCode]);
|
||||
}
|
||||
}
|
||||
|
||||
private void DisplayBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void Debugger_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
|
||||
{
|
||||
if (_keyMap.ContainsKey(e.KeyCode))
|
||||
{
|
||||
_system.Keyboard.KeyDown(_keyMap[e.KeyCode]);
|
||||
}
|
||||
}
|
||||
|
||||
private void Debugger_KeyUp(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (_keyMap.ContainsKey(e.KeyCode))
|
||||
{
|
||||
_system.Keyboard.KeyUp(_keyMap[e.KeyCode]);
|
||||
}
|
||||
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
|
||||
private void InitKeymap()
|
||||
{
|
||||
_keyMap = new Dictionary<Keys, AltoKey>();
|
||||
|
||||
_keyMap.Add(Keys.A, AltoKey.A);
|
||||
_keyMap.Add(Keys.B, AltoKey.B);
|
||||
_keyMap.Add(Keys.C, AltoKey.C);
|
||||
_keyMap.Add(Keys.D, AltoKey.D);
|
||||
_keyMap.Add(Keys.E, AltoKey.E);
|
||||
_keyMap.Add(Keys.F, AltoKey.F);
|
||||
_keyMap.Add(Keys.G, AltoKey.G);
|
||||
_keyMap.Add(Keys.H, AltoKey.H);
|
||||
_keyMap.Add(Keys.I, AltoKey.I);
|
||||
_keyMap.Add(Keys.J, AltoKey.J);
|
||||
_keyMap.Add(Keys.K, AltoKey.K);
|
||||
_keyMap.Add(Keys.L, AltoKey.L);
|
||||
_keyMap.Add(Keys.M, AltoKey.M);
|
||||
_keyMap.Add(Keys.N, AltoKey.N);
|
||||
_keyMap.Add(Keys.O, AltoKey.O);
|
||||
_keyMap.Add(Keys.P, AltoKey.P);
|
||||
_keyMap.Add(Keys.Q, AltoKey.Q);
|
||||
_keyMap.Add(Keys.R, AltoKey.R);
|
||||
_keyMap.Add(Keys.S, AltoKey.S);
|
||||
_keyMap.Add(Keys.T, AltoKey.T);
|
||||
_keyMap.Add(Keys.U, AltoKey.U);
|
||||
_keyMap.Add(Keys.V, AltoKey.V);
|
||||
_keyMap.Add(Keys.W, AltoKey.W);
|
||||
_keyMap.Add(Keys.X, AltoKey.X);
|
||||
_keyMap.Add(Keys.Y, AltoKey.Y);
|
||||
_keyMap.Add(Keys.Z, AltoKey.Z);
|
||||
_keyMap.Add(Keys.D0, AltoKey.D0);
|
||||
_keyMap.Add(Keys.D1, AltoKey.D1);
|
||||
_keyMap.Add(Keys.D2, AltoKey.D2);
|
||||
_keyMap.Add(Keys.D3, AltoKey.D3);
|
||||
_keyMap.Add(Keys.D4, AltoKey.D4);
|
||||
_keyMap.Add(Keys.D5, AltoKey.D5);
|
||||
_keyMap.Add(Keys.D6, AltoKey.D6);
|
||||
_keyMap.Add(Keys.D7, AltoKey.D7);
|
||||
_keyMap.Add(Keys.D8, AltoKey.D8);
|
||||
_keyMap.Add(Keys.D9, AltoKey.D9);
|
||||
_keyMap.Add(Keys.Space, AltoKey.Space);
|
||||
_keyMap.Add(Keys.OemPeriod, AltoKey.Period);
|
||||
_keyMap.Add(Keys.Oemcomma, AltoKey.Comma);
|
||||
_keyMap.Add(Keys.OemQuotes, AltoKey.Quote);
|
||||
_keyMap.Add(Keys.OemBackslash, AltoKey.BSlash);
|
||||
_keyMap.Add(Keys.OemQuestion, AltoKey.FSlash);
|
||||
_keyMap.Add(Keys.Oemplus, AltoKey.Plus);
|
||||
_keyMap.Add(Keys.OemMinus, AltoKey.Minus);
|
||||
_keyMap.Add(Keys.Escape, AltoKey.ESC);
|
||||
_keyMap.Add(Keys.Delete, AltoKey.DEL);
|
||||
_keyMap.Add(Keys.Left, AltoKey.Arrow);
|
||||
_keyMap.Add(Keys.LShiftKey, AltoKey.LShift);
|
||||
_keyMap.Add(Keys.RShiftKey, AltoKey.RShift);
|
||||
_keyMap.Add(Keys.ControlKey, AltoKey.CTRL);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private enum ExecutionType
|
||||
{
|
||||
None = 0,
|
||||
@ -821,9 +915,14 @@ namespace Contralto
|
||||
private Bitmap _displayBuffer;
|
||||
private Rectangle _displayRect = new Rectangle(0, 0, 608, 808);
|
||||
|
||||
// Keyboard mapping from windows vkeys to Alto keys
|
||||
private Dictionary<Keys, AltoKey> _keyMap;
|
||||
|
||||
private void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
_system.CPU.Hack();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -84,6 +84,28 @@ namespace Contralto.Display
|
||||
_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."
|
||||
//
|
||||
if (_dataBuffer.Count < 16 &&
|
||||
!_system.CPU.IsBlocked(TaskType.DisplayHorizontal) &&
|
||||
!_dwtBlocked)
|
||||
{
|
||||
//Console.WriteLine("DWT wakeup, {0}", _dataBuffer.Count);
|
||||
_system.CPU.WakeupTask(TaskType.DisplayWord);
|
||||
}
|
||||
else
|
||||
{
|
||||
// We can't take any words right now, remove Wakeup from
|
||||
// the DWT.
|
||||
if (_dataBuffer.Count >= 16)
|
||||
{
|
||||
//Log.Write(LogComponent.Display, "buffer full, blocking DWT.");
|
||||
}
|
||||
_system.CPU.BlockTask(TaskType.DisplayWord);
|
||||
}
|
||||
|
||||
switch (_state)
|
||||
{
|
||||
case DisplayState.VerticalBlank:
|
||||
@ -98,44 +120,17 @@ namespace Contralto.Display
|
||||
|
||||
// Wake up DVT, DHT
|
||||
_dwtBlocked = false;
|
||||
_dhtBlocked = false;
|
||||
_system.CPU.WakeupTask(TaskType.DisplayVertical);
|
||||
_dhtBlocked = false;
|
||||
_system.CPU.WakeupTask(TaskType.DisplayHorizontal);
|
||||
_system.CPU.BlockTask(TaskType.DisplayWord);
|
||||
|
||||
// Run MRT
|
||||
_system.CPU.WakeupTask(TaskType.MemoryRefresh);
|
||||
|
||||
// TODO: clear DWT, DHT block flip-flop
|
||||
_state = DisplayState.VisibleScanline;
|
||||
_system.CPU.BlockTask(TaskType.DisplayWord);
|
||||
|
||||
_state = DisplayState.HorizontalBlank;
|
||||
|
||||
//Console.WriteLine("Frame");
|
||||
}
|
||||
break;
|
||||
|
||||
case DisplayState.VisibleScanline:
|
||||
//
|
||||
// "If the DWT has not executed a BLOCK, if DHT is not blocked, and if the
|
||||
// buffer is not full, DWT wakeups are generated."
|
||||
//
|
||||
if (_dataBuffer.Count < 16 &&
|
||||
!_system.CPU.IsBlocked(TaskType.DisplayHorizontal) &&
|
||||
!_dwtBlocked)
|
||||
{
|
||||
//Console.WriteLine("DWT wakeup, {0}", _dataBuffer.Count);
|
||||
_system.CPU.WakeupTask(TaskType.DisplayWord);
|
||||
}
|
||||
else
|
||||
{
|
||||
// We can't take any words right now, remove Wakeup from
|
||||
// the DWT.
|
||||
if (_dataBuffer.Count >= 16)
|
||||
{
|
||||
//Log.Write(LogComponent.Display, "buffer full, blocking DWT.");
|
||||
}
|
||||
_system.CPU.BlockTask(TaskType.DisplayWord);
|
||||
}
|
||||
|
||||
case DisplayState.VisibleScanline:
|
||||
//
|
||||
// A scanline is 38 words wide; we clock in each word
|
||||
// from the buffer (if present).
|
||||
@ -151,7 +146,7 @@ namespace Contralto.Display
|
||||
displayWord = _dataBuffer.Dequeue();
|
||||
}
|
||||
|
||||
_display.DrawDisplayWord(_scanline, _word, displayWord);
|
||||
//_display.DrawDisplayWord(_scanline, _word, displayWord);
|
||||
|
||||
_word++;
|
||||
if (_word > 37)
|
||||
@ -165,7 +160,7 @@ namespace Contralto.Display
|
||||
break;
|
||||
|
||||
case DisplayState.HorizontalBlank:
|
||||
// Kill time until end of HBlank
|
||||
// Kill time until end of HBlank
|
||||
if (_clocks > _horizontalBlankClocks)
|
||||
{
|
||||
_clocks -= _horizontalBlankClocks;
|
||||
@ -180,11 +175,14 @@ namespace Contralto.Display
|
||||
_state = DisplayState.VerticalBlank;
|
||||
_evenField = !_evenField;
|
||||
|
||||
_system.CPU.BlockTask(TaskType.DisplayVertical);
|
||||
// Wakeup DVT
|
||||
_system.CPU.WakeupTask(TaskType.DisplayVertical);
|
||||
|
||||
// Block DHT
|
||||
_system.CPU.BlockTask(TaskType.DisplayHorizontal);
|
||||
_system.CPU.BlockTask(TaskType.DisplayWord);
|
||||
|
||||
_display.RefreshAltoDisplay();
|
||||
//_display.RefreshAltoDisplay();
|
||||
|
||||
_frames++;
|
||||
//Log.Write(LogComponent.Display, "Display field completed. {0} total clocks elapsed.", _totalClocks);
|
||||
@ -192,7 +190,10 @@ namespace Contralto.Display
|
||||
}
|
||||
else
|
||||
{
|
||||
_state = DisplayState.VisibleScanline;
|
||||
_state = DisplayState.VisibleScanline;
|
||||
|
||||
// Run MRT
|
||||
_system.CPU.WakeupTask(TaskType.MemoryRefresh);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -248,9 +249,9 @@ namespace Contralto.Display
|
||||
// Timing constants
|
||||
// 38uS per scanline; 4uS for hblank.
|
||||
// ~35 scanlines for vblank (1330uS)
|
||||
private const double _wordClocks = (34.0 / 38.0) / 0.17; // uSec to clocks
|
||||
private const double _horizontalBlankClocks = 4.0 / 0.17;
|
||||
private const double _verticalBlankClocks = 1333.0 / 0.17;
|
||||
private const double _wordClocks = (34.0 / 38.0) / 0.017; // uSec to clocks
|
||||
private const double _horizontalBlankClocks = 4.0 / 0.017;
|
||||
private const double _verticalBlankClocks = 1333.0 / 0.017;
|
||||
|
||||
|
||||
}
|
||||
|
||||
164
Contralto/Display/FakeDisplayController.cs
Normal file
164
Contralto/Display/FakeDisplayController.cs
Normal file
@ -0,0 +1,164 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Contralto.Logging;
|
||||
using Contralto.CPU;
|
||||
|
||||
namespace Contralto.Display
|
||||
{
|
||||
/// <summary>
|
||||
/// FakeDisplayController draws the display without the aid of the
|
||||
/// display microcode tasks (i.e. it cheats). It reads the displaylist
|
||||
/// starting at DASTART and renders the display from there.
|
||||
/// </summary>
|
||||
public class FakeDisplayController : IClockable
|
||||
{
|
||||
public FakeDisplayController(AltoSystem system)
|
||||
{
|
||||
_system = system;
|
||||
Reset();
|
||||
}
|
||||
|
||||
public void AttachDisplay(Debugger display)
|
||||
{
|
||||
_display = display;
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Clock()
|
||||
{
|
||||
_clocks++;
|
||||
|
||||
if (_clocks > _frameClocks)
|
||||
{
|
||||
_clocks -= _frameClocks;
|
||||
|
||||
RenderDisplay();
|
||||
_display.RefreshAltoDisplay();
|
||||
}
|
||||
}
|
||||
|
||||
private void RenderDisplay()
|
||||
{
|
||||
// pick up DASTART; if zero we render a blank screen.
|
||||
ushort daStart = _system.MemoryBus.DebugReadWord(0x110);
|
||||
|
||||
if (daStart == 0)
|
||||
{
|
||||
for (int scanline = 0; scanline < 808; scanline++)
|
||||
{
|
||||
for (int word = 0; word < 38; word++)
|
||||
{
|
||||
_display.DrawDisplayWord(scanline, word, 0xffff);
|
||||
}
|
||||
}
|
||||
|
||||
_display.RefreshAltoDisplay();
|
||||
return;
|
||||
}
|
||||
|
||||
DCB dcb = GetNextDCB(daStart);
|
||||
int dcbScanline = 0;
|
||||
|
||||
for (int scanline = 0; scanline < 808; scanline++)
|
||||
{
|
||||
int wordOffset = 0;
|
||||
|
||||
// fill in HTAB
|
||||
for(int htab = 0;htab<dcb.hTab; htab++)
|
||||
{
|
||||
_display.DrawDisplayWord(scanline, wordOffset, (ushort)(dcb.whiteOnBlack ? 0x0 : 0xffff));
|
||||
wordOffset++;
|
||||
}
|
||||
|
||||
for(int word = 0;word<dcb.nWrds;word++)
|
||||
{
|
||||
ushort address = (ushort)(dcb.startAddress + dcbScanline * dcb.nWrds + word);
|
||||
ushort data = _system.MemoryBus.DebugReadWord(address);
|
||||
|
||||
if (!dcb.whiteOnBlack)
|
||||
{
|
||||
data = (ushort)~data;
|
||||
}
|
||||
|
||||
_display.DrawDisplayWord(scanline, wordOffset, data);
|
||||
wordOffset++;
|
||||
}
|
||||
|
||||
// erase remainder of line, if any
|
||||
for (; wordOffset < 38; wordOffset++)
|
||||
{
|
||||
_display.DrawDisplayWord(scanline, wordOffset, (ushort)(dcb.whiteOnBlack ? 0x0 : 0xffff));
|
||||
}
|
||||
|
||||
//_display.RefreshAltoDisplay();
|
||||
|
||||
// decrement scan line counter for this DCB, if < 0, grab next DCB.
|
||||
dcb.scanlineCount--;
|
||||
dcbScanline++;
|
||||
|
||||
if (dcb.scanlineCount <= 0)
|
||||
{
|
||||
if (dcb.daNext != 0)
|
||||
{
|
||||
dcb = GetNextDCB(dcb.daNext);
|
||||
dcbScanline = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private DCB GetNextDCB(ushort address)
|
||||
{
|
||||
DCB dcb = new DCB();
|
||||
dcb.daNext = _system.MemoryBus.DebugReadWord(address);
|
||||
|
||||
ushort mode = _system.MemoryBus.DebugReadWord((ushort)(address + 1));
|
||||
|
||||
dcb.lowRes = (mode & 0x8000) != 0;
|
||||
dcb.whiteOnBlack = (mode & 0x4000) != 0;
|
||||
dcb.hTab = (mode & 0x3f00) >> 8;
|
||||
dcb.nWrds = (mode & 0xff);
|
||||
|
||||
dcb.startAddress = _system.MemoryBus.DebugReadWord((ushort)(address + 2));
|
||||
dcb.scanlineCount = _system.MemoryBus.DebugReadWord((ushort)(address + 3)) * 2;
|
||||
|
||||
return dcb;
|
||||
}
|
||||
|
||||
|
||||
private struct DCB
|
||||
{
|
||||
public ushort daNext;
|
||||
public bool lowRes;
|
||||
public bool whiteOnBlack;
|
||||
public int hTab;
|
||||
public int nWrds;
|
||||
public ushort startAddress;
|
||||
public int scanlineCount;
|
||||
}
|
||||
|
||||
private double _clocks;
|
||||
|
||||
private AltoSystem _system;
|
||||
private Debugger _display;
|
||||
|
||||
// Timing constants
|
||||
// 38uS per scanline; 4uS for hblank.
|
||||
// ~35 scanlines for vblank (1330uS)
|
||||
private const double _scanlineClocks = 38.0 / 0.017;
|
||||
private const double _frameClocks = _scanlineClocks * 850; // approx.
|
||||
}
|
||||
}
|
||||
@ -7,6 +7,7 @@ using System.Threading.Tasks;
|
||||
using Contralto.Memory;
|
||||
using System.IO;
|
||||
using Contralto.Logging;
|
||||
using Contralto.CPU;
|
||||
|
||||
namespace Contralto.IO
|
||||
{
|
||||
@ -36,7 +37,8 @@ namespace Contralto.IO
|
||||
public ushort KDATA
|
||||
{
|
||||
get
|
||||
{
|
||||
{
|
||||
_debugRead = false;
|
||||
return _kDataRead;
|
||||
}
|
||||
set
|
||||
@ -235,10 +237,7 @@ namespace Contralto.IO
|
||||
|
||||
_sector = (_sector + 1) % 12;
|
||||
|
||||
_kStat = (ushort)((_kStat & 0x0fff) | (_sector << 12));
|
||||
|
||||
// TODO: seclate semantics. Looks like if the sector task was BLOCKed when a new sector is signaled
|
||||
// then the seclate flag is set.
|
||||
_kStat = (ushort)((_kStat & 0x0fff) | (_sector << 12));
|
||||
|
||||
// Reset internal state machine for sector data
|
||||
_sectorWordIndex = 0;
|
||||
@ -254,6 +253,12 @@ namespace Contralto.IO
|
||||
{
|
||||
Log.Write(LogType.Verbose, LogComponent.DiskController, "Waking up sector task for C/H/S {0}/{1}/{2}", _cylinder, _head, _sector);
|
||||
_system.CPU.WakeupTask(CPU.TaskType.DiskSector);
|
||||
|
||||
// Reset SECLATE
|
||||
_seclateClocks = 0;
|
||||
_seclate = false;
|
||||
_seclateEnable = true;
|
||||
_kStat &= 0xffef;
|
||||
}
|
||||
}
|
||||
|
||||
@ -293,12 +298,35 @@ namespace Contralto.IO
|
||||
//
|
||||
SpinDisk();
|
||||
|
||||
// Deal with SECLATE semantics: If the Disk Sector task wakes up and runs before
|
||||
// we hit the trigger time, then _seclate remains false.
|
||||
// Otherwise, when the trigger time is hit _seclate is raised until
|
||||
// the beginning of the next sector.
|
||||
if (_system.CPU.CurrentTask.Priority == (int)TaskType.DiskSector)
|
||||
{
|
||||
// Sector task is running; clear enable for seclate signal
|
||||
_seclateEnable = false;
|
||||
}
|
||||
|
||||
if (_seclateEnable)
|
||||
{
|
||||
_seclateClocks++;
|
||||
|
||||
if (_seclateClocks > _seclateDuration)
|
||||
{
|
||||
_seclate = true;
|
||||
_kStat |= 0x0010; // TODO: move to constant field!
|
||||
//Log.Write(LogComponent.DiskSectorTask, "SECLATE for sector {0} at sector time {1}", _sector, _elapsedSectorTime);
|
||||
_seclateEnable = false;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Update the WDINIT signal; this is based on WDALLOW (!_wdInhib) which sets WDINIT (this is done
|
||||
// in KCOM way above).
|
||||
// WDINIT is reset when BLOCK (a BLOCK F1 is being executed) and WDTSKACT (the disk word task is running) are 1.
|
||||
//
|
||||
if (_system.CPU.CurrentTask.Priority == (int)CPU.TaskType.DiskWord &&
|
||||
if (_system.CPU.CurrentTask.Priority == (int)TaskType.DiskWord &&
|
||||
_system.CPU.CurrentTask.BLOCK)
|
||||
{
|
||||
_wdInit = false;
|
||||
@ -433,22 +461,28 @@ namespace Contralto.IO
|
||||
// If the word task is enabled AND the write ("crystal") clock is enabled
|
||||
// then we will wake up the word task now.
|
||||
//
|
||||
if (!_wdInhib && !_bClkSource)
|
||||
if (!_seclate && !_wdInhib && !_bClkSource)
|
||||
{
|
||||
bWakeup = true;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// If the clock is enabled OR the WFFO bit is set (go ahead and run the bit clock)
|
||||
// then we will wake up the word task and read in the data if transfers are not
|
||||
// inhibited. TODO: this should only happen on reads.
|
||||
// and we weren't late reading this sector, then we will wake up the word task
|
||||
// and read in the data if transfers are not inhibited. TODO: this should only happen on reads.
|
||||
//
|
||||
if (_wffo || _diskBitCounterEnable)
|
||||
if (!_seclate && (_wffo || _diskBitCounterEnable))
|
||||
{
|
||||
if (!_xferOff)
|
||||
{
|
||||
if (_debugRead)
|
||||
{
|
||||
Console.WriteLine("--- missed word {0}({1}) ---", _sectorWordIndex, _kDataRead);
|
||||
}
|
||||
|
||||
Log.Write(LogType.Verbose, LogComponent.DiskWordTask, "Sector {0} Word {1} read into KDATA", _sector, Conversion.ToOctal(diskWord));
|
||||
_kDataRead = diskWord;
|
||||
_debugRead = _sectorData[_sectorWordIndex].Type == CellType.Data;
|
||||
}
|
||||
|
||||
if (!_wdInhib)
|
||||
@ -471,12 +505,12 @@ namespace Contralto.IO
|
||||
if (bWakeup)
|
||||
{
|
||||
Log.Write(LogType.Verbose, LogComponent.DiskWordTask, "Word task awoken for word {0}.", _sectorWordIndex);
|
||||
_system.CPU.WakeupTask(CPU.TaskType.DiskWord);
|
||||
_system.CPU.WakeupTask(TaskType.DiskWord);
|
||||
}
|
||||
|
||||
// Last, move to the next word.
|
||||
_sectorWordIndex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadSector()
|
||||
@ -486,29 +520,7 @@ namespace Contralto.IO
|
||||
// Note that this data is packed in in REVERSE ORDER because that's
|
||||
// how it gets written out and it's how the Alto expects it to be read back in.
|
||||
//
|
||||
DiabloDiskSector sector = _pack.GetSector(_cylinder, _head, _sector);
|
||||
|
||||
// debugging
|
||||
/*
|
||||
if (_cylinder >= 32)
|
||||
{
|
||||
Console.WriteLine("loading in C/H/S {0}/{1}/{2}", _cylinder, _head, _sector);
|
||||
for(int i=0;i<sector.Header.Length;i++)
|
||||
{
|
||||
Console.WriteLine("Header {0}, memory {1} (alt {2})",
|
||||
Conversion.ToOctal(sector.Header[i]),
|
||||
Conversion.ToOctal(_system.MemoryBus.DebugReadWord((ushort)(0x30 + i))),
|
||||
Conversion.ToOctal(_system.MemoryBus.DebugReadWord((ushort)(0x1e + i))));
|
||||
}
|
||||
|
||||
for (int i = 0; i < sector.Label.Length; i++)
|
||||
{
|
||||
Console.WriteLine("Label {0}, memory {1} (alt {2})",
|
||||
Conversion.ToOctal(sector.Label[i]),
|
||||
Conversion.ToOctal(_system.MemoryBus.DebugReadWord((ushort)(0x32 + i))),
|
||||
Conversion.ToOctal(_system.MemoryBus.DebugReadWord((ushort)(0x20 + i))));
|
||||
}
|
||||
} */
|
||||
DiabloDiskSector sector = _pack.GetSector(_cylinder, _head, _sector);
|
||||
|
||||
// Header (2 words data, 1 word cksum)
|
||||
for (int i = _headerOffset + 1, j = 1; i < _headerOffset + 3; i++, j--)
|
||||
@ -639,8 +651,7 @@ namespace Contralto.IO
|
||||
// Sector timing. Based on table on pg. 43 of the Alto Hardware Manual
|
||||
private double _elapsedSectorTime; // elapsed time in this sector (in clocks)
|
||||
private const double _sectorDuration = (40.0 / 12.0); // time in msec for one sector
|
||||
private const double _sectorClocks = _sectorDuration / (0.00017); // number of clock cycles per sector time.
|
||||
|
||||
private const double _sectorClocks = _sectorDuration / (0.00017); // number of clock cycles per sector time.
|
||||
|
||||
private int _sectorWordIndex;
|
||||
private double _sectorWordTime;
|
||||
@ -663,6 +674,13 @@ namespace Contralto.IO
|
||||
private const int _labelOffset = _headerOffset + 14;
|
||||
private const int _dataOffset = _labelOffset + 20;
|
||||
|
||||
// SECLATE data.
|
||||
// 8.5uS for seclate delay (approx. 50 clocks)
|
||||
private const double _seclateDuration = 0.0086 / 0.00017;
|
||||
private bool _seclateEnable;
|
||||
private bool _seclate;
|
||||
private double _seclateClocks;
|
||||
|
||||
// The data for the current sector
|
||||
private enum CellType
|
||||
{
|
||||
@ -701,5 +719,7 @@ namespace Contralto.IO
|
||||
DiabloPack _pack;
|
||||
|
||||
private AltoSystem _system;
|
||||
|
||||
private bool _debugRead;
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,6 +10,85 @@ using Contralto.Logging;
|
||||
|
||||
namespace Contralto.IO
|
||||
{
|
||||
|
||||
public enum AltoKey
|
||||
{
|
||||
A = 0,
|
||||
B,
|
||||
C,
|
||||
D,
|
||||
E,
|
||||
F,
|
||||
G,
|
||||
H,
|
||||
I,
|
||||
J,
|
||||
K,
|
||||
L,
|
||||
M,
|
||||
N,
|
||||
O,
|
||||
P,
|
||||
Q,
|
||||
R,
|
||||
S,
|
||||
T,
|
||||
U,
|
||||
V,
|
||||
W,
|
||||
X,
|
||||
Y,
|
||||
Z,
|
||||
D0,
|
||||
D1,
|
||||
D2,
|
||||
D3,
|
||||
D4,
|
||||
D5,
|
||||
D6,
|
||||
D7,
|
||||
D8,
|
||||
D9,
|
||||
Space,
|
||||
Plus,
|
||||
Minus,
|
||||
Comma,
|
||||
Period,
|
||||
Semicolon,
|
||||
Quote,
|
||||
LBracket,
|
||||
RBracket,
|
||||
FSlash,
|
||||
BSlash,
|
||||
Arrow,
|
||||
Lock,
|
||||
LShift,
|
||||
RShift,
|
||||
LF,
|
||||
BS,
|
||||
DEL,
|
||||
ESC,
|
||||
TAB,
|
||||
CTRL,
|
||||
Return,
|
||||
BlankTop,
|
||||
BlankMiddle,
|
||||
BlankBottom,
|
||||
}
|
||||
|
||||
public struct AltoKeyBit
|
||||
{
|
||||
public AltoKeyBit(int word, ushort mask)
|
||||
{
|
||||
Word = word;
|
||||
Bitmask = mask;
|
||||
}
|
||||
|
||||
public int Word;
|
||||
public ushort Bitmask;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Currently just a stub indicating that no keys are being pressed.
|
||||
/// </summary>
|
||||
@ -17,14 +96,19 @@ namespace Contralto.IO
|
||||
{
|
||||
public Keyboard()
|
||||
{
|
||||
|
||||
InitMap();
|
||||
Reset();
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
_keyWords = new ushort[4];
|
||||
}
|
||||
|
||||
public ushort Read(int address, TaskType task, bool extendedMemoryReference)
|
||||
{
|
||||
// TODO: implement; return nothing pressed for any address now.
|
||||
Log.Write(LogComponent.Keyboard, "Keyboard read; unimplemented.");
|
||||
return 0xffff;
|
||||
{
|
||||
// keyboard word is inverted
|
||||
return (ushort)~_keyWords[address - 0xfe1c]; // TODO: move to constant.
|
||||
}
|
||||
|
||||
public void Load(int address, ushort data, TaskType task, bool extendedMemoryReference)
|
||||
@ -32,14 +116,100 @@ namespace Contralto.IO
|
||||
// nothing
|
||||
}
|
||||
|
||||
public void KeyDown(AltoKey key)
|
||||
{
|
||||
AltoKeyBit bits = _keyMap[key];
|
||||
_keyWords[bits.Word] |= _keyMap[key].Bitmask;
|
||||
}
|
||||
|
||||
public void KeyUp(AltoKey key)
|
||||
{
|
||||
AltoKeyBit bits = _keyMap[key];
|
||||
_keyWords[bits.Word] &= (ushort)~_keyMap[key].Bitmask;
|
||||
}
|
||||
|
||||
public MemoryRange[] Addresses
|
||||
{
|
||||
get { return _addresses; }
|
||||
}
|
||||
|
||||
|
||||
private readonly MemoryRange[] _addresses =
|
||||
{
|
||||
new MemoryRange(0xfe1c, 0xfe1f), // 177034-177037
|
||||
};
|
||||
|
||||
private void InitMap()
|
||||
{
|
||||
_keyMap = new Dictionary<AltoKey, AltoKeyBit>();
|
||||
_keyMap.Add(AltoKey.D5, new AltoKeyBit(0, 0x8000));
|
||||
_keyMap.Add(AltoKey.D4, new AltoKeyBit(0, 0x4000));
|
||||
_keyMap.Add(AltoKey.D6, new AltoKeyBit(0, 0x2000));
|
||||
_keyMap.Add(AltoKey.E, new AltoKeyBit(0, 0x1000));
|
||||
_keyMap.Add(AltoKey.D7, new AltoKeyBit(0, 0x0800));
|
||||
_keyMap.Add(AltoKey.D, new AltoKeyBit(0, 0x0400));
|
||||
_keyMap.Add(AltoKey.U, new AltoKeyBit(0, 0x0200));
|
||||
_keyMap.Add(AltoKey.V, new AltoKeyBit(0, 0x0100));
|
||||
_keyMap.Add(AltoKey.D0, new AltoKeyBit(0, 0x0080));
|
||||
_keyMap.Add(AltoKey.K, new AltoKeyBit(0, 0x0040));
|
||||
_keyMap.Add(AltoKey.Minus, new AltoKeyBit(0, 0x0020));
|
||||
_keyMap.Add(AltoKey.P, new AltoKeyBit(0, 0x0010));
|
||||
_keyMap.Add(AltoKey.FSlash, new AltoKeyBit(0, 0x0008));
|
||||
_keyMap.Add(AltoKey.BSlash, new AltoKeyBit(0, 0x0004));
|
||||
_keyMap.Add(AltoKey.LF, new AltoKeyBit(0, 0x0002));
|
||||
_keyMap.Add(AltoKey.BS, new AltoKeyBit(0, 0x0001));
|
||||
|
||||
_keyMap.Add(AltoKey.D3, new AltoKeyBit(1, 0x8000));
|
||||
_keyMap.Add(AltoKey.D2, new AltoKeyBit(1, 0x4000));
|
||||
_keyMap.Add(AltoKey.W, new AltoKeyBit(1, 0x2000));
|
||||
_keyMap.Add(AltoKey.Q, new AltoKeyBit(1, 0x1000));
|
||||
_keyMap.Add(AltoKey.S, new AltoKeyBit(1, 0x0800));
|
||||
_keyMap.Add(AltoKey.A, new AltoKeyBit(1, 0x0400));
|
||||
_keyMap.Add(AltoKey.D9, new AltoKeyBit(1, 0x0200));
|
||||
_keyMap.Add(AltoKey.I, new AltoKeyBit(1, 0x0100));
|
||||
_keyMap.Add(AltoKey.X, new AltoKeyBit(1, 0x0080));
|
||||
_keyMap.Add(AltoKey.O, new AltoKeyBit(1, 0x0040));
|
||||
_keyMap.Add(AltoKey.L, new AltoKeyBit(1, 0x0020));
|
||||
_keyMap.Add(AltoKey.Comma, new AltoKeyBit(1, 0x0010));
|
||||
_keyMap.Add(AltoKey.Quote, new AltoKeyBit(1, 0x0008));
|
||||
_keyMap.Add(AltoKey.RBracket, new AltoKeyBit(1, 0x0004));
|
||||
_keyMap.Add(AltoKey.BlankMiddle, new AltoKeyBit(1, 0x0002));
|
||||
_keyMap.Add(AltoKey.BlankTop, new AltoKeyBit(1, 0x0001));
|
||||
|
||||
_keyMap.Add(AltoKey.D1, new AltoKeyBit(2, 0x8000));
|
||||
_keyMap.Add(AltoKey.ESC, new AltoKeyBit(2, 0x4000));
|
||||
_keyMap.Add(AltoKey.TAB, new AltoKeyBit(2, 0x2000));
|
||||
_keyMap.Add(AltoKey.F, new AltoKeyBit(2, 0x1000));
|
||||
_keyMap.Add(AltoKey.CTRL, new AltoKeyBit(2, 0x0800));
|
||||
_keyMap.Add(AltoKey.C, new AltoKeyBit(2, 0x0400));
|
||||
_keyMap.Add(AltoKey.J, new AltoKeyBit(2, 0x0200));
|
||||
_keyMap.Add(AltoKey.B, new AltoKeyBit(2, 0x0100));
|
||||
_keyMap.Add(AltoKey.Z, new AltoKeyBit(2, 0x0080));
|
||||
_keyMap.Add(AltoKey.LShift, new AltoKeyBit(2, 0x0040));
|
||||
_keyMap.Add(AltoKey.Period, new AltoKeyBit(2, 0x0020));
|
||||
_keyMap.Add(AltoKey.Semicolon, new AltoKeyBit(2, 0x0010));
|
||||
_keyMap.Add(AltoKey.Return, new AltoKeyBit(2, 0x0008));
|
||||
_keyMap.Add(AltoKey.Arrow, new AltoKeyBit(2, 0x0004));
|
||||
_keyMap.Add(AltoKey.DEL, new AltoKeyBit(2, 0x0002));
|
||||
|
||||
_keyMap.Add(AltoKey.R, new AltoKeyBit(3, 0x8000));
|
||||
_keyMap.Add(AltoKey.T, new AltoKeyBit(3, 0x4000));
|
||||
_keyMap.Add(AltoKey.G, new AltoKeyBit(3, 0x2000));
|
||||
_keyMap.Add(AltoKey.Y, new AltoKeyBit(3, 0x1000));
|
||||
_keyMap.Add(AltoKey.H, new AltoKeyBit(3, 0x0800));
|
||||
_keyMap.Add(AltoKey.D8, new AltoKeyBit(3, 0x0400));
|
||||
_keyMap.Add(AltoKey.N, new AltoKeyBit(3, 0x0200));
|
||||
_keyMap.Add(AltoKey.M, new AltoKeyBit(3, 0x0100));
|
||||
_keyMap.Add(AltoKey.Lock, new AltoKeyBit(3, 0x0080));
|
||||
_keyMap.Add(AltoKey.Space, new AltoKeyBit(3, 0x0040));
|
||||
_keyMap.Add(AltoKey.LBracket, new AltoKeyBit(3, 0x0020));
|
||||
_keyMap.Add(AltoKey.Plus, new AltoKeyBit(3, 0x0010));
|
||||
_keyMap.Add(AltoKey.RShift, new AltoKeyBit(3, 0x0008));
|
||||
_keyMap.Add(AltoKey.BlankBottom, new AltoKeyBit(3, 0x0004));
|
||||
}
|
||||
|
||||
private ushort[] _keyWords;
|
||||
|
||||
private Dictionary<AltoKey, AltoKeyBit> _keyMap;
|
||||
}
|
||||
}
|
||||
|
||||
@ -87,6 +87,13 @@ namespace Contralto.Memory
|
||||
return ReadFromBus(address, TaskType.Emulator, false);
|
||||
}
|
||||
|
||||
public ushort DebugReadWord(TaskType task, ushort address)
|
||||
{
|
||||
// TODO: allow debug reads from any bank.
|
||||
// probably add special debug calls to IMemoryMappedDevice iface.
|
||||
return ReadFromBus(address, task, false);
|
||||
}
|
||||
|
||||
public void Clock()
|
||||
{
|
||||
_memoryCycle++;
|
||||
@ -267,7 +274,7 @@ namespace Contralto.Memory
|
||||
else
|
||||
{
|
||||
//throw new NotImplementedException(String.Format("Read from unimplemented memory-mapped I/O device at {0}.", OctalHelpers.ToOctal(address)));
|
||||
Console.WriteLine("Read from unimplemented memory-mapped I/O device at {0}.", Conversion.ToOctal(address));
|
||||
//Console.WriteLine("Read from unimplemented memory-mapped I/O device at {0}.", Conversion.ToOctal(address));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -289,7 +296,7 @@ namespace Contralto.Memory
|
||||
else
|
||||
{
|
||||
// throw new NotImplementedException(String.Format("Write to unimplemented memory-mapped I/O device at {0}.", OctalHelpers.ToOctal(address)));
|
||||
Console.WriteLine("Write to unimplemented memory-mapped I/O device at {0}.", Conversion.ToOctal(address));
|
||||
//Console.WriteLine("Write to unimplemented memory-mapped I/O device at {0}.", Conversion.ToOctal(address));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user