perm filename SIMMC2.MAC[SIM,SYS] blob sn#460259 filedate 1979-07-20 generic text, type T, neo UTF8
	SEARCH	SIMMAC
	CUNIV	SIMMC2	;[104]
;AUTHOR:	STEFAN ARNBORG
;VERSION:	 1
;PURPOSE:	PROVIDES PASS 2 GLOBAL SYMBOLS AND MACROS
;CONTENTS:	DEFINITION OF GLOBAL RUNTIME SYMBOLS,
;		PASS 2 UUO:S
;		TAG FIELD VALUES
;		GLOBAL ACCUMULATORS IN PASS 2
;		AND ALL PASS 2 FIELDS AND RECORDS
	IF1,<END>
	PRINTX	UPDATE: 18 - 13-Feb-76/LE
	SALL

; CODE GENERATION ROUTINES
DEFINE	CGINIT=<
DEFINE	GPUSHJ(A)<
	IFNDEF	A'$,<SETZM	YLXIAC>
	L	[PUSHJ	XPDP,A]
	IFGE	<A-400K>,<GENABS
	>
	IFL	<A-400K>,<GENFIX
	>
>
DEFINE	GJRST(A)<
	SETZM	YLXIAC
	L	[JSP	A]
	IFGE	<A-400K>,<GENABS
	>
	IFL	<A-400K>,<GENFIX
	>
>
;--- OPDEF'S
IFDEF O2GWD,<OPDEF	GENDW	[PUSHJ	XPDP,O2GWD]>	;;OUTPUT DOUBLE WORD CONSTANT IN X0-X1
OPDEF	GENOP	[PUSHJ	XPDP,O2GI]	;;OUTPUT INSTRUCTION FROM YO2ADI AND YOPCOD(PREPARED BY O2AD)
OPDEF	GETAD	[PUSHJ	XPDP,O2AD]	;;PREPARE ADDRESS FIELD FOR ZQU POINTED TO BY X1
OPDEF	MEMOP	[PUSHJ	XPDP,CGMO]	;; SKIP IF XP1 POINTS TO DIRECTLY ADDRESSABLE (ZNO) OPERAND
OPDEF	IFMEMO	[PUSHJ	XPDP,CGMO1]	;;REVERSE TO MEMOP
DEFINE	CONST	<WHENNOT XP1,ZCN>
OPDEF	IMMOP	[PUSHJ	XPDP,CGIM]	;;SKIP IF XP1 POINTS TO ZCN NODE WHICH IS IMMEDIATE OPERAND
OPDEF	IFIMMO	[PUSHJ	XPDP,CGIM1]	;;REVERSE TO IMMOP
OPDEF	COMPVAL	[PUSHJ	XPDP,CGVA]
OPDEF	COMPAD	[PUSHJ	XPDP,CGAD]
OPDEF	COMPCA	[PUSHJ	XPDP,CGCA]
OPDEF	COMPCC	[PUSHJ	XPDP,CGCC]
OPDEF	COMPCO	[PUSHJ	XPDP,CGCO]
OPDEF	CLFIX	[PUSHJ	XPDP,O2CF]	;;CLEAR FIXUP FOR REUSE
OPDEF	DEFIX	[PUSHJ	XPDP,O2DF]	;;DEFINE FIXUP
OPDEF	DISPLAY	[PUSHJ	XPDP,CADS]
OPDEF	GENABS	[PUSHJ	XPDP,O2GA]	;;GENERATE ABSOLUTE INSTRUCTION
OPDEF	GENFIX	[PUSHJ	XPDP,O2GF]	;;GENERATE FIXUP TYPE INSTRUCTION
OPDEF	GENREL	[PUSHJ	XPDP,O2GR]	;;GENERATE RELOCATED INSTRUCTION
IFDEF CGRD,<OPDEF	GENRLD	[PUSHJ	XPDP,CGRD]>	;;	GENERATE WORD RELOCATED TO CODE STREAM
OPDEF	GENWRD	[PUSHJ	XPDP,O2GW]	;;GENERATE ONE-WORD CONSTANT
OPDEF	INVAL	[PUSHJ	XPDP,O2IV]	;;INPUT (18-BIT) VALUE TO X0 FROM IC1
DEFINE NEXTOP=<STEP	XP1,ZNO>
OPDEF	NEXT	[POPJ	XPDP,]
OPDEF	OP	[HRLI]			;;GET INSTR LEFT HALFWORD FROM
					;;IMMEDIATE OPERAND (IN PARENTHESES)
