Google
 

Trailing-Edge - PDP-10 Archives - BB-D868D-BM - language-sources/syserd.mac
There are 16 other files named syserd.mac in the archive. Click here to see a list.
	TITLE	SYSERD -- SYSTEM ERROR FILE PROCESSOR -- MAINLINE CODE
	SUBTTL	VERSION 14(1270)	K. COYE/ RLD/ PJB/ ES/ TJW/ LWE/ SRL/ GSK





;COPYRIGHT (C) 1972,1975,1977,1978,1979 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE AND 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.  NO TITLE TO AND OWNERSHIP OF THE  SOFTWARE  IS  HEREBY
;TRANSFERED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT  NOTICE
;AND  SHOULD  NOT  BE  CONSTRUED  AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY  OF  ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.




	SEARCH	SYRUNV
	SEARCH	SYRLOW

	.REQUIRE SYRLIB


	;DUMALL -- DUMMY MACRO LEVEL 3
	;SUBMACRO DUMXXX
	;ARGS
	;NONE USED TO HOUSE LEVEL 2 SUBMACRO DUMXXX
	;THOSE DEFINED HERE ARE THOSE FULLY PROCESSED BY
	;THIS SEGMENT. PART OF EDIT #120.

	DEFINE	DUMALL<
	DUM101
	DUM102
	DUM111
	DUM112
	DUM115			;[1204]
	DUM116
	DUM130
	DUM131
	DUM133			;[756]
	DUM160
	DUM161
	DUM162			; [614]
	DUM163			;[740]
	DUM164			;[1255]
>

	;EXTERNALS DEFINED HERE ARE IN SYRLIB.MAC, THE LIBRARY
	;OF COMMON ROUTINES FOR ALL PARTS OF THE SYSERR PACKAGE.
	; THIS TABLE CLEANED UP WITH EDIT  [1217]

	EXTERNAL ABORT,PTSTRG,BADNAM,DEVCHK,ERRINT,SKIPIT,IDCHK
	EXTERNAL STRCHK,DETCHK,DMPENT,HDRLST,CHROUT,MN2VER,SBUSFN
	EXTERNAL GETNBS,.OCTLE,.DECML,.ASCIE,.SIXBT,ENTRST,NOTRAN
	EXTERNAL .HAFWD,.SPECL,.ODECW,.UDATE,.TASCI,.PPNWT,.TDIRW
	EXTERNAL ACLST,SAVE4P,RET4P,HWDUMP,LSTEB,CNIDCD,R5VSIX
	EXTERNAL .MXBLK,.TRBLK,.SUBLK,.SECBK,TITLST,ADVBFF,NEWCMD
	EXTERNAL .TVERW,T11ACI,BLKTRN,DRVTYP,COLOUT,SBDOUT,DSERCD
	EXTERNAL FE.KLI,KR%ECD,FE%DEV,DUMPOS,DSKPOS,TAPPOS,GTBF00
	EXTERNAL REMDAT,BYTE.8,NDVCHK,.TYOCH,DYNSUM

	;INTERNALS DEFINED HERE ARE FOR USE BY SYRLIB

	INTERNAL KONMSK,MINERB,ALLTBL,PDLPNT
	INTERNAL TYPMES,LINE,ALLLTH,DUMDAY
	INTERNAL DEVTYP,ERINDX,PCSTBL,BITCHK,ERRLTH
	INTERNAL ERRTBL,MDE000,BLTTAB,FE$NAM
	INTERNAL MASLTH,NAMLTH
	.JBVER==137
	LOC	.JBVER

	BYTE	(3)VWHO(9)VSYSER(6)VMINOR(18)VEDIT
	SALL


	TWOSEG
	RELOC	400000



;DUMMY LABELS FOR SYRLIB

MASLTH==0
NAMLTH==0

NAMTBL::
SUMUPD::
DEVDSP::
MASNAM::	Z		;GIVE IT SOME SPACE
	;PROCSD -- STANDARD ENTRY PROCESSOR #1
	;CALL	JRST PROCSD
	;
	;RETURN	JRST ABORT	WHEN ENTRY IS PROCESSED OR ABORTED
	;OPERATION IS CONTROLLED BY ENTRY IN CONTROL TABLE
	;ROUTINE GETS AOB POINTER TO DESIRED WORD IN BUFFER
	;IF THERE IS ONE PRESENT
	;THEN DISPATCHES TO WORD PROCESSOR LEVEL
	;VIA PUSHJ	P,SUBTAB(MODE)
	;PASSES BUFFER WORD IN P2 TO WORD PROCESSOR

PROCSD:	TRNE	F,F.BRF		;/BRIEF ?  -  EDIT [724]
	 JRST	NEWCMD	;YES! - DO IT THAT WAY
	SETZM	OFFSET		;CLEAR WORD OFFSET COUNT
	MOVE	P1,(CTINDX)	;PICKUP FIRST WORD IN CONTROL TABLE
	JUMPE	P1,ABORT	;ABORT WHEN END OF CTL TABLE SEEN
	TLNE	P1,770000	;DO WE NEED TO GET AN AOB POINTER
	PUSHJ	P,GETAOB	;YES-WORD IS IN A RELOCATABLE SUBTABLE IN ENTRY
	LDB	T2,[POINT 6,P1,11]	;PICKUP WORD LOCATION IN ENTRY
	ADD	T2,OFFSET	;OFFSET CONTAINS AOB BLOCK STARTING LOCATION
	CAML	T2,ENTRWC	;DONT TRY EDIT 153 TO ACCESS WORDS OUTSIDE OF ENTRY
	AOJA	CTINDX,PROCSD	;GET NEXT WORD IN CTL TABLE
	CAILE	T2,WKSIZE	;MAKE SURE THE WORD ASKED FOR IS IN WORK BUFFER
	AOJA	CTINDX,PROCSD	;IGNORE AND GET NEXT WORD
	MOVE	P2,WKBUFF(T2)	;PICKUP DATA WORD IN WORK BUFF
	LDB	T3,[POINT 6,P1,17]	;PICKUP WORD PROCESSES MODE
	CAIG	T3,SUBMAX	;IS IT AND UNKNOWN MODE
	PUSHJ	P,SUBTAB(T3)	;ITS RECOGINIZED
	AOJA	CTINDX,PROCSD	;EITHER NOT KNOWN OR FALL HERE

GETAOB:	LDB	T2,[POINT 6,P1,5]	;PICKUP AOBJN POINTER ADDRESS IN ENTRY
					;AOB GIVEN IS WITH REF TO WKBUFF
	SKIPL	T2,WKBUFF(T2)	;PICKUP THE ACTUAL POINTER AND SKIP IF LEGAL
	JRST	AOBQIT		;AOBJN POINTER = 0 CLEAN UP PDL AND GO TO PROCSD
;[763]		SUB	T2,HEADWC	;CORRECT AOB POINTER FOR HEADER SIZE
	HRRZM	T2,OFFSET	;SAVE IT IN OFFSET
	MOVEM	T2,AOBPNT	;SAVE POINTER FOR SPECL ROUTINE USAGE
	POPJ	P,		;VAMOOSE



	;HERE WHEN AOBJN POINTER = POS IN LH
	;NORMALLY SHOULD NOT HAPPEN

AOBQIT:	POP	P,T2		;DUMMY POP TO FIX PDP
	AOJA	CTINDX,PROCSD	;BUMP CTINDX AND BACK TO START
	SUBTTL	DIALOG RELATED SUBROUTINES
	;HERE IS THE DUMMY PROCSA FOR THIS HIGH SEG
	;IT SAVES THE AC'S AND THEN CALLS OVRLAY FOR REPLACEMENT
	;WITH SYSERA.HGH

PROCSA:	MOVE	T1,[SIXBIT/SYSERA/]
	MOVEM	T1,OVRBLK+1	;INTO THE SPEC AREA
	SETZ	15,
	MOVEM	17,SAVEAC+17
	MOVEI	17,SAVEAC
	BLT	17,SAVEAC+16	;TUCK AWAY OUR AC'S
	JRST	OVRLAY		;NOW PLEASE OVERLAY US WITH PROCSA


	;HERE IS THE DUMMY PROCSB FOR THIS HIGH SEG
	;IT SAVES THE AC'S AND THEN CALLS OVRLAY FOR REPLACEMENT
	;WITH SYSERB.HGH

PROCSB:	MOVE	T1,[SIXBIT/SYSERB/]
	MOVEM	T1,OVRBLK+1	;INTO THE SPEC AREA
	SETZ	15,
	MOVEM	17,SAVEAC+17
	MOVEI	17,SAVEAC
	BLT	17,SAVEAC+16	;TUCK AWAY OUR AC'S
	JRST	OVRLAY		;NOW PLEASE OVERLAY US WITH PROCSB


	;HERE IS THE DUMMY PROCSC FOR THIS HIGH SEG
	;IT SAVES THE AC'S AND THEN CALLS OVRLAY FOR REPLACEMENT
	;WITH SYSERC.HGH

PROCSC:	MOVE	T1,[SIXBIT/SYSERC/]
	MOVEM	T1,OVRBLK+1	;INTO THE SPEC AREA
	SETZ	15,
	MOVEM	17,SAVEAC+17
	MOVEI	17,SAVEAC
	BLT	17,SAVEAC+16	;TUCK AWAY OUR AC'S
	JRST	OVRLAY		;NOW PLEASE OVERLAY US WITH PROCSC


	;HERE IS THE DUMMY PROCSN FOR THIS HIGH SEG
	;IT SAVES THE AC'S AND THEN CALLS OVRLAY FOR REPLACEMENT
	;WITH SYSERN.HGH

PROCSN:	MOVE	T1,[SIXBIT/SYSERN/]
	MOVEM	T1,OVRBLK+1	;INTO THE SPEC AREA
	SETZ	15,
	MOVEM	17,SAVEAC+17
	MOVEI	17,SAVEAC
	BLT	17,SAVEAC+16	;TUCK AWAY OUR AC'S
	JRST	OVRLAY		;NOW PLEASE OVERLAY US WITH PROCSN
	;STARTD-- ROUTINE TO START AT WHEN OVERLAYED
	;TO CORRECTLY PROCESS CURRENT ENTRY.

STARTD:	MOVEI	T1,CHROUT	;OUR TYPO ROUTINE
	PUSHJ	P,.TYOCH	;INIT SCAN
	MOVE	T1,ERTYPE	;CURRENT TYPE
	PUSHJ	P,ERRINT	;GET OUR INDEX VALUE
	MOVE	T1,ERTYPE	;CORRECT INDEX TO ENTCHR TABLE
	MOVE	T2,ENTCHR(T1)	;PICKUP ENTRY CHAR WORD
	TRNN	F,F.ENT		;DOING  /ENTRY?  [572]
	TRNE	F,F.SEQ		;SAID /SEQ?  [532]
	 JRST	START1		;YES,FORCE LISTING
	TLZ	F,F.BTCK	;CLEAR EXAMINE ENTRY FLAG
	TLNN	T2,E.LALL!E.LNXM!E.LPAR!E.LPER!E.LSUM	;ANY LISTING DESIRED
	JRST	SKIPIT		;SKIP THIS ENTRY
	TLNE	T2,E.LNXM!E.LPAR!E.LPER!E.LSUM	;ANY REASON TO DO BIT CHECKING?
	TLO	F,F.BTCK	;YES-SET FLAG TO DO IT LATER
START1:	MOVE	T3,ERTYPE	;GET CORRECT INDEX
	AOS	ENTCHR(T3)	;NO- BUMP COUNTER
	SETZ	WKINDX,		;CLEAR INDEX INTO BUFFER
	SKIPG	T1,ENTRWC	;PICKUP ENTRY LENGTH AND CHECK FOR LEGALITY
	JRST	ENTRST		;OPP, TRY TO RESYNC
	MOVE	P4,ERRIND
	TLNE	F,F.BTCK	;ANY TO DO?
	PUSHJ	P,@BITCHK(P4)	;GO DO IT
	TRNE	F,F.REM		;[417]/REMOTE?
	 JRST	REMDAT	;YES-DO IMAGE BINARY DUMP
	PUSHJ	P,HDRLST
	MOVE	T2,ALLIND
	HRRZ	T1,PCSTBL(T2)
	HLRZ	CTINDX,PCSTBL(T2)	;CONTROL TABLE ADDRESS
	JRST	(T1)
	SUBTTL	WORD LEVEL SUBROUTINES
	;SUBTAB -- SUBROUTINES TO OUTPUT ENTRY WORD IN DESIRED FORMAT
	;SETUP  P1=ADDRESS OF TEXT TO BE OUTPUT AS DESCRIPTOR
	;	FOR THIS DATA WORD.
	;	P2= WORD TO BE OUTPUT.
	;CALL	PUSHJ	P,SUBTAB(MODE)
	;
	;RETURN	CALL+1
	;DISPATCHES TO APPROPIATE ROUTINE INTERNALLY TO DO WORD CONVERSION AND OUTPUT
SUBTAB:	SINDEX	<OCTLE>
	SINDEX	<DECML>
	SINDEX	<ASCIE>
	SINDEX	<SIXBT>
	SINDEX	<HAFWD>
	SINDEX	<SPECL>
	SINDEX	<UDATE>
	SINDEX	<TASCI>
	SINDEX	<PPNWT>

	;SPECIAL LISTING ROUTINES START HERE.


PT%001:	TYPEIT	<
STATUS AT ERROR:
	BAD DATA DETECTED BY:	>	;EDIT [737]
	LDB	T2,[POINT 5,P2,5]	;GET PAGE FAIL CODE
	CAIN	T2,25			;PAGE TABLE?
	 MOVEI	T1,[ASCIZ/PAGE TABLE/]
	CAIN	T2,36			;AR/
	 MOVEI	T1,[ASCIZ/AR/]
	CAIN	T2,37			;ARX?
	 MOVEI	T1,[ASCIZ/ARX/]
	PUSHJ	P,.TSTRG
	TYPEIT	<
	PAGE FAIL WD AT TRAP:	>
	MOVE	T1,P2			;SHOULD STILL BE THERE
	PUSHJ	P,.TXWDW
	TYPEIT	<
	BAD DATA WORD:	>
	MOVE	P1,WKBUFF+PT%BDW	;GET IT
	MOVE	T1,P1
	PUSHJ	P,.TXWDW
	TYPEIT	<
	GOOD DATA WORD:	>
	MOVE	P2,WKBUFF+PT%GDW	;GOOD CONTENTS,MAYBE
	MOVE	T1,P2
	PUSHJ	P,.TXWDW
	XOR	P1,P2			;CREATE DIFFERENCE
	TYPEIT	<
	DIFFERENCE:	>
	MOVE	T1,P1
	PUSHJ	P,.TXWDW
	TYPEIT	<
	PHYSICAL MEM ADDR.
	 AT FAILURE:	>
	MOVE	T1,WKBUFF+PT%PMA
	PUSHJ	P,.TXWDW
	TYPEIT	<
	RECOVERY:	>
	MOVE	P1,WKBUFF+PT%TRY	;RETRY WORD
	MOVE	T1,[SIXBIT/CONT./]	;ASSUME GOODNESS
	TLNE	P1,ERRHRD		;BETTER CHECK
	 MOVE	T1,[SIXBIT/CRASH/]
	PUSHJ	P,.TSIXN

	TYPEIT	< USER
	RETRY COUNT:	>
	HRRZ	T1,P1
	PUSHJ	P,.ODECW
	TLNE	P1,1B20
	 PUSHJ	P,[TYPEIT	(
	CACHE ERROR,)
		POPJ	P,0]
	TLNE	P1,1B21
	 PUSHJ	P,[TYPEIT	(
	CACHE IN USE,)
		POPJ	P,0]
	TLNE	P1,1B22
	 PUSHJ	P,[TYPEIT	(
	ERROR ON SWEEP TO CORE,)
		POPJ	P,0]
	POPJ	P,0	;BACK TO PROCSD



	;SPECIAL ROUTINES FORTOPS20 RELOAD AND BUGHLT/BUGCHK
	;ARE HERE


RL%001:	TYPEIT	<
RELOAD BREAKDOWN:
>
	SKIPN	P2		;WAS IT BUGHLT?
	 JRST	RL%002		;NO
	TYPEIT	<	BUGHLT ADDRESS:	>
	MOVE	T1,P2		;GET THE ADDR
	PUSHJ	P,.TOCTW
RL%002:	SKIPN	P1,WKBUFF+RL%OPR	;OFFSET FROM WKBUFF
	 POPJ	P,0		;NONE THERE
	TYPEIT	<	WHY RELOAD:	>
	HRRZI	T1,WKBUFF(P1)	;ADDR OF ASCIZ
	PJRST	.TSTRG		;TO OPR COMMENTS


	;HERE FOR 102

BG%001:	TYPEIT	<
	ERROR:		>
	MOVE	T1,[SIXBIT/BUGCHK/]
	CAIN	P2,BG%INF		;BUGINF?
	 MOVE	T1,[SIXBIT/BUGINF/]
	CAIN	P2,BG%HLT		;BUGHLT?
	 MOVE	T1,[SIXBIT/BUGHLT/]	;EDIT 213
	PUSHJ	P,.TSIXN	;SAY EITHER
	PUSHJ	P,.TCRLF
	
	TYPEIT	<	ADDRESS OF ERROR:	>
	MOVE	T1,WKBUFF+BG%ADR
	PUSHJ	P,.TOCTW	;IN OCTAL
	TYPEIT	<
	NAME:			>
	MOVE	T1,WKBUFF+BG%NAM		;GET NAME
	PUSHJ	P,.TSIXN
	PUSHJ	P,.TCRLF
	TYPEIT	<	DESCRIPTION:		>
	HRRZ	T1,WKBUFF+BG%MSG
	ADDI	T1,WKBUFF	;ANOTHER ASCIZ POINTER
	PUSHJ	P,.TSTRG
	PUSH	P,P1
	SETZ	P1,
	PUSHJ	P,DETCHK	;SAID /DETAIL?
	POP	P,P1
	;START [711-RLD]
	TYPEIT	<
	CONI APR:	>
	MOVE	T1,WKBUFF+BG%APS	;GET THE VALUE
	PUSHJ	P,.TXWDW		;IN HALF WORD
	TYPEIT	< = >
	MOVE	P1,WKBUFF+BG%APS
	MOVEI	T1,12			;OFFSET FOR KL10 APR
	SKIPE	KSMON			;KS10 ENTRY ?
	MOVEI	T1,15			;YES! - CHANGE TO KS10 APR OFFSET
	MOVEM	T1,KONTYP		;[722]FINISH THE SETUP
	PUSHJ	P,CNIDCD		;DO TRANSLATION
	TYPEIT	<
	CONI PAG:	>
	MOVE	T1,WKBUFF+BG%PGS
	PUSHJ	P,.TXWDW
	TYPEIT	<
	DATAI PAG:	>
	MOVE	T1,WKBUFF+BG%PGD
	PUSHJ	P,.TXWDW
	;END [711-RLD]
	TYPEIT	<
	CONTENTS OF AC'S:>	;YES
	MOVEI	P1,BG%ACS	;OFFSET OF 1ST
	HRLI	P1,-20		;# TO DUMP
	PUSHJ	P,ACLST
	TYPEIT	<
	PI STATUS:	>
	MOVE	T1,WKBUFF+BG%PIS	;GET THE WORD
	PUSHJ	P,.TXWDW		;IN HALF WORD
	MOVE	P1,WKBUFF+BG%RCT	;# OF REGISTERS
	SKIPN	P1			;BUT IF NONE
	 POPJ	P,0			;LEAVE NOW  [763]
	TYPEIT	<
	ADDITIONAL DATA ITEMS:	>
	MOVE	T1,P1
	PUSHJ	P,.TOCTW
	MOVNS	P1,P1			;MAKE NEGATIVE
	HRLZ	P2,P1			;# TO DUMP  [526]
	HRRI	P2,WKBUFF+BG%REG
	PUSHJ	P,.TCRLF
	PUSHJ	P,.TTABC
	MOVE	T1,0(P2)		;SOMETHING TO DUMP
	PUSHJ	P,.TXWDW
	PUSHJ	P,.TCRLF
	AOBJN	P2,.-4			;GO BACK IF MORE TO DO
	POPJ	P,0
MP%001:					; [614]
PI%001:	TYPEIT	<
	CONI APR:	>
	MOVE	P1,WKBUFF+PI%CNI	;GET THE APR CONI
	MOVE	T1,P1
	PUSHJ	P,.TXWDW
	TYPEIT	< = >
	MOVEI	T1,12			;OFFSET FOR CONI APR KL10
	SKIPE	KSMON			;KS10 ENTRY ?
	MOVEI	T1,15			;YES! - CHANGE TO KS10 APR OFFSET
	MOVEM	T1,KONTYP
	PJRST	CNIDCD			;GO TRANSLATE  [763]

BG%002:				;  [763]
MP%01A:				;NOW FOR ERA  [763]
PI%01A:	SKIPE	KSMON			;KS10 ENTRY ?  [763]
	 POPJ	P,0			;YES! - LEAVE NOW
	TYPEIT	<
	ERA:		>
	MOVE	T1,P2
	PUSHJ	P,.TXWDW
	TYPEIT	< = WD #>
	LDB	T1,[POINT 2,P2,1]	;GET WORD #
	PUSHJ	P,.TOCTW
	PUSHJ	P,.TSPAC
	TLNE	P2,1B20			;SWEEP?
	 PUSHJ	P,[TYPEIT	<, SWEEP REF, >
		POPJ	P,0]
	TLNE	P2,1B21			;CHAN?
	PUSHJ	P,[TYPEIT <, CHAN REF, >
		POPJ	P,0]
	LDB	T2,[POINT 3,P2,6]	;GET DATA SOURCE & WRITE BIT
	MOVE	T1,ERAMES(T2)		;ADDR OF SOME ASCIZ
	PUSHJ	P,.TSTRG

;NOW FOR MEM ADDR  [763]
	TYPEIT	<
	BASE PHY. MEM ADDR.
	 AT FAILURE:	>
	LDB	T1,[POINT 22,P2,35]	;22 BITS OF ADDR 
	PUSHJ	P,.TOCTW		;NOT HALF WORD
	PJRST	.TCRLF			;  [763]

ERAMES:	[ASCIZ/MEMORY READ/]
	[ASCIZ/CHAN STORE STATUS/]
	[ASCIZ/INVALID/]
	[ASCIZ/CHAN DATA/]
	[ASCIZ/INVALID/]
	[ASCIZ/E-BOX STORE/]
	[ASCIZ/CACHE READ/]
	[ASCIZ/CACHE WRITE/]
	;SET UP POINTERS FOR 162 ENTRY  [614]
MP%002:	HRRZI	P1,WKBUFF+MP%ADD	;POINTER TO BAD ADDRESSES
	HRRZI	P2,WKBUFF+MP%DAT	;POINTER TO BAD DATA WORDS
	HRRZI	P3,WKBUFF+MP%CDA	;POINTER TO GOOD DATA WORDS
	JRST	MP%02A			;NOW USE EXISTING CODE FOR 161

	;P2 HAS PI%DAT
PI%002:	HRRZI	P1,WKBUFF+PI%ADD	;POINTER TO BAD ADDRESSES
	HRRZI	P2,WKBUFF+PI%DAT	;POINTER TO BAD DATA WORDS
	HRRZI	P3,WKBUFF+PI%CDA	;POINTER TO GOOD DATA WORDS  [420]
MP%02A:	HRLI	P1,-^D10
	HRLI	P2,-^D10		;# OF WORDS TO DUMP
	HRLI	P3,-^D10
	TYPEIT	<
ERRORS DETECTED DURING SWEEP:
ADDRESS	BAD DATA	GOOD DATA	DIFFERENCE
>

PI%003:	MOVE	T1,0(P1)	;GET ADDRESS
	SKIPN	T1			;ANYTHING THERE?
	 JRST	PI%004			;NO
	TLZE	T1,1B18		;[717] IS GOOD DATA VALID?
	 SETOM	P4		;[717]NO,SET FLAG
	PUSHJ	P,.TOCTW	;NOT HAFWD
	PUSHJ	P,.TTABC
	MOVE	T1,0(P2)	;GET DATA
	PUSHJ	P,.TXWDW
	PUSHJ	P,.TSPAC	;[1258] SO TABS WORK RITE
	PUSHJ	P,.TSPAC	;[1258]
	PUSHJ	P,.TSPAC	;[1258]
	PUSHJ	P,.TSPAC	;[1258]
	PUSHJ	P,.TSPAC	;[1258]
	PUSHJ	P,.TTABC	;[420]LIST GOOD DATA AND XOR DIFFERENCE
	SKIPE	P4		;[717]FLAG SET?
	 JRST	PI%006		;[717]YES, SAY NO GOOD DATA
	MOVE	T1,0(P3)	;GET GOOD DATA
	PUSHJ	P,.TXWDW
	PUSHJ	P,.TSPAC	;[1258] SO TABS WORK RITE
	PUSHJ	P,.TSPAC	;[1258]
	PUSHJ	P,.TSPAC	;[1258]
	PUSHJ	P,.TSPAC	;[1258]
	PUSHJ	P,.TSPAC	;[1258]
	PUSHJ	P,.TTABC
	MOVE	T1,0(P2)	;BAD
	MOVE	T2,0(P3)	;GOOD
	XOR	T1,T2		;DIFFERENCE TO T1
	PUSHJ	P,.TXWDW	;LIST IT
				;END [420]
	PUSHJ	P,.TCRLF
PI%004:	AOBJN	P1,.+1
	AOBJN	P3,.+1
	AOBJN	P2,PI%003	;GO DO NEXT OR
	 PUSHJ	P,TITLST	;START ON NEXT PAGE AND
	  POPJ	P,0		;LEAVE



PI%005:	HRLZI	P2,-^D8		;BUILD A POINTER
	HRRI	P2,WKBUFF+PI%SBD	;FOR SBDLST AND THEN
	JRST	SBDLST			;CALL THE RIGHT ROUTINE

