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