Google
 

Trailing-Edge - PDP-10 Archives - dec-10-omona-u-mc9 - macten.mac
There are 48 other files named macten.mac in the archive. Click here to see a list.
SUBTTL	DEC-10 UNIVERSAL PARAMETERS

	.XCREF
IFDEF %..C,<IFE %..C,<	.CREF
			TAPE	>>

IFNDEF %..C,<.DIRECTIVE	.NOBIN>


;***Copyright (C) 1971,1972,1973,1974,1975,1977 Digital Equipment Corp., Maynard, Mass.***



;THIS PARAMETER FILE CONTAINS MACRO DEFINITIONS, SYMBOL DEFINITIONS
;	AND OPDEFS WHICH ARE OPERATING SYSTEM INDEPENDENT.  THIS
;	FILE WAS ORIGINALLY PART OF C.MAC THE TOPS-10 CUSP UUO
;	PARAMETER FILE.

	MACWHO==0		;LAST PATCHER
	MACVER==2		;MAJOR VERSION
	MACMIN==0		;MINOR VERSION
	MACEDT==25		;EDIT LEVEL

	.CREF
	SALL
	SUBTTL	TABLE OF CONTENTS

;                          SECTION                            PAGE
;    1. REVISION HISTORY......................................   3
;    2. INTERESTING SYMBOLS...................................   4
;    3. MACRO DEFINITIONS -- ND, XP, EXT, GLOB................   5
;    4. MACRO DEFINITIONS -- LISTING CONTROL..................   7
;    5. MACRO DEFINITIONS -- BYTE MANIPULATION................   8
;    6. MACRO DEFINITIONS -- INFO/REDEF.......................   9
;    7. MACRO DEFINITIONS -- STACK CONTROL....................  10
;    8. SIMPLE STRUCTURE AND LOAD/STORE.......................  11
;    9. FLAG DEFINITIONS......................................  12
;   10. MACRO DEFINITIONS -- GENERATE OP CODES ABCX...........  13
;   11. MACRO DEFINITIONS -- JUMPPT...........................  22
;   12. USEFUL OPDEFS.........................................  23
;   13. SYMBOLS FOR THE CONTROL CHARACTERS....................  24
;   14. HARDWARE BITS OF INTEREST TO USERS....................  25
	SUBTTL	REVISION HISTORY

;BASED UPON C.MAC %7(163) RELEASED MAY, 1974

;VERSIONS RESET WHEN CREATED

;1	CREATION
;2	CLEAN UP AND CORRECT BUGS INTRODUCED IN ORIGINAL SPLIT
;3	(10-14,209) REMOVE PDP-6 TEST IF SAME AS KA IN JUMPPT
;4	MASK DOWN VALUE IN INSVL.
;5	(10-14,209) ADD .SUA?? SYMBOLS
;6	ADD LSTOF., LSTON.
;7	ADD VRSN. AND VR.???
;10	ADD SHOW.
;11	ADD CONT.
;12	ADD DEFST., LOAD., STOR.
;13	ADD FLAG., LFLAG., SFLAG. AND CHANGE TX??
;14	ADD .LHALF, .RHALF, .FWORD
;15	ADD .ZERO5
;16	ADD FRAME.
;17	ADD TY??.
;20	ADD ZERO.
;21	ADD NDS.
;22	SIMPLIFY INSVL.
;23	ADD KL-10 IN JUMPPT
;24	WITHDRAW 13 UNTIL UNDERSTOOD
	.DIRECTIVE .NOBIN



;+.CENTER
;TITLE. MACRO
;.SKIP 2
;THE TITLE. MACRO IS DESIGNED TO HANDLE THE PROBLEMS OF
;MAINTAINING VERSION NUMBERS IN PROGRAMS. THE MACRO GENERATES
;A SERIES OF MACROS TO PERFORM VARIOUS FUNCTIONS FOR THE
;MACRO-10 PROGRAMMER. THE GENERAL FORM IS:
;.PARAGRAPH 0
;TITLE. (ABV,PRGNAM,COMMENT)
;.TAB STOPS 8
;.LEFT MARG 8
;.PARAGRAPH -8
;WHERE:	ABV=3-CHAR PROGRAM ABBREVIATION, IE. "DRT" FOR DIRECT.
;.BREAK
;PRGNAM=PROGRAM NAME, DIRECT.
;.BREAK
;COMMENT=SHORT STATEMENT STATING PROGRAM'S FUNCTION
;
;.LEFT MARG 0
;.PARA 0
;THE TITLE. MACRO ASSUMES THAT FOUR SYMBOLS ARE DEFINED,
;XXXVER, XXXMIN, XXXWHO AND XXXEDT, WHERE XXX=THE 3-CHARACTER
;PROGRAM ABBREVIATION SUPPLIED TO THE MACRO.
;TWO SYMBOLS ARE DEFINED XXXASC AND XXXSIX WHICH ARE SYMBOLICALLY
;AND RESPECTIVELY DEFINED AS THE ASCII AND SIXBIT VALUES OF THE
;PROGRAM ABBREVIATION SUPPLIED.
;-
SUBTTL	TITLE MACRO
;&.SUBTTL TITLE MACRO


; TITLE. (DRT,DIRECT,PROGRAM TO LIST DIRECTORIES)
DEFINE TITLE.(ABV,PRGNAM,COMENT),<
	.XCREF
	Z==0
	IFNDEF ABV'VER,<Z==-1>
	IFNDEF ABV'MIN,<Z==-1>
	IFNDEF ABV'EDT,<Z==-1>
	IFNDEF ABV'WHO,<Z==-1>
	IFL Z,<PRINTX ?SYMBOLS ABV'WHO,ABV'VER,ABV'MIN AND ABV'EDT NOT DEFINED
	PRINTX ?VERSION SYMBOLS MUST BE DEFINED BEFORE CALLING TITLE. MACRO
END>
	.CREF
	IF2,<LALL>
	ABV'SIX==SIXBIT /ABV/	; PRGNAM ABBREVIATION IN SIXBIT
	ABV'ASC==ASCIZ /ABV/	; PRGNAM ABBREVIATION IN ASCII
	SALL
	.XCREF
%FIRST=ABV'MIN/^D26
IFE %FIRST,<%SECON==ABV'MIN
	%FIRST==0>
IFG %FIRST,<%SECON=ABV'MIN-<^D26*%FIRST>>
IFE ABV'MIN-^D26,<%SECON==ABV'MIN
	%FIRST=0>
