Google
 

Trailing-Edge - PDP-10 Archives - bb-r775c-bm_tops20_ks_upd_3 - sources/cpymem.mac
There are 11 other files named cpymem.mac in the archive. Click here to see a list.
	TITLE	CPYMEM - COPY MEMORY


; IDENT 1-001

;AUTHOR : GRAHAM BEECH	CREATION DATE : 01-MAR-1983

;****************************************************************************
;*									    *
;*  COPYRIGHT (C) 1978, 1985                                                *
;*  BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.			    *
;*  ALL RIGHTS RESERVED.                                                    *
;* 									    *
;*  THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND  COPIED  *
;*  ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH  LICENSE AND WITH THE  *
;*  INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR  ANY  OTHER  *
;*  COPIES  THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY  *
;*  OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE  SOFTWARE  IS  HEREBY  *
;*  TRANSFERRED.							    *
;* 									    *
;*  THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE  *
;*  AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT  *
;*  CORPORATION.							    *
;* 									    *
;*  DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS  *
;*  SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.		    *
;*									    *
;****************************************************************************

;
;FACILITY:	EDT VERSION 3
;

;FUNCTIONAL DESCRIPTION:
;
; 	THIS MODULE CONTAINS ROUTINES TO COPY A NUMBER OF WORDS
;	OR A NUMBER OF BYTES. IF THE SOURCE AND DESTINATION OVERLAP
;	THEN THE ROUTINES ENSURE THAT THE COPY IS DONE CORRECTLY.
;
;MODIFIED BY:
;
; 1-001	ORIGINAL.  GB 01-Mar-1983
; 1-002 - Fix to prevent EDT's high-seg becoming private. CJG 21-Dec-1983
;--

	PAGE
	TWOSEG
	RELOC	400000

	SEARCH	MONSYM
	SEARCH	MACSYM

	INTERN	CPYMEM,CPYSTR

	T1=1
	T2=2
	T3=3
	T4=4
	T5=5
	T6=6
	P=17

;
; COPY A NUMBER OF WORDS FROM ONE LOCATION TO ANOTHER
; THE COPY IS DONE FORWARD OR IN REVERSE DEPENDING THE 
; ADDRESSES OF THE SOURCE AND DESTINATION IN CASE THEY
; OVERLAP.
;
;CALLED WITH FOLLOWING ARGS ON STACK
;	# WORDS TO COPY
;	SOURCE ADDRESS
;	DESTINATION ADDRESS
;

CPYMEM::
	MOVE	T1,-3(P)		;Get no. words to copy
	JUMPE	T1,CPY002		;Return if zero
	MOVE	T2,-2(P)		;Get the source address
	MOVE	T3,-1(P)		; and Destination
	HRRI	T1,-1(T1)		;Make a count - 1
	CAIL	T2,(T3)			;Source > Destination?
	JRST	CPY001			;Yes - start at top
;
; DO COPY FROM BOTTOM UP
;
	HRLI	T1,(T1)			;Count into left half
	TLO	T1,400000		;Make it negative for JUMPL
	ADDI	T1,(T2)			;Count,,address
	SUBI	T3,(T2)			;Destination - Source
	JUMPE	T3,CPY002		;Return now if dest=source
	MOVSI	T4,(POP T1,(T1))
	HRRM	T3,T4			;Modify POP
	XCT	T4			;Copy the required no. of words
	JUMPGE	T1,CPY002		;...
	JRST	.-2			;;Loop....
;
; DO COPY TOP DOWN
;
CPY001:	CAIN	T2,(T3)			;Don't copy if dest=source
	JRST	CPY002			;...
	ADDI	T1,(T3)			;Last word to copy
	HRLI	T3,(T2)			;Source,,Destination
	BLT	T3,(T1)			;Do the copy
CPY002:	RET

	PAGE
; COPY A STRING FROM ONE LOCATION TO ANOTHER
; THE SOURCE AND DESTINATION MAY OVERLAP
;
;CALLED WITH FOLLOWING ARGS ON STACK
;	# BYTES TO COPY
;	SOURCE BYTE PTR
;	DESTINATION BYTE PTR
;


CPYSTR::
	MOVE	T1,-3(P)		;Get no. bytes to copy
	JUMPE	T1,CPYST3		;Return if zero
	MOVE	T2,-2(P)		;Get the source ptr
	MOVE	T3,-1(P)		; and Destination ptr
	PUSH	P,T4			;Preserve important
	PUSH	P,T5			; acc's...
	PUSH	P,T6			;...
	TLNE	T2,-1			;Check for illegal arg
	TLNN	T3,-1			;...
	JRST	CPYST4			;...
	CAIN	T1,1			;If 1 byte just do it
	JRST	CPYST1			;...
	HRRZI	T4,(T2)			;Get address only
	CAILE	T4,(T3)			;Source > Destination
	JRST	CPYST1			;Yes - copy top down
	CAIE	T4,(T3)			;No. Equal ?
	JRST	CPYST0			;No. Copy bottom up
	LDB	T4,[POINT 6,T2,5]	;Get source position
	LDB	T5,[POINT 6,T3,5]	;Get destination position
	CAIGE	T4,(T5)			;Source > Destination
	JRST	CPYST1			;Yes - copy top down
	CAIN	T4,(T5)			;Same ?
	JRST	CPYST2			;Yes - nothing to do

;
; COPY FROM BOTTOM UP
;
CPYST0:
	MOVEI	T4,(T1)			;Point to end
	ADJBP	T4,T2			;..of source
	MOVE	T2,T4			;..
	MOVEI	T4,(T1)			;..and destination
	ADJBP	T4,T3			;..
	MOVE	T3,T4			;..
CPY:	LDB	T4,T2			;Copy the string
	DPB	T4,T3			; a byte at a time
	SETO	T4,			;Back up source a byte
	ADJBP	T4,T2			;...
	MOVE	T2,T4			;Copy B.P.
	SETO	T4,			;Back up dest a byte
	ADJBP	T4,T3			;...
	MOVE	T3,T4			;Copy B.P.
	SOJG	T1,CPY			;Loop ...
	JRST	CPYST2
;
; COPY FROM TOP DOWN
;
CPYST1:	MOVE	T5,T3			;Setup BP's
	SETZB	T3,T6			;...
	MOVE	T4,T1			;Copy no. bytes
	EXTEND	T1,[MOVSLJ]		;Copy the string
	JFCL

CPYST2:	POP	P,T6			;Restore Ac's
	POP	P,T5			;...
	POP	P,T4			;...
CPYST3:	RET

CPYST4: HALT	.
	JRST	CPYST2

	END