Google
 

Trailing-Edge - PDP-10 Archives - ap-5069b-sb - 10,6/algstm.mac
There are 8 other files named algstm.mac in the archive. Click here to see a list.
;
;
;
;
;
;
;	COPYRIGHT (C) 1975,1976,1977
;	DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;	THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
;	SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
;	AGREES TO THESE LICENSE TERMS.  TITLE TO AND OWNERSHIP OF THE
;	SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
;
;	THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
;	NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
;	EQUIPMENT CORPORATION.
;
;	DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;	SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
;
;SUBTTL STATEMENT MODULE

; COPYRIGHT 1971,1972,1973 DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

; WRITTEN BY T. TEITELBAUM, L. SNYDER, C.M.U.
; EDITED BY R. M. DE MORGAN.

	HISEG

	SEARCH ALGPRM,ALGMAC	; SEARCH PARAMETER FILES
MODULE MSTM;
$PLEVEL=2;
BEGIN
EXTERN STABLE,ETABLE,LTABLE,FTABLE,DCBYTE,PRIOBYTE,DESCBYTE;
EXPROC BLK1,BLK2,RUND,RUND2,RUND3,RUND5,FAIL,ERREAD,ERR,DSEL,SDOT,SBRACK,BENTRY,BEXIT,PSEUDO;
EXPROC MOB,PCALL,MABS,MREL,SEMERR,RAFIX,EVAL,MJRST0,UNSTACK,REOPEN,CLOSE,PLUNK,IPLUNK,LABREF,GBOOL,GSTAT;
EXPROC MPS,XTNDLB,STADD,SCINS; [E664]
EXPROC DUBDEC,PMBPLT,PMBLNT; [P37]
EXPROC	MRK.1,MRK.2,MRK.3,MRK.4,MRK.5,MRK.6,MRK.7,MRK.8,MRK.9;

;..SIMULATE THE ENVIRONMENT OF PROCEDURE DECLARATION ROUTINE(SPRODEC).;
FAKE FORMCT,PNAME,FSDISP,MXDISP,ST11,RELBLOCK,PARAM1;
SUBTTL ROUTINE FOR <WHILE STATEMENT>.
;
;PARSE:		<WHILE STATEMENT>::= WHILE <BOOLEAN EXPRESSION> DO <STATEMENT>
;
;SYNTAX ERRORS:
;		WHILE NOT IMMEDIATELY PRECEDED BY A DELIMITER
;			BEGIN X WHILE B DO S END
;			      ^
;
;		PENDING STOPPER ENCOUNTERED BEFORE DO
;			BEGIN WHILE A = END DO S END
;					  ^
;
;		WHILE STATEMENT OCCURS WHERE ONLY <UNCONDITIONAL STATEMENT> IS ALLOWED
;			IF B THEN WHILE B DO S ELSE S;
;						  ^
;
;SEMANTIC ERRORS:
;		NOT <BOOLEAN EXPRESSION>
;			WHILE A + B DO S
;				  ^
;
;		NOT <STATEMENT>
;			WHILE B DO A[I];
;				      ^
;
;CODE 	GENERATED:
;		L: <BOOLEAN EXPRESSION>
;		   [TRANSFER TO L2 IF <BOOLEAN EXPRESSION> IS FALSE]
;		   <STATEMENT>
;		   JRST L
;		L2:
;
PROCEDURE SWHILE;
BEGIN
 LOCAL ST6,WHINIT,WHJUMP;
 FORMAL OLDEL;
 MRK.1; PLACE 'FOR' MARKER;
 IF SYM NE PHI
				JUMPE	SYM,FALSE;$
   THEN
     FAIL(8,SOFT,SYM,SYMBOL NOT PERMITTED HERE);
   FI;
 CODE GWHL1;
;----
 ;WHINIT_RA;
				MOVE	T,RA;$
				MOVEM	T,WHINIT;$
 KILLAX;
