File: XONOF.PA of Tape: OS8/OS8-Latest/new-12
(Source file text) 

/ASYNC XONOF COMMUNICATION V40
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1980   BY DATAPLAN GMBH, LAUDA, BRD
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DATAPLAN GMBH.
/DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR ANY ERRORS THAT MAY APPEAR
/IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DATAPLAN'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DATAPLAN.
/
/DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
/OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DATAPLAN.
/
/
/
/
/
/
/
/
/
/
/
/W.V.D.MARK, DP CONSULTING, ZUERICH.
/JAN-1980
	*0

	-1
	DEVICE XONF;DEVICE COMM;600;COM&177+4000;ZBLOCK 2

/TWO-PAGE COMMUNICATION HANDLER FOR OS/8 V3.
/ON INPUT, RECOGNIZES ^Z, ^U FROM LINE, ^C FROM KEYBOARD
/^Z	MEANS END OF INPUT, INSERT ^Z IN BUFFER,
/	PAD WITH ZEROES
/^C	FROM KEYBOARD:MEANS ABORT JOB
/	RETURN TO OS/8 VIA LOC 7600 TO SAVE CORE
/^U	MEANS DELETE THE LAST LINE
/	(LINE STARTS AT BEGIN OF BUFFER AND IS TERMINATED BY A LF)
/	LF IS ENTERED INTO BUFFER, BUFFER IS THEN PADDED WITH NULLS.
/^S	WHEN THE HANDLER RETURNS DATA TO THE PROGRAM,
/	I.E. WHEN IT IS UNABLE TO REACT TO CHARACTERS
/	COMING FROM THE LINE, IT SENDS A ^S JUST AFTER
/	HAVING ACCEPTED THE LAST CHARACTER.
/^Q	WHEN THE PROGRAM RETURNS TO THE HANDLER AFTER
/	HAVING TREATED THE DATA, THE HANDLER WILL FIRST
/	SEND A ^Q TO RESUME RECEIVING.

/ON OUTPUT RECOGNIZES ^O, ^S, ^Q FROM LINE AND ^C FROM KEYBOARD
/^C	FROM KEYBOARD:CAUSES JOB TO ABORT
/	RETURN TO OS/8 VIA LOCATION 7600 TO SAVE CORE.
/^O	CAUSES TRANSMIT BY THE HANDLER TO CEASE, TILL
/	ANY OTHER CHARACTER RESUMES THE TRANSMISSION.
/^S	CAUSES THE HANDLER TO STOP SENDING TO LINE,
/	BEFORE THE CURRENT CHARACTER GOES OFF.
/	THIS ALLOWS THE RECEIVER TO DO OTHER THINGS.
/^Q	RESUMES HANDLER SENDING TO RECEIVER.
/	THE FIRST CHARACTER SENT IS THE ONE WHICH
/	WAS INHIBITED BY THE PRECEDING ^S.

/	ALWAYS IGNORES NULLS
/	HANDLES TABS CORRECTLY (INCLUDING COLUMN COUNTING)
/	DOES AUTOMATIC CR/LF AT END OF LINE WIDTH.

	COMVERSION="M&77

	LINCOD=30
/	THE DEVICE CODE OF THE FULL-DUPLEX INTERFACE 
/	(V24 OR CURRENT LOOP) WHICH IS INSTALLED IN
/	YOUR SYSTEM FOR THIS APPLICATION.
/	LINCOD=30 IS FOR THE SLU2 PORT OF VT78.
	TLSL=LINCOD^10+6016
	TSFL=LINCOD^10+6011
	KRBL=LINCOD^10+6006
	KSFL=LINCOD^10+6001
/CROSS PAGE LINKAGE:

/THIS CODE MUST BE ABLE TO LOAD INTO ANY TWO PAGES OF CORE
/THE ENTRY POINT IS AT THE NEXT LOCATION TO THE END OF THE FIRST PAGE
/AT THE END OF THE FIRST PAGE WE JMS TO PLINK,
/THIS LEAVES THE ADDRESS OF THE FIRST LOCATION OF THE NEXT PAGE
/IN LOCATION 'PLINK' .  THIS JUST HAPPENS TO BE THE ADDRESS
/OF BOTH COMPCH AND COMGCH.

/COMPCH AND COMGCH SHARE THE SAME ENTRY POINT.
/IF IT IS CALLED WITH A 0 AC, IT IS A CALL TO COMGCH,
/IF IT IS CALLED WITH A NON-ZERO AC, IT IS A CALL TO COMPCH.

