Changeset 14
- Timestamp:
- Apr 21, 2026, 3:52:53 PM (5 days ago)
- Location:
- trunk
- Files:
-
- 5 edited
-
Core.pas (modified) (3 diffs)
-
Debugger.pas (modified) (4 diffs)
-
Forms/FormMessages.pas (modified) (3 diffs)
-
Z80/Z80.pas (modified) (11 diffs)
-
Z80/Z80Instructions.pas (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Core.pas
r13 r14 85 85 { TCore } 86 86 87 procedure TCore.AExitExecute(Sender: TObject); 88 begin 89 Application.Terminate; 90 end; 91 92 procedure TCore.AGoToAddressExecute(Sender: TObject); 93 var 94 FormGoToAddress: TFormGoToAddress; 95 Address: LongInt; 96 begin 97 FormGoToAddress := TFormGoToAddress.Create(nil); 98 try 99 if FormGoToAddress.ShowModal = mrOk then begin 100 if TryStrToInt(FormGoToAddress.EditAddress.Text, Address) then 101 FormDisassembler.SelectAddress(Address); 102 end; 103 finally 104 FormGoToAddress.Free; 105 end; 106 end; 107 108 procedure TCore.AInstructionSetGenExecute(Sender: TObject); 109 var 110 InstructionSetGen: TInstructionSetGen; 111 begin 112 InstructionSetGen := TInstructionSetGen.Create; 113 InstructionSetGen.Generate('Z80/InstructionSet.html'); 114 InstructionSetGen.Free; 115 end; 116 117 procedure TCore.APauseExecute(Sender: TObject); 118 begin 119 SharpMz800.Cpu.Paused := True; 120 UpdateInterface; 121 end; 122 123 procedure TCore.AResetExecute(Sender: TObject); 124 var 125 IsRunning: Boolean; 126 IsPaused: Boolean; 127 begin 128 IsRunning := SharpMz800.Cpu.Running; 129 IsPaused := SharpMz800.Cpu.Paused; 130 SharpMz800.Cpu.Running := False; 131 SharpMz800.Cpu.Reset; 132 Debugger.Reset; 133 if Assigned(FormMessages) then FormMessages.Messages.Clear; 134 SharpMz800.Cpu.Running := IsRunning; 135 SharpMz800.Cpu.Paused := IsPaused; 136 UpdateInterface; 137 end; 138 139 procedure TCore.ARunExecute(Sender: TObject); 140 begin 141 SharpMz800.Cpu.Running := True; 142 UpdateInterface; 143 end; 144 145 procedure TCore.ARunToCursorExecute(Sender: TObject); 146 begin 147 Debugger.DebugMode := dmStopAddress; 148 Debugger.DebugStopAddress := FormDisassembler.GetCurrentAddress; 149 Debugger.Cpu.Running := True; 150 UpdateInterface; 151 end; 152 153 procedure TCore.AStepInExecute(Sender: TObject); 154 begin 155 Debugger.DebugMode := dmStepIn; 156 Debugger.Cpu.Running := True; 157 UpdateInterface; 158 end; 159 160 procedure TCore.AStepOutExecute(Sender: TObject); 161 begin 162 Debugger.DebugMode := dmStepOut; 163 Debugger.Cpu.Running := True; 164 UpdateInterface; 165 end; 166 167 procedure TCore.AStepOverExecute(Sender: TObject); 168 begin 169 Debugger.DebugMode := dmStepOver; 170 Debugger.Cpu.Running := True; 171 UpdateInterface; 172 end; 173 174 procedure TCore.AStopExecute(Sender: TObject); 175 begin 176 SharpMz800.Cpu.Running := False; 177 UpdateInterface; 178 end; 179 180 procedure TCore.AViewCallStackExecute(Sender: TObject); 181 begin 182 if not Assigned(FormCallStack) then begin 183 FormCallStack := TFormCallStack.Create(nil); 184 FormCallStack.Debugger := Debugger; 185 end; 186 FormCallStack.Show; 187 end; 188 189 procedure TCore.AViewCpuExecute(Sender: TObject); 190 begin 191 if not Assigned(FormCpu) then begin 192 FormCpu := TFormCpu.Create(nil); 193 FormCpu.Cpu := SharpMz800.Cpu; 194 end; 195 FormCpu.Show; 196 end; 197 198 procedure TCore.AViewDissssemblerExecute(Sender: TObject); 199 begin 200 if not Assigned(FormDisassembler) then begin 201 FormDisassembler := TFormDisassembler.Create(nil); 202 FormDisassembler.OnChangePC := DoChangePC; 203 FormDisassembler.Debugger := Debugger; 204 FormDisassembler.Disassembler := Disassembler; 205 SharpMz800.OnMemoryMappingChange := FormDisassembler.Disassemble; 206 end; 207 FormDisassembler.Show; 208 FormMessages.AddMessage(FormDisassembler.Disassembler.InstructionSet.Check(SharpMz800.Cpu.Instructions)); 209 end; 210 211 procedure TCore.AViewMemoryExecute(Sender: TObject); 212 begin 213 if not Assigned(FormMemory) then begin 214 FormMemory := TFormMemory.Create(nil); 215 FormMemory.Areas.Add(SharpMz800.Memory); 216 FormMemory.Areas.Add(SharpMz800.BaseRom); 217 FormMemory.Areas.Add(SharpMz800.ExtendedRom); 218 FormMemory.Areas.Add(SharpMz800.VideoRam); 219 FormMemory.Areas.Add(SharpMz800.CharacterRom); 220 FormMemory.Areas.Add(SharpMz800.MappedIO); 221 end; 222 FormMemory.Show; 223 end; 224 225 procedure TCore.AViewMessagesExecute(Sender: TObject); 226 begin 227 if not Assigned(FormMessages) then begin 228 FormMessages := TFormMessages.Create(nil); 229 SharpMz800.OnMessage := FormMessages.AddMessage; 230 end; 231 FormMessages.Show; 232 end; 233 234 procedure TCore.AViewScreenExecute(Sender: TObject); 235 begin 236 if not Assigned(FormScreen) then begin 237 FormScreen := TFormScreen.Create(nil); 238 end; 239 FormScreen.Show; 240 end; 241 87 242 procedure TCore.DataModuleCreate(Sender: TObject); 88 243 begin … … 95 250 Debugger.OnChange := DebuggerChange; 96 251 Debugger.Disassembler := Disassembler; 97 // SharpMz800.PowerOn;98 252 FormMain := TFormMain.Create(nil); 99 253 FormMain.Show; 100 254 end; 101 255 102 procedure TCore.AExitExecute(Sender: TObject); 103 begin 104 Application.Terminate; 105 end; 106 107 procedure TCore.AGoToAddressExecute(Sender: TObject); 108 var 109 FormGoToAddress: TFormGoToAddress; 110 Address: LongInt; 111 begin 112 FormGoToAddress := TFormGoToAddress.Create(nil); 113 try 114 if FormGoToAddress.ShowModal = mrOk then begin 115 if TryStrToInt(FormGoToAddress.EditAddress.Text, Address) then 116 FormDisassembler.SelectAddress(Address); 117 end; 118 finally 119 FormGoToAddress.Free; 120 end; 121 end; 122 123 procedure TCore.AInstructionSetGenExecute(Sender: TObject); 124 var 125 InstructionSetGen: TInstructionSetGen; 126 begin 127 InstructionSetGen := TInstructionSetGen.Create; 128 InstructionSetGen.Generate('Z80/InstructionSet.html'); 129 InstructionSetGen.Free; 130 end; 131 132 procedure TCore.APauseExecute(Sender: TObject); 256 procedure TCore.DataModuleDestroy(Sender: TObject); 133 257 begin 134 258 SharpMz800.Cpu.Running := False; 135 UpdateInterface;136 end;137 138 procedure TCore.AResetExecute(Sender: TObject);139 var140 IsRunning: Boolean;141 begin142 IsRunning := SharpMz800.Cpu.Running;143 SharpMz800.Cpu.Running := False;144 SharpMz800.Cpu.Reset;145 SharpMz800.Cpu.Running := IsRunning;146 UpdateInterface;147 end;148 149 procedure TCore.ARunExecute(Sender: TObject);150 begin151 SharpMz800.Cpu.Running := True;152 UpdateInterface;153 end;154 155 procedure TCore.ARunToCursorExecute(Sender: TObject);156 begin157 Debugger.DebugMode := dmStopAddress;158 Debugger.DebugStopAddress := FormDisassembler.GetCurrentAddress;159 Debugger.Cpu.Running := True;160 UpdateInterface;161 end;162 163 procedure TCore.AStepInExecute(Sender: TObject);164 begin165 Debugger.DebugMode := dmStepIn;166 Debugger.Cpu.Running := True;167 UpdateInterface;168 end;169 170 procedure TCore.AStepOutExecute(Sender: TObject);171 begin172 Debugger.DebugMode := dmStepOut;173 Debugger.Cpu.Running := True;174 UpdateInterface;175 end;176 177 procedure TCore.AStepOverExecute(Sender: TObject);178 begin179 Debugger.DebugMode := dmStepOver;180 Debugger.Cpu.Running := True;181 UpdateInterface;182 end;183 184 procedure TCore.AStopExecute(Sender: TObject);185 begin186 SharpMz800.Cpu.Running := False;187 SharpMz800.Cpu.Reset;188 UpdateInterface;189 end;190 191 procedure TCore.AViewCallStackExecute(Sender: TObject);192 begin193 if not Assigned(FormCallStack) then begin194 FormCallStack := TFormCallStack.Create(nil);195 FormCallStack.Debugger := Debugger;196 end;197 FormCallStack.Show;198 end;199 200 procedure TCore.AViewCpuExecute(Sender: TObject);201 begin202 if not Assigned(FormCpu) then begin203 FormCpu := TFormCpu.Create(nil);204 FormCpu.Cpu := SharpMz800.Cpu;205 end;206 FormCpu.Show;207 end;208 209 procedure TCore.AViewDissssemblerExecute(Sender: TObject);210 begin211 if not Assigned(FormDisassembler) then begin212 FormDisassembler := TFormDisassembler.Create(nil);213 FormDisassembler.OnChangePC := DoChangePC;214 FormDisassembler.Debugger := Debugger;215 FormDisassembler.Disassembler := Disassembler;216 SharpMz800.OnMemoryMappingChange := FormDisassembler.Disassemble;217 end;218 FormDisassembler.Show;219 FormMessages.AddMessage(FormDisassembler.Disassembler.InstructionSet.Check(SharpMz800.Cpu.Instructions));220 end;221 222 procedure TCore.AViewMemoryExecute(Sender: TObject);223 begin224 if not Assigned(FormMemory) then begin225 FormMemory := TFormMemory.Create(nil);226 FormMemory.Areas.Add(SharpMz800.Memory);227 FormMemory.Areas.Add(SharpMz800.BaseRom);228 FormMemory.Areas.Add(SharpMz800.ExtendedRom);229 FormMemory.Areas.Add(SharpMz800.VideoRam);230 FormMemory.Areas.Add(SharpMz800.CharacterRom);231 FormMemory.Areas.Add(SharpMz800.MappedIO);232 end;233 FormMemory.Show;234 end;235 236 procedure TCore.AViewMessagesExecute(Sender: TObject);237 begin238 if not Assigned(FormMessages) then begin239 FormMessages := TFormMessages.Create(nil);240 SharpMz800.OnMessage := FormMessages.AddMessage;241 end;242 FormMessages.Show;243 end;244 245 procedure TCore.AViewScreenExecute(Sender: TObject);246 begin247 if not Assigned(FormScreen) then begin248 FormScreen := TFormScreen.Create(nil);249 end;250 FormScreen.Show;251 end;252 253 procedure TCore.DataModuleDestroy(Sender: TObject);254 begin255 259 if Assigned(FormCpu) then FreeAndNil(FormCpu); 256 260 if Assigned(FormDisassembler) then FreeAndNil(FormDisassembler); … … 292 296 procedure TCore.UpdateInterface; 293 297 begin 294 ARun.Enabled := not SharpMz800.Cpu.Running ;295 AStop.Enabled := SharpMz800.Cpu.Running ;296 APause.Enabled := SharpMz800.Cpu.Running ;297 AStepIn.Enabled := not SharpMz800.Cpu.Running ;298 AStepOut.Enabled := not SharpMz800.Cpu.Running ;299 AStepOver.Enabled := not SharpMz800.Cpu.Running ;300 ARunToCursor.Enabled := not SharpMz800.Cpu.Running ;298 ARun.Enabled := not SharpMz800.Cpu.Running or (SharpMz800.Cpu.Running and SharpMz800.Cpu.Paused); 299 AStop.Enabled := SharpMz800.Cpu.Running and not SharpMz800.Cpu.Paused; 300 APause.Enabled := SharpMz800.Cpu.Running and not SharpMz800.Cpu.Paused; 301 AStepIn.Enabled := not SharpMz800.Cpu.Running or (SharpMz800.Cpu.Running and SharpMz800.Cpu.Paused); 302 AStepOut.Enabled := not SharpMz800.Cpu.Running or (SharpMz800.Cpu.Running and SharpMz800.Cpu.Paused); 303 AStepOver.Enabled := not SharpMz800.Cpu.Running or (SharpMz800.Cpu.Running and SharpMz800.Cpu.Paused); 304 ARunToCursor.Enabled := not SharpMz800.Cpu.Running or (SharpMz800.Cpu.Running and SharpMz800.Cpu.Paused); 301 305 end; 302 306 -
trunk/Debugger.pas
r13 r14 60 60 DebugStopAddress: Word; 61 61 CallStack: TCallStack; 62 procedure Reset; 62 63 constructor Create; 63 64 destructor Destroy; override; … … 102 103 if CallStack.Count > 0 then CallStack.Delete(CallStack.Count - 1); 103 104 if DebugMode = dmStepOut then begin 104 Cpu. Thread.Terminate;105 Cpu.Paused := True; 105 106 DebugMode := dmNone; 106 107 end; … … 113 114 if DebugMode = dmStepIn then begin 114 115 DebugMode := dmNone; 115 Cpu. Thread.Terminate;116 Cpu.Paused := True; 116 117 end; 117 118 if (DebugMode = dmStopAddress) and (DebugStopAddress = Cpu.PC) then begin 118 119 DebugMode := dmNone; 119 Cpu. Thread.Terminate;120 Cpu.Paused := True; 120 121 end; 121 122 if DebugMode = dmStepOver then begin 122 123 DebugMode := dmNone; 123 Cpu. Thread.Terminate;124 Cpu.Paused := True; 124 125 end; 125 126 end; 126 127 if BreakPoints.Contains(Cpu.PC) then begin 127 128 DebugMode := dmNone; 128 Cpu. Thread.Terminate;129 Cpu.Paused := True; 129 130 end; 130 131 end; … … 140 141 FDisassembler := AValue; 141 142 CallStack.Disassembler := AValue; 143 end; 144 145 procedure TDebugger.Reset; 146 begin 147 BreakPoints.Clear; 148 CallStack.Clear; 142 149 end; 143 150 -
trunk/Forms/FormMessages.pas
r13 r14 27 27 procedure Timer1Timer(Sender: TObject); 28 28 private 29 FMessages: TMessages;30 29 FReloadPending: Boolean; 31 30 public 31 Messages: TMessages; 32 32 procedure AddMessage(Text: string); 33 33 end; … … 57 57 Memo1.Lines.BeginUpdate; 58 58 Memo1.Lines.Clear; 59 for I := 0 to FMessages.Count - 1 do60 Memo1.Lines.Add( FMessages[I].Text);59 for I := 0 to Messages.Count - 1 do 60 Memo1.Lines.Add(Messages[I].Text); 61 61 Memo1.Lines.EndUpdate; 62 62 end; … … 65 65 procedure TFormMessages.FormCreate(Sender: TObject); 66 66 begin 67 FMessages := TMessages.Create;67 Messages := TMessages.Create; 68 68 end; 69 69 70 70 procedure TFormMessages.FormDestroy(Sender: TObject); 71 71 begin 72 FreeAndNil( FMessages);72 FreeAndNil(Messages); 73 73 end; 74 74 75 75 procedure TFormMessages.AddMessage(Text: string); 76 76 begin 77 FMessages.AddNew(Text);77 Messages.AddNew(Text); 78 78 FReloadPending := True; 79 79 end; -
trunk/Z80/Z80.pas
r13 r14 4 4 5 5 uses 6 Classes, SysUtils, MemoryTypes, Base, Z80Instructions, Generics.Collections,7 Generics. Defaults;6 Classes, SysUtils, SyncObjs, MemoryTypes, Base, Z80Instructions, 7 Generics.Collections, Generics.Defaults; 8 8 9 9 type … … 58 58 InstructionAddress: Word; 59 59 MessageText: string; 60 FEvent: TEvent; 61 FPaused: Boolean; 60 62 procedure Error(Message: string); 61 63 function GetCarry: Boolean; … … 65 67 procedure SetCarry(AValue: Boolean); 66 68 procedure SetParityOverflow(AValue: Boolean); 69 procedure SetPaused(AValue: Boolean); 67 70 procedure SetSignNegative(AValue: Boolean); 68 71 procedure SetZero(AValue: Boolean); … … 837 840 property SignNegative: Boolean read GetSignNegative write SetSignNegative; 838 841 property Thread: TCpuThread read FThread; 842 property Paused: Boolean read FPaused write SetPaused; 839 843 property Running: Boolean read FRunning write SetRunning; 840 844 property OnRead: TReadEvent read FOnRead write FOnRead; … … 856 860 begin 857 861 while not Terminated do begin 862 Cpu.FEvent.WaitFor(INFINITE); 858 863 Cpu.Step; 859 864 end; … … 900 905 end; 901 906 907 procedure TCpuZ80.SetPaused(AValue: Boolean); 908 begin 909 if not Running then Exit; 910 911 if FPaused = AValue then Exit; 912 if FPaused then begin 913 FPaused := False; 914 FEvent.SetEvent; 915 end; 916 FPaused := AValue; 917 if FPaused then begin 918 FPaused := True; 919 FEvent.ResetEvent; 920 end; 921 end; 922 902 923 procedure TCpuZ80.SetSignNegative(AValue: Boolean); 903 924 begin … … 912 933 procedure TCpuZ80.SetRunning(AValue: Boolean); 913 934 begin 935 if FRunning and FPaused then Paused := False; 936 914 937 if FRunning = AValue then Exit; 915 938 if FRunning then begin 916 939 FThread.Terminate; 940 if FPaused then Paused := False; 917 941 FThread.WaitFor; 918 942 FreeAndNil(FThread); … … 5497 5521 var 5498 5522 Opcode: Byte; 5499 Proc: T Event;5523 Proc: TBaseEvent; 5500 5524 begin 5501 5525 InstructionAddress := PC; … … 5537 5561 begin 5538 5562 PC := 0; 5563 SP := 0; 5564 IX := 0; 5565 IY := 0; 5539 5566 AF.Value := 0; 5540 5567 BC.Value := 0; 5541 5568 DE.Value := 0; 5542 5569 HL.Value := 0; 5543 SP := 0;5544 5570 InterruptEnabled := True; 5545 5571 InterruptMode := 0; … … 5549 5575 constructor TCpuZ80.Create; 5550 5576 begin 5577 FRunning := False; 5578 FPaused := False; 5579 FEvent := TEvent.Create(nil, True, True, ''); 5551 5580 InitInstructions; 5552 5581 Reset; … … 5556 5585 begin 5557 5586 Running := False; 5587 FreeAndNil(FEvent); 5558 5588 inherited; 5559 5589 end; -
trunk/Z80/Z80Instructions.pas
r10 r14 4 4 5 5 uses 6 Classes, SysUtils ;6 Classes, SysUtils, Base; 7 7 8 8 type … … 708 708 ); 709 709 710 TEvent = procedure of object; 711 TInstructionMethods = array[TInstruction] of TEvent; 710 TInstructionMethods = array[TInstruction] of TBaseEvent; 712 711 713 712
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)