;	  0001	MODULE KERTRM (IDENT = '1.0.000'
;	  0002			) =
;	  0003	BEGIN
;	  0004	
;	  0005	!++
;	  0006	! FACILITY:
;	  0007	!
;	  0008	!	KERMIT-32 terminal processing.
;	  0009	!
;	  0010	! ABSTRACT:
;	  0011	!
;	  0012	!	This module will do all of the terminal processing for KERMIT-32.
;	  0013	!	It contains the output routines for the terminal to send and
;	  0014	!	receive messages as well as the routines to output text for debugging.
;	  0015	!
;	  0016	! ENVIRONMENT:
;	  0017	!
;	  0018	!	VAX/VMS user mode.
;	  0019	!
;	  0020	! AUTHOR: Robert C. McQueen, CREATION DATE: 25-March-1983
;	  0021	!--
;	  0022	
;	  0023	%SBTTL 'Table of Contents'
;	  0024	!
;	  0025	! TABLE OF CONTENTS:
;	  0026	!
;	  0027	%SBTTL 'Revision History'
;	  0028	
;	  0029	!++
;	  0030	!
;	  0031	! Start of version 1.	25-March-1983
;	  0032	!
;	  0033	! 1.0.000	By: Robert C. McQueen		On: 25-March-1983
;	  0034	!		Create this module.
;	  0035	!
;	  0036	!--
;	  0037	
;	  0038	%SBTTL 'Forward routine definitions'
;	  0039	
;	  0040	FORWARD ROUTINE
;	  0041	    TT_CHAR : NOVALUE,				! Process a single character
;	  0042	    TT_OUTPUT : NOVALUE;			! Output the buffer to SYS$OUTPUT
;	  0043	
;	  0044	%SBTTL 'Library files'
;	  0045	!
;	  0046	! INCLUDE FILES:
;	  0047	!
;	  0048	!
;	  0049	! System definitions
;	  0050	!
;	  0051	
;	  0052	LIBRARY 'SYS$LIBRARY:STARLET';
;	  0053	
;	  0054	!
;	  0055	! KERMIT common definitions
;	  0056	!
;	  0057	
;	  0058	REQUIRE 'KERCOM';
;	  0215	
;	  0216	REQUIRE 'KERERR';
;	  0265	
;	  0266	%SBTTL 'Structure definitions -- $GETDVI arguments'
;	  0267	!
;	  0268	! $GETDVI interface fields and structure definition
;	  0269	!
;	  0270	
;	  0271	LITERAL
;	  0272	    DVI_SIZE = 3;				! Length of a DVI item list entry
;	  0273	
;	  0274	!
;	  0275	! Fields for accessing the items in a DVI item list
;	  0276	!
;	  0277	
;	  0278	FIELD
;	  0279	    DVI_FIELDS =
;	  0280		SET
;	  0281		DVI_BFR_LENGTH = [0, 0, 16, 0],
;	  0282		DVI_ITEM_CODE = [0, 16, 16, 0],
;	  0283		DVI_BFR_ADDRESS = [1, 0, 32, 0],
;	  0284		DVI_RTN_LENGTH = [2, 0, 32, 0]
;	  0285		TES;
;	  0286	
;	  0287	!
;	  0288	! Structure definition for item list
;	  0289	
;	  0290	STRUCTURE
;	  0291	    DVI_ITEM_LIST [I, O, P, S, E; N] =
;	  0292		[(N + 1)*DVI_SIZE*4]
;	  0293		(DVI_ITEM_LIST + ((I*DVI_SIZE) + O)*4)<P, S, E>;
;	  0294	
;	  0295	%SBTTL 'Structures definitions -- Terminal characteristics'
;	  0296	!
;	  0297	! Terminal characteristics words
;	  0298	!
;	  0299	
;	  0300	LITERAL
;	  0301	    TC$_CHAR_LENGTH = 12;
;	  0302	
;	  0303	!
;	  0304	! Fields for accessing the items in a characteristic block
;	  0305	!
;	  0306	
;	  0307	FIELD
;	  0308	    TC$_FIELDS =
;	  0309		SET
;	  0310		TC$_CLASS = [0, 0, 8, 0],
;	  0311		TC$_TYPE = [0, 8, 8, 0],
;	  0312		TC$_BFR_SIZE = [0, 16, 16, 0],
;	  0313		TC$_PAGE_LEN = [1, 24, 8, 0],
;	  0314		TC$_CHAR = [1, 0, 24, 0],
;	  0315		TC$_CHAR_2 = [2, 0, 32, 0]
;	  0316		TES;
;	  0317	
;	  0318	!
;	  0319	! Structure definition for item list
;	  0320	!
;	  0321	
;	  0322	STRUCTURE
;	  0323	    TC$_CHAR_STR [O, P, S, E; N] =
;	  0324		[TC$_CHAR_LENGTH]
;	  0325		(TC$_CHAR_STR + O*4)<P, S, E>;
;	  0326	
;	  0327	%SBTTL 'Macro definitions'
;	  0328	!
;	  0329	! MACROS:
;	  0330	!
;	  0331	%(/*macro-decl*/)%
;	  0332	%SBTTL 'Symbol definitions'
;	  0333	!
;	  0334	! EQUATED SYMBOLS:
;	  0335	!
;	  0336	
;	  0337	LITERAL
;	  0338	    TEXT_BFR_LENGTH = 256;			! Length of the text buffer
;	  0339	
;	  0340	%SBTTL 'Storage'
;	  0341	!
;	  0342	! OWN STORAGE:
;	  0343	!
;	  0344	!
;	  0345	! TT_xxxxx routine storage
;	  0346	!
;	  0347	
;	  0348	OWN
;	  0349	    TEXT_POINTER,				! Pointer to store characters
;	  0350	    TEXT_BUFFER : VECTOR [CH$ALLOCATION (TEXT_BFR_LENGTH)],	! Buffer of characters
;	  0351	    TEXT_DESC : BLOCK [8, BYTE];
;	  0352	
;	  0353	!
;	  0354	! Communications routines storage
;	  0355	!
;	  0356	
;	  0357	OWN
;	  0358	    TERM_CHAN,					! Channel the terminal is opened on
;	  0359	    OLD_PARITY : BLOCK [8, BYTE],			! Old IOSB information
;	  0360	    OLD_TERM_CHAR : TC$_CHAR_STR FIELD (TC$_FIELDS),	! Old terminal chars
;	  0361	    NEW_TERM_CHAR : TC$_CHAR_STR FIELD (TC$_FIELDS);	! New terminal chars
;	  0362	
;	  0363	GLOBAL
;	  0364	    TERM_FLAG;					! Terminal open flag
;	  0365	
;	  0366	%SBTTL 'External routines'
;	  0367	!
;	  0368	! EXTERNAL REFERENCES:
;	  0369	!
;	  0370	!
;	  0371	! System library routines
;	  0372	!
;	  0373	
;	  0374	EXTERNAL ROUTINE
;	  0375	    LIB$SIGNAL : ADDRESSING_MODE (GENERAL),
;	  0376	    LIB$PUT_OUTPUT : ADDRESSING_MODE (GENERAL);
;	  0377	
;	  0378	%SBTTL 'External storage'
;	  0379	
;	  0380	!++
;	  0381	! The following is the various external storage locations that are
;	  0382	! referenced from this module.
;	  0383	!--
;	  0384	
;	  0385	!
;	  0386	! KERMSG storage
;	  0387	!
;	  0388	
;	  0389	EXTERNAL
;	  0390	    RCV_EOL,					! Receive EOL character
;	  0391	    RCV_TIMEOUT,				! Receive time out counter
;	  0392	    CONNECT_FLAG;				! Flag if communications line is TT:
;	  0393	
;	  0394	!
;	  0395	! KERMIT storage
;	  0396	!
;	  0397	
;	  0398	EXTERNAL
;	  0399	    TERM_NAME,					! Terminal name
;	  0400	    TERM_DESC : BLOCK [8, BYTE];		! Descriptor for terminal name
;	  0401	
;	  0402	%SBTTL 'Terminal routines -- TT_INIT - Initialize this module'
;	  0403	
;	  0404	GLOBAL ROUTINE TT_INIT : NOVALUE =
;	  0405	
;	  0406	!++
;	  0407	! FUNCTIONAL DESCRIPTION:
;	  0408	!
;	  0409	!	This routine will initialize the terminal processing module.  It will
;	  0410	!	initialize the various data locations in this module.
;	  0411	!
;	  0412	! CALLING SEQUENCE:
;	  0413	!
;	  0414	!	TT_INIT();
;	  0415	!
;	  0416	! INPUT PARAMETERS:
;	  0417	!
;	  0418	!	None.
;	  0419	!
;	  0420	! IMPLICIT INPUTS:
;	  0421	!
;	  0422	!	None.
;	  0423	!
;	  0424	! OUPTUT PARAMETERS:
;	  0425	!
;	  0426	!	None.
;	  0427	!
;	  0428	! IMPLICIT OUTPUTS:
;	  0429	!
;	  0430	!	None.
;	  0431	!
;	  0432	! COMPLETION CODES:
;	  0433	!
;	  0434	!	None.
;	  0435	!
;	  0436	! SIDE EFFECTS:
;	  0437	!
;	  0438	!	None.
;	  0439	!
;	  0440	!--
;	  0441	
;	  0442	    BEGIN
;	  0443	!
;	  0444	! Initialize the text descriptor
;	  0445	!
;	  0446	    TEXT_DESC [DSC$B_CLASS] = DSC$K_CLASS_S;
;	  0447	    TEXT_DESC [DSC$B_DTYPE] = DSC$K_DTYPE_T;
;	  0448	    TEXT_DESC [DSC$A_POINTER] = TEXT_BUFFER;
;	  0449	    TEXT_DESC [DSC$W_LENGTH] = 0;
;	  0450	!
;	  0451	! Now initialize the various pointers
;	  0452	!
;	  0453	    TEXT_POINTER = CH$PTR (TEXT_BUFFER);
;	  0454	!
;	  0455	! Set up the terminal name descriptor
;	  0456	    TERM_DESC [DSC$B_CLASS] = DSC$K_CLASS_S;
;	  0457	    TERM_DESC [DSC$B_DTYPE] = DSC$K_DTYPE_T;
;	  0458	    TERM_DESC [DSC$A_POINTER] = TERM_NAME;
;	  0459	    TERM_DESC [DSC$W_LENGTH] = 12;
;	  0460	    CH$COPY (10, CH$PTR (UPLIT ('SYS$INPUT:')), 0, 11, CH$PTR (TERM_NAME));
;	  0461	!
;	  0462	! Initialize the flags
;	  0463	!
;	  0464	    TERM_FLAG = FALSE;
;	  0465	    END;					! End of TT_INIT


	.TITLE  KERTRM
	.IDENT  \1.0.000\

	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.AAA:	.ASCII  \SYS$INPUT:\<0><0>		     ;									      ;

	.PSECT  $OWN$,NOEXE,2