;[717]
PI%006:	MOVEI	T1,[ASCIZ/GOOD DATA NOT FOUND
/]
	PUSHJ	P,.TSTRG	;SAY THAT
	SETZ	P4,		;CLEAR THE FLAG
	JRST	PI%004		;GET NEXT WORDS
	;[717] END

	;HERE WE LIST SYSTEM ME CONFIG BASED ON RESULTS OF
	;SBUS DIAG FUNCTIONS STORED IN WKBUFF
	;FIRST IS INTERLEAVE MODE
	;POINTER TO SUBTABLE IS IN P2
SBDLST:	PUSH	P,P1
	SETZ	P1,
	PUSHJ	P,DETCHK	;SAID /DETAIL?
	POP	P,P1
	TYPEIT	<
SYSTEM MEMORY CONFIGURATION:
>
	MOVE	P1,P2
;	SKIPN	P2,0(P1)	;DMA PRESENT?
	 JRST	SBDLS1		;NO
	TYPEIT	<
	INTERLEAVE MODE:	>
	LDB	T2,[POINT 2,P2,7]	;GET INTERLEAVE MODE
	MOVE	T1,[SIXBIT/4 WAY/]	;ASSUME THE BEST
	CAIN	T2,2
	 MOVE	T1,[SIXBIT/2 WAY/]
	CAIN	T2,1
	 MOVE	T1,[SIXBIT/NONE/]	;WE TRIED
	PUSHJ	P,.TSIXN
	TYPEIT	<
	DMA:
	LAST ADDR HELD:	>
	LDB	T1,[POINT 22,P2,35]	;A FEW ADDR BITS
	PUSHJ	P,.TOCTW
	TYPEIT	<
	ERRORS DETECTED:	>
	MOVE	P2,0(P1)
	LDB	P3,[POINT 6,P2,5]	;6 ERROR BITS
	SKIPN	P3			;ANY SET?
	 PUSHJ	P,[TYPEIT (NONE)
		POPJ	P,0]
	TRNE	P3,1B32			;NXM?
	 PUSHJ	P,[TYPEIT (INC. CYCLE)	;[435]
		POPJ	P,0]
	TRNE	P3,1B33			;READ PARITY
	 PUSHJ	P,[TYPEIT (READ PARITY)
		POPJ	P,0]
	TRNE	P3,1B34
	 PUSHJ	P,[TYPEIT (WRITE PARITY)
		POPJ	P,0]
	TRNE	P3,1B35
	 PUSHJ	P,[TYPEIT (ADDR PARITY)
		POPJ	P,0]
SBDLS1:;	AOBJN	P1,.+1	;UPDATE POINTER
;	AOBJN	P1,.+1
	SETZ	P3,

SBDLS2:	SKIPN	P2,1(P1)	;GET FUNCTION 1
	 JRST	SBDLS3		;SETUP FOR NEXT
	TYPEIT	<
CONTROLLER:  >
	MOVE	T1,SBDNAM(P3)	;CONTROLLER #
	PUSHJ	P,.TSIXN
	PUSHJ	P,.TSPAC
	PUSHJ	P,.TSPAC
	LDB	T2,[POINT 4,P2,11]	;GET TYPE
	PUSH	P,T2		;SAVE IT
	MOVE	T1,SBDTYP(T2)
	PUSHJ	P,.TSIXN
	PUSHJ	P,.TSPAC
	PUSHJ	P,.TSPAC
	POP	P,T3	;GET MEMORY TYPE BACK
	LDB	T2,[POINT 4,P2,7]	;# OF MODULES
	SETZ	T1,
	TRNE	T2,1B35		;SM0 PRESENT?
	 ADDI	T1,1
	TRNE	T2,1B34		;SM1?
	 ADDI	T1,1
	TRNE	T2,1B33		;SM2?
	 ADDI	T1,1
	TRNE	T2,1B32		;SM3?
	 ADDI	T1,1
	MUL	T1,SBDSIZ(T3)	;TIMES UNIT SIZE
	MOVE	T1,T2			;ANSWER TO T1
	PUSHJ	P,.TDECW
	TYPEIT	< K>
	TYPEIT	<
F0:	>
	MOVE	T1,0(P1)	;GET FUNCTION 0
	PUSHJ	P,.TXWDW
	TYPEIT	<	F1:	>
	MOVE	T1,1(P1)	;GET FUNCTOON 1
	PUSHJ	P,.TXWDW
	TYPEIT	<
	INTERLEAVE MODE:	>
	MOVE	T2,0(P1)	;GETFINCTION0
	LDB	T3,[POINT 2,T2,7]
	MOVE	T1,SBDINT(T3)	;POINTER TO ASCIZ OF INT. MODE
	PUSHJ	P,.TSTRG
	TYPEIT	<
	REQ ENABLED:	>
	MOVE	P2,1(P1)		;GET FUNCTION 1
	TRNN	P2,1B32		;0?
	JRST	.+3
	TYPEIT	<0 >
	TRNN	P2,1B33
	JRST	.+3
	TYPEIT	<1 >
	TRNN	P2,1B34
	JRST	.+3
	TYPEIT	<2 >
	TRNN	P2,1B35
	JRST	.+3
	TYPEIT	(3)
	TYPEIT	<
	LOWER ADDRESS BOUNDARY:	>
	MOVE	P2,1(P1)	;GET FUNCTION 1
	LDB	T1,[POINT 8,P2,21]	;GETS ADDRESS BITDS
	LSH	T1,^D14		;MOVED OVER TO CONVERT TO BETTER FORMAT
	PUSHJ	P,.TOCTW
	TYPEIT	<
	UPPER ADDRESS BOUNDARY:	>
	LDB	T1,[POINT 4,P2,25]	;GETS 18-21
	LSH	T1,^D14		;MOVED TO CORRECT PLACE
	LDB	T2,[POINT 4,P2,17]	;GET 14-17
	HRL	T1,T2	;SETSUP 14-21 FOR UPPER ADDR
	TRO	T1,37777	;SET THE OTHER BITS
	PUSHJ	P,.TOCTW
	TYPEIT	<
	ERRORS DETECTED:	>
	MOVE	P2,0(P1)
	LDB	P4,[POINT 6,P2,5]	;6 ERROR BITS
	SKIPN	P4			;ANY SET?
	 PUSHJ	P,[TYPEIT (NONE)
		POPJ	P,0]
	TRNE	P4,1B32			;INC CYCLE?
	 PUSHJ	P,[TYPEIT (INC CYCLE)
		POPJ	P,0]
	TRNE	P4,1B33			;READ PARITY
	 PUSHJ	P,[TYPEIT (READ PARITY)
		POPJ	P,0]
	TRNE	P4,1B34
	 PUSHJ	P,[TYPEIT (WRITE PARITY)
		POPJ	P,0]
	TRNE	P4,1B35
	 PUSHJ	P,[TYPEIT (ADDR PARITY)
		POPJ	P,0]
SBDLS3:	AOJ	P3,
	AOBJN	P1,.+1		;UPDATE POINTER TWICE
	AOBJN	P1,SBDLS2	;DO NEXT CONTROLLER YX
	 POPJ		P,0	;ALL DONE

SBDNAM:	SIXBIT/#0/
	SIXBIT/#1/
	SIXBIT/#2/
	SIXBIT/#3/

SBDTYP:	SIXBIT/CUST/
	SIXBIT/MA20/
	SIXBIT/DMA20/
	SIXBIT/MB20/
	SIXBIT/UNKN/

SBDSIZ:	0
	^D16
	0
	^D32

	0

SBDINT:	[ASCIZ/OFF-LINE/]
	[ASCIZ/NONE/]
	[ASCIZ/2-WAY/]
	[ASCIZ/4-WAY/]
	SUBTTL	CONFIGURATION CHANGE ROUTINES

;START EDIT [1204]

CS%001:	PUSHJ	P,.TCRLF
	LDB	P2,[CS.OPR+WKBUFF] ;OUTPUT CORRECT OPERATION CODE
	CAIN	P2,CS%ADV
	JRST	[TYPEIT < ATTACH >
		JRST	CS%01A]
	CAIN	P2,CS%DDV
	JRST	[TYPEIT < DETACH >
		JRST	CS%01A]
	WARN < UNKNOWN CONFIGURATION CHANGE OPERATION!>
	JRST	ABORT

CS%01A:	LDB	P2,[CS.UTP+WKBUFF] ;OUTPUT DRIVE TYPE
	PUSHJ	P,DRVTYP
	TYPEIT < S/N:>		;OUTPUT DRIVE SERIAL #
	LDB	T1,[CS.DSN+WKBUFF] ;  [1215]
	PJRST	.TDECW		; & RETURN TO CONTROL TABLE

CS%002:	TYPEIT < AT CHANNEL #>	;OUTPUT CHANNEL #  [1215]
	LDB	T1,[CS.CHN+WKBUFF]
	PUSHJ	P,.TOCTW
	TYPEIT	< CONTROLLER #>	;OUTPUT CONTROLLER #
	LDB	T1,[CS.CON+WKBUFF]
	PUSHJ	P,.TOCTW
	TYPEIT	< UNIT #>	;OUTPUT UNIT #
	LDB	T1,[CS.UNI+WKBUFF]
	PJRST	.TOCTW		; & RETURN TO CONTROL TABLE

;DISPATCH TABLE OF DEVICE SERIAL NUMBER DECODING ROUTINES IN RH OF LIST

;THIS TABLE MUST BE KEPT IN LINE WITH THE UNIT TYPE TABLE IN THE UNIVERSAL
; FILE.  IN PARTICULAR THERE MUST BE AT LEAST ".UTMAX" ITEMS IN THE TABLE.

SN.LST:	[JRST ABORT]		;ILLEGAL DEVICE
	XWD	0,DSERCD	;RP04
	XWD	0,DSERCD	;RS04
	XWD	0,DSERCD	;TU45
	XWD	0,DSERCD	;TU16
	XWD	0,DSERCD	;RP05
	XWD	0,DSERCD	;RP06
	XWD	0,DSERCD	;RP07
	XWD	0,.ODECW	;RP08
	XWD	0,DSERCD	;RM03
	XWD	0,DSERCD	;TM03
	XWD	0,DSERCD	;TU77
	XWD	0,DSERCD	;TM78
	XWD	0,DSERCD	;TU78
	XWD	0,.ODECW	;DX20
	XWD	0,.ODECW	;TU70
	XWD	0,.ODECW	;TU71
	XWD	0,.ODECW	;TU72
	XWD	0,.ODECW	;TU73

;DISPATCH ROUTINE TO DO DRIVE SERIAL NUMBER CORRECTLY  (S/N IN P2)

DRV$SN:	LDB	T2,[CS.UTP+WKBUFF] ;GET DEVICE TYPE
	HRRZ	T2,SN.LST(T2)	;GET S/N ROUTINE
	MOVE	T1,P2		; .ODECW NEEDS S/N IN T1
	PJRST	@T2		;PRINT S/N

;ROUTINE TO OUTPUT CHANNEL TYPE  (CHANNEL TYPE IN P2)

CHNTYP:	MOVE	T1,RHTYP(P2)	;GET CHANNEL TYPE OUT OF TABLE  [1204]
	PJRST	.TSIXN		;TYPE IT OUT AND RETURN

;END EDIT [1204]
	SUBTTL	FRONT-END ROUTINES

;FE%DEV CODE MOVED TO LIB FOR ENTRY 21 USE  [1006]

	;HERE FOR FRONT END DEVICE REPORTING
	;P2 HAS FE%COD

FE%001:	TYPEIT	<
	DEVICE:	>
	HRRZ	T1,P2		;GET DEV TYPE ALONE
	CAIG	T1,0		;LEGAL TYPE?		START EDIT [514]
	 JRST	FE$UNK		;NO! - UNKNOWN
	CAIG	T1,11		;HARDWARE DEVICE?
	 JRST	FE%HRD		;YES!
	CAIGE	T1,200		;LEGAL PSEUDO TYPE?
	 JRST	FE$UNK		;NO! - UNKNOWN
	CAILE	T1,211		;OVER RANGE?
	 JRST	FE$UNK		;YES! - UNKNOWN
	 JRST	FE%004		;NOPE

FE%HRD:	MOVE	T1,FE$NAM(P2)	;GET DEVICE NAME	END EDIT [514]
	PUSHJ	P,.TSIXN	;IN SIXBIT
	TYPEIT	<  # >
	HLRZ	T1,P2			;GET DEV #
	TRZ	T1,1B18			;CLR THE I DON'T KNOW BIT
	PUSHJ	P,.TOCTW		;OUTPUT #  [730]
	PUSHJ	P,.TCRLF
	TLNN	P2,1B18			;"I DON'T KNOW"?
	 JRST	FE%002			;NO
	TYPEIT	< **DEVICE UNKNOWN TO TOPS**
>

	;NOW GO TO DEVICE DEPENDENT ROUTINES WITH POINTERIN P1

FE%002:	HRRZ	P1,WKBUFF+FE%OFF
	PUSHJ	P,@FE%003(P2)
	POPJ	P,0
FE$NAM:	SIXBIT/UNK/		; [1200]
	SIXBIT/CTY/
	SIXBIT/DL11C/
	SIXBIT/DH11/
	SIXBIT/DLSCAN/
	SIXBIT/LP20/
	SIXBIT/CD20/
	SIXBIT/CLOCK/
	SIXBIT/FE DEV/
	SIXBIT/UNK/

FEHNAM:	SIXBIT/KLCPU/		;200
	SIXBIT/KLERR/		;201
	SIXBIT/UNK/		;202
	SIXBIT/UNK/		;203
	SIXBIT/UNK/		;204
	SIXBIT/UNK/		;205			START EDIT [514]
	SIXBIT/UNK/		;206
	SIXBIT/UNK/		;207
	SIXBIT/KLINIK/		;210
	SIXBIT/UNK/		;211			END EDIT [514]

FE%005:	0,,FE$KLS		;KL RELOAD REPORT FROM FRONT END
	0,,FE$KLF		;KLERROR FILE DUMP
	0,,FE$UNK		;202
	0,,FE$UNK		;203
	0,,FE$UNK		;204
	0,,FE$UNK		;205			START EDIT [514]
	0,,FE$UNK		;206
	0,,FE$UNK		;207
	0,,FE%KLI		;KLINIK EVENT - SHOULD NEVER COME HERE
	0,,FE$UNK		;211			END EDIT [514]


FE%003:	0,,FE$UNK
	0,,FE$UNK
	0,,FE$UNK
	0,,FE$DH1
	0,,FE$UNK
	0,,FE$LP0	;LP20 ROUTINE
	0,,FE$CD0	;CD20 ROUTINE
	0,,FE$UNK
	0,,FE$UNK
	0,,FE$UNK
FE$UNK:	TYPEIT	< - DEVICE IS UNKNOWN TO SYSERR
>
	TYPEIT	<
	DEVICE CODE:	>
	HRRZ	T1,WKBUFF+FE%COD	;GET DEV CODE	
	PUSHJ	P,.TOCTW		;IN OCTAL
UN$KLI:	TYPEIT	<
	DATA IN ERROR BLOCK IN 8 BIT:
>
	MOVE	P2,WKBUFF+FE%OFF	;GET OFFSET
	ADDI	P2,WKBUFF		;CORRECT IT
FE$UN1:	PUSHJ	P,.TTABC
	MOVE	T1,0(P2)		;GET VALUE
	PUSHJ	P,BYTE.8		;IN 8 BIT FORMAT
	PUSHJ	P,.TCRLF
	AOBJN	P2,FE$UN1		;MORE TO DO
	 POPJ	P,0

FE%004:	SUBI	T1,200		;REMOVE OFFSET
	MOVE	P3,T1		;SAVE IT
	MOVE	T1,FEHNAM(P3)	;GET A NAME
	PUSHJ	P,.TSIXN
	HRRZ	P1,WKBUFF+FE%OFF	;SETUP OFFSET
	PUSHJ	P,@FE%005(P3)	;GO TO DEVICE ROUTINES
	POPJ	P,0		;THEN BACK TO PROCSD

COMMENT \ I THINK THIS ROUTINE CAN BE REMOVED  [PJB]

	;ROUTINE TO UNPACK 3 WORDS FROM KLEFIL INTO ONE
	;PDP-10 WORD IN T1.  P1 HOLDS POINTER TO 1ST
	;WORD AND IS UPDATED IN THIS ROUTINE.
FE$BWD:	MOVE	T2,KLEFIL(P1)	;GET 1ST PORTION
	DPB	T2,[POINT 16,T1,35]
	ADDI	P1,1		;UPDATE
	MOVE	T2,KLEFIL(P1)	;GET 2ND
	DPB	T2,[POINT 16,T1,19]
	ADDI	P1,1		;UPDATE AGAIN
	MOVE	T2,KLEFIL(P1)	;GET 3RD
	DPB	T2,[POINT 4,T1,3]	;LAST BITS
	POPJ	P,0		;WORD IN T1 SO RETURN
\
FE$LP0:	TYPEIT	<
	STD. STATUS:	>
	MOVE	P1,WKBUFF+FE%OFF	;GET FUL OFFSETWORD
	ADDI	P1,WKBUFF		;CORRECT TO POINT INTO WKBUFF
	LDB	T1,[POINT 16,(P1),15]	;GET DV.XXX
	PUSH	P,P1			;SAVE A POINTER
	PUSH	P,T1			;SAVE THE WORD
	PUSHJ	P,.TOCTW
	MOVEI	T1,36			;CORRECTOFFSET
	MOVEM	T1,KONTYP
	TYPEIT	< = >
	POP	P,P1			;GET THE WORD BACK
	PUSHJ	P,CNIDCD		;1 FOR ONE XLATION

	;NOW FOR 2ND STATUS BYTE
	TYPEIT	<
	LP20 GEN STATUS:	>
	POP	P,P1			;GET POINTER BACK
	PUSH	P,P1	;SAVE IT STILL
	LDB	T1,[POINT 16,(P1),31]	;GET DD.LP20
	PUSH	P,T1		;SAVEIT
	PUSHJ	P,.TOCTW
	POP	P,P1			;GET IT BACK
	MOVEI	T1,37			;OFFSET
	MOVEM	T1,KONTYP		;SETUP
	TYPEIT	< = >
	PUSHJ	P,CNIDCD
	POP	P,P1			;GET POINTER BACK
	AOBJN	P1,.+1			;SKIP 2 11-WORDS FOR NOW
	AOBJN	P1,.+1			;POINT AT NEXT TWO
	HRLI	P1,-^D8			;# OF REGISTERS TO LIST
	HRLI	P2,LP$REG		;ADDR OF REG NAMES
	HRRI	P2,LP$CON		;ADDR OF CONTROL TABLE
	TYPEIT	<
	LP20 DEVICE REGISTERS
>
	PUSHJ	P,LSTEB			;LIST DEVICE REGISTERS
	PUSHJ	P,TITLST		;START ON NEXT PAGE
	POPJ	P,0

	;TABLES FOR LP20 LISTINGS
LP$REG:	SIXBIT/LPCSRA/
	SIXBIT/LPCSRB/
	SIXBIT/LPBSAD/
	SIXBIT/LPBCTR/
	SIXBIT/LPPCTR/
	SIXBIT/LPRAMD/
	SIXBIT/LPCCTR/
	SIXBIT/LPTDAT/


LP$CON:	40,,0
	41,,0
	-1,,NOTRAN
	-1,,NOTRAN
	-1,,NOTRAN
	-1,,NOTRAN
	-1,,LPCLST
	-1,,LPDLST
;DH11 ROUTINES   (UPDATED WITH EDIT 1210)

FE$DH1:	TYPEIT	<
	STD. STATUS:	>
	MOVE	P1,WKBUFF+FE%OFF	;GET OFFSET WORD
	ADDI	P1,WKBUFF		; & POINT INTO WKBUFF
	LDB	T1,[STD.ST(P1)]		;GET STANDARD STATUS WORD
	PUSH	P,P1			;SAVE A POINTER
	PUSH	P,T1			;SAVE THE WORD
	PUSHJ	P,.TOCTW
	TYPEIT	< = >
;	POP	P,P1			;GET THE WORD BACK
;	PUSH	P,P1			;AND SAVE IT STILL
	MOVE	P1,0(P)			;[1247] REPLACES ABOVE 2 INSTS.
	MOVEI	T1,36			;CORRECT OFFSET
	MOVEM	T1,KONTYP
	PUSHJ	P,CNIDCD		;1 FOR ONE XLATION
	POP	P,P2			;GET THE WORD BACK
	POP	P,P1			;AND THE POINTER
	TRNE	P2,1B26			;IF HUNG DEVICE
	JRST FE$DHB			; DUMP 4 COUNTERS
;START EDIT [1223]
	TYPEIT	<
	DH11 UNIBUS ADDRESS:	>
	LDB	T1,[DH.ADR(P1)]		;GET ADDRESS WORD
	PUSHJ	P,.TOCTW		;DUMP IN OCTAL
	TYPEIT	< = DH11 #>
	LDB	T1,[DH.RHN(P1)]		;GET DH11 #+1
	SOS	T1			;MAKE IT REAL DH11 #
	PUSHJ	P,.TOCTW		;DUMP IN OCTAL
	LDB	P2,[DH.SCR(P1)]		;GET SYSTEM CONTROL REGISTER
	JUMPE	P2,FE$DHA		; & SKIP IF 0
	TYPEIT	<
	SYSTEM CONTROL REG:	>
	MOVE	T1,P2
	PUSH	P,P1			;SAVE A POINTER
	PUSH	P,T1			;SAVE THE WORD
	PUSHJ	P,.TOCTW
	TYPEIT	< = >
	POP	P,P1			;GET THE WORD BACK
	MOVEI	T1,57			;CORRECT OFFSET
	MOVEM	T1,KONTYP
	PUSHJ	P,CNIDCD		;1 FOR ONE XLATION
	TYPEIT	<LINE #>
	POP	P,P1			;GET THE POINTER
	LDB	T1,[DH.LIN(P1)]		;GET LINE NUMBER
	PUSHJ	P,.TOCTW
FE$DHA:	LDB	P2,[DH.NRC(P1)]		;GET RECEIVED CHARACTER REGISTER
	SKIPN	P2			; & QUIT IF 0
	POPJ	P,0
	TYPEIT	<
	RECEIVED CHAR REG:	>
	MOVE	T1,P2
	PUSH	P,P1			;SAVE A POINTER
	PUSH	P,T1			;SAVE THE WORD
	PUSHJ	P,.TOCTW
	TYPEIT	< = >
	POP	P,P1			;GET THE WORD BACK
	MOVEI	T1,60			;CORRECT OFFSET
	MOVEM	T1,KONTYP
	PUSHJ	P,CNIDCD		;1 FOR ONE XLATION
	TYPEIT	<LINE #>		;[1247]
	POP	P,P1			;GET THE POINTER
	LDB	T1,[DH.NLN(P1)]		;GET NEXT LINE NUMBER
	PUSHJ	P,.TOCTW
	TYPEIT	<,CHAR=>		;[1247]
	LDB	T1,[DH.NCH(P1)]		;GET NEXT CHARACTER
	PJRST	.TOCTW			;THAT'S ALL TO LIST
;END EDIT [1223]

FE$DHB:	TYPEIT	<
	CONTENTS OF COUNTERS:	>
	LDB	T1,[DH.CT1(P1)]	;GET FIRST
	PUSHJ	P,.TOCTW	;LIST IT
	PUSHJ	P,.TCRLF
	PUSHJ	P,.TTABC
	LDB	T1,[DH.CT2(P1)]	;GET SECOND
	PUSHJ	P,.TOCTW
	PUSHJ	P,.TCRLF
	PUSHJ	P,.TTABC
	LDB	T1,[DH.CT3(P1)]	;GET THIRD
	PUSHJ	P,.TOCTW
	PUSHJ	P,.TCRLF
	PUSHJ	P,.TTABC
	LDB	T1,[DH.CT4(P1)]	;GET FOURTH
	PJRST	.TOCTW		;THAT'S ALL TO LIST

FE$CD0:	TYPEIT	<
	STD. STATUS:	>
	MOVE	P1,WKBUFF+FE%OFF	;GET FUL OFFSETWORD
	ADDI	P1,WKBUFF		;CORRECT TO POINT INTO WKBUFF
	LDB	T1,[POINT 16,(P1),15]	;GET DV.XXX
	PUSH	P,P1			;SAVE A POINTER
	PUSH	P,T1			;SAVE THE WORD
	PUSHJ	P,.TOCTW
	MOVEI	T1,36			;CORRECTOFFSET
	MOVEM	T1,KONTYP
	TYPEIT	< = >
	POP	P,P1			;GET THE WORD BACK
	PUSHJ	P,CNIDCD		;1 FOR ONE XLATION

	;NOW FOR 2ND STATUS BYTE
	TYPEIT	<
	CD20 GEN STATUS:	>
;	POP	P,P1			;GET POINTER BACK
;	PUSH	P,P1	;SAVE IT STILL
	MOVE	P1,0(P)			;[1247]REPLACES ABOVE 2 INSTS.
	LDB	T1,[POINT 16,(P1),31]	;GET DD.CD11
	PUSH	P,T1		;SAVEIT
	PUSHJ	P,.TOCTW
	PUSHJ	P,.TTABC
	POP	P,P1			;GET IT BACK
	MOVEI	T1,42			;OFFSET
	MOVEM	T1,KONTYP		;SETUP
	TYPEIT	< = >
	PUSHJ	P,CNIDCD
	POP	P,P1			;GET POINTER BACK
	AOBJN	P1,.+1			;SKIP 2 BYTES FOR NOW
	TYPEIT	<
	CD20 DEVICE REGISTERS
	>
	MOVE	T1,[SIXBIT/CD11ST/]
	PUSHJ	P,.TSIXN	;INSIXBIT
	PUSHJ	P,.TTABC
	LDB	T1,[POINT 16,(P1),31]
	PUSH	P,T1			;SAVE IT
	PUSHJ	P,.TOCTW		;IN OCTAL
	MOVEI	T1,43		;OFFSET FOR THIS REG
	MOVEM	T1,KONTYP
	PUSHJ	P,.TTABC	;SOME SPACE
	POP	P,T1			;GETWORD BACK
	PUSHJ	P,SAVE4P		;SAVE AC'S
	MOVE	P1,T1		;SETUP
	TYPEIT	< = >
	PUSHJ	P,CNIDCD	;GO DECODE
	PUSHJ	P,RET4P			;RETURN THOSE AC'S
	PUSHJ	P,.TCRLF
	AOBJN	P1,.+1			;ADJUST FOR WORDS WE JUST DID
	HRLI	P1,-^D3			;# OF REGISTERS TO LIST
	HRLI	P2,CD$REG		;ADDR OF REG NAMES
	HRRI	P2,CD$CON		;ADDR OF CONTROL TABLE
	PUSHJ	P,LSTEB			;LIST DEVICE REGISTERS
	PUSHJ	P,TITLST		;START ON NEXT PAGE
	POPJ	P,0


	;TABLES FOR CD11 LISTINGS