IFE ABV'MIN-^D52,<%SECON==^D26
	%FIRST=1>
; DEFINE ALL THE MACROS
BUILD$ (PRGNAM,\ABV'VER,\ABV'MIN,\%FIRST,<,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,
T,U,V,W,X,Y,Z>,\%SECON,<,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,
V,W,X,Y,Z>,\ABV'EDT,\ABV'WHO,COMENT,ABV)

	IF2,<PURGE %SECON,%FIRST,Z>
.CREF>
SUBTTL	BUILD$ MACRO

;+THE TITLE. MACRO GENERATES THE FOLLOWING MACROS TO
;BE OPTIONALLY CALLED BY THE USER.
;.LEFT MARG 8
;-.TAB STOPS 8

DEFINE BUILD$ (PRGNAM,MAJN,MINOR,O1,L1,O2,L2,EDIT,CUS,COMENT,ABV,%TMP,%A,%B),<
%TMP==-1
IRP L1,<%TMP==%TMP+1
IFE O1-%TMP, <%TMP==-1
IRP L2,<%TMP==%TMP+1
IFE O2-%TMP, <

;+.PARA -8
;XXXTTL	MACRO TO GENERATE A TITLE STATEMENT OF THE FORM:
;.BREAK
;-TITLE PRGNAM COMMENT VERSION
	DEFINE ABV'TTL,<IFG CUS,<
	TITLE	PRGNAM - COMENT  %'MAJN'L1'L2(EDIT)-CUS
>IFE CUS,<
	TITLE	PRGNAM - COMENT  %'MAJN'L1'L2(EDIT)
>>

;+.PARA -8
;XXX137	MACRO TO SETUP LOCATION 137 WITH THE SPECIFIED
;-VERSION NUMBER. NOTE: THE MACRO DOES ITS OWN "LOC" AND "RELOC".
	DEFINE ABV'137,<IFG CUS,<
	IF2,<LALL>
	LOC	137
	BYTE (3)ABV'WHO(9)ABV'VER(6)ABV'MIN(18)ABV'EDT	; PRGNAM %'MAJN'L1'L2(EDIT)-CUS
	RELOC
	SALL
>	IFE CUS,<
	IF2,<LALL>
	LOC	137
	BYTE (3)ABV'WHO(9)ABV'VER(6)ABV'MIN(18)ABV'EDT	; PRGNAM %'MAJN'L1'L2(EDIT)
	RELOC
	SALL
>>

; MACRO TO DEFINE VERSION # AT CURRENT LOCATION
;+.PARA -8
;XXXVRS	MACRO TO DEFINE THE VERSION NUMBER AT AN
;-ARBITRARY USER LOCATION.
	DEFINE ABV'VRS,<IFG CUS,<
	IF2,<LALL>
	BYTE (3)ABV'WHO(9)ABV'VER(6)ABV'MIN(18)ABV'EDT	; PRGNAM %'MAJN'L1'L2(EDIT)-CUS
	SALL
>	IFE CUS,<
	IF2,<LALL>
	BYTE (3)ABV'WHO(9)ABV'VER(6)ABV'MIN(18)ABV'EDT	; PRGNAM %'MAJN'L1'L2(EDIT)
	SALL
>>

; GENERATE A PASS2 PRINTX STATEMENT
;+.PARA -8
;-XXXPTX	GENERATES A PASS2 PRINTX STATEMENT.
	DEFINE ABV'PTX,<
	IF2,<
	IFG CUS,<PRINTX PRGNAM %'MAJN'L1'L2(EDIT)-CUS	COMENT
>	IFE CUS,<PRINTX PRGNAM %'MAJN'L1'L2(EDIT)	COMENT
>>>

;+.PARA -8
;XXXSTL	THE XXXSTL MACRO GENERATES A NEW PAGE
;VIA THE MACRO PAGE PSEUDO-OP AND OPTIONALLY
;DEFINES A NEW SUBTTL COMMAND. THE CALL IS "XXXSTL (COMMENT)".
;IF THE XXXSTL MACRO IS CALLED WITH A NULL ARGUMENT A COMMENT
; LINE IS GENERATED AT THE BOTTOM OF THE CURRENT PAGE
; AND AT THE TOP OF THE NEXT PAGE INDICATING THAT THE PAGE
;-HAS BEEN CONTINUED.
	DEFINE ABV'STL (TEXT),<IFNB <TEXT>,<
	SUBTTL	TEXT
	PAGE
>	IFB <TEXT>,<
	LALL
	PAGE		; CONTINUED TO NEXT PAGE
	SALL		; CONTINUED FROM PREVIOUS PAGE
>>
;+.PARA -8
;XXXUNV	MACRO TO GENERATE A UNIVERSAL STATEMENT. THE MACRO IN
;EFFECT IS AN EXACT COPY OF THE XXXTTL MACRO EXCEPT THAT THE
;-WORD "UNIVERSAL" REPLACES THE WORD "TITLE".
	DEFINE ABV'UNV,<IFG CUS,<
	LALL
	UNIVERSAL PRGNAM - COMENT  %'MAJN'L1'L2(EDIT)-CUS
	SALL
>IFE CUS,<
	LALL
	UNIVERSAL PRGNAM - COMENT  %'MAJN'L1'L2(EDIT)
	SALL
>>

;+.PARA -8
;XXXERR	MACRO TO TYPE A FATAL ERROR MESSAGE ON THE
;USER'S TERMINAL. THE CALL IS OF THE FORM:
;.BREAK
;XXXERR (ZZZ,ERROR MESSAGE,<PDP-10 INSTRUCTION>)
;.BREAK
;ZZZ IS THE 3-CHARACTER ERROR CODE, ERROR MESSAGE IS THE ASCIZ
;STRING TO BE TYPED ON THE TERMINAL AND PDP-10 INSTRUCTION IS
;AN OPTIONAL ARGUMENT INDICATING WHAT THE USER WANTS TO DO
;ABOUT THE ERROR JUST TYPED. IF THE ARGUMENT IS NULL AN
;-EXIT IS EXECUTED.
	DEFINE ABV'ERR (COD,MSG,INSTR),<
...'COD:	JRST	[
	OUTSTR	[ASCIZ \
? ABV''COD MSG\]
	IFNB <INSTR>,<INSTR>
	IFB <INSTR>,<EXIT>
]>

