Ignore:
Timestamp:
Apr 21, 2026, 11:04:26 AM (6 days ago)
Author:
chronos
Message:
  • Added: Implemented breakpoints and run to cursor action.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Forms/FormDisassembler.pas

    r11 r12  
    55uses
    66  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls,
    7   ExtCtrls, Menus, Disassembler;
     7  ExtCtrls, Menus, Disassembler, Z80;
    88
    99type
    10   TChangePCEvent = procedure (Address: Word) of object;
     10  TAddressEvent = procedure (Address: Word) of object;
    1111
    1212  { TFormDisassembler }
     
    1414  TFormDisassembler = class(TForm)
    1515    ListView1: TListView;
     16    MenuItemRemoveBreakPoint: TMenuItem;
     17    MenuItemAddBreakPoint: TMenuItem;
    1618    MenuItemSetAddress: TMenuItem;
    1719    PopupMenu1: TPopupMenu;
     
    2123    procedure FormShow(Sender: TObject);
    2224    procedure ListView1Data(Sender: TObject; Item: TListItem);
     25    procedure MenuItemAddBreakPointClick(Sender: TObject);
     26    procedure MenuItemRemoveBreakPointClick(Sender: TObject);
    2327    procedure MenuItemSetAddressClick(Sender: TObject);
     28    procedure PopupMenu1Popup(Sender: TObject);
    2429  private
    25     FOnChangePC: TChangePCEvent;
     30    FOnAddBreakPoint: TAddressEvent;
     31    FOnChangePC: TAddressEvent;
    2632    procedure DoChangePC(Address: Word);
     33    procedure DoAddBreakPoint(Address: Word);
    2734  public
     35    Cpu: TCpuZ80;
    2836    Disassembler: TDisassembler;
    2937    procedure Disassemble(Sender: TObject);
    3038    procedure SelectAddress(Address: Word);
    3139    procedure ReloadList;
    32     property OnChangePC: TChangePCEvent read FOnChangePC write FOnChangePC;
     40    function GetCurrentAddress: Word;
     41    property OnChangePC: TAddressEvent read FOnChangePC write FOnChangePC;
     42    property OnAddBreakPoint: TAddressEvent read FOnAddBreakPoint write FOnAddBreakPoint;
    3343  end;
    3444
     
    6474
    6575procedure TFormDisassembler.ListView1Data(Sender: TObject; Item: TListItem);
     76var
     77  BreakPoint: string;
    6678begin
    6779  if Item.Index < Disassembler.DecodedInstructions.Count then
    6880  with TDecodedInstruction(Disassembler.DecodedInstructions[Item.Index]) do begin
    69     Item.Caption := IntToHex(Address, 4);
     81    if Cpu.BreakPoints.Contains(Address) then BreakPoint := ' @'
     82      else BreakPoint := '';
     83    Item.Caption := IntToHex(Address, 4) + BreakPoint;
    7084    Item.Data := Disassembler.DecodedInstructions[Item.Index];
    7185    Item.SubItems.Add(GetOpcodesText);
     
    7690end;
    7791
     92procedure TFormDisassembler.MenuItemAddBreakPointClick(Sender: TObject);
     93begin
     94  if Assigned(ListView1.Selected) then begin
     95    Cpu.BreakPoints.Add(TDecodedInstruction(ListView1.Selected.Data).Address);
     96    ReloadList;
     97  end;
     98end;
     99
     100procedure TFormDisassembler.MenuItemRemoveBreakPointClick(Sender: TObject);
     101begin
     102  if Assigned(ListView1.Selected) then begin
     103    Cpu.BreakPoints.Remove(TDecodedInstruction(ListView1.Selected.Data).Address);
     104    ReloadList;
     105  end;
     106end;
     107
    78108procedure TFormDisassembler.MenuItemSetAddressClick(Sender: TObject);
    79109begin
     
    81111    DoChangePC(TDecodedInstruction(ListView1.Selected.Data).Address);
    82112    SelectAddress(TDecodedInstruction(ListView1.Selected.Data).Address);
     113  end;
     114end;
     115
     116procedure TFormDisassembler.PopupMenu1Popup(Sender: TObject);
     117begin
     118
     119  MenuItemSetAddress.Enabled := Assigned(ListView1.Selected);
     120  if Assigned(ListView1.Selected) then begin
     121    MenuItemRemoveBreakPoint.Enabled := Pos('@', ListView1.Selected.Caption) > 0;
     122    MenuItemAddBreakPoint.Enabled := not MenuItemRemoveBreakPoint.Enabled;
     123  end else begin
     124    MenuItemRemoveBreakPoint.Enabled := False;
     125    MenuItemAddBreakPoint.Enabled := False;
    83126  end;
    84127end;
     
    93136begin
    94137  if Assigned(FOnChangePC) then FOnChangePC(Address);
     138end;
     139
     140procedure TFormDisassembler.DoAddBreakPoint(Address: Word);
     141begin
     142  if Assigned(FOnAddBreakPoint) then FOnAddBreakPoint(Address);
    95143end;
    96144
     
    124172end;
    125173
     174function TFormDisassembler.GetCurrentAddress: Word;
     175begin
     176  if Assigned(ListView1.Selected) then
     177    Result := TDecodedInstruction(ListView1.Selected.Data).Address
     178    else Result := 0;
     179end;
     180
    126181end.
    127182
Note: See TracChangeset for help on using the changeset viewer.