Google
 

Trailing-Edge - PDP-10 Archives - scratch - 10,7/unscom/dc72/dc72np.pal
There are 6 other files named dc72np.pal in the archive. Click here to see a list.
/DC72NP - NETWORK REMOTE STATION SOFTWARE FOR DECSYSTEM-10 - 24 OCT 78
/***COPYRIGHT 1973,1974,1975,1976,1977,1978 BY DIGITAL EQUIPMENT CORP., MAYNARD MASS. ***
/DAVE MCCLURE	20-FEB-1973
/KALMAN RETI	25-APR-1975
/DAN DEUFEL	24-OCT-1978
/ THIS CODE WILL ASSEMBLE EITHER DC71 OR DC72 CODE
/ THE EXISTENCE OF A FEATURE TEST SWITCH IN THIS CODE DOES NOT IMPLY
/ THE SWITCH IS TESTED OR SUPPORTED.
/	E.G. FEATURE TEST SWITCHES ARE PROVIDED FOR STATIONS WITH A HIGH
/	SPEED PAPER TAPE READER/PUNCH OR A PLOTTER BUT THESE ARE NOT
/	SUPPORTED.
	MAJOR=0;MINOR=32

	VEDIT=MAJOR^100+MINOR /SOFTWARE VERSION NUMBER

/STARTING INSTRUCTIONS
/	NORMAL STARTING ADDRESS IS 200
/	RESTART ADDRESS IS 200

/ASSEMBLY INSTRUCTIONS
/	.R PAL10
/	*DSK:CLDR.BIN=DSK:CLDR.PAL
/	*DSK:PCH.BIN=DSK:C.PAL,DSK:DC72NP.PAL
/	WHERE C.PAL IS A CONFIGURATION FILE
/ THEN
/	.R 8CARDS	TO PRODUCE A CARD DECK
/ OR
/	.R PIP
/	*PTP:/I=DSK:PCH.BIN
/DEFAULT SWITCHES

IFNDEF PDP8 <PDP8=2>		/FOR PDP8I USE 1
				/FOR PDP8E USE 2
	PDP8I=PDP8-1
	PDP8E=PDP8-2

IFNDEF FTDP01 <
	IFZERO PDP8I <FTDP01=-1>/DEFAULT IS DP01 HDW
	IFZERO PDP8E <FTDP01=0>	/DEFAULT FOR 8E IS DP8E
>/END OF IFNDEF	FTDP01
IFNZRO FTDP01 <FTDP8E=0>
IFZERO FTDP01 <FTDP8E=-1>

IFNDEF FTDC02F <
	IFZERO PDP8I <FTDC02F=-1>/DEFAULT IS DC02F HDW
	IFZERO PDP8E <FTDC02F=0>/DEFAULT FOR 8E IS KL8E
>/END OF IFNDEF FTDC02F

IFNDEF TTYN <TTYN=20>		/DEFAULT IS SIXTEEN TTY'S

IFNDEF CDRN <CDRN=1>		/DEFAULT IS ONE CDR
 IFNZRO CDRN <CDRN=1>		/AT MOST ONE CDR

IFNDEF LPTN <LPTN=1>		/DEFAULT IS ONE LPT
 IFNZRO LPTN <LPTN=1>		/AT MOST 1
 IFNDEF FTLPLC <FTLPLC=0>	/1 IF LPT HANDLES LC CHARS
 IFNDEF LPTWID <LPTWID=204>	/WIDTH OF LPT
				/ 132 DECIMAL IS 204 OCTAL
				/ 80 DECIMAL IS 120 OCTAL
 IFNDEF LPTFAK <LPTFAK=0>	/IF NONZERO THROW AWAY LPT OUTPUT

IFNDEF PTRN <PTRN=0>		/DEFAULT IS NO PTR - NOT SUPPORTED
 IFNZRO PTRN <PTRN=1>		/AT MOST ONE PTR
IFNDEF PTPN <PTPN=0>		/DEFAULT IS NO PTP - NOT SUPPORTED
 IFNZRO PTPN <PTPN=1>		/AT MOST ONE PTP

	PLTN=0
IFNDEF PLTN <PLTN=0>		/PLOTTER XY8/E - NOT SUPPORTED
 IFNZRO PLTN <PLTN=1>		/AT MOST ONE PLT

IFNDEF DTAN <DTAN=0>		/DEFAULT IS NO DTA
				/ NOT IMPLEMENTED

IFNDEF CNKSIZ <CNKSIZ=10>	/SIZE OF CHUNKS - DEFAULT IS 8 WORDS
  CNKSIZ=CNKSIZ&374		/MUST BE IN RANGE 4-200
  IFZERO CNKSIZ <CNKSIZ=40>
  Z=-CNKSIZ
  CNKSIZ=CNKSIZ&Z		/ MUST BE A POWER OF 2

IFNDEF FTDEBUG <FTDEBUG=1>	/1 FOR DEBUGGING FEATURES
  IFNDEF FTLBACK <FTLBACK=0>	/1 FOR LOOPBACK TEST
  IFNDEF FTTRBL <FTTRBL=0>	/1 FOR CTY MSG ON DEVICE TIMEOUT
  IFNDEF FTBIGL <FTBIGL=0>	/0 TO XLIST UNUSED CODE

IFNDEF CNKFLD <CNKFLD=1>	/0 = KEEP CHUNKS IN FIRST FIELD
	CNKFLD=CNKFLD&0007	/ 1 = KEEP CHUNKS IN SECOND FIELD
				/ 2 = KEEP CHUNKS IN THIRD FIELD

  IFNDEF NUMSYN <NUMSYN=10>	/NUMBER OF SYNCHS AT BEGINING OF MESSAGE

	IFNDEF OURNNM <OURNNM=72>/OUR NODE NUMBER
	IFNDEF MAXOLN <MAXOLN=240+4>/MAX OUTPUT MESSAGE LENGTH=CARD+OVRHEAD
	DEVN=1+TTYN+CDRN+LPTN+PTRN+PTPN+PLTN+DTAN
	CTRLN=1+LPTN+CDRN+PTPN+PTRN+PLTN/NUMBER OF CONTROLLERS(FOR DDCMP)

IFNDEF REPTIM <REPTIM=170>	/REP TIMEOUT = 2 SECS

IFNZRO DTAN <CTRLN=CTRLN+1>

IFNDEF TTYMIC <TTYMIC=120>	/MAXIMUM NUMBER OF INPUT CHARS FROM A TTY

ERSCNT=2
IFNZRO CDRN <ERSCNT=ERSCNT+CDRCNK>/WORST CASE CARD LENGTH
IFNZRO PTRN <ERSCNT=ERSCNT+1>	/WORST CASE TO STOP PTR

IFNDEF	DP8ETR	<DP8ETR=0	/CODE TO TRACE DP8E MESSAGES
IFNZRO	FTDP8E	<
IFNZRO	FTDEBUG	<
/DP8ETR=1			/DEFAULT IS TRACE OFF
>/END OF IFNZRO	FTDEBUG
>/END OF IFNZRO	FTDP8E
>/END OF IFNDEF	DP8ETR

/SOFTWARE IDENTIFICATION STRING (SID)
	DEFINE	SIDTXT	<
"D;"C;"7;260+PDP8;"N;"P;" ;"V;"0;".;"3;"2-200;"2;"4;"-;"O;"C;"T;"-;"7;"8-200
>/END SIDTXT DEFINITION
/	SET DEFAULT CHUNK COUNTS
	IFNDEF	LPTCHK	<LPTCHK=-20>
	IFNDEF	TTYCHK	<TTYCHK=-4>

IFNDEF	BOOTSZ	<BOOTSZ=1420>	/SIZE OF BOOTSTRAP PROGRAM

/	SET RESTRICTED NODE NUMBER TO 0 FOR ALL DEVICES
	XLIST
IFNDEF	CTYRNN <CTYRNN=0>
IFNDEF	T00RNN <T00RNN=0>
IFNDEF	T01RNN <T01RNN=0>
IFNDEF	T02RNN <T02RNN=0>
IFNDEF	T03RNN <T03RNN=0>
IFNDEF	T04RNN <T04RNN=0>
IFNDEF	T05RNN <T05RNN=0>
IFNDEF	T06RNN <T06RNN=0>
IFNDEF	T07RNN <T07RNN=0>
IFNDEF	T10RNN <T10RNN=0>
IFNDEF	T11RNN <T11RNN=0>
IFNDEF	T12RNN <T12RNN=0>
IFNDEF	T13RNN <T13RNN=0>
IFNDEF	T14RNN <T14RNN=0>
IFNDEF	T15RNN <T15RNN=0>
IFNDEF	T16RNN <T16RNN=0>
IFNDEF	T17RNN <T17RNN=0>
IFNDEF	T20RNN <T20RNN=0>
IFNDEF	T21RNN <T21RNN=0>
IFNDEF	T22RNN <T22RNN=0>
IFNDEF	T23RNN <T23RNN=0>
IFNDEF	T24RNN <T24RNN=0>
IFNDEF	T25RNN <T25RNN=0>
IFNDEF	T26RNN <T26RNN=0>
IFNDEF	T27RNN <T27RNN=0>
IFNDEF	CDRRNN <CDRRNN=0>
IFNDEF	LPTRNN <LPTRNN=0>
IFNDEF	PTRRNN <PTRRNN=0>
IFNDEF	PTPRNN <PTPRNN=0>
IFNDEF	PLTRNN <PLTRNN=0>
	XLIST

/CORE LAYOUT FOR THIS VERSION OF DC72 CODE

/PAGE 0
/	0-7	INTERRUPT TRAP
/	10-17	AUTOINDEX REGISTERS
/	20-25	INTERRUPT DISSMISS ROUTINE
/	26-177	COMMON VARIABLE STORAGE
/PAGE 1
/	200	NORMAL STARTING ADDRESS
/	201	HALT (FORMERLY DUMP STARTING ADDRESS)
/	202	VERSION NUMBER OF DC72 CODE
/
/	DUMP ROUTINE
/	INITIALIZATION
/	NON-INTERRUPT LEVEL CODE
/	DEVICE INTERRUPT ROUTINES
/ * CHANGE TO CHUNK FIELD *
/	TABLE DATA = DEVICE BLOCKS, MESSAGES, PARITY TABLE, LPT VFU ETC.
/	SYSCHK - OVERWRITTEN LATER TO FORM CHUNKS


/EIA PINS FROM DP8E AND DP01
/	1	PROTECTIVE GROUND
/	2	TRANSMITTED DATA
/	3	RECEIVED DATA
/	4	REQUEST TO SEND
/	5	CLEAR TO SEND
/	6	DATA SET READY
/	7	SIGNAL GROUND
/	8	RECEIVED LINE SIGNAL DECTECTOR
/	17	RECEIVED SIGNAL ELEMENT TIMING
/	20	DATA TERMINAL READY
/	21	SIGNAL QUALITY DETECTOR
/	22	RING INDICATOR
/	24	TRANSMIT SIGNAL ELEMENT TIMING
/CARD LOADER FOR DC71'S IS
/
/	117570	6672	SELECT CARD READER AND SKIP IF READY
/	117571	5370	JMP .-1
/	117572	6631	SKIP ON DATA READY
/	117573	5372	JMP .-1
/	117574	6634	READ DATA BINARY
/	117575	3270	DCA 7470
/	117576	2375	ISZ .-1
/	117577	5372	JMP 7572


/RIM LOADER FOR LOW SPEED PAPER TAPE IS
/	117756	6032		/CLEAR KEYBOARD FLAG & ADVANCE READER
/	117757	6031		/SKIP ON KEYBOARD FLAG
/	117760	5357		/JMP .-1
/	117761	6036		/READ KEYBOARD BUFFER, CLEAR FLAG
/	117762	7106		/CLL RTL
/	117763	7006		/RTL
/	117764	7510		/SPA
/	117765	5357		/JMP 117757 - SKIP LEADER, TRAILER
/	117766	7006		/RTL
/	117767	6031		/SKIP ON KEYBOARD FLAG
/	117770	5367		/JMP .-1
/	117771	6034		/READ KEYBOARD STATIC
/	117772	7420		/SNL
/	117773	3776		/DCA @117776
/	117774	3376		/DCA 1176
/	117775	5356		/JMP 117756


/RIM LOADER FOR HIGH SPEED PAPER TAPE IS
/	117756	6014		/READER FETCH CHARACTER
/	117757	6011		/SKIP ON READER FLAG
/	117760	5357		/JMP .-1
/	117761	6016		/READ READER BUFFER, AND FETCH NEW CHARACTER
/	117762	7106		/CLL RTL
/	117763	7006		/RTL
/	117764	7510		/SPA
/	117765	5374		/JMP 117774 - SKIP LEADER, TRAILER
/	117766	7006		/RTL
/	117767	6011		/SKIP ON READER FLAG
/	117770	5367		/JMP .-1
/	117771	6016		/READ READER STATIC
/	117772	7420		/SNL
/	117773	3776		/DCA @117776
/	117774	3376		/DCA 1176
/	117775	5357		/JMP 117757
/CODING CONVENTIONS
/
/ 1.)	THE FIRST 3 CHARS OF A SYMBOL INDICATE WHEN THE LABEL IS USED
/	  CLKXXX IS USED AT CLOCK LEVEL(I.E. EVERYTIME CLOCK TICKS)
/	  INIXXX IS USED AT INITIALIZATION TIME.
/	  INTXXX IS USED AT INTERRUPT LEVEL
/	  IXXXXX IS USED AT INTERRUPT LEVEL
/	  DEVXXX IS USED TO REFERENCE DATA IN DEVICE BLOCK
/	  LDBXXX IS USED FOR A LDB ADDRESS
/	  NLXXXX IS USED FOR A NUMERICAL LOAD INSTRUCTION
/
/ 2.)	INTERRUPTS ALWAYS SAVE THE AC(BUT NOT THE LINK)
/	  INTERRUPTS DO NOT CHANGE OR CHECK INSTRUCTION OR DATA FIELD
/	  THE NORMAL INSTRUCTION FIELD IS 0; THE NORMAL DATA FIELD IS
/	  THE CHUNK FIELD(USUALLY 1)
/
/ 3.)	INSTRUCTIONS WHICH ARE CHANGED ARE FLAGED WITH ######## RH SIDE
/DEFINE CHAIN FOR INTERRUPTS & ONCE/TICK CODE
/
/	EVERY DEVICE IS TO HAVE A 3 LETTER MNEMNOIC "XYZ"
/
/	LABEL TO TEST FOR INTERUPTS FOR DEVICE IS INTXXX
/	 WHEN TEST FAILS WILL BRANCH TO INTXY9
/
/	LABEL TO BRANCH TO ONCE / SECOND IS CLKXYZ
/	 WHEN FINISHED WILL BRANCH TO CLKXY9
/	FOLLOWING ARE LABEL DEFINITIONS(MUST BE IN INCREASING PRIORITY):

IFDEF LOOP <		/THIS IS ASSEMBLED ONLY FOR PASS 2

INTMO9=INTMEM

INTPL9=INTMOD
CLKPL9=LOOP		/END OF CLOCK CHAIN

	IFNDEF INTPLT <	INTPLT=INTPL9
			CLKPLT=CLKPL9
>/END OF IFNDEF	INTPLT
INTPP9=INTPLT
CLKPP9=CLKPLT

	IFNDEF INTPTP <	INTPTP=INTPP9
			CLKPTP=CLKPP9
>/END OF IFNDEF	INTPTP
INTPR9=INTPTP
CLKPR9=CLKPTP

	IFNDEF INTPTR <	INTPTR=INTPR9
			CLKPTR=CLKPR9
>/END OF IFNDEF	INTPTR
INTCT9=INTPTR
CLKCT9=CLKPTR

INTCL9=INTCTY

INTLP9=INTCLK
CLKLP9=CLKPTR		/NO SPECIAL CLOCK CODE FOR CTY

	IFNDEF INTLPT <	INTLPT=INTLP9
			CLKLPT=CLKLP9
>/END OF IFNDEF	INTLPT
INTTY9=INTLPT
CLKTY9=CLKLPT

	IFNDEF	INTTTY <INTTTY=INTTY9>
INTCD9=INTTTY
CLKCD9=CLKTTY

	IFNDEF INTCDR <	INTCDR=INTCD9
			CLKCDR=CLKCD99
>/END OF IFNDEF	INTCDR
INTDP9=INTCDR

SCHAIN=INTDPX		/BEGIN SKIP CHAIN WITH SYNCHRONOUS INTERRUPTS

>/END OF IFDEF LOOP
/	***********************************************************
/	***********************************************************
/	***							***
/	***		DEVICE BLOCK DESCRIPTION		***
/	***							***
/	***********************************************************
/	***********************************************************

/DEFINITIONS OF DATA IN DEVICE BLOCK
/ ORDER IS IMPORTANT SO BE CAREFUL IF U CHANGE THEM

DEFINE X Q QQ <XLIST;QQ=QQ+1;XLIST
		Q=QQ-1>/END OF DEFINE X
	DDBSIZ=-3

/DEVICE RESTRICTED NODE NUMBER (NEGATIVE OF NUMBER OF
/ONLY NODE ALLOWED TO CONNECT TO DEVICE. 0 MEANS ANY NODE
/MAY CONNECT
	X	DEVRNN,DDBSIZ

/DEVICE CHUNK IN USE COUNT (USED BY OUTPUT DEVICES)
/	SET TO MINUS NUMBER OF CHUNKS ALLOWED TO BE TIED UP BY DEVICE
	X	DEVCHK,DDBSIZ

/DEVICE NUMBER (OCCUPIES WORD BEFORE DDB) - 0 EXCEPT FOR TTY'S
	X	DEVNUM,DDBSIZ


/DEVICE ID # FOR INPUT	- LH IS OBJECT TYPE, RH IS CONNECT NUMBER
	X DEVSID,DDBSIZ

/POINTER TO CURRENT OUTPUT CHAR
	X DEVOAD,DDBSIZ

/POINTER TO LAST OUTPUT CHUNK
	X DEVOLC,DDBSIZ

/DEVICE STATUS - FOR ALL DEVICES
	X DEVSTS,DDBSIZ
		/ 4000	DEVICE ACTIVE(NOT SET FOR TTY INPUT)
CONBIT=2000	/ 2000 DEVICE IS CONNECTED
		/ 1000	NEED TO SEND A CONNECT CONFIRM (IF 2000 BIT ON)
		/       OR A DISCONNECT (IF 2000 BIT OFF)
OUTBIT=0100	/ 0100	DEVICE IS OUTPUT(I.E. NEEDS TO SEND DATA REQUESTS)
TTYBIT=0040	/ 0040	DEVICE IS A TTY
IRMBIT=0002	/ 0002	IRMA BIT
STSBIT=0001	/ 0001	MEANS SEND DEVICE STATUS

/DEVICE DATA REQUESTS
	X DEVDRQ,DDBSIZ

/DDCMP DEVICE STATUS
	X DEVDDC,DDBSIZ

/PRIMARY BUFFER ADR
	X DEVBF1,DDBSIZ

/SECONDARY BUFFER ADR
	X DEVBF2,DDBSIZ

/DEVICE INPUT CHAR ADR
	X DEVIAD,DDBSIZ
	X DEVIFC,DDBSIZ

/TIMER FOR DEVICE
	X DEVTIM,DDBSIZ

/DDB LINK
	X DEVLNK,DDBSIZ
/DEFINITIONS OF WORDS ONLY IN TTY DEVICE BLOCKS

LDBSIZ=DDBSIZ

/TTY ADDRESS
	X LDBADR,LDBSIZ
		/ HDW ADR FOR LINE

/TTY OUTPUT COLUMN - CHANGES AT INTERRUPT LEVEL
	X LDBCOL,LDBSIZ

/TTY CARRIAGE WIDTH
	X LDBWID,LDBSIZ

/TTY XOF POINTER - CHANGES AT INTERRUPT LEVEL
	X LDBXPT,LDBSIZ

/TTY FILL POINTER - CHANGES AT INTERRUPT LEVEL
	X LDBFPT,LDBSIZ

/CHAR TO TYPE NEXT - CHANGES AT INTERRUPT LEVEL
	X LDBCHR,LDBSIZ


/POINTER TO LAST INPUT CHAR - CHANGES AT INTERRUPT LEVEL
	X LDBIPT,LDBSIZ


/TTY ECHO PIPELINE MARKER
	X LDBEPL,LDBSIZ

/TTY FILL COUNTS
	X LDBFIL,LDBSIZ
	LDBSIZ=LDBSIZ+5
/DEFINE OPCODES WHICH PAL10 DOESN'T KNOW ABOUT

IFZERO PDP8E <
SKON=6000		/SKIP IF INTERRUPTS ARE ON
GTF=6004		/READ MACHINE STATE INTO AC
CAF=6007		/CLEAR ALL FLAGS
MQL=7421		/MQ LOAD = AC TO MQ, AC CLEARED
MQA=7501		/MQ ORED INTO AC
SWP=7521		/SWAP AC AND MQ
CAM=7621		/CLEAR AC AND MQ
>/END OF IFZERO PDP8E

BSW=7002		/BYTE SWAP ON 8E
NEGATE=CML CMA IAC	/NEGATE AC & LINK
NL0=CLA CLL		/LOAD AC& LINK WITH ZERO
NL1=CLA CLL IAC		/LOAD AC & LINK WITH 1
NL2=CLA CLL IAC RAL
NL3=CLA CLL CML IAC RAL
NL4=CLA CLL IAC RTL
NL6=CLA CLL CML IAC RTL
NL2000=CLL CLA CML RTR
NL3777=CLL CLA CMA RAR
NL4000=CLL CLA CML RAR
NL6000=CLL CLA CML IAC RTR
NL7775=CLL CLA CMA RTL
NL7776=CLL CLA CMA RAL
NL7777=CLL CLA CMA
NLM1=CLL CLA CML CMA	/LOAD -1
NLM2=NL7776		/LOAD -2
NLM3=NL7775		/LOAD -3

DEFINE	NLOAD	X	<XLIST
Z=7402
IFZERO X	< Z=CLL CLA >
IFZERO X-1	< Z=CLL CLA IAC >
IFZERO X-2	< Z=CLL CLA IAC RAL >
IFZERO X-3	< Z=CLL CLA IAC CML RAL >
IFZERO X-4	< Z=CLL CLA IAC RTL >
IFZERO X-6	< Z=CLL CLA IAC CML RTL >
IFZERO X-2000	< Z=CLL CLA CML RTR >
IFZERO X-3777	< Z=CLL CLA CMA RAR >
IFZERO X-4000	< Z=CLL CLA CML RAR >
IFZERO X-5777	< Z=CLL CLA CMA RTR >
IFZERO X-6000	< Z=CLL CLA CML IAC RTR >
IFZERO X-7775	< Z=CLL CLA CMA RTL >
IFZERO X-7776	< Z=CLL CLA CMA RAL >
IFZERO X-7777	< Z=CLL CLA CML CMA >
IFZERO Z-7402	< ***** BUM NLOAD CALL >
	XLIST;	Z	>/END OF DEFINE	NLOAD
/MACRO DEFINITIONS

IFNZRO FTBIGL <
DEFINE LISTOG Q < >
DEFINE XISTOG Q < >
>/END OF IFNZRO FTBIGL

IFZERO FTBIGL <
DEFINE LISTOG Q <IFZERO Q < XLIST > >
DEFINE XISTOG Q <IFNZRO Q < XLIST > >
>/END OF IFZERO FTBIGL

DEFINE CREF X <XLIST;Z=X;XLIST>

DEFINE XOR Q <
		TAD	INTMP1
		AND	Q
		CMA IAC
		CLL RAL
		TAD	INTMP1
		TAD	Q
		DCA	Q
>/END OF DEFINE XOR

DEFINE BLOCK Q <XLIST
		*.+Q
		XLIST	>/END OF DEFINE BLOCK

DEFINE REPEAT Q <XLIST
IFNZRO Z <XLIST
		Q
XLIST
Z=Z-1
>/END OF IFNZRO Z
XLIST>/END OF DEFINE REPEAT

DEFINE HLT <	XLIST
		JMS I	[DMPTRP
		XLIST	>/END OF DEFINE HLT

IFNZRO	CNKFLD <
	Z=CNKFLD^10
	CDFCNK=CDF Z
	CIFCNK=CIF Z
>/END OF IFNZRO	CNKFLD
IFZERO	CNKFLD <
	DEFINE CDFCNK <>
	DEFINE CIFCNK <>
>/END OF IFZERO	CNKFLD
	CDFTRC=CDFCNK
	CDFINS=CDF 0
	CIFINS=CIF 0
/CTY IOTS
IFZERO PDP8E <
	CTYKCF=6030		/CLEAR KEYBOARD FLAG			(PDP8E)
	CTYTFL=6040		/SET TELEPRINTER FLAG			(PDP8E)
	CTYTSK=6045		/SKIP ON PRINTER OR KEYBOARD FLAG	(PDP8E)
>/END OF IFZERO PDP8E
	CTYKSF=6031		/SKIP ON KEYBOARD FLAG
	CTYKCC=6032		/CLEAR KEYBOARD FLAG
	CTYKRS=6034		/READ KEYBOARD STATIC
	CTYKRB=6036		/READ KEYBOARD DYNAMIC(KRS+KCC)
	CTYTSF=6041		/SKIP ON TELEPRINTER FLAG
	CTYTCF=6042		/CLEAR TELEPRINTER FLAG
	CTYTPC=6044		/LOAD TELEPRINTER AND PRINT
	CTYTLS=6046		/LOAD TELEPRINTER SEQUENCE(TCF + TPC)

/CLOCK IOTS - KW8/I OR DK8-EA
/ KW8/I TICKS 60(50) TIMES PER SECOND
/ DK8E TICKS 120(100) TIMES PER SECOND SO EVERY OTHER TICK IS IGNORED
IFZERO PDP8I <	CLKECI=6137		/CLEAR ALL CONTROL FLIP FLOPS>
IFZERO PDP8E <	CLKECI=6131		/CLEAR ALL CONTROL FLIP FLOPS>
	CLKSCF=6133		/SKIP ON CLOCK FLAG(AND CLEAR IT)

/MEMORY PARITY IOTS
	MEMSMP=6101		/SKIP ON NO MEMORY PARITY ERROR
	MEMCMP=6104		/CLEAR MEMORY PARITY ERROR FLAG
	MEMSPO=SKP		/IN CASE NOT DEFINED BELOW
IFZERO PDP8E <
	MEMEPI=6103		/ENABLE MEMORY PARITY INTERRUPTS
	MEMSPO=6107		/SKIP IF MEMORY PARITY OPTION PRESENT
>/END OF NEW IOT'S FOR 8E

IFNZRO CDRN <
/CDR IOTS
	CDRSF=6631		/SKIP ON DATA READY
	CDRCRB=6634		/READ CARD BINARY
	CDRSD=6671		/SKIP ON CARD DONE FLAG
	CDRCSE=6672		/SELECT CARD READER AND SKIP IF READY
	CDRCRD=6674		/CLEAR CARD DONE FLAG
>/END OF IFNZRO CDRN

IFNZRO LPTN <
/LINE PRINTER IOT'S - LS8E & LE8=LP08
	LPTSTF=6660		/SET THE FLAG			(LS8E ONLY)
	LPTSKF=6661		/SKIP ON FLAG
	LPTCLF=6662		/CLEAR FLAG
	LPTSKE=6663		/SKIP ON NOT READY
/	LPT=6664		/LOAD PRINT BUFFER
	LPTSIE=6665		/SET PI ENABLE			(LE8 ONLY)
			/ IF AC11=1 SET PI ENABLE	(LS8E ONLY)
			/ IF AC11=0 CLEAR PI ENABLE	(LS8E ONLY)
	LPTSTB=6666		/LOAD DATA & CLEAR FLAG
	LPTCIE=6667		/CLEAR PI ENABLE		(LE8 ONLY)
>/END OF IFNZRO LPTN
	LISTOG	TTYN
IFNZRO TTYN <
	LISTOG	FTDC02F
IFNZRO FTDC02F <
/FOR DCMTPF & DCMTKF	AC 8 SPECIFIES GROUP 0
/			AC 9 SPECIFIES GROUP 1
/			AC 10 SPECIFIES GROUP 2
/			AC 11 SPECIFIES GROUP 3
	DCMTPF=6113		/READ GROUP'S TRANSMITTER FLAGS INTO AC 0-7
	DCMTKF=6123		/READ GROUP'S RECEIVER FLAGS INTO AC 0-7
	DCMINT=6115		/ENABLE INTERRUPTS
	DCMINS=6125		/SKIP IN INTERRUPT REQUEST ACTIVE
	DCMTON=6117		/SELECT STATION(AC0-7) & GROUP(AC8-11)
	DCMKSF=6111		/SKIP ON KEYBOARD FLAG
	DCMKCC=6112		/CLEAR KEYBOARD FLAG
	DCMKRS=6114		/OR CHAR INTO AC4-11
	DCMTSF=6121		/SKIP ON TRANSMIT FLAG
	DCMTCF=6122		/CLEAR TRANSMIT FLAG
	DCMTPC=6124		/TRANSMIT A CHAR
>/END OF DC02F IOTS

	LISTOG	0
IFZERO FTDC02F <
	T00KSF=6141
	T01KSF=6161
	T02KSF=6301
	T03KSF=6321
	T04KSF=6361
	T05KSF=6511
	T06KSF=6601
	T07KSF=6641
	T10KSF=6051
	T11KSF=6331
	T12KSF=6521
	T13KSF=6541
	T14KSF=6561
	T15KSF=6461
	T16KSF=6441
	T17KSF=6061
	T00TSF=6151
	T01TSF=6171
	T02TSF=6311
	T03TSF=6351
	T04TSF=6371
	T05TSF=6621
	T06TSF=6611
	T07TSF=6651
	T10TSF=6071
	T11TSF=6341
	T12TSF=6531
	T13TSF=6551
	T14TSF=6571
	T15TSF=6471
	T16TSF=6451
	T17TSF=6121
>/END OF KL8E IOTS
	XISTOG	FTDC02F
>/END OF IFNZRO TTYN
	LISTOG	TTYN
	Z=PTRN+PTPN+PLTN
	LISTOG	Z
IFZERO PDP8E <
PTRPE=6010		/ENABLE READER/PUNCH INTERRUPT ENABLE
PTPCE=6020		/CLEAR READER/PUNCH INTERRUPT ENABLE
>/END OF IFZERO PDP8E
IFNZRO PTRN <
/HIGH SPEED PAPER TAPE READER IOTS - PC8-E OR 
	PTRSF=6011		/SKIP ON READER FLAG
	PTRRB=6012		/OR READER BUFFER INTO AC & CLEAR FLAG
	PTRFC=6014		/READER FETCH CHARACTER - GET NEXT CHAR
>/END OF IFNZRO PTRN

IFNZRO PTPN <
/HIGH SPEED PAPER TAPE PUNCH IOTS
	PTPSF=6021		/SKIP ON PUNCH FLAG
	PTPCF=6022		/CLEAR PUNCH FLAG
	PTPPC=6024		/PUNCH CHARACTER
	PTPLS=6026		/LOAD PUNCH BUFFER SEQUENCE
>/END OF IFNZRO PTPN

IFNZRO PLTN <		/PLOTTER IOT'S - XY8/E
	PLTCEN=6500		/CLEAR INTERRUPT ENABLE
	PLTSKF=6501		/SKIP ON PLOTTER FLAG
	PLTCLF=6502		/CLEAR PLOTTER FLAG
	PLTPUP=6503		/PEN UP
	PLTLLR=6504		/LOAD DIRECTION REGISTER
	PLTPDN=6505		/PEN DOWN
	PLTLCF=6506		/LOAD DIRECTION REGISTER AND CLEAR FLG
	PLTSEN=6507		/SET INTERRUPT ENABLE
>/END OF IFNZRO PLTN
	LISTOG	Z
	LISTOG	FTDP01
IFNZRO FTDP01 <		/IOTS FOR DP01
	DPTAC=6301		/TRANSMIT A CHARACTER
	DPCTF=6302		/CLEAR TRANSMIT FLAG & SKIP IF TRANSMIT ACTIVE FLAG SET
	DPCIM=6304		/CLEAR IDLE MODE
	DPSTF=6311		/SKIP ON TRANSMIT FLAG NOT SET
	DPSIM=6314		/SET IDLE MODE
	DPSRF=6351		/SKIP ON RECEIVE FLAG NOT SET
	DPRRB=6312		/READ RECEIVE BUFFER(AND CLEAR FLAG)
	DPSEF=6321		/SKIP ON RECEIVE END FLAG
	DPCEF=6322		/CLEAR END FLAG
	DPSRE=6324		/SET RING ENABLE
	DPCRE=6344		/CLEAR RING ENABLE
	DPSRI=6331		/SKIP ON RING INDICATOR
	DPCRF=6332		/CLEAR RING FLAG
	DPSTR=6334		/SET TERMINAL READY
	DPCTR=6342		/CLEAR TERMINAL READY
	DPSSR=6341		/SKIP ON DATASET READY
	DPCRA=6352		/CLEAR RECEIVER ACTIVE
>/END OF IFNZRO FTDP01
	LISTOG	0

IFZERO FTDP01 <		/IOTS FOR DP8E SYNCHRONOUS LINE INTERFACE
	DPSGTT=6405		/TRANSMIT GO
	DPSGRR=6404		/RECEIVE GO
	DPSSCD=6400		/SKIP IF CHAR DETECTED
	DPSCSD=6406		/CLEAR SYNC DETECT
	DPSSRO=6402		/SKIP IF RECEIVE WORD COUNT OVERFLOW
	DPSSTO=6403		/SKIP IF TRANSMIT WORD COUNT OVERFLOWS
	DPSCSI=6401		/CLEAR SYNCHRONOUS INTERFACE
	DPSRTA=6407		/READ TRANSFER ADDRESS REGISTER
	DPSLCC=6412		/LOAD CONTROL
	DPSSRG=6410		/SKIP IF RING FLAG
	DPSSCA=6411		/SKIP IF CARRIER/AGC FLAG
	DPSRS2=6414		/READ STATUS 2
			/ AC00 CARRIER/AGC
			/ AC01 REQUEST TO SEND
			/ AC02 TERMINAL READY
			/ AC03 CLEAR TO SEND
			/ AC04 TEMA 0(TRANSMIT EXTENDED MEMORY ADDRESS)
			/ AC05 TEMA 1
			/ AC06 TEMA 2
			/ AC07 RECEIVE DATA(INV)
	DPSRS1=6415		/READ STATUS 1
			/ AC00 R-RQST	RECEIVE AND TRANSMIT
			/ AC01 T-RQST	BREAK REQUESTS
			/ AC02 SYNC 2	RECEIVED SYNC
			/ AC03 SYNC 1	CHARS
			/ AC04 REMA 0
			/ AC05 REMA 1
			/ AC06 REMA 2
			/ AC07 MODEM READY
	DPSLFL=6413		/LOAD FIELD
	DPSSBE=6416		/SKIP ON BUS ERROR
	DPSRCD=6417		/READ CHAR DETECTED(IF AC0=0)

/FOLLOWING ARE IOTS FOR DP8-EP(KG8-EA) REDUNDANCY CHECK OPTION
/	6110		/TEST VRC AND SKIP
	BCCRDH=6111		/READ HIGH ORDER PORTION OF BCC INTO AC
	BCCRDL=6112		/READ LOW ORDER PORTION OF BCC INTO AC
/	BCCVRC=6113		/COMPUTE VRC CHARACTER
	BCCGEN=6114		/GENERATE BCC
	BCCLCL=6115		/LOAD CONTROL REGISTER FROM AC
			/ AC05=1: CRC; AC05=0: LRC
			/ AC6-8=0: 16BIT BCC
			/ AC6-8=1: 12BIT BCC
			/ AC6-8=2:  8BIT BCC
			/ AC6-8=3:  7BIT BCC
			/ AC6-8=4:  6BIT BCC
			/ AC9=0: PARITY TO AC4; AC9=1:PARITY TO AC11
			/ AC10=1: 6114 ALSO CAUSES 6113
			/ AC11=1: 6114 ALSO CAUSES 6110
	BCCCLR=6116		/CLEAR ACCUMULATION
/	6117		/MAINTENANCE TEST CLOCK
>/END OF IFZERO FTDP01
	LISTOG	FTDP8E
/PAGE 0 INSTRUCTIONS

FIELD 0

INTRAP=0		/TRAP TO FIELD 0 LOC 0 ON AN INTERRUPT

*1
	DCA	INSVAC	/SAVE AC
	CDFCNK		/INTERRUPTS SET DF = 0

IFNZRO CDRN <
	CDRSF		/SKIP ON CARD READER COLUMN READY
	  JMP	SCHAIN	/NOT CARD READ - SO GO FIND WHAT
	JMP	ICDRD0	/GO READ COLUMN
>/END OF IFNZRO CDRN

IFZERO CDRN <
	JMP	SCHAIN	/GO FIND WHAT INTERRUPTED
>/END OF IFZERO CDRN

INSVAC,	0		/SAVE INTERRUPTED AC HERE
INRCPV,	0		/PIVOT FOR DP01 INPUT

/AUTOINDEX REGISTERS
*10

IFNZRO	FTDEBUG <
BUGGER,	0
>/END OF IFNZRO	FTDEBUG

TIQPTR,	0		/POINTER TO PUT TTY CHARS INTO THE INPUT QUEUE
TIQTKR,	0		/POINTER TO TAKE TTY CHARS OUT OF INPUT QUEUE
AUTO1,	0		/MISC AUTOINDEXER FOR NON-INTERRUPT LEVEL CODE
IAUTO1,	0		/MISC AUTOINDEXER FOR INTERRUPT LEVEL CODE
IAUTO2,	0		/	DITTO

INTDIS,	NL0		/CLEAR AC & LINK
	TAD	INSVAC	/RESTORE AC
	ION
	JMP I	INTRAP	/RETURN TO INTERRUPTED PROCESS

FIRFRE,	0		/POINTER TO FIRST FREE CHUNK
FRECNT,	0		/COUNT OF FREE CHUNKS
FIRADR,	FIRCNK		/ADDRESS OF FIRST FREE CHUNK ########

TEMP1,	0		/TEMPORARY LOCATION FOR NONINTERRUPT LEVEL CODE
TEMP2,	0
TEMP3,	0
TEMP4,	0
TEMP5,	0
TEMP6,	0
TEMP7,	0
TEMP8,	0
TEMPA,	0		/ADDITIONAL TEMPS
TEMPB,	0
TEMPC,	0
TEMPD,	0
INTMP1,	0		/TEMPORARY LOCATION FOR INTERRUPT CODE
INTMP2,	0		/	DITTO
INTMP3,	0		/	DITTO
INTMP4,	0		/	DITTO
INTMP5,	0		/	DITTO
INTMP6,	0		/	DITTO
INTMP7,	0		/	DITTO

INTDDB,	0		/ADDRESS OF CURRENT DEVICE BLOCK
IDBSTS,	0		/ADDRESS OF DEVSTS FOR INTDDB
DDB,	0		/ADDRESS OF CURRENT DEVICE BLOCK
DDBSTS,	0		/ADR OF DEVSTS

ERRFLG,	0		/WHEN AN ERROR OCCURS PUT ADR OF MSG HERE
SECFLG,	0		/SET NONZERO ONCE PER SECOND
CLKFLG,	0		/SET NONZERO WHEN CLOCK GOES OFF
INTCNT,	0		/WATCHDOG FOR UNRECOGNIZED INTERRUPTS

WRKREQ,	0		/-1 WHEN INTERRUPT LEVEL HAS LEFT WORK FOR NON-INTERRUPT LEVEL

IFNZRO CDRN <
CDREXT,	0		/**DECSYNC**SLOT TO PUT TRAILING PARTS OF CARDS
			/**DDCMP**ADR OF COUNT FIELD
CDRNXT,	0		/POINTER TO BEGINING OF CURRENT CARD
CDRADR,	0		/POINTER INTO STRING BEING FILLED
CDCCNT,	0		/COMPRRESED CHAR COUNT
CDCCHR,	0		/LAST CARD COLUMN
>/END OF IFNZRO CDRN

IFNZRO LPTN <
LPTCCH,	0		/CHAR WE ARE UNCOMPRESSING
LPTCCN,	0		/COUNT OF CHARS TO UNCOMPRESS
LPTCNT,	0		/COUNT OF CHARS IN CHUNK STRING
LPTCOL,	0		/CURRENT OUTPUT COLUMN
LPTOCH,	0		/CHAR TO PRINT LATER
LPTZCT,	0		/REP COUNT AFTER TIMEOUT
LPTOPV,	0		/LAST VALUE OF PIVOT
LPTCHR,	0		/LAST CHAR OUTPUT TO LPT
LPTRCT,	0		/REPETITION COUNT FOR LPT CHARS(MAKES TABS ETC)
LPTLNE,	0		/INDEX TO LPTVFU
LPTHNG,	LPTHN1		/PUT OUT A CR TO LEFT JUSTIFY THE PRINTER
	LPTHN2		/PUT OUT SPACES TO GET INTO RIGHT COLUMN
>/END OF IFNZRO LPTN

IFNZRO TTYN <
IFNZRO FTDC02F <
DEFINE X Q <
	XLIST
	ZZ=Z&0070
	IFNZRO ZZ <ZZ=7760>		/MASK FOR 8 LINES
	IFZERO Z <ZZ=0000>
	 Z=Z-1
	IFZERO Z <ZZ=4000>
	 Z=Z-1
	IFZERO Z <ZZ=6000>
	 Z=Z-1
	IFZERO Z <ZZ=7000>
	 Z=Z-1
	IFZERO Z <ZZ=7400>
	 Z=Z-1
	IFZERO Z <ZZ=7600>
	 Z=Z-1
	IFZERO Z <ZZ=7700>
	 Z=Z-1
	IFZERO Z <ZZ=7740>
	 Z=Z-1
	IFZERO Z <ZZ=7760>
	XLIST
	ZZ+Q
	XLIST
	ZZ=Z&4000
	IFNZRO ZZ <Z=0>		/IF NEGATIVE HAVE DONE ENOUGH
	XLIST
>/END OF DEFINITION OF X

	Z=TTYN		/INITIALIZE COUNTER

DC1MSK,	X 10
IFNZRO Z <
DC2MSK,	X 4
IFNZRO Z <
DC3MSK,	X 2
IFNZRO Z <
DC4MSK,	X 1
>>>/END OF IFNZRO Z

>/END OF IFNZRO FTDC02F
IFZERO FTDC02F <
>/END OF IFZERO DC02F
>/END OF IFNZRO TTYN
RCVTKR,	0		/RECEIVED MESSAGE TAKER
RCVPTR,	0		/RECEIVED MESSAGE PUTTER

STACKF,	0		/-2 MEANS SENDING STARTS
			/ -1 MEANS NEED TO SEND A STACK
			/ 0 MEANS DOWN(NO ICM)
			/ 1 MEANS HAVE RECEIVED ICM
NAKFLG,	0		/IF NONZERO REASON TO SEND A NAK MESSAGE
CRC1,	0		/FIRST HALF OF CRC-16
CRC2,	0		/2ND HALF OF CRC-16
RECVOK,	0		/LAST MESSAGE # RECEIVED OK
			/ SIGN BIT MEANS SEND ACK
REPTCK,	0		/TIMER FOR REPS
			/ 0 MEANS SEND A REP
T10FLG,	0		/TRANSMITTER STATE
			/	-2	MESSAGE READY TO GO
			/	-1	ACTIVE
			/	0	IDLE
			/	+1	SYNCH
CNTPNT,	0		/POINTER TO CHUNK COUNTER
T10AKR,	0		/POINTER TO LAST ACKED TO 10 REQUEST
			/ T10AKR, T10TKR, & T10PTR ARE ALWAYS LEFT
			/ SO THEY CAN BE USED WITHOUT CHECKING 1ST
T10LAN,	0		/LAST MESSAGE # TO 10 ACKED BY 10
T10TKR,	0		/POINTER TO TAKE TO 10 REQUESTS FROM QUEUE
T10HSN,	0		/HIGHEST MSG # SENT TO 10
T10PTR,	0		/POINTER TO PUT TO 10 REQUESTS INTO QUEUE

T10NCA,	0		/ADR OF NEXT BUFFER TO SEND
T10NWC,	0		/WC FOR NEXT BUFFER TO SEND
T10CLK,	0		/ISZ'ED BY CLOCK INTERRUPTS

F10TWC,	0		/TOTAL WC(POSITIVE) FOR DATA IN NUMBERED MSGS

RSNA,	0		/STORE SNA FIELD
RNCT,	0		/STORE NCT FIELD
RNOD,	0		/NODE NUMBER OF OTHER END OF LINE
DISSNA,	0		/FOR DISCONNECT
DISSLA,	0
DISREA,	0
CONSNA,	0		/INDICATE WE NEED TO SEND CONFIG
DMPCHR,	DMPCTY		/WORD SET BY EITHER DMP000 OR CTYEXC
IFZERO FTDP01 <	*7720	>
F10TCH,	ZBLOCK	4	/4 SPECIAL CHARS TO WATCH FOR ON INPUT
			/ SET UP BY SYSCHK
F10WC,	0		/WORD COUNT FOR MESSAGES FROM 10
F10CA,	0		/CURRENT ADDRESS FOR MESSAGES FROM 10
IFZERO FTDP01 <	0	>/LOCATION USED BY HDW
T10WC,	0		/WORD COUNT FOR MESSAGES TO 10
T10CA,	0		/CURRENT ADDRESS FOR MESSAGES TO 10
IFZERO FTDP01 <	0	>/LOCATION USED BY HDW
/ALL GOOD PDP8 PROGRAMS BEGIN AT ADDRESS 200

*200
DC72,	JMP	INIALL

/HERE TO DUMP SYSTEM ONTO LPT
DUMP,	7402			/FOR COMPATIBILITY
	VEDIT			/SOFTWARE VERSION NUMBER
DMPAC,	0			/AC WHEN AUTODUMP BEGAN
DMPLNK,	0			/FOR 8I'S THIS IS LINK
				/ FOR 8E'S THIS IS LINK AND OTHER FLAGS
DMPTRP,	0			/JMS HERE FOR AN AUTODUMP
	DCA	DMPAC		/SAVE AC
IFZERO PDP8I <	RAR	>	/ROTATE LINK INTO AC
IFZERO PDP8E <	GTF	>	/LOAD FLAGS(AND LINK) INTO AC
	DCA	DMPLNK		/SAVE LINK
IFZERO PDP8I <	IOF	> /PREVENT ANY ADDITIONAL INTERRUPTS
IFZERO PDP8E <	CAF	>		/STOP THE WORLD
	TAD	(DMPMSG-1		/TELL OPR WE ARE DIEING
	JMS	CTYEXC
	TAD	DMPTRP
	JMS	DMPWDO
	7402			/HALT
DMPWDO,	0
	DCA	DMPWRD		/SAVE WORD TO DUMP
	JMS	DMPWDC
	JMS	DMPWDC
	JMS	DMPWDC
	JMS	DMPWDC
	JMP I	DMPWDO
DMPWDC,	0
	TAD	DMPWRD
	RTL
	RAL
	DCA	DMPWRD
	TAD	DMPWRD
	RAL
	AND	[0007
	TAD	[0060
	JMS I	DMPCHR
	JMP I	DMPWDC
DMPTAB,	0
IFNZRO LPTN <
	JMS	DMPSPC
	JMS	DMPSPC
>/END OF IFNZRO LPTN
	JMS	DMPSPC
	JMS	DMPSPC
	JMP I	DMPTAB
DMPSPC,	0			/HERE TO PRINT A SPACE
	TAD	[0040
	JMS I	DMPCHR
	JMP I	DMPSPC
DMPCRL,	0
	TAD	[0015		/CARRIAGE RETURN
	JMS I	DMPCHR		/ WE NEED THIS FOR CENTRONICS
	TAD	[0012		/LINE FEED
	JMS I	DMPCHR
	TAD	[0012
	JMS I	DMPCHR
	JMP I	DMPCRL

DMPWRD,	0

/HERE TO TYPE A MESSAGE ON CTY
/ ONLY USED WHEN STATION NOT RUNNING
CTYEXC,	0
	DCA	DMPWRD
	TAD	(DMPCTY
	DCA	DMPCHR
	CDFCNK
CTYEX3,	ISZ	DMPWRD
	TAD I	DMPWRD
	JMS I	DMPCHR
	TAD I	DMPWRD		/GET CHAR AGAIN
	SMA CLA			/ALL DONE ?
	  JMP	CTYEX3		/NO
	CDFINS
	JMP I	CTYEXC
DMPCTY,	0
	CTYTLS
	CTYTSF
	JMP	.-1
	NL0
	JMP I	DMPCTY

DOWN1,				/CONTINUATION OF DOWN ROUTINE
	DCA	DDB		/SAVE DDB ADDRESS
	TAD	(DEVSTS		/DISPLACEMENT
	TAD	DDB		/MAKE ABSOLUTE
	DCA	DDBSTS
	IOF
	TAD I	DDBSTS		/GET STATUS
	AND	(0772		/TURN OFF ACTIVE,CONNECTED,NEED CONNECT CONFIRM,TABBING, AND SEND STATUS
	DCA I	DDBSTS		/PUT IT BACK
	ION			/RESTORE INTERRUPTS
	NLOAD	DEVCHK		/DEVCHK DISPLACEMENT
	TAD	DDB		/MAKE ABSOLUTE
	DCA	TEMP2		/SAVE
	NLOAD	DEVOAD		/POINTER TO OUTPUT
	TAD	DDB
	DCA	TEMP1		/SAVE ITS ADDRESS
	JMS	NEIFLB		/FLUSH ANY OUTPUT
	NLOAD	DEVBF1		/POINT TO INPUT STRING
	TAD	DDB		/MAKE ABSOLUTE
	DCA	TEMP1		/STORE
	DCA	TEMP2		/DO NOT COUNT CHUNKS
	JMS	NEIFLB		/FLUSH INPUT
	NLOAD	DEVDRQ		/POINT TO DATA REQUESTS
	TAD	DDB		/MAKE ABSOLUTE
	DCA	TEMP1		/STORE ADDRESS
	DCA I	TEMP1		/CLEAR DATA REQUESTS
	TAD	TEMPB		/GET SNATAB ENTRY
	JMP	DOWN2		/GO CLEAR OUT RCVDSP ENTRY
NEIFLB,	0			/SUBROUTINE TO FLUSH BUFFERS
/TEMP1	=	WHERE TO START CHAIN
/TEMP2	=	0 OR WHERE TO INCREMENT CHUNK COUNT
	IOF
	TAD I	TEMP1		/GET START OF CHAIN
	SNA			/SEE IF ANY
	  JMP	NEIFLR		/NONE, SO RETURN
NEIFL1,	DCA	TEMP3		/STORE ADDRESS
	DCA I	TEMP1		/CLEAR POINTER
	DCA	FREDCK		/CLEAR COUNT
	TAD	TEMP3		/GET ADDRESS
	AND	[-CNKSIZ	/MAKE SURE AT BEGINNING OF CHUNK
	JMS	FRECKS		/FREE CHUNKS
	TAD	TEMP2		/COUNTER SPECIFIED?
	SNA CLA			/COUNTER SPECIFIED?
	  JMP	NEIFLR		/NO, RETURN
	IOF
	TAD	FREDCK		/COUNT OF CHUNKS FREED
	NEGATE
	TAD I	TEMP2		/PREVIOUS COUNT
	DCA I	TEMP2		/STORE NEW ONE
NEIFLR,	ION			/RESTORE INTERRUPTS
	JMP I	NEIFLB		/RETURN
	PAGE
/	***********************************************************
/	***********************************************************
/	***							***
/	***		INITIALIZATION				***
/	***							***
/	***********************************************************
/	***********************************************************

INICNT,	0			/COUNTED EACH TIME STATION IS RESTARTED

/HERE TO RESTART PROGRAM
INIALL,	IOF			/DISABLE INTERRUPTS

	NLM2
	DCA	STACKF		/FLAG TO SEND A START
INISUM,
/HERE TO INITIALIZE SOME OF STATION STUFF

	CDFCNK
	ISZ	INICNT		/IF IT SKIPS WON'T MATTER BECAUSE NEXT INS
				/ WILL BE A NOP
INICIF,	CIFCNK			/ CHANGE INSTRUCTION FIELD	########
INIJMP,	JMP I	(SYSCHK		/GO PERFORM SYSCHK		########
				/ CHANGED TO CAF(OR 0) BY SYSCHK

IFZERO PDP8E <
	MEMEPI			/ENABLE MEMORY PARITY ERROR INTERRUPTS
>/END OF IFZERO PDP8E

/HERE TO INITIALIZE THE CLOCK
	CLKECI			/RESET CLOCK

/HERE TO INITIALIZE THE COMMUNICATIONS FLAGS
	DCA	REPTCK

/HERE TO INITIALIZE FROM 10 FLAGS
	TAD	(RCVQUE
	DCA	RCVPTR
	TAD	(RCVQUE
	DCA	RCVTKR

/HERE TO INITIALIZE TO 10 FLAGS
	TAD	(T10BF1
	DCA	T10AKR
	DCA	T10LAN		/LAST ACKED POINTER
	TAD	(T10BF1
	DCA	T10TKR		/LAST SENT POINTER
	TAD	(T10BF1+T10LEN
	DCA	T10PTR		/HIGHEST SENT POINTER
	NL1
	DCA	T10HSN		/HIGHEST MSG# SENT
	NL2			/FOR BCC
	TAD I	(NCLNID		/GET NODE-ID MSG SIZE
	NEGATE			/MAKE ISZ COUNTER
	DCA	TEMP2		/SAVES COUNTER
	TAD	(NCLNID		/POINT TO NODE ID MESSAGE
	DCA	IAUTO1		/SET UP POINTER TO MESSAGE
	TAD	(T10BF1+7
	DCA	AUTO1		/POINTER TO BUFFER
INIDD3,	TAD I	IAUTO1
	DCA I	AUTO1		/PUT NEXT CHAR INTO BLOCK
	ISZ	TEMP2
	  JMP	INIDD3		/LOOP BACK FOR REST
	TAD I	(NCLNID		/GET SIZE OF NODE-ID MSG
	DCA I	(T10BF1+1	/SET COUNT IN MSG
	DCA I	(T10BF1+2	/CLEAR HIGH ORDER COUNT
	NL1
	DCA I	(T10BF1+4	/SET MESSAGE NUMBER
	TAD	(-DEVN
	DCA	TEMP1
	TAD	(RCVDSP
	DCA	AUTO1
	TAD	(CTRLTB-1
	DCA	IAUTO1
	TAD	(SNATAB-1	/POINT TO NODE TABLE
	DCA	IAUTO2		/PUT INTO AUTOINDEX REGISTER
INIDD4,	TAD	(RCVKRD		/GET UNUSED DISPATCH ENTRY
	DCA I	AUTO1		/STORE AT RCVDSP
	DCA I	IAUTO1		/ZERO DDB FIELD
	DCA I	IAUTO2		/ZERO NODE FIELD
	ISZ	TEMP1		/UP COUNTER
	  JMP	INIDD4		/CONTINUE IF NOT EXPIRED
	JMP	FUG		/GO ON WITH INITIALIZATION
RCVNEI,				/HERE WHEN WE RECEIVE NEIGHBORS MESSAGE
	TAD	RNOD		/GET OUR NEIGHBOR
	NEGATE
	TAD	RSNA		/GET WHO SENT NEIGHBORS
	SZA CLA			/ONLY BELIEVE HIM
	  JMP	RCVFLU		/IGNORE OTHERS
NEIG0,
	JMS	GETCHR	/GET NNM
	  JMP	NEIG10		/NONE, SO DONE
	NEGATE			/GET NEGATIVE
	DCA	TEMPA		/SAVE
	TAD	(SNATAB		/POINT TO START OF NODE TABLE
	DCA	TEMPB		/STORE
	TAD	(-DEVN		/NUMBER OF ENTRIES
	DCA	TEMPC		/STORE
NEIG1,				/LOOP TO MARK NODES UP
	TAD I	TEMPB		/GET NODE TABLE ENTRY
	SNA			/ONLY TEST ONES THAT ARE THERE
	  JMP	NEIG3		/ADVANCE TO NEXT ENTRY IF NOT USED
	TAD	TEMPA		/ADD THE ONE WE ARE CONSIDERING
	SNA CLA			/SKIP IF NOT THE SAME
	  JMP	NEIG2		/MARK AS UP IF THE SAME
NEIG3,	ISZ	TEMPB		/ADVANCE NODE TABLE POINTER
	ISZ	TEMPC		/ADVANCE COUNTER
	  JMP	NEIG1		/CONTINUE IF COUNT NOT EXHAUSTED
	JMS	GTCHR		/GET LVL TO THROW AWAY
	JMP	NEIG0		/DO NEXT
NEIG2,	NL4000			/GET BIT TO MARK NODE UP
	TAD I	TEMPB		/GET TABLE ENTRY
	DCA I	TEMPB		/STORE IT AGAIN WITH UP BIT ON
	JMP	NEIG3		/CONTINUE
NEIG10,				/HERE AFTER ALL NODES MARKED AS UP
	TAD	(SNATAB		/GET START OF NODE TABLE
	DCA	TEMPB		/SAVE
	TAD	(-DEVN		/GET NUMBER OF ENTRIES
	DCA	TEMPC		/SAVE
NEIG11,				/LOOP THROUGH TABLE
	TAD I	TEMPB		/GET ENTRY
	SMA SZA			/EITHER 0 (NOT USED) OR MINUS (UP) IS OK
	  JMP	DOWN		/AC WILL BE ZERO WHEN ROUTINE JMPS TO NEIG13
NEIG13,	AND	(3777		/CLEAR UP BIT
	DCA I	TEMPB		/STORE ENTRY BACK
NEIG12,	ISZ	TEMPB		/ADVANCE TABLE POINTER
	ISZ	TEMPC		/ADVANCE COUNTER
	  JMP	NEIG11		/CONTINUE LOOP
/	IF WE WANT TO SEND CONFIGURATION, DO IT HERE
	JMP	RCVFLU		/DONE WITH MESSAGE
DOWN,				/HERE WHEN WE DETERMINE NODE HAS GONE DOWN
	NL0			/CLEAR AC
	TAD	TEMPB		/GET SNATAB ENTRY
	TAD	(CTRLTB-SNATAB	/GET CORRESPONDING CTRLTB ENTRY
	DCA	DDB		/STORE ADDRESS OF DDB
	TAD I	DDB		/GET DDB
	SNA			/MAKE SURE THERE IS ONE
	  JMP	NEIG12		/NO, MUST HAVE BEEN A DEVICE DISCONNECT
	JMP	DOWN1		/CONTINUE
	PAGE
FUG,


/HERE TO INITIALIZE THE SYNCHRONOUS LINE
	DCA	INRCPV		/MIGHT BE USEFUL ON A RESTART
	JMS	INISYN
	JMP	INIDP9

/HERE TO INITIALIZE THE SYNCHRONOUS INTERFACE WHEN STATION RESTARTS
/ AND ALSO HERE WHEN TRANSMITTER TIMES OUT
INISYN,	0
	TAD	(CTLSIZ-1	/POINT TO CHUNKS
	TAD	RCVPTR		/POINT THIS MESSAGE
	DCA	TEMP1
	TAD	INRCPV		/GET STATE OF RECEIVER
	TAD	(-INRC70	/CHECK TO SEE IF RECEIVING NUMBERED MESSAGE
	SNA CLA			/SKIP IN WE DON'T HAVE CHUNKS IN LIMBO
	  TAD I	TEMP1		/GET ADR OF FIRST CHUNK
	DCA	TEMP1		/SAVE ADR OF FIRST CHUNK(OR ZERO)
IFZERO FTDP01 <
	DPSCSI			/CLEAR INTERFACE
		Z=CNKFLD^1100
	TAD	(Z
	DPSLFL			/SET FIELD FOR RECEIVE AND XMT BUFFERS
	TAD	(5400-Z
	DPSLCC			/LOAD CONTROL REGISTER
	NL0
>/END OF IFZERO FTDP01
	TAD	(SYNBUF-1	/STRING OF 4 SYNCHS
	CDFINS			/WC AND CA ARE IN FIRST FIELD
	DCA I	[T10CA
	TAD	(-4
	DCA I	[T10WC
	NLM3
	DCA	T10CLK
	JMS	INRCID		/SET RECEIVER TO IDLE MODE
				/ AND SET DATA FIELD TO CHUNK FIELD
	NL1
	DCA	T10FLG		/TRANSMITTER IS TRYING TO SYNCH LINE

IFNZRO FTDP01 <
/HERE TO INITIALIZE DP01 ROUTINES
	DPSTR			/SET TERMINAL READY
	TAD	(SYN
	DPTAC			/START DP01
	NL0
>/END OF IFNZRO FTDP01

IFZERO FTDP01 <
	DPSGTT			/TRANSMIT GO
	DPSGRR			/AND RECEIVE GO
>/END OF IFZERO FTDP01
	TAD	TEMP1		/GET CHUNK ADR TO FREE(IF ANY)
	SZA
	  JMS	FRECKS
	JMP I	INISYN

INIDP9,

/HERE TO INITIALIZE THE CHUNKS
	DCA	FIRFRE		/NO FREE CHUNKS YET
	DCA	FRECNT		/COUNT OF FREE CHUNKS

	TAD	FIRADR		/GET FIRST CHUNK ADDRESS
	DCA	INTMP2
INICNK,	TAD	INTMP2
	JMS	IFRCNK		/PUT CHUNK INTO FREE LIST
	TAD	INTMP2		/GET LAST CHUNK ADR
	TAD	[CNKSIZ		/ADVANCE 1 CHUNK
	DCA	INTMP2		/SAVE NEW CHUNK ADR
	TAD	INTMP2
IFZERO PDP8I <Z=-CNKSIZ&7570>	/DON'T OVERWRITE CARD LOADER
IFZERO PDP8E <Z=7600>		/DON'T OVERWRITE SHORT TRACE
	TAD	(-Z
	SZA CLA
	  JMP	INICNK
/HERE TO INITIALIZE ALL DEVICES AT STATION
	NLM1			/START AT DDBTAB
	DCA	TEMP6		/SAVE DEVICE NUMBER

/INITIALIZE THE TTY INPUT CHAR QUEUE
	TAD	(TTIQUE-1
	DCA	TIQPTR
	TAD	(TTIQUE-1
	DCA	TIQTKR

/HERE TO INITIALIZE THE TTYS

IFNZRO FTDC02F <
/DCMINT IS DONE ONCE A SECOND ANYWAY SO DON'T BOTHER HERE
/ ALSO DON'T DO CALL TO ALLSEL BECAUSE STARTUP MESSAGE WILL DO IT ANYWAY
>/END OF IFNZRO DC02F

	TAD	(-1-TTYN	/COUNT OF CTY & TTYS
	DCA	TEMP8		/INITIALIZE TTY COUNTER
INITT0,	JMS	INITTY
	ISZ	TEMP8		/HAVE WE DONE ALL THE TTY'S ?
	  JMP	INITT0		/NOT YET SO KEEP GOING

INICDR,
IFNZRO CDRN <
/HERE TO INITIALIZE THE CDR
	DCA	CDRNXT		/NO CARD READY TO GO
	JMS	INIDDB		/INITIALIZE DEVICE BLOCK
>/END OF IFNZRO	CDRN

IFNZRO LPTN <
/HERE TO INITIALIZE THE LPT
INILPT,	JMS	INIODB		/INITIALIZE DDB
	DCA	LPTCCN		/NO COMPRESSED CHAR COUNT YET
	DCA	LPTCNT		/NO CHARS IN CHUNK STRING
	DCA	LPTCOL		/WE ARE AT LEFT HAND MARGIN
	TAD	(LPTVFU-1	/INDEX TO VFU
	DCA	LPTLNE		/WE ARE AT TOP OF FORM
	TAD	(SKP
	CDFINS			/WE ARE CHANGING AN INSTRUCTION
	DCA	LPTPIV
	CDFCNK
	TAD	[LPTCHK
	DCA I	[LPTBLK+DEVCHK	/STORE CHUNK COUNT
>/END OF IFNZRO LPTN

INIPTR,
IFNZRO PTRN <
/HERE TO INITIALIZE THE PTR
	JMS	INIDDB
>/END OF IFNZRO	PTRN

PTPINI,
IFNZRO PTPN <
/HERE TO INITIALIZE THE PTP
	JMS	INIODB
>/END OF IFNZRO PTPN

INIPLT,
IFNZRO PLTN <
/HERE TO INITIALIZE THE PLT
	JMS	INIODB
>/END OF IFNZRO PLTN


	JMP	LOOP

/HERE TO INITIALIZE A TTY BLOCK
INITTY,	0
	JMS	INIODB
	TAD	INTMP1
	DCA I	DDB
	TAD	(4000+TTYBIT+OUTBIT+STSBIT
	DCA I	DDBSTS		/SET INITIAL TTY STATUS WORD
	ISZ	AUTO1		/SKIP LDBADR
	DCA I	AUTO1		/SET LDBCOL
	ISZ	AUTO1		/SKIP LDBWID
	TAD	(RSTMSG-1
	DCA I	AUTO1		/SET LDBXPT
	DCA I	AUTO1		/CLEAR LDBFPT
	DCA I	AUTO1		/SET LDBCHR
	DCA I	AUTO1		/	"	LDBIPT
	NLOAD	DEVCHK
	TAD	DDB
	DCA	TEMPA
	TAD	[TTYCHK
	DCA I	TEMPA		/STORE OUTPUT CHUNK LIMIT
	JMP I	INITTY

/HERE TO INITILIZE AN OUTPUT DEVICE BLOCK
INIODB,	0
	JMS	INIDDB
	TAD	(OUTBIT
	DCA I	DDBSTS
	JMP I	INIODB
SNDOBJ,	0			/SEND OBJECT TYPE
	TAD I	DDB		/FIRST WORD OF DDB
	AND	(7700		/CLEAR RIGHT HALF
IFZERO	PDP8I	<
	CLL RTR
	CLL RTR
	CLL RTR
>/END OF IFZERO	PDP8I
IFZERO	PDP8E	<
	BSW
>/END OF IFZERO	PDP8E
	JMS	SNDCHR		/OBJECT TYPE
	JMP I	SNDOBJ		/RETURN
PAGE
/HERE TO INITIALIZE A DEVICE BLOCK
INIDDB,	0
	ISZ	TEMP6		/ADVANCE DEVICE NUMBER
	TAD	TEMP6		/GET NEW DEVICE NUMBER
	JMS	GETDDB		/GET DEVICE BLOCK ADR AND SET UP DDBSTS
	DCA	AUTO1
 TAD	(1-DEVLNK 	/CLEAR ONLY PORTION
	DCA	INTMP1
INIDD0,	DCA I	AUTO1		/ZERO DEVICE BLOCK
	ISZ	INTMP1
	  JMP	INIDD0
	ISZ	AUTO1		/SKIP LINK
	TAD I	DDB
	AND	(7700
	DCA I	DDB
	JMP I	INIDDB
IFNZRO FTDC02F <
/HERE TO SELECT ALL LINES AGAIN(SO INTERRUPTS WILL WORK)
ALLSEL,	0
IFNZRO TTYN <
	NL0
	TAD	DC1MSK		/MASK FOR 1ST GROUP
	DCMTON			/SELECT LINES
IFDEF DC2MSK <
	NL0
	TAD	DC2MSK
	DCMTON			/SELECT LINES IN 2ND GROUP
>/END OF IFDEF DC2MSK
IFDEF DC3MSK <
	NL0
	TAD	DC3MSK
	DCMTON			/SELECT LINES IN 3RD GROUP
>/END OF IFDEF DC3MSK
IFDEF DC4MSK <
	NL0
	TAD	DC4MSK
	DCMTON			/SELECT LINES IN 4TH GROUP
>/END OF IFDEF DC4MSK
>/END OF IFNZRO TTYN
	JMP I	ALLSEL		/ALL DONE SO DISMISS
>/END OF IFNZRO FTDC02F
IFNZRO FTDEBUG <
/HERE TO PUT A WORD INTO THE TRACE
TRACEW,	0
	CDFCNK			/CHANGE TO TRACE FIELD		########
	DCA I	BUGGER
	CDFCNK			/CHANGE TO NORMAL DATA FIELD
TRCWD1,	NL1			/OR CHANGED TO JMP I TRACEW	########
	TAD	BUGGER
	SZA CLA
TRCWD2,	  JMP I	TRACEW
	TAD	(7577
	DCA	BUGGER
	JMP I	TRACEW
>/END OF IFNZRO FTDEBUG
/IRMA CATCHER
/ COME HERE ONCE PER SECOND
/ IF A TTY IS ACTIVELY OUTPUTING SET IRMA BIT IN LDBSTS UNLESS
/ IRMA BIT IS STILL ON FROM LAST TIME, IN WHICH CASE TTY HAS LOST XMT SO FAKE ONE

IRMA,	IFNZRO TTYN <
	IFNZRO FTDC02F <
	NL1			/REENABLE INTERRUPTS ON ALL LINES
	DCMINT			/(IN CASE FLIPFLOP CLEARED)
>/END OF IFNZRO FTDC02F
>/END OF IFNZRO TTYN
	 NL0		/START WITH CTY
	DCA	TEMP5
IRMA1,	TAD	TEMP5		/GET NUMBER OF NEXT DEVICE
	JMS	GETDDB		/GET ADDRESS OF BLOCK FOR THIS DEVICE
	IOF			/IN CASE OF XMT INTERRUPTS
	DCA	INTDDB		/SAVE ADR OF DEVICE BLOCK
	TAD I	DDBSTS
	SMA			/IS DEVICE ACTIVE ?
	  JMP	IRMA7		/NO
	AND	[TTYBIT
	SNA CLA			/IS DEVICE A TTY ?
	  JMP	IRMA9		/NO SO DONE
	TAD	(DEVTIM		/RELATIVE ADR OF FILLER TIMER
	TAD	INTDDB		/MAKE ABSOLUTE
	DCA	INTMP1		/SAVE POINTER TO FILLER
	TAD I	INTMP1		/GET FILL TIMER
	SZA CLA			/SKIP IF FILLING
	  JMP	IRMA7
	NLOAD	IRMBIT		/MASK FOR IRMA BIT
	AND I	DDBSTS		/GET BIT FROM OLD STATUS
	SZA CLA			/SKIP IF WE LOST AN XMTINT
	  JMS	XMTINT		/FAKE A XMT INTERRUPT
	NLOAD	IRMBIT		/GET BIT FOR IRMA

	TAD I	DDBSTS		/PUT INTO STATUS WORD
	DCA I	DDBSTS
IRMA7,	ION
	NL0
	ISZ	TEMP5		/ADVANCE 1 DEVICE
	TAD	TEMP5
	TAD	[-DEVN
	SZA CLA
	  JMP	IRMA1
IRMA9,	/DCA	BROADC		/CLEAR BROADCAST MESSAGE POINTER
	JMP	LOOP		/ALL DONE
/HERE ONCE PER TICK TO CHECK TTY'S
/ SEE IF THERE IS AN ERROR MESSAGE FOR THE CTY
/ CHECK FILLERS FOR ALL LINES
CLKTTY,	TAD I	(CTYBLK+LDBFPT
	SZA CLA
	  JMP	CLKTY2		/ALREADY TYPING
	TAD	ERRFLG
	SNA
	  JMP	CLKTY2		/NO MSG SO DONE
	DCA I	(CTYBLK+LDBFPT
	DCA	ERRFLG		/SETUP MSG
	TAD	(CTYBLK
	DCA	DDB
	TAD	(CTYBLK+DEVSTS
	DCA	DDBSTS
	JMS	TTYGO		/START CTY IF NEED TO
CLKTY2,
	TAD	(FIRTTY		/GET ADR OF FIRST TTY BLOCK
CLKTY3,	IOF			/DISABLE INTERRUPTS FOR A WHILE
	DCA	INTDDB
	TAD	(DEVTIM		/RELATIVE ADR OF TIMER
	TAD	INTDDB
	DCA	TEMP2		/SAVE POINTER TO TIMER
	TAD I	TEMP2		/GET TIMER FOR FILLER
	SZA CLA
	ISZ I	TEMP2
	  JMP	CLKTY5		/HASN'T TIMED OUT
	NLOAD	IRMBIT		/FLAG TRANSMITTER IS ACTIVE
	AND I	DDBSTS
	SNA CLA			/DON'T START IF STILL TYPING
	  JMS	XMTINT
	NL0			/BECAUSE XMTINT RETURNS GARBAGE
CLKTY5,	ION
	TAD	INTDDB
	TAD	(DEVLNK
	DCA	TEMP1
	TAD I	TEMP1
	SZA
	  JMP	CLKTY3
	JMP	CLKTY9

IFNZRO	TTYN	<
IFZERO	FTDC02F	<
	DISCDE
	JMP	DISSN1
>/END OF IFZERO	FTDC02F
>/END OF IFNZRO	TTYN
	PAGE
/	***********************************************************
/	***********************************************************
/	***							***
/	***		DESCRIPTION				***
/	***							***
/	***********************************************************
/	***********************************************************

IFNZRO 0 <
THIS FILE CONTAINS TWO SYNCHRONOUS INTERFACE MOUDLES(SIM) UNDER
CONDITIONAL FTDP01 AND ONE PROTOCOL MODULE (PM) COMBINING DDCMP
AND NCS.

SYNCHRONOUS OUTPUT:
 A SIM IS ALWAYS IN ONE OF FOUR STATES:
	T10FLG=-2	MESSAGE READY TO TRANSMIT
	T10FLG=-1	MESSAGE IS BEING TRANSMITTED
	T10FLG=0	LINE IS SENDING IDLES
	T10FLG=1	LINE IS SENDING SYNCS
 WHEN T10FLG IS -2 T10NWC(T0 10 NEXT WORD COUNT) AND T10NCA(TO 10 NEXT
 CURRENT ADDRESS) DESCRIBE THE NEXT MESSAGE.

SYNCHRONOUS INPUT:
 THE SIM IS ALWAYS IN ONE OF THREE STATES:
	A.)	IDLE
	B.)	RECEIVING A UNNUMBERED MESSAGE(ACK, NAK, ETC.).
	C.)	RECEIVING NUMBERED MESSAGE DATA.
 THE STATE IS SET BY THE PM BY SETTING INRCPV TO BE:
	A.)	INRC10
	B.)	INRC20
	C.)	INRC70
 WHEN THE SIM IS IN STATE C, AND ONLY THEN, INCOMING CHARS ARE PLACED
 IN CHUNKS RATHER THAN A FIXED BUFFER.
 THE SIM USES F10WC AND F10CA TO STORE THE DATA.
 WORD COUNT OVERFLOWS WILL CAUSE THE SIM:
	A.)	RESETS TO JUNK BUFFER
	B.)	TRANSFERS TO INTP40
	C.)	TRANSFERS TO INTP60
 WHEN THE RECEIVER IS IDLE AND ONE OF THE FOUR CHARS AT F10TCH IS
 FOUND IN AN INPUT STREAM THE SIM NOTIFIES THE PM BY BRANCHING TO:
	INTP00		WHEN FINDS CHAR AT F10TCH
	INTP10		WHEN FINDS CHAR AT F10TCH+1
	INTP20		WHEN FINDS CHAR AT F10TCH+2
	INTP30		WHEN FINDS CHAR AT F10TCH+3
 WHEN THE RECEIVER IS IN STATE B THE PM IS NOT NOTIFIED OF SPECIAL
 CHARS.
 WHEN THE RECEIVER IS IN STATE C THE SIM WILL NOTIFIY THE PM
 OF SPECIAL CHARS BY JMPING TO INTP70(CHAR IN INTMP1, ADR IN INTMP5);
 WHEN THE PM IS DONE WITH THE CALL TO INTP70 IT WILL RETURN TO INRC80.

>/END OF IFNZRO 0
/HERE AT INTERRUPT LEVEL TO SET RECEIVER TO IDLE MODE
INRCID,	0
	NLM1
	CDFINS			/WC IS IN FIELD 0
	DCA I	[F10WC
	NLM1
	TAD	RCVPTR		/POINT TO BEGINNING OF BUFFER
	DCA I	[F10CA		/SAVE
	TAD	(INRC10
	DCA	INRCPV		/INITIALIZE DP01 INPUT PIVOT
	CDFCNK			/BACK TO NORMAL FIELD
	JMP I	INRCID

/HERE AT INTERRUPT LEVEL WHEN RECEIVER HAS FOUND A SOH
INTP00,	TAD	(-7 		/HEADER IS ALWAYS 8 CHARS
	JMS	INTP41
	TAD	(INRC70		/WE ARE NOW RECEIVING NUMBERED MSG DATA
	DCA	INRCPV		/SET SIM MODE

	TAD	RCVPTR		/GET ADR OF MESSAGE HEADER
	JMS	GETLEN		/GET LENGTH OF MESSAGE
	TAD	(0002		/FUDGE FOR CRC
	DCA	F10TWC
	DCA	INTMP1		/INITIALIZE FOR INRC80
	TAD	(0010 		/DISPLACEMENT TO CHUNK COUNTER
	TAD	RCVPTR		/ADD TO START OF BUFFER
	DCA	INTMP2		/SAVE CHUNK COUNTER ADDRESS
	TAD	INTMP2		/GET CHUNK COUNTER ADDRESS
	DCA	CNTPNT		/STORE FOR INRC80
	DCA I	INTMP2		/CLEAR CHUNK COUNTER
	ISZ	INTMP2		/SKIP OVER CHUNK COUNTER TO LINK TO CHUNKS
	DCA I	INTMP2		/CLEAR LINK TO 1ST CHUNK
	JMP	INRC80


INTP20,			/SHOULDN'T HAPPEN
INTP30,			/SHOULDN'T HAPPEN !
/HERE AT INTERRUPT LEVEL WHEN RECEIVER DETECTS BEGINING OF UNNUMBERED MESSAGE = ENQ
INTP10,	TAD	(-7		/UNNUMBERED MESSAGES ARE ALWAYS 8 CHAR LONG

INTP31,	JMS	INTP41		/WAIT FOR REST OF MESSAGE FROM DECSYSTEM-10
INTP33,	NLM1
	DCA	WRKREQ		/SO NON-INTERRUPT LEVEL CODE WAKE UP
	TAD	(CTLSIZ		/ADVANCE TO NEXT CTL BUFFER
	TAD	RCVPTR
	TAD	(-RCVLIM
	SNA
	  TAD	(RCVQUE-RCVLIM
	TAD	(RCVLIM
	DCA	RCVPTR
	TAD	RCVPTR
	NEGATE
	TAD	RCVTKR
	SNA CLA			/DO WE HAVE TOO MANY MSGS READY
	  HLT
	JMS	INRCID		/SET RECEIVER TO IDLE STATE
	JMP	INTP42

/HERE AT INTERRUPT LEVEL WITH WC OVERFLOW ON UNNUMBERED MESSAGE
INTP40,	JMP I	INTP41
INTP41,	0
	CDFINS			/NEED TO SET WC AND CA IN FIELD 0
	DCA I	[F10WC		/SAVE LENGTH
	TAD	RCVPTR		/ADR OF BUFFER FOR HEADER
	DCA I	[F10CA		/SET BUFFER ADR FOR RECEIVER
	TAD	(INRC20
	DCA	INRCPV
	CDFCNK			/RESET NORMAL DATA FIELD
INTP42,
IFZERO FTDP01 <	DPSGRR >	/ENABLE RECEIVER
	JMP	INTDIS

/HERE AT INTERRUPT LEVEL WITH WC OVERFLOW ON NUMBERED MSG DATA
INTP60=INTP33		/JUST CALL CURRENT MSG DONE


INTP70=INTDIS		/NO SPECIAL CHAR HANDLING IN MIDDLE OF JUNK
/	***********************************************************
/	***********************************************************
/	***							***
/	***			DDCMP				***
/	***							***
/	***********************************************************
/	***********************************************************

/MESSAGE PROTOCOL
	SYN=226
	IDLE=SYN		/NO SPECIAL IDLE CHARACTER
	ENQ=005		/1ST CHAR IN UNNUMBERED MESSAGES
	DLE=220		/1ST CHAR IN BOOTSTRAP MESSAGES
	SOH=201		/1ST CHAR IN NUMBERED MESSAGES

/NUMBERED MESSAGES
/	SOH CC1 CC2 R N A0 BCC1 BCC2 DEV CNT TYPE DATA BCC3 BCC4
/	CC1&CC2 ARE TOTAL LENGTH OF DATA(BCC2 THRU BCC3 EXCLUSIVE)
/	CC1 IS LOWORDER 8BITS OF NUMB
/	R IS # OF LAST GOOD MESSAGE RECEIVED
/	N IS THIS MESSAGE NUMBER
/	A0 IS THE DESTINATION STATION ADR(ALWAYS 1)
/	BCC1 BCC2 IS THE CRC ON SOH THROUGH A0 INCLUSIVE
/	DATA IS ADR N TYPE MUMBLE, ETC(WHERE N IS LENGTH OF MUMBLE)
/	  N TYPE MUMBLE MAY BE REPEATED
/	BCC3 BCC4 ARE THE CRC OF BCC2 THRU BCC3 EXCLUSIVE
/	DEV IS THE DESTINATION DEVICE; 1 IS STATION
/	CNT(EXTENSIBLE) IS LENGTH OF (TYPE-DATA)
/	TYPE IS	1=INITIAL CONFIGURATION MESSAGE
/		2=CONNECT FOLLOWED BY:
/			DEVICE ADR(OR 0 FOR PICK ONE)
/			DEVICE TYPE
/			FEATURES
/		3=DISCONNECT
/		4=REJECT
/		5=ACCEPT
/		6=STATION GOING DOWN
/		7=REQUEST STATUS
/		10=STATUS MESSAGE
/		11=REQUEST MODE
/		12=SET MODE
/		13=DATA REQUEST BY RECORD
/		14=DATA REQUEST BY CHAR
/	DATA IS WHAT MAY FOLLOW TYPE
/	(CNT TYPE DATA) MAY BE REPEATED
/UNNUMBERED MESSAGES
	FILL=000		/FILL CHARACTER
	A0=1		/DESTINATION STATION ADR

/ACK:	ENQ	ACK	FILL	MSG#	FILL	A0	BCC1	BCC2
	ACK=001
/	MSG# IS LAST GOOD MSG RECEIVED

/NAK:	ENQ	NAK	RNAK	MSG#	FILL	A0	BCC1	BCC2
	NAK=002		/NEGATIVE ACKNOWLEDGE
/	RNAK=1	BCC ERROR
/	RNAK=3	REP RESPONSE
/	RNAK=10	SHORT TERM HIGH LEVEL EXCEPTION
/	RNAK=11	RECEIVER OVERRUN
/	RNAK=20	MESSAGE TOO LONG
/	RNAK=21	HEADER FORMAT ERROR
/	MSG# IS LAST GOOD MSG RECEIVED

/REP:	ENQ	REP	FILL	FILL	N	A0	BCC1	BCC2
	REP=003		/REPLY TYPE
/	N IS THE LAST MESSAGE# SENT

/RESET:	ENQ	RESET	FILL	FILL	N	A0	BCC1	BCC2
	RESET=4		/DC72NP WILL NOT SEND THIS TYPE/WILL RESPOND WITH START

/RESAK:	ENQ	RESAK	FILL	R	FILL	A0	BCC1	BCC2
	RESAK=5		/DC72NP WILL NOT SEND THIS TYPE/WILL RESPOND WITH START

/START:	ENQ	STRT	FILL	FILL	FILL	A0	BCC1	BCC2
	STRT=006		/START TYPE
/	THE NEXT NUMBERED MESSAGE TO BE SENT IS 1

/STACK:	ENQ	STACK	FILL	FILL	FILL	A0	BCC1	BCC2
	STACK=007		/START ACKNOWLEDGE
/	THE NEXT MESSAGE SENT, AND NEXT MESSAGE EXPECTED
/	ARE BOTH 1.

/BOOT:	DLE	CC1	CC2	R	N	A0	BCC1	BCC2	S1	S2	DATA	BCC3	BCC4

DEFINE T10ADJ Q <	XLIST
	TAD	Q
	TAD	(-T10LST	/CHECK FOR LAST BUF
	SNA
	  TAD	(T10BF1-T10LST-T10LEN	/ADJUST IF LAST
	TAD	(T10LEN+T10LST
	DCA	Q		/ADJUST & SAVE NEW VALUE
XLIST	>/END OF T10CHK
MSNMAX=377		/MAXIMUM MESSAGE NUMBER

/WHEN A MSG IS RECEIVED CORRECTLY AN ACK IS SENT BACK;
/ AN ACK IMPLIES ACK OF ALL LOWER NUMBERED MESSAGES
/WHEN A MSG IS RECEIVED INCORRECTLY A NAK MSG IS SENT BACK;
/ A NAK IMPLIES ACK OF ALL LOWER NUMBERED MSGS.
/HERE TO PROCESS MESSAGE RECEIVED FROM THE DECSYSTEM-10
RCVCHK,	DCA	CRC1
CRCXI1,	DCA	CRC2		/INITIALIZE CRC			########
	TAD	(-6
	DCA	TEMP3		/6 CHARS IN ALL MESSAGES
	NLM1
	TAD	RCVTKR
	DCA	AUTO1		/MESSAGE POINTER
RCVCK2,	TAD I	AUTO1
IFZERO	DP8ETR	<
	JMS	CRCALC		/PUT NEXT CHAR INTO CRC
>/END OF IFZERO	DP8ETR
IFNZRO	DP8ETR	<
	JMS	ITRCRC		/TRACE AND ACCUM CRC
>/END OF IFNZRO	DP8ETR
	ISZ	TEMP3
	JMP	RCVCK2

IFZERO	DP8ETR	<
	NL4
	TAD	AUTO1
	DCA	TEMP5		/SAVE POINTER TO ADR OF CHUNK STRING
>/END OF IFZERO	DP8ETR
IFNZRO	DP8ETR	<
	JMS	ITRCR2		/STASH CRC IN TRACE
>/END OF IFNZRO	DP8ETR
	TAD I	AUTO1
	NEGATE
	TAD	CRC2		/COMPARE HALF OF CRC
	SZA CLA
	JMP	BADCRC		/BRANCH IF BUM CRC
	TAD I	AUTO1
	NEGATE
	TAD	CRC1		/GET SECOND HALF OF CRC
	SZA CLA
	JMP	BADCRC		/BRANCH IF BUM
	TAD I	RCVTKR
	TAD	(-SOH
	SNA			/TEST FOR NUMBERED MESSAGE
	  JMP	RCVMSG
	TAD	(SOH-ENQ
	SZA CLA
	HLT			/BE SURE IS ENQ
	TAD	RCVTKR
	DCA	AUTO1
	TAD I	AUTO1		/GET MESSAGE TYPE CODE
	SPA SNA
	JMP	RCVGAG		/CHECK CODE LARGE ENOUGH
	TAD	(-10
	SMA
	JMP	RCVGAG		/CHECK FOR TOO LARGE
	TAD	(JMP I	RCVTAB+7
	DCA .+1
	7402			/DISPATCH ON MESSAGE CODE
RCVTAB,	RCVACK;	RCVNAK;	RCVREP;	RRESET;	RRSACK;	RCVSRT;	RCVSTK

	PAGE
/HERE WHEN RECEIVE AN ACK MESSAGE
RCVACK,	JMS	RCVRCK		/DO RIGHT THING BY MSG#
	JMP	RCVADV


/HERE WHEN RECEIVE A NAK MESSAGE
RCVNAK,	JMS	RCVRCK		/DO RIGHT THING BY MSG#
	TAD	T10AKR
	DCA	T10TKR		/RESET BUFFER TO SEND NEXT
	JMP	RCVADV

/HERE TO CHECK MSG# IN ACK OR NAK OR NUMBERED MSG
/ ADJUSTS QUEUE ETC.
RCVRCK,	0
	NL3
	TAD	RCVTKR
	DCA	TEMP2		/POINTER TO MSG#
	TAD I	TEMP2
	JMS	RCVRC8
	DCA	TEMP1		/SAVE ADJ #
	TAD	T10HSN
	JMS	RCVRC8
	NEGATE
	TAD	TEMP1
	SPA CLA
	JMP	RCVGAG		/IF NOT REASONABLE RESTART
RCVRC0,	TAD I	TEMP2
	NEGATE
	TAD	T10LAN		/COMPARE LAST ACKED & THIS
	SNA CLA
	JMP I	RCVRCK		/IF SAME DONE
	TAD	T10AKR
	NEGATE
	TAD	T10TKR
	SZA CLA
	  JMP	RCVRC1
	T10ADJ	T10TKR
RCVRC1,	TAD	T10LAN
	JMS	COUNT
	DCA	T10LAN		/ADJUST MSG #
	T10ADJ	T10AKR
	TAD	T10LAN
	DCA I	TEMP2
	TAD	(-REPTIM	/TIME TILL NEXT REP
	DCA	REPTCK
	JMP	RCVRC0
/FOLLOWING RETURNS LAN-N OR LAN-N-MSNMAX-1
RCVRC8,	0
	NEGATE
	TAD	T10LAN		/COMPARE TO LAST ACKED
	SMA SZA
	TAD	(-MSNMAX-1
	JMP I	RCVRC8

/HERE WHEN RECEIVE A REP MESSAGE
RCVREP,	NL3
	DCA	NAKFLG		/SEND NAK WITH REASON = 3
	JMP	RCVADV		/DONE WITH BLOCK

/HERE WHEN RECEIVE A RESET MESSAGE
RRESET,

/HERE WHEN RECEIVE A RESET ACKNOWLEDGE MESSAGE
RRSACK,
/HERE WHEN RECEIVE A MESSAGE WITH TYPE OUT OF RANGE(E.G. POLL)
RCVGAG,	IOF
	NL0			/CLEAR AC & INTERRUPTS
	TAD	(BMTMSG-1
	JMS	CTYEXC		/COMPLAIN TO OPERATOR
	JMP	INIALL		/RESTART STATION

/HERE WHEN RECEIVE A START MESSAGE
RCVSRT,	JMS	RVSTK2		/INITIALIZE RECVOK
	IOF			/TURN INTERRUPTS OFF
	NLM1			/FLAG TO SEND A STACK
	DCA	STACKF		/SET FLAG
	JMP	INISUM		/REINITIALIZE STATION

/HERE WHEN RECEIVE A STACK MESSAGE
RCVSTK,	JMS	RVSTK2		/INITIALIZE RECVOK
	DCA	STACKF		/FLAG WE ARE UP NOW
	JMP	RCVADV
RVSTK2,	0
/	NL4
/	TAD	RCVTKR
/	DCA	TEMP1		/NEXT MSG # WILL GET
/	NLM1
/	TAD I	TEMP1		/DECREMENT IT
/	AND	[0377
	NL0			/ZERO IS LAST MESSAGE RECEIVED
	DCA	RECVOK		/LAST # RECEIVED OK
	JMP I	RVSTK2
/HERE WHEN RECEIVE A NUMBERED MESSAGE
RCVMSG,	JMS	RCVRCK		/DO RIGHT THING BY RESPONSE FIELD
	NLM3
	TAD	AUTO1
	DCA	TEMP1		/POINTER TO MSG N#
	TAD	RECVOK
	JMS	COUNT
	NEGATE			/MAKE -# EXPECTED
	TAD I	TEMP1
	SZA CLA
	JMP	RCVFLU		/IF NOT EXPECTED DONE
CRCXI2,	DCA	CRC1		/				########
	DCA	CRC2		/INITILAIZE CRC FOR MESSAGE
	TAD I	TEMP5
	DCA	TEMP3		/ADR OF CHUNKS(IF ANY)
	TAD	RCVTKR		/GET ADR OF MESSAGE HEADER
	IOF
	JMS	GETLEN		/GET LENGTH OF MESSAGE
	ION
	NEGATE
	DCA	TEMP4		/AND SAVE DATA COUNT
	TAD	TEMP4
	DCA	TEMP2		/KEEP 2ND COPY OF COUNT
	JMP	RCMSG0

/HERE TO GET THE LENGTH FIELD FROM A MESSAGE HEADER
GETLEN,	0
	DCA	IAUTO1
	TAD I	IAUTO1
	DCA	INTMP1		/SAVE LOWORDER BITS
	TAD I	IAUTO1
	AND	(0007		/ONLY BELIVE 11BITS OF COUNT
IFZERO	PDP8I	<
	CLL RTL			/CAN'T ROTATE RIGHT
	CLL RTL			/THROUGH LINK THAT
	CLL RTL			/INTERRUPTS ZAP
>
IFZERO	PDP8E	<
	BSW
>
	CLL RTL
	TAD	INTMP1
	JMP I	GETLEN

	PAGE
RCMSG0,	JMS	GETCHR
	JMP	NRMNAK		/GET NEXT CHAR IF ANY
IFZERO	DP8ETR	<
	JMS	CRCALC
>/END OF IFZERO	DP8ETR
IFNZRO	DP8ETR	<
	JMS	ITRCRC		/TRACE AND ACCUM CRC
>/END OF IFNZRO	DP8ETR
	ISZ	TEMP2
	JMP	RCMSG0		/LOOP BACK FOR REST OF DATA
	TAD	TEMP3		/GET ADR OF LAST DATA
	DCA	TEMP6		/SAVE IT
IFZERO	DP8ETR	<
	JMS	GETCHR
	  JMP	NRMNAK
>/END OF IFZERO	DP8ETR
IFNZRO	DP8ETR	<
	JMS	ITRCR3		/GET CRC CHAR AND TRACE IT
>/END OF IFNZRO	DP8ETR
	NEGATE			/GET -CRC2
	TAD	CRC2		/GET LOW PART OF CRC
	SZA CLA
	JMP	BADCRC
IFZERO	DP8ETR	<
	JMS	GETCHR
	  JMP	NRMNAK
>/END OF IFZERO	DP8ETR
IFNZRO	DP8ETR	<
	JMS	ITRCR3		/GET CRC CHARACTER AND TRACE IT
>/END OF IFNZRO	DP8ETR
	NEGATE			/GET -CRC1
	TAD	CRC1		/GET HIGH ORDER PART OF CRC
	SZA CLA
	JMP	BADCRC
	NL4000			/LAST CHAR IN CHUNK FLAG
	TAD I	TEMP6
	SPA			/SKIP IF WAS ALREADY LAST CHAR IN CHUNK
	  DCA I	TEMP6		/SET FLAG ON CHAR
	NL0
	TAD	TEMP6		/GET ADR OF LAST CHAR AGAIN
	AND	[-CNKSIZ	/MAKE INTO CHUNK POINTER
	DCA	TEMP6
	NLM1
	TAD	TEMP5
	DCA	TEMP3		/STORE ADR OF CHUNK COUNT
	TAD I	TEMP6		/GET ADR OF CRC CHUNK IF NOT THIS ONE
	SNA			/SKIP IF THERE IS ONE FOR CRC
	  JMP	RCMSG1		/OTHERWISE SKIP OVER FOLLOWING
	JMS	FRECKS		/FREE CHUNK WITH CRC(MAYBE)
	DCA I	TEMP6		/CLEAR LINK TO CRC CHUNKS
	NLM1			/DECREMENT CHUNK COUNT
	TAD I	TEMP3
	DCA I	TEMP3
RCMSG1,
	TAD	RECVOK
	JMS	COUNT		/INCREMENT MSG#
	TAD	(4000
	DCA	RECVOK		/AND SAVE IT W FLAG TO ACK
	TAD I	TEMP5		/GET ADR OF 1ST CHUNK
	DCA	TEMP3		/SAVE ADR OF 1ST CHUNK
	JMS	GTCHR		/GET NCT
	DCA	RNCT		/STORE FOR A WHILE
	TAD	(10		/SELECT SNA/DNA PRESENT BIT
	AND	RNCT		/TURN OFF REST
	SNA			/SHOULD BE ON
	  JMP	NODNA		/SKIP OVER DNA,SNA GETTING
	JMS	GTCHR		/GET DNA
	JMS	GTCHR		/GET SNA
NODNA,
	DCA	RSNA		/SAVE IT FOR LATER
	JMS	GTCHR		/GET NCA
	JMS	GTCHR		/GET NCN
	NL0
	TAD	[7		/MASK OF TYPE BITS FOR NCT
	AND	RNCT		/TURN OFF ALL BUT LOW ORDER 3
	SNA			/SKIP IF UN-NUMBERED CONTROL
	  JMP	NMBRED		/HANDLE NUMBERED CONTROL OR DEVICE CONTROL
/ ONLY UN-NUMBERED CONTROL MESSAGE VALID IS NODE ID (6)
/IFNZRO	FTDEBUG	<
/	TAD	(-6		/CODE FOR NODE ID
/	SZA			/SKIP IF OK
/	  HLT			/HALT IF NOT
/>/END OF IFNZRO	FTDEBUG
	JMS	GETEXN		/GET NODE NUMBER
	DCA	RNOD		/STORE IT
	JMP	RCVFLU		/FLUSH IT AND CONTINUE BIG LOOP
NMBRED,	JMS	GETEXN		/GET DLA
	SZA			/TEST IF NUMBERED CONTROL
	  JMP	DVCTLM		/NO, DEVICE CONTROL
/ DLA OF ZERO MEANS NCS NUMBERED CONTROL MESSAGE
/ LEGAL ONES FOR 72 ARE:
/	CONNECT (1)
/	DISCONNECT (2)
/	NEIGHBORS (3) [ONLY FROM 72'S NEIGHBOR]
/	DATA REQUEST (6)
/	REQUEST CONFIG (4)
	JMS	GETEXN		/GET COUNT
	NEGATE
	DCA	TEMP4		/SAVE IN TEMP4
	JMS	GTCHR		/GET TYPE
	AND	[7		/CLEAR ALL BUT LOW ORDER
	TAD	(JMP I NBRDSP	/ADD BEGINNING OF TABLE+INSTRUCTION
	DCA	NBRJMP		/STORE DISPATCH ADDRESS
NBRJMP,	0			/DISPATCH

NBRDSP,	RCVKRD			/0 IS ILLEGAL
	RCVCON			/1 IS CONNECT
	RCVDIS			/2 IS DISCONNECT
	RCVNEI			/3 IS NEIGHBORS
	RCVRQC			/4 IS REQ CONFIG
	RCVFLU			/5 (CONFIG) IS IGNORED
	IFNZRO	CDRN	<
	RCVDRQ			/6 IS DATA REQUEST
>/END OF IFNZRO	CDRN
	IFZERO	CDRN	<
	RCVFLU			/6 (DATA REQUEST) INVALID UNLESS CDR
>/END OF IFZERO	CDRN
	RCVFLU			/7 (STA. CTL) IS IGNORED
/HERE TO ACCUMULATE CRC
/ ALGORITHM IS:
/	XOR	C,CRC
/	ANDI	C,377
/	LSH	CRC,-10
/	XOR	CRC,TAB(C)

CRCALC,	0

/XOR	C,CRC
	DCA	TEMP1
	TAD	TEMP1
	AND	CRC2
	CMA IAC
	CLL RAL
	TAD	TEMP1
	TAD	CRC2

/ANDI	C,377
/	AND	[0377		/8 BITS ONLY

/LSH CRC,-10 & XOR CRC,TAB(C)
	TAD	(CRCTAB
	DCA	TEMP1
	TAD I	TEMP1
	AND	CRC1
	CMA IAC
	CLL RAL
	TAD I	TEMP1
	TAD	CRC1
	DCA	CRC2
	TAD	(400
	TAD	TEMP1
	DCA	TEMP1
	TAD I	TEMP1
	DCA	CRC1

CRCRET,	JMP I	CRCALC
DOWN2,	TAD	(RCVDSP+1-SNATAB/POINT TO RCVDSP ENTRY
	DCA	TEMP1		/STORE ADDRESS
	TAD	(RCVKRD		/UN-USED VALUE
	DCA I	TEMP1		/NOW THIS CONNECTION IS AVAIL
	JMP	NEIG13		/RETURN TO LOOP
	PAGE
/HERE TO GET AN EXTENSIBLE NUMBER
/ CALL	JMS	GETEXN	WITH TEMP3 POINTING TO THE STRING OF CHUNKS
RCVADL,				/HERE WHEN YOU GET A REQUEST TO AUTODIAL
RCVKRD,	HLT			/HERE WHEN YOU GET VARIOUS FLAVORS OF GARBAGE
GETEXN,	0
	JMS	GTCHR
	DCA	TEMP1
	TAD	TEMP1
	AND	(0200		/MASK OFF EXT BIT
	SNA CLA	
	JMP	GETEX2
	JMS	GTCHR
	CLL RTL
	CLL RTL
	SPA
	  HLT
	CLL RTL
	CLL RAL
	TAD	(-200
GETEX2,	TAD	TEMP1
	JMP I	GETEXN

/HERE WHEN RECEIVE A DISCONNECT
RCVDIS,	JMS	GTCHR		/GET ADR OF DEVICE
	TAD	(CTRLTB-1
	DCA	TEMP1
	TAD I	TEMP1
IFNZRO FTDEBUG <
	SNA
	  HLT
>/END OF IFNZRO FTDEBUG
	DCA	DDB
	TAD	DDB
	TAD	(DEVSTS
	DCA	DDBSTS
IFNZRO FTDEBUG <
	NL2000
	AND I	DDBSTS
	SNA CLA
	  HLT			/NOT CONNECTED
>/END OF IFNZRO FTDEBUG
	TAD I	DDBSTS
	AND	(4777
	TAD	(1000		/BIT TO SEND AN ACCEPT
	DCA I	DDBSTS
	DCA I	TEMP1		/NO LONGER CONNECTED
	TAD	TEMP1
	TAD	(RCVDSP-CTRLTB+1
	DCA	TEMP1
	TAD	(RCVKRD
	DCA I	TEMP1
	JMP	RCVFLU		/DONE WITH MESSAGE
/HERE WHEN RECEIVE A CONNECT MESSAGE
RCVCON,	JMS	GETEXN		/GET DLA
	SNA			/CHECK FOR 0
	  JMP	RCVCN6		/YES SO MAKE ONE
/ HERE WHEN DLA IS NON-ZERO; THAT MEANS A CONNECT CONFIRM.
/ HOWEVER, DC72 NEVER DOES A CONNECT, SO SHOULDN'T HAPPEN.
	HLT
RCVCN2,	
	JMS	GETEXN		/GET SLA
	DCA	TEMP2		/STORE IT
	TAD	(DEVN		/LENGTH OF RCVDSP TABLE
	TAD	TEMPA		/ADD RCVDSP ENTRY POINTER
	DCA	TEMP1		/STORE ADDRESS FOR SLA
	TAD	TEMP2		/PICK UP SLA
	DCA I	TEMP1		/STASH IT
	TAD	(DEVTYP-1	/GET ADR OF DEVICE TYPE TABLE
	DCA	AUTO1
	TAD	(-CTRLN		/NUMBER OF POSSIBLE TYPES
	DCA	TEMPD		/NUMBER OF POSSIBLE TYPES
	JMS	GTCHR		/GET OBJECT TYPE (ONLY ONE BYTE)
/ LEGAL ARE 1=TTY,1=CARD READER,3=LINE PRINTER
RCVCN4,	TAD I	AUTO1
	SNA
	  JMP	RCVCN5		/THIS IS THE ONE WE NEEDED
	ISZ	AUTO1		/SKIP DISPATCH ADR
	ISZ	TEMPD		/HAVE CHECK ALL POSSIBLE ?
	  JMP	RCVCN4		/NO SO KEEP ON CHECKING
	JMP	BADTYP		/SEND DISCONNECT
RCVCN5,	TAD I	AUTO1
	DCA	TEMPB
	TAD	(-CONTTY	/SEE IF TTY
	TAD	TEMPB		/WE ARE DISPATCHING TO
	SNA CLA			/SKIP IF NOT
	  JMP	RCVCNT		/HANDLE TTY CASE
	JMS	SKPEXN		/SKIP PROCESS ID FIELD
RCVCN0,
	JMS	GETEXN		/GET OBJECT TYPE OF SENDER
	JMS	SKPEXN		/SKIP HIS PROCESS ID
	JMS	GETEXN		/MAX MESSAGE LENGTH
	DCA	TEMP1		/STORE
	TAD	(DEVN
	TAD	(DEVN
	TAD	TEMPA		/DISPATCH ADDRESS
	DCA	TEMP2		/STASH
	TAD	TEMP1		/GET MAX LENGTH
	DCA I	TEMP2		/STORE IT
	TAD	TEMP2		/GET ADDRESS
	TAD	(DEVN		/POINT TO NEXT TABLE
	DCA	TEMP2		/STORE IT
	TAD	RSNA		/GET SNA
	DCA I	TEMP2		/STORE IT
	JMP I	TEMPB		/GO TO DEVICE DEPENDENT CONNECT
RCVCNT,	JMS	GETEXN		/GET TTY NUMBER
	DCA	TTYNO
	JMP	RCVCN0		/CONTINUE

TTYNO,	-1
CONTTY,	TAD	(RCVTTY		/DISPATCH ADDRESS
	DCA I	TEMPA		/SAVE IT
	TAD	TTYNO
	JMS	TDBCHK		/CHECK TTY RANGE
	TAD	(DDBTAB
	DCA	TEMPC		/PROPER ENTRY
	TAD I	TEMPC		/PROPER DDB
	JMP	CONDEV
	IFNZRO	CDRN	<
CONCDR,	TAD	(RCVCDR		/DISPATCH ADDRESS
	DCA I	TEMPA		/INTO TABLE
	TAD	(CDRBLK		/GET DDB ADDRESS
	JMP	CONDEV		/DO REST
>/END OF IFNZRO	CDRN
	PAGE
/HERE TO FIND A VACANT SLOT FOR A CONNECT
RCVCN6,	TAD	(-DEVN
	DCA	TEMP2
	TAD	(RCVDSP+1
	DCA	TEMPA		/BEGINNING OF DISPATCH TABLE + 1
RCVCN7,	TAD I	TEMPA		/GET DISPATCH ADDRESS
	TAD	(-RCVKRD	/IS IT UNUSED?
	SNA CLA			/SKIP IF NOT
	  JMP	RCVCN2		/YES, WE'VE FOUND ONE
	ISZ	TEMPA		/ADVANCE TO NEXT DISPATCH ENTRY
	ISZ	TEMP2		/HAVE WE CHECKED ALL SLOTS ?
	  JMP	RCVCN7
	JMP	TOOMNY		/SEND DISCONNECT
	IFNZRO	LPTN	<
/HERE ON CONNECT FOR LPT
CONLPT,	TAD	(RCVLPT		/GET WHERE TO GO ON MESSAGE
	DCA I	TEMPA		/STORE IN RCVDSP TABLE
	TAD	(LPTBLK		/POINT TO DEVICE BLOCK
	JMP	CONDEV		/CONTINUE (I.E. SET CONNECT AND NEED-TO-ACCEPT BITS)
>/END OF IFNZRO	LPTN
DVCTLM,			/DEVICE CONTROL MESSAGE
/ AC HAS DLA IN IT
	ZZ=CTRLN
	ZZ=DEVN
	TAD	(-ZZ		/NEGATIVE OF (NO. OF ENTRIES+1)
	SMA SZA
	  JMP	RCVKRD		/OUT OF RANGE
	TAD	(RCVDSP+ZZ	/POINT TO DISPATCH TABLE ENTRY
	DCA	TEMP1		/SAVE IT
	TAD I	TEMP1		/GET DISPATCH ADDRESS
	DCA	TEMP2		/SAVE IT
	TAD	TEMP1		/DISPATCH ADDRESS
	TAD	(-ZZ-1		/POINT TO DDB ADDRESS
	DCA	TEMP1		/SAVE ADDR OF DDB ADDRESS
	TAD I	TEMP1		/GET DDB ADDRESS
	DCA	DDB		/STORE
	TAD	RNCT		/GET NCT
	AND	[40		/SEE IF INTERRUPT MESSAGE
	SNA CLA			/SKIP IF YES
	  JMS	DATDEC		/DECREMENT DATA REQUESTS
	JMS	GETEXN		/GET COUNT
	NEGATE
	DCA	TEMP4		/SAVE MINUS COUNT
	JMS	GETEXN		/GET DEVICE CTL MESSAGE TYPE
	JMP I	TEMP2

/DEVICE INDEPENDENT PORTION OF CONNECT
/ CALL WITH DEVICE BLOCK IN AC
CONDEV,	DCA	DDB		/SAVE DEVICE ADR
	NLOAD	DEVSTS
	TAD	DDB
	DCA	DDBSTS
	NLOAD	DEVRNN		/GET DISP OF RESTRICTED NODE NUMBER
	TAD	DDB		/IN THIS DDB
	DCA	TEMP2		/STORE ADDRESS
	TAD I	TEMP2		/GET RNN
	SNA			/SKIP IF NOT ZERO
	  JMP	CONANY		/ZERO MEANS ANYONE CAN CONNECT
	TAD	RSNA		/GET THIS NODE
	SZA CLA			/SKIP IF MATCHES
	  JMP	INUSE		/ELSE PRETEND ALREADY CONNECTED
CONANY,

	TAD	(CONBIT+1000	/CONNECTED AND ACCEPT BITS
	AND I	DDBSTS
	SZA CLA
	  JMP	INUSE		/DEVICE NOT AVAILABLE

	Q=DEVDRQ-DEVSTS
	NLOAD	Q
	TAD	DDBSTS
	DCA	TEMP2
	DCA I	TEMP2		/CLEAR DATA REQUESTS
	ISZ	TEMP2		/ADVANCE TO DEVDDC
	DCA I	TEMP2		/CLEAR DDCMP STATUS
	TAD	(4776		/MASK TO CLEAR CONNECT & ACCEPT & EOF BITS
	AND I	DDBSTS
	TAD	(3001		/CONNECT BIT & ACCEPT BIT & SEND STATUS
	DCA I	DDBSTS

	TAD I	DDB		/GET OLD DEVICE ADR
	AND	(7700		/STRIP IT
	TAD	TEMPA		/GET DISPATCH ADDRESS
	TAD	(-RCVDSP	/MAKES CONNECT CODE
	DCA I	DDB		/SAVE ADR

	TAD	TEMPA		/GET DISPATCH ADDRESS
	TAD	(-DEVN-1
	DCA	TEMP1
	TAD	DDB
	DCA I	TEMP1
	JMP	RCVFLU
IFNZRO LPTN <
RCVLPT,	NL0			/IGNORE MESSAGE TYPE
	TAD I	TEMP5		/GET ADR OF FIRST CHUNK IN MESSAGE
	DCA	AUTO1		/POINTER TO SHUFFLE TO
	NL6			/POINT TO COUNT
	TAD I	TEMP5
	DCA	TEMP3
RCVLP1,	ISZ	TEMP3
	TAD I	TEMP3
	DCA I	AUTO1		/PUT NEXT CHAR BACK INTO CHUNK
	TAD I	TEMP3		/GET CHAR AGAIN
	SMA CLA
	  JMP	RCVLP1

	IOF
	TAD I	(LPTBLK+DEVOAD	/GET CURRENT OUTPUT CHAR ADR
	SZA CLA			/IS THERE ONE ?
	  JMP	RCVLP3		/YES
	TAD I	TEMP5		/ADR OF NEW FIRST CHUNK
	DCA I	(LPTBLK+DEVOAD
	JMP	RCVLP5
RCVLP3,	TAD I	(LPTBLK+DEVOLC	/GET ADR OF LAST CHUNK
	DCA	TEMP1		/SAVE IT
	TAD I	TEMP5		/GET ADR OF 1ST CHAR WE ARE ADDING
	DCA I	TEMP1		/LINK INTO OUTPUT CHUNKS
RCVLP5,	TAD	TEMP6		/GET ADR OF LAST CHAR
	DCA I	(LPTBLK+DEVOLC	/SET NEW LAST CHUNK ADR
	JMP	RCVLP6		/GO UPDATE CHUNK COUNT
>/END OF IFNZRO LPT
IFNZRO	TTYN	<
IFZERO	FTDC02F	<
DISSN1,	DISCD1
	JMP	DISSN2
>/END OF IFZERO	FTDC02F
>/END OF IFNZRO	TTYN
	PAGE
IFNZRO CDRN <
/HERE WHEN RECEIVE A MESSAGE FOR THE CDR
/ REQUEST STATUS 7
/ REQUEST MODE 11
/ SET MODE 12
/ DATA REQUEST BY RECORD 13
/ NEGATIVE DATA REQUEST 15
RCVCDR,	TAD	(-3		/SEE IF STATUS
	SNA
	  JMP	RCDSTA		/HANDLE STATUS
	TAD	(-1		/SEE IF CONTINUE
	SZA			/SKIP IF YES
	  JMP	RCVFLU		/IGNORE OTHER MSGS
RCDCON,				/HERE TO PROCESS CONTINUE
	TAD	(CDRBLK
	DCA	INTDDB
	NL3777
	AND I	(CDRBLK+DEVDDC
	JMS	ISTDDC
	JMP	RCVFLU
RCVDRQ,				/HERE WHEN RECEIVE DATA REQUEST
	IFZERO	CDRN	<
	JMP	RCVFLU		/IGNORE EXCEPT FOR CARD READER
>/END OF IFZERO	CDRN
	IFNZRO	CDRN	<
	JMS	GETEXN		/GET DLA
	TAD	(RCVDSP		/ADD START OF DISPATCH TABLE
	DCA	TEMPA		/SAVE THIS ENTRY ADDRESS
	TAD I	TEMPA		/GET THIS ENTRY
	TAD	(-RCVCDR	/IS IT CDR?
	SZA CLA
	  JMP	RCVFLU		/NO, IGNORE
/	JMP	RCDDRQ		/GO DO DATA REQUEST
>/END OF IFNZRO	CDRN
RCDDRQ,	JMS	GETEXN		/GET DATA REQUEST
	TAD I	(CDRBLK+DEVDRQ
	DCA I	(CDRBLK+DEVDRQ
	JMP	RCVFLU		/DISPOSE OF MESSAGE
>/END OF IFNZRO CDR
RCDSTA,	JMS	GTCHR		/GET TYPE
	TAD	(-2		/CLEAR BITS?
	SZA CLA
	  JMP	RCVFLU
	TAD	[DEVDDC
	TAD	DDB
	DCA	TEMP6
	JMS	RCTBIT
	DCA I	TEMP6
	JMP	RCVFLU
IFNZRO PLTN <
RCVPLT,	HLT
>/END OF IFNZRO PLT

IFNZRO PTPN <
RCVPTP,	HLT
>/END OF IFNZRO PTP

RCTBIT,	0
	JMS	GETEXN		/GET BITS 10 WANTS TO CHANGE
	DCA	TEMP1		/SAVE THE BITS
	TAD	TEMP1		/GET CHANGE BITS AGAIN
	CMA			/COMPLEMENT
	AND I	TEMP6		/GET DDCMPSTATUS WORD WITHOUT BITS
	JMP I	RCTBIT
RCVTT0,	JMS	GETCHR
	  JMP	RCVFLU
	NEGATE
	IAC
	DCA	TEMP4
	JMS	GTCHR
	JMP	RCVTT6
RCVTTY,	
	DCA	TEMP1
	NLOAD	DEVSTS
	TAD	DDB
	DCA	DDBSTS
	TAD	DDB
	IAC
	DCA	TEMP7		/STORE DEVOAD ADDRESS
	TAD	TEMP4		/GET COUNT
	IAC			/SUBTRACT ONE FOR TYPE
	DCA	TEMP4
	NLOAD	DEVDDC-DEVSTS
	TAD	DDBSTS
	DCA	TEMP6		/STORE DEVDDC ADDRESS
	NLOAD	DEVOLC		/OFFSET FOR DEVOLC
	TAD	DDB		/MAKE ABSOLUTE ADR
	DCA	TEMP8		/SAVE POINTER TO DEVOLC
	NLOAD	DEVCHK
	TAD	DDB
	DCA	TEMPA		/STORE ADR OF CHUNK COUNT
	TAD	TEMP1		/GET TYPE
RCVTT6,	TAD	(-1		/TEST TYPE
	SZA			/SKIP IF DATA
	  JMP	RCVTTC		/NO, CONTROL OR STATUS
RCVTT1,	JMS	GTCHR		/GET THE NEXT CHARACTER FROM MESSAGE
	DCA	TEMP1		/SAVE IT
	IOF			/INTERRUPTS OFF WHILE WE CHANGE THINGS
	TAD I	TEMP7		/GET DEVOAD
	SZA CLA			/SKIP IF NO OUTPUT CHUNKS YET
	  JMP	RCVTT2		/ALREADY HAVE SOME CHUNKS
	JMS	ERSGET		/GET A CHUNK
	DCA I	TEMP7		/SET DEVOAD
	TAD I	TEMP7
	DCA I	TEMP8		/SET DEVOLC
	ISZ I	TEMPA		/INCREMENT CHUNK COUNT
	  NOP			/MAY SKIP
RCVTT2,	NL1
	TAD I	TEMP8		/GET DEVOLC
	AND	[CNKSIZ-1
	SZA CLA			/WAS THAT LAST SLOT IN CHUNK ?
	  JMP	RCVTT3		/NO
	TAD I	TEMP8		/GET DEVOLC
	AND	[-CNKSIZ	/MAKE INTO LINK ADR
	DCA	TEMP2		/SAVE LINK ADR
	JMS	ERSGET		/GET ANOTHER CHUNK
	DCA I	TEMP2		/SET LINK IN PREVIOUS CHUNK
	TAD I	TEMP2
	DCA I	TEMP8		/SET DEVOLC
	ISZ I	TEMPA		/INCREMENT COUNT OF CHUNKS
	  NOP			/MAY SKIP
RCVTT3,	TAD I	TEMP8		/GET DEVOLC
	DCA	TEMP2
	NLOAD	3777		/MASK FOR LAST CHARACTER BIT
	AND I	TEMP2		/STRIP LAST-CHAR BIT
	DCA I	TEMP2		/AND RESTORE TO CHUNK
	ISZ	TEMP2		/ADVANCE TO NEXT SLOT
	NLOAD	4000		/MAKE LAST-CHAR BIT
	TAD	TEMP1		/ADD CHARACTER
	DCA I	TEMP2		/AND PUT INTO CHUNK
	ISZ I	TEMP8		/ADVANCE DEVOLC
	ION
	ISZ	TEMP4		/COUNT CHAR OUT OF THE MESSAGE
	  JMP	RCVTT1		/KEEP GETTING CHARACTERS
	JMS	TTYGO		/START TTY IF IT NEEDS TO BE
	JMP	RCVTT0		/LOOP BACK FOR MORE KRUD
	PAGE
/TYPE 2 = ECHO PIPELINE MARKER
RCVEPL,	TAD	(LDBEPL		/OFFSET FOR PIPELINE MARKER
	TAD	DDB
	DCA	TEMP1		/SAVE POINTER TO MARKER
	JMS	GTCHR		/GET THE MARKER FROM THE MESSAGE
	NEGATE			/SO WE CAN COMPARE
	TAD I	TEMP1		/ADD IN WHAT WE SAID LAST
	AND	[0177		/SEVEN BITS ONLY
	SZA CLA
	  JMP	RCVTT0		/NOT THE SAME SO NO SPECIAL ACTION
	TAD I	AUTO1		/GET DEVBF1
	SZA CLA			/ARE WE HOLDING ANY INPUT CHARS ?
	  JMP	RCVTT0		/YES SO CAN'T ENTER LOCAL ECHO MODE
	NLOAD	7776		/MASK FOR DEFERRED ECHO BIT
	IOF
	AND I	TEMP6		/GET DDCMP STATUS WORD
	DCA I	TEMP6		/RESTORE STATUS WORD
	JMP	RCTRQS		/AND SEND STATUS TO 10

/TYPE 4 = CHARACTER GOBBLER
RCVGOB,
RCGOB1,	TAD	DDB
	IOF			/DISABLE INTERRUPTS FOR A WHILE
	DCA	INTDDB		/SETUP FOR CALL TO IGTOCH
	JMS	IGTOCH		/GET ANY OUTPUT CHARS
	  JMP	RCVTT0		/LOOP BACK FOR MORE MSGS
	ION
	CLA
	JMP	RCGOB1

/TYPE 5 = SET BITS
RCVSBT,	JMS	RCTBIT		/SET UP STUFF
	TAD	TEMP1		/ADD BITS
	DCA I	TEMP6
	JMP	RCTRQS		/SEND COPY OF UPDATED STATUS TO 10

/TYPE 6 = CLEAR BITS
RCVCBT,	JMS	RCTBIT		/SET UP STUFF
	DCA I	TEMP6		/RESTORE STATUS WORD
	JMS	TTYGO		/IN CASE CLEARED OUTPUT STOPPED BY XOF BIT
/	JMP	RCTRQS		/AND SENDCOPY OF UPDATED STATUS TO 10

/TYPE 7 = REQUEST STATUS
RCTRQS,	IOF			/DISABLE INTERRUPTS FOR A WHILE
	NLOAD	7776		/MASK FOR NEED TO SEND STATUS BIT
	AND I	DDBSTS		/CLEAR BIT FROM STATUS WORD
	IAC			/ADD BIT TO WORD
	DCA I	DDBSTS
	JMP	RCVTT0		/THEN ON TO NEXT SUBMESSAGE

/TYPE 10 = CHARACTERISTICS
RCVCHR,	TAD	(LDBFIL-1	/RELATIVE ADR OF FILLER BLOCK
	TAD	DDB
	DCA	AUTO1
	TAD	(-6		/NUMBER OF FILLERS
	DCA	TEMP4
RCVCH2,	JMS	GETEXN		/GET NEXT FILLER
	SNA			/SKIP IF NOT ZERO
	  JMP	RCVCH3		/GO RIGHT TO NEGATE
	TAD	(37		/ROUND OFF AND ADD 16
	CLL RTR			/DIVIDE BY 4
	CLL RTR			/MAKES DIVIDE BY 16
	AND	[0377		/EIGHT BITS ONLY
RCVCH3,
	NEGATE
	DCA I	AUTO1		/SET NEXT FILLER
	ISZ	TEMP4
	  JMP	RCVCH2		/ON TO THE NEXT FILLER
	TAD	(LDBWID
	TAD	DDB
	DCA	TEMP4
	JMS	GETEXN		/GET RECEIV SPEED
	JMS	GETEXN		/GET TRANSMIT SPEED
	JMS	GETEXN		/GET TTY WIDTH
	DCA I	TEMP4		/SAVE TTY WIDTH
	JMS	GETEXN		/GET COLUMN WHERE BLANKS TURN TO CRLF
	JMS	GETEXN		/GET 2741 TYPING ELEMENT
	JMS	GETEXN		/GET 2741 BITS
	JMP	RCVTT0		/ON TO NEXT SUBMESSAGE
RCVNRM,	0			/HERE BECAUSE RAN OUT OF ROOM FOR A MESSAGE
NRMNAK,	ISZ	RCVNRM		/COUNT TIMES WE NAKED BECAUSE OF NO ROOM
	  NOP
	TAD	(10
	DCA	NAKFLG		/REASON FOR NAK
	JMP	RCVFLU

RCVBCR,	0			/COUNT OF BLOCKS RECEIVED WITH A BAD CRC
/HERE TO NAK A MSG(NUMBERED OR UNNUMBERED BECAUSE OF BAD CRC)
BADCRC,	NL1
	DCA	NAKFLG		/SEND A NAK TO 10
	ISZ	RCVBCR
	SKP			/COUNT BAD CRC'S RECEIVED
	JMS	MYPTCH		/EVERY 4096 BAD CRC'S
	TAD I	RCVTKR
	TAD	(-SOH		/CHECK FOR NUMBERED MESSAGE TYPE
	SNA CLA			/SKIP IF NOT NUMBERED
RCVFLU,	TAD I	TEMP5
	JMS	FRECKS		/IF NUMBERED FREE CHUNKS
	JMP	RCVADV

/HERE WHEN SUBMESSAGE IS CONTROL
RCVTT5,	TAD	DDB		/DEVICE BLOCK ADR
	TAD	[DEVBF1-1	/MAKE AUTO-INCREMENT POINTER TO BUFFERS
	DCA	AUTO1
	JMS	GTCHR		/GET STATUS TYPE
	TAD	(-6		/HIGHEST LEGAL MESSAGE
	SMA			/SKIP IF MESSAGE TYPE IN RANGE
	  JMP	RCVKRD		/COMPLAIN
	TAD	(JMP I TTYDSP+6
	DCA	.+1
	7402
TTYDSP,	RCVEPL
	RCVGOB
	RCVCHR
	RCVADL
	RCVXOF

RCVTTC,	TAD	(-2		/SEE IF STATUS
	SZA CLA			/SKIP IF YES
	  JMP	RCVTT5		/MUST BE CONTROL
	JMS	GTCHR		/STC
	TAD	(JMP I	TTSDSP
	DCA	.+1
	7402
TTSDSP,	RCVKRD			/TYPE 0=UNKNOWN
	RCVSBT			/TYPE 1=SET BITS
	RCVCBT			/TYPE 2=CLEAR BITS
	PAGE
/HERE WHEN DONE WITH A MESSAGE(NUMBERED OR UNNUMBERED)
RCVADV,	NL0
	IOF
	TAD	(CTLSIZ
	TAD	RCVTKR		/ADVANCE TO NEXT SLOT
	TAD	(-RCVLIM
	SNA			/CHECK FOR OUT OF RANGE
	TAD	(RCVQUE-RCVLIM
	TAD	(RCVLIM		/ADJUST
	DCA	RCVTKR		/SAVE NEW SLOT ADR
	JMP	LOOP		/REENTER HUGE LOOP

/SUBROUTINE TO PUT OUT BEGINNING OF NCS MESSAGE
/ NOTE -- LEAVES ADR IN TEMB
NCSBEG,	0
	JMS	NCSBG		/BEGINNING
	JMS	SNDCHR		/ZERO DLA
	JMP I	NCSBEG		/RETURN
NCSBG,	0			/BEGINNING OF NCS MESSAGE
/ AC HAS NCT SUPPLIED BY CALLER
	JMS	SNDCHR		/PUT INTO MESSAGE
	TAD I	DDB		/GET 1ST WORD OF DDB
	AND	(0077		/CLEAR LEFT HALF
	DCA	TEMPB		/SAVE LINK NUMBER (OURS)
	TAD	TEMPB		/GET IT BACK
	TAD	(SNATAB-1	/GET DESTINATION NODE ADDRESS
	DCA	TEMPA		/SAVE ADDRESS
	TAD I	TEMPA		/GET DNA
	JMS	SNDCHR		/PUT INTO MESSAGE
	Z=OURNNM&177		/OUR NODE NUMBER
	TAD	(Z
	JMS	SNDCHR		/SNA
	JMS	SNDCHR		/NCA
	JMS	SNDCHR		/NCN
	JMP I	NCSBG		/RETURN

NCSDLA,	0			/SEND DLA
	TAD	TEMPB		/INDEX INTO TABLE
	TAD	(SLATAB-1	/GET LINK ADDRESS
	DCA	TEMPA
	TAD I	TEMPA		/DLA
	JMS	SNDEXN
	JMP I	NCSDLA		/RETURN
/HERE WHEN SYNCHRONOUS TRANSMITTER IS IDLE TO TRY TO START IT
/ FIRST SEE IF WE NEED TO SEND A START OR STACK MESSAGE
/ THEN SEE IF WE NEED TO SEND A NAK MESSAGE
/ THEN SEE IF WE HAVE A NUMBERED MESSAGE TO SEND
/ THEN SEE IF WE NEED TO SEND AN ACK
/ THEN SEE IF WE SHOULD SEND A REP

XSTART,	JMS	XSTRT0		/SET UP TO SEND A CTL MESSAGE
	TAD	(SYNBUF-1	/POINT TO ONE BEFORE SYN'S
	DCA	T10NCA		/ADR OF MESSAGE
	TAD	(-10-NUMSYN	/NEGATIVE OF NUMBER OF SYN'S
	DCA	T10NWC		/NEXT WC
	TAD	STACKF		/GET STACK FLAG (-1 FOR STACK, -2 FOR START)
	SPA CLA
	  JMP	SNDSTK		/NEED TO SEND START OR STACK
	TAD	NAKFLG
	SZA CLA
	JMP	SNDNAK		/CHECK FOR NEED NAK
	TAD	T10TKR
	NEGATE
	TAD	T10PTR		/CHECK FOR RETRANSMISSIONS
	SZA CLA			/DO WE HAVE A MESSAGE TO RETRANSMIT
	  JMP	SNDMSG		/IF HAVE A MESSAGE SEND IT
	TAD	T10PTR
	TAD	(-T10LST	/SEE IF TIME TO WRAP AROUND
	SNA
	  TAD	(T10BF1-T10LST-T10LEN
	TAD	(T10LEN+T10LST
	NEGATE
	TAD	T10AKR		/COMPARE TO LAST ACKED
	SNA CLA			/HAVE SENT ALL WE CAN ?
	  JMP	XSTRT9
	TAD	DISREA		/SEE IF WE NEED TO SEND DISCONNECT
	SZA CLA			/ZERO MEANS NO
	  JMP	XDISCN		/SEND IT
	TAD	CONSNA		/SEE IF NEED TO SEND CONFIG
	SZA CLA			/SKIP IF NO,
	  JMP	XSCONF		/YES, SEND IT
	JMS	DISCHK		/SEE IF NEED TO SEND DISCONNECT
	TAD	(FIRDDB		/GET ADR OF FIRST DDB
XSTRT1,	DCA	DDB		/SAVE ADR OF DEVICE BLOCK
	NLOAD	DEVSTS
	TAD	DDB
	DCA	DDBSTS		/SAVE ADR OF STATUS WORD
	TAD	(3000		/MASK FOR CONNECT & ACCEPT BIT
	AND I	DDBSTS
	SNA			/CHECK TO SEE IF 10 KNOWS ABOUT DEVICE
	  JMP	XSTRT8		/LEAVE THIS ORPHAN ALONE
	AND	(1000		/DO WE NEED AN ACCEPT ?
	IOF
	SNA CLA			/SKIP IF WE HAVE TO SEND CONNECT CONFIRM OR DISCONNECT
	  JMP	XSTRT2		/NO, TRY SOMETHING ELSE
	NL2000
	AND I	DDBSTS
	SNA CLA
	  JMP	XSDIS0
	TAD I	DDBSTS		/GET STATUS
	AND	(6777		/TURN OFF NEED-TO-ACCEPT BIT
	DCA I	DDBSTS		/UPDATE STATUS
	JMS	XSTMSG		/SET UP TO SEND A MESSAGE
	JMS	FEAPNT		/POINT TO FEATURES
	TAD	(10		/NCT
	JMS	NCSBEG		/PUT OUT BEGINNING
	JMP	XS1CON		/CONTINUE OVER PAGE
	PAGE
XS1CON,				/CONTINUATION OF PREVIOUS PAGE
	TAD	(12		/LENGTH OF CONNECT (EXCLUSIVE OF FEATURES)
/NOTE: ASSUMES EXTENSIBLE FIELDS ALWAYS SENT AS TWO BYTES
	TAD I	TEMP2		/ADD FEATURE LENGTH
	JMS	SNDEXN		/SEND COUNT (EXTENSIBLE NUMBER)
	NL1			/CONNECT=1
	JMS	SNDCHR		/TYPE
	JMS	NCSDLA		/SEND DLA
	TAD	TEMPB		/OUR LINK VALUE
	JMS	SNDCHR		/SLA
	JMS	SNDCHR		/DEST OBJ TYPE
	JMS	SNDCHR		/DEST PID
	JMS	SNDOBJ		/SEND OBJECT TYPE
	NLM1			/GET ADDRESS OF DEVICE NUMBER
	TAD	DDB		/WHICH IS ONE BEFORE START OF DDB
	DCA	TEMP1		/STORE ADDRESS
	TAD I	TEMP1		/GET DEVICE NUMBER
	JMS	SNDCHR		/PID
	TAD	TEMPB		/GET OUR INDEX
	TAD	(MMLTAB-1	/INTO MMLTAB
	JMS	SNDEXN		/SEND AS TWO BYTE FIELD
	TAD	TEMP2
	DCA	TEMP3
	TAD I	TEMP2		/GET COUNT
	NEGATE
	DCA	TEMP2
	ISZ	TEMP3
	TAD I	TEMP3		/GET NEXT CHAR
	JMS	SNDCHR
	ISZ	TEMP2
	  JMP	.-4
	JMP	FINMSG		/FINISH SETTING UP MESSAGE

XSTRT2,	TAD I	DDBSTS
	AND	(OUTBIT+TTYBIT	/MASK FOR OUTPUT DEVICES
	SNA			/SKIP IF EITHER OUTPUT OR TTY
	  JMP	XSTRT3		/NEITHER, SEE IF MESSAGE TO BE SENT
	AND	(TTYBIT		/SEE IF TTY
	SZA CLA			/SKIP IF NOT (I.E. OUTPUT)
	  JMP	XSTRT4		/DEVICE IS A TTY SO DO TTY STUFF
	JMS	XDRQ		/SEND DATA REQUEST IF NECESSARY
	JMP	XSTRT7		/WON'T RETURN IF DATA REQUEST SENT

XDRQ,	0
	NLOAD	DEVCHK		/POINT TO CHUNK COUNT
	TAD	DDB
	DCA	TEMP3
	TAD I	TEMP3		/GET CHUNK COUNT
	SMA CLA			/ONLY SEND DATA REQUEST IF MINUS
	  JMP I	XDRQ		/RETURN
	NLOAD	DEVDRQ		/ADDRESS OF DATA REQUEST COUNT WITHIN  DDB
	TAD	DDB		/DDB ADDRESS
	DCA	TEMP3		/STORE
	NLM2			/MAXIMUM DATA REQUESTS OUTSTANDING
	TAD I	TEMP3		/GET DATA REQUEST COUNT
	SMA CLA			/SKIP IF WE DON'T HAVE ENOUGH OUTSTANDING
	  JMP I	XDRQ		/RETURN
	ISZ I	TEMP3		/INCREMENT REQUEST COUNT
	JMS	XSTMSG
	TAD	(50		/INTERRUPT NCT
	JMS	NCSBEG		/BEGINNING OF MESSAGE
	NL4			/COUNT ASSUMES DLA IS 2 BYTE FIELD
	JMS	SNDCHR		/COUNT
	NL6			/DATA REQUEST
	JMS	SNDCHR		/TYPE
	JMS	NCSDLA		/DLA
	NL1			/REQUEST
	JMS	SNDCHR		/DRQ
	JMP	FINMSG

/HERE TO SEND A MESSAGE TO DECSYSTEM-10 ON BEHALF OF CDR OR PTR
XSTRT3,	TAD	(DEVBF1
	TAD	DDB
	DCA	TEMP4
	TAD I	TEMP4
	SNA
	  JMP	XSTRT7		/NO DATA TO SEND TO THE 10
	DCA	TEMP3		/SAVE POINTER TO BEGINING OF STRING
	JMS	XSTMSG		/SET UP TO SEND A MESSAGE
	TAD	(10		/NCT
	JMS	NCSBG		/BEGINNING MINUS DLA
	JMS	NCSDLA		/DLA
	SKP
	JMS	SNDCHR		/PUT INTO MESSAGE
	JMS	GETCHR		/GET THE NEXT CHARACTER
	  SKP
	JMP	.-3
	TAD I	TEMP4		/GET CHUNK STRING ADR AGAIN
	JMS	FRECKS
	DCA I	TEMP4
	JMP	FINMSG		/FINISH OFF MESSAGE

XSTRT0,	0
	TAD	(CTLBUF		/POINT TO START OF CONTROL MESSAGE
	DCA	AUTO1		/ASSUME WILL BE UNNUMBERED
CRCXI3,	DCA	CRC1		/CLEAR CRC		########
	DCA	CRC2
	TAD	[ENQ		/FIRST CHAR INTO CRC
	JMS	CRCALC		/CALCULATE CRC
	JMP I	XSTRT0

XDISBG,	0			/SUBR TO BEGIN DISCON OR CONF
	JMS	XSTMSG		/START OF DISCONNECT
	TAD	(10		/MAKE NCT
	JMS	SNDCHR		/NCT
	TAD	DISSNA
	JMS	SNDCHR		/DNA
	Z=OURNNM&177
	TAD	(Z
	JMS	SNDCHR		/SNA
	JMS	SNDCHR		/NCA
	JMS	SNDCHR		/NCN
	JMS	SNDCHR		/DLA
	JMP I	XDISBG		/RETURN
	PAGE
XSTRT4,	JMS	XSTMSG
	TAD	(50
	JMS	NCSBG
	JMS	NCSDLA
	TAD	[DEVDDC
	TAD	DDB
	DCA	TEMP7
	TAD	(DEVBF1		/ADR OF BUFFER
	TAD	DDB
	DCA	TEMP6
	JMS	RECI42		/PUT STATUS INTO MESSAGE
	TAD	DDB
	DCA	TEMP4		/SAVE ADR OF DDCMP ADR

/HERE TO THINK ABOUT SENDING CHARACTERS TO THE 10
XSTTRD,	TAD I	TEMP6		/GET DATA ADR(IF ANY)
	SNA			/IS THERE ANY ?
	  JMP	XSTTDN
	DCA	TEMP3		/SAVE ADR OF 1ST CHUNK
	JMS	GTCHR		/GET THE CHARACTER COUNT
	TAD	TEMP5
	TAD	(-MAXOLN+20
	SMA CLA			/ROOM ENOUGH FOR THIS DATA ?
	  JMP	XSTTDN		/NOT NOW SEND WITH THE NEXT MESSAGE
	TAD I	TEMP3		/GET THE CHARACTER COUNT AGAIN
	JMS	SNDCHR		/PUT THE CHAR INTO THE MESSAGE
	JMS	GETCHR		/GET THE NEXT CHARACTER, IF ANY
	  SKP
	JMP	.-3
	TAD I	TEMP6		/GET FIRST CHUNK ADR AGAIN
	JMS	FRECKS		/AND RELEASE THE CHUNKS
	DCA I	TEMP6		/CLEAR DEVBF1
	ISZ	TEMP6		/ADVANCE TO DEVBF2
	DCA I	TEMP6		/CLEAR DEVBF2

/HERE TO SEND AN ECHO-PIPELINE-MARKER(MAYBE)
	NL1			/MASK FOR DEFERRED ECHO MODE
	AND I	TEMP7		/SEE IF WE ARE IN THAT WAY
	SNA CLA			/SKIP IF TRUE
	  JMP	XSTTDN
	NL3			/COUNT
	JMS	SNDCHR
	NL4			/TYPE
	JMS	SNDCHR
	JMS	SNDCHR	
	TAD	(LDBEPL		/OFFSET FOR PIPELINE MARKER
	TAD	DDB
	DCA	TEMP1		/SAVE POINTER TO MARKER
	ISZ I	TEMP1		/ADVANCE MARKER
	  TAD I	TEMP1		/GET IT IF NOT ZERO
	AND	[0177		/7 BITS ONLY PLEASE
	JMS	SNDCHR		/PUT MARKER INTO THE MESSAGE
/HERE WHEN DONE WITH A LINE
XSTTDN,	ION
	TAD	TEMP5		/GET CURRENT MESSAGE SIZE
	TAD	(-MAXOLN+20	/COMPARE TO MAX
	SMA CLA
	  JMP	FINMSG		/SEND MESSAGE AS IS
	TAD	(-7
	TAD	TEMP5		/GET MESSAGE SIZE
	SZA CLA			/TEST FOR REAL MESSAGE
	  JMP	FINMSG		/REAL SO SEND MESSAGE
	JMS	XDRQ
	JMP	XSTRT8		/NOT REAL SO DON'T SEND IT
XSDIS0,	JMS	XSTMSG
	TAD	(50
	JMS	NCSBEG
	TAD	[5
	JMS	SNDCHR		/COUNT
	NL2
	JMS	SNDCHR		/TYPE=DISCONNECT
	JMS	NCSDLA		/DLA
	TAD	TEMPB
	JMS	SNDCHR		/SLA
	JMS	SNDCHR		/REASON=0
	TAD	TEMPB		/INDEX
	TAD	(RCVDSP
	DCA	TEMPB
	TAD	(RCVKRD
	DCA I	TEMPB
	TAD	(6777		/ALL EXCEPT ACCEPT BIT
	AND I	DDBSTS		/GET REST OF STATUS BITS
	DCA I	DDBSTS		/STORE THEM BACK
	JMP	FINMSG
RCVRQC,	TAD	CONSNA		/SEE IF WE'VE GOT ONE PENDING
	SZA CLA			/SKIP IF NOT
	  JMP	RCVFLU		/WE ALREADY HAVE ONE REQUEST PENDING,
				/SO IGNOR THIS ONE AND LET THE REQUESTING
				/NODE SEND ANOTHER MESSAGE LATER...
	TAD	RSNA		/GET SNA
	DCA	CONSNA		/INDICATE WE NEED TO SEND CONF
	JMP	RCVFLU
XSCONF,	TAD	CONSNA		/HERE TO SEND CONF: GET SNA
	DCA	DISSNA		/STORE FOR SUBROUTINE
	DCA	CONSNA		/CLEAR CONSNA
	JMS	XDISBG		/DO START OF MESSAGE
	TAD	(CNF		/POINT TO DATA PART OF MESSAGE
	DCA	TEMPC		/SAVE ADDRESS
	TAD I	TEMPC		/GET COUNT
	IAC			/INCLUDE ITSELF
	NEGATE			/FOR ISZ
	DCA	TEMPB		/LOOP CONTROL
XSCNF1,	TAD I	TEMPC		/GET NEXT CHARACTER
	ISZ	TEMPC		/POINT TO NEXT ONE
	JMS	SNDCHR		/PUT INTO MESSAGE
	ISZ	TEMPB		/CHECK IF DONE
	  JMP	XSCNF1		/NO, CONTINUE
	JMP	FINMSG		/END IT
	PAGE
XDISCN,	JMS	XDISBG		/SEND BEGINNING OF MSG
	TAD	[5		/COUNT
	JMS	SNDCHR		/COUNT
	NL2
	JMS	SNDCHR		/TYPE=DISCONNECT
	TAD	DISSLA		/GET LINK WHO REQUESTED CONNECT
	JMS	SNDEXN		/DLA
	JMS	SNDCHR		/SLA=0
	TAD	DISREA		/PICK UP REASON
	JMS	SNDCHR		/RSN
	DCA	DISREA		/CLEAR REASON
	JMP	FINMSG		/FINISH MESSAGE
/HERE TO SEE IF WE NEED TO SEND A STATUS MESSAGE TO THE 10
XSTRT7,	NL1			/MASK FOR NEED TO SEND STATUS BIT
	AND I	DDBSTS
	SZA CLA			/SKIP IF WE DON'T NEED TO SEND STATUS
	  JMP	SNDSTS		/SEND STATUS TO THE 10

XSTRT8,	ION
	TAD	(DEVLNK
	TAD	DDB
	DCA	DDB
	TAD I	DDB		/GET ADR OF NEXT DDT
	SZA			/SEE IF THERE IS ONE
	  JMP	XSTRT1		/CHECK IT FOR POSSIBLE SERVICE

XSTRT9,	JMS	XSTRT0
	TAD	RECVOK
	SPA CLA
	  JMP	SNDACK		/CHECK FOR NEED ACK

/HERE TO SEND A REP MESSAGE
SNDREP,	JMS	CKREPT		/CHECK REP TIMER
	NLOAD	REP
	JMS	SNDCHR		/2ND CHAR IS REP
SNDRP3,	JMS	SNDFIL
	JMS	SNDFIL		/3RD & 4TH ARE FILLS
SNDRP5,	TAD	T10HSN
	JMS	SNDCHR		/5TH CHAR IS HIGHEST MSG # SENT
	JMP	SNDAK6		/REST IS LIKE AN ACK MSG

/HERE TO SEE IF REP TIMER HAS GONE OFF
CKREPT,	0
	TAD	REPTCK
	SPA CLA
	JMP	LOOP30		/IF STILL COUNTING DON'T SEND
	TAD	(-REPTIM
	DCA	REPTCK		/RESET TIMER
	JMP I	CKREPT


SNDSTS,	NL7776			/MASK TO CLEAR NEED TO SEND STATUS BIT
	AND I	DDBSTS		/CLEAR BIT FROM WORD
	DCA I	DDBSTS		/SAVE UPDATED WORD
	JMS	XSTMSG		/BEGIN BUILDING MESSAGE
	TAD	(50		/NCT FOR STATUS MESSAGE
	JMS	NCSBG		/BEGINNING OF DEVICE CONTROL MSG
	JMS	NCSDLA		/DLA
	NL4			/COUNT
	JMS	SNDCHR
	NL3			/TYPE
	JMS	SNDCHR
	JMS	SNDCHR
	TAD	[DEVDDC
	TAD	DDB
	DCA	TEMP3
	TAD I	TEMP3
	AND	[0177		/STRIP EXTRA BITS
	TAD	[0200		/ADD EXTENSIBLE BIT
	JMS	SNDCHR
	TAD I	TEMP3		/GET HIGH ORDER BITS OF STATUS WORD
IFZERO	PDP8I	<
	CLL RTR			/CAN'T USE RTL
	CLL RTR			/BECAUSE INTERRUPT
	CLL RTR			/ZAPS LINK
>
IFZERO	PDP8E	<
	BSW
>
	CLL RAR
	AND	(0037		/CLEAR EXTRA BITS
	JMS	SNDCHR
	JMP	FINMSG		/SEND MESSAGE
/TEMP CONVENTIONS WHEN BUILDING MESSAGES
/ TEMP5 IS COUNT OF DATA PORTION
XSTMSG,	0
	ION
CRCXI4,	DCA	CRC1		/CLEAR 1ST HALF OF CRC		########
	DCA	CRC2		/CLEAR 2ND HALF OF CRC
	TAD	T10PTR		/POINTER TO NEW MESSAGE
	TAD	[7		/MAKES POINTER TO DATA
	DCA	AUTO1
	DCA	TEMP5
	JMP I	XSTMSG
FINMSG,				/END UP MESSAGE
	TAD	CRC2		/GET LOW PART OF CRC
	DCA I	AUTO1
	TAD	CRC1		/GET HIGH PART OF CRC
	DCA I	AUTO1
	TAD	T10PTR
	DCA	AUTO1
	TAD	TEMP5		/GET SIZE OF MESSAGE
	DCA I	AUTO1		/PUT INTO HEADER
	TAD	TEMP5		/GET MESSAGE SIZE AGAIN
	CLL RTR
	CLL RTR
	CLL RTR
	CLL RTR
	AND	(0017		/ONLY 4 BITS ARE REAL
	DCA I	AUTO1		/PUT REST OF COUNT IN
	ISZ	AUTO1		/SKIP RESPONSE FIELD
	TAD	T10HSN		/GET HIGHEST MESSAGE NUMBER SENT SO FAR
	JMS	COUNT
	DCA	T10HSN
	TAD	T10HSN
	DCA I	AUTO1		/PUT MESSAGE NUMBER INTO HEADER
	T10ADJ	T10PTR
	JMP	LOOP		/BACK TO BIG LOOP AND THEN SEND MESSAGE

	PAGE
/HERE TO SEND A STACK MESSAGE
SNDSTK,	TAD	STACKF		/GET START-STACK FLAG
	IAC
	SPA CLA			/SKIP TO SEND A STACK
	  JMP	SNDSRT		/NEED TO SEND A START
	DCA	STACKF		/DONE WHEN HAVE RESPONDED
	TAD	(STACK
	JMS	SNDCHR		/2ND CHAR IS STACK
	JMS	SNDFIL		/3RD CHAR IS A FILL
	JMS	SNDCHR		/4TH CHAR IS A FILL
SNDSK5,
	JMS	SNDCHR		/5TH CHAR IS A FILL
	JMP	SNDAK6		/6TH IS DEST STA ADR


/HERE TO SEND A START MESSAGE
SNDSRT,	JMS	CKREPT		/CHECK REP TIMMER
	TAD	(STRT
	JMS	SNDCHR		/2ND WORD IS START
	JMS	SNDFIL
	JMS	SNDFIL		/3RD & 4TH ARE FILLS
	JMP	SNDSK5		/REST IS LIKE A STACK

/HERE TO SEND A NAK MESSAGE
SNDNAK,	NLOAD	NAK
	JMS	SNDCHR		/2ND CHAR IS A NAK
	TAD	NAKFLG
	JMS	SNDCHR		/3RD IS REASON
	DCA	NAKFLG		/CLEAR NAK FLAG
	JMP	SNDAK4		/REST IS LIKE AN ACK MSG

/HERE TO SEND AN ACK MESSAGE
SNDACK,	NL3777
	AND	RECVOK
	DCA	RECVOK		/CLEAR NEED ACK FLAG
	NLOAD	ACK
	JMS	SNDCHR		/2ND CHAR IS ACK
	JMS	SNDFIL		/3RD IS FILL
SNDAK4,	TAD	RECVOK
	JMS	SNDCHR		/4TH IS LAST GOOD MSG #
	JMS	SNDFIL		/5TH CHAR IS FILL
/HERE TO PUT DESTINATION STATION ADR AND CRC ON MESSAGE
SNDAK6,	NL1
	JMS	SNDCHR		/6TH CHAR IS ALWAYS 1
	TAD	CRC2		/GET LOW PART OF CRC
	DCA I	AUTO1		/PUT HALF OF CRC IN MSG
	TAD	CRC1		/GET HIGH PART OF CRC
	DCA I	AUTO1		/ DITTO
IFNZRO	DP8ETR	<
	JMS	OTR		/TRACE MESSAGE
>/END OF IFNZRO	DP8ETR
	NLM2
	DCA	T10FLG
	JMP	LOOP		/FLAG FOR XMITTER

/HERE TO PUT A FILL CHARACTER INTO A MESSAGE
SNDFIL,

/HERE TO PUT A CHAR INTO A MESSAGE
SNDCHR,	0
	AND	[0377		/STRIP EXTRA BITS IF ANY
	DCA	TEMP1		/SAVE COPY OF CHAR
	TAD	TEMP1		/GET CHAR AGAIN
	DCA I	AUTO1		/PUT CHARACTER INTO MESSAGE

	TAD	TEMP1		/GET CHARACTER AGAIN
	JMS	CRCALC		/PUT INTO CRC CALCULATION
	ISZ	TEMP5		/COUNT CHAR
	JMP I	SNDCHR
	JMP I	SNDCHR

/HERE TO SKIP AN EXTENSIBLE FIELD
/ CALL	JMS	SKPEXN	WITH TEMP3 POINTING TO THE STRING OF CHUNKS
SKPEXN,	0
	JMS	GTCHR
	AND	(0200		/CHECK EXTENSIBLE BIT
	SZA			/SKIP IF DONE
	  JMP	SKPEXN+1	/OTHERWISE CONTINUE
	JMP I	SKPEXN		/RETURN
SNDEXN,	0			/SEND EXTENSIBLE NUMBER
/ NOTE: ALWAYS SENDS TWO BYTE EXTENSIBLE NUMBER, SINCE
/ OTHERWISE TOO HARD TO CALCULATE COUNTS.
	DCA	TEMPD		/SAVE IT
	TAD	TEMPD		/GET IT AGAIN
	AND	[177		/TURN OFF ALL BUT BOTTOM SEVEN
	TAD	(200		/TURN ON EXTENSIBLE BIT
	JMS	SNDCHR		/SEND LOW BITS
	TAD	TEMPD		/GET CHARACTER
	AND	(7600		/TURN OFF BOTTOM 7 BITS
IFZERO	PDP8I	<
	CLL RTR			/CAN'T USE RTL THRU LINK
	CLL RTR
	CLL RTR
>
IFZERO	PDP8E	<
	BSW
>
	CLL RAR
	JMS	SNDCHR		/SEND HIGH BITS
	JMP I	SNDEXN		/RETURN
/HERE TO SEND A NUMBERED MESSAGE TO 10
SNDMSG,	NLM1
	TAD	T10TKR
	DCA	T10NCA		/ADR OF BUFFER
	TAD	T10TKR
	DCA	AUTO1
	TAD I	AUTO1		/GET LENGTH OF DATA
	TAD	(12
	NEGATE
	DCA	T10NWC		/SET WC FOR BLOCK
CRCXI5,	DCA	CRC1		/				########
	DCA	CRC2		/INITIALIZE THE CRC
	TAD	T10TKR
	DCA	AUTO1		/POINTER TO HEADER
	TAD	(SOH
	JMS	CRCALC		/FIRST CHAR IS ALWAYS SOH
	TAD I	AUTO1
	JMS	CRCALC		/2ND IS HALF OF LENGTH
	TAD I	AUTO1
	JMS	CRCALC		/3RD IS HALF OF LENGTH
	TAD	RECVOK
	JMS	SNDCHR		/4TH IS LAST # RECEIVED
	TAD I	AUTO1		/5TH CHAR IS MESSAGE NUMBER
	JMS	CRCALC		/PUT INTO CRC
	T10ADJ	T10TKR
	JMP	SNDAK6		/REST IS LIKE AN ACK
SECOND,	DCA	SECFLG
	NL6000			/LIMIT # OF SPURIOUS INTERRUPTS
	DCA	INTCNT		/  PER SECOND
/	JMP	SECSYN		/GO DO ONCE A SECOND STUFF
SECSYN,	JMP	SECDP		/CHECK SYNCHRONOUS INTERFACE
/HERE TO INCREMENT A MSG NUMBER
/ CALL	JMS	COUNT		/WITH MSG # IN AC
/	RETURN		/WITH MSG#+1 IN AC
COUNT,	0
	IAC
	AND	[0377
	JMP I	COUNT
	PAGE

	LISTOG	FTDP01
IFNZRO FTDP01 <
/	***********************************************************
/	***********************************************************
/	***							***
/	***		DP01 MODEM HANDLING			***
/	***							***
/	***********************************************************
/	***********************************************************

/HERE TO SEE IF SYNCHROUS MODEM HAS INTERRUPTED
INTMOD,	DPSEF			/SKIP ON RECEIVE END FLAG
	  JMP	INTMD2
	DPSRI			/SKIP ON RING INDICATOR
	  JMP	INTMD5
	JMP	INTMO9		/NOT MODEM SO CHECK FOR MEMORY PARITY
INTMD2,	DPCEF			/CLEAR END FLAG
	TAD	(ENDMSG
	DCA	ERRFLG		/LEAVE MSG FOR OPERATOR
	JMP	INTDIS
INTMD5,	DPCRF
	DPSTR
	JMP	INTDIS


SECDP=IRMA			/NO ONCE/SEC STUFF FOR DP01
/	***********************************************************
/	***********************************************************
/	***							***
/	***		DP01 INPUT PROCESSING			***
/	***							***
/	***********************************************************
/	***********************************************************


/HERE AT INTERRUPT LEVEL TO SEE IF DP01 HAS INTERRUPTED
INTDPX,	DPSRF			/SKIP ON NOT DP01 RECEIVE FLAG
	  JMP	INRC00		/YES
	DPSTF			/SKIP ON NOT TRANSMIT FLAG
	  JMP	INTN00		/GO SERVICE TRANSMIT INTERRUPT
	JMP	INTDP9		/NOT DP01

/HERE AT INTERRUPT LEVEL TO HANDLE DP01
INRC00,	DPRRB			/GET CHARACTER FROM DP01
	DCA	INTMP1
	TAD	INTMP1		/GET CHAR
	ISZ	F10CA		/ADVANCE BUFFER ADR
	DCA I	F10CA		/SAVE CHAR IN BUFFER

IFNZRO FTDEBUG <
	TAD	(-SYN
	TAD	INTMP1
	SNA CLA
	  JMP	INRC04
	NL4000
	TAD	INTMP1		/GET CHARACTER RECEIVED
	JMS	TRACEW		/PUT WORD INTO THE TRACE
INRC04,
>/END OF IFNZRO FTDEBUG

	JMP I	INRCPV		/DISPATCH TO CORRECT ROUTINE

/HERE WHEN RECEIVE INPUT ON INACTIVE LINE
INRC10,	NLM1			/SET UP NEW CA IN CASE CHAR WAS UNINTERESTING
	TAD	RCVPTR
	DCA	F10CA
		/DON'T NEED TO DO ANYTHING ABOUT WC FOR DP01
	JMS	INRC50		/SEE IF CHAR WAS SPECIAL
INRC12,	  /DON'T RETURN IF NOT SPECIAL
	TAD	(-F10TCH
	TAD	INTMP3		/GET CHAR NUMBER WHICH WE FOUND
	TAD	(JMP I	INRC16
	DCA	.+1
	0
INRC16,	INTP00
	INTP10
	INTP20
	INTP30

/HERE WHEN RECEIVING AN UNNUMBERED MESSAGE
INRC20,	ISZ	F10WC
	  JMP	INTDIS
	JMP I	.+1
	INTP40

/INRC40=INTDIS		/NOT NECCESSARY TO ENABLE INPUT

/HERE TO SEE IF LAST CHAR RECEIVED WAS SPECIAL
/CALL	JMS	INRC50
/	RETURN IF CHAR WAS SPECIAL(ELSE JMP INTDIS)
INRC50,	0
	TAD	INTMP1		/GET THIS CHAR
	TAD	(-SYN
	SNA CLA
	  JMP	INTDIS		/IGNORE SYNCHS
	TAD	INTMP1		/GET RECEIVED CHAR
	NEGATE			/FOR TEST FOR SPECIAL CHARS
	DCA	INTMP2
	TAD	[F10TCH
	DCA	INTMP3
	TAD	(-4
	DCA	INTMP4
	CDFINS			/TABLE IS IN FIRST FIELD
INRC53,	TAD I	INTMP3
	TAD	INTMP2
	SNA CLA			/HAVE WE FOUND A MATCH ?
	  JMP	INRC54		/YES SO RETURN TO CALLER
	ISZ	INTMP3		/ADVANCE TO NEXT CHAR
	ISZ	INTMP4		/HAVE WE CHECKED ENOUGH ?
	  JMP	INRC53		/NO
	TAD	INRC50
	TAD	(-INRC12
	SNA CLA			/ARE WE RECEIVING MSG ?
	  DPCRA			/CLEAR RECEIVER ACTIVE
	CDFCNK			/SET NORMAL DATA FIELD
	JMP	INTDIS		/DISMISS INTERRUPT
INRC54,	CDFCNK
	JMP I	INRC50

/HERE WHEN RECEIVING DATA FROM A NUMBERED MESSAGE
INRC70,
	ISZ	F10WC
	  JMP	INRC75		/ENOUGH ROOM GO SEE IF CHAR IS SPECIAL
	NL4000			/FLAG LAST CHAR IN BUFFER
	TAD	INTMP1		/GET CHAR
	DCA I	F10CA		/PUT CHAR+FLAG IN CHUNK
	TAD	F10CA		/LAST ADR IN CHUNK
	AND	[-CNKSIZ	/LEAVES 1ST ADR IN CHUNK
	DCA	INTMP2		/SAVE IT
	TAD	F10TWC
	SNA CLA
	  JMP	INTP60
INRC80,	JMS	IGTCNK
	  JMP	INTP60		/PRETEND F10TWC EXHAUSTED
	DCA I	INTMP2
	ISZ I	CNTPNT		/INCREASE CHUNK COUNT
	TAD I	INTMP2
	DCA	F10CA
	TAD	F10TWC
	TAD	(1-CNKSIZ
	SPA
	  JMP	INRC83
	DCA	F10TWC
	TAD	(1-CNKSIZ
	DCA	F10WC
INRC75,	
	JMP	INTDIS
INRC83,	NL0
	TAD	F10TWC
	NEGATE
	DCA	F10WC
	DCA	F10TWC
	JMP	INRC75

	PAGE
/	***********************************************************
/	***********************************************************
/	***							***
/	***		DP01 OUTPUT PROCESSING			***
/	***							***
/	***********************************************************
/	***********************************************************

/HERE AT INTERRUPT LEVEL TO HANDLE DP01 OUTPUT

/HERE WHEN LINE IS IDLING
INTN00,	ISZ	T10CA		/ADVANCE CURRENT ADDRESS
	TAD I	T10CA		/GET THE NEXT CHAR TO SEND
	DPTAC DPCTF		/SEND CHAR AND CLEAR TRANSMIT FLAG
	  NOP			/DPCTF SKIPS SOMETIMES

IFNZRO FTDEBUG <
	AND	[0377		/BE SURE 8BITS ONLY
	TAD	(-IDLE
	SNA
	  JMP	INTN01
	TAD	(IDLE
	JMS	TRACEW		/PUT WORD INTO THE TRACE
>/END OF IFNZRO FTDEBUG

INTN01,	NLM3
	DCA	T10CLK
	ISZ	T10WC		/COUNT THIS DATA
	  JMP	INTDIS		/DISMISS INTERRUPT

/HERE WHEN CURRENT TRANSMIT BUFFER IS EMPTY
	NL0
	TAD	T10FLG
	SNA
	  JMP	INTN99		/IDLING
	SMA CLA
	  JMP	INTN10		/WE ARE SYNCHING LINE
	ISZ	T10FLG		/DID WE JUST COMPLETE A MESSAGE ?
	  JMP	INTN20		/NO WE ARE JUST READY TO BEGIN
	NLM1			/WE JUST FINISHED A MESSAGE(DAT ACK ETC)
	DCA	WRKREQ		/WAKE NONINTERRUPT LEVEL CODE
	ISZ	T10FLG		/STATE IS NOW SYNCHING = 1
INTN10,	TAD	(SYNBUF-1	/4 SYNCHS
	DCA	T10CA
	TAD	[-NUMSYN
	DCA	T10WC
	JMP	INTDIS

/HERE TO BEGIN A MESSAGE
INTN20,	TAD	T10NCA		/ADR OF NEXT BUFFER TO SEND
	DCA	T10CA
	TAD	T10NWC		/LENGTH OF NEW BUFFER
	DCA	T10WC
	JMP	INTDIS

/HERE WHEN LINE IS IDLING
INTN99,	TAD	(IDLBUF-1
	DCA	T10CA
	TAD	[-NUMSYN
	DCA	T10WC
	JMP	INTDIS

>/END OF IFNZRO FTDP01
	LISTOG 0
IFZERO FTDP01 <
/	***********************************************************
/	***********************************************************
/	***							***
/	***		DP8E MODEM HANDLING			***
/	***							***
/	***********************************************************
/	***********************************************************

INTMOD,	DPSSRG			/SKIP IF RING FLAG SET
	  JMP	INTMD5
	ISZ	RNGCNT
	JMP	INTDIS
RNGCNT,	0
INTMD5,	DPSSBE			/SKIP ON BUS ERROR
	  JMP	INTMD7
	ISZ	BERCNT		/COUNT BUS ERROR
	  TAD	(DBEMSG-1	/IF WE GET 4096 BUS ERRORS THIS WILL
				/ BE SKIPPED (WHAT ME WORRY ?)

	JMP	INTMD8		/TYPE MESSAGE THEN JMP INTDIS
BERCNT,	0			/COUNT OF BUS ERROR COUNTS

INTMD7,	DPSSCA			/SKIP IF CARRIER FLAG FLIPPED
	  JMP	INTMO9		/NOT MODEM SO ON DOWN SKIP CHAIN
	DPSRS2
	SMA CLA			/SKIP ON CARRIER
	  TAD	(LCRMSG-CARMSG	/WE HAVE LOST CARRIER
	TAD	(CARMSG-1
INTMD8,	DCA	ERRFLG		/LEAVE MSG FOR OPERATOR
	JMP	INTDIS

/HERE ONCE PER SECOND TO CHECK MODEM
SECDP,	DPSRS1			/GET STATUS 1
	DCA	DPSTS1
	DPSRS2
	DCA	DPSTS2
	JMP	IRMA
DPSTS1,	0
DPSTS2,	0
/	***********************************************************
/	***********************************************************
/	***							***
/	***		DP8E INPUT PROCESSING			***
/	***							***
/	***********************************************************
/	***********************************************************

/HERE TO SEE IF RECEIVER HAS INTERRUPTED
INTDPX,	DPSSCD			/SKIP IF SPECIAL CHAR DETECTED
	  SKP			/NO
	JMP	INRC00		/WAS A SPECIAL CHARACTER
	DPSSRO			/SKIP ON RECEIVE WC OVERFLOW
	  JMP	INTDPO		/NOT RECEIVER SO TRY TRANSMITTER
	JMP I	INRCPV		/WC OVERFLOW ON RECEIVER

/WC OVERFLOW WHILE RECEIVER IS IDLE
INRC10,	DPSSCD			/WAS IT A SPECIAL CHAR ?
	  JMP	INRC11		/NO

/HERE FOR SPECIAL CHAR INTERRUPT
INRC00,	DPSRCD			/GET INDEX OF CHAR WHICH INTERRUPTED
	TAD	[F10TCH		/ADD ADR OF TABLE OF SPECIAL CHARS
	DCA	INTMP1		/TO ADDRESS THIS SPECIAL CHAR
	TAD	INRCPV
	TAD	[-INRC10
	SZA CLA			/ARE WE IN STATE A (IDLE)?
	  JMP	INTDIS		/NO SO IGNORE INTERRUPT
	DPSSRO
	  NOP
	CDFINS
	TAD I	INTMP1		/GET SPECIAL CHAR FROM TABLE
	CDFCNK
	NEGATE
	TAD I	RCVPTR		/GET SPECIAL CHAR AS RECEIVED
	SZA CLA			/ARE THEY THE SAME ?
	  JMP	INRC01		/THIS IS EITHER A HDW PROBLEM
				/ OR WE ARE TAKING TOO LONG TO SERVICE INTERRUPTS
	TAD	INTMP1		/GET F10TCH+INDEX
		ZZ=JMP I INRC02
		ZZ=ZZ-F10TCH
	TAD	(ZZ
	DCA	.+1
	7402			/MODIFIED BY PROGRAM
INRC02,	INTP00
	INTP10
	INTP20
	INTP30

INERRC,	0			/COUNT OF SP. CHAR ERRORS
INRC01,	ISZ	INERRC		/COUNT ERROR
	JMP	INTDIS		/DISMISS INTERRUPT
	HLT

/WC OVERFLOW ON UNNUMBERED MSG
INRC20,	DPSSCD			/CLEAR CHAR DETECTED FLAG
	  JMP	INTP40
	JMP	INTP40

/HERE WITH WC OVERFLOW WHILE IDLE
INRC11,	CDFINS
	TAD I	[F10CA
	CDFCNK
	DCA	INTMP1
	TAD I	INTMP1		/GET LAST CHAR
	TAD	[-SYN
	SZA CLA			/WAS RANDOM CHAR A SYNC ?
	  DPSCSD		/ NO - SO CLEAR SYNC DETECT
	JMS I	[INRCID		/RESET WC AND CA
/	JMP	INRC40		/SET RECEIVER RDY, THEN JMP INTDIS
/
/INRC40,	DPSSRO		/SKIP IF RECEIVE WC OVERFLOW
/	  NOP
/	DPSSCD			/SKIP ON SPECIAL CHAR
/				/ IN CASE GOT HERE FOR FUNNY REASON
/	  NOP
	DPSGRR			/ENABLE INPUT
	JMP	INTDIS

/WC OVERFLOW ON NUMBERED MSG DATA
INRC70,	CDFINS
	TAD I	[F10CA		/GET ADR OF LAST CHAR
	CDFCNK
	DCA	INTMP1
	NL4000
	TAD I	INTMP1
	DCA I	INTMP1
	TAD	INTMP1		/ADR OF LAST DATA IN CHUNK
	AND	[-CNKSIZ	/MAKES ADR OF LINK
	DCA	INTMP2
	TAD I	INTMP2
	SZA CLA
	  HLT
	TAD	F10TWC
	SNA CLA			/MIGHT THERE BE MORE IN MESSAGE ?
	  JMP	INTP60		/NO

INRC80,	IFNZRO FTDEBUG <
	TAD I	INTMP2		/GET LINK WORD IN LAST CHUNK
	SZA
	  HLT
>/END OF IFNZRO FTDEBUG
	JMS	IGTCNK		/TRY TO GET ANOTHER CHUNK
	  JMP	INTP60		/NO SO PRETEND WC EXHAUSTED
	DCA I	INTMP2		/SET LINK IN PREVIOUS CHUNK
	ISZ I	CNTPNT		/INCREMENT NUMBER OF CHUNKS
	TAD I	INTMP2
	CDFINS
	DCA I	[F10CA
	TAD	F10TWC
	TAD	[1-CNKSIZ
	SPA
	  JMP	INRC83
	DCA	F10TWC
	TAD	[1-CNKSIZ
	DCA I	[F10WC
	JMP	INRC84

INRC83,	NL0
	TAD	F10TWC
	NEGATE
	DCA I	[F10WC
	DCA	F10TWC
INRC84,	CDFCNK
	DPSGRR
	JMP	INTDIS
/	JMP	INRC40		/SET RECEIVE RDY, THEN JMP INTDIS

	PAGE
/	***********************************************************
/	***********************************************************
/	***							***
/	***		DP8E OUTPUT PROCESSING			***
/	***							***
/	***********************************************************
/	***********************************************************

/HERE AT INTERRUPT LEVEL TO HANDLE DP8E OUTPUT

INTDPO,	DPSSTO			/SKIP ON TRANSMIT WC OVERFLOW
	  JMP	INTDP9		/NOT DP8E SO TRY CARD READER

	TAD I	(IDLBUF		/IDLE BUFFER IS NEVER WRITTEN
	TAD	(-IDLE		/SO LETS BE SURE IT STILL IS
	SZA			/SKIP IF OK

	  HLT			/THIS IS VERY LIKELY A HARDWARE FAILURE
				/ PLEASE CHECK ECO IS INSTALLED !
				/ THE USUAL EXPLANATION FOR THIS FAILURE IS
				/ THE DP8E HAS ADDED TO THE TRANSMIT BUFFER THE
				/ LAST CHAR RECEIVED, USUALLY SYNC=226

/HERE WHEN CURRENT TRANSMIT BUFFER IS EMPTY
	TAD	T10FLG
	SNA
	  JMP	INTN97		/IDLING
	SMA CLA
	  JMP	INTN10		/WE ARE SYNCHING LINE
	ISZ	T10FLG		/DID WE JUST COMPLETE A MESSAGE ?
	  JMP	INTN20		/NO WE ARE JUST READY TO BEGIN
	ISZ	T10FLG		/STATE IS NOW SYNCHING
	NLM1			/WE JUST FINISHED A MESSAGE(DAT ACK ETC)
	DCA	WRKREQ		/WAKE NONINTERRUPT LEVEL CODE
INTN10,	TAD	[SYNBUF-1	/BUFFER OF SYNCHS
	JMP	INTN98		/SET UP CA, WC AND CLOCK FOR 1 CHAR

/HERE TO BEGIN A MESSAGE
INTN20,	TAD	T10NCA		/ADR OF NEXT BUFFER TO SEND
	CDFINS
	DCA I	[T10CA
	TAD	T10NWC		/LENGTH OF NEW BUFFER
	DCA I	[T10WC
	CDFCNK
	TAD	T10NWC
	CLL CML RAR
INTN21,	CLL CML RAR		/FOR SPEED .LT. 2400 WILL BE NOP	########
	TAD	[-3
	JMP	INTN99

/HERE WHEN LINE IS IDLING
INTN97,	TAD	(IDLBUF-1
INTN98,	CDFINS
	DCA I	[T10CA
	TAD	[-NUMSYN
	DCA I	[T10WC
	CDFCNK
	SYNCLK=NUMSYN^3		/3 PER CHARACTER
	TAD	[-SYNCLK	/RESET CLOCK ON XMTR
INTN99,	DCA	T10CLK
	DPSGTT			/REENABLE XMTR
	JMP	INTDIS

>/END OF IFZERO FTDP01
	XISTOG	FTDP01
/	***********************************************************
/	***********************************************************
/	***							***
/	***		NON-INTERRUPT LEVEL CODE		***
/	***							***
/	***********************************************************
/	***********************************************************

/ FIRST SCAN FOR THINGS TO DO LEFT BY INTERRUPT LEVEL CODE
/ THEN DISPLAY CONTENTS OF ADR IN SWITCHES

LOOP,	ION
	NL0			/RESET INTERRUPTS & AC

	TAD	CLKFLG
	SZA CLA
	  JMP	SCHED		/CHECK FOR ONCE PER TICK DUTIES

	TAD	SECFLG
	SZA CLA
	  JMP	SECOND		/CHECK FOR ONCE PER SECOND DUTIES

	TAD	TIQPTR
	NEGATE
	TAD	TIQTKR		/CHECK TTY RECEIVE QUEUE
	SZA CLA
	  JMP	RECINT		/IF ANY RECEIVE STUFF HANDLE IT

	TAD	RCVTKR
	NEGATE
	TAD	RCVPTR
	SZA CLA
	  JMP	RCVCHK		/THERE IS INPUT FROM DECSYSTEM-10 WAITING

	TAD	T10FLG		/CHECK SYNCHRONOUS TRANSMIT STATE
	SMA CLA
	  JMP	XSTART		/IDLE OR SYNCH

LOOP30,	
/IDLE - SO DISPLAY DATA ADDRESSED BY CONSOL SWITCHES
	CLA OSR			/GET CONTENTS OF SWITCHES
	DCA	TEMP1
	TAD	TEMP1
	TAD	DISMIN
	SMA
	  JMP	LOOP90
	TAD	DISMAX		/LIMIT TEST FOR DISPLAY FIELD
	SPA
	  JMP	LOOP90		/OUT OF RANGE
	CLL RTL
	CLL RAL
	TAD	(CDF
	DCA	LOOP90
LOOP90,	CDFINS			/INITIALLY DISPLAY INSTRUCTION FIELD
	NL0
	TAD	LOOP90
	DCA	LOOP99
	TAD I	TEMP1
IFZERO	PDP8E	<
	MQL			/LOAD INTO MQ
	TAD I	TEMP1		/GET IT BACK
>/END IFZERO	PDP8E
LOOP99,	7402
	ISZ	WRKREQ		/DISPLAY 4096 TIMES OR UNTIL INTERRUPTED
	JMP	LOOP99
	CDFCNK			/BACK TO NORMAL DATA FIELD
	JMP	LOOP

/NOTE THAT DISMIN+DISMAX MUST = 0010
DISMIN,	10
DISMAX,	0			/FIRST FIELD WHICH MAY NOT BE DISPLAYED
/HERE ONCE PER CLOCK TICK(UNLESS WE OVERRUN)
SCHED,	DCA	CLKFLG		/MARK WE SAW FLAG
	IOF
	TAD	REPTCK
	SPA CLA			/ARE WE TIMEING OUT ?
	ISZ	REPTCK		/YES HAVE WE
	  JMP	SCHED2		/NO TO ONE OF ABOVE

SCHED2,	ISZ	T10CLK		/HAS SYNCHRONOUS TRANSMITTER TAKEN TOO LONG ?
	  JMP	SCHED9		/NO
	TAD	(DPTMSG		/SYNCHROUS LINE TIMEOUT MSG
	DCA	ERRFLG		/LEAVE MSG FOR OPERATOR
	JMS	INISYN		/POKE TRANSMITTER
SCHED9,	ION
	JMP	CLKCDR		/TO CDR STUFF FIRST

/	***********************************************************
/	***********************************************************
/	***							***
/	***		COMMON SUBROUTINES			***
/	***							***
/	***********************************************************
/	***********************************************************


/HERE TO FREE A CHUNK
/CALL	JMS	FRECNK	(CALL WITH CNK ADR IN AC
/	RETURN
/FRECNK,	0
/	IOF
/	JMS	IFRCNK		/RELEASE CHUNK
/	ION
/	JMP I	FRECNK

/HERE TO FREE A NUMBER OF CHUNKS
/CALL	JMS	FRECKS	(WITH ADR OF FIRST CHUNK IN AC)
/	RETURN
FRECKS,	0
	ION
	SNA			/ANY CHUNKS LEFT ?
	  JMP I	FRECKS		/NO SO RETURN TO CALLER
	IOF			/FOR CALL TO IFRCNK
	DCA	INTMP1		/SAVE ADR OF THIS CHUNK
	TAD I	INTMP1		/GET ADR OF NEXT CHUNK
	DCA	INTMP2		/SAVE IT
	TAD	INTMP1
	JMS	IFRCNK		/RELEASE THIS CHUNK
	ISZ	FREDCK		/COUNT THIS CHUNK
	NOP			/SINCE IT MIGHT SKIP
	TAD	INTMP2		/GET ADR OF NEXT CHUNK IN STRING
	JMP	FRECKS+1	/LOOP FOR NEXT CHUNK

	 PAGE 

/HERE TO GET A FREE(NOT ERS) CHUNK AT INTERRUPT LEVEL
/ CALL	JMS	IGTCNK
/	ERROR RETURN
/	RETURN	WITH CHUNK ADR IN AC
IGTCNK,	0
	NL0
	TAD	(-ERSCNT
	TAD	FRECNT
	SPA CLA
	  JMP I	IGTCNK		/NOT ENOUGH CHUNKS LEFT TO PASS ANY OUT
	JMS	ERSGET		/GET A CHUNK
	ISZ	IGTCNK
	JMP I	IGTCNK
/HERE TO GET DDB ADR
/CALL	JMS	GETDDB	(WITH DEVICE # IN AC)
/	RETURN	WITH DDB, DDBSTS STEUP & BLOCK ADR IN AC
GETDDB,	0
	SPA
	  HLT
	TAD	(-DEVN
	SMA
	  HLT
	TAD	(DDBTAB+DEVN
	DCA	DDB
	TAD I	DDB
	DCA	DDB		/SAVE DEVICE BLOCK ADR
	NLOAD	DEVSTS		/RELATIVE ADR OF DEVICE STATUS WORD
	TAD	DDB
	DCA	DDBSTS		/SAVE ADR OF STATUS WORD
	TAD	DDB
	JMP I	GETDDB
/HERE TO GET THE NEXT OUTPUT CHAR FROM CHUNK
/ USES INTMP1 - INTMP4
/CALL	PUT DEVICE BLOCK ADR IN INTDDB
/	JMS	IGTOCH
/	RETURN IF NONE( AC=0 )
/	RETURN WITH CHAR IN AC

IGTOCH,	0
	NLOAD	DEVOAD
	TAD	INTDDB		/ADD DEVICE DATA BLOCK ADR
	DCA	INTMP3
	TAD I	INTMP3		/GET OUTPUT CHAR COUNT
	SNA			/DO WE HAVE ANY OUTPUT CHARS ?
	  JMP I	IGTOCH		/NO - DISMISS
	ISZ	IGTOCH		/SKIP RETURN TO CALLER
	ISZ I	INTMP3		/ADVANCE CHAR POINTER
	IAC 			/MAKE ADR OF CURRENT CHAR
	DCA	INTMP4
	TAD I	INTMP4		/PICK UP CURRENT CHAR
	SMA			/ALL DONE WITH CURRENT CHUNK ?
	  JMP I	IGTOCH		/NO - EXIT ROUTINE
	DCA	INTMP2		/SAVE CHARCTER
	TAD	INTMP4		/CURRENT CHAR POINTER
	AND	[-CNKSIZ	/MAKES POINTER TO LINK WORD
	DCA	INTMP4
	TAD I	INTMP4		/GET ADR OF NEXT CHUNK

IFNZRO FTDEBUG <
	SNA
	  JMP	.+3
	JMS	ICNKCK		/CHECK CHUNK ADR IS KOSHER
	TAD	INTMP1		/GET ADR OF CHUNK AGAIN
>/END OF IFNZRO FTDEBUG

	DCA I	INTMP3		/SET NEW CHAR POINTER
	TAD	INTMP4		/ADR OF USED CHUNK
	JMS	IFRCNK		/FREE CURRENT CHUNK
	NLOAD	DEVCHK		/DISPLACEMENT OF CHUNK COUNT
	TAD	INTDDB		/PLUS DDB START
	DCA	INTMP3		/SAVE DEVCHK ADDRESS
	NLM1			/DECREMENT
	TAD I	INTMP3		/ CHUNK COUNT
	DCA I	INTMP3		/ AND STORE
	TAD	INTMP2		/GET CURRENT CHAR AGAIN
	JMP I	IGTOCH		/DONE
/HERE TO GET AN EXTENSIBLE NUMBER USING IGTOCH
IGTEXN,	0
	JMS	IGTOCH
	  JMP I	IGTEXN		/TRY AGAIN LATER
	AND	[0377
	DCA	INTMP5		/SAVE LOW ORDER BITS
	TAD	INTMP5
	AND	[0200
	SNA CLA
	  JMP	IGTEN9		/RETURN
	JMS	IGTOCH
	  HLT
	CLL RAL			/PUT SIGN BIT IN LINK
	CLL RTL			/CLEAR FORMER SIGN BIT
	CLL RTL
IFNZRO FTDEBUG <
	SZL			/CHECK FOR 200 BIT WHICH SAYES EXTENSIBLE
	  HLT			/CAN'T HACK NUMBERS THAT LARGE !
>/END OF IFNZRO FTDEBUG
	CLL RTL
	TAD	(-200
IGTEN9,	TAD	INTMP5
	ISZ	IGTEXN		/SKIP RETURN
	JMP I	IGTEXN

MYPTCH,	0
	TAD	(INTMSG
	DCA	ERRFLG
	JMP I	MYPTCH
	/HERE WHEN THE -10 WANTS TTY INPUT STOPPED ON A LINE
RCVXOF,	CLA
	TAD	(LDBXPT		/GET THE X-OFF WORD OFFSET IN THE LDB
	TAD	DDB		/ADD IN THE ADDRESS OF THE INDICATED LDB
	DCA	TEMP6		/AND STUFF IT IN A TEMP REGISTER
	TAD	(XOFMSG-1	/GET THE ADDRESS OF THE X-OFF MESSAGE
	DCA	I TEMP6		/AND STICK IT IN THE LDB
	JMS	TTYGO		/GO AND START TTY
	JMP	RCVTT0		/AND GO BACK TO WORK
	PAGE 

IACTCK,	0
	DCA	INTDDB		/SAVE DEVICE BLOCK ADR
	NLOAD	DEVSTS
	TAD	INTDDB
	DCA	IDBSTS
	TAD I	IDBSTS		/GET DEVSTS
	SMA CLA			/SKIP IF DEVICE IS ACTIVE
	  JMP	INTDIS	/DISMISS INTERRUPT
	JMP I	IACTCK		/RETURN TO CALLER

/HERE TO GET A FREE CHUNK AT INTERRUPT LEVEL
/ (-) CYCLES + JMS CYCLES
/CALL	JMS	ERSGET
/	ERROR RETURN
/	SUCCESS RETURN WITH CHUNK ADR IN AC

ERSGET,	0
	NL0
	TAD	FIRFRE		/GET ADR OF 1ST CHUNK
	SNA			/IS THERE A FIRST CHUNK ?
	  HLT			/MUST NEVER HAPPEN
				/ IMPLIES STARTED SOMETHING WE CAN'T FINISH

IFNZRO FTDEBUG < JMS ICNKCK >	/BE SURE ADR IS KOSHER
IFZERO FTDEBUG < DCA INTMP1 >	/SAVE ADR OF FIRST CHUNK

	TAD I	FIRFRE		/AND GET ADR OF 2ND CHUNK
	DCA	FIRFRE		/SET NEW FIRST FREE CHUNK
	DCA I	INTMP1		/CLEAR LINK IN THIS CHUNK

	NLM1
	TAD	FRECNT		/UPDATE FREE COUNT
IFNZRO FTDEBUG <
	SPA
	  HLT			/IT IS ALWAYS POSITIVE
>/END OF IFNZRO	FTDEBUG
	DCA	FRECNT

	TAD	INTMP1		/GET ADR OF CHUNK WE ARE GETTING
	JMP I	ERSGET

/HERE TO FREE A CNK
/(12-16) CYCLES + JMS CYCLES
/CALL	JMS	IFRCNK	(CALL WITH CNK ADR IN AC
/	RETURN		AC WILL BE 0, LINK UNDEFINED
IFRCNK,	0

IFZERO FTDEBUG <
	DCA	INTMP1		/SAVE ADR OF CHUNK
>/END OF IFZERO FTDEBUG

IFNZRO FTDEBUG <
	JMS	ICNKCK		/CHECK CHUNK ADR IS KOSHER
>/END OF IFNZRO FTDEBUG

	TAD	FIRFRE		/ADR OF FIRST FREE CHUNK
	DCA I	INTMP1		/SET LINK IN NEW FIRST CHUNK
	TAD	INTMP1
	DCA	FIRFRE
	ISZ	FRECNT		/COUNT FREE CHUNKS
	JMP I	IFRCNK
	HLT
/HERE TO CHECK A CHUNK ADR IS LEGAL
/ CALL	JMS	ICNKCK		/WITH IOF AND ADR IN AC
/	RETURN			/(AC)=0 AND ADR OF CHUNK IN INTMP1
ICNKCK,	0
	DCA	INTMP1		/SAVE CHUNK ADR
	TAD	INTMP1
	AND	[CNKSIZ-1
	SZA			/ALL CHUNKS BEGIN ON EVEN BOUNDRY
	  HLT			/THIS ONE DOESN'T ?
	CLL CLA			/CLEAR LINK
	TAD	FIRADR		/GET ADDRESS OF FIRST CHUNK
	CMA IAC			/CONVERT TO NEGATIVE
	TAD	INTMP1		/GET ADDR OF CHUNK AGAIN
	SNL CLA
	  HLT
	JMP I	ICNKCK

/HERE TO  MARK A DEVICE AS NOT ACTIVE
/ CALL	JMS	CLRACT		/WITH IOF AND INTDDB SETUP
/	RETURN
CLRACT,	0
	NLOAD	DEVSTS
	TAD	INTDDB		/MAKE ADR OF DEVSTS
	DCA	INTMP1
	NL3777			/MASK TO CLEAR ACTIVE BIT
	AND I	INTMP1
	DCA I	INTMP1		/SAVE NEW STATUS WORD
	JMP I	CLRACT

/HERE TO SET DDCMP STATUS WORD
/ CALL	SET UP INTDDB
/	LOAD NEW STATUS INTO AC
/	JMS	ISTDDC
ISTDDC,	0
	DCA	INTMP3		/SAVE NEW DDCMP STATUS WORD
	TAD	[DEVDDC		/OFFSET FOR DDCMP STATUS WORD
	TAD	INTDDB
	DCA	INTMP2
	TAD I	INTMP2
	NEGATE
	TAD	INTMP3		/GET NEW DDCMP STATUS WORD
	SNA CLA			/ARE THEY DIFFERENT ?
	  JMP I	ISTDDC		/NO SO RETURN
	TAD	INTMP3		/GET NEW STATUS WORD
	DCA I	INTMP2		/AND SET IT
	NLOAD	DEVSTS
	TAD	INTDDB
	DCA	INTMP1		/SAVE ADR OF STATUS WORD
	NL7776			/MASK FOR NEED-TO-SEND-STATUS BIT
	AND I	INTMP1		/CLEAR IT
	IAC			/SET IT
	DCA I	INTMP1		/SAVE IT
	JMP I	ISTDDC

/HERE TO SET A BIT IN THE DEVDDC WORD
/ CALL	JMS	ISBDDC	/WITH INTDDB SETUP AND BITS IN AC
/			/USES INTMP1 - INTMP4
ISBDDC,	0
	DCA	INTMP1		/SAVE BITS
	NLOAD	DEVSTS		/RELATIVE ADR OF STATUS WORD
	TAD	INTDDB
	DCA	INTMP3		/SAVE ADR OF STATUS WORD
	Q=DEVDDC-DEVSTS
	NLOAD	Q
	TAD	INTMP3		/MAKES ADR OF DEVDDC
	DCA	INTMP4		/SAVE ADR OF DEVDDC
	TAD I	INTMP4		/GET OLD DEVDDC
	DCA	INTMP2		/SAVE FOR FUTURE REFERENCE
	TAD	INTMP1		/GET BITS TO SET
	CMA			/MAKE INTO A MASK
	AND I	INTMP4		/CLEAR BITS IN DEVDDC
	TAD	INTMP1		/ADD BITS
	DCA I	INTMP4		/AND SAVE IN DEVDDC
	NL7776			/MASK TO REQUEST STATUS
	AND I	INTMP3		/CLEAR BIT FROM DEVSTS
	IAC			/SET BIT
	DCA I	INTMP3
	JMP I	ISBDDC
/HERE TO GET THE NEXT CHAR FROM A STRING OF CHUNKS POINTED TO BY TEMP3
/CALL	JMS	GETCHR
/	  RETURN WHEN NO MORE CHARS IN STRING(I.E. TEMP3 NOW 0
/	RETURN WITH CHAR IN AC(WILL BE 11 BITS ONLY)
GETCHR,	0
	NL0			/IN CASE AC NONZERO
	TAD	TEMP3
	SNA			/IS  STRING NULL ?
	  JMP I GETCHR		/YES SO NONSKIP RETURN
	AND	[CNKSIZ-1
	IOF
	SNA CLA			/ARE WE POINTING TO A LINK WORD ?
	  JMP	GETCH3		/YES
	TAD I	TEMP3		/GET THE LAST CHAR
	SPA CLA			/WAS LAST CHAR LAST IN ITS CHUNK ?
	  JMP	GETCH7		/YES SO ADVANCE CHUNKS

IFNZRO FTDEBUG <
	NL1
	TAD	TEMP3
	AND	[CNKSIZ-1
	SNA CLA
	  HLT
>/END OF IFNZRO FTDEBUG

GETCH3,	ISZ	TEMP3		/ADVANCE TO NEXT CHAR
	NL3777			/STRIP LAST DATA BIT IF PRESENT
	AND I	TEMP3		/GET NEXT CHAR
	ISZ	GETCHR		/SKIP RETURN
GETCH5,	ION
	JMP I	GETCHR
GETCH7,	TAD	TEMP3		/GET POINTER TO CURRENT CHAR
	AND	[-CNKSIZ	/MAKE POINTER TO FIRST WORD OF CHUNK
	DCA	TEMP3
	TAD I	TEMP3		/GET ADR OF NEXT CHUNK
	SNA
	  JMP	GETCH5		/NO MORE CHUNKS SO DONE

IFNZRO FTDEBUG <
	JMS	ICNKCK		/CHECK LINK HAD LEGAL CHUNK ADDRESS
	TAD	INTMP1
>/END OF INZRO FTDEBUG

	DCA	TEMP3
	JMP	GETCH3		/GO GET NEXT CHAR
	PAGE
/	***********************************************************
/	***********************************************************
/	***							***
/	***		CTY SERVICE				***
/	***		GAS FOR LESS				***
/	***							***
/	***********************************************************
/	***********************************************************


/HERE AT INTERRUPT LEVEL TO TEST FOR CTY INTERRUPTS
INTCTY,	CTYKSF			/TYPING SOMETHING?
	  JMP	INTCTO		/NOT KEYBOARD - CHECK XMTR
	TAD	(CTYBLK		/ADR OF DEVICE BLOCK
	DCA I	TIQPTR		/SAVE ADR
	CTYKRB			/READ KEYBOARD & RESET FLAG
/HERE TO PUT CHAR INTO TTI QUEUE AND BE SURE QUEUE IS NOT GARBLED
INTYI9,	DCA I	TIQPTR		/SAVE CHAR
	TAD	TIQPTR
	TAD	(1-TTIQUE-TIQLEN
	SZA CLA			/HAVE WE FILLED THE QUEUE ?
	  JMP	.+3		/NO
	TAD	(TTIQUE-1
	DCA	TIQPTR

/NOW CHECK TO SEE QUEUE HASN'T OVERFLOWED
	TAD	TIQPTR
	NEGATE
	TAD	TIQTKR		/HAVE WE FILLED THE QUEUE
	SNA CLA
	  HLT
	NLM1
	DCA	WRKREQ		/FIND THIS ASAP
IFNZRO FTDC02F <
	JMS	ALLSEL		/REENABLE ALL LINES
>/END OF IFNZRO FTDC02F
	JMP	INTDIS

INTCTO,	CTYTSF			/SKIP ON CTY TRANSMIT FLAG
	  JMP	INTCT9		/NOT CTY - CHECK NEXT DEVICE
	TAD	(CTYBLK
INTTYX,	DCA	INTDDB
	JMS	XMTINT		/SEE WHAT IS LEFT TO GO
	JMP	INTDIS
/ CALL:	JMS	TTYGO	WITH DDB& DDBSTS SETUP
/	RETURN			/POSSIBLY WITH GARBAGE IN AC
/HERE AT NONINTERRUPT LEVEL TO START A TTY IF IT WERE INACTIVE
TTYGO,	0
	TAD	DDB		/GET DEVICE BLOCK ADR
	IOF
	DCA	INTDDB		/SAVE IT WHERE XMTINT WANTS IT
	NL4000
	TAD I	DDBSTS		/MAKE ACTIVE STATUS
	SMA
	  JMP	.+3		/EXIT BECAUSE ALREADY ACTIVE
	DCA I	DDBSTS
	JMS	XMTINT
	NL0			/CLEAR AC
	JMP I	TTYGO

GTCHR,	0
	JMS	GETCHR
	  HLT
	JMP I	GTCHR

IFNZRO	DP8ETR	<
OTR,	0			/TRACE OUTPUT MESSAGE
	TAD	T10NWC		/NUMBER OF CHARACTERS
	DCA	TEMP1		/SAVE FOR LOOP CONTROL
	TAD	T10NCA		/BEGINNING OF MESSAGE
	DCA	AUTO1		/ INTO AUTOINDEX POINTER
OTRL,	TAD I	AUTO1		/GET NEXT CHARACTER
	IOF
	JMS	TRACEW		/TRACE IT
	ION
	ISZ	TEMP1		/SKIP IF FINISHED
	  JMP	OTRL		/ELSE CONTINUE
	JMP I	OTR
>/END OF IFNZRO	DP8ETR
DEFINE	DISCDE	<
DISSND,				/SEND DEVICE UNAVAILABLE DISCONNECT
	TAD	TEMPC		/RCVDSP TABLE ENTRY
	TAD	(-RCVDSP-1+SNATAB/POINT TO SNATAB ENTRY
	DCA	TEMP1
	TAD I	TEMP1		/GET DNA
	DCA	DISSNA		/STORE FOR XDISBG
	DCA I	TEMP1		/CLEAR SNATAB ENTRY
	JMS	XDISBG		/BEGINNING OF DISCONNECT
	TAD	[5		/COUNT
	JMS	SNDCHR
	NL2
	JMS	SNDCHR		/TYPE=DISCONNECT
	TAD	TEMPC		/RCVDSP ENTRY
>/END OF DEFINE	DISCDE
DEFINE	DISCD1	<
	TAD	(-RCVDSP-1+SLATAB/SLATAB ENTRY
	DCA	TEMP1
>/END OF DEFINE	DISCD1
DEFINE	DISCD2	<
	TAD I	TEMP1		/GET DLA
	JMS	SNDEXN
	JMS	SNDCHR		/SLA=0
	TAD	TEMPC
	TAD	(-RCVDSP-1+MMLTAB/MMLTAB HOLDS REASON
	DCA	TEMP1
	TAD I	TEMP1
	JMS	SNDCHR
	TAD	(RCVKRD		/UNUSED VALUE
	DCA I	TEMPC		/INTO RCVDSP
	JMP	FINMSG
>/END OF DISCD2 DEFINITION
IFZERO TTYN <
	DISCDE
	DISCD1
	DISCD2
	PAGE 
>/END OF IFZERO	TTYN
	LISTOG	TTYN
IFNZRO TTYN <
	LISTOG	FTDC02F
IFNZRO FTDC02F <
/	***********************************************************
/	***********************************************************
/	***							***
/	***		DC02F SERVICE				***
/	***							***
/	***********************************************************
/	***********************************************************

INTTTY,	DCA	INTMP2		/SET UP FOR A COUNTER
	TAD	(0010		/SELECT GROUP 1 ONLY
	DCMTKF			/GET THE KEYBOARD FLAGS
	AND	DC1MSK		/SOME TTY'S WE DON'T CARE ABOUT

IFDEF DC2MSK <
	SZA
	  JMP	INTYI2		/ONE OF THESE HAS GONE OFF
	TAD	(10
	DCA	INTMP2
	NL4			/MASK FOR SECOND GROUP
	DCMTKF			/GET KEYBOARD FLAGS FOR 2ND GRP
	AND	DC2MSK
>/END OF IFDEF DC2MSK

IFDEF DC3MSK <
	SZA
	  JMP	INTYI2		/ONE OF THESE HAS GONE OFF
	TAD	(20
	DCA	INTMP2
	NL2			/MASK FOR THIRD GROUP
	DCMTKF			/GET KEYBOARD FLAGS FOR 3RD GRP
	AND	DC3MSK
>/END OF IFDEF DC3MSK

	SNA
	  JMP	INTTTO
INTYI2,	JMS	INTTY5
	DCA I	TIQPTR		/SAVE DDB ADR
	TAD	(17
	DCMTON			/SELECT NO LINES
	NL0
	TAD I	INTMP3		/GET DDB ADR
	TAD	[LDBADR	
	DCA	INTMP3
	TAD I	INTMP3		/GET BITS FOR STATION SELECT
	DCMTON			/SELECT LINE
	NL0			/CLEAR AC AGAIN
	DCMKRS DCMKCC
	JMP	INTYI9		/CHECK TO BE SURE TTI QUEUE IS STILL KOSHER
	HLT
/HERE TO TEST FOR POSSIBLE XMT INTERRUPTS
INTTTO,
IFDEF DC3MSK <
	NL2			/MASK FOR 3RD GROUP
	DCMTPF			/GET PRINTER FLAGS
	AND	DC3MSK
	SZA
	  JMP	INTYO2
	DCA	INTMP2
>/END OF IFDEF DC3MSK

IFDEF DC2MSK <
	NL4			/MASK FOR 2ND GROUP
	DCMTPF			/GET PRINTER FLAGS
	AND	DC2MSK
	SZA
	  JMP	INTYO2
	DCA	INTMP2
>/END OF IFDEF DC2MSK

	TAD	(0010		/MASK FOR 1ST GROUP
	DCMTPF			/GET PRINTER FLAGS
	IFNDEF DC2MSK <
	AND	DC1MSK
>/END OF IFNDEF DC2MSK
	SNA			/ANY READY
	  JMP	INTTY9		/NO
INTYO2,	JMS	INTTY5		/CONVERT BIT PATTERN TO LINE INDEX
	JMP	INTTYX		/GO TO XMTINT THEN DISMISS

/ROUTINE TO CONVERT RESULTS OF DCMTKF OR DCMTPF TO A LINE INDEX
INTTY5,	0
	SPA
	  JMP	INTTY6
	ISZ	INTMP2
	CLL RAL
	JMP	INTTY5+1
INTTY6,	NL0
	TAD	INTMP2
	TAD	(DDBTAB+1
	DCA	INTMP3
	TAD I	INTMP3		/GET TTY DDB ADR
	JMP I	INTTY5

/HERE FROM CODE FOLLOWING XMTINT TO CLEAR ALL OUTPUT FLAGS
TTOFIN,	JMS	TTOSEL
	DCMTCF
	JMS	ALLSEL		/SELECT ALL LINES AGAIN
	JMP	XMTDIS		/DISMISS CALL TO XMTINT

/HERE FROM CODE FOLLOWING XMTINT TO TYPE AN OUTPUT CHAR
INTYPE,	JMS	TTOSEL
	NL0
	TAD	INTMP6		/GET CHAR TO TYPE
	DCMTCF DCMTPC		/TYPE IT
	JMS	ALLSEL		/SELECT ALL LINES AGAIN
	JMP	XMTDIS		/DISMISS CALL TO XMTINT
TTOSEL,	0
	TAD	(17
	DCMTON
	NL0
	TAD	[LDBADR
	TAD	INTDDB
	DCA	INTMP2
	TAD I	INTMP2
	TAD I	INTDDB		/GET HDW ADR FOR DC02 LINE
	DCMTON
	JMP I	TTOSEL

	PAGE
>/END OF IFNZRO FTDC02F
	LISTOG 0
IFZERO FTDC02F <
/	***********************************************************
/	***********************************************************
/	***							***
/	***		KL8E SERVICE				***
/	***							***
/	***********************************************************
/	***********************************************************

INTYI1,	0
	CDFINS
	TAD I	INTYI1		/GET DDB ADR
	SNA			/DO WE BELIEVE IN HIM ?
	  JMP	INTYI3		/NO SO FLUSH IT
	CDFCNK			/BACK TO NORMAL DATA FIELD
	DCA I	TIQPTR		/PUT INTO TTY INPUT QUEUE
	NLM3
	TAD	INTYI1
	DCA	INTMP1
	CDFINS			/CHANGE TO INSTRUCTION FIELD
	TAD I	INTMP1
	CDFCNK			/BACK TO NORMAL DATA FIELD
	TAD	[0005		/MAKES A KRB
	DCA	.+1
	0
	JMP	INTYI9

INTYI3,	NLM3
	TAD	INTYI1		/MAKES ADR OF KRB
	DCA	INTMP1
	NL1			/WILL CONVERT KSF TO KCF
	TAD I	INTMP1		/MAKES KCF
	CDFCNK			/BACK TO NORMAL DATA FIELD
	DCA	.+1
	0			/THIS IS A KCF
	JMP	INTDIS

/HERE WHEN A KL8E LINE HAS AN XMT INTERRUPT
INTYO1,	0
	CDFINS			/CHANGE DATA FIELD TO PICK UP AN INSTRUCTION
	TAD I	INTYO1
	CDFCNK			/BACK TO NORMAL DATA FIELD
	JMP	INTTYX		/POKE XMTINT

/HERE FROM CODE FOLLOWING XMTINT TO CLEAR ALL OUTPUT FLAGS
TTOFIN,	
	TAD	[LDBADR
	TAD	INTDDB
	DCA	INTMP2
	TAD	(7773		/MASK TO MAKE TLS INTO TCF
	AND I	INTMP2
	DCA	.+1
	0
	JMP	XMTDIS

/HERE FROM CODE FOLLOWING XMTINT TO TYPE AN OUTPUT CHAR
INTYPE,	
	TAD	[LDBADR		/POINT TO ADDRESS FIELD
	TAD	INTDDB		/IN DDB
	DCA	INTMP2		/STORE ADDRESS OF IOT INSTRUCTION
	TAD I	INTMP2		/GET IOT
	DCA	.+2
	TAD	INTMP6		/GET CHAR
	0
	JMP	XMTDIS
DISSN2,	DISCD2

	PAGE
DEFINE KSF Q QQ <	XLIST
	IFDEF QQ <	XLIST
		Q			/SKIP ON KYBD INTERRUPT
		JMP	.+3
		JMS I	[INTYI1		/KYBD INTERRUPT
		QQ	/ADR OF DDB
		XLIST	>/END OF IFDEF QQ
	XLIST	>/END OF DEFINE	KSF

INTTTY,	KSF T00KSF,T00BLK		/TEST FOR KYBD ON LINE 0
	KSF T01KSF,T01BLK		/TEST FOR KYBD ON LINE 1
	KSF T02KSF,T02BLK		/TEST FOR KYBD ON LINE 2
	KSF T03KSF,T03BLK		/TEST FOR KYBD ON LINE 3
	KSF T04KSF,T04BLK		/TEST FOR KYBD ON LINE 4
	KSF T05KSF,T05BLK		/TEST FOR KYBD ON LINE 5
	KSF T06KSF,T06BLK		/TEST FOR KYBD ON LINE 6
	KSF T07KSF,T07BLK		/TEST FOR KYBD ON LINE 7
	KSF T10KSF,T10BLK		/TEST FOR KYBD ON LINE 10
	KSF T11KSF,T11BLK		/TEST FOR KYBD ON LINE 11
	KSF T12KSF,T12BLK		/TEST FOR KYBD ON LINE 12
	KSF T13KSF,T13BLK		/TEST FOR KYBD ON LINE 13
	KSF T14KSF,T14BLK		/TEST FOR KYBD ON LINE 14
	KSF T15KSF,T15BLK		/TEST FOR KYBD ON LINE 15
	KSF T16KSF,T16BLK		/TEST FOR KYBD ON LINE 16
	KSF T17KSF,T17BLK		/TEST FOR KYBD ON LINE 17

/NOW CHECK FOR TRANSMIT INTERRUPTS
ZZ=TTYN

DEFINE TSF Q QQ <	XLIST
	IFNZRO ZZ <
	ZZ=ZZ-1
		XLIST
		Q			/SKIP ON XMT FLAG
		XLIST
	IFNZRO ZZ <	XLIST
	 	JMP	.+3
		XLIST>/END OF IFNZRO ZZ
	IFZERO ZZ <	XLIST
		JMP I	[INTTY9
		XLIST>/END OF IFZERO ZZ
		XLIST
		JMS I	[INTYO1
		QQ	/ADR OF DEVICE BLOCK
		XLIST	>/END OF IFNZRO	ZZ
	XLIST	>/END OF TSF DEFINITION

	TSF T00TSF,T00BLK		/CHECK LINE 0 FOR XMT INTERRUPT
	TSF T01TSF,T01BLK		/CHECK LINE 1 FOR XMT INTERRUPT
	TSF T02TSF,T02BLK		/CHECK LINE 2 FOR XMT INTERRUPT
	TSF T03TSF,T03BLK		/CHECK LINE 3 FOR XMT INTERRUPT
	TSF T04TSF,T04BLK		/CHECK LINE 4 FOR XMT INTERRUPT
	TSF T05TSF,T05BLK		/CHECK LINE 5 FOR XMT INTERRUPT
	TSF T06TSF,T06BLK		/CHECK LINE 6 FOR XMT INTERRUPT
	TSF T07TSF,T07BLK		/CHECK LINE 7 FOR XMT INTERRUPT
	TSF T10TSF,T10BLK		/CHECK LINE 10 FOR XMT INTERRUPT
	TSF T11TSF,T11BLK		/CHECK LINE 11 FOR XMT INTERRUPT
	TSF T12TSF,T12BLK		/CHECK LINE 12 FOR XMT INTERRUPT
	TSF T13TSF,T13BLK		/CHECK LINE 13 FOR XMT INTERRUPT
	TSF T14TSF,T14BLK		/CHECK LINE 14 FOR XMT INTERRUPT
	TSF T15TSF,T15BLK		/CHECK LINE 15 FOR XMT INTERRUPT
	TSF T16TSF,T16BLK		/CHECK LINE 16 FOR XMT INTERRUPT
	TSF T17TSF,T17BLK		/CHECK LINE 17 FOR XMT INTERRUPT

Z=.-INTTTY
Z=Z-200
IFNZRO Z <PAGE>

>/END OF IFZERO FTDC02F
	XISTOG	FTDC02F
>/END OF IFNZRO TTYN
	LISTOG	TTYN
/	***********************************************************
/	***********************************************************
/	***							***
/	***			RECINT-DDCMP			***
/	***		BASE LEVEL TTY INPUT HANDLING		***
/	***							***
/	***********************************************************
/	***********************************************************

/HERE TO HANDLE TTY INPUT
/ CALLED FROM LOOP - WILL RETURN TO LOOP
/ TAKES NEXT CHAR FROM TTIQUE AND PUTS IT INTO AN INPUT CHUNK
/TEMP USAGE IS
/	TEMP8	IS POINTER TO LDBXPT
/	TEMP7	ADR OF DDCMP STATUS WORD
/	TEMP6	ADR OF DEVBF1
/	TEMP5	CHAR
/	TEMP4	ADR OF CHRTAB BITS

/DEVDDC BITS
/	0001	/DEFERED ECHO MODE
/	0002	/TRANSLATE LOWER CASE TO UPPER
/	0004	/OUTPUT HAS BEEN FROZEN BY TYPEIN OF XOF
/	0010	/IMAGE MODE INPUT
/	0020	/IMAGE MODE OUTPUT
/	0040	/TTY PAGE IN EFFECT
/	0100	/TTY TAPE FEATURE(IMPLIES SUPPRESS NORMAL CR HANDLING)
/	0200	/TTY HAS HDW TAB
/	0400	/INPUT STOPPED BY SENDING XOFF TO TTY
/	1000	/DATA TERMINAL READY
/	6000	/0=NONE
/		/1 NG
/		/2 DATA SET READY
/		/3 CARRIER DETECT
RECINT,	IOF			/SO WE DON'T MISS A QUEUE OVERFLOW
	TAD I	TIQTKR		/GET LINE #
	DCA	DDB
	TAD I	TIQTKR		/GET CHAR
	AND	[0377		/8 BITS ONLY(THIS ISN'T NECESSARY)
	DCA	TEMP5		/SAVE CHAR

	TAD	TIQTKR
	TAD	(1-TTIQUE-TIQLEN
	SZA CLA
	  JMP	RECIN0		/DON'T NEED TO RESET POINTERS
	TAD	(TTIQUE-1
	DCA	TIQTKR

RECIN0,	ION			/MATCHES IOF AT RECINT
	TAD	TEMP5		/GET CHARACTER
	AND	[0177		/SEVEN BITS ONLY
	TAD	(CHRTAB		/SCNSER CHAR TABLE ADR
	DCA	TEMP4		/SAVE ADR OF CHAR TYPE BITS

	NLOAD	DEVSTS
	TAD	DDB		/MAKE STATUS ADR
	DCA	DDBSTS		/SAVE FOR TTYGO

	Q=DEVBF1-DEVSTS
	NLOAD	Q
	TAD	DDBSTS
	DCA	TEMP6		/SAVE POINTER TO DEVBF1

	TAD	(LDBXPT
	TAD	DDB
	DCA	TEMP8		/SAVE POINTER TO XOF LEVEL STRING

	Q=DEVDDC-DEVSTS
	NLOAD	Q
	TAD	DDBSTS		/DEVICE STATUS
	DCA	TEMP7		/SAVE ADR OF DEVDDC

	TAD	(0010		/MASK FOR IMAGE MODE INPUT
	AND I	TEMP7		/COMPARE AGAINST DDCMP STATUS
	SZA CLA			/SKIP IF NOT IN IMAGE MODE INPUT
	  JMP	RECIN1		/IMAGE MODE INPUT
	TAD	TEMP5		/GET CHARACTER
	SNA CLA			/CHECK FOR NULL
	  JMP	LOOP		/FLUSH NULLS

	NLOAD	CHRLC		/MASK FOR CHAR IS LOWER CASE
	AND I	TEMP4		/TEST AGAIN CHRTAB
	SNA CLA
	  JMP	RECIN1		/CHAR IS NOT LOWER CASE
	NLOAD	2		/MASK FOR SHOULD TRANSLATE
	AND I	TEMP7		/COMPARE AGAINST DDCMP STATUS
	SZA CLA
	  TAD	(-240		/CONVERT TO UPPER CASE
	TAD	TEMP5		/ AND COMPLEMENT PARITY BIT
	AND	(0377		/CLEAR EXTRANEOUS BITS, INCLUDING "LAST IN CHUNK" FLAG
	DCA	TEMP5		/ AND SAVE CHAR AGAIN

RECIN1,	NLOAD	CONBIT		/MASK FOR DEVICE CONNECTED
	AND I	DDBSTS
	SNA CLA			/IS IT CONNECTED ?
	  JMP	CONTYP		/NO SO TELL USER
	TAD	(-ERSCNT
	TAD	FRECNT
	SPA CLA
	  JMP	BELTYP		/NO FREE CHUNKS
	TAD I	TEMP6		/GET CONTENTS OF DEVBF1
	DCA	TEMP3		/SAVE WHERE GETCHR CAN USE IT
	JMS	GETCHR
	  NL0			/COUNT IS ZERO
	TAD	(-30		/24 DECIMAL
	SMA CLA			/HAS USER TYPED FAR AHEAD ?
	  JMP	BELTYP		/YES SO DING HIM
RECIN2,	JMS	RECI42		/PUT STATUS INTO THE MESSAGE
	NLOAD	1		/MASK FOR DEFERRED ECHO
	AND I	TEMP7		/COMPARE WITH DEVDDC
	SZA CLA			/SKIP IF NOT DEFERRED ECHO
	  JMP	RECIN5		/ALREADY IN DEFERRED ECHO MODE

	NLOAD	DEVOAD		/POINTER TO OUTPUT DATA
	TAD	DDB
	DCA	TEMP1
	TAD I	TEMP1
	SZA CLA			/IS THERE OUTPUT DATA WAITING ?
	  JMP	RECIN4		/YES SO GO INTO DEFERRED ECHO MODE
	Q=LDBFPT-LDBXPT
	NLOAD	Q
	TAD	TEMP8
	IOF			/WE WILL MODIFY INTERRUPT LOCATIONS
	DCA	TEMPA		/SAVE POINTER TO LDBFPT
	TAD	TEMPA		/GET LDBFPT
	IAC
	DCA	TEMPB		/SAVE POINTER TO LDBCHR
	TAD I	TEMPA		/GET FILLER WAITING
	TAD I	TEMPB		/ANY CHARS LEFT TO ECHO FROM BEFORE ?
	SZA CLA
	  JMP	RECIN4		/YES SO ENTER DEFERRED ECHO MODE
	TAD I	TEMP4		/GET CHRTAB BITS FOR THIS CHARACTER
	SPA CLA			/IS CHAR A BREAK CHAR ?
	  JMP	RECIN4		/YES SO ENTER DEFERRED ECHO MODE
	JMS	RECIN6		/PUT CHAR INTO THE INPUT CHUNKS
	TAD	TEMP5		/GET CHAR TO ECHO
	AND	[0177		/SEVEN BITS ONLY
	TAD	(-15		/TEST FOR CARRIAGE RETURN
	SNA CLA
	  JMP	RECI36		/CHAR IS A CR
	TAD	TEMP5		/GET CHAR TO ECHO
	DCA I	TEMPB		/AND PUT IT INTO LDBCHR
TSTART,	JMS	TTYGO		/TRY TO START THE TTY
	JMP	LOOP		/AND BACK TO THE BIG LOOP

/HERE TO LOCAL-ECHO A CR
RECI36,	TAD	(CRLMSG-1	/CR-LF STRING
	DCA I	TEMPA		/SET LDBFPT
	JMS	RECI37		/SET DEFERRED ECHO MODE
	JMP	TSTART		/ALL DONE
BELTYP,	NL0
	TAD	(TTOBEL-1	/THIS IS JUST A BELL
CNTYP2,
	DCA I	TEMP8		/SET LDBXPT
	JMP	TSTART

	PAGE

/HERE TO SET DEFERRED ECHO MODE
RECI37,	0
	TAD	DDB
	IOF			/IN CASE NEED TO CALL ISBDDC
	DCA	INTDDB
	NLOAD	1		/DEFERRED ECHO MODE BIT
	JMS	ISBDDC		/SET BIT IN DEVDDC
	JMS	RECI42		/PUT STATUS INTO THE MESSAGE
	JMP I	RECI37

/HERE TO SET DEFERRED ECHO MODE
RECIN4,	JMS	RECI37		/SET DEFERRED-ECHO MODE

/HERE IF TTY IS IN DEFERRED ECHO MODE
RECIN5,	JMS	RECIN6		/PUT CHAR INTO THE INPUT CHUNKS
	TAD	DDB
	IOF			/IN CASE NEED TO CALL ISBDDC
	DCA	INTDDB
	TAD	(CHRXOF		/MASK FORXOF BIT
	AND I	TEMP4		/MASK AGAINST CHRTAB BITS
	SNA CLA
	  JMP	LOOP		/NOT AN XOF
	TAD I	TEMP7		/GET DEVDDC
	AND	[0040		/MASK FOR TTY PAGE
	SNA CLA
	  JMP	LOOP		/NOT IN TTY PAGE
	NLOAD	4		/FLAG OUTPUT FROZEN
	JMS	ISBDDC		/SET BIT IN DEVDDC AND TELL 10
	JMS	RECI42		/PUT STATUS INTO STRING MAYBE
	JMP	LOOP

/HERE TO PUT AN INPUT CHAR INTO THE CHUNKS
RECIN6,	0
	TAD	TEMP6		/GET ADR OF DEVBF1
	IAC
	DCA	TEMP2		/SAVE POINTER TO DEVBF2
	TAD I	TEMP2		/GET DEVBF2(=POINTER TO DATA COUNT)
	SZA CLA
	  JMP	RECI62
	NL1
	JMS	RECI70		/PUT COUNT INTO THE CHUNKS
	TAD I	TEMP3		/GET LDBIPT
	DCA I	TEMP2		/SET DEVBF2
	NL1			/TYPE=1 FOR DATA
	JMS	RECI70		/PUT LINE NUMBER INTO THE CHUNKS
RECI62,	TAD	TEMP5		/GET THE CHARACTER WE JUST GOT
	JMS	RECI70		/PUT IT INTO THE CHUNKS
	TAD I	TEMP2		/GET DEVBF2
	DCA	TEMP2
	ISZ I	TEMP2		/COUNT IT
	JMP I	RECIN6

/HERE TO PUT STATUS INTO INPUT STRING FOR A LINE
RECI42,	0
	NLOAD	1		/MASK FOR NEED TO SEND STATUS
	AND I	DDBSTS		/CHECK AGAINST DEVSTS
	SNA CLA
	  JMP I	RECI42		/DON'T NEED TO
	TAD	TEMP6		/GET POINTER TO DEVBF1
	IAC			/MAKE INTO POINTER TO DEVBF2
	DCA	TEMP1
	DCA I	TEMP1
	NLOAD	4		/CHAR COUNT FOR STATUS IS ALWAYS 4 CHARS
	JMS	RECI70
	NL3			/STATUS IS TYPE 3
	JMS	RECI70		/PUT CODE INTO THE MESSAGE
	JMS	RECI70		/STC=0
	TAD I	TEMP7		/GET DEVDDC
	AND	[0177		/SEVEN BITS ONLY
	TAD	(0200		/ADD EXTENSIBLE BIT
	JMS	RECI70		/PUT 1ST HALF OF STATUS INTO STRING
	TAD I	TEMP7		/GET DEVDDC AGAIN
IFZERO	PDP8I	<
	CLL RTR			/NOT RTL
	CLL RTR			/THRU LINK
	CLL RTR
>
IFZERO	PDP8E	<
	BSW
>
	CLL RAR
	AND	(0037		/STRIP EXTRA BITS
	JMS	RECI70		/PUT INTO THE STRING
	NLOAD	7776		/MASK FOR NEED-TO-SEND-STATUS BIT
	IOF
	AND I	DDBSTS
	DCA I	DDBSTS
	JMP I	RECI42
/HERE TO PUT A CHARACTER INTO THE CHUNKS
/ CALL	JMS	RECI70	WITH CHAR IN AC
/	RETURN
RECI70,	0
	IOF
	DCA	INTMP4		/SAVE CHAR
	TAD	(LDBIPT
	TAD	DDB
	DCA	TEMP3		/SAVE POINTER TO LDBIPT
	TAD I	TEMP6		/GET DEVBF1
	SZA CLA
	  JMP	RECI72		/ALREADY HAVE AT LEAST ONE CHUNK
	JMS	ERSGET		/GET A CHUNK
	DCA I	TEMP6		/SET DEVBF1
	TAD I	TEMP6		/GET DEVBF1 AGAIN
	DCA I	TEMP3		/SET LDBIPT
RECI72,	TAD I	TEMP3		/GET LDBIPT
	IAC
	AND	[CNKSIZ-1
	SZA CLA
	  JMP	RECI75
	TAD I	TEMP3		/GET LDBIPT
	AND	[-CNKSIZ	/MAKE ADR OF LINK WORD
	DCA	INTMP3		/SAVE ADR OF LINK WORD
	JMS	ERSGET		/GET ANOTHER CHUNK
	DCA I	INTMP3		/SET LINK ADR IN PREVIOUS CHUNK
	TAD I	INTMP3		/GET CHUNK ADR AGAIN
	DCA I	TEMP3		/SET LDBIPT
RECI75,	TAD I	TEMP3		/GET ADR OF PREVIOUS CHAR
	DCA	INTMP3
	NLOAD	3777		/MASK FOR LAST DATA BIT
	AND I	INTMP3		/STRIP PREVIOUS CHAR OF LAST BIT
	DCA I	INTMP3		/AND SAVE IT AGAIN WITHOUT BIT
	ISZ	INTMP3		/ADVANCE TO NEXT CHAR SLOT
	NLOAD	4000		/MASK FOR LAST CHAR IN CHUNK
	TAD	INTMP4		/GET CHAR
	DCA I	INTMP3
	ISZ I	TEMP3		/ADVANCE LDBIPT
	ION
	JMP I	RECI70		/RETURN TO CALLER

TDBCHK,	0			/CHECK TTY NUMBER IS VALID
	TAD	(-TTYN-1	/MAKE NEGATIVE IF OK
	SMA			/IS TTY INRANGE?
	  JMP	BADTYP		/REJECT CONNECTION
	TAD	(TTYN+1		/RESTORE TTY NUMBER
	JMP I	TDBCHK		/RETURN
	PAGE
/	***********************************************************
/	***********************************************************
/	***							***
/	***			DDCMP - XMTINT			***
/	***		INTERUPT LEVEL TTY HANDLING		***
/	***							***
/	***********************************************************
/	***********************************************************

/HERE AT INTERRUPT LEVEL TO GET NEXT CHAR TO SEND TO A TTY
/ CALL	LOAD INTDDB WITH ADR OF BLOCK
/	JMS	XMTINT	WILL FIND NEXT CHAR AND TYPE IT
/	RETURN		WILL CLRACT IF ALL DONE
/		AC MAY CONTAIN GARBAGE ON RETURN
/
/ TEMPORARY STOARAGE IS:
/	INTMP7		/POINTER TO DEVTIM
/	INTMP6		/CHAR TO TYPE
/	INTMP5		/POINTER TO DEVSTS

XMTDIS,	JMP I	XMTINT
XMTINT,	0

/CLEAR IRMA BIT
	NLOAD	DEVSTS		/RELATIVE ADR OF STATUS WORD
	TAD	INTDDB
	DCA	INTMP5		/SAVE POINTER TO DEVSTS
	TAD	(DEVTIM		/RELATIVE ADR OF DEVICE TIME
	TAD	INTDDB		/MAKE ABSOLUTE
	DCA	INTMP7		/SAVE POINTER TO DEVTIM

/CLEAR THE IRMA BIT
	Q=-IRMBIT-1
	NLOAD	Q		/MASK TO CLEAR IRMA BIT
	AND I	INTMP5
	DCA I	INTMP5

/SEE IF WE ARE SIMULATING A TAB
	TAD	(CHRBLA		/POINT TO A WORD WHICH HAS HORIZONTAL MOTION BIT ON
	DCA	INTMP1		/STORE ADDRESS OF THIS WORD
	NL4			/MASK FOR TAB SIMULATION BIT
	AND I	INTMP5		/LOOK AT STATUS
	SZA CLA
	  JMP	IXMT33		/YES, CONTINUE

/CHECK TO SEE IF WE ARE TIMING A FILLER
	TAD I	INTMP7		/GET DEVTIM
	SZA CLA			/ARE WE DOING A FILLER ?
	  JMP	IXMT92		/YES SO JUST CLEAR THE INTERRUPT

/FIRST CHECK IF THERE IS ANY XON/XOF LEVEL OUTPUT
	TAD	(LDBXPT
	TAD	INTDDB
	DCA	INTMP4
	TAD I	INTMP4		/PICK UP POINTER
	SZA
	  JMP	IXMT15		/YES THERE IS XON/XOF OUTPUT
	ISZ	INTMP4		/NOW TRY FILL CLASS POINTER
	TAD I	INTMP4
	SNA			/IS THIS POINTER READY ?
	  JMP	IXMT17		/KEEP LOOKING

/FOLLOWING IS USED BOTH FOR XON/XOF LEVEL, AND FOR FILL LEVEL OUTPUT
IXMT15,	ISZ I	INTMP4		/ADVANCE MEMORY COPY OF POINTER
	IAC			/ADVANCE AC COPY OF POINTER
	DCA	INTMP1
	TAD I	INTMP1		/GET NEXT CHAR
	SMA			/IS THIS LAST CHAR IN STRING ?
	  JMP	IXMT30		/NO SO JUST TYPE IT
	DCA	INTMP6		/SAVE CHAR
	DCA I	INTMP4		/CLEAR POINTER
	JMP	IXMT32		/GO TYPE THE CHAR

IXMT17,	ISZ	INTMP4		/ADVANCE TO LDBCHR
	TAD I	INTMP4		/SEE IF THERE IS A CHAR IN SLOT
	SNA			/WAS THERE A CHAR ?
	  JMP	IXMT20		/NO - TRY FOR OUTPUT
	DCA	INTMP6		/SAVE CHAR
	DCA I	INTMP4		/CLEAR LDBCHR
	JMP	IXMT31		/TYPE CHAR(WITH SPECIAL ECHO PROCESSING)

/CHECK TO SEE IF THERE ARE ANY OUTPUT CHARS
IXMT20,	Q=DEVDDC-DEVSTS
	NLOAD	Q
	TAD	INTMP5		/MAKES ADR OF DEVDDC
	DCA	INTMP1
	NLOAD	4		/MASK FOR OUTPUT FROZEN WITH XOF
	AND I	INTMP1		/COMPARE AGAINST DEVDDC
	SNA CLA			/WAS OUTPUT FROZEN ?
	JMS	IGTOCH		/TRY TO GET ANOTHER CHAR FROM THE CHUNKS
	  JMP	IXMT90		/NONE LEFT OR OUTPUT FROZEN

	DCA	INTMP6		/SAVE THE CHAR
	JMP	IXMT32
/HERE TO TYPE NEXT CHAR
IXMT30,	DCA	INTMP6		/SAVE CHAR
IXMT31,
IXMT32,	TAD	INTMP6		/GET CHARACTER AGAIN
	AND	[0177		/7 BITS ONLY
	TAD	(CHRTAB		/MAKE POINTER INTO THE CHARACTER TABLE
	DCA	INTMP1		/ADDRESS OF CHARACTER TABLE ENTRY
	TAD	(CHRHT
	AND I	INTMP1		/GET HT BIT
	SNA CLA
	  JMP	IXMT50
/HERE TO CHECK IF TTY HAS HARDWARE TABS
	NLOAD	Q
	TAD	INTMP5
	DCA	INTMP2
	TAD I	INTMP2		/DEVDDC
	AND	(220		/HDW TAB BIT OR IMAGE OUTPUT
	SZA CLA			/SKIP IF NEITHER
	  JMP	IXMT50		/EITHER OR BOTH, SO PRINT TAB
/START OF TAB SIMULATION
	NL4
	TAD I	INTMP5
	DCA I	INTMP5
	TAD	(CHRBLA		/POINT TO CHARACTER WITH HMO BIT ON
	DCA	INTMP1		/SAVE ADDRESS
	JMP	IXMT33
IXMT50,
	NLOAD	CHRFLL		/MAKE MASK FOR CHAR NEEDS A FILLER
	AND I	INTMP1		/GET SPECIAL CHARACTER BITS
	SNA CLA
	  JMP	IXMT33		/DOESN'T NEED A FILLER
	TAD	INTMP6		/GET CHARACTER AGAIN(MUST BE IN RANGE 10-15)
	AND	[0007		/THREE BITS ONLY
	TAD	(LDBFIL
	TAD	INTDDB
	DCA	INTMP2
	TAD I	INTMP2		/GET TIME TO STALL ON THIS CHAR
	SNA			/IS THERE ANY FILLER FOR THIS ONE ?
	  JMP	IXMT33		/NO
	DCA I	INTMP7		/AND SET DEVTIM
IXMT33,	TAD	(LDBCOL		/RELATIVE ADR OF HORIZONTAL POSITION
	TAD	INTDDB		/MAKE ABSOLUTE
	DCA	INTMP3		/SAVE LDBCOL ADDRESS
	TAD I	INTMP1		/GET CHRTAB BITS
	AND	(CHRHMO		/MASK FOR HORIZONTAL MOTION
	SZA CLA
	  ISZ I	INTMP3		/INCREMENT HORIZONTAL POSITION
	NL4			/TAB BIT MASK
	AND I	INTMP5		/SEE IF ON
	SNA CLA			/SKIP IF YES
	  JMP	IXMT34		/JMP IF NOT
	TAD I	INTMP3		/GET POSITION
	AND	[7		/LOOK AT LOW ORDER BITS
	SZA CLA			/SKIP IF AT TAB STOP
	  JMP	IXMT61
	TAD I	INTMP5		/GET STATUS
	AND	(7773
	DCA I	INTMP5
IXMT61,	TAD	(40		/GET BLANK
	DCA	INTMP6		/STORE AS CHARACTER
	JMP	IXMT38		/TYPE IT
	PAGE
IXMT34,
	TAD I	INTMP1		/GET CHRTAB BITS
	AND	(CHRCR		/MASK FOR CARRIAGE RETURN
	SZA CLA			/IS CHAR A CR ?
	  DCA I	INTMP3		/YES SO RESET TO COLUMN 0

IXMT38,	IFNZRO TTYN <
	TAD	INTDDB
	TAD	(-CTYBLK
	SZA CLA			/IS THIS CHAR FOR THE CTY
	  JMP	INTYPE		/NO SO BRANCH TO DC02F OR KL8E ROUTINE
>/END OF IFNZRO TTYN

	TAD	INTMP6		/RETREIVE CHAR
IXMT60,	CTYTLS			/ECHO IT
	JMP	XMTDIS
/HERE WHEN NOTHING FOR A TTY TO DO
IXMT90,	NL3777			/MASK TO STRIP ACTIVE BIT
	AND I	INTMP5		/CLEAR ACTIVE BIT
	DCA I	INTMP5

IXMT92,	IFNZRO TTYN <
	TAD	INTDDB
	TAD	(-CTYBLK
	SZA CLA
	  JMP	TTOFIN		/CLEAR TTY
>/END OF IFZERO TTYN

	CTYTCF			/CLEAR TELEPRINTER FLAG
	JMP	XMTDIS		/DISMISS CALL TO XMTINT
IFZERO	LPTN <	PAGE	>/BECAUSE XMTINT USES FIRST FEW LOCATIONS ON PAGE
	DEFINE	INSRT2	<
FEAPNT,	0			/SUBROUTINE TO POINT TO FEATURES
	TAD	(TTYFEA		/GET TTY FEATURES
	DCA	TEMP2
	TAD I	DDBSTS		/GET DDB STATUS
	AND	(TTYBIT
	SZA CLA
	  JMP	.+4
	TAD	[DDBSIZ
	TAD	DDB
	DCA	TEMP2
	JMP I	FEAPNT
DATDEC,	0
/	NLOAD	DEVDRQ		/POINT TO DATA REQUESTS
	XXXX=DEVDRQ-4
IFNZRO XXXX <NLOAD DEVDRQ>
	NL4
	TAD	DDB
	DCA	TEMP1
	NLM1			/LOAD -1
	TAD I	TEMP1		/ADD DATA REQUEST
	DCA I	TEMP1		/STORE NEW ONE
	JMP I	DATDEC
INUSE,	TAD	TEMPA		/GET DISPATCH ADDRESS
	TAD	(DEVN^2
	DCA	TEMP2		/MMLTAB ENTRY
	NL1			/REASON  (NOT AVAIL)
	DCA I	TEMP2		/SAVE IN MMLTAB
	DCA I	TEMPA		/CLEAR DISPATCH ADDRESS TO
				/INDICATE WE MUST SEND DISCONNECT
	JMP	RCVFLU
DISCHK,	0			/CHECK IF A DEVICE CONNECTED DISCONNECT MUST BE SENT
	TAD	(-DEVN		/LOOP CONTROL
	DCA	TEMPD		/ INITIALIZATION
	TAD	(RCVDSP+1	/FIRST ENTRY
	DCA	TEMPC
DISCLP,	TAD I	TEMPC		/GET ENTRY
	SNA CLA			/SKIP UNLESS DISCONNECT REQUIRED
	  JMP	DISSND		/SEND DISCONNECT
	ISZ	TEMPC		/ADVANCE POINTER
	ISZ	TEMPD		/UP COUNTER AND SKIP IF DONE
	  JMP	DISCLP		/CONTINUE
	JMP I	DISCHK		/RETURN TO CALLER
IFNZRO	DP8ETR	<
ITRCRC,	0			/TRACE INPUT CHARACTERS
	DCA	TEMP1		/STORE CHARACTER
	NL4000			/BIT TO INDICATE INPUT
	TAD	TEMP1		/+CHARACTER=TRACE ENTRY
	JMS	ITRCW		/STORE IN TRACE BUFFER
	TAD	TEMP1		/GET CHARACTER
	JMS	CRCALC		/ACCUMULATE CRC
	JMP I	ITRCRC		/RETURN
ITRCR2,	0			/STORE CRC IN TRACE
	TAD	AUTO1		/ADDRESS BEFORE CRC
	DCA	TEMP5		/AT END TEMP5 WILL POINT AT CHUNK POINTER
	ISZ	TEMP5		/ADVANCE TO NEXT CRC CHARACTER
	NL4000			/MASK FOR INPUT
	TAD I	TEMP5		/GET TRACE ENTRY
	JMS	ITRCW		/STORE IN TRACE BUFFER
	ISZ	TEMP5		/ADVANCE TO NEXT CRC CHARACTER
	NL4000			/MASK FOR INPUT
	TAD I	TEMP5		/GET TRACE ENTRY
	JMS	ITRCW		/STORE IN TRACE BUFFER
	ISZ	TEMP5		/SKIP OVER CHUNK COUNT
	ISZ	TEMP5		/POINT TO CHUNKS
	JMP I	ITRCR2		/RETURN
ITRCR3,	0			/TRACE CRC OF DATA PART
	JMS	GETCHR		/GET NEXT CRC CHARACTER
	  JMP	NRMNAK		/NO ROOM
	DCA	TEMPA		/SAVE CHARACTER
	NL4000			/INPUT MASK BIT
	TAD	TEMPA		/+CHARACTER
	JMS	ITRCW		/STORE IN TRACE BUFFER
	TAD	TEMPA		/GET BACK CHARACTER
	JMP I	ITRCR3		/RETURN
ITRCW,	0			/TURN OFF INTERRUPTS AND TRACE
	IOF
	JMS	TRACEW
	ION
	JMP I	ITRCW
>/END OF IFNZRO	DP8ETR
>/END OF DEFINE INSRT2


IFZERO	LPTN	<INSRT2
IFNZRO	TTYN	<
IFNZRO	FTDC02F	<
	DISCDE
	DISCD1
	DISCD2
>/END OF IFNZRO	FTDC02F
>/END OF IFNZRO	TTYN
>/END OF IFZERO	LPTN

	LISTOG	LPTN
IFNZRO LPTN <
/	***********************************************************
/	***********************************************************
/	***							***
/	***		LPT SERVICE				***
/	***							***
/	***********************************************************
/	***********************************************************

/DDCMP COMPRESSES LINE PRINTER DATA AS FOLLOWS
/	1CCCCCCC	CCCCCCC IS CHARACTER
/	01XXXXXX	XXXXXX IS NUMBER OF BLANKS
/	001XXXXX	XXXXX IS REPETITION FOR FOLLOWING CHAR
/DEVDDC BITS
/	0001	FATAL ERROR
/	0002	OFF LINE
/	0004	OUT OF PAPER
/	0010	PAPER JAM
/	0020	OFF LINE BECAUSE OF OPERATOR
/	0040	SLEW ERROR
/	0100	HAMMER FIRING ERROR
/	0200	LOW ON PAPER
/	0400	STACKER FULL
/	1000	OUT OF INK
/	2000	PRINT QUALITY BAD

LPTVTB,	DCA	INTMP1		/SAVE MASK FOR VFU SEARCH
	TAD	[0012		/LINE FEED
	DCA	LPTCHR
	TAD	LPTLNE		/LINE # WE ARE ON
	DCA	INTMP3		/SAVE POINTER TO VFU TAPE
LPTVT3,	ISZ	LPTLNE
	TAD I	LPTLNE		/GET CURRENT LINE STOPS
	SPA
	  JMP	LPTVT4		/END OF TAPE SO DO A FF
	AND	INTMP1		/USE MASK ON IT
	SNA CLA			/IS THIS HOLE PUNCHED ON TAPE ?
	  JMP	LPTVT3
	TAD	LPTLNE		/GET POINTER TO VFU TABLE
	CMA			/MAKE -LPTLNE-1
	TAD	INTMP3		/MAKES # OF LINES TO SKIP
	JMP	LPTX15		/ZERO LPTCOL THEN GO PRINT CHAR
LPTVT4,	TAD	LPTLNE
	NEGATE
	TAD	INTMP3		/LEAVES NUMBER OF LINES TO SKIP-1
	SZA CLA			/WERE WE ON LAST LINE ?
	  JMP	LPT014		/NO SO DO A FORM FEED
	JMP	LPTX14		/YES SO DO A LINE FEED

LPTHN2,	TAD	[0040
	ISZ	LPTZCT
	  JMP	INTLP4		/PRINT SPACE
	NL6000
	TAD	LPTOPV
	CDFINS
	DCA	LPTPIV
	CDFCNK
	JMP	INTLP0+1

INTLPT,	LPTSKF			/SKIP ON LPT FLAG
	  JMP	INTLP8		/NOT LPT SO KEEP LOOKING
	JMS	INTLP0
	JMP	INTDIS

INTLP8,	TAD I	(LPTBLK+DEVSTS	/GET LPT STATUS
	SPA CLA			/SKIP IF NOT ACTIVE
LPXXSE,	LPTSKE			/SKIP ON LPT ERROR		########
				/ INSTRUCTION CHANGED BY SYSCHK FOR LS8E
	  JMP	INTLP9		/NOT LPT ERROR OR NOT ACTIVE
	TAD	(LPTBLK		/POINT TO DDB
	DCA	INTDDB		/SAVE FOR ISBDDC
	NL2			/OFF-LINE
	JMS	ISBDDC		/SET BIT, AND SEND STATUS
	NL3777			/CLEAR ACTIVE
	AND I	(LPTBLK+DEVSTS
	DCA I	(LPTBLK+DEVSTS
	LPTCIE			/CLEAR INTERRUPT ENABLE
	JMP	INTDIS
/HERE ONCE PER CLOCK TICK TO SEE IF LPT NEEDS SERVICE
CLKLPT,	IOF			/DISABLE INTERRUPTS WHILE CHECK LPT
	TAD I	(LPTBLK+DEVSTS	/GET ACTIVE/INACTIVE STATUS
	SMA CLA			/IS LPT ACTIVE ?
	  JMP	STRLPT		/NO TRY TO START IT
	ISZ I	(LPTBLK+DEVTIM	/YES HAVE WE TIMED OUT ?
	  JMP	CLKLP8		/HASN'T TIMED OUT
/HERE WHEN LPT TIMES OUT
	TAD	(LPTBLK
	DCA	INTDDB		/SAVE ADR OF LPT DEVICE BLOCK
	NL2			/OFF-LINE FLAG
	JMS	ISBDDC		/SET FLAG AND TELL 10
	NL2000
	CDFINS
	TAD	LPTPIV
	SMA			/IS PIVOT ALREADY A JMP(I.E. OPCODE 5) ?
	  DCA	LPTOPV		/NO SO SAVE PIVOT
	NL0
	TAD	LPTCOL
	CMA
	DCA	LPTZCT
	TAD	(JMP I LPTHNG
	DCA	LPTPIV
	CDFCNK
IFNZRO FTTRBL <
	TAD	(LPTMSG-1
	DCA	ERRFLG		/LEAVE MSG FOR OPERATOR
>/END OF IFNZRO FTTRBL
	TAD	[0015		/CARRIAGE RETURN
	LPTSTB			/PRINT IT
	JMP	CLKLP8

/HERE TO TRY TO START LPT WHEN NOT ACTIVE
STRLPT,
	TAD I (LPTBLK+DEVOAD  /GET OUTPUT CHAR ADR
LPXYSE,	LPTSKE			/DON'T TRY IF LPT IS IN TROUBLE		########
				/ INSTRUCTION CHANGED BY SYSCHK FOR LS8E
	SNA CLA			/ANY OUTPUT FOR LPT ?
	  JMP	CLKLP8		/NO
	NL1			/NEED FOR LS8E
	LPTSIE			/SET INTERRUPT ENABLE
	NLOAD	4000		/FLAG DEVICE IS ACTIVE
	TAD I	(LPTBLK+DEVSTS
	DCA I	(LPTBLK+DEVSTS
	JMS	INTLP0		/BEGIN PRINTING
CLKLP8,	ION
	NL0			/BECAUSE THERE MAY BE GARBAGE IN AC
	JMP	CLKLP9

	PAGE
LPTBBB,	JMS	IGTEXN		/GET THE EXTENSIBLE NUMBER = COUNT
	  JMP	LPTFIN		/NONE SO DONE
IFNZRO FTDEBUG <
/	SNA
/	  HLT
>/END OF IFNZRO FTDEBUG
	TAD	[-1
	DCA	LPTCNT
	JMS	IGTOCH
	  JMP	LPTFIN
LPTGGG,	NLM1			/PREPARE TO DECREMENT COUNT
	TAD	LPTCNT
	SPA			/ARE THERE CHARS LEFT ?
	  JMP	LPTBBB		/NO SO GET A COUNT
	DCA	LPTCNT		/YES RESTORE COUNT
	JMS	IGTOCH		/GET THE NEXT CHAR
	  JMP	LPTFIN
	DCA	LPTCCH		/SAVE CHAR AND FLAG BITS
	TAD	LPTCCH
	AND	[0200		/IS THIS A COMPRESSED CHAR ?
	SZA CLA			/IS THIS A NICE CHAR
	  JMP	LPTFFF
LPTXXX,	TAD	LPTCCH		/GET FLAG BITS AGAIN
	AND	(0100		/WAS THIS COMPRESSED BLANKS ?
	SZA CLA
	  JMP	LPTZZZ		/YES
	NLM1
	TAD	LPTCCH		/GET COUNT
	AND	(0037
	DCA	LPTCCN
	JMP	LPTGGG		/GO GET CHAR TO REPEAT
LPTZZZ,	TAD	LPTCCH
	AND	(0077		/LEAVE ONLY COUNT
	DCA	LPTCCN		/SAVE COUNT
	TAD	[0040		/BLANK
LPTVVV,	DCA	LPTCCH
	JMP	INTLP0+1

	INSRT2
IFNZRO	TTYN	<
IFNZRO	FTDC02F	<
	DISCDE
	DISCD1
	DISCD2
>/END OF IFNZRO	FTDC02F
>/END OF IFNZRO	TTYN
	PAGE

/HERE WHEN USER SENT LINE LONGER THAN PRINTER LINE
LPTWRP,	TAD	LPTCHR
	DCA	LPTOCH
	TAD	[0012		/PUT OUT A LINE FEED
	JMP	INTLP1

/HERE WHEN OUTPUT DATA FOR LPT IS EXHAUSTED
LPTFIN,	LPTCLF			/CLEAR ANY FLAGS
	JMS	CLRACT
	JMS	ISTDDC	/UPDATE DDCMP STATUS
LPXXCE,	LPTCIE			/CLEAR INTERRUPT ENABLE		########
				/ INSTRUCTION CHANGED BY SYSCHK FOR LS8E
	JMP I	INTLP0		/RETURN TO CALLER

/HERE AT INTERRUPT LEVEL WHEN LPT INTERRUPTS
INTLP0,	0
	NL0			/IN CASE CAME FROM SPECIAL CHAR CODE
	TAD	(LPTBLK
	DCA	INTDDB
LPTPIV,	7402			/LPT PIVOT(SET TO NOP, SKP OR JMP)
	  JMP	INTLP6		/DO TAB FUNCTION
	NLM1			/GET SET TO DECREMENT
	TAD	LPTCCN		/DERECI70		/PUT COUNT IHAR COUNT
	SPA			/ARE WE DECOMPRESSING ?
	  JMP	LPTGGG		/NO SO GET A CHAR FROM CHUNKS
LPTYYY,	DCA	LPTCCN		/SAVE COMPRESSED CHAR COUNT
LPTFFF,
	TAD	LPTCCH		/GET CHAR AGAIN
	AND	[0177		/SEVEN BITS ONLY
INTLP1,	DCA	LPTCHR		/SAVE CHAR
INTLPA,
	TAD	LPTCHR
	TAD	(CHRTAB
	DCA	INTMP1
	TAD I	INTMP1
	RTR
	SZL SPA			/SKIP IF NORMAL CHAR
	  JMP	INTLP5		/SPECIAL MOTION OR FLUSH

IFNZRO FTLPLC <	NL0	>
IFZERO FTLPLC <			/SPECIAL HANDLING FOR LPT'S WITHOUT LOWER CASE
	RAR			/SHIFT BIT FOR LC INTO POSITION
	SNL CLA			/IS CHAR LOWER CASE ?
	  JMP	INTLP2		/NOT LOWER CASE
	TAD	LPTCHR		/GET CHAR AGAIN
	TAD	(-40		/CONVERT TO UPPER CASE
	DCA	LPTCHR		/ANL3			/STATUS IS TYPOF IFZERO FTLPLC

INTLP2,
	ISZ	LPTCOL		/THIS ADVANCES PRINTER ONE COLUMN
	TAD	LPTCOL
	TAD	(-LPTWID
	SMA SZA CLA
	  JMP	LPTWRP		/NEED TO DO WRAP AROUND

INTLP3,	NL0
	TAD	LPTCHR		/GET CHAR AGAIN
INTLP4,
	LPTSTB
	TAD	(-14
	SNA CLA			/WAS THIS A FORM FEED ?
	  TAD	LPTTFF		/YES
	TAD	LPTTCH		/TIME FOR NORMAL CHAR
	DCA I	(LPTBLK+DEVTIM
	JMP I	INTLP0
LPTTFF,	-100			/TIME FOR A FORM FEED		########
LPTTCH,	-32			/TIME FOR A NORMAL CHARACTER	########

/HERE WHEN CHAR MAY BE SPECIAL MOTION
INTLP5,				/CHECK IF CHAR TO BE FLUSHED
	SNL CLA			/IS CHAR GARBAGE ?
	  JMP 	LPTFLS		/FLUSH CHAR & RETURN TO CALLER
	TAD	LPTCHR		/GET CHAR AGAIN
	TAD	(LPTTBL-11
	DCA	INTMP1
	TAD I	INTMP1
	SNA			/IS THIS A TAB ?
	  JMP	LPT011		/YES
	SMA			/IS THIS A FF OR A CR ?
	  JMP	LPTVTB		/NO
	IAC
	SNA			/IS CHAR A CARRIAGE RETURN ?
	  JMP	LPT015		/YES
/HERE TO PRINT A FF ON LPT
LPT014,	NL0
	TAD	[0014
	DCA	LPTCHR
LPTX14,	TAD	(LPTVFU-1
	DCA	LPT	SZA CLA
	  JMP	REC 0 AGAIN
	NLM2			/SAYS PRINT ONCE
LPTX15,	DCA	LPTRCT		/SET REPETITION COUNT
	TAD	(NOP
	DCA	LPTPIV
LPT015,	DCA	LPTCOL		/SET COLUMN 0 AGAIN
	TAD	[0015		/CARRIAGE RETURN
	JMP	INTLP4

/HERE TO SIMULATE A HORIZONTAL TAB ON LPT
LPT011,	TAD	LPTCOL		/GET CURRENT COLUMN
	AND	(0007
	TAD	(-10
	DCA	LPTRCT		/REPETITION3777		/MASK FOR LASTAD	LPTCOL
	AND	(7770
	DCA	LPTCOL
	TAD	[0040		/SPACE
	DCA	LPTCHR
	TAD	(NOP
	DCA	LPTPIV
	JMP	INTLP3		/GO PRINT FIRST COPY

INTLP6,	ISZ	LPTRCT		/INCREMENT COUNT
	  JMP	INTLP3		/PRINT CHAR
	TAD	(SKP
	DCA	LPTPIV
	TAD	LPTOCH
	SNA
	  JMP	INTLP0+1
	DCA	LPTCHR
	DCA	LPTOCH
	JMP	INTLPA

/HERE ON HUNG LPT
LPTHN1,	ISZ	LPTPIV
	JMP	LPT015

LPTFLS,	DCA	LPTCCN		/HERE TO FLUSH CHARACTER
IFNZRO	CDRN	<
	TAD I	(CDRBLK+DEVSTS	/SEE IF CDR ACTIVE
	SMA CLA			/SKIP IF ACTIVE
>/END OF IFNZRO	CDRN
	  JMP	INTLP0+1	/DO NEXT CHARACTER
IFNZRO	CDRN	<
	JMP	LPTFIN		/TURN OFF LPT ACTIVE; TICKS
				/WILL START IT UP AGAIN
>/END OF IFNZRO	CDRN

	PAGE
>/END OF IFNZRO LPTN
	LISTOG	LPTN
	DEFINE	INSRT1	<
BADTYP,	NL1		/REASON CODE =1
	JMP	DISCON
TOOMNY,	JMS	GETEXN		/GET SLA
	DCA	TEMP2		/SAVE IT
	NL2			/REASON
DISCON,	DCA	TEMPA		/SAVE REASON
	TAD	DISREA		/GET CURRENT REASON
	SZA CLA			/CHECK IF WE'VE GOT DISCONNECT WAITING
/	  HLT			/TOO MANY TOO FAST
	  JMS I	[DMPTRP
	TAD	TEMP2		/PICK UP SLA
	DCA	DISSLA		/SAVE IT
	TAD	RSNA
	DCA	DISSNA
	TAD	TEMPA		/GET REASON
	DCA	DISREA		/STORE AND INDICATE THAT WE NEED TO SEND DISCONNECT
	JMP	RCVFLU		/GET RID OF MESSAGE

CONTYP,	NL0
	TAD	(NCOMSG-1
	JMP	CNTYP2
>/END OF DEFINE INSRT1

IFZERO	CDRN	<INSRT1>

IFZERO	LPTN	<PAGE>
	LISTOG	CDRN
IFNZRO CDRN <
/	***********************************************************
/	***********************************************************
/	***							***
/	***		CDR SERVICE				***
/	***							***
/	***********************************************************
/	***********************************************************

/DATA SENT TO DECSYSTEM-10 IS ESSENTIALY IMAGE MODE
/	IF BIT 100 IS ZERO THEN DATA IS LOW ORDER 6BITS OF TWO CHARS
/	IF BIT 100 IS SET THEN DATA IS COMPRESSED:
/	BITS 060 SPECIFIY ZONE PUNCH:
/		0 IS NO ZONE PUNCH
/		1 IS 12 PUNCH
/		2 IS 11 PUNCH
/		3 IS 0 PUNCH
/	BITS 17 SPECIFY COLUMN PUNCH:
/		0 IS NO PUNCH
/		1 IS 1 PUNCH
/		2 IS 2 PUNCH
/		ETC.
/	TRAILING BLANKS ARE NOT TRANSMITTED.
/	REPRESENTATION	MEANING
/	1CCCCCCC	CCCCCCC = SEVEN BIT ENCODED CHARACTER
/	01XXXXXX	XXXXXX =COUNT OF BLANKS
/	001XXXXX	XXXXX = COUNT OF REPETITIONS, 0-31
/	0000CCCC
/	CCCCCCCC	CCCCCCCCCCCC = TWELVE BIT ENCODED CHARACTER
/
/ DEVDDC	-	DDCMP STATUS WORD
/	0001	CARD READER ERROR(MASTER ERROR)
/	0002	HOPPER EMPTY
/	0004	REGISTRATION ERROR
/	0010	INVALID PUNCH
/	0020	STACKER FULL
/	0040	JAM WHILE FEEDING
/	0100	PICK FAILURE
/	0200	END OF FILE CARD
/	0400	HDW EOF
/	1000	CDR OVERRAN THE PROCESSOR
/	2000	CDR HAS GONE OFF LINE
/	4000	CDR STOPPED(MAY BE CLEARED WITH A SET MODE)
/
/ DEVICE BLOCK
/	DEVOLC IS USED TO COUNT COLUMNS OF CARD
/	DEVOAD IS ADR OF LAST NONBLANK CHAR
/	DEVSTS USES EOFBIT

/CDRCNK IS WORST CASE NUMBER OF CHUNKS/CARD
	Z=CNKSIZ-4;	IFZERO Z <CDRCNK=66>
	Z=CNKSIZ-10;	IFZERO Z <CDRCNK=27>
	Z=CNKSIZ-20;	IFZERO Z <CDRCNK=13>
	Z=CNKSIZ-40;	IFZERO Z <CDRCNK=6>
	Z=CNKSIZ-100;	IFZERO Z <CDRCNK=3>
	Z=CNKSIZ-200;	IFZERO Z <CDRCNK=2>
/HERE FOR A DATA READY INTERRUPT FROM CARD READER
ICDRD0,	CDRCRB			/READ CARD COLUMN
	DCA	INTMP5		/SAVE IT
	TAD I	(CDRBLK+DEVSTS	/GET STATUS WORD FOR THE CDR
	SMA CLA			/IS CARD READER ACTIVE ?
	  JMP	INTDIS		/NO - PROBABLY LOCAL MODE
	TAD I	(CDRBLK+DEVOLC	/GET COUNT OF COLUMNS READ SO FAR
	TAD	(-120		/COMPARE COLUMN TO 80
	SMA CLA			/WAS IT GT 80 ?
	  JMP	ICDRD5		/ONLY READ 80 COLUMNS !!
	TAD I	(CDRBLK+DEVOLC	/GET CARD COLUMN COUNTER
	SZA CLA			/IS THIS THE FIRST COLUMN ?
	  JMP	ICDC14
	TAD	INTMP5		/GET CHARACTER AGAIN
	DCA I	(CDRBLK+DEVIAD	/SAVE COLUMN ONE
	JMP	ICDC19
ICDC14,	TAD	INTMP5		/GET THE CHARACTER AGAIN
	NEGATE
	TAD	CDCCHR		/GET LAST CHAR READ
	SZA CLA			/IS THIS A REPETITION
	  JMP	ICDC18		/NO SO PUT PREVIOUS CHAR INTO CHUNKS
	TAD	CDCCNT		/GET COUNT OF REPETITIONS
	TAD	(-37
	SMA CLA			/HAVE WE DONE AS MANY AS POSSIBLE
ICDC18,	  JMS	ICDC30		/PUT PREVIOUS CHARS INTO CHUNKS
ICDC19,	TAD	INTMP5		/GET THIS COLUMN AGAIN
	DCA	CDCCHR		/SAVE IT
ICDC20,	ISZ	CDCCNT		/COUNT REPETITION
ICDRD5,	ISZ I	(CDRBLK+DEVOLC
	TAD I	(CDRBLK+DEVOLC
	TAD	(-120		/CHECK FOR THIS IS THE LAST COLUMN
	SNA CLA
	  JMS	ICDC30
	JMP	INTDIS

ICDC30,	0
	NLM1
	TAD	CDCCNT		/GET COUNT FOR COMPRESSION
	SNA			/DID WE HAVE ANY REPETITIONS ?
	  JMP	ICDC35		/NO JUST SEND THE CHAR
	TAD	(0041		/FLAG THIS IS A REPETION COUNT
	JMS	ICDRD6		/PUT COUNT INTO CHUNKS
ICDC35,	NL6000
	IAC CML RAR		/SET LINK & LOAD 7000
	AND	CDCCHR		/GET ROWS 12,11, & 0
	RTR
	RTR
	RAR			/POSITION BITS
	DCA	INTMP3		/AND SAVE FOR LATER USE
	TAD	CDCCHR		/GET THE CHAR AGAIN
	AND	(0017		/GET ROWS 6,7,8,9
	TAD	(CD2TAB
	DCA	INTMP2
	TAD	CDCCHR		/GET COLUMN AGAIN
	AND	(0760		/LEAVE ONLY ROWS 1/2/3/4/5
	RTR
	RTR
	TAD	(CD1TAB
	DCA	INTMP1
	TAD I	INTMP1
	TAD I	INTMP2
	TAD	INTMP3		/ADD ROWS 12/11/0
	SMA SNL			/CAN THE CHAR BE COMPRESSED ?
	  JMP	ICDC39		/PUT CHAR INTO CHUNKS
	NL6000			/BEGIN TO ASSEMBLE MASK
	CLL CML IAC RTR		/LEAVES 7400 IN AC
	AND	CDCCHR		/GET THE CHARACTER AGAIN
	RTL
	RTL
	RAL
	JMS	ICDRD6		/PUT HALF OF CHAR INTO THE CHUNKS
	NL3777			/MASK TO STRIP SIGN BIT
	AND	CDCCHR
ICDC39,	JMS	ICDRD6		/PUT REST OF COLUMN INTO CHUNKS
	DCA	CDCCNT		/INITIALIZE THE COUNT
	JMP I	ICDC30
/HERE TO PUT A CHAR INTO THE CHUNK BUFFER
ICDRD6,	0
	DCA	INTMP2		/SAVE CHAR
	NL1
	TAD	CDRADR
	AND	[CNKSIZ-1
	SZA CLA			/HAVE WE HIT A CHUNK BOUNDRY ?
	  JMP	ICDRD7		/NO
	NL4000
	TAD I	CDRADR
	DCA I	CDRADR		/FLAG LAST CHAR IN CHUNK
	TAD	CDRADR
	AND	[-CNKSIZ
	DCA	CDRADR		/MAKE POINTER TO LINK WORD
	JMS	ERSGET		/GET ANOTHER CHUNK FROM ERS
	DCA I	CDRADR
	TAD	INTMP1
	DCA	CDRADR		/LINK CHUNK INTO STRING

ICDRD7,	ISZ	CDRADR		/ADVANCE BUFFER POINTER
	TAD	INTMP2		/GET CHAR AGAIN
	DCA I	CDRADR		/SAVE CHAR IN BUFFER
	ISZ I	CDREXT		/COUNT CHAR INTO CHUNKS
	JMP I	ICDRD6		/RETURN TO CALLER
/HERE TO CHECK FOR LOW PRIORITY CARD READER INTERRUPTS
INTCDR,	CDRSD			/SKIP ON CARD DONE FLAG
	  JMP	INTCD9		/NO TRY NEXT DEVICE
	CDRCRD			/CLEAR DONE FLAG
	TAD I	(CDRBLK+DEVSTS
	SMA CLA			/IS READER SUPPOSED TO BE ACTIVE ?
	  JMP	INTDIS		/NO SO JUST DISMISS
	TAD I	(CDRBLK+DEVOLC	/GET COUNT OF COLUMNS ON CARD
	TAD	(-120		/SHOULD BE 80 DECIMAL
	SZA CLA			/IS IT ?
	  JMP	INTCD2		/NO

	NL4000			/FLAG FOR LAST CHAR IN CHUNK
	TAD I	CDRADR		/GET LAST CHAR IN CARD
	DCA I	CDRADR		/SAVE IT WITH FLAG
	TAD	(0200
	AND I	CDREXT		/GET COUNT FOR BUFFER
	JMP	INTCD4

	PAGE
INTCD4,	SNA CLA
	  JMP	INTCD1
	ISZ	CDREXT
	NL1
	SKP
INTCD1,	TAD	(0200
	TAD I	CDREXT
	DCA I	CDREXT
	TAD I	(CDRBLK+DEVIAD	/GET COLUMN 1
	TAD	(-7417		/COMPARE WITH EOF
	SZA CLA
	  JMP	INTCD0		/WASN'T EOF SO CONTINUE
	TAD	(CDRBLK		/ADR OF DEVICE BLOCK
	DCA	INTDDB
	TAD	(4200		/FLAG CDR HAS STOPPED AND READ EOF
	JMS	ISBDDC		/TELL 10 WE SAW IT AND STOPPED
INTCD0,

	JMP	INTCD3

INTCD3,	JMS	INTCD5		/TRY SEND CARD TO 10
	JMS	STCARD		/TRY TO KEEP CDR MOVING
	JMP	INTDIS		/DISMISS INTERRUPT

INTCD2,	TAD	(RCKMSG-1
	DCA	ERRFLG		/COMPLAIN ABOUT CARD
	JMP	INTDIS		/ DEVICE WILL TIME OUT AND USER WILL GET MESSAGE FROM 10
/HERE TO TRY TO SEND CARD TO 10
INTCD5,	0


	TAD I	(CDRBLK+DEVBF2
	SZA CLA
	  JMP I	INTCD5
	TAD	CDRNXT
	DCA I	(CDRBLK+DEVBF2
	DCA	CDRNXT
	NLM1			/DECREMENT DATA REQUESTS
	TAD I	(CDRBLK+DEVDRQ
	DCA I	(CDRBLK+DEVDRQ
	JMP I	INTCD5
/HERE ONCE PER CLOCK TICK TO CHECK THE CARDREADER
/ IF ACTIVE SEE IF IT HAS TIMED OUT(PICK FAIL ?)
/ IF NOT ACTIVE TRY TO START IT
CLKCDR,	IOF			/LEAVE INTERRUPTS OFF FOR A WHILE
	TAD	(CDRBLK		/IN CASE WE CALL ISTDDC, ETC.
	DCA	INTDDB
	TAD I	(CDRBLK+DEVBF1	/GET ADR OF 1ST CARD
	SZA CLA
	  JMP	CLKCD2
	TAD I	(CDRBLK+DEVBF2
	DCA I	(CDRBLK+DEVBF1
	DCA I	(CDRBLK+DEVBF2
CLKCD2,	TAD I	(CDRBLK+DEVSTS	/GET DEVICE STATUS
	SPA CLA			/TEST FOR ACTIVE
	  JMP	CLKCD5		/IS ACTIVE
	NL1
	AND I	(CDRBLK+DEVDDC
	SZA CLA			/IS TROUBLE BIT UP ?
	  JMP	CLKCD4		/YES SO CHECK IT
	TAD I	(CDRBLK+DEVDRQ
	SNA CLA			/DO WE HAVE ANY DATA REQUESTS ?
	  JMP	CLKCD8		/NONE SO DONE
	TAD	CDRNXT
	SZA CLA
	  JMS	INTCD5		/IF HOLDING DUMP
	NL4000			/ACTIVE FLAG
	TAD I	(CDRBLK+DEVSTS
	DCA I	(CDRBLK+DEVSTS	/FLAG ACTIVE
	JMS	STCARD		/TRY TO MOVE A CARD
CLKCD8,	ION
	NL0
	JMP	CLKCD9		/DONE FOR THIS TICK

CLKCD4,	ISZ I	(CDRBLK+DEVTIM	/SEE IF WE HAVE WAITED A WHILE
	  JMP	CLKCD8		/NO LONG ENOUGH YET
	NL4000			/JUST STOP BIT
	JMS	ISTDDC		/SET NEW DEVICE STATUS
	JMP	CLKCD8

/HERE AT ONCE PER TICK IF CDR IS ACTIVE
CLKCD5,	ISZ I	(CDRBLK+DEVTIM	/INCREMENT TIMER
	  JMP	CLKCD8		/HASN'T TIMED OUT SO WE ARE DONE

/CDR HAS TIMED OUT = PICK FAILURE
	JMS	CLRACT		/CLEAR DEVICE ACTIVE
	TAD	(4101		/CDR STOPPED & PICK CHECK
	JMS	ISBDDC		/SET DDCMP STATUS
	NL6000			/THIS IS ABOUT 17 SECONDS(60HZ)
	DCA I	(CDRBLK+DEVTIM	/SET TIMER
	TAD	CDRNXT		/GET ADR OF CARD WE WERE TRYING TO READ
	JMS	FRECKS		/FREE CHUNKS
	DCA	CDRNXT		/FREE CURRENT BUFFER(& ION)
	JMP	CLKCD9		/ON TO NEXT DEVICE
	INSRT1

	PAGE
/HERE TO START CARD MOVING
STCARD,	0
	NLOAD	STSBIT		/MASK FOR HAVE TO SEND STS
	AND I	(CDRBLK+DEVSTS	/GET CURRENT STATUS BITS
	SZA CLA			/CHECK FOR EOF OR NEED TO SEND STATUS
	  JMP	STCDR8		/STSBIT MUST BE CLEARED BEFORE READING
	TAD I	(CDRBLK+DEVDDC	/GET DDCMP STATUS
	SPA CLA			/TEST FOR CDR STOPPED BIT
	  JMP	STCDR8		/HAS STOPPED
	TAD I	(CDRBLK+DEVDRQ	/GET DATA REQUESTS
	SNA CLA
	  JMP	STCDR8		/NO DATA REQUESTS SO DON'T MOVE CARDS
	TAD I	(CDRBLK+DEVBF2
	SNA CLA			/CHECK TO SEE IF HOLDING
	JMS	IGTCNK		/GET FIRST CHUNK TO STORE CARD IN
	  JMP	STCDR8		/HOLDING OR OUT OF CORE
	DCA	CDRNXT
	TAD	CDRNXT		/GET ADR OF LINK WORD
	IAC			/MAKES ADR OF COUNT FIELD
	DCA	CDREXT		/SAVE ADR OF COUNT FIELD(LOW ORDER)
	DCA I	CDREXT		/CLEAR COUNT(LOW ORDER)
	TAD	CDREXT
	IAC			/MAKES ADR OF COUNT FIELD(HIGH ORDER)
	DCA	CDRADR		/SAVE ADR
	DCA I	CDRADR		/CLEAR HIGH ORDER COUNT
	TAD	(2		/DATA WITH EOR
	JMS	ICDRD6		/PUT CODE INTO CHUNKS
	DCA	CDCCNT		/HAVE READ NO CHARS YET
	TAD I	(CDRBLK+DEVDDC	/GET DEVICE STATUS BITS
	AND	(7177		/TURN OFF BOTH EOF BITS
	DCA I	(CDRBLK+DEVDDC	/STASH BACK
	CDRCSE
	NOP			/START CARD READER
	TAD	(-200
	DCA I	(CDRBLK+DEVTIM	/TWO SECOND TIMEOUT
	DCA I	(CDRBLK+DEVOLC	/INITIALIZE COLUMN COUNTER
	JMP I	STCARD
STCDR8,	NL3777			/MASK TO CLEAR ACTIVE
	AND I	(CDRBLK+DEVSTS
	DCA I	(CDRBLK+DEVSTS	/CLEAR ACTIVE
	JMP I	STCARD

>/END OF IFNZRO CDRN
	LISTOG	CDRN
	LISTOG	PTRN
IFNZRO PTRN <
/	***********************************************************
/	***********************************************************
/	***							***
/	***		PTR SERVICE				***
/	***							***
/	***********************************************************
/	***********************************************************

PTRCNT,	0			/COUNT OF CHARS

/HERE AT INTERRUPT LEVEL WHEN PTR INTERRUPTS
INTPTR,	PTRSF			/SKIP ON PTR FLAG
	  JMP	INTPR9		/NOT PTR CHECK NEXT DEVICE
	PTRRB			/GET FRAME FROM PTR AND CLEAR FLAG
	DCA	INTMP5		/SAVE CHAR
	TAD	(PTRBLK		/ADDRESS OF DEVICE BLOCK
	JMS	IACTCK		/CHECK DEVICE SHOULD BE ACTIVE
				/ IF NOT DON'T RETURN

	TAD	INTMP5		/GET CHAR AGAIN
	JMS	IPUTCH		/PUT CHAR INTO THE CHUNKS
	NLOAD	-1
	TAD I	(PTRBLK+DEVDRQ	/UPDATE DATA REQUEST COUNT
	DCA I	(PTRBLK+DEVDRQ	/AND SAVE NEW COUNT
	ISZ	PTRCNT		/COUNT CHAR IN CURRENT BUFFER
	TAD	PTRCNT		/GET CHAR COUNT
	TAD	(-240
	SMA CLA
	  JMP	INTPR5		/BRANCH IF HAVE ENOUGH
	JMS	PTRMOV		/MOVE TAPE AGAIN
	JMP	INTDIS

INTPR5,	JMS	INTPR7		/QUEUE DATA TO 10
	JMP	INTDIS

/HERE TO SEND PTR DATA TO 10
INTPR7,	0
	TAD	PTRCNT
	SNA CLA
	  JMP I	INTPR7		/IF NO DATA DONE
	JMS	CLRACT		/CLEAR DEVICE ACTIVE
	TAD I	(PTRBLK+DEVBF2
	DCA I	(PTRBLK+DEVBF1
	DCA I	(PTRBLK+DEVBF2
	JMP I	INTPR7
/HERE ONCE PER CLOCK TICK TO CHECK PTR

CLKPTR,	IFZERO PDP8E <
	PTRPE			/REENABLE PTR/PTP INTS
>/END OF IFZERO PDP8E
	TAD	(PTRBLK		/PREPARE
	IOF
	DCA	INTDDB		/FOR VARIOUS SUBROUTINES
	TAD I	(PTRBLK+DEVSTS	/GET CURRENT STATUS
	SMA CLA			/IS DEVICE ACTIVE ?
	  JMP	STRPTR		/NO YET - TRY TO START IT
	ISZ I	(PTRBLK+DEVTIM	/HAS DEVICE TIMED OUT ?
	  JMP	CLKPR8		/NO
	JMS	INTPR7		/QUEUE DATA TO 10
	TAD I	(PTRBLK+DEVSTS
	TAD	(4001		/SET EOF & CLRACT
	DCA I	(PTRBLK+DEVSTS
CLKPR8,	ION
	JMP	CLKPR9

/HERE TO PERHAPS START PTR MOVING
STRPTR,
	TAD I	(PTRBLK+DEVDRQ	/GET DATA REQUEST COUNT
	SNA CLA
	  JMP	CLKPR8		/NONE SO DON'T START PTR
	DCA	PTRCNT		/HAVE READ NOTHING YET
	NLOAD	4000		/FLAG DEVICE IS ACTIVE
	TAD I	(PTRBLK+DEVSTS
	DCA I	(PTRBLK+DEVSTS
	JMS	PTRMOV		/START TAPE MOVING
	JMP	CLKPR8
/SUBROUTINE TO MOVE THE TAPE
/ IF THERE AREN'T ENOUGH CHUNKS LEFT STOP READER
/ AND SEND WHAT WE HAVE SO FAR
PTRMOV,	0
	TAD	FRECNT
	TAD	(-ERSCNT
	SPA CLA			/SKIP IF HAVE CORE
	JMP	PRMOV3
	PTRFC			/START TAPE MOVING
	TAD	(-100
	DCA I	(PTRBLK+DEVTIM	/RESET TIMER
	JMP I	PTRMOV
PRMOV3,	JMS	CLRACT		/CLEAR DEVICE ACTIVE FLAG
	JMS	INTPR7		/SEND DATA TO 10
	JMP I	PTRMOV

	PAGE
>/END OF IFNZRO PTRN
	LISTOG	PTRN
	LISTOG	PTPN
IFNZRO PTPN <
/	***********************************************************
/	***********************************************************
/	***							***
/	***		PTP SERVICE				***
/	***							***
/	***********************************************************
/	***********************************************************

PTPCNT,	0			/COUNTER FOR HEADER & TRAILER

/HERE AT INTERRUPT LEVEL TO CHECK FOR PTP INTERRUPTS
INTPTP,	PTPSF			/SKIP ON PTP FLAG
	  JMP	INTPP9		/NOT PTP SO CHECK NEXT DEVICE
	JMS	INTPP0
	JMP	INTDIS
INTPP0,	0
	TAD	PTPCNT
	SZA CLA			/DO WE NEED HEADER/TRAILER ?
	  JMP	INTPP5		/YES
	TAD	(PTPBLK
	DCA	INTDDB
	JMS	IGTOCH		/GET NEXT CHAR IF ANY
	  JMP	PTPFIN		/NONE
	CLL			/CLEAR LINK
	TAD	(2000
	SZL
	  JMP	INTPP7		/THIS IS REALLY AN OPEN !
INTPP1,	PTPLS			/PUNCH CHAR
	NLM3			/FOR TIMEOUT
	DCA I	(PTPBLK+DEVTIM
	JMP I	INTPP0
INTPP5,	ISZ	PTPCNT
	JMP	INTPP1		/GO PUNCH A 0
	JMP	INTPP1		/ DITTO
INTPP7,	NL0
	TAD	(-200		/THIS IS APP TWO FOLDS OF TAPE
	DCA	PTPCNT
	JMP	INTPP1		/GO PUNCH 1ST PART OF HEADER/TRAILER
/HERE WHEN DATA FOR PTP IS EXHAUSTED
PTPFIN,	PTPCF			/CLEAR ANY FLAGS
	JMS	CLRACT		/MARK DEVICE AS NOT ACTIVE
	JMP	INTDIS

CLKPTP,	IFZERO PTRN <
	IFZERO PDP8E <
	PTRPE			/REENABLE READER/PUNCH INTERRUPTS
>/END OF IFZERO PDP8E
>/END OF IFZERO PTRN
	TAD I	(PTPBLK+DEVSTS
	SMA CLA			/IS PTP ACTIVE ?
	  JMP	STRPTP		/NO SO TRY TO START IT
	ISZ I	(PTPBLK+DEVTIM	/YES - IS THIS TIMEOUT ?
	JMP	CLKPP9		/NO
IFNZRO FTTRBL <
	TAD	(PTPMSG-1
	DCA	ERRFLG		/LEAVE MSG FOR OPERATOR
>/END OF IFNZRO FTTRBL
	JMP	CLKPP9

STRPTP,	TAD I	(PTPBLK+DEVOCN
	SNA CLA
	  JMP	CLKPP9		/NOTHING TO DO SO GO TO NEXT DEVICE
	NL4000
	IOF
	TAD I	(PTPBLK+DEVSTS
	DCA I	(PTPBLK+DEVSTS
	JMS	INTPP0
	ION
	JMP	CLKPP9

/	PAGE
>/END OF IFNZRO PTPN
	LISTOG	PTPN
	LISTOG	PLTN
IFNZRO PLTN <
/	***********************************************************
/	***********************************************************
/	***							***
/	***		PLT SERVICE				***
/	***							***
/	***********************************************************
/	***********************************************************


/DATA FOR THE PLT COMES IN 10 FORMAT - I.E. 6 BIT BYTES AS FOLLOWS:
/	0040	PEN UP
/	0020	PEN DOWN
/	0010	DRUM UP
/	0004	DRUM DOWN
/	0002	PEN LEFT
/	0001	PEN RIGHT

/HERE AT INTERRUPT LEVEL TO CHECK FOR PLT INTERRUPTS
INTPLT,	PLTSKF			/SKIP ON PLOTTER FLAG
	  JMP	INTPL9		/CHECK NEXT DEVICE
INTPL0,	TAD	(PLTBLK
	DCA	INTDDB
	JMS	IGTOCH		/GET NEXT CHAR IF ANY
	  JMP	PLTFIN		/NONE
/	PLOT HERE
	JMP	INTDIS
PLTFIN,	PLTCLF			/CLEAR ANY FLAGS
	JMS	CLRACT		/MARK DEVICE AS NOT ACTIVE
	JMP	INTDIS


CLKPLT,	TAD I	(PLTBLK+DEVSTS
	SMA CLA			/IS PLT ACTIVE ?
	  JMP	CLKPL2		/NO TRY TO START IT
	ISZ I	(PLTBLK+DEVTIM	/YES - IS THIS TIMEOUT ?
	JMP	CLKPL9		/NO
	JMP	CLKPL9

CLKPL2,	JMP	CLKPL9		/CAN'T START PLT

/	PAGE
>/END OF IFNZRO PLTN
	LISTOG	PLTN
/	***********************************************************
/	***********************************************************
/	***							***
/	***		CLOCK SERVICE				***
/	***							***
/	***********************************************************
/	***********************************************************

/HERE AT INTERRUPT LEVEL WHEN CLOCK GOES OFF

/TEST FOR CLK INTERRUPTS
INTCLK,	CLKSCF			/DID CLOCK GO OFF?
	  JMP	INTCL9		/NOT CLOCK SO CHECK NEXT DEVICE

IFZERO PDP8E <
	NL1			/IGNORE EVERY OTHER TICK
	AND	JIFSEC+1
	SZA CLA
	  JMP	INTCK4
>/END OF IFZERO PDP8E

	ISZ	CLKFLG		/FLAG FOR NONINTERRUPT LEVEL CODE
	SKP
	  HLT			/WENT A MINUTE WITHOUT FINDING CLOCK FLAG ??
	NLM1
	DCA	WRKREQ		/SO WE FIND CLOCK FLAG
	TAD	JIFSEC+1
IFZERO PDP8I <	AND	(0077	>
IFZERO PDP8E <	AND	(0176	>
	SZA CLA
	  JMP	INTCK4
	ISZ	SECFLG		/FLAG TIME FOR 64TH TICK CODE(APP. 1 / SEC)

	IFNZRO FTDEBUG <
	NLM1
	JMS	TRACEW		/PUT WORD INTO THE TRACE
>/END OF IFNZRO FTDEBUG

INTCK4,	ISZ	JIFSEC+1
	  JMP	INTDIS
	ISZ	JIFSEC
	  JMP	INTDIS
	JMP	INTDIS
JIFSEC,	ZBLOCK	2		/TICKED ONCE PER JIFFY


IFZERO FTDP01 <
/7720 THROUGH 7731 INCLUSIVE ARE USED BY DP8E
ZZ=.&4000
IFNZRO ZZ <
ZZ=7720-.
ZZ=ZZ&4000
IFNZRO ZZ <
	ERROR		/CODE OVERLAPS DP8E HARDWARE ADDRESSES
>/END OF IFNZRO ZZ

*7732		/SKIP DP8E ADDRESSES

>/END OF IFNZRO ZZ
>/END OF IFZERO FTDP01

/TEST FOR PARITY INTERRUPTS
INTMEM,	MEMSMP MEMCMP		/DID WE WIN A MEMORY PARITY ERROR
MEMTST,	  MEMSPO		/ MAYBE - DO WE HAVE THE OPTION ?
	  JMP	INTNOT		/DON'T HAVE OPTION OR NO ERROR
	HLT			/HAVE MEMORY PARITY ERROR SO HALT

/HERE IF GOT INTERRUPT WHICH WE CAN'T DETECT
INTNOT,	ISZ	INTCNT		/COUNT UNKNOWN DEVICE INTERRUPTED
	  JMP	INTDIS		/DISMISS INTERRUPT
	TAD	(INTMSG-1	/ "INT ERR"
	JMS	CTYEXC		/TELL OPR
	HLT

RCVLP6,	NLOAD	DEVCHK		/DISPLACEMENT OF CHUNK COUNT
	TAD	DDB
	DCA	TEMPA		/SAVE ADR OF DDB CHUNK COUNT
	NLM1
	TAD	TEMP5
	DCA	TEMPB		/SAVE ADR OF MSG'S CHUNK COUNT
	TAD I	TEMPB		/NO OF CHUNKS IN THIS MESSAGE
	TAD I	TEMPA		/PLUS PREVIOUS
	DCA I	TEMPA		/STORE BACK
	ION
	JMP	RCVADV		/FORGET MESSAGE BUT NOT CHUNKS
	PAGE
IFNZRO CNKFLD <

FIELD	CNKFLD

DEFINE HLT <7402>

CHK1=1
CHK2=2
CHK3=3
CHK4=4
CHK5=5
CHK6=6
CHK7=7
CHAUTO=17
*20
>/END OF IFNZRO CNKFLD
/NODEID MESSAGE
NCLNID,	BLOCK	100

/PER CONNECTION TABLES
CTRLTB,	BLOCK	DEVN

RCVDSP,	BLOCK	1
	BLOCK	DEVN

/	THESE TABLES MUST FOLLOW AND BE SAME LENGTH
/ AS RCVDSP.

SLATAB,
	BLOCK	DEVN
MMLTAB,
	BLOCK	DEVN
SNATAB,		/SOURCE NODE
	BLOCK	DEVN


ZZ=CTRLTB
ZZ=RCVDSP
ZZ=SLATAB
ZZ=MMLTAB
ZZ=SNATAB

/	OUTPUT MESSAGE BUFFERS

CTLSIZ=12		/DDCMP HEADER (8) + CHUNK COUNT (1) + CHUNK POINTER
SYNCHS,	BLOCK	20	/WHERE SYN BUF WILL GO
SYNBUF=.-NUMSYN
IDLBUF=SYNBUF		/NO SPECIAL BUFFER FOR IDLE MODE

CTLBUF,	BLOCK	10
	Z=4+MAXOLN+6
	T10LEN=12+MAXOLN
T10BF1,	BLOCK	Z
T10BF2,	BLOCK	Z
T10LST,	BLOCK	Z

ZZ=T10BF1
ZZ=T10BF2
ZZ=T10LST

/QUEUE OF MESSAGES FROM DECSYSTEM-10 WHICH HAVEN'T BEEN LOOKED AT YET

RCVQUE,
ZZ=CTLSIZ^10
	BLOCK	ZZ
RCVLIM,
	ZZ=RCVQUE
	ZZ=RCVLIM
/STORAGE FOR TTY'S

/QUEUE OF INPUT FROM TTY'S
/ FIRST WORD IS LINE #
/ SECOND IS 8BIT CHAR
IFNDEF TIQLEN <TIQLEN=100>
TTIQUE,	BLOCK	TIQLEN
	Z=.-BOOTSZ		/BOOTSZ IS FIRST ADDR AFTER BOOT
	ZZ=Z&4000		/SIGN OF DIFFERENCE
	IFNZRO	ZZ	<*BOOTSZ>
/MACRO TO MAKE A DEVICE BLOCK FOR A TTY
/ 1ST ARG IS DEVICE BLOCK LABEL
/ 2ND ARG IS DEVICE ADR FOR DC02 TTY'S
/ 3RD ARG IS DEVICE ADR FOR KL8E TTY'S
/ 4TH ARG IS NONZERO IF TTY HAS HDW TABS
/ 5TH ARG IS TTY CARRIAGE WIDTH
/ 6TH ARG IS TTY FILLER CLASS
/ 7TH ARG IS RESTRICTED NODE NUMBER
DEFINE TTBLK NAME Q QQ QQQ QQQQ QQQQQ QQQQQQ <XLIST
	IFNZRO	FTDC02F	<ZZ=Q>
	IFZERO	FTDC02F	<ZZ=QQ+5>
	TTYCNT=TTYCNT+1
	XLIST
	-QQQQQQ			/DEVRNN
	TTYCHK
	TTYCNT-1
NAME,	100		/LH=OBJ TYPE,RH=CONNECT
	XLIST
	*.+DEVLNK-1
	XLIST
	FIRTTY		/ADR OF PREVIOUS DEVICE BLOCK
	XLIST
	FIRTTY=.-DEVLNK-1
	FIRDDB=FIRTTY
	XLIST
	ZZ		/DEVICE ADDRESS
	XLIST
	ZZZ=ZZZ+1
		*.+1		/SKIP LDBCOL
	IFNDEF QQQQ < QQQQ=110	>		/DEFAULT WIDTH IS 72
		XLIST
	QQQQ		/TTY WIDTH
		XLIST
		ZZ=LDBFIL-1-LDBWID
		*.+ZZ
	-10	/FILLER FOR 10
	-10	/FILLER FOR 11
	-10	/FILLER FOR 12
	-10	/FILLER FOR 13
	-10	/FILLER FOR 14
	-10	/FILLER FOR 15
	Z=Z-1
	IFNZRO Z <
XLIST	>/END OF IFNZRO Z
>/END OF TTBLK

	ZZZ=200		/DEVICE NUMBER FOR CTY
			FIRTTY=0	

	Z=TTYN+1
/DEVICE DATA BLOCK FOR CTY
	TTYCNT=0
	TTBLK	CTYBLK,0,0,CTYTAB,CTYWID,CTYFIL,CTYRNN

IFNZRO Z <	TTBLK	T00BLK,4010,T00TSF,T00TAB,T00WID,T00FIL,T00RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T01BLK,2010,T01TSF,T01TAB,T01WID,T01FIL,T01RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T02BLK,1010,T02TSF,T02TAB,T02WID,T02FIL,T02RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T03BLK,0410,T03TSF,T03TAB,T03WID,T03FIL,T03RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T04BLK,0210,T04TSF,T04TAB,T04WID,T04FIL,T04RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T05BLK,0110,T05TSF,T05TAB,T05WID,T05FIL,T05RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T06BLK,0050,T06TSF,T06TAB,T06WID,T06FIL,T06RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T07BLK,0030,T07TSF,T07TAB,T07WID,T07FIL,T07RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T10BLK,4004,T10TSF,T10TAB,T10WID,T10FIL,T10RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T11BLK,2004,T11TSF,T11TAB,T11WID,T11FIL,T11RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T12BLK,1004,T12TSF,T12TAB,T12WID,T12FIL,T12RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T13BLK,0404,T13TSF,T13TAB,T13WID,T13FIL,T13RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T14BLK,0204,T14TSF,T14TAB,T14WID,T14FIL,T14RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T15BLK,0104,T15TSF,T15TAB,T15WID,T15FIL,T15RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T16BLK,0044,T16TSF,T16TAB,T16WID,T16FIL,T16RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T17BLK,0024,T17TSF,T17TAB,T17WID,T17FIL,T17RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T20BLK,4002,0,T20TAB,T20WID,T20FIL,T20RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T21BLK,2002,0,T21TAB,T21WID,T21FIL,T21RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T22BLK,1002,0,T22TAB,T22WID,T22FIL,T22RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T23BLK,0402,0,T23TAB,T23WID,T23FIL,T23RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T24BLK,0202,0,T24TAB,T24WID,T24FIL,T24RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T25BLK,0102,0,T25TAB,T25WID,T25FIL,T25RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T26BLK,0042,0,T26TAB,T26WID,T26FIL,T26RNN
 >/END OF IFNZRO Z
IFNZRO Z <	TTBLK	T27BLK,0022,0,T27TAB,T27WID,T27FIL,T27RNN
 >/END OF IFNZRO Z
IFZERO Z <	XLIST	>

TTYFEA,	2		/NUMBER OF CHARS IN FEATURES
	0		/NOTHING FANCY
	TTYN+1		/NUMBER OF LINES
/ MACRO TO MAKE DEVICE BLOCK FOR NON-TELETYPE DEVICES
/ 1ST ARGUMENT IS DDB LABEL NAME
/ 2ND ARGUMENT IS DEVICE TYPE CODE
/ 3RD ARGUMENT IS RESTRICTED NODE NUMBER
DEFINE DBLOCK NAME Q QQ <XLIST
	XLIST
	ZZ=-1			/DEFAULT
IFNZRO	LPTN	<
	IFZERO	.+2-LPTBLK <ZZ=LPTCHK>/IF LPT, USE LPT VALUE
>/END OF IFNZRO	LPTN
	DEVCNT=DEVCNT+1
	XLIST
	-QQ			/DEVRNN
	ZZ			/MAX CHUNKS
	DEVCNT-1
NAME,	Q^100
	XLIST
	Z=DEVLNK-1
	*.+Z
	XLIST
	FIRDDB		/ADR OF PREVIOUS DEVICE BLOCK
	XLIST
	FIRDDB=.-DEVLNK-1
	XLIST	>/END OF DEFINE DBLOCK


IFNZRO CDRN <
/DEVICE DATA BLOCK FOR CDR
	DEVCNT=0
	DBLOCK	CDRBLK,2,CDRRNN
	3		/LENGTH OF FEATURES
	1		/DECIMAGE
	120		/COLUMNS/CARD=80
	1		/LOW SPEED
>/END OF IFNZRO CDRN

IFNZRO LPTN <
/DEVICE DATA BLOCK FOR LPT
/ SPECIAL DEVSTS BITS:
/	LOW ORDER BIT IS A COUNT OF OPENS EXERCISED
	DEVCNT=0
	DBLOCK	LPTBLK,3,LPTRNN
	Z=LPTWID&7200
IFNZRO Z <	5	>		/LENGTH OF FEATURES
IFZERO Z <	4	>		/LENGTH OF FEATURES
IFZERO FTLPLC <	10	>		/ANSI 68
IFNZRO FTLPLC <	12	>		/ANSI 68, LOWER CASE
IFZERO Z <	LPTWID	>		/CARRIAGE WIDTH
IFNZRO Z <	Z=LPTWID&177;	200+Z;	1>		/CARRIAGE WIDTH

	305		/OVERPRINT, MULTIPART PAPER, LOWSPEED
	4		/FORMS WIDTH CHANGEABLE,
>/END OF IFNZRO LPTN

IFNZRO PTRN <
/DEVICE DATA BLOCK FOR PTR
	DEVCNT=0
	DBLOCK	PTRBLK,6,PTRRNN
	1;	0		/FEATURES
>/END OF IFNZRO PTRN

IFNZRO PTPN <
/DEVICE DATA BLOCK FOR PTP
	DEVCNT=0
	DBLOCK	PTPBLK,5,PTPRNN
	1;	0		/FEATURES
>/END OF IFNZRO PTPN

IFNZRO PLTN <
/DEVICE DATA BLOCK FOR PLT
	DEVCNT=0
	DBLOCK	PLTBLK,20,PLTRNN
	1;	0		/FEATURES
>/END OF IFNZRO PLTN
DEFINE X Q <IFDEF Q <	Q	>>

/TABLE OF DDB ADDRESSES
DDBTAB,
	X	CTYBLK
	X	T00BLK
	X	T01BLK
	X	T02BLK
	X	T03BLK
	X	T04BLK
	X	T05BLK
	X	T06BLK
	X	T07BLK
	X	T10BLK
	X	T11BLK
	X	T12BLK
	X	T13BLK
	X	T14BLK
	X	T15BLK
	X	T16BLK
	X	T17BLK
	X	T20BLK
	X	T21BLK
	X	T22BLK
	X	T23BLK
	X	T24BLK
	X	T25BLK
	X	T26BLK
	X	T27BLK
  IFDEF CDRBLK <	CDRBLK>
  IFDEF LPTBLK <	LPTBLK>
  IFDEF PTRBLK <	PTRBLK>
  IFDEF PTPBLK <	PTPBLK>
  IFDEF PLTBLK <	PLTBLK>
/STRINGS PUT OUT BY SCNSER

XOFMSG,	0223		/XOF = ^S
	4377		/FILLER (WITHOUT REGARD FOR RACE CREED OR CLASS)

TTOSPC,	" 		/BLANK
	" 		/BLANK
	" 		/BLANK
	" 		/BLANK
	" 		/BLANK
	" 		/BLANK
	" 		/BLANK
	4000+" 		/FINAL BLANK

CRLMSG,	0215		/CARRIAGE RETURN
	4012		/LINE FEED

DEFINE DC7MSG <	XLIST
		0104		/ASCII "D"
		0303		/ASCII "C"
		0267		/ASCII "7"
IFZERO PDP8I <	0261 >		/ASCII "1"
IFZERO PDP8E <	0262 >		/ASCII "2"
		0116		/ASCII "N"
		0120		/ASCII "P"
	XLIST>/END OF DEFINE DC7MSG

DEFINE DPMSG <	XLIST
		0104		/ASCII "D"
		0120		/ASCII "P"
IFNZRO FTDP01 <	0060		/ASCII "0"
		0261 		/ASCII "1"
>/END OF IFNZRO	FTDP01
IFZERO FTDP01 <	0270		/ASCII "8"
		0305 		/ASCII "E"
>/END OF IFZERO	FTDP01
	0040
	XLIST>/END OF DEFINE DPMSG

DEFINE	BEGMSG <	XLIST
		0215		/CARRIAGE RETURN
		0215		/ EXTRA CR FOR FILLER
		0012		/LINE FEED
		0207		/BELL
		0207		/BELL
		0245		/ASCII "%"
		0245		/ASCII "%"
	XLIST	>/END OF DEFINE BEGMSG

/COMMON MESSAGE BEGINNER FOR FATAL MESSAGES
DEFINE	FATMSG <	XLIST
		0215		/CARRIAGE RETURN
		0215		/ EXTRA CR FOR FILLER
		0012		/LINE FEED
		0207		/BELL
		0207		/BELL
		0077		/ASCII "?"
		0077		/ASCII "?"
	XLIST	>/END OF DEFINE FATMSG
/MESSAGE SENT WHEN STATION RESTARTS
RSTMSG,	377
	0012		/EXTRA LINE FEED
	207		/EXTRA BELL
	0012		/EXTRA LINE FEED
	BEGMSG
	"R
	0145		/E
	0363		/S
	0164		/T
	0341		/A
	0162		/R
	0164		/T
	0151		/I
	0356		/N
	0347		/G
	" 		/BLANK
	DC7MSG
	" 		/BLANK
	0116		/N
	0117		/O
	0104		/D
	0105		/E
	" 		/BLANK
	0042		/"
OURID,
IFDEF DC72ID <
	DC72ID
>/END OF IFDEF DC72ID
IFNDEF	DC72ID	<
	"D;"C;"7;PDP8+260;"N;"P
>/END OF IFNDEF	DC72ID
	0042		/"
	240		/SPACE
	215
	012
TTOBEL,	4207		/BELL
NCOMSG,	BEGMSG
	"T;"T;"Y;" ;"N;"O;"T;" ;"C;"O;"N;"N;"E;"C;"T;"E;"D;215;4012

/MESSAGE WHEN GET CHAR FROM TTY KEYBOARD AND STATION NOT IN CONTACT
NICMSG,	FATMSG
	"N;"O;"T;" ;"I;"N;" ;"C;"O;"N;"T;"A;"C;4000+"T

/MESSAGE FOR CTY WHEN MAKE CONTACT
CONMSG,	BEGMSG
TENID,	240;240;240;240;240;240	
	" ;"H;"A;"S;" ;"M;"A;"D;"E;" ;"C;"O;"N;"T;"A;"C;"T;215;4012


BMTMSG,	377		/SPECIAL FILLER
	FATMSG
	"B;"A;"D;" ;"M;"S;"G;" ;"T;"Y;"P;4000+"E

/UNRECOGNIZED INTERRUPT MSG
INTMSG,	377		/SPECIAL FILLER TO START
	FATMSG
	DC7MSG
	" ;"I;"N;"T;" ;"E;"R;4000+"R

/AUTODUMP MESSAGE
DMPMSG,	377			/RUBOUT TO BEGIN
	FATMSG
	DC7MSG
	" ;"C;"R;"A;"S;"H;" ;"P;"C;4000+"=
DPTMSG,	BEGMSG
	DPMSG
	" ;"T;"I;"M;"E;"O;"U;4000+"T

IFNZRO CDRN <		/MESSAGE WHEN GET READ CHECK ON CARDREADER
RCKMSG,	BEGMSG
	"R;"D;"C;"H;"K;" ;"-;" ;"R;"E;"F;"E;"E;"D;" ;"C;"A;"R;"D;215;4012
>/END OFIFNZRO CDRN

IFNZRO FTTRBL <
IFNZRO LPTN <
/MESSAGE WHEN LPT TIMES OUT
LPTMSG,	BEGMSG
	"L;"P;"T;" ;"T;"R;"B;4000+"L
>/END OF IFNZRO LPTN

IFNZRO PTPN <
/MSG WHEN PTP TIMES OUT
PTPMSG,	BEGMSG
	"P;"T;"P;" ;"T;"R;"B;4000+"L
>/END OF IFNZRO PTPN
>/END OF IFNZRO FTTRBL


IFZERO FTDP01 <
/MESSAGE IF DP8E GETS A BUS ERROR
DBEMSG,	BEGMSG
	DPMSG
	" ;"B;"U;"S;" ;"E;"R;4000+"R

/MESSAGE WHEN CARRIER LOST
LCRMSG,	BEGMSG
	"C;"A;"R;"R;"I;"E;"R;" ;"L;"O;"S;"T;215;4012
CARMSG,	BEGMSG
	"C;"A;"R;"R;"I;"E;"R;" ;"B;"A;"C;"K;215;4012
>/END OF IFZERO FTDP01

IFNZRO FTDP01 <
/MSG WHEN SYNCHRONOUS MODEM LOSES CONTACT
ENDMSG,	BEGMSG
	DPMSG
	" ;"E;"N;"D;" ;"F;"L;"A;4000+"G
>/END OF IFNZRO FTDP01
IFNZRO CDRN <
/CARD CODE TRANSLATION TABLES
/ TRICK IS USE ROWS TO INDEX INTO THE TABLES
/ IF THE RESULT HAS THE SIGN BIT ON CAN'T COMPRESS COLUMN
/TABLE TO TRANSLATE ROWS 1/2/3/4/5
CD1TAB,	0000;	2005;	2004;	4000;	2003;	4000;	4000;	4000
	2002;	4000;	4000;	4000;	4000;	4000;	4000;	4000
	3001;	4000;	4000;	4000;	4000;	4000;	4000;	4000
	4000;	4000;	4000;	4000;	4000;	4000;	4000;	4000

/TABLE TO TRANSLATE ROWS 6/7/8/9
CD2TAB,	0000;	2011;	1010;	4000;	2007;	4000;	2017;	4000
	2006;	4000;	2016;	4000;	4000;	4000;	4000;	4000
>/END OF IFNZRO CDRN
/TABLE FOR INTERPRETING TTY & LPT CHAR FUNCTIONS
/ BIT DEFINITIONS ARE:
	CHRBRK=0
	CHRARR=0
	CHRSUP=0
	CHRALT=0
	CHRFLL=2000
	CHRDEF=4000		/GO INTO DEFERRED ECHO
	CHRXOF=0200		/CHAR IS AN XOF
	CHRHT=0040		/CHAR IS AN HT
	CHRHMO=0020		/CHAR PERFORMS HORIZONTAL MOTION
	CHRCR=0010		/CHAR IS A CARRIAGE RETURN
	CHRLC=0004		/CHAR IS LOWER CASE
/	0002		/FOR LPT CHAR IS SPECIAL MOTION
/	0001		/FOR LPT FLUSH CHAR

CHRTAB,	0001			/ASCII 0
	CHRDEF+CHRARR+0001	/ASCII 1 = ^A
	CHRDEF+CHRARR+0001	/ASCII 2 = ^B
	CHRDEF+CHRBRK+CHRARR+0001	/ASCII 3 = ^C
	CHRDEF+CHRARR+0001	/ASCII 4 = ^D
	CHRDEF+CHRARR+0001	/ASCII 5 = ^E
	CHRDEF+CHRARR+0001	/ASCII 6 = ^F
	CHRDEF+CHRBRK+0001	/ASCII 7 = ^G = BELL
	CHRDEF+CHRFLL+0001	/ASCII 10 = ^H
	CHRFLL+CHRHT+0002	/ASCII 11 = ^I = HORIZONTAL TAB
	CHRDEF+CHRBRK+CHRFLL+0002	/ASCII 12 = LINE FEED
	CHRDEF+CHRBRK+CHRFLL+0002	/ASCII 13 = VERT TAB
	CHRDEF+CHRBRK+CHRFLL+0002	/ASCII 14 = FORM FEED
	CHRFLL+CHRCR+0002	/ASCII 15 = CARRIAGE RETURN
	CHRDEF+CHRARR+0001	/ASCII 16 = ^N
	CHRDEF+CHRARR+0001	/ASCII 17 = ^O
	CHRDEF+CHRARR+0002	/ASCII 20 = ^P
	CHRDEF+CHRARR+0002	/ASCII 21 = ^Q = XON
	CHRDEF+CHRARR+0002	/ASCII 22 = ^R
	CHRDEF+CHRARR+CHRXOF+0002	/ASCII 23 = ^S = XOF
	CHRDEF+CHRARR+0002	/ASCII 24 = ^T
	CHRDEF+CHRSUP+0001	/ASCII 25 = ^U - NOT CHRARR BECAUSE SPECIAL HANDLING
	CHRDEF+CHRARR+0001	/ASCII 26 = ^V
	CHRDEF+CHRARR+0001	/ASCII 27 = ^W
	CHRDEF+CHRARR+0001	/ASCII 30 = ^X
	CHRDEF+CHRARR+0001	/ASCII 31 = ^Y
	CHRDEF+CHRBRK+CHRARR+0001	/ASCII 32 = ^Z
	CHRDEF+CHRBRK+CHRALT+0001	/ASCII 33 = ALTMODE
	CHRDEF+CHRARR+0001	/ASCII 34 = ^\
	CHRDEF+CHRARR+0001	/ASCII 35 = ^]
	CHRDEF+CHRARR+0001	/ASCII 36 = ^^
	CHRDEF+CHRARR+0001	/ASCII 37 = ^_
CHRBLA,				/CHARACTER WITH CHRHMO BIT SET FOR TAB SIMULATION
	CHRHMO			/ASCII 40 =  
	CHRHMO			/ASCII 41 = !
	CHRHMO			/ASCII 42 = "
	CHRHMO			/ASCII 43 = #
	CHRHMO			/ASCII 44 = $
	CHRHMO			/ASCII 45 = %
	CHRHMO			/ASCII 46 = &
	CHRHMO			/ASCII 47 = '
	CHRHMO			/ASCII 50 = (
	CHRHMO			/ASCII 51 = )
	CHRHMO			/ASCII 52 = *
	CHRHMO			/ASCII 53 = +
	CHRHMO			/ASCII 54 = ,
	CHRHMO			/ASCII 55 = -
	CHRHMO			/ASCII 56 = .
	CHRHMO			/ASCII 57 = /
	CHRHMO			/ASCII 60 = 0
	CHRHMO			/ASCII 61 = 1
	CHRHMO			/ASCII 62 = 2
	CHRHMO			/ASCII 63 = 3
	CHRHMO			/ASCII 64 = 4
	CHRHMO			/ASCII 65 = 5
	CHRHMO			/ASCII 66 = 6
	CHRHMO			/ASCII 67 = 7
	CHRHMO			/ASCII 70 = 8
	CHRHMO			/ASCII 71 = 9
	CHRHMO			/ASCII 72 = :
	CHRHMO			/ASCII 73 = ;
	CHRHMO			/ASCII 74 = <
	CHRHMO			/ASCII 75 = =
	CHRHMO			/ASCII 76 = >
	CHRHMO			/ASCII 77 = ?
	CHRHMO			/ASCII 100 = @
	CHRHMO			/ASCII 101 = A
	CHRHMO			/ASCII 102 = B
	CHRHMO			/ASCII 103 = C
	CHRHMO			/ASCII 104 = D
	CHRHMO			/ASCII 105 = E
	CHRHMO			/ASCII 106 = F
	CHRHMO			/ASCII 107 = G
	CHRHMO			/ASCII 110 = H
	CHRHMO			/ASCII 111 = I
	CHRHMO			/ASCII 112 = J
	CHRHMO			/ASCII 113 = K
	CHRHMO			/ASCII 114 = L
	CHRHMO			/ASCII 115 = M
	CHRHMO			/ASCII 116 = N
	CHRHMO			/ASCII 117 = O
	CHRHMO			/ASCII 120 = P
	CHRHMO			/ASCII 121 = Q
	CHRHMO			/ASCII 122 = R
	CHRHMO			/ASCII 123 = S
	CHRHMO			/ASCII 124 = T
	CHRHMO			/ASCII 125 = U
	CHRHMO			/ASCII 126 = V
	CHRHMO			/ASCII 127 = W
	CHRHMO			/ASCII 130 = X
	CHRHMO			/ASCII 131 = Y
	CHRHMO			/ASCII 132 = Z
	CHRHMO			/ASCII 133 = [
	CHRHMO			/ASCII 134 = \
	CHRHMO			/ASCII 135 = ]
	CHRHMO			/ASCII 136 = ^
	CHRHMO			/ASCII 137 = _
	CHRHMO			/ASCII 140 =
	CHRLC+CHRHMO		/ASCII 141 = LC A
	CHRLC+CHRHMO		/ASCII 142 = LC B
	CHRLC+CHRHMO		/ASCII 143 = LC C
	CHRLC+CHRHMO		/ASCII 144 = LC D
	CHRLC+CHRHMO		/ASCII 145 = LC E
	CHRLC+CHRHMO		/ASCII 146 = LC F
	CHRLC+CHRHMO		/ASCII 147 = LC G
	CHRLC+CHRHMO		/ASCII 150 = LC H
	CHRLC+CHRHMO		/ASCII 151 = LC I
	CHRLC+CHRHMO		/ASCII 152 = LC J
	CHRLC+CHRHMO		/ASCII 153 = LC K
	CHRLC+CHRHMO		/ASCII 154 = LC L
	CHRLC+CHRHMO		/ASCII 155 = LC M
	CHRLC+CHRHMO		/ASCII 156 = LC N
	CHRLC+CHRHMO		/ASCII 157 = LC O
	CHRLC+CHRHMO		/ASCII 160 = LC P
	CHRLC+CHRHMO		/ASCII 161 = LC Q
	CHRLC+CHRHMO		/ASCII 162 = LC R
	CHRLC+CHRHMO		/ASCII 163 = LC S
	CHRLC+CHRHMO		/ASCII 164 = LC T
	CHRLC+CHRHMO		/ASCII 165 = LC U
	CHRLC+CHRHMO		/ASCII 166 = LC V
	CHRLC+CHRHMO		/ASCII 167 = LC W
	CHRLC+CHRHMO		/ASCII 170 = LC X
	CHRLC+CHRHMO		/ASCII 171 = LC Y
	CHRLC+CHRHMO		/ASCII 172 = LC Z
	CHRDEF			/ASCII 173 =
	CHRDEF			/ASCII 174 =
	CHRDEF+CHRBRK+CHRALT	/ASCII 175 = ALTMODE
	CHRDEF+CHRBRK+CHRALT	/ASCII 176 = ALTMODE
	CHRDEF+CHRSUP+0001	/ASCII 177 = RUBOUT
	LISTOG	LPTN
IFNZRO LPTN <
LPTTBL,	0		/CHAR 11 = HORIZONTAL TAB
	0001		/CHAR 12 = LF = CHANNEL 8
	0002		/CHAR 13 = VT = CHANNEL 7
	-2		/CHAR 14 = FORM FEED = CHANNEL 1
	-1		/CHAR 15 = CARRIAGE RETURN
	0		/CHAR 16 = CHANGE RIBBON TO RED
	0		/CHAR 17 = CHANGE RIBBON TO BLACK
	0100		/CHAR 20 = DC0 = CHANNEL 2
	0040		/CHAR 21 = DC1 = CHANNEL 3
	0020		/CHAR 22 = DC2 = CHANNEL 4
	0010		/CHAR 23 = DC3 = CHANNEL 5
	0004		/CHAR 24 = DC4 = CHANNEL 6


/SIMULATED CARRIAGE CONTROL TAPE FOR LPT

LPTVFU,	011		/ 5-8
	051		/ 3-5-8
	031		/ 4-5-8
	051		/ 3-5-8
	011		/ 5-8
	071		/ 3-4-5-8
	011		/ 5-8

	051		/ 3-5-8
	031		/ 4-5-8
	055		/ 3-5-6-8
	011		/ 5-8
	071		/ 3-4-5-8
	011		/ 5-8
	051		/ 3-5-8
	031		/ 4-5-8

	051		/ 3-5-8
	011		/ 5-8
	071		/ 3-4-5-8
	011		/ 5-8
	057		/ 3-5-6-7-8
	031		/ 4-5-8
	051		/ 3-5-8
	011		/ 5-8

	071		/ 3-4-5-8
	011		/ 5-8
	051		/ 3-5-8
	031		/ 4-5-8
	051		/ 3-5-8
	011		/ 5-8
	175		/ 2-3-4-5-6-8
	011		/ 5-8

	051		/ 3-5-8
	031		/ 4-5-8
	051		/ 3-5-8
	011		/ 5-8
	071		/ 3-4-5-8
	011		/ 5-8
	051		/ 3-5-8
	031		/ 4-5-8

	057		/ 3-5-6-7-8
	011		/ 5-8
	071		/ 3-4-5-8
	011		/ 5-8
	051		/ 3-5-8
	031		/ 4-5-8
	051		/ 3-5-8
	011		/ 5-8

	071		/ 3-4-5-8
	011		/ 5-8
	055		/ 3-5-6-8
	031		/ 4-5-8
	051		/ 3-5-8
	011		/ 5-8
	071		/ 3-4-5-8
	011		/ 5-8

	051		/ 3-5-8
	031		/ 4-5-8
	051		/ 3-5-8
	011		/ 5-8
	010		/ 5
	010		/ 5
	010		/ 5
	010		/ 5

	010		/ 5
	010		/ 5
	-1		/FLAG END OF TAPE
>/END OF IFNZRO LPTN
	LISTOG	LPTN
STARTC,	ENQ;6;0;0;0;1;111;225	/DDCMP START MESSAGE
STARTD,	SOH;0;0;0;0;1		/START OF DATA MESSAGE
 DEFINE VAL Q <	Q
	 XLIST; ZZZ=ZZZ+1; XLIST>/END OF DEFINE VAL
	ZZZZ=.
CNF,	0			/LENGTH 
	ZZZ=0
	VAL	5		/MESSAGE TYPE
	IFNZRO	LPTN	<
	VAL	3		/OBJECT CLASS
	VAL	LPTN
	VAL	0		/DESCRIPTION
>/END OF IFNZRO	LPTN
	VAL	1		/OBJECT TYPE
	VAL	TTYN+1
	VAL	0		/DESCRIPTION
	IFNZRO	CDRN	<
	VAL	2		/OBJECT TYPE
	VAL	CDRN
	VAL	0		/DESCRIPTION
>/END OF IFNZRO	CDRN
	ZZZZZ=.
	*ZZZZ
	ZZZ
	*ZZZZZ
FREDCK,	0		/COUNT OF CHUNKS FREED BY FRECKS


DEFINE	X	Q QQ QQQ <XLIST
IFNZRO Q <XLIST
	Z-QQ
	QQQ
XLIST
	Z=QQ	>/END OF IFNZRO	Q
XLIST	>/END OF X
	Z=0
DEVTYP,	X	1,1,CONTTY		/CONNECT FOR TTY
	X	CDRN,2,CONCDR
	X	LPTN,3,CONLPT
/CONSIDER THE FOLLOWING METHOD OF CACULATING CRC-16
/ CALL:	PUSHJ	P,CRCALC
/ CRCALC:	XOR	C,CRC
/	ANDI	C,377
/	LSH	CRC,-10
/	XOR	CRC,TAB(C)
/RH OF TABLE FOLLOWS IMMEDIATELY, LH IS CRCTAB+400
CRCTAB,
/	***********************************************************
/	***********************************************************
/	***							***
/	***			CHUNKS				***
/	***							***
/	***********************************************************
/	***********************************************************


/FORMAT OF CHUNKS IS
/	LINK WORD (I.E. POINTER TO NEXT CHUNK)
/	DATA
/	LAST DATA WORD WITH SIGN BIT SET(FLAGS END OF DATA IN BUFFER)
/	REMAINING SPACE IN CHUNK, IF ANY

/CHUNKS MUST BEGIN ON A MULTIPLE OF CNKSIZ
Z=.+CNKSIZ-1
ZZ=-CNKSIZ
*Z&ZZ

	FIRCNK=.+1000		/START CHUNKS AFTER CRC TABLE

	PAGE		/SO SYSCHK BEGINS ON A PAGE BOUNDRY
/	***********************************************************
/	***********************************************************
/	***							***
/	***		SYSCHK - ONCE ONLY SYSTEM DIAGNOSTIC	***
/	***							***
/	***********************************************************
/	***********************************************************

/ONCE ONLY SYSTEM ANALYZER
/ CODE IS OVERWRITTEN BY CHUNKS SO CAN ONLY BE EXECUTED ONCE

SYSCHK,	SKP			/TRY TO SKIP
	  7402			/IT DIDN'T WORK ? ! ?
	NL0			/ZERO AC
	SZA			/SKIP IF AC IS ZERO
	  7402			/HARDWARE FAILURE
	SPA			/SKIP IF AC IS POSITIVE
	  7402			/HARDWARE FAILURE
	SMA			/SKIP IF AC IS NEGATIVE
	  SKP			/SHOULDN'T HAVE SKIPPED SO OK
	  7402			/HARDWARE FAILURE
	NL1			/PUT 1 IN AC
	SNA			/BE SURE AC IS NON ZERO
	  7402

	BSW			/IF AN 8E SWAP HALVES
	TAD	(7700
	IFZERO PDP8I <
	SZA CLA
>/END OF IFZERO	PDP8I
	IFNZRO PDP8I <
	SNA CLA
>/END OF IFNZRO	PDP8I
	  JMP	SCHK00		/CODE IS FOR RIGHT MACHINE
	JMS	INFTYP		/TYPE CR/LF/?
	JMS	INLTYP		/TRYING TO RUN 8I CODE ON AN 8E(OR VICE VERSA)
	DC7MSG
	" ;"W;"O;"N;47;"T;" ;"R;"U;"N;" ;"O;"N;" ;"A;" ;"P;"D;"P;"8
IFZERO PDP8I <	4000+"E	>
IFZERO PDP8E <	4000+"I	>
	HLT			/RETURNS HERE AFTER TYPEING MESSAGE
	JMP	SYSCHK		/IF OPERATOR CONTINUES TEST AGAIN
SCHK00,	JMS	INLTYP
	15;15;207;12;377
	"[;"I;"N;"I;"T;"I;"A;"L;"I;"Z;"I;"N;"G
	" ;"N;"E;"T;"W;"O;"R;"K;" 
IFNZRO FTLBACK < "L;"O;"O;"B;"A;"C;"K;" ;"T;"E;"S;"T;"  >
IFZERO FTLBACK < DC7MSG >
	" ;4366
	CDFINS			/PICK UP WORD FROM INSTRUCTION FIELD
	TAD I	(202		/GET VERSION NUMBER
	DCA	CHK1		/SAVE IT
	CDFCNK
	TAD	CHK1		/GET VERSION
	AND	(7700
	CLL RTR
	RTR
	RTR
	JMS	INIOCT
	JMS	INLTYP
	".+4000
	TAD	CHK1
	AND	(0077
	JMS	INIOCT		/TYPE VERSION NUMBER
	JMS	INLTYP

	" ;"N;"O;"D;"E
	240			/BLANK
	42
IFDEF DC72ID <
	DC72ID
>/END OF IFDEF DC72ID
IFNDEF	DC72ID	<
	"D;"C;"7;PDP8+260;"N;"P
>/END OF IFNDEF	DC72ID
	4042
	JMS	INLTYP
	"];15;15;12;4012
	JMP	SCHK01


	PAGE
SCHK01,	IFZERO PDP8E <CAF>	/ON 8E CLEAR ALL FLAGS

/HERE TO CHECK SYSTEM CLOCK IS PRESENT AND ACCURATE
	CLKECI			/RESET THE CLOCK
	NL0			/GIVE IT LOTS OF TIME FOR FIRST TICK
	JMS	SCHK02		/GO GET 1ST TICK
	CLKSCF			/AND THERE SHOULD NOT BE ANOTHER FLAG UP YET
	  SKP			/OK IT WASN'T UP AGAIN
	JMP	SCHK03		/IT DID COME UP AGAIN ??

/ASSUME LINE FREQUENCY IS 50CYCLE
IFZERO PDP8E <TAD (-6231-240 >	/6231 = 3226.
IFZERO PDP8I <TAD (-3636-240 >	/3636 = 1951.
	JMS	SCHK02		/TIME TICK
	TAD	CHK1
	SMA			/BE SURE IT ALMOST TOOK UP ALL OF TIME
	  JMP	SCHK03		/NO WHERE NEAR RIGHT
	TAD	(500
	SMA CLA			/IS THIS IN RANGE FOR 50 CYCLE ?
	  JMP	SCHK04		/YES
	DCA	HERTZF		/NOT 50 CYCLE

/NOT 50 CYCLES SO ASSUME 60 CYCLES
IFZERO PDP8E <TAD (-5177-240 >	/5177 = 2688.
IFZERO PDP8I <TAD (-3131-240 >	/3131 =3225.
	JMS	SCHK02
	TAD	CHK1
	SMA
	  JMP	SCHK03
	TAD	(500
	SPA CLA
	  JMP	SCHK03
	JMP	SCHK04		/CLOCK IS OK SO GO ON

/HERE TO WAIT FOR A CLOCK TICK
/ LOOP TAKES 10.25US ON PDP8I
/ LOOP TAKES 6.2US ON A PDP8E
SCHK02,	0
	DCA	CHK1		/SAVE MAX COUNT

IFZERO PDP8E <			/TIME TWO TICKS FOR PDP8E
	CLKSCF			/(1.2US)IS CLOCK FLAG UP ?
	  SKP			/(1.2US) NO
	JMP	.+4		/HAVE SEEN ONE CLOCK TICK
	ISZ	CHK1		/(2.6US)
	  JMP	.-4		/(1.2US)KEEP WAITING FOR CLOCK
	JMP	SCHK03		/TIMED OUT ON FIRST TICK !?!
>/END OF IFZERO PDP8E

	CLKSCF			/(1.2 OR 4.25US)IS CLOCK FLAG UP ?
	  SKP			/(1.2 OR 1.5US) NO
	JMP I	SCHK02		/HAVE SEEN ONE CLOCK TICK
	ISZ	CHK1		/(2.6 OR 3.0US)
	  JMP	.-4		/(1.2 OR 1.5US)KEEP WAITING FOR CLOCK

/HERE WHEN CLOCK IS MISBEHAVING
SCHK03,	JMS	INBTYP		/TYPE A CR/LF/%
	JMS	INLTYP
IFZERO PDP8E <	"D;"K;"8	>
IFZERO PDP8I <	"K;"W;"8	>
	" ;"E;"R;"R;"O;"R;215;4012
	HLT
	JMP	SCHK01		/TRY AGAIN IF HE INSISTS

HERTZF,	6			/NONZERO MEANS RUNNING ON 50 CYCLE
/MEMORY PARITY CHECK

SCHK04,

/HERE TO SEE IF MEMORY PARITY OPTION IS PRESENT
/ NOT NECESSARY ON PDP8E'S
IFNZRO PDP8E <
	TAD	(NOP
	CDFINS			/PREPARE TO WRITE INSTRUCTION FIELD
	MEMCMP			/CLEAR MEMORY PARITY ERROR FLAG
	MEMSMP			/SKIP IF WE HAVE PARITY OPTION
	  DCA I	(MEMTST		/WE DON'T
	NL0
	TAD I	(MEMTST		/PICK UP SKP OR NOP
	CDFCNK
	DCA	SCHK05
>/END OF IFNZRO PDP8E

	JMP	SCHK06

SCHK05,	0
/HERE TO SEE HOW MUCH MEMORY IS PRESENT
/ ADJUST DISMAX, DISCDF AND TRACE CODE ACCORDINGLY

SCHK06,	CDFINS			/SET TO INSTRUCTION FIELD TO CHANGE BUGGER
	DCA I	(DISMAX		/INITIALIZE MAX FIELD WE HAVE
	TAD	(7577
	DCA I	(BUGGER		/INITIALIZE BUGGER TO POINT TO 200 WORD AREA
SCHK07,	TAD I	(DISMAX
	CLL RAL
	CLL RTL
	TAD	(CDF
	DCA	.+1
	CDFINS
	TAD	(7402		/BIT PATTERN TO STORE INTO FIELD
	DCA I	(0		/AND STORE IN MEMORY
	TAD	(-7402
	TAD I	(0		/WILL LEAVE 0 IF THERE BANK PRESENT
	CDFINS
	SZA CLA			/IS THIS MEMORY BANK THERE ?
	  JMP	SCHK08		/NO
	ISZ I	(DISMAX
	TAD I	(DISMAX
	TAD	(-10
	SZA CLA
	  JMP	SCHK07
SCHK08,	TAD I	(DISMAX
	NEGATE
	TAD	(0010
	DCA I	(DISMIN

/NOW CHANGE TRACE IF WE HAVE AN EXTRA FIELD
	TAD	(-CNKFLD-1
	TAD I	(DISMAX
	SPA SNA CLA
	  JMP	SCHK10		/NO NEXT FIELD SO LEAVE WELL ENOUGH ALONE

	CDFINS			/NOW WE ARE CHANGING INSTRUCTIONS IN FIELD 0
	TAD	(CDFCNK+0010
	DCA I	(TRACEW+1	/SET SO DUMP INTO TRACE FIELD
	TAD I	(TRCWD2		/ THIS IS A (JMP I TRACEW)
	DCA I	(TRCWD1		/EXIT ROUTINE EARLY
	NLM1
	DCA I	(BUGGER		/START BY DUMPING INTO WORD 0

	CDFCNK+10	
	DCA	CHK1
	TAD	(7402
	DCA I	CHK1
	ISZ	CHK1
	JMP	.-3

	JMP	SCHK10

	PAGE
SCHK10,
	LISTOG	TTYN
IFNZRO TTYN <
/	***********************************************************
/	***********************************************************
/	***							***
/	***		SYSCHK FOR TTY LINES			***
/	***							***
/	***********************************************************
/	***********************************************************

/HERE TO CHECK TTYS ARE REASONABLE
/ FIRST CHECK THAT CHAR OUTPUT DOES NOT RAISE FLAG IMMEDIATELY
/ AND THAT IT DOES RAISE FLAG A REASONABLE AMOUNT OF TIME

	CDFCNK

IFNZRO FTDC02F <		/FIRST BE SURE DC02F IS INSTALLED
	TAD	(0017		/SELECT ALL GROUPS
	DCMTPF			/GET TRANSMIT FLAGS
	AND	(0017		/SHOULD HAVE CLEARED GROUP SELECT
	SZA CLA
	  JMP	SCHK25		/COMPLAIN ABOUT DC02F THEN FIX IT
>/END OF IFNZRO FTDC02F

	DCA	CHK1		/START WITH TTY0
SCHK11,	CDFCNK			/SET TO CHUNK DATAFIELD
	TAD	CHK1
	TAD	(DDBTAB+1
	DCA	CHK2
	TAD I	CHK2		/GET ADR OF DEVICE BLOCK
	TAD	[LDBADR		/POINT TO DEVICE ADDRESS WORD
	DCA	CHK2		/SAVE ADR OF WORD WITH DEVICE ADR
	TAD	(-15		/GIVE TTY .208 SEC TO XMT FLAG
	DCA	INISEC
	DCA	CHK5		/SET NONZERO TO FLAG LINE IS RUNNING OPEN

	TAD	(207		/ASCII BELL

IFNZRO FTDC02F <
/HERE TO TYPE A CHAR ON TTY
	DCA	CHK3		/SAVE CHAR
	TAD	(0017		/SELECT ALL GROUPS, NO LINES
	DCMTON
	NL0
	TAD I	CHK2		/SELECT THIS GROUP, THIS LINE
	DCMTON
	NL0
	TAD	CHK3		/GET CHAR AGAIN
	DCMTCF DCMTPC		/TYPE CHAR
	NL0
>/END OF IFNZRO FTDC02F

IFZERO FTDC02F <
/HERE TO TYPE A CHAR
	DCA	CHK3		/SAVE CHAR
	TAD I	CHK2		/GET TLS FOR LINE
	DCA	.+2
	TAD	CHK3		/GET CHAR AGAIN
	0			/TYPE CHAR
	NL0
>/END OF IFZERO FTDC02F

	JMS	SCHK17		/SEE IF XMT FLAG IS UP
	  JMP	SCHK29		/YES THAT IS TOO FAST
SCHK12,	JMS	SCHK17		/SEE IF LINE HAS XMT INTERRUPTED YET
	  JMP	SCHK20		/IT HAS

	JMS	SCHK19		/GET CHAR FROM TTY IF ANY
	  JMP	SCHK13		/NONE
	SNA			/IS IT A NULL ?
	  ISZ	CHK5		/FLAG LINE IS RUNNING OPEN
	TAD	(-207
	SNA CLA			/IS TTY IN LOOP BACK MODE ?
	  JMP	SCHK26		/YES SO TELL OPERATOR

SCHK13,	JMS	SCHK98		/HAVE WE WAITED TOO LONG ?
	  JMP	SCHK12		/NO KEEP WAITING
	JMS	SCHK28		/GIVE TTY ID
	JMS	INLTYP
	"N;"O;" ;"X;"M;"T;" ;"F;"L;"A;4000+"G
	JMP	SCHK22

SCHK20,	JMS	SCHK19		/SEE IF THERE IS ANY TYPEIN
	  JMP	SCHK21		/NONE
	SNA			/IS IT NULL
	  ISZ	CHK5		/YES
	TAD	(-207
	SNA CLA			/IS TTY IN LOOPBACK MODE ?
	  JMP	SCHK26		/YES SO TELL OPERATOR
SCHK21,	JMS	SCHK98		/CHECK CLOCK
	  JMP	SCHK20		/ KEEP WAITING TO TEST FOR LOOP BACK MODE
SCHK22,	NL0
	JMS	SCHK17		/CLEAR XMT FLAG IF UP
	  NOP
	TAD	CHK5		/IS LINE RUNNING OPEN ?
	SNA CLA
	  JMP	SCHK23		/NOT RUNNING OPEN
	JMS	SCHK28		/TYPE TTY LINE #
	TAD	(ERR23-1
	JMS	INITYP

SCHK23,	ISZ	CHK1		/ADVANCE TO NEXT TTY #
	TAD	CHK1		/GET NEW LINE #
	TAD	(-TTYN
	SZA CLA			/HAVE WE DONE ALL OF THE LINES ?
	  JMP	SCHK11		/GO DO NEXT TTY LINE
	JMP	SCHK30

IFNZRO FTDC02F <
/HERE TO SEE IF A LINE HAS XMT INTERRUPTED
/ CALL	JMS	SCHK17
/	RETURN IF HAS XMT INTERRUPTED
/	NORMAL RETURN
SCHK17,	0
	NL0
	TAD I	CHK2		/SELECT FOR THIS LINE & GROUP
	AND	(0017		/SELECT GROUP ONLY
	DCMTPF			/GET TRANSMIT FLAGS
	AND I	CHK2		/AND LEAVE ONLY FLAG FOR OUR LINE
	SZA CLA			/HAS IT COME UP YET
	  JMP	.+3		/YES SO CLEAR FLAG THEN RETURN
	ISZ	SCHK17		/YES SO SKIP RETURN
	JMP I	SCHK17
	DCMTCF			/CLEAR FLAG
	JMP I	SCHK17
/HERE TO GET A CHAR FROM A TTY KEYBOARD
/ CALL	JMS	SCHK19
/	RETURN		/IF NONE
/	RETURN WITH CHAR IN AC
SCHK19,	0
	TAD I	CHK2
	AND	(0017		/SELECT GROUP ONLY
	DCMTKF			/GET KEYBOARD FLAGS
	AND I	CHK2
	SNA CLA			/DOES KEYBOARD HAVE FLAG UP ?
	JMP I	SCHK19		/NO SO RETURN
	TAD	(0017		/SELECT ALL GROUPS, NO LINES
	DCMTON
	NL0
	TAD I	CHK2		/GET SELECT FOR THIS LINE
	DCMTON
	NL0
	DCMKRS DCMKCC		/GET CHAR
	ISZ	SCHK19		/SKIP RETURN
	JMP I	SCHK19
>/END OF IFNZRO FTDC02F

IFZERO FTDC02F <
/HERE TO SEE IF TTY HAS XMT INTERRUPTED
SCHK17,	0
	TAD I	CHK2		/GET THE TLS INSTRUCTION
	TAD	(-5		/MAKES A TSF INSTRUCTION
	DCA	.+1
	0
	ISZ	SCHK17		/NORMAL(I.E. SKIP) RETURN
	JMP I	SCHK17
/HERE TO GET A CHAR FROM A TTY
SCHK19,	0
	TAD	CHK1		/GET LINE NUMBER
	CLL RTL			/MULTIPLY BY 4
	TAD	(INTTTY
	DCA	CHK3
	CDFINS
	TAD I	CHK3		/GET KSF
	CDFCNK
	DCA	.+1
	7402
	JMP I	SCHK19		/NO CHAR SO RETURN
	ISZ	SCHK19		/SKIP RETURN
	TAD	.-3		/PICK UP KSF AGAIN
	DCA	.+5		/SAVE FOR TEST AFTER KRB
	TAD	.+4		/GET KSF AGAIN
	TAD	(0005		/MAKES A KRB
	DCA	.+1
	7402			/PUT KRB HERE
	7402			/PUT KSF HERE
	JMP I	SCHK19
>/END OF IFZERO FTDC02F

	PAGE
IFNZRO FTDC02F <
SCHK25,	JMS	INBTYP		/TYPE A CR/LF/%
	JMS	INLTYP
	"D;"C;"0;"2;"F;" ;"I;"S;" ;"N;"O;"T;" ;"P;"R;"E;"S;"E;"N;4000+"T
	CDFINS			/CHANGE DATA FIELD TO GET INSTRUCTION FIELD
IFDEF DC1MSK < DCA I (DC1MSK >		/MAKE MASK ZERO SO DON'T USE DC02F
IFDEF DC2MSK < DCA I (DC2MSK >
IFDEF DC3MSK < DCA I (DC3MSK >
IFDEF DC4MSK < DCA I (DC4MSK >
	CDFCNK			/CHANGE BACK TO NORMAL DATA FIELD
	JMP	SCHK30		/THEN CHECK SYN STUFF
>/END OF IFNZRO FTDC02F

/HERE WHEN TTY IS APPARENTLY IN LOOP BACK MODE
SCHK26,	JMS	SCHK28		/TYPE TTYP#
	JMS	INLTYP
	"I;"S;" ;"I;"N;" ;"L;"O;"O;"P;"B;"A;"C;"K;" ;"M;"O;"D;4000+"E
	JMS	SCHK27		/TRY TO FLUSH TTY ENABLE
	JMP	SCHK23		/WE ARE DONE WITH THIS LINE

/HERE TO FLUSH TTY FROM INTERRUPTING IF IT IS BAD
SCHK27,	0
	NL0
	TAD	CHK1		/GET LINE NUMBER

IFNZRO FTDC02F <
	RTR
	RAR
	AND	(0007		/LEAVE GROUP ONLY
	TAD	(DC1MSK
	DCA	CHK3
	TAD I	CHK2		/GET MASK FOR LINE
	AND	(7760		/LEAVE LINE SELECT BITS ONLY
	CMA			/MAKE A MASK FOR DC1MSK(ETC)
	CDFINS
	AND I	CHK3		/STRIP ENABLE BIT FROM DC1MSK(ETC)
	DCA I	CHK3
	CDFCNK
>/END OF IFNZRO FTDC02F

IFZERO FTDC02F <
	CLL RTL			/MULTIPLY BY 4
	TAD	(INTTTY+3
	DCA	CHK3
	CDFINS
	DCA I	CHK3		/CLEAR DDB ADR IN KSF CHAIN
	CDFCNK
>/END OF IFZERO FTDC02F

	JMP I	SCHK27

/HERE TO TYPE TTY IDENTIFICATION
SCHK28,	0
	JMS	INBTYP		/TYPE A CR/LF/%
	JMS	INLTYP
	"T;"T;4000+"Y
	TAD	CHK1		/GET LINE NUMBER
	JMS	INIOCT		/TYPE OCTAL NUMBER
	JMS	INLTYP
	4240			/SPACE
	JMP I	SCHK28

SCHK29,	JMS	SCHK28		/TYPE TTY NAME
	JMS	INLTYP
	"X;"M;"T;4240
	JMS	SCHK93		/TYPE "FLAG WON'T CLEAR"
	HLT
	JMP	SCHK10		/REDO SYSCHK FOR TTY'S

SCHK24,	JMS	SCHK28		/TYPE TTY ID
	JMS	INLTYP
	"R;"C;"V;4240
	JMS	SCHK93		/TYPE "FLAG WON'T CLEAR
	HLT
	JMP	SCHK10		/TRY AGAIN IF HE INSISTS

ERR23,	"I;"S;" ;"R;"U;"N;"N;"I;"N;"G;" ;"O;"P;"E;4000+"N

	PAGE
>/END OF IFNZRO TTYN
	LISTOG	TTYN
/	***********************************************************
/	***********************************************************
/	***							***
/	***	SYSCHK FOR SYNCHRONOUS INTERFACE - XMT		***
/	***							***
/	***********************************************************
/	***********************************************************

/HERE TO CHECK SYNCHRONOUS INTERFACE
/ CHK6 IS A FLAG FOR XMT TEST
/ CHK5 IS A FLAG FOR ANY CHAR RECEIVED
/ CHK4 IS A FLAG FOR NONSYNCH RECEIVED TEST

CHKDPT=200		/TIME FOR SYNCHRONOUS INTERFACE TO COME ALIVE
			/ APP 2 SECONDS

	SKP
	HLT

SCHK30,	CDFCNK			/SET RIGHT DATA FIELD
	JMS	SCHKA1		/INITIALIZE BUFFERS
	NLM1
	DCA	CHK6		/FLAG 1ST TIME THROUGH XMT TEST
IFNZRO FTDP01 <	NLM1	;	DCA	CHKST1 >	/ DITTO
IFZERO FTDP01 <
	TAD	(0020
	DCA	CHKST1		/INITIAL STS1
	TAD	(5400
	DCA	CHKST2		/INITIAL STS2
>/END IFZERO FTDP01

IFZERO FTDP01 <
	CDFINS
	TAD	(F10TCH-1	/POINTER TO TEST CHARS
	DCA	AUTO1
	DCA I	AUTO1
	DCA I	AUTO1
	DCA I	AUTO1
	TAD	(SYN
	DCA I	AUTO1
	CDFCNK
>/END OF IFZERO FTDP01

SCHK31,	NLM1
	DCA	CHK5		/FLAG FIRST TIME THROUGH BASIC REC TEST
	NLM1
	DCA	CHK4
SCHK32,
IFNZRO FTDP01 <
	DPSTR			/SET TERMINAL READY
	DPCEF			/CLEAR END FLAG
	TAD	(SYN
	DPTAC DPCTF		/START BY SENDING ONE SYNCH
	  NOP
	NL0
>/END OF IFNZRO FTDP01

IFZERO FTDP01 <
	DPSCSI			/CLEAR SYNCHRONOUS INTERFACE
	TAD	(5400		/TERMINAL READY; INTERFACE ENABLE; TRANS REQ
	DPSLCC			/SET INITIAL CONDITIONS
	NL0
		Z=CNKFLD^1100
	TAD	(Z
	DPSLFL
	NL0
>/END OF IFZERO FTDP01

	CDFINS
	TAD	(SYNBUF-1
	DCA I	(T10CA		/SET UP BUFFER TO SEND SYNCHS
	TAD	(-4
	DCA I	(T10WC		/SET UP WC TO SEND SYNCHS
	DCA I	(T10NCA		/SEND SYNCH'S WHEN DONE
	CDFCNK
	DCA	CHOCNT		/NO CHARS SEND YET
	TAD	(-SYNBUF-3
	DCA	T10LCA
IFZERO FTDP01 <	DPSGTT	>	/ENABLE DP8E TRANSMITTER
	JMS	SCHK77		/ENABLE RECEIVER

	TAD	(-CHKDPT
	DCA	INISEC		/TIME FOR INTERFACE TO COME ALIVE

SCHK33,

IFNZRO FTDP01 <
	DPSSR			/SKIP ON DATASET READY
	  JMP	SCHK35		/NOT READY SO WAIT
>/END OF IFNZRO FTDP01

IFZERO FTDP01 <
	Z=CNKFLD^40
	DPSRS1			/GET RECEIVE FIELD SELECT
	AND	(0340
	TAD	(-Z
	SZA			/IS IT OK ?
	  JMS	SCHK39
	DPSRS2			/GET TRANSMIT FIELD SELECT
	AND	(0340
	TAD	(-Z
	SZA			/IS IT OK ?
	  JMS	SCHK39

	DPSRS1			/GET STATUS 1
	AND	(0020		/MASK FOR MODEM READY
	SNA CLA
	  JMP	SCHK35

	DPSRS2
	AND	(5400		/MASK FOR TERMINAL READY,CARRIER, &CLEAR TO SEND
	TAD	(-5400
	SZA CLA
	  JMP	SCHK35		/WAIT A WHILE

>/END OF IFZERO FTDP01
	JMS	SCHK75
	NOP
	NL0			/CHECK RECEIVER
	JMS	SCHK66		/SERVICE TRANSMITTER
	TAD	CHOCNT
	TAD	(40		/SEE HOW MANY CHARS SENT
	SPA CLA
	  JMP	SCHK40		/BRANCH IF XMTTER GOING
SCHK35,	JMS	SCHK98		/SEE IF CLOCK HAS TIMED OUT
	  JMP	SCHK33		/NOT YET

/HERE IF TIMER GOES OFF WHILE TRYING TO INITIALIZE DP01 OR DP8E
	NL0

IFNZRO FTDP01 <
	DPSSR	
	JMP	SCHK36		/BRANCH IF DATASET NOT READY
	NLM1	
	DCA	CHKST1		/REENABLE SCHK36
	JMP	SCHK37
SCHK36,	NLM1	
	DCA	CHK6		/REENABLE SCHK37
	ISZ	CHKST1
	JMP	SCHK31		/IF HAVE ALREADY COMPLAINED DONE
	JMS	INBTYP		/TYPE CR/LF/%
	JMS	INDTYP		/TYPE DP01
	JMS	INLTYP
	"D;"A;"T;"A;"S;"E;"T;" ;"N;"O;"T;" ;"R;"E;"A;"D;4000+"Y
	JMP	SCHK31		/KEEP TRYING
CHKST1,	0			/COUNTED WHEN MODEM NOT READY

>/END OF IFNZRO FTDP01

IFZERO FTDP01 <
	DPSRS1
	AND	(0020
	NEGATE			/GET MODEM READY BIT
	TAD	CHKST1
	SZA CLA
	  JMP	SCHK36		/IF STATUS CHANGED DISPLAY IT
	DPSRS2
	AND	(5400
	NEGATE			/GET STS2 BITS
	TAD	CHKST2
	SZA CLA	
	JMP	SCHK36
	TAD	CHKST1
	SNA CLA	
	JMP	SCHK31		/KEEP ONWAITING
	TAD	CHKST2
	TAD	(-5400		/CHECK OTHER STS WORD
	SZA CLA	
	JMP	SCHK31
	JMP	SCHK37

	PAGE
SCHK36,	NLM1	
	DCA	CHK6		/ENABLE SCHK37
	DPSRS1	
	AND	(0020
	DCA	CHKST1		/GET 1ST STATUS
	DPSRS2	
	AND	(5400
	DCA	CHKST2		/GET 2ND STATUS
	TAD	CHKST1
	SZA CLA	
	JMP	SCHKX1
	JMS	INBTYP		/TYPE A CR/LF/%
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"M;"O;"D;"E;"M;" ;"N;"O;"T;" ;"R;"E;"A;"D;4000+"Y
SCHKX1,	NL4000	
	AND	CHKST2		/MASK FOR CARRIER
	SZA CLA	
	JMP	SCHKX2
	JMS	INBTYP		/TYPE A CR/LF/%
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"N;"O;" ;"C;"A;"R;"R;"I;"E;4000+"R
SCHKX2,	TAD	(1000
	AND	CHKST2		/MASK FOR TERMINAL READY
	SZA CLA	
	JMP	SCHKX3
	JMS	INBTYP		/TYPE A CR/LF/%
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"T;"E;"R;"M;" ;"N;"O;"T;" ;"R;"E;"A;"D;4000+"Y
SCHKX3,	TAD	(0400
	AND	CHKST2		/MASK FOR CLEAR TO SEND
	SZA CLA	
	JMP	SCHKX4
	JMS	INBTYP		/TYPE A CR/LF/%
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"N;"O;"T;" ;"C;"L;"E;"A;"R;" ;"T;"O;" ;"S;"E;"N;4000+"D
SCHKX4,	JMP	SCHK31		/KEEP TRYING
CHKST1,	0
CHKST2,	0
>/END OF IFZERO FTDP01
SCHK37,	ISZ	CHK6		/HAVE WE COMPLAINED ONCE ALREADY ?
	  JMP	SCHK31		/YES SO JUST KEEP TRYING
	JMS	INBTYP		/TYPE A CR/LF/%
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"X;"M;"T;" ;"N;"O;"T;" ;"R;"E;"A;"D;4000+"Y
	JMP	SCHK31

	PAGE
	LISTOG	FTDP8E
IFZERO FTDP01 <
/HERE BECAUSE WC OR CA DOESN'T LOOK RIGHT AT END OF XMISSION
	0			/PUT AC HERE WHEN CALLED
SCHK38,	0
	CDFCNK
	DCA	SCHK38-1	/SAVE AC CONTENTS
	JMS	INFTYP		/TYPE CR/LF/?
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"W;"C;" ;"O;"R;" ;"C;"A;" ;"W;"R;"O;"N;4000+"G
	JMP	SCHK30-1	/TRY ALL OVER AGAIN IF HE CONTINUES

/HERE BECAUSE FIELD SELECT FAILED
SCHK39,	0
	DCA	CHK3
	JMS	INFTYP		/TYPE CR/LF/?
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"F;"I;"E;"L;"D;" ;"S;"E;"L;"E;"C;"T;" ;"F;"A;"I;"L;"E;4000+"D
	TAD	CHK3		/GET BAD VALUE-CNKFLD
	TAD	(CNKFLD		/LEAVES ONLY BAD VALUE
	JMS	INIOCT		/TYPE IT
	TAD	(257		/ASCII /
	JMS	INITY8
	NL0
	TAD	(CNKFLD		/GET RIGHT VALUE
	JMS	INIOCT		/AND TYPE IT
	JMP	SCHK30-1	/TRY ALL OVER AGAIN IF HE INSISTS


/HERE WHEN SPECIAL CHAR DETECT FAILS
SCHK57,	0
	JMS	INFTYP		/TYPE CR/LF/?
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"C;"H;"A;"R;" ;"D;"E;"T;"E;"C;"T;" ;"S;"K;"I;"P;" ;"F;"A;"I;"L;"E;4000+"D
	JMP	SCHK30-1	/TRY AGAIN IF HE INSISTS

SCHK55,	JMS	INFTYP		/TYPE CR/LF/?
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"R;"E;"A;"D;" ;"C;"H;"A;"R;" ;"D;"E;"T;"E;"C;"T;"E;"D;4240
	TAD	CHK1
	JMS	INIOCT
	NL0
	JMS	INLTYP
	" ;"R;"I;"G;"H;"T;4000+"=
	NL3
	JMS	INIOCT
	JMP	SCHK30-1	/TRY AGAIN IF HE INSISTS

	PAGE
>/END OF IFZERO FTDP01
	LISTOG	FTDP8E
/	***********************************************************
/	***********************************************************
/	***							***
/	***	SYSCHK FOR SYNCHRONOUS INTERFACE - RECEIVE	***
/	***							***
/	***********************************************************
/	***********************************************************

/HERE TO SEE WHAT WE ARE RECEIVING
/ BE SURE STUFF IS ALSO GOING OUT(TO EXECISE LOOPBACK, CROSSTALK, ETC.)
SCHK40,	NLM1	
	DCA	CHK6		/FLAG 1ST TIME THROUGH XMT TEST
	TAD	(-CHKDPT
	DCA	INISEC		/TIME TO COME ALIVE

SCHK42,	JMS	SCHK66		/CHECK SYNCHRONOUS TRANSMITTER

	JMS	SCHK75		/GET NEXT CHAR FROM RECEIVER
	  JMP	SCHK45		/NONE FOR A WHILE
	DCA	RCVQUE		/SAVE CHAR
	NLM1
	DCA	CHK5		/FLAG FOR BASIC REC TEST
	TAD	RCVQUE
	TAD	(-SYN
	SZA CLA			/WAS CHAR A SYNC ?
	  JMP	SCHK44		/NO SO COMPLAIN

IFZERO FTDP01 <
	DPSSCD			/SKIP ON SPECIAL CHAR DETECT
	  JMS	SCHK57		/SHOULD HAVE SKIPPED
	DPSSCD			/SKIP ABOVE SHOULD HAVE CLEARED FLAG
	SKP CLA
	  JMS	SCHK57		/IT DIDN'T SO COMPLAIN
	DPSRCD			/GET SPECIAL CHAR INDEX
	DCA	CHK1
	NLM3			/SHOULD BE 3
	TAD	CHK1
	SZA CLA
	  JMP	SCHK55		/IT WASN'T ?
>/END OF IFZERO FTDP01

	JMP	SCHK50		/YES SO ON TO NEXT TEST

SCHK44,	TAD	RCVQUE
	NEGATE
	TAD	CHK4
	SNA CLA			/HAVE WE DISPLAYED THIS ONE ALREADY ?
	  JMP	SCHK32		/YES SO DON'T SHOW AGAIN
	TAD	RCVQUE
	DCA	CHK4
	JMS	INBTYP		/TYPE CR/LF/%
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"R;"C;"V;"';"D;4000+" 
	TAD	RCVQUE
	JMS	INIOCT
	JMP	SCHK32		/LOOP ON ERROR

SCHK45,	JMS	SCHK98		/CHECK CLOCK
	  JMP	SCHK42		/KEEP WAITING
	NLM1
	DCA	CHK4		/FLAG TO DISPLAY ANY RECEIVED CHAR
	ISZ	CHK5
	  JMP	SCHK32		/DON'T COMPLAIN EVERY TIME
	JMS	INBTYP		/TYPE A CR/LF/%
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"N;"O;"T;" ;"R;"E;"C;"E;"I;"V;"I;"N;4000+"G
	JMP	SCHK32

/**DEBUG	PAGE
/HERE TO CHECK SYNCHRONOUS TRANSMITTER
/ IF T10WC HAS EXPIRED USE T10NWC&T10NCA TO REFRESH IT
/ ELSE SEND SYNCH'S
SCHK66,	0

IFNZRO FTDP01 <
	DPSTF	
	SKP CLA	
	JMP I	SCHK66		/CHECK FOR XMT FLAG
	CDFINS
	ISZ I	(T10CA
	TAD I	(T10CA
	DCA	CHK1		/GET CURRENT ADDRESS
	CDFCNK
	TAD I	CHK1
	DPTAC DPCTF
	NOP			/SEND NEXT CHAR
	NL0	
	DPSTF	
	JMS	SCHK56		/CHECK FLAG CLEARED
	CDFINS
	ISZ I	(T10WC
	JMP	SCHK69		/CHECK FOR OVERFLOW
>/END OF IFNZRO FTDP01

IFZERO FTDP01 <
	DPSSTO	
	JMP I	SCHK66		/CHECK DP8E FOR WC OVERFLOW
	DPSSTO	
	SKP CLA	
	JMS	SCHK56		/BE SURE FLAG CLEARED
	CDFINS	
	TAD I	(T10CA
	TAD	T10LCA		/CHECK CA
	SZA
	  JMS	SCHK38		/BE SURE IT IS KOSHER
	TAD I	(T10WC
	SZA
	  JMS	SCHK38		/CHECK WC ALSO
>/END OF IFZERO FTDP01

	TAD I	(T10NCA
	SNA	
	JMP	SCHK67
	DCA I	(T10CA
	DCA I	(T10NCA
	TAD I	(T10NWC
	DCA I	(T10WC
	JMP	SCHK68
SCHK67,	TAD	(SYNBUF-1
	DCA I	(T10CA		/NO MSG SO SEND SYNCS
	NLM1	
	DCA I	(T10WC
SCHK68,	TAD I	(T10WC
	TAD	CHOCNT
	DCA	CHOCNT
IFZERO FTDP01 <
	TAD I	(T10CA
	NEGATE	
	TAD I	(T10WC
	DCA	T10LCA
	DPSGTT
>/END OF IFZERO FTDP01
SCHK69,	CDFCNK	
	JMP I	SCHK66		/RETURN

CHOCNT,	0
T10LCA,	0			/EXPECTED T10CA WHEN DONE

	PAGE
/	***********************************************************
/	***********************************************************
/	***							***
/	***	CHECK TO SEE IF SYN LINK IS LOOPED BACK		***
/	***							***
/	***********************************************************
/	***********************************************************

SCHK50,	TAD	(-CHKDPT
	DCA	INISEC		/TIME TO HEAR LOOPBACK

SCHK51,	TAD	(SCHKRD
	DCA	CHK2		/POINTER TO WATCH RECEIVE

SCHK52,	CDFINS
	TAD	(SCHKRD-5
	DCA I	(T10NCA		/SET UP JUNK TO GO
	TAD	(-7
	DCA I	(T10NWC		/WC FOR JUNK
	CDFCNK

	JMS	SCHK66		/SERVICE TRANSMITTER

	JMS	SCHK75		/TRY TO GET ANOTHER CHAR FROM THE SYN RECEIVER
	  JMP	SCHK54		/NOT READY YET
	NEGATE
	TAD I	CHK2
	SZA CLA			/IS THIS ONE OF JUNK CHARS ?
	  JMP	SCHK51		/NO
	ISZ	CHK2		/ADVANCE STATE
	TAD	CHK2
	TAD	(-SCHKRD-3
	SZA CLA
	  JMP	SCHK54		/STILL NOT FATAL
IFNZRO FTLBACK <JMP	SCHK60	>	/MODEM IS IN LOOPBACK MODE

SCHK53,	JMS	INFTYP		/TYPE CR/LF/?
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	INLTYP
	"I;"S
IFNZRO FTLBACK < " ;"N;"O;"T >
	" ;"I;"N;" ;"L;"O;"O;"P;"B;"A;"C;"K;" ;"M;"O;"D;4000+"E
	JMP	SCHK30-1	/RECHECK ALL SYNCHRONOUS STUFF

SCHK54,	JMS	SCHK98
	  JMP	SCHK52		/CHECK CLOCK
IFNZRO FTLBACK < JMP SCHK53 >	/MUST BE FOR LOOPBACK TEST

SCHK60,	TAD	HERTZF
	TAD	(-36
	DCA	INISEC		/HALF SECOND
	DCA	CHOCNT		/SO WE CAN COUNT CHARS
	JMS	SCHK75		/CHECK RECEIVER
	JMS	SCHK66		/SERVICE TRANSMITER
	NL0	
	JMS	SCHK98
	JMP	.-4
IFZERO FTDP01 <
	TAD	CHOCNT
	TAD	(207
	SPA CLA	
	JMP	SCHK61
	CDFINS
	TAD	(NOP
	DCA	INTN21
	CDFCNK
SCHK61,
>/END OF IFZERO FTDP01
	TAD	CHOCNT
	TAD	(1200		/COMPARE TO 640.
	SPA CLA
	DCA	SCHK62
	JMP	SCHK70

/JUNK CHARACTERS TO SEND TO 10
/ NOTE THAT ONLY BITS USED ARE BITS WE KNOW DP01/DP8E CAN SEE
	SYN	;	SYN	;	SYN	;	SYN
SCHKRD,	206;	202;	220
/JMS HERE IF CAN'T CLEAR FLAG ON DP01 OR DP8E
SCHK56,	0
	JMS	INFTYP		/TYPE CR/LF/?
	JMS	INDTYP		/TYPE DP8E OR DP01
	JMS	SCHK93		/TYPE FLAG WON'T CLEAR
	JMP	SCHK30-1	/TRY AGAIN

	PAGE
/	***********************************************************
/	***********************************************************
/	***							***
/	***		CHECK TO BE SURE 10 ANSWERS		***
/	***							***
/	***********************************************************
/	***********************************************************

/HERE TO SEND A START(REP) MESSAGE TO 10 AND AWAIT A STACK(RACK)

SCHK70,	TAD	(-CHKDPT
	DCA	INISEC		/TIME TO GET A STACK(RACK)


/SEND START MSG
	CDFINS
	TAD	(-10-NUMSYN
	DCA I	(T10NWC
	TAD	(SYNBUF-1
	DCA I	(T10NCA
	CDFCNK

SCHK71,	TAD	(JMP I SCHK73+1
	DCA	SCHK73

SCHK72,	JMS	SCHK66		/CHECK TRANSMITTER
	JMS	SCHK75
	JMP	SCHK74		/GET NEXT CHAR FROM RECEIVER
SCHK73,	7402			/WILL BE A JMP I SCHK73+#


	CHKENQ;	CHKSTK;	CHKFLL
	SCHK62
SCHK62,	JMP	SCHK80
	JMS	INBTYP
	JMS	INDTYP
	JMS	INLTYP
	"G;"T;" ;"9;"6;"0;"0;" ;"B;"A;"U;4000+"D
	JMP	SCHK80
SCHK74,	JMS	SCHK98
	JMP	SCHK72		/CHECK CLOCK

	JMS	INBTYP		/TYPE CR/LF/%
	JMS	INLTYP
	"N;"O;" ;"R;"E;"S;"P;"O;"N;"S;"E;" ;"T;"O
	" ;"S;"T;"A;"R;4000+"T 
	JMP	SCHK30		/KEEP TRYING

CHKSTK,	TAD	(ENQ-STACK
CHKENQ,	TAD	(-ENQ
CHKFIL,	SZA CLA
	  JMP	SCHK71
	ISZ	SCHK73
	JMP	SCHK74
CHKFLL,	AND	(077		/STRIP SELECT AND QSYNC BITS
	JMP	CHKFIL

	PAGE
/HERE TO ACCUMULATE A CRC IN CHK6 & CHK7
SCHK78,	0
	DCA	CHK1
	TAD	(-10
	DCA	CHK2
	TAD	CHK6
	CLL RAR
	DCA	CHK6
	SZL	
	TAD	(0400
	TAD	CHK7
	CLL RAR	
	DCA	CHK7
	SZL	
	JMS	SCHKCC
	TAD	CHK1
	CLL RAR
	DCA	CHK1
	SZL	
	JMS	SCHKCC
	ISZ	CHK2
	JMP	SCHK78+4
	JMP I	SCHK78

SCHKCC,	0
	TAD	CHK7
	CLL RAR
	CML
	RAL	
	DCA	CHK7
	TAD	CHK6
	AND	(240
	CMA IAC
	CLL RAL
	TAD	CHK6
	TAD	(240
	DCA	CHK6
	JMP I	SCHKCC
/HERE TO GET THE NEXT CHAR FROM THE SYNCHRONOUS RECEIVER
/ CALL	JMS	SCHK75
/	RETURN		/IF NOTHING HAPPENING
/	RETURN WITH RECEIVED CHAR IN AC
SCHK75,	0

IFNZRO FTDP01 <			/CODE FOR DP01
	DPSRF
	SKP
	JMP I	SCHK75		/CHECK RECEIVE FLAG
	DPRRB			/GET CHAR
	DPSRF
	JMS	SCHK56		/BE SURE WE CLEARED FLAG
>/END OF IFNZRO FTDP01

IFZERO FTDP01 <			/CODE FOR DP8E
	DPSSRO
	  JMP I	SCHK75		/CHECK FOR FLAG
	DPSSRO
	SKP
	JMS	SCHK56		/FLAG IS SUPPOSED TO HAVE CLEARED
	CDFINS
	TAD I	(F10WC		/CHECK TO BE SURE HDW MEANT IT
	SZA
	  JMS	SCHK38		/COMPLAIN WC ISN'T RIGHT
	TAD I	(F10CA
	TAD	(-RCVQUE
	SZA
	  JMS	SCHK38
	JMS	SCHK76		/REENABLE RECEIVER
	TAD	RCVQUE		/GET CHAR
>/END OF IFZERO FTDP01

	ISZ	SCHK75
	JMP I	SCHK75		/SKIP RETURN WITH CHAR

IFZERO FTDP01 <
/HERE TO ENABLE DP8E RECEIVER
SCHK76,	0
	CDFINS	
	NLM1	
	DCA I	(F10WC		/RESET RECEIVE WC
	TAD	(RCVQUE-1
	DCA I	(F10CA
	CDFCNK			/RESET RECEIVE CA
	DPSGRR			/REENABLE RECEIVER
	JMP I	SCHK76
>/END OF IFZERO FTDP01

/HERE TO INITIALIZE THE SYNCHRONOUS RECEIVER
/ CALL	JMS	SCHK77
/	RETURN
SCHK77,	0

IFNZRO FTDP01 <	DPCRA	>	/CLEAR RECEIVE ACTIVE

IFZERO FTDP01 <
	DPSCSD			/CLEAR SYNC DETECT
	JMS	SCHK76		/RESET WC & CA
>/END OF IFZERO FTDP01

	JMP I	SCHK77

/	SUBROUTINE TO BUILD BEGINNING OF OUTPUT BUFFERS
SCHKA1,	0
	TAD	(SYNCHS-1
	DCA	CHAUTO
	TAD	(-20		/16
	DCA	CHK6
SCHKA2,	TAD	(SYN
	DCA I	CHAUTO
	ISZ	CHK6
	  JMP	SCHKA2
	TAD	(STARTC-1	/BEGINNING OF CONTROL
	DCA	CHAUTO
	TAD	(CTLBUF-1	/WHERE IT HAS TO GO
	DCA	CHAUTO-1
	TAD	(-10-6		/BOTH CTL AND 1ST DATA BUFFER
	JMS	CHCOPY		/COPY IT
	TAD	(STARTD-1
	DCA	CHAUTO
	TAD	(T10BF2-1
	DCA	CHAUTO-1
	TAD	(-6
	JMS	CHCOPY
	TAD	(T10LST-1
	DCA	CHAUTO-1
	TAD	(STARTD-1
	DCA	CHAUTO
	TAD	(-6
	JMS	CHCOPY
	JMP I	SCHKA1
CHCOPY,	0
	DCA	CHK6
CHCOPL,	TAD I	CHAUTO
	DCA I	CHAUTO-1
	ISZ	CHK6
	  JMP	CHCOPL
	JMP I	CHCOPY

	PAGE
SCHK80,
	XISTOG	PDP8E
IFZERO PDP8E <
/	***********************************************************
/	***********************************************************
/	***							***
/	***		CHECK KG8E IS OK			***
/	***							***
/	***********************************************************
/	***********************************************************

	CDFCNK			/SET RIGHT DATA FIELD
	NL0			/CLEAR AC
	TAD	(0100		/MASK TO SET 16-BIT CRC+BCC
	BCCLCL			/LOAD CONTROL REGISTER
	BCCCLR			/CLEAR CRC ACCUMLUATION
	NL0			/CLEAR AC
	DCA	CHK6		/CLEAR CRC ACCUMULATION
	DCA	CHK7		/ DITTO
	DCA	CHK5		/FIRST CHAR TO ADD TO MESSAGE
SCHK81,	TAD	CHK5		/GET NEXT CHAR TO COMPUTE CRC ON
	JMS	SCHK78		/GO CALCULATE CRC
	TAD	CHK5		/GET CHARACTER
	BCCGEN			/MAKE KG8E COMPUTE CRC ALSO
	CLA			/CLEAR OUT AC
	BCCRDH			/GET HIGH ORDER PART OF CRC
	NEGATE
	TAD	CHK6
	SZA CLA			/CHECK FOR CALCULATION OK SO FAR
	  JMP	SCHK83		/NO GO
	BCCRDL			/GET LOW ORDER PART OF CRC
	NEGATE
	TAD	CHK7		/ADD CALCULATED VALUE
	SZA CLA
	  JMP	SCHK83		/LOST ON LOW ORDER CHAR
	ISZ	CHK5
	TAD	CHK5
	AND	(0400		/MASK FOR OVERFLOW
	SNA CLA			/HAVE WE DONE ALL 256 POSSIBLE CHARS ?
	  JMP	SCHK81		/NOT YET
/HERE BECAUSE DC72 HAS A WORKING KG8E
	CDFINS			/POINT TO INSTRUCTION FIELD
	TAD	(BCCGEN		/CHANGE CRCALC TO USE KG8E
	DCA I	(CRCALC+1
	TAD	(DCA TEMP1
	DCA I	(CRCALC+2
	TAD	(BCCRDL
	DCA I	(CRCALC+3
	TAD	(DCA CRC2
	DCA I	(CRCALC+4
	TAD	(BCCRDH
	DCA I	(CRCALC+5
	TAD	(DCA CRC1
	DCA I	(CRCALC+6
	TAD I	(CRCRET
	DCA I	(CRCALC+7
	TAD	(BCCCLR		/CHANGE DCA CRC TO BCCCLR
	DCA I	(CRCXI1
	TAD	(BCCCLR
	DCA I	(CRCXI2
	TAD	(BCCCLR
	DCA I	(CRCXI3
	TAD	(BCCCLR
	DCA I	(CRCXI4
	TAD	(BCCCLR
	DCA I	(CRCXI5
	TAD	(FIRCNK-1000	/CHANGE START OF CHUNKS (DON'T NEED BCC TABLE)
	DCA I	(FIRADR
	JMP	SCHK90

/HERE BECAUSE KG8E NOT INSTALLED OR NOT WORKING
SCHK83,	JMS	INBTYP	/TYPE CR/LF/%/%
	JMS	INLTYP
	"K;"G;"8;"E;" ;"N;"O;"T;" ;"W;"O;"R;"K;"I;"N;4000+"G
	JMP	SCHK90

	PAGE
>/END OF IFZERO PDP8E
	XISTOG	PDP8E
/HERE TO SEE IF LINE PRINTER IS LS8E(CENTRONICS) OR LE8(LP02)

SCHK90,	CDFCNK			/RESET NORMAL DATA FIELD
	LISTOG	LPTN
	IFNZRO LPTN <
	LPTCLF			/CLEAR LPT FLAG
	LPTSKF			/IS FLAG STILL UP ?
	  JMP	SCHK92		/NO SO OK
SCHK91,	JMS	INFTYP		/TYPE CR/LF/?
	JMS	INLTYP
	"L;"P;"T;4240
	JMS	SCHK93		/TYPE FLAG WON'T CLEAR
	HLT
	JMP	SCHK90		/TRY AGAIN IF HE CONTINUES

SCHK92,	LPTSTF			/SET THE FLAG IF THIS IS AN LS8E
	LPTSKF			/SKIP ON FLAG
	  JMP	SCHK96		/THIS IS AN LE8=LP08
/CENTRONICS PRINTER SO ADJUST TIMEOUTS
	LPTCLF
	LPTSKF
	  SKP			/GOOD - WE CLEARED FLAG
	JMP	SCHK91		/FATAL - CAN'T CLEAR FLAG
	CDFINS			/WE ARE CHANGING DATA IN FIRST FIELD
	TAD	(LPTSIE		/USE THIS TO CLEAR INTERRUPT ENABLE
	DCA I	(LPXXCE		/SET IN LPTFIN
	TAD	(NOP
	DCA I	(LPXXSE
	TAD	(NOP
	DCA I	(LPXYSE
	TAD	(-200		/TWO SECONDS ON A FORM FEED
	DCA I	(LPTTFF
	TAD	(-100		/ONE SECOND ON RANDOM CHAR
	DCA I	(LPTTCH
	CDFCNK			/BACK TO NORMAL DATA FIELD

>/END OF IFNZRO LPTN
	LISTOG	LPTN

SCHK96,

	TAD	(377		/START WITH THE LAST ENTRY IN THE TABLE
	DCA	CHK3
	DCA	CHK6		/CLEAR HALF OF CRC
	DCA	CHK7		/CLEAR REST OF CRC
	TAD	CHK3		/GET CHAR TO MAKE CRC FOR
	JMS	SCHK78		/GO COMPUTE THE CRC FOR IT
	TAD	CHK3
	TAD	(CRCTAB
	DCA	CHK1
	TAD	CHK7
	DCA I	CHK1
	TAD	CHK1
	TAD	(400
	DCA	CHK1
	TAD	CHK6
	DCA I	CHK1
	NLM1
	TAD	CHK3
	SMA			/HAVE WE FILLED THE TABLE ?
	  JMP	SCHK96+1	/NOT YET SO KEEP ON
	NL0

	JMP	SCHK94

SCHK93,	0
	JMS	INLTYP
	"F;"L;"A;"G;" ;"W;"O;"N;"';"T;" ;"C;"L;"E;"A;4000+"R
	JMP I	SCHK93

	PAGE
/HERE WHEN DONE CHECKING SYSTEM
SCHK94,	CDFINS

	NL0
	TAD	(F10TCH-1	/ADDRESS OF TEST CHAR TABLE
	DCA	AUTO1

/FILL OUT THE SPECIAL CHAR TABLE

	TAD	(SOH		/START OF A NUMBERED MESSAGE
	DCA I	AUTO1
	TAD	(ENQ
	DCA I	AUTO1
	TAD	(ENQ
	DCA I	AUTO1		/PAD OUT TABLE
	TAD	(ENQ
	DCA I	AUTO1		/PAD OUT TABLE

/HERE TO BUILD NODE ID MESSAGE
	CDFCNK			/POINT TO DATA FIELD
	DCA	CHK6		/INITIALIZE THE CRC CALCULATION
	DCA	CHK7
	TAD	(NCLNID		/ADDRESS OF MESSAGE
	DCA	AUTO1		/SET UP AUTO INDEX REGISTER
	DCA I	(NCLNID		/CLEAR COUNTER
	NL6			/NCL-NODE-ID MSG TYPE IS 6
	JMS	SCHK95		/PUT INTO MSG
	JMS	SCHK95		/FIELD FOR #
	JMS	SCHK95		/FIELD FOR #
	Z=OURNNM&177		/ONLY 7 BITS
	TAD	(Z		/OUR NODE NUMBER
	JMS	SCHK95		/PUT INTO NODE ID MSG
	TAD	(OURID		/POINTER TO NAME FIELD
	DCA	CHK3		/SAVE POINTER
SCHKNI,	TAD	CHK3
	IAC
	DCA	CHK1
	TAD I	CHK1
	AND	(200
	SNA CLA
	  JMP	SCHKSI		/PUT SOFTWARE ID IN NOW
	TAD I	CHK3		/GET NEXT CHAR
	AND	(177		/STRIP EXTRA BITS
	TAD	(200		/FLAG FOR EXTENSIBLE FIELD
	JMS	SCHK95		/PUT INTO THE MESSAGE
	ISZ	CHK3		/ADVANCE CHAR POINTER
	JMP	SCHKNI		/AND BACK FOR MORE
SCHKSI,	TAD I	CHK3		/GET LAST CHAR OF NAME
	AND	(177		/STRIP EXTRA BITS
	JMS	SCHK95		/AND PUT INTO NODEID
	TAD	(SID-1		/POINT TO SOFTWARE ID
	DCA	CHAUTO		/SAVE ADDRESS OF COUNT
	TAD I	CHAUTO		/GET COUNT (NEG NO OF CHARACTERS)
	DCA	CHK3		/STORE FOR LOOP CONTROL
SCHSID,	TAD I	CHAUTO		/GET NEXT CHARACTER
	JMS	SCHK95		/PUT CHARACTER INTO MESSAGE
	ISZ	CHK3		/TEST IF LAST
	  JMP	SCHSID		/ELSE GO BACK FOR MORE
	TAD	CHK7		/GET HALF OF BCC
	DCA I	AUTO1		/PUT AFTER MSG
	TAD	CHK6		/GET REST OF BCC
	DCA I	AUTO1		/PUT AFTER MSG ALSO
	JMP	SCHK97
SCHK95,	0
	DCA	CHK1		/HOLD CHAR A SEC
	TAD	CHK1		/ GET IT AGAIN
	DCA I	AUTO1		/PUT NEXT CHAR INTO THE MESSAGE
	TAD	CHK1		/GET CHAR AGAIN
	JMS	SCHK78		/INCLUDE IN BCC
	ISZ I	(NCLNID		/COUNT CHAR
	JMP I	SCHK95
SCHK97,
	CDFINS

	NL0			/DEFENSIVE CODE
	DCA I	(INICIF		/CHANGE CIFCNK TO AND 0
IFZERO PDP8E <TAD	(CAF>	/MAKE INTO CLEAR ALL FLAGS ON PDP8E
	DCA I	(INIJMP		/CHANGE JMP I (SYSCHK TO 0
	CDFCNK			/SET NORMAL CHUNK FIELD
	CIFINS			/SET NORMAL INSTRUCTION FIELD
	JMP I	(INIJMP		/RETURN TO INITIALIZATION
/HERE TO SEE IF CLOCK HAS TIMED OUT
/ CALL	JMS	SCHK98
/	RETURN		/IF INISEC HAS NOT TIMED OUT
/	RETURN		/IF INISEC WENT TO ZERO
SCHK98,	0
	NL0
	CLKSCF			/SKIP ON CLOCK FLAG
	  JMP I	SCHK98		/HASN'T TICKED

IFZERO PDP8E <			/BECAUSE 8E CLOCKS TICK TWICE AS FAST
	ISZ	INISEC+1	/ COUNT INISEC+1 EVERY TICK
	  NOP			/ AND INISEC ON EVERY OTHER TICK
	NL1
	AND	INISEC+1
	SNA CLA
	  JMP I	SCHK98
>/END OF IFZERO PDP8E

	ISZ	INISEC		/CLOCK HAS TICKED - DID TIMER EXPIRE ?
	  JMP I	SCHK98		/NO SO JUSTRETURN
	ISZ	SCHK98		/YES SO SKIP RETURN
	JMP I	SCHK98

/TIMERS FOR SYSCHK CODE
INISEC,	0
	0

SID,	0			/LENGTH (MINUS)
	SIDTXT
SIDEND,
	*SID
	ZZ=SID+1-SIDEND
	ZZ
	PAGE
/HERE TO TYPE A MESSAGE WHILE IN THE SYSCHK CODE
/ CALL	JMS	INITYP		/WITH MSG ADR-1 IN AC
/	RETURN			/AFTER MSG IS TYPED
INITYP,	0
	DCA	AUTO1		/SAVE MSG ADR IN AUTOINDEX REGISTER
INITY1,	TAD I	AUTO1		/GET NEXT CHAR FROM MSG
	JMS	INITY8
	SMA CLA			/IS MESSAGE FINISHED ?
	  JMP	INITY1
	JMP I	INITYP
INITY8,	0
	DCA	INICHR		/SAVE CHAR TO TYPE
	TAD	INICHR
	AND	(0177		/STRIP PARITY
	TAD	(-40
	SPA CLA			/IS CHAR A CR/LF(MAYBE) ?
	  DCA	INIFLG		/YES SO TURN OFF ^O IF IT WAS ON
	TAD	INIFLG		/GET CONTROL O FLAG
	SZA CLA			/IF IT IS ON DON'T TYPE CHAR
	  JMP	INITY9		/IT WAS ON
	TAD	INICHR
	CTYTLS
	CTYTSF
	JMP	.-1
	CTYTCF			/CLEAR FLAG

	CTYKSF			/SKIP ON KEYBOARD FLAG
	  JMP	INITY9
	CTYKRB			/GET CHAR
	NLM1
	DCA	INIFLG
INITY9,	NL0
	TAD	INICHR		/GET CHAR AGAIN
	JMP I	INITY8
INIFLG,	0			/SET NONZERO IF USER TYPES IN WHILE SYSCHK IS TYPING OUT
				/ WILL FLUSH TTY OUTPUT TO NEXT CR/LF
INICHR,	0			/CHAR TO TYPE
INITMP,	0			/LOCATION TO GO INDIRECT ON TO GET PARITY FOR CHAR

INIOCT,	0
	DCA	CHK3
	TAD	CHK3
	AND	(7000
	SZA CLA
	  JMP	INIOC4		/PRINT ALL FOUR DIGITS
	TAD	CHK3
	AND	(0700
	SZA CLA
	  JMP	INIOC3		/PRINT THREE DIGITS ONLY
	TAD	CHK3
	AND	(0070
	SZA CLA
	  JMP	INIOC2		/PRINT TWO DIGITS ONLY
	JMP	INIOC1		/ONLY ONE DIGIT
INIOC4,	TAD	CHK3
	RTL
	RTL
	JMS	INITYO
INIOC3,	TAD	CHK3
	RTR
	RTR
	RTR
	JMS	INITYO
INIOC2,	TAD	CHK3
	RTR
	RAR
	JMS	INITYO
INIOC1,	TAD	CHK3
	JMS	INITYO
	JMP I	INIOCT

INITYO,	0
	AND	(0007
	TAD	(0060		/CONVERT TO OCTAL
	JMS	INITY8		/TYPE CHAR
	NL0
	JMP I	INITYO

/ROUTINE TO TYPE INLINE MESSAGE
INLTYP,	0	
	NL0
INLTY2,	TAD I	INLTYP
	JMS	INITY8
	ISZ	INLTYP		/TYPE NEXT CHAR
	SMA CLA
	JMP	INLTY2
	JMP I	INLTYP

/HERE TO TYPE CR/LF??
INFTYP,	0
	JMS	INLTYP
	FATMSG
	4207			/FINAL BELL
	JMP I	INFTYP

/HERE TO TYPE CR/LF/%
INBTYP,	0
	JMS	INLTYP
	215;215;215;12;207;207;"%;4000+"%
	JMP I	INBTYP

/HERE TO TYPE DP8E OR DP01
INDTYP,	0
	JMS	INLTYP
IFNZRO FTDP01 < "D;"P;"0;"1;4240 >
IFZERO FTDP01 <	"D;"P;"8;"E;4240 >
	JMP I	INDTYP
FIELD	0

*DC72		/STARTING ADDRESS FOR LOADER

$