;+.PARA -8
;XXXWRN	MACRO SIMILAR TO THE XXXERR MACRO EXCEPT THAT A
;WARNING MESSAGE IS ISSUED RATHER THAN A FATAL AND
;-THE DEFAULT PDP-10 INSTRUCTION TO BE EXECUTED IS "JRST .+1".
	DEFINE ABV'WRN (COD,MSG,INSTR),<
...'COD:	JRST	[
	OUTSTR	[ASCIZ \
% ABV''COD MSG\]
	IFNB <INSTR>,<INSTR>
	IFB <INSTR>,<JRST .+1>
]>

;; DEFINE NEW MACROS HERE
>>>>;; DELETED RIGHT BRACKET HERE
	PURGE %TMP,%A,%B
>
SUBTTL	MODSHW MACRO

;+
;.SKIP 2
;.LEFT MARG 0
;.CENTER
;MODSHW MACRO
;.PARA 0
;THE MODSHW MACRO IS DESIGNED TO "SHOW" VERSION VALUES OF RELATED
;MODULES. THE FORM IS "MODSHW (ABV)" WHERE ABV IS THE 3-CHARACTER
;PROGRAM ABBREVIATION. THE SYMBOL "%%ABV" IS DEFINED WITH THAT VALUE.
;-

	DEFINE MODSHW (ABV),<
	LALL
	%%'ABV==BYTE (3)ABV'WHO(9)ABV'VER(6)ABV'MIN(18)ABV'EDT
	SALL
>
SUBTTL	IDENTITY

	TITLE.	(MAC,MACTEN,DECSYSTEM-10 COMMON PARAMETER FILE)

	IFNDEF %..C,<MACUNV>
	MACPTX
SUBTTL	INTERESTING SYMBOLS

;VERSION FORMAT COMPONENTS

VR.WHO==7B2	;WHO EDITTED (0=DEC DEVELOPMENT, 1=OTHER DEC,
		;     2-4=CUSTOMER, 5-7=END USER)
VR.VER==777B11	;MAJOR DEC VERSION
VR.MIN==77B17	;MINOR DEC VERSION (1=A, ETC.)
VR.EDT==777777	;EDIT LEVEL

;MACRO TO FORMAT THIS MODULE'S VERSION
;	VRSN.	PREFIX
;
;ASSUMES SYMBOLS OF FORM PREFIX'CUS, ..VER, ETC.

DEFINE VRSN.(PFX),<BYTE (3)PFX'WHO (9)PFX'VER (6)PFX'MIN (18)PFX'EDT>


;MISC. CONSTANTS

.INFIN==377777,,777777	;PLUS INFINITY
.MINFI==1B0		;MINUS INFINITY
LH.ALF==777777B17	;LEFT HALF WORD
RH.ALF==777777		;RIGHT HALF WORD
FW.ORD==-1		;FULL WORD
.ZERO5==0		;MNEMONIC THAT NO @ OR INDEX POSSIBLE
	SUBTTL	MACRO DEFINITIONS -- ND, XP, EXT, GLOB

;MACRO TO DEFINE A SYMBOL IF NOT ALREADY DEFINED
;	ND  SYMBOL,VALUE

DEFINE	ND(SYMBOL,VALUE),<
	IFNDEF	SYMBOL,<SYMBOL==VALUE>
>


;MACRO TO SHOW THE VALUE OF AN ABSOLUTE SYMBOL
;	SHOW	SYMBOL
;WARNING-- DO NOT USE AS LAST LOCATION IN A SEGMENT

DEFINE	SHOW.(ARG$),<	.XCREF
	EXP	<ARG$>
	.ORG	.-1
			.CREF>


;MACRO TO DEFINE A SYMBOL IF NOT ALREADY DEFINED AND SHOW ITS VALUE
;WARNING-- DO NOT USE AS LAST LOCATION IN A SEGMENT

DEFINE	NDS.(SYMBOL,VALUE),<
	IFNDEF	SYMBOL,<SYMBOL==VALUE>
	SHOW.	(SYMBOL)
>
;MACRO TO DEFINE A SYMBOL AND FORCE IT INTERN
;	XP  SYMBOL,VALUE,PRINT
;		WHERE PRINT IS NON-BLANK TO PRINT OUT FROM DDT

DEFINE	XP(SYMBOL,VALUE,PRINT),<
	INTERN	SYMBOL
	IFB  <PRINT>,<SYMBOL==VALUE>
	IFNB <PRINT>,<SYMBOL=VALUE>
>


;MACRO TO EXTERN A SYMBOL IF NOT DEFINED IN THIS ROUTINE
;	EXT	SYMBOL

DEFINE	EXT(SYMBOL),<
	IRP	SYMBOL,<
	IF2,<	IFNDEF	SYMBOL,<EXTERN SYMBOL> >>>



;MACRO TO EXTERN OR INTERN A SYMBOL
;	GLOB	SYMBOL

DEFINE	GLOB(SYMBOL),<
	IRP	SYMBOL,<
	IF2,<	IFDEF	SYMBOL,<INTERN SYMBOL>
		IFNDEF	SYMBOL,<EXTERN SYMBOL>
		SUPPRE	SYMBOL>>>
	SUBTTL	MACRO DEFINITIONS -- LISTING CONTROL

;THIS MACRO IS USED TO FORCE A PAGE OVERFLOW WITH COMMENT
;TO HAVE LISTINGS MATCH THE PROPOSED CODING STANDARD.
;
;IT IS INVOKED WHENEVER A PAGE OVERFLOW WOULD HAVE HAPPENED.
;
;
;ACCORDING TO THE PROPOSED STANDARD, ALL SOURCE FOR A ROUTINE
;MUST OCCUR ON ONE PAGE. HOWEVER, IT IS IMPORTANT FOR THE
;USER TO FIND "SENTENCE" BREAKS TO FORM THE OVERFLOW (EJECT)
;POINTS. WHENEVER OVERFLOW OCCURS, A COMMENT
;TO THAT EFFECT SHOULD APPEAR IN THE LISTING. ALL THIS IS
;ACCOMPLISHED BY THE USER INCLUDING THE MACRO "CONT." IN HIS
;SOURCE AT THE POINT OF THE OVERFLOW. NO BLANKS SHOULD PRECEED
;OR FOLLOW THE MACRO.

	DEFINE	CONT.<LALL

			   PAGE	;(CONTINUED ON NEXT PAGE)
			   SALL	;(CONTINUED FROM PREVIOUS PAGE)
