From 947470e1d9d5fdb385c79260bbb552b93796947f Mon Sep 17 00:00:00 2001 From: adelikat Date: Tue, 27 May 2014 02:45:05 +0000 Subject: [PATCH] Atari 2600 - break up frame advance with StartNewFrame() and EndFrame() and wire them up to Cycle and Scanline advance, all methods are now smart enough to roll over to the next frame at the right time --- .../Atari2600/Atari2600Debugger.Designer.cs | 224 +++++++++--------- .../tools/Atari2600/Atari2600Debugger.cs | 1 - .../Consoles/Atari/2600/Atari2600.Core.cs | 41 +++- .../Consoles/Atari/2600/Atari2600.cs | 2 +- 4 files changed, 147 insertions(+), 121 deletions(-) diff --git a/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.Designer.cs b/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.Designer.cs index c59a171cc2..49a9afe1f3 100644 --- a/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.Designer.cs @@ -71,28 +71,28 @@ this.label2 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.CoreInfoBox = new System.Windows.Forms.GroupBox(); + this.LastAddressLabel = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.DistinctAccesLabel = new System.Windows.Forms.Label(); + this.label11 = new System.Windows.Forms.Label(); + this.TotalCyclesLabel = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.ScanlineLabel = new System.Windows.Forms.Label(); + this.FrameLabel = new System.Windows.Forms.Label(); this.VBlankCheckbox = new System.Windows.Forms.CheckBox(); this.VSyncChexkbox = new System.Windows.Forms.CheckBox(); this.label8 = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label(); this.TracerBox = new System.Windows.Forms.GroupBox(); + this.TraceView = new BizHawk.Client.EmuHawk.VirtualListView(); + this.Script = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.StepOverButton = new System.Windows.Forms.Button(); this.StepOutButton = new System.Windows.Forms.Button(); this.BreakpointGroupBox = new System.Windows.Forms.GroupBox(); this.AddBreakpointButton = new System.Windows.Forms.Button(); - this.FrameLabel = new System.Windows.Forms.Label(); - this.ScanlineLabel = new System.Windows.Forms.Label(); - this.TotalCyclesLabel = new System.Windows.Forms.Label(); - this.label10 = new System.Windows.Forms.Label(); - this.DistinctAccesLabel = new System.Windows.Forms.Label(); - this.label11 = new System.Windows.Forms.Label(); - this.label9 = new System.Windows.Forms.Label(); - this.LastAddressLabel = new System.Windows.Forms.Label(); this.BreakpointView = new BizHawk.Client.EmuHawk.VirtualListView(); this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.TraceView = new BizHawk.Client.EmuHawk.VirtualListView(); - this.Script = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.DebuggerMenu.SuspendLayout(); this.RegistersBox.SuspendLayout(); this.CoreInfoBox.SuspendLayout(); @@ -516,10 +516,82 @@ this.CoreInfoBox.Controls.Add(this.label7); this.CoreInfoBox.Location = new System.Drawing.Point(260, 27); this.CoreInfoBox.Name = "CoreInfoBox"; - this.CoreInfoBox.Size = new System.Drawing.Size(238, 155); + this.CoreInfoBox.Size = new System.Drawing.Size(265, 155); this.CoreInfoBox.TabIndex = 5; this.CoreInfoBox.TabStop = false; // + // LastAddressLabel + // + this.LastAddressLabel.AutoSize = true; + this.LastAddressLabel.Location = new System.Drawing.Point(191, 15); + this.LastAddressLabel.Name = "LastAddressLabel"; + this.LastAddressLabel.Size = new System.Drawing.Size(13, 13); + this.LastAddressLabel.TabIndex = 13; + this.LastAddressLabel.Text = "0"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(96, 15); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(71, 13); + this.label9.TabIndex = 12; + this.label9.Text = "Last Address:"; + // + // DistinctAccesLabel + // + this.DistinctAccesLabel.AutoSize = true; + this.DistinctAccesLabel.Location = new System.Drawing.Point(191, 38); + this.DistinctAccesLabel.Name = "DistinctAccesLabel"; + this.DistinctAccesLabel.Size = new System.Drawing.Size(13, 13); + this.DistinctAccesLabel.TabIndex = 11; + this.DistinctAccesLabel.Text = "0"; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(96, 38); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(94, 13); + this.label11.TabIndex = 10; + this.label11.Text = "Distinct Accesses:"; + // + // TotalCyclesLabel + // + this.TotalCyclesLabel.AutoSize = true; + this.TotalCyclesLabel.Location = new System.Drawing.Point(72, 61); + this.TotalCyclesLabel.Name = "TotalCyclesLabel"; + this.TotalCyclesLabel.Size = new System.Drawing.Size(13, 13); + this.TotalCyclesLabel.TabIndex = 9; + this.TotalCyclesLabel.Text = "0"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(6, 61); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(68, 13); + this.label10.TabIndex = 8; + this.label10.Text = "Total Cycles:"; + // + // ScanlineLabel + // + this.ScanlineLabel.AutoSize = true; + this.ScanlineLabel.Location = new System.Drawing.Point(72, 38); + this.ScanlineLabel.Name = "ScanlineLabel"; + this.ScanlineLabel.Size = new System.Drawing.Size(13, 13); + this.ScanlineLabel.TabIndex = 7; + this.ScanlineLabel.Text = "0"; + // + // FrameLabel + // + this.FrameLabel.AutoSize = true; + this.FrameLabel.Location = new System.Drawing.Point(72, 15); + this.FrameLabel.Name = "FrameLabel"; + this.FrameLabel.Size = new System.Drawing.Size(13, 13); + this.FrameLabel.TabIndex = 6; + this.FrameLabel.Text = "0"; + // // VBlankCheckbox // this.VBlankCheckbox.AutoSize = true; @@ -570,6 +642,35 @@ this.TracerBox.TabStop = false; this.TracerBox.Text = "Trace log"; // + // TraceView + // + this.TraceView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TraceView.BlazingFast = false; + this.TraceView.CheckBoxes = true; + this.TraceView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.Script}); + this.TraceView.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.TraceView.FullRowSelect = true; + this.TraceView.GridLines = true; + this.TraceView.HideSelection = false; + this.TraceView.ItemCount = 0; + this.TraceView.Location = new System.Drawing.Point(8, 18); + this.TraceView.Name = "TraceView"; + this.TraceView.SelectAllInProgress = false; + this.TraceView.selectedItem = -1; + this.TraceView.Size = new System.Drawing.Size(393, 414); + this.TraceView.TabIndex = 4; + this.TraceView.TabStop = false; + this.TraceView.UseCompatibleStateImageBehavior = false; + this.TraceView.View = System.Windows.Forms.View.Details; + // + // Script + // + this.Script.Text = "Instructions"; + this.Script.Width = 599; + // // StepOverButton // this.StepOverButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); @@ -614,78 +715,6 @@ this.AddBreakpointButton.UseVisualStyleBackColor = true; this.AddBreakpointButton.Click += new System.EventHandler(this.AddBreakpointButton_Click); // - // FrameLabel - // - this.FrameLabel.AutoSize = true; - this.FrameLabel.Location = new System.Drawing.Point(72, 15); - this.FrameLabel.Name = "FrameLabel"; - this.FrameLabel.Size = new System.Drawing.Size(13, 13); - this.FrameLabel.TabIndex = 6; - this.FrameLabel.Text = "0"; - // - // ScanlineLabel - // - this.ScanlineLabel.AutoSize = true; - this.ScanlineLabel.Location = new System.Drawing.Point(72, 38); - this.ScanlineLabel.Name = "ScanlineLabel"; - this.ScanlineLabel.Size = new System.Drawing.Size(13, 13); - this.ScanlineLabel.TabIndex = 7; - this.ScanlineLabel.Text = "0"; - // - // TotalCyclesLabel - // - this.TotalCyclesLabel.AutoSize = true; - this.TotalCyclesLabel.Location = new System.Drawing.Point(72, 61); - this.TotalCyclesLabel.Name = "TotalCyclesLabel"; - this.TotalCyclesLabel.Size = new System.Drawing.Size(13, 13); - this.TotalCyclesLabel.TabIndex = 9; - this.TotalCyclesLabel.Text = "0"; - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(6, 61); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(68, 13); - this.label10.TabIndex = 8; - this.label10.Text = "Total Cycles:"; - // - // DistinctAccesLabel - // - this.DistinctAccesLabel.AutoSize = true; - this.DistinctAccesLabel.Location = new System.Drawing.Point(191, 38); - this.DistinctAccesLabel.Name = "DistinctAccesLabel"; - this.DistinctAccesLabel.Size = new System.Drawing.Size(13, 13); - this.DistinctAccesLabel.TabIndex = 11; - this.DistinctAccesLabel.Text = "0"; - // - // label11 - // - this.label11.AutoSize = true; - this.label11.Location = new System.Drawing.Point(96, 38); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(94, 13); - this.label11.TabIndex = 10; - this.label11.Text = "Distinct Accesses:"; - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(96, 15); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(71, 13); - this.label9.TabIndex = 12; - this.label9.Text = "Last Address:"; - // - // LastAddressLabel - // - this.LastAddressLabel.AutoSize = true; - this.LastAddressLabel.Location = new System.Drawing.Point(191, 15); - this.LastAddressLabel.Name = "LastAddressLabel"; - this.LastAddressLabel.Size = new System.Drawing.Size(13, 13); - this.LastAddressLabel.TabIndex = 13; - this.LastAddressLabel.Text = "0"; - // // BreakpointView // this.BreakpointView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -721,35 +750,6 @@ this.columnHeader2.Text = "Type"; this.columnHeader2.Width = 103; // - // TraceView - // - this.TraceView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TraceView.BlazingFast = false; - this.TraceView.CheckBoxes = true; - this.TraceView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.Script}); - this.TraceView.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.TraceView.FullRowSelect = true; - this.TraceView.GridLines = true; - this.TraceView.HideSelection = false; - this.TraceView.ItemCount = 0; - this.TraceView.Location = new System.Drawing.Point(8, 18); - this.TraceView.Name = "TraceView"; - this.TraceView.SelectAllInProgress = false; - this.TraceView.selectedItem = -1; - this.TraceView.Size = new System.Drawing.Size(393, 414); - this.TraceView.TabIndex = 4; - this.TraceView.TabStop = false; - this.TraceView.UseCompatibleStateImageBehavior = false; - this.TraceView.View = System.Windows.Forms.View.Details; - // - // Script - // - this.Script.Text = "Instructions"; - this.Script.Width = 599; - // // Atari2600Debugger // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.cs b/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.cs index b32d5bfc2a..d7b30707f7 100644 --- a/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.cs +++ b/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.cs @@ -315,7 +315,6 @@ namespace BizHawk.Client.EmuHawk } UpdateValues(); - } private void ScanlineAdvanceBtn_Click(object sender, EventArgs e) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs index eb93f7e698..a1c9a9c9e9 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs @@ -340,7 +340,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 Cpu.PC = (ushort)(ReadMemory(0x1FFC) + (ReadMemory(0x1FFD) << 8)); // set the initial PC } - public void FrameAdvance(bool render, bool rendersound) + private void StartNewFrame() { _frame++; _islag = true; @@ -351,12 +351,10 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 } _tia.BeginAudioFrame(); - while (_tia.LineCount < _tia.NominalNumScanlines) - { - CycleAdvance(); - } - //Console.WriteLine("{0}", _tia.CurrentScanLine); + } + private void FinishFrame() + { _tia.CompleteAudioFrame(); if (_islag) @@ -367,7 +365,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 _tia.LineCount = 0; } - public void CycleAdvance() + private void Cycle() { _tia.Execute(1); _tia.Execute(1); @@ -383,6 +381,29 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 _mapper.ClockCpu(); } + public void FrameAdvance(bool render, bool rendersound) + { + StartNewFrame(); + + while (_tia.LineCount < _tia.NominalNumScanlines) + { + Cycle(); + } + + FinishFrame(); + } + + public void CycleAdvance() + { + Cycle(); + + if (_tia.LineCount >= _tia.NominalNumScanlines) + { + FinishFrame(); + StartNewFrame(); + } + } + public void ScanlineAdvance() { var currLineCount = _tia.LineCount; @@ -390,6 +411,12 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 { CycleAdvance(); } + + if (_tia.LineCount >= _tia.NominalNumScanlines) + { + FinishFrame(); + StartNewFrame(); + } } public byte ReadControls1(bool peek) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.cs index 4c64afb340..54cfa6913b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.cs @@ -145,7 +145,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 public int CurrentScanLine { - get { return _tia.CurrentScanLine; } + get { return _tia.LineCount; } } public bool IsVsync