Changeset 9 for branches/ByteArray/Cpu.pas
- Timestamp:
- Aug 6, 2024, 10:31:16 PM (2 months ago)
- Location:
- branches/ByteArray
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ByteArray
-
Property svn:ignore
set to
lib
heaptrclog.trc
ByteArray
ByteArray.dbg
ByteArray.lps
ByteArray.res
-
Property svn:ignore
set to
-
branches/ByteArray/Cpu.pas
r5 r9 4 4 5 5 uses 6 Classes, SysUtils, BigInt, Channel;6 Classes, SysUtils, Int, Channel; 7 7 8 8 type … … 54 54 FInstructions: array[TInstruction] of TInstructionEvent; 55 55 FTicks: QWord; 56 procedure Push(Value: T BigInt; Size: TBigIntSize);57 function Pop(Size: T BigIntSize): TBigInt;56 procedure Push(Value: TInt; Size: TIntSize); 57 function Pop(Size: TIntSize): TInt; 58 58 procedure InstructionNop; 59 59 procedure InstructionHalt; … … 109 109 procedure Step; 110 110 public 111 Regs: array[TRegIndex] of T BigInt;112 PC: T BigInt;113 SP: T BigInt;114 DataWidth: T BigIntSize;115 AddressWidth: T BigIntSize;111 Regs: array[TRegIndex] of TInt; 112 PC: TInt; 113 SP: TInt; 114 DataWidth: TIntSize; 115 AddressWidth: TIntSize; 116 116 Memory: TChannel; 117 117 IO: TChannel; 118 function Read(Size: T BigIntSize): TBigInt;119 function ReadSize: T BigIntSize;118 function Read(Size: TIntSize): TInt; 119 function ReadSize: TIntSize; 120 120 function ReadRegIndex: TRegIndex; 121 procedure Write(Size: T BigIntSize; Value: TBigInt);121 procedure Write(Size: TIntSize; Value: TInt); 122 122 procedure WriteInstruction(Instruction: TInstruction); 123 123 procedure WriteRegister(Reg: TRegIndex); … … 155 155 { TCpu } 156 156 157 procedure TCpu.Push(Value: T BigInt; Size: TBigIntSize);157 procedure TCpu.Push(Value: TInt; Size: TIntSize); 158 158 begin 159 159 SP := SP - Size; … … 161 161 end; 162 162 163 function TCpu.Pop(Size: T BigIntSize): TBigInt;163 function TCpu.Pop(Size: TIntSize): TInt; 164 164 begin 165 165 Result := Memory.Read(SP, Size); … … 188 188 var 189 189 RegIndex: TRegIndex; 190 DataSize: T BigIntSize;190 DataSize: TIntSize; 191 191 begin 192 192 DataSize := ReadSize; … … 207 207 procedure TCpu.InstructionLoadSize; 208 208 var 209 DataSize: T BigIntSize;210 RegIndex: TRegIndex; 211 RegIndex2: TRegIndex; 212 begin 213 DataSize := ReadSize; 214 RegIndex := ReadRegIndex; 215 RegIndex2 := ReadRegIndex; 216 Regs[RegIndex] := Regs[RegIndex2].Copy(DataSize);209 DataSize: TIntSize; 210 RegIndex: TRegIndex; 211 RegIndex2: TRegIndex; 212 begin 213 DataSize := ReadSize; 214 RegIndex := ReadRegIndex; 215 RegIndex2 := ReadRegIndex; 216 Regs[RegIndex] := LimitSize(Regs[RegIndex2], DataSize); 217 217 end; 218 218 … … 229 229 procedure TCpu.InstructionLoadMemSize; 230 230 var 231 DataSize: T BigIntSize;231 DataSize: TIntSize; 232 232 RegIndex1: TRegIndex; 233 233 RegIndex2: TRegIndex; … … 251 251 procedure TCpu.InstructionStoreMemSize; 252 252 var 253 DataSize: T BigIntSize;253 DataSize: TIntSize; 254 254 RegIndex1: TRegIndex; 255 255 RegIndex2: TRegIndex; … … 265 265 RegIndex1: TRegIndex; 266 266 RegIndex2: TRegIndex; 267 RelativeAddress: T BigInt;267 RelativeAddress: TInt; 268 268 begin 269 269 RegIndex1 := ReadRegIndex; … … 275 275 procedure TCpu.InstructionLoadMemIndexSize; 276 276 var 277 DataSize: T BigIntSize;277 DataSize: TIntSize; 278 278 RegIndex1: TRegIndex; 279 279 RegIndex2: TRegIndex; 280 RelativeAddress: T BigInt;280 RelativeAddress: TInt; 281 281 begin 282 282 DataSize := ReadSize; … … 291 291 RegIndex1: TRegIndex; 292 292 RegIndex2: TRegIndex; 293 RelativeAddress: T BigInt;293 RelativeAddress: TInt; 294 294 begin 295 295 RegIndex1 := ReadRegIndex; … … 301 301 procedure TCpu.InstructionStoreMemIndexSize; 302 302 var 303 DataSize: T BigIntSize;303 DataSize: TIntSize; 304 304 RegIndex1: TRegIndex; 305 305 RegIndex2: TRegIndex; 306 RelativeAddress: T BigInt;306 RelativeAddress: TInt; 307 307 begin 308 308 DataSize := ReadSize; … … 320 320 procedure TCpu.InstructionJumpSize; 321 321 var 322 AddressSize: T BigIntSize;323 begin 324 AddressSize := Read(SizeOf(T BigIntSize));322 AddressSize: TIntSize; 323 begin 324 AddressSize := Read(SizeOf(TIntSize)); 325 325 PC := Read(AddressSize); 326 326 end; … … 329 329 var 330 330 RegIndex: TRegIndex; 331 Address: T BigInt;331 Address: TInt; 332 332 begin 333 333 RegIndex := ReadRegIndex; … … 340 340 var 341 341 RegIndex: TRegIndex; 342 Address: T BigInt;343 DataSize: T BigIntSize;344 AddressSize: T BigIntSize;345 begin 346 DataSize := ReadSize; 347 AddressSize := Read(SizeOf(T BigIntSize));342 Address: TInt; 343 DataSize: TIntSize; 344 AddressSize: TIntSize; 345 begin 346 DataSize := ReadSize; 347 AddressSize := Read(SizeOf(TIntSize)); 348 348 RegIndex := ReadRegIndex; 349 349 Address := Read(AddressSize); 350 if Regs[RegIndex].Copy(DataSize) <> 0 then350 if LimitSize(Regs[RegIndex], DataSize) <> 0 then 351 351 PC := Address; 352 352 end; … … 355 355 var 356 356 RegIndex: TRegIndex; 357 Address: T BigInt;357 Address: TInt; 358 358 begin 359 359 RegIndex := ReadRegIndex; … … 366 366 var 367 367 RegIndex: TRegIndex; 368 Address: T BigInt;369 DataSize: T BigIntSize;370 AddressSize: T BigIntSize;371 begin 372 DataSize := ReadSize; 373 AddressSize := Read(SizeOf(T BigIntSize));368 Address: TInt; 369 DataSize: TIntSize; 370 AddressSize: TIntSize; 371 begin 372 DataSize := ReadSize; 373 AddressSize := Read(SizeOf(TIntSize)); 374 374 RegIndex := ReadRegIndex; 375 375 Address := Read(AddressSize); 376 if Regs[RegIndex].Copy(DataSize) = 0 then376 if LimitSize(Regs[RegIndex], DataSize) = 0 then 377 377 PC := Address; 378 378 end; … … 385 385 procedure TCpu.InstructionJumpRelSize; 386 386 var 387 AddressSize: T BigIntSize;387 AddressSize: TIntSize; 388 388 begin 389 389 AddressSize := ReadSize; … … 399 399 procedure TCpu.InstructionCallSize; 400 400 var 401 AddressSize: T BigIntSize;401 AddressSize: TIntSize; 402 402 begin 403 403 AddressSize := ReadSize; … … 413 413 procedure TCpu.InstructionRetSize; 414 414 var 415 AddressSize: T BigIntSize;415 AddressSize: TIntSize; 416 416 begin 417 417 AddressSize := ReadSize; … … 429 429 procedure TCpu.InstructionPushSize; 430 430 var 431 DataSize: T BigIntSize;431 DataSize: TIntSize; 432 432 RegIndex: TRegIndex; 433 433 begin … … 447 447 procedure TCpu.InstructionPopSize; 448 448 var 449 DataSize: T BigIntSize;449 DataSize: TIntSize; 450 450 RegIndex: TRegIndex; 451 451 begin … … 469 469 RegIndex: TRegIndex; 470 470 RegIndex2: TRegIndex; 471 DataSize: T BigIntSize;471 DataSize: TIntSize; 472 472 begin 473 473 DataSize := ReadSize; … … 491 491 RegIndex: TRegIndex; 492 492 RegIndex2: TRegIndex; 493 DataSize: T BigIntSize;493 DataSize: TIntSize; 494 494 begin 495 495 DataSize := ReadSize; … … 510 510 var 511 511 RegIndex: TRegIndex; 512 DataSize: T BigIntSize;513 begin 514 DataSize := ReadSize; 515 RegIndex := ReadRegIndex; 516 Regs[RegIndex] := Regs[RegIndex].Copy(DataSize) + 1;512 DataSize: TIntSize; 513 begin 514 DataSize := ReadSize; 515 RegIndex := ReadRegIndex; 516 Regs[RegIndex] := LimitSize(Regs[RegIndex], DataSize) + 1; 517 517 end; 518 518 … … 528 528 var 529 529 RegIndex: TRegIndex; 530 DataSize: T BigIntSize;531 begin 532 DataSize := ReadSize; 533 RegIndex := ReadRegIndex; 534 Regs[RegIndex] := Regs[RegIndex].Copy(DataSize) - 1;530 DataSize: TIntSize; 531 begin 532 DataSize := ReadSize; 533 RegIndex := ReadRegIndex; 534 Regs[RegIndex] := LimitSize(Regs[RegIndex], DataSize) - 1; 535 535 end; 536 536 … … 547 547 procedure TCpu.InstructionXorSize; 548 548 var 549 DataSize: T BigIntSize;550 RegIndex: TRegIndex; 551 RegIndex2: TRegIndex; 552 begin 553 DataSize := ReadSize; 554 RegIndex := ReadRegIndex; 555 RegIndex2 := ReadRegIndex; 556 Regs[RegIndex] := Regs[RegIndex].Copy(DataSize) xor Regs[RegIndex2].Copy(DataSize);549 DataSize: TIntSize; 550 RegIndex: TRegIndex; 551 RegIndex2: TRegIndex; 552 begin 553 DataSize := ReadSize; 554 RegIndex := ReadRegIndex; 555 RegIndex2 := ReadRegIndex; 556 Regs[RegIndex] := LimitSize(Regs[RegIndex] xor Regs[RegIndex2], DataSize); 557 557 end; 558 558 … … 569 569 procedure TCpu.InstructionAndSize; 570 570 var 571 DataSize: T BigIntSize;572 RegIndex: TRegIndex; 573 RegIndex2: TRegIndex; 574 begin 575 DataSize := ReadSize; 576 RegIndex := ReadRegIndex; 577 RegIndex2 := ReadRegIndex; 578 Regs[RegIndex] := Regs[RegIndex].Copy(DataSize) and Regs[RegIndex2].Copy(DataSize);571 DataSize: TIntSize; 572 RegIndex: TRegIndex; 573 RegIndex2: TRegIndex; 574 begin 575 DataSize := ReadSize; 576 RegIndex := ReadRegIndex; 577 RegIndex2 := ReadRegIndex; 578 Regs[RegIndex] := LimitSize(Regs[RegIndex] and Regs[RegIndex2], DataSize); 579 579 end; 580 580 … … 591 591 procedure TCpu.InstructionOrSize; 592 592 var 593 DataSize: T BigIntSize;594 RegIndex: TRegIndex; 595 RegIndex2: TRegIndex; 596 begin 597 DataSize := ReadSize; 598 RegIndex := ReadRegIndex; 599 RegIndex2 := ReadRegIndex; 600 Regs[RegIndex] := Regs[RegIndex].Copy(DataSize) or Regs[RegIndex2].Copy(DataSize);593 DataSize: TIntSize; 594 RegIndex: TRegIndex; 595 RegIndex2: TRegIndex; 596 begin 597 DataSize := ReadSize; 598 RegIndex := ReadRegIndex; 599 RegIndex2 := ReadRegIndex; 600 Regs[RegIndex] := LimitSize(Regs[RegIndex] or Regs[RegIndex2], DataSize); 601 601 end; 602 602 … … 613 613 procedure TCpu.InstructionAddSize; 614 614 var 615 DataSize: T BigIntSize;616 RegIndex: TRegIndex; 617 RegIndex2: TRegIndex; 618 begin 619 DataSize := ReadSize; 620 RegIndex := ReadRegIndex; 621 RegIndex2 := ReadRegIndex; 622 Regs[RegIndex] := Regs[RegIndex].Copy(DataSize) + Regs[RegIndex2].Copy(DataSize);615 DataSize: TIntSize; 616 RegIndex: TRegIndex; 617 RegIndex2: TRegIndex; 618 begin 619 DataSize := ReadSize; 620 RegIndex := ReadRegIndex; 621 RegIndex2 := ReadRegIndex; 622 Regs[RegIndex] := LimitSize(Regs[RegIndex] + Regs[RegIndex2], DataSize); 623 623 end; 624 624 … … 635 635 procedure TCpu.InstructionSubSize; 636 636 var 637 DataSize: T BigIntSize;638 RegIndex: TRegIndex; 639 RegIndex2: TRegIndex; 640 begin 641 DataSize := ReadSize; 642 RegIndex := ReadRegIndex; 643 RegIndex2 := ReadRegIndex; 644 Regs[RegIndex] := Regs[RegIndex].Copy(DataSize) + Regs[RegIndex2].Copy(DataSize);637 DataSize: TIntSize; 638 RegIndex: TRegIndex; 639 RegIndex2: TRegIndex; 640 begin 641 DataSize := ReadSize; 642 RegIndex := ReadRegIndex; 643 RegIndex2 := ReadRegIndex; 644 Regs[RegIndex] := LimitSize(Regs[RegIndex] + Regs[RegIndex2], DataSize); 645 645 end; 646 646 … … 704 704 end; 705 705 706 function TCpu.Read(Size: T BigIntSize): TBigInt;706 function TCpu.Read(Size: TIntSize): TInt; 707 707 begin 708 708 Result := Memory.Read(PC, Size); … … 710 710 end; 711 711 712 function TCpu.ReadSize: T BigIntSize;713 begin 714 Result := Read(SizeOf(T BigIntSize));712 function TCpu.ReadSize: TIntSize; 713 begin 714 Result := Read(SizeOf(TIntSize)); 715 715 end; 716 716 … … 720 720 end; 721 721 722 procedure TCpu.Write(Size: T BigIntSize; Value: TBigInt);722 procedure TCpu.Write(Size: TIntSize; Value: TInt); 723 723 begin 724 724 Memory.Write(PC, Size, Value);
Note:
See TracChangeset
for help on using the changeset viewer.