Google
 

Trailing-Edge - PDP-10 Archives - custsupcuspmar86_bb-x130b-sb - sosset.mac
There are 3 other files named sosset.mac in the archive. Click here to see a list.
	TITLE	SOSSET - The Set and Give Information Commands
;		-------------------------------------------
; 
;  This file contains code for:
;	1. the set (_) command
;	2. the give (=) command
;	3. the unique initial segment decoder
;	4. the name table
; 

	SEARCH	SOSTCS
	$INIT

	SUBTTL	The _ Command

SET::	PUSHJ	P,SCAN##	; Get the thing to set to
	TRNN	FL,IDF		; Must be an ident
	NERROR	ILC
	PUSHJ	P,DOSET		; Call subroutine to do set command
	  JRST	XERR
	JRST	COMND##		; Ok return

DOSET::	PUSHJ	P,XCODE		; Fetch dispatch arg
	TLZ	T1,477777	; Clear give addrs
	PUSH	P,T1		; Save dispatch
	TLNN	FL2,INPARS	; Skip term check if parse
	PUSHJ	P,SCAN		; And check for terminator
	CAIE	C,":"		; Colon ok also
	CAIN	C,"="		; Is it an =?
	JRST	SETVAR		; Yes: set something
	POP	P,T1		; Get dispatch addr
	TLNN	T1,(1B1)	; Better not require arg
	PUSHJ	P,CKTERM	; Check legal term
	POPJ	P,
	HRRZ	T1,T1
	JUMPE	T1,CPOPJ##
	PUSHJ	P,0(T1)		; Do routine
	JRST	CPOPJ1##	; Give ok return

SETM37:	MOVEI	T1,1		; A 1
	MOVEM	T1,QMDFLG	; Store
	JRST	CLRDPY		; And clear DPY

SETM33:	SETOM	QMDFLG		; Case folding for lower and specials
CLRDPY:	SETZM	DPYFLG		; TTY's are not displays
	PUSHJ	P,SETTTY##	; Get TTY status set correctly
	PJRST	CLRLF		;NO SPECIAL DISPLAY HANDLING

SETSTD::SETZM	QMDFLG		; Clear case folding
	PJRST	CLRDPY		; Make sure display bits are off

SETTXT:	TDZA	T2,T2		; Clear T2 for lower case
SETPRG:	MOVEI	T2,1		; Set for upper case
	MOVEI	T1,2003		; Trmop function code for lc
	JRST	SETERM		; Merge with common code


SETCON:	SKIPA	T1,[-2]		;GET EXIT CONTINIOUS
CLRSEQ:	MOVEI	T1,1
	JRST	STOSEQ

SETXSQ:	TDZA	T1,T1
SETSEQ:	MOVNI	T1,1
STOSEQ:	MOVEM	T1,.UNSQF##
	POPJ	P,

SETBAS:	SKIPN	INIFLG##	; Illegal if not initial
	NERROR	ILC
	SETOM	BASICF
	POPJ	P,

SETEXM:	SKIPN	TOTCHG		; Check for changes
	SKIPE	CHGCNT		; on this or previous passes
	NERROR	ACF		; And reject this if so
	SETOM	XFLAG		; Note that he said /X
	TLZ	FL2,LNUMF	; assume no sequence
	  ;			; and fall into read only
SETRED:	SKIPN	TOTCHG		; If changes sometime before
	SKIPE	CHGCNT		; or on this pass
	NERROR	ACF		; %Already changed the file
	TRO	FL,READOF
	POPJ	P,

	SUBTTL	CHKCOM -- HERE TO CHECK FOR EXPERIMENTAL EDITOR AND APPLY
;DEFAULTS TO LOOK LIKE V21 SOS
;
CHKCOM::HRROI	T1,.GTDFL	;GET DEFAULTS WORD
	GETTAB	T1,		;ASK MONITOR
	 MOVEI	T1,0		;FAILED
	TLNE	T1,(<PD.XED==1B13>);EXPERIMENTAL EDITOR?
	 PJRST	EXPSET		;YES--CLEAR NEWCOMMAND
	PUSHJ	P,SETQZB	;NO--SET /QZBAK
	PUSHJ	P,CLRSEQ	;CLEAR /XSEQUENCE SET /SEQUENCE
	PJRST	SETNCMD		;SET /COMPATIBILY AND RETURN

EXPSET:
CLRNCMD:	SOSA	NEWCMD		;CLEAR /NEWCOMMAND
SETNCMD:	  SETZM	NEWCMD		;SET /NEWCOMMAND
	POPJ	P,		;AND RETURN

SETDPY::SETOM	DPYFLG		; Set for display
	SETZM	QMDFLG		; Set for no case flagging
	PJRST	SETTTY##	; Set TTY attributes

SETBAU:	MOVEI	T3,BAUD			;GET BAUD STORAGE
	PJRST	SETGTB			;AND SET

GIVBAU:	OUTSTR	[ASCIZ/Baud /]		;TYPE
	MOVE	T1,BAUD			;GET BAUD SETTING
	PUSHJ	P,GIV2			;PRINT THAT
	OUTSTR	[ASCIZ/Speed /]		;GET SPEED
	MOVE	T1,TSPEED		;GET SPEED
	PJRST	GIV2			;PRINT AND RETURN

SETNALT:SOSA	NEWALT##		; SET NEW ALTER FLAG
CLRNALT:  SETZM	NEWALT			; CLEAR NEW ALTER FLAG
	POPJ	P,			; AND RETURN
GIVNALT:SKIPN	NEWALT			;SEE IF NEW ALTER
	 OUTSTR	[ASCIZ/No /]		;
	OUTSTR	[ASCIZ/New alter mode/]	;
	PJRST	FOCRLF			;

SETUND:	SETOM	SWUNDER			;SET UNDERLINE SPECIAL
	POPJ	P,			;AND RETURN

CLRUND:	SETZM	SWUNDER			;CLEAR UNDERLINE SPECIAL
	POPJ	P,			;AND RETURN

GIVUND:	SKIPN	SWUNDER			;SEE IF SET
 	 OUTSTR	[ASCIZ/No /]		;..
	OUTSTR	[ASCIZ/Underline/]	;FINISH OFF
	PJRST	FOCRLF			;AND RETURN

SETXIN: SOSA	XINSRT##		; SET X-INSERT MODE
CLRXIN:	 SETZM	XINSRT##		; CLEAR X-INSERT MODE
	POPJ	P,			; AND RETURN
GIVXIN:	SKIPN	XINSRT##
	 OUTSTR	[ASCIZ/No /]
	OUTSTR	[ASCIZ/X insert new line mode/]
	PJRST	FOCRLF
SETLF:	PUSHJ	P,SETTTY##		;SETUP TERMINAL
	PUSHJ	P,FNDTRM		;GET TERMINAL TYPE INDEX
	 POPJ	P,			;CANT
	MOVE	T2,TRMCR(T1)		;GET CR STRING
	MOVEM	T2,TMFCR		;SAVE
	MOVE	T2,TRMCUP(T1)		;GET CURSOR UP FUNCTION
	MOVEM	T2,TMFCUP		;SAVE
	POPJ	P,

CLRLF:	SETZM	TMFCR			;ZAP THE FUNCTIONS
	SETZM	TMFCUP			;..
	PJRST	CLRDIS			;AND CLEAR DISPLAY FUNCTIONS

GIVLF:	PUSHJ	P,FNDTRM		;GET TERMINAL TYPE
	 JRST	GIVNLF			;NOT THERE
	SKIPN	TMFCUP			;CAN IT DO IT?
	 JRST	GIVNLF			;NO
	OUTSTR	[ASCIZ/LF /]		;TYPE
	PJRST	GIVTRM			;AND LIST TERMINAL TYPE
GIVNLF:	OUTSTR	[ASCIZ/No LF
/]					;
	POPJ	P,			;AND RETURN

