Google
 

Trailing-Edge - PDP-10 Archives - ap-c800d-sb - strdcl.mac
There are 27 other files named strdcl.mac in the archive. Click here to see a list.
	UNIVERSAL STRDCL



;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1974, 1979 BY DIGITAL EQUIPMENT CORPORATION

	SALL
	NOSYM

	SUBTTL REVISION HISTORY

	;[%11] FIX CHKSTR/CMBSTR TO CLEAR UP SOME MINOR INCONSISTENCIES
	;	INVOLVED IN HANDLING THE EXCEEDING OF DESTINATION STRING
	;	MAXIMUM.
	;[%12] THE LEFT MOST BYTE OF THE (I)TH WORD, IF THE DESTINATION
	;	OF A COPCHR, WOULD BE SET TO JUNK. FIX IS TO MOVE THE
	;	"DONE" LABELS UP ONE INSTRUCTION.
	;[%13] MAKE STRLIB MORE USABLE FROM COBOL:
	;	(1) ADD PSEUDO REGISTERS(SETPSU MACRO,PSEUDO SWITCH, AND ROUTINE(DATA) PSUREG) FOR FUNCTION SUPPORT
	;	(2) ADD INISTR TO INIT PSEUDO-REGS
	;	(3) HAVE DP INTEGERS BE STRING PTRS
	;	(4) HAVE BYTE DESCRIPTORS, COBOL STRINGS, ALWAYS SET MAX TO MAX-MAX
	;[%14] USE HEAD AND RECOGNIZE THAT FNDSTR CREATES AND DYNAMICALLY ADDS
	;	TO STACK FRAME.
	;	IN PROCESS, FIX PROBLEM WITH STACK FRAME TRUNCATION THAT
	;	OCCURS UNDER CERTAIN FAILURE CONDITION: POS1 AND
	;	POS2 INCONSISTENT.
	;[%15] MAKE ZERO-LENGTH HOST STRING NOT-ALWAYS-FAIL/
	;	MATCH-NULL-STRING.
	;[%16] IN PARELLEL WITH [%14] CLEANUP "WHICH" LOGIC
	;[%17] INSERT CHECK AT CMB.LP FOR NULL SOURCE/FULL DEST
	;[%20] NEED TO CHECK AGAINST MAX RATHER THAN LEN FOR MODE=NOFILL
	;	IN CNVSTR
	;[%21] MAKE CNVSTR TYPE HIGH-ORDER DIGITS WHEN NUMBER TOO BIG
	;	RATHER THAN NOT POP DIGITS AND BOMB WITH A BAD STACK
	;[%22] CORRECT DRIVER BITS THAT DISAGREE WITH DOC, MOSTLY CMPSTR
	;[%23] HANDLE SIXBIT TO ASCII CONV AUTOMAT IN CMBSTR
	;[%24] REDO HASHING ALGORITHM IN STRSYM FOR BETTER COVERAGE OF SYMBOL STRING.
	;[%25] DO NOT SPLIT QUOTED STRINGS IN CMBSTR (DBMS EDIT 317/377)

	SUBTTL   MACROS (USED BY THE LIBRARY ROUTINES)

;	USED TO GENERATE FORTRAN COMPAT. CALLS
;	3 TYPES OF ARGS
;	$1 = INDIRECT
;	$2 = CONSTANT COMPILE TIME LOCATION
;	NULL = REGISTER

; AS WRITTEN, DECR WILL CORRECTLY HANDLE ONLY 7-BIT BYTES
; IN NORMAL ALIGNMENT

	DEFINE DECR(INSTR,BYTE,BP) <

	IFN ANYSIZ,<
	SKIPGE	BP		;THIS IS IMPERFECT
	JRST	[HRLI	BP,RMBYTE	;HERE IF "440700" BP
		 SOJA	BP,.+1]
	INSTR	BYTE,BP
	CAML	BP,[MAXBP,,0]
	JRST	[HRLI	BP,RMBYTE
		 SOJA	BP,.+2]
	ADD	BP,[SIZ2PF,,0]>

	IFE ANYSIZ,<
	IFNDEF SIZ,<SIZ=AP>
	IFNDEF POZ,<POZ=SVP>	;REGS 15 AND 16
	SAVE <SIZ,POZ>
	LDB	SIZ,[BPSIZ1,,BP]
	LDB	POZ,[BPPOS,,BP]
	CAIN	POZ,44		;CHARS ASSUMED LEFT ALIGNED
	JRST	[IDIV	POZ,SIZ
		 MOVE	POZ,SIZ
		 LDB	SIZ,[BPSIZ1,,BP]
		 DPB	POZ,[BPPOS,,BP]
		 SOJA	BP,.+1]
	INSTR	BYTE,BP
	ADD	POZ,SIZ
	CAIN	POZ,44		;CHARS ASSUMED LEFT ALIGNED
	JRST	[IDIV	POZ,SIZ
		 DPB	SIZ,[BPPOS,,BP]
		 SOJA	BP,.+2]
	DPB	POZ,[BPPOS,,BP]
	RESTOR	<POZ,SIZ> >
