Google
 

Trailing-Edge - PDP-10 Archives - bb-m836d-bm - tools/ttyini/ttyini.mac
There are 2 other files named ttyini.mac in the archive. Click here to see a list.
TITLE	TTYINI - SET TERMINAL CHARACTERISTICS

SEARCH MONSYM,MACSYM
.REQUIRE SYS:MACREL
.DIRECTIVE FLBLST
SALL
EXT <JSMSG0>

VGROUP==0
VMAJOR==16
VMINOR==0
VEDIT==100

; Date of last edit to sources
DEFINE DATE<ASCIZ \17-Aug-84\>

;Modified by Peter Mierswa to add comments, and all terms up to VT200s
;Modified by Scott Robinson to make LA12 be width:80/formfeed and type 15
;Modified by Scott Robinson to add terminals up to type 23 (CT-R(VT200))
;Modified by Scott Robinson to alphabetize switch tables.
;Modified by Scott Robinson to add terminals up to type 14 (LA12)
;Modified by Scott Robinson to add VT102 terminal 8-OCT-82
;MODIFIED BY HELLIWELL TO ADD GIGI TERMINAL OPERATING AS VT100 6-JUN-81.
;MODIFIED BY HELLIWELL TO TEST FOR IOX4&COMNX9 FOR EOF ON FILE INPUT 19-MAR-81.
;MODIFIED BY JACKSON TO SEND VT52 "EXIT HOLD PAGE MODE" (ESC \) AFTER ANSI
; INTERROGATE SEQUENCE 11-MAR-81.
;MODIFIED BY JACKSON TO WAIT 10 SEC BEFORE GIVING UP IF ON PTY 11-MAR-81.
;MODIFIED BY JACKSON TO TALK TO VT61 29-JAN-81.

; Registers
A=1
B=2
C=3
D=4
E=5
F=6
S=7

;16 IS USED BY MACSYM

P=17

;SHOULD BE IN MONSYM
.TT200==^D40

;BITS IN F
TTYOWN==1		;WE OWN TTY
TTYINA==2		;INACTIVE
TTYASG==4		;OWNED BY SOMEONE ELSE
WHOPR==10		;WE ARE WHEEL OR OPR

;BITS RETURNED BY GETJI
TTYASN==1B1		;TERMINAL IS ASSIGNED, NOT CONTROLLING

;BITS IN TTSTAT (used for INGORE-INPUT)
TT%IGI==1B6		;IGNORE INPUT

MAXJFN==^D20		;MAX 20 NESTED TAKES

MAXCHR==^D2000		;Size of the COMND% buffer in characters

MAXLEN==<MAXCHR+5>/5	;Size of the COMND% buffer in words

ABCHR==^D50		;Size of the COMND% atom buffer in characters

ABLEN==<ABCHR+5>/5	;Size of the COMND% atom buffer in words

PDLLEN==20		;Size of the stack

;Error processing macros
DEFINE JCERR(TEXT)<
	ERCAL [	JSERR<TEXT>
		RET]>

DEFINE JRERR(TEXT)<
	ERJMP [	JSERR<TEXT>
		RET]>