SETDIS::PUSHJ	P,SETTTY##		;SETUP TERMINAL STUFF
	PUSHJ	P,FNDTRM		;GET TERMINAL TYPE INDEX
	 POPJ	P,			;CANT
	MOVE	T2,TRMCR(T1)		;GET CR STRING
	MOVEM	T2,TMFCR		;SAVE
	MOVEI	T3,0			;CLEAR FLAG
	SKIPE	T2,TRMCLN(T1)		;GET CLEAT-TO-END-OF-LINE
	 ADDI	T3,1			;COUNT 1
	MOVEM	T2,TMFCLN		;SAVE
	SKIPE	T2,TRMCTE(T1)		;GET CLEAR-TO-END-OF-SCREEN
	 ADDI	T3,1			;COUNT 2
	MOVEM	T2,TMFCTE		;SAVE
	SKIPE	T2,TRMCUP(T1)		;GET CURSOR-UP
	 ADDI	T3,1			;COUNT 3
	MOVEM	T2,TMFCUP		;SAVE
	MOVE	T2,TRMCLR(T1)		;GET CLEAR-ENTIRE-SCREEN
	MOVEM	T2,TMFCLR		;SAVE
	MOVE	T2,TRMCUR(T1)		;GET CURSOR ADDRESSING PARA
	MOVEM	T2,TMFCUR		;SAVE
	CAIN	T3,3			;ALL THREE FUNCTIONS?
	 SOS	VT52FL			;YES--FLAG SPECIAL FEATURES
	POPJ	P,			;AND RETURN

CLRDIS:	SETZM	VT52FL			;CLEAR SPECIAL FEATURES
	SETZM	TMFCUR			;AND NO CURSOR ADDRESSING
	POPJ	P,			;RETURN

GIVDIS:	PUSHJ	P,FNDTRM		;FIND TERMINAL TYPE
	 JRST	GIVNDI			;NOT THERE
	SKIPL	VT52FL			;SPECIAL STUFF?
	 JRST	GIVNDI			;NO
	OUTSTR	[ASCIZ/Display /]	;GIVE TEXT
GIVTRM:	MOVE	T1,TRMNAM(T1)		;GET NAME
	MOVEI	T3,OCHR##		;CHAR PUTTER
	PUSHJ	P,PRTSX##		;TYPE TERMINAL
	PJRST	FOCRLF			;AND FINISH OFF
GIVNDI:	OUTSTR	[ASCIZ/No Display
/]					;
	POPJ	P,			;RETURN


FNDTRM:	MOVE	T1,TERMNM		;GET TERMINAL NAME
	MOVSI	T2,-LENTRM		;GET LENGTH OF KNOWN TERMINALS
FNDT.L:	MOVEI	T3,(T2)			;GET INDEX
	IMULI	T3,LENFNC		;TYPES FUNCTION LENGTH
	CAME	T1,TRMTAB+TRMNAM(T3)	;SEE IF MATCHES
	 AOBJN	T2,FNDT.L		;NO--LOOP
	JUMPG	T2,CPOPJ##		;ERROR IF NOT THERE
	MOVEI	T1,TRMTAB(T3)		;RETURN OFFSET
	JRST	CPOPJ1##		;AND TAKE GOOD RETURN
TRMNAM==0
TRMCR==1
TRMCLN==2
TRMCTE==3
TRMCUP==4
TRMCLR==5
TRMCUR==6
LENFNC==7
DEFINE TYPE(NAME,FUNCTIONS),<
LENTRM==LENTRM+1
	DEFINE .CR<15>
	DEFINE ..CLN<0>
	DEFINE ..CTE<0>
	DEFINE ..CUP<0>
	DEFINE ..CLR<0>
	DEFINE ..CUR<0>
	EXP	SIXBIT	/NAME/
	FUNCTIONS
	DEFINE ..CR,<OUTSTR [BYTE (7) .CR,0]>
	..CR
	..CLN
	..CTE
	..CUP
	..CLR
	..CUR
>

DEFINE CR(STR),<DEFINE .CR,<STR>>
DEFINE CLR(STR),<DEFINE ..CLR,<OUTSTR [BYTE(7) STR,.CR,0]>>
DEFINE CUP(STR),<DEFINE ..CUP,<OUTSTR [BYTE(7) .CR,STR,.CR,0]>>
DEFINE CLN(STR),<DEFINE ..CLN,<OUTSTR [BYTE(7) STR,.CR,0]>>
DEFINE CTE(STR),<DEFINE ..CTE,<OUTSTR [BYTE(7) .CR,STR,.CR,0]>>
DEFINE CUR(ADDR,NCHR,CMAX),<DEFINE ..CUR,<CMAX*1000+NCHR,,ADDR##>>

LENTRM==0
TRMTAB:
TYPE 4023,<
	CUP	<34,40,66,15>
>
TYPE VT52,<
	CLR	<33,"H",33,"J">
	CTE	<33,"J">
	CLN	<33,"K">
	CUP	<33,"A">
	CUR	V52CUR,4,120
>
TYPE VT61,<
	CLR	<33,"H",33,"J">
	CTE	<33,"J">
	CLN	<33,"K">
	CUP	<33,"A">
	CUR	V52CUR,4,120
>
TYPE VT05,<
	CR	<15,177,177,177>
	CLR	<35,177,177,177,177,177,37,177,177,177,177,177>
	CTE	<37,177,177,177,177,177>
	CLN	<36,177,177,177,177,177>
	CUP	<32,177,177,177,177,177>
>
TYPE ADDS,<
	CUP	<32>
	CUR	ADDCUR,2,177
>
TYPE INFOTON,<
	CTE	<13>
	CLN	<13>
	CUP	<34>
>
TYPE REGENT,<
	CTE	<33,"k">
	CLN	<33,"K">
	CUP	<32>
	CUR	REGCUR,2,177
>
TYPE VT100,<
	CLR	<33,"[","H",33,"[","J">
	CTE	<33,"[","J">
	CLN	<33,"[","K">
	CUP	<33,"[","A">
>
TYPE I100,<
	CTE	<33,"J">
	CLN	<33,"K">
	CUP	<33,"A">
>
TYPE 4027,<
	CLR	<"!","U","P","3","4","!","D","L","I","3","4">
	CTE	<"!","D","L","I","3","4">
	CLN	<"!","D","C","H","8","0">
	CUP	<"!","U","P","1">
>
TYPE DIABLO,<
	CUR	DIACUR,3,175
>
SETDPA:	MOVEI	T1,1
	JRST	STOAAL

CLRALT:	TDZA	T1,T1
SETAAL:	SETO	T1,
STOAAL:	MOVEM	T1,AUTALT##
	POPJ	P,

SAEXAC:	TDZA	T1,T1
CAEXAC:	MOVEI	T1,40		; Used with a TDZ instruction in SOSALT
	MOVEM	T1,AEXACF
	POPJ	P,

SEXACT:	SETOM	EXACTF
	POPJ	P,

CEXACT:	SETZM	EXACTF
	POPJ	P,


SETTEL:	SOSA	TELFLG##	; Do a tell on exit
SETNTL:	CLEARM	TELFLG##	; Don't do tell on exit
	POPJ	P,		; Return

SETBKS:	TLOA	FL2,BKSPF	; Treat backspaces as rubouts
SETNBS:	TLZ	FL2,BKSPF	; Do not treat backspaces as rubouts
	POPJ	P,

SETDCD:	TLOA	FL2,PDECID
CLRDCD:	TLZ	FL2,PDECID
	POPJ	P,

SETOLD:	MOVEI	T1,1		; Set to +1
	JRST	STOBAK
CLRBAK:	TDZA	T1,T1		; Clear and skip
SETBAK:	SETO	T1,
STOBAK:	MOVEM	T1,.BAKF##
	POPJ	P,