OPDEF	OPZ	[HRLZI]			;;AS OP, BUT CLEAR RIGHT HALF (ADDRESS FIELD)
OPDEF	GETAC2	[PUSHJ	XPDP,CGG2]
OPDEF	GETAC3	[PUSHJ	XPDP,CGG3]
OPDEF	GETAC4	[PUSHJ	XPDP,CGG4]
OPDEF	RELAC2	[PUSHJ	XPDP,CGR2]
OPDEF	RELAC3	[PUSHJ	XPDP,CGR3]
OPDEF	RELAC4	[PUSHJ	XPDP,CGR4]
OPDEF	ACFIELD		[POINT	4,0,12]
OPDEF	INDEXFIELD	[POINT	4,0,17]	;; USED FOR CONSTRUCTING GENERATED INTRUCTIONS
OPDEF	LONG	[PUSHJ	XPDP,CGLO]	; SKIP IF X1 POINTS TO ZNO FOR LONG (TWO AC:S) QUANT
OPDEF	IFLONG	[PUSHJ	XPDP,CGLO1]	; OPPOSITE TO LONG
>


; ROUTINE FOR OUTPUT TO ATR.TMP

DEFINE PUTATR(ACC)<
	SOSGE	YBHATR+2
	EXEC	O2ATR
	IDPB	ACC,YBHATR+1
>
	SUBTTL	SWITCH DECLARATIONS


;	COMPILER SWITCH SWITCHES
;	========================

	EXTERNAL	YSWITCH

	DSW	(YSWC,YSWITCH,35)
	DSW	(YSWD,YSWITCH,34)
	DSW	(YSWI,YSWITCH,33)
	DSW	(YSWR,YSWITCH,32)
	DSW	(YSWY,YSWITCH,31)
	DSW	(YSWA,YSWITCH,30)
	DSW	(YSWM,YSWITCH,29)
	DSW	(YSWQ,YSWITCH,28)
	DSW	(YSWW,YSWITCH,27)

;  SWITCHES FOR COMPILE
	EXTERNAL	YLINK

	DSW	(SVALUE,YLINK,0)
	DSW	(SADDRE,YLINK,1)
	DSW	(SCADDR,YLINK,2)
	DSW	(SCCOND,YLINK,3)
	DSW	(SCONDI,YLINK,4)
	DSW	(SCGSKP,YLINK,5)


; DEBUG SWITCHES
	IFN <QDEBUG>,<
	EXTERNAL	YCGDB,YM2DB,YO2DB

	DSW	(SCGDB1,YCGDB,1)
	DSW	(SCGDB2,YCGDB,2)
	DSW	(SCGDB3,YCGDB,3)
	DSW	(SM2DB1,YM2DB,1)
	DSW	(SM2DB3,YM2DB,2)
	DSW	(SM2DB3,YM2DB,3)
	DSW	(SO2D1,YO2DB,34)
	DSW	(SO2D2,YO2DB,33)
	DSW	(SO2D3,YO2DB,32)
	DSW	(SO2D4,YO2DB,31)
	DSW	(SCADB5,YCADB,32)
	>
;  MASKS FOR A,M,Q AND W
;  THESE MASKS ARE USED AS OPERANDS TO THE $OPT OPERATOR IN IC1

	QSWA==1B30
	QSWM==1B29
	QSWQ==1B28
	QSWW==1B27

	
; MACROS FOR ERROR MESSAGES
;
; OPERANDS:
;	OP	EFFECTIVE ADDRESS GIVING THE LEXICAL ID OF AN IDENTIFIER OR OPERATOR
;		TO BE EDITED INTO THE MESSAGE. USUALLY ACTUAL PARAMETER IS (XCUR).
;	NO	DECIMAL MESSAGE NUMBER (THREE NUMBER SERIES FOR PASS2 WARNING, ERROR, AND FATAL MESSAGE, RESPECTIVELY)
;	MESS	TEXT TO BE DUMPED WHEN THE MACRO IS EXECUTED IN THE TEST VERSION,
;		AND A COMMENT IN THE PRODUCTION VERSION
DEFINE WARNING(NO,MESS)=<
	WARN	NO
		IFN QDEBUG,<NOP	[ASCIZ/MESS/]
>>
DEFINE ERROR1(NO,OP,MESS)=<
		IFG <↑D'NO>,<
			IFL <↑D'NO-20>,<
				ERRR	↑D'NO,OP>
			IFGE <↑D'NO-20>,<
				IFL <↑D'NO-40>,<
					ERR1<↑D'NO-20>,OP>
				IFGE <↑D'NO-40>,<CFAIL TOO LARGE ERROR CODE IN ERROR1>
			>
		>
		IFL <↑D'NO>,<CFAIL NEGATIVE ERROR CODE IN ERROR1>
		IFN QDEBUG,<NOP	[ASCIZ/MESS/]
>>
DEFINE ERROR2(NO,MESS)=<
	ERR2	↑D'NO
		IFN QDEBUG,<NOP	[ASCIZ/MESS/]
>>
DEFINE FATAL(NO,MESS)=<
	FATA	↑D'NO
		IFN QDEBUG,<NOP	[ASCIZ/MESS/]>
