Ignore:
Timestamp:
Oct 25, 2023, 12:33:07 AM (7 months ago)
Author:
chronos
Message:
  • Added: Common package.
  • Modified: Improved BigInt class.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ByteArray/Cpu.pas

    r46 r47  
    77
    88type
    9   TBitWidth = Byte;
    10 
    119  TInstruction = (inNop, inHalt,
    1210    inLoadConst, inLoadConstSize,
     
    4947  private
    5048    Instructions: array[TInstruction] of TInstructionEvent;
    51     procedure Push(Value: TBigInt; Size: Byte);
    52     function Pop(Size: Byte): TBigInt;
     49    procedure Push(Value: TBigInt; Size: TBigIntSize);
     50    function Pop(Size: TBigIntSize): TBigInt;
    5351    procedure InstructionNop;
    5452    procedure InstructionHalt;
     
    9189    SP: TBigInt;
    9290    Terminated: Boolean;
    93     DataWidth: TBitWidth;
    94     AddressWidth: TBitWidth;
     91    DataWidth: TBigIntSize;
     92    AddressWidth: TBigIntSize;
    9593    Memory: TChannel;
    9694    IO: TChannel;
    97     function Read(Size: Byte): TBigInt;
     95    function Read(Size: TBigIntSize): TBigInt;
    9896    function ReadRegIndex: TRegIndex;
    99     procedure Write(Size: Byte; Value: TBigInt);
     97    procedure Write(Size: TBigIntSize; Value: TBigInt);
    10098    procedure WriteInstruction(Instruction: TInstruction);
    10199    procedure WriteRegister(Reg: TRegIndex);
     
    111109{ TCpu }
    112110
    113 procedure TCpu.Push(Value: TBigInt; Size: Byte);
     111procedure TCpu.Push(Value: TBigInt; Size: TBigIntSize);
    114112begin
    115113  SP := SP - Size;
     
    117115end;
    118116
    119 function TCpu.Pop(Size: Byte): TBigInt;
     117function TCpu.Pop(Size: TBigIntSize): TBigInt;
    120118begin
    121119  Result := Memory.Read(SP, Size);
     
    144142var
    145143  RegIndex: TRegIndex;
    146   DataSize: Byte;
    147 begin
    148   DataSize := Read(1);
     144  DataSize: TBigIntSize;
     145begin
     146  DataSize := Read(SizeOf(TBigIntSize));
    149147  RegIndex := ReadRegIndex;
    150148  Regs[RegIndex] := Read(DataSize);
     
    163161procedure TCpu.InstructionLoadSize;
    164162var
    165   DataSize: Byte;
     163  DataSize: TBigIntSize;
    166164  RegIndex: TRegIndex;
    167165  RegIndex2: TRegIndex;
    168166begin
    169   DataSize := Read(1);
     167  DataSize := Read(SizeOf(TBigIntSize));
    170168  RegIndex := ReadRegIndex;
    171169  RegIndex2 := ReadRegIndex;
     
    185183procedure TCpu.InstructionLoadMemSize;
    186184var
    187   DataSize: Byte;
    188   AddressSize: Byte;
    189   Address: TBigInt;
    190   RegIndex: TRegIndex;
    191 begin
    192   DataSize := Read(1);
    193   AddressSize := Read(1);
     185  DataSize: TBigIntSize;
     186  AddressSize: TBigIntSize;
     187  Address: TBigInt;
     188  RegIndex: TRegIndex;
     189begin
     190  DataSize := Read(SizeOf(TBigIntSize));
     191  AddressSize := Read(SizeOf(TBigIntSize));
    194192  RegIndex := ReadRegIndex;
    195193  Address := Read(AddressSize);
     
    209207procedure TCpu.InstructionStoreMemSize;
    210208var
    211   DataSize: Byte;
    212   AddressSize: Byte;
    213   Address: TBigInt;
    214   RegIndex: TRegIndex;
    215 begin
    216   DataSize := Read(1);
    217   AddressSize := Read(1);
     209  DataSize: TBigIntSize;
     210  AddressSize: TBigIntSize;
     211  Address: TBigInt;
     212  RegIndex: TRegIndex;
     213begin
     214  DataSize := Read(SizeOf(TBigIntSize));
     215  AddressSize := Read(SizeOf(TBigIntSize));
    218216  Address := Read(AddressSize);
    219217  RegIndex := ReadRegIndex;
     
    228226procedure TCpu.InstructionJumpSize;
    229227var
    230   AddressSize: Byte;
    231 begin
    232   AddressSize := Read(1);
     228  AddressSize: TBigIntSize;
     229begin
     230  AddressSize := Read(SizeOf(TBigIntSize));
    233231  PC := Read(AddressSize);
    234232end;
     
    249247  RegIndex: TRegIndex;
    250248  Address: TBigInt;
    251   DataSize: Byte;
    252   AddressSize: Byte;
    253 begin
    254   DataSize := Read(1);
    255   AddressSize := Read(1);
     249  DataSize: TBigIntSize;
     250  AddressSize: TBigIntSize;
     251begin
     252  DataSize := Read(SizeOf(TBigIntSize));
     253  AddressSize := Read(SizeOf(TBigIntSize));
    256254  RegIndex := ReadRegIndex;
    257255  Address := Read(AddressSize);
     
    275273  RegIndex: TRegIndex;
    276274  Address: TBigInt;
    277   DataSize: Byte;
    278   AddressSize: Byte;
    279 begin
    280   DataSize := Read(1);
    281   AddressSize := Read(1);
     275  DataSize: TBigIntSize;
     276  AddressSize: TBigIntSize;
     277begin
     278  DataSize := Read(SizeOf(TBigIntSize));
     279  AddressSize := Read(SizeOf(TBigIntSize));
    282280  RegIndex := ReadRegIndex;
    283281  Address := Read(AddressSize);
     
    293291procedure TCpu.InstructionJumpRelSize;
    294292var
    295   AddressSize: Byte;
    296 begin
    297   AddressSize := Read(1);
     293  AddressSize: TBigIntSize;
     294begin
     295  AddressSize := Read(SizeOf(TBigIntSize));
    298296  PC := PC + Read(AddressSize);
    299297end;
     
    307305procedure TCpu.InstructionCallSize;
    308306var
    309   AddressSize: Byte;
    310 begin
    311   AddressSize := Read(1);
     307  AddressSize: TBigIntSize;
     308begin
     309  AddressSize := Read(SizeOf(TBigIntSize));
    312310  Push(PC, AddressSize);
    313311  PC := Read(AddressSize);
     
    321319procedure TCpu.InstructionRetSize;
    322320var
    323   AddressSize: Byte;
    324 begin
    325   AddressSize := Read(1);
     321  AddressSize: TBigIntSize;
     322begin
     323  AddressSize := Read(SizeOf(TBigIntSize));
    326324  PC := Pop(AddressSize);
    327325end;
     
    337335procedure TCpu.InstructionPushSize;
    338336var
    339   DataSize: Byte;
    340   RegIndex: TRegIndex;
    341 begin
    342   DataSize := Read(1);
     337  DataSize: TBigIntSize;
     338  RegIndex: TRegIndex;
     339begin
     340  DataSize := Read(SizeOf(TBigIntSize));
    343341  RegIndex := ReadRegIndex;
    344342  Push(Regs[RegIndex], DataSize);
     
    355353procedure TCpu.InstructionPopSize;
    356354var
    357   DataSize: Byte;
    358   RegIndex: TRegIndex;
    359 begin
    360   DataSize := Read(1);
     355  DataSize: TBigIntSize;
     356  RegIndex: TRegIndex;
     357begin
     358  DataSize := Read(SizeOf(TBigIntSize));
    361359  RegIndex := ReadRegIndex;
    362360  Regs[RegIndex] := Pop(DataSize);
     
    377375  RegIndex: TRegIndex;
    378376  RegIndex2: TRegIndex;
    379   DataSize: Byte;
    380 begin
    381   DataSize := Read(1);
     377  DataSize: TBigIntSize;
     378begin
     379  DataSize := Read(SizeOf(TBigIntSize));
    382380  RegIndex := ReadRegIndex;
    383381  RegIndex2 := ReadRegIndex;
     
    399397  RegIndex: TRegIndex;
    400398  RegIndex2: TRegIndex;
    401   DataSize: Byte;
    402 begin
    403   DataSize := Read(1);
     399  DataSize: TBigIntSize;
     400begin
     401  DataSize := Read(SizeOf(TBigIntSize));
    404402  RegIndex := ReadRegIndex;
    405403  RegIndex2 := ReadRegIndex;
     
    418416var
    419417  RegIndex: TRegIndex;
    420   DataSize: Byte;
    421 begin
    422   DataSize := Read(1);
     418  DataSize: TBigIntSize;
     419begin
     420  DataSize := Read(SizeOf(TBigIntSize));
    423421  RegIndex := ReadRegIndex;
    424422  Regs[RegIndex] := Regs[RegIndex].Copy(DataSize) + 1;
     
    436434var
    437435  RegIndex: TRegIndex;
    438   DataSize: Byte;
    439 begin
    440   DataSize := Read(1);
     436  DataSize: TBigIntSize;
     437begin
     438  DataSize := Read(SizeOf(TBigIntSize));
    441439  RegIndex := ReadRegIndex;
    442440  Regs[RegIndex] := Regs[RegIndex].Copy(DataSize) - 1;
     
    481479end;
    482480
    483 function TCpu.Read(Size: Byte): TBigInt;
     481function TCpu.Read(Size: TBigIntSize): TBigInt;
    484482begin
    485483  Result := Memory.Read(PC, Size);
     
    492490end;
    493491
    494 procedure TCpu.Write(Size: Byte; Value: TBigInt);
     492procedure TCpu.Write(Size: TBigIntSize; Value: TBigInt);
    495493begin
    496494  Memory.Write(PC, Size, Value);
     
    517515    Regs[I] := 0;
    518516  PC := 0;
     517  SP := 0;
    519518  Terminated := False;
    520519end;
Note: See TracChangeset for help on using the changeset viewer.