Changeset 13 for trunk/Forms


Ignore:
Timestamp:
Apr 21, 2026, 2:55:51 PM (3 weeks ago)
Author:
chronos
Message:
  • Added: Call stack window.
  • Modified: Use reload pending boolean variable and reload from timer instead of Thread.Synchronize to not delay CPU execution.
Location:
trunk/Forms
Files:
2 added
1 deleted
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Forms/FormCpu.lfm

    r11 r13  
    11object FormCpu: TFormCpu
    22  Left = 834
    3   Height = 657
     3  Height = 610
    44  Top = 501
    5   Width = 274
     5  Width = 302
    66  Caption = 'CPU'
    7   ClientHeight = 657
    8   ClientWidth = 274
     7  ClientHeight = 610
     8  ClientWidth = 302
    99  DesignTimePPI = 144
    1010  LCLVersion = '4.6.0.0'
    1111  object GroupBox1: TGroupBox
    12     Left = 22
     12    Left = 8
    1313    Height = 546
    1414    Top = 22
    15     Width = 230
     15    Width = 256
    1616    Caption = 'Registers'
    1717    ClientHeight = 519
    18     ClientWidth = 228
     18    ClientWidth = 254
    1919    TabOrder = 0
    2020    object ValueListEditor1: TValueListEditor
     
    2222      Height = 499
    2323      Top = 5
    24       Width = 192
     24      Width = 218
    2525      Anchors = [akTop, akLeft, akRight, akBottom]
     26      DefaultColWidth = 100
    2627      RowCount = 2
    2728      TabOrder = 0
    2829      ColWidths = (
    29         96
    30         94
     30        100
     31        116
    3132      )
    3233    end
  • trunk/Forms/FormDisassembler.lfm

    r12 r13  
    6565    end
    6666  end
     67  object Timer1: TTimer
     68    Interval = 100
     69    OnTimer = Timer1Timer
     70    Left = 568
     71    Top = 352
     72  end
    6773end
  • trunk/Forms/FormDisassembler.pas

    r12 r13  
    55uses
    66  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls,
    7   ExtCtrls, Menus, Disassembler, Z80;
     7  ExtCtrls, Menus, Disassembler, Base, Debugger;
    88
    99type
    10   TAddressEvent = procedure (Address: Word) of object;
    11 
    1210  { TFormDisassembler }
    1311
     
    1816    MenuItemSetAddress: TMenuItem;
    1917    PopupMenu1: TPopupMenu;
     18    Timer1: TTimer;
    2019    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    2120    procedure FormCreate(Sender: TObject);
     
    2726    procedure MenuItemSetAddressClick(Sender: TObject);
    2827    procedure PopupMenu1Popup(Sender: TObject);
     28    procedure Timer1Timer(Sender: TObject);
    2929  private
     30    FReloadPending: Boolean;
    3031    FOnAddBreakPoint: TAddressEvent;
    3132    FOnChangePC: TAddressEvent;
     
    3334    procedure DoAddBreakPoint(Address: Word);
    3435  public
    35     Cpu: TCpuZ80;
     36    Debugger: TDebugger;
    3637    Disassembler: TDisassembler;
    3738    procedure Disassemble(Sender: TObject);
    3839    procedure SelectAddress(Address: Word);
    3940    procedure ReloadList;
     41    procedure Reload;
    4042    function GetCurrentAddress: Word;
    4143    property OnChangePC: TAddressEvent read FOnChangePC write FOnChangePC;
     
    6062procedure TFormDisassembler.FormCreate(Sender: TObject);
    6163begin
    62   Disassembler := TDisassembler.Create;
    6364end;
    6465
    6566procedure TFormDisassembler.FormDestroy(Sender: TObject);
    6667begin
    67   FreeAndNil(Disassembler);
    6868end;
    6969
    7070procedure TFormDisassembler.FormShow(Sender: TObject);
    7171begin
    72   Disassemble(nil);
     72  Reload;
    7373end;
    7474
     
    7979  if Item.Index < Disassembler.DecodedInstructions.Count then
    8080  with TDecodedInstruction(Disassembler.DecodedInstructions[Item.Index]) do begin
    81     if Cpu.BreakPoints.Contains(Address) then BreakPoint := ' @'
     81    if Debugger.BreakPoints.Contains(Address) then BreakPoint := ' @'
    8282      else BreakPoint := '';
    8383    Item.Caption := IntToHex(Address, 4) + BreakPoint;
     
    9393begin
    9494  if Assigned(ListView1.Selected) then begin
    95     Cpu.BreakPoints.Add(TDecodedInstruction(ListView1.Selected.Data).Address);
     95    Debugger.BreakPoints.Add(TDecodedInstruction(ListView1.Selected.Data).Address);
    9696    ReloadList;
    9797  end;
     
    101101begin
    102102  if Assigned(ListView1.Selected) then begin
    103     Cpu.BreakPoints.Remove(TDecodedInstruction(ListView1.Selected.Data).Address);
     103    Debugger.BreakPoints.Remove(TDecodedInstruction(ListView1.Selected.Data).Address);
    104104    ReloadList;
    105105  end;
     
    116116procedure TFormDisassembler.PopupMenu1Popup(Sender: TObject);
    117117begin
    118 
    119118  MenuItemSetAddress.Enabled := Assigned(ListView1.Selected);
    120119  if Assigned(ListView1.Selected) then begin
     
    127126end;
    128127
     128procedure TFormDisassembler.Timer1Timer(Sender: TObject);
     129begin
     130  if FReloadPending then begin
     131    FReloadPending := False;
     132    Disassembler.Disassemble;
     133    ReloadList;
     134  end;
     135end;
     136
    129137procedure TFormDisassembler.Disassemble(Sender: TObject);
    130138begin
    131   Disassembler.Disassemble;
    132   ReloadList;
     139  Reload;
    133140end;
    134141
     
    146153var
    147154  Item: TListItem;
    148   DecodedInstruction: TDecodedInstruction;
    149155  Index: Integer;
    150156begin
    151157  Index := Disassembler.DecodedInstructions.SearchAddressIndex(Address);
    152158  if Index >= 0 then begin
    153     DecodedInstruction := Disassembler.DecodedInstructions[Index];
    154159    Item := ListView1.Items[Index];
    155160    if Assigned(Item) then begin
     
    172177end;
    173178
     179procedure TFormDisassembler.Reload;
     180begin
     181  FReloadPending := True;
     182end;
     183
    174184function TFormDisassembler.GetCurrentAddress: Word;
    175185begin
  • trunk/Forms/FormMain.lfm

    r6 r13  
    6565      TabOrder = 0
    6666    end
     67    object PanelCallStack: TPanel
     68      Left = 0
     69      Height = 280
     70      Top = 272
     71      Width = 559
     72      Align = alBottom
     73      BevelOuter = bvNone
     74      TabOrder = 1
     75    end
    6776  end
    6877  object MainMenu1: TMainMenu
     
    94103      object MenuItem15: TMenuItem
    95104        Action = Core.AViewScreen
     105      end
     106      object MenuItem16: TMenuItem
     107        Action = Core.AViewCallStack
     108      end
     109      object MenuItem17: TMenuItem
     110        Action = Core.AViewMessages
    96111      end
    97112    end
  • trunk/Forms/FormMain.pas

    r6 r13  
    1313    MainMenu1: TMainMenu;
    1414    MenuItem1: TMenuItem;
     15    MenuItem16: TMenuItem;
     16    MenuItem17: TMenuItem;
    1517    MenuItem2: TMenuItem;
    1618    MenuItem5: TMenuItem;
    1719    MenuItemTools: TMenuItem;
     20    PanelCallStack: TPanel;
    1821    Separator1: TMenuItem;
    1922    MenuItemFile: TMenuItem;
     
    7477  Core.Core.AViewScreen.Execute;
    7578  Core.Core.AViewDissssembler.Execute;
     79  Core.Core.AViewCallStack.Execute;
    7680  DockForm(Core.Core.FormScreen, PanelCenter);
    7781  DockForm(Core.Core.FormCpu, PanelRight);
    7882  DockForm(Core.Core.FormDisassembler, PanelLeft);
    7983  DockForm(Core.Core.FormMessages, PanelBottom);
     84  DockForm(Core.Core.FormCallStack, PanelCallStack);
    8085end;
    8186
  • trunk/Forms/FormMemory.lfm

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

    r5 r13  
    55uses
    66  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, ExtCtrls,
    7   StdCtrls, Memory, Generics.Collections;
     7  StdCtrls, MemoryTypes, Generics.Collections;
    88
    99type
     
    2424    procedure Timer1Timer(Sender: TObject);
    2525  private
    26     Memory: TMemory;
    27     Size: Integer;
     26    FReloadPending: Boolean;
     27    FMemory: TMemory;
     28    FSize: Integer;
    2829  public
    2930    Areas: TObjectList<TMemory>;
     
    4546procedure TFormMemory.Reload;
    4647begin
    47   ListViewMemory.Items.Count := Size div ItemsPerLine;
     48  ListViewMemory.Items.Count := FSize div ItemsPerLine;
    4849  ListViewMemory.Refresh;
    4950end;
     
    5657  One: Byte;
    5758begin
    58   if Item.Index < Size div ItemsPerLine then begin
     59  if Item.Index < FSize div ItemsPerLine then begin
    5960    Line := '';
    6061    Text := '';
    6162    for I := 0 to ItemsPerLine - 1 do begin
    62       One := Memory.Read(Item.Index * ItemsPerLine + I);
     63      One := FMemory.Read(Item.Index * ItemsPerLine + I);
    6364      Line := Line + IntToHex(One, 2) + ' ';
    6465      if One >= 32 then Text := Text + Char(One)
     
    7576  ReloadAreas;
    7677  ComboBoxAreaSelect(nil);
     78  FReloadPending := True;
    7779end;
    7880
     
    8587begin
    8688  if ComboBoxArea.ItemIndex >= 0 then begin
    87     Memory := TMemory(ComboBoxArea.Items.Objects[ComboBoxArea.ItemIndex]);
    88     Size := Memory.Size;
     89    FMemory := TMemory(ComboBoxArea.Items.Objects[ComboBoxArea.ItemIndex]);
     90    FSize := FMemory.Size;
    8991  end else begin
    90     Memory := nil;
    91     Size := 0;
     92    FMemory := nil;
     93    FSize := 0;
    9294  end;
    9395  Reload;
     
    101103procedure TFormMemory.Timer1Timer(Sender: TObject);
    102104begin
    103   if Visible then Reload;
     105  if FReloadPending then begin
     106    FReloadPending := False;
     107    Reload;
     108  end;
    104109end;
    105110
  • trunk/Forms/FormMessages.lfm

    r5 r13  
    99  DesignTimePPI = 144
    1010  LCLVersion = '4.6.0.0'
     11  OnCreate = FormCreate
     12  OnDestroy = FormDestroy
    1113  object Memo1: TMemo
    1214    Left = 8
     
    2022    TabOrder = 0
    2123  end
     24  object Timer1: TTimer
     25    Interval = 100
     26    OnTimer = Timer1Timer
     27    Left = 357
     28    Top = 284
     29  end
    2230end
  • trunk/Forms/FormMessages.pas

    r5 r13  
    44
    55uses
    6   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
     6  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
     7  Generics.Collections;
    78
    89type
     10  TMessage = class
     11    Text: string;
     12  end;
     13
     14  { TMessages }
     15
     16  TMessages = class(TObjectList<TMessage>)
     17    function AddNew(Text: string): TMessage;
     18  end;
    919
    1020  { TFormMessages }
     
    1222  TFormMessages = class(TForm)
    1323    Memo1: TMemo;
     24    Timer1: TTimer;
     25    procedure FormCreate(Sender: TObject);
     26    procedure FormDestroy(Sender: TObject);
     27    procedure Timer1Timer(Sender: TObject);
    1428  private
    15 
     29    FMessages: TMessages;
     30    FReloadPending: Boolean;
    1631  public
    1732    procedure AddMessage(Text: string);
     
    2338{$R *.lfm}
    2439
     40{ TMessages }
     41
     42function TMessages.AddNew(Text: string): TMessage;
     43begin
     44  Result := TMessage.Create;
     45  Result.Text := Text;
     46  Add(Result);
     47end;
     48
    2549{ TFormMessages }
     50
     51procedure TFormMessages.Timer1Timer(Sender: TObject);
     52var
     53  I: Integer;
     54begin
     55  if FReloadPending then begin
     56    FReloadPending := False;
     57    Memo1.Lines.BeginUpdate;
     58    Memo1.Lines.Clear;
     59    for I := 0 to FMessages.Count - 1 do
     60      Memo1.Lines.Add(FMessages[I].Text);
     61    Memo1.Lines.EndUpdate;
     62  end;
     63end;
     64
     65procedure TFormMessages.FormCreate(Sender: TObject);
     66begin
     67  FMessages := TMessages.Create;
     68end;
     69
     70procedure TFormMessages.FormDestroy(Sender: TObject);
     71begin
     72  FreeAndNil(FMessages);
     73end;
    2674
    2775procedure TFormMessages.AddMessage(Text: string);
    2876begin
    29   Memo1.Lines.Add(Text);
     77  FMessages.AddNew(Text);
     78  FReloadPending := True;
    3079end;
    3180
Note: See TracChangeset for help on using the changeset viewer.