Не очень понимаю всех полей, но если правильно понял, то наверное так (исправил предыдущий пример. Верен, если размер указателя такой же, как интегера)
## Код:
```
MODULE M;

   IMPORT Kernel;
   
   PROCEDURE P (IN a: ARRAY OF INTEGER; size: INTEGER): INTEGER;
      VAR i, res, sizeInt: INTEGER;
   BEGIN
      sizeInt := 8;
      IF a[0] > sizeInt THEN
        res := 0;
      ELSE
        i := 0;
        WHILE (a[i + 1] # -1) & (a[i] + sizeInt > a[i + 1]) DO 
            INC(i) 
        END;

        IF a[i + 1] = -1 THEN 
            res := -1
        ELSE 
            res := a[i] + sizeInt;
        END;
      END;
      RETURN res
   END P;
   
   PROCEDURE LookupMarkOffs (t: Kernel.Type): INTEGER;
   BEGIN RETURN P(t.ptroffs, t.size)
   END LookupMarkOffs;

END M.
```