;TEXT_POINTER
U.3:	.BLKB   4
;TEXT_BUFFER
U.4:	.BLKB   256
;TEXT_DESC
U.5:	.BLKB   8
;TERM_CHAN
U.6:	.BLKB   4
;OLD_PARITY
U.7:	.BLKB   8
;OLD_TERM_CHAR
U.8:	.BLKB   12
;NEW_TERM_CHAR
U.9:	.BLKB   12

	.PSECT  $GLOBAL$,NOEXE,2

TERM_FLAG::
	.BLKB   4

	.EXTRN  LIB$SIGNAL, LIB$PUT_OUTPUT, RCV_EOL, RCV_TIMEOUT, CONNECT_FLAG, TERM_NAME, TERM_DESC

	.PSECT  $CODE$,NOWRT,2

	.ENTRY  TT_INIT, ^M<R2,R3,R4,R5>	     ;TT_INIT, Save R2,R3,R4,R5						      ; 0404
	MOVL    #17694720, W^U.5		     ;#17694720, U.5							      ; 0449
	MOVAB   W^U.4, W^U.5+4			     ;U.4, U.5+4							      ; 0448
	MOVAB   W^U.4, W^U.3			     ;U.4, U.3								      ; 0453
	MOVL    #17694732, W^TERM_DESC		     ;#17694732, TERM_DESC						      ; 0459
	MOVAB   W^TERM_NAME, W^TERM_DESC+4	     ;TERM_NAME, TERM_DESC+4						      ; 0458
	MOVC5   #10, W^P.AAA, #0, #11, W^TERM_NAME   ;#10, P.AAA, #0, #11, TERM_NAME					      ; 0460
	CLRL    W^TERM_FLAG			     ;TERM_FLAG								      ; 0464
	RET     				     ;									      ; 0404

; Routine Size:  56 bytes,    Routine Base:  $CODE$ + 0000


;	  0466	
;	  0467	%SBTTL 'Terminal routines -- TT_TEXT - Output a text string'
;	  0468	
;	  0469	GLOBAL ROUTINE TT_TEXT (ADDRESS) : NOVALUE =
;	  0470	
;	  0471	!++
;	  0472	! FUNCTIONAL DESCRIPTION:
;	  0473	!
;	  0474	!	This routine will output text on the user's terminal.  It will
;	  0475	!	assume that it must check to determine if it can output the text
;	  0476	!	or not.
;	  0477	!
;	  0478	! CALLING SEQUENCE:
;	  0479	!
;	  0480	!	TT_TEXT(TEXT_ADDRESS);
;	  0481	!
;	  0482	! INPUT PARAMETERS:
;	  0483	!
;	  0484	!	None.
;	  0485	!
;	  0486	! IMPLICIT INPUTS:
;	  0487	!
;	  0488	!	None.
;	  0489	!
;	  0490	! OUPTUT PARAMETERS:
;	  0491	!
;	  0492	!	None.
;	  0493	!
;	  0494	! IMPLICIT OUTPUTS:
;	  0495	!
;	  0496	!	None.
;	  0497	!
;	  0498	! COMPLETION CODES:
;	  0499	!
;	  0500	!	None.
;	  0501	!
;	  0502	! SIDE EFFECTS:
;	  0503	!
;	  0504	!	None.
;	  0505	!
;	  0506	!--
;	  0507	
;	  0508	    BEGIN
;	  0509	
;	  0510	    LOCAL
;	  0511		CHARACTER,				! Character being processed
;	  0512		ARG_POINTER;				! Pointer to the argument's text
;	  0513	
;	  0514	!
;	  0515	! Construct a pointer to the argument.
;	  0516	!
;	  0517	    ARG_POINTER = CH$PTR (.ADDRESS);
;	  0518	!
;	  0519	! Get the first character that was passed.
;	  0520	!
;	  0521	    CHARACTER = CH$RCHAR_A (ARG_POINTER);
;	  0522	!
;	  0523	! Loop reading characters and calling the output routine to process
;	  0524	! them
;	  0525	!
;	  0526	
;	  0527	    WHILE .CHARACTER NEQ CHR_NUL DO
;	  0528		BEGIN
;	  0529		TT_CHAR (.CHARACTER);
;	  0530		CHARACTER = CH$RCHAR_A (ARG_POINTER);
;	  0531		END;
;	  0532	
;	  0533	    END;					! End of TT_TEXT





	.ENTRY  TT_TEXT, ^M<R2,R3>		     ;TT_TEXT, Save R2,R3						      ; 0469
	MOVL    4(AP), R2			     ;ADDRESS, ARG_POINTER						      ; 0517
1$:	MOVZBL  (R2)+, R3			     ;(ARG_POINTER)+, CHARACTER						      ; 0521
	BEQL    2$				     ;2$								      ; 0527
	PUSHL   R3				     ;CHARACTER								      ; 0529
	CALLS   #1, W^U.1			     ;#1, U.1								      ;
	BRB     1$				     ;1$								      ; 0530
2$:	RET     				     ;									      ; 0469

; Routine Size:  21 bytes,    Routine Base:  $CODE$ + 0038