>


;MACROS TO TURN ON AND OFF LISTINGS WHEN NESTING
;	LSTOF.		TURNS OFF LISTING AND CREF
;	LSTOF.	X	TURNS OFF LISTING
;	LSTON.		RESTORES LISTING AND CREF IF TOP LEVEL
;IF LSTIN. IS DEFINED AS .MINFI, THEN ALL LISTINGS ON

DEFINE	LSTOF.(CREF$),<
	IFNDEF	LSTIN.,	LSTIN.==0
IFE LSTIN.,<
	IFB <CREF$>,	.XCREF
			XLIST>
LSTIN.==LSTIN.+1
>

DEFINE	LSTON.,<
IFG LSTIN., LSTIN.==LSTIN.-1
IFLE LSTIN.,<	.CREF
		LIST>
>
	SUBTTL	MACRO DEFINITIONS -- BYTE MANIPULATION

;MACRO TO COMPUTE THE WIDTH OF A MASK
;	"WID" RETURNS THE LENGTH OF THE LEFTMOST STRING OF
;	CONSECUTIVE ONES IN THE WORD.
DEFINE	WID(MASK),<<^L<-<<MASK>_<^L<MASK>>>-1>>>

;MACRO TO COMPUTE THE POSITION OF A MASK
DEFINE	POS(MASK),<<^L<MASK>+^L<-<<MASK>_<^L<MASK>>>-1>-1>>

;MACRO TO BUILD A POINTER TO A MASKED QUANTITY
;	POINTR	LOCATION,MASK
DEFINE	POINTR(LOC,MASK),<<POINT	WID(MASK),LOC,POS(MASK)>>

;MACRO TO BUILD A MASK "WID" BITS WIDE, WITH ITS RIGHTMOST BIT
;	IN THE BIT POSITION "POS".   (I.E. A MASK FOR THE BYTE
;	POINTED TO BY THE BYTE POINTER "POINT  WID,LOC,POS")
DEFINE	MASK.(WID,POS),<<<<1_<WID>>-1>B<POS>>>

;MACRO TO DEFINE A SYMBOL WITH ONLY ONE BIT ON, IN THE SAME POSITION AS
;	THE RIGHTMOST BIT IN "MASK" (OR 0, IF "MASK" = 0)
DEFINE RGHBT.(MASK),<<<MASK>&-<MASK>>>

;MACRO TO DEFINE A SYMBOL WITH ONLY ONE BIT ON, IN THE SAME POSITION AS
;	THE LEFTMOST BIT IN "MASK" (OR 0, IF "MASK" = 0)
DEFINE LFTBT.(MASK),<<1B<^L<MASK>>>>

;	"FILIN." RETURNS A WORD WITH A CONSECUTIVE STRING OF ONES FROM THE
;	BIT POSITION OF THE LEFTMOST ONE IN "MASK" THROUGH THE BIT POSITION
;	OF THE RIGHTMOST ONE IN "MASK" INCLUSIVE.
DEFINE FILIN.(MASK),<<<MASK>!<<LFTBT.(MASK)>-<RGHBT.(MASK)>>>>

;	"ALIGN." RETURNS THE NUMBER OF TRAILING ZEROS IN "MASK"
;	(I.E. A VALUE WHICH IS THE RIGHT COUNTERPART OF THE VALUE
;	RETURNED BY THE MACRO-10 OPERATOR "^L")
DEFINE ALIGN.(MASK),<<^D35-<^L<RGHBT.(MASK)>>+<^D37*<<^L<RGHBT.(MASK)>>/^D36>>>>

;	BTSWP.(AC,BIT-1,BIT-2) SWAPS BITS 1 AND 2 IN AC.
;		BIT-1 AND BIT-2 ARE DECIMALS 0-35
DEFINE	BTSWP.(AC,BIT1,BIT2),<
	REPEAT	3,<
	TXCE	AC,1B<BIT1>!1B<BIT2>
>>

;	"INSVL." POSITIONS VALUE IN MASK
DEFINE INSVL.(VALUE,MASK),<<<<VALUE>B<POS(<MASK>)>>&<MASK>>>
	SUBTTL	MACRO DEFINITIONS -- INFO/REDEF

;THE FOLLOWING MACROS FACILITATE THE ACCUMULATION OF TEXT BY PERMITTING
;THE USER TO APPEND A LINE OF TEXT TO THE BODY OF TEXT ALREADY
;ACCUMULATED.  THE MACROS ARE USED IN THE FOLLOWING WAY:
;1.  TO CLEAR THE MECHANISM:
;	CINFO.
;2.  TO APPEND THE LINE "SAMPLE LINE" (FOLLOWED BY CR-LF) TO THE
;END OF THE TEXT ACCUMULATED SO FAR:
;	INFO.	REDEF.,"SAMPLE LINE"
;3.  TO DEFINE A MACRO "NAME" SO THAT ITS EXPANSION WILL BE THE TEXT
;ACCUMULATED SO FAR, (NOTE-IT ADDS A NULL LINE TO THE END):
;	INFO.	DEFINE	"NAME"

	DEFINE	CINFO.	<
	DEFINE	INFO.(OPCODE,NEWARG)<
	OPCODE	NEWARG>>

	DEFINE	REDEF.(OLDARG)<
	DEFINE	INFO.(OPCODE,NEWARG)<
	OPCODE	<OLDARG
	NEWARG>>>
	SUBTTL	MACRO DEFINITIONS -- STACK CONTROL

;MACRO TO DEFINE A BUNCH OF WORDS ON THE STACK.
;EACH ARGUMENT TO THE FRAME. MACRO ALLOCATES 1 WORD ON THE
;  STACK AND DEFINES A MACRO WITH THE SAME NAME AS -N(P).
;
;WARNING: THIS MACRO DEFINES THINGS IN TERMS OF (P) AND THEREFOR
;	NOTHING ELSE MAY BE PUSHED ON THE STACK!!!

DEFINE	FRAME. (LIST,%A),<
	OLD%%%==10	;;SAVE CURRENT RADIX
	RADIX	8
	N%%%==0		;;ARGUMENT COUNT
IRP LIST,<
	FR%%AM (LIST,\<N%%%+1>)	;;DEFINE SYMBOL MACRO
	N%%%==N%%%+1		;;COUNT ARGS