;-------
 ENDCODE;
 ;ST6_STOPS;
 ;STOPS_STOPS OR 'DO';
				SETSTOPS(ST6,.DO);$
 RUND;
 ESEL;
 ;STOPS_ST6;
				RESTOP(ST6);$
 IF DEL = 'DO'
				DELEL(.DO);$
   THEN
    BEGIN
	CODE GWHL2;
;	----
	GBOOL;
	MOB;
	;WHJUMP<RHS>_(RA-1);
	;WHJUMP<LHS>_CAX;
				MOVE	T,RA;$
				SUBI	T,1;$
				HRL	T,CAX;$
				MOVEM	T,WHJUMP;$
;	-------
	ENDCODE;
	SFALSE(ERRL);
	RUND2;
	MRK.2;	PLACE 'DO' MARKER;
	SSEL;
	CODE GWHL3;
;	----
	GSTAT;
	;T_'JRST'.WHINIT;
				HRLZI	T,<JRST 0>_-22;$
				HRR	T,WHINIT;$
	MREL;
	JOIN(WHJUMP);
	MRK.3;	PLACE 'OD' MARKER;
;	-------
	ENDCODE;
	SFALSE(ERRL);
     ENDD
   ELSE
     FAIL(12,HARD,DEL,ILLEGAL DELIMITER FOUND BEFORE 'DO');
 FI
 IF DEL = 'ELSE' AND OLDEL = 'STHEN'
				DELEL(.ELSE);$
				MOVE	T,OLDEL;$
				TEL(OTHEN);$
   THEN
     FAIL(13,SOFT,DEL,WHILE STATEMENT IS NOT UNCONDITIONAL STATEMENT);
 FI
 CODE GWHL4;
;----
 STATEMENT;
;-------
 ENDCODE;
ENDD;


SUBTTL ROUTINE FOR <UNLABELLED CONDITIONAL STATEMENT>.
;
;PARSE:		<UNLABELLED CONDITIONAL STATEMENT>::=
;			<IF STATEMENT>/
;			<IF STATEMENT> ELSE <STATEMENT>/
;			<IF CLAUSE> <FOR STATEMENT>/
;			<IF CLAUSE> <WHILE STATEMENT>
;		WHERE <IF CLAUSE>::=IF <BOOLEAN EXPRESSION> THEN
;		AND   <IF STATEMENT>::= <IF CLAUSE><UNCONDITIONAL STATEMENT>
;
;SYNTAX ERRORS:
;		IF NOT PRECEDED BY A DELIMITER
;			BEGIN X IF B THEN S;S END
;			      ^
;
;		THIS STATEMENT OCCURS WHERE ONLY <UNCONDITIONAL STATEMENT> IS ALLOWED
;			IF B THEN IF B THEN S;
;				   ^
;
;		PENDING STOPPER ENCOUNTERED BEFORE THEN
;			IF B = END THEN S ELSE S
;				 ^
;
;		SPURIOUS SEMICOLON BEFORE ELSE
;			IF B THEN S; ELSE S
;				   ^
;
;
PROCEDURE SSIF;
BEGIN
 REGISTER REGIF;
 LOCAL ST7,IFJUMP;
 FORMAL OLDEL;
 MRK.4;	PLACE 'IF' MARKER
 IF SYM NE PHI
				JUMPE	SYM,FALSE;$
    THEN
      FAIL(8,SOFT,SYM,SYMBOL NOT PERMITTED HERE);
    FI;
 IF OLDEL ='STHEN'
				MOVE	T,OLDEL;$
				TEL(OTHEN);$
  THEN
    FAIL(14,HARD,DEL,'THEN IF' ILLEGAL);
 FI;
 ;ST7_STOPS;
 ;STOPS_STOPS OR 'THEN';
				SETSTOPS(ST7,.THEN);$
 RUND;
 ESEL;
 IF DEL = 'THEN'
				DELEL(.THEN);$
   THEN
     BEGIN
;	----
	CODE GSIF1;
	 GBOOL;
	 MOB;
	 ;IFJUMP<RHS>_(RA-1);
				HRRZ	T,RA;$
				SUBI	T,1;$
	 ;IFJUMP<LHS>_CAX;
				HRL	T,CAX;$
				MOVEM	T,IFJUMP;$
