[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]

    { I made a small ASM-routine for accessing 4 GB data in 4 instructions: }

    PROGRAM test32; {Works for TPW1.5}
    {$R-}
    {Wim Smit 4-9-1994
    Thanx to Jimmy Athens!}
    USES WinTypes,WinProcs,WinCrt;
    TYPE
        word_array = ARRAY[0..0] OF WORD;
        Pword_array = ^word_array;

    VAR P:PWORD_Array;
        H:THandle;
        sub1,sub2,
        segt: WORD;
        i,
        ofst: LONGINT;
    BEGIN
    WRITELN('BEGIN');

    h := GlobalAlloc(GMEM_MOVEABLE OR GMEM_SHARE,2*70000);
    IF (h = 0) THEN
        Halt;
    P := GlobalLock(h);
    IF (P = NIL) THEN
        Halt;

    segt := SEG(p^);
    FOR i := 0 TO 69999 DO           {fill the words with their index}
        BEGIN
        ASM
            mov es,segt
            db 66h                   {66h for 386 opcode}
            mov bx, WORD(i)          {WORD() to fool Pascal}
            db 66h
            shl bx,1                 {ebx times 2: WORDs}
            db 66h
            mov ax, WORD(i)
            db 26h
            db 67h
            db 89h
            db 03h                   {these produce: mov  es:[ebx],ax}
        END;{asm}
        END;{i}
    {Now test it by reading the words:}
    FOR i := 32762 to 32770 DO       {read over a segment-boundary}
        BEGIN
        ASM
            mov es,segt
            db 66h
            mov bx, WORD(i)          {= mov ebx, i}
            db 66h
            shl bx,1                 {times 2: we're indexing WORDs}
            db 26h
            db 67h
            db 8bh
            db 03h                   {= mov ax, es:[ebx]}
            mov sub2, ax
        END;{asm}
        sub1 := p^[i];
        WRITELN(i:3,':',sub2,' ',sub1);
        END;{i}

    GlobalUnlock(h);
    GlobalFree(h);
    WRITELN('DONE');
    END.

    {
    Run the program and see the difference:
    BEGIN
    32762:32762 32762
    32763:32763 32763
    32764:32764 32764
    32765:32765 32765
    32766:32766 32766
    32767:32767 32767
    32768:32768 0      <-Here 16 bit index will wraparound to p^[0]!
    32769:32769 1
    32770:32770 2
    DONE

    Thus, by choosing the right db's, one can access huge arrays of bytes,
    words and longints etc.
    Isn't that great?
    OK, it needs a 386 or better, but don't we all have that?
    }

[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]