)+
.ENDC
.IFTF
MTDONE:
.IFT
	JMP	FSMDON
.ENDC
$DONE::	TSTB	$FLG
	BNE	$RTS
.IF NE	MMG$T
	MOV	PC,R4
	ADD	#MTCQE-.,R4
	MOV	@#MONLOW,R5
	TST	SINK
	BNE	1$
	JMP	@QCOMP(R5)
1$:	CLR	SINK
	JSR	PC,@QCOMP(R5)
	MOV	PC,R4
	ADD	#SYNBLK-.,R4
	.SYNCH
	 BR	BADSYN
	MOV	ERBSAV,R1
	BIS	#30000,@#177776
	MOV	R0,-(SP)
	MTPI	(R1)+
	MOV	ERRBL2,-(SP)
	MTPI	(R1)+
BADSYN:	RTS	PC
.IFF
	.DRFIN	MT
.ENDC
$RTS:	CLRB	$FLG
	RTS	PC
.SBTTL	STATUS REPORT COME HERE IF NO ABORTS ISSUED
NOERR:	CLR	ERRSUM
CONT:	BTTL	RECOVERY-FORWARD SPACE WAS THE LAST COMMAND
FORE:	MOV	@#MTBRC,R5
	BNE	BACH1
FORE1:	MOV	#MTCMA,R5
	MOV	OLDBA,@R5
	MOV	OLDWC,-(R5)
	ASL	@R5
	NEG	@R5
	MOV	#FN+READF,R4
	MOVB	FUNTAB,R5
	BR	BACH3
.SBTTL	RECOVERY-BACKSPACE WAS LAST COMMAND
.ENABL	LSB
BACH:	CMPB	#FN+READF,RECOVERY
	BEQ	1$
	MOV	OLDWC,R4
	ASL	R4
	NEG	R4
	MOV	R4,@#MTBRC
	MOV	OLDBA,@#MTCMA
	MOV	#FN+WRTXTD,R4
	MOVB	FUNTAB+4,R5
	BR	4$
1$:	MOV	@#MTBRC,R5
	BEQ	6$
	BIT	#BOT,@#MTS
	BEQ	5$
2$:	ADD	#4,R5
	BEQ	FORE1
3$:	NEG	RTSTB	RECOVERY
	BPL	RECOVR
PTCH:	MOV	@#MTS,R4
	MOV	LASTCOM,R5
	TST	ERRSUM
	BEQ	NEXT0
	CMP	#FN+READF,R5
	BNE	1$
	MOVB	#5,BACK1
	MOVB	#8.,BACK5
	BR	2$
1$:	MOV	#FN+WRTXTD,R5
2$:	MOVB	R5,RECOVERY
	BR	REEDF1
NEXT0:	CMP	#FN+REWIND,R5
	BNE	NEXT1
	BIT	#BOT,R4
	BNE	REWHYN
	MOVB	R5,RECOVERY
	RTS	PC
NEXT1:	CMP	#FN+READF,LASTCOM
	BNE	NEXT2
	BIT	#EOF,R4
	BNE	NEXT3
	BIT	#RLE,R4
	BEQ	1$
	MOV	#RECERR,R4
	BR	ABORT
1$:	MOV	@#MTBRC,R5
	BEQ	NEXT2
	ASR	R5
	NEG	R5
.IF NE	MMG$T
	MOV	R5,ERRBL2
.IFF5
BACH1:	MOV	R5,@#MTBRC
	MOV	#FN+FWDSPC,R4
	MOVB	FUNTAB+6,R5
BACH3:
4$:	MOV	R4,LASTCOM
.IIF	NE	MMG$T,	BIS	EXTADR,R5
	MOVB	R5,@#MTC
	RTS	PC
BACH2:
5$:	MOV	#FN+BKSPC,R4
	MOVB	FUNTAB+5,R5
	BR	4$
6$:	TSTB	BACK1
	BEQ	2$
	BR	FORE1
.DSABL	LSB
.SBTTL	XBUMP SUBROUTINE
.IF NE	MMG$T
XBUMP:	MOV	MTCQE,-(SP)
	ADD	#Q$PAR,@SP
	ADD	#10,@(SP)+
	ADD	#512.,OLDBA
	BCC	1$
	ADD	#20,EXTADR
1$:	RTS	PC
.ENDC
.SBTTL	DISPATCH SUBROUTINE
DISPAT:	ADD	@SP,R4
	MOVB	FUNTAB-TABLE(R4),R5
	MOVB	@R4,R4
	ADD	(SP)
.IF DF	MT$FSM
	MOV	@MTCQ,R4
.IFF
	MOV	@MTCQE,R4
.ENDC
	BEQ	2$
	MOV	R5,2(R4)
.ENDC
2$:	MOV	#SMLREC,R4
.IF NE	MMG$T
	JMP	ABORT
.IFF
	BR	ABORT
.ENDC
NEXT2:	CMP	#FN+FWDSPC,LASTCOM
	BEQ	1$
	CMP	#FN+BKSPC,LASTCOM
	BNE	NEXT3
1$:	MOV	@#MTBRC,R4
	BEQ	NEXT3
.IF NE	MMG$T
	MOV	R4,ERRBL2
.IFF
	NEG	R4
.IF DF	MT$FSM
	MOV	@MTCQ,R5
.IFF
	MOV	@MTCQE,R5
.ENDC
	BEQ	2$
	MOV	R4,2(R5)
.ENDC
2$:
.ENABL	LSB
NEXT3:	MOV	@#MTS,R5
	CLR	R4
	BIT	#BOT,R5
	BEQ	1$
	CMP	#FN+REWIND,LASTCOM
MTD1:	BEQ	MT+,R4
	JMP	@R4
.SBTTL	MAGTAPE DATA AREA
$TBL:	.REPT	MT$UN
	.BYTE	-1
	.ENDR
	.BYTE	-2
$FLG:	.BYTE	0
	.EVEN
RECOVE:	.BYTE	-1
TAPELE:	.BYTE	ERRGAPS
BACK5:	.BYTE	0
BACK1:	.BYTE	0
LASTCO:	.WORD	DUMMY
OLDBA:	.WORD	DUMMY
.IIF NE MMG$T,	EXTADR:	.WORD	DUMMY
OLDWC:	.WORD	DUMMY
ERRSUM:	.WORD	DUMMY
NFSREA:	.WORD	DUMMY
	.EVEN
.IF NE	MMG$T
SYNBLK:	.WORD	DUMMY
JOBNM:	.WORD	DUMMY
	.WORD	DUMMY,DUMMY
TEMP:	.WORD	DUMMY
	.WORD	-1,0
SINK:	.WORD	DUMMY
ERBSAV:	.WORD	DUMMY
ERRBL2:	.WORD	DUMMY
.ENDC
.IDONE
	CMP	#FN+OFFLINE,LASTCOM
	BEQ	MTDONE
	CMP	(R4)+,(R4)+
	BR	4$
1$:	BIT	#EOF,R5
	BEQ	2$
	CMP	#FN+WRTEOF,LASTCOM
	BEQ	2$
	INC	R4
2$:	BIT	#EOT,R5
	BEQ	3$
	TST	NFSREAD
	BNE	3$
	CMPB	(R4)+,(R4)+
3$:	TST	R4
	BEQ	MTD1
4$:	MOV	#CSWEOF,-(SP)
	JMP	EXCEP
.DSABL	LSB
.SBTTL	RECOVERY IN PROGRESS DISPATCHER
RECOVR:	MOV	LASTCOM,R4
	JSR	PC,DISPAT
TABLER:	.BYTE	REEDF-TABLER
	.BYTE	RITE-TABLER
	.BYTE	DUMMY
	.BYTE	REWHYN-TABLER
	.BYTE	RITEX-TABLER
	.BYTE	BACH-TABLER
	.BYTE	FORE-TABLER
	.BYTE	DF DF	MT$FSM
MTCQ::	.WORD	DUMMY
DRIVEN==MT$UN
DVINFO::.REPT	DRIVEN
	.WORD	-1
	.WORD	-1
	.WORD	-1
	.BYTE	DUMMY
	.BYTE	0
	.WORD	DUMMY,DUMMY,DUMMY
	.ENDR
.ENDC
.IF NDF	MT$FSM
	.DREND	MT
.IFF
	.GLOBL	$FKPTR,$INPTR
.IIF NE MMG$T,	.GLOBL	$RLPTR,$MPPTR,$GTBYT,$PTBYT,$PTWRD
.IIF NE ERL$G,	.GLOBL	$ELPTR
.IIF NE TIM$IT,	.GLOBL	$TIMIT
.ENDC
SIZE=.
SIZED=SIZE-MTSTRT/2
.END
                                                                                                                              
1$:	BIT	#NXM,R4
	BEQ	2$
	MOV	#MEMERR,R4
4$:	TST	(SP)+
	BR	ABORT
2$:	CLR	R5
	BIT	#CRE+PAE+BGL,R4
	BEQ	3$
	COM	R5
3$:	RTS	PC
.SBTTL	ERROR-ABORT OPERATION IN PROGRESS
ERREWD:
EROFFL:
NQUAL:	CLR	R4
ABORT:	MOV	#PWRCLR,@#MTC
	MOV	#CSWHERR,-(SP)
EXCEP:
.IF DF	MT$FSM
	MOV	(SP)+,R5
	JMP	FSMERR
.IFF
	MOV	MTCQE,R5
	BIS	(SP)+,@Q.CSW(R5)
	TST	@R5
	BEQ	MTDONE
.IF NE	MMG$T
	COM	SINK
	MOV	@R5,ERBSAV
	MOV	R4,TEMP
	MOVB	Q.JNUN(R5),R5
	ASR	R5
	ASR	R5
	ASR	R5
	MOV	R5,JOBNM
.IFF
	MOV	R4,@(R5UMMY
.SBTTL	RECOVERY-WRITE WAS LAST COMMAND
RITEX:
RITE:	TST	ERRSUM
	BEQ	NEXT1
	INCB	TAPELEN
	BEQ	NQ2
	BIT	#EOT,@#MTS
	BEQ	REEDF1
NQ2:	JMP	NQUAL
.SBTTL	RECOVERY-REWIND WAS THE LAST COMMAND
REWHYN:	MOV	#PWRCLR,@#MTC
	JMP	MTDONE
.SBTTL	RECOVERY-READ WAS THE LAST COMMAND ISSUED
.ENABL	LSB
REEDF:	TST	ERRSUM
	BEQ	FOO
	DECB	BACK1
	BEQ	2$
	BGT	REEDF1
	MOVB	#5,BACK1
	DECB	BACK5
	BEQ	NQ2
REEDF1:	MOV	#-1,R5
	BR	3$
2$:	MOV	#-5,R5
3$:	MOV	R5,@#MTBRC
	BR	BACH2
FOO:	JMP	PTCH
.DSABL	LSB
.S       Cœ 7$     
?BOOT-U-No boot on volume

€ ß‹tÿý€”vÿú€ÿ                                                                                                                                                                                                                                                                                                                                                                                                                                                          åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå  åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå  åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå    åååååååååååååå  Qfodos-3   disket #6    FODOS    åååå        „Px  kQ   ®$ „˜  kQ   ®$ „Ð%  kQ   ®$ „  kQ   ®$ „x–  kQ   ®$ „…(  kQ   ®$ „¨  kQ   ®$ „   kQ   ®$ „€  kQ	   ®$ „  kQ   ®$ „˜  kQ   ®$ „à—  kQ   ®$ „@y  kQ'   ®$ „H  kQ   ®$ „À  kQ   ®$ „è  kQ   ®$ „ K  kQ,   ®$ „€M  kQ   ®$ „øM  kQ   ®$ „`Y  kQ   ®$ „xd  kQ   ®$ „8r  kQ
   ®$ „ €  kQ   ®$ „ˆ‹  kQ   ®$ „tT\!kQ   ®$ „tT„:kQ-   ®$ „ !  kQ   ®$ „#!Y`kQ   ®$ „)!üXkQ   ®$ „4!C	kQ   ®$ „""Ô€kQ   ®$ Õ 9gô&  Ž! Õ 9gô&  Ž!  !  kQ   
 8r  kQ
   N	  €  kQ   åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå. ˆ‹  kQ   N	 ­Œ¸kQ   l #!Y`kQ   N	 )!üXkQ   
 4!C	kQ   N	 ""Ô€kQ   l à  kQ   .  K  kQ   n   kQ   N	 tT„:kQ-   ® tT\!kQ   ú Õ 9gô&   û3 ˆ‹  kQ   l ­Œ¸kQ   l #!Y`kQ   N	 )!üXkQ   
 #!Y`kQ   l 4!C	kQ   N	 4!C	kQ   l ""Ô€kQ   l tT\!kQ   N	 tT„:kQ,   
 tT\!kQ   l   kQ   N	   kQ   N	   kQ   N	 ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååBF	= 0
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        NTER	=	4
	LOOKUP	=	3
	DELETE	=	2
	CLOSE	=	1
	REDWRT	=	0
	WRTEOF	=	-1
	FWDSPC	=	-2
	BKSPC	=	-3
	WRTXTD	=	-4
	REWIND	=	-5
	OFFLINE	=	-6
	WRITEPHY=	-7
	READF	=	-8.
	STR100	=	-9.
	FN	=	8.
	ILLARG	=	5
	DEVINUSE=	2
	CSWHERR	=	1
	CSWEOF	=	20000
	SPUSR	=	272
	ERRGAPS	=	-101.
	NOQUAL	=	0
	DRIVEGONE =	1
	POSERR	=	2
	MEMERR	=	3
	WRITELOK=	4
	RECERR	=	5
	SMLREC	=	6
	NOQUAL	=	0
	EOFCODE	=	1
	EOTCODE	=	2
	EOFEOT	=	3
	BOTCODE	=	4
	Q.CSW	=	-2
	Q.BLK	=	0
	Q.FUNC	=	2
	Q.JNUN	=	3
	Q.BUF	=	ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååBF	= 1
MMG$T	= 1
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååBF	= 1
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå.MCALL	.MODULE
.MODULE	TM,RELEASE=B03,VERSION=01

.SBTTL	MT (TM11) MAGTAPE HANDLER
.IIF NDF MT$FSM .FSM = 100000
.AUDIT	.FSM
ELTM	== 2
.SBTTL	DRIVER EDIT LEVEL
.ASECT
.=110
	.WORD	ELTM
.PSECT
.SBTTL	NOTES ON TM11 HANDLER
	.ENABL	LC
.SBTTL	HARDWARE DEFINITIONS
.MCALL	.DRDEF
.IIF NDF MT$UN,	MT$UN	== 1
.DRDEF	MT,11,SPECL$!SPFUN$!HNDLR$,0,172520,224
MTS	= MT$CSR
	ILC	=	100000
	EOF	=	40000
	CRE	=	20000
	PAE	=	10000
	BGL	=	4000
	EOT	=	2000
	RLE	=	1000
	BTEOPI	=	400
	NXM	=	200
	SELR	åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå=	100
	BOT	=	40
	CH7	=	20
	SDWN	=	10
	WRL	=	4
	RWS	=	2
	TUR	=	1
MTC	= MTS+2
	ERR	=	100000
	D7$200	=	0
	D7$556	=	20000
	D7$800	=	40000
	D7$CORE	=	60000
	D9$800	=	60000
	PWRCLR	=	10000
	PEVN	=	4000
	UNIT	=	3400
	CURDY	=	200
	INTENB	=	100
	FOFF	=	0
	FREAD	=	2
	FWRITE	=	4
	FWRTTM	=	6
	FSPFOR	=	10
	FSPBAK	=	12
	FWRTEXT	=	14
	FREWIND	=	16
	GO	=	1
MTBRC	=	MTS+4
MTCMA	=	MTS+6
MTD	=	MTS+8.
MTRD	=	MTS+10.
	GPSDN	=	10000
	PR5	=	5
	PR7	=	7
.SBTTL	SOFTWARE DEFINITIONS
	RENAME	=	5
	E0$
	TST	(SP)+
	MOV	MTCQE,R5
	BIS	#CSWHERR,@-(R5)
	JMP	MTDONE
10$:	MOV	(SP)+,EXTADR
.ENDC
.IF NDF	MT$FSM
	MOV	MTCQE,R3
.IFF
	JMP	FSMDIS
$MT::
.ENDC
	TST	(R3)+
	MOV	@R3,R0
	MOVB	R0,R4
	BIC	#^C<UNIT>,R0
	MOV	R0,R1
	SWAB	R1
	BIS	(PC)+,R0
DENSE:	 .WORD	D9$800
	MOV	R0,@#MTC
	CLR	NFSREAD
	MOV	PC,R0
	ADD	#RECOVE-.,R0
	MOV	R1,R5
	ADD	PC,R5
	ADD	#$TBL-.,R5
	MOV	@R3,R2
	SWAB	R2
	ASR	R2
	ASR	R2
	ASR	R2
	BIC	#177740,R2
.IF NE MMG$T
	MOVB	R2,JOBNM
.ENDC
	CMP	#LOOKUP,R4
	BNE	7$
.FOO	R3
	BIC	#177740,R3
	CMP	R3,R4
	BNE	7$
	CLRB	$FLG
	MOV	#PWRCLR,@#MTC
5$:
.IF DF	MT$FSM
	MOV	R0,-(SP)
	MOV	DVTBL,R0
	BEQ	6$
	MOV	#-1,(R0)+
	MOV	#-1,@R0
6$:	MOV	(SP)+,R0
.ENDC
7$:	CMPB	R4,@R5
	BNE	10$
	MOVB	#-1,@R5
10$:	CMPB	#-2,(R5)+
	BNE	7$
	MOV	(SP)+,R3
	JMP	$DONE
.SBTTL	INTERRUPT ENTRY POINT
	.DRAST	MT,PR5,MTABRT
.SBTTL	ERROR-ERROR ROUTINE DISPATCHER
	TST	MTCQE
	BNE	114$
	JMP	$RTS
114$:	TST	@#MTC
	BMI	1$
.IF NE	MMG$T
	JMP	NOERR
.IFF
	BR	NOERR
.ENDC
1$:	MOV	@#MTS,R4
	BPL= 0
.IF NE	MMG$T
.IF NDF	MT$FSM
.FOO	= 1
	MOV	MTCQE,R4
	JSR	PC,@$GTBYT
	TSTB	(SP)+
	BNE	5$
	JSR	PC,@$GTBYT
	TSTB	(SP)+
	BNE	5$
.ENDC
.ENDC
.IF EQ	.FOO
	TST	@2(R3)
	BNE	11$
.ENDC
	CMPB	#-1,@R5
	BEQ	3$
.IF NDF	MT$FSM
	MOV	#DEVINUSE,R0
2$:	MOV	@#MONLOW,R1
	MOV	R0,SPUSR(R1)
	BR	12$
.IFF
	MOV	@#MONLOW,R1
	MOV	#DEVINUSE,SPUSR(R1)
	JSR	PC,RESTOR
	JMP	$DONE
.ENDC
3$:	CLR	4(R3)
	MOVB	R2,@R5
.IF DF	MT$FSM
	BR	12$
.IFF
4$:	MOV	-2(R3),R1
	BEQ	6$
	BGT	5$
	INC	R1
	BEQ	12$
5$:	MOVB		2$
	BIT	#SELR,R4
	BNE	2$
	MOV	#DRIVEGONE,R4
	BR	ABORT
2$:	MOV	LASTCOM,R4
	JSR	PC,DISPAT
TABLEE:	.BYTE	ERREAD-TABLEE
	.BYTE	ERWRIT-TABLEE
	.BYTE	EROFFL-TABLEE
	.BYTE	ERREWD-TABLEE
	.BYTE	ERWRTX-TABLEE
	.BYTE	ERBKSP-TABLEE
	.BYTE	ERFWSP-TABLEE
	.BYTE	ERWRTM-TABLEE
.SBTTL	ERROR-WRITE OR WRITE WITH EXTENDED GAP COMMAND WAS ISSUED LAST AND ERR BIT WAS SET.
.ENABL	LSB
ERWRIT:
ERWRTX:	BIT	#WRL,@#MTS
	BEQ	1$
ERWRI1:	MOV	#WRITELOK,R4
	BR	ABORT
1$:	JSR	PC,ABOCHK
	MOV	R5,ERRSUM
	BNE	CONT
	BI4
	Q.WCNT	=	6
	MONLOW	=	54
	QCOMP	=	270
	DUMMY	=	0
	JOBNUM	=	34000
.SBTTL	INSTALLATION CHECKS
.ASECT
.	= 200
	NOP
	MOV	176,R0
	TSTB	2(R0)
	BPL	1$
	MOV	#1000,2(R0)
	BIT	#1000,2(R0)
	BNE	1$
	SEC
1$:	RTS	PC
.SBTTL	SET COMMANDS
.ASECT
.=400
	NUMARG	=	100
	NOARG	=	200
	.WORD	^C<DUMMY>
	.RAD50	/DENSE/
	.BYTE	<DENS-400>/2
	.BYTE	NUMARG
	.WORD	^C<DUMMY>
	.RAD50	/DUMP/
	.BYTE	<DMP-400>/2
	.BYTE	NOARG
	.WORD	PEVN
	.RAD50	/ODDPAR/
	.BYTE	<PARITY-400>/2
	.BYTE	NOARG
	.WORD	^C<DUMMY>#-1,@R5
	MOV	#ILLARG,R0
	BR	2$
6$:	MOV	#REWIND,R4
	BR	8$
.ENDC
7$:	CMP	#CLOSE,R4
	BNE	8$
	MOVB	#-1,@R5
	BR	12$
8$:	MOV	(PC)+,(R0)+
	.BYTE	-1,ERRGAPS
	TST	(R0)+
	CMP	#STR100,R4
	BEQ	12$
	CMP	#READF,R4
	BLOS	13$
	TST	R4
	BNE	11$
	MOV	R3,R1
	CLR	-2(R1)
	CMP	(R1)+,(R1)+
	MOV	#READF,R4
	TST	@R1
	BPL	9$
	NEG	@R1
	INC	R4
	BR	10$
9$:	COM	NFSREAD
10$:
.IF DF	MT$FSM
	MOV	R4,CODE
.ENDC
	BR	13$
11$:	TST	-(R3)
	BIS	#CSWHERR,@-(R3)
12$:
.IF DF	MT$FSM
	JSR	PC,RESTOR
.ENDC
	JMP	MTDON
	.RAD50	/DEFALT/
	.BYTE	<DFLT-400>/2
	.BYTE	NUMARG
	.WORD	0
DENS:	CLR	R3
	CMP	#200.,R0
	BEQ	DENS1
	CMP	#556.,R0
	BEQ	1$
	CMP	#807.,R0
	BEQ	2$
	CMP	#809.,R0
	BEQ	3$
	CMP	#800.,R0
	BEQ	3$
	SEC
	RTS	PC
1$:	BIS	#D7$556,R3
	BR	DENS1
2$:	BIS	#D7$800,R3
	BR	DENS1
3$:	BIS	#D9$800,R3
DENS1:	BIC	#D9$800,DENSE
	BIS	R3,DENSE
DENS3:	CLC
	RTS	PC
DMP:	CLR	R3
	BR	1$
	BR	DFLT1
1$:	BIS	#D7$CORE,R3
	BR	DENS1
PARITY:	BR	ODD
	NOP
	BIS	R3,DENSE
	BR	DENS3
ODD:	BIC	R3,DENSE
	BR	DENS3
.ENABL	LE
13$:	ADD	#FUNTAB-TABLE,R4
	MOV	R4,(R0)+
.IF NE	MMG$T
	MOV	4(R3),R1
	MOV	R1,4(R0)
.IFF
	TST	(R3)+
	MOV	(R3)+,(R0)+
	MOV	@R3,@R0
	MOV	@R3,R1
.ENDC
	NEG	R1
	JSR	PC,DISPAT
TABLE:	.BYTE	REDEF-TABLE
	.BYTE	RIGHT-TABLE
	.BYTE	AWFLINE-TABLE
	.BYTE	REWHINED-TABLE
	.BYTE	RIGHTX-TABLE
	.BYTE	BAKSPA-TABLE
	.BYTE	FORSPA-TABLE
	.BYTE	RIGHTM-TABLE
FUNTAB:	.BYTE	FREAD+INTENB+GO
	.BYTE	FWRITE+INTENB+GO
	.BYTE	FOFF+INTENB+GO
	.BYTE	FREWIND+INTENB+GO
	.BYTE	FWRTEXT+INTENB+GO
	.BYTE	FSPBAK+INTENB+GSB
DFLT:	CMP	#7,R0
	BEQ	7$
	CMP	#9.,R0
	BEQ	9$
DFLT1:	SEC
	RTS	PC
9$:	MOV	#D9$800,DENSE
	BR	DENS3
7$:	MOV	#D7$CORE,DENSE
	BR	DENS3
.DSABL	LSB
.SBTTL	DISPATCHER
.IIF NE	MMG$T,	.MCALL	.SYNCH
.IF DF	MT$FSM
	.GLOBL	FSMDIS,FSMABT,FSMDON,FSMERR,RESTOR,CODE,DVTBL
	.GLOBL	FSMSIZ
	.GLOBL MTCQE
.IF NE	MMG$T
	.GLOBL	OLDBA,XBUMP,EXTADR,JOBNM,SYNBLK,TEMP,SINK,ERBSAV
.ENDC
.ENDC
	.DRBEG	MT
MT:
.IF NE	MMG$T
	MOV	MTCQE,R5
	CMP	(R5)+,(R5)+
	JSR	PC,@$MPPTR
	MOV	(SP)+,OLDBA
	BIT	#1700,@SP
	BEQ	1O
	.BYTE	FSPFOR+INTENB+GO
	.BYTE	FWRTTM+INTENB+GO
REDEF:
RIGHTX:
RIGHT:
.IF NE	MMG$T
	MOV	(R0)+,@#MTCMA
	BIS	@R0,R5
.IFF
	MOV	-(R3),@#MTCMA
.ENDC
	ASL	R1
FORSPA:
BAKSPA:
	MOV	R1,@#MTBRC
AWFLINE:
REWHINED:
RIGHTM:	MOVB	R5,@#MTC
.IF DF	MT$FSM
	JSR	PC,RESTOR
.ENDC
	RTS	PC
.SBTTL	INTERRUPT HANDLER AND ABORT ENTRY POINTS
MTABRT:	MOVB	#-1,$FLG
	MOV	R3,-(SP)
	MOV	PC,R5
	ADD	#$TBL-.,R5
	MOV	MTCQE,R3
	BEQ	7$
	MOVB	Q.JNUN(R3),-(SP);GET JOB NUMBER
	MOVB	(SP)+,R3
	ASR	R3
	ASR	R3
	ASR	)+
.ENDC
.IFTF
MTDONE:
.IFT
	JMP	FSMDON
.ENDC
$DONE::	TSTB	$FLG
	BNE	$RTS
.IF NE	MMG$T
	MOV	PC,R4
	ADD	#MTCQE-.,R4
	MOV	@#MONLOW,R5
	TST	SINK
	BNE	1$
	JMP	@QCOMP(R5)
1$:	CLR	SINK
	JSR	PC,@QCOMP(R5)
	MOV	PC,R4
	ADD	#SYNBLK-.,R4
	.SYNCH
	 BR	BADSYN
	MOV	ERBSAV,R1
	BIS	#30000,@#177776
	MOV	R0,-(SP)
	MTPI	(R1)+
	MOV	ERRBL2,-(SP)
	MTPI	(R1)+
BADSYN:	RTS	PC
.IFF
	.DRFIN	MT
.ENDC
$RTS:	CLRB	$FLG
	RTS	PC
.SBTTL	STATUS REPORT COME HERE IF NO ABORTS ISSUED
NOERR:	CLR	ERRSUM
CONT:	BTTL	RECOVERY-FORWARD SPACE WAS THE LAST COMMAND
FORE:	MOV	@#MTBRC,R5
	BNE	BACH1
FORE1:	MOV	#MTCMA,R5
	MOV	OLDBA,@R5
	MOV	OLDWC,-(R5)
	ASL	@R5
	NEG	@R5
	MOV	#FN+READF,R4
	MOVB	FUNTAB,R5
	BR	BACH3
.SBTTL	RECOVERY-BACKSPACE WAS LAST COMMAND
.ENABL	LSB
BACH:	CMPB	#FN+READF,RECOVERY
	BEQ	1$
	MOV	OLDWC,R4
	ASL	R4
	NEG	R4
	MOV	R4,@#MTBRC
	MOV	OLDBA,@#MTCMA
	MOV	#FN+WRTXTD,R4
	MOVB	FUNTAB+4,R5
	BR	4$
1$:	MOV	@#MTBRC,R5
	BEQ	6$
	BIT	#BOT,@#MTS
	BEQ	5$
2$:	ADD	#4,R5
	BEQ	FORE1
3$:	NEG	RTSTB	RECOVERY
	BPL	RECOVR
PTCH:	MOV	@#MTS,R4
	MOV	LASTCOM,R5
	TST	ERRSUM
	BEQ	NEXT0
	CMP	#FN+READF,R5
	BNE	1$
	MOVB	#5,BACK1
	MOVB	#8.,BACK5
	BR	2$
1$:	MOV	#FN+WRTXTD,R5
2$:	MOVB	R5,RECOVERY
	BR	REEDF1
NEXT0:	CMP	#FN+REWIND,R5
	BNE	NEXT1
	BIT	#BOT,R4
	BNE	REWHYN
	MOVB	R5,RECOVERY
	RTS	PC
NEXT1:	CMP	#FN+READF,LASTCOM
	BNE	NEXT2
	BIT	#EOF,R4
	BNE	NEXT3
	BIT	#RLE,R4
	BEQ	1$
	MOV	#RECERR,R4
	BR	ABORT
1$:	MOV	@#MTBRC,R5
	BEQ	NEXT2
	ASR	R5
	NEG	R5
.IF NE	MMG$T
	MOV	R5,ERRBL2
.IFF5
BACH1:	MOV	R5,@#MTBRC
	MOV	#FN+FWDSPC,R4
	MOVB	FUNTAB+6,R5
BACH3:
4$:	MOV	R4,LASTCOM
.IIF	NE	MMG$T,	BIS	EXTADR,R5
	MOVB	R5,@#MTC
	RTS	PC
BACH2:
5$:	MOV	#FN+BKSPC,R4
	MOVB	FUNTAB+5,R5
	BR	4$
6$:	TSTB	BACK1
	BEQ	2$
	BR	FORE1
.DSABL	LSB
.SBTTL	XBUMP SUBROUTINE
.IF NE	MMG$T
XBUMP:	MOV	MTCQE,-(SP)
	ADD	#Q$PAR,@SP
	ADD	#10,@(SP)+
	ADD	#512.,OLDBA
	BCC	1$
	ADD	#20,EXTADR
1$:	RTS	PC
.ENDC
.SBTTL	DISPATCH SUBROUTINE
DISPAT:	ADD	@SP,R4
	MOVB	FUNTAB-TABLE(R4),R5
	MOVB	@R4,R4
	ADD	(SP)
.IF DF	MT$FSM
	MOV	@MTCQ,R4
.IFF
	MOV	@MTCQE,R4
.ENDC
	BEQ	2$
	MOV	R5,2(R4)
.ENDC
2$:	MOV	#SMLREC,R4
.IF NE	MMG$T
	JMP	ABORT
.IFF
	BR	ABORT
.ENDC
NEXT2:	CMP	#FN+FWDSPC,LASTCOM
	BEQ	1$
	CMP	#FN+BKSPC,LASTCOM
	BNE	NEXT3
1$:	MOV	@#MTBRC,R4
	BEQ	NEXT3
.IF NE	MMG$T
	MOV	R4,ERRBL2
.IFF
	NEG	R4
.IF DF	MT$FSM
	MOV	@MTCQ,R5
.IFF
	MOV	@MTCQE,R5
.ENDC
	BEQ	2$
	MOV	R4,2(R5)
.ENDC
2$:
.ENABL	LSB
NEXT3:	MOV	@#MTS,R5
	CLR	R4
	BIT	#BOT,R5
	BEQ	1$
	CMP	#FN+REWIND,LASTCOM
MTD1:	BEQ	MT+,R4
	JMP	@R4
.SBTTL	MAGTAPE DATA AREA
$TBL:	.REPT	MT$UN
	.BYTE	-1
	.ENDR
	.BYTE	-2
$FLG:	.BYTE	0
	.EVEN
RECOVE:	.BYTE	-1
TAPELE:	.BYTE	ERRGAPS
BACK5:	.BYTE	0
BACK1:	.BYTE	0
LASTCO:	.WORD	DUMMY
OLDBA:	.WORD	DUMMY
.IIF NE MMG$T,	EXTADR:	.WORD	DUMMY
OLDWC:	.WORD	DUMMY
ERRSUM:	.WORD	DUMMY
NFSREA:	.WORD	DUMMY
	.EVEN
.IF NE	MMG$T
SYNBLK:	.WORD	DUMMY
JOBNM:	.WORD	DUMMY
	.WORD	DUMMY,DUMMY
TEMP:	.WORD	DUMMY
	.WORD	-1,0
SINK:	.WORD	DUMMY
ERBSAV:	.WORD	DUMMY
ERRBL2:	.WORD	DUMMY
.ENDC
.IT	#EOT,R4
	BNE	NOERR
	BR	NQUAL
.DSABL	LSB
.SBTTL	ERROR-WRITE TM,FORWARD SPACE, OR BACKSPACE COMMAND GIVEN LAST AND ERR BIT SET
ERWRTM:	BIT	#WRL,@#MTS
	BNE	ERWRI1
ERBKSP:
ERFWSP:	JSR	PC,ABOCHK
	BIT	#EOF+EOT,R4
	BNE	NOERR
	BR	NQUAL
.SBTTL	ERROR-READ COMMAND WAS ISSUED LAST AND ERR BIT WAS SET.
ERREAD:	JSR	PC,ABOCHK
	MOV	R5,ERRSUM
	BNE	CONT
	BIT	#RLE+EOT+EOF,R4
	BNE	NOERR
	BR	NQUAL
.SBTTL	ERROR-ABORT CHECK SUBROUTINE
ABOCHK:	MOV	@#MTS,R4
	BIT	#BTEOPI,R4
	BEQ	1$
	MOV	#POSERR,R4
	BR	4$DONE
	CMP	#FN+OFFLINE,LASTCOM
	BEQ	MTDONE
	CMP	(R4)+,(R4)+
	BR	4$
1$:	BIT	#EOF,R5
	BEQ	2$
	CMP	#FN+WRTEOF,LASTCOM
	BEQ	2$
	INC	R4
2$:	BIT	#EOT,R5
	BEQ	3$
	TST	NFSREAD
	BNE	3$
	CMPB	(R4)+,(R4)+
3$:	TST	R4
	BEQ	MTD1
4$:	MOV	#CSWEOF,-(SP)
	JMP	EXCEP
.DSABL	LSB
.SBTTL	RECOVERY IN PROGRESS DISPATCHER
RECOVR:	MOV	LASTCOM,R4
	JSR	PC,DISPAT
TABLER:	.BYTE	REEDF-TABLER
	.BYTE	RITE-TABLER
	.BYTE	DUMMY
	.BYTE	REWHYN-TABLER
	.BYTE	RITEX-TABLER
	.BYTE	BACH-TABLER
	.BYTE	FORE-TABLER
	.BYTE	D
1$:	BIT	#NXM,R4
	BEQ	2$
	MOV	#MEMERR,R4
4$:	TST	(SP)+
	BR	ABORT
2$:	CLR	R5
	BIT	#CRE+PAE+BGL,R4
	BEQ	3$
	COM	R5
3$:	RTS	PC
.SBTTL	ERROR-ABORT OPERATION IN PROGRESS
ERREWD:
EROFFL:
NQUAL:	CLR	R4
ABORT:	MOV	#PWRCLR,@#MTC
	MOV	#CSWHERR,-(SP)
EXCEP:
.IF DF	MT$FSM
	MOV	(SP)+,R5
	JMP	FSMERR
.IFF
	MOV	MTCQE,R5
	BIS	(SP)+,@Q.CSW(R5)
	TST	@R5
	BEQ	MTDONE
.IF NE	MMG$T
	COM	SINK
	MOV	@R5,ERBSAV
	MOV	R4,TEMP
	MOVB	Q.JNUN(R5),R5
	ASR	R5
	ASR	R5
	ASR	R5
	MOV	R5,JOBNM
.IFF
	MOV	R4,@(R5UMMY
.SBTTL	RECOVERY-WRITE WAS LAST COMMAND
RITEX:
RITE:	TST	ERRSUM
	BEQ	NEXT1
	INCB	TAPELEN
	BEQ	NQ2
	BIT	#EOT,@#MTS
	BEQ	REEDF1
NQ2:	JMP	NQUAL
.SBTTL	RECOVERY-REWIND WAS THE LAST COMMAND
REWHYN:	MOV	#PWRCLR,@#MTC
	JMP	MTDONE
.SBTTL	RECOVERY-READ WAS THE LAST COMMAND ISSUED
.ENABL	LSB
REEDF:	TST	ERRSUM
	BEQ	FOO
	DECB	BACK1
	BEQ	2$
	BGT	REEDF1
	MOVB	#5,BACK1
	DECB	BACK5
	BEQ	NQ2
REEDF1:	MOV	#-1,R5
	BR	3$
2$:	MOV	#-5,R5
3$:	MOV	R5,@#MTBRC
	BR	BACH2
FOO:	JMP	PTCH
.DSABL	LSB
.S.MCALL	.MODULE
.MODULE	XC,RELEASE=B03,VERSION=01

	XL$PC	= 1
	XL$DVE	= 0
	XL$SBC	= 0
	XL$PDT	= 0
	.INCLUDE "SRC:XL.MAC"
                                                                                                                                                                                                                                                                                                                                                                                                R3
	MOV	R4,R3
	.IFF
	MOV	Q.BUF(R3),R4
	ADD	#6,R4
	MOV	(R4)+,R0
	MOV	@R4,@R3
	.ENDC
	CMP	#ENTER,R0
	BEQ	10$
	CMP	#LOOKUP,R0
	BNE	2$
10$:	MOV	PC,R1
	ADD	#LABLIO-.,R1
	MOV	R1,LABINP
	MOV	R0,CODE
	MOV	PC,R4
	ADD	#NQE-.,R4
	MOV	R4,NQ
	MOV	Q.CSW(R3),-2(R4)
	CLR	(R4)+
	TST	(R3)+
	MOV	(R3)+,(R4)+
	CMP	#DELETE,R0
	BHI	11$
	MOVB	#LOOKUP,R0
	MOV	NQ,R1
	MOV	#-1,@R1
	ADD	#Q.WCNT,R1
	.IF	NE	MMG$T
	MOV	R1,NQ.BUF
	.ENDC
	CLR	R2
	JSR	PC,EXEC
11$:	CMP	CODE,#CLOSE
	BLE	13$
	.IF	NE	MMG$T
	M.MCALL	.MODULE
.MODULE	FSM,RELEASE=B03,VERSION=01

.ENABL	LC
.SBTTL FSM INFORMATION
.SBTTL DEFINITIONS
	.MCALL	.DREND
	READ	=	0
	WRITE	=	0
	CLOSE	=	1
	DELETE	=	2
	LOOKUP	=	3
	ENTER	=	4
	RENAME	=	5
	SEEK	=	-20.
	WRTEOF	=	-1
	FWDSPC	=	-2
	BKSPC	=	-3
	WRTXTD	=	-4
	REWIND	=	-5
	OFFLINE	=	-6
	WRITEPHY=	-7
	READPHY	=	-8.
	STR100	=	-9.
	D.CFSN	=	0
	D.CBLK	=	2
	D.HBLK	=	4
	D.FTYPE	=	6
	D.EOT	=	7
	D.FNAM	=	8.
	MONLOW	=	54
	BLKEY	=	244
	USRLOC	=	352
	SPUSR	=	272
	DATOFF	=	262
	DUMMOV	MTCQE,R4
	MOV	DVTBL,R5
	ADD	#D.FNAM,R5
	MOV	#6,R3
12$:	JSR	PC,@$GTBYT
	MOVB	(SP)+,(R5)+
	DEC	R3
	BNE	12$
	MOV	R5,R4
	.IFF
	MOV	MTCQE,R5
	MOV	Q.BUF(R5),R5
	MOV	DVTBL,R4
	ADD	#D.FNAM,R4
	MOV	(R5)+,(R4)+
	MOV	(R5)+,(R4)+
	MOV	(R5)+,(R4)+
	.ENDC
	JSR	PC,R50ASC
13$:	MOV	CODE,R5
	ASL	R5
	ADD	PC,R5
	ADD	#TABL1-.,R5
	ADD	@R5,PC
TABL1:	.WORD	<RW-TABL1>
	.WORD	<CLO-TABL1>
	.WORD	DUMMY
	.WORD	<LOOK-TABL1>
	.WORD	<ENT-TABL1>
	.EVEN
	.DSABL	LSB
	.SBTTL LOOKUP ROUTINE
LOOK:	MOV	DVTBL,RY	=	0
	UNIT	=	7
	Q.CSW	=	-2
	Q.BLK	=	0
	Q.FUNC	=	2
	Q.JNUN	=	3
	Q.BUF	=	4
	Q.WCNT	=	6
	FILFND	=	3
	ILLARG	=	5
	ILLFUN	=	2
	CSWHERR	=	1
	CSWEOF	=	20000
	FNF	=	1
	FSNERR	=	4
	DEVFUL	=	1
	EOFCODE	=	1
	EOTCODE	=	2
	EOFEOT	=	3
	BOTCODE	=	4
	POSERR	=	2
	MEMERR	=	3
	RECERR	=	5
	SMLREC	=	6
.SBTTL FSMDIS ENTRY POINT
.IIF NDF TIM$IT, TIM$IT	=	 0
.IIF NDF MMG$T,	MMG$T	=	 0
.IIF NDF ERL$G,	ERL$G	=	 0
	.GLOBL	DRIVEN,DVINFO,MTCQE,MTCQ,$DONE,$MT
	.IF	NE	MMG$T
	.GLOBL	OLDBA,XBUMP,EXTADR,SYNBL5
	MOV	MTCQE,R3
	CLR	Q.WCNT(R3)
	MOV	(R3),R3
	BGT	3$
	TST	D.FNAM(R5)
	BNE	1$
	MOVB	#1,D.FTYPE(R5)
	TST	R3
	BNE	5$
	MOV	#-1,(R5)+
	MOV	#-1,@R5
	JSR	PC,REW
	BR	5$
1$:	TST	R3
	BEQ	3$
	INC	R3
	BNE	ENT1
2$:	COM	R3
3$:	JSR	PC,GETFIL
	MOV	@MTCQE,R3
	BLE	6$
	MOV	DVTBL,R5
	TST	D.FNAM(R5)
	BEQ	6$
	TST	R0
	BNE	7$
	MOV	LABINP,R1
	CMP	(R1)+,(R1)+
	JSR	PC,MATCH
	BCS	7$
4$:	JSR	PC,FORWTM
	MOV	DVTBL,R5
	CLR	D.CBLK(R5)
	CLRB	D.FTYPE(R5)
5$:	JMP	DONE
6$:	TST	R0
	BEQ	4$
7$:	MOV	#FNF,-(SP)K,JOBNM,TEMP,SINK,ERBSAV
	.ENDC
.PSECT	MTDVR
	.ENABL	LSB
FSMDIS::MOV	SP,SPSAV
	MOV	MTCQE,R3
	MOVB	Q.JNUN(R3),R1
	BIC	#^C<UNIT>,R1
	CMP	#DRIVEN,#8.
	BEQ	117$
	CMP	#DRIVEN,R1
	BLOS	2$
117$:	MOV	R1,-(SP)
	ASL	R1
	ADD	@SP,R1
	ASL	R1
	ADD	(SP)+,R1
	ASL	R1
	ADD	PC,R1
	ADD	#DVINFO-.,R1
	MOV	R1,DVTBL
	CLR	SEEKYN
	MOVB	Q.FUNC(R3),R0
	BGT	7$
	BLT	1$
	CMP	#1,D.FTYPE(R1)
	BNE	10$
	BR	3$
1$:	CMP	#STR100,R0
	BLOS	3$
	CMP	#SEEK,R0
	BEQ	9$
2$:	BIS	#CSWHERR,@-(R3)
	BR	6$
3$:	MOV	R0,CODE
	C
	BR	SPER
.SBTTL ENTER A FILE ROUTINE
	.ENABL	LSB
ENT:	MOV	@MTCQE,R3
	BPL	3$
	INC	R3
	BNE	1$
	MOV	#77777,R3
	BR	3$
1$:	INC	R3
	BEQ	3$
2$:
ENT1:	MOV	#ILLARG,-(SP)
	BR	SPER1
3$:	MOV	DVTBL,R5
	TST	D.FNAM(R5)
	BEQ	2$
	JSR	PC,GETFIL
4$:	MOV	DVTBL,R1
	TSTB	D.EOT(R1)
	BEQ	6$
5$:	MOV	#DEVFUL,-(SP)
SPER:	JSR	PC,BACKU1
SPER1:	MOV	#CLOSE,R0
	JSR	PC,EXEC
	MOV	(SP)+,R0
	JMP	SPERR
6$:	MOV	@MTCQE,R2
	BGT	16$
	BEQ	7$
	INC	R2
	BEQ	8$
	TST	R0
	BNE	8$
	BR	11$
7$:	TST	R0
	BNE	8$
	MOV	#FILF DF	MT$FSM
MTCQ::	.WORD	DUMMY
DRIVEN==MT$UN
DVINFO::.REPT	DRIVEN
	.WORD	-1
	.WORD	-1
	.WORD	-1
	.BYTE	DUMMY
	.BYTE	0
	.WORD	DUMMY,DUMMY,DUMMY
	.ENDR
.ENDC
.IF NDF	MT$FSM
	.DREND	MT
.IFF
	.GLOBL	$FKPTR,$INPTR
.IIF NE MMG$T,	.GLOBL	$RLPTR,$MPPTR,$GTBYT,$PTBYT,$PTWRD
.IIF NE ERL$G,	.GLOBL	$ELPTR
.IIF NE TIM$IT,	.GLOBL	$TIMIT
.ENDC
SIZE=.
SIZED=SIZE-MTSTRT/2
.END
                                                                                                                              MP	#WRITEPHY,R0
	BNE	4$
	CMP	#-1,D.CBLK(R1)
	BEQ	4$
	INC	D.CBLK(R1)
	BR	5$
4$:	MOV	#-1,D.CBLK(R1)
5$:	MOV	#-1,@R1
	JSR	PC,ADJSP
6$:	JMP	DONE
7$:	CMP	#RENAME,R0
	BGT	10$
8$:	MOV	#ILLFUN,R0
	JMP	SPERR
9$:	MOV	#-1,SEEKYN
	CLR	CODE
	MOVB	#CLOSE,Q.FUNC(R3)
	JSR	PC,ADJSP
	MOV	MTCQE,R3
	MOV	@R3,SEEKER
	.IF	NE	MMG$T
	MOV	R3,R4
	CMP	(R3)+,(R3)+
	MOV	@R3,R1
	ADD	#6,@R3
	MOV	$GTBYT,R5
	JSR	PC,@R5
	MOVB	(SP)+,R0
	INC	@R3
	JSR	PC,@R5
	MOV	(SP)+,@R4
	JSR	PC,@R5
	MOVB	(SP)+,1(R4)
	MOV	R1,@FND,-(SP)
	DEC	@DVTBL
	BR	SPER
8$:	TST	@R1
	BNE	10$
9$:	JSR	PC,REW
	JSR	PC,READLA
10$:	INC	@DVTBL
11$:	JSR	PC,BACKU1
	MOV	PC,R1
	ADD	#LABEL-.,R1
	MOV	R1,-(SP)
	MOV	#"HD,(R1)+
	MOV	#"R1,@R1
	MOV	@DVTBL,R2
	BPL	12$
	MOV	#1,R2
12$:	MOV	@SP,R4
	ADD	#FSNASC-LABEL,R4;POINT TO FSN
	MOV	#2,R0
	JSR	PC,BINDEC
	CLR	R2
	ADD	#BLKASC-<FSNASC+4>,R4
	CLR	R0
	JSR	PC,BINDEC
	JSR	PC,DATE
	MOV	(SP)+,R1
	JSR	PC,WRITLA
	TST	R5
	BEQ	14$
13$:	JSR	PC,BACKU1
	JSR	PC,WRTTM
	JSR	PC,WRTTM
	JSR	PC,BACKTMK(R3)
17$:	MOV	MTCQE,R4
	CMP	Q.WCNT(R4),@SP
	BEQ	19$
	.IF	NE	MMG$T
18$:	CLR	-(SP)
	JSR	PC,@$PTWRD
	.IFF
	MOV	XAREA2,R1
18$:	CLR	(R1)+
	.ENDC
	DEC	@SP
	BNE	18$
	BR	24$
19$:	MOV	R5,@SP
	BR	24$
20$:	CMP	#POSERR,R4
	BNE	21$
	MOV	#-1,(R3)+
	MOV	#-1,@R3
21$:	TST	@SP
	BMI	22$
	CMP	#RECERR,R4
	BEQ	26$
	BR	25$
22$:	CMP	#POSERR,R4
	BEQ	23$
	TST	R4
	BEQ	23$
	CMP	#MEMERR,R4
	BNE	25$
23$:	MOV	R5,-(SP)
	JSR	PC,WRTTM
	JSR	PC,WRTTM
	JSR	PC,WRTTM
24$:	JSR	PC,BACKU1
	MOV	(SP)+,R5
25$:	JMP
	BR	5$
14$:	JSR	PC,WRTTM
	TST	R5
	BEQ	15$
	JSR	PC,BACKTM
	BR	13$
15$:	MOV	DVTBL,R5
	TST	(R5)+
	CLR	(R5)+
	MOV	#-1,(R5)+
	MOVB	#-1,@R5
	JMP	DONE
16$:	TST	R0
	BEQ	11$
	TST	@DVTBL
	BNE	17$
	CMP	#1,@MTCQE
	BEQ	9$
17$:	MOV	#FSNERR,-(SP)
	BR	SPER
	.DSABL	LSB
.SBTTL CLOSE ROUTINE
CLO:	MOV	DVTBL,R4
	CMPB	#1,D.FTYPE(R4)
	BEQ	4$
	MOV	(R4)+,-(SP)
	BPL	1$
	MOV	#1,@SP
1$:	MOV	@R4,-(SP)
	CMP	#-1,@SP
	BNE	2$
	CLR	@SP
2$:	TSTB	D.FTYPE-2(R4)
	BEQ	3$
	ADD	#D.FNAM+4,R4
	JSR	PC,R50ASC
	MO	ERRR
26$:
	.IF	NE	MMG$T
	JSR	PC,XBUMP
	.IFF
	ADD	#512.,XAREA2
	.ENDC
	MOV	@SP,R2
	BPL	27$
	NEG	R2
27$:	SUB	#256.,R2
	BLE	29$
	TST	@SP
	BPL	28$
	NEG	R2
28$:	MOV	R2,@SP
	BR	11$
29$:	TST	(SP)+
	JMP	DONE
.SBTTL EXECUTION AND STACK ADJUSTER ROUTINES
EXEC:	MOV	NQ,R3
	MOVB	R0,NQ.FUNC
	.IF	EQ	MMG$T
	MOV	R1,NQ.BUF
	.ENDC
	MOV	R2,NQ.WC
ADJSP:	MOV	R3,MTCQ
	MOV	PC,R5
	ADD	#AREA-.,R5
	MOV	R5,AREMIN
1$:	CMP	SP,SPSAV
	BEQ	2$
	MOV	(SP)+,(R5)+
	BR	1$
2$:	MOV	R5,AREMAX
	JMP	$MT
.SBTTL AV	#"F1,-(R5)
	MOV	#"EO,-(R5)
	MOV	R5,R4
	ADD	#BLKASC-LABEL,R4;POINT TO BLOCK NUMBER
	MOV	(SP)+,R2
	CLR	R0
	JSR	PC,BINDEC
	SUB	#<BLKASC+5>-FSNASC,R4
	MOV	(SP)+,R2
	MOV	#2,R0
	JSR	PC,BINDEC
	JSR	PC,DATE
	JSR	PC,WRTTM
	MOV	PC,R1
	ADD	#LABEL-.,R1
	JSR	PC,WRITLA
	JSR	PC,WRTTM
	JSR	PC,WRTTM
	JSR	PC,WRTTM
	JSR	PC,BACKTM
	JSR	PC,BACKTM
	BR	4$
3$:	CMP	(SP)+,(SP)+
	JSR	PC,FORWTM
	JSR	PC,FORWTM
4$:	MOV	#CLOSE,R0
	JSR	PC,EXEC
	JMP	DONE
.SBTTL READX/WRITX ROUTINE
RW:	MOV	MTCQE,R4
	MOV	Q.WCBORT ENTRY POINT
FSMABT::
.SBTTL FSMDON AND FSMERR ENTRY POINTS(FROM HARDWARE HANDLER)
	.ENABL	LSB
FSMDON::CLR	R5
FSMERR::MOV	SP,SPSAV
	TST	CODE
	BPL	2$
	TST	R5
	BEQ	1$
	MOV	R5,-(SP)
	MOV	MTCQE,R5
	BIS	(SP)+,@Q.CSW(R5)
	TST	@R5
	BEQ	1$
	.IF	NE	MMG$T
	COM	SINK
	MOV	@MTCQE,ERBSAV
	MOV	R4,TEMP
	.IFF
	MOV	R4,@(R5)+
	.ENDC
1$:	JMP	$DONE
2$:	MOV	R0,(PC)+
R0SAV:	.WORD	DUMMY
	MOV	R1,(PC)+
R1SAV:	.WORD	DUMMY
	MOV	R2,(PC)+
R2SAV:	.WORD	DUMMY
	MOV	R3,(PC)+
R3SAV:	.WORD	DUMMY
	BIT	#CSWEONT(R4),-(SP);SAVE WORD COUNT ON STACK
	MOV	DVTBL,R5
	CMP	#-1,D.CBLK(R5)
	BEQ	10$
	MOV	D.HBLK(R5),R0
	TSTB	D.FTYPE(R5)
	BMI	1$
	TST	@SP
	BPL	6$
	JMP	HARDER
1$:	MOV	@SP,R1
	BMI	4$
	TSTB	R1
	BEQ	2$
	ADD	#256.,R1
2$:	CLRB	R1
	SWAB	R1
	ADD	@R4,R1
	DEC	R1
	CMP	R0,R1
	BHIS	6$
3$:	JMP	EOFERR
4$:	INC	R0
5$:	CMP	R0,@R4
	BLO	3$
6$:	MOV	@R4,R2
	SUB	D.CBLK(R5),R2
	BEQ	10$
	BMI	7$
	MOV	#FWDSPC,R0
	BR	8$
7$:	NEG	R2
	MOV	#BKSPC,R0
8$:	JSR	PC,EXEC
	BEQ	9$
	JMP	ERRR
9$:	MOV	MTCQE,R4
	MOV	F,R5
	BEQ	3$
	BIT	#EOTCODE,R4
	BEQ	3$
	MOV	DVTBL,R3
	MOVB	#-1,D.EOT(R3)
3$:	MOV	AREMAX,R3
4$:	CMP	R3,AREMIN
	BEQ	5$
	MOV	-(R3),-(SP)
	BR	4$
5$:	TST	R5
	RTS	PC
	.DSABL	LSB
.SBTTL FIND A FILE ON MAGTAPE
	.ENABL	LSB
GETFIL:
	.IF	NE	MMG$T
	CLR	EXTADR
	.ENDC
	MOV	R3,-(SP)
	BNE	2$
1$:	JSR	PC,REW
2$:	TST	@DVTBL
	BPL	3$
	JSR	PC,FNDPOS
3$:	MOV	@SP,R0
	BLE	4$
	SUB	@DVTBL,R0
	BLT	BAKFSN
4$:	JSR	PC,READLA
	BNE	5$
	TST	(SP)+
	MOV	#1,R0
	RTS	PC
5$:	BMI	DIRER
6$:	TST	@SP
	BLE	8$
	CMPDVTBL,R5
	MOV	@R4,D.CBLK(R5)
10$:
	.IF	EQ	MMG$T
	MOV	Q.BUF(R4),XAREA2
	.IFTF
11$:
	.IFT
	MOV	XAREA2,R1
	.ENDC
	MOV	@SP,R2
	BMI	12$
	MOV	#READPHY,R0
	CMP	#256.,R2
	BGE	14$
	BR	13$
12$:	MOV	#WRITEPHY,R0
13$:	MOV	#256.,R2
14$:	MOV	DVTBL,R3
	CMP	#-1,D.CBLK(R3)
	BEQ	15$
	TST	@SP
	BPL	30$
	MOV	D.CBLK(R3),D.HBLK(R3)
30$:	INC	D.CBLK(R3)
15$:	JSR	PC,EXEC
	BEQ	26$
	MOV	DVTBL,R3
	TSTB	R5
	BNE	20$
	BIT	#EOFCODE,R4
	BNE	16$
	TST	@SP
	BMI	25$
16$:	CMP	#-1,D.CBLK(R3)
	BEQ	17$
	DEC	D.CBL	@SP,@DVTBL
	BNE	9$
7$:	TST	(SP)+
	CLR	R0
	RTS	PC
8$:	JSR	PC,MATCH
	BCC	7$
9$:	JSR	PC,FORWTM
	JSR	PC,FORWTM
	JSR	PC,READLA
	BEQ	DIRER
	BPL	6$
	JSR	PC,FORWTM
	BR	4$
BAKFSN:	CMP	#-2,R0
	BGE	1$
	CMP	#4,@DVTBL
	BGE	1$
10$:	JSR	PC,BACKTM
	JSR	PC,BACKTM
	JSR	PC,FORWTM
	JSR	PC,READLA
	BGE	DIRER
	JSR	PC,BACKTM
	JSR	PC,BACKTM
	JSR	PC,BACKTM
11$:	JSR	PC,FORWTM
	JSR	PC,READLA
	BEQ	DIRER
	BMI	11$
	CMP	@SP,@DVTBL
	BNE	10$
	BR	7$
DIRER:	JMP	DIRERR
	.DSABL	LSB
FNDPOS:	MOV	DVTBL,R3
	CLR	@#MONLOW,R2
	MOV	DATOFF(R2),R2
	MOV	R2,R1
	ASR	R1
	BIC	#140777,R1
	SWAB	R1
	MOV	PC,R4
	ADD	#MONTAB-.,R4
	ADD	R1,R4
	MOV	@R4,R3
	CMP	R1,#4
	BLE	1$
	BIT	#3,R2
	BNE	1$
	INC	R3
1$:	MOV	R2,R1
	ASR	R1
	ASR	R1
	ASR	R1
	ASR	R1
	ASR	R1
	BIC	#177740,R1
	ADD	R1,R3
	BIC	#177740,R2
	BEQ	2$
	ADD	#72.,R2
2$:	MOV	PC,R4
	ADD	#DAREA-.,R4
	MOV	#6,R0
	JSR	PC,BINDEC
	MOV	R3,R2
	MOV	#4,R0
	JMP	BINDEC
	JAN	=	0
	FEB	=	JAN + 31.
	MAR	=	FEB + 28.
	APR	=	MAR + 31.
	MAY	=	APR + 30.
	JUN	=	MAY + 3R1
	MOV	R2SAV,R2
	MOV	R3SAV,R3
	RTS	PC
	.DSABL	LSB
	.IF	NE	MMG$T
.SBTTL SUBROUTINE SYNCH
SYNCH:	MOV	R0,TEMP
	MOV	MTCQE,R5
	MOVB	Q.JNUN(R5),R5
	ASR	R5
	ASR	R5
	ASR	R5
	MOV	R5,JOBNM
	COM	SINK
	MOV	SEEKER,ERBSAV
	RTS	PC
	.ENDC
.SBTTL VARIABLES
SPSAV:	.WORD	DUMMY
AREMIN:	.WORD	DUMMY
AREMAX:	.WORD	DUMMY
CODE::	.WORD	DUMMY
LABINP:	.WORD	DUMMY
NQ:	.WORD	DUMMY
DVTBL::	.WORD	DUMMY
SEEKYN:	.WORD	DUMMY
SEEKER:	.WORD	DUMMY
.SBTTL TABLES, ETC.
SPACE	=	40
LABEL:	.ASCII	/HDR1/
XAREA:	.REPB	D.EOT(R3)
1$:	JSR	PC,BACKTM
2$:	CMP	#BOTCODE,R4
	BNE	3$
5$:	CLR	@DVTBL
	RTS	PC
3$:	JSR	PC,BACKTM
	CMP	#BOTCODE,R4
	BEQ	5$
	JSR	PC,FORWTM
	JSR	PC,GETLA
	BIT	#EOFCODE,R4
	BEQ	4$
	JSR	PC,BACKTM
	BR	1$
4$:	MOV	LABINP,R1
	CMP	#"EO,(R1)+
	BNE	1$
	CMP	#"F1,(R1)+
	BNE	1$
	ADD	#FSNASC-XAREA,R1
	MOV	#4,R0
	JSR	PC,DECBIN
	MOV	R0,@DVTBL
	JSR	PC,FORWTM
	JSR	PC,READLA
	JSR	PC,BACKU1
	RTS	PC
.SBTTL MATCH A FILENAME SUBROUTINE
MATCH:	CLR	R2
	CLR	R3
	MOV	R1,R4
	ADD	#SYSCOD-XAREA,R4
	MOV	P1.
	JUL	=	JUN + 30.
	AUG	=	JUL + 31.
	SEP	=	AUG + 31.
	OCT	=	SEP + 30.
	NOV	=	OCT + 31.
	NOEL	=	NOV + 30.
MONTAB:	.WORD	0
	.WORD	JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,NOEL
.SBTTL TAPE MANIPULATING SUBROUTINES
	.ENABL	LSB
BACKTM:	MOV	#BKSPC,R0
	BR	1$
FORWTM:	MOV	#FWDSPC,R0
	JSR	PC,1$
	BIT	#EOFCODE,R4
	BNE	6$
	BR	FORWTM
1$:	MOV	#-1,R2
2$:	MOV	PC,R1
	ADD	#EXTRA-.-2,R1
	MOV	R1,@NQ
EX:
3$:	JSR	PC,EXEC
	BEQ	6$
	BIT	#CSWHERR,R5
	BEQ	6$
4$:	JMP	ERRR
GETLA:	MOV	#READPHY,R0
	.IF	NEC,R0
	ADD	#XAREA2-.,R0
1$:	CMPB	#'.,@R1
	BNE	4$
	INC	R3
2$:	CMP	#6,R2
	BEQ	5$
	BLT	3$
	MOVB	#' ,(R0)+
	INC	R2
	BR	2$
3$:	CMPB	-(R2),-(R0)
	BR	2$
4$:	CMP	#6,R2
	BNE	5$
	CMP	#"RT,@R4
	BNE	5$
	CMP	#"11,2(R4)
	BNE	5$
	MOVB	#'.,(R0)+
	CMPB	(R2)+,(R3)+
5$:	MOVB	(R1)+,(R0)+
	INC	R2
	CMP	#9.,R2
	BGE	1$
	TST	R3
	BNE	MATCH1
	MOV	#"AT,-(R0)
	MOV	#".D,-(R0)
	CMP	(R0)+,(R0)+
MATCH1:	MOV	PC,R1
	ADD	#XAREA-.+10.,R1
1$:	CMPB	-(R0),-(R1)
	BEQ	2$
	SEC
	RTS	PC
2$:	DEC	R2
	BGT	1$
	CLC
	RT	MMG$T
	MOV	LABINP,OLDBA
	CLR	EXTADR
	.IFF
	MOV	LABINP,R1
	.ENDC
	MOV	#40.,R2
	MOV	PC,R4
	ADD	#EXTRA-.-2,R4
	MOV	R4,@NQ
	JSR	PC,EXEC
	BEQ	5$
	BIT	#CSWHERR,R5
	BEQ	6$
	CMP	#RECERR,R4
	BHI	4$
5$:	CLR	R4
6$:	RTS	PC
BACKU1:	MOV	#BKSPC,R0
	MOV	#1,R2
	BR	2$
REW:	MOV	DVTBL,R3
	CLRB	D.EOT(R3)
	CLR	@DVTBL
	MOV	#REWIND,R0
	BR	3$
	.DSABL	LSB
.SBTTL READ/WRITE LABELS SUBROUTINES
READLA:	CLR	XAREA2
1$:	JSR	PC,GETLA
	BIT	#EOFCODE,R4
	BEQ	2$
	CLR	R2
	RTS	PC
2$:	MOV	LABINP,R1
	CMP	#"HD,(S	PC
.SBTTL CONVERT A FILENAME FROM RAD50 TO ASCII
R50ASC:	MOV	PC,R5
	ADD	#XAREA-.+10.,R5
	MOV	#1,R2
GET50:	MOV	-(R4),R0
	MOV	#3,-(SP)
CNVLUP:	CLR	R1
	MOV	#20,-(SP)
DIVLUP:	ASL	R0
	ROL	R1
	CMP	R1,#50
	BLO	NOFIT
	SUB	#50,R1
	INC	R0
NOFIT:	DEC	@SP
	BNE	DIVLUP
	TST	(SP)+
	TST	R1
	BEQ	PSPACE
	CMP	R1,#32
	BLE	LETTER
	SUB	#36,R1
	BCC	DIGIT
PSPACE:	MOV	#-40,R1
LETTER:	ADD	#20,R1
DIGIT:	ADD	#60,R1
	MOVB	R1,-(R5)
	DEC	@SP
	BGT	CNVLUP
	TST	(SP)+
	DEC	R2
	BNE	1$
	MOVB	#'.,-(R5)
1$:	CR1)+
	BNE	3$
	CMP	#"R1,@R1
	BNE	7$
	MOV	#1,-(SP)
	BR	5$
3$:	CMP	#"EO,-2(R1)
	BNE	6$
	CMP	#"F1,@R1
	BEQ	4$
	CMP	#"V1,@R1
	BNE	7$
4$:	MOV	#-1,-(SP)
5$:	ADD	#FSNASC-LABEL-2,R1
	MOV	#4,R0
	JSR	PC,DECBIN
	MOV	R0,@DVTBL
	SUB	#<FSNASC+4>-XAREA,R1
	MOV	(SP)+,R2
	RTS	PC
6$:	CMP	#"VO,-(R1)
	BNE	7$
	CMP	#"L1,2(R1)
	BNE	7$
	COM	XAREA2
7$:	TST	XAREA2
	BMI	1$
8$:	JMP	DIRERR
WRITLA:
	.IF	NE	MMG$T
	MOV	R1,OLDBA
	CLR	EXTADR
	.ENDC
	MOV	#WRITEPHY,R0
	MOV	#256.,R2
	BR	EX
WRTTM:	MOV	#WRTEOF,MP	#-2,R2
	BNE	GET50
	RTS	PC
.SBTTL DECIMAL TO BINARY SUBROUTINE
DECBIN:	CLR	-(SP)
1$:	MOV	@SP,R2
	ASL	@SP
	ASL	@SP
	ADD	R2,@SP
	ASL	@SP
	MOVB	(R1)+,R2
	SUB	#'0,R2
	ADD	R2,@SP
	DEC	R0
	BGT	1$
	MOV	(SP)+,R0
	RTS	PC
.SBTTL BINARY TO DECIMAL SUBROUTINE
BINDEC:	ADD	PC,R0
	ADD	#DECTBL-.,R0
1$:	MOV	#'0-1,R1
2$:	INC	R1
	SUB	@R0,R2
	BPL	2$
	ADD	(R0)+,R2
	MOVB	R1,(R4)+
	TST	@R0
	BNE	1$
	RTS	PC
DECTBL:	.WORD	10000.,1000.,100.,10.,1,0
.SBTTL CONVERT FODOS DATE TO YYDDD FORMAT
DATE:	MOVR0
	BR	EX
.SBTTL ERROR EXITS
	.ENABL	LSB
SPERR:	TST	SEEKYN
	BEQ	2$
1$:
	.IF	NE	MMG$T
	JSR	PC,SYNCH
	.IFF
	MOV	R0,@SEEKER
	.ENDC
	MOV	DVTBL,R5
	MOVB	#1,D.FTYPE(R5)
	BR	3$
2$:	MOV	@#MONLOW,R1
	MOV	R0,SPUSR(R1)
	BR	5$
DIRERR:	TST	SEEKYN
	BEQ	3$
	CLR	R0
	BR	1$
HARDER:
3$:	MOV	#CSWHERR,R5
	BR	4$
EOFERR:	MOV	#CSWEOF,R5
	BR	4$
ERRR:	TST	SEEKYN
	BEQ	4$
	CLR	R0
	BR	1$
4$:	MOV	MTCQE,R3
	BIS	R5,@-(R3)
5$:	MOV	SPSAV,SP
DONE:	JSR	PC,RESTOR
	JMP	$DONE
RESTOR::MOV	R0SAV,R0
	MOV	R1SAV,NITIONS
.MACRO	ADDR ADDRESS,REG
	MOV	PC,REG
	ADD	#ADDRESS-.,REG
.ENDM	ADDR
.MACRO	LINK1 N,OLD
	MOV	N*2(R1),R2
	ADD	R1,R2
	ADDR	OLD,R3
	SUB	R3,R2
	MOV	R2,OLD
.ENDM	LINK1
.MACRO	LINK2 N,LABLE
	ADDR	LABLE,R3
	SUB	R1,R3
	MOV	R3,N*2(R1)
.ENDM	LINK2
.IF NE	BATSTK
.MACRO	SAVSTK
	MOV	SP,SPSAVE
	ADDR	SPSAVE,R4
	MOV	R4,SP
.ENDM	SAVSTK
.MACRO	RESSTK
	MOV	SPSAVE,SP
.ENDM	RESSTK
.ENDC
.MACRO	SAVE,A0,A1,A2,A3,A4,A5
.IRP	X,<A0,A1,A2,A3,A4,A5>
.IIF NB <X>,MOV X,-(SP)
.ENDR
.ENDM	SAVE
.MACRO	TBAT
BAT09:	JSR	PC,GETREG
	CMPB	(R2),R0
	BLT	BAT10
	JSR	PC,GETLB2
BAT10:	JSR	PC,GETLAB
	ROR	R0
	BCS	1$
	CLR	INBLOK
	CLR	BATICT
1$:	ADDR	LABEL+LABSIZ+2,R1
	MOV	#LABSIZ+2,R2
2$:	JSR	PC,GETBAT
	CMPB	#'$,R0
	BEQ	3$
	CMPB	-(R1),R0
	BNE	1$
3$:	DEC	R2
	BNE	2$
BAT12:	JSR	PC,BTTI
	BR	BAT12
GETLB2:	BEQ	GETLAB
	MOV	PC,-(SP)
GETLAB:	ADDR	LABEL+LABSIZ,R1
	MOV	#LABSIZ,R3
1$:	JSR	PC,GETCHR
	MOVB	R0,-(R1)
	DEC	R3
	BNE	1$
JGTBAT:	JMP	GETCHR
BAT11:	JSR	PC,GETREG
	ROR	R0
	BCC	1$
	JSR	PC,GETCHRRESTOR,A0,A1,A2,A3,A4,A5
.IRP X,<A5,A4,A3,A2,A1,A0>
.IIF NB <X>,MOV (SP)+,X
.ENDR
.ENDM	RESTOR
LOADPT:
	.DRBEG	BA,0,BADSIZ,BASTS
BA:	BR	BA0
BATSW1:	.WORD	0
		SOURCE	=      4
		BSOURC	=  40000
		NOTTY	=    400
		DESTON	=      2
		BDESTN	=    100
		DATA	=     40
		ACTIVE	=     20
		COMWAT	=     10
		BEXIT	= 100000
		BGET	=    200
		HELP	=      1
BA0:	MOV	BACQE,R0
BRINIT:	BR	INIT
INIT:	BR	INIT1
INIT2:	ADDR	CHAIN,R1
	MOV	Q.BUFF-Q.BLKN(R0),R2
.IF NE	MMG$T
	MOV	@#KISAR1,-(SP)
	MOV	Q.PA
	MOVB	R0,(R2)
	BR	BAT12
1$:	ROR	R0
	BCS	2$
	INCB	(R2)
	BR	BAT12
2$:	TST	(R4)
	BMI	BAT12
	CLR	R0
	BISB	(R2),R0
	BR	B$TIN3
	.SBTTL	\F AND \H DIRECTIVES
BAT08:	BIC	#HELP+NOTTY,(R4)
	MOV	(R4),-(SP)
	BIC	#BEXIT,(R4)
	JSR	PC,BTTI
	MOV	(SP)+,(R4)
	ROR	R0
	ADC	(R4)
	ROR	R0
	ADCB	1(R4)
	BR	BAT12
ABORT:	JSR	R1,BAT06B
	.ASCII	"BC"
BATFF:	CLR	R0
	JSR	PC,PUTBAT
BAT06:	CMP	BATOCT,#OUBSIZ*2
	BNE	BATFF
	JSR	PC,BTTI
	JSR	R1,BAT06B
	.ASCII	"FE"
BAT06B:	CLR	(R4)
	MOV	R2,-(SP)
	ADDR	BAMSG,R2T	9.
	.BYTE	DUMMY
	.ENDR
	.REPT	8.
	.BYTE	SPACE
	.ENDR
	.ASCII	/FODOS /
	.ASCII	/0001/
FSNASC:	.BYTE	DUMMY,DUMMY,DUMMY,DUMMY
	.ASCII	/0001/
	.ASCII	/00/
	.BYTE	SPACE
DAREA:	.REPT	5
	.BYTE	DUMMY
	.ENDR
	.ASCII	/ 00000/
	.ASCII	/ /
	.ASCII	/0/
BLKASC:	.BYTE	DUMMY,DUMMY,DUMMY,DUMMY,DUMMY
SYSCOD:	.ASCII	/FODOS /
	.REPT	11.
	.BYTE	SPACE
	.ENDR
	.EVEN
NQ.CSW:	.WORD	DUMMY
NQE:
NQ.BLK:	.WORD	DUMMY
NQ.FUNC:.BYTE	DUMMY
NQ.JNUN:.BYTE	DUMMY
NQ.BUF:	.WORD	DUMMY
NQ.WC:	.WORD	DUMMY
ERRBLK	=	R-Q.BLKN(R0),@#KISAR1
.IFTF
1$:	MOV	(R1)+,(R2)+
	BPL	1$
.IFT
	MOV	(SP)+,@#KISAR1
.ENDC
BATDON:	.DRFIN	BA
.IF NE	BATSTK
	.BLKW	BATSTK
SPSAVE:	.WORD	0
.ENDC
INPBUF:
INIT1:	MOV	R0,-(SP)
	ADDR	BATSW1,R0
	MOV	R0,INIT
	INC	BRINIT
	ADDR	INPBUF,R0
	MOV	R0,INBUFF
	ADD	#OUTBUF-INPBUF,R0
	MOV	R0,OBUFF
	MOV	@#SYSPTR,R0
	MOV	EMT16(R0),R1
	ADD	R0,R1
	LINK1	0,O$TIN
	LINK1	1,O$TOT
	LINK1	10,O$EXT
	LINK1	11,O$PRN
	ADDR	FB$EXT,R3
	MOV	R3,JSTATE
	BIT	#FBMON$,CONFIG(R0)
	BNE	FGBGMN
	LINK2	0,B$TIEXTRA-2
EXTRA:	.WORD	DUMMY
LABLIO:	.REPT	80.
	.BYTE	DUMMY
	.ENDR
XAREA2:	.WORD	DUMMY
AREA:	.REPT	8.
	.WORD	DUMMY
	.ENDR
	.DREND	MT
FSMSIZ==MTEND-FSMDIS
MMEND==MTEND
MSEND==MTEND
MFEND==MTEND
	.END
                                                                                                                                                                                                                                                                                                            N
	LINK2	1,B$TOT
	LINK2	10,B$EXT
	LINK2	11,B$PRN
	MOV	(SP)+,R0
	JMP	INIT2
FGBGMN:	MOV	@#SYSPTR,R0
	MOV	CONTXT(R0),JSTATE
	LINK2	0,FB$TIN
	LINK2	1,FB$TOT
	LINK2	10,FB$EXT
	LINK2	11,FB$PRN
	MOV	(SP)+,R0
	JMP	INIT2
	OUTBUF	= INBSIZ*2+INPBUF
	. = INPBUF+INBSIZ+INBSIZ+OUBSIZ+OUBSIZ
	.SBTTL	BTTI
BTTI:	JSR	PC,GETCHR
BTTIS:	CMPB	#'\,R0
	BEQ	2$
1$:	TST	(R4)
	BMI	3$
	RTS	PC
3$:	TST	(SP)+
	JMP	BAT03B
2$:	JSR	PC,GETCHR
	CMPB	#'\,R0
	BEQ	1$
	INC	R0
	BIC	(PC),R0
	ASL	R0
	TST	(SP)+
	CMP	#T.MCALL	.MODULE
.MODULE	BA,RELEASE=B03,VERSION=01

	.SBTTL	CONTROL CHARACTER DEFINITIONS
	.SBTTL	DEFINITIONS
	.MCALL	.DRDEF
	.DRDEF	BA,4,0,0,0,0
	JSW	= 44
	ERRWRD	= 52
	USERRB	= 53
	ERR$$U	= 20
	SYSPTR	= 54
	MONCOM	= 356
	CONTXT	= 320
	COMREG	= 7
	EMT16	= 316
	CONFIG	= 300
	FBMON$	= 1
	JOBNUM	= 322
	INBSIZ	= 400
	OUBSIZ	= 400
	BATSTK	= 0
	LABSIZ	= 6
	TCBIT$	= 100
	EMTRTN	= 400
	STATWD	= 366
	IFBEXT	=  40
	KISAR1	= 172342
	BADSIZ	= 0
	PNAME	= ^RBA
	BASTS	= 4
	.SBTTL	MACRO DEFIABSIZ,R0
	BLT	ABORT
	ADD	PC,R0
	ADD	(R0),PC
BATTBL:	.WORD BAT00-BATTBL
	.WORD BAT01-BATTBL
	.WORD BAT02-BATTBL
	.WORD BAT03-BATTBL
	.WORD BAT04-BATTBL
	.WORD BAT05-BATTBL
	.WORD BAT06-BATTBL
	.WORD BAT07-BATTBL
	.WORD BAT08-BATTBL
	.WORD BAT09-BATTBL
	.WORD BAT10-BATTBL
	.WORD BAT11-BATTBL
	.WORD BAT12-BATTBL
TABSIZ	= .-BATTBL
	.SBTTL	I,J,K, AND L DIRECTIVES
GETREG:	JSR	PC,GETCHR
	MOV	@#SYSPTR,R2
	ADD	#MONCOM,R2
	BIC	#177740,R0
	BEQ	JGTBAT
1$:	ADDR	BATREG-1,R2
	ADD	R0,R2
2$:	BR	JGN(R0),R0
	JMP	(R0)
FB$EXT:	JSR	PC,JNUMCK
	BEQ	B$EXT
J$EXT:	ADD	(PC),PC
O$EXT:	.-.
B$TOT:	MOV	INIT,R4
	BIT	#DESTON,(R4)
	BEQ	J$TOT
.IF NE	BATSTK
	SAVSTK
.ENDC
B$TOT2:	BIT	#NOTTY,(R4)
	BNE	BATRTI
	JSR	PC,PUTBAT
	BR	BATRTI
	.SBTTL	\B AND \C DIRECTIVES
BAT02:	TST	(R4)
	BMI	BAT03A
	JSR	PC,GETCTY
	BCC	BAT02
	BIS	#BSOURC+BDESTN,(R4)
	BIC	#ACTIVE+BGET,(R4)
	BR	B$TIN2
B$EXT:	MOV	INIT,R4
	BIT	#ACTIVE,(R4)
	BEQ	1$
	BIS	#SOURCE+DESTON,(R4)
1$:	BIT	#DATA,(R4)
	BEQ	J$EXT
.IF NE	BATSTK
	SAE
	BATOPT-BALQE
	BATOCT-BALQE
	BATICT-BALQE
	O$EXT-BALQE
	O$TIN-BALQE
	O$TOT-BALQE
	O$PRN-BALQE
RWBAT:	BISB	#2,@JSTATE
	SAVE	R0,R3,R4
	MOV	(R5)+,R4
	ADD	R5,R4
	MOVB	#17,(R4)
RWBAT1:	DECB	(R4)
	BPL	RWBAT2
	RESTOR	R3,R4
	JSR	R1,BAT06B
	.ASCII	"LU"
RWBAT2:	ADDR	BLKW2+2,R3
	CLR	OLDSTA
	CLR	R0
	BISB	(R4),R0
	EMT	374
	BCC	2$
	TSTB	@#ERRWRD
	BEQ	3$
	BR	RWBAT1
2$:	ADDR	OLDSTA,R0
	MOV	R0,(R3)
	MOV	#5*400,-(R3)
	MOV	R3,R0
	MOVB	(R4),(R3)
	TST	(R3)+
	EMT	375
	BCS	RWBAT1
3$:	MOV	R4,(RVSTK
.ENDC
	MOV	R0,-(SP)
	BIS	#BEXIT,(R4)
	MOV	@#SYSPTR,R0
	BIS	#IFBEXT,STATWD(R0)
BAT03:	BIS	#BDESTN,(R4)
BAT03A:	JSR	PC,BTTI
BAT03B:	JSR	PC,PUTCHR
	BR	BAT03A
	.SBTTL	\D DIRECTIVE
BAT04:	BIS	#DATA,(R4)
	BR	B$TIN2
FB$TIN:	JSR	PC,JNUMCK
	BEQ	B$TIN
J$TIN:	ADD	(PC),PC
O$TIN:	.-.
FB$TOT:	JSR	PC,JNUMCK
	BEQ	B$TOT
J$TOT:	ADD	(PC),PC
O$TOT:	.-.
FB$PRN:	JSR	PC,JNUMCK
	BEQ	B$PRN
J$PRN:	ADD	(PC),PC
O$PRN:	.-.
	.SBTTL	GETCTY - GET A CHARACTER FROM THE CTY
GETCTY:	SAVE	(R4)
	CLR	(R4)
	SAV3)
	ADD	#12,(R3)
	MOV	#6*400,-(R3)
	MOVB	(R4),(R3)
	MOV	R3,R0
	EMT	375
	BCS	RWBAT1
	MOV	R4,R0
	EMT	375
	BCC	4$
	RESTOR	R3,R4
	JSR	R1,BAT06B
	.ASCII	"IO"
4$:	MOV	R3,R0
	MOVB	#7,1(R0)
	EMT	375
	TST	OLDSTA
	BEQ	5$
	MOV	R3,R0
	MOVB	#6,1(R0)
	MOV	R0,2(R0)
	ADD	#4,2(R0)
	EMT	375
5$:	TST	(R4)+
	INC	(R4)+
	MOV	(R4)+,(R5)+
	MOV	(R4),(R5)
	ASL	(R5)+
	RESTOR	R0,R3,R4
	BIC	#2,@(PC)+
JSTATE:	.-.
	RTS	R5
BATREG:	.BLKB	32
	.BYTE	'0,'0,'0
	.BYTE	0,0
CRLF:	.BYTE	15
	.BYTE	12
	.BYTE	200
E	R1
	MOV	#JSW,R1
	SAVE	(R1)
	BIS	#TCBIT$,(R1)
	EMT	16*20
	RESTOR	(R1)
	RESTOR	R1
RESSW1:	RESTOR	(R4)
BAINT:
BAINTR:	RTS	PC
	.SBTTL	PUTCTY (PUTCT2) - PUT CHARACTERS TO THE CTY
PUTCT2:	MOV	PC,-(SP)
	MOVB	(R1)+,R0
PUTCTY:	TST	R0
	BEQ	PUTDON
	SAVE	(R4)
	CLR	(R4)
1$:	EMT	16*20+1
	BCS	1$
	BR	RESSW1
B$PRCR:	ADDR	CRLF,R0
B$PRN:	MOV	INIT,R4
	BIT	#DESTON,(R4)
	BEQ	J$PRN
.IF NE	BATSTK
	SAVSTK
.ENDC
	BIT	#NOTTY,(R4)
	BNE	BATRTI
.IF NE	MMG$T
	MOV	R2,-(SP)
	JSR	PC,@$RLPTR
	MOV	R1,@#KISALABEL:	.BLKB	LABSIZ
	.ASCII "L\"
	.EVEN
PATCH:	.REPT	25.
	.WORD	0
	.ENDR
	.DREND	BA
.PSECT	BADVR
.BLKB	5000-<.-BASTRT>
BATEND=.-BASTRT
	.WORD	-1
.REPT	376
	.WORD	0
.ENDR
.END
                                                                                                                                                                                                                                                                                                                                  
1$:	MOVB	(R2)+,R0
	BEQ	2$
	JSR	PC,PUTCTY
	BR	1$
2$:	MOV	(SP)+,R2
	BISB	#ERR$$U,@#USERRB
	JSR	PC,PUTCT2
	BR	J$EXT
BAMSG:	.NLCSI	TYPE=I,PART=PREFIX
	.ASCIZ	/U-/
	.EVEN
	.SBTTL	\@ AND \E DIRECTIVES
BAT05:	BIC	#DATA+BGET,(R4)
	BPL	BAT05B
BR$EX0:	MOV	(SP)+,R0
BR$EX1:	BIC	#BEXIT,(R4)
	BR	J$EXT
BAT05B:	BIT	#ACTIVE,(R4)
	BNE	BR$EX1
	JSR	PC,GETCTY
	BCS	J$EXT
	BIC	#BSOURC+BDESTN,(R4)
	BIS	#ACTIVE,(R4)
	JSR	PC,BTTIS
BAT00:	BIC	#BGET,(R4)
1$:	JSR	PC,BTTI
	JSR	PC,PUTCTY
	BR	1$
	.SBTTL	\A R1
	MOV	R2,R1
	MOV	(SP)+,R2
.IFF
	MOV	R0,R1
.ENDC
1$:	MOVB	(R1)+,R0
	BEQ	B$PRCR
	CMPB	#200,R0
	BEQ	BATRTI
	JSR	PC,PUTBAT
	BR	1$
GETCHR:	BIT	#BSOURC,(R4)
	BNE	GETBAT
1$:	JSR	PC,GETCTY
	BCS	1$
	RTS	PC
	.SBTTL	JNUMCK - GET JOB NUMBER OF CALLING JOB
JNUMCK:	MOV	@#SYSPTR,-(SP)
	ADD	#JOBNUM,(SP)
	TST	@(SP)+
	RTS	PC
READBA:	JSR	R5,RWBAT
	.WORD	INDATA-.-2
BATIPT:	.-.
BATICT:	.-.
GETBAT:	DEC	BATICT
	BMI	READBA
	MOVB	@BATIPT,R0
	INC	BATIPT
	RTS	PC
PUTBAT:	BIT	#BDESTN,(R4)
	BNE	PUTCHRAND \G DIRECTIVES
BAT07:	BIS	#BGET,(R4)
	BMI	BAT00
BAT01:	TST	(R4)
	BMI	BAT00
	BIC	#BSOURC+BDESTN,(R4)
	BR	B$TIN2
B$TIN:	MOV	INIT,R4
B$TIN1:	BIT	#SOURCE,(R4)
	BEQ	J$TIN
.IF NE	BATSTK
	SAVSTK
.ENDC
B$TIN2:	JSR	PC,BTTI
	CMPB	#15,R0
	BNE	B$TIN3
	TSTB	(R4)
	BMI	BAT02
B$TIN3:	BIT	#HELP,(R4)
	BEQ	BATRT0
	BIT	#10000,@#JSW
	BNE	BATRT0
	JSR	PC,PUTCHR
BATRT0:
.IF EQ	BATSTK
	MOV	R0,(SP)
.IFF
	MOV	R0,@SPSAVE
.ENDC
BATRTI:
.IF NE	BATSTK
	RESSTK
.ENDC
	CLR	R2
	MOV	@#SYSPTR,R0
	ADD	EMTRT
	JSR	PC,PUTCTY
PUTCHR:	MOVB	R0,@BATOPT
	INC	BATOPT
	DEC	BATOCT
	BNE	PUTDON
	JSR	R5,RWBAT
	.WORD	ODATA-.-2
BATOPT:	.WORD	.-.
BATOCT:	.WORD	OUBSIZ*2
PUTDON:	RTS	PC
INDATA:	.WORD	10*400+0
INBLOK:	.-.
INBUFF:	.-.
INWC:	.WORD	INBSIZ
	.WORD	0
.IIF NE INDATA-.+12,.ERROR
INSAV:	.BLKW	5
ODATA:	.WORD	11*400+0
OBLOK:	.-.
OBUFF:	.-.
OWC:	.WORD	OUBSIZ
	.WORD	0
.IIF NE ODATA-.+12,:^*^:
OUTSAV:	.BLKW	5
BLKW2:	.BLKW	2
OLDSTA:	.BLKW	5
CHAIN:	BATSW1-BALQE
	INDATA-BALQE
	ODATA-BALQE
	OUTBUF-BALQND	=: 100
	R$CONT	=: 20
	R$INIT	=: 4
	R$DATA	=: 1
	R$MSG	=: 2
	R$MSIZ	=: 10.
	R$DSIZ	=: 128.
	KISAR1	=: 172342
SYSPTR	=:	54
	CONFG2	=:	370
		PROS$	=:	020000
SYSCHN	=:	17
.READ	=:	375
.WRITE	=:	375
..READ	=:	010
..WRIT	=:	011
	.SBTTL	INSTALLATION CODE
.ASECT
.IF	NE DDT$O
	.DRINS	DD,<DD$CS2>
.IFF
	.DRINS	DD
.ENDC
	BR	1$
				.ASSUME . EQ INSSYS
	BR	15$
1$:	MOV	@#SYSPTR,R0
	BIT	#PROS$,CONFG2(R0)
	BNE	2$
15$:	TST	(PC)+
2$:	SEC
	RETURN
BAREA:	.BYTE	SYSCHN,..READ
	.BLKW
	.BLKW
	.DRVTB	,DD$VC2+4,DDINT
				.ASSUME .-DDSTRT LE 1000
	.ENDC
	.IF NE ERL$G
SCSFLG:	.WORD	0
				.ASSUME .-DDSTRT LE 1000
	.ENDC
	.SBTTL	DD VECTOR AND CSR ADDRESS LIST
TICSRA:	.WORD	DD$CSR
TIBFRA:	.WORD	DD$CSR+2
TOCSRA:	.WORD	DD$CSR+4
TOBFRA:	.WORD	DD$CSR+6
TIVECA:	.WORD	DD$VEC+2
TOVECA:	.WORD	DD$VEC+6
				.ASSUME .-DDSTRT LE 1000
	.SBTTL	INTERRUPT ENTRY
	.ENABL LSB
	BR	DDABRT
DDINT::	BCS	1$
	JSR	R5,@$INPTR
	 .WORD	^C<DD$PRI*^O40>&^O340
	CLR	(PC)+
FKFLG:	 .WORD	0
	JMP	@I$INTR
1$:	MOV	R.WORD	256.
	.WORD	0
O.RTR1:	CMP	R0,R3
	BHI	O.BAD
	MOV	R0,DRETRY
	BEQ	O.BAD
	BR	O.GOOD
O.SYWL:
	MOV	@SP,R0
	INC	R0
	CMPB	#BR/400,(R0)+
	BNE	O.BAD
	MOV	R0,@SP
	BR	O.BAD
	.IIF GT,<.-400>	.ERROR .-400
	.SBTTL	SET OPTIONS
	.DRSET	CSR,	160000,	O.CSR,	OCT
	.DRSET	VECTOR,	500,	O.VEC,	OCT
	.IF NE	DDT$O
	.DRSET	CSR2,	160000,	O.CSR2,	OCT
	.DRSET	VEC2,	500,	O.VEC2,	OCT
	.ENDC
	.DRSET	RETRY,	DDCNT,	O.RTRY,	NUM
	.IF NE ERL$G
	.DRSET	SUCCES,	-1,	O.SUCC,	NO
	.ENDC
	BTCSR	= <DDEND-DDSTRT> + <BOTCS4,-(SP)
	CALL	@I$INTR
	MOV	(SP)+,R4
	RTI
	.DSABL LSB
	.SBTTL	INTERRUPT EXIT
INIRTN:	BIS	#CS$INT,@TICSRA
	BR	INPRTN
OUTCHR:	MOV	R5,@TOBFRA
OUTRTN:
INPRTN:	MOV	(SP)+,I$INTR
INTRTN:	RETURN
	.SBTTL	COMPLETION EXIT
COMPLT:	BCS	ERR1
	.IF NE	ERL$G
	TST	FKFLG
	BNE	1$
	CALL	FORK
1$:	TST	SCSFLG
	BNE	PDEXIT
	MOV	#DD$COD*400+377,R4
	MOV	DDCQE,R5
	CALL	@$ELPTR
	.ENDC
PDEXIT:	.DRFIN	DD
	.SBTTL	FORK ROUTINE
FORK:	MOV	(SP)+,FKFLG
	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOVR-DDBOOT> + 1000
O.RTRY:	BR	O.RTR1
O.CSR:	CMP	R0,R3
	BLO	O.BAD
	MOV	R0,INSCSR
	MOV	R0,DISCSR
	.ADDR	#BAREA+4,R1
	.ADDR	#1000,R2
	MOV	R2,(R1)
	MOV	#BTCSR/1000,-(R1)
	TST	-(R1)
	MOV	R0,R3
	MOV	R1,R0
	EMT	.READ
	BCS	O.BAD
	MOV	R3,<BTCSR&777>(R2)
	ADD	#4,<BTCSR&777>(R2)
	MOV	R1,R0
					.ASSUME ..READ+1 EQ ..WRIT
	INCB	1(R0)
	EMT	.WRITE
	BCS	O.SYWL
	MOV	R1,R0
					.ASSUME ..WRIT-1 EQ ..READ
	DECB	1(R0)
	MOV	#1,2(R0)
	EMT	.READ
	BCS	O.BAD
	.IF NE	DDT$O
	MOV	R3,SET$L1+2
	.ENDC
	.ADDR	FKFLG,-(SP)
	JSR	PC,@(SP)+
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RTS	PC
	.SBTTL	DDABRT - ABORT ENTRY
DDABRT::BIC	#1,@TIVECA
	BIC	#1,@TOVECA
	.MTPS	#340
	BIC	#CS$INT,@TICSRA
	BIS	#CS$INT,@TOCSRA
	CLR	(PC)+
5$:	 .BLKW
10$:	MOV	#R$INIT,R5
	CALL	OUTCHR
	DECB	5$
	BEQ	15$
	TSTB	@TICSRA
	BPL	10$
	CALL	TXINIT
15$:	BR	PDEXIT
	.SBTTL	STARIO	- START I/O CODE
	.ENABL	LSB
STARIO::CLR	PK$UNT
	MOV	DDCQE,R3
	MOVB	Q$UNIT(R3),R0
	BIC	#^C<7>,R0
	ASR	R0
	.IF EQ	DDT$O
	BNE	10	#TICSRA,R1
	MOV	#2,R0
	MOV	R3,(R1)+
	ADD	R0,R3
	MOV	R3,(R1)+
	ADD	R0,R3
	MOV	R3,(R1)+
	ADD	R0,R3
	MOV	R3,@R1
O.GOOD:	TST	(PC)+
O.BAD:	SEC
	RETURN
O.VEC:	CMP	R0,R3
	BHIS	O.BAD
	BIT	#3,R0
	BNE	O.BAD
	MOV	R0,VECTAB
	TST	(R0)+
	.IF NE	DDT$O
	MOV	R0,SET$L2+2
	.ENDC
	.ADDR	#TIVECA,R1
	MOV	R0,(R1)+
	TST	(R0)+
	MOV	R0,VECTAB+6
	TST	(R0)+
	MOV	R0,@R1
	RETURN
	.IF NE	DDT$O
O.CSR2:	CMP	R0,R3
	BLO	O.BAD
	MOV	R0,SET$L3+2
	MOV	R0,DISCS2
	RETURN
O.VEC2:	CMP	R0,R3
	BHIS	O.BAD
	BIT	#3,R0$
	.ENDC
	BCC	1$
	INC	PK$UNT
1$:
	.IF NE	DDT$O
SET$L1:	MOV	#DD$CSR,R3
SET$L2:	MOV	#DD$VEC+2,R2
				.ASSUME .-DDSTRT LE 1000
	ASR	R0
	BNE	10$
	BCC	2$
SET$L3:	MOV	#DD$CS2,R3
SET$L4:	MOV	#DD$VC2+2,R2
				.ASSUME .-DDSTRT LE 1000
2$:
	.ADDR	#TICSRA,R1
	CMP	R3,@R1
	BEQ	4$
	MOV	#4,R0
3$:	MOV	R3,(R1)+
	TST	(R3)+
	SOB	R0,3$
	MOV	R2,(R1)+
	CMP	(R2)+,(R2)+
	MOV	R2,@R1
4$:
	.ENDC
DRETRY	= .+2
	MOV	#DDCNT,I$ERCT
				.ASSUME .-DDSTRT LE 1000
	CLR	RETIO
	TST	I$ABRT
	BNE	RETRY
	.ADDR	#ABO.MCALL	.MODULE
.MODULE	DD,RELEASE=B03,VERSION=01

	.SBTTL	GENERAL COMMENTS
	.ENABL	LC
	.SBTTL	MACROS AND DEFINITIONS
	.MCALL	.DRDEF,	.MTPS,	.ASSUME	.ADDR
	.IIF NDF DD$PRI	DD$PRI	= 4
	.IIF NDF DDT$O	DDT$O	= 0
	.IIF NDF DD$CS2	DD$CS2	= 176510
	.IIF NDF DD$VC2	DD$VC2	= 310
	.DRDEF	DD,34,FILST$,512.,176500,300
.IIF NDF EIS$I	EIS$I = MMG$T
.IIF EQ EIS$I	.MCALL	SOB
	CS$INT	=: 100
	CS$BRK	=: 1
	DDCNT	=: 8.
	DDNREG	=: 10.
	R$$NOP	=: 0
	R$$INT	=: 1
	R$$RED	=: 2
	R$$WRT	=: 3
	R$$POS	=: 5
	R$$E
	BNE	O.BAD
	MOV	R0,VECTAB+14
	TST	(R0)+
	MOV	R0,SET$L4+2
	TST	(R0)+
	MOV	R0,VECTAB+22
	BR	O.GOOD
	.ENDC
	.IF NE ERL$G
O.SUCC:	MOV	#0,R3
N.SUCC:	MOV	R3,SCSFLG
					.ASSUME O.SUCC+4 EQ N.SUCC
	BR	O.GOOD
	.ENDC
	.IIF GT,<.-1000> .ERROR
	.SBTTL	START I/O ENTRY
	.DRBEG	DD
	CALL	STARIO
ERR1:	MOV	DDCQE,R4
				.ASSUME Q$BLKN-2 EQ Q$CSW
	BIS	#HDERR$,@-(R4)
	BR	PDEXIT
VECTAB:	.DRVTB	DD,DD$VEC,DDINT
	.DRVTB	,DD$VEC+4,DDINT
				.ASSUME .-DDSTRT LE 1000
	.IF NE	DDT$O
	.DRVTB	,DD$VC2,DDINT
	RT,R1
	BR	GO
RETRY:	MOV	DDCQE,R3
	TST	RETIO
	BEQ	7$
	ADD	#Q$WCNT,R3
	MOV	@R3,R1
	BPL	5$
	NEG	R1
5$:	ASL	R1
	SUB	I$BYTC,R1
	ROR	R1
	CLRB	R1
	MOV	R1,R2
	TST	@R3
	BPL	6$
	NEG	R1
6$:	SUB	R1,@R3
	.IF EQ	MMG$T
				.ASSUME Q$WCNT-2 EQ Q$BUFF
	ADD	R2,-(R3)
	ADD	R2,@R3
				.ASSUME Q$BUFF-2 EQ Q$FUNC
	TST	-(R3)
	.IFF
	MOV	R2,R1
	ASHC	#-5,R1
	ADD	R1,Q$PAR-Q$WCNT(R3)
				.ASSUME Q$WCNT-4 EQ Q$FUNC
	CMP	-(R3),-(R3)
	.ENDC
	SWAB	R2
				.ASSUME Q$FUNC-2 EQ Q$BLKN
	ADD	R2,-(R3)
7$:	MOV	#R$DCQE,R5
	CALL	@$ELPTR
	CLR	I$LCHR
	RETURN
	.ENDC
	.SBTTL	TXINIT	- INIT THE TU58
TXINIT:	BIC	#CS$INT,@TOCSRA
	BIC	#CS$INT,@TICSRA
	MOV	(SP)+,I$SUBR
1$:
	.IF NE	ERL$G
	TST	I$ABRT
	BEQ	2$
	TST	FKFLG
	BNE	3$
	CALL	FORK
3$:	MOV	I$ERCT,R2
	CALL	LOGERR
2$:
	.ENDC
	.MTPS	#340
	MOV	#177777,@TOBFRA
	BIS	#<CS$INT!CS$BRK>,@TOCSRA
	CALL	OUTRTN
	MOV	#177777,R5
	CALL	OUTCHR
	BIC	#CS$BRK,@TOCSRA
	MOV	#R$INIT,R5
	CALL	OUTCHR
	MOV	#R$INIT,R5
	CALL	OUTCHR
	BIC	#CS$INT,@TOCSRA
	TST	@TIBFRA
	CA$RED,PK$OPC
	CLRB	PK$SSQ
	CLR	PK$SSQ+1
	MOV	Q$WCNT(R3),R1
	BPL	8$
	MOVB	#R$$WRT,PK$OPC
	NEG	R1
8$:	ASL	R1
	BNE	9$
	MOVB	#R$$POS,PK$OPC
9$:	MOV	Q$BUFF(R3),I$ADRS
	.IF NE	MMG$T
	MOV	Q$PAR(R3),I$PAR
	.ENDC
	MOV	R1,I$BYTC
	MOV	R1,PK$BCT
	MOV	@R3,PK$RCD
	.ADDR	#TXGO,R1
GO:	MOV	R1,I$INTR
	BIS	#CS$INT,@TOCSRA
	TST	(SP)+
10$:	RETURN
	.DSABL	LSB
	.SBTTL	TXGO	- START TRANSFER FROM INTERRUPT LEVEL
TXGO:	CALL	FORK
	MOV	#R$MSG,PK$FLG
	MOV	#R$MSIZ,R2
	.ADDR	#PK$OPC,R1
	CALL	SNDPKT
1$:	CMPB	PLL	INIRTN
	MOV	@TIBFRA,PK$FLG
	BIC	#CS$INT,@TICSRA
	DEC	I$ERCT
	BLE	9$
	CMPB	PK$FLG,#R$CONT
	BNE	1$
9$:	CALLR	@I$SUBR
	.SBTTL	SNDPKT	- SEND RADIAL SERIAL PACKET
SNDPKT:	MOV	(SP)+,I$SUBR
	MOV	R1,I$MADR
	MOVB	R2,PK$MBC
	MOV	PK$FLG,PK$CKS
	.MTPS	#340
	MOVB	PK$FLG,@TOBFRA
	BIS	#CS$INT,@TOCSRA
	CALL	OUTRTN
	MOVB	PK$MBC,R5
	CLRB	I$TDAT+1
	BIS	#1,@TOVECA
	CALL	OUTCHR
2$:
	.IF NE MMG$T
	MOV	@#KISAR1,-(SP)
	MOV	I$PAR,@#KISAR1
	.ENDC
	MOVB	@I$MADR,@TOBFRA
	MOVB	@I$MADR,I$TDAT
	.IF NE MMG$K$OPC,#R$$WRT
	BNE	2$
	JSR	R5,RCVPKT
	 .WORD	R$CONT
2$:	MOV	I$ADRS,R1
	MOV	I$BYTC,R2
	BEQ	TXEND
	CMP	R2,#R$DSIZ
	BLOS	3$
	MOV	#R$DSIZ,R2
3$:	CMPB	PK$OPC,#R$$WRT
	BNE	4$
	MOVB	#R$DATA,PK$FLG
	CALL	SNDPKT
	CMP	I$BYTC,#R$DSIZ
	BLOS	TXEND
	JSR	R5,RCVPKT
	 .WORD	R$CONT
	BR	5$
4$:	JSR	R5,RCVPKT
	 .WORD	R$DATA
5$:
	.IF EQ	MMG$T
	ADD	#R$DSIZ,I$ADRS
	.IFF
	ADD	#2,I$PAR
	.ENDC
	SUB	#R$DSIZ,I$BYTC
	BHI	2$
	CLR	I$BYTC
	.SBTTL	TXEND	- READ THE END PACKET AFTER A TRANSFER
TXEND:
	.ADDR	#IT
	MOV	(SP)+,@#KISAR1
	.ENDC
	INC	I$MADR
	ADD	I$TDAT,PK$CKS
	ADC	PK$CKS
	SWAB	PK$CKS
	DECB	PK$MBC
	BEQ	3$
	RETURN
3$:	BIC	#1,@TOVECA
	ADD	#4$-2$,I$INTR
	RETURN
4$:	MOVB	PK$CKS,R5
	CALL	OUTCHR
	MOVB	PK$CKS+1,R5
	CALL	OUTCHR
	BIC	#CS$INT,@TOCSRA
PKTRTN:	CALL	FORK
	CALLR	@I$SUBR
	.SBTTL	RCVPKT	- RECEIVE A RADIAL SERIAL PACKET
RCVPKT:	MOV	(R5)+,I$EFLG
	MOV	R5,I$SUBR
	MOV	(SP)+,R5
	MOV	R1,I$MADR
	.MTPS	#340
	CALL	INIRTN
	MOV	@TIBFRA,R4
	BMI	6$
	MOVB	R4,PK$FLG
	CMPB	R4,I$EFLG
	BEQ	$MBFR,R1
	MOV	#R$MSIZ,R2
	JSR	R5,RCVPKT
	 .WORD	R$MSG
	.SBTTL	ERROR	- ANALYZE AN END PACKET
ERROR:	CMPB	PK$FLG,#R$MSG
	BNE	ABORTR
	CMPB	I$MOPC,#R$$END
	BNE	ABORTR
	TSTB	I$MSUC
	.IF EQ	ERL$G
	BPL	CPLRTN
	.IFF
	BEQ	CPLRTN
	BLT	FATAL
	MOV	I$ERCT,R2
	CALL	LOGERR
	BR	CPLRTN
	.ENDC
FATAL:	TST	FKFLG
	BNE	1$
	CALL	FORK
	.IF NE	ERL$G
	CLR	R2
	CALL	LOGERR
	.ENDC
1$:	SEC
CPLRTN:	BIC	R4,R4
	BIC	#CS$INT,@TICSRA
	BIC	#CS$INT,@TOCSRA
	JMP	COMPLT
	.SBTTL	ABORT	- COMMUNICATIONS ERROR
ABORTR2$
	CMPB	R4,#R$MSG
	BNE	6$
	.ADDR	#I$MBFR,-(SP)
	MOV	(SP)+,I$MADR
2$:	CMPB	R4,#R$CONT
	BEQ	PKTRTN
	BIS	#1,@TIVECA
	CALL	INPRTN
1$:	MOV	@TIBFRA,R4
	BMI	8$
	MOVB	R4,PK$MBC
	MOV	PK$FLG,PK$CKS
	ADD	#4$-1$,I$INTR
3$:	RETURN
4$:	MOV	@TIBFRA,R4
	BMI	8$
	.IF NE MMG$T
	MOV	@#KISAR1,-(SP)
	MOV	I$PAR,@#KISAR1
	.ENDC
	MOVB	R4,@I$MADR
	.IF NE MMG$T
	MOV	(SP)+,@#KISAR1
	.ENDC
	INC	I$MADR
	BIC	#^C<377>,R4
	ADD	PK$CKS,R4
	ADC	R4
	SWAB	R4
	MOV	R4,PK$CKS
	DECB	PK$MBC
	BNE	3$
	BIC	#1,@TIVECA
:	MOV	SP,(PC)+
RETIO:	 .WORD	0
ABORT:	CALL	TXINIT
	CLR	I$ABRT
	TST	I$ERCT
	BLE	FATAL
	INC	I$ABRT
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R1,-(SP)
	MOV	R0,-(SP)
	CALL	9$
	MOV	(SP)+,R0
	MOV	(SP)+,R1
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	RETURN
9$:	CALL	RETRY
	TST	(SP)+
	MOV	(SP)+,R0
	MOV	(SP)+,R1
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	BR	FATAL
	.IF NE	ERL$G
.SBTTL LOGERR - SET UP AND CALL ERROR LOGGER
LOGERR:	MOV	R2,R4
	BIS	#DD$COD*400,R4
	MOV	DRETRY,R3
	SWAB	R3
	ADD	#DDNREG,R3
	.ADDR	#I$LCHR,R2
	MOV	D	ADD	#7$-4$,I$INTR
	RETURN
7$:	MOV	@TIBFRA,R4
	BMI	6$
	MOVB	R4,I$TDAT
	CALL	INPRTN
	MOV	@TIBFRA,R4
	BMI	6$
	MOVB	R4,I$TDAT+1
	BIC	#CS$INT,@TICSRA
	CMP	I$TDAT,PK$CKS
	BNE	5$
	CMPB	PK$FLG,I$EFLG
	BEQ	PKTRTN
	JMP	ERROR
6$:
	.IF NE	ERL$G
	MOV	R4,I$LCHR
	.ENDC
5$:	JMP	ABORTR
8$:
	.IF NE	ERL$G
	MOV	R4,I$LCHR
	.ENDC
	BIC	#1,@TIVECA
	.ADDR	#ABORTR,-(SP)
	MOV	(SP)+,I$INTR
	RETURN
	.SBTTL	DATA AREA
I$ABRT:	.WORD	0
I$ADRS:	.WORD	0
I$BYTC:	.WORD	0
I$INTR:	.WORD	0
I$ERCT:	.WORD	0
I$MAD	DD
	.END
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    NT
	MOV	@R5,-(R2)
	BEQ	3$
	BMI	2$
	NEG	@R2
	ADD	#CS.RD-CS.WRT,R3
2$:	BIS	(SP)+,R3
.IF NE	MMG$T
	BIS	R1,R3
.ENDC
	MOV	R3,-(R2)
	RETURN
3$:	ADD	#CS.SEK-CS.WRT,R3
	BR	2$
.SBTTL	INTERRUPT SERVICE ENTRY POINT
	.DRAST	DP,5,RPABRT
	MOV	#RPCS,R4
	BIC	#CS.AIE+CS.INT,@R4
	MOVB	#DS.ATT,-4(R4)
	CLRB	-4(R4)
	TSTB	RPTRY+1
	BGT	RPHOME
	TST	@R4
	BPL	RPDONE
.IF NE	ERL$G
	BIT	#136006,@#RPER
	BNE	RPERR
.ENDC
	DECB	RPTRY
	BGT	RPFORK
	TSTB	RPTRY+1
	BMI	RPERR
	INCB	RPTRY+1
	BIS	#CS.AIE,@R4
	MOVR:	.WORD	0
I$TDAT:	.WORD	0
I$SUBR:	.WORD	0
	.IF NE	ERL$G
I$LCHR:	.WORD	0
	.ENDC
I$EFLG:	.WORD	0
I$MBFR:
I$MOPC:	.BYTE	0
I$MSUC:	.BYTE	0
	.BYTE	0,0,0,0,0,0,0,0
	.IF NE	MMG$T
I$PAR:	.WORD	0
	.ENDC
PK$FLG:	.BYTE	0
PK$MBC:	.BYTE	0
PK$OPC:	.BYTE	0
PK$MOD:	.BYTE	0
PK$UNT:	.BYTE	0
PK$SSQ:	.BYTE	0,0,0
PK$BCT:	.BYTE	0,0
PK$RCD:	.BYTE	0,0
PK$CKS:	.BYTE	0,0
	.SBTTL	BOOTSTRAP READ ROUTINE
	.DRBOT	DD,BOOT1,READ
	. = DDBOOT+40
BOOT1:	JMP	@#BOOT-DDBOOT
	. = DDBOOT+210
READ:	MOV	#DDCNT,RTRCNT
.MCALL	.MODULE
.MODULE	DP,RELEASE=B03,VERSION=01

.SBTTL	MACROS AND DEFINITIONS
.MCALL	.DRDEF	.ADDR	.ASSUME
.IIF NDF RP0$3, RP0$3 == 0
	.DRDEF	DP,21,FILST$,40000.,176710,254
.IIF	NDF	EIS$I	EIS$I=MMG$T
.IIF	EQ	EIS$I	.MCALL	SOB
RPCNT	=: 10.
RPNREG	=: 12.
RPDS	=: DP$CSR
RPER	=: RPDS+2
RPCS	=: RPDS+4
RPWC	=: RPDS+6
RPBA	=: RPDS+10
RPCA	=: RPDS+12
RPDA	=: RPDS+14
RPM1	=: RPDS+16
RPM2	=: RPDS+20
RPM3	=: RPDS+22
SUCA	=: RPDS+24
SILO	=: RPDS+26
CS.GO	=:      1
CS.WRT	=:      2
CS.RD	=:     	MOV	@#B$DEVU,DDUNIT
	ASL	R1
	MOV	R0,DDBLK
	MOV	R1,DDBTCT
BRESTR:	MOV	R2,-(SP)
	MOV	(PC)+,R0
BOTCSR:	 .WORD	DD$CSR+4
	BIS	#CS$BRK,@R0
	MOV	(PC)+,R3
	 .WORD	177777
	CALL	BCHROS
CONRD1:	TSTB	@R0
	BPL	CONRD1
	BIC	#CS$BRK,@R0
	MOV	(PC)+,R3
	 .BYTE	R$INIT,R$INIT
	CALL	BCHROS
	TST	-2(R0)
	CALL	BICHR
	CMPB	R3,#R$CONT
	BNE	BFATAL
	MOV	#B$CHK-DDBOOT,R4
	CLR	@R4
	MOV	#B$PKT-DDBOOT,R5
1$:	MOV	(R5)+,R3
	ADD	R3,@R4
	ADC	@R4
	CALL	BCHROS
	CMP	R5,R4
	BLOS	1$
BRDPKT:	CALL	BICHP2
	MOVB	R3,R4
 4
CS.WTC	=:      6
CS.SEK	=:     10
CS.WTN	=:     12
CS.HOM	=:     14
CS.RDN	=:     16
CS.MEM	=:     60
CS.INT	=:    100
CS.RDY	=:    200
CS.DRV	=:   3400
CS.HDR	=:   4000
CS.MOD	=:  10000
CS.AIE	=:  20000
CS.HER	=:  40000
CS.ERR	=: 100000
DS.ATT	=:    377
DS.WTP	=:    400
DS.FUS	=:   1000
DS.SUW	=:   2000
DS.SIN	=:   4000
DS.HNF	=:  10000
DS.RP3	=:  20000
DS.ONL	=:  40000
DS.RDY	=: 100000
SYSPTR	=:	54
	CONFG2	=:	370
		PROS$	=:	020000
	.SBTTL	INSTALLATION CODE
	.DRINS	DP
	BR		RORB	R4
	MOV	R1,-(SP)
	CMPB	R1,#R$DATA
	BNE	BEND
2$:	CALL	@R5
	MOV	R1,(R2)+
	ADD	R1,@SP
	ADC	@SP
	DECB	R4
	BGT	2$
	CALL	(R5)
	CMP	R1,(SP)+
	BNE	BFATAL
	BR	BRDPKT
BEND:	CALL	(R5)
	TSTB	R3
	BMI	BOTH
1$:	ADD	R1,@SP
	ADC	@SP
	CALL	(R5)
	SOB	R4,1$
	CMP	R1,(SP)+
	BNE	BFATAL
	MOV	(SP)+,R2
	CLC
	RETURN
BOTH:	TST	(SP)+
BFATAL:	MOV	(SP)+,R2
	DEC	RTRCNT
	BNE	BRESTR
	BR	BIOERR
	.SBTTL	BYTE INPUT ROUTINES (BOOT)
BICHP2:	MOV	PC,R5
	CLR	R1
	CALL	@PC
BICHR:	TSTB	-4(R0)
	BPL	BICHR
	MOV10$
				.ASSUME . EQ INSSYS
	BR	20$
10$:	MOV	@#SYSPTR,R0
	BIT	#PROS$,CONFG2(R0)
	BNE	30$
20$:	TST	(PC)+
30$:	SEC
	RETURN
	.IIF GT .-400 .ERROR .-400
	.SBTTL	DRIVER ENTRY
	.DRBEG	DP
	MOV	#RPCNT,(PC)+
RPTRY:	 .WORD	0
RPAGN:	CLR	@#RPCS
	MOV	#400,@#RPCS
	CLR	@#RPCS
	MOV	#400,@#RPCS
	MOV	@DPCQE,R5
	CMP	#DPDSIZ,R5
	BLOS	RPERRJ
	JSR	R1,DIV
	 .WORD	10.
	MOV	R2,R4
	MOV	R3,R5
	JSR	R1,DIV
	 .WORD	20.
	SWAB	R2
	BIS	R2,R4
	MOV	DPCQE,R5
	TST	(R5)+
				.ASSUME Q$BLKN+2 EQ Q$UNIT-1
	MOV	(R5B	-2(R0),R3
	BISB	R3,R1
	SWAB	R1
	RETURN
	.SBTTL	BYTE OUTPUT ROUTINES (BOOT)
BCHROS:	CALL	@PC
1$:	TSTB	@R0
	BPL	1$
	MOVB	R3,2(R0)
	SWAB	R3
	RETURN
B$PKT:	.BYTE	R$MSG,R$MSIZ,R$$RED,0
DDUNIT:	.WORD	0
	.BYTE	0,0
DDBTCT:	.WORD	0
DDBLK:	.WORD	0
B$CHK:	.WORD	0
RTRCNT:	.WORD	0
	. = DDBOOT+606
BOOT:	MOV	#10000,SP
	MOV	R0,@#B$DEVU
	MOV	R0,-(SP)
	MOV	#2,R0
	MOV	#<4*400>,R1
	MOV	#1000,R2
	CALL	READ
	MOV	#READ-DDBOOT,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	MOV	(SP)+,@#B$DEVU
	JMP	@#B$BOOT
	.DREND)+,-(SP)
				.ASSUME Q$UNIT-1+2 EQ Q$BUFF
	BIT	#4*400,@SP
RP23:
.IF EQ	RP0$3
	BR	L1
.IFF
	BEQ	L1
.ENDC
	ADD	#200.,R3
	BIC	#4*400,@SP
L1:	BIC	#174377,@SP
	CMP	R3,#202.
	BLE	L5
	BIC	#3400,@#RPCS
	BIS	(SP),@#RPCS
	BIT	#DS.RP3,@#RPDS
	BNE	L5
	ADD	#6,SP
RPERRJ:	BR	RPERR
L5:	MOV	#RPDA,R2
	MOV	R4,@R2
	MOV	R3,-(R2)
.IF EQ	MMG$T
	MOV	(R5)+,-(R2)
.IFF
	JSR	PC,@$MPPTR
	MOV	(SP)+,-(R2)
	MOV	(SP)+,R1
	BIT	#1700,R1
	BNE	RPERR
.ENDC
	MOV	#CS.INT+CS.WRT+CS.GO,R3
				.ASSUME Q$BUFF+2 EQ Q$WCR5
	ASL	R3
	BNE	2$
	COM	R5
4$:	TST	(R2)+
	RTS	R2
.	= DPBOOT+602
BOOT:	MOV	#10000,SP
	MOV	@#RPCS,-(SP)
	BIC	#^C<CS.DRV>,@SP
	SWAB	@SP
	MOV	#2,R0
	MOV	#<4*400>,R1
	MOV	#1000,R2
	CALL	READ
	MOV	#READ-DPBOOT,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	MOV	(SP)+,@#B$DEVU
	JMP	@#B$BOOT
	.DREND	DP
.END
                                                                                                                                                                                                              SYSPTR,R4
.IF NE	MMG$T
	MOV	P1EXT(R4),(PC)+
$P1EXT:	 .WORD	P1EXT
.ENDC
	MOV	#DZ$ID,-(SP)
	CALL	@GETCSR(R4)
	MOV	(SP)+,R4
	BCS	80$
	ADD	R4,DZCSA
	SUB	#PC$CSR,R4
	ASH	#-7.,R4
	MOV	R4,INTENB
10$:
	TST	(PC)+
DRETRY:	.WORD	RETRY
	MOV	#9.,DZTRY
	MOV	#110,R0
	BIS	(PC)+,R0
INTENB:	 .WORD	DZ.IEN
	MOV	#50,R2
	BIS	INTENB,R2
	MOV	(PC)+,R1
IRRA:	 .WORD	DZ.CMA
	MOV	R0,@R1
	MOV	R2,@R1
	MOV	(PC)+,R1
IRRB:	 .WORD	DZ.CMB
	MOV	R0,@R1
	NOP
	MOV	R2,(PC)+
ENABLE:	 .WORD	0
	MOV	#70,R2
	BIS	INTENB,.MCALL	.MODULE
.MODULE	DZ,RELEASE=B03,VERSION=01

.ENABL	LC
.SBTTL	General Comments
.SBTTL	DEFINITIONS
.MCALL	.DRDEF, .ASSUME, .BR, .ADDR
	.DRDEF	DZ,52,FILST$!SPFUN$,800.,0,0
.SBTTL	Constants and defaults
.IIF NDF DZ.CMA, DZ.CMA = 173206
.IIF NDF DZ.CMB, DZ.CMB = 173212
.IIF NDF DZ.IEN, DZ.IEN = 1
DZ$CS0	= 4
SPFUNC	= 100000
SYSPTR	= 54
		P1EXT	= 432
		GETCSR	= 434
PC$CSR	= 174000
PC$VEC	= 300
PC$IC1	= 173206
PC$IC2	= 173212
MMUSR0	= 177572
MMUSR3	= 172516
.IRPC	X <01234567>
KISAR'X	R2
	MOV	R2,(PC)+
DSABLE:	 .WORD	0
	CLR	(PC)+
SPFUNF:	 .WORD	0
	MOV	DZCQE,R3
	MOV	(R3)+,R5
	MOV	#C0.RED,R4
	MOVB	(R3)+,R1
	MOVB	(R3)+,R0
	ASRB	R0
	BCC	20$
	BIS	#C0.DSK,R4
20$:	ASRB	R0
	BCC	30$
	BIS	#C0.DRV,R4
30$:	MOV	(R3)+,R0
	MOV	(R3)+,R2
	BPL	40$
	BIS	#C0.WRT,R4
	NEG	R2
40$:	ASL	R1
	MOV	R1,SPFUNF
	ADD	PC,R1
	ADD	CHGTBL-.(R1),R4
	MOV	R4,DZFUN2
	TST	SPFUNF
	BNE	90$
	ASL	R2
	MOV	(PC)+,R4
	 .BYTE	-7.,-10.
50$:	CMP	#1280.,R5
	BHI	60$
	ADD	#-1280.,R5
60$:	ROL	R5
	INCB	R4
	BLEB	#CS.HOM+CS.INT+CS.GO,@R4
	RTS	PC
RPHOME:	TST	@R4
	BMI	RPERR
	MOV	#177412,RPTRY
RPFORK:	.FORK	DPFBLK
.IF NE	ERL$G
	CALL	RPERLG
	CALL	@$ELPTR
.ENDC
	JMP	RPAGN
RPERR:	MOV	DPCQE,R4
				.ASSUME Q$BLKN-2 EQ Q$CSW
	BIS	#HDERR$,@-(R4)
RPABRT:	MOV	#1,@#RPCS
	CLR	DPFBLK+2
.IF NE	ERL$G
	TSTB	RPTRY
	BNE	RPEXIT
	CALL	RPERLG
	BR	RPLOG
RPDONE:	MOV	#DP$COD*400+377,R4
RPLOG:	MOV	DPCQE,R5
	.FORK	DPFBLK
	CALL	@$ELPTR
.IFF
RPDONE:
.ENDC
RPEXIT:	.DRFIN	DP
DPFBLK:	.WORD	0,0,0,0
.IF NE	ERL$G
RPRBU= 172340+<2*X>
KISDR'X	= 172300+<2*X>
.ENDR
  AP$ACF= 077406
PROCFG	= 37776
  CTI	= -10.
  SLOT0	= -14.
DZ$ID	= 2004
DZ.ID	= -4
DZ.CS0	= 0
  C0.DSK = 002
  C0.DRV = 004
  C0.MTO = 010
  C0.FN0 = 020
  C0.FN1 = 040
  C0.FN2 = 100
    C0.STA = 000
    C0.RSD = 040
    C0.RSS = 060
    C0.RED = 100
    C0.RER = 120
    C0.RAD = 140
    C0.WRT = 160
C0.DON	= 10
DZ.CS1	= 2
DZ.CS2	= 4
DZ.CS3	= 6
DZ.DB	= 14
DZ.CA	= 16
DZ.GO	= 20
DZMTRK	= 79.
RETRY	= 8.
DZNREG	= 7.
KISAR1	= 172342
F:	.BLKW	RPNREG
.ENDC
.IF NE	ERL$G
RPERLG:
	.ADDR	#RPRBUF,R5
	MOV	R5,R2
	MOV	#DP$CSR,R3
	MOV	#RPNREG,R4
RPRREG:	MOV	(R3)+,(R5)+
	SOB	R4,RPRREG
	MOV	#RPNREG,R3
	ADD	#RPCNT*400,R3
	MOV	DPCQE,R5
	MOVB	RPTRY,R4
	ADD	#DP$COD*400,R4
	RETURN
.ENDC
DIV:	CLR	R3
	CLR	R2
	TST	R5
	BEQ	4$
	COM	R3
1$:	ROL	R5
	BCC	1$
2$:	ROL	R2
	CMP	R2,@R1
	BLO	3$
	SUB	@R1,R2
3$:	ROL	R3
	ASL	R5
	BNE	2$
	COM	R3
4$:	TST	(R1)+
	RTS	R1
.SBTTL	BOOTSTRAP DRIVER
	.DRBOT	DP,BOOT1,READ
.	= DPBOOT+40
BOOT1:	J.SBTTL	Installation checks
.ASECT
.	= 200
	BR	1$
	MOV	#DZ$ID,-(SP)
	CALL	@R3
	BR	2$
1$:	MOV	#DZ$ID,-(SP)
	MOV	@#SYSPTR,R0
	CALL	@GETCSR(R0)
2$:	MOV	(SP)+,R0
	RETURN
FINDRV:	.ADDR	#DEVNAM,R0
	MOV	PC,-(SP)
	ADD	#DAREA-.,@SP
	EMT	342
	BCS	O.BAD
	MOV	DAREA+4,R1
	BEQ	O.BAD
	BR	O.GOOD
DAREA:	.BLKW	4
DEVNAM:	.RAD50	/DZ /
BAREA:	.BYTE	17,10
	.BLKW	0
	.BLKW	0
	.WORD	256.
	.WORD	0
	.IIF GT,<.-356>	.ERROR
	.SBTTL 	SET options
	.DRSET	RETRY,	RETRY,	O.RTRY,	NUM
	.IF NE ERL$G
	.DRSET	SUCCMP	@#BOOT-DPBOOT
.	= DPBOOT+210
READ:	MOV	R0,R3
	JSR	R2,DIVIDE
	.WORD	10.
	MOV	R4,-(SP)
	MOV	R5,R3
	JSR	R2,DIVIDE
	.WORD	20.
	SWAB	R4
	BIS	(SP)+,R4
	MOV	#RPDA,R3
	MOV	R4,@R3
	MOV	R5,-(R3)
	MOV	R2,-(R3)
	MOV	R1,-(R3)
	NEG	@R3
	BIC	#^C<CS.DRV>,-(R3)
	BIS	#CS.RD+CS.GO,@R3
1$:	TSTB	@R3
	BPL	1$
	TST	@R3
	BMI	BIOERR
	MOVB	#DS.ATT,@#DP$CSR
	CLRB	@#DP$CSR
	RETURN
DIVIDE:	CLR	R5
	CLR	R4
	TST	R3
	BEQ	4$
	COM	R5
1$:	ROL	R3
	BCC	1$
2$:	ROL	R4
	CMP	R4,@R2
	BLO	3$
	SUB	@R2,R4
3$:	ROL	ES,	-1,	O.SUCC,	NO
	.ENDC
	.SBTTL	Handler modification routines
O.RTRY:	CMP	R0,R3
	BHI	O.BAD
	MOV	R0,DRETRY
	BNE	O.GOOD
	BR	O.BAD
	.IF NE ERL$G
O.SUCC:	MOV	#0,R3
N.SUCC:	MOV	R3,SCSFLG
					.ASSUME O.SUCC+4 EQ N.SUCC
	BR	O.GOOD
	.ENDC
O.GOOD:	TST	(PC)+
O.BAD:	SEC
	RETURN
 .IIF	GT,<.-1000> .ERROR
.SBTTL	Driver request entry point
.ENABL	LSB
	.DRBEG	DZ
	BR	DZENT
	.IF NE ERL$G
SCSFLG:	.WORD	0
				.ASSUME . LE DZSTRT+1000
	.ENDC
DZENT:
	ASRB	(PC)+
BLOKDZ:	 .WORD	1
	BCC	10$
	MOV	@#nd abort entry points
	.DRAST	DZ,5,DZABRT
	.FORK	DZFBLK
	MOV	(PC)+,R0
DZFUN2:	 .WORD	0
	MOV	#512.,R3
	MOV	(PC)+,R4
DZCSA:	 .WORD	DZ$CS0
	MOV	R4,R5
	ADD	#DZ.DB,R5
	TSTB	@R4
	BMI	DZRTRY
	MOV	DRETRY,DZTRY
	MOV	R0,-(SP)
	BIC	#17,@SP
	CMP	#C0.WRT,(SP)+
	BEQ	70$
	JSR	R0,SILOFE
	 MOVB	@R5,(R2)+
	 MOV	@R5,R2
	MOV	#1,DZTRY
70$:	INCB	SECTOR
	BNE	80$
	ADD	#-10.*256.+1,TRACK
	ADD	#2,TRKOFF
	BLE	80$
	SUB	#10.,TRKOFF
80$:
.IF EQ	MMG$T
	ADD	R3,BUFRAD
.IFF
	ADD	#8.,PARVAL
.ENDC
	SUB	R3,BYTCC
60$:	ROL	R0
	ADD	(PC)+,R0
TRKOF:	 .WORD	0
	BGT	70$
	ADD	#10.,R0
70$:	MOV	(PC)+,R5
DZCSR0:	 .WORD	PC$CSR+DZ$CS0
	MOV	SELBIT,@R5
	MOVB	TRK,DZ.CS1(R5)
	MOVB	R0,DZ.CS2(R5)
	MOV	R5,R4
	ADD	#DZ.DB,R4
	CLRB	DZ.GO(R5)
80$:	BITB	#C0.DON,@R5
	BEQ	80$
	CLRB	DZ.CA(R5)
	MOV	#512.,R0
90$:	MOVB	@R4,(R2)+
	DEC	R1
	BEQ	100$
	DEC	R0
	BNE	90$
100$:	INCB	SEC
	BNE	110$
	ADD	#-10.*256.+1,TRK
	ADD	#2,TRKOF
	BLE	110$
	SUB	#10.,TRKOF
110$:	TST	R1
	BNE	50$
	CLC
	RETURN
.DSABL	LSB
FNDCSR:	ASRB	(PC)NT
	BHI	10$
90$:
.IF NE	ERL$G
	TST	SCSFLG
	BNE	100$
	MOV	#DZ$COD*400+377,R4
	MOV	DZCQE,R5
	CALL	@$ELPTR
.ENDC
DZABRT:
	CLR	DZFBLK+2
100$:	MOV	DSABLE,@IRRA
	MOV	DSABLE,@IRRB
	.DRFIN	DZ
.DSABL	LSB
.SBTTL	DZRTRY	- Error handling
.ENABL	LSB
DZRTRY:
.IF NE	ERL$G
	.ADDR	#DZRBUF,R3
	MOV	R3,R2
	MOV	#DZNREG,R0
10$:	MOV	(R4)+,(R3)+
	DEC	R0
	BNE	10$
	MOV	DRETRY*400+DZNREG,R3
	MOV	#DZ$COD*400,R4
	BISB	DZTRY,R4
	DECB	R4
	MOV	DZCQE,R5
	CALL	@$ELPTR
	MOV	DZCSA,R4
.ENDC
	DEC	(PC)+
DZTRY:+
	 .WORD	1
	BCC	3$
	CLR	R5
	BISB	@#173050,R5
	SWAB	R5
	ASL	R5
	SUB	#200,R5
	MOV	R5,@#KISAR1
	MOV	#AP$ACF,R5
	MOV	R5,@#KISDR1
	CLR	@#KISAR0
	MOV	R5,@#KISDR0
	MOV	#177600,@#KISAR7
	MOV	R5,@#KISDR7
	BIS	#20,@#MMUSR3
	INC	@#MMUSR0
	MOV	#CTI+PROCFG,R3
				.ASSUME	SLOT0 EQ CTI-4
	MOV	@R3,R4
	MOV	R4,R5
1$:	TST	-(R3)
	CMP	-(R3),#DZ$ID
	BEQ	2$
	SOB	R5,1$
	CLR	@#MMUSR0
	JMP	@#<BIOERR-DZBOOT>
2$:	CLR	@#MMUSR0
	SUB	R5,R4
	ASH	#7.,R4
	ADD	R4,DZCSR0
3$:	RETURN
.	= DZBOOT+556
BOOT:	CALL	F	 .WORD	0
	BGT	30$
20$:	JMP	DZERR
30$:	MOV	DZ.CS1(R4),R0
	.ADDR	#DZERRT,R3
40$:	TSTB	@R3
	BEQ	20$
	CMP	R0,(R3)+
	BNE	40$
	JMP	DZINIT
.DSABL	LSB
.SBTTL	SILOFE - Fill or empty the silo
.ENABL	LSB
SILOFE:	MOV	(R0)+,20$
	MOV	(R0)+,40$
	MOV	#512.,R3
	CLRB	DZ.CA(R4)
	MOV	BUFRAD,R2
	MOV	BYTCNT,R1
	BEQ	50$
.IF NE	MMG$T
	JSR	R0,@$P1EXT
	.WORD	PARVAL-.
.ENDC
	CMP	R1,R3
	BLOS	10$
	MOV	R3,R1
10$:	SUB	R1,R3
20$:	HALT
	DEC	R1
	BNE	20$
.IF NE	MMG$T
PARVAL:	.WORD	0
.ENDC
30$:	TST	R3
	BEQNDCSR
	MOV	DZCSR0,R2
	MOV	@R2,R1
	BIC	#^C<C0.DSK!C0.DRV>,R1
	.ASSUME	<C0.STA> EQ 0
	MOV	R0,(PC)+
BTUNIT:	 .WORD	0
	ASR	R0
	BIS	R0,R1
	MOV	R1,@R2
	CLRB	DZ.GO(R2)
10$:	BIT	#<C0.DON>,@R2
	BEQ	10$
	MOV	#10000,SP
	MOV	#2,R0
	MOV	#<4*256.>,R1
	MOV	#1000,R2
	CALL	READ
	MOV	#READ1-DZBOOT,@#B$READ
	MOV	BTUNIT,@#B$DEVU
	JMP	@#B$BOOT
	.DREND	DZ
.END
                                                                                                                                                    	50$
	MOVB	R5,R1
	ADD	R4,R5
	MOV	R1,R4
	ASL	R1
70$:	SUB	#10.,R1
	BGT	70$
	MOV	R1,TRKOFF
	BR	100$
80$:	ROLB	BLOKDZ
	BR	DZERR
90$:	SWAB	R5
	BISB	R2,R5
	MOV	#512.,R2
100$:	MOV	R0,(PC)+
BUFRAD:	 .WORD	0
	MOV	R5,(PC)+
TRACK:	 .BYTE	0
SECTOR:	 .BYTE	0
	MOV	R2,(PC)+
BYTCNT:	 .WORD	0
.IF NE	MMG$T
	TST	(R3)+
	MOV	@R3,PARVAL
.ENDC
	.BR	DZINIT
.DSABL	LSB
.SBTTL	Start transfer or retry
	.ENABL	LSB
DZINIT:	MOV	DZCSA,R4
	MOV	R4,R5
	ADD	#DZ.DB,R5
10$:	MOV	DZFUN2,R0
	MOV	R0,-(SP)
	BIC	#^C	50$
40$:	HALT
	DEC	R3
	BNE	40$
50$:	MOV	#512.,R3
	NOP
	RTS	R0
.DSABL	LSB
.SBTTL	Tables, fork block, end of driver
	.WORD	C0.WRT-C0.RED
	.WORD	C0.RED-C0.RED
CHGTBL:	.WORD	0
DZFBLK:	.WORD	0,0,0,0
.NLIST	BEX
DZERRT:	.WORD	060
	.WORD	140
	.WORD	200
	.WORD	210
	.WORD	0,0,0,0
.LIST	BEX
.IF NE	ERL$G
DZRBUF:	.BLKW	DZNREG
.ENDC
.SBTTL	VECTOR TABLE
DZ$VEC	=	PC$VEC
	.DRVTB	DZ,0,DZINT,SLOTID=DZ$ID
.SBTTL	Bootstrap read routine
	.DRBOT	DZ,BOOT1,READ1,CONTROL=<CBUS>
.	= DZBOOT+40
BOOT1:	J<C0.FN0!C0.FN1!C0.FN2>,@SP
	CMP	#C0.WRT,(SP)+
	BNE	30$
	TST	DZTRY
	BNE	20$
	MOV	DRETRY,DZTRY
20$:	JSR	R0,SILOFE
	 MOVB	(R2)+,@R5
	 MOV	R1,@R5
30$:	MOVB	SECTOR,R2
	BGT	50$
	SUB	#-6.,R2
	BGT	40$
	ADD	#4.,R2
	SEC
40$:	ROL	R2
	ADD	(PC)+,R2
TRKOFF:	 .WORD	0
	BGT	50$
	ADD	#10.,R2
50$:	MOVB	R0,@R4
	MOV	TRACK,R0
	CMPB	R0,#DZMTRK+1
	BNE	60$
	CLR	R0
60$:	MOVB	R0,DZ.CS1(R4)
	MOVB	R2,DZ.CS2(R4)
	CLRB	DZ.GO(R4)
	RETURN
DZERR:	MOV	DZCQE,R4
	BIS	#HDERR$,@-(R4)
	BR	DZABRT
.SBTTL	Interrupt aMP	@#BOOT-DZBOOT
.ENABL	LSB
.	= DZBOOT+120
READ1:	MOV	@#B$DEVU,-(SP)
	BR	10$
READ:	MOV	BTUNIT,-(SP)
10$:	CALL	FNDCSR
	MOV	(SP)+,R4
	ASL	R4
	BIS	#C0.RED,R4
	MOV	R4,(PC)+
SELBIT:	 .WORD	0
	ASL	R1
	MOV	(PC)+,R4
	 .BYTE	-7.,-10.
20$:	CMP	#1280.,R0
	BHI	30$
	ADD	#-1280.,R0
30$:	ROL	R0
	INCB	R4
	BLE	20$
	MOVB	R0,R5
	ADD	R4,R0
	MOV	R5,R4
	ASL	R5
40$:	SUB	#10.,R5
	BGT	40$
	MOV	R5,TRKOF
	MOV	R0,(PC)+
TRK:	 .BYTE	0
SEC:	 .BYTE	0
50$:	MOVB	SEC,R0
	SUB	#-6.,R0
	BGT	60$
	ADD	#4.,R0
	SEIZ,USIZ
TSTART	=	.
	.WORD	CODE
	.WORD	HEADS
	.WORD	TOTCYL
	.WORD	UCYL
	.WORD	HDMSK
	.WORD	HDBITS
	.WORD	CYLMSK
	.WORD	CYLBIT
	.WORD	HASIZ
	.WORD	LASIZ
	.WORD	USIZ
TEND	=	.
TSIZE	=TEND-TSTART
.ENDM
	.SBTTL	PRIMARY DECLARATIONS
PC$CSR	= 174000
PC$VEC	= 300
PC$IC1	= 173206
PC$IC2	= 173212
MMUSR0	= 177572
MMUSR3	= 172516
.IRPC	X <01234567>
KISAR'X	= 172340+<2*X>
KISDR'X	= 172300+<2*X>
.ENDR
  AP$ACF= 077406
PROCFG	= 37776
  CTI	= -10.
  SLOT0	= -14.
PC$PRI	= 4
DW$ID	= 401
DW$SEO.WPF,@R1
O.GOOD:	TST	(PC)+
O.BAD:	SEC
	RETURN
SETW:	BR	1$
 .	= SETW+4
	CLR	DWWCHK
	BR	2$
1$:	MOV	#-1,DWWCHK
2$:	CLC
	RETURN
FINDRV:	MOV	PC,R0
	ADD	#DEVNAM-.,R0
	MOV	PC,-(SP)
	ADD	#DAREA-.,@SP
	EMT	342
	BCS	O.BAD
	MOV	DAREA+4,R1
	BEQ	O.BAD
	BR	O.GOOD
DAREA:	.BLKW	4
DEVNAM:	.RAD50	/DW /
 .IIF	GT,<.-1000> .ERROR
$$.SET	=	.
.SBTTL	INSTALLATION VERIFICATION ROUTINE
	.ASECT
	. = 200
	.ENABL	LSB
	BR	1$
	COM	(PC)+
SYSDEV:	.WORD	0
	MOV	#DW$ID,-(SP)
	CALL	@R3
	BR	2$
1$:	NOP
	MOV	#C	= 16.
DW$C51	= 306.
SECIDMX	= 5
SRFIDMX	= 3
CYLIDMX	= 10.
MAXVAL	SECIDMX, MAXSEC
MAXVAL	SRFIDMX, MAXSRF
MAXVAL	CYLIDMX, MAXCYL
.IIF GT <DW$SEC - MAXSEC> .ERROR
	.SBTTL	BLOCK LAYOUT ON THE RD50C DISK
	.SBTTL	PREAMBLE SECTION
	.MCALL	.DRDEF, .ASSUME, .ADDR
	.DRDEF	DW,53,FILST$!SPFUN$!VARSZ$,0,0,0
.SBTTL	CONSTANT DEFINITIONS
SYSPTR	= 54
		P1EXT	= 432
		GETCSR	= 434
		DWTYPE	= 440
CMD0	=      1
CMD1	=      2
CMD2	=      4
CMD3	=     10
CMD4	=     20
CMD5	=     40
CMD6	=    100
CMDDW$ID,-(SP)
	MOV	@#SYSPTR,R0
	CALL	@GETCSR(R0)
2$:	MOV	(SP)+,R0
	BCC	3$
	JMP	4$
3$:	TST	DWSTAT(R0)
	.ASSUME <STBUSY> EQ 100000
	BMI	3$
	TST	SYSDEV
	BPL	35$
	MOV	@#<BIOERR-DWBOOT-2>,R3
35$:	BIT	#STDCAP,DWSTAT(R0)
	BEQ	22$
	MOV	#8.,R3
37$:	JMP	90$
22$:	MOV	#7,R3
	CLR	DWSEC(R0)
5$:	MOV	R0,R5
	ADD	#DWCYL,R5
	CLR	(R5)+
	MOV	R3,(R5)+
	MOV	#CMREAD,(R5)+
9$:	TST	@R5
	BMI	9$
	BIT	#S2ERR,DWST2(R0)
	BEQ	10$
	BIT	#ERIDNF!ERABO,DWERR(R0)
	BEQ	10$
	SOB	R3,5$
	BR	4$
10$:	BR	1000$
.IIF	GT	<.7	=    200
ICOPND	= PC$IC1
ICDRQ	= PC$IC2
DWID	= 0
DWERR	= 4
DWPRE	= 4
DWREV	= 6
DWSEC	= 6
DWBUF	= 10
DWCYL	= 12
DWHEAD	= 14
DWST2	= 16
DWCMD	= 16
DWSTAT	= 20
DWINIT	= 20
.IF NE	ERL$G
ERLRGS	= 6
.ENDC
EDWM	= 0400
ERTR0	= 01000
ERABO	= 02000
ERIDNF	= 10000
ERICRC	= 20000
EDWCRC	= 40000
BITMSK	DW$SEC-1,SECMSK,SECBIT
BITMSK	MAXSEC-1,MXSECM,MXSECB
.IIF NE <SECIDMX-MXSECB>	.ERROR
BITMSK	MAXSRF-1,MXSRFM,MXSRFB
.IIF NE <SRFIDMX-MXSRFB>	.ERROR
BITMSK	MAXCYL-1,MXCYLM,MXCYLB
.IIF NE <CYL-400>,	.ERROR
	.	=	$$.SET
1000$:
11$:	BIT	#STOPND,@R5
	BNE	60$
	TSTB	@R5
	BPL	11$
	TST	DWBUF(R0)
	BR	11$
60$:	INC	R3
	ASL	R3
	ADD	#2,R3
90$:	MOV	PC,R1
	ADD	#SIZTAB-.-8.,R1
	ADD	R3,R1
	MOV	@R1,54
	TST	SYSDEV
	BMI	100$
	MOV	@#SYSPTR,R2
	ADD	#12.,R1
	MOV	@R1,DWTYPE(R2)
	TST	(PC)+
4$:	SEC
100$:	RETURN
SIZTAB:	.WORD	9727.
	.WORD	19519.
	.WORD	55679.
	.WORD	0
	.WORD	55679.
	.WORD	65535.
CODTAB:	.WORD	1,2,3,0,4,5
	.DSABL	LSB
.ASECT
 .	= 1000
.SBTTL	HEADER SECTION
	.DRBEG	DW
	BRIDMX-MXCYLB>	.ERROR
BSCMSK	= 177760
BHDMSK	= 177774
BCYMSK	= 177000
S2ERR	= 400
S2DRQ	= 4000
S2SEK	= 10000
S2WRF	= 20000
S2DWY	= 40000
CMREST	= 20
CMREAD	= 40
CMWRIT	= 60
CMFORM	= 120
STOPND	= 1
STDRQ	= 200
STDCAP	= 400
STBUSY	= 100000
STINIT	= 10
RETRYS	= 8.
WREQ	= 100000
RDAWRT	=      1
.SBTTL	HANDLER SET OPTIONS
	.DRSET	RETRY,	RETRY,	O.RTRY,	NUM
	.IF NE ERL$G
	.DRSET	SUCCES,	-1,	O.SUCC,	NO
	.ENDC
	.DRSET	WRITE,1,O.WP,NO
	.DRSET	WCHECK,1,SETW,NO
.SBTTL	HANDLER MODIFICATION RO	DWENT
DWWPRO: .WORD	0
	.IF NE ERL$G
SCSFLG:	.WORD	0
				.ASSUME . LE DWSTRT+1000
	.ENDC
DRETRY:	.WORD	RETRYS
.SBTTL	I/O INITIATION SECTION
	.ENABL	LSB
1$:	ROL	BLOKDW
	BR	JMPFD1
DWENT:
	NOP
	ASR	(PC)+
BLOKDW:	 .WORD	1
	BCC	2$
	MOV	@#SYSPTR,R4
	MOV	R4,R5
.IF NE	MMG$T
	MOV	P1EXT(R4),(PC)+
$P1EXT:	 .WORD	P1EXT
.ENDC
	MOV	#DW$ID,-(SP)
	CALL	@GETCSR(R4)
	MOV	(SP)+,R4
	BCS	1$
	MOV	R4,(PC)+
DWCSR:	 .BLKW	1
	SUB	#PC$CSR,R4
	ASH	#-7.,R4
	BIS	R4,(PC)+
CLRIMR:	 .WORD	CMD5!CMD3
	BIS	R4,.MCALL	.MODULE
.MODULE	DW,RELEASE=B03,VERSION=01

.SBTTL	DESCRIPTION
.ENABL	LC
	.SBTTL	USAGE
	.SBTTL	MACRO DEFINITIONS
.MACRO	MAXVAL BITS, VAL
VAL	= 1
.REPT	BITS
VAL	= VAL * 2
.ENDR
.ENDM
.MACRO	BITMSK ARG, CMASK, BITS
.IIF EQ ARG,	.ERROR
N	= ARG
MASK	= 1
BITS	= 0
FLAG	= 0
.REPT	16
 .IF EQ FLAG
MASK	= MASK * 2
BITS	= BITS + 1
N	= N / 2
  .IF	EQ N
FLAG	= 1
  .ENDC
 .ENDC
.ENDR
CMASK	= ^C<MASK - 1>
.ENDM
.MACRO	$TYPE$	CODE,HEADS,TOTCYL,UCYL,HDMSK,HDBITS,CYLMSK,CYLBIT,HASIZ,LASUTINES
O.RTRY:	CMP	R0,R3
	BHI	O.BAD
	MOV	R0,DRETRY
	BNE	O.GOOD
	BR	O.BAD
	.IF NE ERL$G
O.SUCC:	MOV	#0,R3
N.SUCC:	MOV	R3,SCSFLG
					.ASSUME O.SUCC+4 EQ N.SUCC
	BR	O.GOOD
	.ENDC
O.WP:	NOP
	TST	(PC)+
	SEC
	ROL	(PC)+
O.WPF:	 .WORD	0
	BIC	#<^C1>,O.WPF
	MOVB	R1,R0
	CMP	R0,R3
	BHI	O.BAD
	MOV	R0,-(SP)
	ADD	PC,R0
	ADD	#DWWPRO-.,R0
	MOVB	O.WPF,@R0
	CALL	FINDRV
	MOV	(SP)+,R0
	BCS	O.GOOD
	CMP	@#SYSPTR,R1
	BHI	10$
	MOV	#100000,DWW1-DWLQE(R1)
10$:
	ADD	#DWWPRO-DWLQE,R1
	ADD	R0,R1
	MOVB	(PC)+
SETIMR:	 .WORD	CMD5!CMD4!CMD3
	BIS	R4,(PC)+
CLRIRR:	 .WORD	CMD6!CMD3
	MOV	DWCSR,R4
	TST	DWTYPE(R5)
	BNE	2$
	MOV	PC,R1
	ADD	#DWTAB-.-8.,R1
	MOV	@#<BIOERR-DWBOOT-2>,R3
	ASL	R3
	BIT	#STDCAP,DWSTAT(R4)
	BNE	12$
	ADD	#2.,R1
12$:	ADD	R3,R1
	MOV	@R1,DWTYPE(R5)
2$:
	MOV	DWCSR,R4
	TST	DWSTAT(R4)
	.ASSUME <STBUSY> EQ 100000
	BMI	JMPFD1
	ASR	(PC)+
	 .WORD	1
	BCC	3$
	MOV	@#SYSPTR,R5
	MOV	DWTYPE(R5),R1
	CMP	#1,R1
	BEQ	3$
	MOV	PC,R2
	ADD	#DEVCHR-.,R2
20$:	ADD	#TSIZE,R2
	CMP	R1,@R2
	BTST	DWWPRO
	BNE	JMPFUE
10$:	MOV	#S2WRF,WRFLAG
	MOV	#WREQ,FNFLAG
	NEG	Q$WCNT(R5)
RWNEXT:	MOV	R3,R1
	TST	ABSSEC
	BEQ	2$
	CMP	R3,DWASIZ
	BHIS	JMPFUE
	BR	25$
2$:	CMP	R3,DWUSIZ
	BHIS	JMPFUE
	INC	R1
25$:	BIC	#SECMSK,R1
	ASH	#-SECBIT,R3
	BIC	#170000,R3
	CLR	R2
	DIV	DW$SRF,R2
	CMP	R2,DW$CYL
	BHIS	JMPFUE
	MOV	R2,CRNTCYL
	MOV	R3,CRNTHD
	MOV	R1,CRNTSEC
RWRTRY:	MOV	CRNTCYL,DWCYL(R4)
	MOV	CRNTHD,DWHEAD(R4)
	MOV	CRNTSEC,DWSEC(R4)
	TST	FNFLAG
	BMI	3$
	MOV	CLRIRR,@#ICDRQ
	MOV	#CMREAD,DWCMD(R4)NE	20$
30$:	MOV	PC,R5
	ADD	#RDTYP-.,R5
	MOV	#<TSIZE/2>,R1
35$:	MOV	(R2)+,(R5)+
	SOB	R1,35$
3$:	MOV	DRETRY,RETRY
	CLR	INREST
	CLR	FNFLAG
	CLR	WRFLAG
	MOV	DWCQE,R5
	MOV	@R5,R3
	MOVB	Q$UNIT(R5),R0
	BIC	#^C<7>,R0
	BNE	JMPFU1
	MOVB	Q$FUNC(R5),R0
	ADD	#FNEG,R0
	CMP	R0,#FNUM
	BLO	DISPAT
JMPFU1:	JMP	DWFUE
JMPFD1:	JMP	DWFDE
	.DSABL	LSB
.SBTTL	LOCAL VARIABLES
DWWCHK:	.WORD	0
 .IF GE <.-DWSTRT+10>-512.
	.ERROR	.
 .ENDC
RETRY:	.WORD	0
INREST:	.WORD	0
FNFLAG:	.WORD	0
WRFLAG:	.WORD	0
WCNT:
	MOV	CLRIMR,@#ICDRQ
	BR	4$
3$:
	BIC	#RDAWRT,FNFLAG
	MOV	CLRIRR,@#ICOPND
	MOV	#CMWRIT,DWCMD(R4)
	JSR	R0,MTFILL
	  MOV	(R2)+,@R4
	  CLR	@R4
	MOV	CLRIMR,@#ICOPND
4$:	CLR	ABSSEC
	RETURN
JMPFDE:	JMP	DWFDE
JMPFUE:	JMP	DWFUE
.SBTTL	- READ BLOCK WITH BACKUP REV BYTE AND ERROR CODE FUNCTION
.SBTTL	- WRITE BLOCK WITH BACKUP REV BYTE AND RETURN ERROR CODE FUNCTION
.SBTTL	DSIZ - Get disk size
DSIZ:
.IF EQ MMG$T
	MOV	DWUSIZ,@Q$BUFF(R5)
.IFF
	MOV	R4,-(SP)
	MOV	DWUSIZ,-(SP)
	MOV	R5,R4
	CALL	@$P	.WORD	0
CRNTCYL:.WORD	0
CRNTHD:	.WORD	0
CRNTSEC:.WORD	0
DWTAB:	.WORD	1,2,3,0,4,5
RDTYP:
DW$TYP:	.WORD	1
DW$SRF:	.WORD	4
DW$CYL:	.WORD	153.
DWUCYL:	.WORD	152.
SRFMSK:	.WORD	177774
SRFBIT:	.WORD	2
CYLMSK:	.WORD	177000
CYLBIT:	.WORD	9.
HASIZ:	.WORD	0
DWASIZ:	.WORD	9792.
DWUSIZ:	.WORD	9727.
	.WORD	0
DEVCHR:
	$TYPE$	1,4,153.,152.,177774,2,177000,9.,0,9792.,9727.
	$TYPE$	2,4,306.,305.,177774,2,177000,9.,0,19584.,19519.
	$TYPE$	3,5,697.,696.,177770,3,176000,10.,0,55760.,55679.
	$TYPE$	4,7,64TWRD
	MOV	(SP)+,R4
.ENDC
	JMP	DWRQS
.SBTTL	EMPTY/FILL THE CONTROLLER'S SECTOR BUFFER SUBROUTINE
	.ENABL	LSB
MTFILL:	MOV	R5,-(SP)
	MOV	R4,-(SP)
	MOV	(R0)+,3$
	MOV	(R0)+,5$
	MOV	R4,R3
	ADD	#DWSTAT,R3
	ADD	#DWBUF,R4
	MOV	Q$BUFF(R5),R2
	MOV	Q$WCNT(R5),R1
	BEQ	4$
	MOV	R1,WCNT
	CMP	R1,#256.
	BLOS	1$
	MOV	#256.,R1
1$:	TST	FNFLAG
	BPL	100$
	ASL	(PC)+
	.WORD	100000
	BCS	10$
100$:	SUB	R1,WCNT
10$:
.IF NE	MMG$T
	MOV	Q$PAR(R5),PARVAL
	JSR	R0,@$P1EXT
	.WORD	PARVAL-.
.IFF
	MOV	R2,BUFF
	T5.,497.,177770,3,176000,10.,11705.,65535.,55679.
	$TYPE$	5,8.,512.,435.,177770,3,176000,10.,1,65535.,65535.
.IF EQ	MMG$T
BUFF:	.WORD	0
.ENDC
.IF NE	ERL$G
ERLIST:	.BLKW	ERLRGS
.ENDC
.SBTTL	VECTOR TABLE
DW$VEC	=	300
	.DRVTB	DW,0,DWINT,SLOTID=DW$ID
	.DRVTB	,4,DWINT
.SBTTL	COMMAND DISPATCH
DISPAT:	ASL	R0
	ADD	PC,R0
	ADD	#FNTBL-.,R0
	ADD	@R0,PC
JMPREF:
FNTBL:
	.WORD	<DSIZ - JMPREF>
	.WORD	<DWFUE- JMPREF>
	.WORD	<DWFUE- JMPREF>
	.WORD	<ABSW - JMPREF>
	.WORD	<ABSR - JMPREF>
FTBZER:	.WORD	ST	FNFLAG
	BPL	200$
	ASL	(PC)+
	.WORD	100000
	BCS	2$
200$:	ADD	#512.,BUFF
.ENDC
2$:	MOVB	@R3,R5
	BPL	2$
3$:	 .WORD	0
	SOB	R1,2$
.IF NE	MMG$T
PARVAL:	.WORD	0
	TST	FNFLAG
	BPL	30$
	ASL	(PC)+
	.WORD	100000
	BCS	300$
30$:	ADD	#<256./32.>,PARVAL
300$:
.ENDC
4$:	MOV	@R3,R5
	BMI	6$
	ASR	R5
	BCS	6$
	ASLB	R5
	BPL	4$
5$:	 .WORD	0
	BR	4$
6$:	TSTB	@R3
	BPL	7$
	HALT
7$:	MOV	(SP)+,R4
	MOV	(SP)+,R5
	RTS	R0
	.DSABL	LSB
.SBTTL	DUMP THE CONTROLLER'S SECTOR BUFFER SUBROUTINE
DUMP:	MOV	R4,<RW - JMPREF>
FTBEND:
FNEG	= <FTBZER - FNTBL>/2
FNUM	= <FTBEND - FNTBL>/2
.SBTTL	HANDLER FUNCTIONS SECTION
.SBTTL	ABSRW - Read/write absolute sector
ABSW:	BIS	#100000,ABSSEC
	NEG	Q$WCNT(R5)
ABSR:	BIS	#1,(PC)+
ABSSEC:	.WORD	0
.SBTTL	- READ(X)/WRIT(X) FUNCTION
RW:	BIT	#1,Q$BUFF(R5)
	BNE	JMPFUE
	MOV	#1,FNFLAG
	TST	Q$WCNT(R5)
	BMI	1$
	BNE	RWNEXT
	JMP	DWRQS
1$:	BIT	#S2WRF,DWST2(R4);Has a write fault occured?
	BNE	JMPFDE
	ASL	(PC)+
DWW1:	.WORD	.-.
				.ASSUME . LE DWSTRT+1000
	BCS	10$
	R2
	ADD	#DWSTAT,R2
	MOV	R4,R3
	ADD	#DWBUF,R3
1$:	MOV	@R2,R1
	ASR	R1
	BCS	2$
	ASLB	R1
	BPL	1$
	MOV	@R3,R1
	BR	1$
2$:	TSTB	@R2
	BPL	3$
	HALT
3$:	RETURN
.IF NE	ERL$G
.SBTTL	ERROR LOGGING SETUP SUBROUTINE
ERLSET:	MOV	PC,R2
	ADD	#ERLIST-.,R2
	MOV	R2,R3
	MOV	DWSTAT(R4),(R3)+
	BMI	1$
	MOV	DWCYL(R4),(R3)+
	MOV	DWHEAD(R4),(R3)+
	MOV	DWSEC(R4),(R3)+
	MOV	DWERR(R4),(R3)+
	MOV	DWST2(R4),@R3
	BR	2$
1$:	MOV	#-1,@R3
	MOV	(R3)+,@R3
	MOV	(R3)+,@R3
	MOV	(R3)+,@R3
	MOV	(R3)+,@R3
2$:	MOV	DRETRS	#HDERR$,@Q$CSW(R5)
DWRQS:
	CLR	ABSSEC
	.DRFIN	DW
DWFBLK:	.WORD	0, 0, 0, 0
	.SBTTL	BOOTSTRAP READ ROUTINE
	.DRBOT	DW,BOOT1,READ,CONTROL=<CBUS>
	. = DWBOOT + 40
BOOT1:	JMP	@#<BOOT-DWBOOT>
	. = DWBOOT + 14
	.ENABL	LSB
DSKTYP:	MOV	#7,R3
	CLR	DWSEC(R4)
50$:	MOV	R4,R5
	BR	750$
	. = DWBOOT +44
750$:	ADD	#DWCYL,R5
	CLR	(R5)+
	MOV	R3,(R5)+
	MOV	#CMREAD,(R5)+
	BR	60$
	. = DWBOOT + 70
60$:	TST	@R5
	BMI	60$
	BR	55$
	. = DWBOOT + 104
55$:	BIT	#S2ERR,DWST2(R4)
	BR	149$
	. = DWBOOT + 120
14.MCALL	.MODULE
.MODULE	XL,RELEASE=B03,VERSION=01

	.SBTTL	EDIT HISTORY
	.ENABL	LC
	.SBTTL	MACROS AND DEFINITIONS
	.IIF NDF XL$PC	XL$PC	= 0
	.IIF NDF XL$DVE	XL$DVE	= 0
	.IIF NDF XL$SBC	XL$SBC	= 0
	.IIF NDF XL$PDT	XL$PDT	= 0
	.IIF NDF XL$PRI	XL$PRI	= 4
	.IF NE <XL$DVE&XL$SBC>!<XL$PC&<XL$DVE!XL$SBC>>
	.ERROR
	.ENDC
	.IF NE XL$PC
	XL$CSR	= 173300
	XL$VEC	= 210
	.ENDC
	.IF NE XL$SBC
	XL$PRI	= 5
	.ENDC
	.MCALL	.DRDEF,	.MTPS,	.INTEN
	.DRDEF	XL,57,HNDLR$!SPFUN$,0,176500,300
	$$$VER	== 16.
	Y,R3
	SWAB	R3
	BISB	#ERLRGS,R3
	MOV	#<DW$COD*400>,R4
	RETURN
.ENDC
.SBTTL	INTERRUPT SERVICE SECTION
INTFDE:	JMP	DWFDE
INTRQS:	JMP	DWRQS
	.DRAST	DW,PC$PRI
	MOV	SETIMR,@#ICOPND
	MOV	SETIMR,@#ICDRQ
	.FORK	DWFBLK
	MOV	DWCQE,R5
	MOV	DWCSR,R4
	TST	DWSTAT(R4)
	BMI	INTFDE
	BIT	WRFLAG,DWST2(R4)
	BNE	INTFDE
	BIT	#S2ERR,DWST2(R4);Error status?
	BNE	4$
	TST	INREST
	BNE	6$
.IF NE	ERL$G
	TST	SCSFLG
	BNE	80$
	MOV	R5,-(SP)
	MOV	R4,-(SP)
	MOV	#<<DW$COD*400>!377>,R4
	CALL	@$ELPTR
	MOV	(SP)+,R49$:	BEQ	70$
	BIT	#ERIDNF!ERABO,DWERR(R4)
	BEQ	70$
	SOB	R3,50$
	BR	7$
70$:	BIT	#STOPND,@R5
	BNE	80$
	TSTB	@R5
	BPL	70$
	TST	DWBUF(R4)
	BR	70$
80$:	INC	R3
90$:	MOV	R3,DW$HD
	ASL	R3
	ADD	PC,R3
	ADD	#CYLTAB-.-8.,R3
	MOV	@R3,DW$CY1
	BR	3$
CYLTAB:	.WORD	306.
	.WORD	697.
	.WORD	0
	.WORD	497.
	.WORD	435.
READ:	ASRB	(PC)+
	 .WORD	1
	BCC	3$
	CLR	R5
	BISB	@#173050,R5
	SWAB	R5
	ASL	R5
	SUB	#200,R5
	MOV	R5,@#KISAR1
	MOV	#AP$ACF,R5
	MOV	R5,@#KISDR1
	CLR	@#KISAR0
	MOV	R5,@#KISDR0
	MOV	#
	MOV	(SP)+,R5
.ENDC
80$:	MOV	FNFLAG,R0
	BEQ	INTRQS
	BPL	2$
	TST	DWWCHK
	BEQ	3$
	ASR	R0
	BCC	1$
	CALL	DUMP
	BR	3$
1$:	INC	FNFLAG
	BR	9$
2$:	BMI	3$
	JSR	R0,MTFILL
	  MOV	@R4,(R2)+
	  MOV	@R4,R5
3$:	MOV	WCNT,Q$WCNT(R5)
	BEQ	INTRQS
.IF NE	MMG$T
	MOV	PARVAL, Q$PAR(R5)
.IFF
	MOV	BUFF,Q$BUFF(R5)
.ENDC
	TST	FNFLAG
	BPL	30$
	ASL	(PC)+
	.WORD	100000
	BCS	35$
30$:	INC	@R5
35$:	MOV	@R5,R3
	MOV	DRETRY,RETRY
	JMP	RWNEXT
4$:	TST	INREST
	BNE	DWFDE
	BIT	#<ERTR0!ERABO>,DWERR(R4)
	BNE	DWFD177600,@#KISAR7
	MOV	R5,@#KISDR7
	BIS	#20,@#MMUSR3
	INC	@#MMUSR0
	MOV	#CTI+PROCFG,R3
				.ASSUME	SLOT0 EQ CTI-4
	MOV	@R3,R4
	MOV	R4,R5
1$:	TST	-(R3)
	CMP	-(R3),#DW$ID
	BEQ	2$
	SOB	R5,1$
	CLR	@#MMUSR0
	BR	7$
2$:	CLR	@#MMUSR0
	SUB	R5,R4
	ASH	#7.,R4
	ADD	R4,DWCSR1
	MOV	DWCSR1,R4
	BIT	#STDCAP,DWSTAT(R4)
	BEQ	DSKTYP
3$:	MOV	(PC)+,R4
DWCSR1:	 .WORD	PC$CSR
	TST	DWSTAT(R4)
	BMI	7$
4$:	MOV	R0,-(SP)
	MOV	R1,-(SP)
5$:	MOV	@SP,R3
	CMP	R3,#256.
	BLOS	6$
	MOV	#256.,R3
6$:	SUB	R3,@SP
	MOV	2E
.IF NE	ERL$G
	MOV	R5,-(SP)
	MOV	R4,-(SP)
	CALL	ERLSET
	BISB	RETRY,R4
	CALL	@$ELPTR
	MOV	(SP)+,R4
	MOV	(SP)+,R5
.ENDC
	TSTB	DWSTAT(R4)
	BPL	5$
	CALL	DUMP
5$:	BIT	#ERIDNF,DWERR(R4)
	BEQ	6$
	MOV	DWST2(R4),R3
	BIT	#S2WRF,R3
	BNE	DWFDE
	BIC	#^C<S2SEK!S2DWY>,R3
	CMP	#<S2SEK!S2DWY>,R3
	BNE	DWFDE
	MOV	#-1,INREST
	MOV	CLRIRR,@#ICOPND
	MOV	#CMREST,DWCMD(R4)
	MOV	CLRIMR,@#ICOPND
	RETURN
6$:	DEC	RETRY
	BEQ	DWFDE
	CLR	INREST
	TST	FNFLAG
	BEQ	8$
	BPL	7$
	BIT	#RDAWRT,FNFLAG
	BNE	9$
7$:	(SP),R1
	INC	2(SP)
	MOV	R1,R5
	INC	R5
	BIC	#SECMSK,R5
	MOV	R5,DWSEC(R4)
 	ASH	#-SECBIT,R1
	BIC	#170000,R1
	CLR	R0
	DIV	DW$HD,R0
	CMP	R0,(PC)+
DW$CY1:  .WORD	153.
	BLO	8$
7$:	JMP	@#<BIOERR-DWBOOT>
8$:	MOV	R4,R5
	ADD	#DWCYL,R5
	MOV	R0,(R5)+
	MOV	R1,(R5)+
	MOV	#CMREAD,(R5)+
9$:	TST	@R5
	BMI	9$
	BIT	#S2ERR,DWST2(R4)
	BNE	7$
10$:	TSTB	@R5
	BPL	10$
	MOV	DWBUF(R4),(R2)+
	SOB	R3,10$
11$:	BIT	#STOPND,@R5
	BNE	12$
	TSTB	@R5
	BPL	11$
	TST	DWBUF(R4)
	BR	11$
12$:	TST	@SP
	BNE	5$
	CMP	(JMP	RWRTRY
9$:	MOV	CRNTCYL,DWCYL(R4)
	MOV	CRNTHD,DWHEAD(R4)
	MOV	CRNTSEC,DWSEC(R4)
	MOV	CLRIRR,@#ICDRQ
	MOV	#CMREAD,DWCMD(R4)
	MOV	CLRIMR,@#ICDRQ
	RETURN
8$:	MOVB	Q$FUNC(R5),R0
	ADD	#FNEG,R0
	ASL	R0
	ADD	PC,R0
	ADD	#RTRYTB-.,R0
	ADD	@R0,PC
RTRYTB:
	.WORD	<DSIZ - RTRYTB>
	.WORD	<DWFUE- RTRYTB>
	.WORD	<DWFUE- RTRYTB>
	.WORD	<ABSW - RTRYTB>
	.WORD	<ABSR - RTRYTB>
.SBTTL	I/O COMPLETION SECTION
DWFDE:
.IF NE	ERL$G
	MOV	R5,-(SP)
	CALL	ERLSET
	CALL	@$ELPTR
	MOV	(SP)+,R5
.ENDC
DWFUE:	BISP)+,(SP)+
	CLC
	RETURN
.DSABL	LSB
. = DWBOOT+612
BOOT:	MOV	#10000,SP
	MOV	#2,R0
	MOV	#<4*256.>,R1
	MOV	#1000,R2
	JSR	PC,READ
	MOV	#<READ-DWBOOT>,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	CLR	@#B$DEVU
	JMP	@#B$BOOT
DW$HD:	.WORD	4
	.DREND	DW
.END
                                                                                                                                                                                                                                                                   76
	.SBTTL	INSTALLATION CODE
	.ASECT
	. = 200
	NOP
	MOV	@#SYSPTR,R0
	BIT	#PRO$,CONFG2(R0)
	.IF EQ XL$PC
	BNE	10$
	.IFF
	BEQ	10$
	.ENDC
	.IF EQ XL$PC
	 .IF NE XL$DVE!XL$SBC
	MOV	176,R0
	MOV	ISPEED,4(R0)
	 .ENDC
	.IFF
	MOVB	ISPEED,@#XL$BAU
	MOV	#XL$CSA,R0
	MOVB	#CMD.CR,(R0)
	MOVB	#CRC.TR,(R0)
	MOVB	#RPT.R4,(R0)
	MOVB	#<CLK.16!STP.1>,(R0)
	MOVB	#RPT.R3,(R0)
	MOVB	#<W3.RXE!RCL.8>,(R0)
	MOVB	#RPT.R5,(R0)
	MOVB	#<W5.TXE!TCL.8>,(R0)
	MOVB	#RPT.R2,(R0)
	MOVB	#0,(R0)
	MOVB	#CMD.RE,(R0)
	 .IF NE XL$PDT
	JSR	PC,SETLIT
	 .ENDC
	.IFF
	MOV	#RPT.R1,@CSRA
	BIS	#<W1.RIE!W1.TIE>,SSRAW1
	MOV	SSRAW1,@CSRA
	BIS	#<M0.DTR!M0.RTS>,@MCR0
	MOVB	#CTRLQ,@DBUF
	.ENDC
20$:	MOVB	Q$FUNC(R4),R5
	BNE	SPFUN
	ASL	Q$WCNT(R4)
	BCS	WRITE
READ:	JSR	R5,Q
XICQE:	 .WORD	0
XILQE:	 .WORD	0
	JSR	PC,XIIN
	RTS	PC
WRITE:	INC	QCHG
	JSR	R5,Q
XOCQE:	 .WORD	0
XOLQE:	 .WORD	0
	CLR	QCHG
	.IF EQ XL$PC
	BIS	#XC.IE,@XOS
	.IFF
	JSR	PC,GNXTCH
	BEQ	30$
	MOVB	R5,@DBUF
	.ENDC
30$:	RTS	PC
	.SBTTL	REGISTERS AN
	MOV	#XL$CSB,R0
	MOVB	#CMD.CR,(R0)
	MOVB	#RPT.R2,(R0)
	MOVB	#W2.REQ,(R0)
	MOVB	#RPT.R1,(R0)
	MOVB	#W1.REQ,(R0)
	MOVB	#30!3,@#IC0CR
	MOVB	#CLK.BG,@#XL$MC0
	.ENDC
	TST	(PC)+
10$:	SEC
	RTS	PC
	.IF NE XL$PC
ISPEED:	.WORD	<B.1200*20>+B.1200
	.ENDC
	.IF NE XL$DVE
ISPEED:	.WORD	<B.1200*10000>!4000
	.ENDC
	.IF NE XL$SBC
ISPEED:	.WORD	<B.1200*10>!XC.ENB
	.ENDC
	.SBTTL	SET OPTION PARAMETER TABLE
	.IF EQ XL$PC
	.DRSET	CSR,160000,O.CSR,OCT
	.DRSET	VECTOR,477,O.VEC,OCT
	.ENDC
	.IF EQ XL$PC
D VECTOR TABLES
	.IF EQ XL$PC
XIS:	.WORD	XL$CSR
XIB:	.WORD	XL$CSR+2
XOS:	.WORD	XL$CSR+4
XOB:	.WORD	XL$CSR+6
	.IFF
DBUF:	.WORD	XL$BUF
CSRA:	.WORD	XL$CSA
CSRB:	.WORD	XL$CSB
MCR0:	.WORD	XL$MC0
MCR1:	.WORD	XL$MC1
BAUD:	.WORD	XL$BAU
	.ENDC
	.IF NE XL$PC
SSRAW1:	.WORD	0
SSRAW5:	.WORD	<W5.TXE!TCL.8>
	.ENDC
	.IF EQ XL$PC
	.DRVTB	XL,XL$VEC,XIINT
	.DRVTB	,XL$VEC+4,XLINT
	.IFF
	.DRVTB	XL,XL$VEC,XLINT
	.DRVTB	,XL$VEC+4,XLINT
	.ENDC
	.IF EQ XL$PC
	 .IF NE XL$PDT
SETLIT:	TST	(PC)+
LITFLG:	 .WSYSPTR	= 54
	QCOMP	= 270
	CONFIG	= 300
		FBMON$	= 000001
	CONFG2	= 370
		PRO$	= 020000
	BUFSIZ	= 64.
	STPSIZ	= BUFSIZ/4
	RSTSIZ	= BUFSIZ*3/4
	LF	= 12
	CR	= 15
	CTRLQ	= 21
	CTRLS	= 23
	CTRLZ	= 32
	CLRDRV	= 201
	BRKDRV	= 202
	SRDDRV	= 203
	STSDRV	= 204
	OFFDRV	= 205
	RC.CTS	= 020000
	RC.IE	= 000100
	RC.DTR	= 000002
	XC.IE	= 000100
	XC.SPD	= 000070
	XC.ENB	= 000002
	XC.BR	= 000001
	IC0DR	= 173200
	IC0CR	= IC0DR+2
	XL$BUF	= XL$CSR
	XL$CSA	= XL$CSR+2
	XL$CSB	= XL$CSR+6
	XL$MC0	= XL	 .IF NE XL$PDT
	.DRSET	LIGHTS,-1,O.LGHT,NO
	 .ENDC
	.ENDC
	.IF NE XL$PC!XL$DVE!XL$SBC
	.DRSET	SPEED,NOP,O.SPEE,NUM
	.ENDC
	.SBTTL	SET OPTION PROCESSING ROUTINES
	.IF EQ XL$PC
O.CSR:	MOV	R0,176
	MOV	R0,XIS
	MOV	R0,XIB
	ADD	#2,XIB
	MOV	R0,XOS
	ADD	#4,XOS
	MOV	R0,XOB
	ADD	#6,XOB
	CMP	R0,R3
	RTS	PC
O.VEC:	MOV	R0,XL$VTB
	ADD	#4,R0
	MOV	R0,XL$VTB+6
	CMP	R3,R0
	RTS	PC
	 .IF NE XL$PDT
O.LGHT:	CLR	R3
	NOP
	COM	R3
	MOV	R3,LitFlg
	CLC
	RTS	PC
	 .ENDC
	.ENDC
	.IF NE XL$PC!XL$DVE!XL$SB$CSR+10
	XL$MC1	= XL$CSR+12
	XL$BAU	= XL$CSR+14
	RPT.R0	= 000
		CRC.TR	= 300
		CMD.RE	= 020
		CMD.CR	= 030
		CMD.RT	= 050
		CMD.ER	= 060
		CMD.EI	= 070
	RPT.R1	= 001
		W1.RIE	= 030
		W1.TIE	= 002
	RPT.R2	= 002
	RPT.R3	= 003
		RCL.8	= 300
		W3.RXE	= 001
	RPT.R4	= 004
		CLK.16	= 100
		STP.1	= 004
		W4.EVN	= 002
		W4.PEN	= 001
	RPT.R5	= 005
		TCL.8	= 140
		W5.SB	= 020
		W5.TXE	= 010
	RPT.R1	= 001
		W1.REQ	= 004
	RPT.R2	= 002
		W2.REQ	= 000
		R2.IMK	= 034
		IMK.BE	= 020
		IMK.ES	C
O.SPEE:	MOV	PC,R1
	ADD	#SPEEDT-.,R1
10$:	TST	(R1)
	BEQ	20$
	CMP	R0,(R1)+
	BNE	10$
	SUB	PC,R1
	SUB	#<SPEEDT+2-.>,R1
	 .IF NE XL$PC
	ASR	R1
	MOV	R1,-(SP)
	ASL	R1
	ASL	R1
	ASL	R1
	ASL	R1
	BIS	(SP)+,R1
	MOVB	R1,@#XL$BAU
	 .ENDC
	 .IF NE XL$DVE
	SWAB	R1
	ASL	R1
	ASL	R1
	ASL	R1
	BIS	#4000,R1
	MOV	176,R0
	MOV	R1,4(R0)
	 .ENDC
	 .IF NE XL$SBC
	ASL	R1
	INC	R1
	ASL	R1
	MOV	176,R0
	MOV	R1,4(R0)
	 .ENDC
	MOV	R1,ISPEED
	TST	(PC)+
20$:	SEC
	RTS	PC
SPEEDT:
	 .IF EQ XL$SBC
	.WORD	= 024
		IMK.CA	= 030
		IMK.SR	= 034
	CLK.BG	= 000
	M0.DTR	= 020
	M0.RTS	= 010
	M1.CTS	= 040
	.IF NE XL$PC!XL$DVE
	B.50	= 000
	B.75	= 001
	B.110	= 002
	B.134	= 003
	B.150	= 004
	B.300	= 005
	B.600	= 006
	B.1200	= 007
	B.1800	= 010
	B.2000	= 011
	B.2400	= 012
	B.3600	= 013
	B.4800	= 014
	B.7200	= 015
	B.9600	= 016
	B.192K	= 017
	.ENDC
	.IF NE XL$SBC
	B.300	= 000
	B.600	= 001
	B.1200	= 002
	B.2400	= 003
	B.4800	= 004
	B.9600	= 005
	B.192K	= 006
	B.384K	= 007
	.ENDC
	PS	= 177750.,	75.,	110.,	134.,	150.,	300.
	.WORD	600.,	1200.,	1800.,	2000.,	2400.,	3600.
	.WORD	4800.,	7200.,	9600.,	19200.
	 .IFF
	.WORD	300.,	600.,	1200.,	2400.,	4800.,	9600.
	.WORD	19200.,	38400.
	 .ENDC
	.WORD	0
	.ENDC
	.SBTTL	DRIVER ENTRY
	.DRBEG	XL
	MOV	XLCQE,R4
	.IF EQ XL$PC
	TST	Q$BLKN(R4)
	BNE	10$
	MOV	@#SYSPTR,R5
	BIT	#FBMON$,CONFIG(R5)
	BNE	10$
	CLR	XICQE
	CLR	XOCQE
10$:	BIS	#<RC.IE!RC.DTR>,@XIS
	.ENDC
	STATFG = .+2
	ASR	#1
	BCC	20$
	.IF EQ XL$PC
	MOV	#-2,SNDS
	BIS	#XC.IE,@XOSBEQ	80$
	BIS	#4,R5
80$:
	.IF EQ	MMG$T
	MOV	R5,@Q$BUFF(R4)
	.IFF
	MOV	R5,-(SP)
	JSR	PC,@$PTWRD
	.ENDC
	BR	10$
100$:	MOV	#1,STATFG
	BR	10$
	.IF NE XL$PC
	.SBTTL	INTERRUPT SERVICE/DISPATCHER
	.DRAST	XL,4,XLDONE
	MOV	#RPT.R2,@CSRB
	MOV	@CSRB,-(SP)
	BIC	#^C<R2.IMK>,(SP)
	ASR	(SP)
	ADD	PC,(SP)
	ADD	#INTTAB-.,(SP)
	MOV	@(SP),(SP)
	ADD	PC,(SP)
INTDSP:	JMP	@(SP)+
ESINT:	MOV	#CMD.RE,@CSRA
IECOM:	MOV	#CMD.EI,@CSRA
	RTS	PC
SRINT:	MOV	#CMD.ER,@CSRA
	JMP	XIINT
INTTAB:	.WORD	IECOM-INTDSP
	.W$WCNT(R4)
	JSR	PC,@$GTBYT
	MOV	(SP)+,R5
	.ENDC
	BIC	#^C<177>,R5
	BEQ	GNXTCH
	ASR	(PC)+
CRFLG:	 .WORD	0
	BCC	5$
	CMPB	R5,#LF
	BEQ	GNXTCH
5$:	CMPB	R5,#LF
	BNE	10$
	INC	CRFLG
10$:	RTS	PC
20$:	INC	QCHG
	.IF EQ XL$PC
	BIC	#XC.IE,@XOS
	.ENDC
	MOV	XOCQE,R4
	MOV	Q$LINK(R4),XOCQE
	JSR	PC,XLFIN
	CLR	QCHG
	.IF EQ XL$PC
	BIS	#XC.IE,@XOS
	.ENDC
	BR	GNXTCH
	.DSABL	LSB
	.SBTTL	INPUT INTERRUPT SERVICER
	.IF EQ XL$PC
	.DRAST	XI,XL$PRI
	.IFF
XIINT:
	.ENDC
	.ENABL	LSB
	.IF EQ XL$PC
	MOVB	@ORD	IECOM-INTDSP
	.WORD	IECOM-INTDSP
	.WORD	IECOM-INTDSP
	.WORD	XOINT-INTDSP
	.WORD	ESINT-INTDSP
	.WORD	XIINT-INTDSP
	.WORD	SRINT-INTDSP
	.ENDC
	.SBTTL	DRIVER RESET ENTRY
	.ENABL	LSB
XLDONE:	MOV	R0,-(SP)
	.IF EQ XL$PC
	BIC	#RC.IE,@XIS
	.IFF
	MOV	#RPT.R1,@CSRA
	BIC	#W1.RIE,SSRAW1
	MOV	SSRAW1,@CSRA
	.ENDC
	JSR	R4,20$
	 .WORD	XICQE-30$-Q$LINK
	TST	STATFG
	BNE	99$
	.IF EQ XL$PC
	BIS	#RC.IE,@XIS
	.IFF
	MOV	#RPT.R1,@CSRA
	BIS	#W1.RIE,SSRAW1
	MOV	SSRAW1,@CSRA
	.ENDC
99$:	INC	QCHG
	JSXIB,R5
	.IFF
	MOVB	@DBUF,R5
	.ENDC
	BIC	#^C<177>,R5
	BEQ	5$
	CMP	R5,#CTRLS
	BNE	10$
	MOV	#1,RECS
5$:
	.IF EQ XL$PC
	 .IF NE XL$PDT
	JSR	PC,SETLIT
	 .ENDC
	.IFF
	MOV	#CMD.EI,@CSRA
	.ENDC
	RTS	PC
10$:	CMP	R5,#CTRLQ
	BNE	20$
	CLR	RECS
	.IF EQ XL$PC
	BIS	#XC.IE,@XOS
	.IFF
	CLR	SNDS
	MOVB	#CTRLQ,@DBUF
	.ENDC
	BR	5$
20$:	TST	XIBFRE
	BEQ	40$
	MOV	XIBIN,R4
	ADD	PC,R4
	ADD	#XIBUF-.,R4
	MOVB	R5,(R4)
	DEC	XIBFRE
	INC	XIBIN
	CMP	XIBIN,#BUFSIZ
	BLO	30$
	CLR	XIBIN
30$:	CMP	XIBFRE,#SR	R4,20$
	 .WORD	XOCQE-30$-Q$LINK
	CLR	QCHG
	TST	STATFG
	BNE	98$
	.IF EQ XL$PC
	BIS	#XC.IE,@XOS
	.IFF
	MOV	R5,-(SP)
	JSR	PC,GNXTCH
	BEQ	5$
	MOVB	R5,@DBUF
5$:	MOV	(SP)+,R5
	.ENDC
98$:	MOV	(SP)+,R0
	TST	XLCQE
	BNE	10$
	RTS	PC
10$:	.DRFIN	XL
20$:	MOV	(R4)+,R5
	MOV	R4,-(SP)
	ADD	PC,R5
30$:	MOV	R5,-(SP)
40$:	MOV	Q$LINK(R5),R4
	BEQ	70$
	MOVB	Q$JNUM(R4),R0
	ASR	R0
	ASR	R0
	ASR	R0
	BIC	#^C<37>,R0
	CMP	R0,4(SP)
	BNE	60$
	MOV	Q$LINK(R4),Q$LINK(R5)
	TST	XLCQE
	BNE	50$
	MOV	R4,XLCQE
TPSIZ
	BHI	50$
	TST	SNDS
	BGT	50$
40$:
	.IF EQ XL$PC
	MOV	#-1,SNDS
	BIS	#XC.IE,@XOS
	.IFF
	MOV	#1,SNDS
	MOVB	#CTRLS,@DBUF
	.ENDC
50$:	TST	XICQE
	BEQ	5$
	.IF NE XL$PC
	MOV	#CMD.EI,@CSRA
	.ENDC
	.DSABL	LSB
	.SBTTL	PROCESS INPUT RECIEVED FROM INTERRUPT SERVICER
	.ENABL	LSB
XIIN:	INC	INPRC
	BNE	110$
	JSR	PC,SAV30
5$:	CLR	INPRC
	CMP	XIBFRE,#RSTSIZ
	BLO	10$
	TST	SNDS
	BEQ	10$
	.IF EQ XL$PC
	MOV	#-2,SNDS
	BIS	#XC.IE,@XOS
	.IFF
	CLR	SNDS
	MOVB	#CTRLQ,@DBUF
	.ENDC
10$:	MOV	XICQE,RORD	0
	BEQ	30$
	MOV	#040000,R5
	TST	SNDS
	BLE	10$
	BIS	#000100,R5
10$:	TST	RECS
	BEQ	20$
	BIS	#000200,R5
20$:	MOV	R5,@#177420
30$:	RTS	PC
	 .ENDC
	.ENDC
	.SBTTL	SPFUN PROCESSING
SPFUN:	CMPB	R5,#SRDDRV
	BEQ	READ
	CMPB	R5,#BRKDRV
	BEQ	20$
	CMPB	R5,#CLRDRV
	BEQ	40$
	CMPB	R5,#STSDRV
	BEQ	50$
	CMPB	R5,#OFFDRV
	BEQ	100$
10$:	.DRFIN	XL
20$:	TST	Q$WCNT(R4)
	BEQ	30$
	MOV	#1,BRKFLG
	.IF EQ XL$PC
	BIS	#XC.BR,@XOS
	.IFF
	MOV	#RPT.R5,@CSRA
	BIS	#W5.SB,SSRAW5
	MOV	SSRAW5,@CSRA
	.ENDC
		MOV	R4,XLLQE
	BR	40$
50$:	CLR	Q$LINK(R4)
	MOV	XLLQE,R0
	MOV	R4,Q$LINK(R0)
	MOV	R4,XLLQE
	BR	40$
60$:	MOV	R4,R5
	BR	40$
70$:	MOV	(SP)+,R4
	MOV	R5,Q$LINK+2(R4)
	MOV	(SP)+,R4
	RTS	R4
	.DSABL	LSB
	.SBTTL	OUTPUT INTERRUPT SERVICER
	.IF EQ XL$PC
	.DRAST	XL,XL$PRI,XLDONE
	.IFF
XOINT:
	.ENDC
	.ENABL	LSB
	TST	(PC)+
BRKFLG:	 .WORD	0
	BNE	30$
	TST	(PC)+
SNDS:	 .WORD	0
	BPL	10$
	MOVB	#CTRLQ,R5
	ADD	#2,SNDS
	BEQ	20$
	MOVB	#CTRLS,R5
	BR	20$
10$:	TST	(PC)+
RECS:	 .WORD	0
	BNE	30$
	TST	BR	10$
30$:
	.IF EQ XL$PC
	BIC	#XC.BR,@XOS
	.IFF
	MOV	#RPT.R5,@CSRA
	BIC	#W5.SB,SSRAW5
	MOV	SSRAW5,@CSRA
	.ENDC
	CLR	BRKFLG
	.IF EQ XL$PC
	BIS	#XC.IE,@XOS
	.ENDC
	BR	10$
40$:	CLR	RECS
	.IF EQ XL$PC
	MOV	#-2,SNDS
	BIS	#XC.IE,@XOS
	 .IF NE XL$PDT
	JSR	PC,SETLIT
	 .ENDC
	.IFF
	CLR	SNDS
	MOVB	#CTRLQ,@DBUF
	.ENDC
	BR	10$
50$:	MOV	#$$$VER*400,R5
	TST	SNDS
	BLE	60$
	INC	R5
60$:	TST	RECS
	BEQ	70$
	BIS	#2,R5
70$:
	.IF EQ XL$PC
	BIT	#RC.CTS,@XIS
	.IFF
	BIT	#M1.CTS,@MCR1
	.ENDC
	(PC)+
QCHG:	 .WORD	0
	BNE	30$
	JSR	PC,GNXTCH
	BEQ	30$
20$:
	.IF EQ XL$PC
	MOVB	R5,@XOB
	 .IF NE XL$PDT
	JSR	PC,SETLIT
	 .ENDC
	RTS	PC
	.IFF
	MOVB	R5,@DBUF
	.ENDC
30$:
	.IF EQ XL$PC
	BIC	#XC.IE,@XOS
	.IFF
	MOV	#CMD.RT,@CSRA
	MOV	#CMD.EI,@CSRA
	.ENDC
	RTS	PC
	.DSABL	LSB
	.SBTTL	GNXTCH	- Get next output character
	.ENABL	LSB
GNXTCH:	MOV	XOCQE,R4
	BEQ	10$
	.IF EQ MMG$T
	ADD	#Q$WCNT,R4
	TST	@R4
	BEQ	20$
	INC	@R4
	MOVB	@-(R4),R5
	INC	@R4
	.IFF
	TST	Q$WCNT(R4)
	BEQ	20$
	INC	Q:	INC	CTZFLG
50$:
	.IF EQ MMG$T
	ADD	#Q$WCNT,R4
60$:	CLRB	@-(R4)
	INC	(R4)+
	DEC	(R4)
	BNE	60$
	.IFF
	CLRB	-(SP)
	JSR	PC,@$PTBYT
	DEC	Q$WCNT(R4)
	BNE	50$
	.ENDC
70$:	MOV	XICQE,R4
	MOV	Q$LINK(R4),XICQE
80$:	JSR	PC,XLFIN
	BR	5$
90$:	BIS	#EOF$,@-(R4)
	BR	70$
100$:	DEC	INPRC
	BPL	5$
110$:	RTS	PC
INPRC:	.WORD	-1
	.DSABL	LSB
SAV30:	MOV	(SP)+,(PC)+
10$:	 .WORD	0
	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	10$,-(SP)
	.MTPS	#0
	JSR	PC,@(SP)+
	MOV	(SP)+,R3
	MOV	(SP)T
.IF NE	SP$FLG
	.DRSET	FLAG,4,S.FLAG,<NUM>
	.DRSET	WIDE,WIDOFF,S.WIDE,<NO>
	.DRSET	FORM0,-1,S.FRM0,<NO>
	.DRSET	METSCH,-1,S.JIM,<NO>
.ENDC
	.DRSET	DEBUG,BPTINS,S.DEBUG,<NO>
.SBTTL	SET CODE
S.DEBUG:MOV	R3,R0
	BR	10$
	MOV	#NOPINS,R0
10$:	MOV	R0,DBGINS
	RTS	PC
S.HOLD:	MOV	#OFF,R3
S.BIT:	MOV	@#SYSPTR,R0
	BISB	R1,R3
	BIS	R3,SPSTAT(R0)
	CLR	R3
	RTS	PC
.IF NE	SP$FLG
S.FLAG:	NOP
	NOP
	NOP
	NOP
	CMP	R0,R3
	BHI	S.ERR
	BIC	#MASK.U,R1
	.ADDR	#FLGCNT,R1,ADD
	MOVB	R0,@R1
S.OK:	TST	(PC)+
S.+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RTS	PC
	.SBTTL	ENTER ENTRY ON INTERNAL QUEUE
Q:	CLR	XLCQE
	CLR	XLLQE
	TST	(R5)
	BNE	10$
	MOV	R4,(R5)+
	MOV	R4,(R5)+
	RTS	R5
10$:	TST	(R5)+
	MOV	R4,-(SP)
	MOV	(R5),R4
	MOV	(SP),Q$LINK(R4)
	MOV	(SP)+,(R5)+
	RTS	R5
	.SBTTL	REMOVE ENTRY FROM INTERNAL QUEUE
XLFIN:	.MTPS	#340
	TST	XLCQE-4
	BPL	999$
	MOV	(SP),-(SP)
.IF EQ	MMG$T
	CLR	2(SP)
.IFF
	MOV	@#PS,2(SP)
	BIC	#340,2(SP)
.ENDC
	.INTEN	XL$PRI,PIC
	.FORK	DQFBLK
.IF EQ	MMG$T
	.MTPS	#340
.IFF
	BERR:	SEC
	RETURN
S.FRM0:	CLR	R3
	NOP
	COM	R3
	BIC	#MASK.U,R1
	.ADDR	#FRM0ST,R1,ADD
	MOVB	R3,@R1
	BR	S.OK
S.WIDE:	CLR	R3
	NOP
	.ADDR	#WIDTAB,R3,ADD
	.ADDR	#WIDFIL,R0
	MOV	(R3)+,(R0)+
	MOV	(R3)+,(R0)+
	MOV	(R3)+,(R0)+
	BR	S.OK
WIDTAB:	.WORD	10.,9.,8.,6.,6.,5.
S.JIM:	CLR	R3
	NOP
	COM	R3
	MOV	R3,JIM
	BR	S.OK
.ENDC
	.ASSUME	. LT 1000
.SBTTL DRIVER ENTRY
	.DRBEG	SP
	BR	SPGO
DBGINS:	NOP
	RETURN
.IF NE	SP$FLG
FLGCNT:	.REPT	8.
	.BYTE	2
	.ENDR
FRM0ST:	.REPT	8.
	.BYTE	0
	.ENDR
WIDIS	#340,@#PS
.ENDC
999$:	MOV	XLCQE,-(SP)
	MOV	R4,XLCQE
	MOV	R4,XLLQE
	CLR	Q$LINK(R4)
	MOV	PC,R4
	ADD	#XLCQE-.,R4
	MOV	@#SYSPTR,R5
	JSR	PC,@QCOMP(R5)
	MOV	(SP),XLCQE
	MOV	(SP)+,XLLQE
	RTS	PC
	.SBTTL	INPUT BUFFER AREA
XIBUF:	.BLKB	BUFSIZ
XIBIN:	.WORD	0
XIBOUT:	.WORD	0
XIBFRE:	.WORD	BUFSIZ
DQFBLK:	.WORD	0,0,0,0
	.DREND	XL
	.END
                                                                                                                                                                   FIL:	.WORD	10.
WIDDAT:	.WORD	9.
WIDTIM:	.WORD	8.
JIM:	.WORD	0.
.ENDC
SPGO:	CALL	DBGINS
SETPTR:	MOV	@#SYSPTR,R4
.IF NE	MMG$T
	MOV	P1EXT(R4),(PC)+
$P1EXT:	.WORD	0
.ENDC
	ADD	#SPSTAT,R4
	MOV	R4,SPCSR
DETFUN:	MOV	SPCQE,R4
	MOV	@R4,SP$BNR
	MOV	Q$FUNC(R4),SP$JAF
.IF NE	SP$FLG
	MOVB	Q$FUNC(R4),R5
	BEQ	IOREQ
.IFF
	.BR	IOREQ
.ENDC
.SBTTL PROCESS SPECIAL FUNCTION REQUESTS
.IF NE	SP$FLG
SPFUN:	CMPB	R5,#ENT$ER
	BNE	10$
	CALL	GETFIL
	MOVB	Q$UNIT(R4),R0
	BIC	#MASK.U,R0
	MOV	R0,-(SP)
	.ADDR	.MCALL	.MODULE
.MODULE	SP,RELEASE=B03,VERSION=01,COMMENT=<Spooler Handler>,AUDIT=FODOS

.SBTTL CREDITS
.SBTTL MACROS AND DEFINITIONS
	.ENABLE	LC
	.NLIST	BEX
.MCALL	.DRDEF,.ADDR,.ASSUME,.BR
.IIF NDF SP$FLG, SP$FLG = 0
.IIF NDF SP$DEC, SP$DEC = 0
.IF NE	SP$FLG
	.DRDEF	SP,55,WONLY$!SPECL$!SPFUN$,0,0,110
.IFF
	.DRDEF	SP,55,WONLY$,0,0,110
.ENDC
	.MACRO	SFR
	MOV	(SP)+,(PC)+
	.WORD	0
	.ENDM
	.MACRO	RFS ROUTINE
	JMP	@ROUTINE+2
	.ENDM
.SBTTL	CONSTANT AND PARAMETER DEFINITION
NEXT	= 000010
OF#FRM0ST,R0,ADD
	MOVB	@R0,FRM0FLG
	MOV	@SPCSR,R0
	BIT	#BPOVER,R0
	BEQ	5$
	COM	R0
	BIC	#^C<BPOVER>,R0
	SWAB	R0
	MOVB	R0,BANFLG
	BIC	#BPOVER,@SPCSR
	TST	(SP)+
	BR	8$
5$:	MOV	(SP)+,R0
	.ADDR	#FLGCNT,R0,ADD
	MOVB	@R0,BANFLG
	BEQ	100$
8$:	.ADDR	#BANNER,R5
	MOV	R5,INTVEC
	BIS	#INTEN!DATIME,@SPCSR
	RTS	PC
10$:	CMPB	R5,#LOOK$UP
	BNE	SPEXIT
	CALL	GETFIL
	TST	SP$FNR
	BEQ	100$
	CLR	SP$FNR
	BR	SPERR
100$:	BR	SPEXIT
.ENDC
.SBTTL	PROCESS I/O REQUESTS
IOREQ:	TST	Q$WCNT(R4)
	BEQ	SPEXIT
	BGT	4
	BEQ	100$
	ASR	(PC)+
CTZFLG:	 .WORD	0
	BCS	90$
	CMP	XIBFRE,#BUFSIZ
	BEQ	100$
	MOV	XIBOUT,R5
	ADD	PC,R5
	ADD	#XIBUF-.,R5
	MOVB	(R5),R5
	INC	XIBFRE
	INC	XIBOUT
	CMP	XIBOUT,#BUFSIZ
	BLO	20$
	CLR	XIBOUT
20$:	TSTB	Q$FUNC(R4)
	BNE	30$
	CMP	R5,#CTRLZ
	BEQ	40$
30$:
	.IF EQ MMG$T
	ADD	#Q$WCNT,R4
	MOVB	R5,@-(R4)
	INC	(R4)+
	DEC	(R4)
	.IFF
	MOVB	R5,-(SP)
	JSR	PC,@$PTBYT
	DEC	Q$WCNT(R4)
	.ENDC
	BEQ	70$
	CMP	XIBFRE,#BUFSIZ
	BNE	5$
	MOV	XICQE,R4
	TSTB	Q$FUNC(R4)
	BEQ	5$
	BR	50$
40$F	= 000020
ON	= 000040
KILL	= 000100
ACTIVE	= 000200
BPOVER	= 003400
SHOW	= 004000
PRTSCR	= 010000
DATIME	= 020000
INTEN	= 040000
ERROR	= 100000
SYSPTR	= 000054
 P1EXT	= 000432
 SPSTAT	= 000414
 $DATE	= 000262
  YEAR$	= 000037
  DAY$	= 001740
  MONTH	= 036000
CLO$SE	= 000001
DELE$TE	= 000002
LOOK$UP	= 000003
ENT$ER	= 000004
MASK.U	= 177770
BPTINS	= 000003
NOPINS	= 000240
WIDOFF	= 000006
.SBTTL	SET OPTIONS
	.DRSET	HOLD,ON,S.HOLD,<NO>
	.DRSET	NEXT,NEXT,S.BIT
	.DRSET	KILL,KILL,S.BISPERR
.IF NE	SP$FLG
	.ADDR	#IOINT,R5
	MOV	R5,INTVEC
.ENDC
	CLR	(PC)+
BLKSC:	.WORD	0
	BIS	#INTEN,@SPCSR
	RTS	PC
.SBTTL	SPOOLER FIXED OFFSETS
.IF NE	SP$FLG
SP$DAT:	.BLKB	10.
	.ASSUME	SP$DAT EQ SPINT-42
SP$TIM:	.BLKB	8.
	.ASSUME	SP$TIM EQ SPINT-30
SP$FNR:	.WORD	0,0,0
	.ASSUME	SP$FNR EQ SPINT-20
.ENDC
SP$BNR:	.WORD	0
	.ASSUME	SP$BNR EQ SPINT-12
SP$JAF:	.WORD	0
	.ASSUME	SP$JAF EQ SPINT-10
SP$WCR:	.WORD	0
	.ASSUME	SP$WCR EQ SPINT-6
SP$BPR:	.WORD	0
	.ASSUME	SP$BPR EQ SPINT-4
.SBTTL INTER
	MOVB	#'-,(R4)+
	MOV	(SP)+,R5
	BIC	#^C<YEAR$>,R5
	ADD	#110,R5
	CALL	PUTNUM
	CLRB	(R4)+
	TST	BANFLG
	BEQ	50$
10$:	CALL	FRM0FF
	CALL	FODOS
	CALL	CRLF
	MOV	WIDFIL,R1
	.ADDR	#ASCFIL,R5
	CALL	BIGGY
	TST	JIM
	BEQ	30$
	MOV	#30.,R1
20$:	MOV	#12,R0
	CALL	CHROUT
	DEC	R1
	BNE	20$
	.ADDR	#PRION,R5
	CALL	STROUT
	.ADDR	#SP$DAT,R5
	CLRB	9.(R5)
	CALL	STROUT
	.ADDR	#PRIAT,R5
	CALL	STROUT
	.ADDR	#SP$TIM,R5
	CLRB	8.(R5)
	CALL	STROUT
	CALL	CRLF
	CALL	CRLF
	BR	40$
30$:	CALL	CRLF
	MOV	WIDDAT,RRUPT SERVICE ROUTINE
	.DRAST	SP,4,SPEXIT
	CALL	DBGINS
	MOV	SPCQE,R4
	TST	@SPCSR
	BMI	SPERR
.IF NE	SP$FLG
	JSR	R3,SAVE30
	JMP	@INTVEC
INTVEC:	.WORD	0
.IFF
	.BR	IOINT
.ENDC
.SBTTL	POST INTERRUPT I/O PROCESSING
IOINT:	CLR	SP$WCR
	ADD	BLKSC,SP$BNR
.IF NE	MMG$T
1$:	MOV	Q$PAR(R4),10$
	JSR	R0,@$P1EXT
	.WORD	10$-.
	MOV	@Q$BUFF(R4),R5
10$:	.WORD	0
	MOV	R5,@SP$BPR
.IFF
1$:	MOV	@Q$BUFF(R4),@SP$BPR
.ENDC
	ADD	#2,SP$BPR
	ADD	#2,Q$BUFF(R4)
	.IF	NE MMG$T
	CMP	Q$BUFF(R4),#40000
	BLO	2$
	SUB	1
	.ADDR	#SP$DAT,R5
	CALL	BIGGY
	CALL	CRLF
	MOV	WIDTIM,R1
	.ADDR	#SP$TIM,R5
	CALL	BIGGY
	CALL	CRLF
40$:	CALL	FODOS
	DEC	BANFLG
	BEQ	50$
	MOV	#FF,R0
	CALL	CHROUT
	BR	10$
50$:	CALL	FRM0FF
	BIT	#1,SP$WCR
	BEQ	100$
	CLR	R0
	CALL	CHROUT
100$:	ASR	SP$WCR
	JMP	SPEXIT
MOTAB:	.ASCIZ	"JAN"
	.ASCIZ	"FEB"
	.ASCIZ	"MAR"
	.ASCIZ	"APR"
	.ASCIZ	"MAY"
	.ASCIZ	"JUN"
	.ASCIZ	"JUL"
	.ASCIZ	"AUG"
	.ASCIZ	"SEP"
	.ASCIZ	"OCT"
	.ASCIZ	"NOV"
	.ASCIZ	"DEC"
ASCFIL:	.ASCII	"FILENA."
ASCEXT:	.ASCII	"EX#20000,Q$BUFF(R4)
	ADD	#200,Q$PAR(R4)
	.ENDC
2$:	INC	SP$WCR
	INC	Q$WCNT(R4)
	BEQ	SPEXIT
	CMP	SP$WCR,#256.
	BNE	1$
	INC	BLKSC
	RTS	PC
.SBTTL	ERROR AND NORMAL EXITS
SPERR:	BIS	#HDERR$,@-(R4)
SPEXIT:	BIC	#INTEN,@SPCSR
	BIC	#ERROR,@(PC)+
SPCSR:	.WORD	0
	.DRFIN	SP
.SBTTL	GET FILENAME SUBROUTINE
.IF NE	SP$FLG
GETFIL:	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	Q$BUFF(R4),R5
	.ADDR	#SP$FNR,R3
.IF EQ	MMG$T
	MOV	(R5)+,(R3)+
	MOV	(R5)+,(R3)+
	MOV	(R5)+,(R3)+
.IFF
	MOV	R2,-(SP)
	MOV	Q$PAR(R4),20$
	MOT"
	.EVEN
.SBTTL	SUBROUTINE TO PRINT BIG CHARACTERS
BIGGY:	SFR
	.ADDR	#CHRADR,R2
	MOV	R1,(PC)+
NUMCHR:	.WORD	0
	MOV	R5,(PC)+
BUFPTR:	.WORD	0
10$:	MOVB	(R5)+,R0
	.ADDR	#A,R4
	JSR	R5,RANGE
	 .WORD	A.A, A.Z
	BCC	20$
	.ADDR	#ZERO,R4
	JSR	R5,RANGE
	 .WORD	A.0, A.COLON
	BCC	20$
	.ADDR	#DASH,R4
	JSR	R5,RANGE
	 .WORD	A.DASH, A.DOT
	BCC	20$
	.ADDR	#BLANK,R4
	JSR	R5,RANGE
	 .WORD	A.SPACE,A.SPACE
	BCC	20$
	CLR	(R2)+
	BR	30$
20$:	SUB	R3,R0
	ASL	R0
	ASL	R0
	MOV	R0,-(SP)
	ASL	R0
	ASL	R0V	#3,R2
10$:	JSR	R0,@$P1EXT
	  .WORD	20$-.
	   MOV	(R5)+,R4
20$:	  .WORD	0
	MOV	R4,(R3)+
	SOB	R2,10$
	MOV	(SP)+,R2
.ENDC
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	RETURN
.ENDC
.SBTTL	SAVE REGISTERS 3-0
.IF NE	SP$FLG
SAVE30::MOV	R2,-(SP)
	MOV	R1,-(SP)
	MOV	R0,-(SP)
	JSR	PC,@R3
	MOV	(SP)+,R0
	MOV	(SP)+,R1
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	RTS	PC
.ENDC
.SBTTL	FLAG PAGE CHARACTER DATA
.IF NE	SP$FLG
CR	=	015
FF	=	014
LF	=	012
A.SPACE	=	040
A.STAR	=	052
A.DASH	=	055
A.DOT	=	056
A.0	=	060
A.COLO
	ADD	R0,@SP
	MOV	R4,R0
	ADD	(SP)+,R0
	MOV	R0,(R2)+
30$:	DEC	R1
	BNE	10$
OUTPUT:	MOV	#1,R3
10$:	CALL	CRLF
20$:	.ADDR	#CHRADR,R2
	MOV	NUMCHR,R1
	MOV	BUFPTR,R5
25$:	.REPT	2
	MOV	#A.SPACE,R0
	CALL	CHROUT
	.ENDR
28$:	MOV	#10.,(PC)+
29$:	.WORD	10.
	MOVB	(R5)+,R0
	CMP	R0,#A.DASH
	BEQ	295$
	CMPB	R0,#A.DOT
	BEQ	295$
	CMPB	R0,#A.COLON
	BNE	297$
295$:	MOV	#A.STAR,R0
297$:	MOV	(R2)+,R4
	BEQ	50$
30$:	MOV	R0,(PC)+
31$:	.WORD	0
	BIT	R3,(R4)+
	BNE	40$
	MOV	#A.SPACE,R0
40$:	CALL	CHROUT
	MOVN	=	072
A.A	=	101
A.Z	=	132
BANFLG:	 .WORD	0
FRM0FLG: .WORD	0
BANNER:	CLR	SP$BNR
	CLR	SP$WCR
	MOV	#6,R1
	.ADDR	#SP$FNR,R4
	.ADDR	#ASCFIL,R5
	CALL	R50ASC
	MOV	#3,R1
	.ADDR	#SP$FNR+4,R4
	.ADDR	#ASCEXT,R5
	CALL	R50ASC
	MOV	@#SYSPTR,R1
	MOV	$DATE(R1),-(SP)
	MOV	@SP,R5
	BIC	#^C<DAY$>,R5
	.REPT	5
	ASR	R5
	.ENDR
	.ADDR	#SP$DAT,R4
	CALL	PUTNUM
	MOVB	#'-,(R4)+
	MOV	@SP,R5
	BIC	#^C<MONTH>,R5
	SWAB	R5
	SUB	#4,R5
	.ADDR	#MOTAB,R5,ADD
	MOVB	(R5)+,(R4)+
	MOVB	(R5)+,(R4)+
	MOVB	(R5)+,(R4)+	31$,R0
	DEC	29$
	BNE	30$
50$:	DEC	R1
	BNE	25$
60$:	ASL	R3
	CMP	R3,#40000
	BLO	10$
	CALL	CRLF
	CALL	CRLF
	RFS	BIGGY
RANGE:	MOV	(R5)+,R3
	CMP	R0,(R5)+
	BHI	20$
	CMP	R0,R3
	BLO	20$
10$:	TST	(PC)+
20$:	SEC
	RTS	R5
FODOS:	SFR
	MOV	#6412,SITEND-26.
	CLRB	SITEND-24.
	.ADDR	#SITE+22.,R5
	CMP	WIDFIL,#10.
	BNE	5$
	MOV	#"**,SITEND-26.
	MOVB	#'*,SITEND-24.
	MOVB	#'*,SITE+22.
	.ADDR	#SITE,R5
5$:	MOV	R5,(PC)+
55$:	.WORD	0
	MOVB	#40,@R5
	MOV	#3,R4
10$:	MOV	55$,R5
20$:	MOVB	(R5)+,R0
	BE	.BLKW	10.
	.RADIX	2
.IFTF
	.NLIST
.IFT
A:	.WORD	11111111111100
	.WORD	11111111111110
	.WORD	00000110000011
	.WORD	00000110000011
	.WORD	00000110000011
	.WORD	00000110000011
	.WORD	00000110000011
	.WORD	00000110000011
	.WORD	11111111111110
	.WORD	11111111111100
B:	.WORD	11111111111111
	.WORD	11111111111111
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11111111111111
	.WORD	01111100111110
C:	000000000011
	.WORD	10000000000001
L:	.WORD	11111111111111
	.WORD	11111111111111
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11000000000000
M:	.WORD	11111111111111
	.WORD	11111111111110
	.WORD	00000000111100
	.WORD	00000001110000
	.WORD	00000011100000
	.WORD	00000011100000
	.WORD	00000001110000
	.WORD	00000000111100
	.WORD	11111111111110
	.WORD	11111111111111
N:	.WORD	11Q	30$
	CALL	CHROUT
	BR	20$
30$:	DEC	R4
	BNE	10$
	RFS	FODOS
FRM0FF:	SFR
	TSTB	FRM0FLG
	BEQ	20$
	MOV	#14,R0
	CALL	CHROUT
20$:	RFS	FRM0FF
.SBTTL	SUBROUTINE TO OUTPUT A CARRIAGE RETURN AND LINE FEED
CRLF:	SFR
	MOV	#CR,R0
	CALL	CHROUT
	MOV	#LF,R0
	CALL	CHROUT
	RFS	CRLF
.SBTTL	OUTPUT A STRING.
STROUT:	SFR
10$:	MOVB	(R5)+,R0
	BEQ	20$
	CALL	CHROUT
	BR	10$
20$:	RFS	STROUT
.SBTTL	STORE A TWO DIGIT ASCII NUMBER
PUTNUM:	MOV	#'0,R0
	MOVB	R0,(R4)+
	MOVB	R0,@R4
10$:	INCB	@R4
	CMPB	@R4,#':
.WORD	01111111111110
	.WORD	11111111111111
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11110000001111
	.WORD	01110000001110
D:	.WORD	11111111111111
	.WORD	11111111111111
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11111111111111
	.WORD	01111111111110
E:	.WORD	11111111111111
	.WORD	11111111111111
	.W	BNE	20$
	MOVB	R0,@R4
	INCB	-1(R4)
20$:	DEC	R5
	BNE	10$
	INC	R4
	RETURN
.SBTTL	OUTPUT A CHARATER TO THE SPOOLER JOB
CHROUT:	SFR
	MOVB	R0,@SP$BPR
	INC	SP$BPR
	INC	SP$WCR
	CMP	SP$WCR,#512.
	BLO	CHEXIT
	ASR	SP$WCR
	JSR	R0,REGSAV
REGS:	.BLKW	6
REGSAV:	MOV	R5,(R0)+
	MOV	R4,(R0)+
	MOV	R3,(R0)+
	MOV	R2,(R0)+
	MOV	R1,(R0)+
	MOV	(SP)+,(R0)+
	.ADDR	#CHRCON,R0
	MOV	R0,INTVEC
	BIS	#INTEN,@SPCSR
	RTS	PC
CHRCON:	.ADDR	#REGS,R0
	MOV	(R0)+,R5
	MOV	(R0)+,R4
	MOV	(R0)+,R3
	MOV	(R0)+,R2
	MOV	(RORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000000000011
	.WORD	11000000000011
F:	.WORD	11111111111111
	.WORD	11111111111111
	.WORD	00000011000011
	.WORD	00000011000011
	.WORD	00000011000011
	.WORD	00000011000011
	.WORD	00000011000011
	.WORD	00000011000011
	.WORD	00000000000011
	.WORD	00000000000011
G:	.WORD	01111111111110
	.WORD	11111111111111
	.WORD	11000000000011
	.WORD	11000000000011
	.WOR0)+,R1
	MOV	(R0)+,R0
	CLR	SP$WCR
	INC	SP$BNR
CHEXIT:	RFS	CHROUT
.SBTTL	RADIX 50 TO ASCII CONVERSION
R50ASC::.ADDR	#DIVTAB,R3
	MOV	(R4)+,R2
2$:	TST	-(R3)
	BEQ	R50ASC
	MOV	#-1,R0
	CMP	#174777,R2
	BLO	4$
3$:	INC	R0
	SUB	@R3,R2
	BCC	3$
	ADD	@R3,R2
	TST	R0
	BEQ	5$
	CMP	#33,R0
	BLO	6$
	BEQ	7$
4$:	ADD	#40,R0
5$:	ADD	#16,R0
6$:	ADD	#11,R0
7$:	ADD	#11,R0
8$:	MOVB	R0,(R5)+
	DEC	R1
	BNE	2$
	RTS	PC
	.WORD	0
	.WORD	1
	.WORD	50
	.WORD	3100
DIVTAB=	.
.SBTTL	CHARACTER FONTS AND FACILITYD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11111111001111
	.WORD	01111110001110
H:	.WORD	11111111111111
	.WORD	11111111111111
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	11111111111111
	.WORD	11111111111111
I:	.WORD	00000000000000
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11111111111111
	.WORD	11111111111111
	.WORD	 IDENTIFIER
PRION:	.ASCIZ	" PRINTED ON "
PRIAT:	.ASCIZ	" AT "
	.EVEN
.IF NE	SP$DEC
SITE::	.ASCII	" ***********************"
	.ASCII  " "<16>
	.ASCII	"  | l e k t r o n i k a  "
	.ASCII	" "<17>
	.ASCIZ	" ***********************"<15><12>
	.EVEN
SITEND = .
.IFF
SITE::	.ASCII	" ************************"<16>
	.ASCII	"   fodos   ****   fodos   ****"
	.ASCII	"   fodos   ****   fodos   ****"
	.ASCII	"   fodos  "
	.ASCIZ	" ************************"<15><12>
	.EVEN
SITEND = .
.ENDC
	.EVEN
CHRADR:11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	00000000000000
J:	.WORD	00000000000000
	.WORD	00110000000000
	.WORD	01110000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	01111111111111
	.WORD	00111111111111
	.WORD	00000000000011
	.WORD	00000000000011
	.WORD	00000000000000
K:	.WORD	11111111111111
	.WORD	11111111111111
	.WORD	00000011000000
	.WORD	00000111100000
	.WORD	00001100110000
	.WORD	00011000011000
	.WORD	00110000001100
	.WORD	01100000000110
	.WORD	11000011
	.WORD	00000000000011
	.WORD	00000000000011
	.WORD	00000000000011
U:	.WORD	01111111111111
	.WORD	11111111111111
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11111111111111
	.WORD	01111111111111
V:	.WORD	00000000000111
	.WORD	00000000111111
	.WORD	00000111111000
	.WORD	00111111000000
	.WORD	11111000000000
	.WORD	11111000000000
	.WORD	00111111000000
	.WORD	00000111111000
	.WORD	0000000011111111111111
	.WORD	11111111111111
	.WORD	00000011000000
	.WORD	00000011000000
FIVE:	.WORD	01110011111111
	.WORD	11110011111111
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11111111000011
	.WORD	01111110000011
SIX:	.WORD	01111111111110
	.WORD	11111111111111
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD1111
	.WORD	00000000000111
W:	.WORD	00111111111111
	.WORD	11111111111111
	.WORD	11111100000000
	.WORD	00001110000000
	.WORD	00000011100000
	.WORD	00000011100000
	.WORD	00001110000000
	.WORD	11111100000000
	.WORD	11111111111111
	.WORD	00111111111111
X:	.WORD	11000000000011
	.WORD	11100000001111
	.WORD	00111000011100
	.WORD	00011100110000
	.WORD	00000111100000
	.WORD	00000111100000
	.WORD	00011100110000
	.WORD	00111000011100
	.WORD	11100000001111
	.WORD	11000000000011
Y:	.WORD	0000000000	11111111000111
	.WORD	01111110000110
SEVEN:	.WORD	11111000000111
	.WORD	11111100000111
	.WORD	00000110000011
	.WORD	00000011000011
	.WORD	00000001100011
	.WORD	00000000110011
	.WORD	00000000011011
	.WORD	00000000001111
	.WORD	00000000000111
	.WORD	00000000000011
EIGHT:	.WORD	01111100111110
	.WORD	11111111111111
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11111111111111
	.WORD	01111100111110
111111111111
	.WORD	11111111111111
	.WORD	00000000001110
	.WORD	00000000111100
	.WORD	00000011110000
	.WORD	00001111000000
	.WORD	00111100000000
	.WORD	01110000000000
	.WORD	11111111111111
	.WORD	11111111111111
O:	.WORD	01111111111110
	.WORD	11111111111111
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11111111111111
	.WORD	01111111111110
P:	.WORD	11111111111111
	.WORD	11111111111111
	.WORD	00000011
	.WORD	00000000001111
	.WORD	00000000111100
	.WORD	00000011110000
	.WORD	11111111000000
	.WORD	11111111000000
	.WORD	00000011110000
	.WORD	00000000111100
	.WORD	00000000001111
	.WORD	00000000000011
Z:	.WORD	10000000000011
	.WORD	11000000000011
	.WORD	11110000000011
	.WORD	11111100000011
	.WORD	11001111000011
	.WORD	11000011110011
	.WORD	11000000111111
	.WORD	11000000001111
	.WORD	11000000000011
	.WORD	11000000000001
ZERO:	.WORD	01111111111110
	.WORD	11111111111111
	.WORD	1100000000110000011
	.WORD	00000110000011
	.WORD	00000110000011
	.WORD	00000110000011
	.WORD	00000110000011
	.WORD	00000110000011
	.WORD	00000111111111
	.WORD	00000011111110
Q:	.WORD	01111111111110
	.WORD	11111111111111
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11010000000011
	.WORD	11110000000011
	.WORD	01100000000011
	.WORD	11111111111111
	.WORD	11011111111110
R:	.WORD	11111111111111
	.WORD	11111111111111
	.WORD	00000110000011
	.WORD	00000110000011
	.WORD	00001100011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11111111111111
	.WORD	01111111111110
ONE:	.WORD	00000000000000
	.WORD	11000000000100
	.WORD	11000000000110
	.WORD	11000000000011
	.WORD	11111111111111
	.WORD	11111111111111
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	11000000000000
	.WORD	00000000000000
TWO:	.WORD	11110000000110
	.WORD	11111000000111
	.WORD	11001100000011
	.WORD	11000110000011
	.WORD	110000110000011
	.WORD	00011110000011
	.WORD	00110110000011
	.WORD	01100110000011
	.WORD	11000111111111
	.WORD	10000011111110
S:	.WORD	01110001111110
	.WORD	11110011111111
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11111111001111
	.WORD	01111110001110
T:	.WORD	00000000000011
	.WORD	00000000000011
	.WORD	00000000000011
	.WORD	00000000000011
	.WORD	11111111111111
	.WORD	11111111111111
	.WORD	000000001000011
	.WORD	11000001100011
	.WORD	11000000110011
	.WORD	11000000011011
	.WORD	11000000001111
	.WORD	11000000000110
THREE:	.WORD	01100000000011
	.WORD	11100000000011
	.WORD	11000000000011
	.WORD	11000000000011
	.WORD	11000001100011
	.WORD	11000011110011
	.WORD	11000011011011
	.WORD	11000011001111
	.WORD	11111110000111
	.WORD	01111100000011
FOUR:	.WORD	00000011111111
	.WORD	00000011111111
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	11	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
	.RADIX	8.
.ENDC
	.LIST
.SBTTL	HANDLER TERMINATION
	.DREND	SP
	.END
                                                                                                                                                                                                                                                                                           
L.HDCD	=:  50
L.HDCD	=:  50
L.SDI	=:  54
.SBTTL	UDA PORT DEFINITIONS
OWN	=: 100000
FLAG	=:  40000
ISTEP1	=:   4000
ISTEP2	=:  10000
ISTEP3	=:  20000
ISTEP4	=:  40000
IE	=:    200
STEP	=:    200
GO	=:      1
PC.AIP	=:	0
PC.ASA	=:	2
PC.STEP	=:	4
PC.VEC	=:	6
PC.ESZ	=:     10
.SBTTL	DRIVER DEFINITIONS
NRETRY	=:	8.
VT.ESZ	=:	6
SYSPTR	=: 54
INS.V	=: 10
SP.VSZ	=:    373
SP.DAT	=:    372
SP.BYP	=:    371
SP.MAX	=:    373
SP.MIN	=:    371
.IIF NDF DU$PORTS,   DU$PORTS = 1
.IIF LE  DU.MCALL .MODULE
.MODULE DU,RELEASE=B03,VERSION=01

.SBTTL	EDIT HISTORY
	.ENABL	LC
.SBTTL	FUNCTIONAL DESCRIPTION
.SBTTL	MSCP PROTOCOL DEFINITIONS
OP.ABO	=:  1
OP.GCS	=:  2
OP.GUS	=:  3
OP.SCC	=:  4
OP.AVL	=: 10
OP.ONL	=: 11
OP.SUC	=: 12
OP.DAP	=: 13
OP.ACC	=: 20
OP.ERS	=: 22
OP.RPL	=: 24
OP.CMP	=: 40
OP.RD	=: 41
OP.WR	=: 42
OP.SEX	=:   7
OP.END	=: 200
OP.AVA	=: 100
OP.DUP	=: 101
OP.ACP	=: 102
MD.CMP	=:   40000
MD.EXP	=:  100000
MD.ERR	=:   10000
MD.SEC	=:    1000
MD.SER	=:    $PORTS-1, DU$PORTS = 1
UT.UNIT	=:	0
UT.PART =:	2
UT.PORT	=:	3
UT.ESZ	=:	4
	.MCALL	.DRDEF,	.MFPS,	.MTPS
	.DRDEF	DU,50,FILST$!SPFUN$!VARSZ$,0,172150,154
.IIF NDF DU$ALT	DU$ALT	= 176150
.IIF NDF DU$CS2, DU$CS2=DU$CSR-04
.IIF NDF DU$CS3, DU$CS3=DU$CSR-10
.IIF NDF DU$CS4, DU$CS4=DU$CSR-14
.IIF NDF DU$VC2, DU$VC2=DU$VEC-04
.IIF NDF DU$VC3, DU$VC3=DU$VEC-10
.IIF NDF DU$VC4, DU$VC4=DU$VEC-14
.SBTTL	MACRO DEFINITIONS
.MACRO	REQUIRES A1,CND,A2
	.IF CND <A1>-<A2>
	.IFF
	.ERROR
	.ENDC
.ENDM
.MACRO 400
MD.ALL	=:       2
MD.SPD	=:       1
MD.NXU	=:    2000
MD.RIP	=:       1
MD.IMP	=:       2
MD.SWP	=:	 4
MD.PRI	=:	 1
EF.BBR	=:     200
EF.BBU	=:     100
EF.LOG	=:      40
UF.CMR	=:       1
UF.CMW	=:       2
UF.RMV	=:     200
UF.WPH	=:   20000
UF.WPS	=:   10000
UF.576	=:       4
CF.ATN	=:     200
CF.MSC	=:     100
CF.OTH	=:      40
CF.THS	=:      20
CF.576	=:       1
ST.MSK	=:      37
ST.SUC	=:       0
ST.AVL	=:       4
P.CRF	=:   0
P.UNIT	=:   4
P.OPCD	=:  10
P.MOD	=:  12
	PIC SRC,RX
	MOV PC,RX
	ADD #SRC-.,RX
.ENDM
.MACRO	.BR TO
	.IF DF TO
	.IF NE .-<TO>
	.ERROR
	.ENDC
	.ENDC
.ENDM
.MACRO	MSCP OPCODE
	JSR R5,GETCBF
	.WORD OPCODE
.ENDM
.MACRO	DO	THIS,THEN,THAT
	JSR	R5,COORD
	.WORD	THAT-.,THIS-.
.ENDM
.SBTTL	INSTALLATION CODE
	.ASECT
	. = 120
BAREA:	.BYTE	17,11
	.BLKW
	.BLKW
	.WORD	256.
	.WORD	0
	.IF EQ DU$PORTS-1
		.DRINS	DU
	.IFF
	 .IF EQ DU$PORTS-2
		.DRINS	DU,<DU$CS2>
	 .IFF
	  .IF EQ DU$PORTS-3
		.DRINS	DU,<DU$CS2,DU$CS3>
	  .IFF
		.DRNINE:	.WORD	01100000111110
	.WORD	11100011111111
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11000011000011
	.WORD	11111111111111
	.WORD	01111100111110
COLON:	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00011100011100
	.WORD	00011100011100
	.WORD	00011100011100
	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
DASH:	.WORD	00000011000000
	.WORD	000000P.BCNT	=:  14
P.BUFF	=:  20
P.LBN	=:  34
P.PART	=:  36
P.CSIZ	=:  60
P.OTRF	=:  14
P.UNFL	=:  16
P.DVPM	=:  34
P.RBN	=:  14
P.VRSN	=:  14
P.CNTF	=:  16
P.HTMO	=:  20
	TO.MIN	= 0
P.TIME	=:  24
P.CRF	=:   0
P.UNIT	=:   4
P.OPCD	=:  10
P.FLGS	=:  11
P.STS	=:  12
P.BCNT	=:  14
P.FBBK	=:  34
P.OTRF	=:  14
P.CMST	=:  20
P.MLUN	=:  14
P.UNFL	=:  16
P.UNTI	=:  24
P.TRCK	=:  44
P.GRP	=:  46
P.CYL	=:  50
P.RCTS	=:  54
P.RBNS	=:  56
P.RCTC	=:  57
P.MLUN	=:  14
P.UNFL	=:  16
P.UNTI	=:11000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
	.WORD	00000011000000
PERIOD:	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	11100000000000
	.WORD	11100000000000
	.WORD	11100000000000
	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
BLANK:	.WORD	00000000000000
	.WORD	00000000000000
	.WORD	00000000000000
	.WORD  24
P.MEDI	=:  34
P.UNSZ	=:  44
P.VSER	=:  50
P.VRSN	=:  14
P.CNTF	=:  16
P.CTMO	=:  20
P.CNTI	=:  24
P.MSIZ	=:  60
L.CRF	=:   0
L.UNIT	=:   4
L.SEQ	=:   6
L.FMT	=:  10
L.FLGS	=:  11
L.EVNT	=:  12
L.CNTI	=:  14
L.CSVR	=:  24
L.CHVR	=:  25
L.MLUN	=:  26
L.UNTI	=:  30
L.USVR	=:  40
L.UHVR	=:  41
L.VSER	=:  44
FM.CNT	=:      0
FM.BAD	=:      1
FM.DSK	=:      2
FM.SDI	=:	3
LF.SUC	=:    200
LF.CON	=:    100
LF.SNR	=:      1
L.BADR	=:   4
L.LVL	=:  42
L.RTRY	=:  43
L.VSER	=:  44	MOV	R0,R3
	MOV	R1,R0
	EMT	375
	BCS	SET.ERR
	MOV	R1,R0
	DECB	1(R0)
	MOV	#BTCSR/1000,2(R0)
	EMT	375
	BCS	SET.ERR
	MOV	R3,<BTCSR&777>(R2)
	MOV	R1,R0
	INCB	1(R0)
	EMT	375
	BCS	SET.ERR
	MOV	R1,R0
	DECB	1(R0)
	MOV	#1,2(R0)
	EMT	375
	BCS	SET.ERR
	INCB	1(R1)
10$:	BR	SET.NOR
	.IIF GT .-400 .ERROR
.SBTTL	SET CODE TABLES
	.DRSET	UNIT,UT.UNIT+1,SET.UT,NUM
	.DRSET	PART,UT.PART+1,SET.UT,NUM
.IF NE DU$PORTS-1
	.DRSET	PORT,UT.PORT+1,SET.UT,NUM
.ENDC
	.DRSET	CSR,<0*2+1>,SET.CSR,OCT
	.DRSET	VEC0
	.WORD	0
	.WORD	GO
LN.CMD:	.WORD	P.CSIZ
VC.CMD:	.WORD	0
CBUFF:	.BLKB	P.CSIZ
LN.RSP:	.WORD	0
VC.RSP:	.WORD	0
MBUFF:	.BLKB	P.MSIZ
INTRID:	.BLKW	2
MRING:	.WORD	0,0
CRING:	.WORD	0,0
	$ONCE$ = .
	. = CBUFF
DU.INS:	BIS	#1,2(SP)
	RTI
ONCE:	.MFPS
	.MTPS	#340
	MOV	R0,-(SP)
	MOV	@#INS.V,-(SP)
	MOV	PC,R5
	ADD	#DU.INS-.,R5
	BR	998$
	.IIF GT <.-CBUFF>-P.CSIZ .ERROR
	. = MBUFF
998$:	MOV	R5,@#INS.V
	CLR	R0
	MFPT
	CMP	R0,#4
	BNE	999$
	.IF EQ DU$PORTS-1
	MOV	#DU$ALT,UDAIP
	MOV	#DU$ALT+2,UDATOR,<0*2+1>,SET.VEC,OCT
.IF NE DU$PORTS-1
	.DRSET	CSR2,<1*2+1>,SET.CSR,OCT
	.DRSET	VEC2,<1*2+1>,SET.VEC,OCT
 .IF NE DU$PORTS-2
	.DRSET	CSR3,<2*2+1>,SET.CSR,OCT
	.DRSET	VEC3,<2*2+1>,SET.VEC,OCT
  .IF NE DU$PORTS-3
	.DRSET	CSR4,<3*2+1>,SET.CSR,OCT
	.DRSET	VEC4,<3*2+1>,SET.VEC,OCT
  .ENDC
 .ENDC
.ENDC
	.DRSET	RETRY,8.,SET.RET,NUM
.IF NE ERL$G
	.DRSET	SUCCES,-1,SET.SUC,NO
.ENDC
.SBTTL SET UNIT, PORT, PARTITION, SUCCESS AND RETRY
SET.UT:	DEC	R3
	CMP	R0,#255
	BGT	SET.ERR
.IF NE DU$PORTS-1
	SA
	.IFF
	MOV	#DU$ALT,PCTAB
	MOV	#DU$ALT+2,PCTAB+2
	.ENDC
999$:	MOV	(SP)+,@#INS.V
	MOV	(SP)+,R0
	.MTPS
	RTS	PC
	.IIF GT <.-MBUFF>-P.MSIZ .ERROR
	. = $ONCE$
.IF NE ERL$G
$SUCS:	.WORD	0
.ENDC
RETRY:	.WORD	0
VOLSIZE:.WORD	0,0
NEXT:	.WORD	0
.IF NE DU$PORTS-1
ACTPORT:.WORD  -1
.ENDC
DUFBLK:	.WORD	0,0,0,0
.UTTAB:	.WORD 0
UTTAB:	REQUIRES UT.UNIT EQ 0
	REQUIRES UT.PART EQ 2
	REQUIRES UT.PORT EQ 3
	.WORD	0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0
.IF NE DU$PORTS-1
.PCTAB:	.WORD 0
PCTAB:	REQUIRES PCCMP	R3,#UT.PORT
	BNE	10$
	CMP	R0,#DU$PORTS-1
	BGT	SET.ERR
.ENDC
10$:	BIC	#100000,R1
	ASL	R1
	ASL	R1
					  requires UT.ESZ EQ 4
	ADD	PC,R1
	ADD	#UTTAB-.,R1
	ADD	R3,R1
	MOVB	R0,(R1)
	BR	SET.NOR
.IF NE ERL$G
SET.SUC:CLR	R3
	NOP
	MOV	R3,$SUCS
	BR	SET.NOR
.ENDC
SET.RET:CMP	R0,R3
	BHI	SET.ERR
	MOV	R0,$RETRY
	.BR	SET.NOR
SET.NOR:TST	(PC)+
SET.ERR:SEC
	RTS	PC
.SBTTL	SET CSR
SET.CSR:CMP	R0,#160000
	BLO	SET.ERR
	DEC	R3
	BNE	10$
	MOV	R0,INSCSR
10$:	MOV	R3,R1
	NEG	R1
	ADD	PC,R1
	AD.AIP EQ 0
	REQUIRES PC.ASA EQ 2
	REQUIRES PC.STEP EQ 4
	REQUIRES PC.VEC EQ 6
	.WORD DU$CSR,DU$CSR+2
	.WORD 0,DU$VEC/4!IE
	.WORD DU$CS2,DU$CS2+2
	.WORD 0,DU$VC2/4!IE
 .IF NE DU$PORTS-2
	.WORD DU$CS3,DU$CS3+2
	.WORD 0,DU$VC3/4!IE
  .IF NE DU$PORTS-3
	.WORD DU$CS4,DU$CS4+2
	.WORD 0,DU$VC4/4!IE
					  requires DU$PORTS LE 4
  .ENDC
 .ENDC
.ENDC
.SBTTL EXECUTABLE CODE BEGINS
BEGIN:	ASR	#1
	BCC	999$
	JSR	PC,ONCE
999$:	MOV	#RETRY+1,RETRY
$RETRY	= .-4
	MOV	DUCQE,R5
	CMPB	Q$FUNC(R5),#SP.DATD	#DISCSR-.,R1
	MOV	R0,(R1)
.IF NE DU$PORTS-1
	ASL	R3
	ASL	R3
					    requires PC.ESZ EQ 10
	PIC	PCTAB,R1
	ADD	R3,R1
.IFF
	PIC	UDAIP,R1
.ENDC
	JMP	 CSRCON
.SBTTL SET VECTOR(S)
SET.VEC:CMP	R0,#500
	BHIS	SET.ERR
.IF NE DU$PORTS-1
	PIC	DU$VTB,R1
	DEC	R3
	MOV	R3,-(SP)
	ASL	R3
	ADD	(SP),R3
					    requires VT.ESZ EQ 6
	ADD	R3,R1
.IFF
	PIC	DUSTRT,R1
.ENDC
	MOV	R0,@R1
.IF NE DU$PORTS-1
	ADD	(SP)+,R1
					   requires PC.ESZ EQ 10
	ADD	#PCTAB-DU$VTB+PC.VEC,R1
					   requires VT.ESZ
	BNE	10$
	JMP	PUTTAB
10$:	MOVB	Q$UNIT(R5),R3
	BIC	#^C<7>,R3
	ASL	R3
	ASL	R3
					  requires UT.ESZ EQ 4
	ADD	PC,R3
	ADD	#UTTAB-.,R3
	MOV	R3,.UTTAB
.IF NE DU$PORTS-1
	MOVB	UT.PORT(R3),R2
	MOV	R2,R3
	ASL	R2
	ASL	R2
	ASL	R2
					  requires PC.ESZ EQ 10
	ADD	PC,R2
	ADD	#PCTAB-.,R2
	MOV	R2,.PCTAB
	CMP	R3,ACTPORT
	BEQ	20$
	MOV	R3,ACTPORT
	PIC	UDAIP,R4
	MOV	(R2)+,(R4)+
					  requires PC.AIP EQ 0
	MOV	(R2)+,(R4)+
					  requires PC.ASA EQ 2
	MOV	(R2)+,(R4)+
					  requires PC.STEP EQINS	DU,<DU$CS2,DU$CS3,DU$CS4>
	  .ENDC
	 .ENDC
	.ENDC
	NOP
	CLR	R0
	MFPT
	CMP	R0,#4
	BNE	10$
	TST	@#DU$ALT
.IIF EQ MMG$T	NOP
	BCS	20$
10$:	TST	(PC)+
20$:	SEC
	RTS	PC
	BTCSR	= <DUEND-DUSTRT>+<BDUAIP-DUBOOT>+1000
CSRCON:	MOV	R0,(R1)+
					   requires PC.AIP EQ 0
	MOV	R0,@R1
					   requires PC.ASA EQ 2
	ADD	#2,@R1
.IF NE	DU$PORTS-1
	TST	R3
					  requires PC.AIP EQ 0.
	BNE	10$
.ENDC
	MOV	PC,R1
	ADD	#BAREA-.+4,R1
	MOV	PC,R2
	ADD	#1000-.,R2
	MOV	R2,(R1)
	MOV	#1,-(R1)
	TST	-(R1)
+2 EQ PC.ESZ
.IFF
	PIC	INILST,R1
.ENDC
	ASR	R0
	ASR	R0
	BIS	#IE,R0
	MOVB	R0,@R1
	JMP	SET.NOR
	REQUIRE	. LE 1000
.SBTTL	DATA ALLOCATION
	.NLIST	BEX
	.ENABLE LC
	.DRBEG	DU
	JMP	BEGIN
.IF NE DU$PORTS-1
	.DRVTB	DU,DU$VEC,DUINT
	.DRVTB	,DU$VC2,DUINT
 .IF NE DU$PORTS-2
	.DRVTB	,DU$VC3,DUINT
  .IF NE DU$PORTS-3
	.DRVTB	,DU$VC4,DUINT
  .ENDC
 .ENDC
.ENDC
UDAIP:	.WORD	DU$CSR
UDASA:	.WORD	DU$CSR+2
ISTEP:	.WORD	0
INISEQ:	.WORD	0
INILST:	.BYTE	DU$VEC/4!IE
	.BYTE	0*10+0+STEP
MRPTR:	.WORD	 4
	MOVB	(R2),INILST
					  requires PC.VEC EQ 6
.ENDC
20$:	.BR	START
.SBTTL	PORT INITIALIZATION CODE
START:	CLR	R5
	TST	ISTEP
	BPL	INIT
	MOV	@UDASA,R5
	BEQ	DISPAT
	BIT	#ISTEP4,R5
	BNE	DISPAT
INIT:	MOV	#100000,INITFL
	DEC	RETRY
	BGE	10$
	JMP	DUHERR
10$:	MOV	R5,@UDAIP
	PIC	ISTEP,R4
	MOV	#ISTEP1,(R4)+
	MOV	R4,@R4
	CMP	(R4)+,(R4)+
	MOV	R4,@R4
	ADD	#MRING-MRPTR,@R4
INISTP:	PIC	UDASA,R4
	MOV	@(R4)+,R5
	BMI	INIT
	BIT	R5,@R4
	BEQ	INISTP
	ASL	(R4)+
	ADD	#2,(R4)
	MOV	@(R4),@UDASA
	TSMOV	(SP)+,R0
	RTS	PC
.SBTTL	ERROR LOGGING SUPPORT ROUTINES
.IF NE ERL$G
LOGIT:	TST	$SUCS
	BNE	DUEXIT
	MOV	#-1,RETRY
	JSR	PC,ERRLOG
	BR	DUEXIT
BADIO:	CLR	RETRY
	JSR	PC,ERRLOG
	BR	DUHERR
ERRLOG:	MOV	DUCQE,R5
	MOV	#DU$COD*400,R4
	BISB	RETRY,R4
	MOV	#NRETRY*400+20.,R3
	PIC	MBUFF,R2
	ADD	#P.UNIT,R2
	JSR	PC,@$ELPTR
	RTS	PC
.ENDC
.SBTTL	ROUTINE TO RETURN THE VOLUME SIZE (SPFUN 373)
SNDSIZ:	MOV	DUCQE,R4
	MOV	.UTTAB,R5
	MOV	VOLSIZE,-(SP)
	BNE	5$
	DEC	(SP)
5$:	TST	VOLSIZE+2
	BEQ	10$
	CMT	-(R4)
					  requires ISTEP4*2 EQ 100000
.IF EQ DU$PORTS-1
	BMI	START
.IFF
	BPL	1$
	MOV	.PCTAB,R5
	MOV	(R4),PC.STEP(R5)
	BR	START
.ENDC
1$:	RTS	PC
.SBTTL	FUNCTION DISPATCH AREA
DISPAT:	ASL	(PC)+
INITFL:	 .WORD	0
	BCC	5$
	DO	SETTMO,THEN,DISPAT
5$:	MOV	DUCQE,R5
	MOVB	Q$FUNC(R5),R4
	BNE	10$
.IF EQ ERL$G
	DO	IOXFER,THEN,DUEXIT
.IFF
	DO	IOXFER,THEN,LOGIT
.ENDC
10$:	CMPB	R4,#SP.BYP
	BNE	20$
	DO	BYPASS,THEN,DUEXIT
20$:	CMPB	R4,#SP.VSZ
	BNE	DUEXIT
	NEG	(PC)+
25$:	 .WORD	-1
	BPL	ONLPB	UT.PART(R5),VOLSIZ+2
	BGE	10$
	MOV	#177777,(SP)
10$:
.IF NE MMG$T
	JSR	PC,@$PTWRD
.IFF
	MOV	(SP)+,@Q$BUFF(R4)
.ENDC
	BR	DUEXIT
.SBTTL	SUBROUTINE TO INITIALIZE MSCP COMMAND BUFFER
GETCBF:	PIC	MBUFF,R4
	MOV	R4,MRING
	MOV	#P.CSIZ/2,-(SP)
					  requires MBUFF EQ CBUFF+P.CSIZ+4
1$:	CLR	-(R4)
	DEC	(SP)
	BPL	1$
	SUB	(SP)+,-(R4)
	MOV	R4,CRING
	MOV	(R5)+,P.OPCD(R4)
	MOV	@.UTTAB,P.UNIT(R4)
					  requires UT.UNIT EQ 0
	RTS	R5
.SBTTL	SUBROUTINE TO ISSUE MSCP DIRECTLY
BYPASS:	CMP	(R5)+,(RINE
	JMP	SNDSIZ
COORD:	MOV	R5,R4
	ADD	(R5)+,R4
	MOV	R4,NEXT
	MOV	R5,R4
	ADD	(R5)+,R4
	MOV	(SP)+,R5
	JSR	PC,@R4
	.BR	POLL
POLL:	MOV	#OWN,CRING+2
	MOV	@UDAIP,R5
	MOV	#OWN!FLAG,MRING+2
	RTS	PC
.SBTTL	INTERRUPT ENTRY POINT
	.DRAST	DU,5
	.FORK	DUFBLK
	TST	ISTEP
	BGT	INISTP
	MOV	@UDASA,R5
	BNE	INIT
	MOV	DUCQE,R5
	CMPB	#SP.BYP,Q$FUNC(R5)
	BNE	10$
	JMP	@NEXT
10$:	MOV	MRING,R5
	MOV	P.OPCD(R5),R4
	BIC	#^C<ST.MSK>,P.STS(R5)
	CMPB	R4,#OP.END!OP.ONL
	BNE	20$
	TST	P.STS(R5)
					  requires5)+
.IF EQ MMG$T
	MOV	(R5)+,R4
.IFF
	JSR	PC,@$MPPTR
	MOV	(SP)+,R4
	TST	(SP)+
	BNE	10$
.ENDC
	ADD	#4,R4
	MOV	R4,MRING
	ADD	#P.MSIZ+4,R4
	MOV	R4,CRING
	ADD	#P.MSIZ,R4
	CMP	R4,@#SYSPTR
	BLOS	20$
10$:	TST	(SP)+
	JMP	DUHERR
20$:	RTS	PC
.SBTTL	ROUTINE TO RETURN THE UNIT TRANSLATION TABLE
PUTTAB:	MOV	R0,-(SP)
	MOV	#UT.ESZ/2*8.,R0
	MOV	R5,R4
	PIC	UTTAB,R5
10$:
	.IF EQ MMG$T
	MOV	(R5)+,@Q$BUFF(R4)
	.IFF
	MOV	(R5)+,-(SP)
	JSR	PC,@$PTWRD
	.ENDC
	ADD	#2,Q$BUFF(R4)
	DEC	R0
	BGT	10$
	MO ST.SUC EQ 0
	BEQ	15$
.IIF NE	ERL$G, JSR PC,ERRLOG
	DEC	RETRY
	BLE	DUHERR
	BR	40$
15$:	MOV	P.UNSZ(R5),VOLSIZE
	MOV	P.UNSZ+2(R5),VOLSIZE+2
	JMP	START
20$:	TST	P.STS(R5)
					  requires ST.SUC EQ 0
	BNE	30$
	JMP	@NEXT
30$:	CMP	P.STS(R5),#ST.AVL
.IF EQ ERL$G
	BNE	DUHERR
.IFF
	BEQ	40$
	BR	BADIO
.ENDC
40$:
ONLINE:	MSCP	OP.ONL
	BR	POLL
.SBTTL	NORMAL AND STANDARD EXITS
DUHERR:	MOV	DUCQE,R5
	BIS	#HDERR$,@-(R5)
	.BR	DUEXIT
DUEXIT:	.DRFIN	DU
.SBTTL	SETTMO	- Sets 'host timeout' period
SEV	(SP)+,R0
	JMP	DUEXIT
.SBTTL	BOOTSTRAP DRIVER
	.DRBOT	DU,BOOT1,READ,CONTROL=<UMSCP,QMSCP>
	. = DUBOOT+40
BOOT1:	JMP	@#BOOT-DUBOOT
	. = DUBOOT+120
READ:	TST	HRDBOT
	BEQ	READA
	MOV	@#B$DEVU,(PC)+
BUNIT:	 .WORD	0
READA:	MOV	#NRETRY,BRETRY
	ASL	R1
	ASR	#1
	BCC	READ1
	JSR	PC,ALTCHK
BINIT:	DEC	(PC)+
BRETRY:	 .WORD	0
	BLT	BIOELK
	MOV	BDUAIP,R5
	MOV	R4,(R5)+
	MOV	#ISTEP1,R3
	MOV	#BINLST-DUBOOT,R4
1$:	TST	@R5
	BMI	BINIT
	BIT	@R5,R3
	BEQ	1$
	MOV	(R4)+,@R5
	ASL	R3
	BPL	1$
	CMP	(R4)+,(R4TTMO:	MSCP	OP.SCC
	MOV	#TO.MIN*60.,P.HTMO(R4)
	RTS	PC
.SBTTL	SUBROUTINE TO INITIALIZE FOR I/O TRANSFERS
IOXFER:	MOV	R0,-(SP)
	MSCP	OP.RD
	MOV	(R5),P.LBN(R4)
.IF EQ MMG$T
	MOV	Q$BUFF(R5),P.BUFF(R4)
.IFF
	ADD	#Q$BUFF,R5
	JSR	PC,@$MPPTR
	MOV	(SP)+,P.BUFF(R4)
	MOV	(SP)+,R0
	ASH	#-4,R0
	MOVB	R0,P.BUFF+2(R4)
	MOV	DUCQE,R5
.ENDC
	MOV	Q$WCNT(R5),R0
	BPL	1$
	NEG	R0
	INCB	P.OPCD(R4)
					  requires OP.WR EQ OP.RD+1
1$:	ASL	R0
	MOV	R0,P.BCNT(R4)
	MOV	.UTTAB,R5
	MOVB	UT.PART(R5),P.PART(R4)
	)+
	MOV	R4,BCRING
	MOV	R4,BMRING
	JSR	R0,BGTBUF
	 .WORD	OP.ONL
	JSR	PC,BDOIO
	.BR	READ1
READ1:	JSR	R0,BGTBUF
	 .WORD	OP.RD
	MOV	R0,P.LBN(R4)
	MOV	R1,P.BCNT(R4)
	MOV	R2,P.BUFF(R4)
	.BR	BDOIO
.ENABL	LSB
BDOIO:	MOV	BDUAIP,R3
1$:	MOV	#BCRING+2-DUBOOT,R4
	MOV	#OWN,@R4
	MOV	(R3)+,R5
2$:	TST	@R3
	BNE	4$
	TST	@R4
	BMI	2$
	TST	-(R4)
	MOV	#OWN,-(R4)
3$:	TST	@R3
	BNE	4$
	TST	@R4
	BMI	3$
	TSTB	BBUFF+P.STS
BIOELK:	BNE	BIOERR
	RTS	PC
4$:	TST	(SP)+
	BR	BINIT
.DSABL	LSB
BGTBUF:	MOV	#BBUF1,-(SP)
	EMT	.DSTATUS
	BCS	O.BAD
	MOV	DAREA+4,R1
	BNE	O.GOOD
	BR	O.BAD
DAREA:	.BLKW	4
DEVNAM:	.RAD50	/DX /
BAREA:	.BYTE	SYSCHN,..READ
	.BLKW
	.BLKW
	.WORD	256.
	.WORD	0
X.WP:
	.ADDR	#DXWPRO,R0
	ADD	R3,R0
	MOVB	(PC)+,(R0)
O.WPF:	.BLKW	1
	CALL	FINDRV
	BCS	O.GOOD
	CMP	@#SYSPTR,R1
	BHI	10$
	MOV	#100000,DXW1-DXLQE(R1)
10$:
	ADD	R3,R1
	MOVB	O.WPF,DXWPRO-DXLQE(R1)
	BR	O.GOOD
	.IIF GT,<.-376>	.ERROR
	.SBTTL	SET OPTIONS
	.DRSET	CSR,	160000,	O.CSR,	OCT
	.DRSET	VECTOR,	500,	O.VEC,	OCT
	UNC+1 EQ Q$UNIT
	MOVB	(R3)+,R0
	ASRB	R0
	BCC	1$
	BIS	#CSUNIT,R4
1$:
	.IF EQ	DXT$O
	BITB	#6/2,R0
	BNE	RXERR
	.IFF
	MOV	(PC)+,-(SP)
DXCSR = .
	 .WORD	DX$CSR
				.ASSUME . LE DXSTRT+1000
	ASRB	R0
	BCC	2$
	MOV	(PC)+,(SP)
DXCSR2 = .
	 .WORD	DX$CS2
				.ASSUME . LE DXSTRT+1000
2$:	MOV	(SP)+,RXCSA
	ASRB	R0
	BCS	RXERR
	.ENDC
				.ASSUME Q$UNIT+1 EQ Q$BUFF
	MOV	(R3)+,R0
				.ASSUME Q$BUFF+2 EQ Q$WCNT
	MOV	(R3)+,R2
	BPL	3$
	ASL	(PC)+
DXW1:	.WORD	.-.
				.ASSUME . LE DXSTRT+1000
	BCS	33F-DUBOOT+P.MSIZ,R4
1$:	CLR	-(R4)
	CMP	R4,#BBUFF-DUBOOT
	BHI	1$
	MOV	#P.MSIZ,-4(R4)
	MOV	(R0)+,P.OPCD(R4)
	MOV	BUNIT,P.UNIT(R4)
	RTS	R0
.SBTTL	BOOTSTRAP IMPURE AREA
BINLST:	.BYTE	0
	.BYTE	0*10+0+STEP
	.WORD	BMRING-DUBOOT
	.WORD	0
	.WORD	GO
BLN:	.WORD	0
BVC:	.WORD	0
BBUFF:	.BLKB	P.MSIZ
	.WORD	0,0
BMRING:	.WORD	0,0
BCRING:	.WORD	0,0
	.SBTTL	ALTCHK	- ALTERNATE CSR CHECK FOR FALCONS
BDUAIP:	.WORD	DU$CSR
ALTCHK:	MOV	R0,-(SP)
	MOV	@#INS.V,-(SP)
	MOV	PC,R0
	ADD	#BT.INS-.,R0
	MOV	R0,@#INS.IF NE DXT$O
	.DRSET	CSR2,	160000,	O.CSR2,	OCT
	.DRSET	VEC2,	500,	O.VEC2,	OCT
	.ENDC;NE DXT$O
	.DRSET	RETRY,	RETRY,	O.RTRY,	NUM
	.IF NE ERL$G
	.DRSET	SUCCES,	-1,	O.SUCC,	NO
	.ENDC
	.DRSET	WRITE,	1,	 O.WP,	NO
	BTCSR = <DXEND-DXSTRT>+<BOTCSR-DXBOOT>+1000
O.CSR:	CMP	R0,R3
	BLO	O.BAD
	MOV	R0,INSCSR
	.ADDR	#BAREA+4,R1
	.ADDR	#1000,R2
	MOV	R2,(R1)
	MOV	#BTCSR/1000,-(R1)
	TST	-(R1)
	MOV	R0,R3
	MOV	R1,R0
	EMT	.READ
	BCS	O.BAD
	MOV	R3,<BTCSR&777>(R2)
	MOV	R1,R0
					.ASSUME ..READ+1 EQ ..WRIT.V
	CLR	R0
	MFPT
	CMP	R0,#4
	BNE	999$
	MOV	#DU$ALT,BDUAIP
999$:	MOV	(SP)+,@#INS.V
	MOV	(SP)+,R0
	RTS	PC
BT.INS:	BIS	#1,2(SP)
	RTI
	.SBTTL	BOOTSTRAP PRIMARY ROUTINE
BOOT:	MOV	#10000,SP
	MOV	R0,-(SP)
	BIC	#^C<7>,@SP
	MOV	(SP),BUNIT
	MOV	#2,R0
	MOV	#<4*400>,R1
	MOV	#1000,R2
	CLR	(PC)+
HRDBOT:	 .WORD	1
	JSR	PC,READ
	MOV	#READ-DUBOOT,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	MOV	(SP)+,@#B$DEVU
	JMP	@#B$BOOT
	.DREND	DU
	.END
                                                                      
	INCB	1(R0)
	EMT	.WRITE
	BCS	O.SYWL
	MOV	R1,R0
					.ASSUME ..WRIT-1 EQ ..READ
	DECB	1(R0)
	MOV	#1,2(R0)
	EMT	.READ
	BCS	O.BAD
	.IF EQ DXT$O
	MOV	R3,RXCSA
	.IFF
	MOV	R3,DXCSR
	.ENDC
O.GOOD:	TST	(PC)+
O.BAD:	SEC
	RETURN
O.SYWL:
	MOV	@SP,R0
	INC	R0
	CMPB	#BR/400,(R0)+
	BNE	O.BAD
	MOV	R0,@SP
	BR	O.BAD
O.VEC:	CMP	R0,R3
	BHIS	O.BAD
	BIT	#3,R0
	BNE	O.BAD
	.IF EQ DXT$O
	MOV	R0,DXSTRT
	.IFF
	MOV	R0,DX$VTB
	.ENDC
	BR	O.GOOD
	.IF NE DXT$O
O.CSR2:	CMP	R0,R3
	BLO	O.BAD
	MOV	R0,DXC.MCALL	.MODULE
.MODULE	DX,RELEASE=B03,VERSION=01

	.SBTTL	DEFINITIONS
	.ENABL	LC
	.MCALL	.DRDEF	.ASSUME	.BR	.ADDR
.DSTATUS=:342
.READ	=:375
	..READ	=:010
.WRITE	=:375
	..WRIT	=:011
SYSCHN	=:17
	JSW	=:44
	SYSPTR	=:54
		P1EXT	=: 432
.IIF NDF DXT$O, DXT$O=0
.IIF NDF DX$CS2, DX$CS2	== 177174
.IIF NDF DX$VC2, DX$VC2	== 270
	.DRDEF	DX,22,FILST$!SPFUN$!DX$COD,494.,177170,264
	CSGO	=:     1
	CSUNIT	=:    20
	CSDONE	=:    40
	CSINT	=:   100
	CSTR	=:   200
	CSRX02	=:  4000
	CSINIT	=: 40000
	SR2
	BR	O.GOOD
O.VEC2:	CMP	R0,R3
	BHIS	O.BAD
	BIT	#3,R0
	BNE	O.BAD
	MOV	R0,DX$VTB+6
	BR	O.GOOD
	.ENDC
O.RTRY:	CMP	R0,R3
	BHI	O.BAD
	MOV	R0,DRETRY
	BNE	O.GOOD
	BR	O.BAD
	.IF NE ERL$G
O.SUCC:	MOV	#0,R3
N.SUCC:	MOV	R3,SCSFLG
					.ASSUME O.SUCC+4 EQ N.SUCC
	BR	O.GOOD
	.ENDC
O.WP:	NOP
	CLR	R3
N.WP:
					.ASSUME O.WP+4 EQ N.WP
	MOV	R3,O.WPF
	MOV	R1,R3
	CMP	R3,#DXT$O*2+1
	BHI	O.BAD
	JMP	X.WP
	.IIF GT,<.-1000> .ERROR
	.SBTTL	DRIVER REQUEST ENTRY POINT
	.ENABL	LSB
	.DRBEG	DX
	BR	DXCSERR	=:100000
	CSFBUF	=:0*2
	CSEBUF	=:1*2
	CSWRT	=:2*2
	CSRD	=:3*2
	CSRDST	=:5*2
	CSWRTD	=:6*2
	CSMAIN	=:7*2
	CSREAD	=:CSEBUF&CSRD&CSRDST&CSMAIN
.ASSUME	CSRD&2		NE 0
.ASSUME	CSWRT&2		EQ 0
.ASSUME	CSWRTD&2	EQ 0
	ESCRC	=:     1
	ESPAR	=:     2
	ESID	=:     4
	ESDD	=:   100
	ESDRY	==   200
	DXNREG	=:3
	RETRY	=:8.
	SPFUNC	=:100000
	.SBTTL	INSTALLATION CHECKS
	.ASECT
	. = 176
INSCSR:
	. = 200
	NOP
	BIT	#CSRX02,@INSCSR
	BEQ	O.GOOD
	BR	O.BAD
FINDRV:
	.ADDR	#DEVNAM,R0
	.ADDR	#DAREA+ENT
DXWPRO:
	.REPT	DXT$O+1
	.BYTE	0,0
	.ENDR
				.ASSUME . LE DXSTRT+1000
	.IF NE ERL$G
SCSFLG:	.WORD	0
				.ASSUME . LE DXSTRT+1000
	.ENDC
	.IF NE	DXT$O
	.DRVTB	DX,DX$VEC,DXINT
	.DRVTB	,DX$VC2,DXINT
	.ENDC
DXENT:
.IF NE	MMG$T
	MOV	@#SYSPTR,R4
	MOV	P1EXT(R4),(PC)+
$P1EXT:	 .WORD	P1EXT
.ENDC
	MOV	(PC)+,(PC)+
DRETRY:	 .WORD	RETRY
				.ASSUME . LE DXSTRT+1000
RXTRY:	 .WORD	0
	MOV	DXCQE,R3
	MOV	(R3)+,R5
	MOV	#CSRD!CSGO,R4
				.ASSUME Q$BLKN+2 EQ Q$FUNC
	MOVB	(R3)+,R1
				.ASSUME Q$F
RXFUN2:	 .WORD	0
	MOV	#128.,R3
	MOV	(PC)+,R4
RXCSA:	 .WORD	DX$CSR
				.ASSUME . LE DXSTRT+1000
	MOV	R4,R5
	TST	(R5)+
	BMI	RXRTRY
	ASL	(PC)+
RXIRTN:	 .WORD	0
	BCS	1$
	BIT	#CSREAD,R0
	BEQ	10$
	TST	R0
	BPL	9$
	BIT	#ESDD,@R5
	BEQ	9$
	.IF EQ	MMG$T
	MOV	BUFRAD,R2
	INC	-(R2)
	.IFF
	MOV	R4,R1
	MOV	DXCQE,R4
	MOV	#1,-(SP)
	SUB	#2,Q$BUFF(R4)
	CMP	Q$BUFF(R4),#20000
	BHIS	85$
	ADD	#20000,Q$BUFF(R4)
	SUB	#200,Q$PAR(R4)
85$:	CALL	@$PTWRD
	MOV	R1,R4
	.ENDC
9$:	JSR	R0,SILOFE
	 .WORD	CSEBUFV	R0,@R5
	IOT
	MOV	#CSGO+CSEBUF,@R4;LOAD EMPTY BUFFER FUNCTION INTO RXCS
BROFFS	=	READF-.
RDX:	IOT
	TSTB	@R4
	BPL	RTIRET
	MOVB	@R5,(R2)+
	DEC	R1
	BGT	RDX
	CLR	R2
	BR	RDX
B2$:	MOV	SP,R1
	INC	R0
	MOV	@PC,R3
				.ASSUME BPT EQ 3
	BPT
BOOT2:	CMPB	(R3)+,(R3)+
	BPT
	CMPB	(R3)+,(R3)+
	BPT
	BIT	#CSUNIT,RDCMD
	BNE	BOOT
	CLR	R0
	BR	BOOT
READ:	MOV	(PC)+,@(PC)+
	 .WORD	167
	 .WORD	RDX-DXBOOT
	MOV	(PC)+,@(PC)+
	 .WORD	READF-RDX-4
	 .WORD	RDX-DXBOOT+2
	MOV	#READ1-DXBOOT,@#B$READ
	MOV	#TRWA!CSGO
	 MOVB	@R5,(R2)+
	 MOV	@R5,R2
10$:	INCB	SECTOR
	BNE	11$
	ADD	#-26.*400+1,TRACK
	ADD	#6,TRKOFF
	BLE	11$
	SUB	#26.,TRKOFF
11$:
	.IF EQ	MMG$T
	ADD	R3,BUFRAD
	.IFF
	ADD	#2,PARVAL
	.ENDC
	SUB	R3,BYTCNT
	BHI	1$
	CLR	BYTCNT
	BIT	#CSREAD!SPFUNC,R0
	BNE	12$
	ADD	#040000,(PC)+
	 .BYTE	0
FILLCT:	 .BYTE	0
	BCC	2$
12$:
	.IF NE	ERL$G
	TST	SCSFLG
	BNE	13$
	MOV	#DX$COD*400+377,R4
	MOV	DXCQE,R5
	CALL	@$ELPTR
	.ENDC
13$:	CLR	@RXCSA
14$:	.DRFIN	DX
RXABRT:	MOV	#CSINIT,@RXCSA
	CLR	DXFBLKIT-DXBOOT,@#20
	CLR	@#JSW
	TST	HRDBOT
	BEQ	READ1
	MOV	@#B$DEVU,R3
	MOVB	UNITRD-DXBOOT(R3),RDCMD
READ1:	ASL	R0
	ASL	R0
	ASL	R1
1$:	MOV	R0,-(SP)
	MOV	R0,R3
	MOV	R0,R4
	CLR	R0
	BR	3$
2$:	SUB	#23.,R3
3$:	INC	R0
	SUB	#26.,R4
	BPL	2$
	CMP	#-14.,R4
	ROL	R3
4$:	SUB	#26.,R3
	BPL	4$
	ADD	#27.,R3
	BPT
	MOV	(SP)+,R0
	INC	R0
	TST	R1
	BGT	1$
	RETURN
READF:	TST	@R4
	BEQ	READF
	BMI	BIOERR
	TSTB	@R4
	BPL	READFX
	MOVB	@R5,(R2)+
	DEC	R1
	BGT	READF
	MOV	#1,R2
	BR	READF
TRWAIT:	TST	@R4
	B$
	CLR	-(SP)
				.ASSUME Q$WCNT+2 EQ Q$COMP
	MOVB	Q$UNIT-Q$COMP(R3),(SP)
	BIC	#<^C3>,(SP)
	.ADDR	#DXWPRO,(SP),ADD; TO UNIT OFFSET
	TSTB	@(SP)+
	BNE	RXERR
				.ASSUME CSRD-2 EQ CSWRT
33$:	CMPB	-(R4),-(R4)
.ASSUME	CSWRT	EQ	CSRD-2
	NEG	R2
3$:	ASL	R1
	ADD	PC,R1
	ADD	CHGTBL-.(R1),R4
	MOV	R4,RXFUN2
	BMI	7$
	MOVB	R2,FILLCT
	DECB	FILLCT
	ASL	R2
	ASL	R5
	ASL	R5
	MOV	(PC)+,R4
	 .BYTE	-7,-26.
4$:	CMP	#26.*200,R5
	BHI	5$
	ADD	#-26.*200,R5
5$:	ROL	R5
	INCB	R4
	BLE	4$
	MOVB	R5,R1
	ADD	R4,R5+2
	BR	14$
	.DSABL	LSB
RXRTRY:
	.IF NE	ERL$G
	.ADDR	#DXRBUF,R3
	MOV	R3,R2
	MOV	@R4,(R3)+
	MOV	@R5,(R3)+
	MOV	#CSMAIN!CSGO,@R4
1$:	BIT	#CSDONE,@R4
	BEQ	1$
	MOV	@R5,@R3
	MOV	DRETRY,R3
	SWAB	R3
	ADD	#DXNREG,R3
	MOV	#DX$COD*400,R4
	BISB	RXTRY,R4
	DECB	R4
	MOV	DXCQE,R5
	CALL	@$ELPTR
	MOV	RXCSA,R4
	.ENDC
	DEC	RXTRY
	BGT	2$
	JMP	RXERR
2$:	MOV	#CSINIT,@R4
	JMP	RXINIT
	.SBTTL	SILOFE - FILL OR EMPTY THE SILO
	.ENABL	LSB
SILOFE:	MOV	(R0)+,@R4
	MOV	(R0)+,3$
	MOV	(R0)+,5$
	MOV	BYTCNT,R1
	MOV	R1,R4
	ASL	R1
	ADD	R4,R1
	ASL	R1
6$:	SUB	#26.,R1
	BGT	6$
	MOV	R1,TRKOFF
	BR	8$
7$:	SWAB	R5
	BISB	R2,R5
	MOV	#128.,R2
	.IF EQ	MMG$T
	CLR	(R0)+
	.IFF
	MOV	DXCQE,R4
	CLR	-(SP)
	CALL	@$PTWRD
	TST	(R0)+
	.ENDC
8$:	MOV	R0,(PC)+
BUFRAD:	 .WORD	0
	MOV	R5,TRACK
	MOV	R2,(PC)+
BYTCNT:	 .WORD	0
	.IF NE	MMG$T
	TST	(R3)+
	MOV	@R3,PARVAL
	.ENDC
	.BR	RXINIT
	.DSABL	LSB
	.SBTTL	START TRANSFER OR RETRY
	.ENABL	LSB
RXINIT:	MOV	#100000,RXIRTN
	MOV	RXCSA,R4
	BR	RXIENB
1$:	BIT	#CSREAD,R
	BEQ	4$
	CMP	R1,R3
	BLOS	1$
	MOV	R3,R1
1$:	MOV	BUFRAD,R2
.IF NE	MMG$T
	JSR	R0,@$P1EXT
	.WORD	PARVAL-.
.ENDC
2$:	TSTB	@R4
	BPL	2$
3$:	HALT
	TSTB	@R4
	DECB	R1
	BNE	2$
.IF NE	MMG$T
PARVAL:	.WORD	0
.ENDC
4$:	TSTB	@R4
	BGT	6$
	BEQ	4$
5$:	HALT
	BR	4$
6$:	RTS	R0
	.DSABL	LSB
	.SBTTL	TABLES, FORK BLOCK, END OF DRIVER
	.WORD	CSWRTD-CSRD+SPFUNC
	.WORD	CSWRT-CSRD+SPFUNC
	.WORD	CSRD-CSRD+SPFUNC
CHGTBL:	.WORD	0
DXFBLK:	.WORD	0,0,0,0
	.IF NE	ERL$G
DXRBUF:	.BLKW	DXNREG
	.ENDC
	.SBTTL	B0
	BNE	3$
2$:	JSR	R0,SILOFE
	 .WORD	CSFBUF!CSGO
	 MOVB	(R2)+,@R5
	 MOV	R1,@R5
3$:	MOVB	SECTOR,R2
	BGT	5$
	SUB	#-14.,R2
	BGT	4$
	ADD	#12.,R2
	SEC
4$:	ROL	R2
	ADD	(PC)+,R2
TRKOFF:	 .WORD	0
	BGT	5$
	ADD	#26.,R2
5$:	MOV	R0,@R4
6$:	TSTB	@R4
	BEQ	6$
	BPL	RXRTRY
	MOVB	R2,@R5
7$:	TSTB	@R4
	BEQ	7$
	BPL	RXRTRY
	MOVB	(PC)+,@R5
TRACK:	 .BYTE	0
SECTOR:	 .BYTE	0
RXIENB:	BIS	#CSINT,@R4
	RETURN
RXERR:	MOV	DXCQE,R4
	BIS	#HDERR$,@-(R4)
	BR	13$
	.DRAST	DX,5,RXABRT
	.FORK	DXFBLK
	MOV	(PC)+,R0OOTSTRAP DRIVER
	.DRBOT	DX,BOOT1,READ
	. = DXBOOT+14
	.WORD	READS-DXBOOT
	.WORD	340
	.WORD	WAIT-DXBOOT
	.WORD	340
	. = DXBOOT+34
BOOT1:	MOVB	UNITRD-DXBOOT(R0),RDCMD
REETRY:	MOV	@PC,SP
	MOV	#200,R2
	CLR	R0
	BR	B2$
	. = DXBOOT+56
UNITRD:	.BYTE	CSGO+CSRD
	.BYTE	CSGO+CSRD+CSUNIT;READ FROM UNIT 1
	. = DXBOOT+70
WAIT:	TST	@R4
	BEQ	WAIT
	BMI	REETRY
RTIRET:	RTI
	. = DXBOOT+120
READS:	MOV	(PC)+,R4
BOTCSR:	 .WORD	DX$CSR
	MOV	R4,R5
	MOV	(PC)+,(R5)+
RDCMD:	.WORD	0
	IOT
	MOV	R3,@R5
	IOT
	MOD	=   1000
	CSRX02	=   4000
	CSINIT	=  40000
	CSERR	= 100000
	DNERR	= 20
	CSFBUF	= 0*2
	CSEBUF	= 1*2
	CSWRT	= 2*2
	CSRD	= 3*2
	CSRDST	= 5*2
	CSWRTD	= 6*2
	CSMAIN	= 7*2
.ASSUME	CSRD&2		NE 0
.ASSUME	CSWRT&2		EQ 0
.ASSUME	CSWRTD&2	EQ 0
	ESCRC	=      1
	ESPAR	=      2
	ESID	=      4
	ESSID1	=     10
	ESDNER	=     20
	ESDN	=     40
	ESDD	=    100
	ESDRY	=    200
	DDNBLK	= DYDSIZ*2
	DYNREG	= 3
	RETRY	= 8.
	SPFUNC	= 100000
	SIZ$FN	= 373
	WDD$FN	= 375
	WRT$FN	= 376
	RED$FN	= 377
	.SBT ENTRY POINT
	.ENABL	LSB
	.DRBEG	DY
	BR	DYENT
DYWPRO:
	.REPT	DYT$O+1
	.BYTE	0,0
	.ENDR
				.ASSUME	. LE DYSTRT+1000
	.IF NE ERL$G
SCSFLG:	.WORD	0
	.ENDC
				.ASSUME	. LE DYSTRT+1000
	.IF NE	DYT$O
	.DRVTB	DY,DY$VEC,DYINT
	.DRVTB	,DY$VC2,DYINT
				.ASSUME	. LE DYSTRT+1000
	.ENDC
DYENT:	MOV	(PC)+,(PC)+
DRETRY:	 .WORD	RETRY
				.ASSUME	. LE DYSTRT+1000
DYTRY:	 .WORD	0
	MOV	DYCQE,R5
	MOV	(R5)+,R3
	MOV	#CSGO!CSRD!CSINT,R4
	MOVB	(R5)+,R1
	MOVB	(R5)+,R0
	BIC	#^C<7>,R0
	MOV	R0,R2
	ASR	RTTL	INSTALLATION CHECKS
	.ASECT
	. = 176
INSCSR:
	. = 200
	NOP
	BIT	#CSRX02,@INSCSR
	BNE	O.GOOD
	BR	O.BAD
FINDRV:
	.ADDR	#DEVNAM,R0
	.ADDR	#DAREA+1,-(SP)
	EMT	.DSTATUS
	BCS	O.BAD
	MOV	DAREA+4,R1
	BEQ	O.BAD
	BR	O.GOOD
DAREA:	.BLKW	4
DEVNAM:	.RAD50	/DY /
BAREA:	.BYTE	17,10
	.BLKW
	.BLKW
	.WORD	256.
	.WORD	0
	.IIF GT,<.-356>	.ERROR
	.SBTTL	SET OPTIONS
	.DRSET	CSR,	160000,	O.CSR,	OCT
	.IF EQ DYT$O
	.DRSET	VECTOR,	500,	O.VEC,	OCT
	.IFF; EQ DYT$O
	.DRSET	VECTOR,	+1,	O.VEC,	OCT
	.DR0
	.IF EQ	DYT$O
	BNE	5$
	.ENDC
	BCC	1$
	BIS	#CSUNIT,R4
1$:
	.IF NE	DYT$O
	MOV	(PC)+,-(SP)
DYCSR = .
	 .WORD	DY$CSR
				.ASSUME	. LE DYSTRT+1000
	ASR	R0
	BNE	5$
	BCC	2$
	MOV	(PC)+,(SP)
DYCSR2 = .
	 .WORD	DY$CS2
				.ASSUME	. LE DYSTRT+1000
2$:	MOV	(SP)+,DYCSA
	.ENDC
	.IF EQ	DY$DD
	ASL	R2
	.ADDR	#SAVDEN,R2,ADD
	MOV	R2,(PC)+
DENPTR:	 .WORD	0
	BIS	@R2,R4
	.IFF
	BIS	#CSDN,R4
	CMPB	R1,#SIZ$FN
	BNE	3$
	 .IF EQ	MMG$T
	MOV	#DDNBLK,@(R5)+
	 .IFF
	MOV	#DDNBLK,-(SP)
	MOV	DYCQE,R4
	CASET	CSR2,	160000,	O.CSR2,	OCT
	.DRSET	VEC2,	+1+6,	O.VEC2,	OCT
	.ENDC
	.DRSET	RETRY	RETRY,	O.RTRY,	NUM
	.IF NE ERL$G
	.DRSET	SUCCES,	-1,	O.SUCC,	NO
	.ENDC
	.DRSET	WRITE,	1,	 O.WP,	NO
	BTCSR	= <DYEND-DYSTRT>+<BOTCSR-DYBOOT>+1000
O.CSR:	CMP	R0,R3
	BLO	O.BAD
	MOV	R0,INSCSR
	.ADDR	#BAREA+4,R1
	.ADDR	#1000,R2
	MOV	R2,(R1)
	MOV	#BTCSR/1000,-(R1)
	TST	-(R1)
	MOV	R0,R3
	MOV	R1,R0
	EMT	375
	BCS	O.BAD
	MOV	R3,<BTCSR&777>(R2)
	MOV	R1,R0
	INCB	1(R0)
	EMT	375
	BCS	O.SYWL
	MOV	R1,R0
	DECB	1(R0)LL	@$PTWRD
	 .ENDC
	JMP	DYDONE
	.ENDC
3$:
	.IF EQ	MMG$T
	MOV	(R5)+,R0
	.IFF
	CALL	@$MPPTR
	MOV	(SP)+,R0
	MOV	R4,(PC)+
35$:	 .BLKW
	MOV	(SP)+,R4
	BIT	#1700,R4
	BNE.	DYERR
	SWAB	R4
	BIS	35$,R4
	.ENDC
	MOV	@R5,WRDCNT
	BPL	4$
	ASL	(PC)+
DYW1:	.WORD	.-.
				.ASSUME . LE DYSTRT+1000
	BCS	33$
	CLR	-(SP)
	MOVB	Q.UNIT-Q.WCNT(R5),(SP)
	BIC	#<^C3>,(SP)
	.ADDR	#DYWPRO,(SP),ADD; TO UNIT OFFSET
	TSTB	@(SP)+
	BNE.	DYERR
33$:	ADD	#CSWRT-CSRD,R4
	NEG	WRDCNT
4$:	ASL	R1
	BEQ	6$
	MOV	R1,R5
	AMI	BIOERR
	BEQ	TRWAIT
READFX:	RTI
	. = DXBOOT+606
BOOT:	MOV	#10000,SP
	MOV	R0,-(SP)
	MOV	#2,R0
	MOV	#<4*400>,R1
	MOV	#1000,R2
	CLR	(PC)+
HRDBOT:	 .WORD	1
	CALL	READ
	MOV	#READ1-DXBOOT,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	MOV	(SP)+,@#B$DEVU
	JMP	@#B$BOOT
	.DREND	DX
	.END
                                                                                                                                                                                                                                    
	MOV	#1,2(R0)
	EMT	375
	BCS	O.BAD
	.IF EQ DYT$O
	MOV	R3,DYCSA
	.IFF
	MOV	R3,DYCSR
	.ENDC
O.GOOD:	TST	(PC)+
O.BAD:	SEC
	RETURN
O.SYWL:
	ADD	#2,@SP
	BR	O.BAD
	.IF EQ DYT$O
O.VEC:	CMP	R0,R3
	BHIS	O.BAD
	BIT	#3,R0
	BNE	O.BAD
	MOV	R0,DYSTRT
	BR	O.GOOD
	.IFF; EQ DYT$O
O.CSR2:	CMP	R0,R3
	BLO	O.BAD
	MOV	R0,DYCSR2
	BR	O.GOOD
O.VEC:
O.VEC2:	CMP	R0,#500
	BHIS	O.BAD
	BIT	#3,R0
	BNE	O.BAD
	.ADDR	#DY$VTB-1,R3,ADD
	MOV	R0,@R3
	BR	O.GOOD
	.ENDC
O.RTRY:	CMP	R0,R3
	BHI	O.BAD
	MOV	R0,DRET.MCALL	.MODULE
.MODULE	DY,RELEASE=B03,VERSION=01

	.SBTTL	MACROS AND DEFINITIONS
	.ENABL	LC
	.MCALL	.DRDEF	.ADDR	.ASSUME	.BR
.DSTATUS=342
	SYSPTR	= 54
		PNPTR	= 404
	.MACRO	BNE.	LABEL,?ALT
	BEQ	ALT
	JMP	LABEL
ALT:
	.ENDM
.IIF NDF DYT$O, DYT$O = 0
.IIF NDF DY$DD, DY$DD = 0
.IIF NDF DY$CS2 DY$CS2	== 177150
.IIF NDF DY$VC2 DY$VC2	== 270
	.DRDEF	DY,6,FILST$!SPFUN$!VARSZ$,494.,177170,264
	CSGO	=      1
	CSUNIT	=     20
	CSDONE	=     40
	CSINT	=    100
	CSTR	=    200
	CSDN	=    400
	CSHEARY
	BNE	O.GOOD
	BR	O.BAD
	.IF NE ERL$G
O.SUCC:	MOV	#0,R3
N.SUCC:
					.ASSUME O.SUCC+4 EQ N.SUCC
	MOV	R3,SCSFLG
	BR	O.GOOD
	.ENDC
O.WP:	NOP
	CLR	R3
N.WP:
					.ASSUME O.WP+4 EQ N.WP
	MOV	R3,O.WPF
	MOV	R1,R3
	CMP	R3,#DYT$O*2+1
	BHI	O.BAD
	.ADDR	#DYWPRO,R0
	ADD	R3,R0
	MOVB	(PC)+,(R0)
O.WPF:	.BLKW	1
	CALL	FINDRV
	BCS	O.GOOD
	CMP	@#SYSPTR,R1
	BHI	10$
	MOV	#100000,DYW1-DYLQE(R1)
10$:
	ADD	R3,R1
	MOVB	O.WPF,DYWPRO-DYLQE(R1)
	BR	O.GOOD
	.IIF GT,<.-1000> .ERROR
	.SBTTL	DRIVER REQUESL	START TRANSFER OR RETRY
	.ENABL	LSB
DYINIT:
	.IF EQ	DY$DD
	TST	SIZFLG
	BNE	4$
	CALL	INWAIT
	BIT	#ESDRY,(R5)
	BEQ	DYERR
	MOV	#DYDSIZ,-(SP)
	BIT	#ESDN,@R5
	BEQ	3$
	ASL	@SP
3$:
	 .IF EQ	MMG$T
	MOV	(SP)+,@BUFRAD
	 .IFF
	MOV	DYCQE,R4
	CALL	@$PTWRD
	 .ENDC
	BR	DYDONE
	.ENDC
4$:
	.IF NE	MMG$T
	MOV	R0,DYFUN2
	.ENDC
	BIT	#1*2,R0
	BNE	5$
	CALL	DOSILO
5$:	CALL	DOXFER
	BIT	#1*2,R0
	BEQ	7$
	TST	R0
	BPL	6$
	BIT	#ESDD,@R5
	BEQ	6$
	.IF EQ	MMG$T
	MOV	BUFRAD,R2
	INC	-(R2)
	.IFF
	MOV	SILO:	MOV	(SP)+,INTRTN
	MOV	WRDCNT,R2
	BIC	#6*2,R0
	BPL	1$
	MOV	R3,R2
1$:	MOV	R0,@R4
	CMP	R3,R2
	BLOS	2$
	MOV	R2,R3
	BEQ	INTDSP
2$:	MOV	BUFRAD,R2
	BR	DYDOFN
	.SBTTL	DOXFER - START A SECTOR READ OR WRITE
DOXFER:	MOV	(SP)+,INTRTN
	MOV	R0,@R4
	MOV	WRDCNT,R2
	MOV	DYLSN,R3
	TST	R0
	BMI	DYDOFN
	MOV	#8.,R2
2$:	CMP	#26.*200,R3
	BHI	3$
	ADD	#-26.*200,R3
3$:	ROL	R3
	DEC	R2
	BGT	2$
	MOVB	R3,R2
	CLRB	R3
	SWAB	R3
	CMP	#12.,R3
	ROL	R3
	ASL	R2
	ADD	R2,R3
	ADD	R2,R3
	ADD	R2,R3
	ASR	R2
	R4,R1
	MOV	DYCQE,R4
	MOV	#1,-(SP)
	SUB	#2,Q.BUFF-Q.BLKN(R4)
	CMP	Q.BUFF-Q.BLKN(R4),#20000
	BHIS	55$
	ADD	#20000,Q.BUFF-Q.BLKN(R4)
	SUB	#200,Q.PAR-Q.BLKN(R4)
55$:	CALL	@$PTWRD
	MOV	R1,R4
	.ENDC
6$:	CALL	DOSILO
7$:	TST	R0
	BMI	DYDONE
	MOV	R3,R2
	ASL	R2
	ADD	R2,(PC)+
BUFRAD:	 .WORD	0
	.IF NE	MMG$T
	BCC	8$
	ADD	#10000,R0
	.ENDC
8$:	INC	(PC)+
DYLSN:	 .WORD	0
	SUB	R3,(PC)+
WRDCNT:	 .WORD	0
	BHI	4$
	BIT	#1*2,R0
	BNE	DYDONE
	MOV	#1,WRDCNT
	.ADDR	#ZERO,R3
	MOV	R3,BUFRAD
	.IF NE	MMG$TINC	R2
4$:	SUB	#26.,R3
	BGE	4$
	ADD	#27.,R3
	.BR	DYDOFN
	.SBTTL	DYDOFN - START A TRANSFER OR SILO OPERATION
DYDOFN:	BITB	#CSTR!CSDONE,@R4
	BEQ	DYDOFN
	BPL	DYERR2
	MOV	R3,@R5
1$:	BITB	#CSTR!CSDONE,@R4;TRANSFER OR DONE?
	BEQ	1$
	BPL	DYERR2
	MOV	R2,@R5
	RETURN
	.SBTTL	SETDY - SET UP REGISTERS
SETDY:	MOV	DYFUN2,R0
	MOV	#128.,R3
	.IF EQ	DY$DD
	TST	@DENPTR
	BNE	1$
	ASR	R3
1$:
	.ENDC
	MOV	DYCSA,R4
	MOV	R4,R5
	TST	(R5)+
	RETURN
	.SBTTL	TABLES, FORK BLOCK, END OF DRIVER
ZERO:	.WORD	0
	BIC	#30000,R0
	.ENDC
	.IF EQ	DY$DD
	MOV	#3,R1
	BIT	#CSDN,R0
	BEQ	9$
	ASR	R1
9$:	BIT	R1,DYLSN
	.IFF
	BIT	#1,DYLSN
	.ENDC
	BNE	4$
	.SBTTL	DONE WITH I/O, FINISH UP AND EXIT
DYDONE:
	.IF NE	ERL$G
	TST	SCSFLG
	BNE	10$
	MOV	DYCQE,R5
	MOV	#DY$COD*400+377,R4
	CALL	@$ELPTR
	.ENDC
10$:	CLR	@DYCSA
11$:	.DRFIN	DY
DYABRT:	MOV	(PC)+,-(SP)
DYCSA:	 .WORD	DY$CSR
				.ASSUME	. LE DYSTRT+1000
	MOV	#CSINIT,@(SP)+
	CLR	DYFBLK+2
	BR	11$
DYERR:	MOV	DYCQE,R4
	BIS	#HDERR$,@-(R4)
	BR	10$
	.DSABL	LS
	.IF EQ	DY$DD
	.WORD	CSRDST-CSRD+SPFUNC
	.WORD	0
	.ENDC
	.WORD	CSWRTD-CSRD+SPFUNC
	.WORD	CSWRT-CSRD+SPFUNC
	.WORD	CSRD-CSRD+SPFUNC
CHGTBL:
	.IF EQ	DY$DD
SAVDEN:	.WORD	CSDN,CSDN
	 .IF NE	DYT$O
	.WORD	CSDN,CSDN
	 .ENDC
	.ENDC
DYFBLK:	.WORD	0,0,0,0
	.IF NE	ERL$G
DYRBUF:	.BLKW	DYNREG
	.BLKW	4
	.ENDC
	.SBTTL	BOOTSTRAP READ ROUTINE
	.DRBOT	DY,BOOT1,READ1
	. = DYBOOT+40
BOOT1:	JMP	@#BOOT-DYBOOT
	.ENABL LSB
	. = DYBOOT+210
UNTRED:	 .WORD	CSGO+CSRD+CSDN
	 .WORD	CSGO+CSRD+CSDN+CSUNIT
READB
	.SBTTL	INWAIT - START FUNCTION AND WAIT FOR INTERRUPT FROM FLOPPY
INWAIT:	MOV	(SP)+,INTRTN
	MOV	R0,@DYCSA
	RETURN
	.SBTTL	INTERRUPT ENTRY POINT
	.DRAST	DY,5,DYABRT
	.FORK	DYFBLK
	CALL	SETDY
	BMI	DYERR2
INTDSP:	JMP	@(PC)+
INTRTN:	 .WORD	0
	.SBTTL	ERROR HANDLING - CHANGE DENSITY, RETRY
DYERR2:
	.IF EQ	DY$DD
	BIT	#ESDNER,@R5
	BEQ	5$
	MOV	DENPTR,R2
	BIC	(R2)+,R0
	NEGB	-(R2)
	INCB	(R2)+
	BIS	-(R2),R0
	BMI	4$
	BCS	3$
	ASR	DYLSN
	BR	4$
3$:	ASL	DYLSN
4$:	MOV	R0,DYFUN2
	CMP	DYTRY,#R1:	MOV	@#B$DEVU,R3
	BR	100$
READ:	MOV	BTUNIT,R3
100$:	ASL	R3
	MOV	UNTRED-DYBOOT(R3),REDCMD
1$:	ASL	R0
2$:	MOV	(PC)+,R5
BOTCSR:	 .WORD	DY$CSR
	MOV	(PC)+,(R5)+
REDCMD:	 .WORD	0
	MOV	R0,-(SP)
	MOV	R0,R3
	MOV	R0,R4
	CLR	R0
	BR	4$
3$:	SUB	#23.,R3
4$:	INC	R0
	SUB	#26.,R4
	BPL	3$
	CMP	#-14.,R4
	ROL	R3
5$:	SUB	#26.,R3
	BPL	5$
	ADD	#27.,R3
	MOV	BOTCSR,R4
	CALL	WAIT
	MOV	R3,@R5
	CALL	WAIT
	MOV	R0,@R5
6$:	BIT	#CSDONE,@R4
	BEQ	6$
	TST	@R4
	BMI	RTRY
	MOV	(PC)+,(R4)
EMTCMD:	 .WORD	CSEBUFDD	PC,R1
	ADD	CHGTBL-.(R1),R4
	.IF EQ	DY$DD
	SUB	#377*400!SIZ$FN*2,R5
	BEQ	7$
	.ENDC
	.IF EQ	MMG$T
	CLR	(R0)+
	.IFF
	MOV	R4,-(SP)
	MOV	DYCQE,R4
	CLR	-(SP)
	CALL	@$PTWRD
	TST	(R0)+
	MOV	(SP)+,R4
	.ENDC
	BR	7$
5$:	JMP	DYERR
6$:	ASL	R3
	TST	@R5
	BEQ	DYDONE
	.IF EQ	DY$DD
	TST	@R2
	BNE	7$
	ASL	R3
	.ENDC
7$:	MOV	R0,BUFRAD
	MOV	R3,DYLSN
	MOV	R4,(PC)+
DYFUN2:	 .WORD	0
	.IF EQ	DY$DD
	MOV	R5,(PC)+
SIZFLG:	 .WORD	0
	.ENDC
	MOV	#CSINT,R0
	CALL	INWAIT
	.BR	DYINIT
	.DSABL LSB
	.SBTTETRY
	BNE	5$
	CALL	SETDY
	BR	9$
	.ENDC
5$:
	.IF NE	ERL$G
	.ADDR	#DYRBUF,R3
	MOV	R3,R2
	MOV	@R4,(R3)+
	MOV	@R5,(R3)+
	MOV	#CSMAIN!CSGO,@R4
6$:	BIT	#CSTR,(R4)
	BEQ	6$
	MOV	R3,(R5)
61$:	BIT	#CSDONE,(R4)
	BEQ	61$
	MOV	DRETRY,R3
	SWAB	R3
	ADD	#DYNREG,R3
	MOV	DYCQE,R5
	MOV	DYTRY,R4
	ADD	#DY$COD*400-1,R4
	CALL	@$ELPTR
	MOV	DYCSA,R4
7$:
	.ENDC
	MOV	#CSINIT,@R4
	MOV	#CSINT,R0
	CALL	INWAIT
9$:	DEC	DYTRY
	BEQ	DYERR
	JMP	DYINIT
	.SBTTL	DOSILO - INITIATE A SILO FILL OR EMPTY COMMAND
DO+CSGO+CSDN;STORE EMTY BUFFER COMMAND HERE
	MOV	#64.,R3
	BIT	#CSDN,EMTCMD
	BEQ	7$
	ASL	R3
7$:	CMP	R1,R3
	BHIS	8$
	MOV	R1,R3
8$:	CALL	WAIT
	MOV	R3,@R5
	CALL	WAIT
	MOV	R2,@R5
9$:	BIT	#CSDONE,@R4
	BEQ	9$
	TST	@R4
	BMI	RTRY
	MOV	(SP)+,R0
	SUB	R3,R1
	BLE	10$
	ADD	R3,R2
	ADD	R3,R2
	INC	R0
	BR	2$
WAIT:	BITB	#CSTR!CSDONE,@R4;TRANSFER OR DONE?
	BMI	11$
	BEQ	WAIT
RTRY:	MOV	(SP)+,R0
	BITB	#DNERR,@R5
	BEQ	BIOERR
	BIC	#CSDN,REDCMD
	BIC	#CSDN,EMTCMD
	BR	1$
10$:	CLC
11$:	RETURN
	.DSABL	LSB-<B>
.IfF
	.Error
.EndC
.EndM	.Assume
.Macro	......
.EndM	......
.If	EQ	EIS$I
.Macro	SOB	Reg,Dest
	Dec	Reg
	Bne	Dest
.EndM	SOB
.EndC
.SbTtl	Equates
PR7	=:	7*40
JSP	=:	42
JSW	=:	44
	SpXit$	=:	40
	Chain$	=:	400
	Ovly$	=:	1000
	ChnIF$	=:	4000
	RStrt$	=:	20000
JUsErB	=:	53
	Succs$	=:	1
	Warn$	=:	2
	Error$	=:	4
	Sever$	=:	10
	Fatal$	=:	20
JRMon	=:	54
InsCsr	=:	176
InsCk	=:	200
CmdLen	=:	510
CmdStr	=:	512
ChnTo	=:	500
PPN	=:	510
ChnFrm	=:	512
ChnArg	=:	522
	ChnNon	=:	377
	Ch
	. = DYBOOT+576
BOOT:	BIT	#CSDONE,@BOTCSR
	BEQ	BOOT
	MOV	#10000,SP
	MOV	R0,(PC)+
BTUNIT:	 .WORD	0
	MOV	#2,R0
	MOV	#<4*400>,R1
	MOV	#1000,R2
	CALL	READ
	MOV	#READ1-DYBOOT,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	MOV	BTUNIT,@#B$DEVU
	JMP	@#B$BOOT
	.DREND	DY
	.END
                                                                                                                                                                                                                                                 nRtn	=:	177
ChnErr	=:	523
ChnUEB	=:	524
ChnMsg	=:	525
SyUnit	=:	275
SysVer	=:	276
ConFg1	=:	300
	FBMon$	=:	000001
$MTPS	=:	360
$MFPS	=:	362
SyIndx	=:	364
ConFg2	=:	370
	LDRel$	=:	000020
SysGen	=:	372
	XMMon$	=:	000002
	RTEM$	=:	000010
$PName	=:	404
	EntEnd	=:	177777
Suffix	=:	412
	OwnMsk	=:	17
Upd$Fn	=:	372
Siz$Fn	=:	373
.SbTtl	Define handler characteristics
.DrDef	LD, 46, FilSt$!SpFun$!VarSz$, 0, 0, 0
	.Asect
	.=:JSW
	.Word	Ovly$
.SbTtl	Installation check code
	.=:InsCsr
	.Wor.MCALL	.MODULE
.MODULE	LD,RELEASE=B03,VERSION=01

.NList	BEX,CND
.IIf	NDF	RTE$M	RTE$M=0
.IIf	NDF	MMg$t	MMg$t=0
.IIf	NDF	SJOnly	SJOnly=0
.IIf	NDF	EIS$I	EIS$I=RTE$M!MMg$t
.IIf	NE	SJOnly*MMg$t	.Error
.IIf	NE	SJOnly*RTE$M	.Error
.IIf	NE	MMg$t*RTE$M	.Error
.IIf	NE	SJOnly		.Error
.IIf	NDF	Def$LD	Def$LD=:^rDSK
.LDGen	=:	<2*MMg$t>!<10*RTE$M>!<400*EIS$I>!<1000*SJOnly>
.Audit .LD .LDGen Def$LD
.SbTtl
.If	NE	MMg$t
.SbTtl	*** Supports XM
.SbTtl	LDX is handler name
.IfF
 .If	EQ	SJOnly
  .If	EQ	RTE$Md	0
	.=:InsCk
	Br	10$
	...........
					.Assume	. EQ 202
	Br	InErr
	.............
10$:
	Mov	@#JRmon, R0
	CmpB	SysVer(R0),#3
	Blo	InErr
.If	NE	SJOnly
	Bit	#FBMon$,ConFg1(R0)
	Bon	InErr
.EndC
	Bit	#RTEM$,SysGen(R0)
.If	NE	RTE$M
	Boff	InErr
.IfF
	Bon	InErr
.EndC
	Bit	#XMMon$,SysGen(R0)
.If	NE	MMG$T
	Boff	InErr
.IfF
	Bon	InErr
.EndC
	Tst	(PC)+
InErr:
	Sec
	Return
	......
.IIf	GT	.-356	.Error .-356
.SbTtl	Set Code
.Enable	LSB
.DrSet	CLEAN	'C	SetCle
.DrSet	WRITE	'R	SetWri	NO

.SbTtl	*** Supports FB
.SbTtl	*** Supports SJ
.SbTtl	LD is handler name
  .IfF
.SbTtl	*** Supports emulator
.SbTtl	LDM is handler name
  .EndC;EQ	RTE$M
 .IfF
.SbTtl	*** Supports SJ
.SbTtl	LD is handler name
 .EndC
.EndC
.SbTtl
.SbTtl	Macros and Definitions
.MCall	.DrDef
.MCall	.CsiSpc	.Print	.Exit	.Purge
.MCall	.LookUp	.DStat	.FProt	.Fetch
.MCall	.Enter	.SpFun	.WritW	.CStat
.MCall	.Release .SErr	.Chain	.SetTop
.MCall	.SReset
.SbTtl	Global References to ULBLIB
.Globl	$CBOMg
.Globl	$F.DrSet	BPT	NOP	SetBPT	<NO,NUM>
SetBPT:
	Mov	#BPT,R3
	.Br	SetNoB
SetNoB:
					.Assume SetBPT+4 EQ SetNoB
	Cmp	#BPTLen/2,R0
	Blos	SetErr
	Asl	R0
	Jsr	R1,10$
BPTTab:
	.Word	DBGSet-TabBas
	.Word	DBGQue-TabBas
	.Word	DBGRun-TabBas
BPTLen	=:	.-BPTTab
10$:
	Add	R1,R0
	Mov	@R0,R0
	Add	PC,R0
TabBas=:.
	Mov	R3,@R0
	Mov	(SP)+,R1
	Br	SetOk
	.............
SetWri:
	Mov	#'W,R3
	.Br	SetNoW
SetNoW:
	Call	DBGSet
					.Assume	SetWri+4 EQ SetNoW
	.Br	SetCle
SetCle:
	Call	DBGSet
	TstB	-1(R5)
	BnAsc
.Globl	$R50Asc
LD.Cnt	=	0
RM.Cnt	=	0
.Macro	$Rel	Loc	Value	Base
...V2	=	.
.	=	Loc
.If	IDN	<LD>	<Base>
Ld.Cnt	=	Ld.Cnt+1
.Irp	...V3	<\Ld.Cnt>
LD.'...V3:	.Word	Value-LdBase
.EndR
.IfF
 .If	IDN	<RMON>	<Base>
RM.Cnt	=	RM.Cnt+1
.Irp	...V3	<\RM.Cnt>
RM.'...V3:	.Word	Value
.EndR
 .IfF
	.Error
 .EndC
.EndC
.	=	...V2
.EndM	$Rel
.Macro	Boff	Dst
	Beq	Dst
.EndM	Boff
.Macro	Bon	Dst
	Bne	Dst
.EndM	Bon
.Macro	.Br	Dst
.IIf	NE	.-Dst	.Error
.EndM	.Br
.Macro	.Assume	A Rel B
.If	Rel	<A>ne	Not1Op
	MovB	R3,Letter
	Bis	#'0,R1
	MovB	R1,Number
	Mov	@#JRMON,R0
	Add	SUFFIX(R0),RNAME
	Mov	#ChnTo,R0
	Jsr	R3,30$
	..............
					.Assume . EQ 20$
20$:
	.Rad50	"SY "
RName:
.IIf	EQ MMg$T!RTE$M	.RModule
.IIf	NE MMg$T	.Rad50	"LDX"
.IIf	NE RTE$M	.Rad50	"LDM"
	.Rad50	"   SYS"
	.Word	0
	.Word	0,0,0,0
	.Ascii	"/"
Letter:	.BlkB	1
	.Ascii	":"
Number:	.BlkB	1
	.Asciz	""
	.Even
30$:
	Mov	PC,R1
 40$:
	 Mov	(R3)+,(R0)+
	 Cmp	R3,R1
	 Blo	40$
	.Chain
	......
.Enable LSB
Not1O.UNx NE 200
					.Assume	Hd.UOf EQ 200
	Bmi	LdErr
	Mov	R2,R1
	Asl	R1
	Asl	R1
	Mov	R2,-(SP)
	Mov	Name(R1),-(SP)
$Rel	.-2	Name	LD
	Beq	50$
	Mov	#$PName,R1
$Rel	.-2	$PName	RMON
RM.PNm=:.-2
	Mov	RM.Ent,R2
 30$:
	 Cmp	@SP,(R1)+
	 Beq	40$
	 Cmp	R1,R2
	 Bne	30$
40$:
	Sub	RM.PNm,R1
	Tst	-(R1)
	Br	60$
	...........
50$:
	Sec
60$:
	Bit	(SP)+,R2
	Mov	(SP)+,R2
	Bcs	LdNoDv
	MovB	R1,@R5
	.Br	LimCk
.SbTtl	Validate request (R/O) and block limits ok
.Enable	LSB
LimCk:
	Mov	Q$WCnt(R4),R1
	Mov	R4,RM.Own
 .If	EQ	MMG$T
	Bit	#FBMon$,@#ConFg1
$Rel	.-2	ConFg1	RMON
	Bon	50$
	Mov	#.-.,....SJ
.....1=.
.=.-4
		Br	..NoCk-....SJ+.
.	=.....1
50$:
 .EndC;	EQ	MMG$T
.EndC
	Mov	(SP)+,R0
	Rts	R2
	..........
Init:
					.Assume	LdBase EQ ...1st
	Mov	#LdCQE-...1st-4,-(R2)
	Mov	#Mov!6700!04,-(R2)
	Mov	@#JRMon,R4
RM.Did	=	1
.Rept	RM.Cnt
 .Irp	.....2	<\RM.Did>
	Add	R4,RM.'.....2
 .EndR
RM.Did	=	RM.Did+1
.EndR
	Jsr	R0,10$
	..............
LD.Did	=	1
LD.Lst:
.Rept	LD.Cnt
 .Irp	.....2	p:
	Jsr	R0,SetMsg
	.................
	.Ascii	"?"
	.NLCsi	TYPE=I,PART=NAME
	.Asciz	"-F-Only 1 option per SET allowed"
	.Even
SetMsg:
 10$:
	 TstB	-(R5)
	 TstB	-1(R5)
	 Bne	10$
	.Print
	Cmp	(SP)+,(SP)+
	.Br	SetOk
SetOk:
	Tst	(PC)+
SetErr:
	Sec
	Return
	......
DBGSet:
	BPT
.=:DBGSet;******************************;5
	NOP
	Return
	......
.IIf	GT	.-1000	.Error .-1000
LDHand	=:	1000
.SbTtl	Queue Manager code
.Enable	LSB
.DrBeg	LD
LdBase:
...1st:	Mov	LdCQE,R4
.=:...1st;***********Bpl	ReadCk
	Bit	#Hd.RdO,@R5
	Bon	LdErr
	Neg	R1
ReadCk:
					.Assume	Q$BlkN EQ 0
	Cmp	@R4,Size(R2)
$Rel	.-2	Size	LD
	Bhi	LdErr
	Add	#256.-1,R1
	SwaB	R1
	Bic	#^c377,R1
					.Assume	Q$BlkN EQ 0
	Add	@R4,R1
	Cmp	R1,Size(R2)
$Rel	.-2	Size	LD
	Bhi	LdErr
					.Assume	Q$BlkN EQ 0
	Add	Offset(R2),@R4
$Rel	.-2	Offset	LD
	MovB	Handlr+1(R2),R1
$Rel	.-2	Handlr+1 LD
	Bic	#^cUntMsk,R1
	BicB	#UntMsk,Q$Unit(R4)
	BisB	R1,Q$Unit(R4)
.If	NE	SJOnly
	.Br	ReQue
.IfF
	.Br	OwnCk
.SbTtl	Process ownershi*******************;3 next instruction assembled in
	Jsr	R2,Init
DBGQue:	BPT
.=:DBGQue;******************************;3
	NOP
	Mov	#Handlr,R5
$Rel	.-2	Handlr	LD
	MovB	Q$Unit(R4),R2
	Bic	#^cUntMsk,R2
	Asl	R2
	MovB	Q$Func(R4),R1
	Bpl	RelCk
	CmpB	#Upd$Fn,R1
	Bne	60$
.If	EQ	MMG$T
	Mov	Q$Buff(R4),R2
	Tst	Q$WCnt(R4)
	Bpl	10$
	Mov	R5,R1
	Mov	R2,R5
	Mov	R1,R2
10$:
	Mov	#BufHi-BufLow/2,R1
 20$:
	 Mov	(R2)+,(R5)+
	 Sob	R1,20$
	Br	LdDon1
	..............
.IfF
	Mov	#BufHi-BufLow,R1
	Tst	Q$Wp validation
.Enable	LSB
OwnCk:
	Asr	R1
....SJ:	Br	..NoCk
.=:....SJ;******************************;3
	MovB	@R5,R5
	Add	R5,R1
	Add	R5,R1
	MovB	.-.(R1),R5
RM.Own=:.-2
	Bit	#1,Handlr(R2)
$Rel	.-2	Handlr	LD
	Boff	10$
	.Rept	4
	Asr	R5
	.EndR
10$:
	Bic	#^cOwnMsk,R5
	Boff	ReQue
	Dec	R5
	Mov	Q$JNum(R4),R1
	Asr	R1
	Asr	R1
	Asr	R1
	Bic	#^cUntMsk,R1
	Cmp	R1,R5
	Bne	LdErr
	.Br	ReQue
..NoCk:
.EndC
.SbTtl	Requeuing process
ReQue:
	MovB	Handlr(R2),R2
$Rel	.-2	Handlr	LD
	Mov	.-.(R2),R2
Cnt(R4)
	Bpl	40$
 30$:
	 MovB	(R5)+,-(SP)
	 Call	@$PtByt
	 Sob	R1,30$
	Br	LdDon1
	..............
40$:
 50$:
	 Call	@$GtByt
	 MovB	(SP)+,(R5)+
	 Sob	R1,50$
	Br	LdDon1
	..............
.EndC
DBGRun:
	BPT
.=:DBGRun;******************************;5
	NOP
.IIf	GT	.-LDStrt-776	.Error .-LDStrt+776
	Return
	......
60$:
	CmpB	#Siz$Fn,R1
	Bne	LdDon1
					.Assume	Hd.Act EQ 100000
	Tst	Handlr(R2)
$Rel	.-2	Handlr	LD
	Bpl	LdEr1
.If EQ	Mmg$t
	Mov	Size(R2),@Q$Buff(R4)
$Rel	.-4	Size	LD
.IfF
	RM.Ent=:.-2
	Beq	LdNoDv
	Call	@#$MFPS
$Rel	.-2	$MFPS	RMON
	Mov	#PR7,-(SP)
	Call	@#$MTPS
$Rel	.-2	$MTPS	RMON
RM.MTP=:.-2
	Clr	LdCQE
	Clr	LdLQE
	Call	@RM.MTP
	Add	#2,@SP
	Return
LDInt::
	......
LdNoDv:
LdErr:
	Mov	LdCQE,R4
	Bis	#HdErr$,@-(R4)
LdDone:
	.DrFin	LD
	..........
.SbTtl	Data Area
LdData::
Units	=:	8.
UntMsk	=:	Units-1
					.Assume	Units EQ 8.
BufLow:
Handlr:	.BlkW	Units
	Hd.Act	=:	100000
	Hd.RdO	=:	020000
	Hd.Unt	=:	003400
	Hd.UOf	=:	000200
	Hd.UNx	=:	000100
	Hd.NdMov	Size(R2),-(SP)
$Rel	.-2	Size	LD
	Call	@$PtWrd
.EndC
LdDon1:
	Br	LdDone
	..............
.SbTtl	Check the .Release/$UNLOAD bit
.Enable	LSB
RelCk:
	Bit	#LDRel$,@#ConFg2
$Rel	.-2	ConFg2	RMON
.CnFg2=:.-2
	Boff	20$
	Bic	#LDRel$,@.CnFg2
	Mov	#Units,R1
	Add	R1,R5
	Add	R1,R5
 10$:
	 Bis	#Hd.Unx,-(R5)
	 Sob	R1,10$
.SbTtl	Check for valid info about LDn: unit n
20$:
	Add	R2,R5
					.Assume	Hd.Act EQ 100000
	Tst	@R5
LdEr1:
	Bpl	LdErr
	BitB	#Hd.UNx!Hd.UOf,@R5
	Boff	LimCk
					.Assume	Hdx	=:	000076
Offset:	.BlkW	Units
Size:	.BlkW	Units
Name:	.BlkW	Units*4
BufHi:
.SbTtl	Initialization, one-time code
.Enable	LSB
10$:
 20$:
	 Mov	(R0)+,R5
	 Bmi	30$
	 Add	R2,R5
	 Add	R2,@R5
	 Br	20$
	 ..........
30$:
	Mov	@RM.PNm,R5
	Add	R4,R5
	Mov	R5,RM.PNm
	Mov	R5,R4
 40$:
	 Cmp	(R5)+,#EntEnd
	 Bne	40$
	Tst	-(R5)
	Sub	R4,R5
.If	EQ	SJOnly
	Mov	R5,RM.Own
.EndC
	Asr	R5
	Mov	R5,R0
	Add	R4,R5
	Mov	R5,RM.Ent
.If	EQ	SJOnly
	Cmp	(R0)+,(R0)+
	Sub	R0,R4
	Sub	R0,R4
	Sub	RM.Own,R4
	tl	Process switches
.Enable	LSB
DoSwt:
	Mov	#-1,R5
	Call	SpFun
	Mov	(SP)+,R1
	Bne	NxtSwt
Done2:	Br	Done1
	.............
 NxtSwt:
	 Mov	#SwList-2,R2
	 Mov	(SP)+,R0
 10$:
	 Tst	(R2)+
	 TstB	(R2)+
	 Bmi	ErrUkS
	 CmpB	(R2)+,R0
	 Bne	10$
	 Jmp	@(R2)
	 ............
Swt$:
	 Mov	R0,Flag$
	 Bpl	20$
	 Tst	(SP)+
20$:
	 Br	SwtXit
	 .............
SwtA:
	 Tst	R0
	 Bpl	ErrNoV
	 Mov	(SP)+,ValueA
	 Br	SwtNoC
	 .............
SwtC:
	 Mov	R0,FlagC
	 Bpl	30$
	 Mov	(SP)+,ValueC
30$:
	 Br	SwttTop DStat+D.HSiz
	 Cmp	R0,DStat+D.HSiz
	 Blo	ErrHTB
	 .Fetch	LimHi,R3
	 Bcs	ErrFet
	 .Br	30$
 30$:
	 Clr	-(SP)
					.Assume	Chan EQ 0
	 .Purge	#0
	 .LookUp #LukupF,,R3,Code=NoSet
	 Bcc	40$
	 Inc	@SP
	 Tst	FlagC
	 Boff	ErrFNF
	 Bis	#Hd.UOf,@R4
	 Mov	O.Name(R3),@SP
	 Clr	O.Name(R3)
	 .LookUp #LukupF,Code=NoSet
	 Mov	@SP,O.Name(R3)
 40$:
	 .CStat	#CStatF, Code=NoSet
	 Mov	CStat+C.Leng,Size-Handlr(R4)
	 Mov	CStat+C.SBlk,Offset-Handlr(R4)
	 MovB	CStat+C.Unit,R0
	 BicB	#UntMsk,1(R4)
	 Xit
	 .............
SwtL:
	 Call	CheckV
	 Bis	#Sw.L,Table(R3)
	 SwaB	R0
	 Bic	#^c177,R0
	 MovB	R0,Table(R3)
	 MovB	R3,UnitA
	 AsrB	UnitA
	 BisB	#'0,UnitA
	 Inc	CountL
	 Br	SwtNoC
	 ..............
SwtR:
	 Call	CheckV
	 Bis	#Sw.R,Table(R3)
	 Br	SwtNoC
	 ..............
SwtW:
	 Call	CheckV
	 Bis	#Sw.W,Table(R3)
	 .Br	SwtNoC
SwtNoC:
	 Inc	FlgNoC
	 .Br	SwtXit
SwtXit:
	 Sob	R1,NxtSwt
	.Br	CkSwt
.SbTtl	CkSwt	- verify correct switch selections
.Enable	LSB
CkSwt:
	Tst	FlagC
	Boff	10$Bic	#^cUntMsk,R0
	 BisB	R0,1(R4)
					.Assume Chan EQ 0
	 .Purge	#0
	 Tst	(SP)+
	 Bon	70$
	 Tst	Flag$
	 Boff	60$
	 Tst	DStat+D.EntP
	 Bon	60$
	 Mov	R0,-(SP)
	 Mov	R1,-(SP)
	 Mov	CmdPtr,R1
	 Mov	#LCmnd,R0
  50$:
	  Inc	CmdCnt
	  MovB	(R0)+,(R1)+
	  Bne	50$
	 TstB	-(R1)
	 Mov	CStat+C.DevN,R0
	 Call	$R50Asc
	 ClrB	(R1)+
	 Mov	R1,CmdPtr
	 Add	#3,CmdCnt
	 Mov	(SP)+,R1
	 Mov	(SP)+,R0
 60$:
	 .FProt	#FProt,,R3,Code=NoSet
	 Bcs	ErrPro
 70$:
 Releas:
	 .Release R3
 SetTop:
 80$:
	 .<\LD.Did>
	.Word	LD.'.....2-LdBase
 .EndR
LD.Did	=	LD.Did+1
.EndR
	.Word	-1
.DrEnd	LD
.=.
.IIf	NE	LD.Cnt-LD.Did+1	.Error LD.Cnt-LD.Did+1
.IIf	NE	RM.Cnt-RM.Did+1	.Error RM.Cnt-RM.Did+1
.SbTtl	LDRun - control LD handler
.Enable	LSB
LDRun::
	Call	DBGRun
	.SErr
	Mov	#ClrLow,R0
	Mov	#ClrHi-ClrLow/2,R1
10$:
	 Clr	(R0)+
	 Sob	R1,10$
	Bit	#Chain$,@#JSW
	Boff	20$
	Mov	#ChnArg,R1
	CmpB	#ChnNon,@R1
	Bne	20$
	Clr	R1
20$:
	Mov	#CmdBuf,R3
	Mov	R3,CmdPtr
	Clr	CmdCnt
	.CSISpc	#Out1,#DefExt,R1
	Tst	FlgNoC
	Boff	20$
	Jsr	R0,ErrMsg
	.Word	MsgSwC
	Br	Done1
	............
10$:
	Tst	ValueA
	Boff	DoFile
	Dec	CountL
	Beq	DoFile
	Jsr	R0,ErrMsg
	.Word	MsgALS
Done1:	Jmp	Done
	............
20$:
	Mov	#Handlr,R5
	Mov	#Name,R4
	Mov	#In1-<3*<In2-In1>>,R3
	Clr	R1
	Mov	#8.,R2
 30$:
	 MovB	R1,(R5)+
	 Inc	R1
	 MovB	(R5)+,R0
	 Bic	#^cUntMsk,R0
	 Add	(R4)+,R0
	 Add	#^r  0,R0
	 Mov	R0,(R3)+
	 Mov	(R4)+,(R3)+
	 Mov	(R4)+,(R3)+
	 Mov	(R4)+,(R3)+
	 Sob	R2,30$
	Mov	#Handlr,R2
	Br	DoSwtC,R3
	Bcc	30$
	Jsr	R0,ErrMsg
	.Word	MsgCsi
	Br	40$
	...........
30$:
	TstB	CmdBuf
	Bne	50$
	.Print	#MsgId
40$:
	Br	Done2
	............
50$:
	Mov	#In1,R0
	Mov	R0,R1
	.Rept	3
	Tst	-(R0)
	 .Rept	4
	Mov	-(R0),-(R1)
	 .EndR
	.EndR
	.Br	CkSys
.SbTtl	Insure that system channel open on LD handler on SY:
.Enable	LSB
CkSys:
	Mov	@#JRmon,R5
	Mov	#<^rLD >,R2
	Add	Suffix(R5),R2
	Mov	R2,DBlock+O.Name
	.CStat	#CStatS,Code=NoSet
	Bic	#^cHd.Ndx,CStat
	Cmp	SyIndx(R5),CStat
	Bne	10$
	CmpB	SyU
	..............
ErrNoF:
	Jsr	R0,ErrMsg
	.Word	MsgNoF
	Br	FilXi1
	..............
ErrDev:
	Jsr	R0,ErrMsg
	.Word	MsgDev
	Br	FilXi1
	..............
ErrRan:
	Jsr	R0,ErrMsg
	.Word	MsgRan
FilXi1:	Jmp	FilXit
	..............
ErrHTB:
	Jsr	R0,ErrMsg
	.Word	MsgHTB
	Br	SetTo1
	..............
ErrFet:
	Jsr	R0,ErrMsg
	.Word	MsgFet
SetTo1:	Jmp	SetTop
	..............
ErrFNF:
	Jsr	R0,ErrMsg
	.Word	MsgFNF
	Br	Done1
	............
.SbTtl	Process input and update handler tables
.Enable	LSB
DoFilnit(R5),CStat+C.Unit
	Beq	DoSwt
10$:
	.Purge	#SysChn
	Mov	#<^rSY >,DBlock+O.Dev
	Clr	DBlock+O.Name+2
	Mov	#<^rSYS>,DBlock+O.Type
	.LookUp	#LukUpS,Code=NoSet
	Bcc	20$
	Jmp	NoLErr
20$:
	Bit	#Chain$,@#JSW
	Bon	40$
	Clr	@#ChnFrm
	Mov	#CmdBuf,R0
	Mov	#ChnArg,R1
 30$:
	 MovB	(R0)+,(R1)+
	 Bne	30$
40$:
	.Chain
	......
ErrUkS:
	MovB	R0,ChrUks
	 Jsr	R0,ErrMsg
	 .Word	MsgUkS
	 Br	Done1
	 ...........
ErrNoV:
	MovB	R0,ChrNov
	 Jsr	R0,ErrMsg
	 .Word	MsgNoV
	 Br	Done1
	 ...........
.SbTe:
	Mov	#Table,R2
DoSwtC:
	Mov	#In1-<3*<In2-In1>>,R1
	Mov	#Handlr,R4
	Clr	R5
NxtFil:
					.Assume 100000 EQ Sw.L
	 Tst	@R2
	 Bpl	10$
	 Bic	#Hd.Act!Hd.UOf,@R4
	 MovB	@R2,R3
	 Asl	R3
	 Asl	R3
	 Asl	R3
	 Add	R1,R3
					.Assume O.Dev EQ 0
	 Tst	@R3
	 Bon	20$
 10$:	 Jmp	90$
 20$:
	 Tst	O.Name(R3)
	 Boff	ErrNoF
	 Bis	#Hd.Act!Hd.UNx,@R4
	 .DStatus #DStat,R3
	 Bcs	ErrDev
					.Assume 100000 EQ FilSt$
	 Tst	DStat
	 Bpl	ErrRan
	 Tst	DStat+D.EntP
	 Bon	30$
	 Add	LimHi,DStat+D.HSiz
	 .Sesr	R0,ErrMsg
	.Word	MsgWRW
40$:
	Tst	CmdCnt
	Bon	Kmon
	Tst	ValueA
	Bon	Kmon
	Bit	#Chain$,@#JSW
	Bon	50$
	.SReset
	Jmp	LDRun
	.............
50$:
	Tst	@#ChnFrm
	Boff	Exit
Chain:
	Mov	#ChnTo,R2
	Mov	#ChnFrm,R1
	.Rept	4
	Mov	(R1)+,(R2)+
	.EndR
					.Assume	Chan EQ 0
	.Purge	#0
	.Chain
	......
Kmon:
	Mov	CmdPtr,R1
	Mov	CmdCnt,R3
	Mov	ValueA,R0
	Boff	70$
	Mov	#ACmnd,R2
 60$:
	 Inc	R3
	 MovB	(R2)+,(R1)+
	 Bne	60$
	TstB	-(R1)
	Call	$R50Asc
	ClrB	(R1)+
	Add	#3,R3
70$:
	Mov	#Cm(SP)+,R0
	Mov	(SP)+,R1
Nothin:
RtsPC:	Return
	......
.SbTtl	Messages
MsgId:
.IIf	EQ MMg$T!RTE$M	.NLCSI
.If	NE MMg$T
	.NLCSI	TYPE=I,PART=NAME
	.Ascii	"X "
	.NLCSI	TYPE=Z,PART=RLSVER
.EndC
.If	NE RTE$M
	.NLCSI	TYPE=I,PART=NAME
	.Ascii	"M "
	.NLCSI	TYPE=Z,PART=RLSVER
.EndC
Prefix:	.Ascii	"?"
	.NLCSI	TYPE=I,PART=NAME
	.Ascii	"-"<200>
	.Even
MsgAOK:	.Word	Nothin
	.Asciz	<-1><Succs$>""
	.Even
MsgCsi:	.Word	Nothin
	.Asciz	<1><Fatal$>"F-Invalid Command"
	.Even
MsgWRW:	.Word	Nothin
	.AsdBuf,R0
	Mov	#CmdLen,R1
	Mov	R3,(R1)+
					.Assume CmdLen+2 EQ CmdStr
 80$:
	 MovB	(R0)+,(R1)+
	 Sob	R3,80$
	Bis	#SpXit$!ChnIF$,@#JSW
	Clr	R0
Exit:
	.Exit
	......
.Enable	LSB
ErrMsg:
	Mov	SP,HadErr
	Mov	R0,@SP
	Add	#2,@SP
	Mov	@R0,R0
	Call	@(R0)+
	Mov	R1,-(SP)
	Bit	#Chain$,@#JSW
	Boff	20$
	Tst	@#ChnFrm
	Boff	20$
	Mov	#ChnArg,R1
	MovB	#ChnRtn,(R1)+
					.Assume ChnErr EQ ChnArg+1
 10$:
	 MovB	(R0)+,(R1)+
	 Bne	10$
	Br	30$
	...........
20$:
	Mov	(R0)+,R1
	Swab	R1
	BisB	R1,@cii	<2><Warn$>"W-/W and /R specified for same unit, /W ignored "
	.Even
MsgDev:	.Word	Device,ChrDev
	.Ascii	<3><Fatal$>"F-Device not installed "
ChrDev:	.BlkB	4.
	.Asciz	""
	.Even
MsgRan:	.Word	Device,ChrRan
	.Ascii	<4><Fatal$>"F-Invalid device "
ChrRan:	.BlkB	4.
	.Asciz	""
	.Even
MsgNoV:	.Word	Switch,ChrNoV
	.Ascii	<5><Fatal$>"F-Switch without required value /"
ChrNoV:	.BlkB	1.
	.Asciz	""
	.Even
MsgPro:	.Word	File,ChrPro
	.Ascii	<6><Warn$>"W-Unable to protect file "
ChrPro:	.BlkB	14.
	.#JUsErB
	TstB	@R0
	Boff	30$
	Mov	R0,-(SP)
	.Print	#Prefix
	Mov	(SP)+,R0
	.Print
30$:
	Mov	(SP)+,R1
	Return
	......
	.SbTtl	SpFun Subroutine
.Enable	LSB
SpFun:
	.DStatus #DStat+1,#R50LD
	Bcc	10$
NoLErr:
	Mov	#R50LD,R3
	Jsr	R0,ErrMsg
	.Word	MsgDev
Done3:	Br	Done
	............
10$:
	Mov	DStat+D.EntP,LDMem
	Boff	30$
	Cmp	DStat+D.Stat,#LDSts
	Bne	NoLErr
	Call	30$
	.LookUp	#LukUpL,Code=NoSet
	Bcc	20$
	Jsr	R0,ErrMsg
	.Word	MsgLuk
	Br	Done3
	.............
20$:
	.SpFun	#SpFunL,WCnAsciz	""
	.Even
MsgBdV:	.Word	SwiVal,ChrBdV,ValBdV
	.Ascii	<7><Fatal$>"F-Switch value out of range (0--7) /"
ChrBdV:	.BlkB	1.
	.Ascii	":"
ValBdV:	.BlkB	6.
	.Asciz	""
	.Even
MsgNoF:	.Word	Device,ChrNoF
	.Ascii	<8.><Fatal$>"F-No file specified "
ChrNoF:	.BlkB	4.
	.Asciz	""
	.Even
MsgFNF:	.Word	File,ChrFNF
	.Ascii	<9.><Fatal$>"F-File not found "
ChrFNF:	.BlkB	14.
	.Asciz	""
	.Even
MsgUkS:	.Word	Switch,ChrUkS
	.Ascii	<10.><Fatal$>"F-Unknown switch (/C, /L, /R, or /W only) /"
ChrUkS:	.BlkB	1SetTop LimHi
	 Bis	#Hd.UNx,@R4
	 Mov	R5,R0
	 Add	#Name,R0
	 Mov	CStat+C.DevN,(R0)+
	 Tst	(R3)+
	 Mov	(R3)+,(R0)+
	 Mov	(R3)+,(R0)+
	 Mov	(R3)+,(R0)+
	 Tst	FlagC
	 Bon	90$
	 Bic	#Hd.RdO,@R4
 90$:
	 Mov	#Hd.RdO,R0
	 Bit	#Sw.W,@R2
	 Boff	110$
					.Assume Sw.R EQ Hd.RdO
	 Bit	R0,@R2
	 Boff	100$
	 Mov	SP,WarnRW
 100$:
	 Bic	R0,@R4
 110$:
					.Assume Sw.R EQ Hd.RdO
	 Bit	R0,@R2
	 Boff	FilXit
	 Bis	R0,@R4
 FilXit:
	 Cmp	(R2)+,(R4)+
	 Add	#O.Size,R5
	 Cmp	#Units*O.Size,R5
	 Beq	Wrapt=R5,Code=NoSet
	Bcc	30$
	Jsr	R0,ErrMsg
	.Word	MsgSpF
	Br	Done3
	.............
30$:
					.Assume	Chan EQ 0
	.Purge	#0
	Return
	......
	.SbTtl	Check for valid switch values subroutine
.Enable	LSB
CheckV:
	Tst	R0
	Bmi	10$
	MovB	R0,ChrNov
	Jsr	R0,ErrMsg
	.Word	MsgNoV
	Br	Done3
	.............
10$:
	Mov	(SP)+,R3
	Mov	(SP)+,R2
	Cmp	#Units-1,R2
	Bhis	20$
	MovB	R0,ChrBdv
	Jsr	R0,ErrMsg
	.Word	MsgBdV
	Br	Done3
	.............
20$:
	Mov	R3,-(SP)
	Mov	R2,R3
	Asl	R3
	Return
	......
Up
	Jmp	NxtFil
	..............
ErrPro:
	Jsr	R0,ErrMsg
	.Word	MsgPro
	Br	Releas
	...........
	.SbTtl	WrapUp
	.Enable	LSB
WrapUp:
	Clr	FlagC
	.WritW	#WritW,,,,,,Code=NoSet
	Bcc	20$
	Tst	LDMem
	Bon	10$
	Cmp	#-1,ValueC
	Beq	10$
	Jsr	R0,ErrMsg
	.Word	MsgWri
	Br	Done
	............
10$:
	Jsr	R0,ErrMsg
	.Word	MsgWWr
20$:
	Mov	#+1,R5
	Call	SpFun
Done:
	Mov	@#JSP,SP
	Tst	WarnRW
	Bon	30$
	Tst	HadErr
	Bon	40$
	Jsr	R0,ErrMsg
	.Word	MsgAOK
	Br	40$
	...........
30$:
	Clr	WarnRW
	J.SbTtl	Error message formatting routines
Device:
	Mov	R1,-(SP)
	Mov	(R0)+,R1
	Mov	R0,-(SP)
	Mov	#ErrBuf+2,R0
	Clr	-(R0)
	Mov	@R3,@R0
	Br	CalFnA
	..............
File:
	Mov	R1,-(SP)
	Mov	(R0)+,R1
	Mov	R0,-(SP)
	Mov	R3,R0
CalFnA:
	Call	$FnAsc
	ClrB	(R1)+
	Br	R01Ret
	.............
Switch:
	Inc	R0
	Return
	......
SwiVal:
	Mov	R1,-(SP)
	TST	(R0)+
Value:
	Mov	(R0)+,R1
	Mov	R0,-(SP)
	Mov	R1,R0
	Mov	R2,R1
	Mov	R2,-(SP)
	Clr	R2
	Call	$CBOMg
	ClrB	(R0)+
	Mov	(SP)+,R2
R01Ret:
	Mov	
MsgFet:	.Word	Device,ChrFet
	.Ascii	<17.><Fatal$>"F-.Fetch error "
ChrFet:	.BlkB	4.
	.Asciz	""
	.Even
MsgSwC:	.Word	Nothin
	.Asciz	<18.><Fatal$>"F-/C not specified alone"
	.Even
.SbTtl	Data
Chan	=:	0
SysChn	=:	17
..LDEX::
DefExt:	.Word	Def$LD,Def$LD,Def$LD,Def$LD
R50LD:
	.Rad50	"LD   "
LimLow:	.Limit
LimHi	=:	LimLow+2
ACmnd:
	.Ascii	"$ASSIGN LD"
UnitA:	.BlkB	1.
	.Asciz	" "
LCmnd:	.Asciz	"$LOAD "
	.Even
SwList:
	.Byte	0,'$
	.Word	Swt$
	.Byte	0,'A
	.Word	SwtA
	.Byte	0,'C
	.Word	.MCALL .MODULE
.MODULE LP,RELEASE=B03,VERSION=01

.SBTTL	MACROS AND DEFINITIONS
.MCALL	.DRDEF
	.DRDEF	LP,3,WONLY$,0,177514,200
.IIF NDF LP.CSZ, LP.CSZ = 132.
.IIF NDF LP.PSZ, LP.PSZ = 66.
.IIF NDF OFORM,  OFORM = 1
IE	= 100
RDY	= 200
ERR	= 100000
HT	= 11
LF	= 12
FF	= 14
CR	= 15
CTRLQ	= 'Q-100
CTRLS	= 'S-100
SPACE	= 40
COLSIZ	== LP.CSZ
PAGSIZ	== LP.PSZ
.SBTTL	SET OPTION PARAMETER TABLE
	.DRSET	WIDTH,30.,O.WIDTH,NUM
	.DRSET	CR,NOP,O.CR,NO
	.DRSET	FORM0,NOP,O.FORM0,NO
	.DRSET	HANG,<BMSwtC
	.Byte	0,'L
	.Word	SwtL
	.Byte	0,'R
	.Word	SwtR
	.Byte	0,'W
	.Word	SwtW
	.Byte	-1
	.SbTtl	EMT argument blocks
.LookUp	=:	1
.Write	=:	11
.CStat	=:	27
.SpFun	=:	32
.FProt	=:	43
	Protect	=:	1
	Physical=:	RtsPC+1
	.Even
CStatF:
	.Byte	Chan, .CStat
	.Word	CStat
CStatS:
	.Byte	SysChn, .CStat
	.Word	CStat
FProt:
	.Byte	Chan, .FProt
	.BlkW	1.
	.Word	Protect
LukUpF:
	.Byte	Chan, .LookUp
	.BlkW	1.
	.Word	0
LukUpL:
	.Byte	Chan, .LookUp
	.Word	R50LD+1
	.Word	0
	.BlkW	1
	.Word	PI LPERR-O$HANG+.>,O.HANG,NO
	.DRSET	LC,40,O.LC,NO
	.DRSET	CTRL,<BNE IGNORE-O$CTRL+.>,O.CTRL,NO
	.DRSET	TAB,<BEQ TABSET-O$TAB+.>,O.TAB,NO
	.DRSET	CSR,160000,O.CSR,OCT
	.DRSET	VECTOR,477,O.VEC,OCT
.IF NE	OFORM
	.DRSET	FORM,100000!LF,O.FF,NO
	.DRSET	LENGTH,1,O.LENG,NUM
	.DRSET	SKIP,-1,O.SKIP,NUM
.ENDC
.SBTTL	SET OPTION PROCESSING ROUTINES
.ENABL	LSB
O.WIDT:	MOV	R0,COLCNT
	MOV	R0,O$WIDT
1$:	CMP	R0,R3
	RTS	PC
O.CR:	MOV	(PC)+,R3
	 BEQ	RSTC-O$CR+.
	MOV	R3,O$CR
	RTS	PC
O.FORM0:MOV	(PC)+,R3
	 hysical
LukUpS:
	.Byte	SysChn, .LookUp
	.Word	DBlock+1
	.Word	0
	.BlkW	1
	.Word	Physical
SpFunL:
	.Byte	Chan, .SpFun
	.Word	0
	.Word	Handlr
	.BlkW	1.
	.Byte	377, Upd$Fn
	.Word	0
WritW:
	.Byte	SysChn, .Write
	.Word	LDStrt/256./2
	.Word	LDStrt
	.Word	256.*2
	.Word	0
	.SbTtl	Area to clear on startup
ClrLow:
ErrBuf:	.BlkW	2.
Flag$:	.BlkW	1.
FlagC:	.BlkW	1.
FlgNoC:	.BlkW	1.
ValueA:	.BlkW	1
ValueC:	.BlkW	1
CountL:	.BlkW	1
WarnRW:	.BlkW	1.
LDMem:	.BlkW	1.
HadErr:	.BlkW	1.
CmdPtr:	.BEQ	BLK0-O$FORM+.
	MOV	R3,O$FORM
	RTS	PC
O.HANG:	MOV	(PC)+,R3
	 BMI	RET-O$HANG+.
	MOV	R3,O$HANG
	RTS	PC
O.LC:	CLR	R3
	NOP
	MOV	R3,O$LC
	RTS	PC
O.CTRL:	MOV	(PC)+,R3
	 BNE	PRINTC-O$CTRL+.
	MOV	R3,O$CTRL
	RTS	PC
O.TAB:	MOV	(PC)+,R3
	 BEQ	HDWTAB-O$TAB+.
	MOV	R3,O$TAB
	RTS	PC
O.CSR:	MOV	R0,176
	MOV	R0,LPS
	ADD	#2,R0
	MOV	R0,LPB
	BR	1$
O.VEC:	MOV	R0,LPSTRT
	CMP	R3,R0
	RTS	PC
.IF NE	OFORM
O.FF:	MOV	(PC)+,R3
	 .WORD	FF
	MOV	R3,O$FF
	RTS	PC
O.LENG:	MOV	R0,O$LENG
	MOV	R0,LINCTR
	BR	1BlkW	1.
CmdCnt:	.BlkW	1.
DBlock	=:	ChnTo
.IrpC	.....1	<123>
Out'.....1:	.BlkW	5.
.EndR
.IrpC	.....1	<123456>
In'.....1:	.BlkW	4.
.EndR
O.Dev	=:	0
O.Name	=:	2
O.Type	=:	6
O.Size	=:	10
DStat:	.BlkW	4.
D.Stat	=:	0
D.HSiz	=:	2
D.EntP	=:	4
D.DSiz	=:	6
CStat:	.BlkW	6.
C.CSW	=:	0
C.SBlk	=:	2
C.Leng	=:	4
C.Used	=:	6
C.Unit	=:	10
C.DevN	=:	12
Table:	.BlkW	Units
	Sw.L	=:	100000
	Sw.W	=:	040000
	Sw.R	=:	020000
.Assume	Sw.L EQ Hd.Act
.Assume	Sw.R EQ Hd.RdO
CmdBuf:	.BlkB	100.
	.Even
ClrH$
O.SKIP:	TST	R0
	BEQ	2$
	INC	R0
2$:	MOV	R0,O$SKIP
	CMP	O$LENG,R0
	RTS	PC
.ENDC
.DSABL	LSB
.SBTTL	DRIVER ENTRY
	.DRBEG	LP
	MOV	LPCQE,R4
	ASL	Q$WCNT(R4)
	BEQ	LPDONE
	BCC	LPERR
RET:	BIS	#IE,@LPS
	RTS	PC
.SBTTL	INTERRUPT SERVICE
.ENABL	LSB
	.DRAST	LP,4,LPDONE
	MOV	LPCQE,R4
	BIT	#ERR!RDY,@(PC)+
LPS:	 .WORD	LP$CSR
O$HANG:	BMI	RET
	BEQ	RET
	CLR	@LPS
	.FORK	LPFBLK
	MOV	LPCQE,R4
	TST	@R4
O$FORM:	BEQ	BLK0
LPNEXT:	TSTB	@LPS
	BPL	RET
	ASLB	(PC)+
TABFLG:	 .WORD	0
	BNE	TAB
.IF NE	OFO
	.Asciz	""
	.Even
MsgALS:	.Word	Nothin
	.Asciz	<11.><Fatal$>"F-/A requires exactly 1 /L"
	.Even
MsgLuk:	.Word	Nothin
	.Asciz	<12.><Fatal$>"F-.LookUp for LD failed"
	.Even
MsgSpF:	.Word	Nothin
	.Asciz	<13.><Fatal$>"F-.SpFun to LD failed"
	.Even
MsgWri:	.Word	Nothin
	.Asciz	<14.><Fatal$>"F-Unable to update LD handler"
	.Even
MsgWWr:	.Word	Nothin
	.Asciz	<15.><Warn$>"W-Unable to update disk copy of LD handler"
	.Even
MsgHTB:	.Word	Nothin
	.Asciz	<16.><Fatal$>"F-Insufficient memory"
	.Eveni:
	.End	LDRun
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               RM
	MOV	(PC)+,R5
FFFLAG:	 .WORD	0
	BMI	DOFORM
.ENDC
IGNORE:	TST	Q$WCNT(R4)
	BEQ	LPDONE
.IF EQ	MMG$T
	MOVB	@Q$BUFF(R4),R5
	INC	Q$BUFF(R4)
.IFF
	JSR	PC,@$GTBYT
	MOV	(SP)+,R5
.ENDC
	INC	Q$WCNT(R4)
	BIC	#^C<177>,R5
	BEQ	IGNORE
.IF NE	OFORM
	ASRB	(PC)+
SKPFLG:	 .WORD	0
	BCC	1$
	CMPB	#FF,R5
	BEQ	IGNORE
1$:
.ENDC
	CMPB	R5,#SPACE
	BLO	CHRTST
	CMPB	R5,#'A!40
	BLO	PCHAR
	CMPB	R5,#'Z!40
	BHI	PCHAR
	SUB	(PC)+,R5
O$LC:	 .WORD	40
PCHAR:	DEC	COLCNT
	BLT	IGNORE
	ASLB	(PC)+
TABCNT:	 .WORD7
	B.1800	= 10
	B.2000	= 11
	B.2400	= 12
	B.3600	= 13
	B.4800	= 14
	B.7200	= 15
	B.9600	= 16
	B.192K	= 17
	CM.OM1	= 200
	CM.OM0	= 100
	CM.RTS	= 040
	CM.RE	= 020
	CM.FB	= 010
	CM.RXE	= 004
	CM.DTR	= 002
	CM.TXE	= 001
	HT	= 11
	LF	= 12
	FF	= 14
	CR	= 15
	CTRLQ	= 'Q-100
	CTRLS	= 'S-100
	SPACE	= 40
	.SBTTL	Tables for SET code
	.ASECT
	.IF NE LS$PC
	. = 120
SPEEDT:	.WORD	50.,	75.,	110.,	134.,	150.,	300.
	.WORD	600.,	1200.,	1800.,	2000.,	2400.,	3600.
	.WORD	4800.,	7200.,	9600.,	1920	1
	BEQ	RSTTAB
PRINTC:	MOVB	R5,@(PC)+
LPB:	 .WORD	LP$CSR+2
	BR	LPNEXT
CHRTST:	CMPB	#HT,R5
O$TAB:	BEQ	TABSET
	CMPB	#FF,R5
	BEQ	SENDFF
	CMPB	#CR,R5
O$CR:	NOP
	CMPB	#LF,R5
O$CTRL:	BNE	IGNORE
.IF NE	OFORM
	CMP	LINCTR,(PC)+
O$SKIP:	 .WORD	0
	BLE	SKIPFF
DOFORM:	DEC	LINCTR
	BGT	RSTC
NEWPAG:	MOV	(PC)+,(PC)+
O$LENG:	 .WORD	LP.PSZ
LINCTR:	 .WORD	LP.PSZ
	CLR	FFFLAG
.ENDC
RSTC:	MOV	(PC)+,(PC)+
O$WIDT:	 .WORD	LP.CSZ
COLCNT:	 .WORD	LP.CSZ
RSTTAB:	MOV	#1,TABCNT
	BR	PRINTC
TABSET:	MOV	TABCNT,T0.
	.WORD	0
ISPEED:	.WORD	M2.REQ!B.4800
IMR1:
IMR2:	.WORD	LS$CSR+4
ICMD:	.WORD	LS$CSR+6
	.ENDC
	.IIF GE <.-176> .ERROR
	.SBTTL	INSTALLATION CODE
	.ENABL	LSB
	. = 200
	NOP
	MOV	@#SYSPTR,R0
	BIT	#PRO$,CONFG2(R0)
	.IF EQ LS$PC
	BNE	30$
	.IFF
	BEQ	20$
	CMP	176,#173400
	BNE	30$
	TST	@ICMD
	MOVB	#<SB.1!CL.8!M1.REQ>,@IMR1
	MOVB	ISPEED,@IMR2
	MOVB	#<CM.RTS!CM.RE!CM.RXE!CM.DTR!CM.TXE>,@ICMD
	BR	20$
	.ENDC
	.IF NE LS$PC
I.SPEE:	MOV	PC,R1
	ADD	#SPEEDT-.,R1
10$:	TST	(R1)
	BEQ	30$
	CMP	R0ABFLG
TAB:	MOV	#SPACE,R5
	BR	PCHAR
HDWTAB:	ASLB	TABCNT
	BEQ	RSTTAB
	DEC	COLCNT
	BR	HDWTAB
.IF NE	OFORM
SKIPFF:	INC	SKPFLG
	BR	SENDFF
.ENDC
BLK0:	INC	@R4
SENDFF:	MOV	(PC)+,R5
O$FF:	 .WORD	FF
.IF NE	OFORM
	MOV	R5,FFFLAG
	BPL	NEWPAG
	BR	DOFORM
.IFF
	BR	RSTC
.ENDC
.DSABL	LSB
.SBTTL	OPERATION COMPLETE
LPERR:	BIS	#HDERR$,@-(R4)
LPDONE:	CLR	@LPS
	CLR	LPFBLK+2
	.DRFIN	LP
LPFBLK:	.WORD	0,0,0,0
	.DREND	LP
.END
                                                                             ,(R1)+
	BNE	10$
	SUB	PC,R1
	SUB	#<SPEEDT+2-.>,R1
	ASR	R1
	BIS	#M2.REQ,R1
	TST	@ICMD
	TST	@IMR1
	MOVB	R1,@IMR2
	MOV	R1,ISPEED
	.ENDC
20$:	TST	(PC)+
30$:	SEC
	RTS	PC
	.DSABL	LSB
I.SKIP:	TST	R0
	BEQ	10$
	INC	R0
10$:	MOV	R0,O$SKIP
	CMP	O$LENG,R0
	RTS	PC
I.VEC:	MOV	R0,LS$VTB
	ADD	#4,R0
	MOV	R0,LS$VTB+6
	CMP	R3,R0
	RTS	PC
	.IIF GE <.-400> .ERROR
	.SBTTL	SET OPTION PARAMETER TABLE
	.DRSET	CR,NOP,O.CR,NO
	.DRSET	CSR,2,O.CSR,OCT
	.DRSET	CTRL,<BNE IGNORE-O$CTRL+.>,O.CTRL,NO
	.DRSET	FOR.MCALL	.MODULE
.MODULE	LS,RELEASE=B03,VERSION=01

	.SBTTL	MACROS AND DEFINITIONS
	.DSABL	GBL
	.IIF NDF LS$PC	LS$PC	= 0
	.IIF NDF LS$PRI	LS$PRI	= 4
	.IIF NDF LS.CSZ	LS.CSZ	= 132.
	.IIF NDF LS.PSZ	LS.PSZ	= 66.
	.IF NE LS$PC
	LS$CSR	= 173400
	LS$VEC	= 220
	.ENDC
	.MCALL	.DRDEF,	.INTEN,	.MTPS
	F.BADR	= 2
	.DRDEF	LS,41,WONLY$,0,176500,300
	SYSPTR	= 54
	CONFG2	= 370
		PRO$	= 020000
	PSW	= 177776
	RC.IE	= 000100
	XC.IE	= 000100
	IC0DR	= 173200
	IC0CR	= IC0DR+2
	C.CSM	= 050
	C.SSM	= 070
	CM,100000!LF,O.FF,NO
	.DRSET	FORM0,NOP,O.FORM0,NO
	.IF NE TIM$IT
	.DRSET	HANG,NOP,O.HANG,NO
	.ENDC
	.DRSET	LC,40,O.LC,NO
	.DRSET	LENGTH,1,O.LENG,NUM
	.DRSET	SKIP,-1,O.SKIP,NUM
	.IF NE LS$PC
	.DRSET	SPEED,	NOP,	O.SPEE,	NUM
	.ENDC
	.DRSET	TAB,<BEQ TABSET-O$TAB+.>,O.TAB,NO
	.DRSET	VECTOR,477,O.VEC,OCT
	.DRSET	WIDTH,30.,O.WIDTH,NUM
	.SBTTL	SET OPTION PROCESSING ROUTINES
	.ENABL	LSB
O.SKIP:	BR	I.SKIP
	.IF NE LS$PC
O.SPEE:	BR	I.SPEE
	.ENDC
O.VEC:	BR	I.VEC
O.CR:	MOV	(PC)+,R3
	 BEQ	RSTC-O$CR+..CSI	= 110
	C.SSI	= 130
	RC.ID	= 005
	XC.ID	= 006
	LS$BUF	= LS$CSR
	LS$STA	= LS$CSR+2
	LS$MOD	= LS$CSR+4
	LS$CMD	= LS$CSR+6
	ST.DSR	= 200
	ST.FE	= 040
	ST.OE	= 020
	ST.PE	= 010
	ST.RD	= 002
	ST.TR	= 001
	M1.SBM	= 300
		SB.1	= 100
		SB.15	= 200
		SB.2	= 300
	M1.PT	= 040
	M1.PEN	= 020
	M1.CLM	= 014
		CL.5	= 000
		CL.6	= 004
		CL.7	= 010
		CL.8	= 014
	M1.REQ	= 002
	M2.REQ	= ^B10110000
	B.50	= 00
	B.75	= 01
	B.110	= 02
	B.134	= 03
	B.150	= 04
	B.300	= 05
	B.600	= 06
	B.1200	= 0
	MOV	R3,O$CR
	RTS	PC
O.FORM0:MOV	(PC)+,R3
	 BEQ	BLK0-O$FORM+.
	MOV	R3,O$FORM
	RTS	PC
O.LC:	CLR	R3
	NOP
	MOV	R3,O$LC
	RTS	PC
O.CTRL:	MOV	(PC)+,R3
	 BNE	PRINTC-O$CTRL+.
	MOV	R3,O$CTRL
	RTS	PC
O.TAB:	MOV	(PC)+,R3
	 BEQ	HDWTAB-O$TAB+.
	MOV	R3,O$TAB
	RTS	PC
O.CSR:	MOV	R0,176
	MOV	R0,RCSR
	ADD	R3,R0
	MOV	R0,RBUF
	ADD	R3,R0
	MOV	R0,XCSR
	.IF NE LS$PC
	MOV	R0,IMR1
	.ENDC
	ADD	R3,R0
	MOV	R0,XBUF
	.IF NE LS$PC
	MOV	R0,ICMD
	.ENDC
	CMP	R0,#160000
	RTS	PC
O.FF:	MOV	(PC)+,R3
	 .WORD	B	(PC)+
SKPFLG:	 .WORD	0
	BCC	10$
	CMPB	R5,#FF
	BEQ	IGNORE
10$:	CMPB	R5,#SPACE
	BLO	CHRTST
	CMPB	R5,#'A!40
	BLO	PCHAR
	CMPB	R5,#'Z!40
	BHI	PCHAR
	BIC	(PC)+,R5
O$LC:	 .WORD	0
PCHAR:	DEC	COLCNT
	BLT	IGNORE
	ASLB	(PC)+
TABCNT:	 .WORD	1
	BEQ	RSTTAB
PRINTC:	JSR	PC,PUTCHR
	JSR	PC,ENAOUI
20$:	RTS	PC
CHRTST:	CMPB	R5,#HT
O$TAB:	BEQ	TABSET
	CMPB	R5,#FF
	BEQ	SENDFF
	CMPB	R5,#CR
O$CR:	BEQ	RSTC
	CMPB	R5,#LF
O$CTRL:	BNE	PRINTC
	CMP	LINCTR,(PC)+
O$SKIP:	 .WORD	0
	BLE	SKIPFF
DOFORM:	DEC	LINC0,0,0
TJOBNM:	.WORD	0
	.WORD	177000+LS$CODE
	.WORD	-1
TCOMPL:	.WORD	0
	.ENDC
LIFBLK:	.WORD	0,0,0,0
	.DREND	LS
	.END
                                                                                                                                                                                                                                                                                                                                                                                                   FF
	MOV	R3,O$FF
	RTS	PC
O.LENG:	MOV	R0,O$LENG
	MOV	R0,LINCTR
	BR	1$
O.WIDT:	MOV	R0,COLCNT
	MOV	R0,O$WIDT
1$:	CMP	R0,R3
	RTS	PC
	.IF NE TIM$IT
O.HANG:	MOV	(PC)+,R3
	 BR	EXIT-O$HANG+.
	MOV	R3,O$HANG
	RTS	PC
	.ENDC
	.IIF GE <.-1000> .ERROR
	.DSABL	LSB
	.SBTTL	DRIVER ENTRY
	.ENABL	LSB
	.DRBEG	LS
	.IF NE LS$PC
	ASR	#1
	BCC	10$
	MOV	@#SYSPTR,R0
	BIT	#PRO$,CONFG2(R0)
	BEQ	10$
	MOV	SP,LSPCFG
	.ENDC
10$:	MOV	LSCQE,R4
	ASL	Q$WCNT(R4)
	BEQ	LSDONE
	BCC	LSERR
	JSR	PC,ENAINI
	.IF NE LS$TR
	BGT	RSTC
NEWPAG:	MOV	(PC)+,(PC)+
O$LENG:	 .WORD	LS.PSZ
LINCTR:	 .WORD	LS.PSZ
	CLR	FFFLAG
RSTC:	MOV	(PC)+,(PC)+
O$WIDT:	 .WORD	LS.CSZ
COLCNT:	 .WORD	LS.CSZ
	CLR	TABFLG
RSTTAB:	MOV	#1,TABCNT
	BR	PRINTC
TABSET:	MOV	TABCNT,TABFLG
TAB:	MOV	#SPACE,R5
	BR	PCHAR
HDWTAB:	ASLB	TABCNT
	BEQ	RSTTAB
	DEC	COLCNT
	BR	HDWTAB
SKIPFF:	INC	SKPFLG
	BR	SENDFF
BLK0:	INC	@R4
SENDFF:	MOV	#CR,R5
	O$FF = .+2
	MOV	#FF,FFFLAG
	BMI	RSTC
	CLR	LINCTR
	BR	RSTC
	.IIF GE <<O$FF-LSSTRT>-1000> .ERROR
	.DSABL	LSPC
	TST	LSPCFG
	BEQ	15$
	MOVB	#<C.SSM!XC.ID>,@#IC0CR
	MOVB	#<C.SSI!XC.ID>,@#IC0CR
15$:
	.ENDC
	TST	STALLF
	.IF EQ TIM$IT
	BEQ	20$
	.IFF
	BEQ	O$HANG
	.ENDC
	JSR	PC,ENAOUI
20$:	RTS	PC
	.DSABL	LSB
	.SBTTL	REGISTERS AND VECTOR TABLES
RCSR:
DBUF:	.WORD	LS$CSR
RBUF:
STAT:	.WORD	LS$CSR+2
XCSR:
MODE:	.WORD	LS$CSR+4
XBUF:
CMD:	.WORD	LS$CSR+6
	.DRVTB	LS,LS$VEC,LIINT
	.DRVTB	,LS$VEC+4,LSINT
	.SBTTL	INPUT INTERRUPT SERVICE
	.ENABL	LSB
	.DRAST	LI,LS$PRI,LSABT
	TST	LSCQE
	BEQ	30$
	JSR	PCB
	.IF NE TIM$IT
	.SBTTL	TIMER SUPPORT ROUTINES
TIMER:	TST	TCOMPL
	BNE	10$
	MOV	LSCQE,R4
	MOVB	Q$JNUM(R4),R4
	ASR	R4
	ASR	R4
	ASR	R4
	BIC	#^C<16>,R4
	MOV	R4,TJOBNM
	MOV	PC,R4
	ADD	#OFFLIN-.,R4
	MOV	R4,TCOMPL
	.FORK	LIFBLK
	.TIMIO	TBLOCK,0,60.*5
10$:	RTS	PC
CTIMER:	TST	TCOMPL
	BEQ	10$
	.FORK	LIFBLK
	.CTIMIO	TBLOCK
	CLR	TCOMPL
10$:	RTS	PC
OFFLIN: MOV	@SP,-(SP)
	.IF EQ MMG$T
	CLR	2(SP)
	.IFF
	MOV	@#PSW,2(SP)
	.ENDC
	.MTPS	#340
	.INTEN	0,PIC
	CLR	TCOMPL
	MOV	LSCQE,R4
	JMP	LSER,GETCHR
	BIC	#^C<177>,R4
	CMPB	R4,#CTRLQ
	BNE	20$
	.IF NE	TIM$IT
	JSR	PC,CTIMER
	.ENDC
10$:	MOV	SP,STALLF
	JSR	PC,ENAOUI
	BR	30$
20$:	CMPB	R4,#CTRLS
	BNE	30$
	JSR	PC,DISOUI
	CLR	STALLF
	.IF NE TIM$IT
O$HANG:	BR	EXIT
	JSR	PC,TIMER
	.ENDC
EXIT:
30$:	RTS	PC
	.DSABL	LSB
	.SBTTL	OPERATION COMPLETE
	.ENABL	LSB
LSABT:
	.IF NE TIM$IT
	TST	TCOMPL
	BEQ	LSDONE
	CALL	LSCLR
	.CTIMIO	TBLOCK
	CLR	TCOMPL
	.ENDC
	BR	LSDONE
LSERR:	BIS	#HDERR$,@-(R4)
LSDONE:	CALL	LSCLR
	.DRFIN	LS
LSCLR:	CLRR
	.ENDC
	.SBTTL	INTERRUPT ENABLE/DISABLE ROUTINES
ENAINI:
	.IF NE LS$PC
	TST	LSPCFG
	BNE	10$
	.IFTF
	BIS	#RC.IE,@RCSR
	RTS	PC
	.IFT
10$:	MOVB	#<C.CSM!RC.ID>,@#IC0CR
	RTS	PC
	.ENDC
DISINI:
	.IF NE LS$PC
	TST	LSPCFG
	BNE	10$
	.IFTF
	BIC	#RC.IE,@RCSR
	RTS	PC
	.IFT
10$:	MOVB	#<C.SSM!RC.ID>,@#IC0CR
	RTS	PC
	.ENDC
ENAOUI:
	.IF NE LS$PC
	TST	LSPCFG
	BNE	10$
	.IFTF
	BIS	#XC.IE,@XCSR
	RTS	PC
	.IFT
10$:	MOVB	#<C.CSM!XC.ID>,@#IC0CR
	RTS	PC
	.ENDC
DISOUI:
	.IF NE LS$PC
	TST	LSPCF	LIFBLK+F.BADR
	JSR	PC,DISOUI
	JSR	PC,DISINI
	RTS	PC
	.DSABL	LSB
	.SBTTL	OUTPUT INTERRUPT SERVICE
	.ENABL	LSB
	.DRAST	LS,LS$PRI,LSABT
	JSR	PC,DISOUI
	MOV	LSCQE,R4
	BEQ	20$
	TST	@R4
O$FORM:	BEQ	BLK0
	TST	STALLF
	BEQ	20$
	ASLB	(PC)+
TABFLG:	 .WORD	0
	BNE	TAB
	MOV	(PC)+,R5
FFFLAG:	 .WORD	0
	BNE	DOFORM
IGNORE:	TST	Q$WCNT(R4)
	BEQ	LSDONE
	.IF EQ	MMG$T
	MOVB	@Q$BUFF(R4),R5
	INC	Q$BUFF(R4)
	.IFF
	JSR	PC,@$GTBYT
	MOV	(SP)+,R5
	.ENDC
	INC	Q$WCNT(R4)
	BIC	#^C<177>,R5
	BEQ	IGNORE
	ASRG
	BNE	10$
	.IFTF
	BIC	#XC.IE,@XCSR
	RTS	PC
	.IFT
10$:	MOVB	#<C.SSM!XC.ID>,@#IC0CR
	RTS	PC
	.ENDC
	.SBTTL	CHARACTER GET/PUT ROUTINES
GETCHR:
	.IF NE LS$PC
	TST	LSPCFG
	BNE	10$
	.IFTF
	MOVB	@RBUF,R4
	RTS	PC
	.IFT
10$:	MOVB	@DBUF,R4
	RTS	PC
	.ENDC
PUTCHR:
	.IF NE LS$PC
	TST	LSPCFG
	BNE	10$
	.IFTF
	MOVB	R5,@XBUF
	RTS	PC
	.IFT
10$:	MOVB	R5,@DBUF
	RTS	PC
	.ENDC
	.SBTTL	IMPURE DATA AREAS
	.IF NE LS$PC
LSPCFG:	.WORD	0
	.ENDC
STALLF:	.WORD	XC.IE
	.IF NE 	TIM$IT
TBLOCK:	.WORD		(R5)+
	BMI	PREOF
.IF EQ	MMG$T
	MOVB	@R5,@-(R4)
	INC	(R4)+
	DEC	@R4
.IFF
	MOVB	@R5,-(SP)
	JSR	PC,@$PTBYT
	DEC	Q$WCNT(R4)
.ENDC
	BEQ	PCDONE
PCGORD:	BIS	#PINT,-(R5)
	RTS	PC
PREOF:	CLR	-(R5)
	.FORK	PCFBLK
1$:
.IF EQ	MMG$T
	CLRB	@-(R4)
	INC	(R4)+
	DEC	@R4
.IFF
	CLR	-(SP)
	JSR	PC,@$PTBYT
	DEC	Q$WCNT(R4)
.ENDC
	BNE	1$
PCDONE:	CLR	@#PC$CSR
.IF EQ	PR11$X
	CLR	@#PP$CSR
.ENDC
	CLR	PCFBLK+2
PCFIN:	.DRFIN	PC
PCFBLK:	.WORD	0,0,0,0
	.DREND	PC
.END
                                      +,(PC)+
DRETRY:	 .WORD	RKCNT
RETRY:	 .WORD	0
	MOV	RKCQE,R5
	MOV	@R5,R2
	MOV	Q$UNIT-1(R5),R4
	ASR	R4
	ASR	R4
	ASR	R4
	SWAB	R4
	BIC	#^C<DAUNIT>,R4
	BR	2$
1$:	ADD	R2,R4
	ASR	R2
	ASR	R2
	ADD	R3,R2
2$:	MOV	R2,R3
	BIC	#^C<17>,R3
	BIC	R3,R2
	BNE	1$
	CMP	#12.,R3
	BGT	3$
	ADD	#4,R3
3$:	ADD	R3,R4
	MOV	R4,DISKAD
AGAIN:	MOV	RKCQE,R5
	MOV	#CSIE!FNWRITE!CSGO,R3
	MOV	(PC)+,R4
RKCSR:	 .WORD	RKDA
	MOV	(PC)+,@R4
DISKAD:	 .WORD	0
	CMP	(R5)+,(R5)+
	.IF EQ	MMG$T
	MOV	(R5)+,-(R4)
	.IFF
	JSR	PC,.MCALL	.MODULE
.MODULE	RK,RELEASE=B03,VERSION=01

	.SBTTL	MACROS AND DEFINITIONS
	.MCALL	.DRDEF
	.DRDEF	RK,0,FILST$,4800.,177400,220
	RKDS	= RK$CSR
	RKER	= RKDS+2
	RKCS	= RKDS+4
	RKWC	= RKDS+6
	RKBA	= RKDS+10
	RKDA	= RKDS+12
	RKCNT	= 8.
	RKNREG	= 7
	DSID	= 160000
	DSDPL	=  10000
	DSRK05	=   4000
	DSDRU	=   2000
	DSSIN	=   1000
	DSSOK	=    400
	DSDRY	=    200
	DSREDY	=    100
	DSWPS	=     40
	DSSCOK	=     20
	DSSC	=     17
	ERDRE	= 100000
	EROVR	=  40000
	ERWLO	=  20000
	ERSKE	=  @$MPPTR
	MOV	(SP)+,-(R4)
	MOV	(SP)+,R0
	BIT	#1700,R0
	BNE	HERROR
	.ENDC
	MOV	(R5)+,-(R4)
	BEQ	7$
	BMI	5$
	NEG	@R4
	MOV	#CSIE!FNREAD!CSGO,R3
5$:
	.IF NE	MMG$T
	BIS	R0,R3
	.ENDC
	MOV	R3,-(R4)
6$:	RTS	PC
7$:	MOV	#CSIE!FNSEEK!CSGO,-(R4)
	BR	6$
	.IF NE ERL$G
SCSFLG:	.WORD	0
	.ENDC
	.SBTTL	INTERRUPT ENTRY POINT
	.DRAST	RK,5
	MOV	RKCSR,R5
	ADD	#RKER-RKDA,R5
	MOV	(R5)+,R4
	TST	RETRY
	BPL	NORMAL
	TST	@R5
	BMI	NORMAL
	BIT	#CSSCP,@R5
	BEQ	RTSPC
	.FORK	RKFBLK
RKRETR:	CLRB	RETRY+1
	BR.MCALL	.MODULE
.MODULE	NL,RELEASE=B03,VERSION=01

.MCALL	.DRDEF
	.DRDEF	NL,25,0,0,0,0
	.DRBEG	NL
	MOV	NLCQE,R5
	TST	6(R5)
	BMI	NLEXIT
	BIS	#EOF$,@-(R5)
	BR	NLEXIT
	RTS	PC
NLINT::
NLEXIT::.DRFIN	NL
	.DREND	NL
.END
                                                                                                                                                                                                                                                                                           10000
	ERPGE	=   4000
	ERNXM	=   2000
	ERDLT	=   1000
	ERTE	=    400
	ERNXD	=    200
	ERNXC	=    100
	ERNXS	=     40
	ERCSE	=      2
	ERWCK	=      1
	CSERR	= 100000
	CSHE	=  40000
	CSSCP	=  20000
	CSINHB	=   4000
	CSFMT	=   2000
	CSSSE	=    400
	CSRDY	=    200
	CSIE	=    100
	CSBA67	=     60
	CSBA16	=     20
	CSFUN	=     16
	CSGO	=      1
	FNRST	= 0*2
	FNWRITE	= 1*2
	FNREAD	= 2*2
	FNWCHK	= 3*2
	FNSEEK	= 4*2
	FNRCHK	= 5*2
	FNDRST	= 6*2
	FNWLK	= 7*2
	DAUNIT	= 160000
	DACYL	=  17.MCALL	.MODULE
.MODULE	PC,RELEASE=B03,VERSION=01

.SBTTL	EDIT HISTORY
.SBTTL	MACROS AND DEFINITIONS
.MCALL	.DRDEF
.IIF NDF PR11$X, PR11$X=0
.IIF NE PR11$X, PR11$X=1
.DRDEF	PC,7,<PR11$X*RONLY$>,0,177550,70
.QELDF
PCB	== PC$CSR+2
.IIF NDF PP$VEC, PP$VEC == PC$VEC+4
.IIF NDF PP$CSR, PP$CSR == PC$CSR+4
PPB	= PP$CSR+2
PRGO	= 1
PINT	= 101
	.SBTTL	DRIVER ENTRY
	.DRBEG	PC
	MOV	PCCQE,R4
	ASL	Q$WCNT(R4)
	BCS	PP
	BEQ	PCDONE
	MOV	#PC$CSR,R5
	TST	(R5)+
	BPL	PCGORD
	BIS	#EOF$,@-(R4)
	BR	PCFIN740
	DASUR	=     20
	DASC	=     17
	.SBTTL	SET OPTIONS
	.DRSET	CSR,	160000,	O.CSR,	OCT
	.DRSET	VECTOR,	500,	O.VEC,	OCT
	.DRSET	RETRY,	RKCNT,	O.RTRY,	NUM
	.IF NE ERL$G
	.DRSET	SUCCES,	-1,	O.SUCC,	NO
	.ENDC
	BTCSR	= <RKEND-RKSTRT>+<BOTCSR-RKBOOT>+1000
O.CSR:	CMP	R0,R3
	BLO	O.BAD
	MOV	R0,176
	MOV	PC,R1
	ADD	#BAREA-.+4,R1
	MOV	PC,R2
	ADD	#1000-.,R2
	MOV	R2,(R1)
	MOV	#BTCSR/1000,-(R1)
	TST	-(R1)
	MOV	R0,R3
	ADD	#RKDA-RKDS,R3
	MOV	R1,R0
	EMT	375
	BCS	O.BAD
	MOV	R3,<BTCSR&777>(R2)
	MOV	
PP:
.IF EQ	PR11$X
	BIS	#100,@#PP$CSR
	RTS	PC
	.DRVTB	PC,PC$VEC,PCINT
	.DRVTB	,PP$VEC,PPINT
	.DRAST	PP,4,PCDONE
	MOV	PCCQE,R4
	MOV	#PP$CSR,R5
	TST	(R5)+
	BMI	PPERR
.IF EQ	MMG$T
	ADD	#Q$WCNT,R4
	TST	@R4
	BEQ	PCDONE
	INC	@R4
	MOVB	@-(R4),@R5
	INC	@R4
.IFF
	TST	Q$WCNT(R4)
	BEQ	PCDONE
	INC	Q$WCNT(R4)
	JSR	PC,@$GTBYT
	MOVB	(SP)+,@R5
.ENDC
	RTS	PC
.ENDC
PPERR:	BIS	#HDERR$,@-(R4)
	BR	PCFIN
	.DRAST	PC,4,PCDONE
	MOV	PCCQE,R4
.IF EQ	MMG$T
	ADD	#Q$WCNT,R4
.ENDC
	MOV	#PC$CSR,R5
	TSTR1,R0
	INCB	1(R0)
	EMT	375
	BCS	O.BAD
	MOV	R1,R0
	DECB	1(R0)
	MOV	#1,2(R0)
	EMT	375
	BCS	O.BAD
	MOV	R3,RKCSR
O.GOOD:	TST	(PC)+
O.BAD:	SEC
	RTS	PC
O.VEC:	CMP	R0,R3
	BHIS	O.BAD
	BIT	#3,R0
	BNE	O.BAD
	MOV	R0,RKSTRT
	BR	O.GOOD
O.RTRY:	CMP	R0,R3
	BHI	O.BAD
	MOV	R0,DRETRY
	BNE	O.GOOD
	BR	O.BAD
	.IF NE ERL$G
O.SUCC:	MOV	#0,R3
	MOV	R3,SCSFLG
	BR	O.GOOD
	.ENDC
BAREA:	.BYTE	17,10
	.BLKW
	.BLKW
	.WORD	256.
	.WORD	0
	.IIF GT,<.-1000> .ERROR
	.SBTTL	DRIVER ENTRY
	.DRBEG	RK
	MOV	(PC)T+40
BOOT1:	JMP	@#BOOT-RKBOOT
	. = RKBOOT+210
READ:	MOV	#12.,R3
	BR	2$
1$:	ADD	#20,R3
2$:	SUB	#12.,R0
	BPL	1$
	ADD	R3,R0
	MOV	BOTCSR,R3
	BIC	#^C<DAUNIT>,@R3
	BIS	R0,@R3
	MOV	R2,-(R3)
	MOV	R1,-(R3)
	NEG	@R3
	MOV	#FNREAD!CSGO,-(R3)
3$:	TSTB	@R3
	BPL	3$
	TST	@R3
	BMI	BIOERR
	RTS	PC
	. = RKBOOT+574
BOOT:	MOV	#10000,SP
	MOV	@(PC)+,-(SP)
BOTCSR:	 .WORD	RKDA
	ROL	@SP
	ROL	@SP
	ROL	@SP
	ROL	@SP
	BIC	#^C<7>,@SP
	MOV	#2,R0
	MOV	#<4*400>,R1
	MOV	#1000,R2
	JSR	PC,READ
	MOV	#READ-RKBOOT2),@R2
	MOV	@SP,(PC)+
OPFLG:	.WORD	0
	BMI	3$
	TST	(PC)+
CTFLG:	.WORD	0
	BNE	7$
22$:	BITB	#100,@TTPS(R3)
	BNE	22$
	MOV	#'^,@TTPB(R3)
3$:
.IF EQ	PDT$OP
	BIS	#100,@TTPS(R3)
.IFF
	MOV	#100,@TTPS(R3)
.ENDC
7$:	TST	(SP)+
	BMI	6$
	TST	-(R2)
4$:	JSR	R4,GETCHR
	 BR	6$
	 BR	4$
5$:	JSR	PC,FINIS
6$:	MOV	(SP)+,R3
	MOV	(SP)+,R4
	MOV	(SP)+,R2
	RTS	PC
.DSABL	LSB
.ENABL	LSB
GETCHR:	MOV	R0,-(SP)
	CLR	CTFLG
	TST	OPFLG
	BLE	CHRET
	.TTINR
	BCS	CHRET
	TST	(R4)+
	CMP	R0,#'Z&77
	BEQ	11$
	MOVB,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	MOV	(SP)+,@#B$DEVU
	JMP	@#B$BOOT
	.DREND	RK
	.END
                                                                                                                                                                                                                                                                                                                                                                                                                                       	R0,@(R2)+
	INC	-2(R2)
	CMP	@R2,-(R2)
	BEQ	4$
	BR	CHRET
11$:	MOV	SP,CTFLG
1$:	CMP	(R2)+,@R2
	BHIS	3$
	CLRB	@-(R2)
	INC	@R2
	BR	1$
3$:	MOV	SP,(PC)+
EFFLG:	.WORD	0
4$:	TST	(R4)+
CHRET:	MOV	(SP)+,R0
	RTS	R4
.DSABL	LSB
RING:	.WORD	0,0,0,0
FINIS:	CLR	OPFLG
	CLR	RING+2
	MOV	PC,R4
	ADD	#TTCQE-.,R4
	TST	@R4
	BEQ	1$
	MOV	@#MONLOW,R2
	JSR	PC,@OFFSET(R2)
1$:	RTS	PC
	.DREND	TT
	.END
                                                                                                             .MCALL	.MODULE
.MODULE	TT,RELEASE=B03,VERSION=01

	.MCALL	.TTINR,.DRBEG,.DREND
MONLOW	= 54
OFFSET	= 270
TTPS	= 310
TTPB	= 312
TTDSIZ	= 0
TTSTS	= 4
EOF$	= 20000
.IF DF MMG$T
.IIF NE MMG$T, .ERROR
.ENDC
.IIF	NDF	MMG$T, MMG$T = 0
.IIF	NDF	ERL$G, ERL$G = 0
.IIF	NDF	TIM$IT,TIM$IT = 0
.IIF	NDF	RTE$M, RTE$M = 0
.IIF	NDF	PDT$OP, PDT$OP = 0
	.DRBEG	TT,0,TTDSIZ,TTSTS
.ENABL	LSB
TTINT:	BR	TTSET
	BR	TTRD
	TST	TTCQE
	BEQ	OIGNR
	JSR	R2,@PC
	ADD	#RING+2-.,R2
	MOV	R4,-(SP)
	TST	-2(R5)
	BEQ	1$
.MCALL .MODULE
.MODULE VM,RELEASE=B03,VERSION=01

	.ENABL	LC
	.NLIST	BEX
.SBTTL	General comments
.SBTTL	Macros and Definitions
	.MCALL	.DRDEF,.PRINT
.IIF NDF MMG$T,MMG$T = 0
.IIF EQ  MMG$T,MMVEC = 250
.IIF NE  MMG$T,MMVEC = 0
	.DRDEF	VM,47,FILST$,0,177572,MMVEC
MMSR0	= 177572
MMSR1	= 177574
MMSR2	= 177576
MMSR3	= 172516
UISDR0	= 177600
UISDR7	= 177616
UISAR0	= 177640
UISAR7	= 177656
KISDR0	= 172300
KISDR7	= 172316
KISAR0	= 172340
KISAR1	= 172342
KISAR7	= 172356
SYSPTR	= 54
CONFG2		AGAIN
NORMAL:	CMP	@R5,#CSRDY!CSIE!FNSEEK
	BEQ	RTSPC
	TST	@R5
	BPL	DONE
	.FORK	RKFBLK
	.IF NE	ERL$G
	BIT	#EROVR!ERWLO!ERNXM!ERNXD!ERNXC!ERNXS,R4
	BNE	RKERR
	MOV	PC,R5
	ADD	#RKRBUF-.,R5
	MOV	R5,R2
	MOV	RKCSR,R3
	ADD	#RKDS-RKDA,R3
	MOV	#RKNREG,R4
RKRREG:	MOV	(R3)+,(R5)+
	DEC	R4
	BNE	RKRREG
	MOV	DRETRY,R3
	SWAB	R3
	ADD	#RKNREG,R3
	MOV	RKCQE,R5
	MOVB	RETRY,R4
	DEC	R4
	JSR	PC,@$ELPTR
	MOV	RKCSR,R5
	ADD	#RKER-RKDA,R5
	MOV	(R5)+,R4
	.ENDC
RKERR:	MOV	#FNRST!CSGO,@R5
3$:	TSTB	@R5
	BPL		TST	WAITPR
	BNE	COMX
1$:	CLR	(PC)+
WAITPR:	 .WORD	1
	ADD	@R4,R4
	TST	@R4
	BMI	DON1
	TST	OPFLG
	BPL	COMX
TT2:	TST	20.(R4)
	BNE	DONE
2$:	TST	(R2)+
	BEQ	4$
	TSTB	@(R2)
	BEQ	3$
	MOV	R2,R5
	BR	COMX
3$:	INC	@R2
	DEC	-(R2)
	BR	2$
4$:	MOV	R4,R5
	ADD	#16.,R5
	BR	DONE
DON1:	MOV	TTCQE,R2
	CLR	10(R2)
DONE:	JSR	PC,FINIS
	MOV	PC,R2
	ADD	#RING+2-.,R2
	MOV	@SP,R4
	ADD	@R4,R4
	TST	@R2
	BNE	TT2
	CLRB	1(R4)
COMX:	MOV	(SP)+,R4
	MOV	(SP)+,R2
OIGNR:	TST	(R4)+
	RTS	R4
.DSABL	LSB
TTRD:	TST	T3$
	DECB	RETRY
	BEQ	HERROR
	BIT	#ERDRE!ERSKE,R4
	BEQ	RKRETR
	MOV	DISKAD,@RKCSR
	BIS	#100000,RETRY
	MOV	#CSIE!FNDRST!CSGO,@R5
RTSPC:	RTS	PC
HERROR:	MOV	RKCQE,R5
	BIS	#HDERR$,@-(R5)
	.IF NE	ERL$G
	BR	RKEXIT
DONE:	.FORK	RKFBLK
	TST	SCSFLG
	BNE	RKEXIT
	MOV	(PC)+,R4
	 .BYTE	377,RK$COD
	MOV	RKCQE,R5
	JSR	PC,@$ELPTR
	.IFF
DONE:
	.ENDC
RKEXIT:	CLR	RETRY
	.DRFIN	RK
RKFBLK:	.WORD	0,0,0,0
	.IF NE ERL$G
RKRBUF:	.BLKW	RKNREG
	.ENDC
	.SBTTL	BOOTSTRAP DRIVER
	.DRBOT	RK,BOOT1,READ
	. = RKBOOTCQE
	BEQ	OIGNR
	JSR	R2,@PC
	ADD	#RING+4-.,R2
	MOV	R4,-(SP)
	ADD	@R4,R4
	TST	@R4
	BMI	DON1
1$:	JSR	R4,GETCHR
	 BR	COMX
	 BR	1$
	 BR	DONE
.ENABL	LSB
TTSET:	JSR	R2,@PC
	ADD	#RING-.,R2
	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	@#MONLOW,R3
	MOV	TTCQE,R4
	CMP	(R4)+,(R4)+
	MOV	(R4)+,(R2)+
	MOV	@R4,@R2
	MOV	@R2,-(SP)
	BGT	1$
	BEQ	5$
	NEG	@R2
	MOV	SP,WAITPR
	BR	2$
1$:	TST	EFFLG
	BEQ	2$
	CLR	EFFLG
	MOV	TTCQE,R2
	BIS	#EOF$,@-(R2)
	BR	5$
2$:	ASL	(R2)+
	MOV	-(R4),(R2)+
	MOV	@R4,@R2
	ADD	-4(RRSET	BASE,1600,S.BASE,OCT
S.BASE:	CMP	R0,R3
	BLO	ERRRET
	CMP	R0,V.BASE
	BEQ	5$
	.IF EQ MMG$T
	BTBASE	= <VMEND-VMSTRT>+<B.BASE-VMBOOT>+1000
	MOV	PC,R1
	ADD	#BAREA-.+4,R1
	MOV	PC,R2
	ADD	#1000-.,R2
	MOV	R2,(R1)
	MOV	#BTBASE/1000,-(R1)
	TST	-(R1)
	MOV	R0,R3
	MOV	R1,R0
	EMT	375
	BCS	ERRRET
	MOV	R3,BTBASE&777(R2)
	MOV	R1,R0
	INCB	1(R0)
	EMT	375
	BCS	ERRRET
	MOV	R1,R0
	DECB	1(R0)
	MOV	#1,2(R0)
	EMT	375
	BCS	ERRRET
	MOV	R3,V.BASE
	MOV	R3,I.BASE
	.IFF
	MOV	R0,V.BASE
	MOV	R0,I.BASE
		(PC)+
110$:	SEC
	RTS	PC
	.DSABL	LSB
.ENDC
	.SBTTL	Driver entry
	.DRBEG	VM
	.ENABL	LSB
	ASR	#1
	BCC	40$
	MOV	@#SYSPTR,R0
	ADD	PNPTR(R0),R0
	MOV	R0,R1
20$:	CMP	(R0)+,#-1
	BNE	20$
	SUB	R1,R0
	TST	-(R0)
30$:	CMP	(R1)+,#<^RVM >
	BNE	30$
	ADD	R0,R1
	ADD	R0,R1
	ASR	R0
	ADD	R0,R1
	MOV	(R1),(PC)+
VMSIZE:	 .WORD	0
40$:
	.DSABL	LSB
.IF EQ	MMG$T
TEST2K:	MOV	@#SYSPTR,R0
	CMP	MEMSIZ(R0),#1600
	BHI	VMERR
	.ENABL	LSB
	MOV	VMCQE,R3
	MOV	(R3),R0
	CMP	R0,VMSIZE
	BHIS	VMERR
	MOV	Q$WCNT(R3).ENDC
	MOV	PC,R0
	ADD	#REINST-.,R0
	.PRINT
5$:	TST	(PC)+
ERRRET:	SEC
	RTS	PC
	.IF EQ MMG$T
BAREA:	.BYTE	17,10
	.BLKW
	.BLKW
	.WORD	256.
	.WORD	0
	.ENDC
	$$.SET	= .
	.SBTTL	SJ/FB Installation code
	. = 200
.IF EQ	MMG$T
	.ENABL	LSB
VMINST:	BR	5$
	BR	10$
5$:	MOV	@#SYSPTR,R1
	MOV	$MEMPT(R1),R0
	ADD	R1,R0
	MOV	$RAMSZ(R0),R1
10$:	SUB	I.BASE,R1
	BLOS	ERRRET
	CLC
	ROR	R1
	ASR	R1
	ASR	R1
	MOV	R1,54
	MOV	R3,-(SP)
	MOV	#V.TRP4,R0
	MOV	PC,R1
	ADD	#NXM-.,R1
	MOV	#PR7,@#PS
	MOV	@R0,-,R1
	BPL	1$
	NEG	R1
1$:	CLRB	R1
	SWAB	R1
	ADD	R1,R0
	CMP	R0,VMSIZE
	BHI	VMERR
	MOV	(R3)+,R2
	ASL	R2
	ASL	R2
	ASL	R2
	ADD	(PC)+,R2
V.BASE:	 .WORD	VM$BASE
	CLR	R4
	MOV	#UISAR0,R1
	MOV	#8.,R0
10$:	MOV	#77406,UISDR0-UISAR0(R1)
	MOV	#77406,KISDR0-UISAR0(R1)
	MOV	R4,KISAR0-UISAR0(R1)
	MOV	R4,(R1)+
	ADD	#200,R4
	SOB	R0,10$
	MOV	R2,-(R1)
	MOV	#37406,@#UISDR7
	MOV	#177600,@#KISAR7
	MOV	#160000,R5
	JSR	R0,M22SET
	 .WORD	MODE22
	MOV	#UMODE,@#PS
15$:	MOV	#1,@#MMSR0
	TST	(R3)+
	MOV	(R3)+,(SP)
	MOV	R1,(R0)+
	MOV	(R0)+,-(SP)
	MOV	@R0,-(SP)
	MOV	R1,(R0)+
	MOV	(R0)+,-(SP)
	MOV	#V.MPTY,R0
	MOV	@R0,-(SP)
	ADD	#MPT-NXM,R1
	MOV	R1,@R0
	CLR	R0
	MOV	#8.,R1
	MOV	#KISAR0,R3
15$:	CLC
	MOV	#AP$ACF,KISDR0-KISAR0(R3)
	BCS	25$
	MOV	R0,(R3)+
	ADD	#200,R0
	SOB	R1,15$
	BR	30$
NXM:	BIS	#1,2(SP)
MPT:	RTI
	.IIF	GT <. - 400>, .ERROR
	. = $$.SET
20$:	TST	(PC)+
25$:	SEC
	MOV	(SP)+,@#V.MPTY
	MOV	#V.TRP4+10,R0
	.REPT	4
	MOV	(SP)+,-(R0)
	.ENDR
	MOV	(SP)+,R3
	BIC	#PS,@#PS
	RTS	PC
30$:	MR0
	MOV	@R3,R4
	BMI	VMWRT
	BEQ	VMTRAP
.SBTTL	Perform I/O functions
	INC	R4
	ASR	R4
	BCC	20$
VMREAD:	MOV	(R5)+,(R0)+
20$:	MOV	(R5)+,(R0)+
	SOB	R4,VMREAD
	BR	VMTRAP
VMWRT:	NEG	R4
	INC	R4
	ASR	R4
	BCC	40$
30$:	MOV	(R0)+,(R5)+
40$:	MOV	(R0)+,(R5)+
	SOB	R4,30$
	MOVB	@R3,R4
	BEQ	VMTRAP
50$:	CLR	(R5)+
	DECB	R4
	BNE	50$
VMTRAP:	CLR	@#MMSR0
	CLR	@#PS
	JSR	R0,M22SET
	 .WORD	0
	BR	VMDONE
VMERR:	MOV	VMCQE,R5
	BIS	#HDERR$,@-(R5)
VMDONE:	.DRFIN	VM
.SBTTL	Abort and interrupt entry pointsOV	#177600,-(R3)
	MOV	#AP$ACF,@#UISDR0
	MOV	#PUMODE!PR7,@#PS
	MOV	#1,@#MMSR0
	MOV	#UISAR0,R3
	MOV	(PC)+,@R3
I.BASE:	 .WORD	VM$BASE
	BIS	#MODE22,@#MMSR3
35$:	CLR	@#MMSR0
	CLR	@#MMSR3
	BR	20$
	.DSABL	LSB
.ENDC
	.IIF GT <.-1000>, .ERROR
	.SBTTL	XM Installation code
.IF NE	MMG$T
	.ENABL	LSB
VMINST::NOP
	MOV	@#SYSPTR,R1
	MOV	$MEMPT(R1),R0
	ADD	R1,R0
	MOV	4(R0),R0
	ADD	R1,R0
	MOV	(PC)+,R1
I.BASE:	 .WORD	VM$BASE
10$:	CMP	(R0)+,#-1
	BEQ	110$
	TST	(R0)+
	BEQ	10$
	CMP	-2(R0),R1
	BHI	10$
	BR	VMTRAP
VMINT:	MOV	#160000,R5
	ADD	#100,@#UISAR7
	MOV	@#MMSR2,R1
	CMP	@R1,(PC)+
	 MOV	(R0)+,(R5)+
	BNE	60$
	TST	-(R0)
60$:	BIC	R5,@#MMSR0
	MOV	PC,R2
	ADD	#VMTRAP-.,R2
	CMP	R1,R2
	BNE	70$
	BIC	R5,2(SP)
70$:	MOV	R1,@SP
VMRTI:	RTI
	.DSABL	LSB
.SBTTL	Manipulate 22 bit mode.
M22SET:	MOV	#PR7,@#PS
	MOV	@#4,-(SP)
	MOV	PC,R2
	ADD	#VMRTI-.,R2
	MOV	R2,@#4
	MOV	(R0)+,@#MMSR3
	MOV	(SP)+,@#4
	CLR	@#PS
	RTS	R0
.ENDC
.SBTTL	XM I/O code.
.IF NE	MMG$T
XMIO:	MOV	@#SYSPTR,R4
	MOV	P1EXT(R4),= 370
	PROS$	= 020000
PNPTR	= 404
MEMSIZ	= 420
$MEMPT	= 430
	$RAMSZ	= -2
P1EXT	= 432
V.TRP4	= 4
V.MPTY	= 114
PS	= 177776
UMODE	= 140000
MODE22	= 000020
PUMODE	= 030000
AP$ACF	= 077406
LKCSR	= 177546
SWR	= 177570
PR7	= 000340
BLK18	= 384.
.IF NDF	VM$BASE
 .IF EQ	MMG$T
  VM$BASE = 1600
 .IFF
  VM$BASE = 10000
 .ENDC
.ENDC
	.SBTTL	Text area for set code
	.ASECT
	. = 120
REINST:	.ASCIZ	"?VM-W-Remove and reinstall this handler"
	.EVEN
	.IIF GT <.-174> .ERROR
	.SBTTL	Set code
	.D
	MOV	-(R0),-(SP)
	ADD	-(R0),@SP
	MOV	@SP,(PC)+
TOP:	 .WORD	0
	CMP	(SP)+,R1
	BHI	20$
	CMP	(R0)+,(R0)+
	BR	10$
20$:	MOV	R0,-(SP)
30$:	CMP	(R0)+,#-1
	BEQ	40$
	TST	(R0)+
	BR	30$
40$:	TST	@R0
	BEQ	50$
	ADD	#6,R0
	CMP	@R0,#-1
	BNE	40$
	TST	(SP)+
	BR	110$
50$:	MOV	TOP,@R0
	SUB	R1,(R0)+
	MOV	R1,(R0)+
	MOV	#<^RVM >,@R0
	MOV	-4(R0),R1
	MOV	(SP)+,R0
	SUB	R1,(R0)+
	BNE	60$
	CLR	@R0
	BR	60$
	.IIF	GT <. - 360>, .ERROR
	. = $$.SET
60$:	CLC
	ROR	R1
	ASR	R1
	ASR	R1
	MOV	R1,54
100$:	TST(PC)+
$BLKMV:	 .WORD	0
	SUB	#2,$BLKMV
	MOV	VMCQE,R4
	MOV	(R4),R0
	CMP	R0,VMSIZE
	BHIS	VMERR
	MOV	Q$WCNT(R4),R1
	BEQ	VMDONE
	BPL	1$
	NEG	R1
1$:	CLRB	R1
	SWAB	R1
	ADD	R1,R0
	CMP	R0,VMSIZE
	BHI	VMERR
	MOV	Q$WCNT(R4),-(SP)
	BMI	WRITE
$READ:	JSR	R0,SETBUF
	JSR	R0,SETDSK
	BR	DOIO
WRITE:	NEG	@SP
	JSR 	R0,SETDSK
	JSR	R0,SETBUF
DOIO:	MOV	(SP)+,R1
	MOV	(SP)+,R2
	TST	(SP)+
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	TST	(SP)+
	MOV	(SP)+,R5
	CALL	@$BLKMV
	MOV	VMCQE,R0
	MOV	Q$WCNT(R0),R1
	BPL	VMDONE
.MCALL .MODULE
.MODULE MTTEMT,RELEASE=B03,VERSION=01

.SBTTL
.SBTTL	********************************************
.SBTTL	*					   *
.SBTTL	*	 MULTI-TERMINAL EMT SERVICE	   *
.IF EQ	BF
.SBTTL	*	 FOR THE SINGLE JOB MONITOR	   *
.IFF
.IF EQ  MMG$T
.SBTTL	*   FOR THE FOREGROUND/BACKGROUND MONITOR  *
.IFF
.SBTTL	*      FOR THE EXTENDED MEMORY MONITOR     *
.ENDC
.ENDC
.SBTTL	*					   *
.SBTTL	********************************************
.SBTTL
.SBTTL	Definitions
DSECT	GLOBAL=NO
	DS	M.TSTS,,,	MOVB	R1,R1
	BEQ	VMDONE
	MOV	R4,Q$BUFF(R0)
	MOV	R3,Q$PAR(R0)
	MOV	R0,R4
10$:	CLR	-(SP)
	JSR	PC,@$PTWRD
	DECB	R1
	BNE	10$
	BR	VMINT
	RTS	PC
VMINT:	BR	VMDONE
VMERR:	MOV	VMCQE,R5
	BIS	#HDERR$,@-(R5)
VMDONE:	.DRFIN	VM
SETDSK:	MOV	#20000,-(SP)
	MOV	Q$BLKN(R4),-(SP)
	ASL	@SP
	ASL	@SP
	ASL	@SP
	ADD	(PC)+,@SP
V.BASE:	 .WORD	VM$BASE
	JMP	@R0
SETBUF:	MOV	Q$BUFF(R4),-(SP)
	MOV	Q$PAR(R4),-(SP)
	JMP	@R0
.ENDC
.SBTTL	Bootstrap read routine
.IF EQ	MMG$T
	.DRBOT	VM,BOOT1,READ
. = VMBOOT + 24GLOBAL
	DS	M.TST2,,,GLOBAL
	DS	M.TFIL,,BYTE,GLOBAL
	DS	M.FCNT,,BYTE,GLOBAL
	DS	M.TWID,,BYTE,GLOBAL
	DS	M.TSTW,,BYTE,GLOBAL
M.BLGH	= ..TEMP
.SBTTL	Multi-terminal EMT dispatcher
.PSECT	MTEMT$
.ENABL	LSB
M$TTIO::CMP	#MTTIMX,R4
	BLOS	8$
	MOVB	(R1)+,R3
	CMP	#TCBMAX,R3
	BLOS	7$
	CLR	R2
	BISB	@R1,R2
	MOV	R0,@SP
.IF NE	MMG$T
	MOV	R4,R1
	ASR	R1
	ADD	PC,R1
	MOVB	BLKSIZ-.(R1),R1
.ENDC
	CMP	#10*2,R4
	BEQ	1$
	ASL	R3
	ADD	PC,R3
	MOV	TCBLST-.(R3),R3
	TST	T.CSR(R3)
	BEQ	7$
	CMP	#5*2,R4
	BE0
BOOT1:	JMP	@#BOOT-VMBOOT
. = VMBOOT + 250
	.WORD	VMINT1-VMBOOT
	.WORD	340
	.ENABL	LSB
READ:	MOV	R1,-(SP)
	CLR	-(SP)
	TSTB	R1
	BEQ	2$
	INC	@SP
2$:	CLRB	R1
	SWAB	R1
	ADD	(SP)+,R1
	ADD	R0,R1
	CMP	R1,#BLK18
	BLO	5$
	MOV	#MODE22,@#MMSR3
5$:	MOV	(SP)+,R1
	ASL	R0
	ASL	R0
	ASL	R0
	ADD	(PC)+,R0
B.BASE:	 .WORD	VM$BASE
	CLR	R4
	MOV	#UISAR0,R3
	MOV	#8.,R5
10$:	MOV	#77406,UISDR0-UISAR0(R3)
	MOV	#77406,KISDR0-UISAR0(R3)
	MOV	R4,KISAR0-UISAR0(R3)
	MOV	R4,(R3)+
	ADD	#200,R4
	SOB	R5,10$
	MQ	5$
	CMP	#1*2,R4
	BEQ	1$
.IF NE	BF
	CMP	R5,T.OWNR(R3)
	BNE	6$
.IFF
	TST	T.OWNR(R3)
	BEQ	6$
.ENDC
1$:
.IF NE	MMG$T
	CMP	R4,#1*2
	BLOS	4$
	CMP	R4,#3*2
	BHI	3$
	MOV	R2,-(SP)
	BEQ	2$
	MOV	R2,R1
2$:	JSR	PC,ACHBKM
	MOV	(SP)+,R2
	BCS	9$
	BR	5$
3$:	CMP	R4,#6*2
	BLOS	5$
4$:	JSR	PC,ACHBKM
	BCS	9$
.ENDC
5$:	ADD	PC,R4
	MOV	MTTLST-.(R4),-(SP)
	ADD	PC,@SP
MTTDSP:	JSR	PC,@(SP)+
	BCC	10$
	EMTERR+0
	MOVB	R1,@#ERRBYT
10$:
.IF NE	BF
	JMP	EMTRTI
.IFF
	JMP	EMTDON
.ENDC
6$:	EMTERR+1
	BOV	R0,-(R3)
	MOV	#37406,@#UISDR7
	MOV	#177600,@#KISAR7
	MOV	#160000,R5
	BIS	#UMODE,@#PS
	BIS	#1,@#MMSR0
	INC	R1
	ASR	R1
	BCC	30$
20$:	MOV	(R5)+,(R2)+
30$:	MOV	(R5)+,(R2)+
	SOB	R1,20$
VMTRP1:	CLR	@#MMSR0
	BIC	#UMODE,@#PS
	CLC
	RETURN
VMINT1:	MOV	#160000,R5
	ADD	#100,@#UISAR7
	MOV	@#MMSR2,R3
	BIC	R5,@#MMSR0
	MOV	PC,R0
	ADD	#VMTRP1-.,R0
	CMP	R3,R0
	BNE	40$
	BIC	R5,2(SP)
40$:	MOV	R3,@SP
	RTI
BOOT:	MOV	#10000,SP
	MOV	#2,R0
	MOV	#<4*400>,R1
	MOV	#1000,R2
	JSR	PC,READ
	MOV	#READ-VMBR	10$
7$:	EMTERR+2
	BR	10$
8$:	EMTERR+3
	BR	10$
	EMTERR+4
	BR	10$
.IF NE	MMG$T
9$:	EMTERR+5
	BR	10$
.ENDC
.DSABL	LSB
.SBTTL	Multi-terminal dispatch tables
MTTLST:	.WORD	M$TTST-MTTDSP
	.WORD	M$TTGT-MTTDSP
	.WORD	M$TTIN-MTTDSP
	.WORD	M$TOUT-MTTDSP
	.WORD	M$RSTO-MTTDSP
	.WORD	M$ATCH-MTTDSP
	.WORD	M$DTCH-MTTDSP
	.WORD	M$PRNT-MTTDSP
	.WORD	M$STAT-MTTDSP
MTTIMX	= . - MTTLST
.IF NE	MMG$T
BLKSIZ:	.BYTE	M.BLGH
	.BYTE	M.BLGH
	.BYTE	1
	.BYTE	1
	.BYTE	0
	.BYTE	2
	.BYTE	0
	.BYTE	1
	.BYTEOOT,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	CLR	@#B$DEVU
	JMP	@#B$BOOT
	.DSABL	LSB
.ENDC
	.DREND	VM
	.END
                                                                                                                                                                                                                                                                                                                                                                                                                      	20
	.EVEN
.ENDC
.SBTTL	.MTSET - Set terminal characteristics EMT
M$TTST::MOV	R3,R1
	MOV	@R1,-(SP)
	BIC	#^C<REMOT$>,@SP
	MOV	(R0)+,R2
	BIC	#REMOT$,R2
	BIS	(SP)+,R2
	MOV	R2,(R1)+
	TST	T.STAT(R3)
	BPL	1$
	BIC	(PC)+,R2
	 .WORD	^C<TTSPC$!TTLC$!TCBIT$>
	MOV	@#JSW,-(SP)
	BIC	(PC)+,@SP
	 .WORD	<TTSPC$!TTLC$!TCBIT$>
	BIS	R2,@SP
	MOV	(SP)+,@#JSW
1$:	MOV	(R0)+,(R1)+
	MOV	(R0)+,(R1)+
	MOVB	@R0,@R1
	JSR	PC,TTRSEC
.IF NE	DZ11$N
	BIT	#DZ11$,T.STAT(R3)
	BEQ	3$
	MOV	@R3,R1
	BIC	#^C<LINSP$>,R1STAT(R3)
	TSTB	@R3
	BPL	1$
.ASSUME	PAGE$	EQ	200
	MOV	R4,-(SP)
	MOV	T.CSR(R3),R4
	JSR	PC,CTRL.Q
	MOV	(SP)+,R4
1$:
.IF EQ	BF
	TSTB	T.OCTR(R3)
	BNE	1$
	TST	T.STAT(R3)
	BMI	6$
.IFF
	JSR	PC,TTOEWT
	TST	T.STAT(R3)
	BMI	6$
.ENDC
	MOV	R3,R2
	ADD	#T.TTLC,R2
	CLR	(R2)+
	MOV	(R2)+,(R2)+
	CLR	(R2)+
	MOV	-4(R2),@R2
	BIC	#TCBIT$!TTSPC$!TTLC$,@R3
5$:	SPL	7
	CLR	T.OWNR(R3)
6$:
.IF NE	MAT$S
	CLR	T.AST(R3)
.ENDC
	SPL	0
	BIC	#RPALL$!WPALL$,T.CNF2(R3)
	BIC	#DTACH$,T.STAT(R3)
	RTS	PC
.SBTTL	P	QWAIT
5$:
.ENDC
	JSR	R4,$SYSWT
	 .WORD	TTOWT$
	CMPB	#TTYOUT-1,T.OCTR-T.ICTR(R2)
	JSR	PC,@(SP)+
.ENDC
	BR	1$
6$:	BIT	(R1)+,R0
	MOV	(SP)+,R5
	RTS	R1
.SBTTL	MTRSET	- Stop and detach all terminals attached to a job
MTRSET::JSR	R3,SAVE30
	MOV	R4,-(SP)
	MOV	R5,-(SP)
.IF NE	BF
	MOV	CNTXT,R5
.ENDC
	ADDR	TCBLST,R4
	MOV	#TCBMAX,R0
1$:	MOV	(R4)+,R3
	BEQ	2$
.IF EQ	BF
	TST	T.OWNR(R3)
	BEQ	2$
.IFF
	CMP	R5,T.OWNR(R3)
	BNE	2$
.ENDC
	JSR	PC,M$DTCH
2$:	DEC	R0
	BGT	1$
	MOV	(SP)+,R5
	MOV	(S
	BISB	T.CNF2(R3),R1
	ASLB	R1
	ASLB	R1
	ASLB	R1
	BISB	T.PUN(R3),R1
	BIS	#DZRCO$,R1
	MOV	T.CSR(R3),R2
.IF EQ	BF
2$:	TSTB	T.OCTR(R3)
	BNE	2$
.IFF
	JSR	PC,TTOEWT
.ENDC
	MOV	R1,DZ.LPR(R2)
3$:
.ENDC
	CLC
	RTS	PC
.SBTTL	.MTGET - Get status EMT
M$TTGT::MOV	R3,R1
	MOV	(R1)+,(R0)+
	MOV	(R1)+,(R0)+
	MOV	(R1)+,(R0)+
	MOVB	(R1)+,(R0)+
	MOVB	T.STAT+1(R3),@R0
	MOV	T.OWNR(R3),R2
	BEQ	MTTER1
.IF EQ	BF
	CLC
.IFF
	CMP	R5,R2
	BNE	MTTER4
.ENDC
	BIC	#CTRLC$,T.STAT(R3)
	RTS	PC
MTTER1:	MOV	#1,R.MTPRNT - Print message EMT
M$PRNT::MOV	R0,R2
1$:	MOVB	(R2)+,R0
	BEQ	2$
	CMPB	R0,#200
	BEQ	3$
	MOV	R2,-(SP)
	JSR	R1,MTTPUT
	 .WORD	0
	MOV	(SP)+,R2
	BR	1$
2$:	ADDR	PRCRLF,R2
	BR	1$
3$:	RTS	PC
PRCRLF:	.ASCII	<CR><LF><200>
	.EVEN
.SBTTL	.MTSTAT - Return multi-terminal system status EMT
M$STAT::MOV	#DLTCB-$RMON,(R0)+
.IF NE	BF
	MOV	I.CNSL(R5),@R0
.IFF
	MOV	I.CNSL,@R0
.ENDC
	SUB	@#SYSPTR,(R0)+
	MOV	#TCBMAX,@R0
	DEC	(R0)+
	MOV	#TCBSZ,(R0)+
	RTS	PC
.SBTTL	MTTIN - Single character inpu1
MTTERC:	SEC
	RTS	PC
.SBTTL	.MTIN - Character input EMT
.ENABL	LSB
M$TTIN::MOV	R0,R4
	MOV	R2,-(SP)
1$:	JSR	PC,MTTIN
	BCS	5$
	BNE	2$
	TST	T.STAT(R3)
	BPL	2$
.IF NE	BF
	TST	I.SCCA(R5)
.IFF
	TST	I.SCCA
.ENDC
	BEQ	4$
2$:	MOVB	R0,(R4)+
	INC	4(SP)
	DEC	@SP
	BGT	1$
3$:	TST	(SP)+
	RTS	PC
4$:	CMP	(SP)+,(SP)+
	JMP	GOEXIT
5$:	CLR	R1
	COM	(SP)+
	RTS	PC
.SBTTL	.MTOUT - Single character output EMT
M$TOUT::MOV	R0,-(SP)
	JSR	PC,TTRSEC
6$:	MOV	@SP,R0
	MOVB	@R0,R0
	MOV	R2,-(SP)
	JSR	R1,Mt
.ENABL	LSB
MTTIN::
.IF NE	BF
	MOV	R5,R1
	ADD	#I.TTLC,R1
.ENDC
	JSR	PC,TTRSEC
.IF NE	BF
	BMI	1$
.ENDC
	MOV	R3,R1
	ADD	#T.TTLC,R1
1$:	MOV	R1,R2
	BIT	#TTSPC$,@R3
	BEQ	2$
	ADD	#T.ICTR-T.TTLC,R2
2$:	TST	@R2
	BNE	3$
	BIT	#TCBIT$,@R3
	SEC
	BNE	7$
.IF NE	BF
	JSR	R4,$SYSWT
	 .WORD	TTIWT$
	CMP	@R2,#1
	JSR	PC,@(SP)+
.IFF
	BR	2$
.ENDC
3$:	ADD	#T.IGET-T.TTLC,R1
	.BR	MTTGET
.SBTTL	MTTGET - Get a character from the ring buffer
MTTGET::
	JSR	PC,GETPSW
	SPL	5
	INC	@R1
	CMP	(R1)+,@R1
TTPUT
	 .WORD	TCBIT$
	MOV	(SP)+,R2
	BCS	5$
	INC	@SP
	INC	4(SP)
	DEC	R2
	BGT	6$
	BR	3$
.DSABL	LSB
.SBTTL	.MTRCTO - Reset CTRL/O EMT
M$RSTO::JSR	PC,TTRSEC
.IF NE	BF
	BPL	1$
	CLRB	I.OCTR+1(R5)
	RTS	PC
1$:
.ENDC
	CLRB	T.OCTR+1(R3)
	RTS	PC
.SBTTL	.MTATCH - Attach to terminal EMT
.ENABL	LSB
M$ATCH::
.IF NE	BF
	MOV	R5,R2
	MOV	SP,R1
	ENSYS	4$
	BIT	#SHARE$,T.STAT(R3)
	BEQ	1$
	CMP	R3,I.CNSL(R2)
	BNE	3$
1$:	MOV	R2,R5
	MOV	T.OWNR(R3),R2
	BEQ	2$
	CMP	R5,R2
	BNE	3$
2$:	MOVB	I.JNUM(R5	BNE	4$
	SUB	#TTYIN,-2(R1)
4$:	MOVB	@-(R1),R0
	DEC	-(R1)
.IF NE	MAT$S
	BNE	5$
	JSR	PC,CLRIN
5$:
.ENDC
	JSR	PC,EOLTST
	BNE	6$
	DEC	T.TTLC-T.ICTR(R1)
MTTHOK::
6$:	JSR	PC,PUTPSW
	CMPB	#CTRLC,R0
	CLC
7$:	RTS	PC
.DSABL	LSB
.SBTTL	TTRSET - Reset terminal status bits
.ENABL	LSB
TTRSEC:	TST	T.STAT(R3)
	BPL	2$
TTRSET::MOV	@#JSW,R0
	BIC	(PC)+,R0
	 .WORD	^C<TTSPC$!TTLC$!TCBIT$>
	MOV	@R3,-(SP)
	BIC	(PC)+,@SP
	 .WORD	<TTSPC$!TTLC$!TCBIT$>
	BIS	R0,@SP
	MOV	(SP)+,@R3
.IF NE	BF
	MOV	@R3,I.TE),T.JOB(R3)
	MOV	R5,T.OWNR(R3)
	CLR	R1
3$:	RTS	PC
4$:	TST	R1
	BNE	MTTER4
.IFF
	MOV	R5,T.OWNR(R3)
.ENDC
.IF NE	MAT$S
.IF EQ	MMG$T
	MOV	R0,T.AST(R3)
.IFF
	MOV	R0,R2
	BEQ	5$
	JSR	PC,$RELOC
5$:	MOV	R2,T.AST(R3)
	MOV	R1,T.AST+2(R3)
.ENDC
.ENDC
	JMP	TTRSEC
.IF NE	BF
MTTER4:	MOV	I.JNUM(R2),2(SP)
	MOV	#4,R1
	BR	MTTERC
.ENDC
.DSABL	LSB
.SBTTL	.MTDTCH - Detach from a terminal EMT
M$DTCH::
.IF EQ	BF
	TST	T.STAT(R3)
	BMI	1$
.IFF
	BIT	#SHARE$,T.STAT(R3)
	BNE	5$
.ENDC
	BIS	#DTACH$,T.RM(R5)
.ENDC
	CMP	R3,BKCNSL
	BNE	1$
	MOV	@#TTFILL,T.TFIL(R3)
1$:	TST	T.STAT(R3)
2$:	RTS	PC
.DSABL	LSB
.SBTTL	MTTPUT - Single character output
MTTPUT::MOV	R5,-(SP)
1$:	MOV	@SP,R5
.IF NE	BF
	MOV	R5,R2
	ADD	#I.ICTR,R2
	TST	T.STAT(R3)
	BMI	2$
.ENDC
	MOV	R3,R2
	ADD	#T.ICTR,R2
2$:	MOV	T.CSR(R3),R4
.IF NE	SYT$K
3$:	TSTB	T.XFLG(R3)
	BNE	4$
.ENDC
	MOV	R2,-(SP)
	JSR	PC,TTOPT2
	MOV	(SP)+,R2
	BCC	6$
4$:	BIT	@R1,@R3
	BNE	6$
.IF NE	BF
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BEQ	5$
	ENSYS	3$
	JMT.TKB	==: 2
T.TPS	==: 4
T.TPB	==: 6
DL.DTR	==:      2
DL.RTS	==:      4
DL.DIE	==:     40
DL.SRD	==:   2000
DL.CAR	==:  10000
DL.CSD	==:  20000
DL.RNG	==:  40000
DL.DIN	==: 100000
DL.CHR	==:    377
DL.PAR	==:  10000
DL.FRM	==:  20000
DL.OVR	==:  40000
DL.ERR	==: 100000
.IF NE	DZ11$N
DZ.CSR	== 0
DZMNT$	==     10
DZCLR$	==     20
DZMSE$	==     40
DZRCV$	==    100
DZRDN$	==    200
DZTRL$	==   3400
DZSAE$	==  10000
DZSAL$	==  20000
DZTIE$	==  40000
DZTRD$	== 100000
DZ.RBUF	== 2
DZI	JSR	PC,INCHAR
.IF NE	BF
	MOV	(SP)+,@R3
.ENDC
10$:
.IF NE	HSR$B
 .IF NE	DZ11$N
	BIT	#DZ11$,T.STAT(R3)
	BNE	SCNOP
 .ENDC
11$:	DEC	HSRBCC
	BPL	5$
.ENDC
SCNOP::	RTS	PC
.DSABL	LSB
.IF NE	DL11$M
.SBTTL	DLMCTL - DL11E modem control routine
.ENABL	LSB
DLMCTL::BIT	#DL.RNG,R0
	BNE	DLRNG
	BIT	#DL.CAR,R0
	BNE	DLCAR
	BIT	#HNGUP$,T.STAT(R3)
	BNE	2$
	BIT	#<DL.CSD!DL.SRD>,R0
	BNE	2$
.IF NE	U.K.
..UKDL	== .
	BR	DLWCR1
.ENDC
	JSR	R1,QTIMR
	 .WORD	2*CLOCK
DLCRP1:: .WORD	DLWCAR
	BR	2$
DLCAR:CH$	==    377
DZRCL$	==   3400
DZPAR$	==  10000
DZFRM$	==  20000
DZOVR$	==  40000
DZDVD$	== 100000
DZ.LPR	== 2
DZLIN$	==      7
DZLEN$	==     30
DZSTP$	==     40
DZNPR$	==    100
DZEPR$	==    200
DZSPD$	==   7400
DZRCO$	==  10000
DZANS$	= DZST$P!DZLE$N!DZSP$D!DZRCO$
DZ.TCR	== 4
DZ.DTR	== 5
DZ.RNG	== 6
DZ.TDR	== 6
DZ.CAR	== 7
DZ.BRK	== 7
.ENDC
.SBTTL	DLIINT - DL11 input interrupt service
.ENABL	LSB
DLIINT::
TTIINT::
.IF GT	DL11$N-1
	GETPSW
	MOV	(SP)+,DLTMP
.ENDC
DLIHOK::
	JSR	TST	T.OWNR(R3)
	BEQ	2$
	JSR	PC,CTIMR
1$:	BIC	#HNGUP$,T.STAT(R3)
.IF NE	MAT$S
	JSR	PC,CARON
.ENDC
	BR	2$
DLWCAR::JSR	R5,SAVE52
	MOVB	R0,R3
	ADD	PC,R3
	MOV	TCBLST-.(R3),R3
DLWCR1:	MOV	T.CSR(R3),R4
	BIS	#HNGUP$,T.STAT(R3)
	BIC	#DL.DTR!DL.RTS,@R4
.IF NE	MAT$S
	JSR	PC,HNGON
.ENDC
	BR	2$
DLRNG:	TST	T.OWNR(R3)
	BEQ	2$
	JSR	PC,CTIMR
	BIS	#DL.DTR!DL.RTS,@R4
	BIT	#DL.CAR,@R4
	BNE	1$
	JSR	R1,QTIMR
	 .WORD	30.*CLOCK
DLCRP2:: .WORD	DLWCAR
2$:	RTS	PC
.DSABL	LSB
.ENDC
.IF NE	DL11$M!MTI$M
P)+,R4
	RTS	PC
.IF NE	BF
.SBTTL	TTOEWT - Wait for terminal output buffer to empty
TTOEWT::JSR	R4,$SYSWT
	 .WORD	TTOEM$
	MOVB	I.OCTR(R5),-(SP)
	TST	T.STAT(R3)
	BMI	1$
	MOVB	T.OCTR(R3),@SP
1$:	NEGB	(SP)+
	JSR	PC,@(SP)+
	RTS	PC
.ENDC
.END
                                                                                                                                                                                                                                                                    	R5,$INTEN
	 .WORD	^C<PR4>&PR7
TTIIN2::
.IF EQ	HSR$B
	JSR	R3,SAVE30
.IF GT	DL11$N-1
	MOV	DLTMP,R4
	BIC	#^C<17>,R4
	ASL	R4
	MOV	DLTBL(R4),R3
PDLTB0	== .-2
.IFF
	MOV	DLTBL,R3
.ENDC
	MOV	T.CSR(R3),R4
.IF NE	DL11$M
	BIT	#REMOT$,@R3
	BEQ	1$
	MOV	@R4,R0
	BMI	DLMCTL
.ASSUME	DL.DIN	EQ	100000
1$:
.ENDC
HKPC08 == .
	MOV	T.TKB(R4),R0
.ASSUME	.-HKPC08 EQ 4
	TSTB	T.CNF2(R3)
	BMI	8$
.ASSUME	RPALL$	EQ	200
	TST	R0
.ASSUME	DL.ERR	EQ	100000
	BPL	2$
	BIT	#DL.PAR!DL.FRM,R0
	BNE	SCNOP
2$:	BIC	#.MCALL .MODULE
.MODULE MTTINT,RELEASE=B03,VERSION=01

.SBTTL
.SBTTL	********************************************
.SBTTL	*					   *
.SBTTL	*     MULTI-TERMINAL INTERRUPT SERVICE     *
.IF EQ	BF
.SBTTL	*	 FOR THE SINGLE JOB MONITOR	   *
.IFF
.IF EQ	MMG$T
.SBTTL	*   FOR THE FOREGROUND/BACKGROUND MONITOR  *
.IFF
.SBTTL	*      FOR THE EXTENDED MEMORY MONITOR     *
.ENDC
.ENDC
.SBTTL	*					   *
.SBTTL	********************************************
.SBTTL
.SBTTL	Macro definitions
.MACRO	SPL	N
.^C<177>,R0
	BEQ	SCNOP
.IFF
.IF GT	DL11$N-1
	MOVB	DLTMP,R4
	BIC	#^C<17>,R4
	ASL	R4
PHSRRB	== .+2
	MOV	DLTBL(R4),R4
.IFF
	MOV	DLTBL,R4
.ENDC
.IF NE	DL11$M
	BIT	#REMOT$,@R4
	BEQ	3$
	MOV	@T.CSR(R4),R5
	BPL	3$
.ASSUME	DL.DIN	EQ	100000
	JSR	R3,SAVE30
	MOV	R4,R3
	MOV	R5,R0
	MOV	T.CSR(R3),R4
	BR	DLMCTL
3$:
.ENDC
	MOV	T.CSR(R4),R5
HKPC09 == .
	MOV	T.TKB(R5),-(SP)
.ASSUME	.-HKPC09 EQ 4
	MOV	HSRB,R5
	MOV	R4,(R5)+
	MOV	(SP)+,(R5)+
PHSRRT	== .+2
	CMP	R5,#HSRBUE
	BLO	4$
	MOV	HSRBRP,R5IIF NDF PSWMTI, PSW1ST:
.IF NE	.-PSW1ST
	 .WORD	PSWMTI
.IFF
	 .WORD	PSWLST
.ENDC
PSWMTI	== .-2
.IF EQ	N
	 .WORD	-2
.IFF
	 .WORD	N*40,PS
.ENDC
.ENDM	SPL
.MACRO	GETPSW
.IIF NDF PSWMTI, PSW1ST:
.IF NE	.-PSW1ST
	 .WORD	PSWMTI
.IFF
	 .WORD	PSWLST
.ENDC
	 .WORD	-4
PSWMTI	== .-4
.ENDM	GETPSW
.MACRO	PUTPSW
.IIF NDF PSWMTI, PSW1ST:
.IF NE	.-PSW1ST
	 .WORD	PSWMTI
.IFF
	 .WORD	PSWLST
.ENDC
	 .WORD	-6
PSWMTI	== .-4
.ENDM	PUTPSW
.SBTTL	Definition of symbols
.PSECT	MTINT$
T.TKS	==: 0

4$:	MOV	R5,HSRB
	INC	HSRBCC
	BNE	SCNOP
FRQHOK::
	JSR	R5,$FORK
	 .WORD	TIFBLK-.
5$:	MOV	HSRBGP,R1
	MOV	(R1)+,R3
	MOV	(R1)+,R0
	CMP	R1,HSRBEP
	BLO	6$
	MOV	HSRBRP,R1
6$:	MOV	R1,HSRBGP
	MOV	T.CSR(R3),R4
	TSTB	T.CNF2(R3)
	BMI	8$
.ASSUME	RPALL$	EQ	200
	TST	R0
	BPL	7$
.ASSUME	DL.ERR	EQ	100000
	BIT	#DL.PAR!DL.FRM,R0
	BNE	11$
7$:	BIC	#^C<177>,R0
	BEQ	11$
.ENDC
8$:	JSR	PC,INPTR
	BEQ	10$
INTCOM:
.IF NE	BF
	MOV	@R3,-(SP)
	BIT	#SHARE$,T.STAT(R3)
	BEQ	9$
	MOV	I.TERM(R5),@R3
9$:
.ENDC

	.WORD	0,0
	.WORD	177444
	.WORD	-1
DLTCOM:	.WORD	0
DLTMCP::.WORD	DLMPOL
.ENDC
.SBTTL	INPTR and OUTPTR - Ring pointer set up subroutines
.ENABL	LSB
INPTR:
.IF NE	BF
	MOV	TTIUSR,R5
.ENDC
	BIT	#DTACH$,T.STAT(R3)
	BEQ	1$
	SEZ
	RTS	PC
OUTPTR:
.IF NE	BF
	MOV	TTOUSR,R5
1$:	BIT	#SHARE$,T.STAT(R3)
	BNE	2$
	MOV	T.OWNR(R3),R5
	BEQ	4$
	TST	T.STAT(R3)
.ASSUME	CONSL$	EQ	100000
	BPL	3$
2$:	MOV	R5,R1
	ADD	#I.ICTR,R1
	RTS	PC
.IFF
1$:	TST	T.OWNR(R3)
	BEQ	4$
.ENDC
3$:	MOV	R3,R1
	ADD	#T.ICTRLSB
.IF NE	BF
CTLCHI	B
	JSR	PC,SWICTX
	MOV	BCNTXT,R2
XCOM:	MOV	R2,TTIUSR
.IF NE	SYT$K
	TSTB	XFLG
	BNE	TTOSET
.ENDC
	CMP	R2,TTOUSR
	BEQ	2$
TTOSET::MOV	R2,TTOUSR
	MOV	I.TID(R2),T.TID(R3)
	JMP	TTOENB
CTLCHI	F
	JSR	PC,SWICTX
	MOV	FCNTXT,R2
	BEQ	1$
.IF NE	SYT$K
	CMP	I.CNSL(R2),R3
	BNE	1$
.ENDC
	BIT	#NORUN$,I.BLOK(R2)
	BEQ	XCOM
1$:	JSR	R5,ECHO
	 .ASCII	"F?"
	JMP	ECHOCL
.ENDC
ALT:	MOV	#ESCAPE,R0
BTINC3:	BR	TTINC3
CTLCHI	D
	MOV	R1,R2
	ADD	#T.OCTR-T.ICTR,R2
	CLRB	(R2)+
	MOVB	@R2,-,R1
4$:	RTS	PC
.DSABL	LSB
.SBTTL	Control character input dispatch table
.MACRO	CTLCHI	C
.NCHR	......,<C>
.IF GT	......-1
INP'C::
.=C*2+TTITBL
	.WORD	INP'C-TTIBAS
.=INP'C
.SBTTL	Process C input
.IFF
CTRL.'C::
.=''C-100*2+TTITBL
	.WORD	CTRL.'C-TTIBAS
.=CTRL.'C
.SBTTL	Process CTRL/'C input
.ENDC
.ENDM	CTLCHI
	.WORD	ALT-TTIBAS
	.WORD	ALT-TTIBAS
	.WORD	RUB-TTIBAS
TTITBL:
.REPT	'Z+1-100
	.WORD	TTINCC-TTIBAS
.ENDR
.SBTTL	INCHAR - Input character processing
.ENABL	LSB
INCHAR::
.IF NE(SP)
	CLRB	(R2)+
	MOV	@R2,-4(R2)
	JSR	R5,ECHO0C
	 .ASCII	<CR><LF>
	COMB	@SP
	MOVB	(SP)+,T.OCTR+1-T.ICTR(R1)
	BEQ	2$
.IF NE	BF
	JSR	R4,UNBLOK
	 .WORD	TTOWT$!TTOEM$
.ENDC
2$:	RTS	PC
.DSABL	LSB
CTLCHI	C
.ENABL	LSB
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BEQ	2$
1$:	JSR	R5,ECHO0C
	 .ASCII	<CR><LF>
	CLR	T.XFLG(R3)
	RTS	PC
2$:
.ENDC
	TST	@R2
	BPL	3$
.IF NE	BF
	TST	I.SCCA(R5)
.IFF
	TST	I.SCCA
.ENDC
	BEQ	4$
3$:	BIT	#TTSPC$,@R3
	BNE	5$
4$:	JSR	R5,ECHO0C
	 .ASCII	<CR><LF>
5$:	CMPB	R0,T.PTT	SCCA$G
	CMPB	R0,#CTRLC
	BNE	10$
	BITB	#CC$ALL,INDSTA
	BEQ	10$
.IF NE	BF
	ADDR	BKGND,SP
	CMP	R5,(SP)+
	BNE	10$
.ENDC
	RTS	PC
10$:
.ENDC
	TSTB	T.CNF2(R3)
.ASSUME	RPALL$	EQ	200
	BMI	TTINC3
	BIT	#TTLC$,@R3
	BNE	1$
	CMPB	R0,#'A!40
	BLO	1$
	CMPB	R0,#'Z!40
	BHI	1$
	NOP
1$:	CMP	R0,#'Z-100
	BLOS	2$
..ALT	== .+2
	CMP	R0,#177
	BLO	TTINCC
	SUB	#200,R0
2$:	ASL	R0
TTITPT	== .+2
	MOV	TTITBL(R0),-(SP)
	ADD	PC,@SP
TTIBAS:
	ASR	R0
	MOV	R3,R2
	ADD	#T.STAT,R2
	JMP	@(SP)+
CTLCHI	CR
.IF NI(R3)
	BNE	BTINC3
	TST	T.STAT(R3)
.ASSUME	CONSL$	EQ	100000
	BPL	7$
.IF NE	BF
	MOV	I.SCCA(R5),R2
	BNE	8$
	TST	I.JNUM(R5)
	BNE	6$
	BIS	#IFABRT,STATWD
.IFF
	MOV	I.SCCA,R2
	BNE	8$
	BIS	#IFABRT!IFCTLC,STATWD
.ENDC
	BICB	#<LN$IND!IN$IND!IN$RUN>,INDSTA
	TST	EXTFLG
	BNE	BTINC3
.IF NE	BATC$H
	MOV	$ENTRY+BA.NUM,R2
	BEQ	6$
	CLR	6(R2)
.ENDC
6$:	JMP	$RQABT
7$:	BIS	#CTRLC$,T.STAT(R3)
	BR	9$
8$:
.IF NE	MMG$T
	MOV	@#KISAR1,-(SP)
	MOV	I.SCCA+2(R5),@#KISAR1
.ENDC
	BIS	#100000,@R2
.IF NE	MMG$T.SBTTL	Mark time and cancel mark time routines
QTIMR:	JSR	R5,SAVE52
.IF NE	BF
	MOV	T.JOB(R3),T.TBLK+C.JNUM(R3)
.ENDC
	ADD	#T.TBLK,R3
	CLR	(R3)+
	MOV	(R1)+,(R3)+
	MOV	(R1)+,C.COMP-C.LINK(R3)
	MOV	R1,12(SP)
	JMP	TIMIO
CTIMR:	JSR	R5,SAVE52
	MOV	T.TBLK+C.SEQ(R3),R0
.IF NE	BF
	MOVB	T.JOB(R3),R2
.ENDC
	MOV	#-1,R1
	CLR	R5
	JMP	CMARKT
.ENDC
.IF NE	MTI$M
.SBTTL	DLMPOL - Routine to poll each DL11
DLMPOL::JSR	R5,SAVE52
	CLR	R2
PDLCS1	== .+2
1$:	MOV	DLTBL(R2),R3
	MOV	T.CSR(R3),R4
	BEQ	3$
	E	SYT$K
	TSTB	T.XFLG(R3)
	BNE	11$
.ENDC
	JSR	PC,TTINCC
	MOV	#LF,R0
	BR	TTINC3
TTINCC:
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BEQ	12$
11$:	JMP	XPROC
12$:
.ENDC
	BIT	#TTSPC$,@R3
	BNE	TTINC3
	CMPB	T.PTTI(R3),#RUBOUT
	BNE	TTINC3
	JSR	R5,ECHO
	 .ASCII	"\"<0>
TTINC3:	CMP	@R1,#TTYIN
	BGE	7$
	INC	@R1
	INC	-(R1)
	CMP	@R1,6(R1)
	BNE	3$
	SUB	#TTYIN,@R1
3$:	MOVB	R0,@(R1)+
	JSR	PC,EOLTST
	BNE	4$
	INC	T.TTLC-T.ICTR(R1)
.IF NE	BF
	CMP	TTHIUS,R5
	BNE	4$
.IFF
	TST	TTHIUS
	BEQ	4$
.ENDC
	TST	T.STBIT	#REMOT$,@R3
	BEQ	2$
	BIS	#DL.DIE,@R4
2$:
HKPC01 == .
	BIS	#IENABL,@R4
.ASSUME	T.TKS	EQ	0
.ASSUME .-HKPC01 EQ 4
	BIT	#INEXP$,T.STAT(R3)
	BEQ	3$
	INC	T.RTRY(R3)
	CMP	#4,T.RTRY(R3)
	BNE	3$
	CLR	T.RTRY(R3)
	CMP	@T.VEC(R3),@#SYSPTR
	BLO	3$
HKPC02 == .
	BIC	#IENABL,T.TPS(R4)
	BIS	#IENABL,T.TPS(R4)
.ASSUME	.-HKPC02 EQ 14
3$:	TST	(R2)+
	CMP	R2,#DL11$N*2
	BLO	1$
DLTIMR:	MOV	DLTMCP,DLTCOM
	JSR	R5,$TIMIO
	 .WORD	DLTMBK - .
	 .WORD	0
	 .WORD	0
	 .WORD	CLOCK/2
	RTS	PC
DLTMBK:	.WORD	0,0AT(R3)
	BPL	4$
	JSR	PC,TTHIN
	MOV	T.CSR(R3),R4
4$:	MOVB	R0,T.PTTI(R3)
	TSTB	T.CNF2(R3)
	BMI	5$
	BIT	#TTSPC$,@R3
	BNE	5$
	JSR	PC,TTOPT3
.IF NE	MAT$S!BF
	TST	T.TTLC-T.ICTR(R1)
.ENDC
.IF EQ	MAT$S
	BEQ	6$
.IFF
	BNE	5$
	JSR	PC,CLRIN
	BR	6$
.ENDC
5$:
.IF NE	MAT$S
	JSR	PC,SETIN
.ENDC
.IF NE	BF
	JSR	R4,UNBLOK
	 .WORD	TTIWT$
.ENDC
6$:	RTS	PC
7$:	TSTB	T.CNF2(R3)
	BMI	6$
	MOVB	R0,T.PTTI(R3)
DING:	MOV	#BELL,R0
	JMP	TTOPT4
.DSABL	LSB
.SBTTL	INPUT CONTROL CHARACTER PROCESSING
.ENABL	
	BR	9$
2$:	CLRB	T.XPRE(R3)
	BR	ECHOCL
.ENDC
3$:	ADD	#T.PTTI-T.STAT,R2
4$:	TST	@R1
	BEQ	11$
	MOVB	@-(R1),R0
	JSR	PC,EOLTST
	BEQ	10$
	CMP	@R1,-2(R1)
	BNE	5$
	ADD	#TTYIN,@R1
5$:	DEC	(R1)+
	DEC	@R1
6$:	TST	@SP
	BPL	4$
	MOV	@R3,(SP)+
.ASSUME	BKSP$	EQ	100000
	BPL	8$
7$:	JSR	R5,ECHO
	 .ASCII	<BS><SPACE>
	MOV	#BS,R0
.IF EQ SYT$K
	BR	TTOPT4
.IFF
	JMP	TTOPT4
.IFTF
8$:	CMPB	@R2,#RUBOUT
.IFT
	BEQ	TTOPT3
.IFF
	BEQ	91$
.IFTF
	MOVB	#RUBOUT,@R2
9$:	JSR	R5,ECHO
	 .ASCII	"\"<0>
.IFT
	B,200
	.EVEN
.ENDC
.SBTTL	Character output subroutines
.ENABL	LSB
.SBTTL	ECHOR0 - Print a control character in "^x" form
ECHOR0:	CMPB	#16,R0
	BNE	100$
	JSR	R5,ECHO
	.BYTE	16,0
	RTS	PC
100$:	CMPB	#17,R0
	BNE	101$
	JSR	R5,ECHO
	.BYTE	17,0
	RTS	PC	
101$:	MOV	R0,-(SP)
	MOV	#UPAROW,R0
	JSR	PC,TTOPT3
1$:	MOV	(SP)+,R0
	BIS	#100,R0
	.BR	TTOPT3
.SBTTL	TTOPT3 - Print a character, check for special changes:
TTOPT3::CMPB	#CTRLC,R0
	BEQ	7$
	CMPB	#ESCAPE,R0
	BNE	2$
	MOV	#DOLLAR,R0
2$:	CMPB	#4R	TTOPT3
.IFF
91$:	JMP	TTOPT3
.ENDC
10$:	TST	(R1)+
11$:	CLRB	@R2
	TST	(SP)+
	BPL	12$
	TST	@R3
	BPL	ECHOCL
	RTS	PC
12$:	JSR	R5,ECHO
	 .ASCII	"^U"
ECHOCL:	JSR	R5,ECHO
	 .ASCII	<CR><LF>
	RTS	PC
.DSABL	LSB
CTLCHI	S
	TSTB	@R3
.ASSUME	PAGE$	EQ	200
	BPL	JTINCC
	BIS	#PAGE$,@R2
	RTS	PC
CTLCHI	Q
	BIC	#PAGE$,T.STAT(R3)
	TSTB	@R3
	BPL	JTINCC
.IF NE	DZ11$N
	BIT	#DZ11$,T.STAT(R3)
	BEQ	1$
	MOVB	T.PUN(R3),R2
PBMSK1	== .+2
	BICB	BITMSK(R2),DZ.TCR(R4)
	BR	DZOENB
1$:
.ENDC
HKPC03 == .
	CL0,R0
	BLOS	TTOPT4
	CMPB	#15,R0
	BLO	ECHOR0
	CMPB	#11,R0
	BHI	ECHOR0
.SBTTL	TTOPT4 - Print a character, no checking for specials
TTOPT4::MOV	R1,R2
.SBTTL	TTOPT2 - Print a character, no checking for specials
TTOPT2::ADD	#T.OCTR-T.ICTR,R2
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BNE	3$
.ENDC
	TST	@R2
	BMI	7$
3$:	TST	T.CNF2(R3)
	BMI	8$
.ASSUME	WPALL$	EQ	100000
	BICB	#^C<177>,R0
8$:	CMPB	#TTYOUT-1,@R2
	BLO	7$
.IF NE	MAT$S
	JSR	PC,RGFUL
.ENDC
	CMP	4(R2),-(R2)
	BHI	4$
	SUB	#TTYOUT,@R2
4$:	MOVB	RR	T.TPS(R4)
.ASSUME	.-HKPC03 EQ 4
	BR	DLOENB
.IF NE	BF
.ENABL	LSB
SWICTX:	BIT	#SHARE$,T.STAT(R3)
	BEQ	1$
	BIT	#FBTTY$,@R3
	BEQ	1$
.IF NE	SYT$K
	MOV	T.XFLG(R3),(PC)+
XFLG:	.WORD	0
	CLR	T.XFLG(R3)
.ENDC
	RTS	PC
1$:	TST	(SP)+
.ENDC
JTINCC:	JMP	TTINCC
.DSABL	LSB
.IF NE	SYT$K
CTLCHI	X
	JSR	PC,SWICTX
	ADD	#T.XFLG-T.STAT,R2
	MOV	#201,(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	MOV	TTIUSR,TTOUSR
	BR	TTOENB
.SBTTL	XPROC - Process characters in ^X sequence
XPROC::	MOV	R3,R5
	A0,@(R2)+
	INC	-(R2)
	INC	2(R2)
	BR	TTOENB
.SBTTL	ECHO0C - Print control character, then 1 or 2 constant characters
ECHO0C:	MOV	R0,-(SP)
	JSR	PC,ECHOR0
	BR	5$
.SBTTL	ECHO - Print one or two constant characters
ECHO:	MOV	R0,-(SP)
5$:	MOVB	(R5)+,R0
	JSR	PC,TTOPT4
	MOVB	(R5)+,R0
	BEQ	6$
	JSR	PC,TTOPT4
6$:	MOV	(SP)+,R0
	RTS	R5
7$:	RTS	PC
.DSABL	LSB
.SBTTL	EOLTST - Test for end of line
EOLTST::CMPB	#LF,R0
	BEQ	1$
	CMPB	#'Z-100,R0
	BEQ	1$
	CMPB	#'C-100,R0
1$:	RTS	PC
.SBTTL	DLOINT - DL1DD	#T.XPRE,R5
	CMPB	#RUBOUT,@R5
	BNE	1$
	TST	@R3
	BMI	1$
	JSR	R5,ECHO
	 .ASCII	"\"<0>
1$:	CMPB	#CR,R0
	BEQ	3$
	JSR	PC,EOLTST
	BEQ	3$
	MOVB	-(R5),R2
	CMP	#6,R2
	BGT	2$
	JMP	DING
2$:	CMPB	R0,#'A!40
	BLO	21$
	CMPB	R0,#'Z!40
	BHI	21$
	NOP
21$:	INC	R2
	MOVB	R2,(R5)+
	MOVB	R0,(R5)+
	ADD	R5,R2
	MOVB	R0,@R2
	BR	TTOPT4
3$:	TST	(R5)+
	MOV	R5,R0
	JSR	PC,FNDJOB
	BEQ	4$
	CMP	I.CNSL(R2),R3
	BNE	4$
	BIT	#NORUN$,I.BLOK(R2)
	BNE	4$
	CLR	T.XFLG(R3)
	MOV	#1,R0
	JMP	XCOM
4$:	JSR	R5,ECHO
	 1 output interrupt routine
.ENABL LSB
TTOINT::
DLOINT::
.IF EQ	HSR$O
.IF GT	DL11$N-1
	GETPSW
	MOV	(SP)+,DLTMP
.ENDC
DLOHOK::
	JSR	R5,$INTEN
	 .WORD	^C<PR4>&PR7
	JSR	R3,SAVE30
.IF GT	DL11$N-1
	MOV	DLTMP,R4
.ENDC
.IFF
.IF GT	DL11$N-1
	GETPSW
	MOVB	(SP)+,@HSROPP
	MOV	R0,-(SP)
PHSRBO	== .+2
	MOV	#HSROPP,R0
	INC	@R0
	CMP	(R0)+,(R0)+
	BLO	10$
	MOV	@R0,HSROPP
10$:	MOV	(SP)+,R0
.ENDC
	INC	HSROCC
	BEQ	20$
	RTI
DLOHOK::
20$:	JSR	R5,$INTEN
	 .WORD	^C<PR4>&PR7
	JSR	R5,$FORK
	 .WORD	T
	MOV	(SP)+,@#KISAR1
.ENDC
9$:
.IF NE	MAT$S
	JSR	PC,CTCON
.ENDC
	JMP	TTINC3
.DSABL	LSB
.ENABL	LSB
RUB:	ADD	#200,R0
CTLCHI	U
	BIT	#TTSPC$,@R3
	BNE	BTINC3
	ROR	-(SP)
.IF NE	SYT$K
	TSTB	T.XFLG-T.STAT(R2)
	BEQ	3$
	ADD	#T.XFLG+1-T.STAT,R2
	TST	(SP)+
	BMI	1$
	CLRB	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	BR	12$
1$:	MOVB	(R2)+,R5
	BEQ	2$
	ADD	R2,R5
	INC	R5
	MOVB	@R5,R0
	CLRB	@R5
	DECB	-1(R2)
	TST	@R3
	BMI	7$
	CMPB	T.XPRE(R3),#RUBOUT
	BEQ	91$
	MOVB	#RUBOUT,T.XPRE(R3).ASCII	"?"<0>
	JSR	PC,ECHOCL
	CLR	T.XFLG(R3)
	RTS	PC
.ENDC
.SBTTL	TTOENB	- Enable output interrupt
.ENABL	LSB
TTOENB::
.IF NE	DZ11$N
	BIT	#DZ11$,T.STAT(R3)
	BEQ	DLOENB
DZOENB:	MOVB	T.PUN(R3),R2
PBMSK2	== .+2
	BISB	BITMSK(R2),DZ.TCR(R4)
	BR	1$
.ENDC
DLOENB:
.IF NE	MTI$M
	BIS	#INEXP$,T.STAT(R3)
.ENDC
HKPC04 == .
	MOV	#IENABL,T.TPS(R4)
.ASSUME	.-HKPC04 EQ 6
1$:	CLC
	RTS	PC
.DSABL	LSB
.IF NE	SYT$K
XPROMT:	.ASCIZ	<CR><LF>"Job? "
.ENDC
.IF NE	DZ11$N
BITMSK::.BYTE	1,2,4,10,20,40,100OFBLK-.
30$:
.IF GT	DL11$N-1
	MOV	HSROGP,R5
	MOVB	(R5)+,R4
	CMP	R5,HSROEP
	BLO	40$
	MOV	HSRORP,R5
40$:	MOV	R5,HSROGP
.ENDC
	JSR	PC,50$
	DEC	HSROCC
	BPL	30$
	RTS	PC
50$:
.ENDC
.IF GT	DL11$N-1
	BIC	#^C<17>,R4
	ASL	R4
PDLTB1	== .+2
	MOV	DLTBL(R4),R3
.IFF
	MOV	DLTBL,R3
.ENDC
	MOV	T.CSR(R3),R4
.IF NE	MTI$M
	BIC	#INEXP$,T.STAT(R3)
	CLR	T.RTRY(R3)
.ENDC
	JSR	PC,OUTPTR
	BEQ	2$
	JSR	PC,OUTCHR
	BCS	2$
.IF NE	MTI$M
	BIS	#INEXP$,T.STAT(R3)
.ENDC
HKPC07 == .
	MOV	R0,T.TPB(R4)
.ASSUM3)
	BLOS	OUPXXX
	CLRB	T.LPOS(R3)
	MOVB	#CR,R0
	MOV	#<-1*400>+LF,T.TCTF(R3)
17$:	MOVB	R0,T.OCHR(R3)
18$:	CMPB	R0,T.TFIL(R3)
	BNE	19$
	TST	T.CNF2(R3)
	BMI	19$
.ASSUME WPALL$	EQ	100000
	MOVB	T.FCNT(R3),T.NFIL(R3)
19$:	CLC
	RTS	PC
CTLCHO	CR
	CLRB	T.LPOS(R3)
OUPXXX:	INC	-(R1)
	DEC	-(R1)
.IF NE	MAT$S
	TSTB	@R1
	BNE	17$
	CALL	RGEMP
.ENDC
	BR	17$
TTOTPT	== .+2
SPCHAR:	MOVB	TTOTBL(R0),R2
	ADD	R2,PC
TTOBAS::
CTLCHO	FF
	BIT	#FORM$,@R3
	BNE	OUPXXX
	MOV	#<-7*400>+LF,T.TCTF(R3)
	MOV	#LF,RE	.-HKPC07 EQ 4
	RTS	PC
2$:
HKPC05 == .
	MOV	#0,T.TPS(R4)
.ASSUME	.-HKPC05 EQ 6
	RTS	PC
.DSABL LSB
.SBTTL	Control character output dispatch table
.MACRO	CTLCHO	C
OUP'C::
.=C+TTOTBL
	.BYTE	OUP'C-TTOBAS
.=OUP'C
.SBTTL	Process C output
.ENDM	CTLCHO
TTOTBL::
.REPT	40
	.BYTE	OUPXXX-TTOBAS
.ENDR
.SBTTL	OUTCHR - Output character processing
.ENABL	LSB
OUTCHR:	TSTB	T.STAT(R3)
	BPL	991$
.ASSUME	PAGE$	EQ	200
20$:	SEC
	RTS	PC
991$:	TST	T.CNF2(R3)
	BMI	1$
.ASSUME	WPALL$	EQ	100000
	TSTB	T.0
	BR	OUPXXX
CTLCHO	BS
	TST	@R3
.ASSUME	BKSP$	EQ	100000
	BPL	OUPXXX
	DECB	T.LPOS(R3)
	BR	OUPXXX
CTLCHO	TAB
	BIT	#HWTAB$,@R3
	BNE	22$
	MOV	T.LPOS-1(R3),R0
	BIS	(PC)+,R0
	 .BYTE	377,370
	ADD	#SPACE+1,R0
	MOV	R0,T.TCTF(R3)
	MOVB	R0,R0
22$:	ADD	#8.*400,T.LPOS-1(R3)
	BIC	#7*400,T.LPOS-1(R3)
	BR	OUPXXX
TTHOUT:	MOV	R1,R2
	TST	T.OCTR-T.ICTR(R1)
	BMI	TTHOCM
	BEQ	23$
	BIT	#WRWT$,T.STAT(R3)
	BEQ	9$
23$:	BIS	#WRWT$,T.STAT(R3)
	MOV	TTCQE,R1
	ADD	#Q.BUFF-Q.BLKN,R1
TTHOU1:	TST	(R1)+
	BEQ	TTHNFIL(R3)
	BEQ	901$
	DECB	T.NFIL(R3)
	CLR	R0
	RTS	PC
901$:	TSTB	T.TNFL(R3)
	BEQ	1$
	INCB	T.TNFL(R3)
	MOVB	T.TCTF(R3),R0
	BR	18$
1$:
.IF NE	BF
	TSTB	T.OCTR-T.ICTR(R1)
	BNE	902$
	JSR	R4,UNBLOK
	 .WORD	TTOEM$
902$:	MOV	T.TID(R3),R2
	BEQ	4$
2$:	MOVB	(R2)+,R0
	BNE	3$
	CLR	R2
3$:	MOV	R2,T.TID(R3)
	BNE	18$
	CLRB	T.OCHR(R3)
4$:	BIT	#SHARE$,T.STAT(R3)
	BEQ	7$
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BNE	9$
.ENDC
	TST	T.CNF2(R3)
	BMI	7$
.ASSUME	WPALL$	EQ	100000
	CMPB	#LF,T.OCHR(R3)
	BNE	8$
	MOOCM
.IF NE	MMG$T
	MOV	@#KISAR1,-(SP)
	BIT	#40000,@R1
	BEQ	24$
	SUB	#20000,@R1
	ADD	#200,Q.PAR-Q.WCNT(R1)
24$:	MOV	Q.PAR-Q.WCNT(R1),@#KISAR1
.ENDC
	MOVB	@(R1)+,R0
.IF NE	MMG$T
	MOV	(SP)+,@#KISAR1
.ENDC
	TST	T.CNF2(R3)
	BMI	OUPXXX
.ASSUME	WPALL$	EQ	100000
	TST	R0
	BNE	13$
25$:	INC	-(R1)
	DEC	-(R1)
	BR	TTHOU1
TTHOCM:	MOV	R5,-(SP)
	MOV	R4,-(SP)
	JSR	PC,TTCMPL
	MOV	(SP)+,R4
	MOV	(SP)+,R5
	MOV	R2,R1
	JMP	991$
.DSABL	LSB
.IF NE	DZ11$N
.SBTTL	DZIINT - DZ11 input interrupt service
DZIV	IMPLOC,R2
5$:	MOV	-(R2),R5
	BEQ	5$
	CMP	#-1,R5
	BEQ	20$
	BIT	#NORUN$,I.BLOK(R5)
	BNE	5$
.IF NE	SYT$K
	CMP	I.CNSL(R5),R3
	BNE	5$
.ENDC
	CMP	TTHOUS,R5
	BEQ	6$
	TSTB	I.OCTR(R5)
	BEQ	5$
6$:	CMP	TTOUSR,R5
	BEQ	7$
	MOV	R5,TTOUSR
	MOV	I.TID(R5),T.TID(R3)
	MOV	R5,R1
	ADD	#I.ICTR,R1
	BR	1$
.ENDC
7$:	TST	T.STAT(R3)
.ASSUME	CONSL$	EQ	100000
	BPL	9$
8$:
.IF NE	BF
	CMP	TTHOUS,R5
	BEQ	TTHOUT
.IFF
	TST	TTHOUS
	BNE	TTHOUT
.ENDC
9$:
.IF NE	BF
..TTON	== .+4
	CMPB	T.OCTR-T.ICTR(R1),#TTYOINT::
.IF GT	DZ11$N-1
	GETPSW
	MOV	(SP)+,DZTMP
.ENDC
	JSR	R5,$INTEN
	 .WORD	^C<PR5>&PR7
	JSR	R3,SAVE30
1$:
.IF GT	DZ11$N-1
	MOV	DZTMP,R4
	BIC	#^C<17>,R4
	ASL	R4
PDZTB0	== .+2
	MOV	DZTBL(R4),R3
PDZCS0	== .+2
	MOV	DZCSR(R4),R4
.IFF
	MOV	DZTBL,R3
	MOV	DZCSR,R4
.ENDC
	MOV	DZ.RBUF(R4),R0
	BPL	3$
.ASSUME	DZDVD$	EQ	100000
	MOV	R0,R5
	SWAB	R5
	BIC	#^C<7>,R5
	ASL	R5
	ADD	R3,R5
	MOV	@R5,R3
	BEQ	1$
	TSTB	T.CNF2(R3)
	BMI	2$
.ASSUME	RPALL$	EQ	200
	BIC	#^C<177>,R0
	BEQ	1$
2$:	JSR	PC,INUT
	BNE	10$
	JSR	R4,UNBLOK
	 .WORD	TTOWT$
10$:
.ENDC
	ADD	#T.OTOP-T.ICTR,R1
	CMP	@R1,-(R1)
	BNE	11$
	SUB	#TTYOUT,@R1
11$:	TSTB	-2(R1)
.IF EQ	SYT$K
	BEQ	20$
.IFF
	BNE	12$
	TSTB	T.XFLG(R3)
	BPL	20$
	ASLB	T.XFLG(R3)
	ADDR	XPROMT,R2
	MOV	R2,T.TID(R3)
	BR	2$
12$:
.ENDC
	MOVB	@(R1)+,R0
13$:	TST	T.CNF2(R3)
	BMI	OUPXXX
.ASSUME	WPALL$	EQ	100000
	BIC	#^C<177>,R0
	CMPB	#40,R0
	BHI	SPCHAR
	CMP	R0,#RUBOUT
	BEQ	OUPXXX
	INCB	T.LPOS(R3)
	BIT	#CRLF$,@R3
	BEQ	OUPXXX
	CMPB	T.LPOS(R3),T.WID(RPTR
	BEQ	1$
	JSR	PC,INTCOM
	BR	1$
3$:	RTS	PC
.SBTTL	DZOINT	- DZ11 output interrupt service
DZOINT::
.IF GT	DZ11$N-1
	GETPSW
	MOV	(SP)+,DZTMP
.ENDC
	JSR	R5,$INTEN
	 .WORD	^C<PR5>&PR7
	JSR	R3,SAVE30
.IF GT	DZ11$N-1
	MOV	DZTMP,R4
	BIC	#^C<17>,R4
	ASL	R4
PDZTB1	== .+2
	MOV	DZTBL(R4),R3
PDZCS1	== .+2
	MOV	DZCSR(R4),R4
.IFF
	MOV	DZTBL,R3
	MOV	DZCSR,R4
.ENDC
	MOVB	1(R4),R5
	BIC	#^C<7>,R5
	ASL	R5
	ADD	R3,R5
	MOV	@R5,R3
	JSR	PC,OUTPTR
	BEQ	2$
	JSR	PC,OUTCHR
	BCS	2$
	MOVB	R0,DZ.TDRT.AST(R3)
.IF NE	MMG$T
	MOV	(SP)+,@#KISAR1
.ENDC
1$:	MOV	(SP)+,R1
	RTS	PC
.ENDC
.SBTTL	DATA AREAS
.IF NE	BF
TTOUSR::.WORD	BKGND
TTIUSR::.WORD	BKGND
.ENDC
TTHOUS::.WORD	0
TTHIUS::.WORD	0
.IF NE	HSR$B
HSRB::	.WORD	HSRBUF
HSRBEP::.WORD	HSRBUE
HSRBRP::.WORD	HSRBUF
HSRBCC::.WORD	-1
HSRBGP::.WORD	HSRBUF
HSRBUF::.BLKW	HSRBSZ*2
HSRBUE::
TIFBLK::BSS	F.BSIZ/2
.ENDC
.IF NE	HSR$O
.IF EQ	DL11$N-1
HSROCC::.WORD	-1
.IFF
HSROPP::.WORD	HSROBF
HSROEP::.WORD	HSROBE
HSRORP::.WORD	HSROBF
HSROCC::
10$:	MOV	R1,R2
	ADD	#$ELCPY-ELLQE,R2
	BR	20$
O.NLOG:	JSR	PC,FINDRV
	BCS	O.GOOD
	CLR	R2
20$:	MOV	$ELPTR-ELLQE(R1),R0
	TST	(R0)+
	MOV	R2,(R0)
	BR	O.GOOD
	.DSABL	LSB
O.PURG:	JSR	PC,FINDRV
	BCS	O.BAD
	MOV	#1,PNXREC-ELLQE(R1)
	MOV	#1,PNXBLK-ELLQE(R1)
	CLR	PNXWRD-ELLQE(R1)
	CLR	$ELFLG-ELLQE(R1)
	RTS	PC
FINDRV:	MOV	PC,R0
	ADD	#DEVNAM-.,R0
	MOV	PC,-(SP)
	ADD	#DAREA-.,(SP)
	EMT	342
	BCS	O.BAD
	MOV	DAREA+4,R1
	BEQ	O.BAD
O.GOOD:	TST	(PC)+
O.BAD:	SEC
	RTS	PC
DAREA:	.BLKW	4
DEVNAM:	.RAD50(R4)
	RTS	PC
2$:	MOVB	T.PUN(R3),R0
PBMSK3	== .+2
	BICB	BITMSK(R0),DZ.TCR(R4)
	RTS	PC
.IF NE	DZ11$M
.SBTTL	DZMCTL	-- MULTI-TERMINAL DZ11 MODEM CONTROL
DZMCTL::JSR	R5,SAVE52
	CLR	R2
1$:
.IF EQ	DZV$11
	MOV	#8.+1,-(SP)
.IFF
	MOV	#4.+1,-(SP)
.ENDC
PDZCS2	== .+2
	MOV	DZCSR(R2),R4
	BEQ	4$
PDZTB2	== .+2
	MOV	DZTBL(R2),R1
	MOVB	#377,DZ.DTR(R4)
2$:	DEC	@SP
	BEQ	4$
	MOV	(R1)+,R3
	BEQ	2$
	BIT	#REMOT$,@R3
	BEQ	2$
.IF NE	MAT$S
.IF NE	BF
	MOV	T.OWNR(R3),R5
	BNE	21$
	DEC	R5
21$:
.ENDC
.E.WORD	-1
HSROGP::.WORD	HSROBF
HSROBF::.BLKB	DL11$N
HSROBE::
	.EVEN
.ENDC
TOFBLK::BSS	F.BSIZ/2
.ENDC
.END
                                                                                                                                                                                                                                                                                                                                                                                                              NDC
	MOVB	T.PUN(R3),R0
PBMSK4	== .+2
	BITB	BITMSK(R0),DZ.CAR(R4)
	BEQ	3$
	BIT	#HNGUP$,T.STAT(R3)
	BEQ	2$
	MOV	#DZANS$,-(SP)
	BISB	R0,@SP
	MOV	(SP)+,DZ.LPR(R4)
	BIC	#INIST$+HNGUP$,T.STAT(R3)
.IF NE	MAT$S
	JSR	PC,CARON
.ENDC
	BR	2$
3$:	BIT	#HNGUP$,T.STAT(R3)
	BNE	2$
PBMSK5	== .+2
	BICB	BITMSK(R0),DZ.DTR(R4)
	BIS	#HNGUP$,T.STAT(R3)
.IF NE	MAT$S
	JSR	PC,HNGON
.ENDC
	BR	2$
4$:	CMP	(SP)+,(R2)+
	CMP	R2,#DZ11$N*2
	BLO	1$
DZTIMR:	MOV	DZTMCP,DZTCOM
	JSR	R5,$TIMIO
	 .WORD	DZTMBK - .
	 .WO.MCALL	.MODULE
.MODULE	EL,RELEASE=B03,VERSION=01

	.SBTTL	ABSTRACT
	.ENABL	LC
	.SBTTL	DEFINITIONS
	.MCALL	.DATE,	.DRDEF,	.GTIM
	.MCALL	.PRINT,	.DSTAT
	.DRDEF	EL,2,RONLY$,ERL$S+1,0,0
	.MACRO	BCS.	LABEL,?ALT
	BCC	ALT
	JMP	LABEL
ALT:
	.ENDM
	SYSPTR	= 54
	CONFIG	= 300
		FBMON$	=      1
	CONFG2	= 370
		CACHE$	=      1
	SYSGEN	= 372
	PNPTR	= 404
	ERL$G	= 1
	.IIF NDF ERL$U	ERL$U	= 10.
	.IIF NDF ERL$S	ERL$S	= 1
	UNITMK	= 7
	GOODIO	= -1
	PARERR	= -2
	CCHERR	= -3
	PCHERR	= -4
	O.UNIT	= 0RD	0
	 .WORD	0
	 .WORD	CLOCK/2
	RTS	PC
DZTMBK:	.WORD	0,0
	.WORD	0,0
	.WORD	177442
	.WORD	-1
DZTCOM:	.WORD	0
DZTMCP::.WORD	DZMCTL
.ENDC
.ENDC
.IIF EQ DZ11$N, .LIST
.IF NE	DZ11$M!DL11$M!MTI$M
.SBTTL	SAVE52	- Save registers R5-R2
SAVE52:	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	JSR	PC,@R5
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	MOV	(SP)+,R5
	RTS	PC
.ENDC
.IF NE	MAT$S
.SBTTL	Report status subroutines
CARON::	JSR	R1,TRMSTS
	 .WORD	AS.HNG
	 .WORD	AS.CAR
HNGON::	JSR	R1,TRMSTS
	
	O.ID	= 1
	O.ERL	= 2
	O.ERR	= 4
	O.READ	= 6
	O.WRIT	= 12
	STALEN	= 7.
	D.SIZE	= 0
	D.RNUM	= 1
	D.DVUN	= 2
	D.DVID	= 3
	D.RTRY	= 4
	D.OCUR	= 5
	D.DATE	= 6
	D.HOT	= 10
	D.LOT	= 12
	D.BLKN	= 14
	D.BUFF	= 16
	D.WCNT	= 20
	D.REGN	= 22
	D.MTRY	= 23
	D.REG	= 24
	DEVFIX	= 10.
	M.SIZE	= 0
	M.RNUM	= 1
	M.TYPE	= 2
	M.MREG	= 3
	M.OCUR	= 4
	M.DATE	= 6
	M.HOT	= 10
	M.LOT	= 12
	M.PC	= 14
	M.PS	= 16
	M.REG	= 20
	PARMAX	= 16.
	PARFIX	= 8.
	MSYSER	= 177744
	MCONRG	= 177746
	MHITMS	= 177 .WORD	AS.CAR
	 .WORD	AS.HNG
CTCON::	JSR	R1,TRMSTS
	 .WORD	0
	 .WORD	AS.CTC
CLRIN::	JSR	R1,TRMSTS
	 .WORD	AS.INP
	 .WORD	0
SETIN::	JSR	R1,TRMSTS
	 .WORD	0
	 .WORD	AS.INP
RGFUL::	JSR	R1,TRMSTS
	 .WORD	AS.OUT
	 .WORD	0
RGEMP::	JSR	R1,TRMSTS
	 .WORD	0
	 .WORD	AS.OUT
.SBTTL	TRMSTS	- Copy terminal status to user
TRMSTS:	TST	T.AST(R3)
	BEQ	1$
.IF NE	BF
	CMP	R5,T.OWNR(R3)
	BNE	1$
.ENDC
.IF NE	MMG$T
	MOV	@#KISAR1,-(SP)
	MOV	T.AST+2(R3),@#KISAR1
.ENDC
	BIC	(R1)+,@T.AST(R3)
	BIS	(R1)+,@752
	.SBTTL	INSTALLATION CODE
	.ASECT
	. = 200
	BR	10$
	BR	20$
10$:	MOV	@#SYSPTR,R0
	BIT	#FBMON$,CONFIG(R0)
	BNE	20$
	TST	(PC)+
20$:	SEC
	RTS	PC
	.IIF GT,<.-356>	.ERROR
	.SBTTL	SET OPTIONS
	.DRSET	LOG,	NOP,	O.LOG,	NO
	.DRSET	PURGE,	NOP,	O.PURG
	.ENABL	LSB
O.LOG:	BR	5$
	NOP
	BR	O.NLOG
5$:	JSR	PC,FINDRV
	BCS	O.BAD
	MOV	@#SYSPTR,R2
	MOV	R1,R0
	ADD	#CNFGW1-ELLQE,R0
	TST	(R0)
	BNE	10$
	MOV	CONFIG(R2),(R0)+
	MOV	SYSGEN(R2),(R0)+
	MOV	R1,-(SP)
	ADD	#GETDAT-ELLQE,(SP)
	JSR	PC,@(SP)+
	BR	80$
40$:	MOVB	R3,R1
	ADD	#DEVFIX,R1
	JSR	PC,CHKSIZ
	BCS.	$ELERR
50$:	TST	(SP)
	BEQ	60$
	ADD	#O.ERL,(SP)
	INC	@(SP)
60$:
	MOVB	R1,(R0)+
	MOVB	PNXREC,(R0)+
	INC	PNXREC
	MOVB	Q$UNIT(R5),(R0)
	BICB	#<^CUNITMK>,(R0)+
	SWAB	R4
	MOVB	R4,(R0)+
	SWAB	R4
	MOVB	R4,(R0)+
	MOVB	#1,(R0)+
	JSR	PC,GETDAT
	MOV	(R5)+,(R0)+
	TST	(R5)+
	MOV	(R5)+,(R0)+
	MOV	(R5)+,(R0)+
	MOV	R3,(R0)+
	MOVB	R3,R3
70$:	MOV	(R2)+,(R0)+
	DEC	R3
	BGT	70$
	ASL	R1
	ADD	R1,PNXWRD
	NEG	R1
	MOV	R1,(R0)
80$:	BR	$ELX
10$:	MOV	PNXBLK,R0
	DEC	R0
	SWAB	R0
	ASL	R0
	ADD	PNXWRD,R0
	ADD	PC,R0
	ADD	#$ELBFR-.,R0
	TST	(PC)+
20$:	SEC
	RTS	PC
	.SBTTL	GETDAT	- PLACE DATE/TIME IN RECORD
GETDAT:	MOV	R0,-(SP)
	MOV	PC,R0
	ADD	#ELAREA-.,R0
	MOV	#21*400,(R0)
	MOV	(SP),2(R0)
	ADD	#2,2(R0)
	.GTIM
	.DATE
	MOV	R0,@(SP)
	MOV	(SP)+,R0
	ADD	#6,R0
	RTS	PC
	.SBTTL	TEXT
	.NLIST	BEX
E.FULL:	.NLCSI	TYPE=I,PART=PREFIX
	.ASCIZ	/W-Buffer is full, logging suspended/
E.STAT:	.NLCSI	TYPE=I,PART=PREFIX
	.ASCIZ	/W-Device statiIT
	.SBTTL	MEMERR	- MEMORY ERROR RECORD LOGGER
	STKDPC	= 36
	STKDPS	= 40
MEMERR:	CMPB	R4,#PARERR
	BNE	20$
10$:	INC	CMPARE
	BR	30$
20$:	INC	CCPARE
	CMPB	R4,#PCHERR
	BEQ	10$
30$:	TST	PNXWRD
	BEQ	40$
	CLR	R1
	JSR	PC,CHKSIZ
	ADD	(R0),R0
	CMPB	M.TYPE(R0),#PARERR
	BGT	40$
	CMP	STKDPC(SP),M.PC(R0)
	BNE	40$
	INC	M.OCUR(R0)
	BR	100$
40$:	MOV	R5,-(SP)
	MOV	#PARMAX,R1
50$:	TST	(R5)+
	BEQ	60$
	DEC	R1
	BGT	50$
60$:	MOV	(SP)+,R5
	NEG	R1
	ADD	#PARMAX,R1
	MOV	R1,R3
	ASL	R1
	ADD	#PARFIX,R1stics table is full/
	.EVEN
	.LIST	BEX
	.SBTTL	IMPURE DATA AREA
ELAREA:	.BLKW	2
$ELHDR:
OFIXED:	.WORD	<<7*ERL$U+2>*2>
DEVSTS:	.WORD	-1
	.BLKW	<7*ERL$U>
CERECR:	.WORD	0
CMENTB:	.WORD	0
CMENTF:	.WORD	0
CMENTR:	.WORD	0
CMPARE:	.WORD	0
CCPARE:	.WORD	0
PNXREC:	.WORD	1
PNXBLK:	.WORD	1
PNXWRD:	.WORD	0
SMAXSZ:	.WORD	ERL$S
CNFGW1:	.WORD	0
CNFGW2:	.WORD	0
INIDAT:	.WORD	0
INTIM1:	.WORD	0
INTIM2:	.WORD	0
	$HDLEN	= <.-$ELHDR>/2
	.IIF GT <$HDLEN-256.> .ERROR
$ELBFR:	.BLKW	<ERL$S*256.>
	.DREND		/EL /
	.IIF GT,<.-1000> .ERROR
	.SBTTL	DRIVER REQUEST ENTRY POINT
	.DRBEG	EL
	MOV	ELCQE,R4
	MOV	Q$WCNT(R4),R2
	BEQ	ELDONE
	BLT	ELERR
	MOV	Q$BUFF(R4),R1
	MOV	PC,R0
	ADD	#$ELHDR-.,R0
	MOV	(R4),R3
	BGT	10$
	CMP	R2,#$HDLEN
	BLE	30$
	MOV	#$HDLEN,R2
	BR	20$
10$:	ADD	#$ELBFR-$ELHDR,R0
	CMP	(R4),#ERL$S
	BGT	ELEOF
	DEC	R3
	SWAB	R3
	ASL	R3
	ADD	R3,R0
	ADD	R2,R3
	ADD	R2,R3
	SUB	#ERL$S*256.*2,R3
	BLE	30$
	ASR	R3
	SUB	R3,R2
20$:;	MOV	R2,Q$WCNT(R5)
30$:	MOV	(R0)+,(R1)+
	DEC	R2
	BGT	20$
	MOV	@#SYSPTR,R0
	BIT	#CACHE$,CONFG2(R0)
	BEQ	70$
	ADD	#3,R1
70$:	JSR	PC,CHKSIZ
	BCS	$ELERR
	MOVB	R1,(R0)+
	MOVB	PNXREC,(R0)+
	INC	PNXREC
	MOVB	R4,(R0)+
	MOVB	R3,(R0)+
	MOV	#1,(R0)+
	JSR	PC,GETDAT
	MOV	STKDPC(SP),(R0)+
	MOV	STKDPS(SP),(R0)+
80$:	MOV	@(R5),(R0)+
	MOV	(R5)+,(R0)+
	DEC	R3
	BGT	80$
	MOV	@#SYSPTR,R3
	BIT	#CACHE$,CONFG2(R3)
	BEQ	90$
	MOV	@#MSYSER,(R0)+
	MOV	@#MCONRG,(R0)+
	MOV	@#MHITMS,(R0)+
90$:	ASL	R1
	ADD	R1,PNXWRD
	NEG	R1
	MOV	R1,(R0)
100$:	BR	$ELXIT
	.SBTTL	$E
	BR	ELDONE
ELEOF:	BIS	#EOF$,@-(R4)
	BR	ELDONE
ELERR:	BIS	#HDERR$,@-(R4)
ELINT:
ELDONE:	.DRFIN	EL
	.SBTTL	$ELCPY	- START OF COPY CODE
$ELCPY:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R4,-(SP)
	MOV	R5,-(SP)
	CLR	-(SP)
	INC	CERECR
	CMPB	R4,#GOODIO
	BGT	DEVERR
	BLT	MEMERR
	DEC	CERECR
	JSR	PC,GESTAT
	BCS	20$
	ADD	#O.READ,R0
	TST	Q$WCNT(R5)
	BEQ	20$
	BPL	10$
	ADD	#O.WRIT-O.READ,R0
10$:	ADD	#1,(R0)+
	ADC	(R0)
20$:	JMP	$ELXIT
	.SBTTL	DEVERR	- DEVICE ERROR RECORD LOLXIT	- EXIT ROUTINES
$ELERR:	TST	(PC)+
$ELFLG:	 .WORD	0
	BNE	10$
	MOV	SP,$ELFLG
	MOV	PC,R0
	ADD	#E.FULL-.,R0
	.PRINT
10$:	INC	CMENTB
$ELXIT:	TST	(SP)+
	MOV	(SP)+,R5
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RTS	PC
	.SBTTL	GESTAT	- GET POINTER TO DEVICE STATISTICS ENTRY
GESTAT:	MOVB	Q$UNIT(R5),-(SP)
	BIC	#<^CUNITMK>,(SP)
	MOV	R4,R0
	CLRB	R0
	BIS	R0,(SP)
	MOV	PC,R0
	ADD	#DEVSTS-.,R0
	MOV	#ERL$U,R1
10$:	CMP	(R0),#-1
	BEQ	40$
	CMP	(R0),(SP)
	BEQ	60$
	AGGER
DEVERR:	JSR	PC,GESTAT
	BCS	10$
	INC	O.ERR(R0)
	MOV	R0,(SP)
10$:	TST	PNXWRD
	BEQ	40$
	CLR	R1
	JSR	PC,CHKSIZ
	ADD	(R0),R0
	MOV	R4,R1
	CLRB	R1
	BISB	Q$UNIT(R5),R1
	BICB	#<^CUNITMK>,R1
	CMP	R1,D.DVUN(R0)
	BNE	40$
	CMPB	R4,D.RTRY(R0)
	BGE	40$
	MOV	R0,-(SP)
	MOV	R2,-(SP)
	ADD	#D.REG,R0
	MOVB	R3,R1
20$:	CMP	(R0)+,(R2)+
	BNE	30$
	DEC	R1
	BGT	20$
30$:	MOV	(SP)+,R2
	MOV	(SP)+,R0
	TST	R1
	BNE	40$
	INCB	D.OCUR(R0)
	MOVB	R4,D.RTRY(R0)
	TST	(SP)
	BEQ	80$
	ADD	#O.ERL,(SP)
	INC	@(SP)DD	#STALEN*2,R0
	DEC	R1
	BGT	10$
	TST	(PC)+
20$:	 .WORD	0
	BNE	30$
	MOV	PC,R0
	ADD	#E.STAT-.,R0
	.PRINT
	MOV	SP,20$
30$:	TST	(SP)+
	BR	70$
40$:	MOV	#STALEN,R1
50$:	CLR	(R0)+
	DEC	R1
	BGT	50$
	MOV	#-1,(R0)
	SUB	#STALEN*2,R0
	MOV	(SP),(R0)
60$:	TST	(SP)+
	TST	(PC)+
70$:	SEC
	RTS	PC
	.SBTTL	CHKSIZ	- CHECK FOR ROOM IN LOGGING BUFFER
CHKSIZ:	MOV	PNXWRD,R0
	ADD	R1,R0
	ADD	R1,R0
	CMP	R0,#255.*2
	BLT	10$
	CMP	PNXBLK,SMAXSZ
	BGE	20$
	JSR	PC,10$
	MOV	#-1,(R0)
	INC	PNXBLK
	CLR	PNXWRD
	CCHERR	= -3
	PCHERR	= -4
	O.UNIT	= 0
	O.ID	= 1
	O.ERL	= 2
	O.ERR	= 4
	O.READ	= 6
	O.WRIT	= 12
	STALEN	= 7.
	D.SIZE	= 0
	D.RNUM	= 1
	D.DVUN	= 2
	D.DVID	= 3
	D.RTRY	= 4
	D.OCUR	= 5
	D.DATE	= 6
	D.HOT	= 10
	D.LOT	= 12
	D.BLKN	= 14
	D.BUFF	= 16
	D.WCNT	= 20
	D.PAR1	= 22
	D.REGN	= 22
	D.MTRY	= 23
	D.REG	= 24
	DEVFIX	= 10.
	M.SIZE	= 0
	M.RNUM	= 1
	M.TYPE	= 2
	M.MREG	= 3
	M.OCUR	= 4
	M.DATE	= 6
	M.HOT	= 10
	M.LOT	= 12
	M.PC	= 14
	M.PS	= 16
	M.REG	= 20
	PARMAX	= 16.
	PARFIX	BEQ	10$
30$:	TST	PNXWRD
	BEQ	40$
	CLR	R1
	JSR	PC,CHKSIZ
	ADD	(R0),R0
	CMPB	M.TYPE(R0),#PARERR
	BGT	40$
	CMP	STKDPC(SP),M.PC(R0)
	BNE	40$
	INC	M.OCUR(R0)
	BR	100$
40$:	MOV	R5,-(SP)
	MOV	#PARMAX,R1
50$:	TST	(R5)+
	BEQ	60$
	DEC	R1
	BGT	50$
60$:	MOV	(SP)+,R5
	NEG	R1
	ADD	#PARMAX,R1
	MOV	R1,R3
	ASL	R1
	ADD	#PARFIX,R1
	MOV	@#SYSPTR,R0
	BIT	#CACHE$,CONFG2(R0)
	BEQ	70$
	ADD	#3,R1
70$:	JSR	PC,CHKSIZ
	BCS	$ELERR
	MOVB	R1,(R0)+
	MOVB	PNXREC,(R0)+
	INC	PNXREC
	MOVB	R4,(R0)+
	MOVB	R3,(R= 8.
	MSYSER	= 177744
	MCONRG	= 177746
	MHITMS	= 177752
	.SBTTL	$ELCPY	- START OF COPY CODE
	.GLOBL	OPINIT,	FREADY
	.WORD	$ELCPY
ERRLOG::JMP	OPINIT
$ELCPY:	TST	(PC)+
FREADY:	 .WORD	1
	BEQ	CONTIN
	BMI	10$
	INC	NOTRDY
10$:	CLC
	RTS	PC
CONTIN:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R4,-(SP)
	MOV	R5,-(SP)
	CLR	-(SP)
	INC	CERECR
	CMPB	R4,#GOODIO
	BGT	DEVERR
	BLT.	MEMERR
	DEC	CERECR
	JSR	PC,GESTAT
	BCS	20$
	ADD	#O.READ,R0
	TST	Q$WCNT(R5)
	BEQ	20$
	BPL	10$
	AD0)+
	MOV	#1,(R0)+
	JSR	PC,GETDAT
	MOV	STKDPC(SP),(R0)+
	MOV	STKDPS(SP),(R0)+
80$:	MOV	@(R5),(R0)+
	MOV	(R5)+,(R0)+
	DEC	R3
	BGT	80$
	MOV	@#SYSPTR,R3
	BIT	#CACHE$,CONFG2(R3)
	BEQ	90$
	MOV	@#MSYSER,(R0)+
	MOV	@#MCONRG,(R0)+
	MOV	@#MHITMS,(R0)+
90$:	ASL	R1
	ADD	R1,PNXWRD
	NEG	R1
	MOV	R1,(R0)
100$:	BR	$ELXIT
	.SBTTL	$ELXIT	- EXIT ROUTINES
$ELERR:	TST	(PC)+
$ELFLG:	 .WORD	0
	BNE	10$
	MOV	SP,$ELFLG
	MOV	PC,R0
	ADD	#E.FULL-.,R0
	.PRINT
10$:	INC	CMENTB
$ELXIT:	TST	(SP)+
	MOV	(SP)+,R5D	#O.WRIT-O.READ,R0
10$:	ADD	#1,(R0)+
	ADC	(R0)
20$:	JMP	$ELXIT
	.SBTTL	DEVERR	- DEVICE ERROR RECORD LOGGER
DEVERR:	JSR	PC,GESTAT
	BCS	10$
	INC	O.ERR(R0)
	MOV	R0,(SP)
10$:	TST	PNXWRD
	BEQ	50$
	CLR	R1
	JSR	PC,CHKSIZ
	ADD	(R0),R0
	MOV	R4,R1
	CLRB	R1
	BISB	Q$UNIT(R5),R1
	BICB	#<^CUNITMK>,R1
	CMP	R1,D.DVUN(R0)
	BNE	50$
	CMPB	R4,D.RTRY(R0)
	BGE	50$
	MOV	R0,-(SP)
	MOV	R2,-(SP)
	ADD	#D.REG,R0
	MOV	@#SYSPTR,R1
	BIT	#KT11$,CONFIG(R1)
	BEQ	15$
	ADD	#2,R0
15$:	MOVB	R3,R1
20$:	CMP	(R0)+,(
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	DEC	$ELRSM
	BEQ	10$
	CLR	$ELRSM
	TST	(PC)+
10$:	SEC
	RTS	PC
	.SBTTL	GESTAT	- GET POINTER TO DEVICE STATISTICS ENTRY
GESTAT:	MOVB	Q$UNIT(R5),-(SP)
	BIC	#<^CUNITMK>,(SP)
	MOV	R4,R0
	CLRB	R0
	BIS	R0,(SP)
	MOV	PC,R0
	ADD	#DEVSTS-.,R0
	MOV	#ERL$U,R1
10$:	CMP	(R0),#-1
	BEQ	40$
	CMP	(R0),(SP)
	BEQ	60$
	ADD	#STALEN*2,R0
	DEC	R1
	BGT	10$
	TST	(PC)+
20$:	 .WORD	0
	BNE	30$
	MOV	PC,R0
	ADD	#E.STAT-.,R0
	.PRINT
	MOVEL
	.END
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     R2)+
	BNE	30$
	DEC	R1
	BGT	20$
30$:	MOV	(SP)+,R2
	MOV	(SP)+,R0
	TST	R1
	BNE	50$
	INCB	D.OCUR(R0)
	MOVB	R4,D.RTRY(R0)
	TST	(SP)
	BEQ	40$
	ADD	#O.ERL,(SP)
	INC	@(SP)
40$:	BR	90$
50$:	MOVB	R3,R1
	ADD	#DEVFIX,R1
	MOV	@#SYSPTR,R0
	BIT	#KT11$,CONFIG(R0)
	BEQ	55$
	INC	R1
55$:	JSR	PC,CHKSIZ
	BCS.	$ELERR
60$:	TST	(SP)
	BEQ	70$
	ADD	#O.ERL,(SP)
	INC	@(SP)
70$:
	MOVB	R1,(R0)+
	MOVB	PNXREC,(R0)+
	INC	PNXREC
	MOVB	Q$UNIT(R5),(R0)
	BICB	#<^CUNITMK>,(R0)+
	SWAB	R4
	MOVB	R4,(R0)+
	SWAB	R4.MCALL	.MODULE
.MODULE	ELCOPY,RELEASE=B03,VERSION=01

	.SBTTL	DEFINITIONS
	.ENABL	LC
	.MCALL	.QELDF,	.DATE,	.GTIM
	.MCALL	.PRINT,	.MFPS,	.MTPS
	.MACRO	BCS.	LABEL,?ALT
	BCC	'ALT'
	JMP	LABEL
'ALT':
	.ENDM
	.MACRO	BLT.	LABEL,?ALT
	BGE	'ALT'
	JMP	LABEL
'ALT':
	.ENDM
	SYSPTR	= 54
	$DATE	= 262
	CONFIG	= 300
		FBMON$	=      1
		KT11$	=  10000
	CONFG2	= 370
		CACHE$	=      1
	PNPTR	= 404
	$GTIME	= 422
	ERL$G	= 1
	.IIF NDF ERL$U	ERL$U	= 10.
	UNITMK	= 7
	.QELDF
	GOODIO	= -1
	PARERR	= -2
	MOVB	R4,(R0)+
	MOVB	#1,(R0)+
	JSR	PC,GETDAT
	MOV	(R5)+,(R0)+
	TST	(R5)+
	MOV	(R5)+,(R0)+
	MOV	(R5)+,(R0)+
	MOV	@#SYSPTR,-(SP)
	ADD	#CONFIG,(SP)
	BIT	#KT11$,@(SP)+
	BEQ	75$
	MOV	(R5)+,(R0)+
75$:	MOV	R3,(R0)+
	MOVB	R3,R3
80$:	MOV	(R2)+,(R0)+
	DEC	R3
	BGT	80$
	ASL	R1
	ADD	R1,PNXWRD
	NEG	R1
	MOV	R1,(R0)
90$:	BR	$ELXIT
	.SBTTL	MEMERR	- MEMORY ERROR RECORD LOGGER
	STKDPC	= 30
	STKDPS	= 32
MEMERR:	CMPB	R4,#PARERR
	BNE	20$
10$:	INC	CMPARE
	BR	30$
20$:	INC	CCPARE
	CMPB	R4,#PCHERR
	R0),R0
	ADD	PNXWRD,R0
	TST	(PC)+
30$:	SEC
	RTS	PC
	.SBTTL	GETDAT	- PLACE DATE/TIME IN RECORD
GETDAT:	MOV	R1,-(SP)
	MOV	@#SYSPTR,R1
	.MFPS
	.MTPS	#340
	MOV	R1,-(SP)
	ADD	$GTIME(R1),(SP)
	ADD	#2,R0
	JSR	PC,@(SP)+
	.MTPS
	MOV	@#SYSPTR,R1
	MOV	$DATE(R1),-4(R0)
	MOV	(SP)+,R1
	TST	(R0)+
	RTS	PC
	.SBTTL	TEXT
	.NLIST	BEX
E.FULL:	.ASCIZ	/?ERRLOG-W-Log file is full, logging suspended/
E.STAT:	.ASCIZ	/?ERRLOG-W-Device statistics table is full/
	.EVEN
	.LIST	BEX
	.SBTTL	IMPURE DATA AREA
	.K
	TSTB	@#ERRBYT
	BNE	LOOKNO
	JMP	CHNERR
LOOKNO:	.PRINT	#MESW
	.PRINT	#MESNFD
	MOV	SMAXSZ,BUFBLK+OSIZEB
	BR	CREATE
LOOKOK:	.READW	#INSTAT,#ELIOCH,#BUFBLK,#BLKSIZ,#0
	BCC	1$
	JMP	IORERR
1$:	CMP	BUFBLK,OFIXED
	BNE	INVALD
	TST	BUFBLK+ONXREC
	BMI	INVALD
	TST	BUFBLK+ONXBLK
	BLE	INVALD
	MOV	@#SYSPTR,R1
	MOV	CONFIG(R1),R2
	BIC	#MSKCF1,R2
	MOV	BUFBLK+OCONFG,R3
	BIC	#MSKCF1,R3
	CMP	R3,R2
	BNE	INVALD
	MOV	SYSGEN(R1),R2
	MOV	BUFBLK+OCONFG+2,R3
	CMP	R3,R2
	BNE	INVALD
	TST	BUFBLK+OMPARE
	BMGLOBL	NOTRDY,	RECHED,	$ELHDR
	.GLOBL	CMENTR,	PNXBLK,	$HDLEN
	.GLOBL	$BFNUM,	$BFTAB,	$BFLAG
	.GLOBL	$ELBF1,	SMAXSZ
NOTRDY:	.WORD	0
ELAREA:	.BLKW	2
RECHED:	.WORD	0
$ELHDR:
OFIXED:	.WORD	<<7*ERL$U+2>*2>
DEVSTS:	.WORD	-1
	.BLKW	<7*ERL$U>
CERECR:	.WORD	0
CMENTB:	.WORD	0
CMENTF:	.WORD	0
CMENTR:	.WORD	0
CMPARE:	.WORD	0
CCPARE:	.WORD	0
PNXREC:	.WORD	1
PNXBLK:	.WORD	1
PNXWRD:	.WORD	0
SMAXSZ:	.WORD	100.
CNFGW1:	.WORD	0
CNFGW2:	.WORD	0
INIDAT:	.WORD	0
INTIM1:	.WORD	0
INTIM2:	.WORD	0
	$HDLEN	=I	INVALD
	TST	BUFBLK+OCPARE
	BMI	INVALD
	MOV	BUFBLK+ONXBLK,R0
	JSR	PC,NUMBER
	.PRINT	#MESUS1
	MOV	BUFBLK+OSIZEB,R0
	JSR	PC,NUMBER
	.PRINT	#MESUS2
	.GTLIN	#LINBUF,#MESINI
	TSTB	LINBUF
	BEQ	CHANGE
	CMPB	LINBUF,#'Y
	BEQ	INITF
	BR	CHANGE
INVALD:	.PRINT	#MESIV1
	.PRINT	#MESIV2
	.PURGE	#ELIOCH
	.RENAME	#INSTAT,#ELIOCH,#ELFILE
	MOV	#100.,BUFBLK+OSIZEB
	BCC	CREATE
	CMPB	@#ERRBYT,#3
	BNE	1$
	JMP	PRTERR
1$:	JMP	BADERR
CREATE:	INCB 	FCREAT
INITF:	INCB 	FINIT
CHANGE:	.PRINT	#MESSZ1
	MOV	BUFB <.-$ELHDR>/2
	.IIF GT <$HDLEN-256.> .ERROR
$ELRSM:	.WORD	0
$BFNUM:	.WORD	0
$BFTAB:	.WORD	$ELBF1
	.WORD	$ELBF2
$BFLAG:	.WORD	0
	.WORD	0
$ELBF1:	.BLKW	256.
$ELBF2:	.BLKW	256.
	.END	ERRLOG
                                                                                                                                                                                                                                                                                                                          LK+OSIZEB,R0
	MOV	R0,SMAXSZ
	JSR	PC,NUMBER
	.GTLIN	#LINBUF,#MESSZ2
	TSTB	LINBUF
	BEQ	DOIT
	MOV	#LINBUF,R0
	JSR	PC,ABCVRT
	CMP	R0,#1
	BLE	1$
	TSTB	FINIT
	BNE	2$
	CMP	R0,PNXBLK
	BHI	2$
1$:	.PRINT	#MESF
	.PRINT	#MESILL
	BISB	#SEVER$,@#USERRB
	BR	CHANGE
2$:	MOV	R0,BUFBLK+OSIZEB
	MOV	R0,SMAXSZ
	INCB	FCHGSZ
DOIT:	TSTB	FCREAT
	BNE	1$
	TSTB	FCHGSZ
	BEQ	6$
1$:	TSTB	FINIT
	BNE	2$
	.PURGE	#ELIOCH
	.RENAME	#INSTAT,#ELIOCH,#ELFILE
	BCC	2$
	CMPB	@#ERRBYT,#3
	BNE	13$
14$:	JMP	PRTERR
13$:	J.MCALL	.MODULE
.MODULE	ELINIT,RELEASE=B03,VERSION=01

	.SBTTL	DEFINITIONS
	.MCALL	.CLOSE,	.CSISP,	.DATE
	.MCALL	.DSTAT,	.ENTER,	.EXIT
	.MCALL	.GTIM,	.GTLIN,	.LOOKU
	.MCALL	.PRINT,	.PURGE,	.READW
	.MCALL	.RENAM,	.SDAT,	.WRITE
	.MCALL	.WRITW
	ERRBYT	= 52
	USERRB	= 53
	SYSPTR	= 54
	CONFIG	= 300
	SYSGEN	= 372
		STASK$	= 040000
	ELR$G	= 1
	.IIF NDF ERL$U, ERL$U=10.
	MSKCF1	= ^C014001
	N0CHAR	= '0
	RADDEC	= 10.
	BLKSIZ	= 256.
	ELIOCH	= 0
	ETIOCH	= 1
	MSGCHN	= 2
	SEVER$	= 10
	OMPARE	= <<EMP	BADERR
2$:	.PURGE	#ELIOCH
	.ENTER	#INSTAT,#ELIOCH,#ELFILE,SMAXSZ
	BCC	4$
	TSTB	@#ERRBYT
	BEQ	3$
	CMPB	@#ERRBYT,#3
	BEQ	14$
	JMP	FULERR
3$:	JMP	BADERR
4$:	MOV	SMAXSZ,R1
	DEC	R1
	.WRITW	#INSTAT,#ELIOCH,#BUFBLK,#BLKSIZ,R1
	BCC	5$
	JMP	IORERR
5$:	.CLOSE	#ELIOCH
	BCS	14$
	.LOOKUP	#INSTAT,#ELIOCH,#ELFILE
	BCC	6$
	JMP	BADERR
6$:	TSTB	FINIT
	BEQ	8$
	.GTIM	#INSTAT,#INTIM1
	.DATE
	MOV	R0,INIDAT
	MOV	@#SYSPTR,R1
	MOV	CONFIG(R1),CNFGW1
	MOV	SYSGEN(R1),CNFGW2
	.WRITW	#INSTAT,#ELIOCH,#HEADE	SP,20$
30$:	TST	(SP)+
	BR	70$
40$:	MOV	#STALEN,R1
50$:	CLR	(R0)+
	DEC	R1
	BGT	50$
	MOV	#-1,(R0)
	SUB	#STALEN*2,R0
	MOV	(SP),(R0)
60$:	TST	(SP)+
	TST	(PC)+
70$:	SEC
	RTS	PC
	.SBTTL	CHKSIZ	- CHECK FOR ROOM IN LOGGING BUFFER
CHKSIZ:	MOV	PNXWRD,R0
	ADD	R1,R0
	ADD	R1,R0
	CMP	R0,#255.*2
	BLT	10$
	JSR	PC,10$
	MOV	#-1,(R0)
	MOV	$BFNUM,R0
	INC	$BFLAG(R0)
	INC	$ELRSM
	CMP	PNXBLK,SMAXSZ
	BGE	30$
	NEG	R0
	ADD	#2,R0
	MOV	R0,$BFNUM
	CLR	PNXWRD
	BR	20$
10$:	MOV	$BFNUM,R0
20$:	MOV	$BFTAB(RL$U*7+6>*2>
	OCPARE	= <<ERL$U*7+7>*2>
	ONXREC	= <<ERL$U*7+8.>*2>
	ONXBLK	= <<ERL$U*7+9.>*2>
	OSIZEB	= <<ERL$U*7+11.>*2>
	OCONFG	= <<ERL$U*7+12.>*2>
	.SBTTL	ERROR LOGGING SUBSYSTEM INITIALIZATION
ELINIT::.GTLIN	#LINBUF,#MESDEV
	TSTB	LINBUF
	BEQ	DEVCHK
	.CSISPC	#FILSPC,#DEFEXT,#LINBUF
	MOV	(SP)+,R1
	ASL	R1
	ADD	R1,SP
	MOV	ISPEC,ELFILE
	MOV	ISPEC,ELTEMP
DEVCHK:	.DSTAT	#INSTAT,#ELFILE
	BCC	1$
	JMP	FCHERR
1$:	TST	INSTAT+4
	BNE	2$
	JMP	FCHERR
2$:	.LOOKUP	#INSTAT,#ELIOCH,#ELFILE
	BCC	LOOKOR,#HEDRWD,#0
	BCC	7$
	JMP	IORERR
7$:	.PRINT	#MESGEN
	BR 	DONE
8$:	MOV	#HEDRWD,R2
	MOV	#HEADER,R3
	MOV	#BUFBLK,R4
9$:	MOV	(R4)+,(R3)+
	DEC	R2
	BNE	9$
	.WRITW	#INSTAT,#ELIOCH,#HEADER,#HEDRWD,#0
	BCC	10$
	JMP	IORERR
10$:	TSTB	FCHGSZ
	BEQ	DONE
	.LOOKUP	#INSTAT,#ETIOCH,#ELTEMP
	BCC	11$
	TSTB	@#ERRBYT
	BNE	BADERR
	JMP	CHNERR
11$:	MOV	PNXBLK,R2
12$:	.READW	#INSTAT,#ETIOCH,#BUFBLK,#BLKSIZ,R2
	BCS	IORERR
	.WRITW	#INSTAT,#ELIOCH,#BUFBLK,#BLKSIZ,R2
	BCS	IORERR
	DEC	R2
	BNE	12$
	.PURGE	#ETIOELTEMP:	.RAD50	/SY/
	.RAD50	/ERR/
	.RAD50	/LOG/
	.RAD50	/TMP/
LINBUF:	.BLKB	82.
FILSPC:
OSPEC:	.BLKW	3*5.
ISPEC:	.BLKW	6*4.
DEFEXT:	.WORD	0,0
	.WORD	0,0
BUFBLK:	.BLKW	<BLKSIZ>
HEADER:
OFIXED:	.WORD	<<7*ERL$U+2>*2>
DEVSTS:	.WORD	-1
	.BLKW	<7*ERL$U>
CERECR:	.WORD	0
CMENTB:	.WORD	0
CMENTF:	.WORD	0
CMENTR:	.WORD	0
CMPARE:	.WORD	0
CCPARE:	.WORD	0
PNXREC:	.WORD	1
PNXBLK:	.WORD	1
PNXWRD:	.WORD	0
SMAXSZ:	.WORD	100.
CNFGW1:	.WORD	0
CNFGW2:	.WORD	0
INIDAT:	.WORD	0
INTIM1:	.WORD	0
INTIM2:	CH
DONE:	MOV	@#SYSPTR,R1
	BIT	#STASK$,SYSGEN(R1)
	BEQ	2$
	.LOOKUP	#INSTAT,#MSGCHN,#JBDES
	BCC	1$
	TSTB	@#ERRBYT
	BNE	3$
	JMP	CHNERR
1$:	.WRITE	#INSTAT,#MSGCHN,#HEADER,#HEDRWD
	BCC	4$
	JMP	BADERR
2$:	.SDAT	#INSTAT,#HEADER,#HEDRWD
	BCC	4$
3$:	.PRINT	#MESF
	.PRINT	#MESNFG
	BR	FTLEXT
4$:	.PRINT	#MESDON
	BR	ALLEXT
BADERR:	.PRINT	#MESF
	.PRINT	#MESBAD
	BR	FTLEXT
IORERR:	.PRINT	#MESF
	.PRINT	#MESIOR
	BR	FTLEXT
FCHERR:	.PRINT	#MESF
	.PRINT	#MESFCH
	BR	FTLEXT
FULERR:	.PRINT	#MESF
	.PRIN.WORD	0
HEDRSZ	= <INTIM2-HEADER+2>
HEDRWD	= <HEDRSZ/2>
	.SBTTL	NUMBER	- BINARY TO DECIMAL ASCII
NUMBER:	CLR	R2
1$:	MOV	#10.,R1
	JSR	PC,DIV
	ADD	#60,R1
	MOV	R1,-(SP)
	INC	R2
	TST	R0
	BNE	1$
	MOV	#LINBUF,R3
2$:	MOVB	(SP)+,(R3)+
	DEC	R2
	BNE	2$
	MOVB	#200,(R3)
	.PRINT	#LINBUF
	RTS	PC
	.SBTTL	DIV	- DIVISION ROUTINE
DIV:	MOV	#20,-(SP)
	MOV	R1,-(SP)
	CLR	R1
30$:	ASL	R0
	ROL	R1
	CMP	R1,(SP)
	BLO	40$
	SUB	(SP),R1
	INC	R0
40$:	DEC	2(SP)
	BGT	30$
50$:	CMP	(SP)+,(SP)+
	RTS	PC
	.SBTTT	#MESFUL
	BR	FTLEXT
CHNERR:	.PRINT	#MESF
	.PRINT	#MESCHN
	BR	FTLEXT
PRTERR:	.PRINT	#MESF
	.PRINT	#MESPRT
FTLEXT:	BISB	#SEVER$,@#USERRB
ALLEXT:	.PURGE	#ETIOCH
	.PURGE	#ELIOCH
	CLR 	R0
	.EXIT
	.SBTTL	MESSAGES
	.ENABL	LC
	.NLIST	BIN
MESW:	.NLCSI	TYPE=I,PART=PREFIX
	.ASCII	/W-/<200>
MESF:	.NLCSI	TYPE=I,PART=PREFIX
	.ASCII	/F-/<200>
MESDEV:	.ASCII	/What is the name of the device for the ERRLOG.DAT file/
	.ASCII	/ <SY>? /<200>
MESNFD:	.ASCIZ	/File not found ERRLOG.DAT/
MESSZ1:	.ASCII	/How L	ABCVRT	- DECIMAL ASCII TO BINARY
ABCVRT:	MOV	R3,-(SP)
	MOV	R4,-(SP)
	CLR	R4
1$:	MOVB	(R0)+,R3
	SUB	#N0CHAR,R3
	CMPB	R3,#RADDEC
	BHIS	2$
	ASL	R4
	ADD	R4,R3
	ASL	R4
	ASL	R4
	ADD	R3,R4
	BR	1$
2$:	MOV	R4,R0
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	RTS	PC
	.END	ELINIT
                                                                                                                                                                                                                                               many blocks for the ERRLOG.DAT file </<200>
MESSZ2:	.ASCII	/>? /<200>
MESUS1:	.ASCIZ	/ blocks currently in use of/
MESUS2:	.ASCIZ	/ possible total in ERRLOG.DAT file/
MESINI:	.ASCII	/Do you want to zero the ERRLOG.DAT file and re-initialize/
	.ASCII	\ (YES/NO) <NO>? \<200>
MESGEN:	.ASCIZ	/New ERRLOG.DAT file generated/
MESIV1:	.ASCIZ	/The current ERRLOG.DAT file is invalid/
MESIV2:	.ASCIZ	/The invalid file is renamed ERRLOG.TMP/
MESDON:	.ASCIZ	/FODOS ERROR LOGGING INITIATED/
MESILL:	.ASCIZ	/Invali.MCALL	.MODULE
.MODULE	ELTASK,RELEASE=B03,VERSION=01

	.SBTTL	DEFINITIONS
	.ENABL	LC
	.MCALL	.QSET,	.PRINT,	.MRKT
	.MCALL	.RCVDW,	.LOOKU,	.READW
	.MCALL	.CMKT,	.CHCOP,	.READC
	.MCALL	.RCVDC,	.SPND,	.WRITW
	.MCALL	.RSUM,	.READC,	.EXIT
	SYSPTR	= 54
	CONFIG	= 300
		FBMON$	=      1
		KT11$	=  10000
	SYSGEN	= 372
		STASK$	=  40000
	RCVKEY	= 101010
	ELIOCH	= 0
	ETIOCH	= 1
	MSGCHN	= 2
	.SBTTL	START OF CUSP
	.GLOBL	RECHED,	FREADY,	NOTRDY
	.GLOBL	CMENTR,	PNXBLK
	.GLOBL	$ELHDR,	$HDLEN
	.GLOBLd command/
MESFCH:	.ASCIZ	/Device not available/
MESCHN:	.ASCIZ	/Channel error/
MESIOR:	.ASCIZ	/ERRLOG.DAT file IO error/
MESBAD:	.ASCIZ	/Internal error/
MESFUL:	.ASCIZ	/Device full/
MESNFG:	.ASCIZ	/ERRLOG task not active/
MESPRT:	.ASCIZ	/Protected file already exists ERRLOG.DAT/
	.LIST	BIN
	.DSABL	LC
	.SBTTL	DATA AREA
FCREAT:	.BYTE	0
FINIT:	.BYTE	0
FCHGSZ:	.BYTE	0
	.EVEN
INSTAT:	.BLKW	5
JBDES:	.RAD50	/MQ/
	.ASCII	/ERRLOG/
ELFILE:	.RAD50	/SY/
	.RAD50	/ERR/
	.RAD50	/LOG/
	.RAD50	/DAT/
	$BFNUM,	$BFTAB,	$BFLAG
	.GLOBL	$ELBF1
OPINIT::.QSET	#XTRAQE,#2
	MOV	@#SYSPTR,R1
	BIT	#KT11$,CONFIG(R1)
	BEQ	10$
	INCB	FXM
10$:	BIT	#STASK$,SYSGEN(R1)
	BEQ	20$
	INCB	FST
20$:	.PRINT	#E.INFO
	.PRINT	#M.INI
30$:	.MRKT	#AREAT,#WAITIM,#REMIND,#0
	BCS	30$
	TSTB	FST
	BNE	40$
	.RCVDW	#AREA,#RECHED,#$HDLEN
	BCC	60$
	JMP	ILLERR
40$:	.LOOKUP	#AREA,#MSGCHN,#ZEROAD
	BCC	50$
	JMP	CHNERR
50$:	.READW	#AREA,#MSGCHN,#RECHED,#$HDLEN
	BCC	60$
	JMP	ILLERR
60$:	CMP	RECHED,#$HDLEN
	BEQ	70$
	JMP	IMRERRSCII	/B/
	.BYTE	0,0,0,0,0
WAITIM:	.WORD	0,3777
XTRAQE:	.BLKW	20.
RCVMSG:	.BLKW	2
FXM:	.BYTE	0
FST:	.BYTE	0
	.EVEN
IFATAL:	.WORD	0
	.SBTTL	MESSAGES
	.NLIST	BEX
E.FATL:	.ASCII	/?ERRLOG-F-/<200>
E.WARN:	.ASCII	/?ERRLOG-W-/<200>
E.INFO:	.ASCII	/?ERRLOG-I-/<200>
E.IMR:	.ASCIZ	/Invalid message received/
E.ILL:	.ASCIZ	/Internal error/
E.LIO:	.ASCIZ	/Log file IO error/
E.CER:	.ASCIZ	/Channel error/
M.REM:	.ASCII	/REMINDER: /
M.INI:	.ASCIZ	/To initiate error logging, RUN ELINIT/
	.LIST	BIN
	.ENP03>,DISK,RP,<DS,ER,CS,WC,BA,CA,DA,M1,M2,M3,-SUCA,-SILO>
	ELBLDR	22,<RX11/RX01>,DISK,RX,<CS,DB,ES>
	ELBLDR	23,<RK06/RK07>,DISK,RK,<CS1,WC,BA,DA,CS2,DS,ER,ASOF,DC,ECPS,ECPT,MR2,MR3>
	ELBLDR	34,<TU58>,TAPE,**,<LCHAR,BYTES/FLAG,S-CODE/OPCODE,UNIT,SEQ#,BYTES,STATUS,BYTES/FLAG,MOD/OPCODE,UNIT>
	ELBLDR	50,<DU/MSCP>,DISK,DU,<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20>
	ELBLDR	52,<RX/PRO>,DISK,RX,<5CS0,5CS1,5CS2,5CS3,5CS4,5CS5,5DEB>
	ELBLDR	53,<RD/PRO>,DISK,RD,<STAT,CYL,HEAD,SEC,ERR,ST2>
HSPACE	== .
70$:	.CMKT	#AREAT,#0
	TSTB	FST
	BNE	80$
	.CHCOPY	#AREA,#ETIOCH,#ELIOCH
	BR	90$
80$:	.CHCOPY	#AREA,#ETIOCH,#ELIOCH,#BJBDES
90$:	BCC	100$
	JMP	ILLERR
100$:	MOV	PNXBLK,R4
	.READW	#AREA,#ETIOCH,#$ELBF1,#256.,R4
	BCC	REALTM
	JMP	LIOERR
REALTM::CLR	FREADY
	ADD	NOTRDY,CMENTR
	TSTB	FST
	BEQ	10$
	.READC	#AREA,#MSGCHN,#RCVMSG,#1,#CRTN
	BCC	SUSPND
	JMP	CHNERR
10$:	.RCVDC	#AREA,#RCVMSG,#1,#CRTN
	BCC	SUSPND
	JMP	ILLERR
	.SBTTL	REMIND	- STARTUP REMINDER
REMIND:	.PRINT	#E.INFO
	.PRINT	#M.REM
10$D
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             :	.MRKT	#AREAT,#WAITIM,#REMIND,#0
	BCS	10$
	RTS	PC
	.SBTTL	SUSPND	- WAITING FOR ACTIVATION
SUSPND:	.SPND
ELTASK:	TST	IFATAL
	BEQ	20$
10$:	JMP	FATALE
20$:	JSR	PC,IOCODE
	TST	IFATAL
	BNE	10$
	BR	SUSPND
	.SBTTL	IOCODE	- WRITE BUFFER TO LOGGING FILE
	.GLOBL	SMAXSZ
IOCODE:	MOV	R2,-(SP)
	MOV	PNXBLK,R1
	INC	PNXBLK
	.WRITW	#AREA,#ETIOCH,#$ELHDR,#$HDLEN,#0
	BCC	10$
	MOV	#1,IFATAL
10$:	MOV	$BFNUM,R2
	NEG	R2
	ADD	#2,R2
	.WRITW	#AREA,#ETIOCH,$BFTAB(R2),#256.,R1
	BCC	20$
	MOV	#1,IFATAL
20$:	C.MCALL	.MODULE
.MODULE	ERRTXT,RELEASE=B03,VERSION=01

ELERRT	== 0

	.SBTTL	DEVICE DEPENDENT TEXT BUILDER
	.MACRO	ELBLDR	DVCODE,DTYPE,WHICH1,FIRST2,RGSTR
	.IIF B	DVCODE,	.ERROR
	.IIF LT	DVCODE,	.ERROR
	.IIF GT	<DVCODE-377>,	.ERROR
	.PSECT	PART1
DV'DVCODE:
	.IF IDN	<WHICH1>,<DISK>
		.BYTE	0
	.IFF
	 .IF IDN <WHICH1>,<TAPE>
		.BYTE	5
	 .IFF
	.ERROR	WHICH1
	 .ENDC
	.ENDC
	.NCHR	SYMTYP,<DTYPE>
	.IIF GT <SYMTYP-59.>,	.ERROR
		.BYTE	SYMTYP
		.ASCII	%DTYPE%
	.NCHR	SYMFIR,<FIRST2>
	.IF NE	<SLR	$BFLAG(R2)
	INC	R1
	CMP	R1,SMAXSZ
	BHIS	30$
	MOV	$BFNUM,R2
	.WRITW	#AREA,#ETIOCH,$BFTAB(R2),#256.,R1
	BCC	30$
	MOV	#1,IFATAL
30$:	MOV	(SP)+,R2
	RTS	PC
	.SBTTL	CRTN	- UPDATE DUE TO ERROUT REQUEST
CRTN:	CMP	RCVMSG+2,#RCVKEY
	BEQ	10$
	MOV	#2,IFATAL
	BR	40$
10$:	.WRITW	#AREA,#ETIOCH,#$ELHDR,#$HDLEN,#0
	BCC	20$
	MOV	#1,IFATAL
20$:	MOV	$BFNUM,R1
	.WRITW	#AREA,#ETIOCH,$BFTAB(R1),#256.,PNXBLK
	BCC	30$
	MOV	#1,IFATAL
30$:	TST	IFATAL
	BEQ	50$
40$:	.RSUM
	BR	70$
50$:	TSTB	FST
	BNE	60$
	YMFIR-2>
	.ERROR FIRST2
	.ENDC
		.ASCII	%FIRST2%
		.BYTE	COUNT
	COUNT	= -1
	.BYTE	TMP'DVCODE
	.IRP	NAME,<RGSTR>
	COUNT	= COUNT + 1
	.NCHR	SYMREG,<NAME>
	.IIF NDF CHR'DVCODE,CHR'DVCODE=SYMREG
	 .IF LT	CHR'DVCODE-SYMREG
	CHR'DVCODE = SYMREG
	 .ENDC
	.ENDR
	.IF GT <CHR'DVCODE-13.>
	.ERROR
	.ENDC
TMP'DVCODE	= CHR'DVCODE
	.IRP	NAME,<RGSTR>
	.NCHR	SYMREG,<NAME>
		.ASCII	%NAME%
	 .REPT	CHR'DVCODE-SYMREG
		.BYTE	40
	 .ENDR
	.ENDR
	.EVEN
	.PSECT	PART2
	.IF NDF	POINTL
POINTL::
	.ENDC
	..RCVDC	#AREA,#RCVMSG,#1,#CRTN
	BR	70$
60$:	.READC	#AREA,#MSGCHN,#RCVMSG,#1,#CRTN
70$:	RTS	PC
	.SBTTL	FATALE	- REPORT FATAL ERRORS
FATALE:	DEC	IFATAL
	BEQ	LIOERR
IMRERR:	.PRINT	#E.FATL
	.PRINT	#E.IMR
	BR	SHUTUP
LIOERR:	.PRINT	#E.FATL
	.PRINT	#E.LIO
	BR	SHUTUP
ILLERR:	.PRINT	#E.FATL
	.PRINT	#E.ILL
	BR	SHUTUP
CHNERR:	.PRINT	#E.FATL
	.PRINT	#E.CER
	BR	SHUTUP
SHUTUP:	MOV	#-1,FREADY
	.EXIT
	.SBTTL	IMPURE DATA AREA
AREA:	.BLKW	5
AREAT:	.BLKW	4
ZEROAD:	.RAD50	/MQ/
	.WORD	0,0,0
BJBDES:	.AIF EQ	.-POINTL
POINTL::
	.IFF
	.	= .-4
	.ENDC
		.WORD	DVCODE
		.WORD	DV'DVCODE
		.WORD	-1,-1
	.ENDM	ELBLDR
	.SBTTL	SUPPORTED DEVICES
	ELBLDR	0,<RK11/RK05>,DISK,RK,<DS,ER,CS,WC,BA,DA,DB>
	ELBLDR	1,<TC11/TU56>,TAPE,TC,<ST,CM,WC,BA,DT>
	ELBLDR	5,<RL11/RL01/RL02>,DISK,RL,<CS,BA,DA,MP,STAT,ADDR,BAE>
	ELBLDR	6,<RX211/RX02>,DISK,RX,<2CS,2DB,2ES>
	ELBLDR	12,<RF11/RS11>,DISK,RF,<CS,WC,MA,DA,AE,BR,MA,AS>
	ELBLDR	16,<RJS03/RJS04>,DISK,RS,<CS1,WC,BA,DA,CS2,DS,ER,AS,LA,DB,MR,DT>
	ELBLDR	21,<RP11C/RP02/R.MCALL	.MODULE
.MODULE	PD,RELEASE=B03,VERSION=01

	.SBTTL	BOOTSTRAP ROUTINE DEFINITIONS
	.LIST	MEB
	.MCALL	.DRDEF	.ADDR	.ASSUME
	.DRDEF	PD,36,FILST$,512.,0,0
.DSTATUS=:342
ROMS$T	=:173000
ROM$ID	=:ROMS$T+6
ROM$TP	=:ROM$ID+2
ROM$DT	=:ROM$TP+2
RD$NDP	=:0
RD$NT	=:RD$NDP+2
RD$ASC	=:RD$NT+2
RD$IMP	=:RD$ASC+2
RD$BST	=:RD$IMP+2
RD$BSR	=:RD$BST+2
RD$DID	=:RD$BSR+2
RD$SIO	=:RD$DID+2
RD$ABT	=:RD$SIO+2
RD$PUP	=:RD$ABT+2
RD$ISR	=:RD$PUP+2
BT$IMP	=:10000
DX$COD	=:22
DD$COD	=:34
P3$COD	=:36
P5$URN
RELOCE:
	.IIF GT	.-1000,	.ERROR
	.DSABL	LSB
	.SBTTL	START I/O ENTRY
.ENABL	LSB
	.DRBEG	PD
	BR	5$
PDWPRO:	.BYTE	0,0
				.ASSUME . LE PDSTRT+1000
5$:	MOV	PDCQE,R4
	TST	Q$WCNT(R4)
	BPL	10$
	ASL	(PC)+
PDW1:	.WORD	.-.
				.ASSUME . LE PDSTRT+1000
	BCS	10$
	MOVB	Q$UNIT(R4),R4
	BIC	#<^C7>,R4
	.ADDR	#PDWPRO,R4,ADD
	TSTB	(R4)
	BNE	ERROR
10$:	.ADDR	#.DDL,R5
	MOV	PDCQE,.DDLQ
	CALL	@(PC)+
.STARI:	 .WORD	0
				.ASSUME . LE PDSTRT+1000
ERROR:	MOV	PDCQE,R4
	BIS	#HDERR$,@-(R4)
	BR	PDEXIT
COD	=:37
	.SBTTL	INSTALLATION ROUTINE
	.ASECT
	. = 200
	.ENABL	LSB
PDINST:	BR	O.BAD
	JSR	R4,1$
DEVTBL:	.WORD	DEVEND-DEVTBL/2
DV$UNT:	.BLKW
DV$ASC:	.BLKW
DV$R50:	.BLKW
DV$IMS:	.BLKW
DV$DST:	.BLKW
DV$LOS:	.BLKW
DV$HIS:	.BLKW
DV$PAG:	.BLKW
DV$VEC:	.BLKW
DV$ISR:	.BLKW
DV$PS:	.BLKW
DV$PRI:	.BLKW
DEVEND:
1$:	MOV	@#B$DEVU,R0
	MOV	@#ROM$DT,R1
	ADD	#RD$ISR,R1
	MOV	@R1,.INTRP
	TST	-(R1)
	MOV	-(R1),.ABORT
	MOV	-(R1),.STARI
	CALL	@-(R1)
	MOV	(SP)+,R4
	BCS	O.BAD
	.ADDR	#DV$PRI,R2
	SWAB	@	.SBTTL	INTERRUPT ENTRY
	.ENABL	LSB
	BR	PDABRT
PDINT::	BCS	1$
$INOFF	= .+2
	JSR	R5,@$INPTR
PDPRMS:	 .WORD	340
				.ASSUME . LE PDSTRT+1000
	CLR	FKFLG
	.ADDR	#.DDL,R5
	JMP	@(PC)+
.INTRP:	 .WORD	0
1$:	MOV	R4,-(SP)
	MOV	R5,-(SP)
	.ADDR	#.DDL,R5
	CALL	@.INTRP
	MOV	(SP)+,R5
	MOV	(SP)+,R4
	RTI
	.DSABL	LSB
	.SBTTL	COMPLETION EXIT
COMPLT:	BCS	ERROR
	.IF NE	ERL$G
	CALL	FORK
	MOV	(PC)+,R4
EL$COD:	.BYTE	-1,0
				.ASSUME . LE PDSTRT+1000
	CALL	ERLOG
	.ENDC
PDEXIT:	.DRFIN	PD
PDABRT:	.ADDR
	.END
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        R2
	ASR	@R2
	ASR	@R2
	ASR	@R2
	BIC	@R2,PDPRMS
	CMP	-(R2),-(R2)
	MOV	-(R2),R1
	TST	-(R2)
	TST	-(R2)
	BNE	O.BAD
	MOV	-(R2),54
	BR	INCONT
	.DSABL	LSB
	.IIF GT	.-376,	.ERROR
	.SBTTL	SET OPTIONS
	.DRSET	WRITE,	1,	O.WP,	NO
O.WP:	NOP
	CLR	R3
N.WP:
					.ASSUME O.WP+4 EQ N.WP
	MOV	R3,O.WPF
	CMP	R1,#1
	BHI	O.BAD
	.ADDR	#PDWPRO,R0
	ADD	R1,R0
	MOVB	(PC)+,(R0)
O.WPF:	.BLKW	1
	.ADDR	#DEVNAM,R0
	.ADDR	#DAREA+1,@SP
	EMT	.DSTATUS
	BCS	O.BAD
	MOV	DAREA+4,R0
	BEQ	O.GOOD
	ADD	#PDW1-PDLQE,R0

PP:
.IF EQ	PR11$X
	BIS	#100,@#PP$CSR
	RTS	PC
	.DRVTB	PC,PC$VEC,PCINT
	.DRVTB	,PP$VEC,PPINT
	.DRAST	PP,4,PCDONE
	MOV	PCCQE,R4
	MOV	#PP$CSR,R5
	TST	(R5)+
	BMI	PPERR
.IF EQ	MMG$T
	ADD	#Q$WCNT,R4
	TST	@R4
	BEQ	PCDONE
	INC	@R4
	MOVB	@-(R4),@R5
	INC	@R4
.IFF
	TST	Q$WCNT(R4)
	BEQ	PCDONE
	INC	Q$WCNT(R4)
	JSR	PC,@$GTBYT
	MOVB	(SP)+,@R5
.ENDC
	RTS	PC
.ENDC
PPERR:	BIS	#HDERR$,@-(R4)
	BR	PCFIN
	.DRAST	PC,4,PCDONE
	MOV	PCCQE,R4
.IF EQ	MMG$T
	ADD	#Q$WCNT,R4
.ENDC
	MOV	#PC$CSR,R5
	TST	MOV	#100000,@R0
	ADD	R1,R0
	MOVB	O.WPF,PDWPRO-PDW1(R0)
O.GOOD:	TST	(PC)+
O.BAD:	SEC
	RETURN
DAREA:	.BLKW	4
DEVNAM:	.RAD50	/PD /
	.SBTTL	INSTALLATION CODE (CONT.)
	.ENABL	LSB
INCONT:
2$:	MOV	-(R2),R0
	.IF NE	ERL$G
	MOVB	R0,EL$COD+1
	.ENDC
	CMPB	R0,#DX$COD
	BNE	3$
	ADD	#P5$COD-DX$COD,R0
3$:	CMPB	R0,#DD$COD
	BNE	4$
	ADD	#P3$COD-DD$COD,R0
4$:	MOV	R0,56
	MOV	-(R2),R0
	ASL	R0
	ADD	R0,$INOFF
	ADD	R0,$FKOFF
	.IF NE	ERL$G
	ADD	R0,$ELOFF
	.ENDC
	SUB	R0,R4
	MOV	R4,10.(SP)
	SUB	R0,6.(SP	(R5)+
	BMI	PREOF
.IF EQ	MMG$T
	MOVB	@R5,@-(R4)
	INC	(R4)+
	DEC	@R4
.IFF
	MOVB	@R5,-(SP)
	JSR	PC,@$PTBYT
	DEC	Q$WCNT(R4)
.ENDC
	BEQ	PCDONE
PCGORD:	BIS	#PINT,-(R5)
	RTS	PC
PREOF:	CLR	-(R5)
	.FORK	PCFBLK
1$:
.IF EQ	MMG$T
	CLRB	@-(R4)
	INC	(R4)+
	DEC	@R4
.IFF
	CLR	-(SP)
	JSR	PC,@$PTBYT
	DEC	Q$WCNT(R4)
.ENDC
	BNE	1$
PCDONE:	CLR	@#PC$CSR
.IF EQ	PR11$X
	CLR	@#PP$CSR
.ENDC
	CLR	PCFBLK+2
PCFIN:	.DRFIN	PC
PCFBLK:	.WORD	0,0,0,0
	.DREND	PC
.END
                                      )
	.ADDR	#RELOC,R2
	SUB	#<1000+RELOCE-RELOC>,R4
	MOV	#<RELOCE-RELOC>/2,R3
55$:	MOV	(R2)+,(R4)+
	DEC	R3
	BNE	55$
	MOV	52,R3
	ADD	#1000,R3
	CLC
	ROR	R3
	MOV	R4,R5
	ADD	R0,R5
	CALL	RELOC-RELOCE(R4)
	.ADDR	#.DDL,R5
	ADD	R4,@R5
	CLR	@(R5)+
	CLR	(R5)+
	MOV	#.DDLEN-.DDLCP/2,R3
5$:	ADD	R4,(R5)+
	DEC	R3
	BNE	5$
	MOV	R1,R2
	BIC	#^C<3>,R2
	BIC	R2,R1
6$:	MOV	R1,(R5)+
	CMP	(R5)+,(R5)+
	CMP	(R1)+,(R1)+
	DEC	R2
	BPL	6$
	BR	O.GOOD
RELOC:	MOV	(R5)+,(R4)+
	DEC	R3
	BNE	RELOC
	SUB	R0,@SP
	RET
	MOV	#BT$IMP+2,R5
	MOV	@#B$DEVU,R3
	CALL	@RD$BSR(R4)
	BCS	BIOERR
	RETURN
BOOT:	MOV	#10000,SP
	MOV	R0,-(SP)
	BIC	#^C<7>,@SP
	MOV	@SP,@#B$DEVU
	MOV	#2,R0
	MOV	#<4*400>,R1
	MOV	#1000,R2
	CALL	READ
	MOV	#READ-PDBOOT,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	MOV	(SP)+,@#B$DEVU
	JMP	@#B$BOOT
	.DREND	PD
	.END
                                                                                                                                                                                                     BUF:	.BLKW	RFNREG
.ENDC
.SBTTL	BOOTSTRAP DRIVER
	.DRBOT	RF,BOOT1,READ
.	= RFBOOT+40
BOOT1:	JMP	BOOT
.	= RFBOOT+120
READ:	MOV	#RFDA,R3
	MOV	R0,R5
	SWAB	R5
	MOV	R5,R4
	CLRB	R5
	MOV	R5,(R3)+
	BIC	#177740,R4
	MOV	R4,@R3
	TST	-(R3)
	MOV	R2,-(R3)
	MOV	R1,-(R3)
	NEG	@R3
	MOV	#5,-(R3)
3$:	TSTB	@R3
	BPL	3$
	TST	@R3
	BMI	4$
	CLC
	RETURN
4$:	JMP	BIOERR
.	= RFBOOT+614
BOOT:	MOV	#10000,SP
	MOV	#2,R0
	MOV	#<4*400>,R1
	MOV	#1000,R2
	MOV	#READ-RFBOOT,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	JSR	PC.MCALL	.MODULE
.MODULE	RF,RELEASE=B03,VERSION=01

.MCALL	.DRDEF
.GLOBL	$RFNUM
.IIF NDF $RFNUM, $RFNUM=1
.DRDEF	RF,12,100012,2000*$RFNUM,177460,204
RFCS	= RF$CSR
RFWC	= RFCS+2
RFMA	= RFCS+4
RFDA	= RFCS+6
RFAE	= RFCS+10
CMAINH	= 400
RD	= 105
WR	= 103
RFIDEN	= 5000
RFIDS	= 5377
RFRCNT	= 3400
RFNREG	= 10
RFREGA	= 177460
	.SBTTL	INSTALLATION CHECK
	.ASECT
	. = 200
	NOP
	MOV	176,R0
	TSTB	-20(R0)
	BCS	1$
	BPL	1$
	MOV	#-2,-6(R0)
	BCS	1$
	CMP	#-2,-6(R0)
	BNE	2$
1$:	TST	(PC)+
2$:	SEC,READ
	CLR	@#B$DEVU
	JMP	@#B$BOOT
	.DREND	RF
.END
                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
	RTS	PC
	.SBTTL	DRIVER ENTRY POINT
	.DRBEG	RF
ENTRY:	MOV	#7,(PC)+
RFTRY:	 .WORD	0
AGAIN:	JSR	R0,RFCOMN
ZERO:	 .WORD	0
.IF EQ	MMG$T
	MOV	(R5)+,-(R4)
.IFF
	JSR	PC,@$MPPTR
	MOV	(SP)+,-(R4)
	MOV	(SP)+,R3
	BIT	#1700,R3
	BNE	RFHER
.ENDC
	MOV	(R5)+,-(R4)
	MOV	#WR,R5
	TST	@R4
	BEQ	RFEXIT
	BMI	1$
	MOV	#RD,R5
	NEG	@R4
1$:
.IF NE	MMG$T
	BIS	R3,R5
.ENDC
	MOV	R5,-(R4)
	RTS	PC
	.DRAST	RF,5,RFABORT
	MOV	RFCQE,R5
	TST	@#RFCS
	BPL	RFFILL
	.FORK	RFFBLK
.IF NE	ERL$G
	BIT	#6000,@#RFCS
	B.MCALL	.MODULE
.MODULE	EL,RELEASE=B03,VERSION=01

	.SBTTL	ABSTRACT
	.ENABL	LC
	.SBTTL	DEFINITIONS
	.MCALL	.DATE,	.DRDEF,	.GTIM
	.MCALL	.PRINT,	.DSTAT
	.DRDEF	EL,2,RONLY$,ERL$S+1,0,0
	.MACRO	BCS.	LABEL,?ALT
	BCC	ALT
	JMP	LABEL
ALT:
	.ENDM
	SYSPTR	= 54
	CONFIG	= 300
		FBMON$	=      1
	CONFG2	= 370
		CACHE$	=      1
	SYSGEN	= 372
	PNPTR	= 404
	ERL$G	= 1
	.IIF NDF ERL$U	ERL$U	= 10.
	.IIF NDF ERL$S	ERL$S	= 1
	UNITMK	= 7
	GOODIO	= -1
	PARERR	= -2
	CCHERR	= -3
	PCHERR	= -4
	O.UNIT	= 0	#.DDL,R5
	CALL	@(PC)+
.ABORT:	 .WORD	0
				.ASSUME . LE PDSTRT+1000
	CLR	PDFBLK+2
	BR	PDEXIT
	.SBTTL	FORK ROUTINE
FORK:	TST	(PC)+
FKFLG:	 .WORD	0
	BNE	1$
	MOV	(SP)+,FKFLG
$FKOFF	= .+2
	JSR	R5,@$FKPTR
	 .WORD	PDFBLK-.
	MOV	FKFLG,-(SP)
1$:	RETURN
PDFBLK:	.BLKW	4
	.SBTTL	ERROR LOGGER
ERLOG:
	.IF NE	ERL$G
	MOV	R5,-(SP)
	MOV	PDCQE,R5
$ELOFF	= .+2
	CALL	@$ELPTR
	MOV	(SP)+,R5
	.ENDC
SYNCH:
TIMOUT:
XPGLNK:
ERRPT:	RETURN
	.SBTTL	DEVICE DRIVER LIST
.DDL:	.WORD	ENDCOD-IMPUR
.DDLQ:	.NE	RFHER
	BIT	#2000,@#RFAE
	BNE	RFHER
	MOV	PC,R1
	ADD	#RFRBUF-.,R1
	MOV	R1,R2
	MOV	#RFNREG,R4
	MOV	#RFREGA,R3
RFRREG:	MOV	(R3)+,(R1)+
	DEC	R4
	BNE	RFRREG
	MOV	#RFNREG,R3
	ADD	#RFRCNT,R3
	MOVB	RFTRY,R4
	DEC	R4
	ADD	#RFIDEN,R4
	JSR	PC,@$ELPTR
.ENDC
RFRETY:	DEC	RFTRY
	BGT	AGAIN
RFHER:	MOV	RFCQE,R5
	BIS	#HDERR$,@-(R5)
.IF NE	ERL$G
	BR	RFEXIT
RFHOME:	.FORK	RFFBLK
	MOV	#RFIDS,R4
	MOV	RFCQE,R5
	JSR	PC,@$ELPTR
.IFF
RFHOME:
.ENDC
RFEXIT:	.DRFIN	RF
RFABORT:MOV	#400,@#RFCS
	CLR	RFFBLK+WORD	0
.DDLCP:	.WORD	COMPLT-IMPUR
.DDLFR:	.WORD	FORK-IMPUR
.DDLSY:	.WORD	SYNCH-IMPUR
.DDLEL:	.WORD	ERLOG-IMPUR
.DDLTM:	.WORD	TIMOUT-IMPUR
.DDLXP:	.WORD	XPGLNK-IMPUR
.DDLER:	.WORD	ERRPT-IMPUR
.DDLOP:	.WORD	OPTLST-IMPUR
.DDLEN:
				.ASSUME . LE PDSTRT+1000
	.DRVTB	PD,0,PDINT
	.DRVTB	,0,PDINT
	.DRVTB	,0,PDINT
	.DRVTB	,0,PDINT
OPTLST:	.WORD	0
ENDCOD:
	.SBTTL	BOOTSTRAP DRIVER
	.DRBOT	PD,BOOT1,READ
IMPUR	== PDEND
	. = PDBOOT+40
BOOT1:	JMP	@#BOOT-PDBOOT
	. = PDBOOT+550
READ:	MOV	@#ROM$DT,R42
	BR	RFEXIT
RFFILL:	JSR	R0,RFCOMN
	 .WORD	CMAINH
	MOV	2(R5),R5
	BPL	RFHOME
	TSTB	R5
	BEQ	RFHOME
	NEG	R5
	ADD	R5,@R4
	ADC	2(R4)
	BIS	#177400,R5
	MOV	PC,-(R4)
	ADD	#ZERO-.,@R4
	MOV	R5,-(R4)
	MOV	#WR,-(R4)
	RTS	PC
POPHOM:	MOV	(SP)+,R0
	BR	RFHOME
RFCOMN:	MOV	#RFAE,R4
	BIT	@R0,@R4
	BNE	POPHOM
	MOV	#400,@#RFCS
	MOV	RFCQE,R5
	MOV	(R5)+,-(SP)
	SWAB	@SP
	MOV	@SP,@R4
	BIC	#177740,@R4
	BIS	(R0)+,@R4
	CLRB	@SP
	MOV	(SP)+,-(R4)
	TST	(R5)+
	RTS	R0
RFFBLK:	.WORD	0,0,0,0
.IF NE	ERL$G
RFR752
	.SBTTL	INSTALLATION CODE
	.ASECT
	. = 200
	BR	10$
	BR	20$
10$:	MOV	@#SYSPTR,R0
	BIT	#FBMON$,CONFIG(R0)
	BNE	20$
	TST	(PC)+
20$:	SEC
	RTS	PC
	.IIF GT,<.-356>	.ERROR
	.SBTTL	SET OPTIONS
	.DRSET	LOG,	NOP,	O.LOG,	NO
	.DRSET	PURGE,	NOP,	O.PURG
	.ENABL	LSB
O.LOG:	BR	5$
	NOP
	BR	O.NLOG
5$:	JSR	PC,FINDRV
	BCS	O.BAD
	MOV	@#SYSPTR,R2
	MOV	R1,R0
	ADD	#CNFGW1-ELLQE,R0
	TST	(R0)
	BNE	10$
	MOV	CONFIG(R2),(R0)+
	MOV	SYSGEN(R2),(R0)+
	MOV	R1,-(SP)
	ADD	#GETDAT-ELLQE,(SP)
	JSR	PC,@(SP)+
	BR	80$
40$:	MOVB	R3,R1
	ADD	#DEVFIX,R1
	JSR	PC,CHKSIZ
	BCS.	$ELERR
50$:	TST	(SP)
	BEQ	60$
	ADD	#O.ERL,(SP)
	INC	@(SP)
60$:
	MOVB	R1,(R0)+
	MOVB	PNXREC,(R0)+
	INC	PNXREC
	MOVB	Q$UNIT(R5),(R0)
	BICB	#<^CUNITMK>,(R0)+
	SWAB	R4
	MOVB	R4,(R0)+
	SWAB	R4
	MOVB	R4,(R0)+
	MOVB	#1,(R0)+
	JSR	PC,GETDAT
	MOV	(R5)+,(R0)+
	TST	(R5)+
	MOV	(R5)+,(R0)+
	MOV	(R5)+,(R0)+
	MOV	R3,(R0)+
	MOVB	R3,R3
70$:	MOV	(R2)+,(R0)+
	DEC	R3
	BGT	70$
	ASL	R1
	ADD	R1,PNXWRD
	NEG	R1
	MOV	R1,(R0)
80$:	BR	$ELX
10$:	MOV	R1,R2
	ADD	#$ELCPY-ELLQE,R2
	BR	20$
O.NLOG:	JSR	PC,FINDRV
	BCS	O.GOOD
	CLR	R2
20$:	MOV	$ELPTR-ELLQE(R1),R0
	TST	(R0)+
	MOV	R2,(R0)
	BR	O.GOOD
	.DSABL	LSB
O.PURG:	JSR	PC,FINDRV
	BCS	O.BAD
	MOV	#1,PNXREC-ELLQE(R1)
	MOV	#1,PNXBLK-ELLQE(R1)
	CLR	PNXWRD-ELLQE(R1)
	CLR	$ELFLG-ELLQE(R1)
	RTS	PC
FINDRV:	MOV	PC,R0
	ADD	#DEVNAM-.,R0
	MOV	PC,-(SP)
	ADD	#DAREA-.,(SP)
	EMT	342
	BCS	O.BAD
	MOV	DAREA+4,R1
	BEQ	O.BAD
O.GOOD:	TST	(PC)+
O.BAD:	SEC
	RTS	PC
DAREA:	.BLKW	4
DEVNAM:	.RAD50IT
	.SBTTL	MEMERR	- MEMORY ERROR RECORD LOGGER
	STKDPC	= 36
	STKDPS	= 40
MEMERR:	CMPB	R4,#PARERR
	BNE	20$
10$:	INC	CMPARE
	BR	30$
20$:	INC	CCPARE
	CMPB	R4,#PCHERR
	BEQ	10$
30$:	TST	PNXWRD
	BEQ	40$
	CLR	R1
	JSR	PC,CHKSIZ
	ADD	(R0),R0
	CMPB	M.TYPE(R0),#PARERR
	BGT	40$
	CMP	STKDPC(SP),M.PC(R0)
	BNE	40$
	INC	M.OCUR(R0)
	BR	100$
40$:	MOV	R5,-(SP)
	MOV	#PARMAX,R1
50$:	TST	(R5)+
	BEQ	60$
	DEC	R1
	BGT	50$
60$:	MOV	(SP)+,R5
	NEG	R1
	ADD	#PARMAX,R1
	MOV	R1,R3
	ASL	R1
	ADD	#PARFIX,R1	/EL /
	.IIF GT,<.-1000> .ERROR
	.SBTTL	DRIVER REQUEST ENTRY POINT
	.DRBEG	EL
	MOV	ELCQE,R4
	MOV	Q$WCNT(R4),R2
	BEQ	ELDONE
	BLT	ELERR
	MOV	Q$BUFF(R4),R1
	MOV	PC,R0
	ADD	#$ELHDR-.,R0
	MOV	(R4),R3
	BGT	10$
	CMP	R2,#$HDLEN
	BLE	30$
	MOV	#$HDLEN,R2
	BR	20$
10$:	ADD	#$ELBFR-$ELHDR,R0
	CMP	(R4),#ERL$S
	BGT	ELEOF
	DEC	R3
	SWAB	R3
	ASL	R3
	ADD	R3,R0
	ADD	R2,R3
	ADD	R2,R3
	SUB	#ERL$S*256.*2,R3
	BLE	30$
	ASR	R3
	SUB	R3,R2
20$:;	MOV	R2,Q$WCNT(R5)
30$:	MOV	(R0)+,(R1)+
	DEC	R2
	BGT	20$
	MOV	@#SYSPTR,R0
	BIT	#CACHE$,CONFG2(R0)
	BEQ	70$
	ADD	#3,R1
70$:	JSR	PC,CHKSIZ
	BCS	$ELERR
	MOVB	R1,(R0)+
	MOVB	PNXREC,(R0)+
	INC	PNXREC
	MOVB	R4,(R0)+
	MOVB	R3,(R0)+
	MOV	#1,(R0)+
	JSR	PC,GETDAT
	MOV	STKDPC(SP),(R0)+
	MOV	STKDPS(SP),(R0)+
80$:	MOV	@(R5),(R0)+
	MOV	(R5)+,(R0)+
	DEC	R3
	BGT	80$
	MOV	@#SYSPTR,R3
	BIT	#CACHE$,CONFG2(R3)
	BEQ	90$
	MOV	@#MSYSER,(R0)+
	MOV	@#MCONRG,(R0)+
	MOV	@#MHITMS,(R0)+
90$:	ASL	R1
	ADD	R1,PNXWRD
	NEG	R1
	MOV	R1,(R0)
100$:	BR	$ELXIT
	.SBTTL	$E
	BR	ELDONE
ELEOF:	BIS	#EOF$,@-(R4)
	BR	ELDONE
ELERR:	BIS	#HDERR$,@-(R4)
ELINT:
ELDONE:	.DRFIN	EL
	.SBTTL	$ELCPY	- START OF COPY CODE
$ELCPY:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R4,-(SP)
	MOV	R5,-(SP)
	CLR	-(SP)
	INC	CERECR
	CMPB	R4,#GOODIO
	BGT	DEVERR
	BLT	MEMERR
	DEC	CERECR
	JSR	PC,GESTAT
	BCS	20$
	ADD	#O.READ,R0
	TST	Q$WCNT(R5)
	BEQ	20$
	BPL	10$
	ADD	#O.WRIT-O.READ,R0
10$:	ADD	#1,(R0)+
	ADC	(R0)
20$:	JMP	$ELXIT
	.SBTTL	DEVERR	- DEVICE ERROR RECORD LOLXIT	- EXIT ROUTINES
$ELERR:	TST	(PC)+
$ELFLG:	 .WORD	0
	BNE	10$
	MOV	SP,$ELFLG
	MOV	PC,R0
	ADD	#E.FULL-.,R0
	.PRINT
10$:	INC	CMENTB
$ELXIT:	TST	(SP)+
	MOV	(SP)+,R5
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RTS	PC
	.SBTTL	GESTAT	- GET POINTER TO DEVICE STATISTICS ENTRY
GESTAT:	MOVB	Q$UNIT(R5),-(SP)
	BIC	#<^CUNITMK>,(SP)
	MOV	R4,R0
	CLRB	R0
	BIS	R0,(SP)
	MOV	PC,R0
	ADD	#DEVSTS-.,R0
	MOV	#ERL$U,R1
10$:	CMP	(R0),#-1
	BEQ	40$
	CMP	(R0),(SP)
	BEQ	60$
	A
	O.ID	= 1
	O.ERL	= 2
	O.ERR	= 4
	O.READ	= 6
	O.WRIT	= 12
	STALEN	= 7.
	D.SIZE	= 0
	D.RNUM	= 1
	D.DVUN	= 2
	D.DVID	= 3
	D.RTRY	= 4
	D.OCUR	= 5
	D.DATE	= 6
	D.HOT	= 10
	D.LOT	= 12
	D.BLKN	= 14
	D.BUFF	= 16
	D.WCNT	= 20
	D.REGN	= 22
	D.MTRY	= 23
	D.REG	= 24
	DEVFIX	= 10.
	M.SIZE	= 0
	M.RNUM	= 1
	M.TYPE	= 2
	M.MREG	= 3
	M.OCUR	= 4
	M.DATE	= 6
	M.HOT	= 10
	M.LOT	= 12
	M.PC	= 14
	M.PS	= 16
	M.REG	= 20
	PARMAX	= 16.
	PARFIX	= 8.
	MSYSER	= 177744
	MCONRG	= 177746
	MHITMS	= 177GGER
DEVERR:	JSR	PC,GESTAT
	BCS	10$
	INC	O.ERR(R0)
	MOV	R0,(SP)
10$:	TST	PNXWRD
	BEQ	40$
	CLR	R1
	JSR	PC,CHKSIZ
	ADD	(R0),R0
	MOV	R4,R1
	CLRB	R1
	BISB	Q$UNIT(R5),R1
	BICB	#<^CUNITMK>,R1
	CMP	R1,D.DVUN(R0)
	BNE	40$
	CMPB	R4,D.RTRY(R0)
	BGE	40$
	MOV	R0,-(SP)
	MOV	R2,-(SP)
	ADD	#D.REG,R0
	MOVB	R3,R1
20$:	CMP	(R0)+,(R2)+
	BNE	30$
	DEC	R1
	BGT	20$
30$:	MOV	(SP)+,R2
	MOV	(SP)+,R0
	TST	R1
	BNE	40$
	INCB	D.OCUR(R0)
	MOVB	R4,D.RTRY(R0)
	TST	(SP)
	BEQ	80$
	ADD	#O.ERL,(SP)
	INC	@(SP)DD	#STALEN*2,R0
	DEC	R1
	BGT	10$
	TST	(PC)+
20$:	 .WORD	0
	BNE	30$
	MOV	PC,R0
	ADD	#E.STAT-.,R0
	.PRINT
	MOV	SP,20$
30$:	TST	(SP)+
	BR	70$
40$:	MOV	#STALEN,R1
50$:	CLR	(R0)+
	DEC	R1
	BGT	50$
	MOV	#-1,(R0)
	SUB	#STALEN*2,R0
	MOV	(SP),(R0)
60$:	TST	(SP)+
	TST	(PC)+
70$:	SEC
	RTS	PC
	.SBTTL	CHKSIZ	- CHECK FOR ROOM IN LOGGING BUFFER
CHKSIZ:	MOV	PNXWRD,R0
	ADD	R1,R0
	ADD	R1,R0
	CMP	R0,#255.*2
	BLT	10$
	CMP	PNXBLK,SMAXSZ
	BGE	20$
	JSR	PC,10$
	MOV	#-1,(R0)
	INC	PNXBLK
	CLR	PNXWRD10000
	ERPGE	=   4000
	ERNXM	=   2000
	ERDLT	=   1000
	ERTE	=    400
	ERNXD	=    200
	ERNXC	=    100
	ERNXS	=     40
	ERCSE	=      2
	ERWCK	=      1
	CSERR	= 100000
	CSHE	=  40000
	CSSCP	=  20000
	CSINHB	=   4000
	CSFMT	=   2000
	CSSSE	=    400
	CSRDY	=    200
	CSIE	=    100
	CSBA67	=     60
	CSBA16	=     20
	CSFUN	=     16
	CSGO	=      1
	FNRST	= 0*2
	FNWRITE	= 1*2
	FNREAD	= 2*2
	FNWCHK	= 3*2
	FNSEEK	= 4*2
	FNRCHK	= 5*2
	FNDRST	= 6*2
	FNWLK	= 7*2
	DAUNIT	= 160000
	DACYL	=  17
10$:	MOV	PNXBLK,R0
	DEC	R0
	SWAB	R0
	ASL	R0
	ADD	PNXWRD,R0
	ADD	PC,R0
	ADD	#$ELBFR-.,R0
	TST	(PC)+
20$:	SEC
	RTS	PC
	.SBTTL	GETDAT	- PLACE DATE/TIME IN RECORD
GETDAT:	MOV	R0,-(SP)
	MOV	PC,R0
	ADD	#ELAREA-.,R0
	MOV	#21*400,(R0)
	MOV	(SP),2(R0)
	ADD	#2,2(R0)
	.GTIM
	.DATE
	MOV	R0,@(SP)
	MOV	(SP)+,R0
	ADD	#6,R0
	RTS	PC
	.SBTTL	TEXT
	.NLIST	BEX
E.FULL:	.NLCSI	TYPE=I,PART=PREFIX
	.ASCIZ	/W-Buffer is full, logging suspended/
E.STAT:	.NLCSI	TYPE=I,PART=PREFIX
	.ASCIZ	/W-Device stati740
	DASUR	=     20
	DASC	=     17
	.SBTTL	SET OPTIONS
	.DRSET	CSR,	160000,	O.CSR,	OCT
	.DRSET	VECTOR,	500,	O.VEC,	OCT
	.DRSET	RETRY,	RKCNT,	O.RTRY,	NUM
	.IF NE ERL$G
	.DRSET	SUCCES,	-1,	O.SUCC,	NO
	.ENDC
	BTCSR	= <RKEND-RKSTRT>+<BOTCSR-RKBOOT>+1000
O.CSR:	CMP	R0,R3
	BLO	O.BAD
	MOV	R0,176
	MOV	PC,R1
	ADD	#BAREA-.+4,R1
	MOV	PC,R2
	ADD	#1000-.,R2
	MOV	R2,(R1)
	MOV	#BTCSR/1000,-(R1)
	TST	-(R1)
	MOV	R0,R3
	ADD	#RKDA-RKDS,R3
	MOV	R1,R0
	EMT	375
	BCS	O.BAD
	MOV	R3,<BTCSR&777>(R2)
	MOV	stics table is full/
	.EVEN
	.LIST	BEX
	.SBTTL	IMPURE DATA AREA
ELAREA:	.BLKW	2
$ELHDR:
OFIXED:	.WORD	<<7*ERL$U+2>*2>
DEVSTS:	.WORD	-1
	.BLKW	<7*ERL$U>
CERECR:	.WORD	0
CMENTB:	.WORD	0
CMENTF:	.WORD	0
CMENTR:	.WORD	0
CMPARE:	.WORD	0
CCPARE:	.WORD	0
PNXREC:	.WORD	1
PNXBLK:	.WORD	1
PNXWRD:	.WORD	0
SMAXSZ:	.WORD	ERL$S
CNFGW1:	.WORD	0
CNFGW2:	.WORD	0
INIDAT:	.WORD	0
INTIM1:	.WORD	0
INTIM2:	.WORD	0
	$HDLEN	= <.-$ELHDR>/2
	.IIF GT <$HDLEN-256.> .ERROR
$ELBFR:	.BLKW	<ERL$S*256.>
	.DREND	R1,R0
	INCB	1(R0)
	EMT	375
	BCS	O.BAD
	MOV	R1,R0
	DECB	1(R0)
	MOV	#1,2(R0)
	EMT	375
	BCS	O.BAD
	MOV	R3,RKCSR
O.GOOD:	TST	(PC)+
O.BAD:	SEC
	RTS	PC
O.VEC:	CMP	R0,R3
	BHIS	O.BAD
	BIT	#3,R0
	BNE	O.BAD
	MOV	R0,RKSTRT
	BR	O.GOOD
O.RTRY:	CMP	R0,R3
	BHI	O.BAD
	MOV	R0,DRETRY
	BNE	O.GOOD
	BR	O.BAD
	.IF NE ERL$G
O.SUCC:	MOV	#0,R3
	MOV	R3,SCSFLG
	BR	O.GOOD
	.ENDC
BAREA:	.BYTE	17,10
	.BLKW
	.BLKW
	.WORD	256.
	.WORD	0
	.IIF GT,<.-1000> .ERROR
	.SBTTL	DRIVER ENTRY
	.DRBEG	RK
	MOV	(PC)EL
	.END
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     +,(PC)+
DRETRY:	 .WORD	RKCNT
RETRY:	 .WORD	0
	MOV	RKCQE,R5
	MOV	@R5,R2
	MOV	Q$UNIT-1(R5),R4
	ASR	R4
	ASR	R4
	ASR	R4
	SWAB	R4
	BIC	#^C<DAUNIT>,R4
	BR	2$
1$:	ADD	R2,R4
	ASR	R2
	ASR	R2
	ADD	R3,R2
2$:	MOV	R2,R3
	BIC	#^C<17>,R3
	BIC	R3,R2
	BNE	1$
	CMP	#12.,R3
	BGT	3$
	ADD	#4,R3
3$:	ADD	R3,R4
	MOV	R4,DISKAD
AGAIN:	MOV	RKCQE,R5
	MOV	#CSIE!FNWRITE!CSGO,R3
	MOV	(PC)+,R4
RKCSR:	 .WORD	RKDA
	MOV	(PC)+,@R4
DISKAD:	 .WORD	0
	CMP	(R5)+,(R5)+
	.IF EQ	MMG$T
	MOV	(R5)+,-(R4)
	.IFF
	JSR	PC,.MCALL	.MODULE
.MODULE	RK,RELEASE=B03,VERSION=01

	.SBTTL	MACROS AND DEFINITIONS
	.MCALL	.DRDEF
	.DRDEF	RK,0,FILST$,4800.,177400,220
	RKDS	= RK$CSR
	RKER	= RKDS+2
	RKCS	= RKDS+4
	RKWC	= RKDS+6
	RKBA	= RKDS+10
	RKDA	= RKDS+12
	RKCNT	= 8.
	RKNREG	= 7
	DSID	= 160000
	DSDPL	=  10000
	DSRK05	=   4000
	DSDRU	=   2000
	DSSIN	=   1000
	DSSOK	=    400
	DSDRY	=    200
	DSREDY	=    100
	DSWPS	=     40
	DSSCOK	=     20
	DSSC	=     17
	ERDRE	= 100000
	EROVR	=  40000
	ERWLO	=  20000
	ERSKE	=  @$MPPTR
	MOV	(SP)+,-(R4)
	MOV	(SP)+,R0
	BIT	#1700,R0
	BNE	HERROR
	.ENDC
	MOV	(R5)+,-(R4)
	BEQ	7$
	BMI	5$
	NEG	@R4
	MOV	#CSIE!FNREAD!CSGO,R3
5$:
	.IF NE	MMG$T
	BIS	R0,R3
	.ENDC
	MOV	R3,-(R4)
6$:	RTS	PC
7$:	MOV	#CSIE!FNSEEK!CSGO,-(R4)
	BR	6$
	.IF NE ERL$G
SCSFLG:	.WORD	0
	.ENDC
	.SBTTL	INTERRUPT ENTRY POINT
	.DRAST	RK,5
	MOV	RKCSR,R5
	ADD	#RKER-RKDA,R5
	MOV	(R5)+,R4
	TST	RETRY
	BPL	NORMAL
	TST	@R5
	BMI	NORMAL
	BIT	#CSSCP,@R5
	BEQ	RTSPC
	.FORK	RKFBLK
RKRETR:	CLRB	RETRY+1
	BR.MCALL	.MODULE
.MODULE	TT,RELEASE=B03,VERSION=01

	.MCALL	.TTINR,.DRBEG,.DREND
MONLOW	= 54
OFFSET	= 270
TTPS	= 310
TTPB	= 312
TTDSIZ	= 0
TTSTS	= 4
EOF$	= 20000
.IF DF MMG$T
.IIF NE MMG$T, .ERROR
.ENDC
.IIF	NDF	MMG$T, MMG$T = 0
.IIF	NDF	ERL$G, ERL$G = 0
.IIF	NDF	TIM$IT,TIM$IT = 0
.IIF	NDF	RTE$M, RTE$M = 0
.IIF	NDF	PDT$OP, PDT$OP = 0
	.DRBEG	TT,0,TTDSIZ,TTSTS
.ENABL	LSB
TTINT:	BR	TTSET
	BR	TTRD
	TST	TTCQE
	BEQ	OIGNR
	JSR	R2,@PC
	ADD	#RING+2-.,R2
	MOV	R4,-(SP)
	TST	-2(R5)
	BEQ	1$
.MCALL .MODULE
.MODULE VM,RELEASE=B03,VERSION=01

	.ENABL	LC
	.NLIST	BEX
.SBTTL	General comments
.SBTTL	Macros and Definitions
	.MCALL	.DRDEF,.PRINT
.IIF NDF MMG$T,MMG$T = 0
.IIF EQ  MMG$T,MMVEC = 250
.IIF NE  MMG$T,MMVEC = 0
	.DRDEF	VM,47,FILST$,0,177572,MMVEC
MMSR0	= 177572
MMSR1	= 177574
MMSR2	= 177576
MMSR3	= 172516
UISDR0	= 177600
UISDR7	= 177616
UISAR0	= 177640
UISAR7	= 177656
KISDR0	= 172300
KISDR7	= 172316
KISAR0	= 172340
KISAR1	= 172342
KISAR7	= 172356
SYSPTR	= 54
CONFG2		AGAIN
NORMAL:	CMP	@R5,#CSRDY!CSIE!FNSEEK
	BEQ	RTSPC
	TST	@R5
	BPL	DONE
	.FORK	RKFBLK
	.IF NE	ERL$G
	BIT	#EROVR!ERWLO!ERNXM!ERNXD!ERNXC!ERNXS,R4
	BNE	RKERR
	MOV	PC,R5
	ADD	#RKRBUF-.,R5
	MOV	R5,R2
	MOV	RKCSR,R3
	ADD	#RKDS-RKDA,R3
	MOV	#RKNREG,R4
RKRREG:	MOV	(R3)+,(R5)+
	DEC	R4
	BNE	RKRREG
	MOV	DRETRY,R3
	SWAB	R3
	ADD	#RKNREG,R3
	MOV	RKCQE,R5
	MOVB	RETRY,R4
	DEC	R4
	JSR	PC,@$ELPTR
	MOV	RKCSR,R5
	ADD	#RKER-RKDA,R5
	MOV	(R5)+,R4
	.ENDC
RKERR:	MOV	#FNRST!CSGO,@R5
3$:	TSTB	@R5
	BPL		TST	WAITPR
	BNE	COMX
1$:	CLR	(PC)+
WAITPR:	 .WORD	1
	ADD	@R4,R4
	TST	@R4
	BMI	DON1
	TST	OPFLG
	BPL	COMX
TT2:	TST	20.(R4)
	BNE	DONE
2$:	TST	(R2)+
	BEQ	4$
	TSTB	@(R2)
	BEQ	3$
	MOV	R2,R5
	BR	COMX
3$:	INC	@R2
	DEC	-(R2)
	BR	2$
4$:	MOV	R4,R5
	ADD	#16.,R5
	BR	DONE
DON1:	MOV	TTCQE,R2
	CLR	10(R2)
DONE:	JSR	PC,FINIS
	MOV	PC,R2
	ADD	#RING+2-.,R2
	MOV	@SP,R4
	ADD	@R4,R4
	TST	@R2
	BNE	TT2
	CLRB	1(R4)
COMX:	MOV	(SP)+,R4
	MOV	(SP)+,R2
OIGNR:	TST	(R4)+
	RTS	R4
.DSABL	LSB
TTRD:	TST	T3$
	DECB	RETRY
	BEQ	HERROR
	BIT	#ERDRE!ERSKE,R4
	BEQ	RKRETR
	MOV	DISKAD,@RKCSR
	BIS	#100000,RETRY
	MOV	#CSIE!FNDRST!CSGO,@R5
RTSPC:	RTS	PC
HERROR:	MOV	RKCQE,R5
	BIS	#HDERR$,@-(R5)
	.IF NE	ERL$G
	BR	RKEXIT
DONE:	.FORK	RKFBLK
	TST	SCSFLG
	BNE	RKEXIT
	MOV	(PC)+,R4
	 .BYTE	377,RK$COD
	MOV	RKCQE,R5
	JSR	PC,@$ELPTR
	.IFF
DONE:
	.ENDC
RKEXIT:	CLR	RETRY
	.DRFIN	RK
RKFBLK:	.WORD	0,0,0,0
	.IF NE ERL$G
RKRBUF:	.BLKW	RKNREG
	.ENDC
	.SBTTL	BOOTSTRAP DRIVER
	.DRBOT	RK,BOOT1,READ
	. = RKBOOTCQE
	BEQ	OIGNR
	JSR	R2,@PC
	ADD	#RING+4-.,R2
	MOV	R4,-(SP)
	ADD	@R4,R4
	TST	@R4
	BMI	DON1
1$:	JSR	R4,GETCHR
	 BR	COMX
	 BR	1$
	 BR	DONE
.ENABL	LSB
TTSET:	JSR	R2,@PC
	ADD	#RING-.,R2
	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	@#MONLOW,R3
	MOV	TTCQE,R4
	CMP	(R4)+,(R4)+
	MOV	(R4)+,(R2)+
	MOV	@R4,@R2
	MOV	@R2,-(SP)
	BGT	1$
	BEQ	5$
	NEG	@R2
	MOV	SP,WAITPR
	BR	2$
1$:	TST	EFFLG
	BEQ	2$
	CLR	EFFLG
	MOV	TTCQE,R2
	BIS	#EOF$,@-(R2)
	BR	5$
2$:	ASL	(R2)+
	MOV	-(R4),(R2)+
	MOV	@R4,@R2
	ADD	-4(RT+40
BOOT1:	JMP	@#BOOT-RKBOOT
	. = RKBOOT+210
READ:	MOV	#12.,R3
	BR	2$
1$:	ADD	#20,R3
2$:	SUB	#12.,R0
	BPL	1$
	ADD	R3,R0
	MOV	BOTCSR,R3
	BIC	#^C<DAUNIT>,@R3
	BIS	R0,@R3
	MOV	R2,-(R3)
	MOV	R1,-(R3)
	NEG	@R3
	MOV	#FNREAD!CSGO,-(R3)
3$:	TSTB	@R3
	BPL	3$
	TST	@R3
	BMI	BIOERR
	RTS	PC
	. = RKBOOT+574
BOOT:	MOV	#10000,SP
	MOV	@(PC)+,-(SP)
BOTCSR:	 .WORD	RKDA
	ROL	@SP
	ROL	@SP
	ROL	@SP
	ROL	@SP
	BIC	#^C<7>,@SP
	MOV	#2,R0
	MOV	#<4*400>,R1
	MOV	#1000,R2
	JSR	PC,READ
	MOV	#READ-RKBOOT2),@R2
	MOV	@SP,(PC)+
OPFLG:	.WORD	0
	BMI	3$
	TST	(PC)+
CTFLG:	.WORD	0
	BNE	7$
22$:	BITB	#100,@TTPS(R3)
	BNE	22$
	MOV	#'^,@TTPB(R3)
3$:
.IF EQ	PDT$OP
	BIS	#100,@TTPS(R3)
.IFF
	MOV	#100,@TTPS(R3)
.ENDC
7$:	TST	(SP)+
	BMI	6$
	TST	-(R2)
4$:	JSR	R4,GETCHR
	 BR	6$
	 BR	4$
5$:	JSR	PC,FINIS
6$:	MOV	(SP)+,R3
	MOV	(SP)+,R4
	MOV	(SP)+,R2
	RTS	PC
.DSABL	LSB
.ENABL	LSB
GETCHR:	MOV	R0,-(SP)
	CLR	CTFLG
	TST	OPFLG
	BLE	CHRET
	.TTINR
	BCS	CHRET
	TST	(R4)+
	CMP	R0,#'Z&77
	BEQ	11$
	MOVB,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	MOV	(SP)+,@#B$DEVU
	JMP	@#B$BOOT
	.DREND	RK
	.END
                                                                                                                                                                                                                                                                                                                                                                                                                                       	R0,@(R2)+
	INC	-2(R2)
	CMP	@R2,-(R2)
	BEQ	4$
	BR	CHRET
11$:	MOV	SP,CTFLG
1$:	CMP	(R2)+,@R2
	BHIS	3$
	CLRB	@-(R2)
	INC	@R2
	BR	1$
3$:	MOV	SP,(PC)+
EFFLG:	.WORD	0
4$:	TST	(R4)+
CHRET:	MOV	(SP)+,R0
	RTS	R4
.DSABL	LSB
RING:	.WORD	0,0,0,0
FINIS:	CLR	OPFLG
	CLR	RING+2
	MOV	PC,R4
	ADD	#TTCQE-.,R4
	TST	@R4
	BEQ	1$
	MOV	@#MONLOW,R2
	JSR	PC,@OFFSET(R2)
1$:	RTS	PC
	.DREND	TT
	.END
                                                                                                             (SP)
	MOV	R1,(R0)+
	MOV	(R0)+,-(SP)
	MOV	@R0,-(SP)
	MOV	R1,(R0)+
	MOV	(R0)+,-(SP)
	MOV	#V.MPTY,R0
	MOV	@R0,-(SP)
	ADD	#MPT-NXM,R1
	MOV	R1,@R0
	CLR	R0
	MOV	#8.,R1
	MOV	#KISAR0,R3
15$:	CLC
	MOV	#AP$ACF,KISDR0-KISAR0(R3)
	BCS	25$
	MOV	R0,(R3)+
	ADD	#200,R0
	SOB	R1,15$
	BR	30$
NXM:	BIS	#1,2(SP)
MPT:	RTI
	.IIF	GT <. - 400>, .ERROR
	. = $$.SET
20$:	TST	(PC)+
25$:	SEC
	MOV	(SP)+,@#V.MPTY
	MOV	#V.TRP4+10,R0
	.REPT	4
	MOV	(SP)+,-(R0)
	.ENDR
	MOV	(SP)+,R3
	BIC	#PS,@#PS
	RTS	PC
30$:	MR0
	MOV	@R3,R4
	BMI	VMWRT
	BEQ	VMTRAP
.SBTTL	Perform I/O functions
	INC	R4
	ASR	R4
	BCC	20$
VMREAD:	MOV	(R5)+,(R0)+
20$:	MOV	(R5)+,(R0)+
	SOB	R4,VMREAD
	BR	VMTRAP
VMWRT:	NEG	R4
	INC	R4
	ASR	R4
	BCC	40$
30$:	MOV	(R0)+,(R5)+
40$:	MOV	(R0)+,(R5)+
	SOB	R4,30$
	MOVB	@R3,R4
	BEQ	VMTRAP
50$:	CLR	(R5)+
	DECB	R4
	BNE	50$
VMTRAP:	CLR	@#MMSR0
	CLR	@#PS
	JSR	R0,M22SET
	 .WORD	0
	BR	VMDONE
VMERR:	MOV	VMCQE,R5
	BIS	#HDERR$,@-(R5)
VMDONE:	.DRFIN	VM
.SBTTL	Abort and interrupt entry pointsOV	#177600,-(R3)
	MOV	#AP$ACF,@#UISDR0
	MOV	#PUMODE!PR7,@#PS
	MOV	#1,@#MMSR0
	MOV	#UISAR0,R3
	MOV	(PC)+,@R3
I.BASE:	 .WORD	VM$BASE
	BIS	#MODE22,@#MMSR3
35$:	CLR	@#MMSR0
	CLR	@#MMSR3
	BR	20$
	.DSABL	LSB
.ENDC
	.IIF GT <.-1000>, .ERROR
	.SBTTL	XM Installation code
.IF NE	MMG$T
	.ENABL	LSB
VMINST::NOP
	MOV	@#SYSPTR,R1
	MOV	$MEMPT(R1),R0
	ADD	R1,R0
	MOV	4(R0),R0
	ADD	R1,R0
	MOV	(PC)+,R1
I.BASE:	 .WORD	VM$BASE
10$:	CMP	(R0)+,#-1
	BEQ	110$
	TST	(R0)+
	BEQ	10$
	CMP	-2(R0),R1
	BHI	10$
	BR	VMTRAP
VMINT:	MOV	#160000,R5
	ADD	#100,@#UISAR7
	MOV	@#MMSR2,R1
	CMP	@R1,(PC)+
	 MOV	(R0)+,(R5)+
	BNE	60$
	TST	-(R0)
60$:	BIC	R5,@#MMSR0
	MOV	PC,R2
	ADD	#VMTRAP-.,R2
	CMP	R1,R2
	BNE	70$
	BIC	R5,2(SP)
70$:	MOV	R1,@SP
VMRTI:	RTI
	.DSABL	LSB
.SBTTL	Manipulate 22 bit mode.
M22SET:	MOV	#PR7,@#PS
	MOV	@#4,-(SP)
	MOV	PC,R2
	ADD	#VMRTI-.,R2
	MOV	R2,@#4
	MOV	(R0)+,@#MMSR3
	MOV	(SP)+,@#4
	CLR	@#PS
	RTS	R0
.ENDC
.SBTTL	XM I/O code.
.IF NE	MMG$T
XMIO:	MOV	@#SYSPTR,R4
	MOV	P1EXT(R4),= 370
	PROS$	= 020000
PNPTR	= 404
MEMSIZ	= 420
$MEMPT	= 430
	$RAMSZ	= -2
P1EXT	= 432
V.TRP4	= 4
V.MPTY	= 114
PS	= 177776
UMODE	= 140000
MODE22	= 000020
PUMODE	= 030000
AP$ACF	= 077406
LKCSR	= 177546
SWR	= 177570
PR7	= 000340
BLK18	= 384.
.IF NDF	VM$BASE
 .IF EQ	MMG$T
  VM$BASE = 1600
 .IFF
  VM$BASE = 10000
 .ENDC
.ENDC
	.SBTTL	Text area for set code
	.ASECT
	. = 120
REINST:	.ASCIZ	"?VM-W-Remove and reinstall this handler"
	.EVEN
	.IIF GT <.-174> .ERROR
	.SBTTL	Set code
	.D
	MOV	-(R0),-(SP)
	ADD	-(R0),@SP
	MOV	@SP,(PC)+
TOP:	 .WORD	0
	CMP	(SP)+,R1
	BHI	20$
	CMP	(R0)+,(R0)+
	BR	10$
20$:	MOV	R0,-(SP)
30$:	CMP	(R0)+,#-1
	BEQ	40$
	TST	(R0)+
	BR	30$
40$:	TST	@R0
	BEQ	50$
	ADD	#6,R0
	CMP	@R0,#-1
	BNE	40$
	TST	(SP)+
	BR	110$
50$:	MOV	TOP,@R0
	SUB	R1,(R0)+
	MOV	R1,(R0)+
	MOV	#<^RVM >,@R0
	MOV	-4(R0),R1
	MOV	(SP)+,R0
	SUB	R1,(R0)+
	BNE	60$
	CLR	@R0
	BR	60$
	.IIF	GT <. - 360>, .ERROR
	. = $$.SET
60$:	CLC
	ROR	R1
	ASR	R1
	ASR	R1
	MOV	R1,54
100$:	TSTRSET	BASE,1600,S.BASE,OCT
S.BASE:	CMP	R0,R3
	BLO	ERRRET
	CMP	R0,V.BASE
	BEQ	5$
	.IF EQ MMG$T
	BTBASE	= <VMEND-VMSTRT>+<B.BASE-VMBOOT>+1000
	MOV	PC,R1
	ADD	#BAREA-.+4,R1
	MOV	PC,R2
	ADD	#1000-.,R2
	MOV	R2,(R1)
	MOV	#BTBASE/1000,-(R1)
	TST	-(R1)
	MOV	R0,R3
	MOV	R1,R0
	EMT	375
	BCS	ERRRET
	MOV	R3,BTBASE&777(R2)
	MOV	R1,R0
	INCB	1(R0)
	EMT	375
	BCS	ERRRET
	MOV	R1,R0
	DECB	1(R0)
	MOV	#1,2(R0)
	EMT	375
	BCS	ERRRET
	MOV	R3,V.BASE
	MOV	R3,I.BASE
	.IFF
	MOV	R0,V.BASE
	MOV	R0,I.BASE
		(PC)+
110$:	SEC
	RTS	PC
	.DSABL	LSB
.ENDC
	.SBTTL	Driver entry
	.DRBEG	VM
	.ENABL	LSB
	ASR	#1
	BCC	40$
	MOV	@#SYSPTR,R0
	ADD	PNPTR(R0),R0
	MOV	R0,R1
20$:	CMP	(R0)+,#-1
	BNE	20$
	SUB	R1,R0
	TST	-(R0)
30$:	CMP	(R1)+,#<^RVM >
	BNE	30$
	ADD	R0,R1
	ADD	R0,R1
	ASR	R0
	ADD	R0,R1
	MOV	(R1),(PC)+
VMSIZE:	 .WORD	0
40$:
	.DSABL	LSB
.IF EQ	MMG$T
TEST2K:	MOV	@#SYSPTR,R0
	CMP	MEMSIZ(R0),#1600
	BHI	VMERR
	.ENABL	LSB
	MOV	VMCQE,R3
	MOV	(R3),R0
	CMP	R0,VMSIZE
	BHIS	VMERR
	MOV	Q$WCNT(R3).ENDC
	MOV	PC,R0
	ADD	#REINST-.,R0
	.PRINT
5$:	TST	(PC)+
ERRRET:	SEC
	RTS	PC
	.IF EQ MMG$T
BAREA:	.BYTE	17,10
	.BLKW
	.BLKW
	.WORD	256.
	.WORD	0
	.ENDC
	$$.SET	= .
	.SBTTL	SJ/FB Installation code
	. = 200
.IF EQ	MMG$T
	.ENABL	LSB
VMINST:	BR	5$
	BR	10$
5$:	MOV	@#SYSPTR,R1
	MOV	$MEMPT(R1),R0
	ADD	R1,R0
	MOV	$RAMSZ(R0),R1
10$:	SUB	I.BASE,R1
	BLOS	ERRRET
	CLC
	ROR	R1
	ASR	R1
	ASR	R1
	MOV	R1,54
	MOV	R3,-(SP)
	MOV	#V.TRP4,R0
	MOV	PC,R1
	ADD	#NXM-.,R1
	MOV	#PR7,@#PS
	MOV	@R0,-,R1
	BPL	1$
	NEG	R1
1$:	CLRB	R1
	SWAB	R1
	ADD	R1,R0
	CMP	R0,VMSIZE
	BHI	VMERR
	MOV	(R3)+,R2
	ASL	R2
	ASL	R2
	ASL	R2
	ADD	(PC)+,R2
V.BASE:	 .WORD	VM$BASE
	CLR	R4
	MOV	#UISAR0,R1
	MOV	#8.,R0
10$:	MOV	#77406,UISDR0-UISAR0(R1)
	MOV	#77406,KISDR0-UISAR0(R1)
	MOV	R4,KISAR0-UISAR0(R1)
	MOV	R4,(R1)+
	ADD	#200,R4
	SOB	R0,10$
	MOV	R2,-(R1)
	MOV	#37406,@#UISDR7
	MOV	#177600,@#KISAR7
	MOV	#160000,R5
	JSR	R0,M22SET
	 .WORD	MODE22
	MOV	#UMODE,@#PS
15$:	MOV	#1,@#MMSR0
	TST	(R3)+
	MOV	(R3)+,0
BOOT1:	JMP	@#BOOT-VMBOOT
. = VMBOOT + 250
	.WORD	VMINT1-VMBOOT
	.WORD	340
	.ENABL	LSB
READ:	MOV	R1,-(SP)
	CLR	-(SP)
	TSTB	R1
	BEQ	2$
	INC	@SP
2$:	CLRB	R1
	SWAB	R1
	ADD	(SP)+,R1
	ADD	R0,R1
	CMP	R1,#BLK18
	BLO	5$
	MOV	#MODE22,@#MMSR3
5$:	MOV	(SP)+,R1
	ASL	R0
	ASL	R0
	ASL	R0
	ADD	(PC)+,R0
B.BASE:	 .WORD	VM$BASE
	CLR	R4
	MOV	#UISAR0,R3
	MOV	#8.,R5
10$:	MOV	#77406,UISDR0-UISAR0(R3)
	MOV	#77406,KISDR0-UISAR0(R3)
	MOV	R4,KISAR0-UISAR0(R3)
	MOV	R4,(R3)+
	ADD	#200,R4
	SOB	R5,10$
	M1 DISPLAY PROCESSOR. THE MACROS PRODUCE
; CALLS TO THE VT11 DEVICE SUPPORT PACKAGE, USING GLOBAL REFERENCES. 

; MACRO TO GENERATE A MACRO WITH ZERO ARGUMENTS.

.MACRO MAC0 NAME,CALL
	.MACRO NAME
	.GLOBL	CALL
	JSR	PC,CALL
	.ENDM
.ENDM

; MACRO TO GENERATE A MACRO WITH ONE ARGUMENT

.MACRO MAC1 NAME,CALL
	.MACRO NAME ARG
	.IF NB,ARG
	MOV	ARG,%^O0
	.ENDC
	.GLOBL	CALL
	JSR	PC,CALL
	.ENDM
.ENDM

; MACRO TO GENERATE A MACRO WITH TWO OPTIONAL ARGUMENTS

.MACRO MAC2 NAME,CALL
	.MACRO NAMOV	R0,-(R3)
	MOV	#37406,@#UISDR7
	MOV	#177600,@#KISAR7
	MOV	#160000,R5
	BIS	#UMODE,@#PS
	BIS	#1,@#MMSR0
	INC	R1
	ASR	R1
	BCC	30$
20$:	MOV	(R5)+,(R2)+
30$:	MOV	(R5)+,(R2)+
	SOB	R1,20$
VMTRP1:	CLR	@#MMSR0
	BIC	#UMODE,@#PS
	CLC
	RETURN
VMINT1:	MOV	#160000,R5
	ADD	#100,@#UISAR7
	MOV	@#MMSR2,R3
	BIC	R5,@#MMSR0
	MOV	PC,R0
	ADD	#VMTRP1-.,R0
	CMP	R3,R0
	BNE	40$
	BIC	R5,2(SP)
40$:	MOV	R3,@SP
	RTI
BOOT:	MOV	#10000,SP
	MOV	#2,R0
	MOV	#<4*400>,R1
	MOV	#1000,R2
	JSR	PC,READ
	MOV	#READ-VMBE ARG1,ARG2
	.GLOBL	CALL
	.IF NB,ARG1
	MOV	ARG1,%^O0
	.ENDC
	.IF NB,ARG2
	MOV	ARG2,-(SP)
	.IFF
	CLR	-(SP)
	.NARG	T
	.IF EQ,T
	CLR	%^O0
	.ENDC
	.ENDC
	JSR	PC,CALL
	.ENDM
.ENDM

; MACRO LIBRARY FOR VT11:

MAC0	<.CLEAR>,<$VINIT>
MAC0	<.STOP>,<$VSTOP>
MAC0	<.START>,<$VSTRT>
MAC1	<.INSRT>,<$VNSRT>
MAC1	<.REMOV>,<$VRMOV>
MAC1	<.BLANK>,<$VBLNK>
MAC1	<.RESTR>,<$VRSTR>
MAC1	<.STAT>,<$VSTPM>
MAC1	<.LPEN>,<$VLPEN>
MAC1	<.SCROL>,<$VSCRL>
MAC2	<.TRACK>,<$VTRAK>
MAC0	<.LNKRT>,<$VRTLK>
MAC0OOT,@#B$READ
	MOV	#B$DNAM,@#B$DEVN
	CLR	@#B$DEVU
	JMP	@#B$BOOT
	.DSABL	LSB
.ENDC
	.DREND	VM
	.END
                                                                                                                                                                                                                                                                                                                                                                                                                      	<.UNLNK>,<$VUNLK>
; MNEMONIC DEFINITIONS FOR THE VT11 DISPLAY PROCESSOR

DJMP=160000	;DISPLAY JUMP
DNOP=164000	;DISPLAY NOP
DJSR=173400	;DISPLAY SUBROUTINE CALL
DRET=173400	;DISPLAY SUBROUTINE RETURN
DNAME=173520	;SET NAME REGISTER
DSTAT=173420	;RETURN STATUS DATA
DHALT=173500	;STOP DISPLAY AND RETURN STATUS DATA

CHAR=100000	;CHARACTER MODE
SHORTV=104000	;SHORT VECTOR MODE
LONGV=110000	;LONG VECTOR MODE
POINT=114000	;POINT MODE
GRAPHX=120000	;GRAPH X MODE
GRAPHY=124000	;GRAPH Y MODE
RELA(PC)+
$BLKMV:	 .WORD	0
	SUB	#2,$BLKMV
	MOV	VMCQE,R4
	MOV	(R4),R0
	CMP	R0,VMSIZE
	BHIS	VMERR
	MOV	Q$WCNT(R4),R1
	BEQ	VMDONE
	BPL	1$
	NEG	R1
1$:	CLRB	R1
	SWAB	R1
	ADD	R1,R0
	CMP	R0,VMSIZE
	BHI	VMERR
	MOV	Q$WCNT(R4),-(SP)
	BMI	WRITE
$READ:	JSR	R0,SETBUF
	JSR	R0,SETDSK
	BR	DOIO
WRITE:	NEG	@SP
	JSR 	R0,SETDSK
	JSR	R0,SETBUF
DOIO:	MOV	(SP)+,R1
	MOV	(SP)+,R2
	TST	(SP)+
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	TST	(SP)+
	MOV	(SP)+,R5
	CALL	@$BLKMV
	MOV	VMCQE,R0
	MOV	Q$WCNT(R0),R1
	BPL	VMDONE
.MCALL	.MODULE
.MODULE	VTMAC,RELEASE=V05,VERSION=01,COMMENT=<VT11 MACROS>

;                        COPYRIGHT (c) 1984 BY
;             DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;                         ALL RIGHTS RESERVED.
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND  COPIED
; ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH  LICENSE AND WITH THE
; INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR  ANY  OTHER
; COPIES  THEREOF MAY NOT BE PROVIDED OR OTHERWISE M	MOVB	R1,R1
	BEQ	VMDONE
	MOV	R4,Q$BUFF(R0)
	MOV	R3,Q$PAR(R0)
	MOV	R0,R4
10$:	CLR	-(SP)
	JSR	PC,@$PTWRD
	DECB	R1
	BNE	10$
	BR	VMINT
	RTS	PC
VMINT:	BR	VMDONE
VMERR:	MOV	VMCQE,R5
	BIS	#HDERR$,@-(R5)
VMDONE:	.DRFIN	VM
SETDSK:	MOV	#20000,-(SP)
	MOV	Q$BLKN(R4),-(SP)
	ASL	@SP
	ASL	@SP
	ASL	@SP
	ADD	(PC)+,@SP
V.BASE:	 .WORD	VM$BASE
	JMP	@R0
SETBUF:	MOV	Q$BUFF(R4),-(SP)
	MOV	Q$PAR(R4),-(SP)
	JMP	@R0
.ENDC
.SBTTL	Bootstrap read routine
.IF EQ	MMG$T
	.DRBOT	VM,BOOT1,READ
. = VMBOOT + 24ADE AVAILABLE TO ANY
; OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE  SOFTWARE  IS  HEREBY
; TRANSFERRED.
;
; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE
; AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT
; CORPORATION.
;
; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS
; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
; VTMAC IS A LIBRARY OF MACRO CALLS AND MNEMONIC DEFINITIONS WHICH
; PROVIDE SUPPORT OF THE VT1US REG B
INCR=100	;GRAPH PLOT INCREMENT
INTX=40000	;INTENSIFY VECTOR OR POINT
MAXX=1777	;MAXIMUM X INCR. - LONGV
MAXY=1377	;MAXIMUM Y INCR. - LONGV
MINUSX=20000	;NEGATIVE X INCREMENT
MINUSY=20000	;NEGATIVE Y INCREMENT
MAXSX=17600	;MAXIMUM X INCR. - SHORTV
MAXSY=77	;MAXIMUM Y INCR. - SHORTV
MISVX=20000	;NEGATIVE X INCR. - SHORTV
MISVY=100	;NEGATIVE Y INCR. - SHORTV
                                                                                                                                      R2)+
	BNE	30$
	DEC	R1
	BGT	20$
30$:	MOV	(SP)+,R2
	MOV	(SP)+,R0
	TST	R1
	BNE	50$
	INCB	D.OCUR(R0)
	MOVB	R4,D.RTRY(R0)
	TST	(SP)
	BEQ	40$
	ADD	#O.ERL,(SP)
	INC	@(SP)
40$:	BR	90$
50$:	MOVB	R3,R1
	ADD	#DEVFIX,R1
	MOV	@#SYSPTR,R0
	BIT	#KT11$,CONFIG(R0)
	BEQ	55$
	INC	R1
55$:	JSR	PC,CHKSIZ
	BCS.	$ELERR
60$:	TST	(SP)
	BEQ	70$
	ADD	#O.ERL,(SP)
	INC	@(SP)
70$:
	MOVB	R1,(R0)+
	MOVB	PNXREC,(R0)+
	INC	PNXREC
	MOVB	Q$UNIT(R5),(R0)
	BICB	#<^CUNITMK>,(R0)+
	SWAB	R4
	MOVB	R4,(R0)+
	SWAB	R4.MCALL	.MODULE
.MODULE	ELCOPY,RELEASE=B03,VERSION=01

	.SBTTL	DEFINITIONS
	.ENABL	LC
	.MCALL	.QELDF,	.DATE,	.GTIM
	.MCALL	.PRINT,	.MFPS,	.MTPS
	.MACRO	BCS.	LABEL,?ALT
	BCC	'ALT'
	JMP	LABEL
'ALT':
	.ENDM
	.MACRO	BLT.	LABEL,?ALT
	BGE	'ALT'
	JMP	LABEL
'ALT':
	.ENDM
	SYSPTR	= 54
	$DATE	= 262
	CONFIG	= 300
		FBMON$	=      1
		KT11$	=  10000
	CONFG2	= 370
		CACHE$	=      1
	PNPTR	= 404
	$GTIME	= 422
	ERL$G	= 1
	.IIF NDF ERL$U	ERL$U	= 10.
	UNITMK	= 7
	.QELDF
	GOODIO	= -1
	PARERR	= -2
	MOVB	R4,(R0)+
	MOVB	#1,(R0)+
	JSR	PC,GETDAT
	MOV	(R5)+,(R0)+
	TST	(R5)+
	MOV	(R5)+,(R0)+
	MOV	(R5)+,(R0)+
	MOV	@#SYSPTR,-(SP)
	ADD	#CONFIG,(SP)
	BIT	#KT11$,@(SP)+
	BEQ	75$
	MOV	(R5)+,(R0)+
75$:	MOV	R3,(R0)+
	MOVB	R3,R3
80$:	MOV	(R2)+,(R0)+
	DEC	R3
	BGT	80$
	ASL	R1
	ADD	R1,PNXWRD
	NEG	R1
	MOV	R1,(R0)
90$:	BR	$ELXIT
	.SBTTL	MEMERR	- MEMORY ERROR RECORD LOGGER
	STKDPC	= 30
	STKDPS	= 32
MEMERR:	CMPB	R4,#PARERR
	BNE	20$
10$:	INC	CMPARE
	BR	30$
20$:	INC	CCPARE
	CMPB	R4,#PCHERR
	
	CCHERR	= -3
	PCHERR	= -4
	O.UNIT	= 0
	O.ID	= 1
	O.ERL	= 2
	O.ERR	= 4
	O.READ	= 6
	O.WRIT	= 12
	STALEN	= 7.
	D.SIZE	= 0
	D.RNUM	= 1
	D.DVUN	= 2
	D.DVID	= 3
	D.RTRY	= 4
	D.OCUR	= 5
	D.DATE	= 6
	D.HOT	= 10
	D.LOT	= 12
	D.BLKN	= 14
	D.BUFF	= 16
	D.WCNT	= 20
	D.PAR1	= 22
	D.REGN	= 22
	D.MTRY	= 23
	D.REG	= 24
	DEVFIX	= 10.
	M.SIZE	= 0
	M.RNUM	= 1
	M.TYPE	= 2
	M.MREG	= 3
	M.OCUR	= 4
	M.DATE	= 6
	M.HOT	= 10
	M.LOT	= 12
	M.PC	= 14
	M.PS	= 16
	M.REG	= 20
	PARMAX	= 16.
	PARFIX	BEQ	10$
30$:	TST	PNXWRD
	BEQ	40$
	CLR	R1
	JSR	PC,CHKSIZ
	ADD	(R0),R0
	CMPB	M.TYPE(R0),#PARERR
	BGT	40$
	CMP	STKDPC(SP),M.PC(R0)
	BNE	40$
	INC	M.OCUR(R0)
	BR	100$
40$:	MOV	R5,-(SP)
	MOV	#PARMAX,R1
50$:	TST	(R5)+
	BEQ	60$
	DEC	R1
	BGT	50$
60$:	MOV	(SP)+,R5
	NEG	R1
	ADD	#PARMAX,R1
	MOV	R1,R3
	ASL	R1
	ADD	#PARFIX,R1
	MOV	@#SYSPTR,R0
	BIT	#CACHE$,CONFG2(R0)
	BEQ	70$
	ADD	#3,R1
70$:	JSR	PC,CHKSIZ
	BCS	$ELERR
	MOVB	R1,(R0)+
	MOVB	PNXREC,(R0)+
	INC	PNXREC
	MOVB	R4,(R0)+
	MOVB	R3,(R= 8.
	MSYSER	= 177744
	MCONRG	= 177746
	MHITMS	= 177752
	.SBTTL	$ELCPY	- START OF COPY CODE
	.GLOBL	OPINIT,	FREADY
	.WORD	$ELCPY
ERRLOG::JMP	OPINIT
$ELCPY:	TST	(PC)+
FREADY:	 .WORD	1
	BEQ	CONTIN
	BMI	10$
	INC	NOTRDY
10$:	CLC
	RTS	PC
CONTIN:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R4,-(SP)
	MOV	R5,-(SP)
	CLR	-(SP)
	INC	CERECR
	CMPB	R4,#GOODIO
	BGT	DEVERR
	BLT.	MEMERR
	DEC	CERECR
	JSR	PC,GESTAT
	BCS	20$
	ADD	#O.READ,R0
	TST	Q$WCNT(R5)
	BEQ	20$
	BPL	10$
	AD0)+
	MOV	#1,(R0)+
	JSR	PC,GETDAT
	MOV	STKDPC(SP),(R0)+
	MOV	STKDPS(SP),(R0)+
80$:	MOV	@(R5),(R0)+
	MOV	(R5)+,(R0)+
	DEC	R3
	BGT	80$
	MOV	@#SYSPTR,R3
	BIT	#CACHE$,CONFG2(R3)
	BEQ	90$
	MOV	@#MSYSER,(R0)+
	MOV	@#MCONRG,(R0)+
	MOV	@#MHITMS,(R0)+
90$:	ASL	R1
	ADD	R1,PNXWRD
	NEG	R1
	MOV	R1,(R0)
100$:	BR	$ELXIT
	.SBTTL	$ELXIT	- EXIT ROUTINES
$ELERR:	TST	(PC)+
$ELFLG:	 .WORD	0
	BNE	10$
	MOV	SP,$ELFLG
	MOV	PC,R0
	ADD	#E.FULL-.,R0
	.PRINT
10$:	INC	CMENTB
$ELXIT:	TST	(SP)+
	MOV	(SP)+,R5TV=130000	;RELATIVE VECTOR MODE

INT0=2000	;INTENSITY 0
INT1=2200
INT2=2400
INT3=2600
INT4=3000
INT5=3200
INT6=3400
INT7=3600

LPOFF=100	;LIGHT PEN OFF
LPON=140	;LIGHT PEN ON
BLKOFF=20	;BLINK OFF
BLKON=30	;BLINK ON
LINE0=4		;SOLID LINE
LINE1=5		;LONG DASH
LINE2=6		;SHORT DASH
LINE3=7		;DOT DASH

STATSA=170000	;LOAD STATUS REG A
LPLITE=200	;INTENSIFY ON LPEN HIT
LPDARK=300	;DON'T INTENSIFY
ITAL0=40	;ITALICS OFF
ITAL1=60	;ITALICS ON
SYNC=4		;POWER LINE SYNC

STATSB=174000	;LOAD STATD	#O.WRIT-O.READ,R0
10$:	ADD	#1,(R0)+
	ADC	(R0)
20$:	JMP	$ELXIT
	.SBTTL	DEVERR	- DEVICE ERROR RECORD LOGGER
DEVERR:	JSR	PC,GESTAT
	BCS	10$
	INC	O.ERR(R0)
	MOV	R0,(SP)
10$:	TST	PNXWRD
	BEQ	50$
	CLR	R1
	JSR	PC,CHKSIZ
	ADD	(R0),R0
	MOV	R4,R1
	CLRB	R1
	BISB	Q$UNIT(R5),R1
	BICB	#<^CUNITMK>,R1
	CMP	R1,D.DVUN(R0)
	BNE	50$
	CMPB	R4,D.RTRY(R0)
	BGE	50$
	MOV	R0,-(SP)
	MOV	R2,-(SP)
	ADD	#D.REG,R0
	MOV	@#SYSPTR,R1
	BIT	#KT11$,CONFIG(R1)
	BEQ	15$
	ADD	#2,R0
15$:	MOVB	R3,R1
20$:	CMP	(R0)+,(
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	DEC	$ELRSM
	BEQ	10$
	CLR	$ELRSM
	TST	(PC)+
10$:	SEC
	RTS	PC
	.SBTTL	GESTAT	- GET POINTER TO DEVICE STATISTICS ENTRY
GESTAT:	MOVB	Q$UNIT(R5),-(SP)
	BIC	#<^CUNITMK>,(SP)
	MOV	R4,R0
	CLRB	R0
	BIS	R0,(SP)
	MOV	PC,R0
	ADD	#DEVSTS-.,R0
	MOV	#ERL$U,R1
10$:	CMP	(R0),#-1
	BEQ	40$
	CMP	(R0),(SP)
	BEQ	60$
	ADD	#STALEN*2,R0
	DEC	R1
	BGT	10$
	TST	(PC)+
20$:	 .WORD	0
	BNE	30$
	MOV	PC,R0
	ADD	#E.STAT-.,R0
	.PRINT
	MOV.MCALL	.MODULE
.MODULE	ELINIT,RELEASE=B03,VERSION=01

	.SBTTL	DEFINITIONS
	.MCALL	.CLOSE,	.CSISP,	.DATE
	.MCALL	.DSTAT,	.ENTER,	.EXIT
	.MCALL	.GTIM,	.GTLIN,	.LOOKU
	.MCALL	.PRINT,	.PURGE,	.READW
	.MCALL	.RENAM,	.SDAT,	.WRITE
	.MCALL	.WRITW
	ERRBYT	= 52
	USERRB	= 53
	SYSPTR	= 54
	CONFIG	= 300
	SYSGEN	= 372
		STASK$	= 040000
	ELR$G	= 1
	.IIF NDF ERL$U, ERL$U=10.
	MSKCF1	= ^C014001
	N0CHAR	= '0
	RADDEC	= 10.
	BLKSIZ	= 256.
	ELIOCH	= 0
	ETIOCH	= 1
	MSGCHN	= 2
	SEVER$	= 10
	OMPARE	= <<E	SP,20$
30$:	TST	(SP)+
	BR	70$
40$:	MOV	#STALEN,R1
50$:	CLR	(R0)+
	DEC	R1
	BGT	50$
	MOV	#-1,(R0)
	SUB	#STALEN*2,R0
	MOV	(SP),(R0)
60$:	TST	(SP)+
	TST	(PC)+
70$:	SEC
	RTS	PC
	.SBTTL	CHKSIZ	- CHECK FOR ROOM IN LOGGING BUFFER
CHKSIZ:	MOV	PNXWRD,R0
	ADD	R1,R0
	ADD	R1,R0
	CMP	R0,#255.*2
	BLT	10$
	JSR	PC,10$
	MOV	#-1,(R0)
	MOV	$BFNUM,R0
	INC	$BFLAG(R0)
	INC	$ELRSM
	CMP	PNXBLK,SMAXSZ
	BGE	30$
	NEG	R0
	ADD	#2,R0
	MOV	R0,$BFNUM
	CLR	PNXWRD
	BR	20$
10$:	MOV	$BFNUM,R0
20$:	MOV	$BFTAB(RL$U*7+6>*2>
	OCPARE	= <<ERL$U*7+7>*2>
	ONXREC	= <<ERL$U*7+8.>*2>
	ONXBLK	= <<ERL$U*7+9.>*2>
	OSIZEB	= <<ERL$U*7+11.>*2>
	OCONFG	= <<ERL$U*7+12.>*2>
	.SBTTL	ERROR LOGGING SUBSYSTEM INITIALIZATION
ELINIT::.GTLIN	#LINBUF,#MESDEV
	TSTB	LINBUF
	BEQ	DEVCHK
	.CSISPC	#FILSPC,#DEFEXT,#LINBUF
	MOV	(SP)+,R1
	ASL	R1
	ADD	R1,SP
	MOV	ISPEC,ELFILE
	MOV	ISPEC,ELTEMP
DEVCHK:	.DSTAT	#INSTAT,#ELFILE
	BCC	1$
	JMP	FCHERR
1$:	TST	INSTAT+4
	BNE	2$
	JMP	FCHERR
2$:	.LOOKUP	#INSTAT,#ELIOCH,#ELFILE
	BCC	LOOKOR0),R0
	ADD	PNXWRD,R0
	TST	(PC)+
30$:	SEC
	RTS	PC
	.SBTTL	GETDAT	- PLACE DATE/TIME IN RECORD
GETDAT:	MOV	R1,-(SP)
	MOV	@#SYSPTR,R1
	.MFPS
	.MTPS	#340
	MOV	R1,-(SP)
	ADD	$GTIME(R1),(SP)
	ADD	#2,R0
	JSR	PC,@(SP)+
	.MTPS
	MOV	@#SYSPTR,R1
	MOV	$DATE(R1),-4(R0)
	MOV	(SP)+,R1
	TST	(R0)+
	RTS	PC
	.SBTTL	TEXT
	.NLIST	BEX
E.FULL:	.ASCIZ	/?ERRLOG-W-Log file is full, logging suspended/
E.STAT:	.ASCIZ	/?ERRLOG-W-Device statistics table is full/
	.EVEN
	.LIST	BEX
	.SBTTL	IMPURE DATA AREA
	.K
	TSTB	@#ERRBYT
	BNE	LOOKNO
	JMP	CHNERR
LOOKNO:	.PRINT	#MESW
	.PRINT	#MESNFD
	MOV	SMAXSZ,BUFBLK+OSIZEB
	BR	CREATE
LOOKOK:	.READW	#INSTAT,#ELIOCH,#BUFBLK,#BLKSIZ,#0
	BCC	1$
	JMP	IORERR
1$:	CMP	BUFBLK,OFIXED
	BNE	INVALD
	TST	BUFBLK+ONXREC
	BMI	INVALD
	TST	BUFBLK+ONXBLK
	BLE	INVALD
	MOV	@#SYSPTR,R1
	MOV	CONFIG(R1),R2
	BIC	#MSKCF1,R2
	MOV	BUFBLK+OCONFG,R3
	BIC	#MSKCF1,R3
	CMP	R3,R2
	BNE	INVALD
	MOV	SYSGEN(R1),R2
	MOV	BUFBLK+OCONFG+2,R3
	CMP	R3,R2
	BNE	INVALD
	TST	BUFBLK+OMPARE
	BMGLOBL	NOTRDY,	RECHED,	$ELHDR
	.GLOBL	CMENTR,	PNXBLK,	$HDLEN
	.GLOBL	$BFNUM,	$BFTAB,	$BFLAG
	.GLOBL	$ELBF1,	SMAXSZ
NOTRDY:	.WORD	0
ELAREA:	.BLKW	2
RECHED:	.WORD	0
$ELHDR:
OFIXED:	.WORD	<<7*ERL$U+2>*2>
DEVSTS:	.WORD	-1
	.BLKW	<7*ERL$U>
CERECR:	.WORD	0
CMENTB:	.WORD	0
CMENTF:	.WORD	0
CMENTR:	.WORD	0
CMPARE:	.WORD	0
CCPARE:	.WORD	0
PNXREC:	.WORD	1
PNXBLK:	.WORD	1
PNXWRD:	.WORD	0
SMAXSZ:	.WORD	100.
CNFGW1:	.WORD	0
CNFGW2:	.WORD	0
INIDAT:	.WORD	0
INTIM1:	.WORD	0
INTIM2:	.WORD	0
	$HDLEN	=I	INVALD
	TST	BUFBLK+OCPARE
	BMI	INVALD
	MOV	BUFBLK+ONXBLK,R0
	JSR	PC,NUMBER
	.PRINT	#MESUS1
	MOV	BUFBLK+OSIZEB,R0
	JSR	PC,NUMBER
	.PRINT	#MESUS2
	.GTLIN	#LINBUF,#MESINI
	TSTB	LINBUF
	BEQ	CHANGE
	CMPB	LINBUF,#'Y
	BEQ	INITF
	BR	CHANGE
INVALD:	.PRINT	#MESIV1
	.PRINT	#MESIV2
	.PURGE	#ELIOCH
	.RENAME	#INSTAT,#ELIOCH,#ELFILE
	MOV	#100.,BUFBLK+OSIZEB
	BCC	CREATE
	CMPB	@#ERRBYT,#3
	BNE	1$
	JMP	PRTERR
1$:	JMP	BADERR
CREATE:	INCB 	FCREAT
INITF:	INCB 	FINIT
CHANGE:	.PRINT	#MESSZ1
	MOV	BUFB <.-$ELHDR>/2
	.IIF GT <$HDLEN-256.> .ERROR
$ELRSM:	.WORD	0
$BFNUM:	.WORD	0
$BFTAB:	.WORD	$ELBF1
	.WORD	$ELBF2
$BFLAG:	.WORD	0
	.WORD	0
$ELBF1:	.BLKW	256.
$ELBF2:	.BLKW	256.
	.END	ERRLOG
                                                                                                                                                                                                                                                                                                                          LK+OSIZEB,R0
	MOV	R0,SMAXSZ
	JSR	PC,NUMBER
	.GTLIN	#LINBUF,#MESSZ2
	TSTB	LINBUF
	BEQ	DOIT
	MOV	#LINBUF,R0
	JSR	PC,ABCVRT
	CMP	R0,#1
	BLE	1$
	TSTB	FINIT
	BNE	2$
	CMP	R0,PNXBLK
	BHI	2$
1$:	.PRINT	#MESF
	.PRINT	#MESILL
	BISB	#SEVER$,@#USERRB
	BR	CHANGE
2$:	MOV	R0,BUFBLK+OSIZEB
	MOV	R0,SMAXSZ
	INCB	FCHGSZ
DOIT:	TSTB	FCREAT
	BNE	1$
	TSTB	FCHGSZ
	BEQ	6$
1$:	TSTB	FINIT
	BNE	2$
	.PURGE	#ELIOCH
	.RENAME	#INSTAT,#ELIOCH,#ELFILE
	BCC	2$
	CMPB	@#ERRBYT,#3
	BNE	13$
14$:	JMP	PRTERR
13$:	Jmany blocks for the ERRLOG.DAT file </<200>
MESSZ2:	.ASCII	/>? /<200>
MESUS1:	.ASCIZ	/ blocks currently in use of/
MESUS2:	.ASCIZ	/ possible total in ERRLOG.DAT file/
MESINI:	.ASCII	/Do you want to zero the ERRLOG.DAT file and re-initialize/
	.ASCII	\ (YES/NO) <NO>? \<200>
MESGEN:	.ASCIZ	/New ERRLOG.DAT file generated/
MESIV1:	.ASCIZ	/The current ERRLOG.DAT file is invalid/
MESIV2:	.ASCIZ	/The invalid file is renamed ERRLOG.TMP/
MESDON:	.ASCIZ	/FODOS ERROR LOGGING INITIATED/
MESILL:	.ASCIZ	/Invali.MCALL	.MODULE
.MODULE	ELTASK,RELEASE=B03,VERSION=01

	.SBTTL	DEFINITIONS
	.ENABL	LC
	.MCALL	.QSET,	.PRINT,	.MRKT
	.MCALL	.RCVDW,	.LOOKU,	.READW
	.MCALL	.CMKT,	.CHCOP,	.READC
	.MCALL	.RCVDC,	.SPND,	.WRITW
	.MCALL	.RSUM,	.READC,	.EXIT
	SYSPTR	= 54
	CONFIG	= 300
		FBMON$	=      1
		KT11$	=  10000
	SYSGEN	= 372
		STASK$	=  40000
	RCVKEY	= 101010
	ELIOCH	= 0
	ETIOCH	= 1
	MSGCHN	= 2
	.SBTTL	START OF CUSP
	.GLOBL	RECHED,	FREADY,	NOTRDY
	.GLOBL	CMENTR,	PNXBLK
	.GLOBL	$ELHDR,	$HDLEN
	.GLOBLMP	BADERR
2$:	.PURGE	#ELIOCH
	.ENTER	#INSTAT,#ELIOCH,#ELFILE,SMAXSZ
	BCC	4$
	TSTB	@#ERRBYT
	BEQ	3$
	CMPB	@#ERRBYT,#3
	BEQ	14$
	JMP	FULERR
3$:	JMP	BADERR
4$:	MOV	SMAXSZ,R1
	DEC	R1
	.WRITW	#INSTAT,#ELIOCH,#BUFBLK,#BLKSIZ,R1
	BCC	5$
	JMP	IORERR
5$:	.CLOSE	#ELIOCH
	BCS	14$
	.LOOKUP	#INSTAT,#ELIOCH,#ELFILE
	BCC	6$
	JMP	BADERR
6$:	TSTB	FINIT
	BEQ	8$
	.GTIM	#INSTAT,#INTIM1
	.DATE
	MOV	R0,INIDAT
	MOV	@#SYSPTR,R1
	MOV	CONFIG(R1),CNFGW1
	MOV	SYSGEN(R1),CNFGW2
	.WRITW	#INSTAT,#ELIOCH,#HEADEd command/
MESFCH:	.ASCIZ	/Device not available/
MESCHN:	.ASCIZ	/Channel error/
MESIOR:	.ASCIZ	/ERRLOG.DAT file IO error/
MESBAD:	.ASCIZ	/Internal error/
MESFUL:	.ASCIZ	/Device full/
MESNFG:	.ASCIZ	/ERRLOG task not active/
MESPRT:	.ASCIZ	/Protected file already exists ERRLOG.DAT/
	.LIST	BIN
	.DSABL	LC
	.SBTTL	DATA AREA
FCREAT:	.BYTE	0
FINIT:	.BYTE	0
FCHGSZ:	.BYTE	0
	.EVEN
INSTAT:	.BLKW	5
JBDES:	.RAD50	/MQ/
	.ASCII	/ERRLOG/
ELFILE:	.RAD50	/SY/
	.RAD50	/ERR/
	.RAD50	/LOG/
	.RAD50	/DAT/
R,#HEDRWD,#0
	BCC	7$
	JMP	IORERR
7$:	.PRINT	#MESGEN
	BR 	DONE
8$:	MOV	#HEDRWD,R2
	MOV	#HEADER,R3
	MOV	#BUFBLK,R4
9$:	MOV	(R4)+,(R3)+
	DEC	R2
	BNE	9$
	.WRITW	#INSTAT,#ELIOCH,#HEADER,#HEDRWD,#0
	BCC	10$
	JMP	IORERR
10$:	TSTB	FCHGSZ
	BEQ	DONE
	.LOOKUP	#INSTAT,#ETIOCH,#ELTEMP
	BCC	11$
	TSTB	@#ERRBYT
	BNE	BADERR
	JMP	CHNERR
11$:	MOV	PNXBLK,R2
12$:	.READW	#INSTAT,#ETIOCH,#BUFBLK,#BLKSIZ,R2
	BCS	IORERR
	.WRITW	#INSTAT,#ELIOCH,#BUFBLK,#BLKSIZ,R2
	BCS	IORERR
	DEC	R2
	BNE	12$
	.PURGE	#ETIOELTEMP:	.RAD50	/SY/
	.RAD50	/ERR/
	.RAD50	/LOG/
	.RAD50	/TMP/
LINBUF:	.BLKB	82.
FILSPC:
OSPEC:	.BLKW	3*5.
ISPEC:	.BLKW	6*4.
DEFEXT:	.WORD	0,0
	.WORD	0,0
BUFBLK:	.BLKW	<BLKSIZ>
HEADER:
OFIXED:	.WORD	<<7*ERL$U+2>*2>
DEVSTS:	.WORD	-1
	.BLKW	<7*ERL$U>
CERECR:	.WORD	0
CMENTB:	.WORD	0
CMENTF:	.WORD	0
CMENTR:	.WORD	0
CMPARE:	.WORD	0
CCPARE:	.WORD	0
PNXREC:	.WORD	1
PNXBLK:	.WORD	1
PNXWRD:	.WORD	0
SMAXSZ:	.WORD	100.
CNFGW1:	.WORD	0
CNFGW2:	.WORD	0
INIDAT:	.WORD	0
INTIM1:	.WORD	0
INTIM2:	CH
DONE:	MOV	@#SYSPTR,R1
	BIT	#STASK$,SYSGEN(R1)
	BEQ	2$
	.LOOKUP	#INSTAT,#MSGCHN,#JBDES
	BCC	1$
	TSTB	@#ERRBYT
	BNE	3$
	JMP	CHNERR
1$:	.WRITE	#INSTAT,#MSGCHN,#HEADER,#HEDRWD
	BCC	4$
	JMP	BADERR
2$:	.SDAT	#INSTAT,#HEADER,#HEDRWD
	BCC	4$
3$:	.PRINT	#MESF
	.PRINT	#MESNFG
	BR	FTLEXT
4$:	.PRINT	#MESDON
	BR	ALLEXT
BADERR:	.PRINT	#MESF
	.PRINT	#MESBAD
	BR	FTLEXT
IORERR:	.PRINT	#MESF
	.PRINT	#MESIOR
	BR	FTLEXT
FCHERR:	.PRINT	#MESF
	.PRINT	#MESFCH
	BR	FTLEXT
FULERR:	.PRINT	#MESF
	.PRIN.WORD	0
HEDRSZ	= <INTIM2-HEADER+2>
HEDRWD	= <HEDRSZ/2>
	.SBTTL	NUMBER	- BINARY TO DECIMAL ASCII
NUMBER:	CLR	R2
1$:	MOV	#10.,R1
	JSR	PC,DIV
	ADD	#60,R1
	MOV	R1,-(SP)
	INC	R2
	TST	R0
	BNE	1$
	MOV	#LINBUF,R3
2$:	MOVB	(SP)+,(R3)+
	DEC	R2
	BNE	2$
	MOVB	#200,(R3)
	.PRINT	#LINBUF
	RTS	PC
	.SBTTL	DIV	- DIVISION ROUTINE
DIV:	MOV	#20,-(SP)
	MOV	R1,-(SP)
	CLR	R1
30$:	ASL	R0
	ROL	R1
	CMP	R1,(SP)
	BLO	40$
	SUB	(SP),R1
	INC	R0
40$:	DEC	2(SP)
	BGT	30$
50$:	CMP	(SP)+,(SP)+
	RTS	PC
	.SBTTT	#MESFUL
	BR	FTLEXT
CHNERR:	.PRINT	#MESF
	.PRINT	#MESCHN
	BR	FTLEXT
PRTERR:	.PRINT	#MESF
	.PRINT	#MESPRT
FTLEXT:	BISB	#SEVER$,@#USERRB
ALLEXT:	.PURGE	#ETIOCH
	.PURGE	#ELIOCH
	CLR 	R0
	.EXIT
	.SBTTL	MESSAGES
	.ENABL	LC
	.NLIST	BIN
MESW:	.NLCSI	TYPE=I,PART=PREFIX
	.ASCII	/W-/<200>
MESF:	.NLCSI	TYPE=I,PART=PREFIX
	.ASCII	/F-/<200>
MESDEV:	.ASCII	/What is the name of the device for the ERRLOG.DAT file/
	.ASCII	/ <SY>? /<200>
MESNFD:	.ASCIZ	/File not found ERRLOG.DAT/
MESSZ1:	.ASCII	/How L	ABCVRT	- DECIMAL ASCII TO BINARY
ABCVRT:	MOV	R3,-(SP)
	MOV	R4,-(SP)
	CLR	R4
1$:	MOVB	(R0)+,R3
	SUB	#N0CHAR,R3
	CMPB	R3,#RADDEC
	BHIS	2$
	ASL	R4
	ADD	R4,R3
	ASL	R4
	ASL	R4
	ADD	R3,R4
	BR	1$
2$:	MOV	R4,R0
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	RTS	PC
	.END	ELINIT
                                                                                                                                                                                                                                               LR	$BFLAG(R2)
	INC	R1
	CMP	R1,SMAXSZ
	BHIS	30$
	MOV	$BFNUM,R2
	.WRITW	#AREA,#ETIOCH,$BFTAB(R2),#256.,R1
	BCC	30$
	MOV	#1,IFATAL
30$:	MOV	(SP)+,R2
	RTS	PC
	.SBTTL	CRTN	- UPDATE DUE TO ERROUT REQUEST
CRTN:	CMP	RCVMSG+2,#RCVKEY
	BEQ	10$
	MOV	#2,IFATAL
	BR	40$
10$:	.WRITW	#AREA,#ETIOCH,#$ELHDR,#$HDLEN,#0
	BCC	20$
	MOV	#1,IFATAL
20$:	MOV	$BFNUM,R1
	.WRITW	#AREA,#ETIOCH,$BFTAB(R1),#256.,PNXBLK
	BCC	30$
	MOV	#1,IFATAL
30$:	TST	IFATAL
	BEQ	50$
40$:	.RSUM
	BR	70$
50$:	TSTB	FST
	BNE	60$
	HERWISE MADE AVAILABLE TO ANY
; OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE  SOFTWARE  IS  HEREBY
; TRANSFERRED.
;
; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE
; AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT
; CORPORATION.
;
; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS
; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
ELERRT	== 0
	.SBTTL	DEVICE DEPENDENT TEXT BUILDER
	.MACRO	ELBLDR	DVCODE,DTYPE,WHICH1.RCVDC	#AREA,#RCVMSG,#1,#CRTN
	BR	70$
60$:	.READC	#AREA,#MSGCHN,#RCVMSG,#1,#CRTN
70$:	RTS	PC
	.SBTTL	FATALE	- REPORT FATAL ERRORS
FATALE:	DEC	IFATAL
	BEQ	LIOERR
IMRERR:	.PRINT	#E.FATL
	.PRINT	#E.IMR
	BR	SHUTUP
LIOERR:	.PRINT	#E.FATL
	.PRINT	#E.LIO
	BR	SHUTUP
ILLERR:	.PRINT	#E.FATL
	.PRINT	#E.ILL
	BR	SHUTUP
CHNERR:	.PRINT	#E.FATL
	.PRINT	#E.CER
	BR	SHUTUP
SHUTUP:	MOV	#-1,FREADY
	.EXIT
	.SBTTL	IMPURE DATA AREA
AREA:	.BLKW	5
AREAT:	.BLKW	4
ZEROAD:	.RAD50	/MQ/
	.WORD	0,0,0
BJBDES:	.A,FIRST2,RGSTR
	.IIF B	DVCODE,	.ERROR
	.IIF LT	DVCODE,	.ERROR
	.IIF GT	<DVCODE-377>,	.ERROR
	.PSECT	PART1
DV'DVCODE:
	.IF IDN	<WHICH1>,<DISK>
		.BYTE	0
	.IFF
	 .IF IDN <WHICH1>,<TAPE>
		.BYTE	5
	 .IFF
	.ERROR	WHICH1
	 .ENDC
	.ENDC
	.NCHR	SYMTYP,<DTYPE>
	.IIF GT <SYMTYP-59.>,	.ERROR
		.BYTE	SYMTYP
		.ASCII	%DTYPE%
	.NCHR	SYMFIR,<FIRST2>
	.IF NE	<SYMFIR-2>
	.ERROR FIRST2
	.ENDC
		.ASCII	%FIRST2%
		.BYTE	COUNT
	COUNT	= -1
	.BYTE	TMP'DVCODE
	.IRP	NAME,<RGSTR>
	COUNT	= COUNT + 1
	.NCH	$BFNUM,	$BFTAB,	$BFLAG
	.GLOBL	$ELBF1
OPINIT::.QSET	#XTRAQE,#2
	MOV	@#SYSPTR,R1
	BIT	#KT11$,CONFIG(R1)
	BEQ	10$
	INCB	FXM
10$:	BIT	#STASK$,SYSGEN(R1)
	BEQ	20$
	INCB	FST
20$:	.PRINT	#E.INFO
	.PRINT	#M.INI
30$:	.MRKT	#AREAT,#WAITIM,#REMIND,#0
	BCS	30$
	TSTB	FST
	BNE	40$
	.RCVDW	#AREA,#RECHED,#$HDLEN
	BCC	60$
	JMP	ILLERR
40$:	.LOOKUP	#AREA,#MSGCHN,#ZEROAD
	BCC	50$
	JMP	CHNERR
50$:	.READW	#AREA,#MSGCHN,#RECHED,#$HDLEN
	BCC	60$
	JMP	ILLERR
60$:	CMP	RECHED,#$HDLEN
	BEQ	70$
	JMP	IMRERRSCII	/B/
	.BYTE	0,0,0,0,0
WAITIM:	.WORD	0,3777
XTRAQE:	.BLKW	20.
RCVMSG:	.BLKW	2
FXM:	.BYTE	0
FST:	.BYTE	0
	.EVEN
IFATAL:	.WORD	0
	.SBTTL	MESSAGES
	.NLIST	BEX
E.FATL:	.ASCII	/?ERRLOG-F-/<200>
E.WARN:	.ASCII	/?ERRLOG-W-/<200>
E.INFO:	.ASCII	/?ERRLOG-I-/<200>
E.IMR:	.ASCIZ	/Invalid message received/
E.ILL:	.ASCIZ	/Internal error/
E.LIO:	.ASCIZ	/Log file IO error/
E.CER:	.ASCIZ	/Channel error/
M.REM:	.ASCII	/REMINDER: /
M.INI:	.ASCIZ	/To initiate error logging, RUN ELINIT/
	.LIST	BIN
	.EN
70$:	.CMKT	#AREAT,#0
	TSTB	FST
	BNE	80$
	.CHCOPY	#AREA,#ETIOCH,#ELIOCH
	BR	90$
80$:	.CHCOPY	#AREA,#ETIOCH,#ELIOCH,#BJBDES
90$:	BCC	100$
	JMP	ILLERR
100$:	MOV	PNXBLK,R4
	.READW	#AREA,#ETIOCH,#$ELBF1,#256.,R4
	BCC	REALTM
	JMP	LIOERR
REALTM::CLR	FREADY
	ADD	NOTRDY,CMENTR
	TSTB	FST
	BEQ	10$
	.READC	#AREA,#MSGCHN,#RCVMSG,#1,#CRTN
	BCC	SUSPND
	JMP	CHNERR
10$:	.RCVDC	#AREA,#RCVMSG,#1,#CRTN
	BCC	SUSPND
	JMP	ILLERR
	.SBTTL	REMIND	- STARTUP REMINDER
REMIND:	.PRINT	#E.INFO
	.PRINT	#M.REM
10$D
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             :	.MRKT	#AREAT,#WAITIM,#REMIND,#0
	BCS	10$
	RTS	PC
	.SBTTL	SUSPND	- WAITING FOR ACTIVATION
SUSPND:	.SPND
ELTASK:	TST	IFATAL
	BEQ	20$
10$:	JMP	FATALE
20$:	JSR	PC,IOCODE
	TST	IFATAL
	BNE	10$
	BR	SUSPND
	.SBTTL	IOCODE	- WRITE BUFFER TO LOGGING FILE
	.GLOBL	SMAXSZ
IOCODE:	MOV	R2,-(SP)
	MOV	PNXBLK,R1
	INC	PNXBLK
	.WRITW	#AREA,#ETIOCH,#$ELHDR,#$HDLEN,#0
	BCC	10$
	MOV	#1,IFATAL
10$:	MOV	$BFNUM,R2
	NEG	R2
	ADD	#2,R2
	.WRITW	#AREA,#ETIOCH,$BFTAB(R2),#256.,R1
	BCC	20$
	MOV	#1,IFATAL
20$:	C.MCALL	.MODULE
.MODULE	ERRTXT,RELEASE=V05,VERSION=05,COMMENT=<Error Log Text File>

;                        COPYRIGHT (c) 1984 BY
;             DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;                         ALL RIGHTS RESERVED.
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND  COPIED
; ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH  LICENSE AND WITH THE
; INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR  ANY  OTHER
; COPIES  THEREOF MAY NOT BE PROVIDED OR OT,CS2,DS,ER,ASOF,DC,ECPS,ECPT,MR2,MR3>
	ELBLDR	34,<TU58>,TAPE,**,<LCHAR,BYTES/FLAG,S-CODE/OPCODE,UNIT,SEQ#,BYTES,STATUS,BYTES/FLAG,MOD/OPCODE,UNIT>
	ELBLDR	50,<DU/MSCP>,DISK,DU,<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20>
	ELBLDR	52,<RX/PRO>,DISK,RX,<5CS0,5CS1,5CS2,5CS3,5CS4,5CS5,5DEB>
	ELBLDR	53,<RD/PRO>,DISK,RD,<STAT,CYL,HEAD,SEC,ERR,ST2>
HSPACE	== .
	.END
                                                                                                                                         #NAME,QCA
	MOV	#1,QB
	MOVB	#ENTER,QF
	JSR	PC,WAIT
	MOV	PC,R0
	ADD	#DATA-.,R0
	MOV	R0,QCA
	CLRB	QF
	MOV	#-40,QWC
	JSR	PC,WAIT
	MOVB	#CLOSE,QF
	JSR	PC,WAIT
	MOVB	#LOOKUP,QF
	MOV	#0,QB
	MOV	#NAME,QCA
	JSR	PC,WAIT
	MOV	@#MONLOW,R0
	MOV	OFFBUF(R0),QCA
	CLRB	QF
	MOV	#400,QWC
	JSR	PC,WAIT
	INC	QB
	MOV	#40,QWC
	JSR	PC,WAIT
	MOV	#400,QWC
	JSR	PC,WAIT
	MOVB	#CLOSE,QF
	JSR	PC,WAIT
	MOV	#NAME,QCA
	MOV	#0,QB
	MOVB	#DELETE,QF
	JSR	PC,WAIT
NXTF:	ADD	#51,NAME+2
	BR	DO
	MOVB	#-5,QF
	JSR	PC.MCALL	.MODULE
.MODULE	CT,RELEASE=B03,VERSION=01

.SBTTL	GENERAL DESCRIPTION
.SBTTL	DEFINITIONS
.MCALL	.PRINT,	.DATE,.DRBEG,.DRFIN,.DREND,.DRAST,.FORK
.IIF NDF RTE$M, RTE$M=0
.IIF NDF MMG$T, MMG$T=0
.IIF NDF ERL$G, ERL$G=0
.IIF NDF TIM$IT, TIM$IT=0
.MACRO	ADDR	LOC,R
	 MOV	PC,R
	 ADD	#LOC-.,R
.ENDM	ADDR
T5	= R5
.IIF NDF CT$VEC, CT$VEC == 260
.IIF NDF CT$CSR, CT$CSR == 177500
TACS = CT$CSR
	ERR	= 100000
	CRC	=  40000
	BOTEOT	=  20000
	WRL	=  10000
	FGAP	=   4000
	TIME	=   2000
	OFF	= ,WAIT
	MOV	PC,R0
	ADD	#DATA-.,R0
	MOV	R0,QCA
	MOV	#-400,QWC
	CLRB	QF
	JSR	PC,WAIT
	MOV	#-400,QWC
	JSR	PC,WAIT
	MOVB	#-6,QF
	JSR	PC,WAIT
	MOVB	#-2,QF
	JSR	PC,WAIT
	MOV	@#MONLOW,R0
	MOV	OFFBUF(R0),QCA
	MOV	#400,QWC
	CLRB	QF
	JSR	PC,WAIT
	MOVB	#-1,QF
	JSR	PC,WAIT
	MOVB	#-3,QF
	JSR	PC,WAIT
	HALT
WAIT:	CLR	(PC)+
WFLAG:	.WORD	0
	CLR	@QCSW
	JSR	PC,CT
WTLOOP:	TST	WFLAG
	BEQ	WTLOOP
	BIT	#3,@QCSW
	BNE	TMDK
	BIT	#SWERR,@SWWPTR
	BNE	TMDK
	RTS	PC
TMDK:	CLR	@QCSW
	CLR	@SWWPTR
	.PRINT	#  1000
	UNITNO	=    400
	TREQ	=    200
	INTEN	=    100
	READY	=     40
	ILBS	=     20
	FUNC	=      2
		WGAP	= 0
		WRITE	= 1
		READ	= 2
		LSTFIL	= 3
		LSTBLK	= 4
		NXTFIL	= 5
		NXTBLK	= 6
		REWIND	= 7
	GO	=      1
TADB	= TACS+2
CTDSIZ	= 0
CTSTS	= 12013
RW	= 0
CLOSE	= 1
DELETE	= 2
LOOKUP	= 3
ENTER	= 4
Q.WC	= 6
SJMON	= 1
HWERR	= 1
EOVBIT	= 40000
EOFBIT	= 20000
MONLOW	= 54
OFFSET	= 270
OFFBUF	= 266
OFFSWW	= 272
CONFIG	= 300
SYNCH	= 324
FILNFD	= 1
ILLFUN	= 2
PSW	= -2
PR6	= 3EM
	RTS	PC
EM:	.ASCIZ	"ERROR"
QMAN:	MOV	SP,WFLAG
	MOV	(SP)+,R0
	MOV	(SP)+,R3
	RTI
START:	JSR	PC,WAIT
	HALT
.ENDC
.IIF NDF DEBUG,	.LIST
	.DRBEG	CT,CT$VEC,CTDSIZ,CTSTS
.ENABL	LSB
CT:	SUB	#10,SP
	MOV	SP,(PC)+
SPSAV:	.WORD	0
	MOV	#TACS,T5
	MOV	@#MONLOW,R0
	MOV	CONFIG(R0),CTSJ
	ADD	#OFFSWW,R0
	MOV	R0,(PC)+
SWWPTR:	.WORD	0
	TST	(PC)+
FIN:	.WORD	0
	BGE	1$
	JSR	PC,DUNDEL
1$:	DEC	FIN
	CLR	IGNOFF
.IF NE MMG$T
	CLRB	CTMVS
	CLR	RAWFLG
.ENDC
	MOV	CTCQE,R0
	MOV	-2(R0),(PC)+
CSWPTR:	.WORDR	SYMREG,<NAME>
	.IIF NDF CHR'DVCODE,CHR'DVCODE=SYMREG
	 .IF LT	CHR'DVCODE-SYMREG
	CHR'DVCODE = SYMREG
	 .ENDC
	.ENDR
	.IF GT <CHR'DVCODE-13.>
	.ERROR
	.ENDC
TMP'DVCODE	= CHR'DVCODE
	.IRP	NAME,<RGSTR>
	.NCHR	SYMREG,<NAME>
		.ASCII	%NAME%
	 .REPT	CHR'DVCODE-SYMREG
		.BYTE	40
	 .ENDR
	.ENDR
	.EVEN
	.PSECT	PART2
	.IF NDF	POINTL
POINTL::
	.ENDC
	.IF EQ	.-POINTL
POINTL::
	.IFF
	.	= .-4
	.ENDC
		.WORD	DVCODE
		.WORD	DV'DVCODE
		.WORD	-1,-1
	.ENDM	ELBLDR
	.SBTTL	SUPPORTED DEVICES
	00
PR7	= 340
ASTRSK  = 52
.SBTTL	ENTRY AND DISPATCH ROUTINE
	RCHECK=0
	MUL=0
	NEWVOL=0
.IF	DF,INIT
	DEBUG=0
	NEWVOL=0
.ENDC
.IF DF RCHECK
.ASECT
.=400
	BR	.+NOTDUN-RAWOPT
	.RAD50 /RAW   /
	.WORD	<OPRAW-400>/2+100000
	0
OPRAW:	MOV	(PC)+,R3
	BNE	.+NOTDUN-RAWOPT
	MOV	R3,RAWOPT
	RTS	PC
.PSECT
.ENDC
.IIF NDF DEBUG,	.NLIST
.IF	DF,DEBUG
	.ENABL	AMA
	.ASECT
	.=CT$VEC
	CTINT
	0
	.=1000
.ENDC
.IIF NDF DEBUG,	.LIST
.SBTTL	LOAD POINT, INITIATE REQUEST
.IIF NDF	DEBUG,.NLIST
.IF	DF	DELBLDR	0,<RK11/RK05>,DISK,RK,<DS,ER,CS,WC,BA,DA,DB>
	ELBLDR	1,<TC11/TU56>,TAPE,TC,<ST,CM,WC,BA,DT>
	ELBLDR	5,<RL11/RL01/RL02>,DISK,RL,<CS,BA,DA,MP,STAT,ADDR,BAE>
	ELBLDR	6,<RX211/RX02>,DISK,RX,<2CS,2DB,2ES>
	ELBLDR	12,<RF11/RS11>,DISK,RF,<CS,WC,MA,DA,AE,BR,MA,AS>
	ELBLDR	16,<RJS03/RJS04>,DISK,RS,<CS1,WC,BA,DA,CS2,DS,ER,AS,LA,DB,MR,DT>
	ELBLDR	21,<RP11C/RP02/RP03>,DISK,RP,<DS,ER,CS,WC,BA,CA,DA,M1,M2,M3,-SUCA,-SILO>
	ELBLDR	22,<RX11/RX01>,DISK,RX,<CS,DB,ES>
	ELBLDR	23,<RK06/RK07>,DISK,RK,<CS1,WC,BA,DAEBUG
	.WORD	CT$VEC
	.WORD	CTINT-.
	.WORD	PR6
CTLQE:	.WORD	0
CTCQE:	.WORD	QEL
CSWDUM:	.WORD	0
QCSW:	.WORD	CSWDUM
QEL:
QB:	.WORD	0
QF:	.BYTE	0
QU:	.BYTE	0
QCA:	.WORD	0
QWC:	.WORD	400
JSW:	.WORD	0
EXT=.+4
NAME:	.RAD50	"FILEN EXT"
	.EVEN
DATA=.
TEST:
	MOVB	#7,QF+1
	JSR	PC,WAIT
.IF DF	INIT
	EMT	340+10
.ENDC
DO:
	MOV	#NAME,QCA
	MOV	#0,QB
	MOVB	#ENTER,QF
	JSR	PC,WAIT
	MOV	PC,R0
	ADD	#DATA-.,R0
	MOV	R0,QCA
	CLRB	QF
	MOV	#-1000,QWC
	JSR	PC,WAIT
	MOVB	#CLOSE,QF
	JSR	PC,WAIT
	MOV		.WORD	0
	NEG	(R0)
	MOV	(R0)+,(PC)+
WC:	.WORD	0
.ENDC
.DSABL	LSB
.SBTTL	FUNCTION DISPATCHER
.ENABL	LSB
CGETC:	TST	R1
	BMI	2$
	BGT	MACRO
.IF NE MMG$T
	INCB	CTURW
.ENDC
	MOV	WC,R0
	BLE	1$
	INC	R1
	NEG	R0
1$:	ASL	R0
	MOV	R0,(PC)+
TC:	.WORD	0
	MOV	R0,WC
	MOV	R0,(PC)+
CTTQCT:	.WORD	0
	BITB	R2,F.HW
	BEQ	MACRW
2$:	SUB	#2,R1
	CLRB	F.MACRO
	NEG	R1
	CMP	R1,#10
	BGT	CTILLF
	JMP	XCT
.DSABL	LSB
.SBTTL	FILE SERVICE ROUTINES
.ENABL	LSB
MACRW:	ADD	#5,R1
MACRO:	CMP	R1,#MAXFUN
	BPL	CTILRSK,(R2)
	CLRB	SEQNO
	JSR	PC,DELAB
1$:	JSR	R0,SOFT
	 .WORD	NXTFIL
	BR	DUNDEL
$CLOSE:	BITB	UBITS,F.WRITE
	BEQ	1$
	BITB	UBITS,F.READ
	BNE	DUNDEL
2$:	JSR	PC,WSENT
DUNDEL:	ADDR	F.CLOSE,R0
	MOV	UBITS,R1
	BICB	R1,(R0)+
	BISB	R1,(R0)+
	BIS	R1,(R0)+
	BIC	R1,(R0)+
	CLRB	CTEOFF
	RTS	PC
.DSABL	LSB
.IF NE MMG$T
GETFLN:	ADDR	CA-4,R4
	MOV	#6,R2
	ADDR	FILENM,R1
	MOV	R1,R0
1$:	JSR	PC,@$GTBYT
	MOVB	(SP)+,(R1)+
	DEC	R2
	BNE	1$
	MOV	R0,CA
	RTS	PC
.ENDC
.SBTTL	$READ
.ENABL	LSB
$READ:	TSTB	CTELF
	MOV	UBITS,R3
	ADDR	FLGTAB,R0
	BICB	R3,(R0)+
	BISB	R3,@R0
	ADD	R1,R0
	BITB	R3,@R0
	BEQ	CTILLF
	BICB	R3,ENTFLG
	ADD	#MACROS-FLGTAB-1,R0
	ADD	R1,R0
	ADD	@R0,R0
	JSR	PC,@R0
1$:	JMP	RESP
CTILLF:	CMP     R1,#1
	BEQ     1$
        BIS	#ILLFUN,@SWWPTR
	BR	1$
SWINIT:	BIS	#FILNFD,@SWWPTR
	BR	1$
.DSABL	LSB
.SBTTL	WRITE SERVICE
.ENABL	LSB
WRITD:	MOV	#-200,WC
WRTBLK:	.IF DF	RCHECK
	MOV	#3,(PC)+
WTRY:	.WORD	0
WRTB:	.ENDC
	MOV	#-200,TC
	JSR	R0,SOFT
	 .WORD	WRITE
.IF DF	RCHECK
	BIT	#BOTOFF
	BNE	SWEOF
	MOV	WC,R4
	BNE	1$
	TST	BLOCK
	BEQ	1$
	ADD	#2,CA
.IF NE MMG$T
	JSR	PC,GETFLN
	CLRB	CTURW
.ENDC
	JSR	PC,SEEK
	 BR	DUNDEL
	BR	DUNDEL
1$:	JSR	PC,TSTBAK
2$:	MOV	#-200,WC
	MOV	R4,TC
	JSR	PC,READB
	BIT	#FGAP,(T5)
	BEQ	4$
	JSR	PC,BSP
	MOV	TACA,R2
	CMP	R4,CTTQCT
	BEQ	SWEOF
.IF NE MMG$T
3$:	MOV	R4,-(SP)
	ADDR	TACA-4,R4
	CLR	-(SP)
	JSR	PC,@$PTBYT
	MOV	(SP)+,R4
.IFF
3$:	CLRB	(R2)+
.ENDC
	INC	R4
	BNE	3$
	INCB	CTEOFF
	JMP	RESP
SWEOF:	BIS	#EOFBIT,@CSWPTR
	CLRB	CTEOFF
EOT,(T5)
RAWOPT:	BR	NOTDUN
	JSR	PC,BSP
	MOV	CA,R2
.IF NE MMG$T
	INCB	RAWFLG
.ENDC
	JSR	PC,READU
	MOV	CA,R1
	MOV	R2,CA
	MOV	WC,R3
.IF NE MMG$T
	MOV	R4,-(SP)
	MOV	R2,TACA
	ADDR	TACA-4,R4
1$:	JSR	PC,@$GTBYT
	CMPB	(SP)+,(R1)+
.IFF
1$:	CMPB	(R1)+,(R2)+
.ENDC
	BNE	2$
	INC	R3
	BLT	1$
.IF NE MMG$T
	CLRB	RAWFLG
	MOV	(SP)+,R4
.ENDC
.ENDC
NOTDUN:	RTS	PC
2$:
.IF NE MMG$T
	MOV	(SP)+,R4
.ENDC
.IF DF	RCHECK
	DEC	WTRY
	BGT	WRTB
	JMP	ERRHW
.ENDC
.DSABL	LSB
.SBTTL	$LOOKUP, $ENTER
.ENASWINI3:	BR	SWINI2
4$:	.IF DF	MUL
	JSR	PC,EOTCHK
	BEQ	5$
	CLR	BLOCK
	JSR	PC,SEEKC
	 BR	SWEOF
	JSR	PC,LUKC
	MOV	WCSAV,R4
	MOV	CASAV,CA
.IF NE MMG$T
	CLRB	CTMVS
.ENDC
	BR	2$
5$:	.ENDC
	ADD	#200,R4
	BCS	RTSPC
.IF NE MMG$T
	ADD	#2,Q.PAR
.IFF
	ADD	#200,CA
.ENDC
	BR	2$
CTEOFF:	.BYTE	0
CTMVS:	.BYTE	0
.DSABL	LSB
.SBTTL	$WRITE
$WRITE:	MOV	WC,R4
	JSR	PC,TSTBAK
1$:	JSR	PC,WRITD
.IF DF	MUL
	JSR	PC,EOTCHK
	BEQ	4$
	CLR	BLOCK
	JSR	PC,SEEKC
	 BR	2$
	JSR	PC,OPEN
	BR	3$
2$:	JSR	PC,NFOUNDBL	LSB
$LOOKUP:
.IF NE MMG$T
	JSR	PC,GETFLN
.ENDC
TST	@CA
	BEQ	1$
	JSR	PC,SEEK
	 BR	SWINIT
LUKC:	JSR	PC,FSP
	JSR	PC,3$
	BICB	R1,-(R0)
	BISB	R1,-(R0)
	RTS	PC
1$:	JSR	R0,SOFT
	 .WORD	REWIND
	BISB	UBITS,F.HW
2$:	JSR	PC,3$
	BIS	R1,-(R0)
	RTS	PC
$ENTER:
.IF NE MMG$T
	JSR	PC,GETFLN
.ENDC
	TST	@CA
	BEQ	2$
	JSR	PC,SEEK
	 BR	NFOUND
OPEN:	TST	BLOCK
	BEQ	NFOUND
	JSR	PC,DELIT
	JSR	PC,CHKHDR
	 BR	NFOUND
	BR	OPEN
NFOUND:	BIS	UBITS,(PC)+
	.BYTE	0
ENTFLG:	.BYTE	0
	JSR	PC,LABEL
3$:	ADDR
3$:	MOV	WCSAV,R4
	MOV	CASAV,CA
.IF NE MMG$T
	CLRB	CTMVS
.ENDC
	BR	1$
4$:	.ENDC
	ADD	#200,R4
	BCS	RTSPC
.IF NE MMG$T
	ADD	#2,Q.PAR
.IFF
	ADD	#200,CA
.ENDC
	BR	1$
.SBTTL	READ SERVICE ROUTINE
READU:	ADDR	LBLBUF,R0
	MOV	R0,CA
READB:	MOV	#READ,R1
	BR	SOFT1
TSTBAK:	TST	BLOCK
	BNE	RTSPC
	JSR	R0,SOFT
	 .WORD	LSTFIL
FSP:	MOV	#NXTBLK,R1
	BR	SOFT1
WSENT:	JSR	R0,SOFT
	 .WORD	WGAP
	JSR	PC,NAMOFF
	CLRB	(R1)
	JSR	PC,LABEL
BSP:	MOV	#LSTBLK,R1
	BR	SOFT1
.SBTTL	SOFT - INITIATE SOFTWARE FU	0
	MOV	(R0)+,(PC)+
BLOCK:	.WORD	0
	MOVB	1(R0),R1
	ASR	R1
	ASR	R1
	ASR	R1
	BIC	#177770,R1
	MOV	R1,SYNBLK+2
	MOVB	(R0)+,R1
	CLR	R3
	MOV	#401,R2
	MOVB	(R0)+,(PC)+
UNIT:	.WORD	0
	BIC	#177770,UNIT
	BEQ	2$
	CMP	UNIT,#1
	BNE	CTILLF
	ASL	R2
	BIS	#UNITNO,R3
2$:	MOV	R3,(T5)
.IF NE MMG$T
MOV	R2,UBITS
	MOV	(R0)+,CA
	NEG	(R0)
	MOV	(R0)+,WC
	TST	(R0)+
	MOV	(R0),Q.PAR
	BR	CGETC
CA:	.WORD	0
WC:	.WORD	0
UBITS:	.WORD	0
Q.PAR:	.WORD	0
.IFF
	MOV	R2,(PC)+
UBITS:	.WORD	0
	MOV	(R0)+,(PC)+
CA:	F.CLOSE,R0
	MOV	UBITS,R1
	BISB	R1,(R0)+
	BICB	R1,(R0)+
	BIC	R1,(R0)+
	BICB	R1,(R0)+
	BISB	R1,(R0)+
	MOV	CTCQE,R2
	CLR	Q.WC(R2)
	RTS	PC
.DSABL	LSB
.SBTTL	$NEWVOL, $DELETE, $CLOSE
.ENABL	LSB
.IF DF	NEWVOL
$NEWVOL:JSR	R0,SOFT
	 .WORD	REWIND
	BR	2$
.ENDC
.IF NE MMG$T
SWINI2:	JMP	SWINIT
.ENDC
$DELETE:
.IF NE MMG$T
	JSR	PC,GETFLN
.ENDC
.IF	DF,NEWVOL
	TST	@CA
	BEQ	$NEWVOL
	.ENDC
	JSR	PC,SEEK
.IF NE MMG$T
	BR	SWINI2
.IFF
SWINI2:	 BR	SWINIT
.ENDC
DELIT:	ADDR	FILNAM,R2
	MOVB	#ASTNCTION
SOFT:	MOV	(R0)+,R1
	MOV	R0,@SP
SOFT1:	JSR	R4,SAVSTK
.SBTTL	FUNCTION INITIATION ROUTINE
.ENABL	LSB
XCT:	BIC	#177770,R1
	MOV	R1,CURFUN
	TSTB	F.MACRO
	BNE	2$
	BITB	UBITS,F.HW
	BNE	1$
	CMP	R1,#REWIND
	BEQ	3$
	JMP	CTILLF
3$:	BISB	UBITS,F.HW
1$:	MOV	R1,-(SP)
	JSR	PC,DUNDEL
	MOV	(SP)+,R1
2$:	MOV	#3,(PC)+
RETRY:	.WORD	0
	ASL	R1
RERE:	CLRB	BIP
.IF NE MMG$T
	MOV	CA,TACA
	MOV	WC,TABC
	MOV	TC,TATC
	MOV	Q.PAR,TAQP
	MOV	#512.,TAQPCT
.IFF
	MOV	CA,(PC)+
TACA:	.WORD	0
	MOV	WC,(PC)+
T$:	BITB	UBITS,F.HW
	BNE	21$
	BIT	#OFF+WRL,(T5)
	BEQ	11$
	TST	(PC)+
IGNOFF:	.WORD	0
	BNE	11$
21$:	TSTB	BIP
	BNE	ERRHW
	DEC	RETRY
	BLE	ERRHW
	BIT	#OFF+WRL+BOTEOT+FGAP,R3
	BNE	ERRHW
	MOV	R3,(PC)+
CURFUN:	.BYTE	0
BIP:	.BYTE	0
	MOV	#LSTBLK*FUNC,R1
	JMP	SETFUN
CTABRT:	BIC	#INTEN,@#TACS
	BR	CTHOME
.DSABL	LSB
.SBTTL	EXIT SEQUENCE
.ENABL	LSB
ERRHW:	BIS	#HWERR,@CSWPTR
	TSTB	F.MACRO
	BEQ	RESP
	BITB	#FILNFD+ILLFUN,@SWWPTR
	BNE	2$
	BISB	#FILNFD,@SWWPTR
CLEAN:	BITB	UBITS,F.WRITE
	BNE	1$
	BABC:	.WORD	0
	MOV	TC,(PC)+
TATC:	.WORD	0
.ENDC
SETFUN:	MOVB	R1,(T5)
	JSR	R3,RESREG
	BIS	#INTEN+GO,@#TACS
RTSPC:	RTS	PC
.IF NE MMG$T
TACA:	.WORD	0
TABC:	.WORD	0
	TATC:	.WORD	0
TAQP:	.WORD	0
TAQPCT:	.WORD	0
.ENDC
.DSABL	LSB
.IF DF	MUL
.SBTTL	SYNCH ROUTINE
	.ENABL	LSB
CTSYNCH:MOV	@SP,1$
	ADD	#2,@SP
	BIT	#SJMON,CTSJ
	BEQ	10$
	JSR	R4,SAVSTK
	ADD	#SYNBLK-.,R4
	JSR	R3,RESREG
	CLR	12(R4)
	JSR	R5,@SYNCH(R5)
.IF NE MMG$T
	BR	CTABRJ
.IFF
	BR	CTABRT
.ENDC
	JSR	PC,@(PC)+
1$:	.WORD	0
	ITB	UBITS,ENTFLG
	BEQ	RESP
1$:	JSR	R0,SOFT
	 .WORD	LSTFIL
	JSR	PC,WSENT
2$:	JSR	PC,DUNDEL
RESP:	CLR	FIN
	MOV	SPSAV,SP
	JSR	R3,RESREG
.IF NDF	DEBUG
CTHOME:	.DRFIN	CT
.IFF
	JMP	QMAN
.ENDC
.DSABL	LSB
.SBTTL	SEEK
.ENABL	LSB
SEEK:	MOV	CA,R2
	ADD	#6,R2
	JSR	PC,NAMOFF
	ADD	#11,R1
	CLRB	(R1)
	MOV	#^B<0010010010000000>,R3
1$:	MOV	-(R2),R0
2$:	CLR	R4
	MOV	#16.,-(SP)
3$:	ASL	R0
	ROL	R4
	CMP	R4,#50
	BLO	4$
	SUB	#50,R4
	INC	R0
4$:	DEC	(SP)
	BNE	3$
	BIS	(SP)+,R4
	BEQ	5$
	CMP	R4,#32
	MOVB	#PR6,@#PSW
	MOV	@SP,-(SP)
	CLR	2(SP)
	BR	CTINT
10$:	JSR	PC,@1$
	RTS	PC
CTSJ:	.WORD	0
	.DSABL	LSB
.ENDC
.IF NE MMG$T
CTABRJ:	JMP	CTABRT
.ENDC
.SBTTL	INTERRUPT ROUTINE
.ENABL	LSB
.IF NE MMG$T
	.DRAST	CT,6,CTABRJ
.IFF
	.DRAST	CT,6,CTABRT
.ENDC
	MOV	R3,-(SP)
	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	SP,SPSAV
CTIN2:	MOV	#TACS,T5
	TSTB	(T5)
	BPL	10$
	INC	TABC
	BGT	3$
	MOV	TACA,R0
.IF NE MMG$T
	MOV	#TADB,R3
.ENDC
	INC	TATC
.IF NE MMG$T
	BLE	CDOXF
	ADDR	CXFER,R0
	BR	CBLE	6$
	SUB	#36,R4
	BCC	7$
5$:	MOV	#-40,R4
6$:	ADD	#20,R4
7$:	ADD	#60,R4
	MOVB	R4,-(R1)
	ASL	R3
	BCC	2$
	BNE	1$
	TST	BLOCK
	BGT	CHKHDR
	NEG	BLOCK
SEEKC:	JSR	R0,SOFT
	 .WORD	REWIND
CHKHDR:	MOV	#-32.,WC
	MOV	#-32.,TC
	JSR	PC,READU
.IF DF	MUL
	JSR	PC,EOTCHK
	BNE	SEEKC
.ENDC
	JSR	PC,NAMOFF
	MOV	CA,R0
	TSTB	(R0)
	BEQ	12$
	DEC	BLOCK
	BEQ	11$
	MOV	#9.,R3
10$:	BICB	#200,(R0)
	CMPB	(R0)+,(R1)+
	BNE	20$
	DEC	R3
	BGT	10$
.IF DF	MUL
	CMPB	3(R0),(R1)
	BNE	20$
.ENDC
11$:	ADD	#2,(SP)MRW
CXFER:	.WORD	0
RAWFLG:	.BYTE	0
CTURW:	.BYTE	0
CDOXF:	TSTB	CTURW
	BEQ	CMRW
	TSTB	CTMVS
	BNE	CMRW
	TSTB	RAWFLG
	BNE	CMRW
	MOV	R4,-(SP)
	ADDR	TACA-4,R4
	CMP	CURFUN,#READ
	BNE	XCWRIT
XCREAD:	MOVB	(R3),-(SP)
	JSR	PC,@$PTBYT
	BR	5$
XCWRIT:	JSR	PC,@$GTBYT
	MOVB	(SP)+,(R3)
5$:	MOV	(SP)+,R4
	BR	6$
CMRW:	CMP	CURFUN,#READ
	BNE	1$
	MOVB	(R3),(R0)
	BR	2$
1$:	MOVB	(R0),(R3)
2$:	INC	TACA
6$:	DEC	TAQPCT
	BNE	4$
	ADD	#8.,TAQP
	SUB	#8.*32.*2,TACA
	MOV	#512.,TAQPCT
.IFF
	BLE	1$
	ADDR	2$,R
12$:	JMP	BSP
20$:	JSR	R0,SOFT
	 .WORD	NXTFIL
	BR	CHKHDR
.DSABL	LSB
.SBTTL	EOTCHK, VOLCHK
.IF DF	MUL
.ENABL	LSB
EOTCHK:	JSR	PC,VOLCHK
	BEQ	1$
.IF NE MMG$T
	INCB	CTMVS
.ENDC
	CMP	WC,#-32.
	BEQ	2$
	JSR	PC,NAMOFF
	ADD	#11,R1
	INCB	(R1)
	MOV	R4,(PC)+
WCSAV:	.WORD	0
	MOV	CA,(PC)+
CASAV:	.WORD	0
2$:	TST	SP
1$:	RTS	PC
.DSABL	LSB
.ENABL	LSB
VOLCHK:	BIT	#BOTEOT,(T5)
	BEQ	3$
	DEC	TABC
	BEQ	3$
	CLR	(PC)+
OFLAG:	.WORD	0
	JSR	PC,CTSYNCH
	 BR	10$
1$:	INC	IGNOFF
	JSR	R0,SOFT
	 .WORD	NX0
1$:	MOV	#TADB,R3
	MOV	#111013,2$
	CMP	CURFUN,#READ
	BNE	2$
	MOV	(PC)+,(PC)
	MOVB	(R3),(R0)
2$:	HALT
	INC	TACA
.ENDC
	BR	4$
3$:	BIS	#ILBS,(T5)
4$:	JSR	R3,RESREG
	RTS	PC
10$:	BIC	#INTEN,(T5)
	BIT	#READY,(T5)
	BEQ	ERRHW
	TST	(T5)
	BMI	20$
11$:	TSTB	BIP
	BNE	12$
	TSTB	F.MACRO
	BEQ	RESP
	JSR	R4,RESSTK
	RTS	PC
12$:	MOVB	CURFUN,R1
.IF NE MMG$T
	JMP	RERE
.IFF
	BR	RERE
.ENDC
20$:	MOV	(T5),R3
	BIT	#BOTEOT,R3
	BNE	22$
	BIT	#CRC+WRL+TIME,R3;IF NOT BOTEOT,OFF,OR FILE GAP
	BNE	21$
22TBLK
	BIT	#OFF,(T5)
	BEQ	2$
	MOV	#100001,OFLAG
	JSR	PC,CTSYNCH
	 RTS	PC
	CLR	IGNOFF
	BR	1$
2$:	CLR	IGNOFF
	TST	OFLAG
	BEQ	4$
	DEC	OFLAG
	BVC	1$
3$:	RTS	PC
4$:	BIT	#BOTEOT+OFF,(T5)
	BNE	1$
	JSR	R0,SOFT
	 .WORD	REWIND
        BICB    UBITS,F.CLOSE
	JMP	SWEOF
10$:	ADDR	UNO,R0
	MOVB	UNIT,@R0
	BISB	#'0,@R0
	TST	-(R0)
	.PRINT
	RTS	PC
.NLIST	BEX
MSG:	.ASCII	"CT"
UNO:	.ASCIZ	"0: PUSH REWIND OR MOUNT NEW VOLUME"
.LIST	BEX
.EVEN
.DSABL	LSB
.ENDC
.SBTTL	LABEL PROCESSOR
LABEL:	JSR	PC,TST	T.STAT(R3)
	BPL	4$
	JSR	PC,TTHIN
	MOV	T.CSR(R3),R4
4$:	MOVB	R0,T.PTTI(R3)
	TSTB	T.CNF2(R3)
	BMI	5$
	BIT	#TTSPC$,@R3
	BNE	5$
	JSR	PC,TTOPT3
.IF NE	MAT$S!BF
	TST	T.TTLC-T.ICTR(R1)
.ENDC
.IF EQ	MAT$S
	BEQ	6$
.IFF
	BNE	5$
	JSR	PC,CLRIN
	BR	6$
.ENDC
5$:
.IF NE	MAT$S
	JSR	PC,SETIN
.ENDC
.IF NE	BF
	JSR	R4,UNBLOK
	 .WORD	TTIWT$
.ENDC
6$:	RTS	PC
7$:	TSTB	T.CNF2(R3)
	BMI	6$
	MOVB	R0,T.PTTI(R3)
DING:	MOV	#BELL,R0
	JMP	TTOPT4
.DSABL	LSB
.SBTTL	INPUT CONTROL CHARACTER PROCESSINGXPRE(R3)
	BR	9$
2$:	CLRB	T.XPRE(R3)
	BR	ECHOCL
.ENDC
3$:	ADD	#T.PTTI-T.STAT,R2
4$:	TST	@R1
	BEQ	11$
	MOVB	@-(R1),R0
	JSR	PC,EOLTST
	BEQ	10$
	CMP	@R1,-2(R1)
	BNE	5$
	ADD	#TTYIN,@R1
5$:	DEC	(R1)+
	DEC	@R1
6$:	TST	@SP
	BPL	4$
	MOV	@R3,(SP)+
.ASSUME	BKSP$	EQ	100000
	BPL	8$
7$:	JSR	R5,ECHO
	 .ASCII	<BS><SPACE>
	MOV	#BS,R0
.IF EQ SYT$K
	BR	TTOPT4
.IFF
	JMP	TTOPT4
.IFTF
8$:	CMPB	@R2,#RUBOUT
.IFT
	BEQ	TTOPT3
.IFF
	BEQ	91$
.IFTF
	MOVB	#RUBOUT,@R2
9$:	JSR	R5,ECHO
	 .ASCII	"\"<0>
NAMOFF
	ADDR	FILNAM,R2
	MOV	#9.,R4
1$:	MOVB	(R1)+,(R2)+
	DEC	R4
	BGT	1$
	ADD	#3,R2
	MOVB	(R1)+,(R2)+
	TSTB	(R2)+
	.DATE
	MOV	R0,R1
	ASL	R1
	ASL	R1
	ASL	R1
	BIC	#160377,R1
	JSR	PC,ASC
	MOV	R0,R1
	BNE	2$
	CLRB	-2(R2)
2$:	ASR	R1
	ASR	R1
	JSR	PC,ASC
	MOV	R0,R1
	BIC	#177740,R1
	ADD	#72.,R1
	SWAB	R1
	JSR	PC,ASC
	ADD	#FILNAM-GENNO,R2;POINT R2 TO START OF HEADER
DELAB:	MOV	R2,CA
	MOV	#-32.,WC
	JMP	WRTBLK
ASC:	CLRB	R1
1$:	ADD	#173001,R1
	BPL	1$
	ADD	#"00+<10.*400-1>,R1
	MOV	R1,(R2)
.ENABL	LSB
.IF NE	BF
CTLCHI	B
	JSR	PC,SWICTX
	MOV	BCNTXT,R2
XCOM:	MOV	R2,TTIUSR
.IF NE	SYT$K
	TSTB	XFLG
	BNE	TTOSET
.ENDC
	CMP	R2,TTOUSR
	BEQ	2$
TTOSET::MOV	R2,TTOUSR
	MOV	I.TID(R2),T.TID(R3)
	JMP	TTOENB
CTLCHI	F
	JSR	PC,SWICTX
	MOV	FCNTXT,R2
	BEQ	1$
.IF NE	SYT$K
	CMP	I.CNSL(R2),R3
	BNE	1$
.ENDC
	BIT	#NORUN$,I.BLOK(R2)
	BEQ	XCOM
1$:	JSR	R5,ECHO
	 .ASCII	"F?"
	JMP	ECHOCL
.ENDC
ALT:	MOV	#ESCAPE,R0
BTINC3:	BR	TTINC3
CTLCHI	O
	MOV	R1,R2
	ADD	#T.OCTR-T.ICTR,R2
	CLRB	(R2)+
	MO+
	RTS	PC
.SBTTL	UTILITY ROUTINES
SAVSTK:	JSR	R2,@PC
	ADD	#STAK-.,R2
	MOV	R2,STKPTR
1$:	MOV	(SP)+,(R2)+
	CMP	SPSAV,SP
	BHI	1$
	MOV	R2,(PC)+
SPSAVE:	0
	JMP	@R4
.ENABL	LSB
RESSTK:	TST	(SP)+
	MOV	SPSAVE,R2
1$:	MOV	-(R2),-(SP)
	CMP	(PC)+,R2
STKPTR:	0
	BNE	1$
	MOV	(SP)+,R2
	RTS	R4
.DSABL	LSB
RESREG:	TST	(SP)+
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	MOV	@#MONLOW,R5
	RTS	R3
NAMOFF:	MOV	UNIT,R3
	ADDR	SNAME-12,R1
1$:	ADD	#12,R1
	DEC	R3
	BGE	1$
	RTS	PC
.SBTTL	DATA AREAS
MACROS=VB	@R2,-(SP)
	CLRB	(R2)+
	MOV	@R2,-4(R2)
	JSR	R5,ECHO0C
	 .ASCII	<CR><LF>
	COMB	@SP
	MOVB	(SP)+,T.OCTR+1-T.ICTR(R1)
	BEQ	2$
.IF NE	BF
	JSR	R4,UNBLOK
	 .WORD	TTOWT$!TTOEM$
.ENDC
2$:	RTS	PC
.DSABL	LSB
CTLCHI	C
.ENABL	LSB
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BEQ	2$
1$:	JSR	R5,ECHO0C
	 .ASCII	<CR><LF>
	CLR	T.XFLG(R3)
	RTS	PC
2$:
.ENDC
	TST	@R2
	BPL	3$
.IF NE	BF
	TST	I.SCCA(R5)
.IFF
	TST	I.SCCA
.ENDC
	BEQ	4$
3$:	BIT	#TTSPC$,@R3
	BNE	5$
4$:	JSR	R5,ECHO0C
	 .ASCII	<CR><LF>
5$:	CMPB	.-2
10$:	.WORD	$CLOSE-.
	.WORD	$DELETE-.
	.WORD	$LOOKUP-.
	.WORD	$ENTER-.
	.WORD	$READ-.
	.WORD	$WRITE-.
.IF DF	NEWVOL
	.WORD	$NEWVOL-.
.ENDC
MAXFUN	= <. - 10$> / 2
FLGTAB:
F.HW:	.BYTE	0
F.MACRO:.BYTE	0
F.CLOSE:.BYTE	0
F.DELETE:.BYTE	377
F.LOOKUP:.BYTE	377
F.ENTER:.BYTE	377
F.READ:	.BYTE	0
F.WRITE:.BYTE	0
.IF DF	NEWVOL
F.NEWVOL:.BYTE	377
.ENDC
.EVEN
FILNAM:	.ASCII	/         /
FILTYP:	.BYTE	0
LENGTH:	.BYTE	0
	.BYTE	200
SEQNO:	.BYTE	0
LEVEL:	.BYTE	1
DATE:	.ASCII	/      /
GENNO:	R0,T.PTTI(R3)
	BNE	BTINC3
	TST	T.STAT(R3)
.ASSUME	CONSL$	EQ	100000
	BPL	7$
.IF NE	BF
	MOV	I.SCCA(R5),R2
	BNE	8$
	TST	I.JNUM(R5)
	BNE	6$
	BIS	#IFABRT,STATWD
.IFF
	MOV	I.SCCA,R2
	BNE	8$
	BIS	#IFABRT!IFCTLC,STATWD
.ENDC
	BICB	#<LN$IND!IN$IND!IN$RUN>,INDSTA
	TST	EXTFLG
	BNE	BTINC3
.IF NE	BATC$H
	MOV	$ENTRY+BA.NUM,R2
	BEQ	6$
	CLR	6(R2)
.ENDC
6$:	JMP	$RQABT
7$:	BIS	#CTRLC$,T.STAT(R3)
	BR	9$
8$:
.IF NE	MMG$T
	MOV	@#KISAR1,-(SP)
	MOV	I.SCCA+2(R5),@#KISAR1
.ENDC
	BIS	#100000,@R2
.IF .BYTE	0
ATTR:	.BYTE	0
UNUSED:	.BYTE	0,0,0,0,0,0,0,0,0,0
.EVEN
LBLBUF:	.BLKB	32.
.IF DF	RCHECK
	.BLKB	128.-32.
.ENDC
.IF NE MMG$T
FILENM:	.WORD	0,0,0
.ENDC
SNAME:	.BLKB	12*2
SYNBLK:	.WORD	0,0,0,0,0,0,0
STAK:	.BLKW	12
.IIF NDF DEBUG,	.NLIST
.IF DF	DEBUG
	.=.+100
.ENDC
.IIF NDF DEBUG,	.LIST
.IF DF INIT
	.END	TEST
.ENDC
	.DREND	CT
	.END
                                                                                                                                                        NE	MMG$T
	MOV	(SP)+,@#KISAR1
.ENDC
9$:
.IF NE	MAT$S
	JSR	PC,CTCON
.ENDC
	JMP	TTINC3
.DSABL	LSB
.ENABL	LSB
RUB:	ADD	#200,R0
CTLCHI	U
	BIT	#TTSPC$,@R3
	BNE	BTINC3
	ROR	-(SP)
.IF NE	SYT$K
	TSTB	T.XFLG-T.STAT(R2)
	BEQ	3$
	ADD	#T.XFLG+1-T.STAT,R2
	TST	(SP)+
	BMI	1$
	CLRB	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	BR	12$
1$:	MOVB	(R2)+,R5
	BEQ	2$
	ADD	R2,R5
	INC	R5
	MOVB	@R5,R0
	CLRB	@R5
	DECB	-1(R2)
	TST	@R3
	BMI	7$
	CMPB	T.XPRE(R3),#RUBOUT
	BEQ	91$
	MOVB	#RUBOUT,T.JSR	R5,ECHO
	 .ASCII	"?"<0>
	JSR	PC,ECHOCL
	CLR	T.XFLG(R3)
	RTS	PC
.ENDC
.SBTTL	TTOENB	- Enable output interrupt
.ENABL	LSB
TTOENB::
.IF NE	DZ11$N
	BIT	#DZ11$,T.STAT(R3)
	BEQ	DLOENB
DZOENB:	MOVB	T.PUN(R3),R2
PBMSK2	== .+2
	BISB	BITMSK(R2),DZ.TCR(R4)
	BR	1$
.ENDC
DLOENB:
.IF NE	MTI$M
	BIS	#INEXP$,T.STAT(R3)
.ENDC
HKPC04 == .
	MOV	#IENABL,T.TPS(R4)
.ASSUME	.-HKPC04 EQ 6
1$:	CLC
	RTS	PC
.DSABL	LSB
.IF NE	SYT$K
XPROMT:	.ASCIZ	<CR><LF>"Job? "
.ENDC
.IF NE	DZ11$N
BITMSK::.BYTE	1,2HSROGP
.ENDC
	JSR	PC,50$
	DEC	HSROCC
	BPL	30$
	RTS	PC
50$:
.ENDC
.IF GT	DL11$N-1
	BIC	#^C<17>,R4
	ASL	R4
PDLTB1	== .+2
	MOV	DLTBL(R4),R3
.IFF
	MOV	DLTBL,R3
.ENDC
	MOV	T.CSR(R3),R4
.IF NE	MTI$M
	BIC	#INEXP$,T.STAT(R3)
	CLR	T.RTRY(R3)
.ENDC
	JSR	PC,OUTPTR
	BEQ	2$
	JSR	PC,OUTCHR
	BCS	2$
.IF NE	MTI$M
	BIS	#INEXP$,T.STAT(R3)
.ENDC
HKPC07 == .
	MOV	R0,T.TPB(R4)
.ASSUME	.-HKPC07 EQ 4
	RTS	PC
2$:
HKPC05 == .
	MOV	#0,T.TPS(R4)
.ASSUME	.-HKPC05 EQ 6
	RTS	PC
.DSABL LSB
.SBTTL	Con,4,10,20,40,100,200
	.EVEN
.ENDC
.SBTTL	Character output subroutines
.ENABL	LSB
.SBTTL	ECHOR0 - Print a control character in "^x" form
ECHOR0:	MOV	R0,-(SP)
	MOV	#UPAROW,R0
	JSR	PC,TTOPT3
1$:	MOV	(SP)+,R0
	BIS	#100,R0
	.BR	TTOPT3
.SBTTL	TTOPT3 - Print a character, check for special changes:
TTOPT3::CMPB	#CTRLC,R0
	BEQ	7$
	CMPB	#ESCAPE,R0
	BNE	2$
	MOV	#DOLLAR,R0
2$:	CMPB	#40,R0
	BLOS	TTOPT4
	CMPB	#15,R0
	BLO	ECHOR0
	CMPB	#11,R0
	BHI	ECHOR0
.SBTTL	TTOPT4 - Print a character, no checkitrol character output dispatch table
.MACRO	CTLCHO	C
OUP'C::
.=C+TTOTBL
	.BYTE	OUP'C-TTOBAS
.=OUP'C
.SBTTL	Process C output
.ENDM	CTLCHO
TTOTBL::
.REPT	40
	.BYTE	OUPXXX-TTOBAS
.ENDR
.SBTTL	OUTCHR - Output character processing
.ENABL	LSB
OUTCHR:	TSTB	T.STAT(R3)
	BPL	991$
.ASSUME	PAGE$	EQ	200
20$:	SEC
	RTS	PC
991$:	TST	T.CNF2(R3)
	BMI	1$
.ASSUME	WPALL$	EQ	100000
	TSTB	T.NFIL(R3)
	BEQ	901$
	DECB	T.NFIL(R3)
	CLR	R0
	RTS	PC
901$:	TSTB	T.TNFL(R3)
	BEQ	1$
	INCB	T.TNFL(R3)
	MOVB	T.TCT.IFT
	BR	TTOPT3
.IFF
91$:	JMP	TTOPT3
.ENDC
10$:	TST	(R1)+
11$:	CLRB	@R2
	TST	(SP)+
	BPL	12$
	TST	@R3
	BPL	ECHOCL
	RTS	PC
12$:	JSR	R5,ECHO
	 .ASCII	"^U"
ECHOCL:	JSR	R5,ECHO
	 .ASCII	<CR><LF>
	RTS	PC
.DSABL	LSB
CTLCHI	S
	TSTB	@R3
.ASSUME	PAGE$	EQ	200
	BPL	JTINCC
	BIS	#PAGE$,@R2
	RTS	PC
CTLCHI	Q
	BIC	#PAGE$,T.STAT(R3)
	TSTB	@R3
	BPL	JTINCC
.IF NE	DZ11$N
	BIT	#DZ11$,T.STAT(R3)
	BEQ	1$
	MOVB	T.PUN(R3),R2
PBMSK1	== .+2
	BICB	BITMSK(R2),DZ.TCR(R4)
	BR	DZOENB
1$:
.ENDC
HKPC03 =ng for specials
TTOPT4::MOV	R1,R2
.SBTTL	TTOPT2 - Print a character, no checking for specials
TTOPT2::ADD	#T.OCTR-T.ICTR,R2
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BNE	3$
.ENDC
	TST	@R2
	BMI	7$
3$:	TST	T.CNF2(R3)
	BMI	8$
.ASSUME	WPALL$	EQ	100000
	BICB	#^C<177>,R0
8$:	CMPB	#TTYOUT-1,@R2
	BLO	7$
.IF NE	MAT$S
	JSR	PC,RGFUL
.ENDC
	CMP	4(R2),-(R2)
	BHI	4$
	SUB	#TTYOUT,@R2
4$:	MOVB	R0,@(R2)+
	INC	-(R2)
	INC	2(R2)
	BR	TTOENB
.SBTTL	ECHO0C - Print control character, then 1 or 2 constant character= .
	CLR	T.TPS(R4)
.ASSUME	.-HKPC03 EQ 4
	BR	DLOENB
.IF NE	BF
.ENABL	LSB
SWICTX:	BIT	#SHARE$,T.STAT(R3)
	BEQ	1$
	BIT	#FBTTY$,@R3
	BEQ	1$
.IF NE	SYT$K
	MOV	T.XFLG(R3),(PC)+
XFLG:	.WORD	0
	CLR	T.XFLG(R3)
.ENDC
	RTS	PC
1$:	TST	(SP)+
.ENDC
JTINCC:	JMP	TTINCC
.DSABL	LSB
.IF NE	SYT$K
CTLCHI	X
	JSR	PC,SWICTX
	ADD	#T.XFLG-T.STAT,R2
	MOV	#201,(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	MOV	TTIUSR,TTOUSR
	BR	TTOENB
.SBTTL	XPROC - Process characters in ^X sequence
XPROC::	MOV	Rs
ECHO0C:	MOV	R0,-(SP)
	JSR	PC,ECHOR0
	BR	5$
.SBTTL	ECHO - Print one or two constant characters
ECHO:	MOV	R0,-(SP)
5$:	MOVB	(R5)+,R0
	JSR	PC,TTOPT4
	MOVB	(R5)+,R0
	BEQ	6$
	JSR	PC,TTOPT4
6$:	MOV	(SP)+,R0
	RTS	R5
7$:	RTS	PC
.DSABL	LSB
.SBTTL	EOLTST - Test for end of line
EOLTST::CMPB	#LF,R0
	BEQ	1$
	CMPB	#'Z-100,R0
	BEQ	1$
	CMPB	#'C-100,R0
1$:	RTS	PC
.SBTTL	DLOINT - DL11 output interrupt routine
.ENABL LSB
TTOINT::
DLOINT::
.IF EQ	HSR$O
.IF GT	DL11$N-1
	GETPSW
	MOV	(SP)+,DLTMP
3,R5
	ADD	#T.XPRE,R5
	CMPB	#RUBOUT,@R5
	BNE	1$
	TST	@R3
	BMI	1$
	JSR	R5,ECHO
	 .ASCII	"\"<0>
1$:	CMPB	#CR,R0
	BEQ	3$
	JSR	PC,EOLTST
	BEQ	3$
	MOVB	-(R5),R2
	CMP	#6,R2
	BGT	2$
	JMP	DING
2$:	CMPB	R0,#'A!40
	BLO	21$
	CMPB	R0,#'Z!40
	BHI	21$
	BIC	#40,R0
21$:	INC	R2
	MOVB	R2,(R5)+
	MOVB	R0,(R5)+
	ADD	R5,R2
	MOVB	R0,@R2
	BR	TTOPT4
3$:	TST	(R5)+
	MOV	R5,R0
	JSR	PC,FNDJOB
	BEQ	4$
	CMP	I.CNSL(R2),R3
	BNE	4$
	BIT	#NORUN$,I.BLOK(R2)
	BNE	4$
	CLR	T.XFLG(R3)
	MOV	#1,R0
	JMP	XCOM
4$:	.ENDC
DLOHOK::
	JSR	R5,$INTEN
	 .WORD	^C<PR4>&PR7
	JSR	R3,SAVE30
.IF GT	DL11$N-1
	MOV	DLTMP,R4
.ENDC
.IFF
.IF GT	DL11$N-1
	GETPSW
	MOVB	(SP)+,@HSROPP
	MOV	R0,-(SP)
PHSRBO	== .+2
	MOV	#HSROPP,R0
	INC	@R0
	CMP	(R0)+,(R0)+
	BLO	10$
	MOV	@R0,HSROPP
10$:	MOV	(SP)+,R0
.ENDC
	INC	HSROCC
	BEQ	20$
	RTI
DLOHOK::
20$:	JSR	R5,$INTEN
	 .WORD	^C<PR4>&PR7
	JSR	R5,$FORK
	 .WORD	TOFBLK-.
30$:
.IF GT	DL11$N-1
	MOV	HSROGP,R5
	MOVB	(R5)+,R4
	CMP	R5,HSROEP
	BLO	40$
	MOV	HSRORP,R5
40$:	MOV	R5,OUT,@R1
11$:	TSTB	-2(R1)
.IF EQ	SYT$K
	BEQ	20$
.IFF
	BNE	12$
	TSTB	T.XFLG(R3)
	BPL	20$
	ASLB	T.XFLG(R3)
	ADDR	XPROMT,R2
	MOV	R2,T.TID(R3)
	BR	2$
12$:
.ENDC
	MOVB	@(R1)+,R0
13$:	TST	T.CNF2(R3)
	BMI	OUPXXX
.ASSUME	WPALL$	EQ	100000
	BIC	#^C<177>,R0
	CMPB	#40,R0
	BHI	SPCHAR
	CMP	R0,#RUBOUT
	BEQ	OUPXXX
	INCB	T.LPOS(R3)
	BIT	#CRLF$,@R3
	BEQ	OUPXXX
	CMPB	T.LPOS(R3),T.WID(R3)
	BLOS	OUPXXX
	CLRB	T.LPOS(R3)
	MOVB	#CR,R0
	MOV	#<-1*400>+LF,T.TCTF(R3)
17$:	MOVB	R0,T.OCHR(R3)
18$:	CMPB	R0,1$N-1
	GETPSW
	MOV	(SP)+,DZTMP
.ENDC
	JSR	R5,$INTEN
	 .WORD	^C<PR5>&PR7
	JSR	R3,SAVE30
.IF GT	DZ11$N-1
	MOV	DZTMP,R4
	BIC	#^C<17>,R4
	ASL	R4
PDZTB1	== .+2
	MOV	DZTBL(R4),R3
PDZCS1	== .+2
	MOV	DZCSR(R4),R4
.IFF
	MOV	DZTBL,R3
	MOV	DZCSR,R4
.ENDC
	MOVB	1(R4),R5
	BIC	#^C<7>,R5
	ASL	R5
	ADD	R3,R5
	MOV	@R5,R3
	JSR	PC,OUTPTR
	BEQ	2$
	JSR	PC,OUTCHR
	BCS	2$
	MOVB	R0,DZ.TDR(R4)
	RTS	PC
2$:	MOVB	T.PUN(R3),R0
PBMSK3	== .+2
	BICB	BITMSK(R0),DZ.TCR(R4)
	RTS	PC
.IF NE	DZ11$M
.SBTTL	DZMCT.TFIL(R3)
	BNE	19$
	TST	T.CNF2(R3)
	BMI	19$
.ASSUME WPALL$	EQ	100000
	MOVB	T.FCNT(R3),T.NFIL(R3)
19$:	CLC
	RTS	PC
CTLCHO	CR
	CLRB	T.LPOS(R3)
OUPXXX:	INC	-(R1)
	DEC	-(R1)
.IF NE	MAT$S
	TSTB	@R1
	BNE	17$
	CALL	RGEMP
.ENDC
	BR	17$
TTOTPT	== .+2
SPCHAR:	MOVB	TTOTBL(R0),R2
	ADD	R2,PC
TTOBAS::
CTLCHO	FF
	BIT	#FORM$,@R3
	BNE	OUPXXX
	MOV	#<-7*400>+LF,T.TCTF(R3)
	MOV	#LF,R0
	BR	OUPXXX
CTLCHO	BS
	TST	@R3
.ASSUME	BKSP$	EQ	100000
	BPL	OUPXXX
	DECB	T.LPOS(R3)
	BR	OUPXXX
CTLCHO	TAB
	BTL	-- MULTI-TERMINAL DZ11 MODEM CONTROL
DZMCTL::JSR	R5,SAVE52
	CLR	R2
1$:
.IF EQ	DZV$11
	MOV	#8.+1,-(SP)
.IFF
	MOV	#4.+1,-(SP)
.ENDC
PDZCS2	== .+2
	MOV	DZCSR(R2),R4
	BEQ	4$
PDZTB2	== .+2
	MOV	DZTBL(R2),R1
	MOVB	#377,DZ.DTR(R4)
2$:	DEC	@SP
	BEQ	4$
	MOV	(R1)+,R3
	BEQ	2$
	BIT	#REMOT$,@R3
	BEQ	2$
.IF NE	MAT$S
.IF NE	BF
	MOV	T.OWNR(R3),R5
	BNE	21$
	DEC	R5
21$:
.ENDC
.ENDC
	MOVB	T.PUN(R3),R0
PBMSK4	== .+2
	BITB	BITMSK(R0),DZ.CAR(R4)
	BEQ	3$
	BIT	#HNGUP$,T.STAT(R3)
	BEQ	2$
	MOV	#IT	#HWTAB$,@R3
	BNE	22$
	MOV	T.LPOS-1(R3),R0
	BIS	(PC)+,R0
	 .BYTE	377,370
	ADD	#SPACE+1,R0
	MOV	R0,T.TCTF(R3)
	MOVB	R0,R0
22$:	ADD	#8.*400,T.LPOS-1(R3)
	BIC	#7*400,T.LPOS-1(R3)
	BR	OUPXXX
TTHOUT:	MOV	R1,R2
	TST	T.OCTR-T.ICTR(R1)
	BMI	TTHOCM
	BEQ	23$
	BIT	#WRWT$,T.STAT(R3)
	BEQ	9$
23$:	BIS	#WRWT$,T.STAT(R3)
	MOV	TTCQE,R1
	ADD	#Q.BUFF-Q.BLKN,R1
TTHOU1:	TST	(R1)+
	BEQ	TTHOCM
.IF NE	MMG$T
	MOV	@#KISAR1,-(SP)
	BIT	#40000,@R1
	BEQ	24$
	SUB	#20000,@R1
	ADD	#200,Q.PAR-Q.WCNT(R1)
24$:	MDZANS$,-(SP)
	BISB	R0,@SP
	MOV	(SP)+,DZ.LPR(R4)
	BIC	#INIST$+HNGUP$,T.STAT(R3)
.IF NE	MAT$S
	JSR	PC,CARON
.ENDC
	BR	2$
3$:	BIT	#HNGUP$,T.STAT(R3)
	BNE	2$
PBMSK5	== .+2
	BICB	BITMSK(R0),DZ.DTR(R4)
	BIS	#HNGUP$,T.STAT(R3)
.IF NE	MAT$S
	JSR	PC,HNGON
.ENDC
	BR	2$
4$:	CMP	(SP)+,(R2)+
	CMP	R2,#DZ11$N*2
	BLO	1$
DZTIMR:	MOV	DZTMCP,DZTCOM
	JSR	R5,$TIMIO
	 .WORD	DZTMBK - .
	 .WORD	0
	 .WORD	0
	 .WORD	CLOCK/2
	RTS	PC
DZTMBK:	.WORD	0,0
	.WORD	0,0
	.WORD	177442
	.WORD	-1
DZTCOM:	.WORD	0
DF(R3),R0
	BR	18$
1$:
.IF NE	BF
	TSTB	T.OCTR-T.ICTR(R1)
	BNE	902$
	JSR	R4,UNBLOK
	 .WORD	TTOEM$
902$:	MOV	T.TID(R3),R2
	BEQ	4$
2$:	MOVB	(R2)+,R0
	BNE	3$
	CLR	R2
3$:	MOV	R2,T.TID(R3)
	BNE	18$
	CLRB	T.OCHR(R3)
4$:	BIT	#SHARE$,T.STAT(R3)
	BEQ	7$
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BNE	9$
.ENDC
	TST	T.CNF2(R3)
	BMI	7$
.ASSUME	WPALL$	EQ	100000
	CMPB	#LF,T.OCHR(R3)
	BNE	8$
	MOV	IMPLOC,R2
5$:	MOV	-(R2),R5
	BEQ	5$
	CMP	#-1,R5
	BEQ	20$
	BIT	#NORUN$,I.BLOK(R5)
	BNE	5$
.IF NE	SYT$K
	CMP	I.OV	Q.PAR-Q.WCNT(R1),@#KISAR1
.ENDC
	MOVB	@(R1)+,R0
.IF NE	MMG$T
	MOV	(SP)+,@#KISAR1
.ENDC
	TST	T.CNF2(R3)
	BMI	OUPXXX
.ASSUME	WPALL$	EQ	100000
	TST	R0
	BNE	13$
25$:	INC	-(R1)
	DEC	-(R1)
	BR	TTHOU1
TTHOCM:	MOV	R5,-(SP)
	MOV	R4,-(SP)
	JSR	PC,TTCMPL
	MOV	(SP)+,R4
	MOV	(SP)+,R5
	MOV	R2,R1
	JMP	991$
.DSABL	LSB
.IF NE	DZ11$N
.SBTTL	DZIINT - DZ11 input interrupt service
DZIINT::
.IF GT	DZ11$N-1
	GETPSW
	MOV	(SP)+,DZTMP
.ENDC
	JSR	R5,$INTEN
	 .WORD	^C<PR5>&PR7
	JSR	R3,SAVE30
1$:
.ICNSL(R5),R3
	BNE	5$
.ENDC
	CMP	TTHOUS,R5
	BEQ	6$
	TSTB	I.OCTR(R5)
	BEQ	5$
6$:	CMP	TTOUSR,R5
	BEQ	7$
	MOV	R5,TTOUSR
	MOV	I.TID(R5),T.TID(R3)
	MOV	R5,R1
	ADD	#I.ICTR,R1
	BR	1$
.ENDC
7$:	TST	T.STAT(R3)
.ASSUME	CONSL$	EQ	100000
	BPL	9$
8$:
.IF NE	BF
	CMP	TTHOUS,R5
	BEQ	TTHOUT
.IFF
	TST	TTHOUS
	BNE	TTHOUT
.ENDC
9$:
.IF NE	BF
..TTON	== .+4
	CMPB	T.OCTR-T.ICTR(R1),#TTYOUT
	BNE	10$
	JSR	R4,UNBLOK
	 .WORD	TTOWT$
10$:
.ENDC
	ADD	#T.OTOP-T.ICTR,R1
	CMP	@R1,-(R1)
	BNE	11$
	SUB	#TTYF GT	DZ11$N-1
	MOV	DZTMP,R4
	BIC	#^C<17>,R4
	ASL	R4
PDZTB0	== .+2
	MOV	DZTBL(R4),R3
PDZCS0	== .+2
	MOV	DZCSR(R4),R4
.IFF
	MOV	DZTBL,R3
	MOV	DZCSR,R4
.ENDC
	MOV	DZ.RBUF(R4),R0
	BPL	3$
.ASSUME	DZDVD$	EQ	100000
	MOV	R0,R5
	SWAB	R5
	BIC	#^C<7>,R5
	ASL	R5
	ADD	R3,R5
	MOV	@R5,R3
	BEQ	1$
	TSTB	T.CNF2(R3)
	BMI	2$
.ASSUME	RPALL$	EQ	200
	BIC	#^C<177>,R0
	BEQ	1$
2$:	JSR	PC,INPTR
	BEQ	1$
	JSR	PC,INTCOM
	BR	1$
3$:	RTS	PC
.SBTTL	DZOINT	- DZ11 output interrupt service
DZOINT::
.IF GT	DZ1
	 .WORD	0
SETIN::	JSR	R1,TRMSTS
	 .WORD	0
	 .WORD	AS.INP
RGFUL::	JSR	R1,TRMSTS
	 .WORD	AS.OUT
	 .WORD	0
RGEMP::	JSR	R1,TRMSTS
	 .WORD	0
	 .WORD	AS.OUT
.SBTTL	TRMSTS	- Copy terminal status to user
TRMSTS:	TST	T.AST(R3)
	BEQ	1$
.IF NE	BF
	CMP	R5,T.OWNR(R3)
	BNE	1$
.ENDC
.IF NE	MMG$T
	MOV	@#KISAR1,-(SP)
	MOV	T.AST+2(R3),@#KISAR1
.ENDC
	BIC	(R1)+,@T.AST(R3)
	BIS	(R1)+,@T.AST(R3)
.IF NE	MMG$T
	MOV	(SP)+,@#KISAR1
.ENDC
1$:	MOV	(SP)+,R1
	RTS	PC
.ENDC
.SBTTL	DATA AREAS
.IF NE	BF
4
	Q.WCNT	=	6
	MONLOW	=	54
	QCOMP	=	270
	DUMMY	=	0
	JOBNUM	=	34000
.SBTTL	INSTALLATION CHECKS
.ASECT
.	= 200
	NOP
	MOV	176,R0
	TSTB	2(R0)
	BPL	1$
	MOV	#1000,2(R0)
	BIT	#1000,2(R0)
	BNE	1$
	SEC
1$:	RTS	PC
.SBTTL	SET COMMANDS
.ASECT
.=400
	NUMARG	=	100
	NOARG	=	200
	.WORD	^C<DUMMY>
	.RAD50	/DENSE/
	.BYTE	<DENS-400>/2
	.BYTE	NUMARG
	.WORD	^C<DUMMY>
	.RAD50	/DUMP/
	.BYTE	<DMP-400>/2
	.BYTE	NOARG
	.WORD	PEVN
	.RAD50	/ODDPAR/
	.BYTE	<PARITY-400>/2
	.BYTE	NOARG
	.WORD	^C<DUMMY>TTOUSR::.WORD	BKGND
TTIUSR::.WORD	BKGND
.ENDC
TTHOUS::.WORD	0
TTHIUS::.WORD	0
.IF NE	HSR$B
HSRB::	.WORD	HSRBUF
HSRBEP::.WORD	HSRBUE
HSRBRP::.WORD	HSRBUF
HSRBCC::.WORD	-1
HSRBGP::.WORD	HSRBUF
HSRBUF::.BLKW	HSRBSZ*2
HSRBUE::
TIFBLK::BSS	F.BSIZ/2
.ENDC
.IF NE	HSR$O
.IF EQ	DL11$N-1
HSROCC::.WORD	-1
.IFF
HSROPP::.WORD	HSROBF
HSROEP::.WORD	HSROBE
HSRORP::.WORD	HSROBF
HSROCC::.WORD	-1
HSROGP::.WORD	HSROBF
HSROBF::.BLKB	DL11$N
HSROBE::
	.EVEN
.ENDC
TOFBLK::BSS	F.BSIZ/2
.ENDC
.END
    
	.RAD50	/DEFALT/
	.BYTE	<DFLT-400>/2
	.BYTE	NUMARG
	.WORD	0
DENS:	CLR	R3
	CMP	#200.,R0
	BEQ	DENS1
	CMP	#556.,R0
	BEQ	1$
	CMP	#807.,R0
	BEQ	2$
	CMP	#809.,R0
	BEQ	3$
	CMP	#800.,R0
	BEQ	3$
	SEC
	RTS	PC
1$:	BIS	#D7$556,R3
	BR	DENS1
2$:	BIS	#D7$800,R3
	BR	DENS1
3$:	BIS	#D9$800,R3
DENS1:	BIC	#D9$800,DENSE
	BIS	R3,DENSE
DENS3:	CLC
	RTS	PC
DMP:	CLR	R3
	BR	1$
	BR	DFLT1
1$:	BIS	#D7$CORE,R3
	BR	DENS1
PARITY:	BR	ODD
	NOP
	BIS	R3,DENSE
	BR	DENS3
ODD:	BIC	R3,DENSE
	BR	DENS3
.ENABL	L.MCALL	.MODULE
.MODULE	TM,RELEASE=B03,VERSION=01

.SBTTL	MT (TM11) MAGTAPE HANDLER
.IIF NDF MT$FSM .FSM = 100000
.AUDIT	.FSM
ELTM	== 2
.SBTTL	DRIVER EDIT LEVEL
.ASECT
.=110
	.WORD	ELTM
.PSECT
.SBTTL	NOTES ON TM11 HANDLER
	.ENABL	LC
.SBTTL	HARDWARE DEFINITIONS
.MCALL	.DRDEF
.IIF NDF MT$UN,	MT$UN	== 1
.DRDEF	MT,11,SPECL$!SPFUN$!HNDLR$,0,172520,224
MTS	= MT$CSR
	ILC	=	100000
	EOF	=	40000
	CRE	=	20000
	PAE	=	10000
	BGL	=	4000
	EOT	=	2000
	RLE	=	1000
	BTEOPI	=	400
	NXM	=	200
	SELR	SB
DFLT:	CMP	#7,R0
	BEQ	7$
	CMP	#9.,R0
	BEQ	9$
DFLT1:	SEC
	RTS	PC
9$:	MOV	#D9$800,DENSE
	BR	DENS3
7$:	MOV	#D7$CORE,DENSE
	BR	DENS3
.DSABL	LSB
.SBTTL	DISPATCHER
.IIF NE	MMG$T,	.MCALL	.SYNCH
.IF DF	MT$FSM
	.GLOBL	FSMDIS,FSMABT,FSMDON,FSMERR,RESTOR,CODE,DVTBL
	.GLOBL	FSMSIZ
	.GLOBL MTCQE
.IF NE	MMG$T
	.GLOBL	OLDBA,XBUMP,EXTADR,JOBNM,SYNBLK,TEMP,SINK,ERBSAV
.ENDC
.ENDC
	.DRBEG	MT
MT:
.IF NE	MMG$T
	MOV	MTCQE,R5
	CMP	(R5)+,(R5)+
	JSR	PC,@$MPPTR
	MOV	(SP)+,OLDBA
	BIT	#1700,@SP
	BEQ	1=	100
	BOT	=	40
	CH7	=	20
	SDWN	=	10
	WRL	=	4
	RWS	=	2
	TUR	=	1
MTC	= MTS+2
	ERR	=	100000
	D7$200	=	0
	D7$556	=	20000
	D7$800	=	40000
	D7$CORE	=	60000
	D9$800	=	60000
	PWRCLR	=	10000
	PEVN	=	4000
	UNIT	=	3400
	CURDY	=	200
	INTENB	=	100
	FOFF	=	0
	FREAD	=	2
	FWRITE	=	4
	FWRTTM	=	6
	FSPFOR	=	10
	FSPBAK	=	12
	FWRTEXT	=	14
	FREWIND	=	16
	GO	=	1
MTBRC	=	MTS+4
MTCMA	=	MTS+6
MTD	=	MTS+8.
MTRD	=	MTS+10.
	GPSDN	=	10000
	PR5	=	5
	PR7	=	7
.SBTTL	SOFTWARE DEFINITIONS
	RENAME	=	5
	E0$
	TST	(SP)+
	MOV	MTCQE,R5
	BIS	#CSWHERR,@-(R5)
	JMP	MTDONE
10$:	MOV	(SP)+,EXTADR
.ENDC
.IF NDF	MT$FSM
	MOV	MTCQE,R3
.IFF
	JMP	FSMDIS
$MT::
.ENDC
	TST	(R3)+
	MOV	@R3,R0
	MOVB	R0,R4
	BIC	#^C<UNIT>,R0
	MOV	R0,R1
	SWAB	R1
	BIS	(PC)+,R0
DENSE:	 .WORD	D9$800
	MOV	R0,@#MTC
	CLR	NFSREAD
	MOV	PC,R0
	ADD	#RECOVE-.,R0
	MOV	R1,R5
	ADD	PC,R5
	ADD	#$TBL-.,R5
	MOV	@R3,R2
	SWAB	R2
	ASR	R2
	ASR	R2
	ASR	R2
	BIC	#177740,R2
.IF NE MMG$T
	MOVB	R2,JOBNM
.ENDC
	CMP	#LOOKUP,R4
	BNE	7$
.FOO	ZTMCP::.WORD	DZMCTL
.ENDC
.ENDC
.IIF EQ DZ11$N, .LIST
.IF NE	DZ11$M!DL11$M!MTI$M
.SBTTL	SAVE52	- Save registers R5-R2
SAVE52:	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	JSR	PC,@R5
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	MOV	(SP)+,R5
	RTS	PC
.ENDC
.IF NE	MAT$S
.SBTTL	Report status subroutines
CARON::	JSR	R1,TRMSTS
	 .WORD	AS.HNG
	 .WORD	AS.CAR
HNGON::	JSR	R1,TRMSTS
	 .WORD	AS.CAR
	 .WORD	AS.HNG
CTCON::	JSR	R1,TRMSTS
	 .WORD	0
	 .WORD	AS.CTC
CLRIN::	JSR	R1,TRMSTS
	 .WORD	AS.INPNTER	=	4
	LOOKUP	=	3
	DELETE	=	2
	CLOSE	=	1
	REDWRT	=	0
	WRTEOF	=	-1
	FWDSPC	=	-2
	BKSPC	=	-3
	WRTXTD	=	-4
	REWIND	=	-5
	OFFLINE	=	-6
	WRITEPHY=	-7
	READF	=	-8.
	STR100	=	-9.
	FN	=	8.
	ILLARG	=	5
	DEVINUSE=	2
	CSWHERR	=	1
	CSWEOF	=	20000
	SPUSR	=	272
	ERRGAPS	=	-101.
	NOQUAL	=	0
	DRIVEGONE =	1
	POSERR	=	2
	MEMERR	=	3
	WRITELOK=	4
	RECERR	=	5
	SMLREC	=	6
	NOQUAL	=	0
	EOFCODE	=	1
	EOTCODE	=	2
	EOFEOT	=	3
	BOTCODE	=	4
	Q.CSW	=	-2
	Q.BLK	=	0
	Q.FUNC	=	2
	Q.JNUN	=	3
	Q.BUF	=	= 0
.IF NE	MMG$T
.IF NDF	MT$FSM
.FOO	= 1
	MOV	MTCQE,R4
	JSR	PC,@$GTBYT
	TSTB	(SP)+
	BNE	5$
	JSR	PC,@$GTBYT
	TSTB	(SP)+
	BNE	5$
.ENDC
.ENDC
.IF EQ	.FOO
	TST	@2(R3)
	BNE	11$
.ENDC
	CMPB	#-1,@R5
	BEQ	3$
.IF NDF	MT$FSM
	MOV	#DEVINUSE,R0
2$:	MOV	@#MONLOW,R1
	MOV	R0,SPUSR(R1)
	BR	12$
.IFF
	MOV	@#MONLOW,R1
	MOV	#DEVINUSE,SPUSR(R1)
	JSR	PC,RESTOR
	JMP	$DONE
.ENDC
3$:	CLR	4(R3)
	MOVB	R2,@R5
.IF DF	MT$FSM
	BR	12$
.IFF
4$:	MOV	-2(R3),R1
	BEQ	6$
	BGT	5$
	INC	R1
	BEQ	12$
5$:	MOVB		2$
	BIT	#SELR,R4
	BNE	2$
	MOV	#DRIVEGONE,R4
	BR	ABORT
2$:	MOV	LASTCOM,R4
	JSR	PC,DISPAT
TABLEE:	.BYTE	ERREAD-TABLEE
	.BYTE	ERWRIT-TABLEE
	.BYTE	EROFFL-TABLEE
	.BYTE	ERREWD-TABLEE
	.BYTE	ERWRTX-TABLEE
	.BYTE	ERBKSP-TABLEE
	.BYTE	ERFWSP-TABLEE
	.BYTE	ERWRTM-TABLEE
.SBTTL	ERROR-WRITE OR WRITE WITH EXTENDED GAP COMMAND WAS ISSUED LAST AND ERR BIT WAS SET.
.ENABL	LSB
ERWRIT:
ERWRTX:	BIT	#WRL,@#MTS
	BEQ	1$
ERWRI1:	MOV	#WRITELOK,R4
	BR	ABORT
1$:	JSR	PC,ABOCHK
	MOV	R5,ERRSUM
	BNE	CONT
	BI#-1,@R5
	MOV	#ILLARG,R0
	BR	2$
6$:	MOV	#REWIND,R4
	BR	8$
.ENDC
7$:	CMP	#CLOSE,R4
	BNE	8$
	MOVB	#-1,@R5
	BR	12$
8$:	MOV	(PC)+,(R0)+
	.BYTE	-1,ERRGAPS
	TST	(R0)+
	CMP	#STR100,R4
	BEQ	12$
	CMP	#READF,R4
	BLOS	13$
	TST	R4
	BNE	11$
	MOV	R3,R1
	CLR	-2(R1)
	CMP	(R1)+,(R1)+
	MOV	#READF,R4
	TST	@R1
	BPL	9$
	NEG	@R1
	INC	R4
	BR	10$
9$:	COM	NFSREAD
10$:
.IF DF	MT$FSM
	MOV	R4,CODE
.ENDC
	BR	13$
11$:	TST	-(R3)
	BIS	#CSWHERR,@-(R3)
12$:
.IF DF	MT$FSM
	JSR	PC,RESTOR
.ENDC
	JMP	MTDONT	#EOT,R4
	BNE	NOERR
	BR	NQUAL
.DSABL	LSB
.SBTTL	ERROR-WRITE TM,FORWARD SPACE, OR BACKSPACE COMMAND GIVEN LAST AND ERR BIT SET
ERWRTM:	BIT	#WRL,@#MTS
	BNE	ERWRI1
ERBKSP:
ERFWSP:	JSR	PC,ABOCHK
	BIT	#EOF+EOT,R4
	BNE	NOERR
	BR	NQUAL
.SBTTL	ERROR-READ COMMAND WAS ISSUED LAST AND ERR BIT WAS SET.
ERREAD:	JSR	PC,ABOCHK
	MOV	R5,ERRSUM
	BNE	CONT
	BIT	#RLE+EOT+EOF,R4
	BNE	NOERR
	BR	NQUAL
.SBTTL	ERROR-ABORT CHECK SUBROUTINE
ABOCHK:	MOV	@#MTS,R4
	BIT	#BTEOPI,R4
	BEQ	1$
	MOV	#POSERR,R4
	BR	4$E
13$:	ADD	#FUNTAB-TABLE,R4
	MOV	R4,(R0)+
.IF NE	MMG$T
	MOV	4(R3),R1
	MOV	R1,4(R0)
.IFF
	TST	(R3)+
	MOV	(R3)+,(R0)+
	MOV	@R3,@R0
	MOV	@R3,R1
.ENDC
	NEG	R1
	JSR	PC,DISPAT
TABLE:	.BYTE	REDEF-TABLE
	.BYTE	RIGHT-TABLE
	.BYTE	AWFLINE-TABLE
	.BYTE	REWHINED-TABLE
	.BYTE	RIGHTX-TABLE
	.BYTE	BAKSPA-TABLE
	.BYTE	FORSPA-TABLE
	.BYTE	RIGHTM-TABLE
FUNTAB:	.BYTE	FREAD+INTENB+GO
	.BYTE	FWRITE+INTENB+GO
	.BYTE	FOFF+INTENB+GO
	.BYTE	FREWIND+INTENB+GO
	.BYTE	FWRTEXT+INTENB+GO
	.BYTE	FSPBAK+INTENB+G
1$:	BIT	#NXM,R4
	BEQ	2$
	MOV	#MEMERR,R4
4$:	TST	(SP)+
	BR	ABORT
2$:	CLR	R5
	BIT	#CRE+PAE+BGL,R4
	BEQ	3$
	COM	R5
3$:	RTS	PC
.SBTTL	ERROR-ABORT OPERATION IN PROGRESS
ERREWD:
EROFFL:
NQUAL:	CLR	R4
ABORT:	MOV	#PWRCLR,@#MTC
	MOV	#CSWHERR,-(SP)
EXCEP:
.IF DF	MT$FSM
	MOV	(SP)+,R5
	JMP	FSMERR
.IFF
	MOV	MTCQE,R5
	BIS	(SP)+,@Q.CSW(R5)
	TST	@R5
	BEQ	MTDONE
.IF NE	MMG$T
	COM	SINK
	MOV	@R5,ERBSAV
	MOV	R4,TEMP
	MOVB	Q.JNUN(R5),R5
	ASR	R5
	ASR	R5
	ASR	R5
	MOV	R5,JOBNM
.IFF
	MOV	R4,@(R5O
	.BYTE	FSPFOR+INTENB+GO
	.BYTE	FWRTTM+INTENB+GO
REDEF:
RIGHTX:
RIGHT:
.IF NE	MMG$T
	MOV	(R0)+,@#MTCMA
	BIS	@R0,R5
.IFF
	MOV	-(R3),@#MTCMA
.ENDC
	ASL	R1
FORSPA:
BAKSPA:
	MOV	R1,@#MTBRC
AWFLINE:
REWHINED:
RIGHTM:	MOVB	R5,@#MTC
.IF DF	MT$FSM
	JSR	PC,RESTOR
.ENDC
	RTS	PC
.SBTTL	INTERRUPT HANDLER AND ABORT ENTRY POINTS
MTABRT:	MOVB	#-1,$FLG
	MOV	R3,-(SP)
	MOV	PC,R5
	ADD	#$TBL-.,R5
	MOV	MTCQE,R3
	BEQ	7$
	MOVB	Q.JNUN(R3),-(SP);GET JOB NUMBER
	MOVB	(SP)+,R3
	ASR	R3
	ASR	R3
	ASR	)+
.ENDC
.IFTF
MTDONE:
.IFT
	JMP	FSMDON
.ENDC
$DONE::	TSTB	$FLG
	BNE	$RTS
.IF NE	MMG$T
	MOV	PC,R4
	ADD	#MTCQE-.,R4
	MOV	@#MONLOW,R5
	TST	SINK
	BNE	1$
	JMP	@QCOMP(R5)
1$:	CLR	SINK
	JSR	PC,@QCOMP(R5)
	MOV	PC,R4
	ADD	#SYNBLK-.,R4
	.SYNCH
	 BR	BADSYN
	MOV	ERBSAV,R1
	BIS	#30000,@#177776
	MOV	R0,-(SP)
	MTPI	(R1)+
	MOV	ERRBL2,-(SP)
	MTPI	(R1)+
BADSYN:	RTS	PC
.IFF
	.DRFIN	MT
.ENDC
$RTS:	CLRB	$FLG
	RTS	PC
.SBTTL	STATUS REPORT COME HERE IF NO ABORTS ISSUED
NOERR:	CLR	ERRSUM
CONT:	R3
	BIC	#177740,R3
	CMP	R3,R4
	BNE	7$
	CLRB	$FLG
	MOV	#PWRCLR,@#MTC
5$:
.IF DF	MT$FSM
	MOV	R0,-(SP)
	MOV	DVTBL,R0
	BEQ	6$
	MOV	#-1,(R0)+
	MOV	#-1,@R0
6$:	MOV	(SP)+,R0
.ENDC
7$:	CMPB	R4,@R5
	BNE	10$
	MOVB	#-1,@R5
10$:	CMPB	#-2,(R5)+
	BNE	7$
	MOV	(SP)+,R3
	JMP	$DONE
.SBTTL	INTERRUPT ENTRY POINT
	.DRAST	MT,PR5,MTABRT
.SBTTL	ERROR-ERROR ROUTINE DISPATCHER
	TST	MTCQE
	BNE	114$
	JMP	$RTS
114$:	TST	@#MTC
	BMI	1$
.IF NE	MMG$T
	JMP	NOERR
.IFF
	BR	NOERR
.ENDC
1$:	MOV	@#MTS,R4
	BPLTSTB	RECOVERY
	BPL	RECOVR
PTCH:	MOV	@#MTS,R4
	MOV	LASTCOM,R5
	TST	ERRSUM
	BEQ	NEXT0
	CMP	#FN+READF,R5
	BNE	1$
	MOVB	#5,BACK1
	MOVB	#8.,BACK5
	BR	2$
1$:	MOV	#FN+WRTXTD,R5
2$:	MOVB	R5,RECOVERY
	BR	REEDF1
NEXT0:	CMP	#FN+REWIND,R5
	BNE	NEXT1
	BIT	#BOT,R4
	BNE	REWHYN
	MOVB	R5,RECOVERY
	RTS	PC
NEXT1:	CMP	#FN+READF,LASTCOM
	BNE	NEXT2
	BIT	#EOF,R4
	BNE	NEXT3
	BIT	#RLE,R4
	BEQ	1$
	MOV	#RECERR,R4
	BR	ABORT
1$:	MOV	@#MTBRC,R5
	BEQ	NEXT2
	ASR	R5
	NEG	R5
.IF NE	MMG$T
	MOV	R5,ERRBL2
.IFF5
BACH1:	MOV	R5,@#MTBRC
	MOV	#FN+FWDSPC,R4
	MOVB	FUNTAB+6,R5
BACH3:
4$:	MOV	R4,LASTCOM
.IIF	NE	MMG$T,	BIS	EXTADR,R5
	MOVB	R5,@#MTC
	RTS	PC
BACH2:
5$:	MOV	#FN+BKSPC,R4
	MOVB	FUNTAB+5,R5
	BR	4$
6$:	TSTB	BACK1
	BEQ	2$
	BR	FORE1
.DSABL	LSB
.SBTTL	XBUMP SUBROUTINE
.IF NE	MMG$T
XBUMP:	MOV	MTCQE,-(SP)
	ADD	#Q$PAR,@SP
	ADD	#10,@(SP)+
	ADD	#512.,OLDBA
	BCC	1$
	ADD	#20,EXTADR
1$:	RTS	PC
.ENDC
.SBTTL	DISPATCH SUBROUTINE
DISPAT:	ADD	@SP,R4
	MOVB	FUNTAB-TABLE(R4),R5
	MOVB	@R4,R4
	ADD	(SP)T.TKB	==: 2
T.TPS	==: 4
T.TPB	==: 6
DL.DTR	==:      2
DL.RTS	==:      4
DL.DIE	==:     40
DL.SRD	==:   2000
DL.CAR	==:  10000
DL.CSD	==:  20000
DL.RNG	==:  40000
DL.DIN	==: 100000
DL.CHR	==:    377
DL.PAR	==:  10000
DL.FRM	==:  20000
DL.OVR	==:  40000
DL.ERR	==: 100000
.IF NE	DZ11$N
DZ.CSR	== 0
DZMNT$	==     10
DZCLR$	==     20
DZMSE$	==     40
DZRCV$	==    100
DZRDN$	==    200
DZTRL$	==   3400
DZSAE$	==  10000
DZSAL$	==  20000
DZTIE$	==  40000
DZTRD$	== 100000
DZ.RBUF	== 2
DZI
.IF DF	MT$FSM
	MOV	@MTCQ,R4
.IFF
	MOV	@MTCQE,R4
.ENDC
	BEQ	2$
	MOV	R5,2(R4)
.ENDC
2$:	MOV	#SMLREC,R4
.IF NE	MMG$T
	JMP	ABORT
.IFF
	BR	ABORT
.ENDC
NEXT2:	CMP	#FN+FWDSPC,LASTCOM
	BEQ	1$
	CMP	#FN+BKSPC,LASTCOM
	BNE	NEXT3
1$:	MOV	@#MTBRC,R4
	BEQ	NEXT3
.IF NE	MMG$T
	MOV	R4,ERRBL2
.IFF
	NEG	R4
.IF DF	MT$FSM
	MOV	@MTCQ,R5
.IFF
	MOV	@MTCQE,R5
.ENDC
	BEQ	2$
	MOV	R4,2(R5)
.ENDC
2$:
.ENABL	LSB
NEXT3:	MOV	@#MTS,R5
	CLR	R4
	BIT	#BOT,R5
	BEQ	1$
	CMP	#FN+REWIND,LASTCOM
MTD1:	BEQ	MT+,R4
	JMP	@R4
.SBTTL	MAGTAPE DATA AREA
$TBL:	.REPT	MT$UN
	.BYTE	-1
	.ENDR
	.BYTE	-2
$FLG:	.BYTE	0
	.EVEN
RECOVE:	.BYTE	-1
TAPELE:	.BYTE	ERRGAPS
BACK5:	.BYTE	0
BACK1:	.BYTE	0
LASTCO:	.WORD	DUMMY
OLDBA:	.WORD	DUMMY
.IIF NE MMG$T,	EXTADR:	.WORD	DUMMY
OLDWC:	.WORD	DUMMY
ERRSUM:	.WORD	DUMMY
NFSREA:	.WORD	DUMMY
	.EVEN
.IF NE	MMG$T
SYNBLK:	.WORD	DUMMY
JOBNM:	.WORD	DUMMY
	.WORD	DUMMY,DUMMY
TEMP:	.WORD	DUMMY
	.WORD	-1,0
SINK:	.WORD	DUMMY
ERBSAV:	.WORD	DUMMY
ERRBL2:	.WORD	DUMMY
.ENDC
.IDONE
	CMP	#FN+OFFLINE,LASTCOM
	BEQ	MTDONE
	CMP	(R4)+,(R4)+
	BR	4$
1$:	BIT	#EOF,R5
	BEQ	2$
	CMP	#FN+WRTEOF,LASTCOM
	BEQ	2$
	INC	R4
2$:	BIT	#EOT,R5
	BEQ	3$
	TST	NFSREAD
	BNE	3$
	CMPB	(R4)+,(R4)+
3$:	TST	R4
	BEQ	MTD1
4$:	MOV	#CSWEOF,-(SP)
	JMP	EXCEP
.DSABL	LSB
.SBTTL	RECOVERY IN PROGRESS DISPATCHER
RECOVR:	MOV	LASTCOM,R4
	JSR	PC,DISPAT
TABLER:	.BYTE	REEDF-TABLER
	.BYTE	RITE-TABLER
	.BYTE	DUMMY
	.BYTE	REWHYN-TABLER
	.BYTE	RITEX-TABLER
	.BYTE	BACH-TABLER
	.BYTE	FORE-TABLER
	.BYTE	DF DF	MT$FSM
MTCQ::	.WORD	DUMMY
DRIVEN==MT$UN
DVINFO::.REPT	DRIVEN
	.WORD	-1
	.WORD	-1
	.WORD	-1
	.BYTE	DUMMY
	.BYTE	0
	.WORD	DUMMY,DUMMY,DUMMY
	.ENDR
.ENDC
.IF NDF	MT$FSM
	.DREND	MT
.IFF
	.GLOBL	$FKPTR,$INPTR
.IIF NE MMG$T,	.GLOBL	$RLPTR,$MPPTR,$GTBYT,$PTBYT,$PTWRD
.IIF NE ERL$G,	.GLOBL	$ELPTR
.IIF NE TIM$IT,	.GLOBL	$TIMIT
.ENDC
SIZE=.
SIZED=SIZE-MTSTRT/2
.END
                                                                                                                              UMMY
.SBTTL	RECOVERY-WRITE WAS LAST COMMAND
RITEX:
RITE:	TST	ERRSUM
	BEQ	NEXT1
	INCB	TAPELEN
	BEQ	NQ2
	BIT	#EOT,@#MTS
	BEQ	REEDF1
NQ2:	JMP	NQUAL
.SBTTL	RECOVERY-REWIND WAS THE LAST COMMAND
REWHYN:	MOV	#PWRCLR,@#MTC
	JMP	MTDONE
.SBTTL	RECOVERY-READ WAS THE LAST COMMAND ISSUED
.ENABL	LSB
REEDF:	TST	ERRSUM
	BEQ	FOO
	DECB	BACK1
	BEQ	2$
	BGT	REEDF1
	MOVB	#5,BACK1
	DECB	BACK5
	BEQ	NQ2
REEDF1:	MOV	#-1,R5
	BR	3$
2$:	MOV	#-5,R5
3$:	MOV	R5,@#MTBRC
	BR	BACH2
FOO:	JMP	PTCH
.DSABL	LSB
.S.MCALL .MODULE
.MODULE MTTINT,RELEASE=B03,VERSION=01

.SBTTL
.SBTTL	********************************************
.SBTTL	*					   *
.SBTTL	*     MULTI-TERMINAL INTERRUPT SERVICE     *
.IF EQ	BF
.SBTTL	*	 FOR THE SINGLE JOB MONITOR	   *
.IFF
.IF EQ	MMG$T
.SBTTL	*   FOR THE FOREGROUND/BACKGROUND MONITOR  *
.IFF
.SBTTL	*      FOR THE EXTENDED MEMORY MONITOR     *
.ENDC
.ENDC
.SBTTL	*					   *
.SBTTL	********************************************
.SBTTL
.SBTTL	Macro definitions
.MACRO	SPL	N
.BTTL	RECOVERY-FORWARD SPACE WAS THE LAST COMMAND
FORE:	MOV	@#MTBRC,R5
	BNE	BACH1
FORE1:	MOV	#MTCMA,R5
	MOV	OLDBA,@R5
	MOV	OLDWC,-(R5)
	ASL	@R5
	NEG	@R5
	MOV	#FN+READF,R4
	MOVB	FUNTAB,R5
	BR	BACH3
.SBTTL	RECOVERY-BACKSPACE WAS LAST COMMAND
.ENABL	LSB
BACH:	CMPB	#FN+READF,RECOVERY
	BEQ	1$
	MOV	OLDWC,R4
	ASL	R4
	NEG	R4
	MOV	R4,@#MTBRC
	MOV	OLDBA,@#MTCMA
	MOV	#FN+WRTXTD,R4
	MOVB	FUNTAB+4,R5
	BR	4$
1$:	MOV	@#MTBRC,R5
	BEQ	6$
	BIT	#BOT,@#MTS
	BEQ	5$
2$:	ADD	#4,R5
	BEQ	FORE1
3$:	NEG	RIIF NDF PSWMTI, PSW1ST:
.IF NE	.-PSW1ST
	 .WORD	PSWMTI
.IFF
	 .WORD	PSWLST
.ENDC
PSWMTI	== .-2
.IF EQ	N
	 .WORD	-2
.IFF
	 .WORD	N*40,PS
.ENDC
.ENDM	SPL
.MACRO	GETPSW
.IIF NDF PSWMTI, PSW1ST:
.IF NE	.-PSW1ST
	 .WORD	PSWMTI
.IFF
	 .WORD	PSWLST
.ENDC
	 .WORD	-4
PSWMTI	== .-4
.ENDM	GETPSW
.MACRO	PUTPSW
.IIF NDF PSWMTI, PSW1ST:
.IF NE	.-PSW1ST
	 .WORD	PSWMTI
.IFF
	 .WORD	PSWLST
.ENDC
	 .WORD	-6
PSWMTI	== .-4
.ENDM	PUTPSW
.SBTTL	Definition of symbols
.PSECT	MTINT$
T.TKS	==: 0

4$:	MOV	R5,HSRB
	INC	HSRBCC
	BNE	SCNOP
FRQHOK::
	JSR	R5,$FORK
	 .WORD	TIFBLK-.
5$:	MOV	HSRBGP,R1
	MOV	(R1)+,R3
	MOV	(R1)+,R0
	CMP	R1,HSRBEP
	BLO	6$
	MOV	HSRBRP,R1
6$:	MOV	R1,HSRBGP
	MOV	T.CSR(R3),R4
	TSTB	T.CNF2(R3)
	BMI	8$
.ASSUME	RPALL$	EQ	200
	TST	R0
	BPL	7$
.ASSUME	DL.ERR	EQ	100000
	BIT	#DL.PAR!DL.FRM,R0
	BNE	11$
7$:	BIC	#^C<177>,R0
	BEQ	11$
.ENDC
8$:	JSR	PC,INPTR
	BEQ	10$
INTCOM:
.IF NE	BF
	MOV	@R3,-(SP)
	BIT	#SHARE$,T.STAT(R3)
	BEQ	9$
	MOV	I.TERM(R5),@R3
9$:
.ENDC

	.WORD	0,0
	.WORD	177444
	.WORD	-1
DLTCOM:	.WORD	0
DLTMCP::.WORD	DLMPOL
.ENDC
.SBTTL	INPTR and OUTPTR - Ring pointer set up subroutines
.ENABL	LSB
INPTR:
.IF NE	BF
	MOV	TTIUSR,R5
.ENDC
	BIT	#DTACH$,T.STAT(R3)
	BEQ	1$
	SEZ
	RTS	PC
OUTPTR:
.IF NE	BF
	MOV	TTOUSR,R5
1$:	BIT	#SHARE$,T.STAT(R3)
	BNE	2$
	MOV	T.OWNR(R3),R5
	BEQ	4$
	TST	T.STAT(R3)
.ASSUME	CONSL$	EQ	100000
	BPL	3$
2$:	MOV	R5,R1
	ADD	#I.ICTR,R1
	RTS	PC
.IFF
1$:	TST	T.OWNR(R3)
	BEQ	4$
.ENDC
3$:	MOV	R3,R1
	ADD	#T.ICTR	JSR	PC,INCHAR
.IF NE	BF
	MOV	(SP)+,@R3
.ENDC
10$:
.IF NE	HSR$B
 .IF NE	DZ11$N
	BIT	#DZ11$,T.STAT(R3)
	BNE	SCNOP
 .ENDC
11$:	DEC	HSRBCC
	BPL	5$
.ENDC
SCNOP::	RTS	PC
.DSABL	LSB
.IF NE	DL11$M
.SBTTL	DLMCTL - DL11E modem control routine
.ENABL	LSB
DLMCTL::BIT	#DL.RNG,R0
	BNE	DLRNG
	BIT	#DL.CAR,R0
	BNE	DLCAR
	BIT	#HNGUP$,T.STAT(R3)
	BNE	2$
	BIT	#<DL.CSD!DL.SRD>,R0
	BNE	2$
.IF NE	U.K.
..UKDL	== .
	BR	DLWCR1
.ENDC
	JSR	R1,QTIMR
	 .WORD	2*CLOCK
DLCRP1:: .WORD	DLWCAR
	BR	2$
DLCAR:,R1
4$:	RTS	PC
.DSABL	LSB
.SBTTL	Control character input dispatch table
.MACRO	CTLCHI	C
.NCHR	......,<C>
.IF GT	......-1
INP'C::
.=C*2+TTITBL
	.WORD	INP'C-TTIBAS
.=INP'C
.SBTTL	Process C input
.IFF
CTRL.'C::
.=''C-100*2+TTITBL
	.WORD	CTRL.'C-TTIBAS
.=CTRL.'C
.SBTTL	Process CTRL/'C input
.ENDC
.ENDM	CTLCHI
	.WORD	ALT-TTIBAS
	.WORD	ALT-TTIBAS
	.WORD	RUB-TTIBAS
TTITBL:
.REPT	'Z+1-100
	.WORD	TTINCC-TTIBAS
.ENDR
.SBTTL	INCHAR - Input character processing
.ENABL	LSB
INCHAR::
.IF NECH$	==    377
DZRCL$	==   3400
DZPAR$	==  10000
DZFRM$	==  20000
DZOVR$	==  40000
DZDVD$	== 100000
DZ.LPR	== 2
DZLIN$	==      7
DZLEN$	==     30
DZSTP$	==     40
DZNPR$	==    100
DZEPR$	==    200
DZSPD$	==   7400
DZRCO$	==  10000
DZANS$	= DZST$P!DZLE$N!DZSP$D!DZRCO$
DZ.TCR	== 4
DZ.DTR	== 5
DZ.RNG	== 6
DZ.TDR	== 6
DZ.CAR	== 7
DZ.BRK	== 7
.ENDC
.SBTTL	DLIINT - DL11 input interrupt service
.ENABL	LSB
DLIINT::
TTIINT::
.IF GT	DL11$N-1
	GETPSW
	MOV	(SP)+,DLTMP
.ENDC
DLIHOK::
	JSR	TST	T.OWNR(R3)
	BEQ	2$
	JSR	PC,CTIMR
1$:	BIC	#HNGUP$,T.STAT(R3)
.IF NE	MAT$S
	JSR	PC,CARON
.ENDC
	BR	2$
DLWCAR::JSR	R5,SAVE52
	MOVB	R0,R3
	ADD	PC,R3
	MOV	TCBLST-.(R3),R3
DLWCR1:	MOV	T.CSR(R3),R4
	BIS	#HNGUP$,T.STAT(R3)
	BIC	#DL.DTR!DL.RTS,@R4
.IF NE	MAT$S
	JSR	PC,HNGON
.ENDC
	BR	2$
DLRNG:	TST	T.OWNR(R3)
	BEQ	2$
	JSR	PC,CTIMR
	BIS	#DL.DTR!DL.RTS,@R4
	BIT	#DL.CAR,@R4
	BNE	1$
	JSR	R1,QTIMR
	 .WORD	30.*CLOCK
DLCRP2:: .WORD	DLWCAR
2$:	RTS	PC
.DSABL	LSB
.ENDC
.IF NE	DL11$M!MTI$M
	R5,$INTEN
	 .WORD	^C<PR4>&PR7
TTIIN2::
.IF EQ	HSR$B
	JSR	R3,SAVE30
.IF GT	DL11$N-1
	MOV	DLTMP,R4
	BIC	#^C<17>,R4
	ASL	R4
	MOV	DLTBL(R4),R3
PDLTB0	== .-2
.IFF
	MOV	DLTBL,R3
.ENDC
	MOV	T.CSR(R3),R4
.IF NE	DL11$M
	BIT	#REMOT$,@R3
	BEQ	1$
	MOV	@R4,R0
	BMI	DLMCTL
.ASSUME	DL.DIN	EQ	100000
1$:
.ENDC
HKPC08 == .
	MOV	T.TKB(R4),R0
.ASSUME	.-HKPC08 EQ 4
	TSTB	T.CNF2(R3)
	BMI	8$
.ASSUME	RPALL$	EQ	200
	TST	R0
.ASSUME	DL.ERR	EQ	100000
	BPL	2$
	BIT	#DL.PAR!DL.FRM,R0
	BNE	SCNOP
2$:	BIC	#.SBTTL	Mark time and cancel mark time routines
QTIMR:	JSR	R5,SAVE52
.IF NE	BF
	MOV	T.JOB(R3),T.TBLK+C.JNUM(R3)
.ENDC
	ADD	#T.TBLK,R3
	CLR	(R3)+
	MOV	(R1)+,(R3)+
	MOV	(R1)+,C.COMP-C.LINK(R3)
	MOV	R1,12(SP)
	JMP	TIMIO
CTIMR:	JSR	R5,SAVE52
	MOV	T.TBLK+C.SEQ(R3),R0
.IF NE	BF
	MOVB	T.JOB(R3),R2
.ENDC
	MOV	#-1,R1
	CLR	R5
	JMP	CMARKT
.ENDC
.IF NE	MTI$M
.SBTTL	DLMPOL - Routine to poll each DL11
DLMPOL::JSR	R5,SAVE52
	CLR	R2
PDLCS1	== .+2
1$:	MOV	DLTBL(R2),R3
	MOV	T.CSR(R3),R4
	BEQ	3$
	^C<177>,R0
	BEQ	SCNOP
.IFF
.IF GT	DL11$N-1
	MOVB	DLTMP,R4
	BIC	#^C<17>,R4
	ASL	R4
PHSRRB	== .+2
	MOV	DLTBL(R4),R4
.IFF
	MOV	DLTBL,R4
.ENDC
.IF NE	DL11$M
	BIT	#REMOT$,@R4
	BEQ	3$
	MOV	@T.CSR(R4),R5
	BPL	3$
.ASSUME	DL.DIN	EQ	100000
	JSR	R3,SAVE30
	MOV	R4,R3
	MOV	R5,R0
	MOV	T.CSR(R3),R4
	BR	DLMCTL
3$:
.ENDC
	MOV	T.CSR(R4),R5
HKPC09 == .
	MOV	T.TKB(R5),-(SP)
.ASSUME	.-HKPC09 EQ 4
	MOV	HSRB,R5
	MOV	R4,(R5)+
	MOV	(SP)+,(R5)+
PHSRRT	== .+2
	CMP	R5,#HSRBUE
	BLO	4$
	MOV	HSRBRP,R5BIT	#REMOT$,@R3
	BEQ	2$
	BIS	#DL.DIE,@R4
2$:
HKPC01 == .
	BIS	#IENABL,@R4
.ASSUME	T.TKS	EQ	0
.ASSUME .-HKPC01 EQ 4
	BIT	#INEXP$,T.STAT(R3)
	BEQ	3$
	INC	T.RTRY(R3)
	CMP	#4,T.RTRY(R3)
	BNE	3$
	CLR	T.RTRY(R3)
	CMP	@T.VEC(R3),@#SYSPTR
	BLO	3$
HKPC02 == .
	BIC	#IENABL,T.TPS(R4)
	BIS	#IENABL,T.TPS(R4)
.ASSUME	.-HKPC02 EQ 14
3$:	TST	(R2)+
	CMP	R2,#DL11$N*2
	BLO	1$
DLTIMR:	MOV	DLTMCP,DLTCOM
	JSR	R5,$TIMIO
	 .WORD	DLTMBK - .
	 .WORD	0
	 .WORD	0
	 .WORD	CLOCK/2
	RTS	PC
DLTMBK:	.WORD	0,0AT(R3)
	BPL	4$
	JSR	PC,TTHIN
	MOV	T.CSR(R3),R4
4$:	MOVB	R0,T.PTTI(R3)
	TSTB	T.CNF2(R3)
	BMI	5$
	BIT	#TTSPC$,@R3
	BNE	5$
	JSR	PC,TTOPT3
.IF NE	MAT$S!BF
	TST	T.TTLC-T.ICTR(R1)
.ENDC
.IF EQ	MAT$S
	BEQ	6$
.IFF
	BNE	5$
	JSR	PC,CLRIN
	BR	6$
.ENDC
5$:
.IF NE	MAT$S
	JSR	PC,SETIN
.ENDC
.IF NE	BF
	JSR	R4,UNBLOK
	 .WORD	TTIWT$
.ENDC
6$:	RTS	PC
7$:	TSTB	T.CNF2(R3)
	BMI	6$
	MOVB	R0,T.PTTI(R3)
DING:	MOV	#BELL,R0
	JMP	TTOPT4
.DSABL	LSB
.SBTTL	INPUT CONTROL CHARACTER PROCESSING
.ENABL	
	BR	9$
2$:	CLRB	T.XPRE(R3)
	BR	ECHOCL
.ENDC
3$:	ADD	#T.PTTI-T.STAT,R2
4$:	TST	@R1
	BEQ	11$
	MOVB	@-(R1),R0
	JSR	PC,EOLTST
	BEQ	10$
	CMP	@R1,-2(R1)
	BNE	5$
	ADD	#TTYIN,@R1
5$:	DEC	(R1)+
	DEC	@R1
6$:	TST	@SP
	BPL	4$
	MOV	@R3,(SP)+
.ASSUME	BKSP$	EQ	100000
	BPL	8$
7$:	JSR	R5,ECHO
	 .ASCII	<BS><SPACE>
	MOV	#BS,R0
.IF EQ SYT$K
	BR	TTOPT4
.IFF
	JMP	TTOPT4
.IFTF
8$:	CMPB	@R2,#RUBOUT
.IFT
	BEQ	TTOPT3
.IFF
	BEQ	91$
.IFTF
	MOVB	#RUBOUT,@R2
9$:	JSR	R5,ECHO
	 .ASCII	"\"<0>
.IFT
	BLSB
.IF NE	BF
CTLCHI	B
	JSR	PC,SWICTX
	MOV	BCNTXT,R2
XCOM:	MOV	R2,TTIUSR
.IF NE	SYT$K
	TSTB	XFLG
	BNE	TTOSET
.ENDC
	CMP	R2,TTOUSR
	BEQ	2$
TTOSET::MOV	R2,TTOUSR
	MOV	I.TID(R2),T.TID(R3)
	JMP	TTOENB
CTLCHI	F
	JSR	PC,SWICTX
	MOV	FCNTXT,R2
	BEQ	1$
.IF NE	SYT$K
	CMP	I.CNSL(R2),R3
	BNE	1$
.ENDC
	BIT	#NORUN$,I.BLOK(R2)
	BEQ	XCOM
1$:	JSR	R5,ECHO
	 .ASCII	"F?"
	JMP	ECHOCL
.ENDC
ALT:	MOV	#ESCAPE,R0
BTINC3:	BR	TTINC3
CTLCHI	D
	MOV	R1,R2
	ADD	#T.OCTR-T.ICTR,R2
	CLRB	(R2)+
	MOVB	@R2,-R	TTOPT3
.IFF
91$:	JMP	TTOPT3
.ENDC
10$:	TST	(R1)+
11$:	CLRB	@R2
	TST	(SP)+
	BPL	12$
	TST	@R3
	BPL	ECHOCL
	RTS	PC
12$:	JSR	R5,ECHO
	 .ASCII	"^U"
ECHOCL:	JSR	R5,ECHO
	 .ASCII	<CR><LF>
	RTS	PC
.DSABL	LSB
CTLCHI	S
	TSTB	@R3
.ASSUME	PAGE$	EQ	200
	BPL	JTINCC
	BIS	#PAGE$,@R2
	RTS	PC
CTLCHI	Q
	BIC	#PAGE$,T.STAT(R3)
	TSTB	@R3
	BPL	JTINCC
.IF NE	DZ11$N
	BIT	#DZ11$,T.STAT(R3)
	BEQ	1$
	MOVB	T.PUN(R3),R2
PBMSK1	== .+2
	BICB	BITMSK(R2),DZ.TCR(R4)
	BR	DZOENB
1$:
.ENDC
HKPC03 == .
	CL(SP)
	CLRB	(R2)+
	MOV	@R2,-4(R2)
	JSR	R5,ECHO0C
	 .ASCII	<CR><LF>
	COMB	@SP
	MOVB	(SP)+,T.OCTR+1-T.ICTR(R1)
	BEQ	2$
.IF NE	BF
	JSR	R4,UNBLOK
	 .WORD	TTOWT$!TTOEM$
.ENDC
2$:	RTS	PC
.DSABL	LSB
CTLCHI	C
.ENABL	LSB
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BEQ	2$
1$:	JSR	R5,ECHO0C
	 .ASCII	<CR><LF>
	CLR	T.XFLG(R3)
	RTS	PC
2$:
.ENDC
	TST	@R2
	BPL	3$
.IF NE	BF
	TST	I.SCCA(R5)
.IFF
	TST	I.SCCA
.ENDC
	BEQ	4$
3$:	BIT	#TTSPC$,@R3
	BNE	5$
4$:	JSR	R5,ECHO0C
	 .ASCII	<CR><LF>
5$:	CMPB	R0,T.PTTR	T.TPS(R4)
.ASSUME	.-HKPC03 EQ 4
	BR	DLOENB
.IF NE	BF
.ENABL	LSB
SWICTX:	BIT	#SHARE$,T.STAT(R3)
	BEQ	1$
	BIT	#FBTTY$,@R3
	BEQ	1$
.IF NE	SYT$K
	MOV	T.XFLG(R3),(PC)+
XFLG:	.WORD	0
	CLR	T.XFLG(R3)
.ENDC
	RTS	PC
1$:	TST	(SP)+
.ENDC
JTINCC:	JMP	TTINCC
.DSABL	LSB
.IF NE	SYT$K
CTLCHI	X
	JSR	PC,SWICTX
	ADD	#T.XFLG-T.STAT,R2
	MOV	#201,(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	MOV	TTIUSR,TTOUSR
	BR	TTOENB
.SBTTL	XPROC - Process characters in ^X sequence
XPROC::	MOV	R3,R5
	A	SCCA$G
	CMPB	R0,#CTRLC
	BNE	10$
	BITB	#CC$ALL,INDSTA
	BEQ	10$
.IF NE	BF
	ADDR	BKGND,SP
	CMP	R5,(SP)+
	BNE	10$
.ENDC
	RTS	PC
10$:
.ENDC
	TSTB	T.CNF2(R3)
.ASSUME	RPALL$	EQ	200
	BMI	TTINC3
	BIT	#TTLC$,@R3
	BNE	1$
	CMPB	R0,#'A!40
	BLO	1$
	CMPB	R0,#'Z!40
	BHI	1$
	NOP
1$:	CMP	R0,#'Z-100
	BLOS	2$
..ALT	== .+2
	CMP	R0,#177
	BLO	TTINCC
	SUB	#200,R0
2$:	ASL	R0
TTITPT	== .+2
	MOV	TTITBL(R0),-(SP)
	ADD	PC,@SP
TTIBAS:
	ASR	R0
	MOV	R3,R2
	ADD	#T.STAT,R2
	JMP	@(SP)+
CTLCHI	CR
.IF NI(R3)
	BNE	BTINC3
	TST	T.STAT(R3)
.ASSUME	CONSL$	EQ	100000
	BPL	7$
.IF NE	BF
	MOV	I.SCCA(R5),R2
	BNE	8$
	TST	I.JNUM(R5)
	BNE	6$
	BIS	#IFABRT,STATWD
.IFF
	MOV	I.SCCA,R2
	BNE	8$
	BIS	#IFABRT!IFCTLC,STATWD
.ENDC
	BICB	#<LN$IND!IN$IND!IN$RUN>,INDSTA
	TST	EXTFLG
	BNE	BTINC3
.IF NE	BATC$H
	MOV	$ENTRY+BA.NUM,R2
	BEQ	6$
	CLR	6(R2)
.ENDC
6$:	JMP	$RQABT
7$:	BIS	#CTRLC$,T.STAT(R3)
	BR	9$
8$:
.IF NE	MMG$T
	MOV	@#KISAR1,-(SP)
	MOV	I.SCCA+2(R5),@#KISAR1
.ENDC
	BIS	#100000,@R2
.IF NE	MMG$TE	SYT$K
	TSTB	T.XFLG(R3)
	BNE	11$
.ENDC
	JSR	PC,TTINCC
	MOV	#LF,R0
	BR	TTINC3
TTINCC:
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BEQ	12$
11$:	JMP	XPROC
12$:
.ENDC
	BIT	#TTSPC$,@R3
	BNE	TTINC3
	CMPB	T.PTTI(R3),#RUBOUT
	BNE	TTINC3
	JSR	R5,ECHO
	 .ASCII	"\"<0>
TTINC3:	CMP	@R1,#TTYIN
	BGE	7$
	INC	@R1
	INC	-(R1)
	CMP	@R1,6(R1)
	BNE	3$
	SUB	#TTYIN,@R1
3$:	MOVB	R0,@(R1)+
	JSR	PC,EOLTST
	BNE	4$
	INC	T.TTLC-T.ICTR(R1)
.IF NE	BF
	CMP	TTHIUS,R5
	BNE	4$
.IFF
	TST	TTHIUS
	BEQ	4$
.ENDC
	TST	T.ST
	MOV	(SP)+,@#KISAR1
.ENDC
9$:
.IF NE	MAT$S
	JSR	PC,CTCON
.ENDC
	JMP	TTINC3
.DSABL	LSB
.ENABL	LSB
RUB:	ADD	#200,R0
CTLCHI	U
	BIT	#TTSPC$,@R3
	BNE	BTINC3
	ROR	-(SP)
.IF NE	SYT$K
	TSTB	T.XFLG-T.STAT(R2)
	BEQ	3$
	ADD	#T.XFLG+1-T.STAT,R2
	TST	(SP)+
	BMI	1$
	CLRB	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	CLR	(R2)+
	BR	12$
1$:	MOVB	(R2)+,R5
	BEQ	2$
	ADD	R2,R5
	INC	R5
	MOVB	@R5,R0
	CLRB	@R5
	DECB	-1(R2)
	TST	@R3
	BMI	7$
	CMPB	T.XPRE(R3),#RUBOUT
	BEQ	91$
	MOVB	#RUBOUT,T.XPRE(R3).ASCII	"?"<0>
	JSR	PC,ECHOCL
	CLR	T.XFLG(R3)
	RTS	PC
.ENDC
.SBTTL	TTOENB	- Enable output interrupt
.ENABL	LSB
TTOENB::
.IF NE	DZ11$N
	BIT	#DZ11$,T.STAT(R3)
	BEQ	DLOENB
DZOENB:	MOVB	T.PUN(R3),R2
PBMSK2	== .+2
	BISB	BITMSK(R2),DZ.TCR(R4)
	BR	1$
.ENDC
DLOENB:
.IF NE	MTI$M
	BIS	#INEXP$,T.STAT(R3)
.ENDC
HKPC04 == .
	MOV	#IENABL,T.TPS(R4)
.ASSUME	.-HKPC04 EQ 6
1$:	CLC
	RTS	PC
.DSABL	LSB
.IF NE	SYT$K
XPROMT:	.ASCIZ	<CR><LF>"Job? "
.ENDC
.IF NE	DZ11$N
BITMSK::.BYTE	1,2,4,10,20,40,100OFBLK-.
30$:
.IF GT	DL11$N-1
	MOV	HSROGP,R5
	MOVB	(R5)+,R4
	CMP	R5,HSROEP
	BLO	40$
	MOV	HSRORP,R5
40$:	MOV	R5,HSROGP
.ENDC
	JSR	PC,50$
	DEC	HSROCC
	BPL	30$
	RTS	PC
50$:
.ENDC
.IF GT	DL11$N-1
	BIC	#^C<17>,R4
	ASL	R4
PDLTB1	== .+2
	MOV	DLTBL(R4),R3
.IFF
	MOV	DLTBL,R3
.ENDC
	MOV	T.CSR(R3),R4
.IF NE	MTI$M
	BIC	#INEXP$,T.STAT(R3)
	CLR	T.RTRY(R3)
.ENDC
	JSR	PC,OUTPTR
	BEQ	2$
	JSR	PC,OUTCHR
	BCS	2$
.IF NE	MTI$M
	BIS	#INEXP$,T.STAT(R3)
.ENDC
HKPC07 == .
	MOV	R0,T.TPB(R4)
.ASSUM,200
	.EVEN
.ENDC
.SBTTL	Character output subroutines
.ENABL	LSB
.SBTTL	ECHOR0 - Print a control character in "^x" form
ECHOR0:	CMPB	#16,R0
	BNE	100$
	JSR	R5,ECHO
	.BYTE	16,0
	RTS	PC
100$:	CMPB	#17,R0
	BNE	101$
	JSR	R5,ECHO
	.BYTE	17,0
	RTS	PC	
101$:	MOV	R0,-(SP)
	MOV	#UPAROW,R0
	JSR	PC,TTOPT3
1$:	MOV	(SP)+,R0
	BIS	#100,R0
	.BR	TTOPT3
.SBTTL	TTOPT3 - Print a character, check for special changes:
TTOPT3::CMPB	#CTRLC,R0
	BEQ	7$
	CMPB	#ESCAPE,R0
	BNE	2$
	MOV	#DOLLAR,R0
2$:	CMPB	#4E	.-HKPC07 EQ 4
	RTS	PC
2$:
HKPC05 == .
	MOV	#0,T.TPS(R4)
.ASSUME	.-HKPC05 EQ 6
	RTS	PC
.DSABL LSB
.SBTTL	Control character output dispatch table
.MACRO	CTLCHO	C
OUP'C::
.=C+TTOTBL
	.BYTE	OUP'C-TTOBAS
.=OUP'C
.SBTTL	Process C output
.ENDM	CTLCHO
TTOTBL::
.REPT	40
	.BYTE	OUPXXX-TTOBAS
.ENDR
.SBTTL	OUTCHR - Output character processing
.ENABL	LSB
OUTCHR:	TSTB	T.STAT(R3)
	BPL	991$
.ASSUME	PAGE$	EQ	200
20$:	SEC
	RTS	PC
991$:	TST	T.CNF2(R3)
	BMI	1$
.ASSUME	WPALL$	EQ	100000
	TSTB	T.0,R0
	BLOS	TTOPT4
	CMPB	#15,R0
	BLO	ECHOR0
	CMPB	#11,R0
	BHI	ECHOR0
.SBTTL	TTOPT4 - Print a character, no checking for specials
TTOPT4::MOV	R1,R2
.SBTTL	TTOPT2 - Print a character, no checking for specials
TTOPT2::ADD	#T.OCTR-T.ICTR,R2
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BNE	3$
.ENDC
	TST	@R2
	BMI	7$
3$:	TST	T.CNF2(R3)
	BMI	8$
.ASSUME	WPALL$	EQ	100000
	BICB	#^C<177>,R0
8$:	CMPB	#TTYOUT-1,@R2
	BLO	7$
.IF NE	MAT$S
	JSR	PC,RGFUL
.ENDC
	CMP	4(R2),-(R2)
	BHI	4$
	SUB	#TTYOUT,@R2
4$:	MOVB	RNFIL(R3)
	BEQ	901$
	DECB	T.NFIL(R3)
	CLR	R0
	RTS	PC
901$:	TSTB	T.TNFL(R3)
	BEQ	1$
	INCB	T.TNFL(R3)
	MOVB	T.TCTF(R3),R0
	BR	18$
1$:
.IF NE	BF
	TSTB	T.OCTR-T.ICTR(R1)
	BNE	902$
	JSR	R4,UNBLOK
	 .WORD	TTOEM$
902$:	MOV	T.TID(R3),R2
	BEQ	4$
2$:	MOVB	(R2)+,R0
	BNE	3$
	CLR	R2
3$:	MOV	R2,T.TID(R3)
	BNE	18$
	CLRB	T.OCHR(R3)
4$:	BIT	#SHARE$,T.STAT(R3)
	BEQ	7$
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BNE	9$
.ENDC
	TST	T.CNF2(R3)
	BMI	7$
.ASSUME	WPALL$	EQ	100000
	CMPB	#LF,T.OCHR(R3)
	BNE	8$
	MO0,@(R2)+
	INC	-(R2)
	INC	2(R2)
	BR	TTOENB
.SBTTL	ECHO0C - Print control character, then 1 or 2 constant characters
ECHO0C:	MOV	R0,-(SP)
	JSR	PC,ECHOR0
	BR	5$
.SBTTL	ECHO - Print one or two constant characters
ECHO:	MOV	R0,-(SP)
5$:	MOVB	(R5)+,R0
	JSR	PC,TTOPT4
	MOVB	(R5)+,R0
	BEQ	6$
	JSR	PC,TTOPT4
6$:	MOV	(SP)+,R0
	RTS	R5
7$:	RTS	PC
.DSABL	LSB
.SBTTL	EOLTST - Test for end of line
EOLTST::CMPB	#LF,R0
	BEQ	1$
	CMPB	#'Z-100,R0
	BEQ	1$
	CMPB	#'C-100,R0
1$:	RTS	PC
.SBTTL	DLOINT - DL1V	IMPLOC,R2
5$:	MOV	-(R2),R5
	BEQ	5$
	CMP	#-1,R5
	BEQ	20$
	BIT	#NORUN$,I.BLOK(R5)
	BNE	5$
.IF NE	SYT$K
	CMP	I.CNSL(R5),R3
	BNE	5$
.ENDC
	CMP	TTHOUS,R5
	BEQ	6$
	TSTB	I.OCTR(R5)
	BEQ	5$
6$:	CMP	TTOUSR,R5
	BEQ	7$
	MOV	R5,TTOUSR
	MOV	I.TID(R5),T.TID(R3)
	MOV	R5,R1
	ADD	#I.ICTR,R1
	BR	1$
.ENDC
7$:	TST	T.STAT(R3)
.ASSUME	CONSL$	EQ	100000
	BPL	9$
8$:
.IF NE	BF
	CMP	TTHOUS,R5
	BEQ	TTHOUT
.IFF
	TST	TTHOUS
	BNE	TTHOUT
.ENDC
9$:
.IF NE	BF
..TTON	== .+4
	CMPB	T.OCTR-T.ICTR(R1),#TTYODD	#T.XPRE,R5
	CMPB	#RUBOUT,@R5
	BNE	1$
	TST	@R3
	BMI	1$
	JSR	R5,ECHO
	 .ASCII	"\"<0>
1$:	CMPB	#CR,R0
	BEQ	3$
	JSR	PC,EOLTST
	BEQ	3$
	MOVB	-(R5),R2
	CMP	#6,R2
	BGT	2$
	JMP	DING
2$:	CMPB	R0,#'A!40
	BLO	21$
	CMPB	R0,#'Z!40
	BHI	21$
	NOP
21$:	INC	R2
	MOVB	R2,(R5)+
	MOVB	R0,(R5)+
	ADD	R5,R2
	MOVB	R0,@R2
	BR	TTOPT4
3$:	TST	(R5)+
	MOV	R5,R0
	JSR	PC,FNDJOB
	BEQ	4$
	CMP	I.CNSL(R2),R3
	BNE	4$
	BIT	#NORUN$,I.BLOK(R2)
	BNE	4$
	CLR	T.XFLG(R3)
	MOV	#1,R0
	JMP	XCOM
4$:	JSR	R5,ECHO
	 1 output interrupt routine
.ENABL LSB
TTOINT::
DLOINT::
.IF EQ	HSR$O
.IF GT	DL11$N-1
	GETPSW
	MOV	(SP)+,DLTMP
.ENDC
DLOHOK::
	JSR	R5,$INTEN
	 .WORD	^C<PR4>&PR7
	JSR	R3,SAVE30
.IF GT	DL11$N-1
	MOV	DLTMP,R4
.ENDC
.IFF
.IF GT	DL11$N-1
	GETPSW
	MOVB	(SP)+,@HSROPP
	MOV	R0,-(SP)
PHSRBO	== .+2
	MOV	#HSROPP,R0
	INC	@R0
	CMP	(R0)+,(R0)+
	BLO	10$
	MOV	@R0,HSROPP
10$:	MOV	(SP)+,R0
.ENDC
	INC	HSROCC
	BEQ	20$
	RTI
DLOHOK::
20$:	JSR	R5,$INTEN
	 .WORD	^C<PR4>&PR7
	JSR	R5,$FORK
	 .WORD	TUT
	BNE	10$
	JSR	R4,UNBLOK
	 .WORD	TTOWT$
10$:
.ENDC
	ADD	#T.OTOP-T.ICTR,R1
	CMP	@R1,-(R1)
	BNE	11$
	SUB	#TTYOUT,@R1
11$:	TSTB	-2(R1)
.IF EQ	SYT$K
	BEQ	20$
.IFF
	BNE	12$
	TSTB	T.XFLG(R3)
	BPL	20$
	ASLB	T.XFLG(R3)
	ADDR	XPROMT,R2
	MOV	R2,T.TID(R3)
	BR	2$
12$:
.ENDC
	MOVB	@(R1)+,R0
13$:	TST	T.CNF2(R3)
	BMI	OUPXXX
.ASSUME	WPALL$	EQ	100000
	BIC	#^C<177>,R0
	CMPB	#40,R0
	BHI	SPCHAR
	CMP	R0,#RUBOUT
	BEQ	OUPXXX
	INCB	T.LPOS(R3)
	BIT	#CRLF$,@R3
	BEQ	OUPXXX
	CMPB	T.LPOS(R3),T.WID(RPTR
	BEQ	1$
	JSR	PC,INTCOM
	BR	1$
3$:	RTS	PC
.SBTTL	DZOINT	- DZ11 output interrupt service
DZOINT::
.IF GT	DZ11$N-1
	GETPSW
	MOV	(SP)+,DZTMP
.ENDC
	JSR	R5,$INTEN
	 .WORD	^C<PR5>&PR7
	JSR	R3,SAVE30
.IF GT	DZ11$N-1
	MOV	DZTMP,R4
	BIC	#^C<17>,R4
	ASL	R4
PDZTB1	== .+2
	MOV	DZTBL(R4),R3
PDZCS1	== .+2
	MOV	DZCSR(R4),R4
.IFF
	MOV	DZTBL,R3
	MOV	DZCSR,R4
.ENDC
	MOVB	1(R4),R5
	BIC	#^C<7>,R5
	ASL	R5
	ADD	R3,R5
	MOV	@R5,R3
	JSR	PC,OUTPTR
	BEQ	2$
	JSR	PC,OUTCHR
	BCS	2$
	MOVB	R0,DZ.TDR3)
	BLOS	OUPXXX
	CLRB	T.LPOS(R3)
	MOVB	#CR,R0
	MOV	#<-1*400>+LF,T.TCTF(R3)
17$:	MOVB	R0,T.OCHR(R3)
18$:	CMPB	R0,T.TFIL(R3)
	BNE	19$
	TST	T.CNF2(R3)
	BMI	19$
.ASSUME WPALL$	EQ	100000
	MOVB	T.FCNT(R3),T.NFIL(R3)
19$:	CLC
	RTS	PC
CTLCHO	CR
	CLRB	T.LPOS(R3)
OUPXXX:	INC	-(R1)
	DEC	-(R1)
.IF NE	MAT$S
	TSTB	@R1
	BNE	17$
	CALL	RGEMP
.ENDC
	BR	17$
TTOTPT	== .+2
SPCHAR:	MOVB	TTOTBL(R0),R2
	ADD	R2,PC
TTOBAS::
CTLCHO	FF
	BIT	#FORM$,@R3
	BNE	OUPXXX
	MOV	#<-7*400>+LF,T.TCTF(R3)
	MOV	#LF,R(R4)
	RTS	PC
2$:	MOVB	T.PUN(R3),R0
PBMSK3	== .+2
	BICB	BITMSK(R0),DZ.TCR(R4)
	RTS	PC
.IF NE	DZ11$M
.SBTTL	DZMCTL	-- MULTI-TERMINAL DZ11 MODEM CONTROL
DZMCTL::JSR	R5,SAVE52
	CLR	R2
1$:
.IF EQ	DZV$11
	MOV	#8.+1,-(SP)
.IFF
	MOV	#4.+1,-(SP)
.ENDC
PDZCS2	== .+2
	MOV	DZCSR(R2),R4
	BEQ	4$
PDZTB2	== .+2
	MOV	DZTBL(R2),R1
	MOVB	#377,DZ.DTR(R4)
2$:	DEC	@SP
	BEQ	4$
	MOV	(R1)+,R3
	BEQ	2$
	BIT	#REMOT$,@R3
	BEQ	2$
.IF NE	MAT$S
.IF NE	BF
	MOV	T.OWNR(R3),R5
	BNE	21$
	DEC	R5
21$:
.ENDC
.E0
	BR	OUPXXX
CTLCHO	BS
	TST	@R3
.ASSUME	BKSP$	EQ	100000
	BPL	OUPXXX
	DECB	T.LPOS(R3)
	BR	OUPXXX
CTLCHO	TAB
	BIT	#HWTAB$,@R3
	BNE	22$
	MOV	T.LPOS-1(R3),R0
	BIS	(PC)+,R0
	 .BYTE	377,370
	ADD	#SPACE+1,R0
	MOV	R0,T.TCTF(R3)
	MOVB	R0,R0
22$:	ADD	#8.*400,T.LPOS-1(R3)
	BIC	#7*400,T.LPOS-1(R3)
	BR	OUPXXX
TTHOUT:	MOV	R1,R2
	TST	T.OCTR-T.ICTR(R1)
	BMI	TTHOCM
	BEQ	23$
	BIT	#WRWT$,T.STAT(R3)
	BEQ	9$
23$:	BIS	#WRWT$,T.STAT(R3)
	MOV	TTCQE,R1
	ADD	#Q.BUFF-Q.BLKN,R1
TTHOU1:	TST	(R1)+
	BEQ	TTHNDC
	MOVB	T.PUN(R3),R0
PBMSK4	== .+2
	BITB	BITMSK(R0),DZ.CAR(R4)
	BEQ	3$
	BIT	#HNGUP$,T.STAT(R3)
	BEQ	2$
	MOV	#DZANS$,-(SP)
	BISB	R0,@SP
	MOV	(SP)+,DZ.LPR(R4)
	BIC	#INIST$+HNGUP$,T.STAT(R3)
.IF NE	MAT$S
	JSR	PC,CARON
.ENDC
	BR	2$
3$:	BIT	#HNGUP$,T.STAT(R3)
	BNE	2$
PBMSK5	== .+2
	BICB	BITMSK(R0),DZ.DTR(R4)
	BIS	#HNGUP$,T.STAT(R3)
.IF NE	MAT$S
	JSR	PC,HNGON
.ENDC
	BR	2$
4$:	CMP	(SP)+,(R2)+
	CMP	R2,#DZ11$N*2
	BLO	1$
DZTIMR:	MOV	DZTMCP,DZTCOM
	JSR	R5,$TIMIO
	 .WORD	DZTMBK - .
	 .WOOCM
.IF NE	MMG$T
	MOV	@#KISAR1,-(SP)
	BIT	#40000,@R1
	BEQ	24$
	SUB	#20000,@R1
	ADD	#200,Q.PAR-Q.WCNT(R1)
24$:	MOV	Q.PAR-Q.WCNT(R1),@#KISAR1
.ENDC
	MOVB	@(R1)+,R0
.IF NE	MMG$T
	MOV	(SP)+,@#KISAR1
.ENDC
	TST	T.CNF2(R3)
	BMI	OUPXXX
.ASSUME	WPALL$	EQ	100000
	TST	R0
	BNE	13$
25$:	INC	-(R1)
	DEC	-(R1)
	BR	TTHOU1
TTHOCM:	MOV	R5,-(SP)
	MOV	R4,-(SP)
	JSR	PC,TTCMPL
	MOV	(SP)+,R4
	MOV	(SP)+,R5
	MOV	R2,R1
	JMP	991$
.DSABL	LSB
.IF NE	DZ11$N
.SBTTL	DZIINT - DZ11 input interrupt service
DZIRD	0
	 .WORD	0
	 .WORD	CLOCK/2
	RTS	PC
DZTMBK:	.WORD	0,0
	.WORD	0,0
	.WORD	177442
	.WORD	-1
DZTCOM:	.WORD	0
DZTMCP::.WORD	DZMCTL
.ENDC
.ENDC
.IIF EQ DZ11$N, .LIST
.IF NE	DZ11$M!DL11$M!MTI$M
.SBTTL	SAVE52	- Save registers R5-R2
SAVE52:	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	JSR	PC,@R5
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	MOV	(SP)+,R5
	RTS	PC
.ENDC
.IF NE	MAT$S
.SBTTL	Report status subroutines
CARON::	JSR	R1,TRMSTS
	 .WORD	AS.HNG
	 .WORD	AS.CAR
HNGON::	JSR	R1,TRMSTS
	INT::
.IF GT	DZ11$N-1
	GETPSW
	MOV	(SP)+,DZTMP
.ENDC
	JSR	R5,$INTEN
	 .WORD	^C<PR5>&PR7
	JSR	R3,SAVE30
1$:
.IF GT	DZ11$N-1
	MOV	DZTMP,R4
	BIC	#^C<17>,R4
	ASL	R4
PDZTB0	== .+2
	MOV	DZTBL(R4),R3
PDZCS0	== .+2
	MOV	DZCSR(R4),R4
.IFF
	MOV	DZTBL,R3
	MOV	DZCSR,R4
.ENDC
	MOV	DZ.RBUF(R4),R0
	BPL	3$
.ASSUME	DZDVD$	EQ	100000
	MOV	R0,R5
	SWAB	R5
	BIC	#^C<7>,R5
	ASL	R5
	ADD	R3,R5
	MOV	@R5,R3
	BEQ	1$
	TSTB	T.CNF2(R3)
	BMI	2$
.ASSUME	RPALL$	EQ	200
	BIC	#^C<177>,R0
	BEQ	1$
2$:	JSR	PC,IN .WORD	AS.CAR
	 .WORD	AS.HNG
CTCON::	JSR	R1,TRMSTS
	 .WORD	0
	 .WORD	AS.CTC
CLRIN::	JSR	R1,TRMSTS
	 .WORD	AS.INP
	 .WORD	0
SETIN::	JSR	R1,TRMSTS
	 .WORD	0
	 .WORD	AS.INP
RGFUL::	JSR	R1,TRMSTS
	 .WORD	AS.OUT
	 .WORD	0
RGEMP::	JSR	R1,TRMSTS
	 .WORD	0
	 .WORD	AS.OUT
.SBTTL	TRMSTS	- Copy terminal status to user
TRMSTS:	TST	T.AST(R3)
	BEQ	1$
.IF NE	BF
	CMP	R5,T.OWNR(R3)
	BNE	1$
.ENDC
.IF NE	MMG$T
	MOV	@#KISAR1,-(SP)
	MOV	T.AST+2(R3),@#KISAR1
.ENDC
	BIC	(R1)+,@T.AST(R3)
	BIS	(R1)+,@Q	5$
	CMP	#1*2,R4
	BEQ	1$
.IF NE	BF
	CMP	R5,T.OWNR(R3)
	BNE	6$
.IFF
	TST	T.OWNR(R3)
	BEQ	6$
.ENDC
1$:
.IF NE	MMG$T
	CMP	R4,#1*2
	BLOS	4$
	CMP	R4,#3*2
	BHI	3$
	MOV	R2,-(SP)
	BEQ	2$
	MOV	R2,R1
2$:	JSR	PC,ACHBKM
	MOV	(SP)+,R2
	BCS	9$
	BR	5$
3$:	CMP	R4,#6*2
	BLOS	5$
4$:	JSR	PC,ACHBKM
	BCS	9$
.ENDC
5$:	ADD	PC,R4
	MOV	MTTLST-.(R4),-(SP)
	ADD	PC,@SP
MTTDSP:	JSR	PC,@(SP)+
	BCC	10$
	EMTERR+0
	MOVB	R1,@#ERRBYT
10$:
.IF NE	BF
	JMP	EMTRTI
.IFF
	JMP	EMTDON
.ENDC
6$:	EMTERR+1
	BTTPUT
	 .WORD	TCBIT$
	MOV	(SP)+,R2
	BCS	5$
	INC	@SP
	INC	4(SP)
	DEC	R2
	BGT	6$
	BR	3$
.DSABL	LSB
.SBTTL	.MTRCTO - Reset CTRL/O EMT
M$RSTO::JSR	PC,TTRSEC
.IF NE	BF
	BPL	1$
	CLRB	I.OCTR+1(R5)
	RTS	PC
1$:
.ENDC
	CLRB	T.OCTR+1(R3)
	RTS	PC
.SBTTL	.MTATCH - Attach to terminal EMT
.ENABL	LSB
M$ATCH::
.IF NE	BF
	MOV	R5,R2
	MOV	SP,R1
	ENSYS	4$
	BIT	#SHARE$,T.STAT(R3)
	BEQ	1$
	CMP	R3,I.CNSL(R2)
	BNE	3$
1$:	MOV	R2,R5
	MOV	T.OWNR(R3),R2
	BEQ	2$
	CMP	R5,R2
	BNE	3$
2$:	MOVB	I.JNUM(R5T.AST(R3)
.IF NE	MMG$T
	MOV	(SP)+,@#KISAR1
.ENDC
1$:	MOV	(SP)+,R1
	RTS	PC
.ENDC
.SBTTL	DATA AREAS
.IF NE	BF
TTOUSR::.WORD	BKGND
TTIUSR::.WORD	BKGND
.ENDC
TTHOUS::.WORD	0
TTHIUS::.WORD	0
.IF NE	HSR$B
HSRB::	.WORD	HSRBUF
HSRBEP::.WORD	HSRBUE
HSRBRP::.WORD	HSRBUF
HSRBCC::.WORD	-1
HSRBGP::.WORD	HSRBUF
HSRBUF::.BLKW	HSRBSZ*2
HSRBUE::
TIFBLK::BSS	F.BSIZ/2
.ENDC
.IF NE	HSR$O
.IF EQ	DL11$N-1
HSROCC::.WORD	-1
.IFF
HSROPP::.WORD	HSROBF
HSROEP::.WORD	HSROBE
HSRORP::.WORD	HSROBF
HSROCC::R	10$
7$:	EMTERR+2
	BR	10$
8$:	EMTERR+3
	BR	10$
	EMTERR+4
	BR	10$
.IF NE	MMG$T
9$:	EMTERR+5
	BR	10$
.ENDC
.DSABL	LSB
.SBTTL	Multi-terminal dispatch tables
MTTLST:	.WORD	M$TTST-MTTDSP
	.WORD	M$TTGT-MTTDSP
	.WORD	M$TTIN-MTTDSP
	.WORD	M$TOUT-MTTDSP
	.WORD	M$RSTO-MTTDSP
	.WORD	M$ATCH-MTTDSP
	.WORD	M$DTCH-MTTDSP
	.WORD	M$PRNT-MTTDSP
	.WORD	M$STAT-MTTDSP
MTTIMX	= . - MTTLST
.IF NE	MMG$T
BLKSIZ:	.BYTE	M.BLGH
	.BYTE	M.BLGH
	.BYTE	1
	.BYTE	1
	.BYTE	0
	.BYTE	2
	.BYTE	0
	.BYTE	1
	.BYTE.WORD	-1
HSROGP::.WORD	HSROBF
HSROBF::.BLKB	DL11$N
HSROBE::
	.EVEN
.ENDC
TOFBLK::BSS	F.BSIZ/2
.ENDC
.END
                                                                                                                                                                                                                                                                                                                                                                                                              	20
	.EVEN
.ENDC
.SBTTL	.MTSET - Set terminal characteristics EMT
M$TTST::MOV	R3,R1
	MOV	@R1,-(SP)
	BIC	#^C<REMOT$>,@SP
	MOV	(R0)+,R2
	BIC	#REMOT$,R2
	BIS	(SP)+,R2
	MOV	R2,(R1)+
	TST	T.STAT(R3)
	BPL	1$
	BIC	(PC)+,R2
	 .WORD	^C<TTSPC$!TTLC$!TCBIT$>
	MOV	@#JSW,-(SP)
	BIC	(PC)+,@SP
	 .WORD	<TTSPC$!TTLC$!TCBIT$>
	BIS	R2,@SP
	MOV	(SP)+,@#JSW
1$:	MOV	(R0)+,(R1)+
	MOV	(R0)+,(R1)+
	MOVB	@R0,@R1
	JSR	PC,TTRSEC
.IF NE	DZ11$N
	BIT	#DZ11$,T.STAT(R3)
	BEQ	3$
	MOV	@R3,R1
	BIC	#^C<LINSP$>,R1.MCALL .MODULE
.MODULE MTTEMT,RELEASE=B03,VERSION=01

.SBTTL
.SBTTL	********************************************
.SBTTL	*					   *
.SBTTL	*	 MULTI-TERMINAL EMT SERVICE	   *
.IF EQ	BF
.SBTTL	*	 FOR THE SINGLE JOB MONITOR	   *
.IFF
.IF EQ  MMG$T
.SBTTL	*   FOR THE FOREGROUND/BACKGROUND MONITOR  *
.IFF
.SBTTL	*      FOR THE EXTENDED MEMORY MONITOR     *
.ENDC
.ENDC
.SBTTL	*					   *
.SBTTL	********************************************
.SBTTL
.SBTTL	Definitions
DSECT	GLOBAL=NO
	DS	M.TSTS,,,
	BISB	T.CNF2(R3),R1
	ASLB	R1
	ASLB	R1
	ASLB	R1
	BISB	T.PUN(R3),R1
	BIS	#DZRCO$,R1
	MOV	T.CSR(R3),R2
.IF EQ	BF
2$:	TSTB	T.OCTR(R3)
	BNE	2$
.IFF
	JSR	PC,TTOEWT
.ENDC
	MOV	R1,DZ.LPR(R2)
3$:
.ENDC
	CLC
	RTS	PC
.SBTTL	.MTGET - Get status EMT
M$TTGT::MOV	R3,R1
	MOV	(R1)+,(R0)+
	MOV	(R1)+,(R0)+
	MOV	(R1)+,(R0)+
	MOVB	(R1)+,(R0)+
	MOVB	T.STAT+1(R3),@R0
	MOV	T.OWNR(R3),R2
	BEQ	MTTER1
.IF EQ	BF
	CLC
.IFF
	CMP	R5,R2
	BNE	MTTER4
.ENDC
	BIC	#CTRLC$,T.STAT(R3)
	RTS	PC
MTTER1:	MOV	#1,RGLOBAL
	DS	M.TST2,,,GLOBAL
	DS	M.TFIL,,BYTE,GLOBAL
	DS	M.FCNT,,BYTE,GLOBAL
	DS	M.TWID,,BYTE,GLOBAL
	DS	M.TSTW,,BYTE,GLOBAL
M.BLGH	= ..TEMP
.SBTTL	Multi-terminal EMT dispatcher
.PSECT	MTEMT$
.ENABL	LSB
M$TTIO::CMP	#MTTIMX,R4
	BLOS	8$
	MOVB	(R1)+,R3
	CMP	#TCBMAX,R3
	BLOS	7$
	CLR	R2
	BISB	@R1,R2
	MOV	R0,@SP
.IF NE	MMG$T
	MOV	R4,R1
	ASR	R1
	ADD	PC,R1
	MOVB	BLKSIZ-.(R1),R1
.ENDC
	CMP	#10*2,R4
	BEQ	1$
	ASL	R3
	ADD	PC,R3
	MOV	TCBLST-.(R3),R3
	TST	T.CSR(R3)
	BEQ	7$
	CMP	#5*2,R4
	BE1
MTTERC:	SEC
	RTS	PC
.SBTTL	.MTIN - Character input EMT
.ENABL	LSB
M$TTIN::MOV	R0,R4
	MOV	R2,-(SP)
1$:	JSR	PC,MTTIN
	BCS	5$
	BNE	2$
	TST	T.STAT(R3)
	BPL	2$
.IF NE	BF
	TST	I.SCCA(R5)
.IFF
	TST	I.SCCA
.ENDC
	BEQ	4$
2$:	MOVB	R0,(R4)+
	INC	4(SP)
	DEC	@SP
	BGT	1$
3$:	TST	(SP)+
	RTS	PC
4$:	CMP	(SP)+,(SP)+
	JMP	GOEXIT
5$:	CLR	R1
	COM	(SP)+
	RTS	PC
.SBTTL	.MTOUT - Single character output EMT
M$TOUT::MOV	R0,-(SP)
	JSR	PC,TTRSEC
6$:	MOV	@SP,R0
	MOVB	@R0,R0
	MOV	R2,-(SP)
	JSR	R1,Mt
.ENABL	LSB
MTTIN::
.IF NE	BF
	MOV	R5,R1
	ADD	#I.TTLC,R1
.ENDC
	JSR	PC,TTRSEC
.IF NE	BF
	BMI	1$
.ENDC
	MOV	R3,R1
	ADD	#T.TTLC,R1
1$:	MOV	R1,R2
	BIT	#TTSPC$,@R3
	BEQ	2$
	ADD	#T.ICTR-T.TTLC,R2
2$:	TST	@R2
	BNE	3$
	BIT	#TCBIT$,@R3
	SEC
	BNE	7$
.IF NE	BF
	JSR	R4,$SYSWT
	 .WORD	TTIWT$
	CMP	@R2,#1
	JSR	PC,@(SP)+
.IFF
	BR	2$
.ENDC
3$:	ADD	#T.IGET-T.TTLC,R1
	.BR	MTTGET
.SBTTL	MTTGET - Get a character from the ring buffer
MTTGET::
	JSR	PC,GETPSW
	SPL	5
	INC	@R1
	CMP	(R1)+,@R1
NTER	=	4
	LOOKUP	=	3
	DELETE	=	2
	CLOSE	=	1
	REDWRT	=	0
	WRTEOF	=	-1
	FWDSPC	=	-2
	BKSPC	=	-3
	WRTXTD	=	-4
	REWIND	=	-5
	OFFLINE	=	-6
	WRITEPHY=	-7
	READF	=	-8.
	STR100	=	-9.
	FN	=	8.
	ILLARG	=	5
	DEVINUSE=	2
	CSWHERR	=	1
	CSWEOF	=	20000
	SPUSR	=	272
	ERRGAPS	=	-101.
	NOQUAL	=	0
	DRIVEGONE =	1
	POSERR	=	2
	MEMERR	=	3
	WRITELOK=	4
	RECERR	=	5
	SMLREC	=	6
	NOQUAL	=	0
	EOFCODE	=	1
	EOTCODE	=	2
	EOFEOT	=	3
	BOTCODE	=	4
	Q.CSW	=	-2
	Q.BLK	=	0
	Q.FUNC	=	2
	Q.JNUN	=	3
	Q.BUF	=		BNE	4$
	SUB	#TTYIN,-2(R1)
4$:	MOVB	@-(R1),R0
	DEC	-(R1)
.IF NE	MAT$S
	BNE	5$
	JSR	PC,CLRIN
5$:
.ENDC
	JSR	PC,EOLTST
	BNE	6$
	DEC	T.TTLC-T.ICTR(R1)
MTTHOK::
6$:	JSR	PC,PUTPSW
	CMPB	#CTRLC,R0
	CLC
7$:	RTS	PC
.DSABL	LSB
.SBTTL	TTRSET - Reset terminal status bits
.ENABL	LSB
TTRSEC:	TST	T.STAT(R3)
	BPL	2$
TTRSET::MOV	@#JSW,R0
	BIC	(PC)+,R0
	 .WORD	^C<TTSPC$!TTLC$!TCBIT$>
	MOV	@R3,-(SP)
	BIC	(PC)+,@SP
	 .WORD	<TTSPC$!TTLC$!TCBIT$>
	BIS	R0,@SP
	MOV	(SP)+,@R3
.IF NE	BF
	MOV	@R3,I.TE4
	Q.WCNT	=	6
	MONLOW	=	54
	QCOMP	=	270
	DUMMY	=	0
	JOBNUM	=	34000
.SBTTL	INSTALLATION CHECKS
.ASECT
.	= 200
	NOP
	MOV	176,R0
	TSTB	2(R0)
	BPL	1$
	MOV	#1000,2(R0)
	BIT	#1000,2(R0)
	BNE	1$
	SEC
1$:	RTS	PC
.SBTTL	SET COMMANDS
.ASECT
.=400
	NUMARG	=	100
	NOARG	=	200
	.WORD	^C<DUMMY>
	.RAD50	/DENSE/
	.BYTE	<DENS-400>/2
	.BYTE	NUMARG
	.WORD	^C<DUMMY>
	.RAD50	/DUMP/
	.BYTE	<DMP-400>/2
	.BYTE	NOARG
	.WORD	PEVN
	.RAD50	/ODDPAR/
	.BYTE	<PARITY-400>/2
	.BYTE	NOARG
	.WORD	^C<DUMMY>),T.JOB(R3)
	MOV	R5,T.OWNR(R3)
	CLR	R1
3$:	RTS	PC
4$:	TST	R1
	BNE	MTTER4
.IFF
	MOV	R5,T.OWNR(R3)
.ENDC
.IF NE	MAT$S
.IF EQ	MMG$T
	MOV	R0,T.AST(R3)
.IFF
	MOV	R0,R2
	BEQ	5$
	JSR	PC,$RELOC
5$:	MOV	R2,T.AST(R3)
	MOV	R1,T.AST+2(R3)
.ENDC
.ENDC
	JMP	TTRSEC
.IF NE	BF
MTTER4:	MOV	I.JNUM(R2),2(SP)
	MOV	#4,R1
	BR	MTTERC
.ENDC
.DSABL	LSB
.SBTTL	.MTDTCH - Detach from a terminal EMT
M$DTCH::
.IF EQ	BF
	TST	T.STAT(R3)
	BMI	1$
.IFF
	BIT	#SHARE$,T.STAT(R3)
	BNE	5$
.ENDC
	BIS	#DTACH$,T.RM(R5)
.ENDC
	CMP	R3,BKCNSL
	BNE	1$
	MOV	@#TTFILL,T.TFIL(R3)
1$:	TST	T.STAT(R3)
2$:	RTS	PC
.DSABL	LSB
.SBTTL	MTTPUT - Single character output
MTTPUT::MOV	R5,-(SP)
1$:	MOV	@SP,R5
.IF NE	BF
	MOV	R5,R2
	ADD	#I.ICTR,R2
	TST	T.STAT(R3)
	BMI	2$
.ENDC
	MOV	R3,R2
	ADD	#T.ICTR,R2
2$:	MOV	T.CSR(R3),R4
.IF NE	SYT$K
3$:	TSTB	T.XFLG(R3)
	BNE	4$
.ENDC
	MOV	R2,-(SP)
	JSR	PC,TTOPT2
	MOV	(SP)+,R2
	BCC	6$
4$:	BIT	@R1,@R3
	BNE	6$
.IF NE	BF
.IF NE	SYT$K
	TSTB	T.XFLG(R3)
	BEQ	5$
	ENSYS	3$
	JMSTAT(R3)
	TSTB	@R3
	BPL	1$
.ASSUME	PAGE$	EQ	200
	MOV	R4,-(SP)
	MOV	T.CSR(R3),R4
	JSR	PC,CTRL.Q
	MOV	(SP)+,R4
1$:
.IF EQ	BF
	TSTB	T.OCTR(R3)
	BNE	1$
	TST	T.STAT(R3)
	BMI	6$
.IFF
	JSR	PC,TTOEWT
	TST	T.STAT(R3)
	BMI	6$
.ENDC
	MOV	R3,R2
	ADD	#T.TTLC,R2
	CLR	(R2)+
	MOV	(R2)+,(R2)+
	CLR	(R2)+
	MOV	-4(R2),@R2
	BIC	#TCBIT$!TTSPC$!TTLC$,@R3
5$:	SPL	7
	CLR	T.OWNR(R3)
6$:
.IF NE	MAT$S
	CLR	T.AST(R3)
.ENDC
	SPL	0
	BIC	#RPALL$!WPALL$,T.CNF2(R3)
	BIC	#DTACH$,T.STAT(R3)
	RTS	PC
.SBTTL	P	QWAIT
5$:
.ENDC
	JSR	R4,$SYSWT
	 .WORD	TTOWT$
	CMPB	#TTYOUT-1,T.OCTR-T.ICTR(R2)
	JSR	PC,@(SP)+
.ENDC
	BR	1$
6$:	BIT	(R1)+,R0
	MOV	(SP)+,R5
	RTS	R1
.SBTTL	MTRSET	- Stop and detach all terminals attached to a job
MTRSET::JSR	R3,SAVE30
	MOV	R4,-(SP)
	MOV	R5,-(SP)
.IF NE	BF
	MOV	CNTXT,R5
.ENDC
	ADDR	TCBLST,R4
	MOV	#TCBMAX,R0
1$:	MOV	(R4)+,R3
	BEQ	2$
.IF EQ	BF
	TST	T.OWNR(R3)
	BEQ	2$
.IFF
	CMP	R5,T.OWNR(R3)
	BNE	2$
.ENDC
	JSR	PC,M$DTCH
2$:	DEC	R0
	BGT	1$
	MOV	(SP)+,R5
	MOV	(S.MTPRNT - Print message EMT
M$PRNT::MOV	R0,R2
1$:	MOVB	(R2)+,R0
	BEQ	2$
	CMPB	R0,#200
	BEQ	3$
	MOV	R2,-(SP)
	JSR	R1,MTTPUT
	 .WORD	0
	MOV	(SP)+,R2
	BR	1$
2$:	ADDR	PRCRLF,R2
	BR	1$
3$:	RTS	PC
PRCRLF:	.ASCII	<CR><LF><200>
	.EVEN
.SBTTL	.MTSTAT - Return multi-terminal system status EMT
M$STAT::MOV	#DLTCB-$RMON,(R0)+
.IF NE	BF
	MOV	I.CNSL(R5),@R0
.IFF
	MOV	I.CNSL,@R0
.ENDC
	SUB	@#SYSPTR,(R0)+
	MOV	#TCBMAX,@R0
	DEC	(R0)+
	MOV	#TCBSZ,(R0)+
	RTS	PC
.SBTTL	MTTIN - Single character inpuP)+,R4
	RTS	PC
.IF NE	BF
.SBTTL	TTOEWT - Wait for terminal output buffer to empty
TTOEWT::JSR	R4,$SYSWT
	 .WORD	TTOEM$
	MOVB	I.OCTR(R5),-(SP)
	TST	T.STAT(R3)
	BMI	1$
	MOVB	T.OCTR(R3),@SP
1$:	NEGB	(SP)+
	JSR	PC,@(SP)+
	RTS	PC
.ENDC
.END
                                                                                                                                                                                                                                                                    0$
	TST	(SP)+
	MOV	MTCQE,R5
	BIS	#CSWHERR,@-(R5)
	JMP	MTDONE
10$:	MOV	(SP)+,EXTADR
.ENDC
.IF NDF	MT$FSM
	MOV	MTCQE,R3
.IFF
	JMP	FSMDIS
$MT::
.ENDC
	TST	(R3)+
	MOV	@R3,R0
	MOVB	R0,R4
	BIC	#^C<UNIT>,R0
	MOV	R0,R1
	SWAB	R1
	BIS	(PC)+,R0
DENSE:	 .WORD	D9$800
	MOV	R0,@#MTC
	CLR	NFSREAD
	MOV	PC,R0
	ADD	#RECOVE-.,R0
	MOV	R1,R5
	ADD	PC,R5
	ADD	#$TBL-.,R5
	MOV	@R3,R2
	SWAB	R2
	ASR	R2
	ASR	R2
	ASR	R2
	BIC	#177740,R2
.IF NE MMG$T
	MOVB	R2,JOBNM
.ENDC
	CMP	#LOOKUP,R4
	BNE	7$
.FOO	R3
	BIC	#177740,R3
	CMP	R3,R4
	BNE	7$
	CLRB	$FLG
	MOV	#PWRCLR,@#MTC
5$:
.IF DF	MT$FSM
	MOV	R0,-(SP)
	MOV	DVTBL,R0
	BEQ	6$
	MOV	#-1,(R0)+
	MOV	#-1,@R0
6$:	MOV	(SP)+,R0
.ENDC
7$:	CMPB	R4,@R5
	BNE	10$
	MOVB	#-1,@R5
10$:	CMPB	#-2,(R5)+
	BNE	7$
	MOV	(SP)+,R3
	JMP	$DONE
.SBTTL	INTERRUPT ENTRY POINT
	.DRAST	MT,PR5,MTABRT
.SBTTL	ERROR-ERROR ROUTINE DISPATCHER
	TST	MTCQE
	BNE	114$
	JMP	$RTS
114$:	TST	@#MTC
	BMI	1$
.IF NE	MMG$T
	JMP	NOERR
.IFF
	BR	NOERR
.ENDC
1$:	MOV	@#MTS,R4
	BPL= 0
.IF NE	MMG$T
.IF NDF	MT$FSM
.FOO	= 1
	MOV	MTCQE,R4
	JSR	PC,@$GTBYT
	TSTB	(SP)+
	BNE	5$
	JSR	PC,@$GTBYT
	TSTB	(SP)+
	BNE	5$
.ENDC
.ENDC
.IF EQ	.FOO
	TST	@2(R3)
	BNE	11$
.ENDC
	CMPB	#-1,@R5
	BEQ	3$
.IF NDF	MT$FSM
	MOV	#DEVINUSE,R0
2$:	MOV	@#MONLOW,R1
	MOV	R0,SPUSR(R1)
	BR	12$
.IFF
	MOV	@#MONLOW,R1
	MOV	#DEVINUSE,SPUSR(R1)
	JSR	PC,RESTOR
	JMP	$DONE
.ENDC
3$:	CLR	4(R3)
	MOVB	R2,@R5
.IF DF	MT$FSM
	BR	12$
.IFF
4$:	MOV	-2(R3),R1
	BEQ	6$
	BGT	5$
	INC	R1
	BEQ	12$
5$:	MOVB		2$
	BIT	#SELR,R4
	BNE	2$
	MOV	#DRIVEGONE,R4
	BR	ABORT
2$:	MOV	LASTCOM,R4
	JSR	PC,DISPAT
TABLEE:	.BYTE	ERREAD-TABLEE
	.BYTE	ERWRIT-TABLEE
	.BYTE	EROFFL-TABLEE
	.BYTE	ERREWD-TABLEE
	.BYTE	ERWRTX-TABLEE
	.BYTE	ERBKSP-TABLEE
	.BYTE	ERFWSP-TABLEE
	.BYTE	ERWRTM-TABLEE
.SBTTL	ERROR-WRITE OR WRITE WITH EXTENDED GAP COMMAND WAS ISSUED LAST AND ERR BIT WAS SET.
.ENABL	LSB
ERWRIT:
ERWRTX:	BIT	#WRL,@#MTS
	BEQ	1$
ERWRI1:	MOV	#WRITELOK,R4
	BR	ABORT
1$:	JSR	PC,ABOCHK
	MOV	R5,ERRSUM
	BNE	CONT
	BI#-1,@R5
	MOV	#ILLARG,R0
	BR	2$
6$:	MOV	#REWIND,R4
	BR	8$
.ENDC
7$:	CMP	#CLOSE,R4
	BNE	8$
	MOVB	#-1,@R5
	BR	12$
8$:	MOV	(PC)+,(R0)+
	.BYTE	-1,ERRGAPS
	TST	(R0)+
	CMP	#STR100,R4
	BEQ	12$
	CMP	#READF,R4
	BLOS	13$
	TST	R4
	BNE	11$
	MOV	R3,R1
	CLR	-2(R1)
	CMP	(R1)+,(R1)+
	MOV	#READF,R4
	TST	@R1
	BPL	9$
	NEG	@R1
	INC	R4
	BR	10$
9$:	COM	NFSREAD
10$:
.IF DF	MT$FSM
	MOV	R4,CODE
.ENDC
	BR	13$
11$:	TST	-(R3)
	BIS	#CSWHERR,@-(R3)
12$:
.IF DF	MT$FSM
	JSR	PC,RESTOR
.ENDC
	JMP	MTDONT	#EOT,R4
	BNE	NOERR
	BR	NQUAL
.DSABL	LSB
.SBTTL	ERROR-WRITE TM,FORWARD SPACE, OR BACKSPACE COMMAND GIVEN LAST AND ERR BIT SET
ERWRTM:	BIT	#WRL,@#MTS
	BNE	ERWRI1
ERBKSP:
ERFWSP:	JSR	PC,ABOCHK
	BIT	#EOF+EOT,R4
	BNE	NOERR
	BR	NQUAL
.SBTTL	ERROR-READ COMMAND WAS ISSUED LAST AND ERR BIT WAS SET.
ERREAD:	JSR	PC,ABOCHK
	MOV	R5,ERRSUM
	BNE	CONT
	BIT	#RLE+EOT+EOF,R4
	BNE	NOERR
	BR	NQUAL
.SBTTL	ERROR-ABORT CHECK SUBROUTINE
ABOCHK:	MOV	@#MTS,R4
	BIT	#BTEOPI,R4
	BEQ	1$
	MOV	#POSERR,R4
	BR	4$
	.RAD50	/DEFALT/
	.BYTE	<DFLT-400>/2
	.BYTE	NUMARG
	.WORD	0
DENS:	CLR	R3
	CMP	#200.,R0
	BEQ	DENS1
	CMP	#556.,R0
	BEQ	1$
	CMP	#807.,R0
	BEQ	2$
	CMP	#809.,R0
	BEQ	3$
	CMP	#800.,R0
	BEQ	3$
	SEC
	RTS	PC
1$:	BIS	#D7$556,R3
	BR	DENS1
2$:	BIS	#D7$800,R3
	BR	DENS1
3$:	BIS	#D9$800,R3
DENS1:	BIC	#D9$800,DENSE
	BIS	R3,DENSE
DENS3:	CLC
	RTS	PC
DMP:	CLR	R3
	BR	1$
	BR	DFLT1
1$:	BIS	#D7$CORE,R3
	BR	DENS1
PARITY:	BR	ODD
	NOP
	BIS	R3,DENSE
	BR	DENS3
ODD:	BIC	R3,DENSE
	BR	DENS3
.ENABL	LE
13$:	ADD	#FUNTAB-TABLE,R4
	MOV	R4,(R0)+
.IF NE	MMG$T
	MOV	4(R3),R1
	MOV	R1,4(R0)
.IFF
	TST	(R3)+
	MOV	(R3)+,(R0)+
	MOV	@R3,@R0
	MOV	@R3,R1
.ENDC
	NEG	R1
	JSR	PC,DISPAT
TABLE:	.BYTE	REDEF-TABLE
	.BYTE	RIGHT-TABLE
	.BYTE	AWFLINE-TABLE
	.BYTE	REWHINED-TABLE
	.BYTE	RIGHTX-TABLE
	.BYTE	BAKSPA-TABLE
	.BYTE	FORSPA-TABLE
	.BYTE	RIGHTM-TABLE
FUNTAB:	.BYTE	FREAD+INTENB+GO
	.BYTE	FWRITE+INTENB+GO
	.BYTE	FOFF+INTENB+GO
	.BYTE	FREWIND+INTENB+GO
	.BYTE	FWRTEXT+INTENB+GO
	.BYTE	FSPBAK+INTENB+GSB
DFLT:	CMP	#7,R0
	BEQ	7$
	CMP	#9.,R0
	BEQ	9$
DFLT1:	SEC
	RTS	PC
9$:	MOV	#D9$800,DENSE
	BR	DENS3
7$:	MOV	#D7$CORE,DENSE
	BR	DENS3
.DSABL	LSB
.SBTTL	DISPATCHER
.IIF NE	MMG$T,	.MCALL	.SYNCH
.IF DF	MT$FSM
	.GLOBL	FSMDIS,FSMABT,FSMDON,FSMERR,RESTOR,CODE,DVTBL
	.GLOBL	FSMSIZ
	.GLOBL MTCQE
.IF NE	MMG$T
	.GLOBL	OLDBA,XBUMP,EXTADR,JOBNM,SYNBLK,TEMP,SINK,ERBSAV
.ENDC
.ENDC
	.DRBEG	MT
MT:
.IF NE	MMG$T
	MOV	MTCQE,R5
	CMP	(R5)+,(R5)+
	JSR	PC,@$MPPTR
	MOV	(SP)+,OLDBA
	BIT	#1700,@SP
	BEQ	1O
	.BYTE	FSPFOR+INTENB+GO
	.BYTE	FWRTTM+INTENB+GO
REDEF:
RIGHTX:
RIGHT:
.IF NE	MMG$T
	MOV	(R0)+,@#MTCMA
	BIS	@R0,R5
.IFF
	MOV	-(R3),@#MTCMA
.ENDC
	ASL	R1
FORSPA:
BAKSPA:
	MOV	R1,@#MTBRC
AWFLINE:
REWHINED:
RIGHTM:	MOVB	R5,@#MTC
.IF DF	MT$FSM
	JSR	PC,RESTOR
.ENDC
	RTS	PC
.SBTTL	INTERRUPT HANDLER AND ABORT ENTRY POINTS
MTABRT:	MOVB	#-1,$FLG
	MOV	R3,-(SP)
	MOV	PC,R5
	ADD	#$TBL-.,R5
	MOV	MTCQE,R3
	BEQ	7$
	MOVB	Q.JNUN(R3),-(SP);GET JOB NUMBER
	MOVB	(SP)+,R3
	ASR	R3
	ASR	R3
	ASR	