>
DEFINE SEVER1(NO,OP,MESS)=<
		IFG <↑D'NO>,<
			IFL <↑D'NO-20>,<
				SEV	↑D'NO,OP>
			IFGE <↑D'NO-20>,<
				IFL <↑D'NO-40>,<
					SEV1	<↑D'NO>,OP>
				IFGE <↑D'NO-40>,<CFAIL HIGH CODE NO TO SEVER1>
			>
		>
		IFL <↑D'NO>,<CFAIL NEGATIVE NO TO SEVER1>
		IFN QDEBUG,<NOP	[ASCIZ/MESS/]
>>
DEFINE SEVER2(NO,MESS)=<
	SEV2	<<↑D'NO>B24>
		IFN QDEBUG,<NOP [ASCIZ/MESS/]
>>
; USEFUL CONSTANTS
; FIXUP STATUS CODES
SCALAR <QA,QB,QC,QD,QE1,QF,QG>
; EXPRESSION TREE AND OPERAND STACK NODE TAG VALUES
SCALAR <QZOS,QZLI,QZCN,QZID,QZNS,QZNN>
; EXPRESSION NODE ZNNCOD VALUES
SCALAR<QCODCA,QCODAR,QCODVA,QCODAA,QCODRA>
; OPERAND CHECKING ROUTINE CODES
SCALAR	<Q,QCSAME,QCLEFT,QCHIGH,QCREAL,QCINT>
SCALAR	<Q,QRCLAS,QRBOOL,QRLAST,QRSAME>
SCALAR	<Q,Q,Q,Q,Q,Q,Q,Q,Q,Q,QARITH,QTXREF,QNREF,QNRFBO,QFTREF>
;
; REGISTERS(ACCUMULATORS) USED GLOBALLY IN PASS 2
XCUR==10
XV1==11
XV2==12
XP1==13
XP2=14
XL1=15
XL2=16
XZHE=	X7
DSW	SCERFL,YCERFL,36
EXTERN	YCERFL,YM2DB
; DEFINITIONS OF PASS 2 FIELDS
; DICTIONARY AND REDECLARATION STACK ENTRY
DF ZDCZDC,0,18,17
DF ZDCZQU,0,18,35
; BLOCK STACK ENTRIES
DF ZBSZDC,0,18,17
DF ZBSZHE,0,18,35
; FIXUP TABLE ENTRY
DF ZFXTYP,0,9,8
DF ZFXCOD,0,9,17
DF ZFXVAL,0,18,35
; OPERAND STACK AND EXPRESSION TREE NODES
DF ZNOTER,0,1,0
DF ZNOLST,0,1,1
DF ZNOTYP,0,4,5
DF ZOSLB,0,1,35
; CONSTANT OPERAND
DF ZCNTYP,0,4,11
DF ZCNVAL,1,36,35
; IDENTIFIER OPERAND
DF ZLILID,0,18,35
; SEMANTIC IDENTIFIER
DF ZIDINB,0,1,6
DF ZIDSYS,0,1,7
DF ZIDTYP,0,4,11
DF ZIDMOD,0,3,14
DF ZIDKND,0,3,17
DF ZIDZHE,0,18,35
DF ZIDZQU,1,18,35
DF ZIDZDE,1,18,17
; EXPRESSION NONTERMINAL NODE
DF ZNSTYP,0,4,11
DF ZNSMOD,0,3,14
DF ZNSKND,0,3,17
DF ZNSZNO,0,18,35
DF ZNSZQU,1,18,17
DF ZNSROR,1,1,18
DF ZNSSEF,1,1,19
DF ZNSLEV,1,4,23
DF ZNSGEN,1,12,35
; COMPILED RESULT DESCRIPTION
DF ZNNTYP,0,4,11
DF ZNNMOD,0,3,14
DF ZNNKND,0,3,17
DF ZNNZNO,0,18,35
DF ZNNZQU,1,18,35
DF ZNNCOD,1,18,17
; RELOCATION CODE BITS IN IC2 RECORD
DF ZQREL,0,3,2	; RELOC IN LEFT HALFWORD
DF ZQRER,0,3,20	; RELOC IN RIGHT HALF
; PASS 2 RECORDS
DR ZDC,1
DR ZBS,1
DR ZFX,1
DR ZNO,2
DR ZMP,4,ZDETYP,0	; THIS ONE IS DEFINED WITHOUT TAG FIELD IN MCR.MAC
DR ZCN,2,ZNOTYP,QZCN
DR ZLI,2,ZNOTYP,QZLI
DR ZOS,2,ZNOTYP,QZOS
DR ZID,2,ZNOTYP,QZID
DR ZNS,2,ZNOTYP,QZNS
DR ZNN,2,ZNOTYP,QZNN

;RECORD DISCRIMINATION MACROS

DEFINE	RECTYPE(XB,O)<
	$%REC==XB
	$%O=0
	IFNB <O>,<$%O==O>
>
DEFINE	IS(ZR)<
	IFG $%REC-17,<CFAIL ILLEGAL IS>
	LF()	ZR'%F($%REC,$%O)
	CAIE	ZR'%V
	$%REC==77
>
$%REC==77	;INITIAL VALUE
 END