>
	ADD	P,[N%%%,,N%%%]	;;ALLOCATE SPACE
	PUSHJ	P,%A		;;DO THE SUBROUTINE
	  SKIPA
	AOS	-N%%%(P)	;;PASS ON SKIP RETURN
	SUB	P,[N%%%,,N%%%]	;;DEALLOCATE SPACE
	POPJ	P,		;;RETURN
%A:
	RADIX	OLD%%%
	PURGE	N%%%,OLD%%%
>

DEFINE	FR%%AM (A,B),<
	DEFINE	A,<-^O'B(P)>
>
	SUBTTL	SIMPLE STRUCTURE AND LOAD/STORE

;MACROS TO DEFINE AND LOAD/STORE A BYTE LOCATION

;MACRO DEFST. (BYTE NAME, WORD LOCATION, MASK)
; DEFINES THE LOCATION AND SIZE OF THE BYTE

DEFINE	DEFST.(NAM$,LOC$,MASK$),<
	..OLD==10
	..TYP==3
IFE <MASK$>+1,..TYP==0
IFE <MASK$>-^O777777,..TYP==1
IFE <MASK$>-^O777777B17,..TYP==2
..POS==POS(<MASK$>)
..WID==WID(<MASK$>)
	RADIX	10
	DF%%ST (\..TYP,NAM$,<LOC$>,\..POS,\..WID)
	PURGE	..OLD,..TYP,..POS,..WID>

;	THIS IS A HELPER MACRO FOR INTERNAL USE

DEFINE	DF%%ST (TYP$,NAM$,LOC$,POS$,WID$),<
	RADIX	..OLD
DEFINE	NAM$ (OPS,AC,E),<
	..C==0
	IRP OPS,<
		IFE TYP$-..C,<
			STOPI
			IFN 3-..C, OPS <AC>,LOC$''E
			IFE 3-..C, OPS <AC>,[POINT WID$,LOC$''E,POS$]
		>
	..C==..C+1>
	PURGE	..C>
>

;MACRO LOAD. (AC, BYTE NAME, OPTIONAL LOC)
; WILL LOAD AC WITH THE CONTENTS OF THE BYTE. IF AND ONLY
; NO LOCATION WAS GIVEN IN DEFST., GIVE IT IN LOAD.

;MACRO STOR. IS IDENTICAL EXCEPT THE AC IS STORED INTO THE BYTE.

;MACRO ZERO. IS IDENTICAL (FIRST ARG IGNORED) EXCEPT ZERO IS STORED

