Google
 

Trailing-Edge - PDP-10 Archives - klad_sources - klad.sources/dbkcct.mac
There are no other files named dbkcct.mac in the archive.
;MAINDEC-10-DBKCC

DECVER=003
MCNVER=000

	XLIST
DEFINE	NAME	(MCNVER,DECVER),<
TITLE	DBKCC PDP-10 KI10 ADVANCED INSTRUCTION DIAGNOSTIC #3, VERSION MCNVER,DECVER >
	LIST
	LALL

NAME	\MCNVER,\DECVER

	XALL
;(FIX,FIXR,FLTR AND DOUBLE MOVE)

;COPYRIGHT 1972, 1973, 1974,1975
;DIGITAL EQUIPMENT CORPORATION
;MAYNARD, MASS., 01754

;JOHN R. KIRCHOFF
;LINDA GARLAND

LOC	137
MCNVER,,DECVER
	NOSYM
SUBTTL	DIAGNOSTIC PARAMETERS

;OPERATOR DEFINITIONS

OPDEF	ER1	[1B8]
OPDEF	ER2	[2B8]
OPDEF	ER3	[3B8]
OPDEF	ER4	[4B8]
OPDEF	ER5	[5B8]
OPDEF	ER6	[6B8]
OPDEF	ER7	[7B8]
OPDEF	ER10	[10B8]
OPDEF	ER11	[11B8]
OPDEF	ER12	[12B8]
OPDEF	ER13	[13B8]

LUUO1==ERRMES
LUUO2==ERRMES
LUUO3==ERRMES
LUUO4==ERRMES
LUUO5==ERRMES
LUUO6==ERRMES
LUUO7==ERRMES
LUUO10==ERRMES
LUUO11==ERRMES
LUUO12==ERRMES
LUUO13==ERRMES

;SUBROUTINE ASSEMBLY DEFINITIONS

DEBUG=100
EXCASB=1
USRASB=1
KI10=1
PGMEND=1
ERDIAG=1
KLOLD=1
MODDVU=BEGIN
MODDVL=BEGIN

;MACROS

DEFINE	SAVEAC	(A,B)<
	MOVEI	SAC,.
	MOVEM	SAC,TESTPC	;SETUP SUBTEST PC
	MOVEI	SAC,SAC		;INFORM ERROR ROUTINE WHICH
	MOVEM	SAC,ERRLOP#	;AC IS USED FOR ITERATION>

;BEGIN ASSEMBLY PARAMETERS

SADR1=BEGIN
SADR2=RESRT1
SADR3=RENTR1
SADR4=BEGIN
SADR5=BEGIN
SADR6=BEGIN
SADR7=0
SADR8=0
SADR9=0
SADR10=0
SADR11=0

PAREA1=0
PAREA2=0
PAREA3=SIXBIT/DBKCC/
PAREA4=SIXBIT/PNT/
PAREA5=0
PAREA6=0

ITERAT=1000
DEFINE	DMVE	(L,A,B,C,D)	<
;THIS MACRO TESTS THE DMOVE INSTRUCTION
;FIRST, AC, AC+1 ARE PRELOADED WITH DATA OTHER THAN THE TEST WORDS.
;THEN, THE DATA SPECIFIED BY [XWD A,B] AND [XWD C,D] IS MOVED
;FROM MEMORY TO AC, AC+1 VIA THE DMOVE INSTRUCTION.
;C(AC) AND C(AC+1) ARE THEN COMPARED WITH THE TEST WORDS
;[XWD A,B] AND [XWD C,D], RESPECTIVELY.  THE TEST PASSES IF THESE
;COMPARISONS AGREE.

Q'L'0:	MOVE	AC+5,[XWD A,B]	;INITIALIZE TEST WORDS
	MOVE	AC+6,[XWD C,D]	;FOR COMPARISON
	MOVE	AC,[XWD 707070,707070]
	MOVE	AC+1,[XWD 070707,070707]  ;INITIALIZE AC,AC+1
	DMOVE	AC,[XWD A,B	;*MOVE DOUBLE WORD A,B ; C,D
		    XWD C,D]	;FROM MEMORY TO AC, AC+1
	CAME	AC,<AC+5>&17	;WAS AC LOADED CORRECTLY?
	ER3	AC,L'1	;FAIL IF CONTENTS(AC) NOT = A,B
	CAME	AC+1,<AC+6>&17	;WAS AC+1 LOADED CORRECTLY?
	ER4	AC+1,L'2	;FAIL IF CONTENTS(AC+1) NOT = C,D
	JUMPL	SAC,Q'L'0	;LOOP ON ERROR SWITCH>