;	-------
	ENDCODE;
	SFALSE(ERRL);
	;STOPS_ST7 OR 'SELSE';
				MOVE	STOPS,ST7;$
				ADDSTOPS(.ELSE);$
	RUND2;
	MRK.5;	PLACE 'THEN' MARKER;
	SSEL(OTHEN);
	;STOPS_ST7;
				RESTOPS(ST7);$
	CODE GSIF2;
;       ----
        GSTAT;
;       -------
	ENDCODE;
	SFALSE(ERRL);
     ENDD
   ELSE
     BEGIN
	;STOPS_ST7;
				RESTOPS(ST7);$
	FAIL(15,HARD,DEL,THEN STATEMENT NOT FOUND);
	IF DEL NE 'ELSE'
				DELNEL(.ELSE)
	  THEN
	    ;..SORRY TO HAVE TO DO THIS;
	    GOTO RETURN;
	FI;
     ENDD
 FI;
 IF DEL = SC AND NDEL = 'ELSE' AND NSYM = PHI
				DELEL(.SC);$
				NDELEL(.ELSE);$
				SKIPE	NSYM;$
				GOTO	FALSE;$
   THEN
      BEGIN
	FAIL(10,SOFT,DEL,SPURIOUS SEMICOLON);
	;REGIF_SYM;
				MOVE	REGIF,SYM;$
	RUND;
	;SYM_REGIF;
				MOVE	SYM,REGIF;$
      ENDD
 FI;
 IF DEL = 'ELSE'
				DELEL(.ELSE);$
   THEN
      BEGIN
	CODE GSIF3;
;	----
 IF SYM<TYPE> NE LABEL
				TLNN	SYM,$TYPE;$
				GOTO	TRUE;$
				TN.L;$
   THEN
     BEGIN
	MJRST0;
	FIXREL(IFJUMP);
	;IFJUMP<RHS>_RA-1;
				HRRZ	T,RA;$
				SUBI	T,1;$
				HRRM	T,IFJUMP;$
     ENDD
   ELSE
    BEGIN
	FIXREL(IFJUMP);
	;CAX_IFJUMP<LHS>;
	;IFJUMP<RHS>_0;
				HLLZS	T,IFJUMP;$
				HLRZM	T,CAX;$
     ENDD
 FI;
 ;EXCHANGE(CAX,IFJUMP<LHS>);
				HLRZ	T,IFJUMP;$
				EXCH	T,CAX;$
				HRLM	T,IFJUMP;$
;	-------
	ENDCODE;
	RUND2;
	MRK.6;	PLACE 'ELSE' MARKER;
	SSEL;
	CODE GSIF4;
;	----
	GSTAT;
;	-------
	ENDCODE;
	SFALSE(ERRL);
      ENDD
 FI;
;----
 CODE GSIF5;
 FIXREL(IFJUMP);
 MRK.7;	PLACE 'FI' MARKER
 IF CAX NE IFJUMP<LHS>
				HLRZ	T,IFJUMP;$
				CAMN	T,CAX;$
				GOTO	FALSE;$
  THEN
    KILLAX
 FI;
 STATEMENT
;-------
 ENDCODE;
