Google
 

Trailing-Edge - PDP-10 Archives - bb-bt99l-bb - comdev.x18
There is 1 other file named comdev.x18 in the archive. Click here to see a list.
TITLE COMDEV -  MONITOR DEVICE DEPENDENT CODE, SYMBOLS, AND DATA - V1424
SUBTTL PART 6 COMDEV.MAC - T. HASTINGS/PH/TWE/DAL/JBS/EGF	8 JULY 86
	SEARCH	F,S
IFN FTNET,<
	SEARCH	NETPRM
>;END OF FTNET
IFN M.KL10,<
	SEARCH	DTEPRM
>;END IFN M.KL10
	$RELOC
	$LOW



;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
.CPYRT<1973,1986>
;COPYRIGHT (C) 1973,1974,1975,1976,1977,1978,1979,1980,1982,1984,1986
;BY DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
;ALL RIGHTS RESERVED.


;
XP VCOMDV,1424
				;PUT VERSION NUMBER IN GLOB AND LOADER STORAGE MAP


;SEE DATMAN FOR A LISTING OF S.MAC AND F.MAC

	SUBTTL	TABLE OF CONTENTS

;               TABLE OF CONTENTS FOR COMDEV
;
;
;                        SECTION                                   PAGE
;    1. TABLE OF CONTENTS.........................................   2
;    2. CONVERT MONGEN SYMBOLS....................................   5
;    3. DEFAULT SYMBOLS...........................................   9
;    4. COMPUTE SPECIAL SYMBOLS...................................  11
;    5. TERMINAL DATA BASE........................................  12
;    6. TERMINAL DATA BASE
;         6.1   TERMINAL CHARACTERISTICS DEFINITION...............  24
;         6.2   POINTERS FOR CURSOR SEQUENCES.....................  25
;         6.3   CURSOR CONTROL SEQUENCES..........................  26
;    7. DTESER DATA BASE GENERATION...............................  27
;    8. NETWORK SYMBOLS FOR NON-NETWORK SYSTEMS...................  28
;    9. MAGTAPE DATA BASE FOR TAPSER..............................  31
;   10. DECTAPE DATA BASE FOR DTASER..............................  39
;   11. INTERRUPT HEAD FOR DT'X...................................  40
;   12. MACRO TO GENERATE UNIT RECORD EQUIPMENT DDBS..............  46
;   13. CARD READER DDB DEFINITIONS...............................  47
;   14. CARD READER TRANSLATION TABLES............................  50
;   15. CARD PUNCH DDB DEFINITIONS................................  52
;   16. DK10 BITS AND DDB DEFINITIONS.............................  54
;   17. DEFINITIONS FOR DISPLAY AND LIGHT PEN.....................  57
;   18. LINE PRINTER DDB DEFINITIONS..............................  59
;   19. PLOTTER DDB DEFINITIONS...................................  65
;   20. DEFINITIONS FOR PAPER TAPE AND PTY'S......................  66
;   21. PAPER TAPE READER DDB DEFINITIONS.........................  66
;   22. PAPER TAPE PUNCH DDB DEFINITIONS..........................  66
;   23. ROUTINES COMMON TO PDP11 COMM FRONT-END'S ON DL10'S.......  69
;   24. LOCATE & WHERE COMMAND/UUOS...............................  76
REPEAT 0, <
;THE COMDEV SUBPROGRAM CONSISTS OF 6 FILES ASSEMBLED TOGETHER AS ONE SUBPROGRAM
	1. F.MAC -- FEATURE TESTS (OUTPUT OF## MONGEN).
	2. S.MAC - THE USUAL SYSTEM SYMBOL DEFINITIONS## ASSEMBLED WITH
	EVERY	MONITOR SUBPROGRAM
	3. HDWCNF.MAC -- HARDWARE CONFIGURATION
	4. TTYCNF.MAC -- TERMINAL CONFIGURATION
	5. REMCNF.MAC -- REMOTE CONFIGURATION
	6. COMMON.MAC - THE REST Of THIS PROGRAM WHICH IS THE SAME SOURCE FOR
	ALL	CONFIGURATIONS.  HOWEVER, THE ASSEMBLIES ARE CONDITIONED BY
	SYMBOLS	AND MACROS DEFINED IN 2.

	THE	FOLLOWING SYMBOLS AND TABLES ARE GENERATED BELOW:

	A. CONVERSION SYMBOLS FROM NEW MONGEN(M.XXXX) To OLD SYMBOLS(XXXXX.N)
	B. TTY AND REMOTE CONVERSION SYMBOLS
	C. MONGEN DEFAULT SYMBOLS
	D. TTY DATA BASE
	E. REMOTE STATION DATA BASE
	F. ALL OTHER DEVICe SPECIFIC CODE AND DATA BASES:	   (ONLY CODE WHICH CHANGES DEPENDING ON THE CONFIGURATION
	   SHOULD BE IN COMDEV). THE LIBARARY SEARCH FEATURE
	   DETERMINES WHETHER THE CONFIGURATION INDEPENDENT CODE
	   FOR A PARTICULAR DEVICe IS LOADED OR NOT).
	   SHOULD BE HERE.
	   THE ONLY DEVICe SPECIFIC STUFF IN COMMON IS THE
	   SYMBOL DEFINITIONs WHICH INCLUDE THE PI ASSIGNMENT VALUE.



LEVEL D DISK SERVICE PARAMETERS:

	ALL	SYMBOLS AND LOCATIONS ARE IN A SEPARATE FILE CALLED
	COMMOD.MAC WHICH IS ALSO ASSEMBLED WITH S AND CONFIg (BUT NOT WITH FEATURS FILES).
	THE	SEPARATE FILE IS FOR TWO REASONS:
	1.  ANTICIPATING MULTIPROCESSING SYSTEMS WHICH SHARE DISKS AND 1 16K MEMORY
	(THE DATA MUST BE IN THE COMMON MEMORY)
	2.  ELIMINATE THE NEED To ASSEMBLE COMMOD IF NOT A DISK SYSTEM
	(COMMOD.MAC TAKES LOTS Of CORE FOR ITS COMPLICATED MACROS)


		COMMUNICATIONS SOFTWARE
>

IFN FTKL10,<
;NOTE:
; IF ANY CHANGES ARE MADE TO DTEPRM THAT DTESER MUST HAVE, UPDATE
; THE FOLLOWING SYMBOL TO THE VERSION OF DTEPRM THAT MUST BE USED
	PRMMIN==16
; THIS WAY, ASSEMBLING THIS MODULE WITH WRONG VERSION OF DTEPRM FOR SOME REASON
; (LIKE FORGETTING TO ASSEMBLE IT) WILL CAUSE ASSEMBLY TO TERMINATE
; THIS SCHEME DOES NOT CAUSE EXTRA EDITING, SINCE ONLY FILES
; WHICH NEED THE CHANGES NEED PRMMIN TO BE UPDATED. MODULES
; THAT DO NOT NEED A NEW VERSION OF DTEPRM NEED NOT DEMAND IT.

IFL VDTPRM-PRMMIN,<PRINTX ?PLEASE USE LATEST VERSION OF DTEPRM
			PASS2
			END>>
SUBTTL CONVERT MONGEN SYMBOLS
REPEAT 0,<

;THIS SECTION CONVERTS NEW MONGEN SYMBOLS TO OLD MONGEN SYMBOLS
;SO THAT THE REST OF COMMON AND MONITOR CAN STILL USE THE OLD
;SYMBOLS.  THIS WAS DONE RATHER THAN CONVERTING ALL OF THE
;MONITOR TO NEW SYMBOLS FOR TWO REASONS:
; 1.  IT IS EASIER AND FASTER AND LESS LIKELY TO INTRODUCE BUGS, AND
; 2.  IT ALLOWS CUSTOMERS TO USE OLD MONGEN WITH A MINIMUM
;OF TROUBLE: ONLY A FEW EXTRA SYMBOLS MUST BE DEFINED.
;THE MONITOR WILL PROBABLY BE CONVERTED TO THE NEW MONGEN SYMBOLS
;AFTER THE 5.04 RELEASE.  THE ORDER HERE PARALLELS THE OLD
;MONGEN ORDER.

>
XP SYS40N,0		;NEW MONGEN MAKES SWAPPING SYSTEMS ONLY
XP SYS50N,1
XP DSKN,1
XP LOGINN,1

XP APRSN,M.C0SN		;APR SERIAL NUMBER (REALLY PROCESSOR 0)
XP APR0SN,M.C0SN	;PROCESSOR 0 SERIAL NUMBER
XP APR1SN,M.C1SN	;PROCESSOR 1 SERIAL NUMBER
XP CP0P6N,0		;PROCESSOR 0 IS NOT A PDP 6
XP CP1P6N,0		;PROCESSOR 1 IS NOT A PDP 6
XP CP0KIN,M.KI10	;PROCESSOR 0 MAY BE A KI10
XP CP1KIN,M.KI10	;PROCESSOR 1 MAY BE A KI10
XP CPUN,M.CPU		;NUMBER OF PROCESSORS

XP LEVDN,1		;NEW MONGEN MAKES ONLY LEVEL D DISK SERVICE
XP LEVCN,0
XP CHNN,M.CHN		;NUMBER OF DATA CHANNELS FOR DISKS

XP RD10N,M.RC10
XP RP10N,M.RP10
XP RH10NS,M.RH1S
XP RH10NP,M.RHP4
XP RN10N,M.RP20
XP RA10N,0		;NO MDF

	DEFINE	SYSDEV,<
	SIXBIT	/DSK/
>
XP JOBN,M.JOB+1
XP PDP10N,M.KI10!M.KL10N!M.KS10
XP KT10AN,MD.2RR
XP SEGN,MD.SEG
IFG KT10AN,<XP SEGN,SEGN+JOBN>	;NO. OF SEGS=NO. OF JOBS+NO. HISEGS
XP DDTN,MD.DDT

XP EDITN,0

XP PTRN,M.PTR
XP PTPN,M.PTP
XP PLTN,M.PLT
XP LPTN,M.LPT
IFNDEF M.DLP,<M.DLP==:0>
IFNDEF M.DCR,<M.DCR==:0>
XP DLPTN,M.DLP
XP DCDRN,M.DCR
XP MOVIEN,MD.MOV
XP CDRN,M.CDR
XP CR10N,MD.C10
XP CDPN,M.CDP
IFN	FTXTC,<
IFE	M.XTC,<
XP M.XTL,0>
XP XTCN,M.XTC
>
IFE	FTXTC,<
IFN	M.XTC,<
PRINTX	?NO DA28 SUPPORT WITH FTXTC=0
PRINTX	?PROCEEDING ASSUMING NO DA28
XP M.XTC,0
>
XP M.XTL,0
XP XTCN,0
>

XP DISN,M.DIS
XP PENN,M.DIS
XP T340N,M.340
XP TVP10N,M.VP10
XP T30N,0		;NO TYPE 30
XP VBCN,M.VBXC
DEFINE TDMAC(X),<
	XP	DT'X'N,M.DT'X