DEFINE 	DMVE17	(L,T,A,B,C,D)	<
;THIS MACRO TESTS THE DMOVE INSTRUCTION
;FIRST, AC, AC+1 ARE PRELOADED WITH DATA OTHER THAN THE TEST WORDS.
;THEN, THE DATA SPECIFIED BY [XWD A,B] AND [XWD C,D] IS MOVED
;FROM MEMORY TO AC, AC+1 VIA THE DMOVE INSTRUCTION.
;C(AC) AND C(AC+1) ARE THEN COMPARED WITH THE TEST
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
;THE TEST PASSES IF THESE COMPARISONS AGREE.

Q'T'0:	MOVEM	AC,%SV17#	;SAVE AC17
Q'L'0:	MOVE	AC+5,[XWD A,B]	;INITIALIZE TEST WORDS
	MOVE	AC+6,[XWD C,D]	;FOR COMPARISON
	MOVE	AC,[XWD 707070,707070]
	MOVE	AC+1,[XWD 070707,070707]  ;INITIALIZE AC,AC+1
	DMOVE	AC,[XWD A,B	;*MOVE DOUBLE WORD A,B ; C,D
		    XWD C,D]	;FROM MEMORY TO AC, AC+1
Q'T'3:	CAMN	AC,<AC+5>&17	;WAS AC LOADED CORRECTLY?
	JRST	.+4		;HERE IF NO ERROR
	MOVEM	AC,AC-1		;STORE INCORRECT RESLUTS
	MOVE	AC,%SV17	;RESTORE P
	ER3	AC-1,L'1	;FAIL IF CONTENTS(AC) NOT = A,B
	CAMN	AC+1,<AC+6>&17	;WAS AC+1 LOADED CORRECTLY?
	JRST	.+4		;HERE IF NO ERROR
	MOVEM	AC+1,AC-1	;STORE INCORRECT WORD
	MOVE	AC,%SV17	;RESTORE P
	ER4	AC-1,L'2
	MOVE	AC,%SV17	;RESTORE AC UNCONDITIONALLY
	JUMPL	SAC,Q'T'0	;LOOP ON ERROR SWITCH>
DEFINE	DMVN	(L,A,B,C,D)	<
;THIS MACRO TESTS THE DMOVN INSTRUCTION
;FIRST, AC, AC+1 ARE PRELOADED WITH DATA OTHER THAN THE TEST WORDS.
;THEN, THE NEGATIVE (TWOS COMPLEMENT) OF THE DATA SPECIFIED BY
;[XWD A,B] AND [XWD C,D] IS MOVED FROM MEMORY TO AC, AC+1 VIA
;THE DMOVN INSTRUCTION.  C(AC) AND C(AC+1) ARE THEN COMPARED
;WITH THE NEGATIVE (TWOS COMPLEMENT) OF THE TEST
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
;THE TEST PASSES IF THESE COMPARISONS AGREE.

Q'L'0:	DMOVE	AC,[XWD 707070,707070
		    XWD 070707,070707]  ;INITIALIZE AC,AC+1
	SETCM	AC+5,[XWD A,B]	;INITIALIZE TEST WORDS FOR COMPARISON
	IFIDN	<C,D><0,0>,<
	SETZ	AC+6,
	ADDI	AC+5,1	>
	IFIDN	<C,D><400000,0>,<
	SETZ	AC+6,
	ADDI	AC+5,1	>
	IFDIF	<C,D><0,0>,<
	IFDIF	<C,D><400000,0>,<
	MOVN	AC+6,[XWD C,D]
	TLZ	AC+6,1B18	;CLEAR SIGN BIT OF LOW ORDER WORD >>
	DMOVN	AC,[XWD A,B	;*MOVE NEGATIVE OF DOUBLE WORD A,B ;
		    XWD C,D]	;C,D FROM MEMORY TO AC, AC+1
	CAME	AC,<AC+5>&17	;WAS AC LOADED CORRECTLY?
	ER3	AC,L'1	;FAIL IF CONTENTS(AC) NOT = COMPLEMENT OF A,B
	CAME	AC+1,<AC+6>&17	;WAS AC+1 LOADED CORRECTLY?
	ER4	AC+1,L'2	;FAIL IF CONTENTS(AC+1) NOT = MINUS C,D
	JUMPL	SAC,Q'L'0	;LOOP ON ERROR SWITCH>