RETURN: ENDD;
SUBTTL ROUTINE FOR <UNLABELLED BLOCK> / <UNLABELLED COMPOUND>.
;
;PARSE:		<UNLABELLED BLOCK>::= <BLOCK HEAD> ; <COMPOUND TAIL>
;		<UNLABELLED COMPOUND>::= BEGIN <COMPOUND TAIL>
;			WHERE <COMPOUND TAIL>::=<STATEMENT> END/
;						<STATEMENT>;<COMPOUND	TAIL>
;
;SYNTAX ERRORS:
;		BEGIN NOT IMMEDIATELY PRECEDED BY A DELIMITER
;			IF B THEN L BEGIN S; S END;
;				  ^
;
;		<BLOCK HEAD> NOT FOLLOWED BY SEMICOLON
;			BEGIN REAL X, Y, Z END
;					     ^
;
;		MISSING SEMICOLON
;			BEGIN S END WHILE B DO S;
;				   ^
;
;		NO DELIMITERS ALLOWED IN COMMENT AFTER END
;			BEGIN S END OF THIS OR THAT 
;					      ^
;		MISSING END
;			IF B THEN BEGIN S; S; S ELSE S
;						   ^
;
;SEMANTIC ERRORS:
;		NOT <STATEMENT>
;			BEGIN S; A[I]; S END
;				    ^
;
PROCEDURE SBEGIN;
BEGIN
 LOCAL BLOCK,OLDPS,SAVCLB,OLDAD,FSDSAVE;
 FORMAL OLDEL;
 IF SYM NE PHI
				JUMPE	SYM,FALSE;$
   THEN
     FAIL(8,SOFT,SYM,SYMBOL NOT PERMITTED HERE);
  FI;
 PSEUDO;
 CODE GBEG0;
;----
 ;OLDPS_PROSKIP;
				MOVE	T,PROSKIP;$
				MOVEM	T,OLDPS;$
 ZERO(PROSKIP);
 ;OLDAD_ARDEC;
				MOVE	T,ARDEC;$
				MOVEM	T,OLDAD;$
 SETF(ARDEC);
;-------
 ENDCODE;
 IF NDEL NOT ELEMENT OF DECSPEC
				MOVE	T,NDEL;$
				TNEL(DECSPEC);$
   THEN
      CODE GBEG1;
;      ----
	SETF(BLOCK);
;      -------
      ENDCODE;
   ELSE
     BEGIN
	CODE GBEG2;
;	----
	;FSDSAVE_FSDISP;
				MOVE	T,FSDISP;$
				MOVEM	T,FSDSAVE;$
	SETT(BLOCK);
	BENTRY;
	INCR(LEXBLOCK);
	;SAVCLB_CURBLOCK;
				MOVE	T,CURBLOCK;$
				MOVEM	T,SAVCLB;$
	;CURBLOCK_LEXBLOCK;
				MOVE	T,LEXBLOCK;$
				MOVEM	T,CURBLOCK;$
	;PRINT BLOCK ENTRY MESSAGE;
	BLK1;
	INCR(RELBLOCK);
	MCALL(BLKBEG);
;	-------
	ENDCODE;
	LOOP
	  BEGIN
	    RUND2;
	    DSEL;
	    SFALSE(ERRL);
	  ENDD
	AS DEL = SC AND NDEL IS DECSPEC
				TEST(N,DEL,.SC);$
				GOTO	FALSE;$
				NDELEL(DECSPEC);$
	SA;
	CODE GBEG3;
;	----
	IF PROSKIP NE 0
				SKIPN	T,PROSKIP;$
				GOTO	FALSE;$
	  THEN
	   JOIN;..(PROSKIP);
	FI;
;	-------
	ENDCODE;
	IF DEL NE SC
				DELNEL(.SC);$
	  THEN
	    FAIL(16,SOFT,SYM,DECLARATIONS MUST BE FOLLOWED BY SEMICOLON);
	    IF DEL ELEMENT STOPS
				TDNN	DEL,STOPS;$
				GOTO	FALSE;$
	      THEN
		GOTO SBEG1;
	    FI;
	FI;
     ENDD;
 FI;


	LOOP
	  BEGIN
	    RUND2;
	    SSEL;
	    CODE GBEG4;
;	    ----
	    GSTAT;
;	    -------
	    ENDCODE;
	    SFALSE(ERRL);
	  ENDD;
	AS DEL = SC;
				DELEL(.SC);$
	SA;

	SBEG1:
	IF DEL = END
				DELEL(.END);$
	  THEN
	    BEGIN
	      ;..PRINT BLOCK END;
	      IF BLOCK
				SKIPN	BLOCK;$
				GOTO	FALSE;$
		THEN
		  BEGIN
		  ;T_SAVCLB;
				MOVE	T,SAVCLB;$
		  BLK2;
		  ENDD;
	      FI;
