Contributor: CHARLIE CALVERT

==============================================================
                  PASCAL ARTICLE FOR PAPER
                     by Charlie Calvert
==============================================================

        When Pascal programmers are using BASM, they are often
baffled when it comes time to address a field of an object. The
issue is that the field is usually located at an offset from the
segment of the pointer to that object, not from the data segment of
the program. As a result, a viable way to address a field of the
object is to first load its object's segment and offset into ES:DI.
You can use the following line of code to do this:
    [--]
    les di, Self
    [--]
   Once you are properly addressing the object itself, then all you
need do is calculate the offset of the field from the beginning of
the object. This can be done by adding the proper number of bytes
to ES:DI. For instance, if an object has three fields, all two bytes in
size, then the offset of the third field would be four:
    [--]
    mov ax, word [es:di + 4]
    [--]
    If these kinds of calculations bother you, you can avoid them by
loading the segment and offset of the object directly into the data
segement, but you should be sure to save its original value on the
stack, with a push and a pop.
    A simple illustration of the above principlese would be an object
with 3 fields, the last being an integer called M. This example
simply moves the value of that field into the AX register:

==============================================================
                        PASCAL EXAMPLE
==============================================================
program AsmObj;

type
  PMyObject = ^TMyObject;
  TMyObject = Object
    i,j: Word;
    M: Integer;
    procedure Foo;
    procedure Foo1;
  end;

procedure TMyObject.Foo;
begin
  asm
    les di, Self
    mov ax, word [es:di + 4]
  end;
end;

procedure TMyObject.Foo1;
begin
  asm
    push ds
    lds di, Self
    mov ax, word ptr [di + M]
    pop ds
  end;
end;

var
  O: PMyObject;

begin
  New(O);
  O^.M := 10;
  O^.Foo;
  O^.Foo1;
  Dispose(O);
end.