>

	DEFINE TTC(I),<
	IFE MESSAG, <TLNN	P,STR.NW
		     TTCALL	3,M.'I>>

	DEFINE DETDIF(TOTLEN) <

	IFN	ANYSIZ,<
	HRRZ	TOTLEN,R1
	SUB	TOTLEN,LEN1
	HRRZ	T2,R0
	SUBI	T2,0(BP1)	;GIVES WORD DIF OF THE 2 BP
	IMULI	T2,CPW
	ADD	TOTLEN,T2	;T2 IS NEG
	LDB	T1,[BPPOS,,R0]
	LDB	T2,[BPPOS,,BP1]
	SUB	T2,T1
	IDIVI	T2,BYTSIZ
	ADD	TOTLEN,T2>

	IFE ANYSIZ,<
	IFNDEF SIZ,<SIZ=AP>
	SAVE <SIZ>
	LDB	SIZ,[BPSIZ1,,BP1]
	HRRZ	TOTLEN,R1
	SUB	TOTLEN,LEN1
	HRRZ	T2,R0
	SUBI	T2,0(BP1)
	IMUL	T2,CPW$##(SIZ)
	ADD	TOTLEN,T2
	LDB	T1,[BPPOS,,R0]
	LDB	T2,[BPPOS,,BP1]
	SUB	T2,T1
	IDIV	T2,SIZ
	ADD	TOTLEN,T2
	RESTOR	<SIZ>>
>

	DEFINE INDIR(A) <$1,A>
	DEFINE CONST(A) <$2,A>

	DEFINE ERROR (A,B) <
	IFNB <B>,<
	JRST	[PUSH	P,[B]
		 JRST	A]>
	IFB <B>,<
	PUSHJ	P,A>>

	DEFINE LOCSUB (A,B) <
	C.....=0
	IFNB <B>,< IRP B,<C.....=C.....+1
			 PUSH	P,B>>
	PUSHJ	P,A 
	IFN C.....,< SUB	P,[C.....,,C.....]>
>

	DEFINE STRARG(OFFS,REG,BP$,LEN$,MAX$) <
	LDB	R0,[TYPCOD+REG,,OFFS]

	MOVEI	R1,@OFFS(REG)
	LOCSUB	CANON$##
	IFNB <BP$>, <MOVEM	R0,BP$>
	IFNB <LEN$>, <HRRZM	R1,LEN$>
	IFE	BND.CH,<
	IFNB <MAX$>, <HLRZM	R1,MAX$>>
>

	DEFINE	FUNCT(A,B)<
;	SALL
	T.....=0
	ST....=1
	IF2,<IFNDEF A,<EXTERNAL A>>
	IFNB <B>,<
	PUSH	P,AP
	IRP	B,<IFIDN <B> <$1>, <ST....=0>
		   IFIDN <B> <$2>, <ST....=-1>
		   IFDIF <B> <$1>,<
			IFDIF <B> <$2>,<
			   IFG ST....,<PUSH	P,B
			   T.....=T.....+1
>
			   ST....=1>>>
	R.....=0
	   IRP  B,<IFIDN <B> <$1>, <ST....=0>
		   IFIDN <B> <$2>, <ST....=-1>
		   IFDIF <B> <$1>,<
			IFDIF <B> <$2>,<
			   IFE ST....,<T......=T......+1
				    PUSH	P,B>
			   IFL ST....,<T.....=T.....+1
				    PUSH	P,[B]>
			   IFG ST....,<T......=T......+1
					R.....=R.....+1
					HRRZI	AP,-T.....+R.....+1(P)
					PUSH	P,AP
