Changeset 13


Ignore:
Timestamp:
Apr 21, 2026, 2:55:51 PM (6 days 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
Files:
5 added
2 deleted
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/Core.lfm

    r12 r13  
    102102      OnExecute = AInstructionSetGenExecute
    103103    end
     104    object AViewCallStack: TAction
     105      Category = 'View'
     106      Caption = 'Call stack'
     107      OnExecute = AViewCallStackExecute
     108    end
    104109  end
    105110  object ImageList1: TImageList
  • trunk/Core.pas

    r12 r13  
    55uses
    66  Classes, SysUtils, ActnList, Controls, FormMain, Forms, ExtCtrls, FormMemory,
    7   SharpMz800, FormDisassembler, FormCpu, FormScreen, FormMessages;
     7  SharpMz800, FormDisassembler, FormCpu, FormScreen, FormMessages, FormCallStack,
     8  Debugger, Disassembler;
    89
    910type
     
    1213
    1314  TCore = class(TDataModule)
     15    AViewCallStack: TAction;
    1416    AInstructionSetGen: TAction;
    1517    AViewMessages: TAction;
     
    4244    procedure AStepOverExecute(Sender: TObject);
    4345    procedure AStopExecute(Sender: TObject);
     46    procedure AViewCallStackExecute(Sender: TObject);
    4447    procedure AViewCpuExecute(Sender: TObject);
    4548    procedure AViewDissssemblerExecute(Sender: TObject);
     
    5356    LastPc: Word;
    5457    procedure DoChangePC(Address: Word);
     58    procedure DebuggerChange(Sender: TObject);
    5559  public
    5660    FormMain: TFormMain;
     
    6064    FormScreen: TFormScreen;
    6165    FormMessages: TFormMessages;
     66    FormCallStack: TFormCallStack;
    6267    SharpMz800: TSharpMz800;
     68    Debugger: TDebugger;
     69    Disassembler: TDisassembler;
    6370    procedure UpdateDisassemblerPos;
    6471    procedure UpdateInterface;
     
    8289  LastPc := $ffff;
    8390  SharpMz800 := TSharpMz800.Create;
     91  Disassembler := TDisassembler.Create;
     92  Disassembler.Memory := SharpMz800.MappedMemory;
     93  Debugger := TDebugger.Create;
     94  Debugger.Cpu := SharpMz800.Cpu;
     95  Debugger.OnChange := DebuggerChange;
     96  Debugger.Disassembler := Disassembler;
    8497//  SharpMz800.PowerOn;
    8598  FormMain := TFormMain.Create(nil);
     
    142155procedure TCore.ARunToCursorExecute(Sender: TObject);
    143156begin
    144   SharpMz800.Cpu.DebugMode := dmStopAddress;
    145   SharpMz800.Cpu.DebugStopAddress := FormDisassembler.GetCurrentAddress;
    146   SharpMz800.Cpu.Running := True;
     157  Debugger.DebugMode := dmStopAddress;
     158  Debugger.DebugStopAddress := FormDisassembler.GetCurrentAddress;
     159  Debugger.Cpu.Running := True;
    147160  UpdateInterface;
    148161end;
     
    150163procedure TCore.AStepInExecute(Sender: TObject);
    151164begin
    152   SharpMz800.Cpu.DebugMode := dmStepIn;
    153   SharpMz800.Cpu.Running := True;
     165  Debugger.DebugMode := dmStepIn;
     166  Debugger.Cpu.Running := True;
    154167  UpdateInterface;
    155168end;
     
    157170procedure TCore.AStepOutExecute(Sender: TObject);
    158171begin
    159   SharpMz800.Cpu.DebugMode := dmStepOut;
    160   SharpMz800.Cpu.Running := True;
     172  Debugger.DebugMode := dmStepOut;
     173  Debugger.Cpu.Running := True;
    161174  UpdateInterface;
    162175end;
     
    164177procedure TCore.AStepOverExecute(Sender: TObject);
    165178begin
    166   SharpMz800.Cpu.DebugMode := dmStepOver;
    167   SharpMz800.Cpu.Running := True;
     179  Debugger.DebugMode := dmStepOver;
     180  Debugger.Cpu.Running := True;
    168181  UpdateInterface;
    169182end;
     
    174187  SharpMz800.Cpu.Reset;
    175188  UpdateInterface;
     189end;
     190
     191procedure TCore.AViewCallStackExecute(Sender: TObject);
     192begin
     193  if not Assigned(FormCallStack) then begin
     194    FormCallStack := TFormCallStack.Create(nil);
     195    FormCallStack.Debugger := Debugger;
     196  end;
     197  FormCallStack.Show;
    176198end;
    177199
     
    189211  if not Assigned(FormDisassembler) then begin
    190212    FormDisassembler := TFormDisassembler.Create(nil);
    191     FormDisassembler.Disassembler.Memory := SharpMz800.MappedMemory;
    192213    FormDisassembler.OnChangePC := DoChangePC;
    193     FormDisassembler.Cpu := SharpMz800.Cpu;
     214    FormDisassembler.Debugger := Debugger;
     215    FormDisassembler.Disassembler := Disassembler;
    194216    SharpMz800.OnMemoryMappingChange := FormDisassembler.Disassemble;
    195217  end;
     
    236258  if Assigned(FormScreen) then FreeAndNil(FormScreen);
    237259  if Assigned(FormMessages) then FreeAndNil(FormMessages);
     260  if Assigned(FormCallStack) then FreeAndNil(FormCallStack);
    238261  FreeAndNil(FormMain);
     262  FreeAndNil(Debugger);
     263  FreeAndNil(Disassembler);
    239264  FreeAndNil(SharpMz800);
    240265end;
     
    249274begin
    250275  SharpMz800.Cpu.PC := Address;
     276end;
     277
     278procedure TCore.DebuggerChange(Sender: TObject);
     279begin
     280  if Assigned(FormCallStack) then FormCallStack.Reload;
    251281end;
    252282
  • trunk/Disassembler.pas

    r12 r13  
    44
    55uses
    6   Classes, SysUtils, Z80Instructions, Z80InstructionInfo, StrUtils, Memory,
     6  Classes, SysUtils, Z80Instructions, Z80InstructionInfo, StrUtils, MemoryTypes,
    77  Generics.Collections;
    88
  • 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
  • trunk/SharpMz800.pas

    r8 r13  
    44
    55uses
    6   Classes, SysUtils, Z80, Memory, Base, I8255, I8253;
     6  Classes, SysUtils, Z80, MemoryTypes, Base, I8255, I8253;
    77
    88type
     
    118118  MappedMemory.Areas.AddNew($0, Memory);
    119119  if Assigned(Cpu) then
    120     TThread.Synchronize(Cpu.Thread, DoMemoryMappingChange);
     120    DoMemoryMappingChange;
    121121end;
    122122
  • trunk/Z80/Z80.pas

    r12 r13  
    44
    55uses
    6   Classes, SysUtils, Memory, Base, Z80Instructions, Generics.Collections,
     6  Classes, SysUtils, MemoryTypes, Base, Z80Instructions, Generics.Collections,
    77  Generics.Defaults;
    88
     
    4141  end;
    4242
    43   TDebugMode = (dmNone, dmStepIn, dmStepOut, dmStepOver, dmStopAddress);
    44 
    45   { TBreakPoints }
    46 
    47   TBreakPoints = class(TList<Word>)
    48   private
    49     function Comparer(constref Left, Right: Word): Integer;
    50   public
    51     function Contains(Address: Word): Boolean;
    52     procedure AddNew(Address: Word);
    53   end;
    54 
    5543  { TCpuZ80 }
    5644
    5745  TCpuZ80 = class
    5846  private
     47    FOnCall: TAddressEvent;
    5948    FOnInput: TReadEvent;
    6049    FOnMessage: TMessageEvent;
    6150    FOnOutput: TWriteEvent;
    6251    FOnRead: TReadEvent;
     52    FOnReturn: TBaseEvent;
     53    FOnStep: TBaseEvent;
    6354    FOnWrite: TWriteEvent;
    6455    FRunning: Boolean;
     
    8576    procedure DoMessage(Text: string);
    8677    procedure DoMessageSync;
     78    procedure DoOnCall(Address: Word);
     79    procedure DoOnReturn;
     80    procedure DoOnStep;
    8781    function ReadByte: Byte;
    8882    function ReadWord: Word;
     
    832826    InterruptEnabled: Boolean;
    833827    InterruptMode: Byte;
    834     BreakPoints: TBreakPoints;
    835     DebugMode: TDebugMode;
    836     DebugStopAddress: Word;
    837828    Instructions: TInstructionMethods;
    838829    procedure Step;
     
    852843    property OnOutput: TWriteEvent read FOnOutput write FOnOutput;
    853844    property OnMessage: TMessageEvent read FOnMessage write FOnMessage;
     845    property OnCall: TAddressEvent read FOnCall write FOnCall;
     846    property OnReturn: TBaseEvent read FOnReturn write FOnReturn;
     847    property OnStep: TBaseEvent read FOnStep write FOnStep;
    854848  end;
    855849
     
    865859  end;
    866860  Cpu.FRunning := False;
    867 end;
    868 
    869 { TBreakPoints }
    870 
    871 function TBreakPoints.Comparer(constref Left, Right: Word): Integer;
    872 begin
    873   if Left > Right then Result := 1
    874   else if Left < Right then Result := -1
    875   else Result := 0;
    876 end;
    877 
    878 function TBreakPoints.Contains(Address: Word): Boolean;
    879 var
    880   Index: SizeInt;
    881 begin
    882   if (Count > 0) and BinarySearch(Address, Index, TComparer<Word>.Construct(Comparer)) then begin
    883     Result := True;
    884   end else Result := False;
    885 end;
    886 
    887 procedure TBreakPoints.AddNew(Address: Word);
    888 begin
    889   Add(Address);
    890   Sort;
    891861end;
    892862
     
    992962begin
    993963  MessageText := Text;
    994   FThread.Synchronize(DoMessageSync);
     964  DoMessageSync;
    995965  MessageText := '';
    996966end;
     
    999969begin
    1000970  if Assigned(FOnMessage) then FOnMessage(MessageText);
     971end;
     972
     973procedure TCpuZ80.DoOnCall(Address: Word);
     974begin
     975  if Assigned(FOnCall) then FOnCall(Address);
     976end;
     977
     978procedure TCpuZ80.DoOnReturn;
     979begin
     980  if Assigned(FOnReturn) then FOnReturn;
     981end;
     982
     983procedure TCpuZ80.DoOnStep;
     984begin
     985  if Assigned(FOnStep) then FOnStep;
    1001986end;
    1002987
     
    10281013procedure TCpuZ80.Call(Address: Word);
    10291014begin
    1030   if DebugMode = dmStepOver then begin
    1031     DebugStopAddress := PC;
    1032     DebugMode := dmStopAddress;
    1033   end;
     1015  DoOnCall(Address);
    10341016  PushWord(PC);
    10351017  PC := Address;
     
    10381020procedure TCpuZ80.CallCond(Address: Word; Condition: Boolean);
    10391021begin
    1040   if DebugMode = dmStepOver then begin
    1041     DebugStopAddress := PC;
    1042     DebugMode := dmStopAddress;
    1043   end;
     1022  DoOnCall(Address);
    10441023  if Condition then begin
    10451024    PushWord(PC);
     
    10771056  if Condition then begin
    10781057    PC := PopWord;
    1079     if DebugMode = dmStepOut then begin
    1080       FThread.Terminate;
    1081       DebugMode := dmNone;
    1082     end;
     1058    DoOnReturn;
    10831059  end;
    10841060end;
     
    55555531  end;
    55565532  Ticks := Cardinal(Ticks + 1);
    5557 
    5558   // Debugging
    5559   if DebugMode <> dmNone then begin
    5560     if DebugMode = dmStepIn then begin
    5561       DebugMode := dmNone;
    5562       FThread.Terminate;
    5563     end;
    5564     if (DebugMode = dmStopAddress) and (DebugStopAddress = PC) then begin
    5565       DebugMode := dmNone;
    5566       FThread.Terminate;
    5567     end;
    5568     if DebugMode = dmStepOver then begin
    5569       DebugMode := dmNone;
    5570       FThread.Terminate;
    5571     end;
    5572   end;
    5573   if BreakPoints.Contains(PC) then begin
    5574     DebugMode := dmNone;
    5575     FThread.Terminate;
    5576   end;
     5533  DoOnStep;
    55775534end;
    55785535
     
    55925549constructor TCpuZ80.Create;
    55935550begin
    5594   BreakPoints := TBreakPoints.Create;
    55955551  InitInstructions;
    55965552  Reset;
     
    56005556begin
    56015557  Running := False;
    5602   FreeAndNil(BreakPoints);
    56035558  inherited;
    56045559end;
  • trunk/mzxemu.lpi

    r8 r13  
    5353            </Options>
    5454          </Linking>
     55          <Other>
     56            <CompilerMessages>
     57              <IgnoredMessages idx5024="True"/>
     58            </CompilerMessages>
     59          </Other>
    5560        </CompilerOptions>
    5661      </Item>
     
    9398      </Unit>
    9499      <Unit>
    95         <Filename Value="Memory.pas"/>
     100        <Filename Value="MemoryTypes.pas"/>
    96101        <IsPartOfProject Value="True"/>
    97102      </Unit>
     
    154159      </Unit>
    155160      <Unit>
    156         <Filename Value="Forms/Base.pas"/>
     161        <Filename Value="Base.pas"/>
    157162        <IsPartOfProject Value="True"/>
    158163      </Unit>
     
    171176      <Unit>
    172177        <Filename Value="I8255.pas"/>
     178        <IsPartOfProject Value="True"/>
     179      </Unit>
     180      <Unit>
     181        <Filename Value="Forms/FormCallStack.pas"/>
     182        <IsPartOfProject Value="True"/>
     183        <ComponentName Value="FormCallStack"/>
     184        <HasResources Value="True"/>
     185        <ResourceBaseClass Value="Form"/>
     186      </Unit>
     187      <Unit>
     188        <Filename Value="Debugger.pas"/>
    173189        <IsPartOfProject Value="True"/>
    174190      </Unit>
     
    215231      </Options>
    216232    </Linking>
     233    <Other>
     234      <CompilerMessages>
     235        <IgnoredMessages idx5024="True"/>
     236      </CompilerMessages>
     237    </Other>
    217238  </CompilerOptions>
    218239  <Debugging>
  • trunk/mzxemu.lpr

    r8 r13  
    1111  {$ENDIF}
    1212  SysUtils, Interfaces, // this includes the LCL widgetset
    13   Forms, FormMain, FormMemory, FormDisassembler, Z80, SharpMz800, Memory, Core,
     13  Forms, FormMain, FormMemory, FormDisassembler, Z80, SharpMz800,
     14MemoryTypes, Core,
    1415  Z80InstructionInfo, Z80Instructions, Disassembler, FormCpu, FormScreen,
    15   FormGoToAddress, FormMessages, Base, InstructionSetGen, I8253, I8255;
     16  FormGoToAddress, FormMessages, Base, InstructionSetGen, I8253, I8255,
     17FormCallStack, Debugger;
    1618
    1719{$if declared(UseHeapTrace)}
Note: See TracChangeset for help on using the changeset viewer.