Changeset 13
- Timestamp:
- Apr 21, 2026, 2:55:51 PM (6 days ago)
- Location:
- trunk
- Files:
-
- 5 added
- 2 deleted
- 16 edited
-
Base.pas (added)
-
Core.lfm (modified) (1 diff)
-
Core.pas (modified) (14 diffs)
-
Debugger.pas (added)
-
Disassembler.pas (modified) (1 diff)
-
Forms/Base.pas (deleted)
-
Forms/FormCallStack.lfm (added)
-
Forms/FormCallStack.pas (added)
-
Forms/FormCpu.lfm (modified) (2 diffs)
-
Forms/FormDisassembler.lfm (modified) (1 diff)
-
Forms/FormDisassembler.pas (modified) (12 diffs)
-
Forms/FormMain.lfm (modified) (2 diffs)
-
Forms/FormMain.pas (modified) (2 diffs)
-
Forms/FormMemory.lfm (modified) (1 diff)
-
Forms/FormMemory.pas (modified) (7 diffs)
-
Forms/FormMessages.lfm (modified) (2 diffs)
-
Forms/FormMessages.pas (modified) (3 diffs)
-
Memory.pas (deleted)
-
MemoryTypes.pas (added)
-
SharpMz800.pas (modified) (2 diffs)
-
Z80/Z80.pas (modified) (14 diffs)
-
mzxemu.lpi (modified) (5 diffs)
-
mzxemu.lpr (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Core.lfm
r12 r13 102 102 OnExecute = AInstructionSetGenExecute 103 103 end 104 object AViewCallStack: TAction 105 Category = 'View' 106 Caption = 'Call stack' 107 OnExecute = AViewCallStackExecute 108 end 104 109 end 105 110 object ImageList1: TImageList -
trunk/Core.pas
r12 r13 5 5 uses 6 6 Classes, SysUtils, ActnList, Controls, FormMain, Forms, ExtCtrls, FormMemory, 7 SharpMz800, FormDisassembler, FormCpu, FormScreen, FormMessages; 7 SharpMz800, FormDisassembler, FormCpu, FormScreen, FormMessages, FormCallStack, 8 Debugger, Disassembler; 8 9 9 10 type … … 12 13 13 14 TCore = class(TDataModule) 15 AViewCallStack: TAction; 14 16 AInstructionSetGen: TAction; 15 17 AViewMessages: TAction; … … 42 44 procedure AStepOverExecute(Sender: TObject); 43 45 procedure AStopExecute(Sender: TObject); 46 procedure AViewCallStackExecute(Sender: TObject); 44 47 procedure AViewCpuExecute(Sender: TObject); 45 48 procedure AViewDissssemblerExecute(Sender: TObject); … … 53 56 LastPc: Word; 54 57 procedure DoChangePC(Address: Word); 58 procedure DebuggerChange(Sender: TObject); 55 59 public 56 60 FormMain: TFormMain; … … 60 64 FormScreen: TFormScreen; 61 65 FormMessages: TFormMessages; 66 FormCallStack: TFormCallStack; 62 67 SharpMz800: TSharpMz800; 68 Debugger: TDebugger; 69 Disassembler: TDisassembler; 63 70 procedure UpdateDisassemblerPos; 64 71 procedure UpdateInterface; … … 82 89 LastPc := $ffff; 83 90 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; 84 97 // SharpMz800.PowerOn; 85 98 FormMain := TFormMain.Create(nil); … … 142 155 procedure TCore.ARunToCursorExecute(Sender: TObject); 143 156 begin 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; 147 160 UpdateInterface; 148 161 end; … … 150 163 procedure TCore.AStepInExecute(Sender: TObject); 151 164 begin 152 SharpMz800.Cpu.DebugMode := dmStepIn;153 SharpMz800.Cpu.Running := True;165 Debugger.DebugMode := dmStepIn; 166 Debugger.Cpu.Running := True; 154 167 UpdateInterface; 155 168 end; … … 157 170 procedure TCore.AStepOutExecute(Sender: TObject); 158 171 begin 159 SharpMz800.Cpu.DebugMode := dmStepOut;160 SharpMz800.Cpu.Running := True;172 Debugger.DebugMode := dmStepOut; 173 Debugger.Cpu.Running := True; 161 174 UpdateInterface; 162 175 end; … … 164 177 procedure TCore.AStepOverExecute(Sender: TObject); 165 178 begin 166 SharpMz800.Cpu.DebugMode := dmStepOver;167 SharpMz800.Cpu.Running := True;179 Debugger.DebugMode := dmStepOver; 180 Debugger.Cpu.Running := True; 168 181 UpdateInterface; 169 182 end; … … 174 187 SharpMz800.Cpu.Reset; 175 188 UpdateInterface; 189 end; 190 191 procedure TCore.AViewCallStackExecute(Sender: TObject); 192 begin 193 if not Assigned(FormCallStack) then begin 194 FormCallStack := TFormCallStack.Create(nil); 195 FormCallStack.Debugger := Debugger; 196 end; 197 FormCallStack.Show; 176 198 end; 177 199 … … 189 211 if not Assigned(FormDisassembler) then begin 190 212 FormDisassembler := TFormDisassembler.Create(nil); 191 FormDisassembler.Disassembler.Memory := SharpMz800.MappedMemory;192 213 FormDisassembler.OnChangePC := DoChangePC; 193 FormDisassembler.Cpu := SharpMz800.Cpu; 214 FormDisassembler.Debugger := Debugger; 215 FormDisassembler.Disassembler := Disassembler; 194 216 SharpMz800.OnMemoryMappingChange := FormDisassembler.Disassemble; 195 217 end; … … 236 258 if Assigned(FormScreen) then FreeAndNil(FormScreen); 237 259 if Assigned(FormMessages) then FreeAndNil(FormMessages); 260 if Assigned(FormCallStack) then FreeAndNil(FormCallStack); 238 261 FreeAndNil(FormMain); 262 FreeAndNil(Debugger); 263 FreeAndNil(Disassembler); 239 264 FreeAndNil(SharpMz800); 240 265 end; … … 249 274 begin 250 275 SharpMz800.Cpu.PC := Address; 276 end; 277 278 procedure TCore.DebuggerChange(Sender: TObject); 279 begin 280 if Assigned(FormCallStack) then FormCallStack.Reload; 251 281 end; 252 282 -
trunk/Disassembler.pas
r12 r13 4 4 5 5 uses 6 Classes, SysUtils, Z80Instructions, Z80InstructionInfo, StrUtils, Memory ,6 Classes, SysUtils, Z80Instructions, Z80InstructionInfo, StrUtils, MemoryTypes, 7 7 Generics.Collections; 8 8 -
trunk/Forms/FormCpu.lfm
r11 r13 1 1 object FormCpu: TFormCpu 2 2 Left = 834 3 Height = 6 573 Height = 610 4 4 Top = 501 5 Width = 2745 Width = 302 6 6 Caption = 'CPU' 7 ClientHeight = 6 578 ClientWidth = 2747 ClientHeight = 610 8 ClientWidth = 302 9 9 DesignTimePPI = 144 10 10 LCLVersion = '4.6.0.0' 11 11 object GroupBox1: TGroupBox 12 Left = 2212 Left = 8 13 13 Height = 546 14 14 Top = 22 15 Width = 2 3015 Width = 256 16 16 Caption = 'Registers' 17 17 ClientHeight = 519 18 ClientWidth = 2 2818 ClientWidth = 254 19 19 TabOrder = 0 20 20 object ValueListEditor1: TValueListEditor … … 22 22 Height = 499 23 23 Top = 5 24 Width = 19224 Width = 218 25 25 Anchors = [akTop, akLeft, akRight, akBottom] 26 DefaultColWidth = 100 26 27 RowCount = 2 27 28 TabOrder = 0 28 29 ColWidths = ( 29 9630 9430 100 31 116 31 32 ) 32 33 end -
trunk/Forms/FormDisassembler.lfm
r12 r13 65 65 end 66 66 end 67 object Timer1: TTimer 68 Interval = 100 69 OnTimer = Timer1Timer 70 Left = 568 71 Top = 352 72 end 67 73 end -
trunk/Forms/FormDisassembler.pas
r12 r13 5 5 uses 6 6 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, 7 ExtCtrls, Menus, Disassembler, Z80;7 ExtCtrls, Menus, Disassembler, Base, Debugger; 8 8 9 9 type 10 TAddressEvent = procedure (Address: Word) of object;11 12 10 { TFormDisassembler } 13 11 … … 18 16 MenuItemSetAddress: TMenuItem; 19 17 PopupMenu1: TPopupMenu; 18 Timer1: TTimer; 20 19 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); 21 20 procedure FormCreate(Sender: TObject); … … 27 26 procedure MenuItemSetAddressClick(Sender: TObject); 28 27 procedure PopupMenu1Popup(Sender: TObject); 28 procedure Timer1Timer(Sender: TObject); 29 29 private 30 FReloadPending: Boolean; 30 31 FOnAddBreakPoint: TAddressEvent; 31 32 FOnChangePC: TAddressEvent; … … 33 34 procedure DoAddBreakPoint(Address: Word); 34 35 public 35 Cpu: TCpuZ80;36 Debugger: TDebugger; 36 37 Disassembler: TDisassembler; 37 38 procedure Disassemble(Sender: TObject); 38 39 procedure SelectAddress(Address: Word); 39 40 procedure ReloadList; 41 procedure Reload; 40 42 function GetCurrentAddress: Word; 41 43 property OnChangePC: TAddressEvent read FOnChangePC write FOnChangePC; … … 60 62 procedure TFormDisassembler.FormCreate(Sender: TObject); 61 63 begin 62 Disassembler := TDisassembler.Create;63 64 end; 64 65 65 66 procedure TFormDisassembler.FormDestroy(Sender: TObject); 66 67 begin 67 FreeAndNil(Disassembler);68 68 end; 69 69 70 70 procedure TFormDisassembler.FormShow(Sender: TObject); 71 71 begin 72 Disassemble(nil);72 Reload; 73 73 end; 74 74 … … 79 79 if Item.Index < Disassembler.DecodedInstructions.Count then 80 80 with TDecodedInstruction(Disassembler.DecodedInstructions[Item.Index]) do begin 81 if Cpu.BreakPoints.Contains(Address) then BreakPoint := ' @'81 if Debugger.BreakPoints.Contains(Address) then BreakPoint := ' @' 82 82 else BreakPoint := ''; 83 83 Item.Caption := IntToHex(Address, 4) + BreakPoint; … … 93 93 begin 94 94 if Assigned(ListView1.Selected) then begin 95 Cpu.BreakPoints.Add(TDecodedInstruction(ListView1.Selected.Data).Address);95 Debugger.BreakPoints.Add(TDecodedInstruction(ListView1.Selected.Data).Address); 96 96 ReloadList; 97 97 end; … … 101 101 begin 102 102 if Assigned(ListView1.Selected) then begin 103 Cpu.BreakPoints.Remove(TDecodedInstruction(ListView1.Selected.Data).Address);103 Debugger.BreakPoints.Remove(TDecodedInstruction(ListView1.Selected.Data).Address); 104 104 ReloadList; 105 105 end; … … 116 116 procedure TFormDisassembler.PopupMenu1Popup(Sender: TObject); 117 117 begin 118 119 118 MenuItemSetAddress.Enabled := Assigned(ListView1.Selected); 120 119 if Assigned(ListView1.Selected) then begin … … 127 126 end; 128 127 128 procedure TFormDisassembler.Timer1Timer(Sender: TObject); 129 begin 130 if FReloadPending then begin 131 FReloadPending := False; 132 Disassembler.Disassemble; 133 ReloadList; 134 end; 135 end; 136 129 137 procedure TFormDisassembler.Disassemble(Sender: TObject); 130 138 begin 131 Disassembler.Disassemble; 132 ReloadList; 139 Reload; 133 140 end; 134 141 … … 146 153 var 147 154 Item: TListItem; 148 DecodedInstruction: TDecodedInstruction;149 155 Index: Integer; 150 156 begin 151 157 Index := Disassembler.DecodedInstructions.SearchAddressIndex(Address); 152 158 if Index >= 0 then begin 153 DecodedInstruction := Disassembler.DecodedInstructions[Index];154 159 Item := ListView1.Items[Index]; 155 160 if Assigned(Item) then begin … … 172 177 end; 173 178 179 procedure TFormDisassembler.Reload; 180 begin 181 FReloadPending := True; 182 end; 183 174 184 function TFormDisassembler.GetCurrentAddress: Word; 175 185 begin -
trunk/Forms/FormMain.lfm
r6 r13 65 65 TabOrder = 0 66 66 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 67 76 end 68 77 object MainMenu1: TMainMenu … … 94 103 object MenuItem15: TMenuItem 95 104 Action = Core.AViewScreen 105 end 106 object MenuItem16: TMenuItem 107 Action = Core.AViewCallStack 108 end 109 object MenuItem17: TMenuItem 110 Action = Core.AViewMessages 96 111 end 97 112 end -
trunk/Forms/FormMain.pas
r6 r13 13 13 MainMenu1: TMainMenu; 14 14 MenuItem1: TMenuItem; 15 MenuItem16: TMenuItem; 16 MenuItem17: TMenuItem; 15 17 MenuItem2: TMenuItem; 16 18 MenuItem5: TMenuItem; 17 19 MenuItemTools: TMenuItem; 20 PanelCallStack: TPanel; 18 21 Separator1: TMenuItem; 19 22 MenuItemFile: TMenuItem; … … 74 77 Core.Core.AViewScreen.Execute; 75 78 Core.Core.AViewDissssembler.Execute; 79 Core.Core.AViewCallStack.Execute; 76 80 DockForm(Core.Core.FormScreen, PanelCenter); 77 81 DockForm(Core.Core.FormCpu, PanelRight); 78 82 DockForm(Core.Core.FormDisassembler, PanelLeft); 79 83 DockForm(Core.Core.FormMessages, PanelBottom); 84 DockForm(Core.Core.FormCallStack, PanelCallStack); 80 85 end; 81 86 -
trunk/Forms/FormMemory.lfm
r5 r13 59 59 end 60 60 object Timer1: TTimer 61 Interval = 50061 Interval = 100 62 62 OnTimer = Timer1Timer 63 63 Left = 469 -
trunk/Forms/FormMemory.pas
r5 r13 5 5 uses 6 6 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, ExtCtrls, 7 StdCtrls, Memory , Generics.Collections;7 StdCtrls, MemoryTypes, Generics.Collections; 8 8 9 9 type … … 24 24 procedure Timer1Timer(Sender: TObject); 25 25 private 26 Memory: TMemory; 27 Size: Integer; 26 FReloadPending: Boolean; 27 FMemory: TMemory; 28 FSize: Integer; 28 29 public 29 30 Areas: TObjectList<TMemory>; … … 45 46 procedure TFormMemory.Reload; 46 47 begin 47 ListViewMemory.Items.Count := Size div ItemsPerLine;48 ListViewMemory.Items.Count := FSize div ItemsPerLine; 48 49 ListViewMemory.Refresh; 49 50 end; … … 56 57 One: Byte; 57 58 begin 58 if Item.Index < Size div ItemsPerLine then begin59 if Item.Index < FSize div ItemsPerLine then begin 59 60 Line := ''; 60 61 Text := ''; 61 62 for I := 0 to ItemsPerLine - 1 do begin 62 One := Memory.Read(Item.Index * ItemsPerLine + I);63 One := FMemory.Read(Item.Index * ItemsPerLine + I); 63 64 Line := Line + IntToHex(One, 2) + ' '; 64 65 if One >= 32 then Text := Text + Char(One) … … 75 76 ReloadAreas; 76 77 ComboBoxAreaSelect(nil); 78 FReloadPending := True; 77 79 end; 78 80 … … 85 87 begin 86 88 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; 89 91 end else begin 90 Memory := nil;91 Size := 0;92 FMemory := nil; 93 FSize := 0; 92 94 end; 93 95 Reload; … … 101 103 procedure TFormMemory.Timer1Timer(Sender: TObject); 102 104 begin 103 if Visible then Reload; 105 if FReloadPending then begin 106 FReloadPending := False; 107 Reload; 108 end; 104 109 end; 105 110 -
trunk/Forms/FormMessages.lfm
r5 r13 9 9 DesignTimePPI = 144 10 10 LCLVersion = '4.6.0.0' 11 OnCreate = FormCreate 12 OnDestroy = FormDestroy 11 13 object Memo1: TMemo 12 14 Left = 8 … … 20 22 TabOrder = 0 21 23 end 24 object Timer1: TTimer 25 Interval = 100 26 OnTimer = Timer1Timer 27 Left = 357 28 Top = 284 29 end 22 30 end -
trunk/Forms/FormMessages.pas
r5 r13 4 4 5 5 uses 6 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls; 6 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, 7 Generics.Collections; 7 8 8 9 type 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; 9 19 10 20 { TFormMessages } … … 12 22 TFormMessages = class(TForm) 13 23 Memo1: TMemo; 24 Timer1: TTimer; 25 procedure FormCreate(Sender: TObject); 26 procedure FormDestroy(Sender: TObject); 27 procedure Timer1Timer(Sender: TObject); 14 28 private 15 29 FMessages: TMessages; 30 FReloadPending: Boolean; 16 31 public 17 32 procedure AddMessage(Text: string); … … 23 38 {$R *.lfm} 24 39 40 { TMessages } 41 42 function TMessages.AddNew(Text: string): TMessage; 43 begin 44 Result := TMessage.Create; 45 Result.Text := Text; 46 Add(Result); 47 end; 48 25 49 { TFormMessages } 50 51 procedure TFormMessages.Timer1Timer(Sender: TObject); 52 var 53 I: Integer; 54 begin 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; 63 end; 64 65 procedure TFormMessages.FormCreate(Sender: TObject); 66 begin 67 FMessages := TMessages.Create; 68 end; 69 70 procedure TFormMessages.FormDestroy(Sender: TObject); 71 begin 72 FreeAndNil(FMessages); 73 end; 26 74 27 75 procedure TFormMessages.AddMessage(Text: string); 28 76 begin 29 Memo1.Lines.Add(Text); 77 FMessages.AddNew(Text); 78 FReloadPending := True; 30 79 end; 31 80 -
trunk/SharpMz800.pas
r8 r13 4 4 5 5 uses 6 Classes, SysUtils, Z80, Memory , Base, I8255, I8253;6 Classes, SysUtils, Z80, MemoryTypes, Base, I8255, I8253; 7 7 8 8 type … … 118 118 MappedMemory.Areas.AddNew($0, Memory); 119 119 if Assigned(Cpu) then 120 TThread.Synchronize(Cpu.Thread, DoMemoryMappingChange);120 DoMemoryMappingChange; 121 121 end; 122 122 -
trunk/Z80/Z80.pas
r12 r13 4 4 5 5 uses 6 Classes, SysUtils, Memory , Base, Z80Instructions, Generics.Collections,6 Classes, SysUtils, MemoryTypes, Base, Z80Instructions, Generics.Collections, 7 7 Generics.Defaults; 8 8 … … 41 41 end; 42 42 43 TDebugMode = (dmNone, dmStepIn, dmStepOut, dmStepOver, dmStopAddress);44 45 { TBreakPoints }46 47 TBreakPoints = class(TList<Word>)48 private49 function Comparer(constref Left, Right: Word): Integer;50 public51 function Contains(Address: Word): Boolean;52 procedure AddNew(Address: Word);53 end;54 55 43 { TCpuZ80 } 56 44 57 45 TCpuZ80 = class 58 46 private 47 FOnCall: TAddressEvent; 59 48 FOnInput: TReadEvent; 60 49 FOnMessage: TMessageEvent; 61 50 FOnOutput: TWriteEvent; 62 51 FOnRead: TReadEvent; 52 FOnReturn: TBaseEvent; 53 FOnStep: TBaseEvent; 63 54 FOnWrite: TWriteEvent; 64 55 FRunning: Boolean; … … 85 76 procedure DoMessage(Text: string); 86 77 procedure DoMessageSync; 78 procedure DoOnCall(Address: Word); 79 procedure DoOnReturn; 80 procedure DoOnStep; 87 81 function ReadByte: Byte; 88 82 function ReadWord: Word; … … 832 826 InterruptEnabled: Boolean; 833 827 InterruptMode: Byte; 834 BreakPoints: TBreakPoints;835 DebugMode: TDebugMode;836 DebugStopAddress: Word;837 828 Instructions: TInstructionMethods; 838 829 procedure Step; … … 852 843 property OnOutput: TWriteEvent read FOnOutput write FOnOutput; 853 844 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; 854 848 end; 855 849 … … 865 859 end; 866 860 Cpu.FRunning := False; 867 end;868 869 { TBreakPoints }870 871 function TBreakPoints.Comparer(constref Left, Right: Word): Integer;872 begin873 if Left > Right then Result := 1874 else if Left < Right then Result := -1875 else Result := 0;876 end;877 878 function TBreakPoints.Contains(Address: Word): Boolean;879 var880 Index: SizeInt;881 begin882 if (Count > 0) and BinarySearch(Address, Index, TComparer<Word>.Construct(Comparer)) then begin883 Result := True;884 end else Result := False;885 end;886 887 procedure TBreakPoints.AddNew(Address: Word);888 begin889 Add(Address);890 Sort;891 861 end; 892 862 … … 992 962 begin 993 963 MessageText := Text; 994 FThread.Synchronize(DoMessageSync);964 DoMessageSync; 995 965 MessageText := ''; 996 966 end; … … 999 969 begin 1000 970 if Assigned(FOnMessage) then FOnMessage(MessageText); 971 end; 972 973 procedure TCpuZ80.DoOnCall(Address: Word); 974 begin 975 if Assigned(FOnCall) then FOnCall(Address); 976 end; 977 978 procedure TCpuZ80.DoOnReturn; 979 begin 980 if Assigned(FOnReturn) then FOnReturn; 981 end; 982 983 procedure TCpuZ80.DoOnStep; 984 begin 985 if Assigned(FOnStep) then FOnStep; 1001 986 end; 1002 987 … … 1028 1013 procedure TCpuZ80.Call(Address: Word); 1029 1014 begin 1030 if DebugMode = dmStepOver then begin 1031 DebugStopAddress := PC; 1032 DebugMode := dmStopAddress; 1033 end; 1015 DoOnCall(Address); 1034 1016 PushWord(PC); 1035 1017 PC := Address; … … 1038 1020 procedure TCpuZ80.CallCond(Address: Word; Condition: Boolean); 1039 1021 begin 1040 if DebugMode = dmStepOver then begin 1041 DebugStopAddress := PC; 1042 DebugMode := dmStopAddress; 1043 end; 1022 DoOnCall(Address); 1044 1023 if Condition then begin 1045 1024 PushWord(PC); … … 1077 1056 if Condition then begin 1078 1057 PC := PopWord; 1079 if DebugMode = dmStepOut then begin 1080 FThread.Terminate; 1081 DebugMode := dmNone; 1082 end; 1058 DoOnReturn; 1083 1059 end; 1084 1060 end; … … 5555 5531 end; 5556 5532 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; 5577 5534 end; 5578 5535 … … 5592 5549 constructor TCpuZ80.Create; 5593 5550 begin 5594 BreakPoints := TBreakPoints.Create;5595 5551 InitInstructions; 5596 5552 Reset; … … 5600 5556 begin 5601 5557 Running := False; 5602 FreeAndNil(BreakPoints);5603 5558 inherited; 5604 5559 end; -
trunk/mzxemu.lpi
r8 r13 53 53 </Options> 54 54 </Linking> 55 <Other> 56 <CompilerMessages> 57 <IgnoredMessages idx5024="True"/> 58 </CompilerMessages> 59 </Other> 55 60 </CompilerOptions> 56 61 </Item> … … 93 98 </Unit> 94 99 <Unit> 95 <Filename Value="Memory .pas"/>100 <Filename Value="MemoryTypes.pas"/> 96 101 <IsPartOfProject Value="True"/> 97 102 </Unit> … … 154 159 </Unit> 155 160 <Unit> 156 <Filename Value=" Forms/Base.pas"/>161 <Filename Value="Base.pas"/> 157 162 <IsPartOfProject Value="True"/> 158 163 </Unit> … … 171 176 <Unit> 172 177 <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"/> 173 189 <IsPartOfProject Value="True"/> 174 190 </Unit> … … 215 231 </Options> 216 232 </Linking> 233 <Other> 234 <CompilerMessages> 235 <IgnoredMessages idx5024="True"/> 236 </CompilerMessages> 237 </Other> 217 238 </CompilerOptions> 218 239 <Debugging> -
trunk/mzxemu.lpr
r8 r13 11 11 {$ENDIF} 12 12 SysUtils, Interfaces, // this includes the LCL widgetset 13 Forms, FormMain, FormMemory, FormDisassembler, Z80, SharpMz800, Memory, Core, 13 Forms, FormMain, FormMemory, FormDisassembler, Z80, SharpMz800, 14 MemoryTypes, Core, 14 15 Z80InstructionInfo, Z80Instructions, Disassembler, FormCpu, FormScreen, 15 FormGoToAddress, FormMessages, Base, InstructionSetGen, I8253, I8255; 16 FormGoToAddress, FormMessages, Base, InstructionSetGen, I8253, I8255, 17 FormCallStack, Debugger; 16 18 17 19 {$if declared(UseHeapTrace)}
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/mzxemu/chrome/site/your_project_logo.png)