'===========================================================================
' Subject: PATCHED MEMCOPY ROUTINE            Date: 02-27-98 (00:57)       
'  Author: Jonathan L. Leger                  Code: QB, QBasic, PDS        
'  Origin: leger@earthlink.net              Packet: MEMORY.ABC
'===========================================================================
DEFINT A-Z

DECLARE SUB InitMemCopy ()
DECLARE SUB MemCopy (fromseg%, fromoffset%, toseg%, tooffset%, bytes%)
DECLARE SUB FillChar (segment%, offset%, value%, bytes%)

DIM SHARED MemCopy.ASM AS STRING
DIM Array1(1 TO 1000) AS INTEGER
DIM Array2(1 TO 1000) AS INTEGER

InitMemCopy

'*** Fill the first array.
FOR value = 1 TO 1000: Array1(value) = value: NEXT value

'*** Copy the contents of Array1() into Array2()
a1seg = VARSEG(Array1(1))        '*** Segment location of Array1()
a1off = VARPTR(Array1(1))        '*** Offset of Array1()
a2seg = VARSEG(Array2(1))        '*** Segment location of Array2()
a2off = VARPTR(Array2(1))        '*** Offset of Array2()
bytes = 2000                     '*** Number of bytes (integer = 2 bytes)
MemCopy a1seg, a1off, a2seg, a2off, bytes

'*** Show second array's contents.
FOR value = 1 TO 1000: PRINT Array2(value); : NEXT value

END



DEFSNG A-Z
SUB InitMemCopy

MemCopy.ASM = ""
MemCopy.ASM = MemCopy.ASM + CHR$(85)                             'PUSH BP
MemCopy.ASM = MemCopy.ASM + CHR$(137) + CHR$(229)                'MOV BP,SP
MemCopy.ASM = MemCopy.ASM + CHR$(30)                             'PUSH DS
MemCopy.ASM = MemCopy.ASM + CHR$(139) + CHR$(70) + CHR$(10)      'MOV AX,[BP+0A]
MemCopy.ASM = MemCopy.ASM + CHR$(142) + CHR$(192)                'MOV ES,AX
MemCopy.ASM = MemCopy.ASM + CHR$(139) + CHR$(70) + CHR$(14)      'MOV AX,[BP+0E]
MemCopy.ASM = MemCopy.ASM + CHR$(142) + CHR$(216)                'MOV DS,AX
MemCopy.ASM = MemCopy.ASM + CHR$(139) + CHR$(118) + CHR$(12)     'MOV SI,[BP+0C]
MemCopy.ASM = MemCopy.ASM + CHR$(139) + CHR$(126) + CHR$(8)      'MOV DI,[BP+08]
MemCopy.ASM = MemCopy.ASM + CHR$(139) + CHR$(78) + CHR$(6)       'MOV CX,[BP+06]
MemCopy.ASM = MemCopy.ASM + CHR$(243)                            'REPZ
MemCopy.ASM = MemCopy.ASM + CHR$(164)                            'MOVSB
MemCopy.ASM = MemCopy.ASM + CHR$(31)                             'POP DS
MemCopy.ASM = MemCopy.ASM + CHR$(93)                             'POP BP
MemCopy.ASM = MemCopy.ASM + CHR$(203)                            'RETF

END SUB

DEFINT A-Z
SUB MemCopy (fromseg%, fromoffset%, toseg%, tooffset%, bytes%)

DEF SEG = VARSEG(MemCopy.ASM)
	CALL Absolute(BYVAL fromseg%, BYVAL fromoffset%, BYVAL toseg%, BYVAL tooffset%, BYVAL bytes%, SADD(MemCopy.ASM))
DEF SEG

END SUB
