Changeset 15


Ignore:
Timestamp:
Apr 21, 2026, 6:15:40 PM (5 days ago)
Author:
chronos
Message:
  • Modified: Faster instruction stepping.
Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Core.lfm

    r13 r15  
    113113  end
    114114  object TimerUpdate: TTimer
    115     Interval = 500
     115    Interval = 50
    116116    OnTimer = TimerUpdateTimer
    117117    Left = 328
  • trunk/Core.pas

    r14 r15  
    5454    procedure TimerUpdateTimer(Sender: TObject);
    5555  private
    56     LastPc: Word;
     56    FUpdateInterfacePending: Boolean;
    5757    procedure DoChangePC(Address: Word);
    5858    procedure DebuggerChange(Sender: TObject);
     
    6868    Debugger: TDebugger;
    6969    Disassembler: TDisassembler;
    70     procedure UpdateDisassemblerPos;
    7170    procedure UpdateInterface;
    7271  end;
     
    242241procedure TCore.DataModuleCreate(Sender: TObject);
    243242begin
    244   LastPc := $ffff;
    245243  SharpMz800 := TSharpMz800.Create;
    246244  Disassembler := TDisassembler.Create;
     
    250248  Debugger.OnChange := DebuggerChange;
    251249  Debugger.Disassembler := Disassembler;
     250  UpdateInterface;
    252251  FormMain := TFormMain.Create(nil);
    253252  FormMain.Show;
     
    271270procedure TCore.TimerUpdateTimer(Sender: TObject);
    272271begin
    273   UpdateDisassemblerPos;
    274   UpdateInterface;
     272  if FUpdateInterfacePending then begin
     273    FUpdateInterfacePending := False;
     274    UpdateInterface;
     275  end;
    275276end;
    276277
     
    283284begin
    284285  if Assigned(FormCallStack) then FormCallStack.Reload;
    285 end;
    286 
    287 procedure TCore.UpdateDisassemblerPos;
    288 begin
    289   if LastPc <> SharpMz800.Cpu.Pc then begin
    290     if Assigned(FormDisassembler) then
    291       FormDisassembler.SelectAddress(SharpMz800.Cpu.PC);
    292     LastPc := SharpMz800.Cpu.Pc;
    293   end;
     286  if Assigned(FormCpu) then FormCpu.Reload;
     287  FUpdateInterfacePending := True;
    294288end;
    295289
  • trunk/Debugger.pas

    r14 r15  
    4949    FDisassembler: TDisassembler;
    5050    FOnChange: TNotifyEvent;
     51    procedure Pause;
    5152    procedure SetCpu(AValue: TCpuZ80);
    5253    procedure CpuCall(Address: Word);
     
    109110end;
    110111
     112procedure TDebugger.Pause;
     113begin
     114  DebugMode := dmNone;
     115  Cpu.Paused := True;
     116  DoOnChange;
     117end;
     118
    111119procedure TDebugger.CpuStep;
    112120begin
    113121  if DebugMode <> dmNone then begin
    114122    if DebugMode = dmStepIn then begin
    115       DebugMode := dmNone;
    116       Cpu.Paused := True;
     123      Pause;
    117124    end;
    118125    if (DebugMode = dmStopAddress) and (DebugStopAddress = Cpu.PC) then begin
    119       DebugMode := dmNone;
    120       Cpu.Paused := True;
     126      Pause;
    121127    end;
    122128    if DebugMode = dmStepOver then begin
    123       DebugMode := dmNone;
    124       Cpu.Paused := True;
     129      Pause;
    125130    end;
    126131  end;
    127132  if BreakPoints.Contains(Cpu.PC) then begin
    128     DebugMode := dmNone;
    129     Cpu.Paused := True;
    130   end;
     133    Pause;
     134  end;
     135  DoOnChange;
    131136end;
    132137
  • trunk/Forms/FormCallStack.lfm

    r13 r15  
    4141  end
    4242  object Timer1: TTimer
    43     Interval = 100
     43    Interval = 50
    4444    OnTimer = Timer1Timer
    4545    Left = 91
  • trunk/Forms/FormCpu.lfm

    r13 r15  
    99  DesignTimePPI = 144
    1010  LCLVersion = '4.6.0.0'
     11  OnCreate = FormCreate
     12  OnShow = FormShow
    1113  object GroupBox1: TGroupBox
    1214    Left = 8
     
    3335    end
    3436  end
    35   object TimerUpdate: TTimer
    36     Interval = 200
    37     OnTimer = TimerUpdateTimer
    38     Left = 324
    39     Top = 147
     37  object Timer1: TTimer
     38    Interval = 50
     39    OnTimer = Timer1Timer
     40    Left = 134
     41    Top = 214
    4042  end
    4143end
  • trunk/Forms/FormCpu.pas

    r11 r15  
    1313  TFormCpu = class(TForm)
    1414    GroupBox1: TGroupBox;
    15     TimerUpdate: TTimer;
     15    Timer1: TTimer;
    1616    ValueListEditor1: TValueListEditor;
    17     procedure TimerUpdateTimer(Sender: TObject);
     17    procedure FormCreate(Sender: TObject);
     18    procedure FormShow(Sender: TObject);
     19    procedure Timer1Timer(Sender: TObject);
     20  private
     21    FReloadPending: Boolean;
    1822  public
    1923    Cpu: TCpuZ80;
     24    procedure Reload;
    2025  end;
    2126
     
    2732{ TFormCpu }
    2833
    29 procedure TFormCpu.TimerUpdateTimer(Sender: TObject);
     34procedure TFormCpu.Timer1Timer(Sender: TObject);
    3035begin
    31   ValueListEditor1.Values['AF'] := IntToHex(Cpu.AF.Value, 4);
    32   ValueListEditor1.Values['BC'] := IntToHex(Cpu.BC.Value, 4);
    33   ValueListEditor1.Values['DE'] := IntToHex(Cpu.DE.Value, 4);
    34   ValueListEditor1.Values['HL'] := IntToHex(Cpu.HL.Value, 4);
    35   ValueListEditor1.Values['PC'] := IntToHex(Cpu.PC, 4);
    36   ValueListEditor1.Values['SP'] := IntToHex(Cpu.SP, 4);
    37   ValueListEditor1.Values['IX'] := IntToHex(Cpu.IX, 4);
    38   ValueListEditor1.Values['IY'] := IntToHex(Cpu.IY, 4);
    39   ValueListEditor1.Values['R'] := IntToHex(Cpu.RegR, 2);
    40   ValueListEditor1.Values['I'] := IntToHex(Cpu.RegI, 2);
    41   ValueListEditor1.Values['IM'] := IntToStr(Cpu.InterruptMode);
    42   ValueListEditor1.Values['EI'] := IntToStr(Byte(Cpu.InterruptEnabled));
    43   ValueListEditor1.Values['Cycles'] := IntToStr(Cpu.Cycles);
    44   ValueListEditor1.Values['Ticks'] := IntToStr(Cpu.Ticks);
     36  if FReloadPending then begin
     37    FReloadPending := False;
     38    ValueListEditor1.Values['AF'] := IntToHex(Cpu.AF.Value, 4);
     39    ValueListEditor1.Values['BC'] := IntToHex(Cpu.BC.Value, 4);
     40    ValueListEditor1.Values['DE'] := IntToHex(Cpu.DE.Value, 4);
     41    ValueListEditor1.Values['HL'] := IntToHex(Cpu.HL.Value, 4);
     42    ValueListEditor1.Values['PC'] := IntToHex(Cpu.PC, 4);
     43    ValueListEditor1.Values['SP'] := IntToHex(Cpu.SP, 4);
     44    ValueListEditor1.Values['IX'] := IntToHex(Cpu.IX, 4);
     45    ValueListEditor1.Values['IY'] := IntToHex(Cpu.IY, 4);
     46    ValueListEditor1.Values['R'] := IntToHex(Cpu.RegR, 2);
     47    ValueListEditor1.Values['I'] := IntToHex(Cpu.RegI, 2);
     48    ValueListEditor1.Values['IM'] := IntToStr(Cpu.InterruptMode);
     49    ValueListEditor1.Values['EI'] := IntToStr(Byte(Cpu.InterruptEnabled));
     50    ValueListEditor1.Values['Cycles'] := IntToStr(Cpu.Cycles);
     51    ValueListEditor1.Values['Ticks'] := IntToStr(Cpu.Ticks);
     52  end;
     53end;
     54
     55procedure TFormCpu.FormCreate(Sender: TObject);
     56begin
     57  end;
     58
     59procedure TFormCpu.FormShow(Sender: TObject);
     60begin
     61  Reload;
     62end;
     63
     64procedure TFormCpu.Reload;
     65begin
     66  FReloadPending := True;
    4567end;
    4668
  • trunk/Forms/FormDisassembler.lfm

    r13 r15  
    6666  end
    6767  object Timer1: TTimer
    68     Interval = 100
     68    Interval = 50
    6969    OnTimer = Timer1Timer
    7070    Left = 568
  • trunk/Forms/FormDisassembler.pas

    r13 r15  
    3131    FOnAddBreakPoint: TAddressEvent;
    3232    FOnChangePC: TAddressEvent;
     33    FLastPC: Word;
    3334    procedure DoChangePC(Address: Word);
    3435    procedure DoAddBreakPoint(Address: Word);
     36    procedure UpdateDisassemblerPos;
    3537  public
    3638    Debugger: TDebugger;
     
    5557{ TFormDisassembler }
    5658
     59procedure TFormDisassembler.UpdateDisassemblerPos;
     60begin
     61  if FLastPc <> Debugger.Cpu.Pc then begin
     62    SelectAddress(Debugger.Cpu.PC);
     63    FLastPc := Debugger.Cpu.Pc;
     64  end;
     65end;
     66
    5767procedure TFormDisassembler.FormClose(Sender: TObject;
    5868  var CloseAction: TCloseAction);
     
    6272procedure TFormDisassembler.FormCreate(Sender: TObject);
    6373begin
     74  FLastPC := $ffff;
    6475end;
    6576
     
    128139procedure TFormDisassembler.Timer1Timer(Sender: TObject);
    129140begin
     141  UpdateDisassemblerPos;
    130142  if FReloadPending then begin
    131143    FReloadPending := False;
  • trunk/Forms/FormMemory.lfm

    r13 r15  
    5959  end
    6060  object Timer1: TTimer
    61     Interval = 100
     61    Interval = 50
    6262    OnTimer = Timer1Timer
    6363    Left = 469
  • trunk/Forms/FormMemory.pas

    r13 r15  
    55uses
    66  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, ExtCtrls,
    7   StdCtrls, MemoryTypes, Generics.Collections;
     7  StdCtrls, MemoryTypes, Generics.Collections, Math;
    88
    99type
     
    3131    procedure ReloadAreas;
    3232    procedure Reload;
     33    procedure ReloadList;
    3334  end;
    3435
     
    4647procedure TFormMemory.Reload;
    4748begin
    48   ListViewMemory.Items.Count := FSize div ItemsPerLine;
     49  FReloadPending := True;
     50end;
     51
     52procedure TFormMemory.ReloadList;
     53begin
     54  ListViewMemory.Items.Count := Ceil(FSize / ItemsPerLine);
    4955  ListViewMemory.Refresh;
    5056end;
     
    5662  Text: string;
    5763  One: Byte;
     64  Count: Byte;
     65  Address: Word;
    5866begin
    59   if Item.Index < FSize div ItemsPerLine then begin
     67  Address := Item.Index * ItemsPerLine;
     68  if Address < FSize then begin
     69    Count := ItemsPerLine;
     70    if (Address + Count) >= FSize then
     71      Count := FSize - Address;
    6072    Line := '';
    6173    Text := '';
    62     for I := 0 to ItemsPerLine - 1 do begin
    63       One := FMemory.Read(Item.Index * ItemsPerLine + I);
     74    for I := 0 to Count - 1 do begin
     75      One := FMemory.Read(Address + I);
    6476      Line := Line + IntToHex(One, 2) + ' ';
    6577      if One >= 32 then Text := Text + Char(One)
    6678        else Text := Text + ' ';
    6779    end;
    68     Item.Caption := IntToHex(Item.Index * ItemsPerLine, 8);
     80    Item.Caption := IntToHex(Address, 8);
    6981    Item.SubItems.Add(Line);
    7082    Item.SubItems.Add(Text);
     
    7688  ReloadAreas;
    7789  ComboBoxAreaSelect(nil);
    78   FReloadPending := True;
     90  Reload;
    7991end;
    8092
     
    105117  if FReloadPending then begin
    106118    FReloadPending := False;
    107     Reload;
     119    ReloadList;
    108120  end;
    109121end;
  • trunk/Forms/FormMessages.lfm

    r13 r15  
    2323  end
    2424  object Timer1: TTimer
    25     Interval = 100
     25    Interval = 50
    2626    OnTimer = Timer1Timer
    2727    Left = 357
Note: See TracChangeset for help on using the changeset viewer.