Google
 

Trailing-Edge - PDP-10 Archives - steco_19840320_1er_E35 - 10,5676/teco/source/tecfcm.mac
There are 3 other files named tecfcm.mac in the archive. Click here to see a list.
	SUBTTL	Introduction

; Copyright (c) 1981, 1982 Stevens Institute of Technology, Hoboken, New Jersey
; 07030.

; This software may be used and copied provided that this copyright notice
;is included, and provided that copies of all modifications are sent to:
;
;	TECO Project
;	Computer Center
;	Stevens Institute of Technology
;	Castle Point Station
;	Hoboken, New Jersey    07030
;
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by Stevens Institute of
; Technology.

  ; Search needed universals

	SEARCH	TECUNV		; TECO universal file

  ; Generate the prologue


	TECVER==200		; Major version number
	TECMIN==1		; Minor version number
	TECEDT==1145		; Edit level
	TECWHO==0		; Last editor


	PROLOGUE(FCM,<TECO F command processing>)	; Generate the TITLE and other stuff
	SUBTTL	Table of Contents
	SUBTTL	Revision History

COMMENT	|

Start of Version 200A(1126)


1145	By: Nick Bush		On: 8-Febuary-1982
	Re-write command input routines to implement FI command. As part of this
	allow user to set prompt by storing the prompt text for normal commands in
	the Q-register 'COMMAND-PROMPT'.
	Modules: TECUNV,TECPRS,TECCIN,TECFCM,TECVID,TECUPD
|
	SUBTTL	F commands -- Initialization

;+
;.hl1 FC$INI
;This routine will initialize the F command processing module.
;.literal
;
; Usage:
;	PUSHJ	P,FC$INI
;	(Return)
;
; On return:
;	- Module initialized
;
;.END LITERAL
;-

	$CODE				; Generate code for this

FC$INI:	POPJ	P,			; Just return for now
	SUBTTL	F commands -- FI -- Input from terminal

;+
;.hl1 FICMD
;-

FICMD:	SETZ	T1,			; No Default Q-register
	PUSHJ	P,SCNQRG		; Scan off the Q-register name
	  ERROR	E.IQN			; Complain
	MOVE	P1,T1			; Copy the QRG address
	MOVEI	T1,XCTBUF		; Point to the execution buffer
	MOVEI	T2,SKRCH		; Input routine
	PUSHJ	P,SCNKEY		; Scan off a keyword
	  ERROR	E.UTK			; Failed, problem.
	MOVE	T1,[XWD -FILEN,FITBL]	; Get the table pointer
	PUSHJ	P,FNDKWD		; Find the keyword
	  ERROR	E.IKW			; Illegal keyword
	MOVE	P2,T1			; Copy the index to a safer place
	MOVE	T1,P1			; Get the QRG address back
	PUSHJ	P,QTXTEI		; Make sure it has text
	LOAD.	T2,BLKPT,(T1)		; Get the end of the buffer
	MOVE	P4,T2			; Get a copy of the position
	LOAD.	P3,BLKEND,(T1)		; Get the end address
	STOR.	P3,BLKPT,(T1)		; And make that the current position
	MOVE	T1,P1			; Get the address of the QRG
	PUSHJ	P,C$CINI		; Initialze the command input
	LOAD	T1,$QRFLG(P1),QR$DLC	; Get the display last CRLF flag
	PUSH	P,T1			; Save it
	BITON	T1,QR$DLC,$QRFLG(P1)	; And make sure it is on now

	TXO	F,F.INFI		; Flag we are in an FI command
	PUSHJ	P,@2(P2)		; Call the right routine
	TXZ	F,F.INFI		; No longer in FI

	POP	P,T1			; Get the QR$DLC flag back
	STOR	T1,$QRFLG(P1),QR$DLC	; Store it back

; Now to return the string argument to the caller

	LOAD.	T2,TPTADR,+$QRTPT(P1)	; Get the text block address again
	LOAD.	T1,BLKEND,(T2)		; Get the new end of the buffer
	CAMGE	T1,P4			; Did something get deleted?
	 MOVE	P4,T1			; Yes, can't put PT after END
	STOR.	P4,BLKPT,(T2)		; Store the old position back
	SUB	T1,P3			; Compute the number of characters
	JUMPLE	T1,[SETZ T1,		; Flag we want a null string
		PUSHJ	P,GETSTR	; Get it
		PJRST	PASRET]		; And pass the argument on
	PUSHJ	P,GETSTR		; Get buffer
	LOAD.	T4,TPTADR,+$QRTPT(P1)	; Get the buffer address
	XMOVEI	T1,.BKTLN(T4)		; Get the address of the text
	MOVE	T2,P3			; Get the old end
	IDIVI	T2,5			; Compute the byte and word offset
	ADD	T1,T2			; Build the address
	TDO	T1,BTAB-1(T3)		; Build the byte pointer
	LOAD.	T2,BLKEND,(T4)		; Get the end of the buffer
	SUB	T2,P3			; Compute the number of characters
	LOAD.	T3,TPTADR,+SARG$1	; Get the address of the destination
	XMOVEI	T4,$QRTPT(P1)		; Get the TPT address
	PUSHJ	P,M$INSS		; Insert the string
	PJRST	PASRET			; And return to the caller
	SUBTTL	F commands -- FI -- Dispatch table

DEFINE	FINAM,<
STR	<INPUT-FILE>,<FI$INP>
STR	<OUTPUT-FILE>,<FI$OUT>
STR	<LINE>,<FI$LIN>
STR	<COMMAND-TEXT>,<FI$CMD>
STR	<SINGLE-CHARACTER>,<FI$CHR>
>; End of FINAM macro definition