DEFINE	DMVN17	(L,A,B,C,D)	<
;THIS MACRO TESTS THE DMOVN INSTRUCTION
;FIRST, AC, AC+1 ARE PRELOADED WITH DATA OTHER THAN THE TEST WORDS.
;THEN, THE NEGATIVE (TWOS COMPLEMENT) OF THE DATA SPECIFIED BY
;[XWD A,B] AND [XWD C,D] IS MOVED FROM MEMORY TO AC, AC+1 VIA
;THE DMOVN INSTRUCTION.  C(AC) AND C(AC+1) ARE THEN COMPARED
;WITH THE NEGATIVE (TWOS COMPLEMENT) OF THE TEST
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
;THE TEST PASSES IF THESE COMPARISONS AGREE.

Q'L'0:	MOVEM	AC,%SV17	;SAVE P
	DMOVE	AC,[XWD 707070,707070
		    XWD 070707,070707]  ;INITIALIZE AC,AC+1
	SETCM	AC+5,[XWD A,B]	;INITIALIZE TEST WORDS FOR COMPARISON
	IFIDN	<C,D><0,0>,<
	SETZ	AC+6,
	ADDI	AC+5,1	>
	IFIDN	<C,D><400000,0>,<
	SETZ	AC+6,
	ADDI	AC+5,1	>
	IFDIF	<C,D><0,0>,<
	IFDIF	<C,D><400000,0>,<
	MOVN	AC+6,[XWD C,D]
	TLZ	AC+6,1B18	;CLEAR SIGN BIT OF LOW ORDER WORD >>
	DMOVN	AC,[XWD A,B	;*MOVE NEGATIVE OF DOUBLE WORD A,B ;
		    XWD C,D]	;C,D FROM MEMORY TO AC, AC+1
	CAMN	AC,<AC+5>&17	;WAS AC LOADED CORRECTLY?
	JRST	.+4		;HERE IF TESTS OK
	MOVEM	AC,AC-1		;SAVE BAD WORD
	MOVE	AC,%SV17	;RESTORE P
	ER3	AC-1,L'1	;FAIL IF CONTENTS(AC) NOT = COMPLEMENT OF A,B
	CAMN	AC+1,<AC+6>&17	;WAS AC+1 LOADED CORRECTLY?
	JRST	.+4		;HERE IF TESTS OK
	MOVEM	AC,AC-1
	MOVE	AC,%SV17	;RESTORE P
	ER4	AC+1,L'2	;FAIL IF CONTENTS(AC+1) NOT = MINUS C,D
	MOVE	AC,%SV17	;RESTORE P UNCODITIONALLY
	JUMPL	SAC,Q'L'0	;LOOP ON ERROR SWITCH>
DEFINE	DMVNF	(L,A,B,C,D,KIEF,KIUF,KLEF,KLUF)	<
;**KI10**
;THIS MACRO VERIFIES THAT THE DMOVN INSTRUCTION DOES NOT SET OVERFLOW
;OR CARRY FLAGS ON THE KI10.  FIRST, OVFL AND CRY0,1 FLAGS ARE CLEARED;
;THEN,DMOVN IS EXECUTED.  NEXT, OVFL AND CRY0,1 FLAGS ARE EXAMINED.
;IF ANY OF THESE FLAGS ARE SET, THE TEST FAILS.

;**KL10**
;THIS MACRO VERIFIES THAT THE DMOVN INSTRUCTION DOES SET OVERFLOW
;OR CARRY FLAGS ON THE KL10.  FIRST, OVFL AND CRY0,1 FLAGS ARE CLEARED;
;THEN,DMOVN IS EXECUTED.  NEXT, OVFL AND CRY0,1 FLAGS ARE EXAMINED.
;IF THE PROPER FLAGS ARE NOT SET, THE TEST FAILS.

Q'L'0:	JFCL	17,.+1		;CLEAR OVFL AND CRY0,1 FLAGS
	DMOVN	AC+1,[XWD A,B	;*DMOVN TEST
		      XWD C,D]
	JSP	AC,.+1		;READ FLAGS
Q'L'1:	TLZ	AC,027777	;CLEAR EXTRA JUNK
	TLNE	AC,USERF	;IN USER MODE ?
	JRST	Q'L'4		;YES
	SKIPE	KLFLG		;KL10 ?
	JRST	Q'L'3		;YES