;	  0534	
;	  0535	%SBTTL 'Terminal routines -- TT_NUMBER - Output a three digit number'
;	  0536	
;	  0537	GLOBAL ROUTINE TT_NUMBER (NUMBER) : NOVALUE =
;	  0538	
;	  0539	!++
;	  0540	! FUNCTIONAL DESCRIPTION:
;	  0541	!
;	  0542	!	This routine will store a three digit number into the text buffer.
;	  0543	!	It will just return if the number is greater than 999.
;	  0544	!
;	  0545	! CALLING SEQUENCE:
;	  0546	!
;	  0547	!	TT_NUMBER(Value);
;	  0548	!
;	  0549	! INPUT PARAMETERS:
;	  0550	!
;	  0551	!	Value - Value to output.
;	  0552	!
;	  0553	! IMPLICIT INPUTS:
;	  0554	!
;	  0555	!	None.
;	  0556	!
;	  0557	! OUPTUT PARAMETERS:
;	  0558	!
;	  0559	!	None.
;	  0560	!
;	  0561	! IMPLICIT OUTPUTS:
;	  0562	!
;	  0563	!	None.
;	  0564	!
;	  0565	! COMPLETION CODES:
;	  0566	!
;	  0567	!	None.
;	  0568	!
;	  0569	! SIDE EFFECTS:
;	  0570	!
;	  0571	!	None.
;	  0572	!
;	  0573	!--
;	  0574	
;	  0575	    BEGIN
;	  0576	
;	  0577	    IF .NUMBER LEQ 999
;	  0578	    THEN
;	  0579		BEGIN
;	  0580		TT_CHAR ((.NUMBER/100) + %C'0');
;	  0581		TT_CHAR (((.NUMBER/10) MOD 10) + %C'0');
;	  0582		TT_CHAR ((.NUMBER MOD 10) + %C'0');
;	  0583		END;
;	  0584	
;	  0585	    END;					! End of TT_NUMBER





	.ENTRY  TT_NUMBER, ^M<R2>		     ;TT_NUMBER, Save R2						      ; 0537
	MOVAB   W^U.1, R2			     ;U.1, R2								      ;
	CMPL    4(AP), #999			     ;NUMBER, #999							      ; 0577
	BGTR    1$				     ;1$								      ;
	DIVL3   #100, 4(AP), R0			     ;#100, NUMBER, R0							      ; 0580
	PUSHAB  48(R0)				     ;48(R0)								      ;
	CALLS   #1, (R2)			     ;#1, TT_CHAR							      ;
	DIVL3   #10, 4(AP), R0			     ;#10, NUMBER, R0							      ; 0581
	EMUL    #1, R0, #0, -(SP)		     ;#1, R0, #0, -(SP)							      ;
	EDIV    #10, (SP)+, R0, R0		     ;#10, (SP)+, R0, R0						      ;
	PUSHAB  48(R0)				     ;48(R0)								      ;
	CALLS   #1, (R2)			     ;#1, TT_CHAR							      ;
	EMUL    #1, 4(AP), #0, -(SP)		     ;#1, NUMBER, #0, -(SP)						      ; 0582
	EDIV    #10, (SP)+, R0, R0		     ;#10, (SP)+, R0, R0						      ;
	PUSHAB  48(R0)				     ;48(R0)								      ;
	CALLS   #1, (R2)			     ;#1, TT_CHAR							      ;
1$:	RET     				     ;									      ; 0537

; Routine Size:  71 bytes,    Routine Base:  $CODE$ + 004D


;	  0586	
;	  0587	%SBTTL 'Terminal routines -- TT_QCHAR - Output a single character'
;	  0588	
;	  0589	GLOBAL ROUTINE TT_QCHAR (CHARACTER) : NOVALUE =
;	  0590	
;	  0591	!++
;	  0592	! FUNCTIONAL DESCRIPTION:
;	  0593	!
;	  0594	!	This routine will output a quoted character to the terminal buffer.
;	  0595	!	It will convert control characters to printing characters.
;	  0596	!
;	  0597	! CALLING SEQUENCE:
;	  0598	!
;	  0599	!	TT_QCHAR(Character);
;	  0600	!
;	  0601	! INPUT PARAMETERS:
;	  0602	!
;	  0603	!	Character - Character to store into the text buffer.
;	  0604	!
;	  0605	! IMPLICIT INPUTS:
;	  0606	!
;	  0607	!	None.
;	  0608	!
;	  0609	! OUPTUT PARAMETERS:
;	  0610	!
;	  0611	!	None.
;	  0612	!
;	  0613	! IMPLICIT OUTPUTS:
;	  0614	!
;	  0615	!	None.
;	  0616	!
;	  0617	! COMPLETION CODES:
;	  0618	!
;	  0619	!	None.
;	  0620	!
;	  0621	! SIDE EFFECTS:
;	  0622	!
;	  0623	!	None.
;	  0624	!
;	  0625	!--
;	  0626	
;	  0627	    BEGIN
;	  0628	
;	  0629	    LOCAL
;	  0630		TEMP_CHAR;				! Temp holding place for the characters
;	  0631	
;	  0632	!
;	  0633	! Copy the character first
;	  0634	!
;	  0635	    TEMP_CHAR = .CHARACTER;
;	  0636	!
;	  0637	! Determine if this is a control character.  If so then convert it to be
;	  0638	! a ^<Character>
;	  0639	!
;	  0640	
;	  0641	    IF .TEMP_CHAR LSS CHR_SP
;	  0642	    THEN
;	  0643		BEGIN
;	  0644		TT_CHAR (%C'^');
;	  0645		TEMP_CHAR = %C'A' - 1 + .TEMP_CHAR;
;	  0646		END;
;	  0647	
;	  0648	!
;	  0649	! Output the character after any conversion
;	  0650	!
;	  0651	    TT_CHAR (.TEMP_CHAR);
;	  0652	!
;	  0653	    END;					! End of TT_QCHAR





	.ENTRY  TT_QCHAR, ^M<R2>		     ;TT_QCHAR, Save R2							      ; 0589
	MOVL    4(AP), R2			     ;CHARACTER, TEMP_CHAR						      ; 0635
	CMPL    R2, #32				     ;TEMP_CHAR, #32							      ; 0641
	BGEQ    1$				     ;1$								      ;
	MOVZBL  #94, -(SP)			     ;#94, -(SP)							      ; 0644
	CALLS   #1, W^U.1			     ;#1, U.1								      ;
	MOVAB   64(R2), R2			     ;64(R2), TEMP_CHAR							      ; 0645
1$:	PUSHL   R2				     ;TEMP_CHAR								      ; 0651
	CALLS   #1, W^U.1			     ;#1, U.1								      ;
	RET     				     ;									      ; 0589

; Routine Size:  32 bytes,    Routine Base:  $CODE$ + 0094


;	  0654	
;	  0655	%SBTTL 'Terminal routines -- TT_CHAR - Output a single character'
;	  0656	
;	  0657	GLOBAL ROUTINE TT_CHAR (CHARACTER) : NOVALUE =
;	  0658	
;	  0659	!++
;	  0660	! FUNCTIONAL DESCRIPTION:
;	  0661	!
;	  0662	!	This routine will store a character into the text buffer.  It will
;	  0663	!	cause the text to be output if the character is a line terminator.
;	  0664	!
;	  0665	! CALLING SEQUENCE:
;	  0666	!
;	  0667	!	TT_CHAR(Character);
;	  0668	!
;	  0669	! INPUT PARAMETERS:
;	  0670	!
;	  0671	!	Character - Character to store into the text buffer.
;	  0672	!
;	  0673	! IMPLICIT INPUTS:
;	  0674	!
;	  0675	!	None.
;	  0676	!
;	  0677	! OUPTUT PARAMETERS:
;	  0678	!
;	  0679	!	None.
;	  0680	!
;	  0681	! IMPLICIT OUTPUTS:
;	  0682	!
;	  0683	!	None.
;	  0684	!
;	  0685	! COMPLETION CODES:
;	  0686	!
;	  0687	!	None.
;	  0688	!
;	  0689	! SIDE EFFECTS:
;	  0690	!
;	  0691	!	None.
;	  0692	!
;	  0693	!--
;	  0694	
;	  0695	    BEGIN
;	  0696	!
;	  0697	! If this is a line feed then just output the text string and return
;	  0698	!
;	  0699	
;	  0700	    IF .CHARACTER EQL CHR_LFD
;	  0701	    THEN
;	  0702		TT_OUTPUT ()
;	  0703	    ELSE
;	  0704		BEGIN
;	  0705	!
;	  0706	! Increment the count of the characters
;	  0707	!
;	  0708		TEXT_DESC [DSC$W_LENGTH] = .TEXT_DESC [DSC$W_LENGTH] + 1;
;	  0709	!
;	  0710	! And store the character
;	  0711	!
;	  0712		CH$WCHAR_A (.CHARACTER, TEXT_POINTER);
;	  0713	
;	  0714		IF .TEXT_DESC [DSC$W_LENGTH] EQL TEXT_BFR_LENGTH THEN TT_OUTPUT ();
;	  0715	
;	  0716		END;
;	  0717	
;	  0718	!
;	  0719	    END;					! End of TT_CHAR