EDIT(664) ;DONT ALLOW BEGIN IN COMMENT (NOT STRICTLY ALGOL, BUT..)
		WHILE NDEL NOT ELEM SC END ELSE EOF BGIN;[E664]
				MOVE	T,NDEL	; [E664]
				CAMN	T,ZBEGIN; [E664]
				GOTO	FALSE	; [E664]
				NDELNEL(.SC!.END!.ELSE!.EOF);$[E601]
		  DO;[E601]
		    ZERO(NSYM);$[E601]
		    RUND;[E601]
		  OD;[E601]
		ZERO(NSYM); [E664]
		IF NDEL EQ BGIN ; [E664]
				MOVE	T,NDEL	; [E664]
				CAME	T,ZBEGIN; [E664]
				GOTO	FALSE	; [E664]
		  THEN; [E664]
		  SCINS; [E664]
		  ELSE ; [E664]
		  RUND ; [E664]
		FI; [E664]
EDIT (601) ; ALLOW = ETC IN COMMENTS AFTER 'END'
	    ENDD
	  ELSE
		FAIL(20,SOFT,SYM,MISSING END);
	FI;
	IF BLOCK
				SKIPN	BLOCK;$
				GOTO	FALSE;$
	  THEN
	    BEGIN
		CODE GBEG5;
;		----
		;ALLOW PAUSE ON THE "END"
				TRNN	FL,TRPOFF	;IF TRACING
				PUSHJ	SP,.ESBLK##	; CALL SPECIAL ROUTINE
		IF ARDEC
				SKIPN	ARDEC;$
				GOTO	FALSE;$
		  THEN
		    MCALL(BLKEND)
		  ELSE
		    MABSI(<SOS	PLBLKL(DL)>);
		    MABSI(<POP	SP,BLKPTR(DL)>)
		    MABSI(<SOS %TRLV(DB)>);
		FI;
		;MXDISP_MAX(MXDISP,FSDISP);
				MOVE	T,FSDISP;$
				CAMLE	T,MXDISP;$
				MOVEM	T,MXDISP;$
		BEXIT;
		;CURBLOCK_SAVCLB;
				MOVE	T,SAVCLB;$
				MOVEM	T,CURBLOCK;$
		DECR(RELBLOCK);
		;FSDISP_FSDSAVE;
				MOVE	T,FSDSAVE;$
				MOVEM	T,FSDISP;$
;		-------
		ENDCODE;
	    ENDD;
	FI;
	CODE GBEG6;
;	----
	;PROSKIP_OLDPS;
				MOVE	T,OLDPS;$
				MOVEM	T,PROSKIP;$
	;ARDEC_OLDAD;
				MOVE	T,OLDAD;$
				MOVEM	T,ARDEC;$
	STATEMENT;
;	-------
	ENDCODE;
ENDD;
SUBTTL ROUTINE FOR <UNLABELLED GOTO STATEMENT>
;PARSE:	<GOTO STATEMENT>::= GOTO <DESIGNATIONAL EXPRESSION>
;
;SYNTAX ERRORS:
;		GOTO NOT FOLLOWED BY DESIGNATIONAL EXPRESSION
;			GOTO L+1;
;			      ^
;
;SEMANTICS ERRORS:
;		GOTO NOT FOLLOWED BY LABEL VALUED EXPRESSION
;			BEGIN INTEGER L; GOTO L END
;					      ^
;
;CODE GENERATED:
;	1) GOTO L(THIS BLOCK)
;		JRST L+2
;	2) GOTO L; (OUTER BLOCK)
;		JRST L
;	3) GOTO <OTHER DESIGNATIONAL EXPRESSION>
;		JUMPN A2,(A2)
;		[DESIGNATIONAL EXPRESSION PUTS VALUE IN REGISTER AL OR
;		ZERO IF SWITCH IS OUT OF BOUNDS]
PROCEDURE SGOTO;
BEGIN
 RUND5;
 MRK.8;	PLACE 'GOTO' MARKER
 LSEL;
 CODE GGO;
