Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/libsim/iashif.mac
There is 1 other file named iashif.mac in the archive. Click here to see a list.
COMMENT * SIMULA specification;
OPTIONS(/E:QUICK,iashift);
BOOLEAN PROCEDURE iashift(a,destindex,fromindex,length,zero);
INTEGER ARRAY a; INTEGER destindex,fromindex,length; BOOLEAN zero;
COMMENT Moves length elements starting at a[fromindex] to a[destindex] ...
If zero is TRUE, clear rest of array (after destindex+length-1).
;
!*;! MACRO-10 code !*;!

	TITLE	iashift
	ENTRY	iashift
	SUBTTL	SIMULA utility, Lars Enderin Nov 1976

;!*** Copyright 1976 by the Swedish Defence Research Institute. ***
;!*** Copying is allowed.					***


	sall
	search	simmac,simmcr,simrpa
	macinit

	;! Local definitions ;!

	a==XWAC1
	destindex==XWAC2
	fromindex==XWAC3
	length==XWAC4
	zero==XWAC5
	result==XWAC1


iashift:PROC
	IF	;! Not standard Xtop
		CAIN	XTAC,XWAC1
		GOTO	FALSE
	THEN	;! Swap ac's
		EXCH	XWAC1,(XTAC)
		EXCH	XWAC2,1(XTAC)
		EXCH	XWAC3,2(XTAC)
		EXCH	XWAC4,3(XTAC)
		EXCH	XWAC5,4(XTAC)
	FI
	SKIPG	length
	SETZM	length
	LF	X1,ZARSUB(a)
	IMULI	X1,3
	ADDI	X1,3(a)	;! Address of first array element
	LF	XIAC,ZARLEN(a)
	ADDI	XIAC,(a)	;! First word after array
	STACK	X2
	ADD	destindex,OFFSET(ZARBAD)(a)
	CAIGE	destindex,(XIAC)
	CAIGE	destindex,(X1)
	GOTO	L7
	ADD	fromindex,OFFSET(ZARBAD)(a)
	CAIGE	fromindex,(XIAC)
	CAIGE	fromindex,(X1)
	GOTO	L7
	L	X2,destindex
	ADDI	X2,(length)	;! Last destination cell
	SUBI	1
	CAIGE	X2,(XIAC)
	CAIGE	X2,(X1)
	GOTO	L7		;! Out of bounds
	ADD	length,destindex	;! First word after moved segment
	CAILE	length,(XIAC)
	GOTO	L7
	IF	;! Not same segment
		CAIN	fromindex,(destindex)
		GOTO	FALSE
	THEN	;! Move it
		HRL	fromindex
		HRR	destindex
		BLT	(X2)
	FI
	IF	;! Rest to be cleared
		JUMPE	zero,FALSE
		CAILE	length,-1(XIAC)
		GOTO	FALSE
	THEN
		SETZM	(length)
		IF	;! More than one word
			CAIL	length,-1(XIAC)
			GOTO	FALSE
		THEN
			HRL	length
			HRRI	1(length)
			BLT	-1(XIAC)
	FI	FI
	GOTO	L8
L7():!	TDZA	result,result
L8():!	SETO	result,
L9():!	UNSTK	X2
	IF	;! Non-standard ac's
		CAIN	XTAC,XWAC1
		GOTO	FALSE
	THEN	;! Restore
		EXCH	XWAC5,4(XTAC)
		EXCH	XWAC4,3(XTAC)
		EXCH	XWAC3,2(XTAC)
		EXCH	XWAC2,1(XTAC)
		EXCH	XWAC1,(XTAC)
	FI
	RETURN
	EPROC
	LIT
	END;