U.1:
	.ENTRY  TT_CHAR, ^M<>			     ;TT_CHAR, Save nothing						      ; 0657
	CMPL    4(AP), #10			     ;CHARACTER, #10							      ; 0700
	BEQL    1$				     ;1$								      ;
	INCW    W^U.5				     ;U.5								      ; 0708
	MOVB    4(AP), @W^U.3			     ;CHARACTER, @U.3							      ; 0712
	INCL    W^U.3				     ;U.3								      ;
	CMPW    W^U.5, #256			     ;U.5, #256								      ; 0714
	BNEQ    2$				     ;2$								      ;
1$:	CALLS   #0, W^U.2			     ;#0, U.2								      ;
2$:	RET     				     ;									      ; 0657

; Routine Size:  37 bytes,    Routine Base:  $CODE$ + 00B4


;	  0720	
;	  0721	%SBTTL 'Terminal routines -- TT_CRLF - Output a CRLF'
;	  0722	
;	  0723	GLOBAL ROUTINE TT_CRLF : NOVALUE =
;	  0724	
;	  0725	!++
;	  0726	! FUNCTIONAL DESCRIPTION:
;	  0727	!
;	  0728	!	This routine will cause the contents of the terminal buffer to be
;	  0729	!	output to SYS$OUTPUT:.
;	  0730	!
;	  0731	! CALLING SEQUENCE:
;	  0732	!
;	  0733	!	TT_CRLF();
;	  0734	!
;	  0735	! INPUT PARAMETERS:
;	  0736	!
;	  0737	!	None.
;	  0738	!
;	  0739	! IMPLICIT INPUTS:
;	  0740	!
;	  0741	!	None.
;	  0742	!
;	  0743	! OUPTUT PARAMETERS:
;	  0744	!
;	  0745	!	None.
;	  0746	!
;	  0747	! IMPLICIT OUTPUTS:
;	  0748	!
;	  0749	!	None.
;	  0750	!
;	  0751	! COMPLETION CODES:
;	  0752	!
;	  0753	!	None.
;	  0754	!
;	  0755	! SIDE EFFECTS:
;	  0756	!
;	  0757	!	None.
;	  0758	!
;	  0759	!--
;	  0760	
;	  0761	    BEGIN
;	  0762	    TT_CHAR (CHR_LFD);
;	  0763	    END;					! End of TT_CRLF





	.ENTRY  TT_CRLF, ^M<>			     ;TT_CRLF, Save nothing						      ; 0723
	PUSHL   #10				     ;#10								      ; 0762
	CALLS   #1, B^U.1			     ;#1, U.1								      ;
	RET     				     ;									      ; 0723

; Routine Size:  9 bytes,    Routine Base:  $CODE$ + 00D9


;	  0764	
;	  0765	%SBTTL 'Terminal routines -- TT_OUTPUT - Output the buffer'
;	  0766	ROUTINE TT_OUTPUT : NOVALUE =
;	  0767	
;	  0768	!++
;	  0769	! FUNCTIONAL DESCRIPTION:
;	  0770	!
;	  0771	!	This routine will dump the text buffer on the output device.
;	  0772	!
;	  0773	! CALLING SEQUENCE:
;	  0774	!
;	  0775	!	TT_OUTPUT();
;	  0776	!
;	  0777	! INPUT PARAMETERS:
;	  0778	!
;	  0779	!	None.
;	  0780	!
;	  0781	! IMPLICIT INPUTS:
;	  0782	!
;	  0783	!	None.
;	  0784	!
;	  0785	! OUPTUT PARAMETERS:
;	  0786	!
;	  0787	!	None.
;	  0788	!
;	  0789	! IMPLICIT OUTPUTS:
;	  0790	!
;	  0791	!	None.
;	  0792	!
;	  0793	! COMPLETION CODES:
;	  0794	!
;	  0795	!	None.
;	  0796	!
;	  0797	! SIDE EFFECTS:
;	  0798	!
;	  0799	!	None.
;	  0800	!
;	  0801	!--
;	  0802	
;	  0803	    BEGIN
;	  0804	
;	  0805	    LOCAL
;	  0806		STATUS;					! Status returned by the library routine
;	  0807	
;	  0808	!
;	  0809	! Output the text
;	  0810	!
;	  0811	    STATUS = LIB$PUT_OUTPUT (TEXT_DESC);
;	  0812	!
;	  0813	! Now reset the descriptor and the pointer to a virgin state
;	  0814	!
;	  0815	    TEXT_DESC [DSC$W_LENGTH] = 0;
;	  0816	    TEXT_POINTER = CH$PTR (TEXT_BUFFER);
;	  0817	!
;	  0818	    END;					! End of TT_OUTPUT





;TT_OUTPUT
U.2:	.WORD   ^M<>				     ;Save nothing							      ; 0766
	PUSHAB  W^U.5				     ;U.5								      ; 0811
	CALLS   #1, G^LIB$PUT_OUTPUT		     ;#1, LIB$PUT_OUTPUT						      ;
	CLRW    W^U.5				     ;U.5								      ; 0815
	MOVAB   W^U.4, W^U.3			     ;U.4, U.3								      ; 0816
	RET     				     ;									      ; 0766

; Routine Size:  25 bytes,    Routine Base:  $CODE$ + 00E2