;----
 LABREF;
 EVAL;
 IF SYM<ADDRESS MODE> = SINGLE
				T.SINGLE;$
   THEN
     BEGIN
	;..NOTE THAT SYM IS BEING CLOBBERED!;
	MRK.9;	PLACE 'TO' MARKER
	;T_'JRST'.SYM;
				HRLZI	T,<JRST	0>_-22;$
				TLZ	SYM,777777-$AM;$
				IOR	T,SYM;$
	MPS;
	STATEMENT($L);
     ENDD;
   ELSE
     BEGIN
	MOB;
	MRK.9;	PLACE 'TO' MARKER
	;..GENERATE 'JUMPN	A2,(A2)';
	;T_'JUMPN	A2,.-.'!$SELF;
				HRLZI	T,<JUMPN A2,0>_-22!$SELF;$
	MPS;
	STATEMENT;
     ENDD;
 FI;
;-------
 ENDCODE;
 SFALSE(ERRL);
ENDD;
SUBTTL ROUTINE FOR LABEL DECLARATION
PROCEDURE SCOL;
BEGIN
KILLAX;
LOOP
 BEGIN
 CODE GCOL1;
;----
 IF SYM EQ PHI OR SYM<ADDRESS MODE> NE SIMPLE VARIABLE IN SYMBOL TABLE
EDIT(663) ; CHECK TYPE OF APPARENT LABELS MORE CAREFULLY
				JUMPE	SYM,TRUE;$
				HLRZ	T,SYM	; [E663]
				ANDI	T,$AM	; [E663]
				CAIN	T,$ST	; [E663]
				GOTO	FALSE	; [E663]
  THEN
   SEMERR(105,0,LABEL IDENTIFIER)
  ELSE
   BEGIN
    IF SYM EQ VIRGIN IDENTIFIER AND NOT EXTENDED [E541]
				T.VIRGIN;$
				SKIPGE	STW0;$[E541]
				JRST	FALSE;$[E541]
EDIT (541)	; SOMETIMES EXTENDED TWICE FOR UNDECL. LABELS
     THEN
      XTNDLB
     ELSE
      IF ST[SYM]<BLOCKLEVEL> LT BLOCKLEVEL
				HLRZ	T,STW0;$
				ANDI	T,$BL;$
				LSH	T,-6;$
				CAML	T,BLOCKLEVEL;$
				GOTO	FALSE;$
	THEN
	 STADD
	ELSE
	 IF SYM<DECL>
				T.DECL;$
	 THEN
	  BEGIN
	   DUBDEC;
	   GOTO COLEND;
	  ENDD;
	 FI;
      FI;
    FI;
    ;ST[SYM]<WORD1>_[VAR,LABEL,SIMPLE,DECLARED] . RA+1+PMBLNT; [P37]
    ;T1_PMBLNT;
EDIT(624) ;SET UP L.H. OF SYM BEFORE CALLING PMBLNT
				TLO	SYM,$VAR!$L!$SIM!$DECL	; [E624]
    PMBLNT;
				MOVE	T1,T;$
				ADDI	T,1;$
				ADD	T,RA;$
				HRLI	T,$VAR!$L!$SIM!$DECL;$
				MOVEM	T,STW1;$
;-------
 ENDCODE;
IF LABEL TRACE REQUIRED
				TNGB(TRLOFF);$
    THEN
      GCOL2;	PLANT PMBLOCK AND LABEL CODE (ONE FOR EACH NAME HERE)
FI;
   ENDD;
  FI;
COLEND:
EDIT (606) ; LOOP IN PMBPLT ON SOME ERRORS

  RUND2;
ENDD;
AS DEL EQ COLON
				DELEL(.COLON);
SA;
IF NOT TRACING LABELS;
				TGB(TRLOFF);$
    THEN;  NEED TO PLANT JUST ONE BLOCK OF LABEL CODE;
        BEGIN
        ; T1_0; MARK LENGTH OF PMB ZERO;
				SETZ	T1,;$
	GCOL2;
        ENDD;
    FI;
SFALSE(ERRL);
ENDD;
PROCEDURE GCOL2;