DEFINE JWERR(TEXT,ADDR)<
IFB<ADDR>,<ERCAL [>
IFNB<ADDR>,<ERJMP [>
	HRROI A,[ASCIZ \%'TEXT: \]
	PSOUT%
	CALL JSMSG0
IFB<ADDR>,<RET]>
IFNB<ADDR>,<JRST ADDR]>
>

DEFINE JSERR(TEXT)<
	CALL ERRDO
IFB<TEXT><HRROI A,[0]>
IFNB<TEXT><HRROI A,[ASCIZ \TEXT: \]>
	ESOUT%
	CALL JSMSG0
>
SUBTTL	MACROS

;LOAD A BLOCK WITH DATA AND ALLOCATE ENOUGH SPACE
;FOR LARGEST WORD

DEFINE LDBLK(LIST)<
..LEN==0
	IRP LIST,<.LDWRD(LIST)>
	.ORG .+..LEN
>

;USED TO STRIP OFF <>

DEFINE .LDWRD(A)<LDWRD(A)>

;LOAD 1 WORD CHECK MAX LENGTH

DEFINE LDWRD(A,B,C)<
	.ORG .+<A>
IFNB<C><C:>
	IFB<B>,<0;>B
	.ORG .-<A>-1
IFGE <A>-..LEN,<..LEN==<A>+1>
>

;KEYWORD TABLE MACROS

DEFINE TABLE<
	...BEG==.
	BLOCK 1
>

DEFINE TEND<
...LEN==.-...BEG
.ORG ...BEG
	...LEN-1,,...LEN
.ORG .+...LEN
>

DEFINE T(TEXT,VALUE)<	[ASCIZ \TEXT\],,VALUE>

;LOAD A FUNCTION DESCRIPTOR BLOCK
;USE FLDDB. MACRO FROM MONSYM. ARGS AS FOLLOWS:
;FLDDB.(TYP,FLGS,DATA,HLPM,DEFM,LST)
;TYP	COMND FUNCTION CODE (I.E. .CMKEY)
;FLGS	FLAGS (I.E. CM%SDH, SUPPRESS DEFAULT HELP)
;DATA	ARG TO SPECIFIC FUNCTION (I.E. RADIX FOR .CMNUM)
;HLPM	USER SUPPLIED HELP STRING (AUTOMATICALLY SETS CM%HPP)
;DEFM	DEFAULT STRING (AUTOMATICALLY SETS CM%DPP)
;LST	POINTER TO NEXT FUNCTION DESCRIPTOR BLOCK

;DEFINE SINGLE DATA WORD (OR WORDS)

DEFINE DATA(ADDR,SIZE)<
ADDR:	IFB<SIZE>,<BLOCK 1;>BLOCK SIZE
>

DEFINE CONFIRM(ERROR)<
	CALL DOCFM
IFB<ERROR>< JRST COMERR>
IFNB<ERROR>< JRST ERROR>
>


DEFINE COMINI(TEXT)<
IFNB<TEXT><HRROI A,[ASCIZ \TEXT\]>
IFB<TEXT><HRROI A,CMBUF>
	SKIPN B,CMJFNS
	MOVE B,[.PRIIN,,.PRIOU]
	CALL DOINI
>

DEFINE FIELD(FDB,ERROR)<
	MOVEI B,FDB
	CALL DOCOM
IFB<ERROR>< JRST COMERR>
IFNB<ERROR>< JRST ERROR>
>

DEFINE RFIELD(FDB)<
	MOVEI B,FDB
	MOVEI A,CMSTAT
	COMND%
	 ERJMP ERSCAN
	TXNE A,CM%NOP
	JRST ERSCAN
>

DEFINE CHECK(ADDR,NAME)<
	SKIPL ADDR
	JRST [	SKIPE FILEF
		RETSKP
		TMSG <?TTYINI: Cannot give NAME more than once
>
		RET]
>

DEFINE DEFAULT(SWIT,VAL)<
	MOVEI A,VAL
	SKIPGE SWIT
	MOVEM A,SWIT
>
SUBTTL	DATA AREA

EV:	JRST STRT
	JRST STRT
JOBVER:	BYTE (3)VGROUP(9)VMAJOR(6)VMINOR(18)VEDIT
EVL==.-EV

LOGIN:	BLOCK ^D20	;logged in directory

PDL:	BLOCK PDLLEN

CHRBUF:	BLOCK ^D40

CMSTAT:	LDBLK(<<.CMFLG,REPARS>,<.CMIOJ,<.PRIIN,,.PRIOU>>,<.CMBFP,<-1,,CMBUF>>,<.CMPTR,<-1,,CMBUF>>,<.CMCNT,MAXCHR>,<.CMINC,0>,<.CMABP,<POINT 7,ABBUF>>,<.CMABC,ABCHR>,<.CMGJB,CMGJFN>>)

CMGJFN:	BLOCK 16

CMBUF:	BLOCK MAXLEN

ABBUF:	BLOCK ABLEN

INIBLK:	FLDDB.(.CMINI)

TTYINI:	FLDDB.(.CMKEY,,RESKEY)

RESKEY:	TABLE
	T TTYINI,0
	TEND

COMAND:	FLDDB.(.CMCFM,,,,,COMSWT)

COMSWT:	FLDDB.(.CMSWI,,TYPSWT,,,COMTYP)

TYPSWT:	TABLE
	T ADVICE-ACCEPT,$ADVIC
	T ASSIGN,$ASS
	T AUTO-BAUD,$AUTO
	T CHARACTERISTICS,$CHAR
	T CHECK,$CHECK
	T DEFAULT-TYPE:,$DTYPE
	T EXIT,$EXIT
	T FILE:,$FILE
	T FLAG-UPPERCASE,$FLAG
	T FORMFEED,$FORM
	T FULLDUPLEX,$FULL
	T HALFDUPLEX,$HALF
	T HELP:,$HELP
	T IGNORE-INPUT,$IGNOR
	T INDICATE-FORMFEED,$INDFF
	T INHIBIT,$INHIB
	T INQUIRE,$CHECK
	T LENGTH:,$LENGT
	T LINE:,$LINE
	T LINK-ACCEPT,$LINK
	T LIST,$LIST
	T LOWERCASE,$LOWER
	T NOADVICE-ACCEPT,%ADVIC
	T NOAUTO-BAUD,%AUTO
	T NOFILE,%FILE
	T NOFLAG-UPPERCASE,%FLAG
	T NOFORMFEED,%FORM
	T NOIGNORE-INPUT,%IGNOR
	T NOINDICATE-FORMFEED,%INDFF
	T NOINHIBIT,%INHIB
	T NOLINK-ACCEPT,%LINK
	T NOLOWERCASE,%LOWER
	T NOPAGE-SPEED:,%PGSPD
	T NOPAUSE-AT-END-OF-PAGE,%PAUSE
	T NOPAUSE-ON-COMMAND,%PAUSC
	T NORAISE-INPUT,%RAISE
	T NOREMOTE,%REMOT
	T NOSYSTEM-MESSAGES,%SYSMS
	T NOTAB,%TAB
	T NOUSER-MESSAGES,%USRMS
	T PAUSE-AT-END-OF-PAGE,$PAUSE
	T PAUSE-ON-COMMAND,$PAUSC
	T RAISE-INPUT,$RAISE
	T REMOTE,$REMOT
	T SPEED,$SPEED
	T SYSTEM-MESSAGES,$SYSMS
	T TAB,$TAB
	T TAKE:,DOTAKE
	T USER-MESSAGES,$USRMS
	T VT100-52,$XXX52
	T VT100-ANSI,$XXX10
	T VTXXX-100,$XXX10
	T VTXXX-102,$XXX12
	T VTXXX-200,$XXX20
	T VTXXX-52,$XXX52
	T WIDTH:,$WIDTH
	TEND

COMSPD:	FLDDB.(.CMKEY,,SPDKEY,<
 Speed at or below which to disable /PAUSE-AT-END-OF-PAGE,
>)

SPDKEY:	TABLE
	T 110,^D110
	T 1200,^D1200
	T 134,^D134
	T 150,^D150
	T 1800,^D1800
	T 200,^D200
	T 2400,^D2400
	T 300,^D300
	T 4800,^D4800
	T 50,^D50
	T 600,^D600
	T 75,^D75
	T 9600,^D9600
	TEND

COMTYP:	FLDDB.(.CMKEY,,COMKEY)

COMDTY:	FLDDB.(.CMKEY,,COMKEY)

COMKEY:	TABLE
	T 33,$TT33
	T 35,$TT35
	T 37,$TT37
	T CHECK,-1
	T CT,$TT100
	T CTRO,$TT120
	T DEFAULT,$TTDEF
	T EP1,$TT120
	T EXECUPORT,$TTEXE
	T GIGI,$TTK10
	T GT40,$TTG40
	T H19,$TTH19
	T IDEAL,$TTIDL
	T INQUIRE,-1
	T LA12,$TTL12
	T LA120,$TT120
	T LA180,$TT180
	T LA24,$TTL34
	T LA30,$TTL30
	T LA34,$TTL34
	T LA36,$TTL36
	T LA38,$TTL38
	T LA80,$TT120
	T LQP02,$TTL34
	T LQPSE,$TTL34
	T TI,$TTEXE
	T VT05,$TTV05
	T VT100,$TT100
	T VT102,$TT102
	T VT125,$TT125
	T VT131,$TT131
	T VT132,$TT131
	T VT200-SERIES,$TT200
	T VT220,$TT200
	T VT240,$TT200
	T VT241,$TT200
	T VT278,$TTV52
	T VT50,$TTV50
	T VT52,$TTV52
	T VT55,$TTV52
	T VT61,$TTV52
	T VT80,$TT100
	TEND

COMCFM:	FLDDB.(.CMCFM)

COMNUM:	FLDDB.(.CMNUM,,^D10)

COMLIN:	FLDDB.(.CMCFM,,,,,COMSTR)

COMSTR:	FLDDB.(.CMTOK,,<-1,,[ASCIZ /*/]>,,,COMOCT)

COMOCT:	FLDDB.(.CMNUM,,10)

COMDEV:	FLDDB.(.CMDEV,CM%SDH,,<Terminal device name>,,TTYOCT)

TTYOCT:	FLDDB.(.CMNUM,CM%SDH,10,<Octal terminal number>)

COMEOL:	FLDDB.(.CMTXT)

COMFIL:	FLDDB.(.CMFIL)

ISPEED:	FLDDB.(.CMKEY,,SPEEDT,<Input speed,>)

OSPEED:	FLDDB.(.CMKEY,,SPEEDT,<Output speed,>)

COLON:	FLDDB.(.CMTOK,CM%SDH,<-1,,[ASCIZ /:/]>,<":" to specify different output speed>,<:>)

SPEEDT:	TABLE
	T 0,^D0
	T 110,^D110
	T 1200,^D1200
	T 134,^D134
	T 150,^D150
	T 1800,^D1800
	T 200,^D200
	T 2400,^D2400
	T 300,^D300
	T 4800,^D4800
	T 50,^D50
	T 600,^D600
	T 75,^D75
	T 9600,^D9600
	TEND

FILBLK:	LDBLK(<<.GJGEN,GJ%OLD>,<.GJEXT,<-1,,[ASCIZ /CMD/]>>,<.GJNAM,[ASCIZ /TTYINI/]>>)
FILLEN==.-FILBLK

HLPFIL:	FLDDB.(.CMFIL,CM%DPP,,,<TTY:>)
HLPBLK:	LDBLK(<<.GJGEN,GJ%FOU>,<.GJEXT,<-1,,[ASCIZ /HLP/]>>,<.GJNAM,<-1,,[ASCIZ /TTYINI/]>>>)
HLPLEN==.-HLPBLK

TAKFIL:	FLDDB.(.CMFIL)
TAKBLK:	LDBLK(<<.GJGEN,GJ%OLD>,<.GJDEV,<-1,,[ASCIZ /PS:/]>>,<.GJEXT,<-1,,[ASCIZ /CMD/]>>,<.GJNAM,<-1,,[ASCIZ /TTYINI/]>>>)
TAKLEN==.-TAKBLK

DATA	REPPDL			; saved stack pointer used by COMND% reparse
DATA	REPPC			; saved PC used by COMND% reparse
DATA	SYSCOM			; -1=use EXECs command line
				;  0=prompt for command
DATA	CMJFNS			; saved .CMIOJ word (i.e. take file JFN)
DATA	CMJFNP			; stack pointer for nested take file JFN stack
DATA	JFNSTK,MAXJFN		; stack for nested take file JFNS
DATA	PTY0			; # OF PTYS,,TTY number of first PTY
DATA	OURLIN			; TTY number of the line to work on
DATA	OWNLIN			; Controlling TTY
DATA	OWNJOB			; job number of job running TTYINI
DATA	TTYDES			; device designator for the line to work on
DATA	EXITS			; /EXIT switch was seen in a command file
DATA	HELPS			; /HELP switch was seen in a command file
DATA	LINES			; /LINE switch was seen in a command file
DATA	LISTS			; /LIST switch was seen in a command file
DATA	CHANGE			; >0=Read file with commands by TTY number
				; 0=Don't read file
DATA	TMP1			; temporary data storage
DATA	TMP2			; temporary data storage
DATA	FILEF			; 0=not currently reading file with TTY numbers
				; -1=currently reading file
				; 1=trying to read default file
DATA	IJFN			; JFN of the above file being currently read
DATA	SAVMOD			; saved RFMOD bits
DATA	PASS			; -1=currently doing first pass of /CHECK

DATABG==.
DATA	TYPE			; address of the terminal type routine
DATA	DTYPE			; address of the default term type routine

; Flags for switches

DATA	CHARF
DATA	CHRPTR
DATA	EXITF
DATA	LISTF
DATA	ASSF
DATA	FLAGF
DATA	LINE
DATA	FORMF
DATA	OJFN			; output JFN for /HELP
DATA	LENGTH
DATA	LINEF
DATA	LOWERF
DATA	PAUSEF
DATA	PAUSCF
DATA	RFCHNG
DATA	NSPEED
DATA	RAISEF
DATA	INDFFF
DATA	TABF
DATA	WIDTH
DATA	VTXXXF			; -1 No switch given
	WVT52=0			; 0 want to be a VT52
	WVT100=1		; 1 want to be a vt100
	WVT102=2		; 2 want to be a vt102
	WVT200=3		; 3 want to be a vt200
DATA	FJFN			; JFN of the file after /FILE
DATA	AADFLG
DATA	ALKFLG
DATA	TLKFLG
DATA	SPDWRD
DATA	RMTFLG
DATA	AUTFLG
DATA	SPDFLG
DATA	MSGFLG
DATA	USRFLG
DATA	INHFLG
DATA	IGNFLG
DATA	DTALKF
DATALN==.-DATABG

DATA	TMPARG,DATALN

TTSTAT:	-1	; used for IGNORE-INPUT

;TERMINAL TYPE TABLE FOR ANSI RESPONSE TO <ESC>Z

ANSITB:
T1001:	;LABEL USED FOR /VT100-52
	$TT100,,[ASCIZ /VT100/]       ; (1) VT100
	$TT120,,[ASCIZ /LA120/]       ; (2) LA120
	$TTL34,,[ASCIZ /LA34/]	       ; (3) LA34
T1002:	$TT131,,[ASCIZ /VT132/] ; (4) VT132
	$TTK10,,[ASCIZ /GIGI/]  ; (5) GIGI IN VT100 MODE
T1003:	$TT102,,[ASCIZ /VT102/] ; (6) VT102
T1004:	$TT131,,[ASCIZ /VT131/] ; (7) VT131
	$TTV52,,[ASCIZ /VT278/]  ; (8) VT278
	$TTL34,,[ASCIZ /LQPSE-F/]; (9) LQPSE-F
	$TTL34,,[ASCIZ /LA24/]   ;(10) LA24
	$TT120,,[ASCIZ /LA120-K/]      ;(11) LA120 Katakana
T1005:	$TT125,,[ASCIZ /VT125/] ;(12) VT125
	$TTL12,,[ASCIZ /LQP02/] ;(13) LQP02
	$TT102,,[ASCIZ /VT102J/];(14) VT102 Katakana
	$TTL12,,[ASCIZ /LA12/]  ;(15) LA12
	$TT120,,[ASCIZ /EP1/]	;(16) EP1 Electronic Printer
	$TT120,,[ASCIZ /CT-RO/]	;(17) CT Receive Only Printer
	$TT100,,[ASCIZ /VT80-CSS/];(18) VT80 CSS Japan
TALK:	$TTDEF,,[ASCIZ /DECtalk/] ;(19) DECtalk
	$TT120,,[ASCIZ /LA80-CSS/];(20) LA80 CSS Japan
	$TT100,,[ASCIZ /CT-I/] 	  ;(21) Internal CT
	$TT100,,[ASCIZ /CT-R/] 	  ;(22) Remote CT VT100
	$TT200,,[ASCIZ /CT-R/] 	  ;(23) Remote CT VT200
REPEAT ^D60-^D24+1, <$TTDEF,,[ASCIZ /UNKNOWN ANSI TERMINAL/]>;?
T1006:	$TT102,,[ASCIZ /VT102/]	; (61) VT102
T2001:	$TT200,,[ASCIZ /VT200-SERIES/] ; (62) VT200
   ANSIMX==.-ANSITB

;CHARACTERISTICS TABLES

;VT100 class terminals
CHRTAB:	0
	[ASCIZ /processor(STP)/]
	[ASCIZ /advanced video(AVO)/]
	[ASCIZ /processor(STP), advanced video(AVO)/]
	[ASCIZ /graphics(GPO)/]
	[ASCIZ /graphics(GPO), processor(STP)/]
	[ASCIZ /graphics(GPO), advanced video(AVO)/]
	[ASCIZ /graphics(GPO), processor(STP), advanced video(AVO)/]
	[ASCIZ /printer(PRT)/]
	[ASCIZ /printer(PRT)/]
	[ASCIZ /printer(PRT), advanced video(AVO)/]
	[ASCIZ /printer(PRT), advanced video(AVO)/]
	[ASCIZ /graphics(GPO), printer(PRT)/]
	[ASCIZ /graphics(GPO), printer(PRT)/]
	[ASCIZ /graphics(GPO), printer(PRT), advanced video(AVO)/]
	[ASCIZ /graphics(GPO), printer(PRT), advanced video(AVO)/]

;VT200 class terminals
VT2TAB:
	0
	[ASCIZ /132 cols/]
	[ASCIZ /printer/]
	[ASCIZ /regis/]
	[ASCIZ \sixels\]
	[ASCIZ /katakana/]
	[ASCIZ /selective erase/]
	[ASCIZ /DRCS/]
	[ASCIZ /UDK/]
	[ASCIZ /9/]
vt2end=.-vt2tab

;TERMINAL TYPE TABLE FOR DEC RESPONSE TO <ESC>Z

DEFINE DECENT(LETTER,ROUTINE,TYPE,ADDR)<
	LDWRD(<<"LETTER">-<"#">>,<ROUTINE,,[ASCIZ \TYPE\]>,ADDR)
>

DECTAB:
..LEN==0
DECENT	A,$TTV50,VT50
DECENT	B,$TTV50,VT50
DECENT	H,$TTV50,<VT52H>
DECENT	J,$TTV50,<VT52H>	;copier
DECENT	C,$TTV52,<VT55>
DECENT	K,$TTV52,VT52
DECENT	L,$TTV52,VT52		;copier
DECENT	M,$TTV52,VT52		;printer
DECENT	(Z,$TTV52,<VTxxx>,T10052)	;T10052 USED BY /VT100-ANSI
DECENT	E,$TTV52,<VT55>
DECENT	`,$TTV52,<VT61>	;VT61 no printer no copier
DECENT	a,$TTV52,<VT61>	;VT61 no printer copier
DECENT	b,$TTV52,<VT61>	;VT61 printer no copier
DECENT	c,$TTV52,<VT61>	;VT61 printer copier
DECENT	#,$TTV52,<VT71T>
DECMAX==..LEN
.ORG DECTAB+DECMAX

SUDTAB:
..LEN==0
DECENT	A,$80532,<SUDS(GT40/VT05/32/80)>
DECENT	B,$80542,<SUDS(GT62/VT05/42/80)>
DECENT	C,$85232,<SUDS(GT40/VT52/32/80)>
DECENT	D,$85242,<SUDS(GT62/VT52/42/80)>
DECENT	E,$70532,<SUDS(GT40/VT05/32/72)>
DECENT	F,$70542,<SUDS(GT62/VT05/42/72)>
DECENT	G,$75232,<SUDS(GT40/VT52/32/72)>
DECENT	H,$75242,<SUDS(GT62/VT52/42/72)>
SUDMAX==..LEN
.ORG SUDTAB+SUDMAX

FILINI:	PUSH P,A
	SETZM CMGJFN
	MOVE A,[CMGJFN,,CMGJFN+1]
	BLT A,CMGJFN+15
	POP P,A
	HRRZ B,A
	HRRI A,CMGJFN
	BLT A,CMGJFN-1(B)
	RET
SUBTTL	STARTUP
STRT:	RESET%
	MOVE P,[IOWD PDLLEN,PDL]
	MOVE A,[-MAXJFN,,JFNSTK-1]
	MOVEM A,CMJFNP
	SETZM CMJFNS
	MOVE A,['PTYPAR']
	SYSGT%
	MOVEM A,PTY0
	SETOM SYSCOM
	SETZ A,
	RSCAN%
	 ERJMP ERSCAN
	JUMPE A,ERSCAN
	COMINI()
	RFIELD(TTYINI)		;MUST START WITH PROGRAM NAME, OR NO ERRORS
	MOVEI B,COMCFM
	MOVEI A,CMSTAT
	COMND%
	 ERJMP REPAR1
	TXNE A,CM%NOP
	JRST REPAR1
	SETOM DATABG
	MOVE A,[DATABG,,DATABG+1]
	BLT A,DATABG+DATALN-1
	SETZM CHANGE
	AOS CHANGE		;FORCE FILE SCAN
	JRST COMDON		;GO DO TYPE FROM FILE

ERSCAN:	HRROI A,[0]
	RSCAN%
	 ERJMP .+1
	SETZM SYSCOM
	MOVEI A,.PRIOU
	CALL VERPNT
	TMSG <Type "/HELP" for help.
Type "/EXIT" to exit.
>
COMLOP:	CALL CLEAN
	SKIPE CMJFNS			;DON'T EXIT DURING TAKE
	JRST COMLP1
	SKIPE SYSCOM
	HALTF%
	SETZM SYSCOM
COMLP1:	HRROI A,[ASCIZ /TTYINI>/]
	SKIPN B,CMJFNS
	MOVE B,[.PRIIN,,.PRIOU]
	CALL DOINI
	CALL CLEAN
REPAR1:	SETZM CHANGE
	SETZM FILEF
	SETOM DATABG
	MOVE A,[DATABG,,DATABG+1]
	BLT A,DATABG+DATALN-1
COMNXT:	FIELD(COMAND,CMEOFC)
	HRRZ B,(B)
	MOVE D,B
	HRRZ C,C
	CAIN C,COMAND
	JRST COMDON		;CONFIRMED
	CAIN C,COMTYP
	MOVEI D,SETTYP
	CALL (D)
	 JRST COMERR
	JRST COMNXT

REPARS:	MOVE P,REPPDL
	MOVE A,REPPC
	MOVEM A,(P)
	RET

DOINI:	MOVEM A,CMSTAT+.CMRTY
	MOVEM B,CMSTAT+.CMIOJ
	MOVE A,(P)
	MOVEM A,REPPC
	MOVEM P,REPPDL
	MOVEI A,CMSTAT
	MOVEI B,INIBLK
	COMND%
	 ERJMP FATAL
	TXNN A,CM%NOP
	RET
FATAL:	JSHLT

CMEOFC:	SKIPN CMJFNS
	JRST COMERR
	MOVEI A,.FHSLF
	GETER%
	 ERJMP COMERR
	HRRZ B,B
	CAIE B,IOX4
	JRST COMERR
	TMSG <%TTYINI: End of >
	MOVEI A,.PRIOU
	HLRZ B,CMJFNS
	SETZ C,
	JFNS%
	 JCERR<>
	TMSG <
>
	CALL TAKFIN
	JRST COMLOP

DOCFM:	MOVEI B,COMCFM
DOCOM:	MOVEI A,CMSTAT
	COMND%
	 ERJMP R
	TXNE A,CM%NOP
	RET
	RETSKP

COMERR:	CALL ERRET
	JRST COMLOP

ERRET:	JSERR <TTYINI: Command error>
	RET

ERRDO:	SKIPN CMJFNS
	RET
	TMSG <%TTYINI: Error reading >
	MOVEI A,.PRIOU
	HLRZ B,CMJFNS
	SETZ C,
	JFNS%
	 JCERR<>
	TMSG <, command file input terminated.
>
	CALL TAKFIN
	JRST ERRDO

TAKFIN:	HLRZ A,CMJFNS
	MOVE B,CMJFNP
	POP B,CMJFNS
	MOVEM B,CMJFNP
	CLOSF%
	 JCERR <TTYINI: Error closing command file>
	RET

CLEAN:	SKIPG OJFN
	JRST CLEAN1
	MOVX A,CZ%ABT
	HRR A,OJFN
	CLOSF%
	 JFCL
	SETOM OJFN
CLEAN1:	HRROI A,[0]
	RSCAN
	 ERJMP .+1
	MOVX A,CZ%NCL!FLD(.FHSLF,CZ%PRH)
	CLZFF%
	 JCERR <TTYINI: Failed to release unopened JFNs>
	RET

VERPNT:	HRROI B,[ASCIZ /TTYINI version /]
	SETZ C,
	SOUT%
	LDB B,[POINT 9,JOBVER,11]	;MAJOR
	MOVEI C,10
	NOUT%
	 JCERR
	LDB B,[POINT 6,JOBVER,17]	;MINOR
	JUMPE B,NOMINR
	SUBI B,1
	IDIVI B,^D26
	JUMPE B,NOMINF
	MOVEI B,"A"-1(B)
	BOUT%
NOMINF:	MOVEI B,"A"(C)
	BOUT%
NOMINR:	HRRZ C,JOBVER			;EDIT
	JUMPE C,NOEDIT
	MOVEI B,"("
	BOUT%
	MOVE B,C
	MOVEI C,10
	NOUT%
	 JCERR
	MOVEI B,")"
	BOUT%
NOEDIT:	LDB C,[POINT 3,JOBVER,2]
	JUMPE C,NOGRP
	MOVEI B,"-"
	BOUT%
	MOVE B,C
	MOVEI C,10
	NOUT%
	 JCERR
NOGRP: 	HRROI B,[ASCIZ /, /]
	SETZ C,
	SOUT%
	HRROI B,[DATE]
	SOUT%
	HRROI B,[ASCIZ /
/]
	SOUT%
	RET

COMEND:	SKIPL EXITF
	HALTF%
	JRST COMLOP
SUBTTL	COMMAND HANDLERS
$DTYPE:	TXNN A,CM%SWT
	JRST [	TMSG <?TTYINI: No colon following /DEFAULT-TYPE
>
		RET]
	FIELD(COMDTY,R)
	HRRZ B,(B)
	CHECK DTYPE,DEFAULT-TYPE
	MOVEM B,DTYPE
	JRST CRET

SETTYP:	CHECK TYPE,TYPE
	MOVEM B,TYPE
	JRST CRET

$EXIT:	SKIPE FILEF
	JRST [	SETZM EXITS
		RETSKP]
	CHECK EXITF,EXIT
	SETZM EXITF
	RETSKP

$ASS:	CHECK ASSF,ASSIGN
	SETZM ASSF
	RETSKP

%FLAG:	TDZA A,A
$FLAG:	MOVEI A,1
	CHECK FLAGF,FLAG-UPPERCASE
	MOVEM A,FLAGF
	SETZM RFCHNG
	JRST CRET

%FORM:	TDZA A,A
$FORM:	MOVEI A,1
	CHECK FORMF,FORMFEED
	MOVEM A,FORMF
	SETZM RFCHNG
	JRST CRET

$LIST:	SKIPE FILEF
	JRST [	SETZM LISTS
		RETSKP]
	CHECK LISTF,LIST
	SETZM LISTF
	RETSKP

$HELP:	TXNN A,CM%SWT
	JRST [	MOVEI B,.CTTRM	;DEFAULT TO TERMINAL IF NO ":"
		JRST $HELP1]
	MOVE A,[HLPBLK,,HLPLEN]
	CALL FILINI
	FIELD(HLPFIL)
	SKIPN FILEF
	JRST $HELP1
	HRRZ A,B
	RLJFN%
	 JFCL
$HELP1:	CHECK OJFN,HELP
	HRRZM B,OJFN
	RETSKP

$LINE:	TXNN A,CM%SWT
	JRST [	TMSG <?TTYINI: No colon following /LINE
>
		RET]
	FIELD(COMDEV,R)
	CHECK LINE,LINE
	HRRZ C,C
	CAIE C,TTYOCT
	JRST $LINED
	CAIL B,10000		;LEGAL LINE?
	JRST LINER1		;NO
	HRLI B,.DVTTY!.DVDES
	MOVEI A,.NULIO
	DEVST%			;TRY TO CONVERT AS TERMINAL
	 ERJMP LINER1		;ERROR IF CAN'T CONVERT
$LINOK:	SETZM LINE		;FLAG /LINE
	HRRZM B,OURLIN
	TRO B,.TTDES
	HRRZM B,TTYDES
	RETSKP

$LINED:	HLRZ A,B		;GET DEVICE DESIGNATOR PART
	CAIN A,.DVTTY!.DVDES	;TERMINAL?
	JRST $LINOK
	TMSG <?TTYINI: Illegal device in /LINE:, must be terminal.
>
	RET

LINER1:	TMSG <?TTYINI: Illegal line number in /LINE:, not a legal line.
>
	RET

$LENGT:	TXNN A,CM%SWT
	JRST [	TMSG <?TTYINI: No colon following /LENGTH
>
		RET]
	FIELD(COMNUM,R)
	CHECK LENGTH,LENGTH
	MOVEM B,LENGTH
	JRST CRET

%LOWER:	TDZA A,A
$LOWER:	MOVEI A,1
	CHECK LOWERF,LOWERCASE
	MOVEM A,LOWERF
	SETZM RFCHNG
	JRST CRET

$XXX52:	MOVEI A,WVT52
	JRST $XXXXX

$XXX10:	MOVEI A,WVT100
	JRST $XXXXX

$XXX12:	MOVEI A,WVT102
	JRST $XXXXX

$XXX20:	MOVEI A,WVT200
	JRST $XXXXX

$XXXXX:	SKIPL VTXXXF
	JRST [	SKIPE FILEF
		RETSKP
		TMSG <?TTYINI: Cannot give /VTXXX-type more than once
>
		RET]
	MOVEM A,VTXXXF
	JRST CRET

%PGSPD:	TXNN A,CM%SWT
	JRST [	TMSG <?TTYINI: No colon following /NOPAGE-SPEED
>
		RET]
	FIELD(COMSPD,R)		;GET SPEED
	CHECK NSPEED,NOPAGE-SPEED
	HRRZ B,(B)		;GET VALUE
	MOVEM B,NSPEED		;AND SAVE HERE
	JRST CRET

%PAUSE:	TDZA A,A
$PAUSE:	MOVEI A,1
	CHECK PAUSEF,PAUSE-AT-END-OF-PAGE
	MOVEM A,PAUSEF
	SETZM RFCHNG
	JRST CRET		;NO, DONE

%PAUSC:	TDZA A,A
$PAUSC:	MOVEI A,1
	CHECK PAUSCF,PAUSE-ON-COMMAND
	MOVEM A,PAUSCF
	SETZM RFCHNG
	JRST CRET		;NO, DONE

%RAISE:	TDZA A,A
$RAISE:	MOVEI A,1
	CHECK RAISEF,RAISE-INPUT
	MOVEM A,RAISEF
	SETZM RFCHNG
	JRST CRET

%ADVIC:	TDZA A,A
$ADVIC:	MOVEI A,1
	CHECK AADFLG,ADVICE-ACCEPT
	MOVEM A,AADFLG
	SETZM TLKFLG
	JRST CRET

$CHECK:	MOVEI A,-1
	MOVEM A,TYPE
	JRST CRET

%LINK:	TDZA A,A
$LINK:	MOVEI A,1
	CHECK ALKFLG,LINK-ACCEPT
	MOVEM A,ALKFLG
	SETZM TLKFLG
	JRST CRET

$SPEED:	TXNN A,CM%SWT
	JRST [	TMSG <?TTYINI: No colon following /SPEED
>
		RET]
	FIELD(ISPEED,ERRET)
	HRRZ D,(B)
	HRL D,D
	FIELD(COLON,GOTSPD)
	FIELD(OSPEED,ERRET)
	CHECK SPDFLG,SPEED
	HRR D,(B)
GOTSPD:	CHECK SPDWRD,SPEED
	MOVEM D,SPDWRD
	SETZM SPDFLG
	JRST CRET

%AUTO:	TDZA A,A
$AUTO:	MOVEI A,1
	CHECK RMTFLG,AUTO
	MOVEM A,AUTFLG
	SETZM SPDFLG
	JRST CRET

$CHAR:	CHECK CHARF,CHAR
	SETZM CHARF
	JRST CRET

%REMOT:	TDZA A,A
$REMOT:	MOVEI A,1
	CHECK RMTFLG,REMOTE
	MOVEM A,RMTFLG
	SETZM SPDFLG
	JRST CRET

%INDFF:	TDZA A,A
$INDFF:	MOVEI A,1
	CHECK INDFFF,INDICATE-FORMFEED
	MOVEM A,INDFFF
	JRST CRET

%TAB:	TDZA A,A
$TAB:	MOVEI A,1
	CHECK TABF,TAB
	MOVEM A,TABF
	SETZM RFCHNG
	JRST CRET

$WIDTH:	TXNN A,CM%SWT
	JRST [	TMSG <?TTYINI: No colon following /WIDTH
>
		RET]
	FIELD(COMNUM,R)
	CHECK WIDTH,WIDTH
	MOVEM B,WIDTH
	JRST CRET

$FULL:	MOVEI A,.TTFDX
	JRST DODUM

$HALF:	MOVEI A,.TTHDX
DODUM:	CHECK LINEF,DUPLEX
	MOVEM A,LINEF
	SETZM RFCHNG
	JRST CRET

%INHIB:	SKIPA A,[0]
$INHIB:	MOVEI A,1
	CHECK INHFLG,INHIBIT
	MOVEM A,INHFLG
	JRST CRET

%USRMS:	SKIPA A,[0]
$USRMS:	MOVEI A,1
	CHECK USRFLG,USER-MESSAGES
	MOVEM A,USRFLG
	JRST CRET

%SYSMS:	SKIPA A,[.MOSMN]
$SYSMS:	MOVEI A,.MOSMY
	CHECK MSGFLG,SYSTEM-MESSAGES
	MOVEM A,MSGFLG
	JRST CRET

%IGNOR:	TDZA A,A
$IGNOR:	MOVEI A,1
	CHECK IGNFLG,IGNORE-INPUT
	MOVEM A,IGNFLG
	JRST CRET

%FILE:	SETZ B,
	JRST GFILE

$FILE:	TXNN A,CM%SWT
	JRST [	SETO B,		;WON'T CHANGE FILE STATUS, WILL SET CHANGE
		JRST GFILE]
	MOVE A,[FILBLK,,FILLEN]
	CALL FILINI
	FIELD(COMFIL,R)
GFILE:	CHECK FJFN,FILE
	MOVEM B,FJFN
CRET:	AOS CHANGE
	RETSKP
SUBTTL	COMMAND EXECUTION
COMDON:	SKIPG A,OJFN
	JRST NOHELP
	CAIN A,.CTTRM		;CONTROLLING TERMINAL?
	JRST HELP1		;YES, DON'T NEED TO OPEN
	MOVX B,<FLD(7,OF%BSZ)!OF%WR>
	OPENF%
	 ERJMP [JSERR <TTYINI: OPENF failed for /HELP output file>
		JRST COMLOP]
HELP1:	CALL VERPNT
	HRRZ A,OJFN
	HRROI B,HLPMES
	SETZ C,
	SOUT%
	CAIN A,.CTTRM		;CONTROLLING TERMINAL?
	JRST NOHELP		;YES, DON'T CLOSE IT
	CLOSF%
	 JCERR <TTYINI: Failed to close /HELP output file>
NOHELP:	MOVNI A,1		;ELSE GET OUR LINE
	MOVE B,[1,,3]
	MOVEI C,.JITNO
	GETJI%
	 JSHLT
	MOVEM C,OWNLIN
	MOVNI A,1
	MOVE B,[1,,3]
	MOVEI C,.JIJNO
	GETJI%
	 JSHLT
	MOVEM C,OWNJOB
	SKIPL LINE		;DID USER SPECIFY /LINE:n?
	JRST GOTLIN		;YES, USE IT
	MOVE C,OWNLIN
	MOVEM C,OURLIN		;DEFAULT LINE TO USE
	TRO C,.TTDES
	MOVEM C,TTYDES
GOTLIN:	SKIPE ASSF		;REQUESTING ASSIGNMENT?
	JRST NOASS
	MOVE A,TTYDES		;GET DEVICE DESIGNATOR
	ASND%
	 JWERR <TTYINI: Failed to assign terminal>
NOASS:	SETZ F,			;INIT FLAGS
	MOVE A,OURLIN
	CAMN A,OWNLIN
	JRST [	TXO F,TTYOWN	;WE OWN IT
		JRST DOLINB]
	TMSG <Processing >
	MOVEI A,.PRIOU
	MOVE B,TTYDES
	DEVST%
	 JCERR <TTYINI: Failed to output terminal device name>
	TMSG <:>
	MOVE A,TTYDES
	HRROI B,D
	MOVEI C,.JIJNO
	GETJI%
	 ERJMP [MOVEI A,.FHSLF
		GETER%
		HRRZ B,B
		CAIN B,GTABX3
		JRST DOLINA
		JSERR <TTYINI: GETJI failed for terminal's job number>
		JRST DOLINA]
	CAMN D,[-1]
	JRST [	TMSG <, not in use.>
		TXO F,TTYINA		;FLAG INACTIVE
		JRST DOLINA]
	TMSG <, Job >
	MOVEI A,.PRIOU
	HRRZ B,D
	CAMN B,OWNJOB			;OWNED BY US?
	TXOA F,TTYOWN			;YES
	TXO F,TTYASG			;NO
	MOVEI C,^D10
	NOUT%
	 JCERR <>
	HRROI A,[ASCIZ / (Controlling terminal)./]
	TXNE D,TTYASN
	HRROI A,[ASCIZ / (Assigned)./]
	PSOUT%
DOLINA:	TMSG <
>
DOLINB:	MOVEI A,.FHSLF
	RPCAP%
	TXNE C,SC%WHL!SC%OPR
	TRO F,WHOPR		;FLAG WHEEL OR OPR
	SKIPG CHANGE
	JRST CHKLST
	TXNE F,TTYASG
	TXNE F,WHOPR
	CAIA
	JRST [	TMSG <%TTYINI: Cannot set terminal parameters, terminal is owned by someone else.
>
		JRST CHKLST]
	SETOM FILEF		;NOW READING FILE
FILCHK:	MOVE A,TYPE		;SEE IF NEED CHECK NOW
	CAIN A,-1
	JRST [	CALL DOCHK
		SKIPN TYPE
		JRST NOSTYP
		SKIPL TYPE	;STILL UNKNOWN?
		JRST COMXCT	;NOPE, NO FILE PLEASE
		JRST CKFILE]
CKFILE:	SKIPLE A,FJFN
	JRST FILGOT		;WE HAVE AN EXPLICIT FILE
	JUMPE A,COMXCT		;JUMP IF EXPLICIT NOFILE
	SKIPGE TYPE		;DEFAULT SEARCH ONLY IF NO TYPE
	SKIPL FILEF		;TRIED YET?
	JRST COMXCT		;YES, NO MORE
	MOVEI A,1
	MOVEM A,FILEF		;FLAG TRYING DEFAULT FILE
	MOVX A,GJ%OLD!GJ%SHT
	HRROI B,[ASCIZ /SYSTEM:TTYINI.CMD/]
	GTJFN%
	 JRST [	JSERR(<TTYINI: Can't get SYSTEM:TTYINI.CMD:>,%)
		JRST COMXCT]
FILGOT:	HRRZM A,IJFN
	MOVX B,FLD(7,OF%BSZ)!OF%RD
	OPENF%
	 JRST [	TMSG <
?TTYINI: Can't open >
		MOVEI A,.PRIOU
		MOVE B,IJFN
		SETZ C,
		JFNS%
		 ERCAL R
		TMSG < because: >
		CALL JSERR0
		JRST COMLOP]
	SETOM FJFN
	MOVE A,[DATABG,,TMPARG]	;SAVE USER ARGS
	BLT A,TMPARG+DATALN-1
FILLOP:	HRROI A,CMBUF
	MOVEI B,.NULIO
	HRL B,IJFN
	CALL DOINI
	CALL CLEAN		;CLEAN UP LAST SCAN
	SETOM EXITS
	SETOM HELPS
	SETOM LINES
	SETOM LISTS
	MOVE A,[TMPARG,,DATABG]
	BLT A,DATABG+DATALN-1
	FIELD(COMLIN,FILERR)
	HRRZ C,C
	CAIN C,COMSTR
	JRST ISOURS		;* ALWAYS MATCHES
	CAIE C,COMOCT
	JRST FILLOP		;IGNORE BLANK LINES
	CAMN B,OURLIN		;FIND OUR LINE?
	JRST ISOURS		;YES
FILERR:	MOVEI A,.FHSLF
	GETER%
	HRRZ B,B
	CAIE B,IOX4
	 CAIN B,COMNX9		;EOF?
	  JRST FILNON		;YES, NONE FOUND
	FIELD(COMEOL,FILLOP)	;EAT LINE TO IGNORE
	JRST FILLOP

ISOURS:	FIELD(COMAND,TRMERR)
	HRRZ B,(B)
	MOVE D,B
	HRRZ C,C
	CAIN C,COMAND
	JRST FILDON		;CONFIRMED
	CAIN C,COMTYP
	MOVEI D,SETTYP
	CALL (D)
	 JRST TRMERR
	JRST ISOURS

TRMERR:	JSERR <TTYINI: Command error in file>
	TMSG <Will ignore terminal data line and continue scan
>
	JRST FILERR

FILNON:	MOVE A,[TMPARG,,DATABG]
	BLT A,DATABG+DATALN-1
	JRST FILDN1

FILDON:	HRROI A,[ASCIZ \%TTYINI: Ignoring /EXIT from file
\]
	SKIPL EXITS
	PSOUT%
	HRROI A,[ASCIZ \%TTYINI: Ignoring /HELP from file
\]
	SKIPL HELPS
	PSOUT%
	HRROI A,[ASCIZ \%TTYINI: Ignoring /LINE:n from file
\]
	SKIPL LINES		;DID USER SPECIFY LINE?
	PSOUT%
	HRROI A,[ASCIZ \%TTYINI: Ignoring /LIST from file
\]
	SKIPL LISTS		;DID USER SPECIFY /LIST?
	PSOUT%
FILDN1:	MOVE A,IJFN
	CLOSF%
	 JCERR <TTYINI: CLOSF failed>
	JRST FILCHK

COMXCT:	SKIPL B,TYPE
	JRST DOSTYP
	SKIPGE B,DTYPE		;DEFAULT?
	JRST NOSTYP
	MOVEM B,TYPE		;YES, SET AS TYPE
	CAIN B,-1
	CALL DOCHK
	SKIPN TYPE
	JRST NOSTYP
	SKIPGE B,TYPE
	JRST NOSTYP
DOSTYP:	CALL (B)
	TXNE F,TTYINA
	JRST [	TMSG <%TTYINI: Cannot set some paramters, line is not active.
>
		JRST NOTLNK]
	TXNE F,TTYASG
	JRST [	TMSG <%TTYINI: Cannot set terminal type, terminal is owned by someone else.
>
		JRST NOSTYP]
	MOVE A,TTYDES
	STTYP%
	 JCERR <TTYINI: STTYP failed>
NOSTYP:	SKIPGE RFCHNG
	 JRST NODORF
	TXNE F,TTYINA
	JRST [	TMSG <%TTYINI: Cannot set some paramters, line is not active.
>
		JRST NOTLNK]
	MOVE A,TTYDES
	RFMOD%
	 JWERR <TTYINI: Failed to read terminal data to set new status>,NODORF
	SKIPN LOWERF
	TXZ B,TT%LCA
	SKIPLE LOWERF
	TXO B,TT%LCA
	SKIPN FORMF
	TXZ B,TT%MFF
	SKIPLE FORMF
	TXO B,TT%MFF
	SKIPN TABF
	TXZ B,TT%TAB
	SKIPLE TABF
	TXO B,TT%TAB
	SKIPN FLAGF
	TXZ B,TT%UOC
	SKIPLE FLAGF
	TXO B,TT%UOC
	SKIPN RAISEF
	TXZ B,TT%LIC
	SKIPLE RAISEF
	TXO B,TT%LIC
	SKIPL C,LINEF
	STOR C,TT%DUM,B
IFNDEF .MOXOF,<
	SKIPN PAUSEF
	TXZ B,TT%PGM
	SKIPLE PAUSEF
	TXO B,TT%PGM
>;IFNDEF .MOXOF
IFDEF .MOXOF,<
	SKIPN PAUSCF
	TXZ B,TT%PGM
	SKIPLE PAUSCF
	TXO B,TT%PGM
>;IFDEF .MOXOF
	STPAR%
	 JWERR <TTYINI: Failed to set new terminal mode data>
NODORF:	SKIPGE C,LENGTH
	 JRST NOLEN
	MOVE A,TTYDES
	MOVEI B,.MOSLL
	MTOPR%
	 JWERR <TTYINI: Failed to set LENGTH>
NOLEN:	SKIPGE C,WIDTH
	 JRST NOWID
	MOVE A,TTYDES
	MOVEI B,.MOSLW
	MTOPR%
	 JWERR <TTYINI: Failed to set WIDTH>
NOWID:
IFDEF .MOXOF,<
	SKIPGE PAUSEF
	 JRST NOXOF
	MOVE A,TTYDES
	MOVEI B,.MOXOF
	MOVEI C,.MOONX
	SKIPN PAUSEF
	MOVEI C,.MOOFF
	MTOPR%
	 JWERR <TTYINI: Failed to set PAUSE-AT-END-OF-PAGE>
NOXOF:
>;IFDEF .MOXOF
	SKIPGE INDFFF		;CHANGING STATE OF INDICATE FORMFEED?
	 JRST NOIFF		;NO
	SKIPE D,INDFFF		;REQUESTING INDICATE?
	JRST [	MOVX D,1B<^D12*2+1>	;YES, SET TO THIS VALUE
		JRST DOIFF]
	MOVE A,TTYDES		;ELSE WE MUST CHECK IF FORMFEEDS ON TERMINAL
	RFMOD%
	 JWERR <TTYINI: Failed to read terminal data for setting
 NOINDICATE-FORMFEED status>,NOIFF
	TXNE B,TT%MFF		;MECH. FORMFEED?
	SKIPA D,[2B<^D12*2+1>]	;YES, SEND FF
	MOVX D,3B<^D12*2+1>		;NO, SIMULATE
DOIFF:	MOVE A,TTYDES
	RFCOC%			;READ CURRENT SETTINGS
	 JWERR <TTYINI: Failed to read terminal data for setting
 INDICATE-FORMFEED>,NOIFF
	TXZ B,3B<^D12*2+1>
	TDO B,D			;SET NEW STATE
	SFCOC%
	 JWERR <TTYINI: Failed to set control character output control words for
 INDICATE-FORMFEED>
NOIFF:	SKIPGE TLKFLG
	 JRST NOTLNK
	MOVE A,TTYDES
	SKIPL AADFLG
	TXO A,TL%STA
	SKIPLE AADFLG
	TXO A,TL%AAD
	SKIPL ALKFLG
	TXO A,TL%SAB
	SKIPLE ALKFLG
	TXO A,TL%ABS
	TLINK%
	 JCERR <TTYINI: Failed to set state of LINK-ACCEPT and/or ADVICE-ACCEPT>
NOTLNK:	SKIPGE MSGFLG
	 JRST NOSYSM
	MOVE A,TTYDES
	MOVEI B,.MOSNT
	MOVE C,MSGFLG
	MTOPR%
	 JWERR <TTYINI: Failed to set SYSTEM-MESSAGES>
NOSYSM:	SKIPGE USRFLG
	JRST NOUSR
	MOVE A,TTYDES
	MOVEI B,.MORTF
	MTOPR%
	 JWERR <TTYINI: Failed to read USER-MESSAGES flag>,NOUSR
	MOVX D,MO%NUM
	ANDCAM D,C
	SKIPN USRFLG
	OR C,[MO%NUM]
	MOVEI B,.MOSTF
	MTOPR%
	 JWERR <TTYINI: Failed to set USER-MESSAGES>
	
NOUSR:	SKIPGE INHFLG
	JRST NOINH
	MOVE A,TTYDES
	MOVEI B,.MORTF
	MTOPR%
	 JWERR <TTYINI: Failed to read INHIBIT flag>,NOINH
	MOVX D,MO%NTM
	ANDCAM D,C
	SKIPE INHFLG
	OR C,[MO%NTM]
	MOVEI B,.MOSTF
	MTOPR%
	 JWERR <TTYINI: Failed to set INHIBIT>
	
NOINH:	SKIPGE IGNFLG
	 JRST NOIGNR
	MOVE A,TTYDES
	MOVEI B,.MOSIG
	MOVE C,IGNFLG
	MTOPR%
	 JWERR <TTYINI: Failed to set IGNORE-INPUT>
NOIGNR:	SKIPGE SPDFLG
	 JRST NOSPD
	MOVE A,TTYDES
	MOVEI B,.MORSP
	MTOPR%
	 JWERR <TTYINI: Failed to read current SPEED and REMOTE status>,NOSPD
	SKIPL RMTFLG
	TXZ B,MO%RMT
	SKIPLE RMTFLG
	TXO B,MO%RMT
	SKIPL AUTFLG
	TXZ B,MO%AUT
	SKIPLE AUTFLG
	TXO B,MO%AUT
	HRRI B,.MOSPD
	SKIPL SPDWRD
	MOVE C,SPDWRD
	MTOPR%
	 JWERR <TTYINI: Failed to set SPEED and REMOTE status>
NOSPD:	SKIPGE NSPEED		;SPEED TO CUT-OFF AT SPECIFIED?
	 JRST CHKLST
	MOVE A,TTYDES
	MOVEI B,.MORSP
	MTOPR%
	 JWERR <TTYINI: Failed to read SPEED for NOPAGE-SPEED check>,CHKLST
	CAMN C,[-1]
	JRST CHKLST
	HRRZ C,C		;GET OUTPUT SPEED
	CAMLE C,NSPEED		;SPECIFIED SPEED LESS THAN ACTUAL?
	JRST CHKLST		;YES, LEAVE PAGE MODE ON
	MOVE A,TTYDES
	MOVEI B,.MOXOF
	MOVEI C,.MOOFF
	MTOPR%
	 JWERR <TTYINI: Failed to set NOPAUSE-AT-END-OF-PAGE for NOPAGE-SPEED>
CHKLST:	SKIPE LISTF
	JRST COMEND
	TXNN F,WHOPR		;CAN WE GET THIS DATA?
	 JRST LST2A		;Quietly skip IGNORE-INPUT state.
	SKIPL TTSTAT
	JRST GOTADR
	MOVEI A,.SNPSY
	MOVE B,[SQUOZE 0,TTSTAT]
	SETZ C,
	SNOOP%
	 ERJMP [JSERR <TTYINI: Failed to find address of system table to obtain IGNORE-INPUT state>
		JRST LST2A]
	HRRZM B,TTSTAT
GOTADR:	MOVE A,OURLIN
	ADD A,TTSTAT
	HRLI A,1
	MOVEI B,C
	PEEK%
	 ERJMP [JSERR <TTYINI: Failed to read table word containing IGNORE-INPUT state>
		JRST LST2A]
	TMSG < />
	HRROI A,[ASCIZ /NO/]
	TXNN C,TT%IGI
	PSOUT%
	TMSG <IGNORE-INPUT
>
LST2A:	TXNE F,TTYASG
	TXNE F,WHOPR
	CAIA
	JRST [	TMSG <%TTYINI: Cannot read terminal SPEED, WIDTH, PAUSE-AT-END-OF-PAGE
 or REMOTE status, terminal is owned by someone else.
>
		JRST LST2]
	MOVE A,TTYDES
	MOVEI B,.MORSP
	MTOPR%
	 JWERR <TTYINI: Failed to read SPEED and REMOTE status for /LIST>,LST1
	MOVEM B,TMP1
	MOVEM C,TMP2
	TXNE B,MO%AUT
	JRST [	TMSG < /SPEED:AUTO-BAUD>
		JRST LST1A]
	TMSG < /SPEED:>
	HLRE B,TMP2
	JUMPL B,[TMSG <Unknown>
		JRST LST1B]
	CALL DECOUT
LST1B:	HRRE B,TMP2
	HLRE C,TMP2
	CAMN C,B
	JRST LST1A
	TMSG <:>
	JUMPL B,[TMSG <Unknown>
		JRST LST1A]
	CALL DECOUT
LST1A:	TMSG <
>
	MOVE B,TMP1
	HRROI A,[ASCIZ \ /REMOTE
\]
	TXNE B,MO%RMT
	PSOUT%
LST1:	MOVE A,TTYDES
	MOVEI B,.MORTF
	MTOPR%
	 JWERR <TTYINI: Failed to read INHIBIT and USER-MESSAGES for /LIST>,LSTZ
	TMSG < />
	HRROI A,[ASCIZ /NO/]
	TXNE C,MO%NUM
	PSOUT%
	TMSG <USER-MESSAGES
>
	TMSG < />
	HRROI A,[ASCIZ /NO/]
	TXNN C,MO%NTM
	PSOUT%
	TMSG <INHIBIT
>

LSTZ:	MOVE A,TTYDES
	MOVEI B,.MORNT
	MTOPR%
	 JWERR <TTYINI: Failed to read SYSTEM-MESSAGES status for /LIST>,LST2
	TMSG < />
	HRROI A,[ASCIZ /NO/]
	CAIE C,.MOSMY
	PSOUT%
	TMSG <SYSTEM-MESSAGES
>
LST2:	TXNE F,TTYINA		;CANNOT READ THIS FOR INACTIVE LINE
	JRST [	TMSG <%TTYINI: Cannot read remainder of terminal data, line is not active.
>
		JRST COMEND]
	MOVE A,TTYDES
	GTTYP%
	 JWERR <TTYINI: Failed to read terminal type for /LIST>,LST2D
	SKIPL B
	CAILE B,TYPLEN
	MOVEI B,TYPLEN
	TMSG < TERMINAL TYPE: >
	SKIPE A,TYPTAB(B)
	JRST LST2E
	MOVEI A,.PRIOU
	MOVEI C,10
	NOUT%
	 JCERR <>
	HRROI A,[ASCIZ / (Octal)/]
LST2E:	PSOUT%
	TMSG <
>
LST2D:	MOVE A,TTYDES
	RFMOD%
	 JWERR <TTYINI: Failed to read terminal mode data for /LIST>,LST2B
	MOVE D,B
	TMSG < />
	HRROI A,[ASCIZ /NO/]
	TXNN D,TT%PGM
	PSOUT%
	TMSG <PAUSE-ON-COMMAND
 />
	HRROI A,[ASCIZ /NO/]
	TXNN D,TT%ALK
	PSOUT%
	TMSG <LINK-ACCEPT
 />
	HRROI A,[ASCIZ /NO/]
	TXNN D,TT%AAD
	PSOUT%
	TMSG <ADVICE-ACCEPT
 />
	HRROI A,[ASCIZ /NO/]
	TXNN D,TT%MFF
	PSOUT%
	TMSG <FORMFEED
 />
	HRROI A,[ASCIZ /NO/]
	TXNN D,TT%TAB
	PSOUT%
	TMSG <TAB
 />
	HRROI A,[ASCIZ /NO/]
	TXNN D,TT%LCA
	PSOUT%
	TMSG <LOWERCASE
 />
	HRROI A,[ASCIZ /NO/]
	TXNN D,TT%UOC
	PSOUT%
	TMSG <FLAG-UPPERCASE
 />
	HRROI A,[ASCIZ /NO/]
	TXNN D,TT%LIC
	PSOUT%
	TMSG <RAISE-INPUT
 />
	LOAD C,TT%DUM,D
	HRROI A,[ASCIZ /UNKNOWN/]
	CAIN C,.TTFDX
	HRROI A,[ASCIZ /FULL/]
	CAIN C,.TTHDX
	HRROI A,[ASCIZ /HALF/]
	CAIN C,.TTLDX
	HRROI A,[ASCIZ /LINE-HALF/]
	PSOUT%
	TMSG <DUPLEX
>
LST2B:	MOVE A,TTYDES
	RFCOC%
	 JWERR <TTYINI: Failed to read terminal data for INDICATE-FORMFEED for /LIST>,LST2C
	LDB B,[POINT 2,B,^D12*2+1]
	TMSG < />
	HRROI A,[ASCIZ /NO/]
	CAIN B,2
	PSOUT%
	TMSG <INDICATE-FORMFEED
>
LST2C:	TXNE F,TTYASG
	TXNE F,WHOPR
	CAIA
	JRST COMEND
	MOVE A,TTYDES
	MOVEI B,.MORLW
	MTOPR%
	 JWERR <TTYINI: Failed to read WIDTH for /LIST>,LST3
	TMSG < /WIDTH:>
	MOVE B,C
	CALL DECOUT
	TMSG <
>
LST3:	MOVE A,TTYDES
	MOVEI B,.MORLL
	MTOPR%
	 JWERR <TTYINI: Failed to read WIDTH for /LIST>,LST4
	TMSG < /LENGTH:>
	MOVE B,C
	CALL DECOUT
	TMSG <
>
LST4:	MOVE A,TTYDES
	MOVEI B,.MORXO
	MTOPR%
	 JWERR <TTYINI: Failed to read PAUSE-AT-END-OF-PAGE status for /LIST>,COMEND
	TMSG < />
	HRROI A,[ASCIZ /NO/]
	SKIPN C
	PSOUT%
	TMSG <PAUSE-AT-END-OF-PAGE
>
	JRST COMEND

DEFINE TYP(NAME)<-1,,[ASCIZ /NAME/]>

TYPTAB:	LDBLK(<<.TT33,TYP 33>,<.TT35,TYP 35>,<.TT37,TYP 37>,<.TTEXE,TYP EXECUPORT>,<.TTDEF,TYP SYSTEM-DEFAULT>,<.TTIDL,TYP IDEAL>,<.TTV05,TYP VT05>,<.TTV50,TYP VT50>,<.TTL30,TYP LA30>,<.TTG40,TYP GT40>,<.TTL36,TYP LA36>,<.TTV52,TYP VT52>,<.TT100,TYP VT100






























>,<.TTL38,TYP LA38>,<.TT120,TYP LA120>,<.TT125,TYP VT125>,<.TTK10,TYP VK100>,<.TT102,TYP VT102>,<.TTH19,TYP H19>,<.TT131,TYP VT131>,<.TT200,TYP VT200-SERIES>>)
	0
TYPLEN==.-TYPTAB
SUBTTL	HELP TEXT
HLPMES:	ASCIZ \
TTYINI sets the monitor's terminal type and terminal parameters.
By default, TYYINI reads the necessary information from the file
SYSTEM:TTYINI.CMD. You may selectively override any or all of the
values contained in the file or you may request that TTYINI determine
the terminal type by querying the terminal itself.
By default TTYINI sets terminal parameters for the current job; however,
TTYINI may be used to setup parameters for another job or line by
using the /LINE: switch (see description below).

The command format is an optional terminal type name followed by
optional switches.

Available terminal type names:

33		Model 33 hardcopy terminal.
35		Model 35 hardcopy terminal.
37		Model 37 hardcopy terminal.
CHECK		Synonym for INQUIRE.
CT		DEC CT terminal in VT100 mode.
CTRO		DEC CT Receive-Only printer.
DEFAULT		System default terminal type.
EP1		DEC EP1 electronic printer.
EXECUPORT	Execuport terminal.
GIGI		DEC VK100 in VT100 terminal mode.
GT40		DEC GT40 graphics terminal.
IDEAL		Does no special character processing.
INQUIRE		Special type. When given, causes the terminal
		to be polled to determine type. If the type is
		successfully determined, reading of any file is
		suppressed.  A report is typed of the form:
		[Terminal type is ACTUAL(SET)]
		Where ACTUAL is the type of terminal and SET is the
		monitor terminal type set for the job.
		Batch jobs are reported as BATCH and no terminal
		parameters are set. Jobs on PTYs are reported as PTY
		and no terminal parameters are set. The terminal
		connected to DECtalk is properly queried.
LA12		DEC LA12 terminal.
LA120		DEC LA120 terminal.
LA180		DEC LA180 terminal.
LA24		DEC LA24 terminal.
LA30		DEC LA30 terminal.
LA34		DEC LA34 terminal.
LA36		DEC LA36 terminal.
LA38		DEC LA38 terminal.
LA80		DEC LA80 terminal.
LQP02		DEC LQP02 terminal.
LQPSE		DEC LQPSE-F terminal.
TI		Same as EXECUPORT.
VT05		DEC VT05 video terminal.
VT100		DEC VT100 video terminal.
VT102		DEC VT102 video terminal.
VT125		DEC VT125 video terminal.
VT131		DEC VT131 video terminal.
VT132		DEC VT132 video terminal.
VT200-SERIES	DEC VT200 class video terminal.
VT220		DEC VT220 video terminal.
VT240		DEC VT240 video terminal.
VT241		DEC VT241 video terminal.
VT278		DEC VT278 video terminal.
VT132		DEC VT132 video terminal.
VT50		DEC VT50 video terminal.
VT52		DEC VT52 video terminal.
VT55		DEC VT55 video terminal. (VT52 with printer)
VT61		DEC VT61 video terminal.
VT80		DEC VT80 video terminal.

The following switches may be given:

/ADVICE-ACCEPT	Set to accept advice from other users.
		This allows other users to type commands at
		your terminal using the "ADVISE" command.
/ASSIGN		Assign the controlling terminal or terminal
		specified with the /LINE: switch to this job.
/AUTO-BAUD	Set terminal speed to automatic baud rate detection.
		This can only be set by WHEEL or OPERATOR and is used
		on REMOTE lines.
/CHARACTERISTICS
		Used with INQUIRE. After the terminal type has been
		determined, query the terminal further and report all
		known terminal characteristics, such as Advanced Video
		Option for VT100s.
/CHECK		Same as INQUIRE.
/DEFAULT-TYPE:type-name
		If terminal type not specified, use this type.
/EXIT		Exit at end of command.
/FILE:filespec	Read "filespec" for terminal data by line number.
		If ":filespec" is omitted, the default file
		SYSTEM:TTYINI.CMD will be searched even if
		the specified line is not the controlling TTY.
/FLAG-UPPERCASE	Flag upper case output (precede by ').
/FORMFEED	Say terminal has hardware formfeed.
/FULLDUPLEX	Set terminal to FULL DUPLEX mode.
/HALFDUPLEX	Set terminal to CHARACTER HALF DUPLEX mode.
/HELP:filespec	Output this text to the specified filespec.
		If the "filespec" is omitted, TTY: is assumed.
		If a "filespec" is given, the default is TTYINI.HLP.
/IGNORE-INPUT	Set terminal to ignore ^C typed when not in use.
/INDICATE-FORMFEED
		Set to output ^L for formfeed character.
/INHIBIT	Inhibit non-job output on this terminal.
/INQUIRE	Same as INQUIRE.
/LENGTH:n	Set terminal length (lines per page) to "n".
/LINE:n		Set terminal to operate on to "TTYn". "n" is octal.
/LINE:dev:	Set terminal to operate on to device "dev".
		"dev" must be a terminal.
/LINK-ACCEPT	Set to accept links from other users.
		This allows other users to converse with
		your terminal using the "TALK" command.
/LIST		List setting of all monitor terminal parameters. An enabled
		WHEEL or OPERATOR can do this for a terminal assigned
		to another user as well as determine the state of the
		IGNORE-INPUT bit. A terminal which is not in use does
		not have some parameters set at all. A warning is
		printed in this case. Some parameters may be read
		by anyone even if the terminal is assigned to another
		user. You are informed when some information is not
		available and why.
		Use INQUIRE/CHARACTERISITICS to list the terminals parameters.
/LOWERCASE	Pass lower case characters to terminal.
/NOFILE		Never read a file.
/NOFLAG		Don't flag upper case output.
/NOFORMFEED	Simulate formfeed characters.
/NOINDICATE	Set to either pass formfeeds directly to terminal
		or simulate form action depending on /FORMFEED or
		/NOFORMFEED status respectively.
/NOINHIBIT	Allow non-job output on this terminal.
/NOLOWERCASE	Convert lower case to upper case on output.
/NOPAGE-SPEED:n
		The value "n" is the speed at or below which to
		disable /PAUSE-AT-END-OF-PAGE. If the speed
		of output from the computer to the terminal is
		higher than the specified speed, the /PAUSE-ON-
		END-OF-PAGE will be allowed either implicitly or
		explicitly. The following speeds are allowed:

		110	1200	134	150	1800	200
		2400	300	4800	50	600	75	9600

/NOPAUSE-AT-END-OF-PAGE
		Don't stop output when end of page is reached.
/NOPAUSE-ON-COMMAND
		Don't use ^S and ^Q to stop and start typeout on terminal.
/NORAISE-INPUT	Don't convert lower case to upper case on input.
/NOREMOTE	Set terminal to not be a REMOTE line. This enables the
		line for input even if carrier detect is not asserted.
/NOSYSTEM-MESSAGES
		Disable output of system wide message to this terminal.
/NOTAB		Simulate tab characters.
/NOUSER-MESSAGES
		Disable output of user messages to this terminal.
/PAUSE-AT-END-OF-PAGE
		Stop terminal output at end of page (when lines per
		page lines have been output). Type ^Q to cause output
		to continue. This feature is disabled if /PAUSE-ON-COMMAND
		is not enabled.
/PAUSE-ON-COMMAND
		Enable ^S to stop terminal output and ^Q to resume it.
/RAISE-INPUT	Convert lower case to upper case on input.
/REMOTE		Set terminal to not accept input unless carrier detect
		is asserted. This is used for dial-up lines.
/SPEED:in:out	Set terminal speed to those specified by "in" and "out".
		If "out" is omitted, it is assumed to be the same as "in".
		The following speeds are allowed:

		0	110	1200	134	150	1800	200
		2400	300	4800	50	600	75	9600

/SYSTEM-MESSAGES
		Allow output of system wide message to this terminal.
/TAB		Send tab characters directly to terminal.
/TAKE		Suppress %End of file message when the end of the
		current take file is reached.
/TAKE:		Take input from PS:<logged-in-directory>TTYINI.CMD.
/TAKE:filespec	Take command input from the specified file. When the
		end of file is reached the message:
			%End of filespec
		is printed and input returns to previous file or terminal.
		/TAKE: may appear in command files nested to a level of 20.
		The following switches are ignored in command files:
		/HELP, /LIST, /EXIT, and /LINE.
/USER-MESSAGES	Allow output of user messages to this terminal.
/VTXXX-52	Used in conjuction with INQUIRE option. If the terminal is
		successfully identified as a terminal with VT52 compatibility
		mode, it is switched to VT52 mode, if necessary, and the
		terminal type is set to VT52.
/VTXXX-100	Used in conjuction with INQUIRE option. If terminal is
		successfully identified as a terminal with VT100 compatibility
		mode, it is switched to VT100 mode, if necessary,  and the
		terminal type VT100 is set.
/VTXXX-102	Used in conjuction with INQUIRE option. If terminal is
		successfully identified as a terminal with VT102 compatibility
		mode, it is switched to VT102 mode, if necessary,  and the
		terminal type VT102 is set. If the terminal cannot act as a
		VT102, but can act as a VT100, then this switch will perform
		the same action as the VTXXX-100 switch.
/VTXXX-200	Used in conjuction with INQUIRE option. If terminal is
		successfully identified as a terminal with VT200 compatibility
		mode, it is switched to VT200 with 7-bit control mode, if
		necessary, and the VT200 terminal type is set.
		Note that the VT220 does not support this feature.
/WIDTH:n	Set terminal width to "n" characters.

If terminal type is not given and no /FILE:filespec or /NOFILE switches
but some parameter is being set, the file SYSTEM:TTYINI.CMD is read.
As a special case, the EXEC command "TTYINI" alone will cause this file
to be read as well. Each line of the file has the following format:

<line #> <same as TTYINI command line>

The <line #> indicates which line the command line applies to. A "*" in
place of the <line #> will cause that line to be used if the desired line
number has not yet been found. The file is parsed using the COMND JSYS.

Examples:

	TTYINI<cr>

Determine terminal data from SYSTEM:TTYINI.CMD by line number.

	TTYINI/INQUIRE/VTXXX-100/NOPAUSE-AT-END

Determine terminal type by querying the terminal. If the terminal is
VT100 compatible, set the monitor's terminal type to VT100. Do
not pause at end of page.

The following type names imply the indicated default switches
unless explicity overridden:


CT	VT100
CTRO	LA120
EP1	LA120
GIGI	VK100
GT40	/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE/LOWERCASE
LA12	LA120/FORMFEED/WIDTH:80
LA120	/NORAISE-INPUT/LOWERCASE
LA180	LA120/NORAISE-INPUT/NOTAB/LOWERCASE/NOPAUSE-AT-END-OF-PAGE
LA24	LA34
LA30	LA36
LA34	LA120/NORAISE-INPUT/NOFORMFEED/LOWERCASE
LA36	/NORAISE-INPUT/LOWERCASE
LA38	/NORAISE-INPUT/LOWERCASE
LA38	LA34
LA80	LA120
LQP02	LA12
LQPSE	LA34
VT05	/RAISE-INPUT/NOPAUSE-AT-END-OF-PAGE
VT100	/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE/LOWERCASE
VT102	/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE/LOWERCASE
VT125	/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE/LOWERCASE
VT131	/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE/LOWERCASE
VT132	VT131/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE/LOWERCASE
VT200	VT200/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE/LOWERCASE
VT220	VT200/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE/LOWERCASE
VT240	VT200/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE/LOWERCASE
VT241	VT200/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE/LOWERCASE
VT278	VT52
VT50	/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE
VT52	/NORAISE-INPUT/NOPAUSE-AT-END-OF-PAGE/LOWERCASE
VT55	VT52
VT61	VT52
VT61	VT52
VT80	VT100
\
SUBTTL	CHECK HANDLER, TYPE ROUTINES
DOCHK:	TXNE F,TTYINA	;CAN'T DO THIS IF INACTIVE
	JRST [	TMSG <%TTYINI: Cannot do CHECK, line is not active.
>
		RET]
	TXNE F,TTYASG
	TXNE F,WHOPR
	CAIA
	JRST [	TMSG <%TTYINI: Cannot do CHECK, terminal is owned by someone else.
>
		RET]
	SETZM CHRPTR
	TMSG <[Terminal type is >
	HRREI A,-1
	MOVE B,[-1,,D]
	MOVEI C,.JIBAT		;BATCH?
	GETJI%
	 JWERR <TTYINI: Failed to get batch flag from GETJI>,NOBAT
	SKIPL D
	JRST NOBAT
	TMSG <BATCH]
>
	SETZM TYPE
	RET
NOBAT:	
	MOVE A,PTY0
	HLRZ B,A		;PTY COUNT
	HRRZ A,A		;FIRST PTY NUMBER
	CAMLE A,OURLIN		;SKIP IF THIS LINE # LESS THAN FIRST PTY #
	JRST NOPTY		;WE ARE A REAL TTY
	MOVN A,A
	ADD A,OURLIN
	ADDI A,1
	CAMLE A,B		;IS THIS A REAL PTY?
	JRST NOPTY
	TMSG <PTY]
>
	SETZM TYPE
	RET
NOPTY:	MOVE A,TTYDES
	DOBE%			;WAIT TILL OUT
	CFIBF%
	RFMOD%
	 JWERR <TTYINI: Failed to read terminal data modes to save for CHECK, aborting CHECK>,CHKEN1
	MOVEM B,SAVMOD
	TDZ B,[TT%ECO!TT%DAM]
	SFMOD%
	 JWERR <TTYINI: Failed to set terminal to image mode, aborting CHECK>,CHKEN1
	DOBE%
	SETOM PASS		;FIRST PASS
	HRROI B,[BYTE(7)33,132,0] ;QUERY FOR FIRST PASS
PASS2:	MOVE A,TTYDES
	SETZ C,
	SOUT%			;QUERY TERMINAL
	 JWERR <TTYINI: Failed to send query sequence to terminal, aborting CHECK>,CHKBAD
	DOBE%
DOWAIT:	MOVEI C,^D20		;20 * 250 MS = 5 SECONDS

	MOVE A,PTY0
	HLRZ B,A		;PTY COUNT
	HRRZ A,A		;FIRST PTY NUMBER
	CAMLE A,OURLIN		;SKIP IF THIS LINE # LESS THAN FIRST PTY #
	JRST CHKLOP		;WE ARE A REAL TTY

	MOVEI C,^D40		;NON TTY, WAIT 40 * 250 MS = 10 SEC.  THIS IS SO
				;THAT LOGING IN OVER THE NETWORK ALLOWS MORE
				;TIME FOR THE TERMINAL TO RESPOND.

CHKLOP:	SOJL C,CHKLOS
	CALL GETCHR
	 JRST CHKLOP
	CAIN A,12		;USE THIS FOR TRY SECOND PASS
	JRST CHKLOS
	CAIE A,33		;CORRECT RESPONSE?
	JRST CHKBAD		;NOT EVEN FIRST CHARACTER CORRECT
	CALL GETCHR
	 JRST CHKLOS
	CAIE A,"/"		;DEC terminal response?
	 JRST CKANSI		;NO, TRY ANSI RESPONSE
	CALL GETCHR		;yes, get arg
	 JRST CHKLOS
	CAIL A,"#"
	 CAILE A,"#"+DECMAX-1
	  JRST CHKLOS		;NOT IN DESIRED RANGE
	SKIPN DECTAB-"#"(A)
	 JRST CHKLOS		;NO ENTRY FOR THIS ONE
	MOVEI E,DECTAB-"#"(A)
	CAIN E,T10052		;IS THIS VT100 IN 52 MODE?
	 SKIPG VTXXXF		;YES, REQUESTING SWITCH TO 100 MODE?
	  CAIA			;NO, OK
	   JRST S100AN		;YES, SWITCH TO 100 MODE
	MOVE D,DECTAB-"#"(A)
	SKIPE CHARF
	JRST CHKOK
	MOVE E,[ASCIZ /copier/]
	CAIN A,"J"
	MOVEM E,CHRPTR
	CAIN A,"L"
	MOVEM E,CHRPTR
	CAIN A,"a"
	MOVEM E,CHRPTR
	MOVE E,[ASCIZ /printer/]
	CAIN A,"M"
	MOVEM E,CHRPTR
	CAIN A,"b"
	MOVEM E,CHRPTR
	MOVE E,[ASCIZ /copier, printer/]
	CAIN A,"c"
	MOVEM E,CHRPTR
CHKOK:	MOVE A,TTYDES
	CFIBF%
	JRST CHKEND

S100AN:	MOVE A,TTYDES
	HRROI B,[BYTE(7)33,"<",0]	;SET TO VT100-ANSI MODE
	SETZ C,
	SOUT%
	HRROI B,[BYTE (7)33,133,"C"+40,0]
	JRST PASS2

CHKBAD:	SETZM PASS		;IF BAD RESPONSE, NO SECOND-PASS
CHKLOS:	MOVE A,TTYDES
	CFIBF%
	AOSN PASS		;IS THIS FIRST PASS?
	JRST [	HRROI B,[BYTE (7)33,133,"C"+40,33,"\",0]
		JRST PASS2]	;YES, TRY AGAIN WITH ANSI QUERY SEQ, SEND VT52
				;EXIT HOLD SCREEN MODE TO PREVENT LOCKUP OF
				;VT52, VT61, ETC IF THEY DON'T ANSWER.
	MOVE D,[-1,,[ASCIZ /UNKNOWN/]]
CHKEND:	MOVE A,TTYDES
	MOVE B,SAVMOD
	SFMOD%
	 JWERR <TTYINI: Failed to restore terminal data modes>
	HRROI A,[ASCIZ /DECtalk and /]
	SKIPN DTALKF
	PSOUT%
	HLREM D,TYPE
	HRRZ A,D
	PSOUT%
	TMSG <(>
	MOVE B,TYPE
	JUMPL B,NOTYP
	CALL (B)
	MOVE A,TYPTAB(B)
	PSOUT%
NOTYP:	TMSG <)>
	TMSG <]
>
	SKIPN CHRPTR
	RET
	TMSG <[Characteristics: >
	MOVE A,CHRPTR
	SKIPE A
 	PSOUT%
	TMSG <]
>
	RET

CHKEN1:	SETOM TYPE
	RET

CKANSI:	CAIE A,"["
	 JRST CKSUDS
	MOVEI C,"?"
	CALL CHKCHR
	 JRST CHKLOS
	SETZ E,
	CALL GETCHR		; GET TYPE CODE
	 JRST CHKLOS
	CAIL A,"0"
	 CAILE A,"9"
	  JRST CHKLOS
CKGTYP:	SUBI A,"0"
	IMULI E,^D10
	ADD E,A
	CALL GETCHR
	 JRST CHKLOS
	CAIL A,"0"
	 CAILE A,"9"
	  SKIPA
	JRST CKGTYP
	CAIE A,";"
	 CAIN A,"C"+40
	  SKIPG E
	JRST CHKLOS
	CAILE E,ANSIMX
	 JRST CHKLOS
	SKIPN CHARF
	CALL CHARR
	MOVEI E,ANSITB-1(E)
	CAIN A,"C"+40
	 JRST CHKANE
;NOW GOBBLE ARBITRARY SEQUENCE OF DIGITS AND/OR SEMICOLONS
CHKARG:	CALL GETCHR
	 JRST CHKLOS
	CAIN A,";"
	 JRST CHKARG
	CAIL A,"0"
	 CAILE A,"9"
	  JRST CHKANE
	JRST CHKARG

CHKANE:	CAIE A,"C"+40
	JRST CHKLOS

	CAIN E,TALK		;IS IT A DECTALK
	JRST DECTLK		;YES
	CAIN E,T1001		;VTXXX IN ANSI MODE?
	JRST IS100
	CAIN E,T1002
	JRST IS100
	CAIN E,T1003
	JRST IS100
	CAIN E,T1004
	JRST IS100
	CAIN E,T1005
	JRST IS100
	CAIN E,T1006
	JRST IS100

	CAIN E,T1002
	JRST IS100
	JRST NOT100

IS100:	SKIPN VTXXXF		;YES, REQUESTING SWITCH TO 52 MODE?
	JRST S10052		;YES, DO IT

NOT100:	CAIE E,T2001		;ARE WE A VT200?
	JRST NOT200
	MOVE A,VTXXXF
	CAIN A,WVT52		;WANT TO BE A VT52?
	JRST S10052
	CAIE A,WVT102		;WANT TO BE A VT102 OR
	CAIN A,WVT100		;A VT100?
	JRST S20010
	CAIN A,WVT200		;WANT TO BE A VT200?
	JRST S20020

NOT200:	SKIPN D,(E)		;GET DISPATCH AND STRING (IF ANY)
	JRST CHKLOS
	JRST CHKOK

S20010:	MOVE A,TTYDES
	HRROI B,[BYTE(7)33,"[","6","1","""","p",0]
	SETZ C,
	SOUT%
	MOVE D,[$TT100,,[ASCIZ /VT200-SERIES/]]
	MOVE A,VTXXXF
	CAIN A,WVT102
	HRLI D,$TT102
	JRST CHKOK

S20020:	MOVE A,TTYDES
	HRROI B,[BYTE(7)33,"[","6","2",";","1","""","p",0]
	SETZ C,
	SOUT%
	MOVE D,T2001
	JRST CHKOK

S10052:	MOVE A,TTYDES
	HRROI B,[BYTE(7)33,"[","?","2","L"+40,0]	;SET TO VT100-52 MODE
	SETZ C,
	SOUT%
	MOVE D,T10052		;ASSUME OK, GET DISPATCH FOR VT100-52
	JRST CHKOK

DECTLK:	SETZM DTALKF
	JRST DOWAIT

CHARR:	PUSH P,E
	CAIN E,^D62
	JRST CHAR20		; GET CHARACTERISTICS OF VT200
	CAIN A,"c"
	 JRST CHRRET
	CALL GETCHR
	 JRST CHRRET
	CAIL A,"0"
	 CAILE A,"9"
	  JRST CHRRET
	SETZ E,
CHARR1:	SUBI A,"0"
	IMULI E,^D10
	ADD E,A
	CALL GETCHR
	 JRST CHRRET
	CAIL A,"0"
	 CAILE A,"9"
	  SKIPA
	JRST CHARR1
	MOVE E,CHRTAB(E)
	MOVEM E,CHRPTR

CHRRET: POP P,E
	RET

CHAR20:
	MOVE S,[POINT 7,CHRBUF]
CHAR6:	CALL GETCHR
	 JRST CHRRET
	CAIL A,"0"
	 CAILE A,"9"
	  JRST CHRRET
	SETZ E,
CHARR2:	SUBI A,"0"
	IMULI E,^D10
	ADD E,A
	CALL GETCHR
	 JRST CHRRET
	CAIL A,"0"
	 CAILE A,"9"
	  SKIPA
	JRST CHARR2
	CAIL E,VT2END
	JRST CHAR4
	MOVE E,VT2TAB(E)
	HRLI E,(POINT 7,)
CHAR3:	ILDB B,E
	JUMPE B,CHAR4
	IDPB B,S
	JRST CHAR3

CHAR4:	CAIE A,"c"
	JRST CHAR5
	SETZ B,
	IDPB B,S
	MOVE S,[POINT 7,CHRBUF]
	MOVEM S,CHRPTR
	JRST CHRRET
CHAR5:	MOVEI B,","
	IDPB B,S
	MOVEI B," "
	IDPB B,S
	JRST CHAR6

CKSUDS:	CAIE A,"\"		;SUDS TERMINAL?
	JRST CHKLOS
	CALL GETCHR		;yes, get arg
	 JRST CHKLOS
	CAIL A,"A"
	CAILE A,"A"+SUDMAX-1
	JRST CHKLOS		;NOT IN DESIRED RANGE
	SKIPN SUDTAB-"A"(A)
	JRST CHKLOS
	MOVE D,SUDTAB-"A"(A)
	JRST CHKOK

CHKCHR:	CALL GETCHR
	 RET
	CAMN C,A
	RETSKP
	RET

GETCHR:	MOVE A,TTYDES
	SIBE%
	JRST GETCH1
	MOVEI A,^D250
	DISMS%
	MOVE A,TTYDES
	SIBE%
	JRST GETCH1
	RET

GETCH1:	MOVE A,TTYDES
	BIN%
	MOVE A,B
	ANDI A,177
	RETSKP

$TT33:	MOVEI B,.TT33
	RET

$TT35:	MOVEI B,.TT35
	RET

$TT37:	MOVEI B,.TT37
	RET

$TTDEF:	MOVEI B,.TTDEF
	RET

$TTEXE:	MOVEI B,.TTEXE
	RET

$TTG40:	MOVEI B,.TTG40
	JRST VIDXIT

$TTIDL:	MOVEI B,.TTIDL
	RET

$TTL12:	MOVEI B,.TT120
	DEFAULT FORMF,1
	DEFAULT WIDTH,^D80
	JRST LOWXIT

$TTL30:	MOVEI B,.TTL30
	RET

$TTL34:	MOVEI B,.TT120
	DEFAULT FORMF,0
	JRST LOWXIT

$TTL36:	MOVEI B,.TTL36
	JRST LOWXIT

$TTL38:	MOVEI B,.TTL38
	JRST LOWXIT

$TTV05:	MOVEI B,.TTV05
	DEFAULT RAISEF,1
	AOS RFCHNG
	RET

$TTV50:	MOVEI B,.TTV50
	AOS RFCHNG
	RET

$TT120:	MOVEI B,.TT120
	JRST LOWXIT

$TT180:	MOVEI B,.TT120
	DEFAULT PAUSEF,0
	DEFAULT TABF,0
	JRST LOWXIT

$TT125:	MOVEI B,.TT125
	MOVE A,VTXXXF
	CAIE A,WVT100
	CAIN A,WVT102
	MOVEI B,.TT100
	JRST VIDXIT

$TTK10:	MOVEI B,.TTK10
	MOVE A,VTXXXF
	CAIE A,WVT100
	CAIN A,WVT102
	MOVEI B,.TT100
	JRST VIDXIT

$TT102:	MOVEI B,.TT102
	MOVE A,VTXXXF
	CAIN A,WVT100
	MOVEI B,.TT100
	JRST VIDXIT

$TTH19:	MOVEI B,.TTH19
	JRST VIDXIT

$TT131:	MOVEI B,.TT131
	MOVE A,VTXXXF
	CAIN A,WVT100
	MOVEI B,.TT100
	CAIN A,WVT102
	MOVEI B,.TT102
	JRST VIDXIT

$TT200:	MOVEI B,.TT200
	MOVE A,VTXXXF
	CAIN A,WVT100
	MOVEI B,.TT100
	CAIN A,WVT102
	MOVEI B,.TT102
	JRST VIDXIT

$TT100:
	SKIPA B,[.TT100]
$TTV52:	MOVEI B,.TTV52
VIDXIT:	DEFAULT PAUSEF,0
LOWXIT:	DEFAULT RAISEF,0
	DEFAULT LOWERF,1
	AOS RFCHNG
	RET

$80532:	DEFAULT LENGTH,^D32
	JRST $TT805

$80542:	DEFAULT LENGTH,^D42
$TT805:	MOVEI B,.TTV05
	JRST $TTS80

$85232:	DEFAULT LENGTH,^D32
	JRST $TT852

$85242:	DEFAULT LENGTH,^D42
$TT852:	MOVEI B,.TTV52
$TTS80:	DEFAULT WIDTH,^D80
	JRST VIDXIT

$70532:	DEFAULT LENGTH,^D32
	JRST $TT705

$70542:	DEFAULT LENGTH,^D42
$TT705:	MOVEI B,.TTV05
	JRST $TTS70

$75232:	DEFAULT LENGTH,^D32
	JRST $TT752

$75242:	DEFAULT LENGTH,^D42
$TT752:	MOVEI B,.TTV52
$TTS70:	DEFAULT WIDTH,^D70
	JRST VIDXIT
SUBTTL	/TAKE:filespec
DECOUT:	MOVEI A,.PRIOU
	MOVEI C,^D10
	NOUT%
	 JCERR <TTYINI: Unexpected error from NOUT>
	RET

DOTAKE:	TXNN A,CM%SWT
	JRST DOTAK1		;NO COLON, END QUIETLY
	HRREI A,-1
	MOVE B,[-1,,D]
	MOVEI C,.JIUNO
	GETJI%
	 JCERR <TTYINI: Unexpected error from GETJI>
	MOVE A,[POINT 7,LOGIN]
	MOVE B,D
	DIRST%
	 JCERR <TTYINI: Unexpected error from DIRST>
	MOVE A,[POINT 7,LOGIN]
	MOVEM A,TAKBLK+.GJDIR
	MOVE A,[TAKBLK,,TAKLEN]
	CALL FILINI
	FIELD(TAKFIL)
	HRRZ C,C
	CAIN C,COMCFM
	JRST DOTAK1
	MOVE D,B
	MOVE A,CMJFNP
	AOBJP A,[TMSG <?TTYINI: Too many nested "/TAKE" commands.
>
		RET]
	MOVE A,D
	MOVX B,<FLD(7,OF%BSZ)!OF%RD>
	OPENF%
	 JRERR <TTYINI: Error opening command input file.
>
	MOVE A,CMJFNP
	PUSH A,CMJFNS
	MOVEM A,CMJFNP
	HRLI D,.NULIO
	MOVSM D,CMJFNS
	RETSKP

DOTAK1:	SKIPE CMJFNS
	CALL TAKFIN
	RETSKP

	END XWD EVL,EV