Am 27.06.2020 um 04:09 schrieb Travis Siegel:
I'm porting some code from tp7 to fpc, and I'm running into an error I don't know how to fix.  The comments claim it's supposed to be a hash table, but to me, it looks more like labels tied to various arrays.


  Ofs_00_02: Word = Ofs (Ofs_00_01);
  Tok_00_02: TToken = Token_BEGIN;
  ResWordLen_BEGIN: Byte = 5;
  ResWord_BEGIN: Array [1..5] of Char = 'BEGIN';

  Ofs_00_03: Word = Ofs (Ofs_00_02);
  Tok_00_03: TToken = Token_DIV;
  ResWordLen_DIV: Byte = 3;
  ResWord_DIV: Array [1..3] of Char = 'DIV';

  Ofs_00_04: Word = Ofs (Ofs_00_03);
  Tok_00_04: TToken = Token_NIL;
  ResWordLen_NIL: Byte = 3;
  ResWord_NIL: Array [1..3] of Char = 'NIL';

  Ofs_00_05: Word = Ofs (Ofs_00_04);
  Tok_00_05: TToken = Token_PROCEDURE;
  ResWordLen_PROCEDURE: Byte = 9;
  ResWord_PROCEDURE: Array [1..9] of Char = 'PROCEDURE';

Fpc just gives me illegal expression errors, with no indication as to what's illegal about them.  Any suggestions?

The Ofs() function is specific to the i8086 (which FPC would support in theory) and denotes the offset of the variable inside its data segment. For modern, flat memory modes you can replace them by code like this:

Ofs_00_02: Pointer = @Ofs_00_01;
...
Ofs_00_03: Pointer = @Ofs_00_02;

Note: in theory you could use "Ofs_00_02: PtrUInt = PtrUInt(@Ofs_00_01);" as well, but using a pointer type will ensure that you have to fix all locations where the Ofs_* variables are used as otherwise you'd only work with a Word range of values: You need to ensure that these locations use PtrUInt for any differences instead of Word. Afterwards you could change the Pointer types to PByte so that you can use Pointer arithmetic (this way you shouldn't need to change any calculations done on the Ofs_* variables except for the type used for differences).

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to