M.DTXN==M.DTXN+M.DT'X
>
ZZ=="A"
M.DTXN==0
REPEAT M.TD10,<
	TDMAC(\"ZZ)
ZZ==ZZ+1
>

IFN FTKS10,<
    DEFINE RX2MAC(X),<
	XP	RX'X'N,M.RX'X
    M.RXXN==M.RXXN+M.RX'X
    >
    ZZ=="A"
    M.RXXN==0
    REPEAT M.RX20,<
	RX2MAC(\"ZZ)
    ZZ==ZZ+1
    >
>;End FTKS10
IFNDEF M.TM10,<XP M.TM10,0>
IFNDEF M.TC10,<XP M.TC10,0>
IFNDEF M.TX01,<XP M.TX01,0>
IFNDEF M.DX20,<XP M.DX20,0>
XP TAPN,M.TM10+M.TC10+M.TX01+M.TM02+M.DX20+M.TM78

XP PTYN,M.PTY

XP SYSCN,M.SYSC
XP LOKN,M.LOK
XP CMNN,M.MGC
XP RTTRPN,M.RTD
XP HPQN,M.HPQ

IFNDEF M.HRSN,<XP M.HRSN,77>
IFNDEF M.LATN,<XP M.LATN,0>
IFNDEF TTXTRA,<XP TTXTRA,0>
IF2,<
IFN M.KL10,<
	DEFINE	TTXTRD(N),<TTXTRA==TTXTRA+M'N'DTEN>
	ZZ==0
	REPEAT	CPUN,<
	TTXTRD(\ZZ)
	ZZ==ZZ+1>
>>				;DEFINE ENOUGH SLAVE DDBS FOR ALL DTES
XP	TTD28N,M.XTL
IFG M.XTL,<XP M.TLTL,M.TLTL+M.XTL>
IFNDEF M.TTDN,<M.TTDN==:0>
XP	M.TLTL,M.TLTL+M.TTDN	;REDEFINE FOR ANY RSX-20F LINES
IFN M.KS10,<
XP	KLILIN,M.TLTL+M.RMCR	;LINE NO. FOR KS10 KLINIK
XP	M.TLTL,M.TLTL+1		;ADD ONE FOR KLINIK
>
XP	CTYLIN,M.TLTL+M.RMCR+M.CPU
XP	FRCLIN,CTYLIN-M.CPU
	DEFINE	OPRL(LINE),<
IFIDN <LINE> <CTY>,<SIXBIT /CTY/>
IFDIF <LINE> <CTY>,<SIXBIT /TTY'LINE/>
>

DEFINE	DSASOC,<
	XLIST

	DEFINE	L(M,N,P),<
IFIDN <M> <CTY>,<
	ZZBEG==CTYLIN
	ZZDATA==CTYLIN
>
IFDIF <M> <CTY>,<
	ZZBEG==M
	ZZDATA==M
>
IFB <P>,<
	ZZEND==ZZBEG
	ZZLINE==N
>
IFNB <P>,<
	ZZEND==N
	ZZLINE==P
>

REPEAT ZZEND-ZZBEG+1,<
	GENLIN	(\ZZDATA,ZZLINE)
ZZDATA==ZZDATA+1
ZZLINE==ZZLINE+1
>>	;END REPEAT AND DEFINITION OF L

	LIST
>	;END DEFINITION OF DSASOC
SUBTTL DEFAULT SYMBOLS
;THE FOLLOWING STANDARD SYMBOLS CAN BE SUPERSEDED BY A CUSTOMER HAVING
; PREVIOUSLY DEFINED THEM ON THE HDWGEN.MAC FILE USING THE MONGEN PROGRAM....
;**********************************************************************
;ADD NEW SYMBOLS AT END SO EASY TO UPDATE MONGEN APPENDIX	      *
;**********************************************************************
IFNDEF XPANDN,<XP XPANDN,0>	;FORCE NO EXPANSION OF MACROS
				; UNLESS XPANDN IS DEFINED NON-ZERO WITH MONGEN


				;SIZE OF MAGTAPE RECORDS (DATA WORDS IN BUFFER)
IFNDEF MTSIZ, <XP MTSIZ,^D128>	;STANDARD == 128 WORDS PER BUFFER

				;SIZE OF LPT BUFFER (NUMBER OF DATA WORDS+2)
IFNDEF LPTSIZ, <XP LPTSIZ,^D27+2> ;STANDARD == 27 WORDS PER LPT BUFFER (132 COL. PRINTER)

IFNDEF	FLCDEF,<XP FLCDEF,1>	;FILLER CLASS CODE TO USE IF NOT SPECIFIED
				;FOR A TTY LINE
IFNDEF TTYALT,<XP TTYALT,0>	;DEFAULT SETTING OF TTY ALTMODE
				; IS NO CONVERSION OF ASCII CODES 175 AND 176 TO 33
IFNDEF TTYWID,<XP TTYWID,^D72>	;DEFAULT SETTING OF TTY WIDTH IS 72.
IFNDEF TTYRMT,<XP TTYRMT,1>	;DEFAULT SETTING OF TTY REMOTE IS ON
IFNDEF TTYLCT,<XP TTYLCT,1>	;DEFAULT SETTING OF TTY LC IS OFF
IFNDEF CTYLCT,<XP CTYLCT,TTYLCT> ;MATCH DEFAULT SETTING OF CTY LC WITH TTY LC
IFNDEF PTYRMT,<XP PTYRMT,0>	;PTYS ARE NORMALLY LOCAL
IFNDEF PTYLCT,<XP PTYLCT,0>	;PTYS NORMALLY DON'T SET BITS
XP CTYLTB,<FLCDEF*TTVFLC+CTYLCT*TTVLCT+0*TTVRMT>	;CTY 'LINTAB' BITS
XP TTYLTB,<FLCDEF*TTVFLC+TTYLCT*TTVLCT+TTYRMT*TTVRMT>	;TTY 'LINTAB' BITS
XP PTYLTB,<0*TTVFLC+PTYLCT*TTVLCT+PTYRMT*TTVRMT>	;PTY 'LINTAB' BITS

;PARAMETERS THAT CONTROL THE AUTO-DISCONNECT FEATURE.

ND	IDLSEC,^D90		;ANY TERMINAL IDLE THIS LONG GETS DISCONNECTED
ND	M.AIDL,IDLSEC		;ANF-10 DEFAULT IDLE TIME
ND	M.NIDL,IDLSEC		;NRT/CTERM DEFAULT IDLE TIME
ND	M.DIDL,IDLSEC		;DATASET MAXIMUM IDLE TIME
ND	M.LIDL,IDLSEC		;LAT TERMINAL IDLE-MAX

;NOTE--IN ORDER TO RESERVE PI-CHANNELS FOR
;NON-STANDARD USAGE, FOR EACH CHANNEL (SAY N)
;DEFINE SYMBOL UNIQN==1 VIA MONGEN.  FOR
;EXAMPLE, TO RESERVE CHANNEL 4, DEFINE
;UNIQ4==1.

;IF IT IS DESIRED TO LEAVE A CHANNEL FREE FOR RTTRP JOB TO USE
;THEN THE APPROPRIATE SYMBOL "RTCH'N" SHOULD BE DEFINED AS 1.
;FOR EXAMPLE:
;IF CHANNEL 2 IS TO FREE FOR RTTRP USE THE DEFINE RTCH2==1 IN MONGEN

IFNDEF MTELOG,<XP MTELOG,-1>	;ZERO TO LOG ALL RECOVERED ERRORS
				;NON-ZERO TO LOG ERRORS THAT REQ'D MORE THAN ONE RETRY
IFNDEF MTDAEM,<XP MTDAEM,10>	;NUMBER OF TIMES PER REEL TO CALL DAEMON
				; FOR MAGTAPE ERROR REPORTS.
IFN FTTLAB,<
IFNDEF MTDLTP,<XP MTDLTP,LT.BLP>	;DEFAULT LABEL TYPE
>
IFN FTKL10,<

DEFINE DTEDEF(X,Y)<
  IFE <Y-1>,<M.AT'X'Y==M'X'TTDN> ;ASYNCHRONOUS TERMINALS ON -20F FRONT END
  IFN <Y-1>,<M.AT'X'Y==0>
	NDL	M.FD'X'Y,2	;NUMBER OF FRONT END DEVICES ON FRONT END
				; ONE FOR FILE XFER, ONE FOR DDT11
>
ZZ==0
REPEAT M.CPU,<
ZZZ==1
REPEAT 4,<
	DTEDEF	(\ZZ,\ZZZ)
ZZZ==ZZZ+1
>
ZZ==ZZ+1
>

>	;END FTKL10
;ADD NEW MONGEN SYMBOLS HERE
SUBTTL COMPUTE SPECIAL SYMBOLS

;PERFORM TRANSLATION FROM HARDWARE TO SOFTWARE DESIGNATION
; FOR ALL DISK SYMBOLS

IFN DSKN,<
	FHDN==RD10N
	DPCN==RP10N
	MDFN==RA10N
	FSDN==RH10NS
	RPXN==RH10NP
	RNXN==RN10N
>
IFE DSKN, <
	FHDN==0
	DPCN==0
	MDFN==0
	FSDN==0
	RPXN==0
	RNXN==0
>

IFN LEVDN,<
ALLDSK=FHDN+DPCN+MDFN+FSDN+RPXN+RNXN	;ALLDSK = THE TOTAL # OF DSK KONTROLLERS IN THE SYSTEM
				; IF YOU ADD ANOTHER KONTROLLER TYPE YOU MUST
				; INCLUDE THE # OF KONTROLLERS OF THAT TYPE HERE
>

;DEFINE THE PARAMETERS WHICH CONTROL THE TYPE OF SYSTEM

XP FTDISK,-DSKN			;10/40D OR 10/50S
XP FTSWAP,-SYS50N		;10/50S
XP FTLOGIN,-DSKN		;PUT FTLOGIN IN SO LOADER WILL COMPLAIN
				; IF DIFFERENT IN OTHER FILES
SUBTTL TERMINAL DATA BASE
;THE FOLLOWING SECTION DESCRIBES THE TELETYPE LINES,GLOBALS, AND
;DATA STRUCTURES OF THE MONITOR.

;THE FOLLOWING ARE SUPPLIED BY MONGEN


;M.DC10	=NUMBER OF DC10'S
;M.DC68	=NUMBER OF DC68'S
;M.DC76 =NUMBER OF DC76'S

;M.D7KN =NUMBER OF LINES ON DC76 K
;M.68LK	=NUMBER OF LINES ON DC68 K
;M.TTGK	=NUMBER OF LINES ON DC10 K
;M.DSGK	=NUMBER OF DC10E'S ON DC10 K
;M.TLTL	=TOTAL LOCAL TTY LINES

IFDEF	M.LCST,<	;#WORDS FOR CUSTOMERS IN LDB
IFG	M.LCST,<
  LDBCST==:LDBLEN##-M.LCST	;DEFINE START OF CUSTOMER AREA
>
>
IFNDEF	M.LCST,<
  M.LCST==:0
>
;DEFINE SYMBOLS FOR CPUS OTHER THAN 0 UNTIL WE GET MONGEN WORKING

DEFINE CXDEF(SYM)<
IRP SYM,<
IFNDEF M0'SYM,<M0'SYM==M.'SYM>
IFNDEF M1'SYM,<M1'SYM==0>
IFNDEF M2'SYM,<M2'SYM==0>
IFNDEF M3'SYM,<M3'SYM==0>
IFNDEF M4'SYM,<M4'SYM==0>
IFNDEF M5'SYM,<M5'SYM==0>
>>

CXDEF(<TTG0,TTG1,68L0,68L1,D70N,D71N,D72N,D73N>)
CXDEF(<D74N,D75N,D76N,D77N,DZNL>)

;THE FOLLOWING MAY BE SUPPLIED FOR LINTAB, WHERE THE LINE NUMBER
; IS CONCATENATED ON THE END (0 IN THIS CASE):

;DSD0 MEANS LINE 0 IS A DATASET LINE
;TAB0 MEANS LINE 0 HAS HARDWARE TABS
;RMT0 MEANS LINE 0 IS A REMOTE LINE, BUT NOT A DATASET.
;HLF0 MEANS LINE 0 IS HALF-DUPLEX (XMTED CHARS WILL BE RCVD)


;ALSO A MACRO IS DEFINED FOR DC10E-CONTROLLED DATASETS, WHICH
;DEFINES THE CORRESPONDENCE BETWEEN THE DC10E CONTROL LINE NUMBER
;(WHICH CONTROLS THE DATASET ENABLES, RINGING, ETC) AND THE
;CORRESPONDING DC10B LINE NUMBER (I.E., TTYN AS THE SYSTEM SEES
;IT). FOR EXAMPLE, FOR A SYSTEM WITH TWO DATASETS CONTROLLED
;BY DC10E LINES 27 AND 26, AND WITH DATA ON TTY17 AND TTY16 RESPECTIVELY,
;	DEFINE DSASOC <
;		GENLIN 27,17
;		GENLIN 26,16
;	>

;THE FOLLOWING ARE USED IN THE PREDEFINED LINE TABLES

DEFINE LINMAC (BITS) <
IRP BITS,<
LINMC1 (BITS,\LIN)
>
		LIN==LIN+1
>
DEFINE LINMC1 (B,N) <
B'N==:1
>
;THE FOLLOWING GLOBALS ARE USED IN VARIOUS ROUTINES SUCH AS
;ONCE,SCNSER,DLSINT,BTHINT,ETC.


XP SCNN,JOBN+TTXTRA		;NUMBER OF TTY DDBS TO BE BUILT
XP HGHLIN,M.TLTL		;HIGHEST LINE ON SCANNERS, BEFORE TCONLN
XP TCONLN,CTYLIN		;LINE NUMBER FOR CTY (NOT ON SCANNER)

XP DL0MXD,<10*M.TTG0>-1		;HIGHEST DC10 LINE WHICH IS REAL DATA
XP DL0MXL,<10*M.DSG0>+DL0MXD	;HIGHEST LINE ON DC10 (MAY BE DC10E)
XP DL0OFS,0			;OFFSET FROM LINTAB TO HARDWARE
XP DL1MXD,<10*M.TTG1>-1		;NUMBER OF DATA LINES ON DC10 #1
XP DL1MXL,<10*M.DSG1>+DL1MXD	;HIGHEST LINE ON DC10 #1
XP DL1OFS,<10*M.TTG0>		;ADD TO GO FROM HARDWARE TO LINTAB
XP CC0OFS,DL1OFS+<M.TTG1*10>	;OFFSET TO GET TO CCI0
XP CC1OFS,CC0OFS+M.68L0		;OFFSET TO GET TO CCI1
XP D70OFS,CC1OFS+M.68L1		;OFFSET FOR FIRST DC76
XP D71OFS,D70OFS+M.D70N		;OFFSET FOR SECOND DC76
XP D72OFS,D71OFS+M.D71N		;OFFSET FOR THIRD DC76
XP D73OFS,D72OFS+M.D72N		;OFFSET FOR FOURTH DC76
XP D74OFS,D73OFS+M.D73N		;OFFSET FOR FIFTH DC76
XP D75OFS,D74OFS+M.D74N		;OFFSET FOR SIXTH DC76
XP D76OFS,D75OFS+M.D75N		;OFFSET FOR SEVENTH DC76
XP D77OFS,D76OFS+M.D76N		;OFFSET FOR EIGHT DC76
XP DZOFS,D77OFS+M.D77N		;OFFSET FOR DZ11 TTY'S
XP TTDLAL,DZOFS+M.DZNL		;OFFSET FOR ALL TTD (RSX-20F) LINES
XP NETOFS,TTDLAL+M.TTDN		;OFFSET TO NETWORK TTY'S
XP D28OFS,NETOFS+M.RMCR		;OFFSET FOR DA28 LINES
XP DSCOF0,DL0MXD+1		;NUMBER TO SUBTRACT FROM LINE # TO
				; GET DCSTAB INDEX FOR DC10#0
XP DSCOF1,DL1MXD+1-<DL0MXL-DL0MXD> ;DITTO FOR DC10 #1

IFG <PTYN-^D512>,<PRINTX ?512 OR MORE PTY'S EXCEEDS FIELD OF DDB>
XP TTPLEN,TCONLN+PTYN+1		;LENGTH OF TRANSLATOR TABLE
				;INCLUDES ALL SCNANNERS, CTY, AND PTY'S
IFG <TTPLEN-^D512>,<PRINTX ?MORE THAN 512. TTYS+PTYS EXCEEDS FIELD OF DDB>
XP PTYOFS,TCONLN+1		;OFFSET FOR PTY-DRIVEN TTY'S

XP MTTYLN,-TTPLEN
XP MLTTYL,-SCNN
IFN M.DZNL,<

	EXTERN	DZINT	;LOAD SERVICE ROUTINE

;TABLE OF OUTPUT CHARACTERS FOR EACH DZ11 LINE
DZCHTB::BLOCK	M.DZNL

;TABLE OF DATASET STATUS FOR EACH DZ11
DZDSTB::BLOCK	<<M.DZNL+7>/10>

;TABLE OF LINE STATUS FOR AUTOBAUD FRONT END

DZTTQN::EXP	0
DZMSTS::BLOCK	M.DZNL

DEFINE X (N) <
DZ'N'VA::EXP	0		;JSR HERE ON INTERRUPT
	EXP	0,IC.UOU,.+1

	EXCH	T1,DZ'N'VA	;GET PC WE CAME FROM
	MOVEM	T1,SCNCHL##	;SAVE IT FOR SCNSAV
	MOVE	T1,DZ'N'VA+1	;SECOND WORD
	MOVEM	T1,SCNCHL##+1

	MOVE	T1,DZ'N'VA	;RESTORE T1
	JSR	SCNSAV##	;SAVE REGISTERS
	MOVE	P1,[DZ11BA+<N*10>]
	JRST	DZVECA##
DZ'N'VB::EXP	0		;JSR HERE ON INTERRUPT
	EXP	0,IC.UOU,.+1

	EXCH	T1,DZ'N'VB	;GET PC WE CAME FROM
	MOVEM	T1,SCNCHL##	;SAVE IT FOR SCNSAV
	MOVE	T1,DZ'N'VB+1	;SECOND WORD
	MOVEM	T1,SCNCHL##+1

	MOVE	T1,DZ'N'VB	;RESTORE REGISTER
	JSR	SCNSAV##	;SAVE REGISTERS
	MOVE	P1,[DZ11BA+<N*10>]
	JRST	DZVECB##
>
	Z=0
	REPEAT <<M.DZNL+7>/10>,<
	X	\Z
	Z=Z+1
	>
>;IFN M.DZNL
;DEFINE ALL DL10 SYMBOLS

	DLX.CK(0)		;MACRO DEFINED IN S.MAC


IFN FTDAS78!DLX.78,<
IFE FTDAS78,<
	PRINTX	?DEFINING A DAS78 REQUIRES FTDAS78 TO BE ON
PDP11N==PDP11N-DLX.78
DLX.78=0			;ACTUAL NUMBER
>>	;END OF IFN FTDAS78!DLX.78


IFN FTDN60!DLX.60,<
IFE FTDN60,<
	PRINTX	?DEFINING A DN60 REQUIRES FTDN60 TO BE ON
PDP11N==PDP11N-DLX.60
DLX.60=0			;ACTUAL NUMBER
>>	;END OF IFN FTDN60!DLX.60
IFNDEF M.DN6S,<M.DN6S==0>
;SCANNER ENTRY POINTS AND BIT DEFINITIONS
	EXTERN	SCNSER



;TELETYPE LINE CHARACTERISTICS (FORMER LH OF LINTAB)
;USED BY SCNSER

XP TTVRMT,1			;REMOTE LINE
XP TTVHLF,2			;HALF DUPLEX LINE (DC10C OR TWX)
XP TTVINI,4			;RUN INITIAL CUSP
XP TTVDSD,10			;DATASET DATA LINE
XP TTVDIS,20			;2741 TERMINALS ON A DC-10 INTERFACE
XP TTVNFC,40			;NO FREE CRLF AT 72 COLUMNS
XP TTVFRM,100			;FORM FEED IN HARDWARE
XP TTVLCP,200			;LOCAL COPY, BUT NOT HALF DUPLEX
XP TTVTAB,400			;TAB HARDWARE (8 COLUMNS PER)
XP TTVLCT,1000			;LOWER CASE TRANSLATE TO UPPER
XP TTVSLV,2000			;SLAVE TTY
XP TTVFLC,4000			;TWO BITS OF FILLER CLASS CODE

	DEFINE	CALLM(NAME,LINE),<
	NDL NAME'LINE,1
>

	DEFINE	TTYMAC(TYPE),<
	XLIST

	DEFINE	L(A,B),<
IFB <B>,<IFE	<SIXBIT/A/>-<SIXBIT/CTY/>,<
			ZZBEG==FRCLIN+1
			ZZEND==TCONLN>
	IFN	<SIXBIT/A/>-<SIXBIT/CTY/>,<ZZBEG==<ZZEND==A>>
>
IFNB <B>,<
	ZZBEG==A
	ZZEND==B
>
ZZLINE==ZZBEG
IFGE ZZEND-FRCLIN,<ZZEND==FRCLIN-1>	;DON'T NEED TO INCLUDE PTYS
IFG ZZEND-ZZBEG+1,<
REPEAT ZZEND-ZZBEG+1,<
	CALLM	(TYPE,\ZZLINE)
ZZLINE==ZZLINE+1
>>>	;END IFG, REPEAT AND DEFINITION OF L
	MAC'TYPE
	LIST
>	;END DEFINITION OF TTYMAC
	.XCREF
	TTYMAC	DSD
	.CREF
;NOW DEFINE THE LINE TABLE FOR STORING LDB ADDRESSES.

$HIGH
LINTAB::
REPEAT TTPLEN,<
EXP	0
XLIST>
LIST
$LOW
;NOW THE DATASET CONTROLLER INFO FOR ANY DC10E'S


;CONSTRUCT THE DATASET CONTROLLER TABLE

DEFINE GENLIN(CON,DATA)<

ZZ==0
IFLE <CON-DL0MXD>,<ZZ==1>
IFG <CON-DL0MXL>,<ZZ==1>
IFG <DATA-DL0MXD>,<ZZ==1>		;CHECK RANGE OF ARGUMENT

IFN ZZ,<PRINTX ? SPECIFICATION ERROR - DSCTAB>
IFE ZZ,<
DSA'CON==1
DSB'CON==DATA
>
>

IFG M.DSG0,<
DSASOC
MACCR0			;INVOKE THE MACRO
>
DSCTAB::.INDEX==DL0MXD+1
DEFINE GENLIN(N)<
ZZ==0
IFDEF DSA'N,<IFN DSA'N,<ZZ==DL0OFS+DSB'N>>
	EXP	ZZ		;DATA SET N
.INDEX==.INDEX+1
>
REPEAT <DL0MXL-DL0MXD>,<GENLIN(\.INDEX)>

IFDEF	MACCR1,<	;ONLY IF 2 DC10'S

DEFINE GENLIN(CON,DATA)<

ZZ==0
IFLE <CON-DL1MXD>,<ZZ==1>
IFG <CON-DL1MXL>,<ZZ==1>
IFG <DATA-DL1MXD>,<ZZ==1>		;CHECK RANGE OF ARGUMENT

IFN ZZ,<PRINTX ? SPECIFICATION ERROR - DSCTAB>
IFE ZZ,<
DSA'CON==1
DSB'CON==DATA
>
>

DSASOC
MACCR1			;INVOKE THE MACRO
	.INDEX==DL1MXD+1
DEFINE GENLIN(N)<
ZZ==0
IFDEF DSA'N,<IFN DSA'N,<ZZ==DL1OFS+DSB'N>>
	EXP	ZZ		;DATA SET N
.INDEX==.INDEX+1
>
XALL
DSCTB1:REPEAT <DL1MXL-DL1MXD>,<GENLIN(\.INDEX)>
> ;END IFDEF MACCR1

ZZ==CC0OFS
	XP	DSCNDX,<.-DSCTAB>
	XP	CC0DSO,CC0OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
	XP	CC1DSO,CC1OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
	XP	D70DSO,D70OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
	XP	D71DSO,D71OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
	XP	D72DSO,D72OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
	XP	D73DSO,D73OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
	XP	D74DSO,D74OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
	XP	D75DSO,D75OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
	XP	D76DSO,D76OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
	XP	D77DSO,D77OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
	XP	DZDSO,DZOFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
	XP	TTDDAL,TTDLAL-<<M.TTG0+M.TTG1>*10>+DSCNDX
REPEAT M.68L0+M.68L1+M.D70N+M.D71N+M.D72N+M.D73N+M.D74N+M.D75N+M.D76N+M.D77N+M.DZNL+M.TTDN,<	EXP ZZ
ZZ==ZZ+1

>
	MDSLN==:DSCTAB-.

;DEFINE SOME CHUNK SIZE PARAMETERS AND MASKS

ND TTCHKS,8			;DEFAULT SIZE IN WORDS OF A TTY CHUNK
IFL TTCHKS-4,<TTCHKS==4>	;MUST BE AT LEAST 4
XP TTCHKS,<1B<^L<TTCHKS>>>	;WORDS IN A CHUNK (MUST BE POWER OF TWO)
XP CK.BDY,TTCHKS-1		;MASK FOR END OF CHUNK
XP CK.BTH,-CK.BDY		;OFFSET FOR START OF CHUNK
XP CK.CPC,CK.BDY*CK.CPW		;CHARACTERS PER CHUNK

;THE FOLLOWING SLIDING SCALE DEFINES THE LENGTH OF THE TTY FREE LIST

IFNDEF TTCHKN,<
IFNDEF TTCHKK,<
XP TTCHKK,<<TTYWID-1>/CK.CPC>+4	;ENSURE AT LEAST TTYWID CHARACTERS PER LDB
IFL TTPLEN-40,<XP TTCHKK,TTCHKK+1>	;MORE IF FEW LINES
IFL TTPLEN-20,<XP TTCHKK,TTCHKK+1>	;DITTO
IFL TTPLEN-10,<XP TTCHKK,TTCHKK+1>	;AND DITTO
> ;END OF IFNDEF TTCHKK

XP TTCHKN,TTCHKK*TTPLEN		;AT LAST, USE THIS CONSTANT TO GET TTCHKN

> ;END OF IFNDEF TTCHKN

TTCHKN==:TTCHKN			;MAKE SURE THIS SHOWS IN THE LISTING
TTCHKK==:TTCHKN/TTPLEN		;THIS ONE, TOO


;SCNSER'S INPUT WARNING/LIMIT LEVELS

IFNDEF TTYMIC,<XP TTYMIC,^D60>		;MAXIMUM INPUT CHARS/MESSAGE
					;*** SHOULD MATCH DN8X DNCNFG.P11 ***

IFNDEF TTIBRK,<XP TTIBRK,^D132>		;DEFAULT ASCII/IMAGE LINE "BREAK" LEVEL
IFNDEF TTIWRN,<XP TTIWRN,^D200>		;DEFAULT ASCII/IMAGE XOFF WARNING LEVEL
IFNDEF TTIMAX,<XP TTIMAX,TTIWRN+<5*TTYMIC>>  ;DEFAULT ASCII/IMAGE MAXIMUM LEVEL
IFNDEF TTPBRK,<XP TTPBRK,^D132>		;DEFAULT PIM MODE LINE "BREAK" LEVEL
IFNDEF TTPWRN,<XP TTPWRN,^D500>		;DEFAULT PIM MODE XOFF WARNING LEVEL
IFNDEF TTPMAX,<XP TTPMAX,TTPWRN+<5*TTYMIC>>  ;DEFAULT PIM MODE MAXIMUM LEVEL


IFG XTCN,<		;GENERATE TABLE FOR DA28 POOL
TTLTAB::BLOCK	TTD28N		;KON,,UNIT
XP MTTD28,-TTD28N		;MINUS # OF DA28 LINES
>
IFN M.LATN,<		;ONLY GENERATE IF WANT LATSER
;SOME SPACE FOR A SLOT ALLOCATION BIT TABLE FOR LAT TERMINALS
;NTTLAH==:M.LATT			;Number of LAT TTYs
NTTLAH==:M.RMCR			;Same as number of network TTYs for now
NSBWDS==:<NTTLAH+^D35>/^D36	;One bit for each slot we could have
NFRSBQ::	BLOCK	NSBWDS
MAXCIR==:M.LAMC			;Maximum number of circuits

> ;END IFN M.LATN
IFNDEF MDSLN,<MDSLN==:0>

;DEFINE A BIT TABLE SHOWING WHICH LINES WERE MONGEN'ED AS DATASETS
DSDTAB::
SALL
DEFINE GENLIN(N),<
.XCREF
IFDEF DSD'N,<IFN DSD'N,<DSDW==DSDW!ZZZ>>
.CREF
> ;END DEFINE GENLIN
	ZZ==0			;STARTING LINE NUMBER
REPEAT <M.TLTL+^D31>/^D32,<
ZZZ==1B0
DSDW==0
REPEAT ^D32,<
GENLIN(\ZZ)
ZZZ==ZZZ_-1
ZZ==ZZ+1
>
EXP DSDW
> ;END OF BUILDING DSDTAB
;SCNSER QUEUED PROTOCOL HEADERS
DEFINE QHED(N)<
IFN M'N'TTG0,<DL0TQ'N::EXP 0,0>
IFN M'N'TTG1,<DL1TQ'N::EXP 0,0>
IFN M'N'68L0,<CC0TQ'N::EXP 0,0>
IFN M'N'68L1,<CC1TQ'N::EXP 0,0>
IFN M'N'D70N,<D70TQ'N::EXP 0,0>
IFN M'N'D71N,<D71TQ'N::EXP 0,0>
IFN M'N'D72N,<D72TQ'N::EXP 0,0>
IFN M'N'D73N,<D73TQ'N::EXP 0,0>
IFN M'N'D74N,<D74TQ'N::EXP 0,0>
IFN M'N'D75N,<D75TQ'N::EXP 0,0>
IFN M'N'D76N,<D75TQ'N::EXP 0,0>
IFN M'N'D77N,<D77TQ'N::EXP 0,0>
IFN M'N'DZNL,<DZTQ'N::EXP 0,0>
>
IFN M.XTL,<XTTQUE::EXP 0,0>

ZZ=0
REPEAT CPUN,<
	QHED(\ZZ)
ZZ==ZZ+1
>

MCRRTQ::EXP 0,0			;NETWORK TERMINALS CAN RUN ON ANY CPU
				; HENCE THEY HAVE A QUEUE OF THEIR OWN.
VTMQUE::EXP 0,0			;SPECIAL QUEUE FOR NETWORK VIRTUAL TERMINALS
FRCQUE::EXP 0,0			;FORCE COMMAND LDB FAKE OUTPUT HEADER
;HERE ONCE A TICK TO START TERMINAL OUTPUT

DEFINE TTSTRT(FT,QH,RT),<
IFN FT,<
IFNB <QH>,<
	MOVEI	T1,QH
>
	PUSHJ	P,RT##
>>
DEFINE STRG(N),<

SC'N'TIC::SE1ENT
	TTSTRT(M'N'TTG0,DL0TQ'N,DL0STO)
	TTSTRT(M'N'TTG1,DL1TQ'N,DL1STO)
	TTSTRT(M'N'D70N,D70TQ'N,D76STO)
	TTSTRT(M'N'D71N,D71TQ'N,D76STO)
	TTSTRT(M'N'D72N,D72TQ'N,D76STO)
	TTSTRT(M'N'D73N,D73TQ'N,D76STO)
	TTSTRT(M'N'D74N,D74TQ'N,D76STO)
	TTSTRT(M'N'D75N,D75TQ'N,D76STO)
	TTSTRT(M'N'D76N,D76TQ'N,D76STO)
	TTSTRT(M'N'D77N,D77TQ'N,D76STO)
	TTSTRT(M'N'DZNL,DZTQ'N,DZSTO)
	TTSTRT(FTKS10,,CTYSTO)
	TTSTRT(FTKL10,,TTDSTO)
	TTSTRT(M.RMCR,,NETSTO)
	TTSTRT(M.DECN,,NRTSTO)
	TTSTRT(M.LATN,,LATSTO)
	POPJ	P,
>
$HIGH
ZZ==0
REPEAT CPUN,<
	STRG(\ZZ)
ZZ==ZZ+1
>
;HERE ONCE A SECOND FROM SCNSER
;ONLY ENTRIES HERE ARE ONES WHOSE ISR DISPATCH DOES SOMETHING

DEFINE TTSECN(FT,DSP),<
IFN FT,<PUSHJ P,DSP##+ISRCHK>
>

DEFINE STRG(N),<
SC'N'SEC::SE1ENT
	TTSECN(M'N'TTG0,DL0DSP)
	TTSECN(M'N'TTG1,DL1DSP)
	TTSECN(M'N'68L0,CC0DSP)
	TTSECN(M'N'68L1,CC1DSP)
	TTSECN(M'N'DZNL,DZDSP)
	TTSECN(FTKL10,CTYDSP)
	TTSECN(M.DECN,NRTDSP)
	TTSECN(M.LATN,LATDSP)
	POPJ	P,
>
ZZ==0
REPEAT CPUN,<
	STRG(\ZZ)
ZZ==ZZ+1
>
;THE TTY COMMAND MAP HAS 1 BIT PER LINE ARRANGED 32 BITS PER WORD
;THUS LINE 0 IS BIT 0 OF WORD 0, LINE 37(8) IS BIT 31 OF WORD 0,
; LINE 40(8) IS BIT 0 OF WORD 1, AND SO ON.
$LOW
TTMAPN==<TTPLEN/^D32>+1
CMDMAP::BLOCK	TTMAPN		;TTY COMMAND BIT MAP
$HIGH

REPEAT	0,<			;FOR HISTORICAL REASONS
;TTYCMD IS CALLED ON EVERY CLOCK TICK TO LOOK FOR A COMMAND. IF THERE
; IS A COMMAND WAITING IT CALLS COMCON TO PROCESS IT. COMCON IN TURN
; CALLS TTFCOM WHICH SCANS CMDMAP TO FIND THE COMMAND.  THE ENTIRE
; PROCESS IS VERY FAST AND IS NOT ERROR PRONE.
TTYCMD::	;HERE TO TEST FOR A COMMAND
	ZZ==0
REPEAT TTMAPN,<
	SKIPE	CMDMAP+ZZ	;ANY COMMANDS IN THIS GROUP?
	PJRST	COMMAND##	;YES--CALL COMCON
	ZZ==ZZ+1
	XLIST
>;END REPEAT
	LIST
	POPJ	P,0
>  ;END REPEAT 0

XP TTCMPT,-TTMAPN	;AOBJN POINTER TO COMMAND MAP
TTDALT::	;XCTED IN SCNSER TO SET TTY ALT DEFAULT
IFE TTYALT,<
	IORM	T1,LDBPAG##(U)	;NORMAL DEFAULT IS TTY NO ALT
>
IFN TTYALT,<
	ANDCAM	T1,LDBPAG##(U)	;IF LOTS OF 33S AND 35S
>
	SUBTTL	TERMINAL DATA BASE -- TERMINAL CHARACTERISTICS DEFINITION

TTPWID::POINT	8,TCRTAB(T1),7	;POINTER TO TERMINAL WIDTH
TTPLNB::POINT	8,TCRTAB(T1),15	;POINTER TO TERMINAL LENGTH
TTPFRM::POINT	1,TCRTAB(T1),16	;ON IF TERMINAL HAS HARDWARE FORM FEEDS
TTPTAB::POINT	1,TCRTAB(T1),17	;ON IF TERMINAL HAS HARDWARE TABS
TTPLCT::POINT	1,TCRTAB(T1),18	;ON IF TERMINAL DOESN'T HAVE LOWER CASE CHARACTERS
TTPALT::POINT	1,TCRTAB(T1),19	;ON IF NO ALTMODE CONVERSION IS REQUIRED
TTPDIS::POINT	1,TCRTAB(T1),20	;ON IF "DISPLAY" TERMINAL (E.G., FOR DDT)
TTPNFC::POINT	1,TCRTAB(T1),21	;ON IF TERMINAL NO CRLF
TTPXNF::POINT	1,TCRTAB(T1),22	;ON IF TERMINAL HAS ^S/^Q
TTP8BT::POINT	1,TCRTAB(T1),23	;ON IF TERMINAL HAS 8-BIT ASCII CHARACTER SET
TTPFLC::POINT	2,TCRTAB(T1),35	;POINTER TO DEFAULT FILL CLASS

DEFINE CUSTRM,<		;CUSTOMER TERMINAL TYPES
	SPCTRM		;MONGEN CUSTOMER TERMINAL TYPES
TERMCR	LA34,  132,  0, NOFF,   TAB,   LC, NOALT, NODIS, NOCRLF,   XON,	NO8BIT,  0,  0,  0
>

DEFINE DECTRM,<    ;DEC TERMINAL TYPES
TERMCR  TTY,    72,  0, NOFF, NOTAB, NOLC,   ALT, NODIS,   CRLF,   XON,	NO8BIT,  1,  0,  0
TERMCR  VT05,   72, 20, NOFF,   TAB, NOLC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  2, VT06EP, VTXXBP
TERMCR  VT06,   72, 25, NOFF, NOTAB, NOLC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  1, VT06EP, VT06BP
TERMCR  VT50,   80, 12, NOFF,   TAB, NOLC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, VTXXEP, VTXXBP
TERMCR  VT52,   80, 24, NOFF,   TAB,   LC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, VTXXEP, VTXXBP
TERMCR  VT61,   80, 24, NOFF,   TAB,   LC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, VTXXEP, VTXXBP
TERMCR  DAS21,  80, 24, NOFF,   TAB,   LC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, VTXXEP, VTXXBP
TERMCR  VT100,  80, 24, NOFF,   TAB,   LC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, V100EP, VTXXBP
TERMCR  TTY33,LT33,  72,  0, NOFF, NOTAB, NOLC,   ALT, NODIS,   CRLF,   XON,	NO8BIT,  1,   0,  0
TERMCR  TTY35,LT35,  72,  0,   FF,   TAB, NOLC,   ALT, NODIS,   CRLF,   XON,	NO8BIT,  1,   0,  0
TERMCR  LA30,   72,  0, NOFF, NOTAB, NOLC, NOALT, NODIS,   CRLF,   XON,	NO8BIT,  1,   0,  0
TERMCR  LA36,  132,  0, NOFF, NOTAB,   LC, NOALT, NODIS, NOCRLF,   XON,	NO8BIT,  0,   0,  0
TERMCR  2741,  128,  0, NOFF, NOTAB,   LC, NOALT, NODIS, NOCRLF,   XON,	NO8BIT,  3,   0,  0
TERMCR  LA38,  132,  0, NOFF,   TAB,   LC, NOALT, NODIS, NOCRLF,   XON,	NO8BIT,  0,   0,  0
TERMCR  LA120, 132,  0,   FF,   TAB,   LC, NOALT, NODIS, NOCRLF,   XON,	NO8BIT,  0,   0,  0
TERMCR  VT125,  80, 24, NOFF,   TAB,   LC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, V100EP, VTXXBP
TERMCR  VK100,  80, 24, NOFF,   TAB,   LC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, V100EP, VTXXBP
TERMCR  VT101,  80, 24, NOFF,   TAB,   LC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, V100EP, VTXXBP
TERMCR  VT102,  80, 24, NOFF,   TAB,   LC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, V100EP, VTXXBP
TERMCR  VT103,  80, 24, NOFF,   TAB,   LC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, V100EP, VTXXBP
TERMCR  VT180,  80, 24, NOFF,   TAB,   LC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, V100EP, VTXXBP
TERMCR  VT185,  80, 24, NOFF,   TAB,   LC, NOALT,   DIS,   CRLF,   XON,	NO8BIT,  0, V100EP, VTXXBP
>

DEFINE	TERMCR(NAME,ALIAS,WIDTH,LENGTH,$FF,$TAB,$LC,$ALT,$DIS,$CRLF,$XON,$8BIT,FILL,BPERAS,BPRUBO<**UNSPECIFIED**>),<
IFIDN <BPRUBO><**UNSPECIFIED**>,<TRMCR1	NAME,,ALIAS,WIDTH,LENGTH,$FF,$TAB,$LC,$ALT,$DIS,$CRLF,$XON,$8BIT,FILL,BPERAS>
IFDIF <BPRUBO><**UNSPECIFIED**>,<TRMCR1	NAME,ALIAS,WIDTH,LENGTH,$FF,$TAB,$LC,$ALT,$DIS,$CRLF,$XON,$8BIT,FILL,BPERAS,BPRUBO>
>
DEFINE	TRMCR1(NAME,ALIAS,WIDTH,LENGTH,$FF,$TAB,$LC,$ALT,$DIS,$CRLF,$XON,$8BIT,FILL,BPERAS,BPRUBO),<
X1==0
IFE <SIXBIT/$FF/>-<SIXBIT/FF/>,<X1==1>
X2==0
IFE <SIXBIT/$TAB/>-<SIXBIT/TAB/>,<X2==1>
X3==1
IFE <SIXBIT/$LC/>-<SIXBIT/LC/>,<X3==0>
X4==1
IFE <SIXBIT/$ALT/>-<SIXBIT/ALT/>,<X4==0>
X5==0
IFE <SIXBIT/$DIS/>-<SIXBIT/DIS/>,<X5==1>
X6==1
IFE <SIXBIT/$CRLF/>-<SIXBIT/CRLF/>,<X6==0>
X7==0
IFE <SIXBIT/$XON/>-<SIXBIT/XON/>,<X7==1>
X8==0
IFE <SIXBIT/$8BIT/>-<SIXBIT/8BIT/>,<X8==1>
IFNDEF T'NAME,<T'NAME:>
BYTE (8)^D'WIDTH(8)^D'LENGTH(1)X1(1)X2(1)X3(1)X4(1)X5(1)X6(1)X7(1)X8(10)0(2)FILL
IF2,<	.IF BPERAS,NEEDED,<EXTERN BPERAS>
	.IF BPRUBO,NEEDED,<EXTERN BPRUBO>
    >
	XWD	BPERAS,BPRUBO	;<CR> EOL,,B.S. SPACE B.S.
>

;EXPAND TERMINAL PARAMTERS

CTCTAB::CUSTRM
TCRTAB::DECTRM

DEFINE	TRMCR1(NAME,ALIAS,WIDTH,LENGTH,$FF,$TAB,$LC,$ALT,$DIS,$CRLF,$XON,$8BIT,FILL,BPERAS,BPRUBO),<
	EXP	SIXBIT	/NAME/
>

;EXPAND TERMINAL TYPES (FOR COMCON)

CTTWDT::CUSTRM
TTTWDT::DECTRM
TTTWDN==:.-CTTWDT

DEFINE	TRMCR1(NAME,ALIAS,WIDTH,LENGTH,$FF,$TAB,$LC,$ALT,$DIS,$CRLF,$XON,$8BIT,FILL,BPERAS,BPRUBO),<
IFNB	/ALIAS/,<
IFDIF	<NAME><ALIAS>,<	EXP	SIXBIT	/NAME/>
	>
>

;TABLE OF SIXBIT TERMINAL NAMES THAT ARE ALIASED FOR NRTSER
TRMTAB::CUSTRM
	DECTRM
TRMTBL==:.-TRMTAB	;LENGTH

DEFINE	TRMCR1(NAME,ALIAS,WIDTH,LENGTH,$FF,$TAB,$LC,$ALT,$DIS,$CRLF,$XON,$8BIT,FILL,BPERAS,BPRUBO),<
IFNB	/ALIAS/,<
IFDIF	<NAME><ALIAS>,<	EXP	SIXBIT	/ALIAS/>
	>
>

;TABLE OF SIXBIT ALIASES MATCHING TERMINAL NAMES ABOVE
TRMNAM::CUSTRM
	DECTRM
	SUBTTL	TERMINAL DATA BASE -- POINTERS FOR CURSOR SEQUENCES

VT06BP:	POINT	9,VT06TB
	POINT	9,VT06TB+2,8
	POINT	9,VT06TB+4,17
	POINT	9,VT06TB+6,26
	POINT	9,VT06TB+10,35
	POINT	9,VT06TB+13,8
	POINT	9,VT06TB+15,17
	POINT	9,VT06TB+17,26

VT06EP:	POINT	9,VT06EL
	POINT	9,VT06E1
	POINT	9,VT06E2
	POINT	9,VT06E3

VTXXBP:	POINT	9,VTXXTB
	POINT	9,VTXXTB,26
	POINT	9,VTXXTB+1,17
	POINT	9,VTXXTB+2,8
	POINT	9,VTXXTB+2,35
	POINT	9,VTXXTB+3,26
	POINT	9,VTXXTB+4,17
	POINT	9,VTXXTB+5,8

VTXXEP:	POINT	9,VTXXEL
	POINT	9,VTXXE1
	POINT	9,VTXXE2
	POINT	9,VTXXE2,17

V100EP:	POINT	9,VTXXEL
	POINT	9,V100E1
	POINT	9,V100E2
	POINT	9,V100E2,17
	SUBTTL	TERMINAL DATA BASE -- CURSOR CONTROL SEQUENCES

VT06TB:	BYTE	(9)	177,177,177,010,040,177,177,177
	BYTE	(9)	010,177,177,177,010,040,177,177
	BYTE	(9)	177,010,177,177,177,010,040,177
	BYTE	(9)	177,177,010,177,177,177,010,040
	BYTE	(9)	177,177,177,010,177,177,177,010
	BYTE	(9)	040,177,177,177,010,177,177,177
	BYTE	(9)	010,040,177,177,177,010,177,177
	BYTE	(9)	177,010,040,177,177,177,010,177
	BYTE	(9)	177,177,010,040,177,177,177,010
	BYTE	(9)	0

VT06EL:	BYTE	(9)	015,177,177,177,0
VT06E1:	BYTE	(9)	30,177,177,177,0
VT06E2:	BYTE	(9)	30,177,177,177
VT06E3:	BYTE	(9)	36,177,177,177,0

VTXXTB:	BYTE	(9)	010,040,010,010,040,010,010,040
	BYTE	(9)	010,010,040,010,010,040,010,010
	BYTE	(9)	040,010,010,040,010,010,040,010
	BYTE	(9)	0

VTXXEL:	BYTE	(9)	015,0
VTXXE1:	BYTE	(9)	33,103,0
VTXXE2:	BYTE	(9)	33,103,33,113,0

V100E1:	BYTE	(9)	233,103,0
V100E2:	BYTE	(9)	233,103,233,113,0
	SUBTTL	DTESER DATA BASE GENERATION

	$LOW

IFN FTKL10,<
	.XCREF
;GENERATE FRONT END DEVICE BLOCKS

	FEDGEN

;GENERATE HEADER FOR COMM REGION

	ETHEAD

;GENERATE COMM REGION ITSELF

	ETREGN

;GENERATE DTE CONTROL BLOCKS

	ETDGEN

;GENERATE TABLE OF CORRESPONDENCE BETWEEN CPU#,DTE# AND DTE CONTROL BLOCKS
	.CREF
	ETDTBX

;TABLE FOR MASTER DTE CONTROL BLOCK ADDRESS FOR EACH CPU

DEFINE	DFLMAS	(C),<
	EXP	ETD'C'1B
>

DTEMAS::
N10==0
REPEAT M.CPU,<
	DFLMAS	\N10
	N10==N10+1
>


;MACROS FOR RSX-20F DEVICE SYMBOLS AND STORAGE

DEFINE	RSX20F	<
	N10==0				;;INDEX FOR -10 CPU #
	REPEAT	M.CPU,<			;;DO FOR EACH CPU ON SYSTEM
		RSXCPU	\N10		;;CALL CPU MACRO
		N10==N10+1		;;STEP TO NEXT CPU
	>
>

DEFINE	RSXCPU	(C)	<
   IFDEF M'C'DTEN,<			;;DO ONLY IF DTE(S) ON THIS CPU
	N11==0				;;INDEX FOR -11 CPU (DTE) #
	REPEAT	M'C'DTEN,<		;;DO FOR ALL DTE'S
		RSXDTE	\C,\N11		;;CALL CURRENT DTE MACRO
		N11==N11+1		;;STEP TO NEXT -11 (DTE)
	>
   >
>


> ;END FTKL10


	SUBTTL	NETWORK SYMBOLS FOR NON-NETWORK SYSTEMS

IFE M.NET,<			;IF MONGEN ANSWER IS NO THEN DEFINE SYMBOLS
NODE.U==:CPOPJ##		;ILLEGAL UUO
TSTNET==:CPOPJ##		;NO NETWORK DEVICES
GENNET==:CPOPJ##
NET2ND==:CPOPJ##
HOST.U==:CPOPJ##
SRCNDB==:CPOPJ##
NETCTC==:CPOPJ##
ZAPNET==:CPOPJ##
STBSCA==:CPOPJ##
D85DSC==:ECOD4##
RDA$IN==:CPOPJ##
CDR$IN==:CPOPJ##
NETRTY::0			;NO NETWORK TTYS
NDBNNM==:0			;NO STATION BLOCKS
NETDSP==:0			;NO SERVICE ROUTINE
STBOPR::PUSH	P,U		;SAVE LDB
	MOVE	U,OPRLDB##	;GET CENTRAL (ONLY) OPR LDB
	LDB	T1,LDPLNO##	;GET LINE NUMBER
	PJRST	UPOPJ##		;RESTORE AC AND RETURN.
>;END IFE M.NET

IFE M.DN6S,<
IFN FTKL10,<
D6SDDS==:EATDSP##
>
D60UP==:CPOPJ##
D60DWN==:CPOPJ##
>
IFN M.KL10,<
IFE M.DN6S,<
D6SED==:ECOD2##
D6SQ11==:ECOD2##
DWND6S==:STOTAC##
D6STMO==:CPOPJ##
>
IFE M.DN6D,<
D6DED==:ECOD2##
D6DQ11==:ECOD2##
>
>;END IFN M.KI10!M.KL10

IFN M.KL10&FTNET,<
IFE <M.NET>*<M.DN8S>,<		;IF NONETWORKS OR NO DN87S'S
NCLDSP==:EATDSP##
>
>;END IFN M.KL10&FTNET

IFE <M.NET!M.DAS78!M.DN60>,<	 ;NEITHER NETWORKS, DAS78S, NOR DN60S
WHERE==:CPOPJ##
LOCATE==:CPOPJ##
>	;END IFE <M.NET!M.DAS78!M.DN60>

IFN M.DN60,<IFE M.NET,<SRCNDB==:CPOPJ>>	;GIVE NONSKIP RETURN
IFNDEF M.KDUP,<M.KDUP==0>
IFNDEF M.DMRN,<M.DMRN==0>
IFN M.NET!M.DC76,<		;ANY IBM 2741 FE SUPPORT
	$HIGH
;SUBROUTINE EXEINX - RETURN AN INDEX TO THE GOLF BALL NUMBER
;CALL	MOVEI	T3,BALL NUMBER(BINARY)
;	PUSHJ	P,ELEINX
;RETURN	CPOPJ			;NOT IN THE TABLE
;	CPOPJ1			;FOUND T2=INDEX
ELEINX::MOVSI	T2,-ELELEN	;SIZE OF TABLE
	CAME	T3,ELETAB(T2)	;MATCH
	AOBJN	T2,.-1		;NO--LOOP FOR MORE
	JUMPGE	T2,CPOPJ##	;EXIT IF NOT FOUND
	PJRST	CPOPJ1##	;GOOD RETURN
	RADIX	10
ELETAB::EXP	029,087,938,963,987,988
	RADIX	8
ELELEN==.-ELETAB
	$LOW
>;END M.NET!M.DC76

IFN	FTXTC,<
IFN	M.XTC,<


XP	MX11BF,^D129	;MAXIMUM PDP-11 IMAGE BINARY BUFFER SIZE
DEFINE	XTCDEF	(X),<
	IFNDEF	XT'X'S,<XT'X'S==420+X*10>
	IFNDEF	XT'X'C,<XT'X'C==:424+X*10>
XP	XKBSKP,400450

XT'X'INT:: CONSO	XT'X'C,XKBSKP	;EXTERNAL PROCESSOR INTERRUPT?
	JRST	.-1		;NO, GO DOWN THE SKIP CHAIN
	JSR	XT'X'SAV##	;SAVE ALL THE AC'S
	PUSHJ	P,SAVE4##	; ..
	JSP	W,XTCINT##	;CALL XTCSER

XP	XTCCHN,XT'X'CHN##

DEFINE	XTLNK	(A) <
	IFN	A-XTCN,<
XKBKDB::!EXP	XKB'A'		;LINK TO NEXT KDB
>
	IFE	A-XTCN,<
XKBKDB::!EXP	0		;NO MORE KDB'S
>
>
XP	XKBINT,<XT'X'INT-.>

Z=X+1
XKB'X::	PHASE	0		;BEGIN CONTROLLER DATA BLOCK
XKBNAM::!XWD	'EPA'+X,0	;EP NAME
	XTLNK	\Z		;LINK TO NEXT KDB
XKBUDB::!BLOCK	21		;SPACE FOR LINKS TO UDBS
XTSCNO::!CONO	XT'X'S,(T1)
XTCCNO::!CONO	XT'X'C,(T1)
XTSCNI::!CONI	XT'X'S,T1
XTCCNI::!CONI	XT'X'C,T1
XTSDTI::!DATAI	XT'X'S,T1
XTCDTI::!DATAI	XT'X'C,T1
XTCDTO::!DATAO	XT'X'C,T1
XTSDTO::!DATAO	XT'X'S,T2
XTCBSY::!CONSZ	XT'X'C,20
XKBLOK::!EXP	-1		;INTERLOCK
XKBDDB::!BLOCK	1		;POINTER TO DDB WAITING FOR INTRPT
XKBIUN::!BLOCK	1		;POINTER TO UDB WAITING FOR INTERRUPT
XKBDAC::!BLOCK	1		;INFO FROM LAST CONI DAC
XKBDAS::!BLOCK	1		;INFO FROM LAST CONI DAS
XKBTIM::!BLOCK	1		;COUNTER FOR TIMEOUT
XKBIOW::!BLOCK	1		;IOWD FOR DAC OR PNTR TO IOLIST
XKBCUR::!BLOCK	1		;CUR PNTR TO IOLIST (KI10 ONLY)
XKBGRB::!Z			;0 IF FREE 1 IF GRABBING
				;CONTROL -1 IF GRABBED
XKBPAC::!BLOCK	1		;# OF PSEUDO ACTIVE DDB'S ON THIS
				; CONTROLLER
XKBREQ::!BLOCK	1		;OLDEST JOB # REQUESTING USE OF UDB
XKBMBF::!BLOCK	<MX11BF*3>/2	;MONITOR BUFFER
	DEPHASE

>
	ZZ=0
	IFE	XTCN,<
XTUUO==:CPOPJ##			;NO XTUUO IF NO XTCSER
XTKLDB==:CPOPJ##		;ALSO NO DDB KILLER
XTCTTY::AOS	(P)		;DOUBLE SKIP
	JRST	CPOPJ1##
XTCTYP==:CPOPJ##
>

	IFN	XTCN,<EXTERN XTCSER>		;LOAD XTCSER IF NEEDED

	REPEAT	XTCN,<
	XTCDEF	(\ZZ)
	ZZ=ZZ+1
>
>>	;;END OF FTXTC FEATURE
SUBTTL MAGTAPE DATA BASE FOR TAPSER

IFG TAPN,<

	EXTERN	TAPSER,TAPUUO

;SOME GENERALLY USEFUL MACROS

DEFINE	CALUNI (Y,EMACR) <
	..UNI==0
	REPEAT	M.MT'Y,<
	  GENUNI (Y,\..UNI,EMACR)
	  ..UNI==..UNI+1>
>

DEFINE	UNIMAC (A,B) <
	..U'A'B>

DEFINE	CHNMAC (Z) <
	CHN'Z'CB##>

;NOTE:  ANY CHANGE TO THE DDB STRUCTURE SHOULD
;	ALSO BE MADE TO THE LABEL DDB PROTOTYPE
;	DEFINED IN TAPUUO.
DEFINE	GENDDB (X,Y) <

MT'X'DDB::	<SIXBIT	/MTA0/>+<X>_^D18	;(0)  DEVNAM
	<^D5*HUNGST>,,MTSIZ+1  ;(1)  DEVCHR
	0			;(2)  DEVIOS
	TPMDSP##		;(3)  DEVSER
DVLNG!1023,,154403+BYTBIT	;(4)  DEVMOD
	0			;(5)  DEVLOG
	0			;(6)  DEVBUF
	0			;(7)  DEVIAD
	0			;(10) DEVOAD
	;;BITS 0-13 ARE USED FOR FRAME-COUNT
	0			;(11) DEVSTS
	.TYMTA!DEPLEN,,Y*DEPEVM	;(12) DEVSTA
	2B<DENHCI>		;(13) DEVXTR
		DESHCT==:^D3	;HUNG COUNTER SIZE (Q'D/ASYNCH I/O ONLY)
		DENHCI==:^D2	;VALUE TO INITIALIZE AT
		DENHCT==:^D5	;THE BIT
;BITS 0-2 ARE NUMBER OF TIMES WE ALLOW A Q'D PROTOCAL OR ASYNCRONOUS I/O
;REQUEST TO TIME OUT (IF IT WASN'T ACTUALLY STARTED YET) BEFORE REALLY
;HANGING THE DEVICE.
;BITS 3-5 ARE THE COUNTER (COUNTS FROM CONTENTS OF BITS 0-2 TO ZERO)
;DEFAULT IS 2 TIMES TOTAL THROUGH THE HUNG CODE.
	;BITS 22-30 = NUMBER OF INPUT BUFFERS
	0			;(14) DEVEVM
	0			;(15) DEVPSI
	0			;(16) DEVESE
	0			;(17) DEVHCW
	2000*Y+M.MT'X'P*100000,,0 ;(20) DEVCPU .QUEUED PROTOCOL IF NOT TM10A
	0			;(21) DEVISN
	0			;(22) DEVJOB
	0			;(23) DEVFIL
	0			;(24) DEVEXT
	0			;(25) DEVPPN
IFN FTKL10&FTMP,<
	0			;(26) DEVNBF
	0			;(27) DEVSBF
	0			;(30) DEVCSN
>

	 PHASE	DEVLLD+IFN FTKL10&FTMP,<3>

TDVUDB::!			;LH = UDB PNTR
TDVKDB::! ..U'X'0,,MT'X'KDB	;RH = KDB PNTR (PRIME CONTROLLER)
TDVSTS::! 0			;UNIT STATUS INFO
TDVIOR::! 0			;IORB TO WAIT FOR
TDVSUL::! 0			;SAVED USER UPPER LIMIT
TDVSLL::! 0			;SAVED USER LOWER LIMIT
TDVSVM::! 0			;SAVED M FOR DUMP MODE
TDVREM::! 0			;REMAINDER FOR MODE 16

	 DEPHASE

XP MT'X'DDS,.-MT'X'DDB		;SIZE OF DDB
>	;END GENDDB MACRO
;MACRO TO GENERATE A KDB

DEFINE	GENKDB (X,KMACR) <

MT'X'INT::
IFE M.KS10,<
	CONSO	MT'X'S,0	;INTERUPT INSTRUCTION
	JRST	.-1
>
IFN M.KS10,<
	0			;VECTORRED INTERRUPT JSR'S TO HERE
	EXP	0,IC.UOU,.+1	;XPCW BLOCK

	EXCH	T1,MT'X'INT	;GET INTERRUPT PC
	MOVEM	T1,MT'X'CHL##	;STORE IN "CH'PI" SO JEN WILL DISMISS CORRECTLY
	MOVE	T1,MT'X'INT+1	;SECOND WORD
	MOVEM	T1,MT'X'CHL##+1	;FOR XJEN

	MOVE	T1,MT'X'INT	;AND RESTORE T1
>;END IFN M.KS10
IFN FTAUTC,<
	JSR	0		;AUTCON WILL FILL THIS IN
>
IFE FTAUTC,<
	JSR	MT'X'SAV##	;SAVE ACS
>
	JSP	W,TAPINT##
XP TKBCSO,MT'X'INT-.		;OFFSET OF CONSO INSTR FROM KDB
MT'X'KDB:: PHASE 0
TKBNAM::!
IFN FTAUTC,<0>
IFE FTAUTC,<
<SIXBIT /MT0/>+<X>B17
>
TKBCNT::! 0			;(1) NUMBER OF RECORDS DONE ON THIS OPERATION
TKBKDB::!
IFN FTAUTC,<0>
IFE FTAUTC,<
	IFE <X-TAPN+1>,<0>	;(2) LINK TO NEXT KDB
	IFN <X-TAPN+1>,<MTLINK (\<X+1>)>
>
TKBIUN::! -M.MT'X,,TKBUDB+IFE FTAUTC,<MT'X'KDB> ;(3) INITIAL UNIT AOBJN PNTR
TKBCUN::! -M.MT'X,,TKBUDB+IFE FTAUTC,<MT'X'KDB> ;(4) CURRENT UNIT AOBJN PNTR
TKBDSP::! MT'X'DSP		;(5) KONTROLLER DISPATCH
TKBSTS::!
IFN FTAUTC,<0>
IFE FTAUTC,<
 BYTE	(3)M.MT'X'P(33)0 ;(6) KONTROLLER STATUS
>
				;(RH) CONSECUTIVE OPS REMAINING
TKBICP::
IFN FTAUTC,<0>
IFE FTAUTC,<
	 IFE M.MT'X'T-K.TMA,<
		MTALOC##+1000*M.MT'X'P>	;PI CHL FOR TM10A
	 IFE M.MT'X'T-K.TMB,<
		$LOCW*4+LOCOCW##
		$LOCW==$LOCW+1>	;TM10B
	 IFE M.MT'X'T-K.TC1,<
		$LOCW*4+LOCOCW##
		$LOCW==$LOCW+1>	;TC10C
	 IFE M.MT'X'T-K.TX1,<
		$LOCD*4+LOCODW##
		$LOCD==$LOCD+1>	;DX10 TYPE
	 IFE M.MT'X'T-K.TM2,<
		IFLE M.T2'X'T,<
		$LOCW*4+LOCOCW##
		$LOCW==$LOCW+1>	;TM02 ON RH10
	IFG M.T2'X'T,<
		ZZ==4*M.T2'X'T
		IFE ZZ-40,<ZZ==0>
		.E0MP+ZZ+2000*M.MT'X'P
		>
		>
	 IFE M.MT'X'T-K.DX2,<
		ZZ==4*M.D2'X'T
		IFE ZZ-40,<ZZ==0>
		.E0MP+ZZ+2000*M.MT'X'P
		>
	 IFE M.MT'X'T-K.T78,<
		ZZ==4*M.T7'X'T
		IFE ZZ-40,<ZZ==0>
		.E0MP+ZZ+2000*M.MT'X'P
		>
>
TKBTIM::! 0			;(10) TIMER FOR SPACING OPS
TKBCDB::!
IFN FTAUTC,<0>
IFE FTAUTC,<
IFE M.MT'X'T,<0>	;(11) PNTR TO CHL IF NOT TM11A
IFN M.MT'X'T,<CHNMAC(\M.MT'X'C)>
>
TKBJOB::! 0			;(12) JOB NUMBER OF MAINT-MODE OWNER
				; TKBJOB MUST IMMEDIATELY PRECEDE TKBCCL
	TKWCCL==:5		;NUMBER OF WORDS IN CHANNEL COMMAND LIST
TKBCCL::! BLOCK	TKWCCL		;(13) CHANNEL COMMAND LIST
TKBERB::!
IFN FTAUTC,<0>
IFE FTAUTC,<
	MT'X'DDB		;(21) IORB FOR ERROR RECOVERY
>
	  BLOCK 3		;ADDR OF DDB AT ONCE ONLY
IFN FTMP,<
TKBFCT::!EXP	TKBICT		;FAIRNESS COUNT TO ALLOW QUEUED I/O TO START
				; EVEN IF PENDING REQUESTS ON THIS CPU
>
TKBUDB::! ..UNI==0
IFE FTAUTC,<
	REPEAT	M.MT'X,<
	  UNIMAC (X,\..UNI)
	  ..UNI==..UNI+1>
	BLOCK	^D8-M.MT'X	;ALLOW FOR 8 MAX UNITS
>
IFN FTAUTC,<
	BLOCK	^D8
>
TKBUNI::!IFN FTAUTC,<0>
IFE FTAUTC,<
	XWD	M.MT'X'U,1_M.MT'X'U ;UNIT, ATTEN BIT FOR MULTI UNITS ON AN RH
				    ; NEGATIVE IF NON MULTI-UNIT CONTROLLER
>
IFE FTKS10,<
TKBVIN::!0			;VECTOR INTERRUPTS HERE
	0
	EXP	IC.UOU
	EXP	.+1+IFE FTAUTC,<MT'X'KDB>
	XCT	TKBCSO+2+IFE FTAUTC,<MT'X'KDB>	;JSR TAPSAV
	DMOVE	T1,TKBVIN+IFE FTAUTC,<MT'X'KDB>
	DMOVEM	T1,@.CPTCH##
	JRST	TKBCSO+3+IFE FTAUTC,<MT'X'KDB>	;GO TO JSP TAPINT

IFE M.MT'X'T-K.TM2,<
TKBIVI::!IFN FTAUTC,<0>		;DATAO CONTENTS TO SET UP INTERRUPT VECTOR
IFE FTAUTC,<
	IFLE M.T2'X'T,<444002,,$LOCW*4+LOCOCW##-1>
IFG M.T2'X'T,<
	ZZ==4*M.T2'X'T
	IFE ZZ-40,<ZZ==0>
	744400,,ZZ+3
	>
>	;END IFE FTAUTC
TT2CI2::!
TKBCIS::!CONI MT'X'S,T2
TKBDIS::!DATAI MT'X'S,T2
TKBDOS::!DATAO MT'X'S,T2
TT2CO1::!CONO MT'X'S,(T1)
TT2CO3::!CONO MT'X'S,(T3)
TT2UVA::!0			;TEMP FOR READ-BACKWARDS
> ;END IFE M.MT'X'T-K.TM2
IFE M.MT'X'T-K.T78,<
TKBIVI::!IFN FTAUTC,<0>
IFE FTAUTC,<
	ZZ==4*M.T7'X'T
	IFE ZZ-40,<ZZ==0>
	744400,,ZZ+3
>
TKBCIS::!CONI MT'X'S,T2
TKBDIS::!DATAI MT'X'S,T2
TKBDOS::!DATAO MT'X'S,T2
T78COS::!CONO MT'X'S,(T3)
T78UVA::!0
T78RRO::!0
T78ACT::!0			;;COUNT OF CONTINUOUS ASYNC INTERRUPTS
T78AMX==:^D10			;;MAX BEFORE SHUTTING DOWN THE TM78
T78XIW::!RH2TRA##!RH2LST##!<17_4>,,T78REG+30 ;IOWD TO READ ERROR LOG INFO
				;;MAKE SURE TO CHANGE T78CTG IF THIS CHANGES
> ;END IFE M.MT'X'T-K.T78
>	;END IFE FTKS10
	KMACR(X)		;KONTROLLER DEPENDENT DATA
	DEPHASE
> ;END DEFINE GENKDB

DEFINE	MTLINK (X) <MT'X'KDB>
;MACRO TO GENERATE ALL TAPE INFO

DEFINE	GENTAP (KON) <

	EXPNDK	(KON)		;DEFINE 7 TRACK UNITS AND 6250 BPI UNITS

IFLE <M.MT'KON'T-K.TMB>,<	;ALL TM10S
	MT'KON'DSP=TMXDSP##
	EXTERN	TMXKON
	DOTM10(KON,M.MT'KON'T)	;GEN FOR APPROPRIATE TYPE
>
IFE <M.MT'KON'T-K.TC1>,<	;TC10C
	MT'KON'DSP=TCXDSP##
	EXTERN	TCXKON
	MT'KON'S==724+4*<%TC10-M.TC'KON'P>	;TC10 STATUS REG
	CALUNI(KON,ETCMAC)	;GEN UNITS
	GENKDB(KON,KTCMAC)	;GE KDB
		BYTBIT==0_BYTMOD
	GENDDB(KON,1)		;DDB PROTOTYPE
	%TC10==%TC10+1	;ADVANCE TO NEXT TC10C
>
IFE <M.MT'KON'T-K.TX1>,<	;TX01
	MT'KON'DSP=TX1DSP##
	EXTERN	TX1KON
	MT'KON'S==220+4*<%DX10-M.TX'KON'P>
	IFG <MT'KON'S-224>,<MT'KON'S==MT'KON'S-174>
	;DX10 STATUS REG
	CALUNI(KON,ETXMAC)	;GEN UNITS
	GENKDB(KON,KTXMAC)	;GEN KDB
		BYTBIT==1_BYTMOD
	GENDDB(KON,1)		;DDB PROTOTYPE
	%DX10==%DX10+1	;ADVANCE TO NEXT DX10
				;TM02
>
IFE <M.MT'KON'T-K.TM2>,<
	MT'KON'DSP==TM2DSP##
	EXTERN	TM2KON
	IFLE	M.T2'KON'T,<
	MT'KON'S==270-4*M.T2'KON'T
	IFG <MT'KON'S-277>,<MT'KON'S==MT'KON'S+60>
	>
IFG	M.T2'KON'T,<
	MT'KON'S==540+4*<M.T2'KON'T>
	IFE <MT'KON'S-600>,<MT'KON'S==540>
	>
	CALUNI(KON,ET2MAC)
	GENKDB(KON,KT2MAC)
		BYTBIT==1_BYTMOD
	GENDDB(KON,1)
>
IFE <M.MT'KON'T-K.TM2H>,<	;RH11/TU45 FOR KS10
	MT'KON'DSP==TRHDSP##
	EXTERN TRHKON
	CALUNI(KON,ETRMAC)
	GENKDB(KON,KTRMAC)
		BYTBIT==1_BYTMOD
	GENDDB(KON,1)
>
IFE <M.MT'KON'T-K.DX2>,<	;RH20/DX20/TX02
	MT'KON'DSP==TD2DSP##
	EXTERN	TD2KON,DX2COM
	MT'KON'S==540+4*<M.D2'KON'T>
	IFE <MT'KON'S-600>,<MT'KON'S==540>
	CALUNI(KON,ED2MAC)
	GENKDB(KON,KD2MAC)
		BYTBIT==1_BYTMOD
	GENDDB(KON,1)
>
IFE <M.MT'KON'T-K.T78>,<	;RH20/TM78/TU78
	MT'KON'DSP==T78DSP##
	EXTERN	T78KON
	MT'KON'S==540+4*<M.T7'KON'T>
	IFE <MT'KON'S-600>,<MT'KON'S==540>
	CALUNI(KON,E78MAC)
	GENKDB(KON,K78MAC)
		BYTBIT==1_BYTMOD
	GENDDB(KON,1)
>
>

DEFINE DOTM10 (KON,TYP) <
	MT'KON'C==340+10*<%TM10-M.T1'KON'P>S	;TM10 COMMAND REG
	MT'KON'S==MT'KON'C+4	;TM10 STATUS REG
	CALUNI(KON,ETMMAC)	;GEN UNITS
	GENKDB(KON,KTMMAC)	;GEN KDB
		BYTBIT==0_BYTMOD
	GENDDB(KON,TYP)		;GEN DDB PROTOTYPE FOR UNIT 0
	%TM10==%TM10+1		;ADVANCE TO NEXT UNIT
>
DEFINE TAPINS(X,Z) <
	REPEAT	M.MT'X'Z,<
	  UNIMAC(X,\..UNI)
	  ..UNI==..UNI+1>
  IFN M.MT'X'T-K.T78,<
	BLOCK	^D8-M.MT'X'Z
	..UNI==..UNI+^D8-M.MT'X'Z
   >
  IFE M.MT'X'T-K.T78,<
	BLOCK	4-M.MT'X'Z
	..UNI==..UNI+4-M.MT'X'Z
   >
>
;MACROS TO FIGURE OUT WHICH UNITS ARE 7 TRACK OR CAPABLE OF 6250 BPI

DEFINE	EXPNDK	(K) <
	..X=7
	MACKN'K (K)
	..X=6
	MACK6'K (K)>

DEFINE	KN (A,B,C<0>) <
	IFIDN	<B>,<ALL>,<TKREP (\..X,A,0,M.MT'A)>
	IFDIF	<B>,<ALL>,<TKREP (\..X,A,B,C)>
>

DEFINE	TKREP	(X,A,B,C) <
	IFE	C,<DEF'X (A,\B)>
	IFN	C,<
	..UNI==B
	REPEAT	<C-B+1>,<
	    DEF'X (A,\..UNI)
	    ..UNI==..UNI+1>
	>
>

DEFINE	DEF7 (K,U) <XP M.M7'K'U,1>

DEFINE	DEF6 (K,U) <XP M.M6'K'U,1>
;MACRO TO GENERATE A UDB

DEFINE	GENUNI(Y,U,EMACR) <

..U'Y'U::! PHASE 0
TUBNAM::! SIXBIT /MT'Y'U/	;(0) UNIT NAME
TUBKDB::! 0,,MT'Y'KDB		;(1) PNTR TO OWNING KONTROLLERS
TUBADR::! 0,,U			;(2) UNIT ADDRS ON KONTROLLER
TUBAKA::! 0			;(3) LH = UNIT ADDRS (CURRENT)
				;    RH = CURRENT KONTROLLER
TUBDDB::! 0			;(4) PNTR TO DDB'S
TUBCUR::! 0			;(5) POINTER TO CURRENT DDB
IFDEF M.M7'Y'U,<..X==TUCDR7##>	;7 TRACK TAPE
IFNDEF M.M7'Y'U,<		;NOT 7 TRACK TAPE
	IFLE	<M.MT'Y'T-K.TMB>,<..X==TUCDR8##> ;TM10 9 TRACK
	IFE	<M.MT'Y'T-K.TC1>,<..X==TUCDR6##> ;TC10C 800/1600 BPI
	IFE	<M.MT'Y'T-K.TX1>,<
	IFNDEF	M.M6'Y'U,<..X==TUCDR6##>	;TU70 800/1600 BPI
	IFDEF	M.M6'Y'U,<..X==TUCDR5##>	;TU72 1600/6250 BPI
	>
	IFE	<M.MT'Y'T-K.TM2>,<..X==TUCDR6##> ;TM02 800/1600 BPI
	IFE	<M.MT'Y'T-K.TM2H>,<..X==TUCDR6##> ;RH11/TU45 800/1600 BPI
	IFE	<M.MT'Y'T-K.DX2>,<
	IFNDEF M.M6'Y'U,<..X==TUCDR6##>	;DX20/TU70 800/1600 BPI
	IFDEF  M.M6'Y'U,<..X==TUCDR5##>	;DX20/TU72 1600/6250 BPI
	>
	IFE 	<M.MT'Y'T-K.T78>,<..X==TUCDR5##> ;TM78 1600/6250 BPI
>
TUBCNF::!			;(6) CONFIG INFO (RH)
TUBSTS::!..X+M.MT'Y'T		;    UNIT STATUS (LH)
TUBQUE::! 0			;(7) QUEUE PNTR FOR IORB'S
TUBERR::! 0			;(10) ERROR RECOVERY INFO
TUBRID::! 0			;(11) REELID (DAEMON KNOWS ABT THIS AREA)
TUBFIL::! 0			;(12) # OF FILES FROM BOT
TUBREC::! 0			;(13) # OF RECORDS FROM EOF
TUBCRD::! 0			;(14) # CHARS READ SINCE UNLOAD
TUBCWR::! 0			;(15) # CHARS WRITTEN SINCE UNLOAD
TUBSRE::! 0			;(16) SOFT READ ERRORS
TUBHRE::! 0			;(17) HARD READ ERRORS
TUBSWE::! 0			;(20) SOFT WRITE ERRORS
TUBHWE::! 0			;(21) HARD WRITE ERRORS
TUBTME::! 0			;(22) TOTAL MEDIA ERRORS SINCE UNLOAD
TUBCLE==:.-1			;     END OF AREA TO CLEAR
TUBTDE::! 0			;(23) TOTAL DEVICE ERRORS SINCE RELOAD
TUBTUN::! 0			;(24) TOTAL UNLOADS
TUBTRY::! 0			;(25) RETRIES TO RESOLVE ERROR
TUBCCR::! 0			;(26) CHAR CNT ON LAST REC
TUBPBE::! 0			;(27) POSITION BEFORE ERROR
				;     FILE,,RECORD
TUBFES::! 0			;(30) FINAL ERROR STATE WORD
TPCHMX==:.-TUBRID		;     MAX ARG ALLOWED FOR MTACHR UUO
TUBCHR::! 0			;(31) STATISTICS FOR MTCHR. UUO
TUBDDA::! BLOCK TUBTME-TUBRID+1	;SHADOW AREA FOR DAEMON
TUBDDE==:.-1			;END OF SHADOW AREA (DAEMON KNOWS ABT)
TUBPGM::!0			;PROGRAM NAME ON ERROR
TUBUID::!0			;PPN USING DRIVE ON ERROR
TUBCNI::! 0			;ERROR STATUS FOR NEXT RECORD
...X==0
IFE <M.MT'Y'T-K.TX1>,<...X==^D90>	;TU7X REWINDS QUICKLY
IFE <M.MT'Y'T-K.DX2>,<...X==^D90>
IFE <M.MT'Y'T-K.T78>,<...X==^D150>	;TU78S ARE FAIRLY FAST
TUBITM::!...X			;INITIAL VALUE FOR REWIND TIMER
TUBTIM::!0			;REWIND TIMER

IFN FTTLAB,<
TUBPTR::! 0			;BYTE POINTER TO FILE.EXT

TUBMSG::! XWD	TLMSIZ,.IPCTL##	;LENGTH,,FUNCTION CODE FOR LABEL MESSAGE
TUBPHY::! 0			;PHYSICAL NAME FOR LABEL PCS
TUBLBL::!			;LABEL STATUS WORD
IFNDEF M.M7'Y'U,<MTDLTP>
IFDEF M.M7'Y'U,<LT.BLP>
TLMSIZ==.-TUBMSG
TUBLIB::!			;START OF LABEL INFORMATION BLOCK
TUBRFM::!0			;RECORD FORMAT (FOR LABELS ONLY)
TUBRCC::!0			;RECORD SIZE (FOR LABELS ONLY)
TUBBKL::!0			;BLOCK SIZE (FOR LABELS ONLY)
TUBEXP::!0			;EXPIRATION DATE (FOR LABELS ONLY)
TUBPRT::!0			;PROTECTION (FOR LABELS ONLY)
TUBPSN::!0			;FILE POSITION #
TUBFNM::!BLOCK	<^D17+4>/5	;17 CHAR (ASCII) FILE NAME
TUBGVR::!0			;GENERATION + VERSION #
TLPMAX==:.-TUBLIB
>
	EMACR(Y)		;GENERATE ERROR INFO BLOCK
	DEPHASE
>
;SPECIFIC MACROS FOR VARIOUS CONTROLLERS

IFG M.TM10,<

DEFINE ETMMAC (X) <
TUBIEP::! -2,,TTMICC		;(30) INITIAL ERROR PNTR
TUBFEP::! -2,,TTMFCC		;(31) FINAL ERROR PNTR
TTMICC::! 0		;LAST ERROR INITIAL CONI MTC
TTMICS::! 0		;LAST ERROR INITIAL CONI MTS
TTMFCC::! 0		;LAST ERROR FINAL CONI MTC
TTMFCS::! 0		;LAST ERROR FINAL CONI MTS
>

DEFINE KTMMAC (X) <
TTMCOC::! CONO MT'X'C,(T1)
TTMCOS::! CONO MT'X'S,(T1)
TTMCIC::! CONI MT'X'C,T1
TTMCIS::! CONI MT'X'S,T1
TTMDOS::! DATAO MT'X'S,T1
TTMDIC::! DATAI MT'X'C,T1
TTMBLK::!
IFE	M.MT'X'T,<BLKI MT'X'C,(<BLKO MT'X'C,>)>
IFN	M.MT'X'T,<0>
TTMCHE::! 0		;-1 IF CHANNEL DETECTED ERROR
TTMJSR::!IFN M.MT'X'T,<0>	;JSR FOR TM10A BLKI/O STOP
	 IFE M.MT'X'T,<JSR MT'X'KDB+TTMEND
TTMEND::! 0			;HERE AT END OF DATA XFER
	  CONO 	MT'X'S,1	;STOP TAPE
	  JEN	@MT'X'KDB+TTMEND ;DISMISS INTERUPT
> ;;; END IFE M.MT'X'T
> ;;; END DEFINE KTMMAC
> ;;; END IFG M.TM10

IFG M.TX01,<

DEFINE ETXMAC (X) <
TUBIEP::! -^D20,,TTXIST		;(30) INITIAL ERROR PNTR
TUBFEP::! -^D20,,TTXFST		;(31) FINAL ERROR PNTR
TTXIST::! BLOCK	^D19	;LAST ERROR INITIAL STATUS
TTXISE::! BLOCK	1	;LAST WRD IN INITIAL STAYS
TTXFST::! BLOCK ^D20	;LAST ERROR FINAL STATUS
>

DEFINE KTXMAC (X) <
TTXCOS::! CONO	MT'X'S,(T1)
TTXCIS::! CONI MT'X'S,T1
TTXDOS::! DATAO	MT'X'S,T2
TTXDIS::! DATAI	MT'X'S,T2
TTXTMP::! BLOCK	1		;TEMP LOC FOR DX10
TTXULB::!			;MICROCODE LOADER BLOCK
	 EXP	.BTTX1##	;MICROCODE INDEX
	 XWD	0,-1		;DEVICE CODE,,UNIT NUMBER
	 SIXBIT	/TX01/		;INTERFACE NAME
	 SIXBIT	/DX10/		;CHANNEL NAME
	 EXP	TX1MVR##	;MINIMUM MICROCODE VERSION
	 EXP	0		;DATE/TIME OF LOAD SUCCESS OR FAILURE
	 EXP	0		;MICROCODE VERSION
	 EXP	0		;POINTER TO MAGIC TABLE
	 EXP	0		;MICROCODE LENGTH
	 EXP	0		;MICROCODE ADDRESS
	 CONI	0,T2		;CONI
	 CONO	0,(T2)		;CONO
	 DATAI	0,T2		;DATAI
	 DATAO	0,T2		;DATAO
>
>	;;; END IFG M.TX01
IFG M.TC10,<
DEFINE ETCMAC (X) <
TUBIEP::! -1,,TTCICS		;(30) INITIAL ERROR PNTR
TUBFEP::! -1,,TTCFCS		;(31) FINAL ERROR PNTR
TTCICS::! 0			;LAST ERROR INITIAL STATUS
TTCFCS::! 0			;LAST ERROR FINAL STATUS
>

DEFINE KTCMAC (X) <
TTCCOS::! CONO MT'X'S,(T1)
TTCCIS::! CONI MT'X'S,T1
TTCDOS::! DATAO MT'X'S,T1
TTCDIS::! DATAI MT'X'S,T1
>
>	;;; END IFG M.TC10

DEFINE ET2MAC (X) <
TUBIEP::! -16,,TT2ICS
TUBFEP::! -16,,TT2REG
TT2ICS::! BLOCK 16
TT2REG::! BLOCK 16
>
DEFINE KT2MAC (X) <
>

IFG M.TRH1,<
DEFINE ETRMAC (X) <
TUBIEP::! -16,,TRHICS
TUBFEP::! -16,,TRHREG
TRHICS::! BLOCK 16
TRHREG::! BLOCK 16
>
DEFINE KTRMAC (X) <
TRHVEC::!RH21IV			;;-11 STYLE INTERRUPT VECTOR ADDRESS
TRHBAS::!RH21CA			;;ADDRESS OF RH11 CONTROL REGISTER
				;; ALL OTHER REGISTERS OFFSET FROM HERE
TRHIVI::!XPCW	MT'X'INT	;;INTERRUPT INSTRUCTION

TRHUVA::!0			;;TEMP LOC FOR READ-BACKWARDS
>
>	;;END IFG M.TRH1

IFG M.DX20,<
DEFINE ED2MAC (X) <
..D2LN==.TD2MC+.TD2ES+.TD2MR	;SIZE OF FEP TABLE FOR DX20
TUBIEP::! -1,,TD2IST		;(30) INITIAL ERROR POINTER
TUBFEP::! -..D2LN,,TD2FST	;(31) FINAL ERROR POINTER
TD2IST::! BLOCK 1		;PLACE  HOLDER (NOT USED BY TD2KON)
TD2FST::! BLOCK	..D2LN		;LAST ERROR FINAL STATUS
>
DEFINE KD2MAC (X) <
TKBIVI::!IFN FTAUTC,<0>
IFE FTAUTC,<

	ZZ==4*M.D2'X'T
	IFE ZZ-40,<ZZ==0>
	744400,,ZZ+3
>
TKBCIS::! CONI MT'X'S,T2
TKBDIS::! DATAI MT'X'S,T2
TKBDOS::! DATAO MT'X'S,T2
TD2COS::! CONO MT'X'S,(T2)
TD2ULB::!			;MICROCODE LOADER BLOCK
	 EXP	.BTTX2##	;MICROCODE INDEX
	 XWD	0,-1		;DEVICE CODE,,UNIT NUMBER
	 SIXBIT	/TX02/		;INTERFACE NAME
	 SIXBIT	/DX20/		;CHANNEL NAME
	 EXP	TD2MVR##	;MINIMUM MICROCODE VERSION
	 EXP	0		;DATE/TIME OF LOAD SUCCESS OR FAILURE
	 EXP	0		;MICROCODE VERSION
	 IFIW	TD2MAG##	;POINTER TO MAGIC TABLE
	 EXP	0		;MICROCODE LENGTH
	 EXP	0		;MICROCODE ADDRESS
	 CONI	0,T2		;CONI
	 CONO	0,(T2)		;CONO
	 DATAI	0,T2		;DATAI
	 DATAO	0,T2		;DATAO
>
>	;; END IFG M.DX20
IFG M.TM78,<
DEFINE E78MAC (X) <
TUBIEP::! -50,,T78ICS
TUBFEP::! -50,,T78REG
T78ICS::! BLOCK	47
T78ISE::! BLOCK	1		;LAST WORD IN INITIAL STATISTICS
T78REG::! BLOCK	50
T78ESD::! BLOCK	1		;TEMP USED DURING ERROR SENSE
T78SNS::! BLOCK	1		;INDICATES A SENSE IS IN PROGRESS
>
DEFINE	K78MAC (X) < >
>	;;END IFG M.TM78
;NOW GENERATE THIS WHOLE MESS

%TM10==0
%DX10==0
%TC10==0
%TM02==0
%TM78==0
IFNDEF	TAPTIM,<XP TAPTIM,^D60>	;MAX TIME TO SKIP 10 RECORDS

IFNDEF DSETIM,<XP DSETIM,^D320> ;MAXIMUM TIME TO DO A DATA SECURITY ERASE
IFNDEF NOISE,<XP NOISE,^D12>  ;NOISE RECORD LENGTH IN BYTES
IFNDEF MQUANT,<XP MQUANT,^D10> ;CONSECUTIVE RECORDS
XP	NOISEW,NOISE/4

IFNDEF	TKBICT,<XP TKBICT,2> ;INITIAL FAIRNESS COUNT FOR QUEUED REQUEST
..KON==0		;INITIATE LOOP
$LOCW==ALLDSK		;FIRST AVAILABLE CHL PNTR
$LOCD==0		;DX10 CHL PNTR

IFN FTAUTC,<
TAPDST::0
TAPDEN::0
M.MT0==1
M.MT0T==K.TM2
M.MT0U==1
IFN M.TM02,<
MT0DSP==TM2DSP##
EXTERN TM2KON
>
IFE M.TM02,<		;STILL NEED THE KDB, UDB
MT0DSP==0		; BUT DON'T LOAD TM2KON
>
MT0S==650
TM2KDB::GENKDB(0,KT2MAC)
T2KLEN==:.-TM2KDB
IFN M.TX01,<
M.MT1==1
M.MT1T==K.TX1
MT1DSP==TX1DSP##
EXTERN TX1KON
M.MT1==1
MT1S==650
DX1KDB::GENKDB(1,KTXMAC)
DXKLEN==:.-DX1KDB
>
IFN FTKL10,<
IFN M.DX20,<
M.MT2==1
M.MT2T==K.DX2
MT2DSP=TD2DSP##
EXTERN	TD2KON,DX2COM
M.MT2U==1
MT2S==650
TX2KDB::GENKDB(2,KD2MAC)
TXKLEN==:.-TX2KDB
>
IFN M.TM78,<
M.MT3==1
M.MT3T==K.T78
MT3DSP==T78DSP##
EXTERN T78KON
M.MT3U==1
MT3S==650
T78KDB::GENKDB(3,K78MAC)
T8KLEN==:.-T78KDB
>
>
IFE M.TX01,<
DX1KDB==:0
DXKLEN==:0
DX1UDB==:0
DXULEN==:0
DX1CTG==:0
>
IFE M.DX20,<
TX2KDB==:0
TXKLEN==:0
TX2UDB==:0
TXULEN==:0
TX2CTG==:0
>
IFE M.TM78,<
T78KDB==:0
T8KLEN==:0
T78UDB==:0
T8ULEN==:0
T78CTG==:0
>
IFE FTKL10,<
TX2KDB==:0
TXKLEN==:0
T78KDB==:0
T8KLEN==:0
TX2UDB==:0
TXULEN==:0
TX2CTG==:0
T78UDB==:0
T8ULEN==:0
T78CTG==:0
>
TM2UDB::GENUNI(0,0,ET2MAC)
T2ULEN==:.-TM2UDB
TM2CTG==:0
IFN M.TX01,<
DX1UDB::GENUNI(1,0,ETXMAC)
DXULEN==:.-DX1UDB
DX1CTG==:^D20,,TTXFST
>
IFN FTKL10,<
IFN M.DX20,<
TX2UDB::GENUNI(2,0,ED2MAC)
TXULEN==:.-TX2UDB
TX2CTG==:0
>
IFN M.TM78,<
T78UDB::GENUNI(3,0,E78MAC)
T8ULEN==:.-T78UDB
T78CTG==:20,,T78REG+30
>
>
BYTBIT==1_BYTMOD
M.MT0P==0
GENDDB(0,0)
>
IFE FTAUTC,<
TAPDST::.
REPEAT TAPN,<
	GENTAP(\..KON)	;DO A CONTROLLER
	..KON==..KON+1	;ADVANCE TO NEXT
>
TAPDEN::.-1
>

;RANDOM BYTE PNTRS INTO DATA STRUCTURE

PMTCRC::POINT 9,TUBCHR(U),26	;LAST 9TK CRC (NRZI)
PMTNCR::POINT 3,TUBCHR(U),29	;BYTE RESIDUE OF LAST WORD
PBUFRM::POINT 14,DEVOAD(F),13
;RANDOM STORAGE
IFN FTMP,<
CPUTPQ::0			;COUNT OF CPUS WAITING FOR SWEEP
>
DIATAP::0			;NON-0 IF DIAG IN PROGRESS


>	;;;; END OF IFG TAPN
IFE TAPN,<	;;;; GLOBAL DUMMIES

XP	TPMCTT,CPOPJ##
XP	TAPMIN,CPOPJ##
XP	TAPSEC,CPOPJ##
XP	UTAPOP,CPOPJ##
XP	MTARID,CPOPJ##
XP	MTACHR,CPOPJ##
XP	TPFREE,CPOPJ##
XP	TPMIN,CPOPJ##
XP	MTAPE0,CPOPJ##

TPMSIL::JRST	CPOPJ1##

XP	TDYDN1,0
XP	TPKINI,0
XP	TUBQUE,0
XP	TDVKDB,0
XP	TUYKTP,0
XP	TKBUDB,0
XP	TKBDSP,0
XP	TKBCDB,0
XP	TKBKDB,0
XP	TDVUDB,0
XP	NOISEW,0
XP	TUC7TK,0
XP	TUBDDB,0
XP	TUBCNF,0
XP	PBUFRM,0
XP	TUCD20,0

>	;;; END IFE TAPN
IFE M.TX01,<
TTXCOS::
TTXCIS::JFCL		;DUMMY'S
CCHJGO==:0
TX1TCF==:CPOPJ##
>
IFE M.TM10,<
TTMCIC::
TTMCIS::
TTMCOC::JFCL	;DUMMY'S
>
IFE M.TM02-FTAUTC,<
TT2CO1::
TT2CI2::JFCL
>
IFN M.TRH1,<
TT2CO1::
TT2CI2::JFCL
TKBDIS==:0
TKBDOS==:0
TKBCIS==:0
>
IFE M.TC10,<
TTCCOS::
TTCCIS::JFCL
>
IFE M.TX01+M.TM02+M.DX20+M.TM78,<
TKBDIS==:0
TKBDOS==:0
TKBCIS==:0
>
SUBTTL	DECTAPE DATA BASE FOR DTASER
;DECTAPE ENTRY POINT AND BIT DEFINITIONS

SAVN==1		;OLD FORMAT DECTAPE SYSTEMS NO LONGER SUPPORTED BY DEC.
		; MONGEN NO LONGER ASKS THE DECTAPE FORMAT QUESTIONS.

IFG	M.DTXN, <EXTERN DTASER>	;TD10 WITH NEW FORMAT

;DEFINE SAVE MODE AND EXTENSION FOR OLD OR NEW FORMAT

	IFN	SAVN, <
		SAVDMP==:<SIXBIT /   SAV/>	;EXTENSION FOR SAVED FILES == "SAV"
>

IFE	M.DTXN,<
;IF NO DECTAPES, SATISFY GLOBALS BY DEFINING DUMMIES
	DTASEC==:CPOPJ##
	DTADDB==:CPOPJ##		;THIS WORKS BECAUSE SYSINI DOES A   MOVEI W,DTADDB##
	DTXINI==:0		;              FOLLOWED BY AN       XCT DTXINI##(W)
	DSCON==:0
	LVFLAG==:0
	USEWRD==:0
	DCONS==:0
	DTADSP==:0

	OWNDTC==:CPOPJ##
	SCDDT==:CPOPJ##
	DTXFRE==:CPOPJ##

	$HIGH
UNWDTC::
	SETZ	T3,
	POPJ	P,
	$LOW

>
DEFINE	DTDDB(X,Y,CPUN)<

SUBTTL INTERRUPT HEAD FOR DT'X
			;FLAGS LEVEL CODE
;CONTROL DEPENDENT PORTION OF DECTAPE SERVICE
DEFINE CDC (C,B) <

C=:.-DT'X'DDB	;RELATIVE LOCATION WITHIN CONTROL BLOCK
	B>

;MODEL DEVICE DATA BLOCK
DTXDDB=:.-DT'X'DDB

DT'X'DDB::SIXBIT	/DT'X'0/ ;(0) - DEVNAM
	XWD	<^D6*HUNGST>,200 ;(1) - DEVCHR
	0			;(2) - DEVIOS
	EXP	DTADSP##	;(3) - DEVSER
	XWD	1107,154403	;(4) - DEVMOD
	0			;(5) - DEVLOG
	0			;(6) - DEVBUF
	0			;(7) - DEVIAD
	0			;(10) - DEVOAD
	0			;(11) - DEVSTS
	XWD	.TYDTA,0	;(12) - DEVSTA
	0			;(13) - DEVXTR
	0			;(14) - DEVEVM
	0			;(15) - DEVPSI
	0			;(16) - DEVESE
	0			;(17) - DEVHCW
	BYTE	(3)CPUN(33)0	;(20) - DEVCPU
	0			;(21) - DEVISN
	0			;(22) - DEVJOB
	0			; - DEVFIL
	0			; - DEVEXT
	0			; - FSTBLK
	DT'X'DIR+DT'X'DDB	; - DLOC
	0			; - IBLK
	0			; - OBLK
	0			; - DISPAD
	0			; - DMPLST
	0			; - SVDWRD
	0			; - DJOTOP
	0			; - DJOBOT
	0			; - BADCOM



DT'X'DIR==:.-DT'X'DDB
	BLOCK	200
	XP	DT'X'DDS,.-DT'X'DDB
;DATA LEVEL CODE...CHANNEL 1 OR 2 USUALLY

D'X'DINT::CONSO	DAS,1		;DATA INTERRUPT FOR THIS CONTROL?
	JRST	.		;NO- PROCEED DOWN CHAIN
	SKIPN	DT'X'USE	;EXPECTING AN INTERRUPT?
	JRST	D'X'DINT+1	;NO, IGNORE IT

	SKIPE	D'X'DSRC	;ARE WE SEARCHING FOR BLOCK NUMBERS?
	JRST	D'X'SRCH	;YES
D'X'IOWD:BLKI	DAC,DT'X'PNT	;EXECUTE BLKI OR BLKO FOR THIS UNIT
	JRST	D'X'DTHR	;POINTER RAN OUT
D'X'DCTN:JFCL			;GOING REVERSE?
	XJEN	D'X'DCHL##

	SOS	DT'X'PNT	;YES- DECREMENT POINTER
	SOS	DT'X'PNT	;TWICE
	XJEN	D'X'DCHL##

D'X'DTHR:SKIPE	D'X'DDMP	;DUMP MODE POINTER RAN OUT?
	JRST	D'X'DMPA	;YES- ADVANCE POINTER
D'X'DFNS:CONO	DAS,770001	;SEND OUT FUNCTION STOP IF THROUGH
	XJEN	D'X'DCHL##


D'X'DSRC:CDC	DTXSRC,0	;SET NEGATIVE WHEN READING BLOCK NUMBERS

;HERE WHEN READING BLOCK NUMBERS AT DATA INTERRUPT LEVEL

D'X'SRCH:JSR	D'X'DSAV##	;SAVE ACS
D'X'CCNC:CONI	DAC,W		;READ FLAGS REGISTER
	HRLZS	W		;PUT MOST FLAGS INTO LEFT HALF
	HRRI	W,DT'X'DDB	;POINT TO THIS CONTROL BLOCK
	JRST	SRCH##		;DO THE SEARCH

D'X'DMPA:JSR	D'X'DSAV##	;SAVE ACS
	HRRZI	W,DT'X'DDB	;POINT TO CONTROL A
	JRST	DMPADV##	;PROCESS THE EXHAUSTED BLKI/O

	XP	DTSFNS,D'X'DFNS-DT'X'DDB
	XP	DXDINT,D'X'DINT-DT'X'DDB
	XP	DXIOWD,D'X'IOWD-DT'X'DDB
	XP	DXDCTN,D'X'DCTN-DT'X'DDB
D'X'CNUM:CDC	DXCNUM,<<DAC>B11>;CONTROL NUMBER

	XP	DTXCNC,D'X'CCNC-DT'X'DDB
;FLAGS LEVEL INTERRUPT HEAD...
DT'X'INT::CONSO	DAS,770000	;INTERRUPT FOR THIS CONTROL?
	JRST	.		;NO- PROCEED DOWN CHAIN
	SKIPN	DT'X'USE
	JRST	DT'X'INT+1
	JSR	DT'X'SAV##	;YES- SAV ACCUMULATORS FOR THIS LEVEL
	CDC	DXCCNT,<CONI DAC,T1>;READ FLAGS INTO T1
	CDC	DTSCNI,<CONI DAS,T4>;READ STATUS INTO T4
	HRLZI	W,(T1)		;PUT FLAGS (RH) INTO W (LH)
	HRRI	W,DT'X'DDB	;ADDRESS OF CONTROL DEPENDANT BLOCK
	JRST	DTXINT##	;TO NON-CONTROL DEPENDANT SECTION

	CDC	DTSCN2,<CONI DAS,T1>;STATUS REGISTER INTO T1

;CONSTANTS REQUIRED FOR EACH CONTROL...
	CDC	BFPNTR,<IOWD 200,D'X'BUF+1>
DT'X'USE:CDC	USEWRD,0
	CDC	ADRPRG,0
DT'X'PNT:CDC	PNTR,0
	CDC	DISTNC,0
	CDC	BLOCK,0
	CDC	QUANTM,0
	CDC	DSCON,0
	CDC	RVERS,0
	CDC	ERRCNT,0
	CDC	FNDTMP,0
	CDC	IOWRIT,0
	CDC	TURNCT,0
	CDC	BLKWRD,0
	CDC	LVFLAG,0
	CDC	BLKCNT,0
	CDC	SVPNTR,0
	CDC	USPNTR,0
	CDC	DIRCTN,0
	DT'X'BUF=.-DT'X'DDB
D'X'BUF:CDC	BUF,<BLOCK 200>	;A CONTROL MONITOR BUFFER
	CDC	DTXCON,<CONO DAC,(T1)>	;CONDITIONS OUT - A CONTROL A
	CDC	DTXSTP,<CONO DAC,400000>	;STOP SELECTED TAPE
	CDC	DTXTRN,<CONO DAC,DTTURN##>	;TURN SELECTED TAPE AROUND
	CDC	DTSCO2,<CONO DAS,2(T4)>
	CDC	DTSENJ,<CONO DAS,670000>	;ENABLE JOB DONE

	CDC	DTXREQ,-1		;# OF WAITERS
	CDC	DTXWAT,0		;REQUEST INTERLOCK FOR THIS CONTROL

D'X'DDMP:CDC	DTXDMP,0	;SET TO -1 WHEN READING IN DUMP MODE
	XP	DTXIOG,.-DT'X'DDB
	CONO	DAC,DTBOTH##(T2)	;START UP DECTAPE
	CONO	DAS,770000	;ENABLE INTERRUPT CONDITIONS
	POPJ	P,		;RETURN
	CDC	DTXSF,<CONSZ DAC,100000>	;SKIP IF GOING FORWARD
	CDC	DTXDSL,<CONO DAC,410000>	;STOP AND DESELECT TAPE
	CDC	DTXDST,<CONO DAC,10000>	;DESELECT TAPE
	CDC	DTXSTO,<CONO DAC,430000(T1)>	;STOP AND DESELECT
	CDC	DTXTR2,<CONO DAC,230200(T1)>	;TURN TAPE, SEARCH FOR BLOCKS
	CDC	DTXINI,<CONO DAC,0>	;SHUT DOWN CONTROL
	CDC	DTXDTI,<DATAI DAC,T1>	;READ A BLOCK NUMBER

	XP	DCONS,.-DT'X'DDB
>;END DEFINE DTDDB

DEFINE	GENDTA(CPU,CPUN)<
	ZZZZ==0
	REPEAT	M'CPU'TD10,<
		IFE ZZZZ&1,<DAC==320>
		IFN ZZZZ&1,<DAC==330>
		DAS==DAC+4
		DTDDB (\"ZZZ,\<ZZZ&7>,CPUN)
		ZZZ==ZZZ+1
		ZZZZ==ZZZZ+1
	>;END REPEAT M'CPU'TD10
>;END DEFINE GENDTA

ZZ==0
ZZZ=="A"
REPEAT	M.CPU,<
	GENDTA (\ZZ,ZZ)
	ZZ==ZZ+1
>;END REPEAT M.CPU
KONEND::		;END OF KONTROLLER DATA BLOCKS


;DDB MAGIC CELLS
FSTBLK==:DEVPPN
DLOC==:FSTBLK+1	;LH==BLOCK# DURING DEAD RECKONING,RH==ADDRESS OF DIR
IBLK==:FSTBLK+2	;LH==INDEX OF INPUT FILE(1-27),RH==BLOCK# TO READ NEXT
OBLK==:FSTBLK+3
DISPAD==:FSTBLK+4
DMPLST==:FSTBLK+5
SVDWRD==:FSTBLK+6
DJOTOP==:FSTBLK+7
DJOBOT==:FSTBLK+10
BADCOM==:FSTBLK+11
	SUBTTL	Database for RX20s on 2020s

IFN FTKS10&M.RX20,<

	EXTERN	RX2SER			;Load device driver

	;Macro to define prototype DDB for each RX20 CTLlr (RXA,RXB,...)

	DEFINE	RX2DDB(x,CPU),<

RX'x'INT::EXP	0,0,IC.UOU,.+1		;Vectored interrupts XPCW here
	EXCH	T1,RX'x'INT		;Get interrupt PC
	MOVEM	T1,RX'x'CHL##		;Save for RESn
	MOVE	T1,RX'x'INT+1		;;Second word of PC
	MOVEM	T1,RX'x'CHL##+1		;;...
	MOVE	T1,RX'x'INT		;Restore state
	JSR	RX'x'SAV##		;Save ACs
	JSP	F,RX2INT##		;Set up F and join RX2SER
RX'x'DDB::PHASE	0
	EXP	<SIXBIT/RX'x'0/>	;(0) DEVNAM for prototype DDB this CTL
	XWD	<^D5*HUNGST>,201	;(1) DEVCHR
	EXP	0			;(2) DEVIOS
	EXP	RX2DSP##		;(3) DEVSER
	XWD	DVLNG!DVIN!DVOUT,^D<1B<35-I>> ;(4) DEVMOD
	EXP	0			;(5) DEVLOG
	EXP	0			;(6) DEVBUF
	EXP	0			;(7) DEVIAD
	EXP	0			;(10) DEVOAD
	EXP	0			;(11) DEVSTS
	XWD	DEPLEN!.TYRX2,DEPEVM	;(12) DEVSTA
	EXP	0			;(13) DEVXTR
	EXP	0			;(14) DEVEVM
	EXP	0			;(15) DEVPSI
	EXP	0			;(16) DEVESE
	EXP	0			;(17) DEVHCW - Hard errors,,Soft errors
	BYTE	(3)CPU(33)0		;(20) DEVCPU
	EXP	0			;(21) DEVISN (Must leave space)
	EXP	0			;(22) DEVJOB
	EXP	0			;(23) DEVFIL
	EXP	0			;(24) DEVEXT
	EXP	0			;(25) DEVPPN
DEVRXO::!EXP	0			;(26) DEVRXO
DEVRXI::!EXP	0			;(27) DEVRXI
DEVRXQ::!EXP	0,0,0,0			;(30) DDB and CSR queue element
RX'x'DDS::!				;End of device DDB
DEVRXS::!EXP	0			;DEVRXS ;Start of CTL data
DEVRXV::!EXP	RX21IV+<<"x"-"A">*4>	;Interrupt vector
DEVRXC::!EXP	RX21BA+<<"x"-"A">*10>	;CSR address
DEVRXM::!EXP	RX2IMR##+<<"x"-"A">*2>	;UBA mapping reg addr (2 slots/RX)
DEVRXE::!EXP	RX2IEA##+<<"x"-"A">*UBAMUL> ;11 address of mapped buffer
DEVRXJ::!XPCW	RX'x'INT		;Instruction to set up vector table with
	Dephase
>;End of define RX2DDB
DEFINE	GENRX2(CPU,CPUN)<
	ZZZZ==0
	REPEAT	M'CPU'RX20,<
		RX2DDB (\"ZZZ,CPUN)
		ZZZ==ZZZ+1
		ZZZZ==ZZZZ+1
	>;;End repeat
>;End define

ZZ==0
ZZZ=="A"
REPEAT	M.CPU,<
	GENRX2 (\ZZ,ZZ)
	ZZ==ZZ+1
>;End repeat
>;End FTKS10&M.RX20
SUBTTL	MACRO TO GENERATE UNIT RECORD EQUIPMENT DDBS

DEFINE	GENDDS(DEV,DV)<

	$CPNNN==0
	$'DV'NUM==0
	REPEAT	M.CPU,<
		$'DEV'NM==0
		GENDDB(DEV,DV,\$CPNNN,$CPNNN)
		$CPNNN==$CPNNN+1
	>
>

DEFINE	GENDDB(DEV,DV,CPU,N)<

	REPEAT	M'CPU'DEV,<
		EXTERN	DEV'SER
		DEV'DDB	\$'DV'NUM,\$'DEV'NM,CPU,N
		$'DV'NUM==$'DV'NUM+1
		$'DEV'NM==$'DEV'NM+1
	>
>
SUBTTL	CARD READER DDB DEFINITIONS
IFE FTKS10,<IFG CDRN,<

DEFINE	CDRDDB	(N,P,CPU,CPUN) <
	XLIST
	CDR2==154		;DEVICE SELECTION CODE FOR SECOND CDR
	IFNDEF	CR'CPU'0,<CR'CPU'0==CR>   ;DEFINE STANDARD MNEMONIC DEFINITIONS
	IFNDEF	CR'CPU'1,<CR'CPU'1==CDR2> ; BUT ALLOW FOR OVERRIDE

CR'N==CR'CPU'P
CR'N'SV1==CR'N'SAC##+F		;DEFINE F SAVE LOCATION

CDRCON==:.-CR'N'DDB
CR'N'INT::CONSO	CR'N,0		;(-4) SKIP IF INTERRUPT FOR THIS READER
	  JRST	.-1		;(-3) NOT HERE, CONTINUE DOWN THE CHAIN
	  MOVEM	F,CR'N'SV1	;(-2) SAVE F IN CHANNEL SAVE AREA
	  JSP	F,CDRINT##	;(-1) SET F TO DDB ADDRESS AND SERVICE INTERRUPT
CR'N'DDB::
CR'N'NAM:	CRNAM=SIXBIT/CDR/
	IFE	CDRN+DCDRN-1,<CRNAM>	;(0) PHYSICAL DEVICE NAME
	IFN	CDRN+DCDRN-1,<CRNAM+<20+$CRNUM>B23>	;(0) PHYSICAL DEVICE NAME
	XWD	2*HUNGST,	;(1) DEVICE CHARACTERISTICS
CDRIOS==:.-CR'N'DDB
	0			;(2) DEVIOS
	CDRDSP##		;(3) LH=DDB LINK, RH=CDR DISPATCH TABLE
	XWD	DVCDR+DVIN,14403;(4) DEVICE CHARACTERISTICS
	0			;(5) LOGICAL DEVICE NAME (DEVLOG)
	0			;(6) BUFFER HEADER ADDRESSES
CDRIAD==:.-CR'N'DDB
	0			;(7) ADDRESS OF CURRENT INPUT BUFFER
CDRPTR==:.-CR'N'DDB
	0			;(10) BYTE POINTER TO CURRENT INPUT BUFFER
CDRSTS==.-CR'N'DDB
CR'N'STS: 0			;(11) LATEST CONI STATUS BITS
	XWD	.TYCDR!.SPCDR,0	;SPOOLED CDR
	0			;DEVXTR
	0			;DEVEVM
	0			;DEVPSI
	0			;DEVESE
	1B11			;DEVHCW (BA10)
	BYTE	(3)CPUN(33)0	;DEVCPU
	0			;DEVISN
	<N>B17			;UNIT+DEVJOB
CDRCTR==:.-CR'N'DDB
	0			;BYTE COUNTER FOR IDPB'S INTO USER'S BUFFERS
CDRCHK==:.-CR'N'DDB
	0			;CHECK SUM OF CURRENT INPUT BINARY CARD
CDRCNT==:.-CR'N'DDB
	0			;# OF CARDS READ
CDRADR==:.-CR'N'DDB
	0			;USER'S JOBDAT ADDRESS
CDRCOL==:.-CR'N'DDB
	CF'N'CHN##-CR'N'CHN##	;COLUMN COUNT ON CURRENT CARD
CDRSUP==:.-CR'N'DDB		;BLKI POINTER TO USER'S BUFFER
CR'N'SUP: 0			; FOR SUPER IMAGE MODE INPUT

CDRMIS==:.-CR'N'DDB
	0			;FLAG =-1 IF MISSED DATA ON CURRENT CARD
CDRSPU==:.-CR'N'DDB		;COUNT OF SPURIOUS END-OF-CARD FLAGS
	0			; TO CHECK ON POSSIBLE HARDWARE PROBLEM
CDRSV2==:.-CR'N'DDB
	0			;SAVE LOCATION FOR U
CDRCH==:.-CR'N'DDB
	EXP	CR'N'CHN##
CDRBKI==:.-CR'N'DDB
	BLKI	CR'N,CR'N'SUP

CDRCNO==:.-CR'N'DDB
	CONO	CR'N,(U)
CDRCSO==:.-CR'N'DDB
	CONSO	CR'N,(U)
CDRCSZ==:.-CR'N'DDB
	CONSZ	CR'N,(U)
CDRDTI==:.-CR'N'DDB
	DATAI	CR'N,U
CDRRDY==:.-CR'N'DDB
	CONSO	CR'N,IDRDY##	;SKIP IF DATA READY
CDRRTR==:.-CR'N'DDB
	CONSZ	CR'N,NOTRDY##	;SKIP IF READY TO READ
CDRSVE==:.-CR'N'DDB
CR'N'SVE: 0			;ROUTINE TO SAVE AC'S
	MOVE	F,CR'N'SV1	;RESTORE F
	JSR	CR'N'SAV##	;SAVE AC'S AND ESTABLISH P
	MOVEI	F,CR'N'DDB	;SET UP DDB ADDRESS
	JRST	@CR'N'SVE	;AND RETURN
CDREX1==:.-CR'N'DDB
	MOVE	F,CR'N'SV1	;RESTORE F
	XJEN	CR'N'CHL##

CRFCON==:.-CR'N'DDB
CF'N'INT::CONSO	CR'N,0		;SKIP IF CDR FLAG
	JRST	.-1		;NOT THIS, CONTINUE DOWN SKIP CHAIN
	JSR	CF'N'SAV##	;SAVE AC'S
	MOVEI	F,CR'N'DDB	;SET UP F
	JRST	CRFINT##	;AND SERVICE INTERRUPT
CRXSTS==:.-CR'N'DDB
	CONI	CR'N,CR'N'STS

	LIST
	>	;END DEFINE CDRDDB

	GENDDS	CDR,CR
> ;END IFG CDRN


IFG DCDRN, <				;ONLY NEED THIS IF FRONT-END CARD READERS

DEFINE	DCRDDB	(CPUN,N,U,D) <

FC'N'DDB::
	CRNAM==SIXBIT/CDR/
	IFE CDRN+DCDRN-1,<CRNAM>	;(0) DEVNAM
	IFN CDRN+DCDRN-1,<CRNAM+<20+$CRNUM>B23> ;(0) DEVNAM
	XWD	2*HUNGST,		;(1) DEVCHR
	0				;(2) DEVIOS
	DCRDSP##			;(3) LH=DDB LINK, RH=DISPATCH TABLE
	XWD	DVCDR+DVIN,14403	;(4) DEVMOD
	0				;(5) DEVLOG
	0				;(6) DEVBUF
	0				;(7) DEVIAD
	0				;(10) DEVPTR
	0				;(11) DEVSTS
	XWD .TYCDR!.SPCDR,0		;(12) DEVSPL
	0				;(13) DEVXTR
	0				;(14) DEVEVM
	0				;(15) DEVPSI
	0				;(16) DEVESE
	EXP	3B11			;(17) DEVHCW (CD20)
	BYTE	(3)CPUN(33)0		;(20) DEVCPU
	0				;(21) DEVISN
	<N>B17				;(22) PUNIT+DEVJOB
	0				;(23) DEVCTR
DCRDUX==:.-FC'N'DDB
	XWD	U,D			;(24) LINE NUMBER,,DTE INDEX
CDRCNT==:.-FC'N'DDB
	0				;(25) CARD COUNT
DCRBUF==:.-FC'N'DDB
	BLOCK	^D40			;(26) BUFFER FOR READING A CARD
>
	EXTERN	DCRSER

DEFINE	RSXDTE	(C,D)	<
	$CRUNT==0
  REPEAT M'C'CR'D'N,<
	DCRDDB	\C,\<$CRNUM-CDRN>,$CRUNT,$DTNDX
	$CRUNT==$CRUNT+1
	$CRNUM==$CRNUM+1
  >
	$DTNDX==$DTNDX+1
>


	$CRNUM==CDRN			;START NUMBERING DCB'S AT CDRN
	$DTNDX==0			;DTE INDEX STARTS AT 0

	RSX20F				;GENERATE THE FRONT END READER DDB'S
>	;END IFN DCDRN

IFN FTKL10,<
IFE M.DCR,<
FCRDSP==:EATDSP##	;IGNORE CDR MESSAGES
> ;END M.DLP
> ;END FTKL10
> ;END IFE FTKS10
IFN FTKS10,<

	IFN CDRN,<

DEFINE CDRDDB (N) <

	XLIST				;TURN OFF LISTING DURING EXPANSION

CR'N'INT::0				;INTERRUPT JSR'S TO HERE
	EXP	0,IC.UOU,.+1		;XPCW BLOCK

	EXCH	T1,CR'N'INT		;GET INTERRUPT PC
	MOVEM	T1,CR'N'CHL##		;PUT INTO -10 STYLE INTERRUPT HANDLER
	MOVE	T1,CR'N'INT+1		;SECOND WORD
	MOVEM	T1,CR'N'CHL##+1		;XJEN
	MOVE	T1,CR'N'INT		;AND RESTORE T1
	JSR	CR'N'SAV##		;SAVE AC'S
	JSP	F,CDRINT##		;SET UP F AND GO TO INTERRUPT CODE
CR'N'DDB::PHASE 0
	CRNAM==SIXBIT/CDR/
	IFE CDRN-1,<CRNAM>		;(0) DEVNAM
	IFN CDRN-1,<CRNAM+<20+$CRNUM>B23>
	XWD	2*HUNGST,0		;(1) DEVCHR
	0				;(2) DEVIOS
	CDRDSP##			;(3) DEVSER
	XWD	DVCDR+DVIN,14403	;(4) DEVMOD
	0				;(5) DEVLOG
	0				;(6) DEVBUF
	XWD	R,0			;(7) DEVIAD (DEVADR)
	0				;(10) DEVOAD (DEVPTR)
	0				;(11) DEVSTS
	XWD	.TYCDR!.SPCDR,0		;(12) DEVSTA
	0				;(13) DEVXTR
	0				;(14) DEVEVM
	0				;(15) DEVPSI
	0				;(16) DEVESE
	EXP 3B11			;(17) DEVHCW
	BYTE	(3)CPUN(33)0		;(20) DEVCPU
	0				;(21) DEVISN
	0				;(22) DEVJOB
	0				;(23) DEVCTR
CDRCHK::!0				;CHECKSUM OF CURRENT INPUT BINARY CARD
CDRCNT::!0				;# OF CARDS READ
CDRDAP::!0				;PLACE TO BUILD AOBJN POINTER TO CDRDAE
CDRDAE::!BLOCK 11			;SYSERR BLOCK
CDRVEC::!CDRIVT				;-11 STYLE INTERRUPT VECTOR ADDRESS
CDRBAS::!CD11BA				;CD20 BASE DEVICE ADDRESS
CDRIVI::!XPCW	CR'N'INT		;INTERRUPT INSTRUCTION FOR THIS CDR

CDRCDB::! CHNMAC(\M.CD'N'C)		;POINTER TO CHANNEL DATA BLOCK
CDRBUF::!BLOCK ^D40			;INTERNAL BUFFER FOR ONE CARD
	DEPHASE
	LIST
>;END DEFINE CDRDDB
	EXTERNAL CD2SER			;HAUL IN THE SERVICE ROUTINE

	$CRNUM==0			;CDR NUMBER SYMBOL

IFG CDRN-1,<PRINTX KS10 MONITOR DOES NOT SUPPORT MORE THAN ONE CDR>

	REPEAT CDRN,<

	CDRDDB	\$CRNUM
	$CRNUM==$CRNUM+1
	>

>;END IFG CDRN
>;END IFN FTKS10
SUBTTL	CARD READER TRANSLATION TABLES

;IF THERE ARE REMOTE OR LOCAL READERS, CERTAIN BYTE POINTERS
;  AND THE CHARACTER TRANSLATION TABLES MUST BE DEFINED.

IFN CDRN+DCDRN+M.RCDR,<

XP PCDRAS,700			;ASCIZ BYTE POINTER
XP PCDRBI,1400			;BINARY AND IMAGE BYTE POINTER
XP PCDRSI,4400			;SUPER IMAGE BYTE POINTER

;THE CHARACTER TRANSLATION TABLES:
	$HIGH
CRCVPT::XWD	350700+T2,CRCVTB
	XWD	260700+T2,CRCVTB
	XWD	170700+T2,CRCVTB
	XWD	100700+T2,CRCVTB

;CODE CONVERSION FOR THE 029 KEYPUNCH
;THE FOLLOWING EQUIVALENCES ARE ARTIFICIALLY DEFINED

;029 KEYTOP	;ASCII 35	;ASCII 37
;CENT		[		[
;0-8-2		]		]
;VERT BAR	^		HAT = L.C. VERT BAR
;UNDERBAR	_		UNDERBAR
;NEGATION	\		TILDE = L.C. NEGATION

	;CHARACTERS	;ZONE/DIGITS
CRCVTB:	ASCII	/ 123/		;N/N-3
	ASCII	.0/ST.		;0/N-3
	ASCII	/-JKL/		;11/N-3
	ASCII	/HI[./		;12,8/N-3
	ASCII	/&ABC/		;12/N-3
	ASCII	/QR]$/		;11,8/N-3
	ASCII	/YZ\,/		;0,8/N-3
	ASCII	/89:#/		;8/N-3
	ASCII	/4567/		;N/4-7
	ASCII	/UVWX/		;0/4-7
	ASCII	/MNOP/		;11/4-7
	ASCII	/<(+!/		;12,8/4-7
	ASCII	/DEFG/		;12/4-7
	ASCII	/*);^/		;11,8/4-7
	ASCII	/%_>?/		;0,8/4-7
	ASCII	/@'="/		;8/4-7

;CODE FOR THE 026 KEYPUNCH A LA H HYMAN

	ASCII	/ 123/		;N/N-3
	ASCII	.0/ST.		;0/N-3
	ASCII	/-JKL/		;11/N-3
	ASCII	/HI?./		;12,8/N-3
	ASCII	/+ABC/		;12/N-3
	ASCII	/QR:$/		;11,8/N-3
	ASCII	/YZ;,/		;0,8/N-3
	ASCII	/89_=/		;8/N-3
	ASCII	/4567/		;N/4-7
	ASCII	/UVWX/		;0/4-7
	ASCII	/MNOP/		;11/4-7
	ASCII	/)]<!/		;12,8/4-7
	ASCII	/DEFG/		;12/4-7
	ASCII	/*[>&/		;11,8/4-7
	ASCII	/("#%/		;0,8/4-7
	ASCII	/@^'\/		;8/4-7
	$LOW
>	;END OF IFN RCDRN+M.RCDR
SUBTTL CARD PUNCH DDB DEFINITIONS
	IFG	CDPN, <

DEFINE	CDPDDB	(N,P,CPU,CPUN) <
	XLIST

	IFNDEF CP'CPU'0,<CP'CPU'0==CDP>

CP'N=CP'CPU'P

CP'N'SV1==CP'N'SAC##+F		;DEFINE F SAVE LOCATION

CDPCON==:.-CP'N'DDB
CP'N'INT::CONSO	CP'N,0		;(-4) SKIP IF INTERRUPT FOR THIS READER
	  JRST	.-1		;(-3) NOT HERE, CONTINUE DOWN THE CHAIN
	  MOVEM	F,CP'N'SV1	;(-2) SAVE F IN CHANNEL SAVE AREA
	  JSP	F,CDPINT##	;(-1) SET F TO DDB ADDRESS AND SERVICE INTERRUPT
CP'N'DDB::
CP'N'NAM:	CDPNAM=SIXBIT/CDP/
	IFE	CDPN-1,<CDPNAM>	;(0) PHYSICAL DEVICE NAME
	IFN	CDPN-1,<CDPNAM+<20+$CPNUM>B23>	;(0) PHYSICAL DEVICE NAME
	XWD	4*HUNGST,41	;(1) CODE 4 - HUNG TIME IS 15 SECONDS
CDPIOS==:.-CP'N'DDB
	0			;(2) DEVIOS
	CDPDSP##		;(3) LH=DDB LINK, RH=CDP DISPATCH TABLE
	XWD	DVCDR+DVOUT,14403	;(4) DEVICE CHARACTERISTICS
	0			;(5) LOGICAL DEVICE NAME (DEVLOG)
CDPBUF==:.-CP'N'DDB
	0			;(6) BUFFER HEADER ADDRESSES
CDPNTR==:.-CP'N'DDB
	0			;(7) BYTE POINTER TO CURRENT OUTPUT BUFFER
CDPOAD==:.-CP'N'DDB
	0			;(10) ADDRESS OF CURRENT OUTPUT BUFFER
CDPSTS==.-CP'N'DDB
CP'N'STS: 0			;(11) LATEST CONI STATUS BITS
	XWD	.TYCDP!.SPCDP,0	;SPOOLABLE, PUNCH
	0			;DEVXTR
	0			;DEVEVM
	0			;DEVPSI
	0			;DEVESE
	3B11			;DEVHCW (LP20)
	BYTE	(3)CPUN(33)0	;DEVCPU
	0			;DEVISN
	<N>B17			;PUNIT+DEVJOB
CDPCTR==:.-CP'N'DDB
	0			;BYTE COUNTER FOR ILDB'S FROM USER'S BUFFERS
CDPCNT==:.-CP'N'DDB
	0
CDPOCT==:.-CP'N'DDB
	0
CDPOPT==:.-CP'N'DDB
	0
CDPTMP==:.-CP'N'DDB
	CG'N'CHN##-CP'N'CHN##
CDPECT==:.-CP'N'DDB
	0
CDPFCD==:.-CP'N'DDB
	0
CDPFCT==:.-CP'N'DDB
	0
CDPCCT==:.-CP'N'DDB
	0
CDPSVJ==:.-CP'N'DDB
	0
CDPSVT==:.-CP'N'DDB
	0
CDPEOC==:.-CP'N'DDB
	0
CDPBNB==:.-CP'N'DDB
	EXP	50000
CDPBUF==:.-CP'N'DDB
	BLOCK	33
CDPCH==:.-CP'N'DDB
	EXP	CP'N'CHN##	;CDP PIA
CDP10D==:.-CP'N'DDB
	EXP	M'CPU'CP1D	;1 IF CP10D, 0 IF CP10A
CDPCNO==:.-CP'N'DDB
	CONO	CP'N,(U)
CDPOAT==:.-CP'N'DDB
	CONSO	CP'N,474000	;CHECK FOR TROUBLE
CDPZTE==:.-CP'N'DDB
	CONSZ	CP'N,4100	;EOC OR TROUBLE?
CDPZPE==:.-CP'N'DDB
	CONSZ	CP'N,1000	;PUNCH ERROR?
CDPZTB==:.-CP'N'DDB
	CONSZ	CP'N,CI.TRB##	;TROUBLE?
CDPZER==:.-CP'N'DDB
	CONSZ	CP'N,CI.ERR##	;ERROR?
CDPZCP==:.-CP'N'DDB
	CONSZ	CP'N,CI.CIP##	;CARD IN PUNCH?
CDPOTN==:.-CP'N'DDB
	CONSO	CP'N,470000	;TROUBLE BUT DON'T RESET BUFFERS?
CDPOER==:.-CP'N'DDB
	CONSO	CP'N,CI.ERR##	;ERROR?
CDPDOU==:.-CP'N'DDB
	DATAO	CP'N,U
CDPDFC==:.-CP'N'DDB
	DATAO	CP'N,CDPFCD(F)
CDPDSV==:.-CP'N'DDB
	DATAO	CP'N,SEVENS##
CDPEX1==:.-CP'N'DDB
	MOVE	F,CP'N'SV1	;RESTORE F
	XJEN	CP'N'CHL##

CPFCON==:.-CP'N'DDB
CG'N'INT::CONSO	CP'N,0		;SKIP IF CDP FLAG
	JRST	.-1		;NOT THIS, CONTINUE DOWN SKIP CHAIN
	JSR	CG'N'SAV##	;SAVE ACS
	MOVEI	F,CP'N'DDB	;SETUP F
	JRST	CPFINT##	;AND SERVICE INTERRUPT
CPFCH==:.-CP'N'DDB
	EXP	CG'N'CHN##
CDPXSTS==:.-CP'N'DDB
	CONI	CP'N,CP'N'STS

	LIST
>;END CDPDDB



	GENDDS	CDP,CP

>;END IFG CDPN

SUBTTL	DK10 BITS AND DDB DEFINITIONS


;-------DK10 BITS

RTC==	070	;DEVICE ASSIGNMENT
		;CONO BITS
DK.OSO==1B23	;SET COUNT OVERFLOW
DK.OCO==1B31	;CLEAR COUNT OVERFLOW
DK.OSD==1B24	;SET DONE
DK.OCD==1B32	;CLEAR DONE
DK.OSU==1B28	;SET USER TIME
DK.OCU==1B27	;CLEAR USER TIME
DK.OON==1B30	;TURN CLOCK ON
DK.OOF==1B29	;TURN CLOCK OFF
DK.OIC==1B25	;INCREMENT CLOCK(IF OFF)
DK.OCC==1B26	;CLEAR CLOCK(COUNTER,DONE,OVF.,USER,PIA)
		;CONI BITS
DK.IO== 1B31	;OVERFLOW FLAG (INTERRUPT)
DK.ID== 1B32	;DONE FLAG (INTERRUPT)
DK.IU== 1B28	;USER TIME
DK.ION==1B30	;CLOCK ON
DK.IXS==1B26	;EXTERNAL SOURCE
;PROTOTYPE DK10 DDB

DEFINE RTCDEF(N),<
RTCNUM==RTCNUM+M.RT'N

XP C'N'RTC,0
IFG M.RT'N,<XP C'N'RTC,RT'N'DDB>
XP C'N'RTD,0
>

RTCNUM==0
ZZ==0
REPEAT M.CPU,<
	RTCDEF	\ZZ
ZZ==ZZ+1
>
DEFINE	RTCDDB	(N,DEVCOD)<


RT'N'SVF==RT'N'SAC##+F		;DEFINE SAVE LOC. FOR F
RT'N'SVT==RT'N'SAC##+T1		;SAVE LOC. FOR T1
RT'N==:DEVCOD			;DEFINE DEVICE CODE
RT'N'DTI==:(DATAI RT'N,)	;DATAI FOR EXTERNAL USE (E.G. RT'N'DTI##,,ADDR)


;----	INITIALIZATION ROUTINE (JSR RTCINI(F))
RT'N'INI:	0
	CONO	RT'N,DK.OCC	; CLEAR THE CLOCK
	DATAO	RT'N,RT'N'PRD	; SET PERIOD
	CONO	RT'N,DK.OON+RT'N'CHN##	; & START CLOCK
	JRST	@RT'N'INI

;----	EXIT ROUTINE (JRST RTCXIT(F))
RT'N'XIT:CONO	RT'N,DK.OCO+DK.OCD+RT'N'CHN##  ;CLEAR IRP.
	MOVE	F,RT'N'SVF	; RESTORE F & T1
	MOVE	T1,RT'N'SVT
	JEN	@RT'N'CHL##	; & DISMISS

;----	INTERRUPT ROUTINE
RT'N'INT::CONSO	RT'N,DK.IO+DK.ID	; INTERRUPT FOR THIS DK10 (OVERFLOW OR DONE?)
	JRST	.-1		; NO
	MOVEM	F,RT'N'SVF	; YES - SAVE F & T1
	MOVEM	T1,RT'N'SVT
	JSP	F,RTCINT##	; LOAD F WITH DDB ADDR & GO TO IRP. ROUTINE

;	DEFINE SOME DISPLACMENTS RELATIVE TO DDB
XP RTCINI,RT'N'INI-.
XP RTCXIT,RT'N'XIT-.

RT'N'DDB::
XP RTCNAM,.-RT'N'DDB		;(0) PHYSICAL NAME
	SIXBIT/RTC'N/
XP RTCPRD,.-RT'N'DDB		;(1) PERIOD (10 USEC UNITS)
RT'N'PRD:	^D100000
XP RTCTIM,.-RT'N'DDB		;(2) TIME (10 USEC UNITS) UPDATED EVERY IRP.
RT'N'TIM::	0
XP RTCSON,.-RT'N'DDB		;(3) SKIP IF DK10 ON
	CONSO	RT'N,DK.ION
XP RTCSNO,.-RT'N'DDB		;(4) SKIP IF NOT OVERFLOW
	CONSZ	RT'N,DK.IO
XP RTCDAI,.-RT'N'DDB		;(5) READ CLOCK INTO T1
	DATAI	RT'N,T1
XP RTCLGT,.-RT'N'DDB		;(6) LAST VALUE RETURNED BY GETIME
	0
>	;DEFINE RTCDDB



;GENERATE DK10 DDB'S

DEFINE RTCDEF(N)<
IFG M.RT'N,<RTCDDB(N,70)
>>
ZZ==0
REPEAT	M.CPU,<
	RTCDEF	\ZZ
ZZ==ZZ+1
>

XP RTCTIM,0			;FOR SETIME (SYSINI) SO WON'T GET
XP RTCINI,0			;UNDEFINED GLOBALS.

SUBTTL	DEFINITIONS FOR DISPLAY AND LIGHT PEN
;DISPLAY AND LITE PEN

	IFG	DISN, <
	IFN	T30N!TVP10N, <DIS==134>
	EXTERN	DISSER
XP DISJSR,DISBLK##+1		;DIS JSR LOCATION IN LOWER CORE
XP ONDIS,DISBTH##+100
XP NONDIS,DISBTH##
XP OFFDIS,0
XP DISPON,2000+DISBIT##		;CONO PI, TURNS DIS PI CHANNEL ON
XP DISPOF,1000+DISBIT##		;CONO PI, TURNS DIS PI CHANNEL OFF


DISCON:

IFN T340N, <EXP ONDIS

DISBSY==77
XP PENON,7400

SETCON::CONO	DIS,100		;PARAMETER MODE
	JRST	DISIN1##

PENINT::CONSO	DIS,0		;CHECK FOR CONI FLAGS
	JRST	PENINT		;THIS WILL BE PART OF THE LINKED INTERRUPT CHAIN.
	CONSZ	DIS,400		;STOP FLAG UP
	JRST	STPFLG		;YES
	CONSZ	DIS,2000	;PEN FLAG UP
	DATAI	DIS,PENLOC##	;YES-STORE CURRENT LITE PEN LOCATION
	CONO	DIS,NONDIS	;CLEAR FLAGS
	XJEN	PENCHL##


;"STPFLG" SERVICES STOP FLAGS (DISPLAY PROGRAMMED) BY DOING A CLOSE ON THE DISPLAY

STPFLG:	JSR	PENSAV
	JRST	DISDSP##+DCL	;DO A CLOSE


ENDCHK::TRNN	T1,-1
	JRST	EXIT1##
	JRST	EXIT0##
>	;END OF IFN T340N
IFE T340N, <Z

DISBSY==20000
PENON==10000

SETCON::MOVEI	T1,PENCHN##	;SET UP CONO WORD
	ASH	T1,3		;WITH PROPER CHANNEL ASSIGNMENTS
	ADDI	T1,DISCHN##
IFN T30N!TVP10N, <TRO T1,4300>	;SET DISPLAY READY BIT & BRIGHTNESS = 3.
	MOVEM	T1,DISCON
	JRST	DISIN1##

PENINT::CONSO	DIS,0		;CHECK FOR CONI FLAGS
	JRST	PENINT		;THIS INSTRUCTION CHANGED TO LINK IN INTERRUPT CHAIN.
	DATAI	DIS,PENLOC##	;CLEAR PEN INTERRUPT
	MOVEM	T1,PENLOC##	;SAVE AC T1
	MOVE	T1,DISBKO##	;GET ABSOLUTE ADDRESS OF NEXT DATA ELEMENT
	SUB	T1,DISREL##	;MAKE RELATIVE
	HRRZS	T1		;CLEAR OUT GARBAGE IN LH
	EXCH	T1,PENLOC##	;SAVE ADDRESS IN PENLOC
	XJEN	PENCHL##



ENDCHK::JUMPE	T1,EXIT1##	;END OF LIST?
	TRNE	T1,-1		;NO, CHANGE INTENSITY COMMAND?
	JRST	EXIT0##		;NO
	MOVSS	T1		;YES, LH HAS USER CONO BITS
	DPB	T1,INPNT	;DEPOSIT FOR CONO
	CONO	DIS,@DISCON	;SET NEW INTENSITY
	JRST	DISNX1##
INPNT:	IFN	TVP10N, <POINT 2,DISCON,28>
	IFN	T30N, <POINT 3,DISCON,29>
>	;END OF IFE T340N

DISCNA::CONO	DIS,@DISCON
DISCZA::CONSZ	DIS,@DISCON
BLKLIT::BLKO	DIS,DISBKO##
DISCNO::CONO	DIS,OFFDIS
DISCNI::CONI	DIS,DISSTS##

DISTST::CONO	DIS,DISCHN##
>	;END OF IFG DISN


IFN VBCN,<
EXTERN	VBCSER
>
SUBTTL	LINE PRINTER DDB DEFINITIONS

IFE FTKS10,<IFG LPTN,<

;LINE PRINTER DDB DEFINITIONS

LPTDON==100

DEFINE	LPTDDB	(N,P,CPU,CPUN) <
	XLIST				;TURN OFF LISTING DURING EXPANSION

	LPT2==234			;DEVICE CODE FOR SECOND PRINTER
	LPT3==230			;DEVICE CODE FOR THIRD PRINTER
	IFNDEF	LP'CPU'0,<LP'CPU'0==LPT> ;DEFINE STANDARD MNEMONIC DEFINITIONS
	IFNDEF	LP'CPU'1,<LP'CPU'1==LPT2>; BUT ALLOW FOR OVERRIDE
	IFNDEF	LP'CPU'2,<LP'CPU'2==LPT3>

LP'N==LP'CPU'P

LP'N'SV1==LP'N'SAC##+F			;DEFINE F SAVE LOCATION

LPTCON==:.-LP'N'DDB
LP'N'INT::CONSO LP'N,0			;(-4) SKIP IF INTERRUPT FOR THIS LPT
	  JRST .-1			;(-3)  GO TO NEXT SKIP CHAIN ELEMENT
	  MOVEM F,LP'N'SV1		;(-2) SAVE F IN CHANNEL SAVE AREA
	  JSP F,LPTINT##		;(-1) SET UP DDB ADDRESS AND BRANCH
LP'N'DDB::
LP'N'NAM:
	LPNAM=SIXBIT /LPT/
	IFE	LPTN+DLPTN-1, <LPNAM>		;( 0) PHYSICAL DEVICE NAME
	IFN	LPTN+DLPTN-1, <LPNAM+<20+$LPNUM>B23>	;( 0) PHYSICAL DEVICE NAME
	<XWD <6*HUNGST>,LPTSIZ>+<M'CPU'LP'N'L>B0  ;( 1) DEVICE CHARACTERISTICS
					; HUNG TIME IS 63 SECS (CODE 6)
	  0				;( 2) DEVICE I/O STATUS
	  XWD 0,LPTDSP##			;( 3) LH=DDB LINK, RH=DSP TABLE ADDR.
LPTMOD==1_A+1_AL+1_I			;LPT LEGAL MODES
	  XWD DVOUT+DVLPT,LPTMOD	;( 4) DEVICE CHARACTERISTICS
	  0 				;( 5) LOGICAL DEVICE NAME
	  0				;( 6) BUFFER HEADER ADDRESSES
LPTPTR==:.-LP'N'DDB
LP'N'PTR: 0				;( 7) BLOCK OUTPUT POINTER
	 0			;(10) CURRENT OUTPUT BUFFER ADDRESS
LP'N'STS:	0			;(11) DEVICE STATUS WORD
	XWD	.TYLPT!.SPLPT!DEPLEN,0	;SPOOLED LPT, VAR BUFS, DON'T DEADVANCE
	0				;DEVXTR
	0				;DEVEVM
	0				;DEVPSI
	0				;DEVESE
	0				;DEVHCW
	BYTE	(3)CPUN(33)0		;DEVCPU
	0				;DEVISN
	<N>B17				;PUNIT+DEVJOB
LPTCH==:.-LP'N'DDB
	  EXP LP'N'BTH##		; INTERRUPT CHANNEL ASSIGNMENTS
LPTSVE==:.-LP'N'DDB
	  MOVE F,LP'N'SV1		; RESTORE F, SAVE AC'S
	  JSR LP'N'SAV##		;  AND ESTABLISH P
	  MOVEI F,LP'N'NAM		; SET UP DDB ADDRESS AND RETURN
	  JRST LPTNXT##			;  TO COMMON INTERRUPT HANDLER
LPTEX1==:.-LP'N'DDB
	  MOVE F,LP'N'SV1		; RESTORE F AND
	XJEN	LP'N'CHL##

LPTSV2==:.-LP'N'DDB
	  0				; SAVE LOCATION FOR U
LPTDAP==:.-LP'N'DDB
	  0				;PLACE TO BUILD AOBJN POINTER
					;TO ERROR BLOCK
LPTDAE==:.-LP'N'DDB
	  BLOCK	7			;SYSERR BLOCK
					; THE REST OF THE DDB CONTAINS
LPTDNO==:.-LP'N'DDB
	  CONSZ LP'N,CI%SKE##		;  THE ACTUAL I/O INSTRUCTIONS
LPTDNZ==:.-LP'N'DDB
	  CONSO	LP'N,CI%SKE##
LPTCSO==:.-LP'N'DDB
	  CONSO LP'N,(U)		;  USED BY THE COMMON SERVICE
LPTCSZ==:.-LP'N'DDB
	  CONSZ LP'N,(U)		;  ROUTINE TO CONTROL A LINE
LPTCNI==:.-LP'N'DDB
	  CONI  LP'N,U			;  PRINTER. THEY ARE EXECUTED
LPTCNO==:.-LP'N'DDB
	  CONO  LP'N,(U)		;  BY MEANS OF AN XCT INSTRUCTION
LPTDTO==:.-LP'N'DDB
	  DATAO LP'N,(U)		;  INDEXED TO THE PROPER DDB
LPTBKO==:.-LP'N'DDB
	  BLKO  LP'N,LP'N'PTR		;
LPTPAG==:.-LP'N'DDB
	  0				;PAGE COUNTER WORD
LPXSTS==:.-LP'N'DDB
	CONI	LP'N,LP'N'STS		; DEVICE STATUS WORD CONI


	LIST				;TURN LISTING BACK ON AFTER EXPANSION

>;END OF DEFINE LPTDDB

	GENDDS	LPT,LP

	>;END "IFG LPTN"
   IFG DLPTN,<;GENERATE DLP DDB'S IF NECESSARY

;RSX-20F LINEPRINTER DDB DEFINITIONS

DEFINE	DLPDDB	(CPUN,N,U,D)	<
	XLIST				;TURN OFF LISTING DURING EXPANSION

;HARDWARE CHARACTERISTICS DEFAULTS

   IFNDEF M'CPUN'FL'U'L,<M'CPUN'FL'U'L==:0>	;PRINTER IS UPPER-CASE
   IFNDEF M'CPUN'FL'U'P,<M'CPUN'FL'U'P==:0>	;NO PAGE COUNTER
   IFNDEF M'CPUN'FL'U'V,<M'CPUN'FL'U'V==:1>	;DAVFU
   IFNDEF M'CPUN'FL'U'C,<M'CPUN'FL'U'C==:0>	;64-CHAR SET
   IFNDEF M'CPUN'FL'U'N,<M'CPUN'FL'U'N==:0>	;NO CHAR SET NAME
   IFNDEF M'CPUN'FL'U'T,<M'CPUN'FL'U'T==:3>	;RSX-20F LPT

FL'N'DDB::
FL'N'NAM:
	LPNAM=SIXBIT/LPT/
	IFE LPTN+DLPTN-1,<LPNAM>		;(0) PHYSICAL DEVICE NAME
	IFN LPTN+DLPTN-1,<LPNAM+<20+$DLPNM>B23> ;(0) PHYSICAL DEVICE NAME
	<XWD <5*HUNGST>,LPTSIZ>+<M'CPUN'FL'U'L>B0 ;(1) DEVICE CHARACTERISTICS
					;HUNG TIME IS 31 SECONDS
	0				;(2) DEVICE I/O STATUS
	XWD	0,RLPDSP##		;(3) DDB LINK,,DSP TABLE ADDRESS
DLPMOD==1_A+1_AL+1_BYTMOD+1_I		;LEGAL MODES
	XWD	DVOUT+DVLPT,DLPMOD	;(4) DEVICE CHARACTERISTICS
	0				;(5) LOGICAL DEVICE NAME
	0				;(6) BUFFER HEADER ADDRESSES
	0				;(7) OUTPUT POINTER
	0				;(10) CURRENT OUTPUT BUFFER ADDRESS
	0				;(11) DEVICE STATUS WORD
	XWD	.TYLPT!.SPLPT!DEPLEN,0	;SPOOLED LPT, VAR BUFS, DON'T DEADVANCE
	0				;DEVXTR
	0				;DEVEVM
	0				;DEVPSI
	0				;DEVESE
	BYTE (1) M'CPUN'FL'U'L, M'CPUN'FL'U'P, 0 (3) M'CPUN'FL'U'V, M'CPUN'FL'U'C (3) M'CPUN'FL'U'T (6) 0 (18) M'CPUN'FL'U'N
					;DEVHCW
	BYTE	(3)CPUN(33)0		;DEVCPU
	0				;DEVISN
	<N>B17				;PUNIT+DEVJOB
	0				;COUNT OF OUTPUT CHARS
DLPDUX==:.-FL'N'DDB
	XWD	U,D			;UNIT # ON FRONT-END,,DLP DTE INDEX
DLPMLA==:.-FL'N'DDB
	0				;MAXIMUM LINE ALLOCATION
DLPRLA==:.-FL'N'DDB
	0				;REMAINING LINE ALLOCATION
DLPSNT==:.-FL'N'DDB
	0				;NUMBER OF WORDS ALREADY SENT

	LIST				;TURN LISTING BACK ON AFTER EXPANSION
>;END DEFINE OF DLPDDB
   ; ... STILL IN IFG DLPTN CONDITIONAL

DEFINE	RSXDTE	(C,D)	<

   IFNDEF M'C'LP'D'N,<M'C'LP'D'N==:0>

   IFG M'C'LP'D'N,<			;;DO ONLY IF AT LEAST ONE LPT ON DTE
	EXTERN	DLPSER
	$LPUNT==0			;;UNIT STARTS AT ZERO FOR EACH DTE
	REPEAT	M'C'LP'D'N,<		;;DO FOR EACH LPT ON DTE
		DLPDDB	\C,\<$DLPNM-$LPNUM>,\$LPUNT,$DTNDX
					;;GENERATE DDB
		$LPUNT==$LPUNT+1	;;STEP TO NEXT UNIT ON DTE
		$DLPNM==$DLPNM+1	;;STEP TO NEXT UNIT FOR SYSTEM
	>
	$DTNDX==$DTNDX+1		;;STEP TO NEXT DTE
   >
>
	IFNDEF $LPNUM,<$LPNUM==0>

		$DLPNM==$LPNUM			;START DLP UNITS AFTER REGULAR LPTS

		$DTNDX==0			;DTE INDEX FOR MACRO STARTS AT 0
		RSX20F				;GENERATE DDB'S FOR RSX-20F LPT'S


>;END IFG DLPTN

;DEFINE DLPDSP IF DLPSER IS NOT LOADED
IFN FTKL10,<
IFE M.DLP,<
DLPDSP==:EATDSP##		;IGNORE DLP MESSAGES
>;END IFE M.DLP
>;END FTKL10
>;END IFE FTKS10
IFN FTKS10,<

	IFG	LPTN, <

MAXLBZ==:^D253				;MAX WORD SIZE OF USER'S LPT BUFFERS
					;(LPTSPL USES THIS NUMBER)
LPTMOD==1_A+1_AL+1_I			;LPT LEGAL MODES

;DEFINITION FOR LINE PRINTER DEVICE DATA BLOCKS

DEFINE	LPTDDB (N) <

	XLIST				;TURN OFF LISTING DURING EXPANSION

LP'N'INT::0				;INTERRUPT JSR'S TO HERE
	EXP	0,IC.UOU,.+1		;XPCW BLOCK

	EXCH	T1,LP'N'INT		;GET INTERRUPT PC
	MOVEM	T1,LP'N'CHL##		;PUT INTO -10 STYLE INTERRUPT HANDLER
	MOVE	T1,LP'N'INT+1		;NEXT
	MOVEM	T1,LP'N'CHL##+1

	MOVE	T1,LP'N'INT		;AND RESTORE T1
	JSR	LP'N'SAV##		;SAVE AC'S
	JSP	F,LPTINT##		;SET UP F AND GO TO INTERRUPT CODE
LP'N'DDB::PHASE 0
	LPNAM=SIXBIT /LPT/
	IFE	LPTN-1, <LPNAM>		;(0) DEVNAM
	IFN	LPTN-1, <LPNAM+<20+$LPNUM>B23>
	<XWD <6*HUNGST>,LPTSIZ>+<M.LP'N'L>B0  ;(1) DEVCHR
	  0				;(2) DEVIOS
	  XWD 0,LPTDSP##		;(3) DEVSER
	  XWD DVOUT+DVLPT,LPTMOD	;(4) DEVMOD
	  0 				;(5) DEVLOG
	  0				;(6) DEVBUF
LPTPTR::!0				;(7) DEVIAD
	XWD R,0				;(10) DEVOAD
	0				;(11) DEVSTS
	XWD	.TYLPT!.SPLPT!DEPLEN,0	;(12) DEVSTA
	0				;(13) DEVXTR
	0				;(14) DEVEVM
	0				;(15) DEVPSI
	0				;(16) DEVESE
	0				;(17) DEVHCW
	BYTE	(3)0(33)0		;(20) DEVCPU
	0				;(21) DEVISN
	<N>B17				;(22) PUNIT+DEVJOB
LPTDAP::!0				;PLACE TO BUILD AOBJN POINTER TO LPTDAE
LPTDAE::!BLOCK	13			;SYSERR BLOCK
LPTSTS::!0				;MORE DEVICE STATUS
LPTRSV::!0				;SAVE AREA DURING UP-ARROW TRANSLATION
LPTWSV::!0				;...
LPTUDC::!0				;UNDEFINED CHAR INTERRUPT DATA SAVED
LPTPAG::!0				;PAGE COUNTER WORD
LPTVEC::!LP11IV				;-11 STYLE INTERRUPT VECTOR ADDRESS
LPTBAS::!LP11CA				;LP20 BASE DEVICE ADDRESS
LPTIVI::!XPCW	LP'N'INT		;INTERRUPT INSTRUCTION FOR THIS LPT

LPTFNC::!0				;CURRENT FUNCTION BITS SAVED HERE
LPTBYT::!0				;OUTPUT BYTE COUNT STORED HERE
LPTCDB::! CHNMAC(\M.LP'N'C)		;POINTER TO CHANNEL DATA BLOCK
LPTBUF::!BLOCK <<MAXLBZ*5>/4>+1		;ENOUGH ROOM FOR LPTSPL 7 TO 8 BIT BYTE CONVERSION
LPTBFZ==:.-LPTBUF			;SIZE OF THE LPT BUFFER
	DEPHASE				;BACK TO NORMAL
	LIST				;TURN LISTING BACK ON AFTER EXPANSION

>;END DEFINE LPTDDB
		EXTERNAL LP2SER		;HAUL IN THE SERVICE ROUTINE

		$LPNUM==0		;LPT NUMBER SYMBOL

IFG LPTN-1,<PRINTX KS10 MONITOR DOES NOT SUPPORT MORE THAN ONE LPT>

		REPEAT LPTN, <

			LPTDDB \$LPNUM
			$LPNUM==$LPNUM+1
		>
>;END IFG TAPN
>;END IFN FTKS10
SUBTTL	PLOTTER DDB DEFINITIONS
	IFG	PLTN, <
;CALCOMP PLOTTER DDB DEFINITIONS

DEFINE	PLTDDB	(N,P,CPU,CPUN) <
	XLIST			;TURN OFF LISTING DURING EXPANSION

	PLT2==144		;DEVICE SELECTION CODE FOR SECOND PLOTTER
	IFNDEF	PL'CPU'0,<PL'CPU'0==PLT> ;DEFINE STANDARD MNEMONIC DEFINITIONS
	IFNDEF	PL'CPU'1,<PL'CPU'1==PLT2>; BUT ALLOW FOR OVERRIDE

PL'N==PL'CPU'P

PL'N'SV1==PL'N'SAC##+F		;DEFINE F SAVE LOCATION

PLTCON==:.-PL'N'DDB
PL'N'INT::CONSO	PL'N,0		; SKIP IF INTERRUPT FOR THIS PLT
	JRST	.-1		; GO TO NEXT SKIP CHAIN ELEMENT
	CONI	PL'N,PL'N'STS
	SOSGE	PL'N'CTR	;OUTPUT CHARACTERS LEFT?
	JRST	PL'N'IN2	;NO
	MOVEM	T1,PL'N'SV1	;SAVE T1 IN CHANNEL SAVE AREA
	ILDB	T1,PL'N'PTR	;GET NEXT CHARACTER
PLTDTO==:.-PL'N'DDB
	DATAO	PL'N,T1		;SEND TO PLOTTER
	MOVE	T1,PL'N'SV1	;RESTORE T1 AND
	XJEN	PL'N'CHL##


PL'N'IN2:JSR	PL'N'SAV##	;SAVE AC'S
	JSP	F,PLTNXT##	;SET UP F, GO TO PLOTTER SERVICE

PL'N'DDB::
PL'N'NAM:	PLNAM==SIXBIT /PLT/
	IFE	PLTN-1,<PLNAM>	; ( 0) PHYSICAL DEVICE NAME
	IFN	PLTN-1,<PLNAM+<20+$PLNUM>B23>; ( 0) PHYSICAL DEVICE NAME
	XWD	HUNGST*4,^D36	;( 1) XWD (HUNG TIMEOUT),(BUFFER SIZE)
				; CODE 4 - HUNG TIME=15 SECONDS
	0			;( 2) DEVICE IO STATUS
	XWD	0,PLTDSP##	;( 3) LH=DDB LINK; RH=DSP TABLE ADDR.
PLTMOD==1_A+1_AL+1_I+1_IB+1_B		;PLOTTER LEGAL MODES
	XWD	DVOUT,PLTMOD	;( 4) XWD (OUTPUT DEV), (MODES)
	0			;( 5) LOGICAL DEVICE NAME
	0			;( 6) BUFFER HEADER ADDRESSES
PLTPTR==:.-PL'N'DDB
PL'N'PTR:	0		;( 7) OUTPUT BYTE POINTER
	0			;(10) CURRENT OUTPUT BUFFER ADDRESS
PL'N'STS:	0		;(11) DEVICE STATUS WORD
	XWD	.TYPLT!.SPPLT,0	;(12) SPOOLED PLT
	0			;(13) DEVXTR
	0			;(14) DEVEVM
	0			;(15) DEVPSI
	0			;(16) DEVESE
	0			;(17) DEVHCW
	BYTE	(3)CPUN(33)0	;(20) DEVCPU
	0			;(21) DEVISN
	<N>B17			;(22) PUNIT+DEVJOB
PL'N'CTR:	0		;OUTPUT BYTE COUNTER
PLTCH==:.-PL'N'DDB
	PL'N'CHN##		; INTERRUPT CHANNEL

PLTCNO==:.-PL'N'DDB
	CONO	PL'N,(T1)	;XCT'D FROM PLTSER

	LIST			;TURN ON LISTING AFTER EXPANSION
>	;END OF PLTDDB MACRO DEFINITION


	GENDDS	PLT,PL

>	;END OF "IFG PLTN"
SUBTTL	DEFINITIONS FOR PAPER TAPE AND PTY'S

	IFG	PTRN, <

SUBTTL PAPER TAPE READER DDB DEFINITIONS

IFE FTKS10,<
DEFINE	PTRDDB	(N,P,CPU,CPUN) <

	IFNDEF	PR'CPU'0,<PR'CPU'0==PTR>

PR'N==PR'CPU'P

PR'N'SV1==PR'N'SAC##+F		;DEFINE F SAVE LOCATION

PTRCON==:.-PR'N'DDB
PR'N'INT::CONSO	PR'N,0		;(-4) SKIP IF INTERRUPT FOR THIS READER
	  JRST	.-1		;(-3) NOT HERE, CONTINUE DOWN THE CHAIN
	  MOVEM	F,PR'N'SV1	;(-2) SAVE F IN CHANNEL SAVE AREA
	  JSP	F,PTRINT##	;(-1) SET F TO DDB ADDRESS AND SERVICE INTERRUPT
PR'N'DDB::
PR'N'NAM:	PTRNAM=SIXBIT/PTR/
	IFE	PTRN-1,<PTRNAM>	;(0) PHYSICAL DEVICE NAME
	IFN	PTRN-1,<PTRNAM+<20+$PRNUM>B23>	;(0) PHYSICAL DEVICE NAME
	XWD	5*HUNGST,41	;(1) CODE 5 - HUNG TIME IS 31 SECONDS
PTRIOS==:.-PR'N'DDB
	0			;(2) DEVIOS
	PTRDSP##		;(3) LH=DDB LINK, RH=PTR DISPATCH TABLE
	XWD	DVPTR+DVIN,14403;(4) DEVICE CHARACTERISTICS
	0			;(5) LOGICAL DEVICE NAME (DEVLOG)
	0			;(6) BUFFER HEADER ADDRESSES
PTRIAD==:.-PR'N'DDB
	0			;(7) ADDRESS OF CURRENT INPUT BUFFER
PTRPTR==:.-PR'N'DDB
	0			;(10) BYTE POINTER TO CURRENT INPUT BUFFER
PTRSTS==.-PR'N'DDB
PR'N'STS: 0			;(11) LATEST CONI STATUS BITS
	XWD	.TYPTR!DEPLEN,0	;NON-SPOOLED, VARIABLE BUFFER SIZE
	0			;DEVXTR
	0			;DEVEVM
	0			;DEVPSI
	0			;DEVESE
	0			;DEVHCW
	BYTE	(3)CPUN(33)0	;DEVCPU
	0			;DEVISN
	<N>B17			;PUNIT+DEVJOB
PTRCTR==:.-PR'N'DDB
	0			;BYTE COUNTER FOR IDPB'S INTO USER'S BUFFERS
PTRSV1==:.-PR'N'DDB
	0			;TEMPORARY LOACATION FOR SAVING AN AC
PTRCH==:.-PR'N'DDB
	EXP	PR'N'CHN##	;PTR PIA
PTRPWR==:.-PR'N'DDB
	CONSO	PR'N,POW##	;PTR ON/OFF?
PTRCNO==:.-PR'N'DDB
	CONO	PR'N,(U)
PTRDTI==:.-PR'N'DDB
	DATAI	PR'N,U
PTRDS1==:.-PR'N'DDB
	DATAI	PR'N,PTRSV1(F)
PTRSVE==:.-PR'N'DDB
PR'N'SVE: 0			;ROUTINE TO SAVE AC'S
	MOVE	F,PR'N'SV1	;RESTORE F
	JSR	PR'N'SAV##	;SAVE AC'S AND ESTABLISH P
	MOVEI	F,PR'N'DDB	;SET UP DDB ADDRESS
	JRST	@PR'N'SVE	;AND RETURN
PTREX1==:.-PR'N'DDB
	MOVE	F,PR'N'SV1	;RESTORE F
	XJEN	PR'N'CHL##

PTRXSTS==:.-PR'N'DDB
	CONI	PR'N,PR'N'STS
>;DEFINE
>;IFE FTKS10
IFN FTKS10,<
DEFINE	PTRDDB	(N,P,CPU,CPUN) <

	IFNDEF	PR'CPU'0C,<PR'CPU'0C==PR11CA>
	IFNDEF	PR'CPU'0I,<PR'CPU'0I==PR11IV>

PR'N'INT::EXP	0,0,IC.UOU,.+1	;XPCW here from IVT
	EXCH	T1,PR'N'INT	;Find return PC
	MOVEM	T1,PR'N'CHL##	;Store in return locn
	MOVE	T1,PR'N'INT+1	;Second word with KLP
	MOVEM	T1,PR'N'CHL##+1	;...
	MOVE	T1,PR'N'INT	;Restore T1
	JSR	PR'N'SAV##	;Get our AC block
	JSP	F,PTRINT##	;(-1) SET F TO DDB ADDRESS AND SERVICE INTERRUPT
PR'N'DDB::
PR'N'NAM:	PTRNAM=SIXBIT/PTR/
	IFE	PTRN-1,<PTRNAM>	;(0) PHYSICAL DEVICE NAME
	IFN	PTRN-1,<PTRNAM+<20+$PRNUM>B23>	;(0) PHYSICAL DEVICE NAME
	XWD	5*HUNGST,41	;(1) CODE 5 - HUNG TIME IS 31 SECONDS
	0			;(2) DEVIOS
	PTRDSP##		;(3) LH=DDB LINK, RH=PTR DISPATCH TABLE
	XWD	DVPTR+DVIN,14403;(4) DEVICE CHARACTERISTICS
	0			;(5) LOGICAL DEVICE NAME (DEVLOG)
	0			;(6) BUFFER HEADER ADDRESSES
	0			;(7) ADDRESS OF CURRENT INPUT BUFFER
	0			;(10) BYTE POINTER TO CURRENT INPUT BUFFER
	0			;(11) LATEST CONI STATUS BITS
	XWD	.TYPTR!DEPLEN,0	;NON-SPOOLED, VARIABLE BUFFER SIZE
	0			;DEVXTR
	0			;DEVEVM
	0			;DEVPSI
	0			;DEVESE
	0			;DEVHCW
	BYTE	(3)CPUN(33)0	;DEVCPU
	0			;DEVISN
	0			;DEVJOB
	0			;BYTE COUNTER FOR IDPB'S INTO USER'S BUFFERS
PTRBLK==:.-PR'N'DDB
	BLOCK	2		;Temps for PC20 hardware simulation
PTRDTI==:.-PR'N'DDB
	EXP	PR'CPU'0C,PR'CPU'0C+2,PR'CPU'0I
	XPCW	PR'N'INT
>;End DEFINE PTRDDB
>;End FTKS10

	GENDDS	PTR,PR
>;END IFG PTR

	IFG	PTPN, <

SUBTTL PAPER TAPE PUNCH DDB DEFINITIONS

IFE FTKS10,<
DEFINE	PTPDDB	(N,P,CPU,CPUN) <

	IFNDEF	PP'CPU'0,<PP'CPU'0==PTP>

PP'N==PP'CPU'P

PP'N'SV1==PP'N'SAC##+F		;DEFINE F SAVE LOCATION

PTPCON==:.-PP'N'DDB
PP'N'INT::CONSO	PP'N,0		;(-4) SKIP IF INTERRUPT FOR THIS READER
	  JRST	.-1		;(-3) NOT HERE, CONTINUE DOWN THE CHAIN
	  MOVEM	F,PP'N'SV1	;(-2) SAVE F IN CHANNEL SAVE AREA
	  JSP	F,PTPINT##	;(-1) SET F TO DDB ADDRESS AND SERVICE INTERRUPT
PP'N'DDB::
PP'N'NAM:	PTPNAM=SIXBIT/PTP/
	IFE	PTPN-1,<PTPNAM>	;(0) PHYSICAL DEVICE NAME
	IFN	PTPN-1,<PTPNAM+<20+$PPNUM>B23>	;(0) PHYSICAL DEVICE NAME
	XWD	4*HUNGST,41	;(1) CODE 4 - HUNG TIME IS 15 SECONDS
PTPIOS==:.-PP'N'DDB
	0			;(2) DEVIOS
	PTPDSP##		;(3) LH=DDB LINK, RH=PTP DISPATCH TABLE
	XWD	DVPTP+DVOUT,14403 ;(4) DEVICE CHARACTERISTICS
	0			;(5) LOGICAL DEVICE NAME (DEVLOG)
	0			;(6) BUFFER HEADER ADDRESSES
PTPPTR==:.-PP'N'DDB
	0			;(7) BYTE POINTER TO CURRENT OUTPUT BUFFER
PTPOAD==:.-PP'N'DDB
	0			;(10) ADDRESS OF CURRENT OUTPUT BUFFER
PTPSTS==.-PP'N'DDB
PP'N'STS: 0			;(11) LATEST CONI STATUS BITS
	XWD	.TYPTP!.SPPTP!DEPLEN,0	;VAR BUFFERS, SPOOLED
	0			;DEVXTR
	0			;DEVEVM
	0			;DEVPSI
	0			;DEVESE
	0			;DEVHCW
	BYTE	(3)CPUN(33)0	;DEVCPU
	0			;DEVISN
	<N>B17			;PUNIT+DEVJOB
PTPCTR==:.-PP'N'DDB
	0			;BYTE COUNTER FOR ILDB'S FROM USER'S BUFFERS
PTPCNT==:.-PP'N'DDB
	0
PTPCHA==:.-PP'N'DDB
	0			;TEMPORARY LOCATION TO STORE CHAR
PTPSIO==:.-PP'N'DDB
	0			;SAVE DEVIOS
PTPCH==:.-PP'N'DDB
	EXP	PP'N'CHN##	;PTP PIA
PTPCNO==:.-PP'N'DDB
	CONO	PP'N,(U)
PTPCN0==:.-PP'N'DDB
	CONO	PP'N,0		;TURN PTR OFF
PTPSDN==:.-PP'N'DDB
	CONO	PP'N,PTPDON##(T1);SET DONE
PTPOOT==:.-PP'N'DDB
	CONSO	PP'N,PTPNTP##	;OUT OF TAPE?
PTPDTO==:.-PP'N'DDB
	DATAO	PP'N,T1
PTPDOC==:.-PP'N'DDB
	DATAO	PP'N,PTPCHA(F)
PTPSVE==:.-PP'N'DDB
PP'N'SVE: 0			;ROUTINE TO SAVE AC'S
	MOVE	F,PP'N'SV1	;RESTORE F
	JSR	PP'N'SAV##	;SAVE AC'S AND ESTABLISH P
	MOVEI	F,PP'N'DDB	;SET UP DDB ADDRESS
	JRST	@PP'N'SVE	;AND RETURN
PTPEX1==:.-PP'N'DDB
	MOVE	F,PP'N'SV1	;RESTORE F
	XJEN	PP'N'CHL##

PTPXSTS==:.-PP'N'DDB
	CONI	PP'N,PP'N'STS
>;DEFINE
>;FTKS10
IFN FTKS10,<

DEFINE	PTPDDB	(N,P,CPU,CPUN) <

	IFNDEF	PP'CPU'0C,<PP'CPU'0C==PP11CA>
	IFNDEF	PP'CPU'0I,<PP'CPU'0I==PP11IV>

PP'N'INT::EXP	0,0,IC.UOU,.+1
	EXCH	T1,PP'N'INT	;Get return PC
	MOVEM	T1,PP'N'CHL##	;Save for return
	MOVE	T1,PP'N'INT+1
	MOVEM	T1,PP'N'CHL##+1
	MOVE	T1,PP'N'INT	;Restore T1
	JSR	PP'N'SAV##	;Get our AC block
	JSP	F,PTPINT##	;(-1) SET F TO DDB ADDRESS AND SERVICE INTERRUPT
PP'N'DDB::
PP'N'NAM:	PTPNAM=SIXBIT/PTP/
	IFE	PTPN-1,<PTPNAM>	;(0) PHYSICAL DEVICE NAME
	IFN	PTPN-1,<PTPNAM+<20+$PPNUM>B23>	;(0) PHYSICAL DEVICE NAME
	XWD	4*HUNGST,41	;(1) CODE 4 - HUNG TIME IS 15 SECONDS
	0			;(2) DEVIOS
	PTPDSP##		;(3) LH=DDB LINK, RH=PTP DISPATCH TABLE
	XWD	DVPTP+DVOUT,14403 ;(4) DEVICE CHARACTERISTICS
	0			;(5) LOGICAL DEVICE NAME (DEVLOG)
	0			;(6) BUFFER HEADER ADDRESSES
	0			;(7) BYTE POINTER TO CURRENT OUTPUT BUFFER
	0			;(10) ADDRESS OF CURRENT OUTPUT BUFFER
	0			;(11) LATEST CONI STATUS BITS
	XWD	.TYPTP!.SPPTP!DEPLEN,0	;VAR BUFFERS, SPOOLED
	0			;DEVXTR
	0			;DEVEVM
	0			;DEVPSI
	0			;DEVESE
	0			;DEVHCW
	BYTE	(3)CPUN(33)0	;DEVCPU
	0			;DEVISN
	0			;DEVJOB
	0			;BYTE COUNTER FOR ILDB'S FROM USER'S BUFFERS
PTPCNT==:.-PP'N'DDB
	0
PTPCHA==:.-PP'N'DDB
	0			;TEMPORARY LOCATION TO STORE CHAR
PTPCNO==:.-PP'N'DDB
	EXP	PP'CPU'0C,PP'CPU'0C+2,PP'CPU'0I
	XPCW	PP'N'INT
>;End DEFINE PTPDDB
>;FTKS10

	GENDDS	PTP,PP

>;END IFG PTP
PASCII==:700
PIMAGE==:4400
PIMTTY==:1000
PBYTMD==:1000


;PSEUDO TTY ENTRY POINT

	IFE	PTYN, <PTYPE::PTMNMZ::PTYOW::PTMNMD::HALT CPOPJ##	;HALT IF SCNSER CALL PTY ROUTINES
PTYDSP==:0					; BECAUSE NONE LOADED
PTYLST==:0					;SATISFY GLOBOL IN SYSINI
;IF NO PTY'S, SATISFY GLOBALS
CTLJOB==:CPOPJ##
UJBSTS==:CPOPJ##
PTBTCH==:CPOPJ1##
;IF NO PTY'S, JOB CAN NEVER BE CONTROLLED BY PTY, SO
; SUBSTITUTE THIS DUMMY SUBROUTINE FOR CTLJB
CTLJBU::SETZM	U		;NO LDB
CTLJB::
CTLJBD::MOVNI	T1,1
	POPJ	P,
>
	IFG	PTYN, <
	EXTERNAL PTYSER			;LOAD PTY SERVICE ROUTINE
>
IFN FTKL10,<;DO THIS STUFF ONLY FOR KL CPU'S

;DEFINE SYMBOLS AND STORAGE FOR RSX-20F ASYNC TERMINALS

	$HIGH				;THIS PART INTO THE HIGH SEGMENT

DEFINE	RSXDTE(C,D),<
   IFE D,<
	EXP	$TTOFS
	$TTOFS==$TTOFS+M'C'TTDN
   >
>
	$TTOFS==TTDLAL			;INITIALIZE SYMBOL USED IN FOLLOWING MACRO
TTDOFS::RSX20F				;TABLE OF TTD LINE TABLE OFFSETS
	EXP	$TTOFS			;FIRST LINE AFTER DTE DRIVEN LINES
TTDLOM==:TTDOFS+1			;BASE OF RANGE CHECK TABLE
TTDDSO==:<TTDLAL-TTDDAL>		;TRANSLATION FOR DSCTAB ENTRIES


IFG DLPTN,<		;DO THIS ONLY IF RSX-20F LPT'S

;DEFINE STORAGE AND SYMBOLS FOR LINEPRINTERS ON RSX-20F FRONT-ENDS

DEFINE	RSXDTE	(C,D)	<

   IFG M'C'LP'D'N,<XWD	C,D>
>

LPCPDT::RSX20F				;MAKE TABLE WITH ONE ENTRY FOR EACH
					; RSX-20F FRONT-END SUPPORTING LINEPRINTERS
RSXLPN==:.-LPCPDT			;NUMBER OF SUCH FRONT-ENDS


LPDTDV::				;TABLE TO CONVERT FROM CPU #, DTE #,
					;AND UNIT NUMBER TO DDB ADDRESS

DEFINE	LPCPDT	(C)	<
  IFDEF M'C'DTEN,<Z @LP'C'DTE(P1)>	;INDEX OFF DTE NUMBER
  IFNDEF M'C'DTEN,<Z>			;NO DTE'S ON THIS CPU
>

	ZZ==0
REPEAT CPUN,<
	LPCPDT	\ZZ
	ZZ==ZZ+1
>

DEFINE	RSXDTE	(C,D)	<
  IFE D,<LP'C'DTE:>
  IFN M'C'LP'D'N,<Z @LP'C'D'DV(T1)>	;INDEX OFF LINE NUMBER
  IFE M'C'LP'D'N,<Z>			;NO LINE PRINTERS THIS DTE
>

	RSX20F				;GENERATE DTE TABLE

DEFINE	RSXDTE	(C,D)	<
  IFN M'C'LP'D'N,<
    LP'C'D'DV:
    REPEAT M'C'LP'D'N,<
	DLPDDB	\ZZ
	ZZ==ZZ+1
    >
REPEAT	<2-M'C'LP'D'N>,<
	Z
>
  >
>

DEFINE	DLPDDB	(X) <FL'X'DDB>

	ZZ==0

	RSX20F				;GENERATE THE DDB ADDRESS TABLE

>;END IFG DLPTN
   ; ... STILL IN FTKL10 CONDITIONAL

IFN DCDRN,<

	$HIGH

;DEFINE SPECIAL TABLES FOR RSX20F CARD READERS


DEFINE	RSXDTE	(C,D)	<
	XWD	C,D
>

CRCPDT::RSX20F				;CORRESPONDENCE TABLE BETWEEN
					;DTE INDEX AND CPU#,,DTE # FOR
					;DTESER

CRDTDV::				;TABLE TO CONVERT FROM CPU #, DTE #,
					;AND UNIT NUMBER TO DDB ADDRESS

DEFINE	CRCPDT	(C)	<
  IFDEF M'C'DTEN,<Z @CR'C'DTE(P1)>	;INDEX OFF DTE NUMBER
  IFNDEF M'C'DTEN,<Z>			;NO DTE'S ON THIS CPU
>

	ZZ==0
REPEAT CPUN,<
	CRCPDT	\ZZ
	ZZ==ZZ+1
>

DEFINE	RSXDTE	(C,D)	<
  IFE D,<CR'C'DTE:>
  IFN M'C'CR'D'N,<Z @CR'C'D'DV(T1)>	;INDEX OFF LINE NUMBER
  IFE M'C'CR'D'N,<Z>			;NO CARD READERS THIS DTE
>

	RSX20F				;GENERATE DTE TABLE

DEFINE	RSXDTE	(C,D)	<
  IFN M'C'CR'D'N,<
    CR'C'D'DV:
    REPEAT M'C'CR'D'N,<
	DCRDDB	\ZZ
	ZZ==ZZ+1
    >
  >
>

DEFINE	DCRDDB	(X) <FC'X'DDB>

	ZZ==0

	RSX20F				;GENERATE THE DDB ADDRESS TABLE


>;END IFN DCDRN
>;END IFN FTKL10
SUBTTL	ROUTINES COMMON TO PDP11 COMM FRONT-END'S ON DL10'S

IFN PDP11N,<
	DLMAP
	$HIGH

;SUBROUTINE TO PROCESS THE COMMAND:
;	.SET NOMESSAGE PDP11 N
;CALL WITH:
;	PUSHJ	P,D76SIL
;	RETURN HERE OR JRST COMERA
D76SIL::PUSHJ	P,DECIN##	;READ A DECIMAL NUMBER
	  JRST	D76SIP		;NO NUMBER ASSUME ZERO
	  CAIA			;ILLEGAL CHARACTER MAYBE
	  JRST	D76SIP		;OK GOT A DIGIT
	CAIE	T3,"*"		;WILD CARD
	JRST	COMERA##	;NO, ERROR
	MOVEI	T2,7		;YES, SET SIL ON ALL PDP11'S
	PUSHJ	P,D76SIA	;CONTINUE
	  JFCL			;IGNORE IF NOT THERE
	SOJGE	T2,.-2		;CONTINUE
	POPJ	P,		;RETURN
D76SIP:	PUSHJ	P,D76SIA	;GO SILENCE THIS 76
	  JRST	COMERA##		;LOST, GIVE ERROR
	POPJ	P,		;RETURN

D76SIA:	SKIPL	T2		;.LT. 0 IS WRONG.
	CAIL	T2,10		;SKIP IF PORT .LT. 8
	POPJ	P,		;INVALID PORT #
IFN M.DAS78,<
	CAILE	T2,M78HPO##	;SEE IF THIS PORT EXISTS ON A DAS78
	JRST	D76SI1		;NO, TRY OTHER 11S
	SKIPE	T1,M78BAT##(T2)	;IF A DAS78 THEN
	JRST	D76SI0		; ALL SET
> ;END IFN M.DAS78

D76SI1:	SKIPE	T1,DLXBAT##(T2)	;IF NO KNOWN PORT OR
	SKIPN	T1,DLXWIN##(T1)	; NO WINDOW ASSIGNED THEN
	POPJ	P,		; COMPLAIN
D76SI0:	SKIPG	DWN(T1)		;IS THE PDP11 DOWN?
	SETOM	DWN(T1)		;YES--TURN OFF THE MESSAGE
	JRST	CPOPJ1##	;RETURN
	$LOW
>	;END OF IFN PDP11N
IFN <PDP11N-DLX.78>,< ;IF ANY DL10 BASED 11S BUT NOT DAS78S

;ROUTINE TO GET ERROR STATUS AND CALL DAEMON FOR AN ERROR
;ON A DC76, DN85 OR DN60
;ARGUMENTS	T1=PORT # OF 11 WITH ERROR
DLB==60	;DEVICE CODE FOR DL10
DLC==64	;DEVICE CODE FOR DL10

DLBREG==3	;NUMBER OF HIGHEST CONI DLB, WE DO
DLBEDT==0	;VALUE OF R FOR DATAI DLB, WE WANT TO SAVE

	$HIGH
DL10EL::MOVEM	T1,DLEPRT	;SAVE THE PORT OF THE 11 WITH ERROR
	MOVE	T2,DLXNMT##(P2)	;GET NAME
	MOVEM	T2,DLEPGM	;SAVE
	HRLZ	T2,DLXTYP##(P2)
	MOVEM	T2,DLESTS
	MOVE	T2,DLXWIN##(P2)
	MOVE	T2,HLT(T2)
	HRRM	T2,DLESTS
	CONI	DLC,DLCCNI	;GET THE DLC CONI
	DATAI	DLC,DLCDTI	; AND DATAI
	MOVEI	T1,DLBREG	;GET NUMBER OF REGS TO SAVE OF DLB
DLBLUP:	DPB	T1,[POINT 2,DLBDTO,5]	;PUT REG INTO DATAO
	DATAO	DLB,DLBDTO	;AND DO DATAO SO CONI GETS RIGHT REG
	CONI	DLB,DLBCNI(T1)	;GET THIS DLB CONI
	CAIN	T1,DLBEDT	;IS THIS THE DATAI WE WANT?
	DATAI	DLB,DLBDTI	;YES, GET IT
	SOJGE	T1,DLBLUP	;AND LOOP BACK FOR NEXT REG
	MOVEI	T1,.ERDLE	;GET CODE FOR ERROR RPT UUO
	HRLI	T1,DLEBLK	;AND ADDRESS FOR DAEMON TO LOOK AT
	PJRST	DAEEIM##	;AND GO WAKE DAEMON

	$LOW
DLBDTO:	XWD	1,0		;BITS FOR DATAO DLB,
DLEBLK:-DLELEN,,DLEPRT	;AOBJN POINTER FOR ERROR BLOCK
DLEPRT:	BLOCK	1		;PORT OF 11 WITH ERROR
DLCCNI:	BLOCK	1		;CONI DLC AT ERROR
DLCDTI:	BLOCK	1		;DATAI DLC AT ERROR
DLBCNI:	BLOCK	4		;BLOCK FOR CONI DLB'S
DLBDTI:	BLOCK	1		;DATAI DLB WITH R=0 AT ERROR
DLEPGM:	BLOCK	1		;SIXBIT PROGRAM NAME
DLESTS:	BLOCK	1		;HALT STATUS
DLELEN==.-DLEPRT



> ;END IFN <PDP11N-DLX.78>
IFN <PDP11N!M.KL10!M.DN60!M.KDUP!M.DMRN>,< ;IF DL10S, DTES, DN60S, OR KMC/DUPS(DMRs)

;CAL11. UUO
	$HIGH

CALL11::PUSH	P,T1		;SAVE USER'S ARG
	HRLOI	P2,377777	;ASSUME PRIV. JOB.
	PUSHJ	P,PRUSET##	;SKIP IF PRIV.
	  TLO	P2,400000	;NOT PRIV.
	POP	P,T1		;RESTORE USER'S ARG
	HRR	M,T1		;GET USER'S AC
	HLRE	T3,T1		;GET COUNT
	JUMPLE	T3,ECOD7##	;.LE. ZERO ARGS NOT ENOUGH!
	PUSHJ	P,GETWDU##	;GET FUNCTION CODE INTO T1
	SOJL	T3,ECOD7##	;ERROR CODE 7: NOT ENOUGH ARGS
	MOVE	P3,T3		;SAVE LENGTH
	MOVE	P1,T1		;COPY FUNCTION WORD TO A SAFER PLACE
	SKIPL	P1		;OLD STYLE FUNCTION WORD?
	PUSHJ	P,C11OLD	;YES--HACK IT UP A BIT
	PUSHJ	P,C11ARG	;DECODE THE TYPE, CPU, AND PORT NUMBER
	  POPJ	P,		;RETURN ON ERRORS
	MOVE	T3,P3		;RESTORE LENGTH
	SKIPN	T2,DLXCAL##(W)	;GET CAL11. TABLE POINTER
	MOVE	T2,[XWD CAL11L,CAL11D]	;NONE, USE DEFAULT
	HLRZ	T4,T2		;GET LENGTH OF TABLE
	CAML	T1,T4		;FUNCTION TOO LARGE?
	  JRST	ECOD2##		;YES, ERROR CODE 2.
	ADD	T2,T1		;NO, POINT TO TABLE ENTRY
	MOVE	T1,0(T2)	;PICK UP ENTRY
	AND	T1,P2		;CLEAR SIGN BIT IF PRIV
	JUMPL	T1,ECOD1##	;IF STILL SET, NEED PRIV.
	PUSHJ	P,0(T1)		;GO DO FUNCTION
	  POPJ	P,		;PROPAGATE ERROR BACK TO USER
	PJRST	CPOPJ1##	;SKIP RETURN


;TABLE FOR CAL11. UUO IF THERE IS NO SERVICE ROUTINE
CAL11D:	XWD	400000,ECOD2##	;(0) DEPOSIT
	XWD	400000,ECOD2##	;(1) EXAMINE
	XWD	400000,ECOD2##	;(2) QUEUE A MESSAGE
	XWD	0,CAL11N	;(3) RETURN NAME
	XWD	0,CAL11S	;(4) UP/DOWN STATUS
	XWD	400000,ECOD2##	;(5) SEND
	XWD	400000,ECOD2##	;(6) RECEIVE
	XWD	0,CAL11T	;(7) TYPE
CAL11L==.-CAL11D		;LENGTH OF TABLE
; CROCK TO FUDGE UP A NEW FORMAT FUNCTION WORD FROM AN OLD STYLE WORD.
; THIS INSURES COMPATIBILITY WITH PRE-702 MONITORS.  EARLY 702 NONSENSE
; USING 400+DTE NUMBERS LOSE.  SO DO KMC/DUPS.  TO ALLOW CAL11. TO STILL
; WORK ON CPUS OTHER THAN CPU ZERO, WE'LL PICK UP THE JOB'S SET CPU COMMAND
; ARGUMENT AND SET THE CPU NUMBER TO THE FIRST CPU AVAILABLE.  NO CHECKING
; IS DONE AT THIS TIME TO MAKE SURE  THE SELECTED CPU HAS THE PORT WE'RE
; INTERESTED IN.  THAT'LL GET CAUGHT LATER.
C11OLD: HLRZ	T1,P1		;GET PORT NUMBER
	CAIGE	T1,10		;DL10 PORT?
	TDZA	T1,T1		;YES
	MOVEI	T1,.C11DT	;MUST BE A DTE
	TLZ	P1,777770	;KEEP ONLY THE PORT NUMBER
	DPB	T1,C11TYP	;SET THE TYPE CODE
	TLO	P1,(C1.1NF)	;SET NEW FORMAT

IFN FTMP,<
IFN M.CPU-1,<
	MOVE	T1,JBTSPS##(J)	;SEE IF THE USER
	TRC	T1,7777		; GAVE A SET CPU
	TRCE	T1,7777		;  COMMAND OR UUO
	SKIPA	T1,.CPCPN##	;RUN ON THIS CPU
	MOVEI	T1,0		;LOCK HIM ON CPU0
	DPB	T1,C11CPU	;STORE IT
> ;END IFN M.CPU-1
> ;END IFN FTMP

	POPJ	P,		;RETURN


; HERE TO DECODE THE TYPE, CPU, PORT NUMBER, AND FUNCTION CODE
; CALL:	MOVE	P1,FUNCTION WORD
;	PUSHJ	P,C11ARG
;
; ON RETURN, W=BASE TABLE ADDR, P1=WINDOW ADDR, T1=FUNCTION CODE
C11ARG:	LDB	T1,C11TYP	;GET THE TYPE CODE
	LDB	T2,C11CPU	;GET THE CPU NUMBER
	LDB	T3,C11POR	;GET THE PORT NUMBER
	HRRZ	T4,P1		;GET THE FUNCTION CODE
	CAILE	T2,M.CPU-1	;LEGAL CPU NUMBER?
	JRST	ECOD16##	;NO
	CAIN	T1,.C11DL	;DL10?
	JRST	C11DLX		;YES
	CAIN	T1,.C11DT	;DTE-20?
	JRST	C11DTX		;YES
	CAIN	T1,.C11KD	;KDP?
	JRST	C11KDX		;YES
	CAIN	T1,.C11DR	;DMR?
	JRST	C11DRX		;YES
	JRST	ECOD17##	;ILLEGAL TYPE CODE

C11DLX:
IFE DL10XI,<JRST ECOD21##>	;NO DL10 SUPPORT
IFN DL10XI,<
; REMOVE THE FOLLOWING INSTUCTION IF DL10S ARE MADE TO WORK ON CPU1
	MOVEI	T2,0		;GET THE CPU NUMBER
	CAIL	T3,10		;DL10 HAS PORTS 0-7
	JRST	ECOD20##	;ILLEGAL PORT NUMBER
	MOVE	T1,T2		;GET THE CPU NUMBER
	LSH	T1,3		;TIME THE NUMBER OF DL10 PORTS PER CPU (8)
	ADDI	T1,(T3)		;PLUS THE PORT NUMBER
	SKIPE	W,DLXBAT##(T1)	;GET THE BASE TABLE FOR THIS PORT
	SKIPN	P1,DLXWIN##(W)	;GET THE WINDOW ADDRESS
	JRST	ECOD3##		;THERE ISN'T ONE
	JRST	C11CPN		;GO PUT US ON THE RIGHT CPU
> ;END IFN DL10XI

C11DTX:
IFE FTKL10,<JRST ECOD22##>	;NO DTE SUPPORT
IFN FTKL10,<
	CAIL	T3,4		;DTE HAS PORTS 0-3
	JRST	ECOD20##	;ILLEGAL PORT NUMBER
	MOVE	T1,T2		;THE CPU NUMBER
	LSH	T1,2		;TIMES THE NUMBER OF DTES PER CPU (4)
	ADDI	T1,(T3)		;PLUS THE DTE NUMBER
	SKIPN	W,DTEBAS##(T1)	;HAVE ONE FOR THIS DTE?
	JRST	ECOD3##		;NO
	MOVE	P1,DLXWIN##(W)	;GET CPU#,,DTE#
	JRST	C11CPN		;GO PUT US ON THE RIGHT CPU
> ;END IFN FTKL10


C11KDX:
IFE FTKS10,<JRST ECOD23##>	;NO KDP SUPPORT
IFN FTKS10,<
	CAIL	T3,M.KDUP	;VALID LINE NUMBER
	JRST	ECOD3##		;NOPE
	MOVE	W,KDPBAS##(T3)	;GET BASE TABLE ADDRESS
	JRST	C11CPN
> ;END IFN FTKS10

C11DRX:
IFE FTKS10,<JRST ECOD24##>	;NO DMR SUPPORT
IFN FTKS10,<
	CAIL	T3,M.DMRN	;VALID LINE NUMBER
	JRST	ECOD3##		;NOPE
	MOVE	W,DMRBAS##(T3)	;GET BASE TABLE ADDRESS
> ;END IFN FTKS10

C11CPN:
IFE FTMP,<JUMPN T2,ECOD16##>	;WEED OUT JUNK CPU NUMBERS
IFN FTMP,<
IFN M.CPU-1,<
	MOVE	T1,T2		;GET THE CPU NUMBER
	PUSHJ	P,ONCPUS##	;SWITCH TO THAT CPU
	  JRST	ECOD16##	;CPU NOT RUNNING
> ;END IFN M.CPU-1
> ;END IFN FTMP

	HRRZ	T1,T4		;GET THE FUNCTION CODE
	JRST	CPOPJ1##	;AND RETURN


; BYTE POINTERS TO FIELDS IN THE FUNCTION WORD
C11TYP:	POINT	3,P1,11		;TYPE CODE
C11CPU:	POINT	3,P1,14		;CPU NUMBER
C11POR:	POINT	3,P1,17		;PORT NUMBER
CAL11N::MOVE	T1,DLXNMT##(W)	;GET NAME
	JRST	STOTC1##	;AND RETURN

CAL11T::SKIPE	T1,DLXFEK##(W)	;GET ADDRESS OF FEK
	HRLZ	T1,FEKNNM(T1)	;GET NODE NUMBER (IF ANY)
	HRR	T1,DLXTYP##(W)	;GET TYPE OF FRONT END
	JRST	STOTC1##	;RETURN

CAL11S::SKIPE	T1,DLXFEK##(W)	;GET ADDR OF FEK FOR THIS PORT
	SKIPL	T1,FEKBLK(T1)	;SKIP IF PORT UP
	TDZA	T1,T1		;DOWN
	MOVEI	T1,1		;UP
	JRST	STOTC1##	;SKIP RETURN
;COME HERE ONCE A SECOND.

IFN FTKS10*M.DN60,<
DLXSEC::PUSH	P,P1		;SAVE P1 FOR A BIT
IFN M.DN6K*M.KDUP,<		;IF ON A KS10 WITH IBM COMM
	MOVE	P1,[XWD -M.KDUP,KDPBAS] ;GET AN AOBJN POINTER TO THE BASE TABLE
DLXSE1:	MOVE	W,(P1)		;GET THE NEXT LINE
	PUSHJ	P,D6KSEC##	;SET DN60 TIME OUT THE CALL11 FUNCTIONS
	AOBJN	P1,DLXSE1	;LOOP OVER ALL LINES
>;M.DN6K
IFN M.DN6R*M.DMRN,<		;IF ON A KS10 WITH IBM COMM
	MOVE	P1,[XWD -M.DMRN,DMRBAS] ;GET AN AOBJN POINTER TO THE BASE TABLE
DLXSE2:	MOVE	W,(P1)		;GET THE NEXT LINE
	PUSHJ	P,D6KSEC##	;SET DN60 TIME OUT THE CALL11 FUNCTIONS
	AOBJN	P1,DLXSE2	;LOOP OVER ALL LINES
>;M.DN6R
	POP	P,P1		;RESTORE P1
	POPJ	P,		; AND RETURN
>; END IFN FTKS10
IFE FTKS10*M.DN60,<		;IF NOT ON A KS10 WITH IBM COMM
IFE DL10XI,<DLXSEC==:CPOPJ##>
IFN DL10XI,<
DLXSEC::
IFN M.CPU-1,<
	SKIPE	.CPCPN##	;DL10'S CAN ONLY BE ON CPU0
	POPJ	P,
>
	PUSHJ	P,SAVE3##	;SAVE P1-P3
	MOVSI	P1,-10		;AOBJN POINTER
D76SC1:	SKIPN	P2,DLXBAT##(P1)	;GET BASE ADDRESS OF THIS PDP11
	JRST	D76S1L		;NO.
	SKIPN	P3,DLXWIN##(P2)	;HAS IT A WINDOW?
	JRST	D76S1L		;NO WINDOW IS NO GOOD
	SKIPG	DLXDWN##(P3)	;IS THIS PDP11 UP?
	JRST	D76NTR		;NO.
	SKIPN	DLXHLT##(P3)	;YES, IS IT HALTED?
	JRST	D76S2L		;NO.
D76DWN:	SKIPG	DLXDWN##(P3)	;DO I THINK THE PDP11 IS UP?
	JRST	D76S1L		;NO.
	XCT	DLXCLR##(P2)	;YES, CLEAR ITS ENABLE.
	SETZM	DLXDWN##(P3)	;AND MARK IT DOWN.
	XCT	DLXPRG##(P2)	;DO ANY NECESSARY CLEAN UPS
	MOVE	T1,P1		;GET PORT #
	PUSHJ	P,DL10EL	;LOG ERROR

	MOVSI	T1,(JFCL)	;DISABLE ITS SERVICE ROUTINE
	MOVEM	T1,DLXINI##(P2)
	SETZM	DLXCAL##(P2)
	MOVEM	T1,DLXPRG##(P2)
D76S1L:	AOBJN	P1,D76SC1	;TRY NEXT PDP11.
	POPJ	P,		;NO MORE, ALL DONE.

D76S2L:	AOS	T1,DLXOK##(P3)	;COUNT THE "OK" COUNTER
	CAIL	T1,^D10		;IS THE PDP11 STILL OK?
	JRST	D76DWN		;NO, IT HAS GONE DOWN.
	JRST	D76S1L		;YES, GO ON TO NEXT PDP11.

;COME HERE IF A PDP11 IS NOT RUNNING.

D76NTR:	XCT	DLXCNI##(P2)	;CONI DLC,T1
	MOVEI	T2,22220	;PORT ENABLE BITS
	ANDCM	T2,T1		;T2 GETS A 1 FOR EACH PDP11
				;  NOT ENABLED
	LSH	T2,-1		;MOVE TO INTERRUPT BIT
	AND	T2,T1		;1 FOR EACH PDP11 LOADED BUT NOT
				;  YET STARTED.
	AND	T2,DLXMSK##(P2)	;MASK OFF BITS FOR OTHER PDP11S
	JUMPE	T2,D76S1L	;JUMP IF NOT OUR PDP11
	SETZM	DLXOK##(P3)	;NOT CRASHED YET
	SETZM	DLXHLT##(P3)	;NOR HALTED
	SETZM	TTP(P3)		;CLEAR THE Q'S
	SETZM	TTG(P3)		;CLEAR THE Q'S
	SETZM	TEP(P3)		;CLEAR THE Q'S
	SETZM	TEG(P3)		;CLEAR THE Q'S
	SETZM	DLXCEU##(P2)	;NO CAL11. USER
	MOVSI	T1,767760	;BUILD SIX BIT DL10 BYTE POINTER
	HRRI	T1,DLXNMT##(P2)	;INTO DL10 BASE TABLE
	SETZM	(T1)		;ZAP OLD NAME
	MOVEM	T1,DLXNAM##(P3)	;STORE POINTER TO NAME
	MOVEI	T1,2		;KILL IF NO RESPONSE IN 2 SEC
	MOVEM	T1,DLXDWN##(P3)	; BY MARKING PDP11 AS UP
	MOVE	T1,[PUSHJ P,D76CKN]	;CHECK NAME ON INTERRUPT
	MOVEM	T1,DLXINI##(P2)
	XCT	DLXKAX##(P2)	;SPECIFY KA10 INTERRUPTS (IN CASE NOT DONE ALREADY)
	XCT	DLXSWA##(P2)	;SET WINDOW ADDRESS
	XCT	DLXENB##(P2)	;ENABLE PORT
	JRST	D76S1L		;WAIT FOR INTERRUPT
>; END IFN DL10XI CONDITIONAL
>; END IFE FTKS10*M.DN60
>; END IFN <PDP11N!M.KL10!M.DN60!M.KDUP!M.DMRN>

IFN PDP11N,<
;COME HERE ON NEXT DL10 INTERRUPT FOR THIS PDP11.

D76CKN:	SKIPN	T1,DLXNMT##(W)	;NAME SPECIFIED YET?
	POPJ	P,		;NO.
IFN M.DC75,<
	CAMN	T1,[SIXBIT /DC75/]	;YES, DC75?
	JRST	D75III##	;YES, START UP DC75.
>
IFN M.DC76,<
	CAMN	T1,[SIXBIT /DC76/]	;NO, DC76?
	JRST	D76III##	;YES, START UP DC76.
>
IFN DLX.60,<IFN M.DN6D,<
	CAMN	T1,[SIXBIT /DN60/] ;NO, DN60?
	JRST	D60III##	;YES, START UP DN60
>>
	POPJ	P,		;NO, IGNORE IT.

;COME HERE ONCE A MINUTE.

IFE DL10XI,<D76MIN==:CPOPJ##>
IFN DL10XI,<
D76MIN::SKIPGE	DEBUGF##	;DEBUGGING
	POPJ	P,		;YES, NO MESSAGE
	PUSHJ	P,SAVE3##	;SAVE P1-P3
	MOVE	P1,UPTIME##	;GET UPTIME
	CAMGE	P1,TICMIN##	;MORE THAN 1 MINUTE
	POPJ	P,		;NO--TOO EARLY
	MOVSI	P1,-10		;MAXIMUM NUMBER OF PORTS
D76MLP:	SKIPE	P2,DLXBAT##(P1)	;IS THIS PDP11 DEFINED?
	SKIPN	P3,DLXWIN##(P2)	;YES, HAS IT A WINDOW?
	JRST	D76MNX		;NO, LOOK AT NEXT PDP11
	SKIPE	DLXDWN##(P3)	;IS IT UP OR SILENCED?
	JRST	D76MNX		;YES.
	MOVE	T1,STATES##	;SCHED SETTINGS
	TRNE	T1,ST.NOP	;IS THERE AN OPR IN ATTENDANCE?
	SETOM	DLXDWN##(P3)	;NO, ONLY REPORT THE ERROR ONCE
	MOVE	U,OPRLDB##	;NO, PRINT MESSAGE ON OPR'S TTY
	PUSHJ	P,INLMES##
	ASCIZ	/
%%PDP-11 number /
	MOVE	T1,DLXEPN##(P3)	;ELEVEN PORT NUMBER
	PUSHJ	P,RADX10##	;PRINT THAT OUT
	SKIPE	DLXHLT##(P3)	;HALTED?
	JRST	D76HLT		;YES.
	PUSHJ	P,INLMES##	;NO, JUST SAY NOT UP.
	ASCIZ	/ is not running.
/
	JRST	D76MNX		;CHECK NEXT PDP11

;STILL IN IFN DL10XI AND IFN PDP11N CONDITIONALS
;COME HERE IF THE PDP11 IS ACTUALLY HALTED.

D76HLT:	PUSHJ	P,INLMES##
	ASCIZ	/ halted at /
	MOVE	T1,DLXHLT##(P3)	;GET HALT PC (OR STOP CODE)
	PUSHJ	P,OCTPNT##	;TYPE IT OUT
	PUSHJ	P,INLMES##	;END WITH A DOT
	ASCIZ	/.
/
D76MNX:	AOBJN	P1,D76MLP	;CHECK THE REST OF THE PDP11S
	POPJ	P,		;DONE THEM ALL--RETURN.

	$LOW
>	;END OF IFN DL10XI CONDITIONAL
>	;END OF IFN PDP11N
SUBTTL	LOCATE & WHERE COMMAND/UUOS

IFE M.NET,<
	$HIGH
NODE.C::
HOST.C::
NETASG==:CPOPJ1##
IFE <M.DAS78!M.DN60>,<
CLOCAT::
CWHERE::
>	;END IFE M.DN60
	MOVSI	T1,JLOG		;IF NOT
	TDNN	T1,JBTSTS##(J)	;LOGGED IN
	DPB	T1,PJOBN##	;DON'T LEAVE GHOST JOB
	JSP	T1,ERRMES##	;CAN'T DO THESE IF NO NETWORK
	ASCIZ	/No network, DAS78, or DN60 software
/
	$LOW
>	;END IFE M.NET .IF M.NET=0 & M.DAS78!M.DN60, ONLY 1 LABEL, NETASG
	; IF BOTH=0,3LABELS

IFN	<M.NET!M.DAS78!M.DN60>,<
	$HIGH

;LOCATE COMMAND TO PLACE A JOB AT A REMOTE STATION SITE

CLOCAT::
	JSP	T2,SAVCTX##	;MUST SCHEDULE THIS COMMAND
	NETDBJ			;INTERLOCK THIS CODE WITH NETSER
	PUSHJ	P,CTEXT1##	;GET THE ARGUMENT IN SIXBIT
	SKIPN	T1,T2		;COPY TO T1
	JRST	LOCTHS		;NO ARGUMENT
	PUSHJ	P,CVTOCT##	;TRY TO CONVERT TO OCTAL
	  MOVE	T1,T2		;CAN'T-GET THE NAME BACK
LOCLC1:
IFN	M.NET,<
	PUSH	P,T1		;SAVE THE ARG
	PUSHJ	P,SRCNDB##	;SEARCH FOR THE NODE BLOCK
>;END IFN M.NET
	  JRST	LOCNOT		;DOES NOT EXIST
IFN	M.NET,<
	HLRZ	T1,NDBNNM##(W)	;YES, GET THE NODE NUMBER
	CAILE	T1,77		;KEEP IT REASONABLE
	JRST	LOCBIG		; FOR BATCH
	HRRZM	T1,JBTLOC##(J)	;LOCATE HIM WHERE HE WANTS
	POP	P,(P)		;RESTORE THE STACK
	PUSHJ	P,TYPNDB##	;TYPE THE NODE NAME
	JSP	T1,CONMES##	;EXIT TO COMDEV
	ASCIZ	/ Located
/
>;END IFN M.NET

LOCTHS:	PUSHJ	P,FNDSTA##	;GET STA NUMBER OF CONTROL TTY
	JRST	LOCLC1		;AND GO LOCATE HIM

LOCNOT:
IFN	M.NET,<
	POP	P,T1		;RESTORE THE ARG
>;END IFN M.NET
	CAIG	T1,77		;IS IT A NUMBER
IFN	M.NET,<
	JUMPG	T1,LOCNO1	;YES, WILL ALLOW THE LOCATE TO HAPPEN
	HRRZ	T1,NRTUNN##	;NO, UNDEFINE NETWORK NODE
>;END IFN M.NET
IFE	M.NET,<
	JUMPGE	T1,LOCNO1	;YES, WILL ALLOW THE LOCATE TO HAPPEN
	HRRZI	T1,[ASCIZ \Invalid station address\] ;NO.
>;END IFE M.NET
	PJRST	ERRMES##	;TYPE IT

LOCNO1:	HRRZM	T1,JBTLOC##(J)	;STORE THE LOCATION
	PUSHJ	P,INLMES##	;TYPE A MESSAGE
IFN M.NET,<
	ASCIZ	/%Node (/
>
IFE M.NET,<
	ASCIZ	/Station /
>
	HRRZ	T1,JBTLOC##(J)	;GET THE NUMBER
	PUSHJ	P,PRTDI8##	;PRINT THE NUMBER
	PUSHJ	P,INLMES##	;AND A COMMENT
IFN	M.NET,<
	ASCIZ	/) Located but off-line
/
>;END IFN M.NET
IFE	M.NET,<
	ASCIZ	/ Located
/
>;END IFE M.NET
	POPJ	P,		;RETURN
IFN M.NET,<
LOCBIG:	POP	P,T1		;RESTORE THE ARG
	MOVEI	T1,[ASCIZ/Station number out of range/] ;LOAD ERROR
	PJRST	ERRMES##	;TYPE IT AND RETURN
>;END IFN M.NET
;WHERE COMMAND - SIMILAR TO WHERE UUO
;THE LOCATION OF A DEVICE IS TYPED ON THE USER'S TTY

CWHERE::JSP	T2,SAVCTX##	;SAVE THE CONTEXT OF THE JOB
IFN FTMP,<PUSHJ	P,ONCPU0##>	;TEMPORARY AVOID COMCON RACE
	NETDBJ			;INTERLOCK THIS WITH NETSER
	PUSHJ	P,CTEXT1##	;GET FIRST ARG = SIXBIT DEV NAME
IFN M.NET,<
	PUSHJ	P,NETASG##	;SEE IF IT'S OF THE FORM "NODE_DEV"
				; AND IF IT IS, CHANGE IT TO "GGGNNU"
	POPJ	P,		;HERE IF ERROR IN NAME. (MSG ALREADY PRINTED)
>;END IFN M.NET
	PUSH	P,T2		;SAVE 6 BIT
	PUSHJ	P,FNDSTA##	;GET OUR STATION
	POP	P,T2		;GET 6 BIT NAME
	MOVE	T1,T2		;INTO T1
	PUSH	P,U		;SAVE U
	PUSHJ	P,DVCNSG##	;SEARCH FOR PHYSICAL DEV NAME
	JRST	NOTDV1##	;PRINT "NO SUCH DEVICE"
	PUSHJ	P,FNDDEV	;FIND LOCATION
IFN M.NET,<MOVE	U,(P)>		;RETRIEVE U (MAYBE LDB)
	LDB	T2,[POINT 6,DEVTYP(F),9] ;GET TYPE OF DEVICE
IFN M.NET,<
IFN M.DAS78,<
	CAIN	T2,.TYD78/.TYEST ;IS IT A DAS78?
	JRST	WCMD78		;YES
> ;END IFN M.DAS78
> ;END IFN M.NET
IFE M.NET,<JRST UPOPJ##>	;RESTORE U AND RETURN
IFN M.NET,<
	CAIE	T2,.TYTTY/.TYEST;IS IT A TTY?
	JRST	CWHANF		;NO, JUST REGULAR DEVICE
	MOVE	U,DDBLDB(F)	;GET TARGET TTY'S LDB
	SE1XCT	<MOVE T4,LDBTTW##(U)>  ;GET THE TTY USE FLAGS
	TLNN	T4,LTLUSE##	;IS TTY IN USE?
	JRST	CWHNCN		;NO, JUST SAY "NOT CONNECTED"
IFN M.DECN,<			;IF DECNET,
	TLNE	T4,LTLNRT##	;IF NRT/CTERM
	JRST	CWHNRT##	;LET NRTSER TYPE IT OUT
> ;END IFN M.DECN
IFN M.LATN,<			;IF ETHERNET/LAT
	TLNE	T4,LTLLAT##	;IF LAT TERMINAL
	PJRST	CWHLAT##	;LET LATSER TYPE IT OUT
> ;END IFN M.LATN
				;FALL INTO ANF/LOCAL TTY TYPEOUT
;STILL IFN M.NET

CWHANF::MOVE	U,0(P)		;COMMAND TTY LDB
	PUSHJ	P,SRCNDB##	;SEARCH FOR THE NDB
	  MOVEI	W,NETNDB##	;USE THE LOCAL MODE
	PUSHJ	P,TYPNDB##	;TYPE THE NODE INFO
	PUSHJ	P,PRSPC##
	MOVE	T2,DEVNAM(F)
	PUSHJ	P,PRNAME##
	MOVSI	T1,DVTTY	;CHECK FOR A TTY
	TDNN	T1,DEVMOD(F)	;IS DEVICE A TTY?
	JRST	[PUSHJ	P,ZAPNET##	;NO, FREE DDB IF APPROPRIATE
		POP	P,U		;AND EXIT
		PJRST	CRLF##]
	MOVE	U,DDBLDB##(F)	;YES, GET THE LDB
	SE1XCT	<LDB T1,LDPLNO##> ;GET THE LOCAL LINE NUMBER
	MOVSI	T2,LTLANF##	;ANF NETWORK VIRTUAL TERMINAL FLAG
	SE1XCT	<TDNE T2,LDBTTW##(U)> ;CHECK A BIT
	SE1XCT	<LDB T1,LDPRLN##> ;GET REMOTE LINE NUMBER
	POP	P,U		;RESTORE THE LDB
	PUSH	P,T1		;SAVE LINE NUMBER
	PUSHJ	P,INLMES##	;TYPE OUT
	ASCIZ	/ line # /
	POP	P,T1		;RESTORE LINE NUMBER
	PUSHJ	P,PRTDI8##	;TYPE IT
	PJRST	PCRLF##		;AND CRLF

CWHNCN::MOVE	U,0(P)		;RETRIEVE COMMAND TERMINAL LDB FOR TYPEOUT
	PUSHJ	P,INLMES##	;DEVICE IS NOT CONNECTED . . .
	ASCIZ	\Device	\
	MOVE	T2,DEVNAM(F)	;GRAB THE DEVICE NAME
	PUSHJ	P,PRNAME##	;AND TYPE IT OUT
	PUSHJ	P,INLMES##	;NOT CONNECTED
	ASCIZ	/ not connected
/
	PUSHJ	P,TTYKLQ##	;ZAP THE USELESS DDB
        POP	P,U
	POPJ	P,		;RETURN
>;END IFN M.NET
IFN M.DAS78,<
WCMD78:	POP	P,U		;RESTORE LDB
	PUSHJ	P,INLMES##	;PRINT THE MESSAGE
	ASCIZ	\NODE	\
IFN	M.NET,<
	MOVE	T2,STANAM##	;CENTRAL STATION NAME
	PUSHJ	P,PRNAME##	;PRINT CENTRAL NAME
>;END IFN M.NET
	MOVEI	T3,"("		;LEFT PAREN
	PUSHJ	P,COMTYO##	;TYPE IT
	LDB	T1,PDVSTA##	;GET STATION #
	PUSHJ	P,PRTDI8##	;PRINT IT
	PUSHJ	P,INLMES##	;
	ASCIZ	\) \		;
	MOVEI	T1,CONFIG##	;SYSTEM NAME
	PUSHJ	P,CONMES##	;PRINT IT
	PUSHJ	P,PRSPC##	;SPACE
	MOVEI	T1,SYSDAT##	;DATE
	PJRST	CONMES##	;
>;END IFN M.DAS78


;ROUTINE TO FIND LOCATION OF A DEVICE
;RETURN WITH T1=LOCATION
FNDDEV::LDB	T1,PDVSTA##	;GET DDB LOCATION
	MOVSI	T2,DVTTY	;SEE IF
	TDNN	T2,DEVMOD(F)	; TTY
	POPJ	P,		;NO.
	MOVE	U,DDBLDB##(F)	;YES, SET UP U
	PJRST	FNDSTA##	;AND COMPUTE FROM LDB

;WHERE UUO
;IF AC CONTAINS 0 TO 17 THE CALLER WANTS THE LOCATION OF THE DEVICE
;INITED ON THE CHANNEL NUMBER SPECIFIED IN AC. LH(AC) = STA STATUS BITS
;IF AC IS GREATER THAN 17 IT IS ASSUMED TO BE A SIXBIT DEVICE NAME
;THAT THE CALLER WISHES TO KNOW THE STATION OF. LH(AC) = STA STATUS BITS

WHERE::
IFN FTMP,<			;TEMPORARY
	PUSHJ	P,ONCPU0##	;AVOID COMCON RACE
>
	NETDBJ			;INTERLOCK THIS WITH NETSER
	CAMN	T1,[SIXBIT/OPR/]	;IS IT AN OPR
	JRST	[HRRZ	T1,JBTLOC##(J)	;YES, GET THE JOB LOCATION
		PJRST	STOTC1##]	;RETURN LOCATION OF THE JOB
	PUSHJ	P,DVCNSG##	;SEARCH FOR DEVICE OR CHANNEL
	  JRST RTZER##		;NONE--RETURN ERROR AS 0.
	PUSHJ	P,FNDDEV	;GET STATION NUMBER
	JUMPN	T1,WHER1	;USE IT IF NON ZERO
IFN M.DAS78,<
	LDB	T2,[POINT 6,DEVSTA(F),9] ;GET TYPE OF DEVICE
	CAIE	T2,.TYD78/.TYEST ;IF DAS78 DEV LEAVE IT 0
> ;END IFN M.DAS78
	MOVE	T1,JBTLOC##	; OTHERWISE USE CENTRAL SITE NUMBER
WHER1:
IFN FTSPL,<
	SKIPN	DEVCHR(F)	;IF A "FAKE" DDB,
	HRRZ	T1,JBTLOC##(J)	;TELL WHERE JOB IS
>
IFN M.DAS78,<
IFN M.NET,<
	LDB	T2,[POINT 6,DEVSTA(F),9] ;GET DEVICE TYPE
	CAIE	T2,.TYD78/.TYEST ;SKIP IF A DAS78 DEVICE
> ;END IFN M.NET
IFE M.NET,<
	JRST	STOTC1##	;STATUS BITS TO 0 AND RETURN
> ;END IFE M.NET
> ;END IFN M.DAS78
IFN	M.NET,<
	CAMN	T1,JBTLOC##	;CENTRAL SITE?
	JRST	STOTC1##	;YES, STATUS BITS ALL ZERO.
	PUSHJ	P,SRCNDB##	;FIND THE NODE BLOCK
	  JRST	RTZER##		;DOES NO EXIST
	HLRZ	T1,NDBNNM##(W)	;GET THE NODE NUMBER
;	HLL	T1,SCBSTS##(W)	;GET THE STATUS BITS
>;END IFN M.NET
	JRST	STOTC1##	;STORE T1 IN USER'S AC

;LOCATE UUO (CALLI 62)
;PLACES THE CALLER AT THE DESIRED STATION SITE
;CALL: AC HAS STATION NAME OR NUMBER TO LOCATE AT

LOCATE::
	NETDBJ			;INTERLOCK THIS WITH NETSER
	SKIPN	F,TTYTAB##(J)	;POINT TO JOB'S TTY
	JRST	LOCAT3		;NONE.
	CAME	T1,[EXP -1]	;IF ARG IS -1...
	JRST	LOCAT3		;NO
	PUSHJ	P,FNDDEV	;PUT JOB WHERE TTY IS
	JRST	LOCAT4		;LOCATE THE JOB
LOCAT3:	MOVE	T2,T1		;COPY ARGUMENT
	PUSHJ	P,CVTOCT##	;CONVERT TO OCTAL
	  MOVE	T1,T2		;CAN'T, RESTORE
	JUMPE	T1,LOCAT1	;0 IMPLIES LOCAL NODE
IFN M.NET,<
	TLNN	T1,-1		;LOOK LIKE A NODE NAME?
	JRST	LOCAT4		;NO, MUST BE NODE NUMBER
	PUSHJ	P,SRCNDB##	;DO WE KNOW ABOUT IT?
	  POPJ	P,		;NO, CAN'T LOCATE
	HLRZ	T1,NDBNNM##(W)	;GET NODE NUMBER
>
LOCAT4:	CAILE	T1,77		;IS THE STATION IN RANGE
	POPJ	P,		;NO, ERROR RETURN
LOCAT2:	HRRZM	T1,JBTLOC##(J)	;LOCATE JOB
	JRST	CPOPJ1##	;GIVE GOOD RETURN

LOCAT1:	MOVE	T1,JBTLOC##	;CENTRAL LOCATION
	JRST	LOCAT2		;PUT HIM THERE.

	$LOW

>;END IFN <M.NET!M.DAS78!M.DN60>

	$LIT

IFNDEF FTCMBTH,<COMEND:	END>