Ignore:
Timestamp:
Feb 19, 2012, 9:44:58 AM (13 years ago)
Author:
chronos
Message:
  • Modified: Redone brakepoint system for system stepping breakpoints. Now system breakpoint are managed using BreakPoints filed in TTarget.
  • Added: Program can be started using Step in, Step over and Run to cursor actions.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Target/UTargetInterpretter.pas

    r35 r36  
    3434    function GetMemorySize: Integer;
    3535    procedure SetMemorySize(AValue: Integer);
    36     procedure SetState(AValue: TRunState);
    3736    procedure SetThread(State: Boolean);
    3837    procedure PrepareJumpTable;
     
    4847    procedure PrepareBreakPoints;
    4948  protected
     49    procedure SetState(AValue: TRunState); override;
    5050    function GetTargetCode: string; override;
    5151    function GetExecutionPosition: Integer; override;
     
    9393  SJumpTableColision = 'Jump table colision';
    9494  SMemoryCellOutOfRange = 'Memory cell %s value out of range';
     95  SProgramNotRunning = 'Program not running';
    9596
    9697{ TTargetInterpretterThread }
     
    104105        if FProgramBreakpoints[SourcePosition] then begin
    105106          FProgramBreakpoints[SourcePosition] := False;
    106           SetState(rsPaused);
     107          State := rsPaused;
    107108        end else begin
    108109          FCommandTable[FProgram[SourcePosition]];
     
    113114      if State = rsPaused then Sleep(1);
    114115    end;
    115     SetState(rsStopped);
     116    State := rsStopped;
    116117  until Terminated or (State = rsStopped);
    117118end;
     
    295296    Memory[I] := 0;
    296297  FStepCount := 0;
     298  PrepareBreakPoints;
    297299end;
    298300
     
    305307    FProgramBreakpoints[I] := False;
    306308  for I := 0 to BreakPoints.Count - 1 do
    307     FProgramBreakpoints[BreakPoints[I]] := True;
     309    FProgramBreakpoints[TBreakPoint(BreakPoints[I]).TargetAddress] := True;
    308310end;
    309311
     
    324326procedure TTargetInterpretter.Run;
    325327begin
    326   SetState(rsRunning);
    327   Reset;
    328   PrepareBreakPoints;
     328  if FState = rsStopped then begin
     329    Reset;
     330    SetThread(True);
     331    State := rsRunning;
     332  end else State := rsRunning;
     333end;
     334
     335procedure TTargetInterpretter.Pause;
     336begin
     337  if State = rsRunning then State := rsPaused;
     338end;
     339
     340procedure TTargetInterpretter.Stop;
     341begin
     342  State := rsStopped;
    329343  SetThread(False);
    330   SetThread(True);
    331 end;
    332 
    333 procedure TTargetInterpretter.Pause;
    334 begin
    335   if State = rsRunning then SetState(rsPaused);
    336 end;
    337 
    338 procedure TTargetInterpretter.Stop;
    339 begin
    340   SetState(rsStopped);
    341344end;
    342345
     
    345348  Step: TDebugStep;
    346349begin
    347   Step := DebugSteps.SearchByTargetPos(SourcePosition);
    348   FProgramBreakpoints[Step.TargetPosition + 1] := True;
     350  if State = rsPaused then begin
     351    Step := DebugSteps.SearchByTargetPos(SourcePosition);
     352    BreakPoints.SetSystem(Step.TargetPosition + 1);
     353    Run;
     354  end else raise Exception.Create(SProgramNotRunning);
    349355end;
    350356
     
    352358var
    353359  Step: TDebugStep;
    354 begin
     360  StepIndex: Integer;
     361  Nesting: Integer;
     362begin
     363  if State = rsPaused then begin
     364    Step := DebugSteps.SearchByTargetPos(SourcePosition);
     365    if Step.Operation = soStepIn then begin
     366      StepIndex := DebugSteps.IndexOf(Step);
     367      Inc(StepIndex);
     368      Nesting := 1;
     369      while (StepIndex < DebugSteps.Count) and (Nesting > 0) do begin
     370        if TDebugStep(DebugSteps[StepIndex]).Operation <> soStepOut then Dec(Nesting);
     371        if TDebugStep(DebugSteps[StepIndex]).Operation <> soStepIn then Inc(Nesting);
     372        Inc(StepIndex);
     373      end;
     374      BreakPoints.SetSystem(TDebugStep(DebugSteps[StepIndex]).TargetPosition);
     375    end else BreakPoints.SetSystem(Step.TargetPosition + 1);
     376    Run;
     377  end else raise Exception.Create(SProgramNotRunning);
    355378end;
    356379
    357380procedure TTargetInterpretter.StepOut;
    358 begin
    359   inherited StepOut;
     381var
     382  Step: TDebugStep;
     383  StepIndex: Integer;
     384begin
     385  if State = rsPaused then begin
     386    Step := DebugSteps.SearchByTargetPos(SourcePosition);
     387    StepIndex := DebugSteps.IndexOf(Step);
     388    while (StepIndex < DebugSteps.Count) and (TDebugStep(DebugSteps[StepIndex]).Operation <> soStepOut) do Inc(StepIndex);
     389    if StepIndex < DebugSteps.Count then begin
     390      Breakpoints.SetSystem(TDebugStep(DebugSteps[StepIndex]).TargetPosition);
     391      Run;
     392    end;
     393  end else raise Exception.Create(SProgramNotRunning);
    360394end;
    361395
    362396procedure TTargetInterpretter.RunToCursor(Pos: Integer);
    363397begin
    364   FProgramBreakpoints[Pos] := True;
     398  Breakpoints.SetSystem(Pos);
     399  Run;
    365400end;
    366401
Note: See TracChangeset for help on using the changeset viewer.