BEGIN
	LOCAL PMBSAV;
    ;..PUT OUT THE 3 INSTRUCTION SEQUENCE.
    ;T_'JRST .+3+PMBLNT';
				HRLZI	T,<JRST 0>_-22;$
				ADD	T,RA;$
				ADDI	T,3(T1);$ [P37]
    MREL;

IF TRACING LABELS;
				TNGB(TRLOFF);$
    THEN;
    BEGIN;
    ; SAVE POINTER TO PMBLOCK
				MOVE	T,RA;$
				MOVEM	T,PMBSAV;$
    PMBPLT;		PLANT PMB HERE [P37]
    ENDD;
FI;
    MCALL(GOLAB);
    ;T_'RELBLOCK,FNLEVEL-1(DL)';
				HRLZ	T,RELBLOCK;$
				LSH	T,+5;$
				TLO	T,DL;$
				HRR	T,FNLEVEL;$
				SUBI	T,1;$
    MABS;

IF TRACING LABELS;
				TNGB(TRLOFF);$
    THEN; PLANT CALL TO LABEL TRACE ROUTINE;
        BEGIN;
        MCALL(TRLAB);
	; MREL(PMBPTR);
				MOVE	T,PMBSAV;$
				MREL;
        ENDD;
FI;
ENDD;
SUBTTL PROCEDURE FOR CHECKON,CHECKOFF,LISTON,LISTOFF,LINE
PROCEDURE SONOFF;
BEGIN
 REGISTER SUBCLASS;
 ;SUBCLASS_DEL<DESC>;
				LDB	SUBCLASS,DESCBYTE;$
 RUND5;
 WHILE DEL ELEMENT STOPS
				NOTSTOPS;$
   DO
     IF ERRL
				TGB(ERRL);$
	THEN
	  ERREAD
	ELSE
	  FAIL(18,HARD,DEL,ILLEGAL ARGUMENT);
     FI;
   OD;
 IF NOT ERRL
				TNGB(ERRL);$
   THEN
     BEGIN
       IF SYM = IMMEDIATE INTEGER CONSTANT
				T.IMM;$
				T.I;$
	 THEN
	   BEGIN
	     IF SUBCLASS = LINE
				CAIE	SUBCLASS,DESC<LINE>;$
				GOTO	FALSE;$
	       THEN
		 ;LINENO_SYM<RHS>;
				HRRM	SYM,LINENO;$
	       ELSE
		 IF SYM GE 3
				TLZ	SYM,777777;$
				CAIGE	SYM,3;$
				GOTO	FALSE;$
		   THEN
		     SONERR: FAIL(19,SOFT,SYM,ARGUMENT TOO LARGE);
		   ELSE
		     ;SUBCLASS_SUBCLASS;
		     ;EVALUATE(OOTABLE[SUBCLASS]);
				XCT	OOTABLE(SUBCLASS);$
		   IF ACON
				TGB(ACON);
		     THEN
		     ; FORCE ACOO _ 1;
				STRUE(ACOO);
		   FI;
		   IF ACOFF
				TGB(ACOFF);
		     THEN
		     ; FORCE ACOO _ 0;
				SFALSE(ACOO);
		   FI;
PATCH (15)	; IMPLEMENT CHECKON/CHECKOFF SWITCHES
		 FI;
	     FI;
	   ENDD;
	 ELSE
	   FAIL(18,SOFT,SYM,ILLEGAL ARGUMENT);
	FI;
     ENDD;
 FI;
 CODE GSONOFF;
;----
 STATEMENT;
;-------
 ENDCODE;
ENDD;
 ;EXECUTE TABLE TO SET ON/OFF SWITCHES

 OOTABLE:	STRUE(LISTOO);
		STRUE(OBOO);
		GOTO	SONERR;
		SFALSE(LISTOO);
		SFALSE(OBOO);
		GOTO	SONERR;
		STRUE(LNOO);
		STRUE(ACOO);
		GOTO	SONERR;
		SFALSE(LNOO);
		SFALSE(ACOO);
		GOTO	SONERR;
ENDD; OF MODULE MSTM

LIT
END