;KI10 EXEC MODE
	CAME	AC,[KIEF,,Q'L'1]
	ER13	AC,L'1		;FAIL IF OVFL OR CRY0,1 FLG SET
Q'L'2:	JUMPL	SAC,Q'L'0	;LOOP ON ERROR SWITCH
	JRST	Q'L'6
;KL10 EXEC MODE
Q'L'3:	CAME	AC,[KLEF,,Q'L'1]
	ER13	AC,L'1		;FAIL IF FLAGS NOT SET
	JRST	Q'L'2
;KL10/KI10 USER MODE
Q'L'4:	SKIPE	KLFLG		;KL10 ?
	JRST	Q'L'5		;YES
;KI10 USER MODE
	CAME	AC,[KIUF,,Q'L'1]
	ER13	AC,L'1		;FAIL IF ANY FLAGS SET
	JRST	Q'L'2
;KL10 USER MODE
Q'L'5:	CAME	AC,[KLUF,,Q'L'1]
	ER13	AC,L'1		;FAIL IF FLAGS NOT SET
	JRST	Q'L'2

Q'L'6:	JRST	.+1>
DEFINE	DMVM	(L,A,B,C,D)	<
;THIS MACRO TESTS THE DMOVEM INSTRUCTION
;FIRST, TSTWD, TSTWD+1 ARE PRELOADED WITH DATA OTHER THAN THE
;TEST WORDS AND AC,AC+1 ARE LOADED WITH THE TEST WORDS.
;THEN, THE DATA SPECIFIED BY [XWD A,B] AND [XWD C,D] IS MOVED
;FROM AC, AC+1 TO MEMORY (TSTWD, TSTWD+1) VIA
;THE DMOVEM INSTRUCTION.  C(TSTWD) AND C(TSTWD+1) ARE THEN
;COMPARED WITH THE TEST WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
;THE TEST PASSES IF THESE COMPARISONS AGREE.

Q'L'0:	DMOVE	AC,[XWD 707070,707070
		    XWD 070707,070707]	;INITIALIZE TEST WORDS
	MOVEM	AC,TSTWD	;TSTWD, TSTWD+1 ARE IN MEMORY JUST
	MOVEM	AC+1,TSTWD+1	;AFTER THE FINAL TEST OF THIS PROGRAM
	DMOVE	AC,[XWD A,B
		    XWD C,D]	;INITIALIZE AC,AC+1
	DMOVEM	AC,TSTWD	;*MOVE DOUBLE WORD FROM AC, AC+1
				;TO MEMORY (TSTWD, TSTWD+1)
	DMOVE	AC,TSTWD	;PUT RESULTS OF TEST IN AC,AC+1 FOR COMPARISON
	CAME	AC,[XWD A,B]	;WAS TSTWD LOADED CORRECTLY?
	ER5	AC,L'1	;FAIL IF CONTENTS(TSTWD) NOT = A,B
	CAME	AC+1,[XWD C,D]	;WAS TSTWD+1 LOADED CORRECTLY?
	ER6	AC+1,L'2	;FAIL IF CONTENTS(TSTWD+1) NOT = C,D
	JUMPL	SAC,Q'L'0	;LOOP ON ERROR SWITCH>

DEFINE	DMVNM	(L,A,B,C,D)	<
;THIS MACRO TESTS THE DMOVNM INSTRUCTION
;FIRST, TSTWD, TSTWD+1 ARE PRELOADED WITH DATA OTHER THAN THE
;TEST WORDS AND AC, AC+1 ARE LOADED WITH THE TEST WORDS.
;THEN, THE NEGATIVE (TWOS COMPLEMENT) OF THE DATA SPECIFIED BY
;[XWD A,B] AND [XWD C,D] IS MOVED FROM AC, AC+1 TO MEMORY
;(TSTWD, TSTWD+1) VIA THE DMOVNM INSTRUCTION.
;C(TSTWD) AND C(TSTWD+1) ARE THEN COMPARED WITH THE
;NEGATIVE (TWOS COMPLEMENT) OF THE TEST
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
;THE TEST PASSES IF THESE COMPARISONS AGREE.

