From 30ed44576483a8fdd15ff19599ec6f9ef72ce456 Mon Sep 17 00:00:00 2001 From: Josh Dersch Date: Mon, 11 Jan 2016 16:16:05 -0800 Subject: [PATCH] Fix for soft-reset emulator uPC and device reset; CopyDisk now executes correctly. --- Contralto/CPU/CPU.cs | 39 ++++++++++++++------ Contralto/CPU/Tasks/DiskTask.cs | 23 ++++++------ Contralto/CPU/Tasks/EmulatorTask.cs | 21 ++++++++--- Contralto/CPU/Tasks/Task.cs | 39 +++++++++++++------- Contralto/CPU/UCodeMemory.cs | 2 +- Contralto/Contralto.csproj | 2 +- Contralto/Debugger.Designer.cs | 53 +++++++++++++++++----------- Contralto/Debugger.cs | 6 +++- Contralto/Disk/Clark-Games.dsk | Bin 2601648 -> 2601648 bytes Contralto/Disk/bravox.dsk | Bin 2601648 -> 2601648 bytes Contralto/Disk/diag.dsk | Bin 2601648 -> 2601648 bytes Contralto/Disk/games.dsk | Bin 2601648 -> 2601648 bytes Contralto/Disk/gamesb.dsk | Bin 2601648 -> 2601648 bytes Contralto/Disk/nonprog.dsk | Bin 2601648 -> 2601648 bytes Contralto/Disk/st76boot.dsk | Bin 2601648 -> 2601648 bytes Contralto/Disk/tdisk4.dsk | Bin 2601648 -> 2601648 bytes Contralto/Disk/xmsmall.dsk | Bin 2601648 -> 2601648 bytes Contralto/IO/DiskController.cs | 34 ++++++++++-------- Contralto/Logging/Log.cs | 40 ++++++++++++++++++--- Contralto/Memory/MemoryBus.cs | 47 ++++++++++++++++++++++-- 20 files changed, 222 insertions(+), 84 deletions(-) diff --git a/Contralto/CPU/CPU.cs b/Contralto/CPU/CPU.cs index 528b3b4..13fdeb7 100644 --- a/Contralto/CPU/CPU.cs +++ b/Contralto/CPU/CPU.cs @@ -1,5 +1,7 @@ using System.Timers; +using Contralto.Logging; + namespace Contralto.CPU { public enum TaskType @@ -145,22 +147,30 @@ namespace Contralto.CPU /// public void SoftReset() { - // Reset tasks. + // Soft-Reset tasks. for (int i = 0; i < _tasks.Length; i++) { if (_tasks[i] != null) { - _tasks[i].Reset(); + _tasks[i].SoftReset(); } } UCodeMemory.LoadBanksFromRMR(_rmr); + _rmr = 0xffff; // Reset RMR (all tasks start in ROM0) + + // Start in Emulator + _currentTask = _tasks[0]; - // Execute the initial task switch. - TaskSwitch(); - - _currentTask = _nextTask; - _nextTask = null; + // + // TODO: + // This is a hack of sorts, it ensures that the sector task initializes + // itself as soon as the Emulator task yields after the reset. (CopyDisk is broken otherwise due to the + // sector task stomping over the KBLK CopyDisk sets up after the reset. This is a race of sorts.) + // Unsure if there is a deeper issue here or if there are other reset semantics + // in play here. + // + WakeupTask(CPU.TaskType.DiskSector); Logging.Log.Write(Logging.LogComponent.CPU, "Silent Boot; microcode banks initialized to {0}", Conversion.ToOctal(_rmr)); } @@ -173,7 +183,8 @@ namespace Contralto.CPU public void WakeupTask(TaskType task) { if (_tasks[(int)task] != null) - { + { + Log.Write(LogComponent.TaskSwitch, "Wakeup enabled for Task {0}", task); _tasks[(int)task].WakeupTask(); } } @@ -186,7 +197,8 @@ namespace Contralto.CPU public void BlockTask(TaskType task) { if (_tasks[(int)task] != null) - { + { + Log.Write(LogComponent.TaskSwitch, "Removed wakeup for Task {0}", task); _tasks[(int)task].BlockTask(); } } @@ -218,8 +230,15 @@ namespace Contralto.CPU for (int i = _tasks.Length - 1; i >= 0; i--) { if (_tasks[i] != null && _tasks[i].Wakeup) - { + { _nextTask = _tasks[i]; + + if (_nextTask != _currentTask && _currentTask != null) + { + Log.Write(LogComponent.TaskSwitch, "TASK: Next task will be {0} (pri {1}); current task {2} (pri {3})", + (TaskType)_nextTask.Priority, _nextTask.Priority, + (TaskType)_currentTask.Priority, _currentTask.Priority); + } break; } } diff --git a/Contralto/CPU/Tasks/DiskTask.cs b/Contralto/CPU/Tasks/DiskTask.cs index 4188b70..9b1eb8b 100644 --- a/Contralto/CPU/Tasks/DiskTask.cs +++ b/Contralto/CPU/Tasks/DiskTask.cs @@ -1,4 +1,5 @@ using Contralto.IO; +using Contralto.Logging; using System; namespace Contralto.CPU @@ -22,6 +23,8 @@ namespace Contralto.CPU protected override bool ExecuteInstruction(MicroInstruction instruction) { + // Log.Write(LogComponent.Debug, "{0}: {1}", Conversion.ToOctal(_mpc), UCodeDisassembler.DisassembleInstruction(instruction, _taskType)); + bool task = base.ExecuteInstruction(instruction); // Deal with SECLATE semantics: If the Disk Sector task wakes up and runs before @@ -32,13 +35,7 @@ namespace Contralto.CPU { // Sector task is running; clear enable for seclate signal _diskController.DisableSeclate(); - } - - /* - if (_taskType == TaskType.DiskWord) - { - _wakeup = false; - } */ + } return task; } @@ -170,32 +167,32 @@ namespace Contralto.CPU // "NEXT <- NEXT OR (IF fatal error in latches THEN 0 ELSE 1)" _nextModifier |= GetInitModifier(instruction); - if (true) //!_diskController.FatalError) + if (!_diskController.FatalError) { _nextModifier |= 0x1; } else { - Console.WriteLine("fatal disk error"); + Console.WriteLine("fatal disk error on disk {0}", _diskController.Drive); } break; case DiskF2.STROBON: // "NEXT <- NEXT OR (IF seek strobe still on THEN 1 ELSE 0)" _nextModifier |= GetInitModifier(instruction); - if ((_diskController.KSTAT & 0x0040) == 0x0040) + if ((_diskController.KSTAT & DiskController.STROBE) != 0) { _nextModifier |= 0x1; } break; case DiskF2.SWRNRDY: - // "NEXT <- NEXT OR (IF disk not ready to accept command THEN 1 ELSE 0) - // for now, always zero (not sure when this would be 1 yet) + // "NEXT <- NEXT OR (IF disk not ready to accept command THEN 1 ELSE 0) _nextModifier |= GetInitModifier(instruction); if (!_diskController.Ready) { - _nextModifier |= 1; + Console.WriteLine("disk {0} not ready", _diskController.Drive); + _nextModifier |= 0x1; } break; diff --git a/Contralto/CPU/Tasks/EmulatorTask.cs b/Contralto/CPU/Tasks/EmulatorTask.cs index 96fdb00..44c33e6 100644 --- a/Contralto/CPU/Tasks/EmulatorTask.cs +++ b/Contralto/CPU/Tasks/EmulatorTask.cs @@ -105,6 +105,11 @@ namespace Contralto.CPU // BOOT (soft-reset) operation. // Reset the CPU using the current RMR (start tasks in RAM or ROM as specified.) _cpu.SoftReset(); + + // Since this is a soft reset, we don't want MPC to be taken from the NEXT + // field at the end of the cycle, setting this flag causes the main Task + // implementation to skip updating _mpc at the end of this instruction. + _softReset = true; } else if(_busData != 0) { @@ -139,11 +144,17 @@ namespace Contralto.CPU break; case EmulatorF1.LoadESRB: - // For now, this is always 0; we do not yet support the 3K RAM system with 8 banks of S registers. - _rb = 0; - Logging.Log.Write(Logging.LogType.Warning, Logging.LogComponent.EmulatorTask, "ESRB<- ({0}) not fully implemented.", - Conversion.ToOctal((_busData & 0xe) >> 1)); - //_rb = (ushort)((_busData & 0xe) >> 1); + // For now, this is always 0; we do not yet support the 3K RAM system with 8 banks of S registers. + _rb = (ushort)((_busData & 0xe) >> 1); + + if (_rb != 0) + { + _rb = 0; + Logging.Log.Write(Logging.LogType.Warning, Logging.LogComponent.EmulatorTask, "ESRB<- ({0}) not fully implemented.", + Conversion.ToOctal((_busData & 0xe) >> 1)); + + throw new NotImplementedException("ESRB<-"); + } break; default: diff --git a/Contralto/CPU/Tasks/Task.cs b/Contralto/CPU/Tasks/Task.cs index 2f0f232..3fa1ada 100644 --- a/Contralto/CPU/Tasks/Task.cs +++ b/Contralto/CPU/Tasks/Task.cs @@ -56,6 +56,14 @@ namespace Contralto.CPU _rb = 0; } + public virtual void SoftReset() + { + // + // As above but we leave all other state alone. + // + _mpc = (ushort)_taskType; + } + public virtual void BlockTask() { _wakeup = false; @@ -98,6 +106,7 @@ namespace Contralto.CPU _rSelect = 0; _srSelect = 0; _busData = 0; + _softReset = false; Shifter.SetMagic(false); @@ -414,9 +423,8 @@ namespace Contralto.CPU // this depends on the value of the NEXT field in this instruction // if (swMode) - { - //Console.WriteLine("SWMODE NEXT {0} Modifier {1}", Conversion.ToOctal(instruction.NEXT), Conversion.ToOctal(nextModifier)); - UCodeMemory.SwitchMode((ushort)(instruction.NEXT), _taskType); + { + UCodeMemory.SwitchMode(instruction.NEXT, _taskType); Logging.Log.Write(Logging.LogComponent.Microcode, "SWMODE: uPC {0}, next uPC {1}", Conversion.ToOctal(_mpc), Conversion.ToOctal(instruction.NEXT | nextModifier)); } @@ -430,8 +438,12 @@ namespace Contralto.CPU // // Select next address, using the address modifier from the last instruction. + // (Unless a soft reset occurred during this instruction) // - _mpc = (ushort)(instruction.NEXT | nextModifier); + if (!_softReset) + { + _mpc = (ushort)(instruction.NEXT | nextModifier); + } return nextTask; } @@ -486,15 +498,16 @@ namespace Contralto.CPU // // TODO: maybe instead of these being shared (which feels kinda bad) // these could be encapsulated in an object and passed to subclass implementations? - protected ushort _busData; // Data placed onto the bus (ANDed from multiple sources) - protected ushort _nextModifier; // Bits ORed onto the NEXT field of the current instruction - protected uint _rSelect; // RSELECT field from current instruction, potentially modified by task - protected uint _srSelect; // RSELECT field as used by S register access (not modified in the same way as normal _rSelect). - protected bool _loadS; // Whether to load S from M at and of cycle - protected bool _loadR; // Whether to load R from shifter at end of cycle. - protected bool _rdRam; // Whether to load uCode RAM onto the bus during the next cycle. - protected bool _wrtRam; // Whether to write uCode RAM from M and ALU outputs during the next cycle. - protected bool _swMode; // Whether to switch uCode banks during the next cycle. + protected ushort _busData; // Data placed onto the bus (ANDed from multiple sources) + protected ushort _nextModifier; // Bits ORed onto the NEXT field of the current instruction + protected uint _rSelect; // RSELECT field from current instruction, potentially modified by task + protected uint _srSelect; // RSELECT field as used by S register access (not modified in the same way as normal _rSelect). + protected bool _loadS; // Whether to load S from M at and of cycle + protected bool _loadR; // Whether to load R from shifter at end of cycle. + protected bool _rdRam; // Whether to load uCode RAM onto the bus during the next cycle. + protected bool _wrtRam; // Whether to write uCode RAM from M and ALU outputs during the next cycle. + protected bool _swMode; // Whether to switch uCode banks during the next cycle. + protected bool _softReset; // Whether this instruction caused a soft reset (so MPC should not come from instruction's NEXT field) // diff --git a/Contralto/CPU/UCodeMemory.cs b/Contralto/CPU/UCodeMemory.cs index 61be085..c8ff2ac 100644 --- a/Contralto/CPU/UCodeMemory.cs +++ b/Contralto/CPU/UCodeMemory.cs @@ -72,7 +72,7 @@ namespace Contralto.CPU public static void LoadBanksFromRMR(ushort rmr) { for(int i=0;i<16;i++) - { + { _microcodeBank[i] = (rmr & (1 << i)) == 0 ? MicrocodeBank.RAM0 : MicrocodeBank.ROM0; } } diff --git a/Contralto/Contralto.csproj b/Contralto/Contralto.csproj index 986efde..24dac31 100644 --- a/Contralto/Contralto.csproj +++ b/Contralto/Contralto.csproj @@ -160,7 +160,7 @@ PreserveNewest - PreserveNewest + Always PreserveNewest diff --git a/Contralto/Debugger.Designer.cs b/Contralto/Debugger.Designer.cs index d9f283f..b18af4a 100644 --- a/Contralto/Debugger.Designer.cs +++ b/Contralto/Debugger.Designer.cs @@ -97,6 +97,8 @@ this.Reg = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.RegValue = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.MemoryJumpToAddress = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); this._memoryData = new System.Windows.Forms.DataGridView(); this.Bkpt = new System.Windows.Forms.DataGridViewCheckBoxColumn(); this.Address = new System.Windows.Forms.DataGridViewTextBoxColumn(); @@ -116,8 +118,7 @@ this.dataGridViewTextBoxColumn9 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.dataGridViewTextBoxColumn10 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.dataGridViewTextBoxColumn11 = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.label3 = new System.Windows.Forms.Label(); - this.MemoryJumpToAddress = new System.Windows.Forms.TextBox(); + this.HackButton = new System.Windows.Forms.Button(); this.Microcode.SuspendLayout(); this.SourceTabs.SuspendLayout(); this.Rom0Page.SuspendLayout(); @@ -270,7 +271,7 @@ this.Rom1Page.Location = new System.Drawing.Point(4, 22); this.Rom1Page.Name = "Rom1Page"; this.Rom1Page.Padding = new System.Windows.Forms.Padding(3); - this.Rom1Page.Size = new System.Drawing.Size(582, 545); + this.Rom1Page.Size = new System.Drawing.Size(582, 554); this.Rom1Page.TabIndex = 1; this.Rom1Page.Text = "ROM1"; this.Rom1Page.UseVisualStyleBackColor = true; @@ -369,7 +370,7 @@ this.Rom2Page.Location = new System.Drawing.Point(4, 22); this.Rom2Page.Name = "Rom2Page"; this.Rom2Page.Padding = new System.Windows.Forms.Padding(3); - this.Rom2Page.Size = new System.Drawing.Size(582, 545); + this.Rom2Page.Size = new System.Drawing.Size(582, 554); this.Rom2Page.TabIndex = 2; this.Rom2Page.Text = "RAM0"; this.Rom2Page.UseVisualStyleBackColor = true; @@ -750,6 +751,24 @@ this.groupBox4.TabStop = false; this.groupBox4.Text = "Memory"; // + // MemoryJumpToAddress + // + this.MemoryJumpToAddress.Location = new System.Drawing.Point(53, 276); + this.MemoryJumpToAddress.Name = "MemoryJumpToAddress"; + this.MemoryJumpToAddress.Size = new System.Drawing.Size(48, 20); + this.MemoryJumpToAddress.TabIndex = 15; + this.MemoryJumpToAddress.TabStop = false; + this.MemoryJumpToAddress.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnMemoryJumpAddressKeyDown); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(6, 279); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(47, 13); + this.label3.TabIndex = 14; + this.label3.Text = "Jump to:"; + // // _memoryData // this._memoryData.AllowUserToAddRows = false; @@ -1026,29 +1045,22 @@ this.dataGridViewTextBoxColumn11.Resizable = System.Windows.Forms.DataGridViewTriState.False; this.dataGridViewTextBoxColumn11.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; // - // label3 + // HackButton // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(6, 279); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(47, 13); - this.label3.TabIndex = 14; - this.label3.Text = "Jump to:"; - // - // MemoryJumpToAddress - // - this.MemoryJumpToAddress.Location = new System.Drawing.Point(53, 276); - this.MemoryJumpToAddress.Name = "MemoryJumpToAddress"; - this.MemoryJumpToAddress.Size = new System.Drawing.Size(48, 20); - this.MemoryJumpToAddress.TabIndex = 15; - this.MemoryJumpToAddress.TabStop = false; - this.MemoryJumpToAddress.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnMemoryJumpAddressKeyDown); + this.HackButton.Location = new System.Drawing.Point(295, 955); + this.HackButton.Name = "HackButton"; + this.HackButton.Size = new System.Drawing.Size(36, 23); + this.HackButton.TabIndex = 15; + this.HackButton.Text = "hack"; + this.HackButton.UseVisualStyleBackColor = true; + this.HackButton.Click += new System.EventHandler(this.HackButton_Click); // // Debugger // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(949, 997); + this.Controls.Add(this.HackButton); this.Controls.Add(this.groupBox6); this.Controls.Add(this.NovaStep); this.Controls.Add(this.RunToNextTaskButton); @@ -1165,5 +1177,6 @@ private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn11; private System.Windows.Forms.TextBox MemoryJumpToAddress; private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button HackButton; } } \ No newline at end of file diff --git a/Contralto/Debugger.cs b/Contralto/Debugger.cs index 8b9e341..046d996 100644 --- a/Contralto/Debugger.cs +++ b/Contralto/Debugger.cs @@ -919,6 +919,10 @@ namespace Contralto // Nova Debugger breakpoints; same as above private bool[] _novaBreakpointEnabled; - + private void HackButton_Click(object sender, EventArgs e) + { + Logging.Log.LogComponents |= Logging.LogComponent.TaskSwitch; + Logging.Log.Write(Logging.LogComponent.Debug, "***** HACK HIT ******"); + } } } diff --git a/Contralto/Disk/Clark-Games.dsk b/Contralto/Disk/Clark-Games.dsk index f0298793a949ad9392bc8ace3b1d180470d968fa..9cd61307149cc88bb77816b82c391e680f1534db 100644 GIT binary patch delta 7962 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 F_J8`P>0$r? delta 14330 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 DG5hW? delta 692 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 U$K#!Z_XNC?o##hf)41z@0pazQE&u=k delta 22794 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 diff --git a/Contralto/Disk/games.dsk b/Contralto/Disk/games.dsk index c901c5e7e4a9c2237dc91ac11bd3534497ea4396..a2b05df143fd860d6ee947e35a132d1a7becd2fe 100644 GIT binary patch delta 21847 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 TGlqc}VlWKyZ~QnmMWMH>zE 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 Zdq#mJ8cPh8{#atM3~;=AMkzh@e*iD5cdGyZ diff --git a/Contralto/Disk/gamesb.dsk b/Contralto/Disk/gamesb.dsk index e4d806812bc25eca123a072f2078b45aed6374f2..e3f86b34f50ecf589dff0398f4088407e5d697d6 100644 GIT binary patch delta 377 zcmX}ku}cDB7zXh7yFSf3Q_s@0va8f2G!AL0uFY_FZ^@yEhNO<*hN7Y1a4D$a2(hin zMY!SH-1-B8{)Ci<8cLT0p~oBIZ$K8}(3d(;Zr*r6Eb9Mcb zv3uvT&l67Zn-3oR0Nsw1S_=+J_2} zLJUV#qoZB(KsV3NLMP(&JvwC0?MO;7#cquxm=LWIf6THyQBM0ZT#lgQ5vMs{fwQpP z%=^F(lMnzI6w%BF%Sle8k=-i=VG2SJhKT5u)SG8{3v(V}eyH6$c?a2JSFI>a!wkeA p4zrMeB+S7)EI&rvtm?Jt{>z>)P=rCSu z-GqJ+`a*_2|BSQ>=2JGw>k0n~S4APZIDrEql>|a`PM!AAZpYg{^mP47-nSEf;^{7C zo3j-3V}^w6$I165S4kebij&kz_|3@Mb!8*TMGA&31yYcP45*+%7IL6NUJhG@&mGYS zdffsPp#*bK1_S0{0V=R4dtGzS5RUx1G^>^v$;qSnoEKyH@M_jh#W;vEOJIQwRak}^ TtUw(cXn+f=(3DYTEq?n4Pg83a delta 350 zcmXBMJxjx25C`z*&ZM@fO?`WE3I4EeRs!%A1Q^6q;s7n!X z5d;^ZNFjx1^Aota2+mGAxpfHm5542Z|AxEkeLqq!;;>dGAtDtDHu-&>%M`>MgDDYM z8)q8t(6#S+zDv?~`S(q$Vs%Ki2K+~bq=@SB2o9o&&_Y~@<7%T>KW#YY&6Irl(Lbou zV*CC!GKjB)FaHZWZQuX^ diff --git a/Contralto/Disk/st76boot.dsk b/Contralto/Disk/st76boot.dsk index eb44786f58611088167f778defc2e9f532a6657b..30c5abf5eae2f97ae5526a2447bd3dd1f4a7d8ed 100644 GIT binary patch delta 206 zcmW;5OAf(60D$3{L8(_!?;7LHN+KehLpa6UK^GQ1f}M>EH0h!zva@i6{(Q+7zn?Px z-75DYg!oU6N(bsJ9;bt|NpAWh<@Ih&WR0X^F104_f8{<3y#gH;S)$7_E3C4{Iz2Yn jWQ#uA?6Auo`y6n{fFo*-X*l7OGtRl-lB+cI*1J~*6!APT delta 206 zcmWl|I}*V_0D$4$6-&H=ct@=FqcNi}%;6W2oYr`6$VO+$N8wY*)9A?dA(bcSR<)e$gOewuZ)t|D^jz>GF?_!WsP+< n=&{Kb+w|FCmp%45;E*E*95dvEhEvWs=YmVFxXxp5b9ns#uT(pz diff --git a/Contralto/Disk/tdisk4.dsk b/Contralto/Disk/tdisk4.dsk index 2f4e05dc365f1b5d3edcaefe4c39d33fcb37d4ad..385d48236b398243e262d463a6bc56a6c0aa0d8c 100644 GIT binary patch delta 348 zcmW;GJxjx26b0aWlb9y`O4Ayx->tP)6f!CfU8Md5sjEuGp(VA}K`1&%c?W-ho1-9I z0zzLLvbcz&xDvwBB(MbGN`Ki zFB}!Bt-+L3Z9Uj9Q)o}f_g#HUV@r(7Iz;5SYfRZUQ^ep$!}+#t_}9 z-d@{loi@B{x0!3#>PN?}=Ox-QKTv*Ie%Fokld?@>3442lKEX`@_Z8M~$dNqSIZ1Wmth6F;j`2OaKO;PC;VO>^wrF!Hav66O6 delta 340 zcmW;CJxjw-7zN;alX#n}tu?LD`rTSvMIoz*R2=GVg)~ksQW2~UN(Z6fAmI-E0oeo> zK?)Km^rDc(MI6Nr1);e33v4$BPs-te^YR}5=Z^XzOX1sukWjg`skk;R-3E>b914mI z9Ch!RmV|0(Fd|ih1#8^FdPu%+u?>xu#h}0-A_oQibDf{yKO{d+^OoOqhacNWl!u!kldP=3gJQ-9{`f>h1z8!V;t*1Iv(w6zSWOZ#k{>dMb~wfeTh8QgGp-Dnfl@8E)t!U zc~R!#%Ur*g&XN7|(;rQ&Xfa9KiASd%jjFh>GAJP{4xKw4rfuFddAO@eV9_1xF_nhuRYuW6}$-kaT#P zC-538c(%6ts @@ -685,7 +691,7 @@ namespace Contralto.IO // SECLATE data. // 8.5uS for seclate delay (approx. 50 clocks) - private static ulong _seclateDuration = (ulong)(85.0 * Conversion.UsecToNsec * _scale); + private static ulong _seclateDuration = (ulong)(20.0 * Conversion.UsecToNsec * _scale); private bool _seclateEnable; private bool _seclate; private Event _seclateEvent; @@ -698,10 +704,10 @@ namespace Contralto.IO private bool _debugRead; // KSTAT bitfields - private readonly ushort SECLATE = 0x10; - private readonly ushort NOTREADY = 0x20; - private readonly ushort STROBE = 0x40; - private readonly ushort SEEKFAIL = 0x80; + public static readonly ushort SECLATE = 0x10; + public static readonly ushort NOTREADY = 0x20; + public static readonly ushort STROBE = 0x40; + public static readonly ushort SEEKFAIL = 0x80; } } diff --git a/Contralto/Logging/Log.cs b/Contralto/Logging/Log.cs index 31c7263..4357653 100644 --- a/Contralto/Logging/Log.cs +++ b/Contralto/Logging/Log.cs @@ -1,4 +1,7 @@ -using System; +#define LOGGING_ENABLED + +using System; +using System.IO; namespace Contralto.Logging { @@ -21,8 +24,10 @@ namespace Contralto.Logging CPU = 0x200, EthernetController = 0x400, EthernetTask = 0x800, + TaskSwitch = 0x1000, - All = 0x7fffffff + Debug = 0x40000000, + All = 0x7fffffff } /// @@ -47,10 +52,19 @@ namespace Contralto.Logging static Log() { // TODO: make configurable - _components = LogComponent.None; // LogComponent.EthernetController; // | LogComponent.Microcode | LogComponent.Memory | LogComponent.CPU; - _type = LogType.Normal | LogType.Warning | LogType.Error; + _components = LogComponent.CPU; // LogComponent.DiskController | LogComponent.DiskSectorTask | LogComponent.Debug | LogComponent.CPU; // LogComponent.EthernetController; // | LogComponent.Microcode | LogComponent.Memory | LogComponent.CPU; + _type = LogType.Normal | LogType.Warning | LogType.Error | LogType.Verbose; + + _logStream = new StreamWriter("log.txt"); } + public static LogComponent LogComponents + { + get { return _components; } + set { _components = value; } + } + +#if LOGGING_ENABLED /// /// Logs a message without specifying type/severity for terseness; /// will not log if Type has been set to None. @@ -72,10 +86,28 @@ namespace Contralto.Logging // My log has something to tell you... // TODO: color based on type, etc. Console.WriteLine(component.ToString() + ": " + message, args); + + if (_logStream != null) + { + _logStream.WriteLine(component.ToString() + ": " + message, args); + } } } +#else + public static void Write(LogComponent component, string message, params object[] args) + { + + } + + public static void Write(LogType type, LogComponent component, string message, params object[] args) + { + + } + +#endif private static LogComponent _components; private static LogType _type; + private static StreamWriter _logStream; } } diff --git a/Contralto/Memory/MemoryBus.cs b/Contralto/Memory/MemoryBus.cs index db17e90..39e1c6f 100644 --- a/Contralto/Memory/MemoryBus.cs +++ b/Contralto/Memory/MemoryBus.cs @@ -168,7 +168,7 @@ namespace Contralto.Memory _memoryAddress = address; _extendedMemoryReference = extendedMemoryReference; _task = task; - _memoryCycle = 1; + _memoryCycle = 1; } } @@ -190,6 +190,13 @@ namespace Contralto.Memory case 5: // Single word read //Log.Write(LogType.Verbose, LogComponent.Memory, "Single-word read of {0} from {1} (cycle 5)", Conversion.ToOctal(_memoryData), Conversion.ToOctal(_memoryAddress ^ 1)); + + // debug + /* + if (_memoryAddress == 0xfc90 && _task != TaskType.Emulator) // 176220 -- status word for disk + { + Logging.Log.Write(Logging.LogComponent.Debug, "--> Task {0} read {1} from 176220.", _task, _memoryData); + } */ return _memoryData; // *** @@ -212,11 +219,23 @@ namespace Contralto.Memory //Log.Write(LogType.Verbose, LogComponent.Memory, "Double-word read of {0} from {1} (cycle 6)", Conversion.ToOctal(_memoryData2), Conversion.ToOctal(_memoryAddress ^ 1)); _doubleWordMixed = false; + // debug + /* + if ((_memoryAddress ^ 1) == 0xfc90 && _task != TaskType.Emulator) // 176220 -- status word for disk + { + Logging.Log.Write(Logging.LogComponent.Debug, "--> Task {0} read {1} from 176220.", _task, _memoryData2); + } */ return _memoryData2; } else { _doubleWordMixed = false; + // debug + /* + if (_memoryAddress == 0xfc90 && _task != TaskType.Emulator) // 176220 -- status word for disk + { + Logging.Log.Write(Logging.LogComponent.Debug, "--> Task {0} read {1} from 176220.", _task, _memoryData); + } */ //Log.Write(LogType.Verbose, LogComponent.Memory, "Single-word read of {0} from {1} (post cycle 6)", Conversion.ToOctal(_memoryData), Conversion.ToOctal(_memoryAddress)); return _memoryData; } @@ -236,12 +255,21 @@ namespace Contralto.Memory throw new InvalidOperationException("Unexpected microcode behavior -- LoadMD during incorrect memory cycle."); case 3: + + // debug + if (_memoryAddress == 0xfc90 || _memoryAddress == 0xfc91 || _memoryAddress == 0x151) // 176220 -- status word for disk + { + Logging.Log.Write(Logging.LogComponent.Debug, "++> Task {0} wrote {1} to {3} (was {2}).", _task, Conversion.ToOctal(data), Conversion.ToOctal(DebugReadWord(_task, _memoryAddress)), Conversion.ToOctal(_memoryAddress)); + } + _memoryData = data; // Only really necessary to show in debugger // Start of doubleword write: WriteToBus(_memoryAddress, data, _task, _extendedMemoryReference); _doubleWordStore = true; _doubleWordMixed = true; + + /* Log.Write( LogType.Verbose, @@ -262,7 +290,22 @@ namespace Contralto.Memory Conversion.ToOctal(data), _doubleWordStore ? Conversion.ToOctal(_memoryAddress ^ 1) : Conversion.ToOctal(_memoryAddress)); */ - WriteToBus(_doubleWordStore ? (ushort)(_memoryAddress ^ 1) : _memoryAddress, data, _task, _extendedMemoryReference); + // debug + ushort actualAddress = _doubleWordStore ? (ushort)(_memoryAddress ^ 1) : _memoryAddress; + + /* + if (actualAddress == 0xfc90 || actualAddress == 0xfc91 || _memoryAddress == 0x151) // 176220 -- status word for disk + { + Logging.Log.Write(Logging.LogComponent.Debug, "--> Task {0} wrote {1} to {4} (was {2}). Extd {3}", _task, Conversion.ToOctal(data), Conversion.ToOctal(DebugReadWord(_task, actualAddress)), _extendedMemoryReference, Conversion.ToOctal(actualAddress)); + } */ + + WriteToBus(actualAddress, data, _task, _extendedMemoryReference); + + /* + if (actualAddress == 0xfc90 || actualAddress == 0xfc91 || _memoryAddress == 0x151) // 176220 -- status word for disk + { + Logging.Log.Write(Logging.LogComponent.Debug, "--> Now {0}.", Conversion.ToOctal(DebugReadWord(_task, actualAddress))); + } */ break; }