[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]