DEFINE LOAD. (AC$,STR$,E$),< STR$ (<MOVE,HRRZ,HLRZ,LDB>,<AC$>,<E$>)>
DEFINE STOR. (AC$,STR$,E$),< STR$ (<MOVEM,HRRM,HRLM,DPB>,<AC$>,<E$>)>
DEFINE ZERO. (AC$,STR$,E$),< STR$ (<SETZM,HLLZS,HRRZS,<PRINTX ?CAN'T ZERO BYTE>>,<AC$>,<E$>)>
	SUBTTL	FLAG DEFINITIONS

;MACRO FLAG. DEFINES A LIST OF FLAGS AS BEING IN
;A PARTICULAR REGISTER IN SUCH A FASHION THAT
;THE BITS ARE ASSIGNED AT ASSEMBLY TIME AND THE REGISTER AND
;BITS ARE "REMEMBERED" FOR FUTURE USE IN THE TX?? MACROS.

;;THIS WILL BE DEFINED AT SOME FUTURE TIME AND VERSION.
	SUBTTL	MACRO DEFINITIONS -- GENERATE OP CODES ABCX

;MACRO TO GENERATE MOVEI, MOVSI, OR MOVE [] AS APPROPRIATE
;	ALSO HRLOI, HRROI

DEFINE	MOVX	(AC,FLAG),<
	.XCREF
	TEST%%=0
IFE	<<FLAG>_-^D18>,<
	TEST%%=1
	.CREF
	MOVEI	AC,<FLAG>
	.XCREF
>
IFN	<FLAG>,<
IFE	<<FLAG>_^D18>,<
	TEST%%=1
	.CREF
	MOVSI	AC,(FLAG)
	.XCREF
>
IFE	<<<FLAG>_-^D18>-^O777777>,<
	TEST%%=1
	.CREF
	HRROI	AC,<FLAG>
	.XCREF
>
IFE	TEST%%,<
IFE	<<<FLAG>_^D18>-^O777777B17>,<
	TEST%%=1
	.CREF
	HRLOI	AC,(<FLAG>-^O777777)
	.XCREF
>
IFE	TEST%%,<
	.CREF
	MOVE	AC,[FLAG]
>>>
	PURGE	TEST%%
	.CREF>

;STORE (AC,FIRST,LAST,CONSTANT) PUTS CONSTANT IN FIRST THRU LAST.
	DEFINE	STORE(AC,FIRST,LAST,CONS),<
IFE <CONS>,<	SETZM	FIRST>	;;IF CONS=0, CLEAR FIRST
IFE <CONS>+1,<	SETOM	FIRST>	;;IF CONS=-1, SET FIRST TO -1
IFN <CONS>*<<CONS>+1>,<MOVX	AC,<CONS>	;;ELSE DO IT
		   MOVEM AC,FIRST>	;; THE HARD WAY
IFNB <LAST>,<			;;IF MORE THAN ONE LOCATION
	MOVE	AC,[FIRST,,FIRST+1]
	BLT	AC,LAST		;;DISTRIBUTE THE CONSTANT
>>
;GENERATE CAI OR CAM AS APPROPRIATE

DEFINE	CAX	(AC,VAL),<OP%%CA (AC,VAL,)>
DEFINE	CAXL	(AC,VAL),<OP%%CA (AC,VAL,L)>
DEFINE	CAXLE	(AC,VAL),<OP%%CA (AC,VAL,LE)>
DEFINE	CAXE	(AC,VAL),<OP%%CA (AC,VAL,E)>
DEFINE	CAXG	(AC,VAL),<OP%%CA (AC,VAL,G)>
DEFINE	CAXGE	(AC,VAL),<OP%%CA (AC,VAL,GE)>
DEFINE	CAXN	(AC,VAL),<OP%%CA (AC,VAL,N)>
DEFINE	CAXA	(AC,VAL),<OP%%CA (AC,VAL,A)>

DEFINE	OP%%CA	(AC,VALUE,CODE),<
	.XCREF
IFE	<<VALUE>_-^D18>,<
	.CREF
	CAI'CODE	AC,<VALUE>
	.XCREF
>
IFN	<<VALUE>_-^D18>,<
	.CREF
	CAM'CODE	AC,[VALUE]
	.XCREF
>
	.CREF>
;GENERATE IMMEDIATE OR MEMORY CONSTANTS

DEFINE	ADDX	(AC,VAL),<OP%%IA	(AC,VAL,ADD,SUB)>
DEFINE	SUBX	(AC,VAL),<OP%%IA	(AC,VAL,SUB,ADD)>
DEFINE	MULX	(AC,VAL),<OP%%IN	(AC,VAL,MUL)>
DEFINE	IMULX	(AC,VAL),<OP%%IN	(AC,VAL,IMUL)>
DEFINE	DIVX	(AC,VAL),<OP%%IN	(AC,VAL,DIV)>
DEFINE	IDIVX	(AC,VAL),<OP%%IN	(AC,VAL,IDIV)>

DEFINE	OP%%IA	(AC,VALUE,CODE,ALT),<
	.XCREF
IFE	<<<VALUE>_-^D18>-^O777777>,<
	.CREF
	ALT'I	AC,-<VALUE>
	.XCREF
>
IFN	<<<VALUE>_-^D18>-^O777777>,<
	OP%%IN	AC,<VALUE>,CODE
>
	.CREF>

DEFINE	OP%%IN	(AC,VALUE,CODE),<
	.XCREF
IFE	<<VALUE>_-^D18>,<
	.CREF
	CODE'I	AC,<VALUE>
	.XCREF
>
IFN	<<VALUE>_-^D18>,<
	.CREF
	CODE	AC,[VALUE]
	.XCREF
>
	.CREF>
;GENERATE IMMEDIATE OR MEMORY FOR FLOATING POINT

DEFINE	FADRX	(AC,VAL),<OP%%FA	(AC,VAL,FADR,FSBR)>
DEFINE	FSBRX	(AC,VAL),<OP%%FA	(AC,VAL,FSBR,FADR)>
DEFINE	FMPRX	(AC,VAL),<OP%%FP	(AC,VAL,FMPR)>
DEFINE	FDVRX	(AC,VAL),<OP%%FP	(AC,VAL,FDVR)>

DEFINE	OP%%FA	(AC,VALUE,CODE,ALT),<
	.XCREF
IFE	<<<VALUE>_^D18>-^O777777B17>,<
	.CREF
	ALT'I	AC,(-<VALUE>)
	.XCREF
>
IFN	<<<VALUE>_^D18>-^O777777B17>,<
	OP%%FP	AC,<VALUE>,CODE
>
	.CREF
>

DEFINE	OP%%FP	(AC,VALUE,CODE),<
	.XCREF
IFE	<<VALUE>_^D18>,<
	.CREF
	CODE'I	AC,(VALUE)
	.XCREF
>
IFN	<<VALUE>_^D18>,<
	.CREF
	CODE	AC,[VALUE]
	.XCREF
>
	.CREF>
;MACRO TO GENERATE MACROS OF THE FORM TXYY.  THESE MACRO REPLACE
; A TLYY OR A TRYY DEPENDING UPON THEIR ARGUMENT. SEE EXAMPLES:
;
;		CALL				RESULT
;	TXNE	F,1B20			TRNE	F,1B20
;	TXON	F,1B0			TLON	F,(1B0)
;	TXZ	F,1B1!1B31		TDZ	F,[1B1!1B31]
;
;IF CALLED WITH ONLY ONE ARG, IT IS ASSUMED TO BE DEFINED BY A FLAG. MACRO

	.XCREF
DEFINE	TX0%%	(M,S),<
	IRP	M,<
	IRP	S,<
DEFINE	TX'M'S	(AC,FLAG),<
	.XCREF
IFB  <FLAG>,	OP%%TX	<^O37777777&AC>,1B<AC_-^D30>,TL'M'S,TR'M'S,TD'M'S
IFNB <FLAG>,	OP%%TX	AC,<FLAG>,TL'M'S,TR'M'S,TD'M'S
	.CREF
>>>>

	TX0%%	<N,Z,O,C>,<E,N,A>

	PURGE	TX0%%
	.CREF

DEFINE	TXN	(AC,FLAG),<
IFB <FLAG>, JFCL	0
IFNB <FLAG>, TRN	AC,<,,<FLAG>>
>
DEFINE	TXZ	(AC,FLAG),<
	.XCREF
IFB <FLAG>, TXZ	(<^O37777777&AC>,1B<AC_-^D30>)
IFNB <FLAG>,<
IFN <<AC>&^O777777777760>, PRINTX ? AC IS NOT AN ACCUMULATOR
IFE	<<<FLAG>_-^D18>-^O777777>,<
	.CREF
	ANDI	AC,<,,-1-<FLAG>>
	.XCREF>
IFN	<<<FLAG>_-^D18>-^O777777>,<
	OP%%TX	AC,<FLAG>,TLZ,TRZ,TDZ
>>	.CREF>

DEFINE	TXO	(AC,FLAG),<
	.XCREF
IFB <FLAG>, TXO	(<^O37777777&AC>,1B<AC_-^D30>)
IFNB <FLAG>,<
IFN <<AC>&^O777777777760>, PRINTX ? AC IS NOT AN ACCUMULATOR
IFE	<<<FLAG>_-^D18>-^O777777>,<
	.CREF
	ORCMI	AC,<,,-1-<FLAG>>
	.XCREF>
IFN	<<<FLAG>_-^D18>-^O777777>,<
	OP%%TX	AC,<FLAG>,TLO,TRO,TDO
>>	.CREF>
DEFINE	TXC	(AC,FLAG),<
	.XCREF
IFB <FLAG>, TXC	(<^O37777777&AC>,1B<AC_-^D30>)
IFNB <FLAG>,<
IFN <<AC>&^O777777777760>, PRINTX ? AC IS NOT AN ACCUMULATOR
IFE	<<<FLAG>_-^D18>-^O777777>,<
	.CREF
	EQVI	AC,<,,-1-<FLAG>>
	.XCREF>
IFN	<<<FLAG>_-^D18>-^O777777>,<
	OP%%TX	AC,<FLAG>,TLC,TRC,TDC
>>	.CREF>

DEFINE	OP%%TX	(AC,FLAG,L,R,D)<
	.XCREF
IFN <<AC>&^O777777777760>, PRINTX ? AC IS NOT AN ACCUMULATOR

	TEMP%%=0
IFE	<<FLAG>_^D18>,<
IFN	<FLAG>,<
	TEMP%%=1
	.CREF
	L	AC,(FLAG)
	.XCREF
>>
IFE	<<FLAG>_-^D18>,<
	TEMP%%=1
	.CREF
	R	AC,<FLAG>
	.XCREF
>
IFE	TEMP%%,<
	.CREF
	D	AC,[FLAG]
>
	PURGE	TEMP%%
	.CREF>

;DEFINE MNEMONIC CODES FOR SOME OF ABOVE

DEFINE	IORX	(AC,FLAG),<TXO	AC,<FLAG>>
DEFINE	ANDX	(AC,FLAG),<TXZ	AC,-1-<FLAG>>
DEFINE	XORX	(AC,FLAG),<TXC	AC,<FLAG>>
;MACROS TO TEST AND SET/CLEAR/COMPLEMENT FLAGS WHICH ARE NOT
;IN ACCUMULATORS. BE VERY CAREFUL THAT THESE GENERATE TWO
;INSTRUCTIONS, SO CAN NOT BE SKIPPED OVER.
;THEY EACH HAVE TWO ARGUMENTS, THE FIRST IS A SCRATCH AC
; AND THE SECOND IS THE FLAG WHICH WAS DEFINED IN A FLAG. MACRO.

DEFINE	TYNE.	(AC,FLAG),<
	MOVX	AC,1B<FLAG_-^D30>
	.XCREF
	<TDNE	AC,>!<37777777&FLAG>
	.CREF
>

DEFINE	TYNN.	(AC,FLAG),<
	MOVX	AC,1B<FLAG_-^D30>
	.XCREF
	<TDNN	AC,>!<37777777&FLAG>
	.CREF
>

DEFINE	TYO.	(AC,FLAG),<
	MOVX	AC,1B<FLAG_-^D30>
	.XCREF
	<IORM	AC,>!<37777777&FLAG>
	.CREF
>

DEFINE	TYZ.	(AC,FLAG),<
	MOVX	AC,1B<FLAG_-^D30>
	.XCREF
	<ANDCAM	AC,>!<37777777&FLAG>
	.CREF
>

DEFINE	TYC.	(AC,FLAG),<
	MOVX	AC,1B<FLAG_-^D30>
	.XCREF
	<XORM	AC,>!<37777777&FLAG>
	.CREF
>
;NOTE - "TXNI.", "TXND.", "JUMPI." & "JUMPD." MAY ASSEMBLE AS ONE OR MORE
;	INSTRUCTIONS, DEPENDING ON THE ACTUAL VALUES OF THEIR ARGUMENTS.
;	IN ALL CASES WHERE THE MACRO EXPANSION IS MORE THAN ONE INSTRUCTION
;	IT WILL BE TRUE THAT IF CONTROL ARRIVES AT THE SECOND INSTRUCTION
;	OF THE MACRO EXPANSION, CONTROL WILL UNCONDITIONALLY BE PASSED TO
;	THE INSTRUCTION IMMEDIATELY FOLLOWING THE LAST INSTRUCTION OF THE
;	MACRO EXPANSION (WITHOUT HAVING ALTERED ANY PART OF THE MACHINE
;	STATE OTHER THAN THE PC). THUS A SKIP TYPE INSTRUCTION IMMEDIATELY
;	PRECEEDING A "TXNI.", "TXND.", "JUMPI.", OR "JUMPD." MACRO WILL HAVE
;	THE EFFECT OF SKIPPING OVER THE ENTIRE MACRO EXPANSION.
;
;
;TEST (BUT DON'T MODIFY) THE FIELD
;	(IN "AC") SPECIFIED BY "MASK" AND SKIP IF IT IS IDENTICAL TO "PATERN"
DEFINE	TXNI.(AC,MASK,PATERN),<
IFE <<MASK>_<1+^L<MASK>>>,<
IFE <<MASK>&<PATERN>>,<
	TXNE	AC,<MASK>
>
IFN <<MASK>&<PATERN>>,<
	TXNN	AC,<MASK>
>>
IFN <<MASK>_<1+^L<MASK>>>,<
	TXCA	AC,<<PATERN>&<MASK>>
	JRST	.+4
	TXCE	AC,<<PATERN>&<MASK>>
	JRST	.+2
	TXNE	AC,<<-<PATERN>-1>&<MASK>>
>>

;TEST (BUT DON'T MODIFY) THE FIELD
;	(IN "AC") SPECIFIED BY "MASK" AND SKIP IF IT IS DIFFERENT THAN "PATERN"
DEFINE	TXND.(AC,MASK,PATERN),<
IFE <<MASK>_<1+^L<MASK>>>,<
IFE <<MASK>&<PATERN>>,<
	TXNN	AC,<MASK>
>
IFN <<MASK>&<PATERN>>,<
	TXNE	AC,<MASK>
>>
IFN <<MASK>_<1+^L<MASK>>>,<
	TXCA	AC,<<PATERN>&<MASK>>
	JRST	.+4
	TXCE	AC,<<PATERN>&<MASK>>
	JRST	.+3
	TXNN	AC,<<-<PATERN>-1>&<MASK>>
>>
;JUMP TO "LOCATN" IF THE FIELD
;	(IN "AC") SPECIFIED BY "MASK" IS IDENTICAL TO "PATERN"
DEFINE	JUMPI.(AC,MASK,PATERN,LOCATN),<
IFE <<MASK>_1>,<
IFE <MASK>,<
	JUMPA	AC,LOCATN
>
IFN <MASK>,<
IFE <<PATERN>&<MASK>>,<
	JUMPGE	AC,LOCATN
>
IFN <<PATERN>&<MASK>>,<
	JUMPL	AC,LOCATN
>>>
IFN <<MASK>_1>,<
	TXCA	AC,<<PATERN>&<MASK>>
	JRST	.+5
	TXCE	AC,<<PATERN>&<MASK>>
	JRST	.+3
	TXNN	AC,<<-<PATERN>-1>&<MASK>>
	JRST	LOCATN
>>

;JUMP TO "LOCATN" IF THE FIELD
;	(IN "AC") SPECIFIED BY "MASK" IS DIFFERENT THAN "PATERN"
DEFINE	JUMPD.(AC,MASK,PATERN,LOCATN)
<IFE <<MASK>_1>,<
IFE <MASK>,<
	JUMP	AC,LOCATN
>
IFN <MASK>,<
IFE <<PATERN>&<MASK>>,<
	JUMPL	AC,LOCATN
>
IFN <<PATERN>&<MASK>>,<
	JUMPGE	AC,LOCATN
>>>
IFN <<MASK>_1>,<
	TXCA	AC,<<PATERN>&<MASK>>
	JRST	.+5
	TXCE	AC,<<PATERN>&<MASK>>
	JRST	LOCATN
	TXNE	AC,<<-<PATERN>-1>&<MASK>>
	JRST	LOCATN
>>
	SUBTTL	MACRO DEFINITIONS -- JUMPPT

;MACRO TO JUMP DEPENDING UPON PROCESSOR TYPE

;CALL:	JUMPPT	TEMPAC,PDP-6 ADDR,KA-10 ADDR,KI-10 ADDR,KL-10 ADDR
;	WHERE	TEMPAC IS AN AC TO USE AS A TEMP
;	BLANK PROCESSORS FALL THROUGH TO NEXT INSTRUCTION

DEFINE	JUMPPT	(AC,CP166,KA10,KI10,KL10,KX,KY,KZ,%1),<
IFDIF <CP166><KA10>,<
	JFCL	1,.+1		;;CLEAR PC-CHANGE FLAG
	JRST	.+1		;;SET PC-CHANGE
IFNB <CP166>,<	JFCL	1,CP166
  IFNB <KA10>,<IFIDN <KA10><KI10>,<IFIDN <KI10><KL10>,< JRST	KA10>>>>
IFB <CP166>,<	JFCL	1,%1
  IFIDN <KA10><KI10>,<IFIDN <KI10><KL10>,< JRST	KA10>>>
>;;END IFDIF <CP166><KA10>

IFDIF <KA10><KI10>,<
	HRLOI	AC,-2		;;SET FOR KA/KI TEST
IFNB <KA10>,<	AOBJP	AC,KA10
  IFNB <KI10>,<IFIDN <KI10><KL10>,<JRST	KI10>>>
IFB <KA10>,<IFDIF <KI10><KL10>,<AOBJP AC,%1>
	    IFIDN <KI10><KL10>,<AOBJN AC,KI10>>
>;;END IFDIF <KA10><KI10>

IFDIF <KI10><KL10>,<
	IF2,<IFE AC,<PRINTX ? AC MUST BE NON-ZERO IN JUMPPT>>
	MOVEI	AC,0		;;SET FOR KI/KL TEST
	BLT	AC,0		;;DO TEST
IFNB <KI10>,<	JUMPE	AC,KI10
  IFNB <KL10>,<	JRST	KL10>>
IFB <KI10>,<	JUMPN	AC,KL10>
>;;END IFDIF <KI10><KL10>

%1:>


;DEFINE UNITS OF STORAGE ALLOCATION

.SUAP6==^D1024	;PDP-6
.SUAKA==^D1024	;KA-10
.SUAKI==^D512	;KI-10
.SUAKL==^D512	;KL-10
	SUBTTL	USEFUL OPDEFS

	OPDEF	PJRST	[JRST]		;PUSHJ/POPJ
	OPDEF	PJRSTF	[JRSTF]		;PUSHJ/POPJ
	OPDEF	PJSP	[JSP]		;MOVEI .+1/PUSHJ/POPJ
	OPDEF	PJUMPL	[JUMPL]
	OPDEF	PJMPLE	[JUMPLE]
	OPDEF	PJUMPE	[JUMPE]
	OPDEF	PJUMPN	[JUMPN]
	OPDEF	PJUMPG	[JUMPG]
	OPDEF	PJMPGE	[JUMPGE]

;OPDEF THE KI-10 CONCEALED PAGE GATE-KEEPER

	OPDEF	PORTAL	[JRST 1,]
	SUBTTL	SYMBOLS FOR THE CONTROL CHARACTERS

.CHNUL==000	;NULL
.CHCNA==001
.CHCNB==002
.CHCNC==003
.CHCND==004
.CHCNE==005
.CHCNF==006
.CHBEL==007	;BELL
.CHCNH==010
.CHTAB==011	;TAB
.CHLFD==012	;LINE-FEED
.CHVTB==013	;VERTICAL TAB
.CHFFD==014	;FORM FEED
.CHCRT==015	;CARRIAGE RETURN
.CHCNN==016
.CHCNO==017
.CHCNP==020
.CHCNQ==021
.CHCNR==022
.CHCNS==023
.CHCNT==024
.CHCNU==025
.CHCNV==026
.CHCNW==027
.CHCNX==030
.CHCNY==031
.CHCNZ==032
.CHESC==033	;ESCAPE
.CHCBS==034	;CONTROL BACK SLASH
.CHCRB==035	;CONTROL RIGHT BRACKET
.CHCCF==036	;CONTROL CIRCONFLEX
.CHCUN==037	;CONTROL UNDERLINE

.CHALT==175	;OLD ALTMODE
.CHAL2==176	;ALTERNATE OLD ALTMODE
.CHDEL==177	;DELETE
	SUBTTL	HARDWARE BITS OF INTEREST TO USERS

;PC FLAGS

PC.OVF==1B0	;OVERFLOW
PC.CY0==1B1	;CARRY 0
PC.CY1==1B2	;CARRY 1
PC.FOV==1B3	;FLOATING OVERFLOW
PC.BIS==1B4	;BYTE INCREMENT SUPPRESSION
PC.USR==1B5	;USER MODE
PC.UIO==1B6	;USER IOT MODE
PC.LIP==1B7	;LAST INSTRUCTION PUBLIC
PC.AFI==1B8	;ADDRESS FAILURE INHIBIT
PC.ATN==3B10	;APR TRAP NUMBER
PC.FUF==1B11	;FLOATING UNDERFLOW
PC.NDV==1B12	;NO DIVIDE
	SUBTTL

	.XCREF

%%MACT==<VRSN. (MAC)>
	PURGE	MACWHO,MACVER,MACMIN,MACEDT


	IF1,<	ASUPPRESS>
	IFNDEF %..C,<END>	;END UNIVERSAL OF MACTEN

	.CREF