File: LI.TK of Tape: Sources/Multi8/m8-tk-etc-20-10-80
(Source file text) 

/LI.TK 14-MAY-80
/
/NAME:	IN ("I^100+"N&3777) LIN
/
/FUNCTION:THIS MODULE READS ONE LINE OF TEXT AND PUTS THE
/	CHARACTERS ONE BY ONE INTO THE BUFFER OF THE CALLING
/	MODULE, WHICH ALSO SPECIFIES THE INPUT DEVICE NAME.
/	THE MODULE SERVES ALSO FOR OUTPUT ONLY.
/
/CONCEPT:A LOT OF MODULES NEED PROPER INPUT FROM SOME
/	INPUT DEVICE, WHILE NOT BOTHERING ABOUT THINGS LIKE
/	RUBOUT CHARACTERS ETC. THE CALLING MODULE ONLY
/	SPECIFIES THE INPUT DEVICE AND THE SIZE OF THE
/	RESERVED BUFFER. THE BUFFER MAY BE LOCATED IN
/	ANY FIELD. (SEE FORMAT)
/THE FOLLOWING CONTROLCHARS ARE RECOGNISED:
/	RUBOUT	:DELETE ONE CHAR TO THE LEFT
/	CTRL/U	:DELETE THE WHOLE LINE
/	LF	:REPEAT THE WHOLE LINE
/	CR	:TERMINATES THE LINE;TAKES NORMAL RETURN
/	CONTROL CHARS. :IGNORED (EXCEPT BELL,BS,TAB)
/
/	THE VERY FIRST THING THE MODULE DOES, IS TO
/	PRINT ALL CHARACTERS IN THE BUFFER UNTIL IT
/	ENCOUNTERS A 0000. THEN THE INPUTSTRING IS
/	ENTERED OVER THE OUTPUTSTRING.
/
/ERRORS:1) NO INPUT DEVICE SPECIFIED
/	2) INPUT MODULE BUSY OR NOT AVAILABLE
/	3) ILLEGAL CONTROL CHARACTER TYPED
/	4) LINE TOO LONG FOR BUFFER;TYPES "?"
/
/TASKCIRCULATION:BETWEEN TYPE-INS AND ECHOES
/USE:	CDF TO FIELD OF BUFFER
/	TAD (POINTER TO BUFFER
/	JMS MONITOR
/	   CALL
/	   "I^100+"N&3777
/	 ERROR RETURN	/"IN" NOT AVAILABLE
/	NORMAL RETURN; ERROR RETURN IF AC UNEQ. 0
/NOTE! UPON RETURN DF STILL POINTS TO FIELD OF BUFFER.

/FORMAT IN:
/BUFFER,NAME OF INPUT DEVICE
/	-LENGTH OF BUFFER
/	ZBLOCK (LENGTH)	/THE ACTUAL BUFFER AREA

/THE BUFFER MAY ALSO CONTAIN TEXT TO BE PUT OUT:
/BUFFER,NAME OF INPUT DEVICE
/	-LENGTH OF BUFFER
/	"T;"E;"X;"T;0000	/TEXT;ZERO IS TERMINATOR
/	ZBLOCK (THE REST)	/IF 215=TERMINATOR:NO INPUT!!
/
/NOTE THAT THE INPUTSTRING STARTS AT BUFFER+2 !!

	SCOPE=1			/IF MOST TERMINALS ARE VIDEO
/NOT THAT THE DATAFIELD POINTS TO THE CALLER'S FIELD
/NEARLY ALL THE TIME.

LINPTR,	"I^100+"N&3777	/NAME 'IN'
	200		/ONE PAGE;NO CONNECTS
LINSWI,	0		/-1 IF ERROR

LINBEG,
LINE,	DCA LINBEG	/SET UP POINTER TO FETCH ARGS
LINCNT,	TAD I LINBEG	/SAVE INPUT DEVICENAME
LINLEN,	DCA LINPUT
	TAD LINPUT
	TAD ("T-"K^100	/FORM OUTPUT DEVICE NAME
	DCA LINONAM
	ISZ LINBEG
	TAD I LINBEG	/-MAX LENGTH
	DCA LINLENG
	TAD I ZMYCDF	/SAVE CDF A NUMBER OF TIMES
	DCA LICDF
	TAD LICDF
	DCA LINCDF
	ISZ LINBEG	/POINTS TO BEGINNING OF BUFFER
LISTAR,	TAD C215	/TYPE CRLF
	JMS LINOUT
	TAD C212
	JMS LINOUT
LINE0,	TAD LINLENG	/USE LINCNT AS COUNTER
	DCA LINCNT
	TAD LINBEG	/MOVE POINTER TO BEGINNING
	DCA LINPTR
LINE1,	JMP LINE2	/READ A CHAR;BECOMES 'JMS MONITOR'
	   CALL
LINPUT,	   0		/NAME OF INPUT MODULE
	 JMP LINE1	/MODULE BUSY?
LICDF,	 HLT		/RESTORE DF;YOU NEVER CAN TELL
	DCA I LINPTR	/SAVE IN BUFFER
LINE2,	TAD I LINPTR	/BRANCH FOR CONTROLS
	SNA		/IGNORE BLANKS
	 JMP LIPATCH
	TAD (-377
	SNA
	 JMP LINERUB	/RUBOUT
	TAD (-212+377
	SNA
	 JMP LINLF	/LF
	TAD M3		/(-215+212
	SNA
	 JMP LINECR	/CR
	TAD M10		/(-225+215
	SNA
	 JMP LINEU	/CTRL/U, LINE OVER
	TAD (-240+225
	SMA		/PRINTING CHAR ?
	JMP LISPACE	/OK
	TAD (-212+240	/^A-^H, BELL, BS, TAB ?
	SMA
	 JMP LINE1	/NO, CONTROL CHARS ABOVE TAB IGNORED
	TAD (-240+212	/YES, ECHO THEM
LISPAC,	TAD C240
	JMS LINOUT	/ECHO THE CHAR
	ISZ LINPTR	/MOVE PNTR
	ISZ LINCNT	/BUF FULL?
LINJMP,	 JMP LINE1	/N
LINERR,	ACM1		/AC=7777=ERROR
	DCA LINSWI	/PRINT "?(CRLF)", TAKE ERROR RET.
	TAD ("?
	JMS LINOUT
LINECR,	TAD C215	/PRINT "(CRLF)", TAKE NORMAL RET.
	JMS LINOUT
	TAD (4212	/RELEASE OUTPUT TASK
	JMS LINOUT
	TAD LINSWI
LINEX,	JMS MONITOR
	   EXIT SWPOUT	/NEEDS A NEW IMAGE EVERY TIME

LINEU,
IFNDEF SCOPE <
	TAD ("^		/ECHO ^U CRLF
	JMS LINOUT
	TAD ("U
	JMS LINOUT
	JMP LISTAR	/START ALL OVER AGAIN >
IFDEF SCOPE <
	JMS RUBIT	/RUBOUT,RUBOUT,...
	JMP LINEU	/ >
LINOUT,	.-.		/OUTPUT ONE CHAR
	TAD (4000
LINO1,	ISZ COUNT
	SKP
	 JMP LINEX	/WAITING TOO LONG
LJMSM,	JMS MONITOR
	   CALL
LINONAM,   0		/NAME FILLED IN HERE
	 JMP LINO1	/DEVICE BUSY
	CLA
	DCA COUNT
LINCDF,	HLT		/RESTORE DF
	JMP I LINOUT

LINERUB,JMS RUBIT
	JMP LINE1

RUBIT,	0
	TAD LINCNT	/BUF EMPTY?
	CIA
	TAD LINLENG
	SNA CLA
	 JMP LINE0	/Y
	ACM1		/N;COUNTER -1
	TAD LINCNT
	DCA LINCNT
	ACM1		/POINTER -1
	TAD LINPTR
	DCA LINPTR
IFDEF SCOPE <
	TAD (210	/PRINT BACKSPACE
	JMS LINOUT
	TAD C240	/SPACE
	JMS LINOUT
	TAD (210	/BACKSPACE >
IFNDEF SCOPE <
	TAD ("\		/PRINT BACKSLASH >
	JMS LINOUT
	JMP I RUBIT

COUNT,	0
/LF: REPEAT THE WHOLE LINE
/THE MECHANISM IS AS FOLLOWS: THE LF CHAR IS REPLACED
/BY A 0000. THEN A PATCH IS MADE AT LINE1, IN ORDER THAT
/INPUT IS FROM THE BUFFER ITSELF. AS THERE ARE NEVER
/ZEROES IN THE BUFFER, THE VERY FIRST ZERO RESTORES THE
/PATCHED LOCATION. IN FACT IT DOES NO HARM TO DO IT
/FOR EVERY BLANK:

/THE LINEFEED PATCHES A 'JMP LINE2'
LINLF,	DCA I LINPTR	/PUT A ZERO IN BUFFER
	TAD (JMP LINE2
	DCA LINE1
	JMP LISTAR	/PRINT CRLF AND THE WHOLE LINE

LIPATCH,TAD LJMSM	/'JMS MONITOR'
	DCA LINE1
	JMP LINE1
/FOR THE VERY FIRST TIME A 0000 HAS A DIFFERENT MEANING:
/IT TERMINATES THE BUFFER-TYPEOUT.THERE IS A PATCH
/OVER A PATCH:
*LIPATCH+2
	TAD LINJMP	/RESTORE 'JMP LINE1'
	DCA .-1
	JMP LINE0

	PAGE
	$$$$$$