DEFINE	STRSUB(RTN),<EXP IFIW	RTN>

	SYN	FINAM,STRTBL

	DOSTR	(FI)
	SUBTTL	F commands -- FI -- INPUT-FILE

;+
;.hl2  FI$INP
;This routine will parse an input file specification.
;-

FI$INP:
TOPS10<
	FALL	FI$OUT			; Just input a file spec
>; End of TOPS10
TOPS20<
	JMPS	FIIN.1			; Do the messy version

; At this point we know that the prompt has been output to the terminal.
; All that need be done is to just do a GTJFN% and a JFNS% to get the
; full file specification associated with it.

	MOVX	T1,GJ%SHT+GJ%NEW+GJ%FNS	; Get the bits
	MOVX	T2,<.PRIOU,,.PRIIN>	; Get the JFNs to use
	GTJFN%				; Get the file specification
	 ERJMP	FIIN.2			; Failed, handle it
	MOVE	T2,T1			; Get the JFN and flags
DEFINE	X(NAM)<INSVL.(.JSAOF,JS%'NAM)>
	MOVX	T1,<<X(DEV)>!<X(DIR)>!<X(NAM)>!<X(TYP)>!<X(GEN)>!<X(PRO)>!<X(ACT)>!JS%PAF>
	MOVE	T3,[XWD -1,FILSPC]	; Get the file specification
	JFNS%				; Convert the JFN to a string
	SETZ	P1,			; Clear the last byte
	IDPB	P1,T3			; . . .
	CLOSF%				; Close the JFN
>; End of TOPS20
	SUBTTL	F commands -- FI -- OUTPUT-FILE


;+
;.hl2 FI$OUT
;This routine will parse an output file specification.
;-

FI$OUT:
TOPS10<
	FALL	FI$LIN		; Just get a line's worth
>; End of TOPS10 conditional
	SUBTTL	F commands -- FI$LIN -- LINE

;+
;.hl2 FI$LIN
;This routine will parse a line that ends with a standard monitor break
;character.
;-

; Mask of break characters
	BITMSK	(BRKCHR,.CH,<ESC,FFD,VTB,BEL,LFD,CNZ,CNC>)

FI$LIN:	PUSHJ	P,C$PRMT	; First output the prompt

; Now loop getting characters until we get an EOL.

FLIN.0:	PUSHJ	P,C$ICHE	; Get a character with editing
	JUMPGE	CH,FLIN.1	; If editing character, just try again
	MOVE	T1,CINQRG	; Get the QRG address
	LOAD.	T1,TPTADR,+$QRTPT(T1) ; And set up to check
	CFMG.	T2,BLKPT,(T1),PMTLEN ; Anything after the prompt?
	 JRST	FI$LIN		; No, start from the top
	JRST	FLIN.0		; Yes, just get another character

FLIN.1:	CAXN	CH,.CHCNR	; Control-R?
	 JRST	FLIN.R		; Yes, go handle it
	MOVX	T1,BRKCHR	; Get the mask of break characters
	LSH	T1,(CH)		; Is it one?
	JUMPGE	T1,FLIN.0	; No, try again
	MOVE	T1,CINQRG	; Get the QRG address
	BITON	T2,QR$UPD,$QRFLG(T1) ; Flag that it needs updating
	PUSHJ	P,C$DLCH	; Yes, remove it from the buffer
	 POPJ	P,		; Should really happen, but ignore it
	CAXE	CH,.CHLFD	; Was it a line feed?
	 POPJ	P,		; No, all done
	MOVE	T1,CINQRG	; Get the QRG address
	LOAD.	T1,TPTADR,+$QRTPT(T1) ; And the address of the buffer
	LOAD.	T2,BLKPT,(T1)	; Get the pointer
	SOJL	T2,.POPJ	; If nothing else, just return
	IDIVI	T2,5		; Convert to word/byte
	ADD	T1,T2		; Point to the correct place
	ADDX	T1,.BKTLN	;  .  .  .
	TDO	T1,BTAB(T3)	;  .  .  .
	LDB	CH,T1		; Get the character
	CAXN	CH,.CHCRT	; Is it the CR of a CRLF?
	 PUSHJ	P,C$DLCH	; Yes, delete the character
	  JFCL			; Ignore error return
	POPJ	P,		; And return

; Here on a control-R.

FLIN.R:	PUSHJ	P,C$DLCH	; No, delete on character
	 JFCL			; Ignore the error return
	JMPS	FLIN.V		; Video mode?
	XCT	$CRCTU(CRT)	; Kill the line from the screen
	PUSHJ	P,C$RPRT	; Reprint it
	JRST	FLIN.1		; And go for the next character

FLIN.V:	PUSHJ	P,V$CTRG	; Do the update
	JRST	FLIN.1		; And try again
	SUBTTL	F commands -- FI$CMD -- COMMAND-TEXT

;+
;.hl2 FI$CMD
;This routine will parse text that ends with two escape characters.
;-

FI$CMD:	SETZ	CH,		; Flag nothing typed in yet
	PUSHJ	P,C$INPT	; Just input the command text
	 JRST	FI$CMD		; Until he gets it right
	POPJ	P,		; All done
	SUBTTL	F commands -- FI$CHR -- SINGLE-CHARACTER

;+
;.HL2 FI$CHR
; This routine will input a single character appending it to the Q-register.
;-

FI$CHR:	PUSHJ	P,C$PRMT	; Prompt
	PUSHJ	P,C$ICHE	; Input a character
	POPJ	P,		; And return
	SUBTTL	Low segment

	$IMPURE			; Impure data area
	LOWVER(FCM,1)		; Low segment version number

F$ZBEG:!

TOPS20<
FILSPC:	BLOCK	40		; File specification
>; End of TOPS20 conditional

F$ZEND==.-1
	SUBTTL	End of TECFCM

	END			; End of TECFCM