Q'L'0:	DMOVE	AC,[XWD 707070,707070
		    XWD 070707,070707]
	DMOVEM	AC,TSTWD	;INITIALIZE TEST WORDS
	DMOVE	AC,[XWD A,B
		    XWD C,D]	;INITIALIZE AC,AC+1
	DMOVN	AC+5,[XWD A,B
		      XWD C,D]	;SET-UP TO CHECK RESULTS
	DMOVNM	AC,TSTWD	;*MOVE NEGATIVE OF DOUBLE WORD FROM AC, AC+1
				;TO MEMORY (TSTWD, TSTWD+1)
	DMOVE	AC,TSTWD	;PUT TEST RESULTS IN AC,AC+1
	CAME	AC,<AC+5>&17	;WAS TSTWD LOADED CORRECTLY?
	ER5	AC,L'1	;FAIL IF CONTENTS(TSTWD) NOT = COMPLEMENT OF A,B
	CAME	AC+1,<AC+6>&17	;WAS TSTWD+1 LOADED CORRECTLY?
	ER6	AC+1,L'2	;FAIL IF CONTENTS(TSTWD) NOT = MINUS C,D
	JUMPL	SAC,Q'L'0	;LOOP ON ERROR SWITCH>
DEFINE	DMVM17	(L,A,B,C,D)	<
;THIS MACRO TESTS THE DMOVEM INSTRUCTION
;FIRST, TSTWD, TSTWD+1 ARE PRELOADED WITH DATA OTHER THAN THE
;TEST WORDS AND AC,AC+1 ARE LOADED WITH THE TEST WORDS.
;THEN, THE DATA SPECIFIED BY [XWD A,B] AND [XWD C,D] IS MOVED
;FROM AC, AC+1 TO MEMORY (TSTWD, TSTWD+1) VIA THE DMOVEM INSTRUCTION.
;C(TSTWD) AND C(TSTWD+1) ARE THEN COMPARED WITH THE TEST
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
;THE TEST PASSES IF THESE COMPARISONS AGREE.

Q'L'0:	MOVEM	AC,%SV17	;SAVE AC17 CAUSE IT HAS PDP
	DMOVE	AC,[XWD 707070,707070
		    XWD 070707,070707]	;INITIALIZE TEST WORDS
	MOVEM	AC,TSTWD	;TSTWD, TSTWD+1 ARE IN MEMORY JUST
	MOVEM	AC+1,TSTWD+1	;AFTER THE FINAL TEST OF THIS PROGRAM
	DMOVE	AC,[XWD A,B
		    XWD C,D]	;INITIALIZE AC,AC+1
	DMOVEM	AC,TSTWD	;*MOVE DOUBLE WORD FROM AC, AC+1
				;TO MEMORY (TSTWD, TSTWD+1)
	DMOVE	AC,TSTWD	;PUT RESULTS OF TEST IN AC,AC+1 FOR COMPARISON
	CAMN	AC,[XWD A,B]	;WAS TSTWD LOADED CORRECTLY?
	JRST	.+4		;HERE IF TESTS OK
	MOVEM	AC,AC-1		;SAVE BAD WORD
	MOVE	AC,%SV17	;RESTORE P
	ER5	AC-1,L'1	;FAIL IF CONTENTS(TSTWD) NOT = A,B
	CAMN	AC+1,[XWD C,D]	;WAS TSTWD+1 LOADED CORRECTLY?
	JRST	.+4		;HERE IF TESTS OK
	MOVEM	AC,AC-1		;SAVE BAD WORD
	MOVE	AC,%SV17	;RESTORE P
	ER6	AC+1,L'2	;FAIL IF CONTENTS(TSTWD+1) NOT = C,D
	MOVE	AC,%SV17	;RESTORE AC UNCONDITIONALLY
	JUMPL	SAC,Q'L'0	;LOOP ON ERROR SWITCH>
DEFINE	DMVNM17	(L,A,B,C,D)	<
;THIS MACRO TESTS THE DMOVNM INSTRUCTION
;FIRST, TSTWD, TSTWD+1 ARE PRELOADED WITH DATA OTHER THAN THE
;TEST WORDS AND AC, AC+1 ARE LOADED WITH THE TEST WORDS.
;THEN, THE NEGATIVE (TWOS COMPLEMENT) OF THE DATA SPECIFIED BY
;[XWD A,B] AND [XWD C,D] IS MOVED FROM AC, AC+1 TO MEMORY
;(TSTWD, TSTWD+1) VIA THE DMOVNM INSTRUCTION.
;C(TSTWD) AND C(TSTWD+1) ARE THEN COMPARED WITH THE
;NEGATIVE (TWOS COMPLEMENT) OF THE TEST
;WORDS [XWD A,B] AND [XWD C,D], RESPECTIVELY.
;THE TEST PASSES IF THESE COMPARISONS AGREE.

