[fpc-pascal] how to make this tp7 code work on fpc

Sven Barth pascaldragon at googlemail.com
Sat Jun 27 22:44:32 CEST 2020

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 


More information about the fpc-pascal mailing list