[Back to POINTERS SWAG index] [Back to Main SWAG index] [Original]

    {
    DVE>> What I want to do is to make it point to the next byte in memory,
    DVE>> sort of "apointer:=[byte ptr] apointer + 1"
    DVE>> Apointer:=ptr(seg(apointer^),Ofs(apointer^) + 1);

    AGB> That won't work if the pointer is equal to 0FFFFh (Segment must be
    AGB> adjusted!). A shorter (and faster?) method of coding this (wrong) way :
    AGB> Inc(LongInt(APointer));

    Oeps, this doesn't work either, especially in the case $ffff ! (unwanted
    paragraph increase and in protected mode a RunTime Error 216 "General
    protection fault")

    For non segm. overrides this should work fine: Aptr:=pchar(Aptr)+1;
    and if youre planning segments overrides than you should use this:
    }

    function GetDosPtr(Point:Pointer;Offs:Longint):pointer;
    assembler;{offs in [$0..$fffff}
    asm
            mov     dx,point.word[2]
            mov     cx,offs.word[2]
            mov     bx,offs.word[0]
            add     bx,point.word[0]
            adc     cx,0
            mov     ax,bx
            and     ax,0fh
            shr     cx,1;rcr bx,1
            shr     cx,1;rcr bx,1
            shr     cx,1;rcr bx,1
            shr     cx,1;rcr bx,1
            add     dx,bx
    end;

    {And for protected mode: }

    function GetPtr(BASE:Pointer;Offs:Longint):Pbyte;
    assembler;
    asm
            MOV     AX,word ptr [OFFS+2]
            MOV     BX,word ptr [OFFS+0]
            ADD     BX,word ptr [BASE+0]
            ADC     AX,0
            MUL     SelectorInc
            ADD     AX,word ptr [BASE+2]
            MOV     DX,AX
            MOV     AX,BX
    end;

[Back to POINTERS SWAG index] [Back to Main SWAG index] [Original]