CD$REG:	SIXBIT/CD11CC/
	SIXBIT/CD11BA/
	SIXBIT/CD11DB/


CD$CON:	-1,,NOTRAN
	-1,,NOTRAN
	-1,,NOTRAN
	;KLCPU

FE$KLS:	TYPEIT	<
	STD. STATUS:	>
	MOVE	P1,WKBUFF+FE%OFF	;GET FUL OFFSETWORD
	ADDI	P1,WKBUFF		;CORRECT TO POINT INTO WKBUFF
	LDB	T1,[POINT 16,(P1),15]	;GET DV.XXX
	PUSH	P,P1			;SAVE A POINTER
	PUSH	P,T1			;SAVE THE WORD
	PUSHJ	P,.TOCTW
	MOVEI	T1,36			;CORRECTOFFSET
	MOVEM	T1,KONTYP
	TYPEIT	< = >
	POP	P,P1			;GET THE WORD BACK
	PUSHJ	P,CNIDCD		;1 FOR ONE XLATION

	;NOW FOR 2ND STATUS BYTE
	TYPEIT	<
	KL RELOAD STATUS FROM FRONT END:  >
;	POP	P,P1			;GET POINTER BACK
;	PUSH	P,P1	;SAVE IT STILL
	MOVE	P1,0(P)			;[1247]REPLACES ABOVE 2 INSTS.
	LDB	T1,[POINT 16,(P1),31]	;GET DD.KLWD
	PUSH	P,T1		;SAVEIT
	PUSHJ	P,.TOCTW
	PUSHJ	P,.TTABC
	POP	P,P1			;GET IT BACK
	MOVEI	T1,46			;OFFSET
	MOVEM	T1,KONTYP		;SETUP
	TYPEIT	< = >
	PUSHJ	P,CNIDCD
	POP	P,P1			;GET POINTER BACK
	POPJ	P,0		;THAT'S ALL
;FE.KLI (FE$KLI) CODE MOVED TO LIB FOR USE BY 21 ENTRY  [1006]

	;CHECK FOR KLINIK EVENT

FE%KLI:	HRRZ	T1,P2		;GET TYPE ALONE (FE%COD)
	CAIE	T1,.KLINK	;IS THIS KLINIK EVENT?
	 POPJ	P,0		;NO! - OK - LEAVE
	TYPEIT	<
!!!! KLINIK EVENT:  >		;YES!

	;FIND MESSAGE TYPE

	MOVE	P1,WKBUFF+FE%OFF	;GET PACKET OFFSET
	ADDI	P1,WKBUFF		;CREATE POINTER
	LDB	T1,[K.LTYP(P1)]		;GET EVENT TYPE
	CAIN	T1,K.LCKL		;CLEAR KLINIK?
	 PJRST	K%LCKL			;YES! - LIST
	CAIL	T1,0			;NO! - GOOD MESSAGE TYPE?
	 CAILE	T1,K.LRBA		;MAYBE! - HIGH SIDE GOOD?
	  PJRST	KLI$UN			;NO! - REPORT ERROR
	LDB	T2,[K.LCOD(P1)]		;YES! - PASS EVENT CODE IN T2
	PJRST	@KLI%TY(T1)		;REPORT EVENT

KLI$UN:	TYPEIT	<BAD KLINIK MESSAGE TYPE !!!!
>
	WARN	<*BAD KLINIK MESSAGE TYPE*
>
	PUSHJ	P,UN$KLI		;OUTPUT IN OCTAL
	JRST	ABORT			;GIVE UP


	;MESSAGE TYPE DISPATCH TABLE
	; DOES NOT INCLUDE 'CLEAR KLINIK' (-1 IN 8BIT IS 377)

KLI%TY:	0,,KLI$UN			;(0) UNKNOWN
	0,,K%LSKL			;(1) SET KLINIK
	0,,K%LRNG			;(2) KLINIK LINE RING
	0,,K%LDSC			;(3) KLINIK LINE DISCONNECT
	0,,K%LCON			;(4) KLINIK LINE CONNECT
	0,,K%LBPW			;(5) KLINIK BAD PASSWORD
	0,,K%LLTO			;(6) KLINIK UNSUCCESSFUL LOGON
	0,,K%LRBA			;(7) KLINIK ACTIVE ON REBOOT
	;CLEAR KLINIK  (-1)(377)

K%LCKL:	TYPEIT	<CLEAR - WINDOW CLOSED !!!!
>
	JRST	ABORT			;THAT'S ALL

	;SET KLINIK  (1)

K%LSKL:	TYPEIT	<SET !!!!
>

	;KLINIK PARAMETERS  (-1,1)

K%LSCK:	TYPEIT	<WINDOW OPENED FROM >
	LDB	T1,[POINT 16,1(P1),15]	;GET OPEN TIME
	IMULI	T1,^D2000		;CHANGE TO MILLISEC
	PUSHJ	P,.TTIME		;OUTPUT  HH:MM:SS
	PUSHJ	P,.TSPAC		;OUTPUT SPACE
	LDB	P2,[POINT 8,1(P1),23]	;GET OPEN MONTH
	LDB	P3,[POINT 8,1(P1),31]	;GET OPEN YEAR
	LDB	T1,[POINT 8,2(P1),15]	;GET OPEN DAY
	PUSHJ	P,K.DATE		;OUTPUT  DD-MMM-YY
	TYPEIT	< TO >
	LDB	T1,[POINT 16,2(P1),31]	;GET CLOSE TIME
	IMULI	T1,^D2000		;CHANGE TO MILLISEC
	PUSHJ	P,.TTIME		;OUTPUT  HH:MM:SS
	PUSHJ	P,.TSPAC		;OUTPUT SPACE
	LDB	P2,[POINT 8,3(P1),7]	;GET CLOSE MONTH
	LDB	P3,[POINT 8,3(P1),15]	;GET CLOSE YEAR
	LDB	T1,[POINT 8,3(P1),31]	;GET CLOSE DAY
	PUSHJ	P,K.DATE		;OUTPUT  DD-MMM-YY
	TYPEIT	<
		FOR >
	LDB	T1,[POINT 8,4(P1),15]	;GET MODE
	CAIN	T1,377			;USER MODE?
	 PJRST	K%LUSR			;YES!
	LDB	T2,[POINT 8,4(P1),7]	;NO! - GET LIMIT   [605]
;TRANSLATE 11 LIMIT WORD TO AGREE WITH THOSE FOR
; MODE IN RING ACCEPTED
	IDIVI	T2,3			;1,3,7 TO 0,1,2  [605]
	ADDI	T2,1			;0,1,2 TO 1,2,3  [605]
	PJRST	K.CON			;USE ROUTINE FOR RING
;K.DATE -- KLINIK DATE ROUTINE
;OUTPUTS DATE WITH ALPHA MONTH:   "DD-MMM-YY"
;CALL:	MOVEI	T1,DAY OF MONTH  (1-31)
;	MOVEI	P2,MONTH	 (1-12)
;	MOVEI	P3,YEAR  (BASE DATE 1900)
;	PUSHJ	P,K.DATE
;USES:	T1,T2,T3,P2,P3

K.DATE:	PUSHJ	P,.TDECW		;OUTPUT DAY
	MOVE	T1,.MONTH(P2)		;GET SIXBIT MONTH
	PUSHJ	P,.TSIXN		;OUTPUT MONTH
	MOVE	T1,P3			;GET YEAR
	PUSHJ	P,.TDECW		;OUTPUT YEAR
	POPJ	P,0			;RETURN

.MONTH:	0
	SIXBIT/-JAN-/
	SIXBIT/-FEB-/
	SIXBIT/-MAR-/
	SIXBIT/-APR-/
	SIXBIT/-MAY-/
	SIXBIT/-JUN-/
	SIXBIT/-JUL-/
	SIXBIT/-AUG-/
	SIXBIT/-SEP-/
	SIXBIT/-OCT-/
	SIXBIT/-NOV-/
	SIXBIT/-DEC-/
	;KLINIK LINE RING  (2)

K%LRNG:	TYPEIT	<RING >
	CAIN	T2,1			;ACCEPTED?
	 PJRST	K%LRAC			;YES!
	CAIN	T2,377			;NO! - REJECTED? (-1)
	 PJRST	K%LRRJ			;YES!
K$LERR:	TYPEIT	<ILLEGAL MODE ERROR !!!!>	;NO! - HUH!  [605]
	JRST	ABORT			;GIVE UP

K%LRAC:	TYPEIT	<ACCEPTED !!!!>		;WINDOW OPEN  (1)
	JRST	ABORT			;THAT'S ALL
K%LRRJ:	TYPEIT	<REJECTED !!!!>		;WINDOW CLOSED  (-1)
	JRST	ABORT			;THAT'S ALL

	;KLINIK LINE DISCONNECT  (3)

K%LDSC:	TYPEIT	<DISCONNECTED >
	CAIN	T2,1			;ON PURPOSE?
	 PJRST	K%LDCM			;YES!
	CAIN	T2,377			;NO! - LINE DROP?  (-1)
	 PJRST	K%LDRP			;YES!
	PJRST	K$LERR			;NO! - HELP!

K%LDCM:	TYPEIT	<BY CTY OR TIMEOUT !!!!>
	JRST	ABORT			;THAT'S ALL
K%LDRP:	TYPEIT	<- LINE DROP DETECTED !!!!>
	JRST	ABORT			;THAT'S ALL
	;KLINIK LINE CONNECT  (4)

K%LCON:	TYPEIT	<CONNECTED IN >
K%CON:	CAIN	T2,377			;USER MODE?
	 PJRST	K%LUSR			;YES!
K.CON:	TYPEIT	<REMOTE >		;NO!
	CAILE	T2,0			;MODE IN RANGE?
	 CAILE	T2,3			;MAYBE! - HIGH SIDE GOOD?
	  PJRST	K$LERR			;NO! - BAD MODE
	PJRST	@K$LCON(T2)		;YES!

K$LCON:	0,,K$LERR			;BAD MODE
	0,,K%LROP			;(1) REMOTE OPERATOR	(1)
	0,,K%LRPR			;(2) REMOTE PROGRAMMER	(3)
	0,,K%LRMN			;(3) REMOTE MAINTENANCE	(7)

K%LUSR:	TYPEIT	<USER>			;(-1) (377)
	JRST	K$MODE
K%LROP:	TYPEIT	<OPERATOR>		;(1)
	JRST	K$MODE
K%LRPR:	TYPEIT	<PROGRAMMER>		;(2)
	JRST	K$MODE
K%LRMN:	TYPEIT	<MAINTENANCE>		;(3)
K$MODE:	TYPEIT	< CONSOLE MODE !!!!>
	JRST	ABORT			;THAT'S ALL
	;KLINIK BAD PASSWORD  (5)

K%LBPW:	TYPEIT	<BAD PASSWORD #>
	MOVE	T1,T2			;GET # IN 'T1'
	PUSHJ	P,.TDECW		;OUTPUT IT
	TYPEIT	< IS:  >
	LDB	T1,[K.BPW1(P1)]		;GET FIRST CHARACTER
	PUSHJ	P,.TCHAR		;TYPE IT
	LDB	T1,[K.BPW2(P1)]		;SECOND
	PUSHJ	P,.TCHAR
	LDB	T1,[K.BPW3(P1)]		;THIRD
	PUSHJ	P,.TCHAR
	LDB	T1,[K.BPW4(P1)]		;FOURTH
	PUSHJ	P,.TCHAR
	LDB	T1,[K.BPW5(P1)]		;FIFTH
	PUSHJ	P,.TCHAR
	LDB	T1,[K.BPW6(P1)]		;SIXTH
	PUSHJ	P,.TCHAR
	TYPEIT	<  !!!!>
	JRST	ABORT			;THAT'S ALL

	;KLINIK UNSUCCESSFUL LOGON  (6)

K%LLTO:	TYPEIT	<UNSUCCESSFUL LOGON - >
	MOVE	T1,T2			;GET # OF GOOD PASSWORDS
	PUSHJ	P,.TDECW		;OUTPUT IT
	TYPEIT	< PASSWORDS ATTEMPTED !!!!>
	JRST	ABORT			;THAT'S ALL

	;KLINIK ACTIVE ON REBOOT  (7)

K%LRBA:	TYPEIT	<ACTIVE IN >
	PJRST	K%CON		;SAME AS 'KLINIK CONNECT'

	;THIS IS A MAP OF TE FORMAT OF TE  KLERROR FILE AFTER
	;IT IS REBUILT INTO SYSER'S LOW SEGMENT.  THE DEFINED
	;VALUES ARE THE OFFSETS TO THHE START OF THE FILE.
	
	KR.FTY==0		;KLERROR FORMAT VERSION
	KR.RLC==1		;RECORD LENGTH IN BYTES
	KR.TMYR==2		;TIME OF DAY - YEAR
	KR.TMMO==3		;   - MONTH
	KR.TMDA==4		;   - DAY
	KR.TMHR==5		;   - HOUR
	KR.TMMI==6		;   - MINUTE
	KR.TMSE==7		;   - SECOND

	KR.KSN==12		;KL SER #
	KR.ESN==13		;FE SER #
	KR.UVN==14		;MICRO CODE VERSION
	KR.MVN==15		;MONITOR VERSION
	KR.RVN==21		;FE SOFT VER #
	KR.ECD==23		;ERROR CODE
	KR.DG1==24		;DTE DIAG 1
	KR.DG2==25		;DTE DIAG 2
	KR.DGS==26		;DTE DIAG STATUS
	KR.DG3==27		;DTE DIAG 3
	KR.FNR==30		;START OF FUNCTION READ VALUES
	KR.IPE==330		;-11 RAD 50 ERROR WROD
	KR.CHK==337		;CHECKSUM FOR ABOVE DATA
	;HERE ARE ROUTINES TO DUMP KLEFIL 
FE$KLF:	TYPEIT	<
	CONTENTS OF KLERROR FILE:
>
	TYPEIT	<CONTENTS OF RECORD #1  SEEN AT FIRST ERROR
>
KLFCON:	TYPEIT	<	CREATED:  >
	MOVEI	P1,KR.TMYR		;OFFSET TO START OF DATE/TIME
	MOVE	T1,KLEFIL+1(P1)	;GET MONTH FIRST
	PUSHJ	P,.TDECW	;IN DECIMAL
	PUSHJ	P,.TCOLN
	MOVE	T1,KLEFIL+2(P1)	;NOW DAY
	PUSHJ	P,.TDECW
	PUSHJ	P,.TCOLN
	MOVE	T1,KLEFIL(P1)	;YEAR
	PUSHJ	P,.TDECW
	TYPEIT	< AT: >
	MOVE	T1,KLEFIL+3(P1)	;NOW HOUR
	PUSHJ	P,.TDECW
	PUSHJ	P,.TCOLN
	MOVE	T1,KLEFIL+4(P1)	;MINUTES
	PUSHJ	P,.TDECW
	PUSHJ	P,.TCOLN
	MOVE	T1,KLEFIL+5(P1)	;SECONDS
	PUSHJ	P,.TDECW
	
	TYPEIT	<	FILE FORMAT VERSION:	>
	MOVE	T1,KLEFIL	;1ST WORD IS VERSION #
	PUSHJ	P,.TOCTW
	TYPEIT	<	RECORD LENGTH:	>
	MOVEI	P1,KR.RLC		;OFFSET TO VALUE
	MOVE	T1,KLEFIL(P1)	;GET THAT VALUE
	PUSHJ	P,.TOCTW
	TYPEIT	< BYTES
>
;	TYPEIT	< BYTES
;	U-CODE VER:	>
;	MOVEI	P1,KR.UVN
;	MOVE	T1,KLEFIL(P1)	;GET THAT VALUE
;	PUSHJ	P,.ODECW	;IN DECIMAL
;	TYPEIT	<	FE SER #:	>
;	MOVEI	P1,KR.ESN
;	MOVE	T1,KLEFIL(P1)	;GET THAT VALUE
;	PUSHJ	P,.ODECW	;IN DECIMAL
;	TYPEIT	<	KL SER #:	>
;	MOVEI	P1,KR.KSN
;	MOVE	T1,KLEFIL(P1)	;GET THAT VALUE
;	PUSHJ	P,.ODECW	;IN DECIMAL
;	TYPEIT	<
;	MONITOR VER:	>
;	MOVEI	P1,KR.MVN
;	PUSHJ	P,FE$BWD	;GET 3 WORDS
;	PUSHJ	P,.ODECW
;ABOVE 17 LINES REMOVED WITH EDIT 517
;	TYPEIT	<	FE SOFTWARE VER:	>
;	MOVEI	P1,KR.RVN
;	MOVE	T1,KLEFIL(P1)	;GET THAT VALUE
;	PUSHJ	P,.ODECW	;IN DECIMAL
	MOVEI	P1,KR.ECD
	MOVE	T1,KLEFIL(P1)	;GET THAT VALUE
	MOVE	P2,T1		;SAVE IT FOR TRANSLATION
	SKIPN	T1		;[517] IF ZERO,
	 JRST	KLFCN1		;DON'T LIST IT
	TYPEIT	<
	EXCEPTION CODE:	>
	MOVE	T1,KLEFIL(P1)	;GET THAT VALUE
	PUSHJ	P,.TOCTW	;IN DECIMAL
	TYPEIT	< = >
	PUSHJ	P,KR%ECD	;DECODE ERROR CODE

;KR%ECD CODE MOVED TO LIB FOR ENTRY 21 USE  [1006]

KLFCN1:	PUSHJ	P,.TCRLF
	TYPEIT	<	DTE DIAG STATUS:	>
	MOVEI	P1,KR.DGS
	MOVE	T1,KLEFIL(P1)	;GET THAT VALUE
	PUSHJ	P,.TOCTW	;IN DECIMAL
	TYPEIT	<
	DTE DIAG 1:	>
	MOVEI	P1,KR.DG1
	MOVE	T1,KLEFIL(P1)	;GET THAT VALUE
	PUSHJ	P,.TOCTW	;IN DECIMAL
	TYPEIT	<	DTE DIAG 2:	>
	MOVEI	P1,KR.DG2
	MOVE	T1,KLEFIL(P1)	;GET THAT VALUE
	PUSHJ	P,.TOCTW	;IN DECIMAL
	TYPEIT	<	DTE DIAG 3:	>
	MOVEI	P1,KR.DG3
	MOVE	T1,KLEFIL(P1)	;GET THAT VALUE
	PUSHJ	P,.TOCTW	;IN DECIMAL
;NOW DUMP FUNCTION READS
	HRLI	P1,-100		;NUMBER TO DO
	HRRI	P1,KR.FNR		;STARTING OFFSET
	MOVEI	P2,0		;WHERE TO PUT THE WORDS
FE$KL1:	MOVE	T2,KLEFIL(P1)	;GET 1ST PORTION
	DPB	T2,[POINT 16,T1,35]
	ADDI	P1,1		;UPDATE
	MOVE	T2,KLEFIL(P1)	;GET 2ND
	DPB	T2,[POINT 16,T1,19]
	ADDI	P1,1		;UPDATE AGAIN
	MOVE	T2,KLEFIL(P1)	;GET 3RD
	DPB	T2,[POINT 4,T1,3]	;LAST BITS
	MOVEM	T1,KLEFIL(P2)	;PUT AWAY THE WORD
	AOS	P2
	AOBJN	P1,FE$KL1	;UPDATE & DO NEXT

;HERE SETUP TO CALL SYSERK TO LIST CONTENTS
	SETZ	15,	;CLEAR OLD STARTING ADDRESS
	MOVEI	14,FE$KLA	;SETUP RETURN ADDRESS
	MOVE	T1,[SIXBIT/SYSERK/]
	MOVEM	T1,OVRBLK+1	;HIS NAME
	MOVE	16,[SIXBIT/SYSERD/]	;OUR NAME FOR PROPER RETURN
	MOVEM	17,SAVEAC+17
	MOVEI	17,SAVEAC
	BLT	17,SAVEAC+16	;STORE AC'S
	JRST OVRLAY		;GO REPLACE US

;WHEN SYSERK IS FINISHED IT WILL CALL SYSERD BACK AND
;THE OVERLAY WILL USE THE NEXT LINE AS THE STARTING ADDRESS INSTEAD
;OF THAT STORED BY LINK
FE$KLA:	MOVEI	15,0		;CLEAR RETURN ADDRESS
	MOVEI	T1,CHROUT
	PUSHJ	P,.TYOCH	;RE-INIT SCAN ROUTINES
	PUSHJ	P,.TCRLF	;NEXT LINE PLEASE
	MOVEI	P1,KR.IPE		;MIGHT BE LOCATION 330??

	SKIPN	P2,KLEFIL(P1)	;ANY ERRORS DETECTED
	 JRST	FE$KLB		;NOPE
	TYPEIT	<**** DATA MAY NOT BE VALID ****>
	PUSHJ	P,.TCRLF
	TYPEIT	<	ERROR DETECTED:	>
	MOVE	T1,P2
	PUSHJ	P,R5VSIX	;CONVERT IT TO SIXBIT
	HRLZ	T1,T1		;MOVE IT OVER
	PUSHJ	P,.TSIXN	;NOW DUMP IT

FE$KLB:	SKIPE	KLEFL1		;-1 NOW SAYS WE JUST LISTED 2ND RECORD
	 JRST 	FE$KLC		;SO RETURN TO PROCSD
	HRRZ	T1,KLEPNT	;GET LAST ADDR USED TO BUILD THIS FILE
	CAIG	T1,KLE1FL	;USED SECOND RECORD?
	 JRST	FE$KLC		;NO-RETURN NOE
	CAIL	T1,KLEFIL	;ANY WORDS IN 2ND RECORD?
	 JRST FE$KLC		;NO SO DON'T GO ANY FURTHER
	SETOM	KLEFL1		;YES, WE MUST LIST THEM TOO
;*******
;IF DEBUGGING, BETTER PUT A BREAKPOINT HERE IF YOU WANT TO
;SEE THE CONTENTS OF THE 1ST RECORD.  IT WON'T BE AROUND MUCH
;LONGER!!!!!
;********
	SETZM	KLEFIL				;CLEAR
	MOVE	T1,[XWD KLEFIL,KLEFIL+1]	;THE FIRST
	BLT	T1,KLEEND-1			;FILE AREA
	MOVE	T1,[XWD KLE1FL,KLEFIL]	;THEN COPY THE 2ND RECORD
	BLT	T1,KLEEND-1	;TO THE 1ST RECORD AREA.
	PUSHJ	P,TITLST		;START ON NEXT PAGE
	TYPEIT	<

LISTING 2ND RECORD, THE LAST ERROR SEEN

>
	JRST	KLFCON	;USE ALL THE SAME CODE AGAIN
FE$KLC:	PUSHJ	P,TITLST	
	SETZM	KLEFL2		;NO MORE BUILDING OF KLEFIL
	SETZM	KLEFL3		;OR LISTING EITHER
	SETZM	KLEFL1		;CLEAR THAT ONE TOO
	POPJ	P,0	

;SPECIAL TRANSLATION FOR LP20 REGISTERS

LPCLST:	MOVE	P1,T1		;GET WORD
	TYPEIT	<COL. CNTR. = >
	LDB	T1,[POINT 8,P1,27]	;UPPER BYTE
	PUSHJ	P,.TOCTW
	TYPEIT	< CHAR. BUF = >
	LDB	T1,[POINT 8,P1,35]	;LOWER BYTE
	PUSHJ	P,.TOCTW
	PUSHJ	P,.TCRLF
	POPJ	P,0

LPDLST:	MOVE	P1,T1			;GET THE WORD
	TYPEIT	<CHKSUM = >
	LDB	T1,[POINT 8,P1,27]	;UPPER BYTE
	PUSHJ	P,.TOCTW
	TYPEIT	< LPT DATA = >
	LDB	T1,[POINT 8,P1,35]	;LOWER BYTE
	PUSHJ	P,.TOCTW
	PUSHJ	P,.TCRLF
	POPJ	P,0

	;SPECIAL ROUTINE FOR CODE 131 FRONT END RELOAD
	;P2 HAS R1%NUM

R1%000:	TYPEIT	<
	FRONT END #:	>
	MOVEI	T1,[ASCIZ/PRIVILEGED  /]
	TLZE	P2,1B18		;IS IT?
	 PUSHJ	P,.TSTRG		;YUP
	MOVE	T1,P2
	PUSHJ	P,.TOCTW
	MOVE	P3,WKBUFF+R1%STS	;GET STATUS WORD
	TYPEIT	<
	STATUS AT RELOAD:	>
	MOVE	P1,P3
	MOVEI	T1,45			;OFFSET
	MOVEM	T1,KONTYP
	PUSH	P,P3			;SAVE THE STATUS WORD
	PUSHJ	P,CNIDCD
	TYPEIT	<
	RETRIES:	>
	POP	P,P3		;GET STATUS BACK
	LDB	T1,[POINT 6,P3,35]
	PUSHJ	P,.TDECW
	;[534]