IFN %UACCL,<
SETCCL:	SOSA	CCLFLG##	; Treat CCL entry special
CLRCCL:	SETZM	CCLFLG##	; Clear special CCL flag
>
IFE %UACCL,<
SETCCL:
CLRCCL:	OUTSTR	[ASCIZ"%Not assembled for /CCL feature
"]
	POPJ	P,		; THATS EVEN EASIER!
>;END IFE %UACCL
	POPJ	P,		; That was easy, wasn't it

SETCCX:	SOSA	CCEXIT		; ^C exits direct to monitor
CLRCCX:	SETZM	CCEXIT		; ^C asks for user confirmations
	POPJ	P,		; Done

QSON:	TROA	FL2,QSEPF
QSOFF:	TRZ	FL2,QSEPF
	POPJ	P,


SETEXP:	SETOM	EXPFLG		;SET /EXPERT
	SKIPE	NEWCMD		;SEE IF IN COMPAT MODE
	  POPJ	P,		;NO--JUST RETURN
	PJRST	CLRINF		;YES--CLEAR /INFORM TOO

SETNOV:	SETZM	EXPFLG		;CLEAR /EXPERT
	SKIPE	NEWCMD		;SEE IF IN COMPAT MODE
	  POPJ	P,		;NO-JUST RETURN
	PJRST	SETINF		;YES-SET /INFORM TOO


SETINF::SOSA	INFFLG
CLRINF:	SETZM	INFFLG
	POPJ	P,

CLRAIN:	SOSA	NOAINF		; Flag /NOINSERT
SETAIN:	SETZM	NOAINF		; Flag /INSERT
	POPJ	P,		; and return
SETQZB:	SOSA	QZBAKF
CLRQZB:	SETZM	QZBAKF
	POPJ	P,

SETUPP:	TDZA	T1,T1
SETLOW:	MOVEI	T1,40
	MOVEM	T1,CASEBT
	POPJ	P,

SETNUM::TLOA	FL2,LNUMF	; Set for printing line numbers
SETNNM:	TLZ	FL2,LNUMF	; No more numbers!
	POPJ	P,

; Here to set the protection

SETPRT:	LSHC	T1,-^D36	; T2 gets T1, T1 is cleared
	TRZ	T2,1		; Clear line number bit
	SETZ	T3,		; Clear accumulator
SETPR1:	SETZ	T1,
	LSHC	T1,7		; Get a character
	LSH	T3,3		; Make room for next
	SUBI	T1,"0"		; Convert to octal
	CAIL	T1,0
	CAILE	T1,7		; Make sure really an octal digit
	JRST	SETV2		; No
	IORI	T3,(T1)		; Move to accumulator
	JUMPN	T2,SETPR1	; Loop over whole number
	JUMPE	T3,SETV2	; 000 is illegal
	CAILE	T3,777		; As is something larger than 777
	JRST	SETV2		; So don't allow it
	LSH	T3,^D27		; Shift to protection field
	MOVEM	T3,PRTCOD	; Save
	POPJ	P,		;  and return

SETINI:	SETOM	INTFLG		;SET FLAG
	POPJ	P,		;AND RETURN
	SUBTTL	SET -- Code to set a variable, plus various set routines

; Here to set a variable

SETVAR::TLNE	FL2,INPARS
	PUSHJ	P,SCAN		; Need extra scan if in parse
	PUSHJ	P,SCAN		; Get an arg
	MOVE	T3,0(P)		; Get what to do
	TLNN	T3,(1B1)	; Need arg
	JRST	SETV2		; No: error
	TLNN	T3,(1B2)	; Need numeric arg?
	JRST	SETV1		; No: just dispatch
	TRNN	FL,NUMF		; Yes: is it?
	JRST	SETV2		; Nope - lose
	TLNE	FL2,INPARS
	JRST	SETV1		; Skip term check in parse
	PUSH	P,T2		; Save it
	PUSH	P,T1		; In binary and ASCII
	PUSHJ	P,SCAN		; Check for terminator
	POP	P,T1		; Get back ascid
	POP	P,T2		; Binary
	PUSHJ	P,CKTERM	; Which had better be there
	JRST	SETV2
SETV1:	POP	P,T3		; Get dispatch
	HRRZ	T3,T3
	JUMPE	T3,CPOPJ
	PUSHJ	P,0(T3)		; Dispatch
	JRST	CPOPJ1		; And return to cmd loop

SETV2:	POP	P,0(P)		; Prune pdl
	POPJ	P,		; And give error return

SETPLN:	MOVEI	T3,PLINES	; Plines for p
	JRST	SETGTB


SETRMR:	MOVEI	T3,RMAR		; Right margin for justify
	JRST	SETGTB

SETLMR:	MOVEI	T3,LMAR		; Left margin
	JRST	SETGTB

SETPMR:	MOVEI	T3,PMAR		; Paragraph margin
	JRST	SETGTB

SETINC:	MOVEI	T3,INCR		; Perm increment
	JRST	SETGTA

SETMLN:	MOVEI	T3,MAXLN	; Maximum line number
	JRST	SETGTA

SETSTP:	SKIPA	T3,[TECINC]	; Step
SETFST:	MOVEI	T3,TECFST	; Start
	JRST	SETGTA

SETSAV:	MOVEM	T2,SSAVEN	; Store in reset place too
	MOVEM	T2,SAVEN
	POPJ	P,

SETISV:	MOVEM	T2,SISAVN
	MOVEM	T2,ISAVEN
	POPJ	P,

SETLEN:	MOVEI	T3,PAGESZ
	JRST	SETGTB

CLRCRF:	MOVEI	T2,0		; /NOCRLF sets it to zero
SETCRF:	CAIG	T2,^D200	; Make sure not completely absurd
	CAIGE	T2,0		; 
	NERROR	ILC
	MOVEM	T2,CRLFSW
	PJRST	SETTTY##

SETDLF:	SOSA	DELETF		; Set it
CLRDLF:	SETZM	DELETF		; Clear it
	POPJ	P,		; And return
GIVDLF:	OUTSTR	[ASCIZ/ED /]
	SKIPN	DELETF
	OUTSTR	[ASCIZ/not /]
	OUTSTR	[ASCIZ/allowed/]
	PJRST	FOCRLF

CLRFCL:	TDZA	T2,T2		; /NOFILL sets fill to zero
SETWTH:	SKIPA	T1,[2012]	; Code for set tty width n
SETFCL:	MOVEI	T1,2017		; Code for set tty fill n
SETERM:	MOVE	T3,T2		; Argument to T3 for TRMOP.
	HRRZ	T2,MYUDX	; Get my terminal UDX
	MOVE	T4,[3,,T1]	; Command pointer
	TRMOP.	T4,		; Set the desired terminal bits
	  JRST	SETV2		; Treat this as an error
	PJRST	SETTTY##	; Update internal database

SETWMX:	MOVEI	T3,WINMAX	; Where to store it
	JRST	SETWD0

SETWMN:	MOVEI	T3,WINMIN	; Where to store it
	JRST	SETWD0

SETWRA:	MOVEI	T3,WINRAT	; Where to store the ratio
	JRST	SETGTB

SETWDW:	MOVEI	T3,WINDOW##	; Where to store it
	  ; 
SETWD0:	CAIG	T2,^D256	; Set the window size
	IMULI	T2,2000		; He must mean K
	CAILE	T2,^D250000	; BUT NOT BIGGER THAN 
	JRST	SETV2		; the entire machine!
	CAIGE	T2,4*BLKSIZ	; Minimum permissible size
	MOVEI	T2,4*BLKSIZ	; Ensure it
	JRST	SETGTB		; Check validity and stash

CLRBFN:	MOVEI	T1,2		; Force only one buffer
	JRST	SCBFN		; Join common code

SETBFN:	MOVEI	T1,6		; Use six monitor buffer for IO
SCBFN:	SKIPN	INIFLG##	; Illegal if not initial
	 NERROR	ILC		; Tell him
	MOVEM	T1,BUFNUM##	; Clear BUFNUM (Use monitor default)
	POPJ	P,

SETDSW:	TRO	FL2,R2.DSW	; Set /DECRYPT flag
SETPSW:	SKIPN	INIFLG##	; Illegal if not initial
	NERROR	ILC
	TRO	FL2,R2.PSW	; Flag it
	POPJ	P,		; And return

CLRDLY:	SETZ	T2,		; /NOREFD means set to zero
SETDLY:	SETZM	REFDLY		; Assume zero
	JUMPE	T2,CPOPJ	; If zero
	HRLI	T2,(HB.RTC)	; HIBER on input character bit
	MOVEM	T2,REFDLY	; Set the value
	POPJ	P,		; And return

; Here to set a binary value and insure it is greater than zero

SETGTB:	JUMPLE	T2,SETV2	; Error return if not correct
	MOVEM	T2,0(T3)	; Stash in proper place
	POPJ	P,		; Return

; Here to set an ASCII number if greater than zero

SETGTA:	JUMPLE	T2,SETV2	; Is binary a good value?
	MOVEM	T1,0(T3)	; Its OK, store ASCII in its home
	POPJ	P,		; Return

; Here to set a filename (T3 must have lookup block address)

SETNM1::PUSHJ	P,READNM##	; Get a file spec
	  NERROR BFS		; Bad file specification
	SKIPN	RSW		; Error if switches seen
	SKIPE	SSW
	POPJ	P,
	SKIPE	TMPCOD		; No encryption key allowed
	POPJ	P,
	PJRST	CKTERM		; Grntee eol

SETNAM::MOVEI	T3,NEWBLK##	; Will deposit new name here
	MOVEI	T1,NPATH	; Place to read the path
	MOVEM	T1,NEWPTH	; Setup the pointer
	PUSHJ	P,SETNM1	; Get file spec , check errors
	JRST	SETNM2		; Error return
	SKIPN	T1,TMPDEV	; Get the device
	MOVSI	T1,'DSK'	; Else default is DSK:
	MOVEM	T1,NEWDEV	; Save it
	SKIPE	TMPDEV		; Did he type a device
	AOS	STRCNT##	; Then he'd probably like to see it
	POPJ	P,		; And return

SETNM2:	SETZM	NEWNAM		; Here on errors, clear new name
	NERROR	ILC		; Smack user

SETRUN:	MOVEI	T3,RPGR-1	; Will deposit run name here
	MOVEI	T2,RNPATH	; Run path block
	MOVEM	T2,RPGR		; Stash the path pointer
	PUSHJ	P,SETNM1	; Get file spec - check errors
	  NERROR ILC
	SKIPE	DFXSW		; Default extension?
	SETZM	RPGR+2		; Zero is the default
	SETZM	DFXSW		; Might confuse SOSINI
	MOVE	T1,RPGR		; Pick up the PPN
	MOVEM	T1,RPGR+4	; Move to where it belongs for RUN UUO
	SKIPE	T1,TMPDEV	; See if device specified
	JRST	SETRN1		; Given, go set it
	MOVSI	T1,'SYS'	; No: use sys
	SKIPE	RNPATH+.PTPPN	; Any PPN given?
	MOVSI	T1,'DSK'	; Yes, then default of DSK is better
SETRN1:	MOVEM	T1,RPGR		; Save it
	POPJ	P,		; Return

; Routine to check proper termination

CKTERM:	TLNE	FL2,INOPTF	; Check if option file
	JRST	CKTRM1
	TLNE	FL2,INPARS	; See if cmd string
	JRST	CPOPJ1		; Always say proper term - parse will check
CKTRM0:	TRNE	FL,TERMF	; Proper line term?
	AOS	(P)		; Yes
	POPJ	P,		; Non-skip if no

CKTRM1:	CAIE	C,"/"		; Allow special chars
	CAIN	C,","		; If in option file
	JRST	CPOPJ1
	CAIN	C,"-"		; If no spec chrs found
	JRST	CPOPJ1
	JRST	CKTRM0		; Also check EOL

; Handle option files

SETOPT:	TRNE	FL,IDF!NUMF	; Check for ident
	SKIPN	T1,ACCUM	; And non-zero atom
	NERROR	ILC
	MOVEM	T1,OPTION	; Set up option
	TLNE	FL2,INPARS	; Initial
	JRST	OPTSWT##	; Yes: use speciial routine
	PUSHJ	P,SCAN		; Check term
	PUSHJ	P,CKTERM
	NERROR	ILC		; Lose
	PUSHJ	P,DOOPT##
	JRST	SETOP1		; Not found
	JRST	PSEOMS		; Bad options
	POPJ	P,		; Ok return

PSEOMS::MOVEI	T1,SEOMSG	; Here for "Syntax error in default 
				; options message
NFEMSG::OUTSTR	PCTPFX		; %
	JRST	ANYMSG

SETOP1:	MOVEI	T1,ONFMSG
FAEMSG::OUTSTR	PCTPFX
ANYMSG::PUSHJ	P,TYPSTR##
POFCRL:	JRST	FOCRLF##

ONFMSG::ASCIZ /Option not found/
SEOMSG::ASCIZ /Syntax error in SWITCH.INI/
QMKPFX::ASCIZ	/?/
PCTPFX::ASCIZ	/%/
	SUBTTL	The = Command

GIVE::	PUSHJ	P,SCAN		; Find out what he wants to know
	CAIE	C,"%"		; % Line number symbol?
	CAIN	C,"."		; Current line/page?
	JRST	GVSPSM		; Yes
	CAIN	C,"#"		; # Line number symbol?
	JRST	GVSPSM		; Yes
	TRNN	FL,IDF		; If not, must be an ident
	NERROR	ILC
	PUSHJ	P,XCODE		; Fetch actual sixbit arg
	HLRZ	T1,T1		; Get give addrs
	TRZ	T1,3B20		; Clear funny bits
	JUMPE	T1,XERR
	PUSH	P,T1		; Save dispatch
	PUSHJ	P,SCAN		; Check for term
	PUSHJ	P,CKTRMF
	POP	P,T1		; Now find out what he wants
	PUSHJ	P,0(T1)		; Giv info
	JRST	COMND		; And return

GIVBIG:	TRNE	FL,BGSN		; Have we seen that page
	JRST	GVBG1		; Yes, all is ok
	MOVSI	T1,1		; Will have to search for it
	MOVEM	T1,DPG
	MOVEI	SINDEX,0
	PUSHJ	P,FIND##
	TRNN	FL,BGSN		; Should have seen it now
	ERROR	ICN		; We are in trouble
GVBG1:	MOVE	T1,BGPG		; Get it

; Here to print a decimal number

GIV2:	MOVEI	T3,OCHR##	; Routine for decimal printer to output to
	PUSHJ	P,DECPR		; Print decimal
	PJRST	FOCRLF##

; Here to print an ASCII number (sequence number)

GIV4:	MOVEM	T1,PRNTO1	; Put it in proper place
	OUTSTR	PRNTO1		; Poof, there it goes
	POPJ	P,

GVCASE:	SKIPN	DPYFLG		; Display?
	JRST	GVSTDT		; Give Standard and type
	OUTSTR	[ASCIZ /Display /]
	JRST	CHKSEP		; Check for /Separators

GVSTDT:	OUTSTR	[ASCIZ /Standard /]
	SKIPN	QMDFLG		; Are we quoting at all?
	OUTSTR	[ASCIZ/ASCII /]
	SKIPGE	QMDFLG
	OUTSTR	[ASCIZ/C64 /]	; No, letters too
	SKIPLE	QMDFLG
	OUTSTR	[ASCIZ/C128 /]	; No, just funny ones
CHKSEP:	TRNE	FL2,QSEPF
	OUTSTR	[ASCIZ /Separators /]
	TLNE	FL2,BKSPF
	OUTSTR	[ASCIZ /Backspace /]
	SKIPLE	AUTALT##	; In special DPY alter mode
	OUTSTR	[ASCIZ/DPY-/]	; Yes, say so
	SKIPE	AUTALT##	; In auto-alter mode mode
	OUTSTR	[ASCIZ /Alter /]; Remind him
CHKCSE:	MOVEI	T1,[ASCIZ /Lower
/]
	SKIPN	CASEBT
	MOVEI	T1,[ASCIZ /Upper
/]				; Print current case
	OUTSTR	@T1
	POPJ	P,


GIVWTH:	SKIPA	T2,[1012]	; Give the current tty width
GIVFCL:	MOVEI	T2,1017		; Give the current tty fill class
	PUSHJ	P,TRMOPI	; Do the TRMOP.
	  POPJ	P,		; Ignore error return
	JRST	GIV2		; Go merge with common print code

GIVLC:	MOVEI	T2,1003		; Argument
	PUSHJ	P,TRMOPI
	  POPJ	P,
	SKIPE	T1		; Check
	OUTSTR	[ASCIZ/No /]
	OUTSTR	[ASCIZ/LC/]
	PJRST	FOCRLF##

TRMOPI:	PJOB	T3,
	TRMNO.	T3,
	  POPJ	P,
	MOVE	T1,[2,,T2]
	TRMOP.	T1,
	  POPJ	P,
	JRST	CPOPJ1##

GIVER:	SKIPN	T1,SVERN
	POPJ	P,
	HRRZ	T1,ETBL##-1(T1)	;GET NOVICE ERROR ADDR
	OUTSTR	(T1)		;TYPE MESSGA
	PJRST	FOCRLF		;AND CRLF RETURN

GVMLN:	MOVE	T1,MAXLN	; Maximum line number
	JRST	GIV4
GVRM:	MOVE	T1,RMAR		; Right margin
	JRST	GIV2
GVLM:	MOVE	T1,LMAR		; Left margin
	JRST	GIV2
GVPM:	MOVE	T1,PMAR		; Paragraph left margin
	JRST	GIV2
GVPG:	MOVE	T1,PAGESZ
	JRST	GIV2

GVPLN:	MOVE	T1,PLINES
	JRST	GIV2

; Here to print the output file protection

GVPRT:	PUSHJ	P,GETOFP	; Get the protection code
	ROT	T1,^D9		; Right justify
	PUSHJ	P,OCTPR3	; Type in octal
	PJRST	FOCRLF##	; Then CRLF

GETOFP::SKIPE	T1,PRTCOD	; If set
	POPJ	P,		; Just return it
	PUSH	P,T2		; Save T2
	MOVE	T1,SVPBTS	; Else as seen on input
	MOVEI	T2,@PNTNMO	; Output file enter block
	LDB	T2,[POINT 9,.RBPRV(T2),8] ; Temp file protection
REPEAT 0,<			;**TEMP** ??
	CAIN	T2,077		;Owner?
	JRST	T2POPJ##	;Yes, just return SVPBTS
	TLZE	T1,(70B8)	;Convert project field to 1 or 0
	TLO	T1,(10B8)	;so we can rename the file
	CAIN	T2,107		;Same project?
	JRST	T2POPJ##	;Yes, done
	TLZE	T1,(7B8)	;No, convert universe field to
	TLO	T1,(1B8)	;1 or zero
>;END REPEAT 0
	JRST	T2POPJ##	; And return it

GVSAV:	SKIPGE	T1,SAVEN	; Save left
	MOVEI	T1,0
	JRST	GIV2
GVISAV:	SKIPGE	T1,ISAVEN	; Isave left
	MOVEI	T1,0
	JRST	GIV2

GIVDSK:	JRST	TELSPC##


GIVDCD:	TLNN	FL2,PDECID
	OUTSTR	[ASCIZ "No "]
	OUTSTR	[ASCIZ "Auto decide
"]
	POPJ	P,

GIVDLY:	HRRZ	T1,REFDLY
	PJRST	GIV2		; Type the value
GIVBAK:	SKIPN	T1,.BAKF
	OUTSTR	[ASCIZ "No "]
	JUMPE	T1,GVBAK1
	SKIPLE	T1
	OUTSTR	[ASCIZ "Old "]
GVBAK2:	SKIPGE	QZBAKF		; Special .Q?? or .Z?? type backup file?
	OUTSTR	[ASCIZ "QZ "]	; Yes, so indicate
GVBAK1:	OUTSTR	[ASCIZ "Backup 
"]
	POPJ	P,

; Here to give the value of /BASIC

GIVBAS:	SKIPN	BASICF		; Basic
	OUTSTR	[ASCIZ/No /]
	OUTSTR	[ASCIZ/BASIC/]
	JRST	FOCRLF##	; CRLF and return
; Here for the value of /CCL

GIVCCL:	
IFN %UACCL,<
	SKIPN	CCLFLG
>;END IFN %UACCL
	OUTSTR	[ASCIZ/No /]
	OUTSTR	[ASCIZ/CCL/]
	PJRST	FOCRLF

; Here to give the value of /CCEXIT

GIVCCE:	SKIPN	CCEXIT
	OUTSTR	[ASCIZ/No /]
	OUTSTR	[ASCIZ/CCEXIT/]
	PJRST	FOCRLF

; Here to give the value of /EXPER or /NOVICE

GIVEXP:	SKIPN	EXPFLG
	OUTSTR	[ASCIZ/No /]
	OUTSTR	[ASCIZ/Expert/]
	PJRST	FOCRLF

; Here to give the value of /INFORM

GIVINF:	SKIPN	INFFLG
	OUTSTR	[ASCIZ/No /]
	OUTSTR	[ASCIZ/Inform/]
	PJRST	FOCRLF

GIVAIN:	SKIPE	NOAINF		; See if he said /NOINSERT
	OUTSTR	[ASCIZ/No /]
	OUTSTR	[ASCIZ/Auto insert/]
	PJRST	FOCRLF

; Here to give the value of /EXACT

GIVEXA:	SETCM	T1,EXACTF
	PUSHJ	P,GVEXS0
	PJRST	GVEXS1

; Here to give the value of /SEPERATORS

GIVSEP:	TRNN	FL2,QSEPF
	OUTSTR	[ASCIZ/No /]
	OUTSTR	[ASCIZ/Separators/]
	PJRST	FOCRLF

; Here to give the value of /AEXACT

GIVAEX:	MOVE	T1,AEXACF
	PUSHJ	P,GVEXS0
	OUTSTR	[ASCIZ/Alter /]
GVEXS1:	OUTSTR	[ASCIZ/searches/]
	PJRST	FOCRLF

; Subroutine to type 'case folded' or 'case exact'
GVEXS0:	OUTSTR	[ASCIZ/Case /]
	SKIPE	T1
	OUTSTR	[ASCIZ/folded /]
	SKIPN	T1
	OUTSTR	[ASCIZ/exact /]
	POPJ	P,
; Here to give the value of /R

GIVRDO:	TRNN	FL,READOF
	OUTSTR	[ASCIZ/No /]
	OUTSTR	[ASCIZ/Readonly/]
	PJRST	FOCRLF

; Here to give the value of /BUFFER

GIVBUF:	MOVE	T1,BUFNUM	; Get number
	CAIE	T1,6		; Is it six
	OUTSTR	[ASCIZ/No /]
	OUTSTR	[ASCIZ/Extra buffers/]
	PJRST	FOCRLF

GIVSEQ:	SKIPN	T1,.UNSQF
	MOVE	T1,UNSQIF
	SKIPGE	T1
	OUTSTR	[ASCIZ "No "]
	OUTSTR	[ASCIZ "Sequence"]
	CAMN	T1,[-2]		;
	 OUTSTR	[ASCIZ " nor pages"]
	OUTSTR	[ASCIZ "
"]
	POPJ	P,

GVINC:	MOVE	T1,INCR		; Get current increment
	JRST	GIV4		; Go print it

GVSPSM:	PUSH	P,T2		; Save the page number
	PUSH	P,T1		; and the line number
	PUSHJ	P,SCAN		; See if a terminator is there
	PUSHJ	P,CKTRMF##	; Check for end of line
	POP	P,LINOUT	; Restore line number
	OUTSTR	LINOUT
	POP	P,T1		; Page number
	PUSHJ	P,GIV2		; Put it out
	JRST	COMND		; And return

OCTPR::	SKIPA	CS,[^O10]
DECPR::	MOVEI	CS,^D10
RDXPR:	IDIVI	T1,0(CS)
	HRLM	T2,(P)
	SKIPE	T1
	PUSHJ	P,RDXPR
	HLRZ	C,(P)
	ADDI	C,"0"
	JRST	(T3)		; Except has arbitrary output routine

; Here to print 3 digits of an octal number

OCTPR3:	MOVEI	T3,3		; Number to print
OCTPR0:	IDIVI	T1,10		; Divide by eight
	HRLM	T2,(P)		; Save
	SOSE	T3		; Count digits
	PUSHJ	P,OCTPR0	; Output next
	HLRZ	C,(P)
	ADDI	C,"0"		; Convert back to ASCII
	PJRST	OCHR##		; And type it

GVSTR:	MOVEI	T1,SRPNT	; Get the pointer to pointer block
	HRLI	T1,-SRNUM	; Set count
	OUTSTR	[ASCIZ /Find:
/]
	PUSHJ	P,GVSTR3
	MOVEI	T1,R2PNT
	HRLI	T1,-SRNUM
	OUTSTR	[ASCIZ /Substitute:
/]
	PUSHJ	P,GVSTR3
	MOVEI	T1,R1PNT
	HRLI	T1,-SRNUM
	OUTSTR	[ASCIZ /For:
/]
	PUSHJ	P,GVSTR3
IFN	EXTEND,<
	OUTSTR	[ASCIZ /Line-contents:
/]
	MOVEI	T4,0
	MOVEI	T5,LSNUM
	MOVEI	T3,OCHR
GVST1:	MOVEI	T1,1(T4)
	PUSHJ	P,DECPR
	MOVEI	C,":"
	PUSHJ	P,OCHR
	PUSHJ	P,FOCRLF##
	MOVEI	T1,-1(T5)
	IMULI	T1,SRNUM
	ADDI	T1,LSPNT
	HRLI	T1,-SRNUM
	PUSHJ	P,GVSTR3
	ADDI	T4,1
	SOJG	T5,GVST1
>
	POPJ	P,

GIVFST:	SKIPA	T1,TECFST	; Get current start
GIVSTP:	MOVE	T1,TECINC	; Get input incr
	JRST	GIV4		; Go print it

GVSTR3:	SKIPN	T2,(T1)		; Is there one there?
	POPJ	P,		; No, done
GVSTR2:	ILDB	C,T2		; Next chr
	JUMPE	C,GVSTR1	; Done
	TRZE	C,<PT.PAT==400>	;PATTERN CHAR?
	 PUSHJ	P,GVECHR	;YES--HANDLE

	PUSHJ	P,OCHR		; Print it
	JRST	GVSTR2		; And continue
GVSTR1:	PUSHJ	P,FOCRLF##	; Clear output device
	AOBJN	T1,GVSTR3	; If there is one
	POPJ	P,

GIVCRF:	MOVE	T1,CRLFSW	; Get switch value
	PJRST	GIV2		; Print in decimal and return

GVECHR:	PUSH	P,C		;SAVE THE PATTERN CHAR
	MOVEI	C,<.PTPAT==5>	;GET A ^E
	PUSHJ	P,OCHR		;PRINT IT
	MOVE	T1,(P)		;GET CHAR
	TRZE	T1,<PT.NUM==200>;NUMBER FOLLOWING?
	 JRST	[PUSH P,T1
		 ILDB T1,T2	;GET THE NUMBER
		 PUSH P,T2	;SAVE POINTER
		 MOVEI T3,OCHR##;LOAD CHAR PRINTER
		 PUSHJ P,DECPR;PRINT IT
		 POP P,T2	;RESTORE THEM
		 POP P,T1	;..
		 JRST .+1]	;AND CONTINUE
	POP	P,C		;GET THE CHAR BACK
	ANDI	C,177		;AND JUST THE CHAR
	MOVSI	T3,-ELEN##	;GET LENGTH ^E TABLE
GVECH1:	LDB	T4,[POINT 9,ETAB##(T3),8];GET A CHAR
	CAIE	T4,(C)		;MATCH?
	AOBJN	T3,GVECH1	;NO--LOOP
	JUMPGE	T3,CPOPJ	;NO MATCH
	HRRZ	C,ETAB##(T3)	;GET SPECIAL CHAR
	POPJ	P,		;AND RETURN

GIVNAM:	SETZM	STRNAM		; Make sure we don't type junk
	PUSHJ	P,GVNAM		; Type the name
CRLFCM::OCRLF			; Then CRLF
	JRST	COMND		; and next command

GVNAM::	PUSHJ	P,SETONM##	; Setup output name area (in SOSEND)
	SKIPLE	STRCNT##	; Skip str if not needed
	PUSHJ	P,GVDSTR	; Yes -- so tell him what it is
GVNAMA:	MOVE	T4,ONMPTR##
	MOVE	T5,OEXPTR##
GVNAMB:	PUSHJ	P,GVNAM0	; Print file name
	  ; 
	SKIPE	T1,NEWPTH##	; Did he ask for a new PPN
	  JRST	GVNAMC		; Yes--type that
	TRNN	FL,READOF	; Skip if read-only
	  SKIPA	T1,NAMEO+.RBPPN	; Get current output directory
	MOVE	T1,NAMEI+.RBPPN	; Get PPN of file being read
GVNAMC:	PUSHJ	P,GVDPTH	; Type path
	PJRST	FORCE##		; and type it

; Here to print a file name on terminal.  Call with T4=address of name,
; and T5=address of extension.

GVNAM0::MOVEI	T3,OCHR##	; output routine is for terminal
GVNAM1::MOVE	T1,(T4)		; get name
	PUSHJ	P,PRTSX##	; print it
	HLLZ	T1,(T5)		; get extension
	JUMPE	T1,CPOPJ##	; but return if null
	  ; 
	MOVEI	C,"."		; yes--get a period
	PUSHJ	P,(T3)		; print it
	JRST	PRTSX		; print extension 

; Here to print PPN, if different from one's own

GVDPTH::JUMPE	T1,CPOPJ	; Don't print [0,0], it looks dumb!
	TLNN	T1,-1		; See if path pointer
	  JRST	GVAPTH		; Yes, go handle
	CAMN	T1,MYPPN##	; Same as mine?
	  POPJ	P,		; I know what mine is!
	  ;			; here to print it always
GVAPPN::MOVEI	T3,OCHR		; Routine to print a char
GVBPPN::PUSHJ	P,PRTLBK	; Type a left bracket
	PUSHJ	P,POCTPR	; Print octal pair
	PJRST	PRTRBK		; Print right bracket

GVAPTH::SKIPN	T2,.PTPPN(T1)	; Fetch PPN
	POPJ	P,		; [0,0,...] still looks dumb
	CAMN	T2,MYPPN	; Different from host PPN
	SKIPE	.PTPPN+1(T1)	; Any SFD names given?
	  CAIA			; Need to print path
	POPJ	P,		; Don't print uninteresting path
	  ; 
	MOVEI	T3,OCHR		; Routine to print a char
GVBPTH::SKIPN	.PTPPN(T1)	; Is there really something here?
	POPJ	P,		; No, then don't type anything
	HRLI	T1,(POINT 36,)	; Set up word pointer
	ADDI	T1,.PTPPN	; Point to PPN word
	PUSH	P,T1		; Save pointer
	PUSHJ	P,PRTLBK	; Print left bracket
	ILDB	T1,(P)		; Fetch the PPN
	PUSHJ	P,POCTPR	; Print octal pair
	  ; 
GVBPT0:	ILDB	T1,(P)		; Get SFD name
	JUMPE	T1,[POP P,(P)
		    JRST PRTRBK]; If end, type right bracket and return
	MOVEI	C,","		; Set to type comma
	PUSHJ	P,(T3)		; on the TTY
	PUSHJ	P,PRTSX		; Type SFD name in SIXBIT
	JRST	GVBPT0		; Loop over all SFD names

; Suboutine to type out a right bracket.  Call with T3 setup as
; the address of a typeout routine.

PRTRBK::MOVEI	C,"]"		; Closing bracket
	PJRST	(T3)		; Type it and return

; Subroutine to print T1 as an octal pair, separated by commas
; Call with T3 set up as typeout routine

POCTPR:	PUSH	P,T1		; Save T1
	HLRZ	T1,(P)		; Get the project
	PUSHJ	P,OCTPR		; Print it
	MOVEI	C,","		; Now a comma
	PUSHJ	P,(T3)		; Print that
	HRRZ	T1,(P)		; Get the programmer numer
	PUSHJ	P,OCTPR		; Print
	JRST	T1POPJ##

; Suboutine to type out a left bracket.  Call with T3 setup as
; the address of a typeout routine.

PRTLBK::MOVEI	C,"["		; Closing bracket
	PJRST	(T3)		; Type it and return

; Here to type out the current output structure name

GVDSTR::MOVEI	T3,OCHR
	SKIPE	T1,STRNAM	; Try this first
	JRST	GVDST0		; Then type it
GVOSTR::SKIPN	T1,NEWDEV	; This first
	MOVE	T1,ORGDEV	; Otherwise this one
	  ; 
	  ; Here with structure name in T1
GVDST0:	SETZM	STRNAM		; Clear before next call
GVDST1::PUSHJ	P,PRTSX		; output it
	MOVEI	C,":"		; separate with colon
	JRST	(T3)		; Finish off with his routine

GVRUN:	MOVEI	T3,OCHR##	; set up for terminal output
	MOVE	T1,RPGR		; get structure name
	JUMPE	T1,[OUTSTR [ASCIZ/SYS:COMPIL/]
		    JRST FOCRLF]
	PUSHJ	P,GVDST1	; Print structure name
	MOVEI	T4,RPGR+1	; point to file name
	MOVEI	T5,RPGR+2	; point to extension
	PUSHJ	P,GVNAM0	; print file name and extension
	SKIPE	T1,RPGR+4	; is there a PPN?
	  PUSHJ	P,GVDPTH	; Yes, then give it
	JRST	FOCRLF##	; flush out and return
	SUBTTL	The =LOCATION and =WINDOW commands

GIVLOC:	PUSHJ	P,BKPLIN##	; Backup one line
	  JRST	GLOC2		; Found start of buffer
	CAMN	T1,PGMK		; Is this a page mark?
	SOS	CPG		; On previous page
	JRST	GIVLOC		; Keep looking for start

GLOC2:	MOVE	T1,0(PNTR)	; Get the current word
	TRNN	T1,1		; Is this a line start?
	PUSHJ	P,FORLIN##	; No, find one
	JUMPE	T1,GLOC7	; None there, the buffer is empty
	CAMN	T1,PGMK		; Page mark?
	JRST	GLOC6		; Yes, and that is special
	MOVEM	T1,LINOUT	; Save the line number
	OUTSTR	LINOUT		; Type it
	MOVE	T2,CPG		; Current page number
	PUSHJ	P,DPRNT##	; Type page number in decimal
	PJRST	FOCRLF##	; end with CRLF

; Here when first line is a page mark

GLOC6:	MOVE	T2,CPG		; Current page
	ADDI	T1,1		; This is really the next page
	PJRST	PGPRN##		; Type as "Page nnn"

; Here if the low buffer is empty

GLOC7:	OUTSTR	[ASCIZ/Buffer is empty
/]
	POPJ	P,

; Here to return the current WINDOW size

GIVWDW:	SKIPA	T1,BUFLIM	; Limit of the buffer
GIVWMX:	SKIPA	T1,WINMAX	; Get maximum
	SUB	T1,BUFFIR	; from first word address
	JRST	GIV2

GIVWMN:	SKIPA	T1,WINMIN	; Get minimum
GIVWRA:	MOVE	T1,WINRAT	; Get ratio
	PJRST	GIV2		; And type


GIVNCMD:	SKIPE	NEWCMD		;/NEWCOMMAND?
	 OUTSTR	[ASCIZ/New commands not/]
	SKIPN	NEWCMD
	 OUTSTR	[ASCIZ/Old commands/]
	OUTSTR	[ASCIZ/ compatibile with version 21 features/]
	PJRST	FOCRLF##	;CRLF AND RETURN

GIVRUL:	MOVEI	T1,0		;NO PROMPT SIZE
	PUSHJ	P,LFPCLR##	;GO UP IF DPY
	TLNE	FL2,LNUMF	;LINE NUMBERS?
	 OUTSTR	[ASCIZ/        /];YES--8 SPACES
	MOVE	T1,LINEW	;GET WIDTH
	TLNE	FL2,LNUMF	;LINE NUMBERS?
	 SUBI	T1,^D8		;YES--CORRECT FOR TAB
	MOVNS	T1		;MAKE AOBJN
	HRLZI	T1,(T1)		;GET -N,,0
GIVR.1:	MOVEI	T2,1(T1)	;COPY WIDTH
	IDIVI	T2,^D10		;GET REMANDER
	ADDI	T3,"0"		;MAKE ASCII
	CAIN	T3,"0"		;SEE IF XERO
	 MOVEI	T3," "		;YES--TURN INTO SPACE
	OUTCHR	T3		;OUTPUT
	AOBJN	T1,GIVR.1	;LOOP
	PJRST	FOCRLF		;CRLF AND RETURN
	SUBTTL	Unique Initial Segment Decoder

COMMENT	!
THIS  HERE IS THE UNIQUE INITIAL SEGMENT DECODER STOLEN FROM THE
PDP10 T-S MONITOR (SEE COMCON).    IT TAKES THE ARGUMENT IN  LOC
'ACCUM' AND RETURNS THE FULL SIXBIT VALUE IN SAME.
!

DECODE:	MOVE	T1,ACCUM	; Fetch arg
	MOVNI	T2,1		; Set mask all ones
	LSH	T2,-6		; Clear out one more char
	LSH	T1,6		; Shift 1 command char off
	JUMPN	T1,.-2		; Lup until all gone
	EXCH	T2,ACCUM	; Fetch arg in t2 & save mask
	MOVNI	T3,1		; Clear found count
LUP:	MOVE	T4,@S1		; Fetch table entry
	TDZ	T4,ACCUM	; Mask out chars not typed
	CAMN	T2,@S1		; Exact match?
	JRST	FOUND		; Yes: this is it
	CAME	T2,T4		; Close match?
	JRST	LNEXT		; No: keep trying
	AOJG	T3,LNEXT	; First time?
	HRRZ	T5,S2		; Yes: rember index
LNEXT:	AOBJN	S2,LUP		; No: keep looking
	SETZM	ACCUM		; In case of ambiguity
	SKIPE	T3		; Find only one?
	POPJ	P,		; Yes, ambiguous
	MOVE	S2,T5		; Yes: ok to use saved value
FOUND:	MOVE	T5,@S1		; Get whole name
	MOVEM	T5,ACCUM	; Save it
	POPJ	P,		; Return

XCODE::	PUSH	P,S1		; Save special acs
	PUSH	P,S2
	MOVE	S1,[S2,,NAMTAB]
	MOVSI	S2,-NAMLEN
	PUSHJ	P,DECODE
	MOVE	T1,NAMDSP(S2)	; Get dispatch entry
	POP	P,S2		; Restore special acs
	POP	P,S1
	POPJ	P,
	SUBTTL	The Name Table

; This is the full name table

	DEFINE	NAMES <
X	(AEXACT,	SAEXAC, GIVAEX,	0)
X	(ALTER,		SETAAL,	GVCASE,	0)
X	(BACKSPACE,	SETBKS,	GVCASE,	0)
X	(BAK,		SETBAK,	GIVBAK,	0)
X	(BASIC,		SETBAS,	GIVBAS,	0)
X	(BAUD,		SETBAU, GIVBAU, XNUMF)
X	(BIGPG,		0,	GIVBIG,	0)
X	(BUFFER,	SETBFN,	GIVBUF,	0)
X	(NOBUFF,	CLRBFN,	GIVBUF,	0)
X	(C128,		SETM37,	GVCASE,	0)
X	(C64,		SETM33,	GVCASE,	0)
X	(CASE,		0,	GVCASE,	0)
X	(CCL,		SETCCL,	GIVCCL,	0)
X	(CCEXIT,	SETCCX,	GIVCCE,	0)
X	(RULER,	0,	GIVRUL, 0)	;
X	(OLDCOMMAND,	SETNCMD,	GIVNCMD, 0)	;
X	(CONTIGIOUS,	SETCON, GIVSEQ, 0)
X	(CRLF,		SETCRF,	GIVCRF,	XNUMF)
X	(NOCCL,		CLRCCL,	GIVCCL,	0)
X	(NOCRLF,	CLRCRF,	GIVCRF,	0)
X	(DECIDE,	SETDCD,	GIVDCD,	0)
X	(DEFINE,	SETDEF##, GIVDEF##, XVARF)
X	(LDEFINE,	SETLDF##, GIVDEF##, XVARF)
X	(MACRO,		SETMAC##, GIVMAC##, 0)
X	(NOMACRO,	CLRMAC##, GIVMAC##, 0)
X	(PURGE,		PURDEF##, 0,	XVARF)
X	(INITIALIZE,	SETINI,	0,	0)
X	(DECRYPT,	SETDSW, 0,0)
X	(DELETE,	SETDLF, GIVDLF, 0)
X	(DSK,		0,	GIVDSK,	0)
X	(DISPLAY,	SETDIS, GIVDIS, 0)
X	(DISK,		0,	GIVDSK,	0)
X	(DPY,		SETDPY,	GVCASE,	0)
X	(DPYALT,	SETDPA,	GVCASE,	0)
X	(ERROR,		0,	GIVER,	0)
X	(ENCRYPT,	SETPSW, 0,0	)
X	(EXACT,		SEXACT, GIVEXA,	0)
X	(EXPERT,	SETEXP,	GIVEXP,	0)
X	(FILLCLASS,	SETFCL,	GIVFCL,	XNUMF)
X	(NOFILL,	CLRFCL,	GIVFCL,	0)
X	(FILE,		SETNAM,	GIVNAM,	XVARF)
X	(INCREMENT,	SETINC,	GVINC,	XNUMF)
X	(ISAVE,		SETISV,	GVISAV,	XNUMF)
X	(INFORM,	SETINF,	GIVINF,	0)
X	(INSERT,	SETAIN,	GIVAIN,	0)
X	(LC,		SETTXT,	GIVLC,	0)
X	(LENGTH,	SETLEN,	GVPG,	XNUMF)
X	(LF,		SETLF,	GIVLF, 0)
X	(NOLF,		CLRLF,	GIVLF,	0)
X	(NOCCEX,	CLRCCX,	GIVCCE,	0)
X	(LMAR,		SETLMR,	GVLM,	XNUMF)
X	(LOCATION,	0,	GIVLOC,	0)
X	(LOWER,		SETLOW,	GVCASE,	0)
X	(M33,		SETM33,	GVCASE,	0)
X	(M37,		SETM37,	GVCASE,	0)
X	(MAXLN,		SETMLN,	GVMLN,	XNUMF)
X	(NAME,		SETNAM,	GIVNAM,	XVARF)
X	(NEWALTER,	SETNALT, GIVNALT, 0)
X	(NOALTER,	CLRALT,	GVCASE,	0)
X	(NOAEXACT,	CAEXACT, GIVAEX,0)
X	(NOBACKSPACE,	SETNBS,	GVCASE,	0)
X	(NEWCOMMAND, CLRNCMD,GIVNCMD, 0)	;
X	(NOBAK,		CLRBAK,	GIVBAK,	0)
X	(NODECIDE,	CLRDCD,	GIVDCD,	0)
X	(NODISPLAY,	CLRDIS, GIVDIS, 0)
X	(NODELETE,	CLRDLF,	GIVDLF,	0)
X	(NOEXAC,	CEXACT,	GIVEXA,	0)
X	(NOINFO,	CLRINF,	GIVINF,	0)
X	(NOINSE,	CLRAIN,	GIVAIN,	0)
X	(NOLC,		SETPRG,	GIVLC,	0)
X	(OLDALTER,	CLRNALT, GIVNALT, 0)
X	(NOSEPARATORS,	QSOFF,	GIVSEP,	0)
X	(NOSEQUENCE,	SETSEQ,	GIVSEQ,	0)
X	(NONUMBER,	SETNNM,	0,	0)
X	(NOQZBAK,	CLRQZB,	GIVBAK,	0)
X	(NOTELL,	SETNTL,	0,	0)
X	(NOUC,		SETTXT, GIVLC,  0)
X	(NOVICE,	SETNOV,	GIVEXP,	0)
X	(NOXINSERT,	CLRXIN, GIVXIN, 0)
X	(NOEXPERT,	SETNOV,	GIVEXP,	0)
X	(NUMBER,	SETNUM,	0,	0)
X	(OLD,		SETOLD,	GIVBAK,	0)
X	(OPTION,	SETOPT,	0,	XVARF)
X	(PLINES,	SETPLN,	GVPLN,	XNUMF)
X	(PMAR,		SETPMR,	GVPM,	XNUMF)
X	(PROGRAM,	SETPRG, GIVLC,  0)
X	(PROTECTION,	SETPRT,	GVPRT,	XNUMF)
X	(QZBAK,		SETQZB,	GIVBAK,	0)
X	(R,		SETRED,	GIVRDO,	0)
X	(READO,		SETRED, GIVRDO, 0)
X	(RONLY,		SETRED,	GIVRDO,	0)
X	(REFDLY,	SETDLY,	GIVDLY,	XNUMF)
X	(NOREFD,	CLRDLY,	GIVDLY,	0)
X	(RMAR,		SETRMR,	GVRM,	XNUMF)
X	(RUN,		SETRUN,	GVRUN,	XVARF)
X	(SAVE,		SETSAV,	GVSAV,	XNUMF)
X	(SEPARATORS,	QSON,	GIVSEP,	0)
X	(SEQUENCE,	CLRSEQ,	GIVSEQ,	0)
X	(STANDARD,	SETSTD,	GVCASE,	0)
X	(START,		SETFST,	GIVFST,	XNUMF)
X	(STEP,		SETSTP,	GIVSTP,	XNUMF)
X	(STRING,	0,	GVSTR,	0)
X	(TELL,		SETTEL,	0,	0)
X	(TEXT,		SETTXT, GIVLC,  0)
X	(UC,		SETPRG, GIVLC,  0)
X	(UNDERLINE,	SETUND, GIVUND, 0)
X	(NOUNDERLINE,	CLRUND, GIVUND, 0)
X	(UNSEQUENCE,	SETSEQ,	GIVSEQ,	0)
X	(UPPER,		SETUPP,	GVCASE,	0)
X	(X,		SETEXM,	GIVRDO,	0)
X	(XINSERT,	SETXIN, GIVXIN, 0)
X	(XSEQUENCE,	SETXSQ,	GIVSEQ,	0)
X	(WIDTH,		SETWTH,	GIVWTH,	XNUMF)
X	(WINDOW,	SETWDW,	GIVWDW,	XNUMF)
X	(WMAXIM,	SETWMX, GIVWMX, XNUMF)
X	(WMINIM,	SETWMN, GIVWMN,	XNUMF)
X	(WRATIO,	SETWRA,	GIVWRA,	XNUMF)
>

	DEFINE	X(A,B,C,D) <
	EXP	<SIXBIT /A/>>

NAMTAB:
	NAMES

NAMLEN==.-NAMTAB

	DEFINE	X(A,B,C,D) <
	D+C,,B
>

XNUMF==3B20		; Set needs numeric arg
XVARF==1B19		; Set needs arg

NAMDSP:
	NAMES

	XERR,,XERR

XERR::	SKIPE	ACCUM		; Accum zero?
	NERROR	ILC		; Syntax problems
	SKIPG	T3		; Ambiguous?
	NERROR	NPN		; No, just wasn't one like that
	NERROR	APN		; Yes

	XLIST
	LIT
	LIST
	RELOC	0

INTFLG::BLOCK	1
SWUNDER::BLOCK	1

	END