Changeset 14 for trunk/Core.pas


Ignore:
Timestamp:
Apr 21, 2026, 3:52:53 PM (6 days ago)
Author:
chronos
Message:
  • Modified: Pausing CPU thread execution with event object instead of freeing thread object.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Core.pas

    r13 r14  
    8585{ TCore }
    8686
     87procedure TCore.AExitExecute(Sender: TObject);
     88begin
     89  Application.Terminate;
     90end;
     91
     92procedure TCore.AGoToAddressExecute(Sender: TObject);
     93var
     94  FormGoToAddress: TFormGoToAddress;
     95  Address: LongInt;
     96begin
     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;
     106end;
     107
     108procedure TCore.AInstructionSetGenExecute(Sender: TObject);
     109var
     110  InstructionSetGen: TInstructionSetGen;
     111begin
     112  InstructionSetGen := TInstructionSetGen.Create;
     113  InstructionSetGen.Generate('Z80/InstructionSet.html');
     114  InstructionSetGen.Free;
     115end;
     116
     117procedure TCore.APauseExecute(Sender: TObject);
     118begin
     119  SharpMz800.Cpu.Paused := True;
     120  UpdateInterface;
     121end;
     122
     123procedure TCore.AResetExecute(Sender: TObject);
     124var
     125  IsRunning: Boolean;
     126  IsPaused: Boolean;
     127begin
     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;
     137end;
     138
     139procedure TCore.ARunExecute(Sender: TObject);
     140begin
     141  SharpMz800.Cpu.Running := True;
     142  UpdateInterface;
     143end;
     144
     145procedure TCore.ARunToCursorExecute(Sender: TObject);
     146begin
     147  Debugger.DebugMode := dmStopAddress;
     148  Debugger.DebugStopAddress := FormDisassembler.GetCurrentAddress;
     149  Debugger.Cpu.Running := True;
     150  UpdateInterface;
     151end;
     152
     153procedure TCore.AStepInExecute(Sender: TObject);
     154begin
     155  Debugger.DebugMode := dmStepIn;
     156  Debugger.Cpu.Running := True;
     157  UpdateInterface;
     158end;
     159
     160procedure TCore.AStepOutExecute(Sender: TObject);
     161begin
     162  Debugger.DebugMode := dmStepOut;
     163  Debugger.Cpu.Running := True;
     164  UpdateInterface;
     165end;
     166
     167procedure TCore.AStepOverExecute(Sender: TObject);
     168begin
     169  Debugger.DebugMode := dmStepOver;
     170  Debugger.Cpu.Running := True;
     171  UpdateInterface;
     172end;
     173
     174procedure TCore.AStopExecute(Sender: TObject);
     175begin
     176  SharpMz800.Cpu.Running := False;
     177  UpdateInterface;
     178end;
     179
     180procedure TCore.AViewCallStackExecute(Sender: TObject);
     181begin
     182  if not Assigned(FormCallStack) then begin
     183    FormCallStack := TFormCallStack.Create(nil);
     184    FormCallStack.Debugger := Debugger;
     185  end;
     186  FormCallStack.Show;
     187end;
     188
     189procedure TCore.AViewCpuExecute(Sender: TObject);
     190begin
     191  if not Assigned(FormCpu) then begin
     192    FormCpu := TFormCpu.Create(nil);
     193    FormCpu.Cpu := SharpMz800.Cpu;
     194  end;
     195  FormCpu.Show;
     196end;
     197
     198procedure TCore.AViewDissssemblerExecute(Sender: TObject);
     199begin
     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));
     209end;
     210
     211procedure TCore.AViewMemoryExecute(Sender: TObject);
     212begin
     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;
     223end;
     224
     225procedure TCore.AViewMessagesExecute(Sender: TObject);
     226begin
     227  if not Assigned(FormMessages) then begin
     228    FormMessages := TFormMessages.Create(nil);
     229    SharpMz800.OnMessage := FormMessages.AddMessage;
     230  end;
     231  FormMessages.Show;
     232end;
     233
     234procedure TCore.AViewScreenExecute(Sender: TObject);
     235begin
     236  if not Assigned(FormScreen) then begin
     237    FormScreen := TFormScreen.Create(nil);
     238  end;
     239  FormScreen.Show;
     240end;
     241
    87242procedure TCore.DataModuleCreate(Sender: TObject);
    88243begin
     
    95250  Debugger.OnChange := DebuggerChange;
    96251  Debugger.Disassembler := Disassembler;
    97 //  SharpMz800.PowerOn;
    98252  FormMain := TFormMain.Create(nil);
    99253  FormMain.Show;
    100254end;
    101255
    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);
     256procedure TCore.DataModuleDestroy(Sender: TObject);
    133257begin
    134258  SharpMz800.Cpu.Running := False;
    135   UpdateInterface;
    136 end;
    137 
    138 procedure TCore.AResetExecute(Sender: TObject);
    139 var
    140   IsRunning: Boolean;
    141 begin
    142   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 begin
    151   SharpMz800.Cpu.Running := True;
    152   UpdateInterface;
    153 end;
    154 
    155 procedure TCore.ARunToCursorExecute(Sender: TObject);
    156 begin
    157   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 begin
    165   Debugger.DebugMode := dmStepIn;
    166   Debugger.Cpu.Running := True;
    167   UpdateInterface;
    168 end;
    169 
    170 procedure TCore.AStepOutExecute(Sender: TObject);
    171 begin
    172   Debugger.DebugMode := dmStepOut;
    173   Debugger.Cpu.Running := True;
    174   UpdateInterface;
    175 end;
    176 
    177 procedure TCore.AStepOverExecute(Sender: TObject);
    178 begin
    179   Debugger.DebugMode := dmStepOver;
    180   Debugger.Cpu.Running := True;
    181   UpdateInterface;
    182 end;
    183 
    184 procedure TCore.AStopExecute(Sender: TObject);
    185 begin
    186   SharpMz800.Cpu.Running := False;
    187   SharpMz800.Cpu.Reset;
    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;
    198 end;
    199 
    200 procedure TCore.AViewCpuExecute(Sender: TObject);
    201 begin
    202   if not Assigned(FormCpu) then begin
    203     FormCpu := TFormCpu.Create(nil);
    204     FormCpu.Cpu := SharpMz800.Cpu;
    205   end;
    206   FormCpu.Show;
    207 end;
    208 
    209 procedure TCore.AViewDissssemblerExecute(Sender: TObject);
    210 begin
    211   if not Assigned(FormDisassembler) then begin
    212     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 begin
    224   if not Assigned(FormMemory) then begin
    225     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 begin
    238   if not Assigned(FormMessages) then begin
    239     FormMessages := TFormMessages.Create(nil);
    240     SharpMz800.OnMessage := FormMessages.AddMessage;
    241   end;
    242   FormMessages.Show;
    243 end;
    244 
    245 procedure TCore.AViewScreenExecute(Sender: TObject);
    246 begin
    247   if not Assigned(FormScreen) then begin
    248     FormScreen := TFormScreen.Create(nil);
    249   end;
    250   FormScreen.Show;
    251 end;
    252 
    253 procedure TCore.DataModuleDestroy(Sender: TObject);
    254 begin
    255259  if Assigned(FormCpu) then FreeAndNil(FormCpu);
    256260  if Assigned(FormDisassembler) then FreeAndNil(FormDisassembler);
     
    292296procedure TCore.UpdateInterface;
    293297begin
    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);
    301305end;
    302306
Note: See TracChangeset for help on using the changeset viewer.