;[543]
	LDB	P1,[POINT 16,WKBUFF+R1%ERW,17]
	CAIN	P1,1		;NOTHING TO LIST?
	 POPJ	P,0		;YES, GO BACK
	PUSH	P,P1		;SAVE P1
	TYPEIT	<
	REASON FOR RELOAD:	>
	POP	P,P1		;RESTORE P1
	LDB	T1,[POINT 7,P1,35]
	PUSHJ	P,.TCHAR
	LDB	T1,[POINT 7,P1,27]
	PUSHJ	P,.TCHAR
	LDB	P1,[POINT 16,WKBUFF+R1%ERW,35]
	LDB	T1,[POINT 7,P1,35]
	PUSHJ	P,.TCHAR
	LDB	P1,[POINT 7,P1,27]	;[544]
	SKIPN	P1		;IF ZERO, DONT LIST IT
	 POPJ	P,0		;RETURN NOW
	PUSH	P,P1		;SAVE P1
	TYPEIT	<
	HIGH 7 BITS OF ADDRESS OF PARITY ERROR:	>	;[544]
	POP	P,T1		;GET ADDRESS TO LIST BACK FROM STACK
	PUSHJ	P,.TOCTW	;[544]
	POPJ	P,0
	;END[543]
	SKIPN	P1		;IF ZERO, DONT BOTHER
	 POPJ	P,0
	TYPEIT	<
	11'S MEMORY STATUS REG:	>
	MOVE	T1,P1
	PUSHJ	P,.TOCTW	;IN OCTAL
	TYPEIT	< = >
	TRNN	P1,1B20		;PARITY ERROR?
	 JRST	R1%001		;NO
	TYPEIT	< PARITY ERROR >
R1%001:	TRNN	P1,1B35		;ENABLED?
	 JRST	R1%002		;NO?
	TYPEIT	< ENABLED >
R1%002:	TYPEIT	< ADDR:(HIGH 7 BITS) >
	LDB	T1,[POINT 7,P1,30]	;GET IT
	PUSHJ	P,.TOCTW
	POPJ	P,0
	;END [534]
	POPJ	P,0
;CHNSTS--ROUTINE TO LIST CHANNEL STATUS
;P2 HOLDS FIRST WORD,  DEPENDS ON IDENTICAL OFFSETS TO
;INFO AS ARE USED IN SEC%MB ENTRY FORMAT

CHNSTS:	TYPEIT	<
CHANNEL INFORMATION:
	CHAN STATUS WD 0:	>
	MOVE	T1,P2
	PUSHJ	P,.TXWDW
	TYPEIT	<	CW1:  >
	MOVE	T1,WKBUFF+MB%CC1	;1ST CCW
	PUSHJ	P,.TXWDW
	TYPEIT	<  CW2:  >
	MOVE	T1,WKBUFF+MB%CC2	;2ND CCW
	PUSHJ	P,.TXWDW
	TYPEIT	<
	CHN STATUS WD 1:	>
	MOVE	T1,WKBUFF+MB%CS1
	MOVE	P1,T1			;SAVE IT
	PUSHJ	P,.TXWDW
	MOVEI	T1,44			;CORRECT OFFSET
	MOVEM	T1,KONTYP		;FINISH SETUP
	TYPEIT	< = >
	PUSHJ	P,CNIDCD
	TYPEIT	<
	CHN STATUS WD 2:	>
	MOVE	T1,WKBUFF+MB%CS2
	PUSHJ	P,.TXWDW
	POPJ	P,0	;RETURN TO CALLER
	SUBTTL	MASBUSS SUBROUTINES

	;MB%000 ETC--	ROUTINES TO DO MOST OF THE WORK TO LIST
	;CODE 111 ENTRIES, MASSBUS DEVICE ERRORS.
	;DEVICE TYPE WORD IS IN P2 WHEN WE GET HERE
	;CALLED VIA PUSHJ FROM PROCSD RETURNS POPJ SEVERAL
	;PAGES FROM HERE.
	;CHANGED WITH [315] TO SUPPORT RP05 & RP06

MDE000:	SIXBIT/UNK/		; [1200]
	SIXBIT/RP04/		;THIS DEVICE NAME TABLE MUST BE KEPT
	SIXBIT/RS04/		; IN LINE WITH THE UNIT TYPE TABLE IN
	SIXBIT/TU45/		; THE UNIVERSAL FILE.  IN PARTICULAR
	SIXBIT/TU16/		; THERE MUST BE AT LEAST ".UTMAX" ITEMS
	SIXBIT/RP05/		; IN THE TABLE.
	SIXBIT/RP06/
	SIXBIT/RP07/		;RP07???
	SIXBIT/RP08/		;RP08???
	SIXBIT/RM03/		; [601]
	SIXBIT/TM03/
	SIXBIT/TU77/
	SIXBIT/TM78/
	SIXBIT/TU78/
	SIXBIT/DX20/		;[704]
	SIXBIT/TU70/
	SIXBIT/TU71/
	SIXBIT/TU72/		;END [704]
	SIXBIT/TU73/		;[1204]

RHTYP:	SIXBIT	/RH??/
	SIXBIT	/RH10/
	SIXBIT	/RH20/
	SIXBIT	/RH11/

;DISPATCH TABLE TO ROUTINES TO DECODE SURF/CYL/SECT OR FILE/RECORD
; LH = OFFSET IN TABLES FOR DSKPOS
; RH = TAPPOS FOR TAPES // DSKPOS FOR DISKS
;
;THIS TABLE MUST BE KEPT IN LINE WITH THE UNIT TYPE TABLE IN THE UNIVERSAL
; FILE.  IN PARTICULAR THERE MUST BE AT LEAST ".UTMAX" ITEMS IN THE TABLE.

BLTTAB:	0,,DUMPOS		;NONEXISTANT DEVICE  [1007]
	5,,DSKPOS		;RP04
	4,,DSKPOS		;RS04
	0,,TAPPOS		;TU45
	0,,TAPPOS		;TU16(TM02)
	6,,DSKPOS		;RP05
	7,,DSKPOS		;RP06
	0,,DSKPOS		;RP07
	0,,DSKPOS		;RP08
	10,,DSKPOS		;RM03
	0,,TAPPOS		;TM03
	0,,TAPPOS		;TU77
	0,,TAPPOS		;TM78
	0,,TAPPOS		;TU78
	0,,TAPPOS		;DX20
	0,,TAPPOS		;TU70
	0,,TAPPOS		;TU71
	0,,TAPPOS		;TU72
	0,,TAPPOS		;TU73
	;TYPE UNIT TYPE & S/N IF IT EXISTS

MB%000:	TYPEIT	<
	UNIT TYPE:	>
	MOVE P3,MDEDTP			;GET TYPE BACK
	MOVE	T1,MDE000(P3)		;GET IT IN SIXBIT
	PUSHJ	P,.TSIXN
	;NOW FOR SERIAL #
	MOVE	P2,WKBUFF+MB%REG+10	;LOCATION FOR RP04
	SKIPN	P2			;ANYTHING THERE?
	POPJ	P,0			;NO-LEAVE NOW
	TYPEIT	<
	UNIT SERIAL #:	>
	PJRST	DSERCD
	;HERE TO OUTPUT FAILURE LOCATION

MB%001:	MOVE T1,MDEDTP			;GET DEV TYPE BACK
	CAIN	T1,3			;MAGTAPE? - TU45?
	 JRST	.+3
	CAIE	T1,4			;TU16?
	 CAIN	T1,13			;TU77?
	  JRST MB%01C			;YUP
	
;HERE FOR LBN  (DISK)
	TYPEIT	<
	LBN AT START OF XFR:		>
	MOVE 	T1,WKBUFF+MB%LOC	;GET LBN
	PUSHJ	P,.TOCTW		;TYPE IN DECIMAL  [527]
	TYPEIT	<  =
	>
	MOVE	T1,MDEDTP		;GET TYPE AGAIN
	CAIN	T1,2			;RS04?
	 JRST	MB%01B			;YES! - BRANCH TO ROUTINE
	SETZ	P1,			;NO! - CLEAR INDEX POINTER [600]
	CAIN	T1,1			;RP04?
	 MOVEI	P1,5			;YES! - SET UP INDEX
	CAIN	T1,5			;RP05?
	 MOVEI	P1,6			;YES! - SET UP FOR RP05
	CAIN	T1,6			;RP06?
	 MOVEI	P1,7			;YES! - SET UP FOR RP06
	CAIN	T1,.UTRM3		;RM03?  [601]
	 MOVEI	P1,10			;YES!
	JUMPE	MB%01D			;RECOGNIZED DEVICE?  [600]
	MOVE	P3,WKBUFF+MB%LOC	;YES! - GET LBN
	CAMGE	P3,.MXBLK(P1)		;1ST UNIT OF STR?  [144]
	 JRST	MB%01A			;NO!
	SUB	P3,.MXBLK(P1)		;- 1 UNITS WORTH
	JRST	.-3			;AND TRY AGAIN
MB%01A:	TYPEIT	<CYL:   >
	IDIV	P3,.TRBLK(P1)		;GET CYL #
	MOVE	T1,P3
	PUSHJ	P,.ODECW		;SAY IT IN DECIMAL
	MOVE	P3,P4			;REMAINDER
	TYPEIT	<	SURF:   >
	IDIV	P3,.SUBLK(P1)		;SURFACE #
	MOVE	T1,P3
	PUSHJ	P,.ODECW		;AGAIN WITH ".".
	TYPEIT	<	SECT:   >
	MOVE	P3,P4			;REMAINDER
	IMUL	P3,.SECBK(P1)		;X SECTORS/BLOCK
	MOVE	T1,P3
	PUSHJ	P,.ODECW
	JRST	MB%01D			;GO AROUND MAGTAPE
	;HERE FOR LBN FOR RS04

MB%01B:	MOVE	P3,WKBUFF+MB%LOC	;GET LBN
	CAMGE	P3,.MXBLK+4		;[144]1ST UNIT IN STR?
	 JRST	.+3			;YES-OK
	SUB	P3,.MXBLK+4		;-1 UNITS WORTH
	JRST	.-3			;TRY AGAIN
	TYPEIT	<TRACK:   >
	IDIV	P3,.TRBLK+4		;GET TRK #
	MOVE	T1,P3
	PUSHJ	P,.ODECW		;SAY IT WITH FLOWERS
	MOVE	P3,P4			;REMAINDER
	TYPEIT	<	SECT:   >
	IMUL	P3,.SECBK+4		;GET SECTOR #
	MOVE	T1,P3
	PUSHJ	P,.ODECW
	JRST	MB%01D			;GO AROUND MAGTAPE

	;HERE FOR MAGTAPE FAILURE LOCATION
MB%01C:	TYPEIT	<
	LOCATION:    RECORD  #  >
	HRRZ	T1,WKBUFF+MB%LOC
	PUSHJ	P,.ODECW
	TYPEIT	<    OF FILE #  >
	HLRZ	T1,WKBUFF+MB%LOC
	PUSHJ	P,.ODECW
