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

    {
    I wrote some substitutes for Move and Copy in Turbo Pascal 7.0 that use
    386-instructions (sort of).  Some initial tests showed 30-40% improve-
    ment in speed.

    I am posting these here for the public domain, and hance I make no
    guarantees for how well they work.  If you find bugs or make any
    optimizations, drop me a line...
    }

    (* XFUNC.PAS v0.01 by Robert Rothenburg Walking-Owl, June 1, 1994 *)
    (* 32-bit "X-Functions" for Turbo Pascal 7.0                      *)

    {$DEFINE USE386}

    { if you $UNDEF USE386, normal 8086 instructions will be used; this
      way the only change that needs to be made if you want to write '86
      and '386 versions is to recompile this unit with the appropriate
      define... }

    unit XFunc;

    interface

    procedure XMove(var source, dest; size: word);
    function XCopy(source: string; soffs, size: byte): string;

    implementation

              { Works the same as Move(source,dest,size); }

    procedure XMove(var source, dest; size: word); assembler;
    asm
            push    ds
            push    es
            lds     si, source
            les     di, dest
            mov     cx, size
            cld
            shr     cx, 1
            jnc     @word1
            movsb
    @word1:
    {$IFDEF USE386}
            shr     cx, 1
            jnc     @word2
            movsw
    @word2: db      0f3h, 066h, 0a5h  { rep movsd }
    {$ELSE}
            rep     movsw
    {$ENDIF}
            pop     es
            pop     ds
    end;

         { works the same as Copy(str, index, len); }

    function XCopy(source: string; soffs, size: byte): string; assembler;
    asm
            push    ds
            push    es
            lds     si, source
            les     di, @result
            xor     ax, ax
            mov     bx, ax
            mov     cx, ax
            mov     bl, soffs
            mov     cl, size
            cld
            stosb
            lodsb
            cmp     ax, bx
            jb      @done
            add     si, bx
            dec     si
            sub     ax, bx
            cmp     ax, cx
            jnb     @docop
            xchg    ax, cx
            inc     cx
    @docop: push    cx
            shr     cx, 1
            jnc     @word1
            movsb
    @word1:
    {$IFDEF USE386}
            shr     cx, 1
            jnc     @word2
            movsw
    @word2: db      0f3h, 066h, 0a5h  { rep movsd }
    {$ELSE}
            rep     movsw
    {$ENDIF}
            pop     ax
            les     di, @result
            stosb
    @done:
            pop     es
            pop     ds
    end;

    end.

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