;	  0819	%SBTTL 'Communcations line -- TERM_OPEN'
;	  0820	
;	  0821	GLOBAL ROUTINE TERM_OPEN =
;	  0822	
;	  0823	!++
;	  0824	! FUNCTIONAL DESCRIPTION:
;	  0825	!
;	  0826	!	This routine will assign a channel that is used in the CONNECT
;	  0827	!	processing and to send/receive a file from.
;	  0828	!
;	  0829	! CALLING SEQUENCE:
;	  0830	!
;	  0831	!	TERM_OPEN();
;	  0832	!
;	  0833	! INPUT PARAMETERS:
;	  0834	!
;	  0835	!	None.
;	  0836	!
;	  0837	! IMPLICIT INPUTS:
;	  0838	!
;	  0839	!	TERM_NAME - Vector of ASCII characters that represent the name of
;	  0840	!	the terminal to use.
;	  0841	!
;	  0842	! OUTPUT PARAMETERS:
;	  0843	!
;	  0844	!	None.
;	  0845	!
;	  0846	! IMPLICIT OUTPUTS:
;	  0847	!
;	  0848	!	TERM_CHAN - Channel number of the terminal line we are using.
;	  0849	!
;	  0850	! COMPLETION CODES:
;	  0851	!
;	  0852	!	SS$_NORMAL or error condition.
;	  0853	!
;	  0854	! SIDE EFFECTS:
;	  0855	!
;	  0856	!	None.
;	  0857	!
;	  0858	!--
;	  0859	
;	  0860	    BEGIN
;	  0861	
;	  0862	    BIND
;	  0863		SYS_OUTPUT = %ASCID'TT:';
;	  0864	
;	  0865	    LOCAL
;	  0866		STATUS,
;	  0867		OUTPUT_ITM : DVI_ITEM_LIST [2] FIELD (DVI_FIELDS),
;	  0868		OUTPUT_NAME : VECTOR [65, BYTE],
;	  0869		OUTPUT_LENGTH,
;	  0870		OUTPUT_CLASS,
;	  0871		OUTPUT_STATUS,
;	  0872		TERM_ITM : DVI_ITEM_LIST [2] FIELD (DVI_FIELDS),
;	  0873		TERM_NAME : VECTOR [65, BYTE],
;	  0874		TERM_LENGTH,
;	  0875		TERM_CLASS,
;	  0876		TERM_STATUS;
;	  0877	
;	  0878	!
;	  0879	! Initialize the first character to be an underscore, incase we have a
;	  0880	! concealed device name
;	  0881	!
;	  0882	    OUTPUT_NAME [0] = %C'_';
;	  0883	    TERM_NAME [0] = %C'_';
;	  0884	!
;	  0885	! Initialize the GETDVI call for the TT:
;	  0886	!
;	  0887	    OUTPUT_ITM [0, DVI_ITEM_CODE] = DVI$_DEVCLASS;
;	  0888	    OUTPUT_ITM [0, DVI_BFR_LENGTH] = 4;
;	  0889	    OUTPUT_ITM [0, DVI_BFR_ADDRESS] = OUTPUT_CLASS;
;	  0890	    OUTPUT_ITM [0, DVI_RTN_LENGTH] = 0;
;	  0891	!
;	  0892	    OUTPUT_ITM [1, DVI_ITEM_CODE] = DVI$_DEVNAM;
;	  0893	    OUTPUT_ITM [1, DVI_BFR_LENGTH] = 64;
;	  0894	    OUTPUT_ITM [1, DVI_BFR_ADDRESS] = OUTPUT_NAME [1];
;	  0895	    OUTPUT_ITM [1, DVI_RTN_LENGTH] = OUTPUT_LENGTH;
;	  0896	!
;	  0897	    OUTPUT_ITM [2, DVI_ITEM_CODE] = 0;
;	  0898	    OUTPUT_ITM [2, DVI_BFR_LENGTH] = 0;
;	  0899	!
;	  0900	! Initialize the GETDVI call for the terminal name given
;	  0901	!
;	  0902	    TERM_ITM [0, DVI_ITEM_CODE] = DVI$_DEVCLASS;
;	  0903	    TERM_ITM [0, DVI_BFR_LENGTH] = 4;
;	  0904	    TERM_ITM [0, DVI_BFR_ADDRESS] = TERM_CLASS;
;	  0905	    TERM_ITM [0, DVI_RTN_LENGTH] = 0;
;	  0906	!
;	  0907	    TERM_ITM [1, DVI_ITEM_CODE] = DVI$_DEVNAM;
;	  0908	    TERM_ITM [1, DVI_BFR_LENGTH] = 64;
;	  0909	    TERM_ITM [1, DVI_BFR_ADDRESS] = TERM_NAME [1];
;	  0910	    TERM_ITM [1, DVI_RTN_LENGTH] = TERM_LENGTH;
;	  0911	!
;	  0912	    TERM_ITM [2, DVI_ITEM_CODE] = 0;
;	  0913	    TERM_ITM [2, DVI_BFR_LENGTH] = 0;
;	  0914	!
;	  0915	! Get the device information
;	  0916	!
;	  0917	    OUTPUT_STATUS = $GETDVI (EFN = 2, DEVNAM = SYS_OUTPUT, ITMLST = OUTPUT_ITM);
;	  0918	
;	  0919	    IF NOT .OUTPUT_STATUS
;	  0920	    THEN
;	  0921		BEGIN
;	  0922		LIB$SIGNAL (.OUTPUT_STATUS);
;	  0923		RETURN .OUTPUT_STATUS;
;	  0924		END;
;	  0925	
;	  0926	    STATUS = $WAITFR (EFN = 2);
;	  0927	
;	  0928	    IF NOT .STATUS
;	  0929	    THEN
;	  0930		BEGIN
;	  0931		LIB$SIGNAL (.STATUS);
;	  0932		RETURN .STATUS;
;	  0933		END;
;	  0934	
;	  0935	!
;	  0936	! For both of the device names
;	  0937	!
;	  0938	    TERM_STATUS = $GETDVI (EFN = 2, DEVNAM = TERM_DESC, ITMLST = TERM_ITM);
;	  0939	
;	  0940	    IF NOT .TERM_STATUS
;	  0941	    THEN
;	  0942		BEGIN
;	  0943		LIB$SIGNAL (.TERM_STATUS);
;	  0944		RETURN .STATUS;
;	  0945		END;
;	  0946	
;	  0947	    STATUS = $WAITFR (EFN = 2);
;	  0948	
;	  0949	    IF NOT .STATUS
;	  0950	    THEN
;	  0951		BEGIN
;	  0952		LIB$SIGNAL (.STATUS);
;	  0953		RETURN .STATUS;
;	  0954		END;
;	  0955	
;	  0956	!
;	  0957	! Make sure that they are terminals
;	  0958	!
;	  0959	
;	  0960	    IF .TERM_CLASS EQL DC$_TERM AND .OUTPUT_CLASS EQL DC$_TERM
;	  0961	    THEN
;	  0962		BEGIN
;	  0963	
;	  0964		IF .OUTPUT_STATUS EQL SS$_CONCEALED
;	  0965		THEN
;	  0966		    BEGIN
;	  0967		    OUTPUT_LENGTH = .OUTPUT_LENGTH + 1;
;	  0968		    OUTPUT_ITM [1, DVI_BFR_ADDRESS] = .OUTPUT_ITM [1, DVI_BFR_ADDRESS] - 1;
;	  0969		    END;
;	  0970	
;	  0971		IF .TERM_STATUS EQL SS$_CONCEALED
;	  0972		THEN
;	  0973		    BEGIN
;	  0974		    TERM_LENGTH = .TERM_LENGTH + 1;
;	  0975		    TERM_ITM [1, DVI_BFR_ADDRESS] = .TERM_ITM [1, DVI_BFR_ADDRESS] - 1;
;	  0976		    END;
;	  0977	
;	  0978		IF CH$NEQ (.OUTPUT_LENGTH, CH$PTR (.OUTPUT_ITM [1, DVI_BFR_ADDRESS]), .TERM_LENGTH,
;	  0979			CH$PTR (.TERM_ITM [1, DVI_BFR_ADDRESS]), CHR_NUL)
;	  0980		THEN
;	  0981		    CONNECT_FLAG = FALSE
;	  0982		ELSE
;	  0983		    CONNECT_FLAG = TRUE;
;	  0984	
;	  0985		END
;	  0986	    ELSE
;	  0987		BEGIN
;	  0988		RETURN KER_LINTERM;
;	  0989		END;
;	  0990	
;	  0991	    STATUS = $ASSIGN (DEVNAM = TERM_DESC, CHAN = TERM_CHAN);
;	  0992	
;	  0993	    IF NOT .STATUS
;	  0994	    THEN
;	  0995		BEGIN
;	  0996		LIB$SIGNAL (.STATUS);
;	  0997		RETURN .STATUS;
;	  0998		END;
;	  0999	
;	  1000	    STATUS = $QIOW (CHAN = .TERM_CHAN, FUNC = IO$_SENSEMODE, P1 = OLD_TERM_CHAR, P2 = TC$_CHAR_LENGTH, IOSB = OLD_P
;	  1001	
;	  1002	    IF NOT .STATUS
;	  1003	    THEN
;	  1004		BEGIN
;	  1005		LIB$SIGNAL (.STATUS);
;	  1006		RETURN .STATUS;
;	  1007		END;
;	  1008	
;	  1009	    NEW_TERM_CHAR [TC$_BFR_SIZE] = .OLD_TERM_CHAR [TC$_BFR_SIZE];
;	  1010	    NEW_TERM_CHAR [TC$_TYPE] = .OLD_TERM_CHAR [TC$_TYPE];
;	  1011	    NEW_TERM_CHAR [TC$_CLASS] = .OLD_TERM_CHAR [TC$_CLASS];
;	  1012	    NEW_TERM_CHAR [TC$_PAGE_LEN] = .OLD_TERM_CHAR [TC$_PAGE_LEN];
;	  1013	    NEW_TERM_CHAR [TC$_CHAR] = (.OLD_TERM_CHAR [TC$_CHAR] OR TT$M_EIGHTBIT OR TT$M_NOBRDCST) AND NOT (
;	  1014	    TT$M_CRFILL OR TT$M_LFFILL OR TT$M_WRAP);
;	  1015	    NEW_TERM_CHAR [TC$_CHAR_2] = .OLD_TERM_CHAR [TC$_CHAR_2];
;	  1016	
;	  1017	    STATUS = $QIOW (CHAN = .TERM_CHAN, FUNC = IO$_SETMODE, P1 = NEW_TERM_CHAR, P2 = TC$_CHAR_LENGTH, P5 = TT$M_ALTR
;	  1018	
;	  1019	    IF NOT .STATUS
;	  1020	    THEN
;	  1021		BEGIN
;	  1022		LIB$SIGNAL (.STATUS);
;	  1023		RETURN .STATUS;
;	  1024		END;
;	  1025	
;	  1026	    TERM_FLAG = TRUE;				! Terminal now open
;	  1027	    RETURN KER_NORMAL;
;	  1028	    END;					! End of TERM_OPEN



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.AAC:	.ASCII  \TT:\<0>			     ;									      ;
P.AAB:	.LONG   17694723			     ;									      ;
	.ADDRESS P.AAC				     ;									      ;

U.17=		    P.AAB
	.EXTRN  SYS$GETDVI, SYS$WAITFR, SYS$ASSIGN, SYS$QIOW

	.PSECT  $CODE$,NOWRT,2

	.ENTRY  TERM_OPEN, ^M<R2,R3,R4,R5,R6,R7,R8,- ;TERM_OPEN, Save R2,R3,R4,R5,R6,R7,R8,R9				      ; 0821
		R9>				     ;									      ;
	MOVAB   G^SYS$QIOW, R9			     ;SYS$QIOW, R9							      ;
	MOVAB   G^SYS$WAITFR, R8		     ;SYS$WAITFR, R8							      ;
	MOVAB   G^LIB$SIGNAL, R7		     ;LIB$SIGNAL, R7							      ;
	MOVAB   G^SYS$GETDVI, R6		     ;SYS$GETDVI, R6							      ;
	MOVAB   W^U.6, R5			     ;U.6, R5								      ;
	MOVAB   -224(SP), SP			     ;-224(SP), SP							      ;
	MOVB    #95, 120(SP)			     ;#95, OUTPUT_NAME							      ; 0882
	MOVB    #95, 16(SP)			     ;#95, TERM_NAME							      ; 0883
	MOVL    #262148, -36(FP)		     ;#262148, OUTPUT_ITM						      ; 0888
	MOVAB   12(SP), -32(FP)			     ;OUTPUT_CLASS, OUTPUT_ITM+4					      ; 0889
	CLRL    -28(FP)				     ;OUTPUT_ITM+8							      ; 0890
	MOVL    #2097216, -24(FP)		     ;#2097216, OUTPUT_ITM+12						      ; 0893
	MOVAB   121(SP), -20(FP)		     ;OUTPUT_NAME+1, OUTPUT_ITM+16					      ; 0894
	MOVAB   8(SP), -16(FP)			     ;OUTPUT_LENGTH, OUTPUT_ITM+20					      ; 0895
	CLRL    -12(FP)				     ;OUTPUT_ITM+24							      ; 0898
	MOVL    #262148, 84(SP)			     ;#262148, TERM_ITM							      ; 0903
	MOVAB   4(SP), 88(SP)			     ;TERM_CLASS, TERM_ITM+4						      ; 0904
	CLRL    92(SP)				     ;TERM_ITM+8							      ; 0905
	MOVL    #2097216, 96(SP)		     ;#2097216, TERM_ITM+12						      ; 0908
	MOVAB   17(SP), 100(SP)			     ;TERM_NAME+1, TERM_ITM+16						      ; 0909
	MOVAB   (SP), 104(SP)			     ;TERM_LENGTH, TERM_ITM+20						      ; 0910
	CLRL    108(SP)				     ;TERM_ITM+24							      ; 0913
	CLRQ    -(SP)				     ;-(SP)								      ; 0917
	CLRQ    -(SP)				     ;-(SP)								      ;
	PUSHAB  -36(FP)				     ;OUTPUT_ITM							      ;
	PUSHAB  W^U.17				     ;U.17								      ;
	MOVQ    #2, -(SP)			     ;#2, -(SP)								      ;
	CALLS   #8, (R6)			     ;#8, SYS$GETDVI							      ;
	MOVL    R0, R2				     ;R0, OUTPUT_STATUS							      ;
	BLBS    R2, 1$				     ;OUTPUT_STATUS, 1$							      ; 0919
	PUSHL   R2				     ;OUTPUT_STATUS							      ; 0922
	CALLS   #1, (R7)			     ;#1, LIB$SIGNAL							      ;
	MOVL    R2, R0				     ;OUTPUT_STATUS, R0							      ; 0921
	RET     				     ;									      ;
1$:	PUSHL   #2				     ;#2								      ; 0926
	CALLS   #1, (R8)			     ;#1, SYS$WAITFR							      ;
	MOVL    R0, R4				     ;R0, STATUS							      ;
	BLBC    R4, 3$				     ;STATUS, 3$							      ; 0928
	CLRQ    -(SP)				     ;-(SP)								      ; 0938
	CLRQ    -(SP)				     ;-(SP)								      ;
	PUSHAB  100(SP)				     ;TERM_ITM								      ;
	PUSHAB  W^TERM_DESC			     ;TERM_DESC								      ;
	MOVQ    #2, -(SP)			     ;#2, -(SP)								      ;
	CALLS   #8, (R6)			     ;#8, SYS$GETDVI							      ;
	MOVL    R0, R3				     ;R0, TERM_STATUS							      ;
	BLBS    R3, 2$				     ;TERM_STATUS, 2$							      ; 0940
	PUSHL   R3				     ;TERM_STATUS							      ; 0943
	BRW     11$				     ;11$								      ;
2$:	PUSHL   #2				     ;#2								      ; 0947
	CALLS   #1, (R8)			     ;#1, SYS$WAITFR							      ;
	MOVL    R0, R4				     ;R0, STATUS							      ;
3$:	BLBC    R4, 9$				     ;STATUS, 9$							      ; 0949
	CMPL    4(SP), #66			     ;TERM_CLASS, #66							      ; 0960
	BNEQ    7$				     ;7$								      ;
	CMPL    12(SP), #66			     ;OUTPUT_CLASS, #66							      ;
	BNEQ    7$				     ;7$								      ;
	CMPL    R2, #1681			     ;OUTPUT_STATUS, #1681						      ; 0964
	BNEQ    4$				     ;4$								      ;
	INCL    8(SP)				     ;OUTPUT_LENGTH							      ; 0967
	DECL    -20(FP)				     ;OUTPUT_ITM+16							      ; 0968
4$:	CMPL    R3, #1681			     ;TERM_STATUS, #1681						      ; 0971
	BNEQ    5$				     ;5$								      ;
	INCL    (SP)				     ;TERM_LENGTH							      ; 0974
	DECL    100(SP)				     ;TERM_ITM+16							      ; 0975
5$:	CMPC5   8(SP), @-20(FP), #0, (SP), @100(SP)  ;OUTPUT_LENGTH, @OUTPUT_ITM+16, #0, TERM_LENGTH, @TERM_ITM+16	      ; 0978
	BEQL    6$				     ;6$								      ;
	CLRL    W^CONNECT_FLAG			     ;CONNECT_FLAG							      ; 0981
	BRB     8$				     ;8$								      ; 0978
6$:	MOVL    #1, W^CONNECT_FLAG		     ;#1, CONNECT_FLAG							      ; 0983
	BRB     8$				     ;8$								      ; 0960
7$:	MOVL    #134316210, R0			     ;#134316210, R0							      ; 0987
	RET     				     ;									      ;
8$:	CLRQ    -(SP)				     ;-(SP)								      ; 0991
	PUSHL   R5				     ;R5								      ;
	PUSHAB  W^TERM_DESC			     ;TERM_DESC								      ;
	CALLS   #4, G^SYS$ASSIGN		     ;#4, SYS$ASSIGN							      ;
	MOVL    R0, R4				     ;R0, STATUS							      ;
9$:	BLBC    R4, 10$				     ;STATUS, 10$							      ; 0993
	CLRQ    -(SP)				     ;-(SP)								      ; 1000
	CLRQ    -(SP)				     ;-(SP)								      ;
	PUSHL   #12				     ;#12								      ;
	PUSHAB  12(R5)				     ;OLD_TERM_CHAR							      ;
	CLRQ    -(SP)				     ;-(SP)								      ;
	PUSHAB  4(R5)				     ;OLD_PARITY							      ;
	PUSHL   #39				     ;#39								      ;
	PUSHL   (R5)				     ;TERM_CHAN								      ;
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #12, (R9)			     ;#12, SYS$QIOW							      ;
	MOVL    R0, R4				     ;R0, STATUS							      ;
	BLBC    R4, 10$				     ;STATUS, 10$							      ; 1002
	MOVL    12(R5), 24(R5)			     ;OLD_TERM_CHAR, NEW_TERM_CHAR					      ; 1011
	MOVB    19(R5), 31(R5)			     ;OLD_TERM_CHAR+7, NEW_TERM_CHAR+7					      ; 1012
	EXTZV   #0, #24, 16(R5), R0		     ;#0, #24, OLD_TERM_CHAR+4, R0					      ; 0860
	INSV    #0, #9, #3, R0			     ;#0, #9, #3, R0							      ;
	BISL3   #163840, R0, R1			     ;#163840, R0, R1							      ; 1013
	INSV    R1, #0, #24, 28(R5)		     ;R1, #0, #24, NEW_TERM_CHAR+4					      ;
	MOVL    20(R5), 32(R5)			     ;OLD_TERM_CHAR+8, NEW_TERM_CHAR+8					      ; 1015
	MOVQ    #32, -(SP)			     ;#32, -(SP)							      ; 1017
	CLRQ    -(SP)				     ;-(SP)								      ;
	PUSHL   #12				     ;#12								      ;
	PUSHAB  24(R5)				     ;NEW_TERM_CHAR							      ;
	CLRQ    -(SP)				     ;-(SP)								      ;
	MOVQ    #35, -(SP)			     ;#35, -(SP)							      ;
	PUSHL   (R5)				     ;TERM_CHAN								      ;
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #12, (R9)			     ;#12, SYS$QIOW							      ;
	MOVL    R0, R4				     ;R0, STATUS							      ;
	BLBS    R4, 12$				     ;STATUS, 12$							      ; 1019
10$:	PUSHL   R4				     ;STATUS								      ; 1022
11$:	CALLS   #1, (R7)			     ;#1, LIB$SIGNAL							      ;
	MOVL    R4, R0				     ;STATUS, R0							      ; 1021
	RET     				     ;									      ;
12$:	MOVL    #1, W^TERM_FLAG			     ;#1, TERM_FLAG							      ; 1026
	MOVL    #134316043, R0			     ;#134316043, R0							      ; 0860
	RET     				     ;									      ; 0821

; Routine Size:  426 bytes,    Routine Base:  $CODE$ + 00FB


;	  1029	
;	  1030	%SBTTL 'Communications line -- TERM_CLOSE'
;	  1031	
;	  1032	GLOBAL ROUTINE TERM_CLOSE =
;	  1033	
;	  1034	!++
;	  1035	! FUNCTIONAL DESCRIPTION:
;	  1036	!
;	  1037	!	This routine will deassign the channel that was assigned by
;	  1038	!	TERM_OPEN.
;	  1039	!
;	  1040	! CALLING SEQUENCE:
;	  1041	!
;	  1042	!	TERM_CLOSE();
;	  1043	!
;	  1044	! INPUT PARAMETERS:
;	  1045	!
;	  1046	!	None.
;	  1047	!
;	  1048	! IMPLICIT INPUTS:
;	  1049	!
;	  1050	!	TERM_CHAN - Channel number to deassign.
;	  1051	!
;	  1052	! OUTPUT PARAMETERS:
;	  1053	!
;	  1054	!	None.
;	  1055	!
;	  1056	! IMPLICIT OUTPUTS:
;	  1057	!
;	  1058	!	None.
;	  1059	!
;	  1060	! COMPLETION CODES:
;	  1061	!
;	  1062	!	SS$_NORMAL or error condition.
;	  1063	!
;	  1064	! SIDE EFFECTS:
;	  1065	!
;	  1066	!	None.
;	  1067	!
;	  1068	!--
;	  1069	
;	  1070	    BEGIN
;	  1071	
;	  1072	    LOCAL
;	  1073		PAR,					! Parity being set
;	  1074		STATUS;					! Status returned by system service
;	  1075	
;	  1076	    CONNECT_FLAG = FALSE;
;	  1077	
;	  1078	    PAR = .OLD_PARITY [1, 8, 8, 0] OR TT$M_ALTRPAR;
;	  1079	
;	  1080	    STATUS = $QIOW (CHAN = .TERM_CHAN, FUNC = IO$_SETMODE, P1 = OLD_TERM_CHAR, P2 = TC$_CHAR_LENGTH, P5 = .PAR);
;	  1081	
;	  1082	    IF NOT .STATUS
;	  1083	    THEN
;	  1084		BEGIN
;	  1085		LIB$SIGNAL (.STATUS);
;	  1086		RETURN .STATUS;
;	  1087		END;
;	  1088	
;	  1089	    STATUS = $DASSGN (CHAN = .TERM_CHAN);
;	  1090	
;	  1091	    IF .STATUS
;	  1092	    THEN
;	  1093		BEGIN
;	  1094		TERM_FLAG = FALSE;
;	  1095		RETURN KER_NORMAL
;	  1096		END
;	  1097	    ELSE
;	  1098		BEGIN
;	  1099		LIB$SIGNAL (.STATUS);
;	  1100		RETURN .STATUS;
;	  1101		END;
;	  1102	
;	  1103	    END;					! End of TERM_CLOSE



	.EXTRN  SYS$DASSGN

	.ENTRY  TERM_CLOSE, ^M<R2,R3>		     ;TERM_CLOSE, Save R2,R3						      ; 1032
	MOVAB   W^U.6, R3			     ;U.6, R3								      ;
	CLRL    W^CONNECT_FLAG			     ;CONNECT_FLAG							      ; 1076
	MOVZBL  6(R3), R0			     ;OLD_PARITY+2, PAR							      ; 1078
	BISL2   #32, R0				     ;#32, PAR								      ;
	CLRL    -(SP)				     ;-(SP)								      ; 1080
	PUSHL   R0				     ;PAR								      ;
	CLRQ    -(SP)				     ;-(SP)								      ;
	PUSHL   #12				     ;#12								      ;
	PUSHAB  12(R3)				     ;OLD_TERM_CHAR							      ;
	CLRQ    -(SP)				     ;-(SP)								      ;
	MOVQ    #35, -(SP)			     ;#35, -(SP)							      ;
	PUSHL   (R3)				     ;TERM_CHAN								      ;
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #12, G^SYS$QIOW			     ;#12, SYS$QIOW							      ;
	MOVL    R0, R2				     ;R0, STATUS							      ;
	BLBC    R2, 1$				     ;STATUS, 1$							      ; 1082
	PUSHL   (R3)				     ;TERM_CHAN								      ; 1089
	CALLS   #1, G^SYS$DASSGN		     ;#1, SYS$DASSGN							      ;
	MOVL    R0, R2				     ;R0, STATUS							      ;
	BLBC    R2, 1$				     ;STATUS, 1$							      ; 1091
	CLRL    W^TERM_FLAG			     ;TERM_FLAG								      ; 1094
	MOVL    #134316043, R0			     ;#134316043, R0							      ; 1070
	RET     				     ;									      ;
1$:	PUSHL   R2				     ;STATUS								      ; 1099
	CALLS   #1, G^LIB$SIGNAL		     ;#1, LIB$SIGNAL							      ;
	MOVL    R2, R0				     ;STATUS, R0							      ; 1070
	RET     				     ;									      ; 1032

; Routine Size:  91 bytes,    Routine Base:  $CODE$ + 02A5


;	  1104	
;	  1105	%SBTTL 'Communications line -- SEND'
;	  1106	
;	  1107	GLOBAL ROUTINE SEND (ADDRESS, LENGTH) =
;	  1108	
;	  1109	!++
;	  1110	! FUNCTIONAL DESCRIPTION:
;	  1111	!
;	  1112	!	This routine will send a stream of 8-bit bytes over the terminal
;	  1113	!	line to the remote KERMIT.  This routine is called from KERMSG.
;	  1114	!
;	  1115	! CALLING SEQUENCE:
;	  1116	!
;	  1117	!	SEND(Address-of-msg, Length-of-msg);
;	  1118	!
;	  1119	! INPUT PARAMETERS:
;	  1120	!
;	  1121	!	None.
;	  1122	!
;	  1123	! IMPLICIT INPUTS:
;	  1124	!
;	  1125	!	TERM_CHAN - Channel number to deassign.
;	  1126	!
;	  1127	! OUTPUT PARAMETERS:
;	  1128	!
;	  1129	!	None.
;	  1130	!
;	  1131	! IMPLICIT OUTPUTS:
;	  1132	!
;	  1133	!	None.
;	  1134	!
;	  1135	! COMPLETION CODES:
;	  1136	!
;	  1137	!	SS$_NORMAL or error condition.
;	  1138	!
;	  1139	! SIDE EFFECTS:
;	  1140	!
;	  1141	!	None.
;	  1142	!
;	  1143	!--
;	  1144	
;	  1145	    BEGIN
;	  1146	
;	  1147	    LOCAL
;	  1148		STATUS;					! Status returned by $QIOW
;	  1149	
;	  1150	    STATUS = $QIOW (CHAN = .TERM_CHAN, FUNC = IO$_WRITEVBLK + IO$M_NOFORMAT, P1 = .ADDRESS, P2 = .LENGTH);
;	  1151	
;	  1152	    IF .STATUS EQL SS$_NORMAL
;	  1153	    THEN
;	  1154		RETURN KER_NORMAL
;	  1155	    ELSE
;	  1156		BEGIN
;	  1157		LIB$SIGNAL (.STATUS);
;	  1158		RETURN .STATUS;
;	  1159		END;
;	  1160	
;	  1161	    END;					! End of SEND





	.ENTRY  SEND, ^M<R2>			     ;SEND, Save R2							      ; 1107
	CLRQ    -(SP)				     ;-(SP)								      ; 1150
	CLRQ    -(SP)				     ;-(SP)								      ;
	MOVQ    4(AP), -(SP)			     ;ADDRESS, -(SP)							      ;
	CLRQ    -(SP)				     ;-(SP)								      ;
	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZWL  #304, -(SP)			     ;#304, -(SP)							      ;
	PUSHL   W^U.6				     ;U.6								      ;
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #12, G^SYS$QIOW			     ;#12, SYS$QIOW							      ;
	MOVL    R0, R2				     ;R0, STATUS							      ;
	CMPL    R2, #1				     ;STATUS, #1							      ; 1152
	BNEQ    1$				     ;1$								      ;
	MOVL    #134316043, R0			     ;#134316043, R0							      ; 1145
	RET     				     ;									      ;
1$:	PUSHL   R2				     ;STATUS								      ; 1157
	CALLS   #1, G^LIB$SIGNAL		     ;#1, LIB$SIGNAL							      ;
	MOVL    R2, R0				     ;STATUS, R0							      ; 1145
	RET     				     ;									      ; 1107

; Routine Size:  61 bytes,    Routine Base:  $CODE$ + 0300


;	  1162	
;	  1163	%SBTTL 'Communications line -- RECEIVE'
;	  1164	
;	  1165	GLOBAL ROUTINE RECEIVE (ADDRESS, LENGTH) =
;	  1166	
;	  1167	!++
;	  1168	! FUNCTIONAL DESCRIPTION:
;	  1169	!
;	  1170	!	This routine will receive a stream of 8-bit bytes over the terminal
;	  1171	!	line to the remote KERMIT.  This routine is called from KERMSG.
;	  1172	!	The text that is stored will always contain the control-A as the
;	  1173	!	first character.
;	  1174	!
;	  1175	! CALLING SEQUENCE:
;	  1176	!
;	  1177	!	RECEIVE(Address-of-msg);
;	  1178	!
;	  1179	! INPUT PARAMETERS:
;	  1180	!
;	  1181	!	None.
;	  1182	!
;	  1183	! IMPLICIT INPUTS:
;	  1184	!
;	  1185	!	TERM_CHAN - Channel number to deassign.
;	  1186	!
;	  1187	! OUTPUT PARAMETERS:
;	  1188	!
;	  1189	!	None.
;	  1190	!
;	  1191	! IMPLICIT OUTPUTS:
;	  1192	!
;	  1193	!	None.
;	  1194	!
;	  1195	! COMPLETION CODES:
;	  1196	!
;	  1197	!	SS$_NORMAL or error condition.
;	  1198	!
;	  1199	! SIDE EFFECTS:
;	  1200	!
;	  1201	!	None.
;	  1202	!
;	  1203	!--
;	  1204	
;	  1205	    BEGIN
;	  1206	
;	  1207	    LOCAL
;	  1208		TERMINATOR : VECTOR [2, LONG],
;	  1209		IO_STATUS : VECTOR [4, WORD],
;	  1210		POINTER,				! Pointer into the message
;	  1211		STATUS;					! Status returned by $QIO
;	  1212	
;	  1213	    TERMINATOR [0] = 0;
;	  1214	    TERMINATOR [1] = 1^.RCV_EOL;
;	P 1215	    STATUS = $QIOW (CHAN = .TERM_CHAN, FUNC = IO$_TTYREADALL + IO$M_NOECHO, IOSB = IO_STATUS, P1 = .ADDRESS,
;	  1216		P2 = MAX_MSG, P3 = .RCV_TIMEOUT, P4 = TERMINATOR);
;	  1217	    .LENGTH = .IO_STATUS [1] + 1;
;	  1218	
;	  1219	    POINTER = CH$FIND_CH(.IO_STATUS [1] + 1, CH$PTR(.ADDRESS, 0, CHR_SIZE), CHR_CTL_Y);
;	  1220	    IF CH$FAIL(POINTER) THEN RETURN KER_ABORTED;
;	  1221	
;	  1222	    IF .STATUS EQL SS$_TIMEOUT THEN RETURN KER_TIMEOUT;
;	  1223	
;	  1224	    IF .STATUS EQL SS$_NORMAL THEN RETURN KER_NORMAL;
;	  1225	!    LIB$SIGNAL(KER_RECERR, .STATUS);
;	  1226	    RETURN KER_RECERR;
;	  1227	
;	  1228	    END;					! End of RECEIVE





	.ENTRY  RECEIVE, ^M<R2>			     ;RECEIVE, Save R2							      ; 1165
	SUBL2   #20, SP				     ;#20, SP								      ;
	CLRL    12(SP)				     ;TERMINATOR							      ; 1213
	ASHL    W^RCV_EOL, #1, 16(SP)		     ;RCV_EOL, #1, TERMINATOR+4						      ; 1214
	CLRQ    -(SP)				     ;-(SP)								      ; 1216
	PUSHAB  20(SP)				     ;TERMINATOR							      ;
	PUSHL   W^RCV_TIMEOUT			     ;RCV_TIMEOUT							      ;
	MOVZBL  #96, -(SP)			     ;#96, -(SP)							      ;
	PUSHL   4(AP)				     ;ADDRESS								      ;
	CLRQ    -(SP)				     ;-(SP)								      ;
	PUSHAB  36(SP)				     ;IO_STATUS								      ;
	MOVZBL  #122, -(SP)			     ;#122, -(SP)							      ;
	PUSHL   W^U.6				     ;U.6								      ;
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #12, G^SYS$QIOW			     ;#12, SYS$QIOW							      ;
	MOVL    R0, R2				     ;R0, STATUS							      ;
	MOVZWL  6(SP), R0			     ;IO_STATUS+2, R0							      ; 1217
	INCL    R0				     ;R0								      ;
	MOVL    R0, @8(AP)			     ;R0, @LENGTH							      ;
	LOCC    #25, R0, @4(AP)			     ;#25, R0, @ADDRESS							      ; 1219
	BNEQ    1$				     ;1$								      ;
	CLRL    R1				     ;R1								      ;
1$:	MOVL    R1, (SP)			     ;R1, POINTER							      ;
	MOVAB   (SP), R0			     ;POINTER, R0							      ; 1220
	BNEQ    2$				     ;2$								      ;
	MOVL    #134316226, R0			     ;#134316226, R0							      ;
	RET     				     ;									      ;
2$:	CMPL    R2, #556			     ;STATUS, #556							      ; 1222
	BNEQ    3$				     ;3$								      ;
	MOVL    #134316216, R0			     ;#134316216, R0							      ;
	RET     				     ;									      ;
3$:	CMPL    R2, #1				     ;STATUS, #1							      ; 1224
	BNEQ    4$				     ;4$								      ;
	MOVL    #134316043, R0			     ;#134316043, R0							      ;
	RET     				     ;									      ;
4$:	MOVL    #134316234, R0			     ;#134316234, R0							      ; 1205
	RET     				     ;									      ; 1165

; Routine Size:  129 bytes,    Routine Base:  $CODE$ + 033D


;	  1229	
;	  1230	%SBTTL 'End of KERTRM'
;	  1231	END						! End of module
;	  1232	
;	  1233	ELUDOM






;				       PSECT SUMMARY
;
;	Name			 Bytes			       Attributes
;
;  $OWN$			      304  NOVEC,  WRT,  RD ,NOEXE,NOSHR,  LCL,  REL,  CON,NOPIC,ALIGN(2)
;  $GLOBAL$			        4  NOVEC,  WRT,  RD ,NOEXE,NOSHR,  LCL,  REL,  CON,NOPIC,ALIGN(2)
;  $PLIT$			       24  NOVEC,NOWRT,  RD ,NOEXE,NOSHR,  LCL,  REL,  CON,NOPIC,ALIGN(2)
;  $CODE$			      958  NOVEC,NOWRT,  RD ,  EXE,NOSHR,  LCL,  REL,  CON,NOPIC,ALIGN(2)




;				LIBRARY STATISTICS
;
;					     -------- Symbols --------    Blocks
;	File				     Total    Loaded   Percent      Read
;
;  SYS$SYSROOT:[SYSLIB]STARLET.L32;1	      5809        33         0       234







;					COMMAND QUALIFIERS

;	BLISS KERTRM/LIST=KERTRM.MAR/MACHINE_CODE=(ASSEM,NOBINARY,UNIQUE)/NOOBJECT/SOURCE=NOHEADER

; Compilation Complete

	.END
