Changeset 96 for trunk/UBFTarget.pas


Ignore:
Timestamp:
Aug 2, 2018, 10:41:11 AM (6 years ago)
Author:
chronos
Message:
  • Added: Theming support.
  • Modified: Items in Options dialog divided to two pages.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UBFTarget.pas

    r91 r96  
    1212  TMachineCommand = (cmNoOperation, cmInc, cmDec, cmPointerInc, cmPointerDec,
    1313    cmOutput, cmInput, cmLoopStart, cmLoopEnd, cmDebug, cmSet, cmMultipy);
     14
     15  { TMachineOperation }
    1416
    1517  TMachineOperation = record
     
    1719    Parameter: Integer;
    1820    RelIndex: Integer;
     21    function Create(Command: TMachineCommand; Parameter, RelIndex: Integer): TMachineOperation;
    1922  end;
    2023
     
    5558implementation
    5659
     60{ TMachineOperation }
     61
     62function TMachineOperation.Create(Command: TMachineCommand; Parameter,
     63  RelIndex: Integer): TMachineOperation;
     64begin
     65  Result.Command := Command;
     66  Result.Parameter := Parameter;
     67  Result.RelIndex := RelIndex;
     68end;
     69
    5770function TBFTarget.CheckClear: Boolean;
    5871begin
     
    108121        NewProgram[NewProgramIndex].Parameter := CheckOccurenceSumParam(cmDec);
    109122      end;
    110       else begin
    111         NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    112         NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    113       end;
     123      else NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    114124    end;
    115125    DebugSteps.UpdateTargetPos(FProgramIndex, NewProgramIndex);
     
    234244          NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    235245        end else begin
    236           NewProgram[NewProgramIndex].Command := cmSet;
    237           NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
     246          NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    238247        end;
    239248      end;
    240249      cmLoopStart: begin
    241250        if CheckClear then begin
    242           NewProgram[NewProgramIndex].Command := cmSet;
    243           NewProgram[NewProgramIndex].Parameter := 0;
     251          NewProgram[NewProgramIndex] := TMachineOperation.Create(cmSet, 0, 0);
    244252          Inc(FProgramIndex, 2);
    245253        end else begin
    246           NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    247           NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    248         end;
    249       end;
    250       else begin
    251         NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    252         NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    253       end;
     254          NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
     255        end;
     256      end;
     257      else NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    254258    end;
    255259    PreviousCommand := FProgram[FProgramIndex].Command;
     
    294298      end;
    295299      cmInc, cmDec, cmInput, cmOutput, cmSet: begin
    296         NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    297         NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    298         NewProgram[NewProgramIndex].RelIndex := RelIndex;
     300        NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
     301        NewProgram[NewProgramIndex].RelIndex :=
     302          NewProgram[NewProgramIndex].RelIndex + RelIndex;
    299303      end;
    300304      cmLoopStart, cmLoopEnd: begin
    301305        if RelIndex > 0 then begin
    302           NewProgram[NewProgramIndex].Command := cmPointerInc;
    303           NewProgram[NewProgramIndex].Parameter := RelIndex;
    304           NewProgram[NewProgramIndex].RelIndex := 0;
     306          NewProgram[NewProgramIndex] := TMachineOperation.Create(cmPointerInc,
     307            RelIndex, 0);
    305308          Inc(NewProgramIndex);
    306309          RelIndex := 0;
    307310        end else
    308311        if RelIndex < 0 then begin
    309           NewProgram[NewProgramIndex].Command := cmPointerDec;
    310           NewProgram[NewProgramIndex].Parameter := Abs(RelIndex);
    311           NewProgram[NewProgramIndex].RelIndex := 0;
     312          NewProgram[NewProgramIndex] := TMachineOperation.Create(cmPointerDec,
     313            Abs(RelIndex), 0);
    312314          Inc(NewProgramIndex);
    313315          RelIndex := 0;
    314316        end;
    315         NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    316         NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    317         NewProgram[NewProgramIndex].RelIndex := 0;
    318       end;
     317        NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
     318      end;
     319      else raise Exception.Create(Format('Unsupported command %d', [FProgram[FProgramIndex].Command]));
    319320    end;
    320321    DebugSteps.UpdateTargetPos(FProgramIndex, NewProgramIndex);
     
    351352      cmPointerInc: begin
    352353        PointerChange := PointerChange + FProgram[FProgramIndex].Parameter;
    353         NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    354         NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    355         NewProgram[NewProgramIndex].RelIndex := FProgram[FProgramIndex].RelIndex;
     354        NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    356355      end;
    357356      cmPointerDec: begin
    358357        PointerChange := PointerChange - FProgram[FProgramIndex].Parameter;
    359         NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    360         NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    361         NewProgram[NewProgramIndex].RelIndex := FProgram[FProgramIndex].RelIndex;
     358        NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    362359      end;
    363360      cmInc: begin
    364361        if not ProcessLoop then begin
    365           NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    366           NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    367           NewProgram[NewProgramIndex].RelIndex := FProgram[FProgramIndex].RelIndex;
     362          NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    368363        end else begin
    369364          if ((FProgram[FProgramIndex].RelIndex + PointerChange) <> 0) then begin
     365            NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    370366            NewProgram[NewProgramIndex].Command := cmMultipy;
    371             NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    372             NewProgram[NewProgramIndex].RelIndex := FProgram[FProgramIndex].RelIndex;
    373367          end else Dec(NewProgramIndex);
    374368        end;
     
    379373            (FProgram[FProgramIndex].Parameter = 1) then
    380374            Inc(NumberOfBaseDecrement);
    381           NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    382           NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    383           NewProgram[NewProgramIndex].RelIndex := FProgram[FProgramIndex].RelIndex;
     375          NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    384376        end else begin
    385377          if ((FProgram[FProgramIndex].RelIndex + PointerChange) <> 0) then begin
     378            NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    386379            NewProgram[NewProgramIndex].Command := cmMultipy;
    387380            NewProgram[NewProgramIndex].Parameter := -FProgram[FProgramIndex].Parameter;
    388             NewProgram[NewProgramIndex].RelIndex := FProgram[FProgramIndex].RelIndex;
    389381          end else Dec(NewProgramIndex);
    390382        end;
    391383      end;
    392384      cmInput, cmOutput: begin
    393         NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    394         NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    395         NewProgram[NewProgramIndex].RelIndex := FProgram[FProgramIndex].RelIndex;
     385        NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    396386        Inc(NumberOfBaseDecrement, 2);
    397387      end;
    398388      cmSet: begin
    399         NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    400         NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    401         NewProgram[NewProgramIndex].RelIndex := FProgram[FProgramIndex].RelIndex;
     389        NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    402390        Inc(NumberOfBaseDecrement, 2);
    403391      end;
     
    408396          LoopStartIndex := FProgramIndex;
    409397          LoopStartIndexNew := NewProgramIndex;
    410           NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    411           NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    412           NewProgram[NewProgramIndex].RelIndex := FProgram[FProgramIndex].RelIndex;
     398          NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    413399        end else begin
    414400          Dec(NewProgramIndex);
     
    422408            ProcessLoop := True;
    423409          end else begin
    424             NewProgram[NewProgramIndex].Command := FProgram[FProgramIndex].Command;
    425             NewProgram[NewProgramIndex].Parameter := FProgram[FProgramIndex].Parameter;
    426             NewProgram[NewProgramIndex].RelIndex := FProgram[FProgramIndex].RelIndex;
     410            NewProgram[NewProgramIndex] := FProgram[FProgramIndex];
    427411          end;
    428412        end else begin
    429           NewProgram[NewProgramIndex].Command := cmSet;
    430           NewProgram[NewProgramIndex].Parameter := 0;
    431           NewProgram[NewProgramIndex].RelIndex := 0;
     413          NewProgram[NewProgramIndex] := TMachineOperation.Create(cmSet, 0, 0);
    432414          ProcessLoop := False;
    433415          NumberOfBaseDecrement := 0;
    434416        end;
    435417      end;
     418      else raise Exception.Create(Format('Unsupported command %d', [FProgram[FProgramIndex].Command]));
    436419    end;
    437420    DebugSteps.UpdateTargetPos(FProgramIndex, NewProgramIndex);
     
    458441    case FSourceCode[I] of
    459442      '+': begin
    460         FProgram[FProgramIndex].Command := cmInc;
    461         FProgram[FProgramIndex].Parameter := 1;
    462         FProgram[FProgramIndex].RelIndex := 0;
     443        FProgram[FProgramIndex] := TMachineOperation.Create(cmInc, 1, 0);
    463444        DebugSteps.AddStep(I - 1, FProgramIndex, soNormal);
    464445      end;
    465446      '-': begin
    466         FProgram[FProgramIndex].Command := cmDec;
    467         FProgram[FProgramIndex].Parameter := 1;
    468         FProgram[FProgramIndex].RelIndex := 0;
     447        FProgram[FProgramIndex] := TMachineOperation.Create(cmDec, 1, 0);
    469448        DebugSteps.AddStep(I - 1, FProgramIndex, soNormal);
    470449      end;
    471450      '>': begin
    472         FProgram[FProgramIndex].Command := cmPointerInc;
    473         FProgram[FProgramIndex].Parameter := 1;
    474         FProgram[FProgramIndex].RelIndex := 0;
     451        FProgram[FProgramIndex] := TMachineOperation.Create(cmPointerInc, 1, 0);
    475452        DebugSteps.AddStep(I - 1, FProgramIndex, soNormal);
    476453      end;
    477454      '<': begin
    478         FProgram[FProgramIndex].Command := cmPointerDec;
    479         FProgram[FProgramIndex].Parameter := 1;
    480         FProgram[FProgramIndex].RelIndex := 0;
     455        FProgram[FProgramIndex] := TMachineOperation.Create(cmPointerDec, 1, 0);
    481456        DebugSteps.AddStep(I - 1, FProgramIndex, soNormal);
    482457      end;
    483458      ',': begin
    484         FProgram[FProgramIndex].Command := cmInput;
    485         FProgram[FProgramIndex].Parameter := 0;
    486         FProgram[FProgramIndex].RelIndex := 0;
     459        FProgram[FProgramIndex] := TMachineOperation.Create(cmInput, 0, 0);
    487460        DebugSteps.AddStep(I - 1, FProgramIndex, soNormal);
    488461      end;
    489462      '.': begin
    490         FProgram[FProgramIndex].Command := cmOutput;
    491         FProgram[FProgramIndex].Parameter := 0;
    492         FProgram[FProgramIndex].RelIndex := 0;
     463        FProgram[FProgramIndex] := TMachineOperation.Create(cmOutput, 0, 0);
    493464        DebugSteps.AddStep(I - 1, FProgramIndex, soNormal);
    494465      end;
    495466      '[': begin
    496         FProgram[FProgramIndex].Command := cmLoopStart;
    497         FProgram[FProgramIndex].Parameter := 0;
    498         FProgram[FProgramIndex].RelIndex := 0;
     467        FProgram[FProgramIndex] := TMachineOperation.Create(cmLoopStart, 0, 0);
    499468        DebugSteps.AddStep(I - 1, FProgramIndex, soStepIn);
    500469      end;
    501470      ']': begin
    502         FProgram[FProgramIndex].Command := cmLoopEnd;
    503         FProgram[FProgramIndex].Parameter := 0;
    504         FProgram[FProgramIndex].RelIndex := 0;
     471        FProgram[FProgramIndex] := TMachineOperation.Create(cmLoopEnd, 0 ,0);
    505472        DebugSteps.AddStep(I - 1, FProgramIndex, soStepOut);
    506473      end
Note: See TracChangeset for help on using the changeset viewer.