Changeset 47 for branches/ByteArray/Cpu.pas
- Timestamp:
- Oct 25, 2023, 12:33:07 AM (7 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ByteArray/Cpu.pas
r46 r47 7 7 8 8 type 9 TBitWidth = Byte;10 11 9 TInstruction = (inNop, inHalt, 12 10 inLoadConst, inLoadConstSize, … … 49 47 private 50 48 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; 53 51 procedure InstructionNop; 54 52 procedure InstructionHalt; … … 91 89 SP: TBigInt; 92 90 Terminated: Boolean; 93 DataWidth: TBi tWidth;94 AddressWidth: TBi tWidth;91 DataWidth: TBigIntSize; 92 AddressWidth: TBigIntSize; 95 93 Memory: TChannel; 96 94 IO: TChannel; 97 function Read(Size: Byte): TBigInt;95 function Read(Size: TBigIntSize): TBigInt; 98 96 function ReadRegIndex: TRegIndex; 99 procedure Write(Size: Byte; Value: TBigInt);97 procedure Write(Size: TBigIntSize; Value: TBigInt); 100 98 procedure WriteInstruction(Instruction: TInstruction); 101 99 procedure WriteRegister(Reg: TRegIndex); … … 111 109 { TCpu } 112 110 113 procedure TCpu.Push(Value: TBigInt; Size: Byte);111 procedure TCpu.Push(Value: TBigInt; Size: TBigIntSize); 114 112 begin 115 113 SP := SP - Size; … … 117 115 end; 118 116 119 function TCpu.Pop(Size: Byte): TBigInt;117 function TCpu.Pop(Size: TBigIntSize): TBigInt; 120 118 begin 121 119 Result := Memory.Read(SP, Size); … … 144 142 var 145 143 RegIndex: TRegIndex; 146 DataSize: Byte;147 begin 148 DataSize := Read( 1);144 DataSize: TBigIntSize; 145 begin 146 DataSize := Read(SizeOf(TBigIntSize)); 149 147 RegIndex := ReadRegIndex; 150 148 Regs[RegIndex] := Read(DataSize); … … 163 161 procedure TCpu.InstructionLoadSize; 164 162 var 165 DataSize: Byte;163 DataSize: TBigIntSize; 166 164 RegIndex: TRegIndex; 167 165 RegIndex2: TRegIndex; 168 166 begin 169 DataSize := Read( 1);167 DataSize := Read(SizeOf(TBigIntSize)); 170 168 RegIndex := ReadRegIndex; 171 169 RegIndex2 := ReadRegIndex; … … 185 183 procedure TCpu.InstructionLoadMemSize; 186 184 var 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; 189 begin 190 DataSize := Read(SizeOf(TBigIntSize)); 191 AddressSize := Read(SizeOf(TBigIntSize)); 194 192 RegIndex := ReadRegIndex; 195 193 Address := Read(AddressSize); … … 209 207 procedure TCpu.InstructionStoreMemSize; 210 208 var 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; 213 begin 214 DataSize := Read(SizeOf(TBigIntSize)); 215 AddressSize := Read(SizeOf(TBigIntSize)); 218 216 Address := Read(AddressSize); 219 217 RegIndex := ReadRegIndex; … … 228 226 procedure TCpu.InstructionJumpSize; 229 227 var 230 AddressSize: Byte;231 begin 232 AddressSize := Read( 1);228 AddressSize: TBigIntSize; 229 begin 230 AddressSize := Read(SizeOf(TBigIntSize)); 233 231 PC := Read(AddressSize); 234 232 end; … … 249 247 RegIndex: TRegIndex; 250 248 Address: TBigInt; 251 DataSize: Byte;252 AddressSize: Byte;253 begin 254 DataSize := Read( 1);255 AddressSize := Read( 1);249 DataSize: TBigIntSize; 250 AddressSize: TBigIntSize; 251 begin 252 DataSize := Read(SizeOf(TBigIntSize)); 253 AddressSize := Read(SizeOf(TBigIntSize)); 256 254 RegIndex := ReadRegIndex; 257 255 Address := Read(AddressSize); … … 275 273 RegIndex: TRegIndex; 276 274 Address: TBigInt; 277 DataSize: Byte;278 AddressSize: Byte;279 begin 280 DataSize := Read( 1);281 AddressSize := Read( 1);275 DataSize: TBigIntSize; 276 AddressSize: TBigIntSize; 277 begin 278 DataSize := Read(SizeOf(TBigIntSize)); 279 AddressSize := Read(SizeOf(TBigIntSize)); 282 280 RegIndex := ReadRegIndex; 283 281 Address := Read(AddressSize); … … 293 291 procedure TCpu.InstructionJumpRelSize; 294 292 var 295 AddressSize: Byte;296 begin 297 AddressSize := Read( 1);293 AddressSize: TBigIntSize; 294 begin 295 AddressSize := Read(SizeOf(TBigIntSize)); 298 296 PC := PC + Read(AddressSize); 299 297 end; … … 307 305 procedure TCpu.InstructionCallSize; 308 306 var 309 AddressSize: Byte;310 begin 311 AddressSize := Read( 1);307 AddressSize: TBigIntSize; 308 begin 309 AddressSize := Read(SizeOf(TBigIntSize)); 312 310 Push(PC, AddressSize); 313 311 PC := Read(AddressSize); … … 321 319 procedure TCpu.InstructionRetSize; 322 320 var 323 AddressSize: Byte;324 begin 325 AddressSize := Read( 1);321 AddressSize: TBigIntSize; 322 begin 323 AddressSize := Read(SizeOf(TBigIntSize)); 326 324 PC := Pop(AddressSize); 327 325 end; … … 337 335 procedure TCpu.InstructionPushSize; 338 336 var 339 DataSize: Byte;340 RegIndex: TRegIndex; 341 begin 342 DataSize := Read( 1);337 DataSize: TBigIntSize; 338 RegIndex: TRegIndex; 339 begin 340 DataSize := Read(SizeOf(TBigIntSize)); 343 341 RegIndex := ReadRegIndex; 344 342 Push(Regs[RegIndex], DataSize); … … 355 353 procedure TCpu.InstructionPopSize; 356 354 var 357 DataSize: Byte;358 RegIndex: TRegIndex; 359 begin 360 DataSize := Read( 1);355 DataSize: TBigIntSize; 356 RegIndex: TRegIndex; 357 begin 358 DataSize := Read(SizeOf(TBigIntSize)); 361 359 RegIndex := ReadRegIndex; 362 360 Regs[RegIndex] := Pop(DataSize); … … 377 375 RegIndex: TRegIndex; 378 376 RegIndex2: TRegIndex; 379 DataSize: Byte;380 begin 381 DataSize := Read( 1);377 DataSize: TBigIntSize; 378 begin 379 DataSize := Read(SizeOf(TBigIntSize)); 382 380 RegIndex := ReadRegIndex; 383 381 RegIndex2 := ReadRegIndex; … … 399 397 RegIndex: TRegIndex; 400 398 RegIndex2: TRegIndex; 401 DataSize: Byte;402 begin 403 DataSize := Read( 1);399 DataSize: TBigIntSize; 400 begin 401 DataSize := Read(SizeOf(TBigIntSize)); 404 402 RegIndex := ReadRegIndex; 405 403 RegIndex2 := ReadRegIndex; … … 418 416 var 419 417 RegIndex: TRegIndex; 420 DataSize: Byte;421 begin 422 DataSize := Read( 1);418 DataSize: TBigIntSize; 419 begin 420 DataSize := Read(SizeOf(TBigIntSize)); 423 421 RegIndex := ReadRegIndex; 424 422 Regs[RegIndex] := Regs[RegIndex].Copy(DataSize) + 1; … … 436 434 var 437 435 RegIndex: TRegIndex; 438 DataSize: Byte;439 begin 440 DataSize := Read( 1);436 DataSize: TBigIntSize; 437 begin 438 DataSize := Read(SizeOf(TBigIntSize)); 441 439 RegIndex := ReadRegIndex; 442 440 Regs[RegIndex] := Regs[RegIndex].Copy(DataSize) - 1; … … 481 479 end; 482 480 483 function TCpu.Read(Size: Byte): TBigInt;481 function TCpu.Read(Size: TBigIntSize): TBigInt; 484 482 begin 485 483 Result := Memory.Read(PC, Size); … … 492 490 end; 493 491 494 procedure TCpu.Write(Size: Byte; Value: TBigInt);492 procedure TCpu.Write(Size: TBigIntSize; Value: TBigInt); 495 493 begin 496 494 Memory.Write(PC, Size, Value); … … 517 515 Regs[I] := 0; 518 516 PC := 0; 517 SP := 0; 519 518 Terminated := False; 520 519 end;
Note:
See TracChangeset
for help on using the changeset viewer.