>
			   ST....=1>>>>
	MOVEI	AP,-T.....+R.....+1(P)
	PUSHJ	P,A
	IFNB <B>,<
	SUB	P,[T.....,,T.....]
	POP	P,AP>>

	DEFINE SAVE (A)<
	IRP A,<	PUSH	P,A>>

	DEFINE RESTOR (A)<
	IRP A,<	POP	P,A>>


	DEFINE	SAVALL <
	HRRZ	R0,P
	ADD	R0,[2,,1]
	BLT	R0,16(P)
	ADD	P,D13D13##>

	DEFINE RETURN <
	JRST	RAX$##>

	DEFINE POPALL <
	SUB	P,D13D13##
	HRLZ	AP,P
	ADD	AP,[1,,2]
	BLT	AP,16>

	;[13] ADD SET PSU MACRO TO SUPPORT FUNCTIONS FOR COBOL

	DEFINE SETPSU<
	IFE PSEUDO,<
	SKIPN PSU.R0##	;0 MEANS INISTR NOT CALLED
	POPJ	P,
	MOVEM	R0,@PSU.R0##
	MOVEM	R1,@PSU.R1##
	POPJ	P,>
	IFN PSEUDO,<
	POPJ	P,>>

;	DEFINE HELLO (A,B)<
;	SALL
;	IFNB <B>,<IFIDN <B>,<.>,<SIXBIT /A/
;				 ENTRY A'.
;				 A'.:>
;		  IFDIF <B>,<.>,<SIXBIT /B/
;				 ENTRY A
;				 A:>
	;MODULE WIDE NAMES

	R0=0	;FUNCT RET REG
	R1=1	;DITTO (FOR DP)
	R2=2	;MAXLEN IN EXPANDED (UBS) -- A TEMP
	BP1=3	;BYTE PTR (THE MORE PERM. IF A DIFFERENCE)
	LEN1=4	;LEN OF STRING 1
	ML1=5	;MAX LEN OF STR 1
	BP2=6
	POS1=BP2
	LEN2=7
	POS2=LEN2
	MODE=10	;CONTROL WORD
	CNT=11	;FOR VAR LEN ARG LISTS
	C1=12	;CHAR REG
	T1=13	;RENAMED AS NEEDED
	BASP=T1
	T0=14
	MASK=T0
	ST.IBP=T0
	CAP=T0	;CURR ARG PTR
	SVP=15	;SAVE PC REG, USED FOR SIDE ENTRY POINTS
	AP=16	;ARG LIST PTR (IN FORTRAN SENSE)
	P=17	;PDL PTR

	;BIT PATTERNS

	APPEND=1B35
	CHKPNT=1B34
	OCTAL=1B33
	PAD=1B32

	TRACE=1B32	;[%22] MAKE IT AGREE WITH DOC
	IGNORE=1B35	;[%22] MAKE IT AGREE WITH DOC
	EXACT=1B34	;[%22] MAKE IT AGREE WITH DOC
	MIXMODE=1B33	;[%22] MAKE IT AGREE WITH DOC

	IDX.E=1B35
	ANCHOR=1B34	;INTERNALLY ANCHOR IS HALF-IN-HALF-OUT
	HIHO=1B34	;HALF IN HALF OUT
	PARTIA=1B33
	ENTIRE=1B33	;SEE CODE FOR WHY SAME
	BAKWDS=1B32
	MORE.1=1B32
	WHICH=1B31
	RETUBS=1B30	;USED BY SIDE ENTRY POINTS

	TO.ASCII=1B35
	Z.PAD=1B34
	NOFILL=1B33
	ALWAYS=1B32

	LB.UB=1B34	;[%22] MAKE IT AGREE WITH DOC
	TLATE=MIXMOD	;[%22] MAKE IT AGREE WITH DOC
	YES.IN=1B32

	;OTHER CONSTANTS

	TABSIZ=200	;TAZSTR AND TAOSTR ASSUME ASCII
	CPW=5	;CHARS PER WORD
	IPOSIZ=440700	;INITIAL POS/SIZE
	BYTSIZ=7
	BPPOS=360600
	BPSIZ1=300600
	BPSIZ2=300615	;INDEX OFF SVP IN REL$
	SIZ2PF=70000
	MAXBP=350000
	PAD.CH=40
	EQL=0
	TYPCOD=270400		;POSIT./SIZE OF ARG LIST TYPE CODE
	RMBYTE=010700

	;ASSEMBLY/LOAD PARAMETERS

	IFNDEF BND.CH,<BND.CH==0>
	IFNDEF ANYSIZ,<ANYSIZ==0>
	IFNDEF HIGH,<HIGH==0>
	IFNDEF CHECK,<CHECK==0>
	IFNDEF MESSAG,<MESSAG==0>
	IFNDEF STR.NW,<STR.NW==:0>
	IFNDEF PSEUDO,<PSEUDO==1>		;[13] SUPPORT FUNCTIONS FOR COBOL

	END