/COMGCH JUST GETS THE CHARACTER FROM THE LINE AND CHECKS THE
/KEYBOARD FOR ^C,IF NOT, IT RETURNS THE CHAR TO PAGE 1.

/COMPCH TAKES RETURN 1 IF IT WANTS THE HANDLER TO GO AWAY,
/I.E IF IT SAW A ^Z.
/IT NORMALLY TAKES RETURN 2 
/AND TAKES RETURN 3 IF THE LINE OVERFLOWED.


	WIDTH=210
	*200

L3700,	3700		/*200
PUNCH,	0		/MAKE SURE AC NON-ZERO
	JMS I PLINK	/CALL COMPCH
	JMP	COMRTN	/RETURN ON OUTPUT
	JMP I	PUNCH	/DID WE REACH END OF COM LINE?:NO
	JMS CRLF	/YES, PERFORM CR/LF
	JMP I PUNCH	/RETURN

TMP,
CRLF,	0
	TAD COM215
	JMS I PLINK	/CALL COMPCH TO PRINT CR
COM70,	70		/*212  *EOF AND EOL IMPOSSIBLE
COM240,	TAD COM212
	JMS I PLINK	/CALL COMPCH TO PRINT LF
CIFCDF,	CIF CDF 0	/*215  *EOF AND EOL IMPOSSIBLE
	JMP I CRLF	/RETURN

COMCA,	0
COMWC,	0
BUFSIZ,	0
BUFSTRT,0
COMCDF,	CDF 0
COM5,	5
M232,	-232

PLINK,	0		/GETS ADDRESS OF COMPCH AND COMGCH (START OF NEXT PAGE)
	STL CLA RAR	/4000
	TAD I COM	/RETRIEVE FUNCTION WORD, BUT PUT R/W BIT IN LINK
COM200,	AND L3700	/EXTRACT NUMBER OF DOUBLE-WORDS TO TRANSFER
	CMA		/GET COUNT+1
COM221,	DCA BUFSIZ	/STORE AWAY
	RDF		/FIND OUT THE USER'S DATA FIELD
COM215,	TAD CIFCDF	/FORM OUR EXIT CIF CDF
	DCA COMXIT	/STORE AWAY FOR EXIT ROUTINE
	TAD I COM	/GET FUNCTION WORD
COM212,	AND COM70	/ISOLATE FIELD OF BUFFER
COM223,	TAD COMCDF	/FORM CDF TO FIELD OF BUFFER
	DCA CMCDBF	/STORE WHERE IT WILL BE USEFUL
			/AT SAME TIME, INITIALIZE COMEOF
	ISZ COM		/POINT TO BUFFER ADDRESS
	TAD I COM	/AND GET IT
	DCA BUFSTRT	/AND SAVE IT
	ISZ COM		/POINT TO BLOCK #
	ISZ COM		/POINT TO ERROR RETURN
SHIFT,			/OUTPUT SHIFT REGISTER
COMEOF,			/0 IF SAW CR OR ^Z AND WISH TO PAD BUFFER WITH 0'S
CMCDBF,	HLT		/ : CDF BUFFER FIELD
	JMP COMKLG
COMLP,	SNL CLA		/LINK=1 MEANS OUTPUT
	JMP COMGET	/INPUT IS FROM COM:
/LINK MUST BE SET FIRST TIME THROUGH HERE.
/IT ACTS AS A GUARD BIT IN THE SHIFT REGISTER
ROTL,	RTL
	RTL
	SPA		/DO WE HAVE 8 BITS SHIFTED IN?
	JMP TELP
	DCA SHIFT	/SAVE SHIFT REGISTER
	TAD I BUFSTRT
	SZA		/PREVENT ZERO KILLER
	JMS PUNCH	/PRINT A CHARACTER
	TAD I BUFSTRT
	ISZ BUFSTRT	/BUMP INPUT POINTER
CM7400,	7400		/PROTECT ISZ
	AND CM7400
	CLL RAL
	TAD SHIFT	/SHIFT HIGH ORDER 4 BITS INTO
	JMP ROTL	/SHIFT REGISTER
TELP,	JMS PUNCH	/PRINT 3RD CHARACTER OF DOUBLE-WORD
	STL		/*KLUDGE
COMKLG,	ISZ BUFSIZ	/DONE?
	JMP COMLP	/NOT YET
COMX,	TAD COMEOF	/IF INPUT AND WE WERE PADDING WITH 0'S
	SZA CLA		/TAKE SOFT ERROR EXIT
COMRTN,	ISZ COM		/POINT TO NORMAL RETURN
			/CAN'T GET ERROR OR END-OF-FILE ON OUTPUT
COMXIT,	HLT		/RETURN TO USER'S FIELD
	JMP I COM	/RETURN TO USER

XOFF,	0		/LITTLE ROUTINE TO SEND XOFF
	TAD	COMEOF	/IF COMEOF = 0 ALREADY DONE
	SNA CLA
	JMP I	XOFF
	TAD	COM223
	JMS	PUNCH
	JMP I	XOFF
COMGET,	TAD	COM221	/WE ARE BACK FOR RECEIVE
	JMS	PUNCH	/SO SEND XON TO TRANSMITTER
	TAD BUFSTRT
	DCA COMCA	/POINT TO START OF BUFFER
	TAD BUFSIZ
	CLL RAL		/CONVERT DOUBLE-WORDS TO WORDS
	DCA COMWC	/SET SIZE OF BUFFER
TSTEND,	TAD COMEOF
	SNA CLA
	JMP ZERO
	JMS I PLINK	/CALL COMGCH TO GET A CHARACTER
ZERO,	TAD	COM200	/SET BIT 200 CONVENTION
	DCA I COMCA	/STORE AWAY TEMPORARILY
			/USING USER'S BUFFER AS A TEMP LOCATION
	TAD I	COMCA	/AND AGAIN FOR CTRL Z TEST
	TAD	M232
	SNA
	JMS	XOFF	/INHIBIT RECEIVE
	SNA
	DCA	COMEOF	/EOF: SET ZERO FILL
	TAD	COM5	/^Z-^U
	SNA 		/IS IT ^U?
	JMP	COMGET	/REPEAT
	TAD COM12
	DCA TMP
	ISZ COMCA	/NO
COM12,	12
	ISZ COMWC	/IS BUFFER FULL?
	JMP	COMNEN
	JMS	XOFF	/END OF BUFFER INHIBIT RECEIVE
	JMP	COMX	/GET OUT
COMNEN,	ISZ	TMP	/WAS LAST CHAR A LF?
	JMP TSTEND	/NO
	JMS	XOFF	/INHIBIT RECEIVE
	DCA COMEOF	/YES, SET "PAD WITH 0'S" FLAG
	ISZ COM		/POINT TO NORMAL RETURN
			/LF IS NOT AN ERROR OR END-OF-FILE
	JMP ZERO	/REJOIN PROCESSING

	ZBLOCK 373-.
COM,	COMVERSION	/ENTRY POINT TO HANDLER
	CLA
	CLA
	CLA
	JMS PLINK	/SET UP CROSS PAGE LINKAGE
	IFNZRO COM-373 <ENTERR,QQQQ>
	PAGE
/INTERLUDE:

/USA STANDARD CODE FOR INFORMATION INTERCHANGE:

/ XX		XX0	XX1	XX2	XX3	XX4	XX5	XX6	XX7
/		000	001	010	011	100	101	110	111
/
/ 00	0000	NUL	SOH	STX	ETX	EOT	ENQ	ACK	BEL
/
/ 01	0001	BS	HT	LF	VT	FF	CR	SO	SI
/
/ 02	0010	DLE	DC1	DC2	DC3	DC4	NAK	SYN	ETB
/			(XON)		(XOFF)
/
/ 03	0011	CAN	EM	SUB	ESC	FS	GS	RS	US
/
/ 04	0100	SP	!	"	#	$	%	&	'
/
/ 05	0101	(	)	*	+	,	-	.	/
/
/ 06	0110	0	1	2	3	4	5	6	7
/
/ 07	0111	8	9	:	;	<	=	>	?
/
/ 10	1000	@	A	B	C	D	E	F	G
/
/ 11	1001	H	I	J	K	L	M	N	O
/
/ 12	1010	P	Q	R	S	T	U	V	W
/
/ 13	1011	X	Y	Z	[	\	]	^	_
/
/ 14	1100	`	a	b	c	d	e	f	g
/
/ 15	1101	h	i	j	k	l	m	n	o
/
/ 16	1110	p	q	r	s	t	u	v	w
/
/ 17	1111	x	y	z	{	|	}	~	DEL
/
/MUST BE AT TOP OF PAGE
COMPCH,			/ENTRY POINT TO COM PRINT ROUTINE
COMGCH,	0		/ENTRY POINT TO COM GET CHAR ROUTINE
	SNA
	JMP	CMGCH	/ZERO AC-MEANT CALL TO COMGCH
	AND	CM177	/REDUCE TO 7 BIT 
	TAD	(-32	/TEST CTRL Z
	SZA		/IF 0:EOF; LEAVE RETURN AT EOF
	ISZ	COMPCH	/SET TO NORMAL RETURN
	SNA
	DCA	TABCTR	/DISABLE OVERFLOW ON EOF
	TAD	CM32
	DCA	TCHAR	/THIS IS OUR CHAR
	JMS	COMTST	/GET KEYBOARD CHAR AND CLA
	TAD	COMTLS
	SNA CLA
	JMP	ECHO	/NO CHAR ON LINE
	TAD	CMC	/CHAR ON LINE
	DCA	ECHO	/RESTORE ^O KLUDGE
	TAD	COMTLS	/GET INPUT CHAR
	TAD	(-17
	SNA		/^O?
	DCA	ECHO	/YES, SET *KLUDGE FOR EXIT
	TAD	CMM4	/NO (17-23=-4)
M140,	SZA CLA		/^S?
	JMP	ECHO	/NO, IGNORE CHAR
	JMS	COMTST
	TAD	COMTLS
	TAD	(-21	/ONLY ^Q ACCEPTED
	SZA CLA
	JMP	.-4
ECHO,	TAD	TCHAR	/*K* OR 0 TO RETURN ON ^O
	SNA
	JMP I	COMPCH	/IGNORE NULLS
	TAD	(-17	/AT CR+2=SO+1
COM100,	CLL
	TAD	CM7
	SNL
	CLL STA RAL	/-2 WILL BECOME +2 FOR 'TNORM'
	CMA		/CONTROL -, NORMAL +1
	CLL RAL		/CONTROL -2*, NORMAL +2
	TAD	CMJUMP	/'JMP CMSET'
	DCA	COMTLS	/AND FALL INTO JUMP

COMTLS,	0
	TLSL
CM7600,	7600		/CLEAR AC
	TSFL
	JMP .-1
	ISZ	TABCTR	/END OF LINE?
	JMP I COMTLS	/NO: NORMAL RETURN
	ISZ	COMPCH	/YES: EOL RETURN
	JMP I	COMTLS

TCHAR,	0
LINSIZ,	-WIDTH-1	/-1 BECAUSE CR WILL INC ONCE
TABCTR,	-WIDTH

CMGCH,	DCA	TABCTR	/NO LINE CONTROL ON INPUT
	JMS COMTST	/GET CHAR AND CLA
	TAD	COMTLS
	SNA
	JMP	CMGCH	/NULL IS NONE
	JMP I COMGCH	/TAKE ONLY RETURN

COMTST,	0
	KSFL		/ONLY READ IF FLAG
	SKP CLA
	KRBL		/FLAG IS UP
	AND	CM177
	DCA	COMTLS	/KEEP INPUT
	KSF
	JMP I	COMTST
	TAD	CM7600
	KRS
	TAD	(-7603
	SZA CLA
	JMP I	COMTST	/NO
	CIF CDF 0	/BRANCH TO OS/8 MONITOR AT 07600
	JMP I	CM7600
CM177,	177		/'SO' ENTRY POINT
CM11,	11		/FALL THRU TO 'CR'
CR,	TAD	LINSIZ	/CR AND SO RESET COLUMN COUNTER
CMJUMP,	JMP	CMSET
FF,	SKP
	NOP
CM7,	7		/'VT' ENTRY POINT
CM32,	32		/VT FALL ON LF
LF,	STA		/LF NO MOVE OF 'TABCTR'
	JMP	BS+1
TAB,	JMP	COMTAB
CMM4,	-4
BS,	CLL STA RAL	/-2
	TAD TABCTR
CMSET,	DCA	TABCTR
	JMP	PRIN
TNORM,	TAD TCHAR	/NORMAL ENTRY: GET BACK CHAR
	AND COM140	/HIGH ORDER BITS IRRELEVANT
	SNA CLA
	IFNDEF TEST <
	JMP	LF>
	IFDEF TEST <
	JMP	CMUPA>	/XMIT ^X
CMC,
PRIN,	TAD TCHAR
	JMS COMTLS
	JMP I	COMPCH

COMTAB,	TAD	CM7
COM140,	CMA CLL		/MAKES 7770 MASK
	AND	TABCTR	/GO BACK TO THIS TAB STOP
	TAD	CM7	/ADD 7 AND...
	DCA	TABCTR
	JMP	PRIN	/1 FROM TAB TO NEXT TAB STOP
	JMP I	COMPCH	/YES, GET OUT

	IFDEF TEST <
CMUPA,	TAD	COMUPA
	JMS	COMTLS
	TAD	COM100
	JMP	PRIN
COMUPA,	"^>
	$$$