Q'L'0:	DMOVE	AC,[XWD 707070,707070
		    XWD 070707,070707]
	DMOVEM	AC,TSTWD	;INITIALIZE TEST WORDS
	DMOVE	AC,[XWD A,B
		    XWD C,D]	;INITIALIZE AC,AC+1
	DMOVN	AC+5,[XWD A,B
		      XWD C,D]	;SET-UP TO CHECK RESULTS
	DMOVNM	AC,TSTWD	;*MOVE NEGATIVE OF DOUBLE WORD FROM AC, AC+1
				;TO MEMORY (TSTWD, TSTWD+1)

	DMOVE	AC,TSTWD	;PUT TEST RESULTS IN AC,AC+1
	CAMN	AC,<AC+5>&17	;WAS TSTWD LOADED CORRECTLY?
	JRST	.+4
	MOVEM	AC,AC-1		;SAVE BAD WORD
	MOVE	AC,%SV17	;RESTORE P
	ER5	AC-1,L'1	;FAIL IF CONTENTS(TSTWD) NOT = COMPLEMENT OF A,B
	CAMN	AC+1,<AC+6>&17	;WAS TSTWD+1 LOADED CORRECTLY?
	JRST	.+4		;HERE IF TESTS OK
	MOVEM	AC,AC-1		;SAVE BAD WORD
	MOVE	AC,%SV17
	ER6	AC+1,L'2	;FAIL IF CONTENTS(TSTWD) NOT = MINUS C,D
	MOVE	AC,%SV17
	JUMPL	SAC,Q'L'0	;LOOP ON ERROR SWITCH>
DEFINE	DMVNMF	(L,A,B,C,D,KIEF,KIUF,KLEF,KLUF)	<
;**KI10**
;THIS MACRO VERIFIES THAT THE DMOVN INSTRUCTION DOES NOT SET OVERFLOW
;OR CARRY FLAGS ON THE KI10.  FIRST, OVFL AND CRY0,1 FLAGS ARE CLEARED;
;THEN,DMOVN IS EXECUTED.  NEXT, OVFL AND CRY0,1 FLAGS ARE EXAMINED.
;IF ANY OF THESE FLAGS ARE SET, THE TEST FAILS.

;**KL10**
;THIS MACRO VERIFIES THAT THE DMOVN INSTRUCTION DOES SET OVERFLOW
;OR CARRY FLAGS ON THE KL10.  FIRST, OVFL AND CRY0,1 FLAGS ARE CLEARED;
;THEN,DMOVN IS EXECUTED.  NEXT, OVFL AND CRY0,1 FLAGS ARE EXAMINED.
;IF THE PROPER FLAGS ARE NOT SET, THE TEST FAILS.

Q'L'0:	JFCL	17,.+1		;CLEAR OVFL AND CRY0,1 FLAGS
	DMOVE	AC,[XWD A,B
		    XWD C,D]	;SETUP INITIAL
	DMOVNM	AC,TSTWD	;*DMOVNM TEST
	JSP	AC,.+1		;READ FLAGS
Q'L'1:	TLZ	AC,027777	;CLEAR EXTRA JUNK
	TLNE	AC,USERF	;IN USER MODE ?
	JRST	Q'L'4		;YES
	SKIPE	KLFLG		;KL10 ?
	JRST	Q'L'3		;YES
;KI10 EXEC MODE
	CAME	AC,[KIEF,,Q'L'1]
	ER13	AC,L'1		;FAIL IF OVFL OR CRY0,1 FLG SET
Q'L'2:	JUMPL	SAC,Q'L'0	;LOOP ON ERROR SWITCH
	JRST	Q'L'6
;KL10 EXEC MODE
Q'L'3:	CAME	AC,[KLEF,,Q'L'1]
	ER13	AC,L'1		;FAIL IF FLAGS NOT SET
	JRST	Q'L'2
;KL10/KI10 USER MODE
Q'L'4:	SKIPE	KLFLG		;KL10 ?
	JRST	Q'L'5		;YES
;KI10 USER MODE
	CAME	AC,[KIUF,,Q'L'1]
	ER13	AC,L'1		;FAIL IF ANY FLAGS SET
	JRST	Q'L'2
;KL10 USER MODE
Q'L'5:	CAME	AC,[KLUF,,Q'L'1]
	ER13	AC,L'1		;FAIL IF FLAGS NOT SET
	JRST	Q'L'2

Q'L'6:	JRST	.+1>