Calculating Offsets of Variables

This procedure calculates offset in data segment for each block of typed constants and variables and checks total data size.
Procedure CalculateVariableOffsetsAndTotalDataSize;
Var DataSegmentOffset: LongRec;

  Procedure CalculateOffsetsOfVariables (Block: TSymbolTable);
  Var ConstOrVarBlock: PConstVarBlockRecord;
      ConstOrVarBlockRec: PtrRec absolute ConstOrVarBlock;
  begin
    UnitPtrRec.Seg := LastLoadedUsedUnit;
    Repeat
      ConstOrVarBlock := Ptr (UnitPtrRec.Seg, UnitPtr^.BlockOffset [Block]);
      While ConstOrVarBlockRec.Ofs <> UnitPtr^.BlockOffset [Succ (Block)] do
        begin
          If ConstOrVarBlock^.Offset <> BlockUnused then
            begin
              ConstOrVarBlock^.Offset := DataSegmentOffset.WordL;
              Inc (DataSegmentOffset.Long, ConstOrVarBlock^.Size);
              If DataSegmentOffset.WordH <> 0 then Error (DataSegmentTooLarge);
            end;
          Inc (ConstOrVarBlock);
        end;
      UnitPtrRec.Seg := UnitPtr^.PreviousUnitSegment;
    until UnitPtrRec.Seg = 0;
  end;

begin
  DataSegmentOffset.Long := 2;
  CalculateOffsetsOfVariables (stTypedConstantsBlocks);
  OffsetOfVariables := DataSegmentOffset.WordL;
  CalculateOffsetsOfVariables (stVariablesBlocks);
  DataBytes := DataSegmentOffset.WordL;
  If DataSegmentOffset.WordL > $FFF0 then Error (DataSegmentTooLarge);
end;
 
 
 
© 2017 Turbo Pascal | Privacy Policy