home *** CD-ROM | disk | FTP | other *** search
-
- ; FILENAME: IBYTECPY.ASM
- ;
- ; Copyright (c) 1988, 1992 by Borland International, Inc.
- ;
- ; DESCRIPTION: This module implements the routine ByteCopy. The routine
- ; copys an array of byte values from one location in memory to another.
- ; Note that the routine checks which direction it should do the copy in,
- ; thus avoiding overwriting any data during the copy. This module uses
- ; ideal mode syntax and simplified segment directives.
- ;
- ; ASSEMBLY INSTRUCTIONS: To assemble this module use the following
- ; TASM command line.
- ;
- ; TASM /dMDL=memorymodel ibytecpy
- ;
- ; 'memorymodel' in the above command line may be replaced by TINY, SMALL,
- ; MEDIUM, COMPACT, LARGE or HUGE. If assembling this module to run on
- ; a 286/386 machine, turn on the P286 directive in order to take advantage of
- ; 286/386 specific instructions. For example:
- ;
- ; TASM /dMDL=memorymodel /jP286 ibytecpy
-
- %tabsize 4
-
- ifndef MDL
- display "Error: This module requires that you provide a memory model"
- display " definition on the command line. I.E. /dMDL=SMALL."
- err ; Force a fatal error
- else
-
- ideal ; Use TASM's Ideal mode
- % model MDL ; Define the memory model
-
- include "ibios.mac"
- include "imacros.mac"
- include "bios.inc"
-
- codeseg
-
- global ByteCopy:proc ; Define public proc
-
- proc ByteCopy
-
- ;
- ; This function copies an array of bytes from one location in memory
- ; to another. Before doing the copy the routine compares the absolute
- ; addresses of the two memory locations and sets the direction flag
- ; appropriately to avoid destroying any data. Note that this routine
- ; assumes that the pointers passed to it are normalized if the arrays
- ; being copied are longer than 0FFF0h bytes. I.E. Offset+ax is
- ; <= 0FFFFh.
- ;
- ; Input
- ; SourcePtr - far pointer to source array
- ; DestPtr - far pointer to destination array
- ; ax - number of bytes to copy
- ; Output
- ; es:di - points to 1 position past last destination byte
- ; ds:si - points to 1 position past last source byte
- ; Calling convention
- ; Pascal
- ; Registers modified
- ; bx, cx, dx, di, si, es, Flags
- ;
-
- ; Define parameters passed on stack
-
- arg DestPtr:dword, SourcePtr:dword=ParmSize
-
- push bp ; Set up the stack to access parameters
- mov bp, sp
- push ds
- lds si, [SourcePtr] ; Get the pointers off the stack
- les di, [DestPtr]
-
- ; Compare absolute addresses of pointers
-
- push ax
- CompareFarPointers ds, si, es, di
- pop ax
- jl HighToLow ; Move from high address to low address
- cld ; Move from low address to high address
- jmp DoMove
-
- HighToLow:
- std
- add si, ax ; Adjust offsets so they can be decremented
- dec si
- add di, ax ; instead of incremented.
- dec di
-
- DoMove:
- mov cx, ax ; Copy # of bytes to move into cx
- jcxz DontDoMove
- rep movsb ; Copy the bytes
- DontDoMove:
- pop ds ; restore ds if necessary
- pop bp ; Restore the stack pointer
- ret ParmSize ; Clean up stack since we're using Pascal
- ; calling conventions.
- endp ByteCopy
-
- endif ; ifndef MDL
-
- end
-