• TP 7.0 pointer passing convension

    From Anton Shepelev@2:221/360 to Anton Shepelev on Sat Feb 15 22:38:34 2020
    I wrote:

    procedure AtoB(a: byte; var b: byte);
    begin asm
    PUSH AX { store AX }
    MOV DI, [BP+4] { store offset of b in DI }
    MOV ES, [BP+2] { store segment of b in ES }
    MOV AX, [BP+8] { store a in AX }
    MOV [DI], AX { assign AX to a }
    POP AX { restore AX }
    end end;

    Here is a fixed version, without redundant opera-
    tions and with single-byte write:

    procedure AtoB(a: byte; var b: byte);
    begin asm
    MOV ES, [BP+2] { store segment of b in ES }
    MOV DI, [BP+4] { store offset of b in DI }
    MOV AX, [BP+8] { store a in AX }
    MOV [DI], AL { assign AL to a }
    end end;

    ---
    * Origin: nntps://fidonews.mine.nu - Lake Ylo - Finland (2:221/360.0)
  • From Anton Shepelev@2:221/360 to Anton Shepelev on Sun Feb 16 22:10:54 2020
    I wrote:

    Here is a fixed version, without redundant opera-
    tions and with single-byte write:

    procedure AtoB(a: byte; var b: byte);
    begin asm
    MOV ES, [BP+2] { store segment of b in ES }
    MOV DI, [BP+4] { store offset of b in DI }
    MOV AX, [BP+8] { store a in AX }
    MOV [DI], AL { assign AX to a }
    end end;

    Problem solved. Here is the correct code in TP as-
    sembly:

    procedure AtoBRef(a: byte; var b: byte);
    begin asm
    MOV DI, [BP+4] { store offset of b in DI }
    MOV ES, [BP+6] { store segment of b in ES }
    MOV AX, [BP+8] { store a in AX }
    MOV [ES:DI], AL { assign AX to a }
    end end;

    It works as advertised.

    ---
    * Origin: nntps://fidonews.mine.nu - Lake Ylo - Finland (2:221/360.0)