;NOW LIST USERS DIR AND PGM BUT ONLY FOT MAGTAPE
	MOVE P2,WKBUFF+MB%USR
	MOVEI	P1,[ASCIZ/
	USER'S LOGGED IN DIR:	/]
	PUSHJ	P,.PPNWT		;DO TRANS
	PUSHJ	P,.TCRLF
	MOVE	P2,WKBUFF+MB%PGM
	MOVEI	P1,[ASCIZ/	USER'S PGM:	/]
	PUSHJ	P,.SIXBT
	
;HERE AFTER DUMPING FAILURE LOCATION - NOW TO DUMP
	;OPERATION ISSUED TO DEVICE
MB%01D:	TYPEIT	<
	OPERATION AT ERROR:	>
	HRLZ	T1,WKBUFF+MB%ICR	;GET ISSUED CONTROL REG.
	MOVE	T2,MDEDTP		;SET UP INDEX
	PUSHJ	P,@MDE011(T2)		; LET ROUTINE DO WORK
	POPJ	P,0			;BACK TO PROCSD FOR A WHILE
;USE SAME ROUTINE FOR BOTH 111 & 112, VALUE IS IN P2

DX%004:
MB%004:	TYPEIT	<
	RETRIES PERFORMED:	>
	HRRZ	T1,P2			;MB%FEC / DX%FEC HAS RETRIES(?)
	PUSHJ	P,.ODECW
	POPJ	P,0

	;MB%CNI IS IN P2

MB%002:	TYPEIT	<
	ERROR:	>
	MOVEI	T1,[ASCIZ/RECOVERABLE /];ASSUME LUCK
	MOVE	T2,WKBUFF+MB%IRS	;GET STATUS WORD
	TLNE	T2,1B20			;HARD ERROR?
	 MOVEI	T1,[ASCIZ/NON-RECOVERABLE /]	;OPPS
	PUSHJ	P,.TSTRG
	MOVE	T1,MASKON		;KONTROLLER TYPE
	MOVEM	T1,KONTYP
	MOVE	P1,P2			;FINISH SETUP
	PUSHJ	P,CNIDCD		;GO DECODE
	MOVE	T1,MASKON		;GET CONTROLLER TYPE BACK
	CAIN	T1,..RH11		;RH11?  [600]
	 JRST	MB%02			;YES! - NO CONI - SKIP
	TYPEIT	< IN CONTROLLER CONI
		>
	JRST	MB%02A
MB%02:	TYPEIT	< IN CONTROLLER STATUS 1
		>
MB%02A:	HRLZ	P1,WKBUFF+MB%REG+2	;GET DEVICE'S ERROR REGISTER
	MOVEI	T1,21			;ASSUME RP04,5,6, OR RM03
	MOVE	T2,MDEDTP		;BUT CHECK
	CAIN	T2,3			;FOR TU45 OR
	 MOVEI	T1,27
	CAIN	T2,4			;OR TU16
	 MOVEI	T1,27
	CAIN	T2,13			;OR TU77
	 MOVEI	T1,27
	CAIN	T2,2			;OR RS04
	 MOVEI	T1,25
	MOVEM	T1,KONTYP		;FINISH SETUP
	PUSHJ	P,CNIDCD		;GO TRANSLATE
	TYPEIT	< IN DEVICE ERROR REGISTER>
	PUSHJ	P,.TCRLF
		PUSH	P,P1
	SETZ	P1,
	PUSHJ	P,DETCHK	;SAID /DETAIL?
	POP	P,P1
	TYPEIT	<CONTROLLER INFORMATION:
	CONTROLLER:	>
	MOVE	T2,MASKON		;GET CONTROLLER TYPE
	MOVE	T1,[SIXBIT/RH20 #/]	;ASSUME RH20
	CAIN	T2,..RH10		;BETTER CHECK - RH10?
	 MOVE	T1,[SIXBIT/RH10 #/]	;YES! - CHANGE TEXT
	CAIN	T2,..RH11		;RH11?  [600]
	 MOVE	T1,[SIXBIT/RH11 #/]	;YES! - CHANGE TEXT
	PUSHJ	P,.TSIXN
	PUSHJ	P,.TSPAC
	MOVE	T1,WKBUFF+MB%CAD	;GET PHY ADDR
	PUSHJ	P,.TOCTW		;DUMP IN OCTAL
	MOVE	T1,MDEDTP		;GET DEVICE TYPE
	CAIE	T1,3			;MAGTAPE? - TU45?
	 CAIN	T1,4			;NO! - TU16?
	  PUSHJ	P,MB%02B		;YES! - LIST TM02/3 #
	MOVE	T1,MASKON		;GET CONTROLLER TYPE
	CAIN	T1,..RH11		;RH11?
	 JRST	MB%02C			;YES! - NO CONI - BRANCH
	;NOW DO CONI'S
	TYPEIT	<
	CONI AT ERROR:	>
	MOVE	T1,MASKON		;GET CONTROLLER TYPE
	MOVEM	T1,KONTYP
	MOVE	T1,WKBUFF+MB%CNI
	MOVE	P1,T1			;FINISH SETUP
	PUSHJ	P,.TXWDW		;IN HALF WORD FORMAT
	TYPEIT	< = >
	PUSHJ	P,CNIDCD		;GO DECODE
	TYPEIT	<
	CONI AT END:	>
	MOVE	T1,WKBUFF+MB%CIF
	MOVE	P1,T1
	PUSHJ	P,.TXWDW
	TYPEIT	< = >
	PUSHJ	P,CNIDCD
	POPJ	P,0			;BACK TO PROCSD

;TM?? TYPE CHECKING IMPROVED WITH EDIT  [1227]

MB%02B:	HRRZ	T2,WKBUFF+MB%REG+6	;GET HDWR UNIT TYPE
	ANDI	T2,070			;ALONE
	MOVEI	T1,[ASCIZ/  TM?? #:  /]	;ASSUME WE DON'T KNOW TYPE
	CAIN	T2,10			;CHECK FOR TM02
	MOVEI	T1,[ASCIZ/  TM02 #:  /]
	CAIN	T2,50			;CHECK FOR TM03
	MOVEI	T1,[ASCIZ/  TM03 #:  /]
	PUSHJ	P,.TSTRG		;NOW LIST IT  [536]
	HRRZ	T1,WKBUFF+MB%UAD	;GET LOGICAL ADDRESS
	PUSHJ	P,.TOCTW		;LIST IN OCTAL
	POPJ	P,0			;RETURN

	;HANDLE RH11/UBA FOR 2020  - START EDIT  [600]

MB%02C:	MOVEI	T1,53			;C&S2 OFFSET
	MOVEM	T1,KONTYP		;SAVE IT
	TYPEIT	<
	RH11 STATUS 2 AT ERROR:	>
	MOVE	T1,WKBUFF+MB%S2I	;GET INITIAL RH11 STATUS 2
	MOVE	P1,T1
	PUSHJ	P,.TXWDW		;OUTPUT IN HALF WORDS
	TYPEIT	< = >
	PUSHJ	P,CNIDCD		;DECODE BITS
	TYPEIT	<
	RH11 STATUS 2 AT END:	>
	MOVE	T1,WKBUFF+MB%S2F	;GET FINAL RH11 STATUS 2
	MOVE	P1,T1
	PUSHJ	P,.TXWDW		;OUTPUT IN HALF WORDS
	TYPEIT	< = >
	PUSHJ	P,CNIDCD		;DECODE BITS
	MOVEI	T1,..UBA		;SET UP TO DECODE UBA STATUS
	MOVEM	T1,KONTYP
	TYPEIT	<
	UBA STATUS,MAP AT ERR:	>
	MOVE	T1,WKBUFF+MB%UBI	;GET INITIAL UBA STATUS
	MOVE	P1,T1
	PUSHJ	P,.TXWDW		;OUTPUT IN HALF WORDS
	TYPEIT	< = >
	PUSHJ	P,CNIDCD		;DECODE BITS
	TYPEIT	<
	UBA STATUS,MAP AT END:	>
	MOVE	T1,WKBUFF+MB%UBF	;GET FINAL UBA STATUS
	MOVE	P1,T1
	PUSHJ	P,.TXWDW		;OUTPUT IN HALF WORDS
	TYPEIT	< = >
	PUSHJ	P,CNIDCD		;DECODE BITS

	;NOW TO STOP USING PROCESS TABLE AND TAKE CONTROL OURSELF
	MOVE	P2,MB%CS0		;SET UP FOR CHANNEL STATUS
	PUSHJ	P,MB%003		;FINISH ENTRY
	JRST	ABORT			;DON'T GO BACK TO PROCESS TABLE!

	; END EDIT  [600]
	;MB%CS0 IS IN P2
MB%003:	PUSHJ	P,CHNSTS		;GO LIST CHANNEL STATUS INFO,P2 
					;IS ALREADY SET UP
;SETUP AND CALL ROUTINES TO DUMP 16 DEVICE REGISTERS

	TYPEIT	<
DEVICE REGISTER INFORMATION:
		AT ERROR	AT END		DIFF.		TEXT
>
	MOVE	T1,MDEDTP		;GET UNIT TYPE
	MOVE	P1,[XWD 1,20]		;SETUP P1 FOR MODE 1 AND 20 ITEMS
	CAIN	T1,3			;MAGTAPE? - TU45?
	 JRST 	.+3
	CAIE	T1,4			; TU16?
	 CAIN	T1,13			; TU77?
	  HRRI	P1,12			;CHANGE # OF ITEMS
	HRLZI	P2,MASREG		;STARTING ADDR OF TABLE
					; OF SIXBIT REG NAMES
	CAIN	T1,3			;MAGTAPE? - TU45?  [1243]
	 JRST 	.+3
	CAIE	T1,4			; TU16?
	 CAIN	T1,13			; TU77?
	  HRLI	P2,TU6REG		;CHANGE REGISTER NAMES
	CAIN	T1,.UTRM3		;RM03?  [601]
	 HRLI	P2,RM03RG		;YES! - SETUP FOR RM03 REGISTERS
	HRR	P2,MSCNTL(T1)		;SETUP P2
	MOVE	P3,[XWD MB%REG,MB%REG]	;WHERE TO FIND WORDS.
	PUSHJ	P,HWDUMP		;IF ALL GOES WELL
	PJRST	DEVSTS			;NOW GO LIST DEVICE STATISTICS
	;[EDIT 215]
	;NOW LIST DEVICE STATS AT TIME OF ERROR
	;DEVSTS IS CALLED FOR BOTH CODE 111 & 112 ENTRIES AND DEPENDS
	;ON IDENTICAL FORMATS AND LOCATIONS IN THE ERROR FILE ENTRY!!!

	;***********************
DEVSTS:	TYPEIT	<DEVICE STATISTICS AT TIME OF ERROR:
# OF READS:	>
	MOVE	T1,WKBUFF+MB%RED
	PUSHJ	P,.ODECW
	TYPEIT	<	# OF WRITES:	>
	MOVE	T1,WKBUFF+MB%WRT
	PUSHJ	P,.ODECW
	TYPEIT	<	# OF SEEKS:	>
	MOVE	T1,WKBUFF+MB%SEK
	PUSHJ	P,.ODECW
	TYPEIT	<
# SOFT READ ERRORS:	>
	MOVE	T1,WKBUFF+MB%SRE
	PUSHJ	P,.ODECW
	TYPEIT	<	# SOFT WRITE ERRORS:	>
	MOVE	T1,WKBUFF+MB%SWE
	PUSHJ	P,.ODECW
	TYPEIT	<
# HARD READ ERRORS:	>
	MOVE	T1,WKBUFF+MB%HRE
	PUSHJ	P,.ODECW
	TYPEIT	<	# HARD WRITE ERRORS:	>
	MOVE	T1,WKBUFF+MB%HWE
	PUSHJ	P,.ODECW
	TYPEIT	<
# SOFT POSITIONING ERRORS:	>
	MOVE	T1,WKBUFF+MB%SPE
	PUSHJ	P,.ODECW
	TYPEIT	<	# HARD POSITIONING ERRORS:	>
	MOVE	T1,WKBUFF+MB%HPE
	PUSHJ	P,.ODECW
	TYPEIT	<
# OF MPE:  >
	MOVE	T1,WKBUFF+MB%MPE
	PUSHJ	P,.ODECW
	TYPEIT	<   # OF NXM:  >
	MOVE	T1,MB%NXM
	PUSHJ	P,.ODECW
	TYPEIT	<   # OF OVERRUNS:  >
	MOVE	T1,WKBUFF+MB%OVR
	PUSHJ	P,.ODECW
	;END EDIT 215
	PUSHJ	P,TITLST	;EDIT 116 START ON NEXT PAGE
	POPJ	P,0		;WE'RE DONE!
	;EDIT [510]

	;DX%000 ETC--	ROUTINES TO DO MOST OF THE WORK TO LIST
	;CODE 112 ENTRIES, DX20 DEVICE ERRORS.
	;DEVICE TYPE WORD IS IN P2 WHEN WE GET HERE
	;CALLED VIA PUSHJ FROM PROCSD RETURNS POPJ SEVERAL
	;PAGES FROM HERE.


	;SETUP FOR SUB-BLOCK INDEX POINTERS


DX%000:	HRRZ	T3,WKBUFF+DX%MBR	;MASBUSS REG SUB-BLOCK POINTER
	ADDI	T3,WKBUFF		;CREATE BUFFER POINTER
	MOVEM	T3,SUBLK1		;SAVE IT
	HRRZ	T4,WKBUFF+DX%DVL	;DEVICE VALUE SUB-BLOCK POINTER
	ADDI	T4,WKBUFF		;CREATE BUFFER POINTER
	MOVEM	T4,SUBLK2		;SAVE IT

	;TYPE UNIT TYPE & S/N

	TYPEIT	<
	UNIT TYPE:	>
	MOVE	P3,MDEDTP		;GET TYPE BACK
	MOVE	T1,MDE000(P3)		;GET IT IN SIXBIT
	PUSHJ	P,.TSIXN

	;NOW FOR SERIAL #
	LDB	T1,[POINT 8,DT%SBE(T4),9]	;LOW PART
	LDB	T2,[POINT 8,DT%SBD(T4),35]	;HIGH PART
	DPB	T2,[POINT 8,T1,27]	;COMBINE HIGH & LOW PARTS
	SKIPN	T1			;ANYTHING THERE?
	 POPJ	P,0			;NO! - LEAVE
	PUSH	P,T1			;SAVE WHAT TO LIST
	TYPEIT	<
	UNIT SERIAL #:	>
	POP	P,T1			;RESTORE WHAT TO LIST
	PJRST	.ODECW			;OUTPUT IN DECIMAL


	;ROUTINE TO OUTPUT FAILURE LOCATION

DX%001:	MOVE	T1,MDEDTP		;GET DEV TYPE BACK
	;[704]
	CAIGE	T1,.UTDX2		;IN RANGE?
	 POPJ	P,0
	CAILE	T1,.UTT72
	 POPJ	P,0
	;END [704]
	TYPEIT	<
	LOCATION:    RECORD  #	>
	HRRZ	T1,WKBUFF+DX%LOC	;GET LOCATION WORD
	PUSHJ	P,.ODECW		;OUTPUT IN DECIMAL
	TYPEIT	<    OF FILE #	>
	HLRZ	T1,WKBUFF+DX%LOC	;GET FILE #  PART
	PUSHJ	P,.ODECW		;OUTPUT IN DECIMAL

	;NOW DUMP OPERATION ISSUED TO DEVICE

	TYPEIT	<
	OPERATION AT ERROR:	>
	HRLZ	T1,WKBUFF+DX%ICR	;GET ISSUED CONTROL REGISTER
	MOVE	T2,MDEDTP		;SETUP INDEX
	PJRST	@MDE011(T2)		; LET ROUTINE DO WORK
	;MORE EDIT [510]

	;ROUTINE TO TYPE OUT ERROR INFORMATION
	;ALSO OUTPUTS CONTROLLER CONI INFO IF /DETAIL  IS SET


DX%002:	TYPEIT	<
	ERROR:	>
	MOVEI	T1,[ASCIZ/RECOVERABLE /]	;ASSUME LUCK
	MOVE	T2,WKBUFF+DX%IRS	;GET STATUS WORD
	TLNE	T2,1B20			;HARD ERROR?
	 MOVEI	T1,[ASCIZ/NON-RECOVERABLE /]	;OPPS
	PUSHJ	P,.TSTRG
	MOVE	T1,MASKON		;KONTROLLER TYPE  (RH20)
	MOVEM	T1,KONTYP
	MOVE	P1,P2			;FINISH SETUP
	PUSHJ	P,CNIDCD		;GO DECODE
	TYPEIT	< IN CONTROLLER CONI
		>
	MOVE	T3,SUBLK1		;GET SUB-BLOCK POINTER
	HRLZ	P1,DM%ER(T3)		;GET DEVICE ERROR REGISTER
	MOVEI	T1,51			;BETTER BE TU70!!!
	MOVEM	T1,KONTYP		;FINISH SETUP
	PUSHJ	P,CNIDCD		;GO TRANSLATE
	TYPEIT	< IN DEVICE ERROR REGISTER>
	PUSHJ	P,.TCRLF
	PUSH	P,P1
	SETZ	P1,
	PUSHJ	P,DETCHK	;SAID /DETAIL?
	POP	P,P1
	TYPEIT	<CONTROLLER INFORMATION:
	CONTROLLER:	>
	MOVE	T2,MASKON		;GET CONTROLLER TYPE
	MOVE	T1,[SIXBIT/RH20 #/]	;ASSUME RH20
	PUSHJ	P,.TSIXN
	PUSHJ	P,.TSPAC
	MOVE	T1,WKBUFF+DX%CAD	;GET PHY ADDR
	PUSHJ	P,.TOCTW		;DUMP IN OCTAL
	TYPEIT	<  DX20/>
	;START [716-RLD]
	HRRZ	T1,WKBUFF+DX%DVL	;GET PNTR
	MOVE	T2,WKBUFF+DT%SBC(T1)	;[721]GET SENSE BYTES 8-11
	MOVEI	T1,[ASCIZ/TX02  #:	/]	;ASSUME TX02
	TLNN	T2,1B32			;[721]REALLY BIT 14 SB.-9,B4
	 MOVEI	T1,[ASCIZ/TX01  #:	/]	;BETTER CHANGE
	PUSHJ	P,.TSTRG		;PRINT SOMETHING
	;END[716]
	HRRZ	T1,WKBUFF+DX%UAD	;GET LOGICAL ADDRESS
	PUSHJ	P,.TOCTW		;LIST IN OCTAL

	;START [716-RLD]
	TYPEIT	<
	DX20 U-CODE VERSION:	>
	LDB	T1,[POINT 6,WKBUFF+DX%VER,25]	;[720]GET VERSION #
	PUSHJ	P,.TOCTW
	TYPEIT	<(>
	LDB	T1,[POINT ^D10,WKBUFF+DX%VER,35]	;[720]AND EDIT #
	PUSHJ	P,.TOCTW
	TYPEIT	<)>
	;END [716-RLD]
	;NOW DO CONI'S
	TYPEIT	<
	CONI AT ERROR:	>
	MOVE	T1,MASKON		;GET CONTROLLER TYPE
	MOVEM	T1,KONTYP
	MOVE	T1,WKBUFF+DX%CNI
	MOVE	P1,T1			;FINISH SETUP
	PUSHJ	P,.TXWDW		;IN HALF WORD FORMAT
	TYPEIT	< = >
	PUSHJ	P,CNIDCD	;GO DECODE
	TYPEIT	<
	CONI AT END:	>
	MOVE	T1,WKBUFF+DX%CIF
	MOVE	P1,T1
	PUSHJ	P,.TXWDW
	TYPEIT	< = >
	PUSHJ	P,CNIDCD
	POPJ	P,0			;BACK TO PROCSD

	;END EDIT [510]
;HERE LIST CHANNEL STATUS,MASSBUS INFO AND A WHOLE
;LOT OF DEVICE INFO.

DX%003:	PUSHJ	P,CHNSTS	;LIST CHANNEL TYPE, ETC
	;NOW LIST MASSBUS REGISTER VALUES 
	TYPEIT	<
MASSBUS REGISTER INFORMATION:
		AT ERROR	AT END		DIFF.		TEXT
>
	MOVE P1,[XWD 1,7]	;MODE 1,7 ITEMS TO LIST
	MOVE	P2,[XWD DX2REG,DX20CT]	;TABLE OF REGISTER NAMES,,CONTROL
					;TABLE ADDRESSES
	HRRZ	P3,WKBUFF+DX%MBR	;GET OFFSET TO BLOCK OF DATA
	HRL	P3,P3			;AT END & AT ERROR ARE AT SAME PLACE
	PUSHJ	P,HWDUMP		;GO DO THE LISTING
	MOVE	P1,[XWD 1,17]		;NOW DO SECOND HALF[714]
	MOVE	P2,[XWD DX2RG1,DX20C1]	;ADJUSTED CONTROL TABLES
	HRRZ	P3,WKBUFF+DX%MBR	;WHERE TO START
	ADDI	P3,DM%SI		;ADJUSTED FOR THOSE WE DID
	HRL	P3,P3
	PUSHJ	P,HWDUMP		;LIST THE REST OF 'EM
;NOW LIST THE DEVICE INFO, SENSE BYTES ETC
;FIRST RE-PACKAGE THE BYTES IN PLACE
	HRRZ	P1,WKBUFF+DX%DVL	;GET THE OFFSET
	ADDI	P1,WKBUFF
	MOVEI	T1,24			;A PASS COUNTER
DX%03A:	LDB	T2,[POINT 16,@P1,17]	;EXTRACT A 16 BIT BYTE  [1207]
	DPB	T2,[POINT 16,@P1,15]	;REPLACE IT
	LDB	T2,[POINT 16,@P1,35]	;EXTRACT ANOTHER 16 BIT BYTE
	DPB	T2,[POINT 16,@P1,31]	;REPLACE IT  (BITS 32-35 CONTAIN JUNK)
	AOS	P1			;BUMP THE POINTER
	SOJN	T1,DX%03A		;GET NEXT IF ANY

	;NOW USE HWDUMP TO LIST ALL THESE VALUES
	TYPEIT	<
DEVICE INFORMATION RECORDED AT TIME OF ERROR
	REGISTER  CONTENTS	TEXT
>
	MOVE	P1,[XWD 4,24]	;PRINT MODE 4,24 ITEMS
	MOVE	P2,[XWD DX2NAM,DX2CTL]
	HRLZ	P3,WKBUFF+DX%DVL	;OFFSET TO AT ERROR VALUES
	PUSHJ	P,HWDUMP
	;NOW FINALLY LIST DEVICE STATISTICS
	PJRST	DEVSTS			;WILL RETURN TO PROCSD
	;HERE ARE REGISTER NAMES AND CONTROL TABLES FOR HWDUMP
	;USED WITH DX20 ENTRIES

DX2REG:	SIXBIT/CR(00)/
	SIXBIT/SR(01)/
	SIXBIT/ER(02)/
	SIXBIT/MR(03)/
	SIXBIT/AS(04)/
	SIXBIT/SB(05)/
	SIXBIT/DT(06)/
DX2RG1:	SIXBIT/SI(20)/
	SIXBIT/DN(21)/
	SIXBIT/ES(22)/
	SIXBIT/TE(23)/
	SIXBIT/AY(24)/
;;;;;	SIXBIT/BC(25)/;;;;REMOVED BY EDIT 714[RLD]
	SIXBIT/E0(26)/
	SIXBIT/E1(27)/
	SIXBIT/IR(30)/
	SIXBIT/PC(31)/
	SIXBIT/AL(32)/
	SIXBIT/SD(33)/
	SIXBIT/FP(34)/
	SIXBIT/BW(35)/
	SIXBIT/IB(36)/
	SIXBIT/MA(37)/
	;NOW THE CONTROL TABLE FOR THE MASSBUS VALUES
DX20CT:	XWD -1,DX20CR
	XWD 50,DXSRDV
	XWD -1,DX20ER
	XWD 52,DXMRDV
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,DX20DT
DX20C1:	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	;NOW THE SECOND SET
DX2NAM:	SIXBIT/SB 0-3/
	SIXBIT/   4-7/
	SIXBIT/  8-11/
	SIXBIT/ 12-15/
	SIXBIT/ 16-19/
	SIXBIT/ 20-23/
	SIXBIT/  MCV /
	SIXBIT/  MRA /
	SIXBIT/  MRB /
	SIXBIT/  MRC /
	SIXBIT/  MRD /
	SIXBIT/  MRE /
	SIXBIT/  MRF /
	SIXBIT/  CB0 /
	SIXBIT/  CB1 /
	SIXBIT/  DP0 /
	SIXBIT/  DP1 /
	SIXBIT/  DP2 /
	SIXBIT/  DP3 /
	SIXBIT/  LAS /
	;NOW THE CONTROL TABLE
;FOR NOW ALL ARE "NOTRAN"
DX2CTL: XWD -1,T7SB0S
	XWD -1,DXSB4S
	XWD 36,SB81DV
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
	XWD -1,NOTRAN
DX2FUN:	[ASCIZ/ NO OPERATION(00)/]
	[ASCIZ/ REWIND & UNLOAD(02)/]
	[ASCIZ/ ILLEGAL04)/]
	[ASCIZ/ REWIND(06)/]
	[ASCIZ/ DRIVE CLEAR(10)/]
	[ASCIZ/ SENSE RELEASE(12)/]
	[ASCIZ/ ILLEGAL(14)/]
	[ASCIZ/ ILLEGAL(16)/]
	[ASCIZ/ ILLEGAL(20)/]
	[ASCIZ/ ILLEGAL(22)/]
	[ASCIZ/ ERASE GAP(24)/]
	[ASCIZ/ WRITE TAPE MARK(26)/]
	[ASCIZ/ SPACE REC FORWARD(30)/]
	[ASCIZ/ SPACE REC BACK(32)/]
	[ASCIZ/ SPACE BLOCK FORWARD(34)/]
	[ASCIZ/ SPACE BLOCK BACK(36)/]
	[ASCIZ/ TEST I-O(40)/]
	[ASCIZ/ DATA SEC ERASE(42)/]
	[ASCIZ/ SENSE(44)/]
	[ASCIZ/ SENSE RESERVE(46)/]
	[ASCIZ/ ILLEGAL(50)/]
	[ASCIZ/ ILLEGAL(52)/]
	[ASCIZ/ ILLEGAL(54)/]
	[ASCIZ/ ILLEGAL(56)/]
	[ASCIZ/ WRITE DATA(60)/]
	[ASCIZ/ WRITE DIAGNOSTIC(62)/]
	[ASCIZ/ LOOP WRITE TO READ(64)/]
	[ASCIZ/ ILLEGAL(66)/]
	[ASCIZ/ READ DATA(70)/]
	[ASCIZ/ ILLEGAL(72)/]
	[ASCIZ/ READ EXTENDED STATUS(74)/]
	[ASCIZ/ READ REVERSE(76)/]
	;NOW THE SPECIAL DECODING ROUTINES CALLED FROM THE CONTROL TABLES
	;T1 HAS WORD TO TRANSLATE AND P1 MUST BE PRESERVED*****

DX20CR:	PUSH	P,P1		;SAVE P1
	HLRZ	P1,T1		;ONLY WORRY ABOUT 'AT ERROR' VALUE
	TRNN	P1,1B35		;GO?
	 JRST	.+3
	TYPEIT	< GO + >
	ANDI	P1,76		;GET FUNCTION BITS ALONE
	LSH	P1,-1		;RIGHT JUSTIF FOR AN INDEX
	HRRZ	T1,DX2FUN(P1)	;GET THE ADDR OF THE ASCIZ
	PUSHJ	P,.TSTRG
	POP	P,P1		;RESTORE P1
	POPJ	P,0

DX20ER:	PUSH	P,P1
	MOVE	P1,T1
	PUSH	P,P1		;NOW SAVE THE ERROR WORD
	MOVEI	T1,51		;OFFSET INTO TABLES
	MOVEM	T1,KONTYP
	PUSHJ	P,CNIDCD	;DO 1 FOR 1 X-LATION FIRST
	POP	P,P1		;RESTORE ERROR WORD
	TLNE	P1,1B28		;IF NOT SET, LEAVE NOW
	 JRST	.+3		;SET, MORE LISTING REQ'D
	POP	P,P1		;RESTORE P1
	POPJ	P,0		;AND LEAVE
	TYPEIT	<MPERR CLASS: >
	LDB	P2,[POINT 4,P1,9] ;GET CLASS CODE
	MOVE	T1,P2
	PUSHJ	P,.TOCTW
	TYPEIT	< ,SUB-CLASS: >
	LDB	P3,[POINT 4,P1,5]	;AND SUB-CLASS
	MOVE	T1,P3
	PUSHJ	P,.TOCTW
	PUSHJ	P,.TCRLF
	PUSHJ	P,.TTABC
	TYPEIT	< = >
	CAMLE	P2,MPCLS	;CHECK FOR MAX # OF CLASSES WE RECOGNIZE
	 JRST	DX2ER0		;OUT OF RANGE
	;NOW CHECK FOR SUB-CLASS RANGE
	MOVE T1,MPCLS(P2)	;T1 GETS BASE ADDR OF SUB-CLASS TABLE
	MOVE	T2,-1(T1)	;RANGE FOR THIS SUB-CLASS
	CAMLE	P3,T2		;OK?
	 JRST	DX2ER1		;NOPE
	ADD	T1,P3		;OK-GET ADDR OF ASCIZ TEXT
	MOVE	T1,0(T1)	;AND ADDRESS
	PUSHJ	P,.TSTRG
	POP	P,P1		;NOW RESTORE P1
	POPJ	P,0

DX2ER0:	TYPEIT	< UNKNOWN MPERR CLASS >
	POP	P,P1
	POPJ	P,0
DX2ER1:	TYPEIT	< UNKNOWN MPERR SUB-CLASS>
	POP	P,P1
	POPJ	P,0
;HERE ARE SUB TABLES AND TEXT ADDRS
;FIRST IS TABLE OF CLASSES,EACH ITEM POINTS TO SUB-CLASS TABLE

MPCLS:	^D8			;CURRENT # OF CLASSES RECOGNIZED
	XWD 0,MPCLS1
	XWD 0,MPCLS2
	XWD 0,MPCLS3
	XWD 0,MPCLS4
	XWD 0,MPCLS5
	XWD 0,MPCLS6
	XWD 0,MPCLS7
	XWD 0,MPCL10

	XWD 0,1			;CURRENT # OF SUB-CLASS ARGUEMENTS
MPCLS1:	[ASCIZ/ UNUSUAL DEVICE STATUS FROM FINAL STATUS SEQUENCE/]
	[ASCIZ/ UNUSUAL DEVICE STATUS FROM INITIAL STATUS SEQUENCE/]

	XWD 0,0			;CURRENT #
MPCLS2:	[ASCIZ/ SHORT RECORD/]

	XWD 0,0
MPCLS3:	[ASCIZ/ LONG RECORD/]

	XWD 0,0
MPCLS4:	[ASCIZ/ DRIVE SELECTION ERROR, NON-EXISTENT/]

	XWD 0,0
MPCLS5:	[ASCIZ/ RECOVERABLE ERROR-TAPE MOTION-  DATA PARITY ERROR/]

	XWD 0,2
MPCLS6:	[ASCIZ/ RECOVERABLE ERROR-NO TAPE MOTION- DRIVE ADDR. MISMATCH/]
	[ASCIZ/ RECOVERABLE ERROR-NO TAPE MOTION- BUS IN PAR ERR WHILE RECEIVING DRIVE ADDR/]
	[ASCIZ/ RECOVERABLE ERROR-NO TAPE MOTION- BUS IN PAR ERR WHILE RECEIVING INITIAL STATUS/]

	XWD 0,1
MPCLS7:	[ASCIZ/ NON-RECOVERABLE ERROR, DATA PATH DETECTED U-BUS PAR ERR/]
	[ASCIZ/ NON-RECOVERABLE ERROR, CHANNEL BUS DETECTED U-BUS PAR ERR/]

	XWD 0,2
MPCL10:	[ASCIZ/ FATAL ERROR, DRIVE TYPE MISMATCH/]
	[ASCIZ/ FATAL ERROR, PAR ERR RECEIVING DRIVE ADDR DURING C.U. INIT SEQ/]
	[ASCIZ/ FATAL ERROR, PAR ERR RECEIVING DRIVE STATUS DURING  C.U. INIT SEQ/]
	;HERE DECODE DX20 DRIVE TYPE REGISTER

DX20DT:	PUSH	P,P1
	MOVE	P1,T1		;SAVE WORD TO TRANSLATE
	TYPEIT	< DRIVE TYPE: >
	LDB	T1,[POINT 9,P1,17]	;EXTRACT DRIVE TYPE
	PUSHJ	P,.TOCTW
	;ADD CODE HERE TO TRANSLATE TO TYPE
	TYPEIT	<, HDWR VER: >
	LDB	T1,[POINT 7,P1,8]	;EXTRACT VERSION #
	PUSHJ	P,.TOCTW
	POP	P,P1
	POPJ	P,0
	;SOME TABLES AND ROUTINES USED WITH MASBUSS ENTRIES
	;FIRST THE TABLE OF SIXBIT REGISTER NAMES
	;CHANGED TO FIT TRAINING'S REQUIREMENTS WITH VER 3C.
MASREG:	SIXBIT/CR(00)/		;CONTROL & STATUS #1
	SIXBIT/SR(01)/		;DRIVE STATUS
	SIXBIT/ER(02)/		;ERROR REGISTER #1
	SIXBIT/MR(03)/		;MAINTENANCE REGISTER
	SIXBIT/AS(04)/		;ATTENTION SUMMARY
	SIXBIT/DA(05)/		;DESIRED SECTOR/TRACK ADDRESS
	SIXBIT/DT(06)/		;DRIVE TYPE
	SIXBIT/LA(07)/		;LOOK-AHEAD
	SIXBIT/SN(10)/		;SERIAL NUMBER
	SIXBIT/OF(11)/		;OFFSET
	SIXBIT/DC(12)/		;DESIRED CYLINDER
	SIXBIT/CC(13)/		;CURRENT CYLINDER
	SIXBIT/E2(14)/		;ERROR REGISTER #2
	SIXBIT/E3(15)/		;ERROR REGISTER #3
	SIXBIT/EP(16)/		;ECC POSITION REGISTER
	SIXBIT/PL(17)/		;ECC PATTERN REGISTER

RM03RG:	SIXBIT/CS1 00/		;CONTROL & STATUS #1
	SIXBIT/DS  01/		;DRIVE STATUS
	SIXBIT/ER1 02/		;ERROR REGISTER #1
	SIXBIT/MR1 03/		;MAINTENANCE REGISTER #1
	SIXBIT/AS  04/		;ATTENTION SUMMARY
	SIXBIT/DA  05/		;DESIRED SECTOR/TRACK ADDRESS
	SIXBIT/DT  06/		;DRIVE TYPE
	SIXBIT/LA  07/		;LOOK AHEAD
	SIXBIT/SN  10/		;SERIAL NUMBER
	SIXBIT/OF  11/		;OFFSET
	SIXBIT/DC  12/		;DESIRED CYLINDER
	SIXBIT/HR  13/		;**HOLDING REGISTER**
	SIXBIT/MR2 14/		;MAINTENANCE REGISTER #2
	SIXBIT/ER2 15/		;ERROR REGISTER #2
	SIXBIT/EC1 16/		;ECC POSITION REGISTER
	SIXBIT/EC2 17/		;ECC PATTERN REGISTER
;NOW THE CONTROL TABLE ADDRESSES

;THIS TABLE MUST BE KEPT IN LINE WITH THE UNIT TYPE TABLE IN THE UNIVERSAL
; FILE.  IN PARTICULAR THERE MUST BE AT LEAST ".UTMAX" ITEMS IN THE TABLE.

MSCNTL:	0
	XWD	0,RP04CT	;RP04
	XWD	0,RS04CT	;RS04
	XWD	0,TU16CT	;TU45
	XWD	0,TU16CT	;TU16
	XWD	0,RP05CT	;RP05
	XWD	0,RP05CT	;RP06  [315]
	XWD	0,DX20CT	;TU70  (REG. 0-6)
	XWD	0,DX20C1	; TU70  (REG. 20-37)
	XWD	0,RM03CT	;RM03  [601]
		0
	XWD	0,TU16CT	;TU77  [1243]



	;SIXBIT REGISTER NAMES FOR TU16
TU6REG:	SIXBIT/CR(00)/
	SIXBIT/SR(01)/
	SIXBIT/ER(02)/
	SIXBIT/MR(03)/
	SIXBIT/AS(04)/
	SIXBIT/FC(05)/
	SIXBIT/DT(06)/
	SIXBIT/CK(07)/
	SIXBIT/SN(10)/
	SIXBIT/TC(11)/
;SPECIAL ROUTINES TO DECODE TU70 SENSE BYTES, COPIED FROM
;SYSERB.MAC

T7SB0S:	PUSH	P,P1		;SAVE OUR INDEX
	MOVEI	T1,32		;OFFSET FOR SENSE BYTES 0-3
	MOVEM	T1,KONTYP
	MOVE	P1,P2		;WORD TO DECODE
	PUSH	P,P2
	PUSHJ	P,CNIDCD
	POP	P,P2		;RESTORE WORD TO TRANSLATE
	TYPEIT	< TIE = >
	LDB	P3,[POINT 8,P2,23] 	;TRACK IN ERROR
	SETZ	T1,
	TRNE	P3,1B28
	 MOVEI	T1,1
	PUSHJ	P,.TOCTW
	SETZ	T1,
	TRNE	P3,1B29
	 MOVEI	T1,1
	PUSHJ	P,.TOCTW
	SETZ	T1,
	TRNE	P3,1B30
	 MOVEI	T1,1
	PUSHJ	P,.TOCTW
	SETZ	T1,
	TRNE	P3,1B31
	 MOVEI	T1,1
	PUSHJ	P,.TOCTW
	SETZ	T1,
	TRNE	P3,1B32
	 MOVEI	T1,1
	PUSHJ	P,.TOCTW
	SETZ	T1,
	TRNE	P3,1B33
	 MOVEI	T1,1
	PUSHJ	P,.TOCTW
	SETZ	T1,
	TRNE	P3,1B34
	 MOVEI	T1,1
	PUSHJ	P,.TOCTW
	SETZ	T1,
	TRNE	P3,1B35
	 MOVEI	T1,1
	PUSHJ	P,.TOCTW
	POP	P,P1		;GET INDEX BBACK
	POPJ	P,0		;GO HOME
;HERE SPECIAL DECODING FOR TU70/72 SENSE BYTES 4-7

DXSB4S:	PUSH	P,P1		;SAVE INDEX
	MOVEI	T1,33			;OFFSET TO TABLES
	MOVEM	T1,KONTYP
	MOVE	P1,P2		;WOD TO TRANSLATE
	PUSH	P,P2		;SAVE IT
	PUSHJ	P,CNIDCD		;TRANSLATE IT
	POP	P,P2		;GET WORD BACK
	LDB	P3,[POINT 3,P2,26]	;COLUMN FAILURES
	SKIPE	P3		;ANY THERE?
	 JRST	DXSB4A		;YES
	POP	P,P1
	POPJ	P,0
DXSB4A:	PUSHJ	P,.TSPAC
	MOVE	P2,P3
	ANDI	P3,3		;GET COL BITS ALONE
	CAIN	P3,1
	 MOVEI	T1,[ASCIZ/RIGHT/]
	CAIN	P3,2
	 MOVEI	T1,[ASCIZ/LEFT/]
	CAIN	P3,3
	MOVEI	T1,[ASCIZ/BOTH/]
	PUSHJ	P,.TSTRG
	TYPEIT	< COL.FAIL >
	MOVEI	T1,[ASCIZ/TOP/]
	TRNE	P2,4			;TOP OR BOTTOM?
	 MOVEI	T1,[ASCIZ/BOTTOM/]
	PUSHJ	P,.TSTRG
	POP	P,P1		;GET INDEX BACK
	POPJ	P,0
;ROUTINES TO TRANSLATE MASSBUS DEVICE REG. AS SPECIAL ROUTINES
;T1 HAS WORD TO TRANSLATE

;THIS TABLE MUST BE KEPT IN LINE WITH THE UNIT TYPE TABLE IN THE UNIVERSAL
; FILE.  IN PARTICULAR THERE MUST BE AT LEAST ".UTMAX" ITEMS IN THE TABLE.
;MODIFIED WITH [704] TO SUPPORT .UTDX20-.UTT72

MDE011:	XWD	0,DUMCR		;NOT USED
	XWD	0,RP04CR	;RP04
	XWD	0,RS04CR	;RS04
	XWD	0,TU16CR	;TU45
	XWD	0,TU16CR	;TU16 (TM02)
	XWD	0,RP04CR	;RP05
	XWD	0,RP04CR	;RP06
	XWD	0,DUMCR		;RP07
	XWD	0,DUMCR		;RP08
	XWD	0,RP04CR	;RM03
	XWD	0,DUMCR		;TM03
	XWD	0,TU16CR	;TU77
	XWD	0,DUMCR		;TM78
	XWD	0,DUMCR		;TU78
	XWD	0,DX20CR	;DX20
	XWD	0,DX20CR	;TU70
	XWD	0,DX20CR	;TU71
	XWD	0,DX20CR	;TU72
	XWD	0,DX20CR	;TU73
RS04CR:	HLRZ	P4,T1		;SAVE ERROR WORD
	TRNN	P4,1B24		;AVAIL?
	 JRST	.+3		;NO
	TYPEIT	<DEV.AVAIL.,>
	TRNN	P4,1B35		;GO?
	 JRST	.+3		;NO
	TYPEIT	< GO + >
	ANDI	P4,70		;GET FUNCTION
	LSH	P4,-3		;MOVE IT OVER FOR INDEX
	HRRZ	T1,RS4FUN(P4)	;GET FUNCTION ASCIZ ADDR
	PJRST	.TSTRG		;DUMP IT

RP04CR:	HLRZ	P4,T1	;GET WORD
	TRNN	P4,1B24			;AVAIL?
	 JRST 	.+3			;NO
	TYPEIT	< DEV.AVAIL.,>
	TRNN	P4,1B35			;GO?
	 JRST	.+3
	TYPEIT	< GO + >
	ANDI	P4,76			;GET FUNCTION
	LSH	P4,-1			;STRIP GO BIT
	HRRZ	T1,RP4FUN(P4)		;SETUP FUNCT.ASCIZ ADDR
	PJRST	.TSTRG			;SAY IT

TU16CR:	HLRZ	P4,T1
	TRNN	P4,1B24		;AVAIL?
	 JRST	.+3		;NO
	TYPEIT	< DEV.AVAIL. >
	TRNN	P4,1B35		;GO?
	 JRST	.+3
	TYPEIT	< GO + >
	ANDI	P4,76		;GET FUNCTION
	LSH	P4,-1		;SETUP INDEX
	HRRZ	T1,TU6FUN(P4)	;USE IT
	PJRST	.TSTRG


DUMCR:	POPJ	P,0		;FILLER FOR HOLES IN TABLE
	;SOME TABLES
RS4FUN:	[ASCIZ/ NO OPERATION(00)/]
	[ASCIZ/ DRIVE CLEAR(02)/]
	[ASCIZ/	ILLEGAL(04)/]
	[ASCIZ/ SEARCH(06)/]
	[ASCIZ/ ILLEGAL(10)/]
	[ASCIZ/ ILLEGAL(12)/]
	[ASCIZ/ WRITE(14)/]
	[ASCIZ/ READ(16)/]
RP4FUN:	[ASCIZ/ NO OPERATION(00)/]
	[ASCIZ/ STAND BY(02)/]
	[ASCIZ/ SEEK(04)/]
	[ASCIZ/ RECALIBRATE(06)/]
	[ASCIZ/ DRIVE CLEAR(10)/]
	[ASCIZ/ RELEASE(12)/]
	[ASCIZ/ OFFSET(14)/]
	[ASCIZ/ RETURN CENTERLINE(16)/]
	[ASCIZ/ READ-IN(20)/]
	[ASCIZ/ PACK ACK.(22)/]
	[ASCIZ/	ILLEGAL(24)/]
	[ASCIZ/ ILLEGAL(26)/]
	[ASCIZ/ SEARCH(30)/]
	[ASCIZ/ ILLEGAL(32)/]
	[ASCIZ/ ILLEGAL(34)/]
	[ASCIZ/ ILLEGAL(36)/]
	[ASCIZ/ ILLEGAL(40)/]
	[ASCIZ/ ILLEGAL(42)/]
	[ASCIZ/ ILLEGAL(44)/]
	[ASCIZ/ ILLEGAL(46)/]
	[ASCIZ/ WRITE CHECK DATA(50)/]
	[ASCIZ/ WRITE CHECK HEADER & DATA(52)/]
	[ASCIZ/ ILLEGAL(54)/]
	[ASCIZ/ ILLEGAL(56)/]
	[ASCIZ/ WRITE DATA(60)/]
	[ASCIZ/ WRITE HEADER & DATA(62)/]
	[ASCIZ/ ILLEGAL(64)/]
	[ASCIZ/ ILLEGAL(66)/]
	[ASCIZ/ READ DATA(70)/]
	[ASCIZ/ READ HEADER&DATA(72)/]
	[ASCIZ/ ILLEGAL(74)/]
	[ASCIZ/ ILLEGAL(76)/]
TU6FUN:	[ASCIZ/ NO OPERATION(00)/]
	[ASCIZ/ REWIND,OFFLINE(02)/]
	[ASCIZ/ ILLEGAL(04)/]
	[ASCIZ/ REWIND(06)/]
	[ASCIZ/ DRIVE CLEAR(10)/]
	[ASCIZ/ ILLEGAL(12)/]
	[ASCIZ/ ILLEGAL(14)/]
	[ASCIZ/ ILLEGAL(16)/]
	[ASCIZ/ READIN(20)/]
	[ASCIZ/ ILLEGAL(22)/]
	[ASCIZ/ ERASE(24)/]
	[ASCIZ/ WRITE FILEMARK(26)/]
	[ASCIZ/ SPACE FWD.(30)/]
	[ASCIZ/ SPACE REV.(32)/]
	[ASCIZ/ ILLEGAL(34)/]
	[ASCIZ/ ILLEGAL(36)/]
	[ASCIZ/ ILLEGAL(40)/]
	[ASCIZ/ ILLEGAL(42)/]
	[ASCIZ/ ILLEGAL(44)/]
	[ASCIZ/ ILLEGAL(46)/]
	[ASCIZ/ WRITE CHECK FWD.(50)/]
	[ASCIZ/ ILLEGAL(52)/]
	[ASCIZ/ ILLEGAL(54)/]
	[ASCIZ/ WRITE CHECK REV.(56)/]
	[ASCIZ/ WRITE FWD.(60)/]
	[ASCIZ/ ILLEGAL(62)/]
	[ASCIZ/ ILLEGAL(64)/]
	[ASCIZ/ ILLEGAL(66)/]
	[ASCIZ/ READ FWD.(70)/]
	[ASCIZ/ ILLEGAL(72)/]
	[ASCIZ/ ILLEGAL(74)/]
	[ASCIZ/ READ REV.(76)/]

	;SOME ROUTINES TO DUMP SOME PARTICULAR REGISTERS.
	;CALLED FROM HWDUMP  FIRST TO OUTPUT DESIRED
	;SECTOR/TRACK FOR RP04

RP04BA:	HLRZ	P4,T1		;GET ERROR WORD ALONE

	MOVE	P3,P4
	ANDI	P3,17400	;MASK TO GET TRACK ALONE
	LSH	P3,-^D8		;MOVE IT OVER
	TYPEIT	<D. TRK = >
	MOVE 	T1,P3
	PUSHJ	P,.TOCTW	;PRINT IT
	TYPEIT	<, D.SECT. = >
	ANDI	P4,37		;GET SECTOR
	MOVE 	T1,P4
	PJRST	.TOCTW	;DO IT

	;TO DUMP RM03 OFFSET REG.
RM03MO:	HRRZ	P4,T1
	TYPEIT	<AT END:>
	TRNE	P4,1B23		;FORMAT BIT ?
	 JRST [	TYPEIT	<FMT16,>
		JRST	.+1 ]
	TRNE	P4,1B24		;ECI ON?
	 PUSHJ	P,RPMO02
	TRNE	P4,1B25		;HCI?
	 PUSHJ	P,RPMO03
	TRNE	P4,1B28		;OFD ON?
	 JRST [	TYPEIT	<OFD>
		JRST	.+1 ]
	POPJ	P,0

	;TO DUMP RP04 OFFSET REG.
RP04MO:	HRRZ	P4,T1
	TYPEIT	<AT END:>
	TRNN	P4,1B20		;SIGN CHANGE?
	 PUSHJ	P,RPMO00	;YUP SAY SO
	TRNE	P4,1B23		;FORMAT BIT ?
	 PUSHJ	P,RPMO01
	TRNE	P4,1B24		;ECI ON?
	 PUSHJ	P,RPMO02
	TRNE	P4,1B25		;HCI?
	 PUSHJ	P,RPMO03
	TYPEIT	< OFFSET = >
	TRNE	P4,1B28		;NEGATIVE DIR.?
	 PUSHJ	P,RPMO04		;YES
	SETZ	P3,		;ZERO COUNTER
	TRNE	P4,1B30		;800?
	 ADDI	P3,^D800
	TRNE	P4,1B31		;400?
	 ADDI	P3,^D400
	TRNE	P4,1B32		;200?
	 ADDI	P3,^D200
	TRNE	P4,1B33		;100?
	 ADDI	P3,^D100
	TRNE	P4,1B34		;50?
	 ADDI	P3,^D50
	TRNE	P4,1B35		;25?
	 ADDI	P3,^D25
	MOVE	T1,P3		;TOTAL IN T1 NOW
	MOVE T2,MDETYP		;[525]GET DEVICE TYPE
	CAIN	T2,6		;RP06?
	IDIVI	T1,2		;OFFSETS ARE HALF AS BIG[525]
	SKIPN	T1		;NO OFFSET?
	 PJRST	RP04M1		;YUP-NONE
	PUSHJ	P,.ODECW	;PRINT WITH A "."
	TYPEIT	< U IN.>
	POPJ	P,0		;GO HOME

RP04M1:	TYPEIT	<NONE>
	POPJ	P,0
RPMO00:	TYPEIT	<SIGN CHANGE OFF,>
	POPJ	P,0
RPMO01:	TYPEIT	<FMT22,>
	POPJ	P,0
RPMO02:	TYPEIT	<ECI,>
	POPJ	P,0
RPMO03:	TYPEIT	<HCI,>
	POPJ	P,0
RPMO04:	TYPEIT	< - >
	POPJ	P,0

	;NOW FOR RP04 DESIRED OR CURRENT CYL

RP04DC:	HLRZ	T1,T1		;GET ERROR ALONE
	ANDI	T1,1777		;[505]ONLY CYL BITS WANTED
	MOVE	T2,MDEDTP	;[527][315]GET DEVICE TYPE
	CAIN	T2,6		;RP06?
	 JRST	RP4DC1		;[1270] YES
	CAIN	T2,11		;[1270] RM03 ?
	 JRST	RP4DC1		;[1270] YES
	TRZ	T1,1000		;[505]NO-CLEAR EXTRA BIT
RP4DC1:	PJRST	.ODECW		;[1270]
	;RS04 DESIRED SECTOR/TRACK ADDRESS
RS04BA:	HLRZ	P4,T1
	MOVE	P3,P4
	ANDI	P3,7700		;TRACK BITS ONLY
	LSH	P3,-6		;MOVE IT OVER
	TYPEIT	<D. TRK = >
	MOVE	T1,P3
	PUSHJ	P,.TOCTW
	TYPEIT	<, D.SECT = >
	ANDI	P4,77		;SECTOR BITS
	MOVE	T1,P4
	PJRST	.TOCTW


	;NOW FOR TU16 REGISTERS

TU16TC:	HLRZ	P4,T1
	TRNN	P4,1B20
	 JRST 	.+3
	TYPEIT	<ACCL,>
	TRNN	P4,1B21
	 JRST	.+3
	TYPEIT	< FCS,>		; [1153]
	TRNN	P4,1B22
	 JRST	.+3
	TYPEIT	< TCW,>		; [1153]
	TRNN	P4,1B23
	 JRST	.+3
	TYPEIT	< EAO/DTE,>
	MOVE	P3,P4
	ANDI	P3,3400		;GET DENSITY
	LSH	P3,-10
	MOVE	T1,TU6DEN(P3)
	PUSHJ	P,.TSTRG
	MOVE	P3,P4
	ANDI	P3,360		;GET FORMAT
	LSH	P3,-4
	MOVE	T1,TU6FOR(P3)
	PUSHJ	P,.TSTRG
	TRNN	P4,1B32
	 JRST	.+3
	TYPEIT	< EVEN PARITY>
	ANDI	P4,7		;GET SLAVE #
	TYPEIT	< SLAVE #>
	MOVE	T1,P4
	PJRST	.TOCTW

TU6DEN:	[ASCIZ/ 200BPI NRZ/]
	[ASCIZ/ 556BPI NRZ/]
	[ASCIZ/ 800BPI NRZ/]
	[ASCIZ/ 800BPI NRZ/]
	[ASCIZ/ 1600BPI PE/]
	[ASCIZ/ 1600BPI PE/]
	[ASCIZ/ 1600BPI PE/]
	[ASCIZ/ 1600BPI PE/]

TU6FOR:	[ASCIZ/ 10 CORE-DUMP/]
	[ASCIZ/ 10 7-TRACK/]
	[ASCIZ/ 10 ASCII/]	; [1153]
	[ASCIZ/ 10 COMPATIBLE/]
	[ASCIZ/ UNKNOWN/]
	[ASCIZ/ UNKNOWN/]
	[ASCIZ/ UNKNOWN/]
	[ASCIZ/ UNKNOWN/]
	[ASCIZ/ UNKNOWN/]
	[ASCIZ/ UNKNOWN/]
	[ASCIZ/ UNKNOWN/]
	[ASCIZ/ UNKNOWN/]
	[ASCIZ/ UNKNOWN/]
	[ASCIZ/ UNKNOWN/]
	[ASCIZ/ UNKNOWN/]
	[ASCIZ/ UNKNOWN/]

	;CONTROL TABLES FOR USE WITH HWDUMP ROUTINE
	;LH = KONTYP TABLE INDEX FOR THIS REG IF SINGLE BIT
	; 	TRANSLATION OR -1 FOR SPECIAL ROUTINE
	;RH = ADDR TO ENGLISH BIT TABLES (XXXXDV) FOR JFLOOP
	; 	OR ADDR OF SPEC ROUTINE.

RP04CT:	XWD 	-1,RP04CR
	XWD	20,RP04SR
	XWD	21,RP04ER
	XWD	47,RPMRDV
	XWD	-1,NOTRAN
	XWD	-1,RP04BA
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,RP04MO
	XWD	-1,RP04DC
	XWD	-1,RP04DC
	XWD	22,RP04CB
	XWD	23,RP04DA
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN

RS04CT:	XWD	-1,RS04CR
	XWD	24,RS04SR
	XWD	25,RS04ER
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,RS04BA
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN


TU16CT:	XWD	-1,TU16CR
	XWD	26,TU16SR
	XWD	27,TU16ER
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,TU16TC
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN


;TABLE USED FOR BOTH RP05&RP06
RP05CT:	XWD 	-1,RP04CR
	XWD	20,RP04SR
	XWD	21,RP04ER
	XWD	47,RPMRDV
	XWD	-1,NOTRAN
	XWD	-1,RP04BA
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,RP04MO
	XWD	-1,RP04DC
	XWD	-1,RP04DC
	XWD	34,RP05DV
	XWD	35,RP06DV
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN

RM03CT:	XWD 	-1,RP04CR		;  [601]
	XWD	20,RP04SR
	XWD	21,RP04ER
	XWD	54,RM3MR1
	XWD	-1,NOTRAN
	XWD	-1,RP04BA
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
	XWD	-1,RM03MO
	XWD	-1,RP04DC
	XWD	-1,NOTRAN
	XWD	55,RM3MR2
	XWD	56,RM3ER2
	XWD	-1,NOTRAN
	XWD	-1,NOTRAN
DEVTYP:	0
	0
	SOFTDV
	TM10DV
	RH10DV
	RH20DV
	DX10DV
	TC10DV
	DL10DV
	DL11DV
	KL1ADV
	RH11DV
	UBADV
	KS1ADV
	0
	0
	RP04SR		;20
	RP04ER
	RP04CB
	RP04DA
	RS04SR
	RS04ER
	TU16SR
	TU16ER
	ICPCX1
	DXTAGB
	DXSB03
	DXSB47
	RP05DV
	RP06DV
	FESTDV
	FELPDV
	LPSADV		;40
	LPSBDV
	FECDDV
	CDSTDV
	RHSWDV
	RLD1DV
	FEKLDV
	RPMRDV
	DXSRDV
	DXERDV
	DXMRDV
	CS2DV
	RM3MR1
	RM3MR2
	RM3ER2
	SCRDV
	NRCDV		;60
	SUBTTL	KL CPU STATUS BLOCK ENTRY
;ADDED BY EDIT 740

SB000A:	PUSHJ	P,.TCRLF		;[754]
	TYPEIT <CONI RH0 THRU RH7 >
	PUSHJ	P,.TCRLF
	MOVE	P2,[XWD -8,SB%RHC]
	PUSHJ	P,COLOUT
	TYPEIT <CONI DTE0 THRU DTE3 >
	PUSHJ	P,.TCRLF
	MOVE	P2,[XWD -4,SB%DTC]
	PUSHJ	P,COLOUT
	TYPEIT <EPT LOCATIONS 0 THRU 37 (CHANNEL LOGOUT AREA)>
	PUSHJ	P,.TCRLF
	MOVE	P2,[XWD -40,SB%EP0]
	PUSHJ	P,COLOUT
	TYPEIT <EPT LOCATIONS 140 THRU 177 (DTE CONTROL BLOCKS)>
	PUSHJ	P,.TCRLF
	MOVE	P2,[XWD -40,SB%EP1]
	PUSHJ	P,COLOUT
	TYPEIT <UPT LOCATIONS 424 THRU 427 (UUO AREA)>
	PUSHJ	P,.TCRLF
	MOVE	P2,[XWD -4,SB%UP0]
	PUSHJ	P,COLOUT
	TYPEIT <UPT LOCATIONS 500 THRU 503 (PAGE FAIL AREA)>
	PUSHJ	P,.TCRLF
	MOVE	P2,[XWD -4,SB%UP1]
	PUSHJ	P,COLOUT
	TYPEIT <AC BLOCK 6 LOCATIONS 0 THRU 3 AND 12>
	PUSHJ	P,.TCRLF
	MOVE	P2,[XWD -5,SB%6]
	PUSHJ	P,COLOUT
	PUSHJ	P,.TCRLF	;[754]
	TYPEIT	<AC BLOCK 7 LOCATIONS 0 THRU 2>
	PUSHJ	P,.TCRLF
	MOVE	P2,[XWD -3,SB%7]
	PUSHJ	P,COLOUT
	POPJ	P,0
SB000B:	PUSHJ	P,.TCRLF
	PUSHJ	P,.TCRLF
	TYPEIT	<SBDIAG FUNCTIONS>
	PUSHJ	P,.TCRLF
	TYPEIT	<	CTRLR	FUNCTION 0	FUNCTION 1>
	MOVE	P2,WKBUFF+SB%SBD ;OFFSET > 77 -- PROCESSOR CAN'T GET IT [753]
	PUSHJ	P,SBDOUT
	POPJ	P,0

;MOVED KLE200 & KLE201 TO SYRLIB WITH EDIT [1226]
	SUBTTL	BIT CHECKING ROUTINES
	;BCKXXX -- SUBROUTINES TO DETERMINE LISTING AND SUMMATION
	; ELIGIBILITY BASED ON BITS IN ENTCHR TABLE
	;CALL	PUSHJ	P,@BITCHK(ERROR CODE)
	;
	;RETURN	CALL+1 TO LIST
	;	JRST	ABORT TO GO TO NEXT ENTRY
	;CHANGED WITH EDIT 211 TO SUPPORT USING ONLY /DEV:SWITCH

BCK101:	MOVE	P1,ERTYPE	
	MOVE	P2,ENTCHR(P1)	;CHARACTERISTICS OF ENTRY
	PUSH	P,P2		;SAVE P2
	TLNE	P2,E.LSUM	;WANT SUMMARY?
	 PUSHJ	P,SUM101	;GO DO IT
	POP	P,P2		;RESTORE P2
	TLNN	F,F.DEV		;EDIT 211-SAID /DEV:?
	 JRST	BC101A		;NO GO AROUND
	MOVE	T1,[SIXBIT/KLCPU/]
	CAME	T1,DEV		;MATCH?
	 JRST	ABORT		;NOPE!
	TLNE	F,F.OSUM	;ANY TYPE SWITCH SPECIFIED?
	 TLO	P2,E.LALL	;NO FORCE LISTING
BC101A:	TLNE	P2,E.LALL	;LIST ALL?
	 POPJ	P,0		;YES
	TLNE	P2,E.LPER	;LIST PERFORMANCE
	 POPJ	P,0		;YES
	JRST	ABORT		;THAT'S ALL TO CHECK
BCK102:	MOVE	P1,ERTYPE	
	MOVE	P2,ENTCHR(P1)	;CHARACTERISTICS OF ENTRY
	PUSH	P,P2		;SAVE P2
	TLNE	P2,E.LSUM	;WANT SUMMARY?
	 PUSHJ	P,SUM102		;GO DO IT
	POP	P,P2		;RESTORE P2
	TLNN	F,F.DEV		;EDIT 211-SAID /DEV:?
	 JRST	BC102A		;NO GO AROUND
	MOVE	T1,[SIXBIT/KLCPU/]
	CAME	T1,DEV		;MATCH?
	 JRST	ABORT		;NOPE!
	TLNE	F,F.OSUM	;ANY TYPE SWITCH SPECIFIED?
	 TLO	P2,E.LALL	;NO FORCE LISTING
BC102A:	TLNE	P2,E.LALL	;LIST ALL?
	 POPJ	P,0		;YES
	TLNE	P2,E.LPER	;LIST PERFORMANCE
	 POPJ	P,0		;YES
	JRST	ABORT		;THAT'S ALL TO CHECK
BCK111:	MOVE	P1,ERTYPE
	MOVE	P4,ENTCHR(P1)		;GET CHAR WORD
	PUSH	P,P4			;SAVE CHARACTERISTICS
	TLNE	P4,E.LSUM		;SUMMARY?
	 PUSHJ	P,SUM111
	TLNN	F,F.TRY			;SAID /RETRY?  [126]
	 JRST	BC111A			;NO
	HRRZ	T1,WKBUFF+MB%FEC	;[707]GET # RETRIES
	CAMG	T1,RETRY		;ENTRY VALUE GREATER
	 JRST	ABORT			;NO-DON'T LIST
BC111A:	TLNN	F,F.DEV			;SAID /DEV:?
	 JRST	BK111B			;NO! - SKIP THIS SECTION
	MOVE	T1,DEV			;YES! - GET SPECIFIED NAME
	MOVE	T2,MDEDTP		;GET THIS ENTRIES DEVICE TYPE
	CAMN	T1,MDE000(T2)		;ARE THEY THE SAME?  [606]
	 JRST	.+3			;YES! - FORCE LISTING
	MOVEI	P3,MB%NAM		;NO! - TRY GENERAL TYPE
	PUSHJ	P,DEVCHK
	POP	P,P4			;GET CHARACTERISTICS BACK
	TLNE	F,F.OSUM	;ANY TYPE SWITCH CALLED LIKE /MASALL?
	 TLO	P4,E.LALL	;NO-FORCE LISTING
	PUSH	P,P4		;SAVE CHARACTERISTICS
BK111B:	TRNN	F,F.NDEV	;/NDEV:?
	 JRST	BC111B		;NOPE
	MOVEI	P3,MB%NAM
	PUSHJ	P,NDVCHK	;GO CHECK
BC111B:	TLNN	F,F.ID			;SAID /ID:?
	 JRST	BC111C
	MOVEI	P3,MB%VID
	PUSHJ	P,IDCHK
BC111C:	TLNN	F,F.STR		;SAID /STR?
	 JRST BC111X		;NO
	MOVEI	P3,MB%VID	;OFFSET TO STR ID(USES VID,REALLY)
	PUSHJ	P,STRCHK	;GO CHECK IT
BC111X:	POP	P,P4		;GET CHARACTERISTICS BACK
	TLNE	P4,E.LALL		;WANTS ALL?
	 POPJ	P,0			;OK
	TLNN	P4,E.LNXM		;HOW ABOUT NXM
	 JRST	BC111E			;NO-CHECK PARITY
	HRRZ	T1,MASKON	;GET CONTROLLER TYPE
	CAIE	T1,..RH10		;RH10?
	 JRST	BC111D			;NO
	MOVE 	T2,WKBUFF+MB%CNI	;YES-GET CONI WORD
	TLNE	T2,1B35			;NXM ON?  (BIT 17)
	 POPJ	P,0			;YES;LIST IT
	JRST	BC111E			;NO-CHECK PARITY
BC111D:	CAIN	T1,..RH11		;RH11?   [600]
	 JRST [	MOVE	T2,WKBUFF+MB%S2I	;RH11 CONTROL & STATUS 2
		TRNE	T2,1B24		;NXM?
		 POPJ	P,0		;YES! - LIST IT
		JRST	.+1 ]		;NO! - CONTINUE
	MOVE	T2,WKBUFF+MB%CS1	;GET CHAN STATUS 1	[547]
	TLNE	T2,1B22			;NXM?			[547]
	 POPJ	P,0			;YES! - LIST IT
BC111E:	TLNN	P4,E.LPAR		;CARE ABOUT PARITY ERRORS?
	 JRST ABORT			;NO THAT'S ALL I COVER
	MOVE	T1,MDEDTP		;GET DEVICE TYPE
	HLRZ	T1,PAR111(T1)		;GET DISPATCH ADDRESS
	PJRST	@T1			;DISPATCH TO ROUTINE  [607]

BC111F:	HRRZ	T2,WKBUFF+MB%REG+2	;ERROR REG
	TRNE	T2,1B32			;PARITY SET?
	 POPJ	P,0			;LIST	IT
	JRST	BC111J			;NO-CHECK CONTROLLER

BC111G:	HRRZ	T2,WKBUFF+MB%REG+2	;ERROR REG
	TRNE	T2,1B29!1B30!1B32	;THESE ARE POSSIBLE
	 POPJ	P,0
	JRST	BC111J			;NO

BC111H:	HRRZ	T2,WKBUFF+MB%REG+2	;ERROR REG
	TRNE	T2,1B20!1B27!1B29!1B32	;CHOICES  [601]
	 POPJ	P,0			;SET-LIST IT
			;OR FALL INTO

	;HERE TO CHECK PARITY ERRORS DET BY THE CONTROLLER
BC111J:	HRRZ	T2,WKBUFF+MB%REG	;CONTROL & STATUS 1  [600]
	TRNE	T2,1B22			;MCPE?
	 POPJ	P,0			;YEP! - GO LIST
	MOVE	T1,MASKON		;KONTROLLER TYPE
	CAIE	T1,..RH10		;RH10?
	 JRST	BC111K			;NO
	MOVE	T2,WKBUFF+MB%CNI
	TDNE	T2,[1B15!1B16!1B18]	;CHOICES
	 POPJ	P,0			;LIST IT
	JRST	ABORT			;FORGET IT

BC111K:	TRNE	T1,..RH20		;RH20?  [600]
	 JRST	BC111L			;NO!
	MOVE	T2,WKBUFF+MB%CNI
	TDNE	T2,[1B18!1B22]		;OTHER CHOICES
	 POPJ	P,0			;LIST
	JRST	ABORT			;FORGET IT

BC111L:	TRNE	T1,..RH11		;RH11? - HOPE SO!  [600]
	 JRST	ABORT			;NO!! - HELP!!!
	MOVE	T2,WKBUFF+MB%S2I	;CONTROL & STATUS 2
	TRNE	T2,1B22			;UPE?
	 POPJ	P,0			;YES! - LIST
	MOVE	T2,WKBUFF+MB%UBI	;UBA STATUS
	TRNE	T2,1B20			;BUS PARITY ERR?
	 POPJ	P,0			;YUP! - LIST
	JRST	ABORT			;NO! - FORGET IT
;PAR111 - DISPATCH TABLE FOR PARITY BIT-CHECK ROUTINES AND FOR
;	   ERROR BIT SUMMARY ROUTINES FOR DEVICES IN A 111 ENTRY
;	   PARITY CHECK,,BIT SUMMARY  (EDITS  [607] & [1217]

;THIS TABLE MUST BE KEPT IN LINE WITH THE UNIT TYPE TABLE IN THE UNIVERSAL
; FILE.  IN PARTICULAR THERE MUST BE AT LEAST ".UTMAX" ITEMS IN THE TABLE.

PAR111:	XWD	ABORT,SUMDUM	;UNKNOWN
	XWD	BC111H,S111H	;RP04
	XWD	BC111F,S111I	;RS04
	XWD	BC111G,S111J	;TU45
	XWD	BC111G,S111J	;TU16
	XWD	BC111H,S111H	;RP05
	XWD	BC111H,S111H	;RP06
	XWD	ABORT,SUMDUM	;RP07
	XWD	ABORT,SUMDUM	;RP08
	XWD	BC111H,S111K	;RM03
	XWD	ABORT,SUMDUM	;TM03
	XWD	BC111G,S111J	;TU77
	XWD	ABORT,SUMDUM	;TM78
	XWD	ABORT,SUMDUM	;TU78
	XWD	ABORT,SUMDUM	;DX20
	XWD	BC111G,S111L	;TU70
	XWD	BC111G,S111L	;TU71
	XWD	BC111G,S111L	;TU72
	XWD	BC111G,S111L	;TU73
BCK112:	MOVE	P1,ERTYPE	
	MOVE	P2,ENTCHR(P1)	;CHARACTERISTICS OF ENTRY
	PUSH	P,P2		;SAVE P2
	TLNE	P2,E.LSUM	;WANT SUMMARY?
	 PUSHJ	P,SUM112	;GO DO IT
	TLNN	F,F.TRY		;RETRY?			[510]
	 JRST	BC112A		;NO! - SKIP		[510]
	HRRZ	T1,WKBUFF+DX%FEC;[707]GET # OF RETRIES	[510]
	CAMG	T1,RETRY	;ENTRY VALUE GREATER?	[510]
	 JRST	ABORT		;NO! - DON'T LIST	[510]
BC112A:	TLNN	F,F.DEV			;SAID /DEV:?
	 JRST	BK112B			;NO! - SKIP THIS SECTION
	MOVE	T1,DEV			;YES! - GET SPECIFIED NAME
	MOVE	T2,MDEDTP		;GET THIS ENTRIES DEVICE TYPE
	CAMN	T1,MDE000(T2)		;ARE THEY THE SAME?  [606]
	 JRST	.+3			;YES! - FORCE LISTING
	MOVEI	P3,MB%NAM		;NO! - TRY GENERAL TYPE
	PUSHJ	P,DEVCHK
	POP	P,P4			;GET CHARACTERISTICS BACK
	TLNE	F,F.OSUM	;ANY TYPE SWITCH CALLED LIKE /MASALL?
	 TLO	P4,E.LALL	;NO-FORCE LISTING
	PUSH	P,P4		;SAVE CHARACTERISTICS
BK112B:	TRNN	F,F.NDEV	;/NDEV:?
	 JRST	BC112B		;NOPE
	MOVEI	P3,MB%NAM
	PUSHJ	P,NDVCHK	;GO CHECK
BC112B:	TLNN	F,F.ID			;SAID /ID:?
	 JRST	BC112C
	MOVEI	P3,MB%VID
	PUSHJ	P,IDCHK
BC112C:	POP	P,P2		;GET ENTCHR BACK
	TLNE	P2,E.LALL	;LIST ALL?
	 POPJ	P,0		;YES
	TLNE	P2,E.LPER	;LIST PERFORMANCE
	 POPJ	P,0		;YES
	JRST	ABORT		;THAT'S ALL TO CHECK
BCK115:	MOVE	P1,ERTYPE	
	MOVE	P2,ENTCHR(P1)	;CHARACTERISTICS OF ENTRY
	PUSH	P,P2		;SAVE P2
	TLNE	P2,E.LSUM	;WANT SUMMARY?
	 PUSHJ	P,SUM115	;GO DO IT
	POP	P,P2		;RESTORE P2
	TLNN	F,F.DEV		;EDIT 211-SAID /DEV:?
	 JRST	BC115A		;NO GO AROUND
	MOVE	T1,DEV		;GET NAME SPECIFIED
	LDB	T2,[CS.UTP+WKBUFF] ;GET DEVICE TYPE
	CAMN	T1,MDE000(T2)	;IF THEY MATCH
	POPJ	P,0		; FORCE LISTING
	CAMN	T1,CS%DNM+WKBUFF ;TRY LOGICAL NAME
	POPJ	P,0
BC115A:	TLNE	P2,E.LALL	;LIST ALL?
	 POPJ	P,0		;YES
	JRST	ABORT		;THAT'S ALL TO CHECK
;SUPPORT FOR ER.SLM AND BIT CHECKING, CHECKS FOR /DEV AND/OR /ID
BCK116:	MOVE	P1,ERTYPE
	MOVE	P2,ENTCHR(P1)	;PICKUP CHAR WORD
	PUSH	P,P2		;SAVE ENTCHR
	TLNE	P2,E.LSUM	;SUMMARY DESIRED
	PUSHJ	P,SUM116
	TLNN	F,F.DEV		;USER SAY /DEV?
	JRST	BC16.1		;NO GO AROUND
	MOVEI	P3,SLMDEV	;SET UP
	PUSHJ	P,DEVCHK		;AND CHECK IT
	POP	P,P2		;RETURN ENTCHR
	TLNE	F,F.OSUM	;/DEV ALONE?
	 TLO	P2,E.LALL	;YES, FORCE /ALL
	PUSH	P,P2		;SAVE IT AGAIN
BC16.1:	TLNN	F,F.ID		;/ID? = "WHO"
	 JRST	BC16.2		;NO
	MOVEI	P3,SLMWHO	;SETUP 
	PUSHJ	P,IDCHK		;MAKE CHECK
BC16.2:	POP	P,P2		;RESTORE ENTCHR
	TLNN	P2,E.LALL!E.LPER	;WANT ALL OR PER?
	JRST	ABORT		;LOSE
	POPJ	P,0		;WIN
;MORE FIXES FOR KLERR WITH EDIT  [1235]

BCK130:	MOVE	P1,ERTYPE	
	MOVE	P2,ENTCHR(P1)	;CHARACTERISTICS OF ENTRY
	TLNE	P2,E.LSUM	;WANTS SUMMARY?
	 PUSHJ	P,SUM130	;DO IT
	HRRZ	T1,WKBUFF+FE%COD ;GET DEVICE CODE
	CAIE	T1,.KLERR	;IF NOT KLERR
	JRST	BC130X		; SKIP KLERR CHECK
	HRRZ	T2,WKBUFF+FE%OFF ;GET STD. STATUS WORD
	ADDI	T2,WKBUFF
	LDB	T2,[STD.ST(T2)]	
	TRNE	T2,1B30		;IF EOF IS SET
	JRST	BC130X		; PROCEED NORMALLY
	TRNN	F,F.REM		;IF NOT REMOTE
	JRST	ABORT		; ABORT

;[1266] REMOVED TO KEEP 130-201 ENTRIES FROM /REMOTE FILE UNLESS ASKED FOR.
;	POPJ	P,0		; ELSE FORCE TRANSFER

BC130X:	TLNN	F,F.DEV		;SAID /DEV:?
	 JRST	BC130A		;NOPE  [1200]
	HRRZ	T1,WKBUFF+FE%COD ;GET DEVICE CODE
	CAIL	T1,200		;IF NOT HARDWARE DEVICE
	JRST	BC130C		; TRY PSEUDO DEVICE
	MOVE	T1,FE$NAM(T1)	;NOW IN SIXBIT
	CAME	T1,DEV
	 JRST	ABORT		;NO MATCH
	TLNE	F,F.OSUM	;ANY TYPE SWITCH CALLED?
	 TLO	P2,E.LALL	;NO-FORCE LISTING
BC130A:	TLNE	P2,E.LALL	;LIST ALL?
	POPJ	P,0		;YES! - LIST IT!
	TLNE	P2,E.LPER	;LIST PERFORMANCE
	POPJ	P,0		;YES! - LIST IT!
	HRRZ	T2,WKBUFF+FE%COD
	CAIE	T2,200		;RELOAD?
	JRST	ABORT		;NOPE
	MOVE	T1,SWITCH	;GET ADDR OF COMMAND USED
	CAIE	T1,CPUPER	;"/CPUPER"?
	JRST	ABORT		;NOPE
	POPJ	P,0		;YES! - LIST IT!

BC130C:	SUBI	T1,200	;REMOVE OFFSET
	MOVE	T1,FEHNAM(T1)	;A HIGHER NAME
	CAME	T1,DEV		;MATCH?
	 JRST	BC130D		;CHECK FURTHER
	TLNE	F,F.OSUM	;ANY LISTING CALLED FOR?
	 TLO	P2,E.LALL	;NO-FORCE LISTING
	JRST	BC130A		;AND CONTINUE
BC130D:	HRRZ	T2,WKBUFF+FE%COD
	CAIE	T2,201		;KLERR?
	JRST	ABORT		;NOPE
	MOVE	T1,FEHNAM	;GET SIXBIT "KLCPU"
	CAME	T1,DEV	;MATCH
	 JRST	ABORT
	TLNE	F,F.OSUM
	 TLO	P2,E.LALL	;FORCE AS ABOVE
	JRST	BC130A		;AND CONTINUE
BCK131:	MOVE	P1,ERTYPE	
	MOVE	P2,ENTCHR(P1)	;CHARACTERISTICS OF ENTRY
	PUSH	P,P2		;SAVE P2
	TLNE	P2,E.LSUM	;WANT SUMMARY?
	 PUSHJ	P,SUM131		;GO DO IT
	POP	P,P2		;RESTORE P2
	TLNN	F,F.DEV		;EDIT 211-SAID /DEV:?
	 JRST	BC131A		;NO GO AROUND
	MOVE	T1,[SIXBIT/11CPU/]
	CAME	T1,DEV		;MATCH?
	 JRST	ABORT		;NOPE!
	TLNE	F,F.OSUM	;ANY TYPE SWITCH SPECIFIED?
	 TLO	P2,E.LALL	;NO FORCE LISTING
BC131A:	TLNE	P2,E.LALL	;LIST ALL?
	 POPJ	P,0		;YES
	TLNE	P2,E.LPER	;LIST PERFORMANCE
	 POPJ	P,0		;YES
	JRST	ABORT		;THAT'S ALL TO CHECK
BCK160:	MOVE	P1,ERTYPE	
	MOVE	P2,ENTCHR(P1)	;CHARACTERISTICS OF ENTRY
	PUSH	P,P2		;SAVE P2
	TLNE	P2,E.LSUM	;WANT SUMMARY?
	 PUSHJ	P,SUM160		;GO DO IT
	POP	P,P2		;RESTORE P2
	TLNN	F,F.DEV		;EDIT 211-SAID /DEV:?
	 JRST	BC160A		;NO GO AROUND
	MOVE	T1,[SIXBIT/CPU/]
	CAME	T1,DEV		;MATCH?
	 JRST	ABORT		;NOPE!
	TLNE	F,F.OSUM	;ANY TYPE SWITCH SPECIFIED?
	 TLO	P2,E.LALL	;NO FORCE LISTING
BC160A:	TLNE	P2,E.LALL	;LIST ALL?
	 POPJ	P,0		;YES
	TLNE	P2,E.LPER	;LIST PERFORMANCE
	 POPJ	P,0		;YES
	JRST	ABORT		;THAT'S ALL TO CHECK
BCK161:				; [614]
BCK162:	MOVE	P1,ERTYPE	
	MOVE	P2,ENTCHR(P1)	;CHARACTERISTICS OF ENTRY
	PUSH	P,P2		;SAVE P2
	TLNE	P2,E.LSUM	;WANT SUMMARY?
	 PUSHJ	P,SUM161	;GO DO IT
	POP	P,P2		;RESTORE P2
	TLNN	F,F.DEV		;EDIT 211-SAID /DEV:?
	 JRST	BC161A		;NO GO AROUND
	MOVE	T1,[SIXBIT/KLCPU/]
	CAME	T1,DEV		;MATCH?
	 JRST	ABORT		;NOPE!
	TLNE	F,F.OSUM	;ANY TYPE SWITCH SPECIFIED?
	 TLO	P2,E.LALL	;NO FORCE LISTING
BC161A:	TLNE	P2,E.LALL	;LIST ALL?
	 POPJ	P,0		;YES
	TLNE	P2,E.LPER	;LIST PERFORMANCE
	 POPJ	P,0		;YES
	JRST	ABORT		;THAT'S ALL TO CHECK
BCK133:
BCK163:	MOVE	P1,ERTYPE	
	MOVE	P2,ENTCHR(P1)	;CHARACTERISTICS OF ENTRY
	PUSH	P,P2		;SAVE P2
	TLNE	P2,E.LSUM	;WANT SUMMARY?
	 PUSHJ	P,SUM163	;GO DO IT
	POP	P,P2		;RESTORE P2
	TLNN	F,F.DEV		;EDIT 211-SAID /DEV:?
	 JRST	BC163A		;NO GO AROUND
	MOVE	T1,[SIXBIT/KLCPU/]
	CAME	T1,DEV		;MATCH?
	 JRST	ABORT		;NOPE!
	TLNE	F,F.OSUM	;ANY TYPE SWITCH SPECIFIED?
	 TLO	P2,E.LALL	;NO FORCE LISTING
BC163A:	TLNE	P2,E.LALL	;LIST ALL?
	 POPJ	P,0		;YES
	TLNE	P2,E.LPAR	;LIST PARITY
	 POPJ	P,0		;YES
	TLNE	P2,E.LNXM	;LIST NXM
	POPJ	P,0		;YES
	JRST	ABORT		;THAT'S ALL TO CHECK


BCK164:	MOVE	P1,ERTYPE	
	MOVE	P2,ENTCHR(P1)	;CHARACTERISTICS OF ENTRY
	PUSH	P,P2		;SAVE P2
	TLNE	P2,E.LSUM	;WANT SUMMARY?
	 PUSHJ	P,SUM164	;GO DO IT
	POP	P,P2		;RESTORE P2
	TLNN	F,F.DEV		;EDIT 211-SAID /DEV:?
	 JRST	BC164A		;NO GO AROUND
	MOVE	T1,[SIXBIT/MF20/]
	CAME	T1,DEV		;MATCH?
	 JRST	ABORT		;NOPE!
	TLNE	F,F.OSUM	;ANY TYPE SWITCH SPECIFIED?
	 TLO	P2,E.LALL	;NO FORCE LISTING
BC164A:	TLNE	P2,E.LALL	;LIST ALL?
	 POPJ	P,0		;YES
	TLNE	P2,E.LPAR	;LIST PARITY
	 POPJ	P,0		;YES
	JRST	ABORT		;THAT'S ALL TO CHECK
	SUBTTL	SUMMARY ROUTINES

SUM101:
SUM115:
SUM131:
SUM133:
SUM160:
SUM161:
SUM162:
SUM163:				; [740]
SUM164:
SUMDUM:	POPJ	P,0		;DUMMY SUMMARY ROUTINE
;START OF EDIT 1200

SUM102:	MOVE	T1,[NEGINF]		;[1260] MAKE SURE IT FIRST IN LIST
	MOVEM	T1,KEYBUF		;[1260] COUNT BUG TYPE
	MOVE	T1,WKBUFF+BG%FLG
	SKIPL	T1		;IF BUG TYPE OUT OF RANGE
	CAILE	T1,BG%MAX	;[1260]
	SETZ	T1,		; MAKE IT 'BUG???'
	MOVEM	T1,KEYBUF+1
	MOVE	T1,[1,,BUGLST]
	MOVE	T2,[2,,KEYBUF]
	GETBF
	 FATAL	<ERROR AT SUM102 - GETBF 1>
	AOS	(T1)
	MOVE	T1,KEYBUF+1	 ;COUNT BUG REASON
	MOVEM	T1,KEYBUF
	MOVE	T1,WKBUFF+BG%NAM
	MOVEM	T1,KEYBUF+1
	MOVE	T1,[1,,BUGLST]
	MOVE	T2,[2,,KEYBUF]
	GETBF
	 FATAL	<ERROR AT SUM102 - GETBF 2>
	AOS	(T1)
	POPJ	P,0		;DONE - RETURN
;REWRITTEN TO ALLOW FOR MORE THAN ONE WORD TO BE SUMMED FOR RH11  [600]
;REDONE FOR DYNAMIC TABLE ALLOCATION WITH EDITS  [1200] & [1217]

;DO CHANNEL TOTAL
SUM111:
SUM112:	LDB	T1,[MB.CHN+WKBUFF]	;GET CONTROLLER TYPE
	MOVEM	T1,KEYBUF
	MOVE	T1,WKBUFF+MB%CAD	;GET CHANNEL #
	MOVEM	T1,KEYBUF+1
	MOVE	T1,[1,,CHNTOT]
	MOVE	T2,[2,,KEYBUF]
	GETBF
	 FATAL	<ERROR AT SUM111 - GETBF CHNTOT>
	MOVEI	P3,1			;SET UP FOR SOFT ERROR
	MOVE	T2,WKBUFF+MB%IRS	;GET IORB STATUS WORD
	TLNE	T2,HRDERR		;IF IT'S HARD
	MOVSS	P3			; ADD TO LEFT HALF
	ADDM	P3,(T1)
;NOW CHANNEL ERROR BIT SUMMARY
; (HAVE CONTROLLER TYPE IN KEYBUF FROM ABOVE)
	MOVE	T1,WKBUFF+MB%NAM	;GET PHYSICAL DEVICE NAME IN SIXBIT
	MOVEM	T1,KEYBUF+1
	MOVE	T1,[17,,CHNLST]
	MOVE	T2,[2,,KEYBUF]
	GETBF
	 FATAL	<ERROR AT SUM111 - GETBF CHNLST>
	MOVE	P1,MASKON		;TYPE CONTROLLER SAVED BY MDECHR
	MOVE	P2,T1			;SAVE ERROR COUNTER BASE ADDRESS
	MOVE	T1,WKBUFF+MB%CNI	;CONI WORD (C & S #1 FOR RH11)
	PUSHJ	P,DYNSUM		;GO DO THE BIT COUNTING

	CAIE	P1,..RH11		;RH11? (USES 3 WORDS)
	JRST	S111B			;NO! - NO MORE

	MOVEI	P1,53			;OFFSET FOR C&S2
	ADDI	P2,NUMR11		;ADVANCE POINTER FOR 2ND WORD
	MOVE	T1,WKBUFF+MB%S2I	;RH11 C & S #2
	PUSHJ	P,DYNSUM		;GO DO THE BIT COUNTING

	MOVEI	P1,14			;OFFSET FOR UBA STATUS REGISTER
	ADDI	P2,NUMCS2		;ADVANCE POINTER FOR 3RD WORD
	MOVE	T1,WKBUFF+MB%UBI	;UBA STATUS REG.
	PUSHJ	P,DYNSUM		;GO DO THE BIT COUNTING
;NOW FOR DEVICE TOTAL
S111B:	LDB	T1,[MB.DEV+WKBUFF]	;GET DEVICE TYPE
	CAIL	T1,.UTMIN		;IF NOT A LEGAL DEVICE
	CAILE	T1,.UTMAX
	SETZ	T1,			; MAKE IT UNKNOWN
	MOVEM	T1,KEYBUF
	MOVE	T1,KEYBUF+1		;PUT DRIVE NAME FROM CHNLST IN KEY 2
	MOVEM	T1,KEYBUF+2
	MOVE	T1,ERTYPE		;IF NOT DX20 ERROR  [START 1206]
	CAIE	T1,SEC%DX		; (ERROR TYPE 112)
	JRST	S111A			; GET S/N FROM MB REG 10
	HRRZ	T4,WKBUFF+DX%DVL	;DEVICE VALUE SUB-BLOCK POINTER
	ADDI	T4,WKBUFF		;CREATE BUFFER POINTER
	LDB	T1,[POINT 8,DT%SBE(T4),9]	;LOW PART
	LDB	T2,[POINT 8,DT%SBD(T4),35]	;HIGH PART
	DPB	T2,[POINT 8,T1,27]	;COMBINE HIGH & LOW PARTS
	SKIPA				;SKIP OVER NON-DX20 STYLE  [END 1206]
S111A:	HRRZ	T1,WKBUFF+MB%REG+10	;S/N IN BCD FOR NORMAL MASBUSS DEVICES
	MOVEM	T1,KEYBUF+1
	MOVE	T1,[50,,MASLST]
	MOVE	T2,[3,,KEYBUF]
	GETBF
	 FATAL	<ERROR AT SUM111 - GETBF MASLST>
	ADDM	P3,(T1)			;HARD/SOFT FLAG SHOULD STILL BE SET UP
	AOS	P2,T1			;SETUP BASE POINTER FOR DEVICE REGISTERS

;START SUMMING DEVICE ERROR REGISTERS
	MOVE	T1,MDEDTP		;GET DEVICE TYPE
	HRRZ	T1,PAR111(T1)		;GET DISPATCH ADDRESS
	PJRST	@T1			;DISPATCH TO ROUTINE  [607]

	;HERE FOR RP04, RP05, RP06
S111H:	MOVEI	P1,21			;OFFSET FOR RP04 ERROR REG #1
	HRLZ	T1,WKBUFF+MB%REG+2	;WORD TO SUMMATE
	PUSHJ	P,DYNSUM		;GO DO THE BIT COUNTING

	MOVEI	P1,22			;OFFSET FOR RP04 ERROR REG #2
	ADDI	P2,NURP02		;ADVANCE POINTER FOR 2ND WORD
	HRLZ	T1,WKBUFF+MB%REG+14	;2ND WORD - RP04 ERROR REG #2
	PUSHJ	P,DYNSUM		;GO DO THE BIT COUNTING

	MOVEI	P1,23			;OFFSET FOR RP04 ERROR REG #3
	ADDI	P2,NURP10		;ADVANCE POINTER FOR 3RD WORD
	HRLZ	T1,WKBUFF+MB%REG+15	;3RD WORD - RP04 ERROR REG #3
	PJRST	DYNSUM			;GO DO THE BIT COUNTING

	;HERE FOR RS04
S111I:	MOVEI	P1,25			;OFFSET FOR RS04 ERROR REGISTER
	HRLZ	T1,WKBUFF+MB%REG+2	;WORD TO SUMMATE
	PJRST	DYNSUM			;GO DO THE BIT COUNTING

	;HERE FOR TU16, TU45, TU77
S111J:	MOVEI	P1,27			;OFFSET FOR TU16 ERROR REGISTER
	HRLZ	T1,WKBUFF+MB%REG+2	;WORD TO SUMMATE
	PJRST	DYNSUM			;GO DO THE BIT COUNTING

	;HERE FOR RM03  [601]
S111K:	MOVEI	P1,21			;OFFSET FOR RM03 ERROR REG #1
	HRLZ	T1,WKBUFF+MB%REG+2	;WORD TO SUMMATE
	PUSHJ	P,DYNSUM		;GO DO THE BIT COUNTING

	MOVEI	P1,56			;OFFSET FOR RP04 ERROR REG #2
	ADDI	P2,NURP02		;ADVANCE POINTER FOR 2ND WORD
	HRLZ	T1,WKBUFF+MB%REG+15	;WORD TO SUMMATE
	PJRST	DYNSUM			;GO DO THE BIT COUNTING

	;HERE FOR TU70, TU71, TU72, TU73
S111L:	MOVEI	P1,51			;OFFSET FOR TU70 ERROR REG #1
	HRRZ	T1,WKBUFF+DX%MBR	;MASBUSS REG SUB-BLOCK POINTER
	HRLZ	T1,WKBUFF+2(T1)		;WORD TO SUMMATE
	PJRST	DYNSUM			;GO DO THE BIT COUNTING

;END OFF EDIT  [1217]
SUM116:	MOVE	T2,WKBUFF+SLMWHO	;SAME AS SUM1 BASICALLY
	MOVEI	T1,WHOSLM		;INIT POINTER
WHOFND:	HLRZ	T3,(T1)			;GET POINTER TO NEXT
	JUMPE	T3,WHONEW		;EXIT IF NO REASON
	MOVEI	T1,(T3)			;SETUP POINTER
	CAME	T2,1(T1)		;IS THIS THE ENTRY?
	 JRST	WHOFND			;NO,GET NEXT
	AOS	T3,(T1)			;BUMP
	TRNN	T3,-1			;BUT
	  SOS	(T1)			;NOT TOO MUCH(OVERFLOW)
	PJRST	SM116A
	
WHONEW:	AOS	T3,.JBFF		;NEXT POSITION
	AOS	.JBFF			;CLEAN HOUSE
	CAMG	T3,.JBREL		;IS THERE ROOM?
	 JRST	WHOINS			;YES INSERT REASON
	MOVE	T4,T3			;DIFFERENT AC
	CORE	T4,			;GET MORE CORE
	 FATAL	<SYRNCA: NO CORE AVAILABLE>	;OPPS

WHOINS:	MOVEM	T2,(T3)			;SAVE REASON
	ADDI	T3,-1			;INITIAL COUNT AND ADDRESS
	HLRZM	T3,(T3)			;SET COUNT TO ONE
	HRLM	T3,(T1)		;POINT TO THIS BLOCK
	PJRST	SM116A		;DO SECON HALF


SM116A:	MOVE	T2,WKBUFF+SLMDEV	;SAME AS SUM1 BASICALLY
	MOVEI	T1,DEVWHY		;INIT POINTER
DEVFND:	HLRZ	T3,(T1)			;GET POINTER TO NEXT
	JUMPE	T3,DEVNEW		;EXIT IF NO REASON
	MOVEI	T1,(T3)			;SETUP POINTER
	CAME	T2,1(T1)		;IS THIS THE ENTRY?
	 JRST	DEVFND			;NO,GET NEXT
	AOS	T3,(T1)			;BUMP
	TRNN	T3,-1			;BUT
	  SOS	(T1)			;NOT TOO MUCH(OVERFLOW)
	POPJ	P,0
	
DEVNEW:	AOS	T3,.JBFF		;NEXT POSITION
	AOS	.JBFF			;CLEAN HOUSE
	CAMG	T3,.JBREL		;IS THERE ROOM?
	 JRST	DEVINS			;YES INSERT REASON
	MOVE	T4,T3			;DIFFERENT AC
	CORE	T4,			;GET MORE CORE
	 FATAL	<SYRNCA: NO CORE AVAILABLE>	;OPPS

DEVINS:	MOVEM	T2,(T3)			;SAVE REASON
	ADDI	T3,-1			;INITIAL COUNT AND ADDRESS
	HLRZM	T3,(T3)			;SET COUNT TO ONE
	HRLM	T3,(T1)		;POINT TO THIS BLOCK
	POPJ	P,0		;AND LEAVE
;START EDIT 1200

SUM130:	LDB	T1,[FE.DEV+WKBUFF] ;GET DEVICE CODE
	CAIL	T1,200		;IF IN PSEUDO RANGE
	JRST	SM130B		; CHECK LEGALITY
	CAILE	T1,.FEMAX	;IF OUT OF CURRENT REAL RANGE
SM130A:	SETZ	T1,		; MAKE IT UNKNOWN
	MOVE	T1,FE$NAM(T1)	;GET SIXBIT DEVICE NAME
	JRST	SM130G		; AND COUNT IT
	
SM130B:	CAILE	T1,.KLMAX	;IF OUT OF CURRENT PSEUDO RANGE
	JRST	SM130A		; MAKE IT UNKNOWN
	CAIE	T1,.KLERR	;IF NOT KLERR
	JRST	SM130C		; JUST COUNT ENTRY
	HRRZ	T2,WKBUFF+FE%OFF ;GET STD. STATUS WORD
	ADDI	T2,WKBUFF
	LDB	T2,[STD.ST(T2)]	
	TRNE	T2,1B30		;IF EOF IS SET
	JRST	SM130K		; COUNT REPORT

SM130C:	SUBI	T1,200		;REMOVE OFFSET
	MOVE	T1,FEHNAM(T1)	;GET SIXBIT DEVICE NAME
SM130G:	MOVEM	T1,KEYBUF	;COUNT ENTRY
	MOVE	T1,[1,,FE.LST]
	MOVE	T2,[1,,KEYBUF]
	GETBF
	 FATAL	<ERROR AT SM130G - GETBF>
	AOS	(T1)
	POPJ	P,0		;RETURN

SM130K:	SUBI	T1,200		;REMOVE OFFSET
	MOVE	T1,FEHNAM(T1)	;GET SIXBIT DEVICE NAME
	MOVEM	T1,KEYBUF	;COUNT ENTRY & REPORT
	MOVE	T1,[1,,FE.LST]
	MOVE	T2,[1,,KEYBUF]
	GETBF
	 FATAL	<ERROR AT SM130K - GETBF>
	MOVE	T2,[1,,1]
	ADDM	T2,(T1)
	POPJ	P,0		;RETURN

;END EDIT 1200
COMMENT \ I DON'T THINK WE NEED THIS CODE  [PJB]

	;SUMUPD -- SUBROUTINE TO AUTOMATICALLY UPDATE ALL PERMANENT
	;SUMMARY COUNTERS PRIOR TO SUMMARY LISTING
	;A DUMMY MACRO DUMFLG IS USED TO GENERATE
	;THE NECESSARY CODE AS FOLLOWS
	;SKIPE	T1,XXXTMP	;PICKUP TEMP COUNTER
	;ADDM	T1,XXXPER	;INCREMENT PERM COUNTER
	;DO NEXT COUNTER SAME.......
	;modified by edit #110
	DEFINE	TBLFLG(A)<
	setz	t1,
	exch	t1,a'tmp
	ADDM	T1,A'PER
>

	;NOW THE ACTUAL CODE GENERATION

;	XLIST
SUMUPD:	DUMFLG
	LIST


;NOW GENERATE THE SOFTWARE SUMMARY COUNTERS UPDATE
;also modified by edit #110
	DEFINE	DUMDV(A)<
	ZZ==0
REPEAT NUMSFB,<
	setz	t1,
	exch	t1,a'st+zz
	ADDM	T1,A'SP+ZZ
	ZZ==ZZ+1
>>
	XLIST
	DUMDP
	DUMFH
	DUMRP
	LIST

	POPJ	P,		;RETURN
\
	SUBTTL	STORAGE LOCATIONS
DUMDAY:	121165		;DUMMY NBS DAY FOR USE BY SCAN
KONMSK:	0			;MASK FOR ERROR BITS IN RC10 TYPE DEVICE
	0			;MASK FOR ERROR BITS IN RP10 TYPE DEVICE
	SFMASK			;SOFTWARE DETECTED ERROR MASK
	TMMASK
	RHMASK
	RH20SK
	DXMASK
	TCMASK
	DL1MSK
	DL2MSK
	KLAMSK			;KL10 CONI APR
	RH11SK			;RH11 CONTROL & STATUS 1  [600]
	UBAMSK			;UBA STATUS  [600]
	KSAMSK			;KS10 CONI APR
	0
	0
	P4SRSK
	P4ERSK
	P4CBSK
	P4DASK
	S4SRSK
	S4ERSK
	T6SRSK
	T6ERSK
	ICPCSK
	DXTBSK
	SB03SK
	SB47SK
	RP05SK
	RP06SK
	FESTSK
	FELPSK
	LPSASK
	LPSBSK
	FECDSK
	CDSTSK
	RHSWSK
	RLD1SK
	FEKLSK
	RPMRSK
	DXSRSK
	DXERSK
	DXMRSK
	CS2MSK			;RH11 CONTROL & STATUS #2  [600]
	RMM1SK			;RM03 MAINT REG 1  [601]
	RMM2SK			;RM03 MAINT REG 2  [601]
	RME2SK			;RM03 ERROR REG 2  (15)  [601]
	SCRMSK			;DH11 SYSTEM CONTROL REGISTER  [1223]
	NRCMSK			;DH11 NEXT RECEIVED CHARACTER REGISTER  [1223]
MINERB:	0
	0
	MINSFB
	MINTMB
	MINRHB
	MINRH2
	MINDXB
	MINTCB
	MINDL1
	MINDL2
	MINKLA
	MINR11
	MINUBA
	MINKSA
	0
	0
	MIRP01
	MIRP02
	MIRP10
	MIRP15
	MIRS01
	MIRS02
	MIT601
	MIT602
	MIICPC
	MIDXTB
	MISB03
	MISB47
	MIRP05
	MIRP06
	MIFEST
	MIFELP
	MILPSA
	MILPSB
	MIFECD
	MICDST
	MIRHSW
	MIRLD1
	MIFEKL
	MIRPMR
	MIDXSR
	MIDXER
	MIDXMR
	MINCS2
	MINMR1
	MINMR2
	MINER2
	MINSCR			;DH11 SYSTEM CONTROL REGISTER  [1223]
	MINNRC			;DH11 NEXT RECEIVED CHARACTER REGISTER  [1223]
ERINDX:	0
	0
	0	;SFINDX
	0	;TMINDX
	RHINDX
	RH20DX
	0	;DXINDX
	0	;TCINDX
	0	;DL1IND
	0	;DL2IND
	KLAIND
	RH11DX
	UBADX
	KSAIND
	0	;0
	0	;0
	RP01DX
	RP02DX
	RP10DX
	RP15DX
	RS01DX
	RS02DX
	T601DX
	T602DX
	0	;ICPCDX
	0	;DXTBDX
	SB03DX
	SB47DX
	RP05DX
	RP06DX
	FESTDX
	FELPDX
	LPSADX
	LPSBDX
	FECDDX
	CDSTDX
	RHSWDX
	RLD1DX
	FEKLDX
	RPMRDX
	DXSRDX
	DXERDX
	DXMRDX
	CS2DX
	RMR1DX
	RMR2DX
	RME2DX
	SCRIND			;DH11 SYSTEM CONTROL REGISTER  [1223]
	NRCIND			;DH11 NEXT RECEIVED CHARACTER REGISTER  [1223]
COMMENT \ I THINK THIS CAN BE REMOVED  [PJB]

IDVFLT:	SIXBIT/SYS/		;DEFAULT FILE SPECIFICATIONS
IFLFLT:	SIXBIT/ERROR/
IEXFLT:	SIXBIT/SYS/
ODVFLT:	SIXBIT/DSK/
OFLFLT:	SIXBIT/ERROR/
OEXFLT:	SIXBIT/LST/
\
PDLPNT:	IOWD	LPDL,PDLST
	SUBTTL	DUMMY MACRO EXPANSION AREA

;THE FOLLOWING MACRO CODE UTILIZES THE PRINCIPLE OF THE DUMMY MACRO USED EARLIER
; AND REDEFINES TBLENT TO GENERATE VARIOUS NECESSARY DISPATCH TABLES
	;DUMENT -- DUMMY MACRO LEVEL 2
	;SUBMACRO TBLENT
	;ARGS
	;A - ERROR CODE				(xxx)
	;B - ERROR DESCRIPTION			(text)
	;C - DETAIL CONTROL TABLE ADDRESS	(.CTxxx)
	;D - ENTRY LEVEL PROCESSOR ADDRESS	(PROCSx)
	;E - # OF LINES OF OUTPUT GENERATED BY THIS ENTRY EXCLUDING HEADER
	;F - BRIEF CONTROL TABLE ADDRESS	(.BRxxx)


;THIS TABLE CONTAINS ALL THE ERROR TYPES KNOWN TO ALL SYSERR PARTS.
; IT IS USED TO FIND THE OFFSET INTO THE "PCSTBL" TABLE (OFFSET SAVED IN ALLIND)

DEFINE	TBLENT(A,B,C,D,E)<
	XWD  0,A
>

ALLTBL:	DUMENT

ALLLTH==.-ALLTBL		;LENGTH OF ERROR INDEX TABLE


;THIS TABLE CONTAINS THE ERROR TYPES PROCESSED BY THIS SEGMENT IN THE RIGHT HALF
; AND THE POINTER TO THE BRIEF PROCESS TABLE FOR EACH ENTRY IN THE LEFT HALF
; IT IS USED TO FIND THE OFFSET INTO THE "TYPMES", "BITCHK, AND "LINE" TABLES
; INDEX IS SAVED IN ERRIND

DEFINE	TBLENT(A,B,C,D,E,F)<
	IFIDN<D><PROCSD><
		XWD  F,A
	>
>

ERRTBL:	0			;FIRST FOUND MUST NOT BE 0
	DUMENT

ERRLTH==.-ERRTBL		;LENGTH OF ERROR INDEX TABLE


;THIS TABLE CONTAINS THE ADDRESS OF EACH ENTRY'S PROCESSOR IN THE RIGHT HALF
; AND THE ADDRESS OF THE DETAIL CONTROL TABLE FOR THE ENTRIES PROCESSED
; BY THIS SEGMENT IN THE LEFT HALF  (TABLE IS INDEXED BY ALLIND)

DEFINE	TBLENT(A,B,C,D,E)<
	IFIDN<D><PROCSD><
		XWD	C,D
		TYPMAX==A
	>
	IFDIF<D><PROCSD><
		XWD	0,D
		TYPMAX==A
	>
>
PCSTBL:	DUMENT


;THIS TABLE CONTAINS THE POINTERS TO THE ERROR DESCRIPTION TEXT FOR
; EACH ENTRY PROCESSED BY THIS SEGMENT  (TABLE IS INDEXED BY ERRIND)
DEFINE	TBLENT(A,B,C,D,E)<
	IFIDN<D><PROCSD><
		[ASCIZ/B/]
	>
>

TYPMES:	0
	DUMENT


;THIS TABLE CONTAINS THE ADDRESSES OF THE BIT CHECK ROUTINES FOR EACH OF THE
; ENTRIES PROCESSED BY THIS SEGMENT  (TABLE IS INDEXED BY ERRIND)

DEFINE	TBLENT(A,B,C,D,E)<
	IFIDN<D><PROCSD><
		IFDIF<B><UNKNOWN TYPE>,<XWD 0,BCK'A>
		IFIDN<B><UNKNOWN TYPE>,<XWD 0,[POPJ P,0]>
	>
>

BITCHK:	0
	DUMENT


;THIS TABLE CONTAINS THE ENRTY LENGTHS FOR EACH OF THE ENTRIES PROCESSED
; BY THIS SEGMENT  (TABLE IS INDEXED BY ERRIND)

DEFINE	TBLENT(A,B,C,D,E)<
	IFIDN<D><PROCSD><
		XWD	0,E
	>
>

	RADIX	10

LINE:	0
	DUMENT

	RADIX	8
	SUBTTL	CONTROL TABLES

;GENERATE THE VARIOUS ENTRY CONTROL TABLES USING THE MACRO TBLWRD FOR DETAIL
; AND THE MACRO CMDWRD FOR BRIEF

DEFINE	TBLWRD(A,B,C,D,E,F)<
	IFDIF<D><SPECL>,<BYTE (6)B,C,D(18)T'A'E>
	IFIDN<D><SPECL>,<BYTE (6)B,C,D(18)F>
>

.BR101:	BRF101
.CT101:	DUM101
	Z
.BR102:	BRF102
.CT102:	DUM102
	Z
.BR111:	BRF111
.CT111:	DUM111
	Z
.BR112:	BRF112
.CT112:	DUM112
	Z
.BR115:	BRF115
.CT115:	DUM115
	Z
.BR116:	BRF116
.CT116:	DUM116
	Z
.BR130:	BRF130
.CT130:	DUM130
	Z
.BR131:	BRF131
.CT131:	DUM131
	Z
.BR133:	BRF133
.CT133:	DUM133
	Z
.BR160:	BRF160
.CT160:	DUM160
	Z
.BR161:	BRF161
.CT161:	DUM161
	Z
.BR162:	BRF162
.CT162:	DUM162
	Z
.BR163:	BRF163
.CT163:	DUM163
	Z
.BR164:	BRF164
.CT164:	DUM164
	Z
	SUBTTL	MORE MACRO EXPANSIONS

;GENERATE THE NECESSARY ASCIZ TEXT FOR NON-SPECIAL ROUTINES

DEFINE	TBLWRD(A,B,C,D,E,F)<
	IFDIF	<D><SPECL>,<
		T'A'E:	ASCIZ/
F/	>
>
	;WHAT IS XLISTED IS THE DUMALL CALL AND FOLOWING CODE.
	XLIST
	DUMALL
	LIST

COMMENT \ I THINK THIS STUFF CAN BE REMOVED TOO  [PJB]

	;SWITCH TABLES
	;THE FOLLOWING TABLES WILL BE GENERATED VIA THE DUMMY MACRO
	;DUMCH1
	;THE FIRST IS A DISPATCH TABLE TO BYTES REPRESENTING BITS TO SET
	;IN THE ENTCHR TABLE
	;NEXT IS THE ACTUAL BYTES THEMSELVES

	;TABLE FOR DISPATCH TO THE BYTE OPERANDS

	DEFINE	TBLCH1(A,B,C,D,E,F,G)<
	XWD	0,BYT'G
>

	;MAKE DISPATCH TABLE

BYTDSP:	DUMCH1
	;NOW THE BYTES THEMSELVES


DEFINE	TBLCH1(A,B,C,D,E,F,G)<
	BYT'G:	BYTE (6) B,77,C,77,D,77,E,77,F,77
>

	DUMCH1



	;SWITCH MACRO EXPANSION NEXT


	;DEFINE THE SWITCHES WE RECOGNIZE

	DEFINE	TBLCH1(A,B,C,D,E,F,G)<
	SS	(A,A,0)
>
	DEFINE	TBLCH2(A,B,C)<
	SP	(A,A,B,C)
>

	;CALL A MACRO TO SETUP DEFAULTS

	DEFVAL

	;NOW MAKE SWTCHS MACRO FOR USE WITH DOSCAN LATER

DEFINE	SWTCHS<
	DUMCH1
	DUMCH2
>

;DOSCAN(SWTAB) EXPANSION IS XLISTED
	XLIST
	DOSCAN(SWTAB)
	LIST
\
	;GENERATE THE CONI BIT TEXT AND ADDRESS DISPATCHER
	RADIX	10		;****** NOTE WELL *****
	SALL

	DEFINE	TBLDEV(A,B)<
	[ASCIZ\B',\]
>

SOFTDV:	DUMSF1
TM10DV:	DUMTM1
RH10DV:	DUMRH1
RH20DV:	DUMRH2
DX10DV:	DUMDX1
TC10DV:	DUMTC1
DL10DV:	DUMDL1
DL11DV:	DUMDL2
KL1ADV:	DUMKLA
RH11DV:	DUMR11
UBADV:	DUMUBA
KS1ADV:	DUMKSA
	;16
	;17
RP04SR:	DURP01
RP04ER:	DURP02
RP04CB:	DURP10
RP04DA:	DURP15
RS04SR:	DURS01
RS04ER:	DURS02
TU16SR:	DUT601
TU16ER:	DUT602
ICPCX1:	DUICPC
DXTAGB:	DUDXTB
DXSB03:	DUSB03
DXSB47:	DUSB47
RP05DV:	DURP05
RP06DV:	DURP06
FESTDV:	DUFEST
SCRDV:	DUMSCR
NRCDV:	DUMNRC
FELPDV:	DUFELP
LPSADV:	DULPSA
LPSBDV:	DULPSB
FECDDV:	DUFECD
CDSTDV:	DUCDST
RHSWDV:	DURHSW
RLD1DV:	DURLD1
FEKLDV:	DUFEKL
RPMRDV:	DURPMR
DXSRDV:	DUDXSR
DXERDV:	DUDXER
DXMRDV:	DUDXMR
CS2DV:	DUMCS2
RM3MR1:	DURMR1
RM3MR2:	DURMR2
RM3ER2:	DURER2
	;57
	;60

SB81DV:	DUSB81
	;NOW GENERATE THE ERROR BIT VS INDEX BIT TABLES
	;USING THE TBLDEV MACRO

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RHINDX+A-MINRHB
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RHINDX:	BLOCK	MAXRHB-MINRHB+1		;[1224]
	ZZ==0
	DUMRH1

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RH20DX+A-MINRH2
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RH20DX:	BLOCK	MAXRH2-MINRH2+1		;[1224]
	ZZ==0
	DUMRH2

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	KLAIND+A-MINKLA
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
KLAIND:	BLOCK	MAXKLA-MINKLA+1		;[1224]
	ZZ==0
	DUMKLA

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RH11DX+A-MINR11
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RH11DX:	BLOCK	MAXR11-MINR11+1		;[1224]
	ZZ==0
	DUMR11

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	UBADX+A-MINUBA
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
UBADX:	BLOCK	MAXUBA-MINUBA+1		;[1224]
	ZZ==0
	DUMUBA

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	KSAIND+A-MINKSA
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
KSAIND:	BLOCK	MAXKSA-MINKSA+1		;[1224]
	ZZ==0
	DUMKSA

	;16
	;17
	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RP01DX+A-MIRP01
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RP01DX:	BLOCK	MARP01-MIRP01+1		;[1224]
	ZZ==0
	DURP01

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RP02DX+A-MIRP02
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RP02DX:	BLOCK	MARP02-MIRP02+1		;[1224]
	ZZ==0
	DURP02

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RP10DX+A-MIRP10
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RP10DX:	BLOCK	MARP10-MIRP10+1		;[1224]
	ZZ==0
	DURP10

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RP15DX+A-MIRP15
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RP15DX:	BLOCK	MARP15-MIRP15+1		;[1224]
	ZZ==0
	DURP15

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RS01DX+A-MIRS01
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RS01DX:	BLOCK	MARS01-MIRS01+1		;[1224]
	ZZ==0
	DURS01

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RS02DX+A-MIRS02
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RS02DX:	BLOCK	MARS02-MIRS02+1		;[1224]
	ZZ==0
	DURS02

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	T601DX+A-MIT601
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
T601DX:	BLOCK	MAT601-MIT601+1		;[1224]
	ZZ==0
	DUT601

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	T602DX+A-MIT602
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
T602DX:	BLOCK	MAT602-MIT602+1		;[1224]
	ZZ==0
	DUT602

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	SB03DX+A-MISB03
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
SB03DX:	BLOCK	MASB03-MISB03+1		;[1224]
	ZZ==0
	DUSB03

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	SB47DX+A-MISB47
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
SB47DX:	BLOCK	MASB47-MISB47+1		;[1224]
	ZZ==0
	DUSB47

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RP05DX+A-MIRP05
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RP05DX:	BLOCK	MARP05-MIRP05+1		;[1224]
	ZZ==0
	DURP05

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RP06DX+A-MIRP06
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RP06DX:	BLOCK	MARP06-MIRP06+1		;[1224]
	ZZ==0
	DURP06

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	FESTDX+A-MIFEST
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
FESTDX:	BLOCK	MAFEST-MIFEST+1		;[1224]
	ZZ==0
	DUFEST

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	FELPDX+A-MIFELP
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
FELPDX:	BLOCK	MAFELP-MIFELP+1		;[1224]
	ZZ==0
	DUFELP

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	SCRIND+A-MINSCR
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
SCRIND:	BLOCK	MAXSCR-MINSCR+1		;[1224]
	ZZ==0
	DUMSCR

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	NRCIND+A-MINNRC
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
NRCIND:	BLOCK	MAXNRC-MINNRC+1		;[1224]
	ZZ==0
	DUMNRC

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	LPSADX+A-MILPSA
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
LPSADX:	BLOCK	MALPSA-MILPSA+1		;[1224]
	ZZ==0
	DULPSA

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	LPSBDX+A-MILPSB
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
LPSBDX:	BLOCK	MALPSB-MILPSB+1		;[1224]
	ZZ==0
	DULPSB

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	FECDDX+A-MIFECD
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
FECDDX:	BLOCK	MAFECD-MIFECD+1		;[1224]
	ZZ==0
	DUFECD

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	CDSTDX+A-MICDST
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
CDSTDX:	BLOCK	MACDST-MICDST+1		;[1224]
	ZZ==0
	DUCDST

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RHSWDX+A-MIRHSW
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RHSWDX:	BLOCK	MARHSW-MIRHSW+1		;[1224]
	ZZ==0
	DURHSW

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	RLD1DX+A-MIRLD1
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
RLD1DX:	BLOCK	MARLD1-MIRLD1+1		;[1224]
	ZZ==0
	DURLD1

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	FEKLDX+A-MIFEKL
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
FEKLDX:	BLOCK	MAFEKL-MIFEKL+1		;[1224]
	ZZ==0
	DUFEKL

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RPMRDX+A-MIRPMR
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RPMRDX:	BLOCK	MARPMR-MIRPMR+1		;[1224]
	ZZ==0
	DURPMR

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	DXSRDX+A-MIDXSR
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
	>
DXSRDX:	BLOCK	MADXSR-MIDXSR+1		;[1224]
	ZZ==0
	DUDXSR

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	DXERDX+A-MIDXER
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
DXERDX:	BLOCK	MADXER-MIDXER+1		;[1224]
	ZZ==0
	DUDXER

	DEFINE	TBLDEV(A,B)<
	ZZP==.
	RELOC	DXMRDX+A-MIDXMR
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
DXMRDX:	BLOCK	MADXMR-MIDXMR+1		;[1224]
	ZZ==0
	DUDXMR

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	CS2DX+A-MINCS2
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
CS2DX:	BLOCK	MAXCS2-MINCS2+1		;[1224]
	ZZ==0
	DUMCS2

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RMR1DX+A-MINMR1
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RMR1DX:	BLOCK	MAXMR1-MINMR1+1		;[1224]
	ZZ==0
	DURMR1

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RMR2DX+A-MINMR2
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RMR2DX:	BLOCK	MAXMR2-MINMR2+1		;[1224]
	ZZ==0
	DURMR2

	DEFINE TBLDEV(A,B)<
	ZZP==.
	RELOC	RME2DX+A-MINER2
	ZZ
	ZZ==ZZ+1
	RELOC	ZZP
>
RME2DX:	BLOCK	MAXER2-MINER2+1		;[1224]
	ZZ==0
	DURER2

	;57
	;60

	RADIX	8		;	***** DONE WITH RADIX 10 *****

;NAMTB2, MASNA2, DEVDS2, SOFDS2, & MASDS2 TABLES REMOVED WITH EDIT  [1217]

	END	STARTD