;   0001  0	%TITLE 'KERMSG - Kermit message processing'
;   0002  0	MODULE KERMSG (IDENT = '3.2.071'
;   0003  0			) =
;   0004  1	BEGIN
;   0005  1	
;   0006  1	SWITCHES LANGUAGE (COMMON);
;   0007  1	
;   0008  1	!<BLF/WIDTH:100>
;   0009  1	
;   0010  1	!++
;   0011  1	! FACILITY:
;   0012  1	!   Kermit-10, VMS Kermit, Pro/Kermit
;   0013  1	!
;   0014  1	! ABSTRACT:
;   0015  1	!	KERMSG is the message processing routines for Kermit-10, VMS Kermit,
;   0016  1	!	and PRO/Kermit.
;   0017  1	!	This module is written in common BLISS, so that it can be
;   0018  1	!	transported for the DECsystem-10 and VAX/VMS systems.
;   0019  1	!
;   0020  1	! ENVIRONMENT:
;   0021  1	!   User mode
;   0022  1	!
;   0023  1	! AUTHOR: Robert C. McQueen, CREATION DATE: 24-January-1983
;   0024  1	!
;   0025  1	! MODIFIED BY:
;   0026  1	!
;   0027  1	!--
;   0028  1	
;   0029  1	%SBTTL 'Table of Contents'
;   0030  1	!+
;   0031  1	!.pag.lit
;   0032  1	!		Table of Contents for KERMSG
;   0033  1	!
;   0034  1	!
;   0035  1	!			   Section			      Page
;   0036  1	!   1. Revision History . . . . . . . . . . . . . . . . . . .    3
;   0037  1	!   2. Interface requirements . . . . . . . . . . . . . . . .    4
;   0038  1	!   3. Declarations
;   0039  1	!        3.1.   Forward definitions . . . . . . . . . . . . .    5
;   0040  1	!   4. Require files. . . . . . . . . . . . . . . . . . . . .   28
;   0041  1	!   5. Macro definitions. . . . . . . . . . . . . . . . . . .   29
;   0042  1	!   6. KERMIT Protocol Definitions. . . . . . . . . . . . . .   30
;   0043  1	!        6.1.   Packet offsets. . . . . . . . . . . . . . . .   31
;   0044  1	!        6.2.   Message dependent field . . . . . . . . . . .   32
;   0045  1	!        6.3.   SEND initiate packet. . . . . . . . . . . . .   33
;   0046  1	!   7. KERMIT Protocol States . . . . . . . . . . . . . . . .   34
;   0047  1	!   8. Internal constants . . . . . . . . . . . . . . . . . .   35
;   0048  1	!   9. Storage - External . . . . . . . . . . . . . . . . . .   36
;   0049  1	!  10. Storage - Local. . . . . . . . . . . . . . . . . . . .   37
;   0050  1	!  11. External references. . . . . . . . . . . . . . . . . .   38
;   0051  1	!  12. MSG_INIT . . . . . . . . . . . . . . . . . . . . . . .   39
;   0052  1	!  13. SND_ERROR. . . . . . . . . . . . . . . . . . . . . . .   40
;   0053  1	!  14. SERVER - Server mode . . . . . . . . . . . . . . . . .   41
;   0054  1	!  15. SEND_SWITCH. . . . . . . . . . . . . . . . . . . . . .   42
;   0055  1	!  16. REC_SWITCH . . . . . . . . . . . . . . . . . . . . . .   43
;   0056  1	!  17. Server
;   0057  1	!       17.1.   DO_GENERIC - Execute a generic command. . . .   44
;   0058  1	!  18. DO_TRANSACTION - Main loop for FSM . . . . . . . . . .   45
;   0059  1	!  19. REC_SERVER_IDLE - Idle server state. . . . . . . . . .   46
;   0060  1	!  20. SEND_SERVER_INIT . . . . . . . . . . . . . . . . . . .   47
;   0061  1	!  21. SEND_DATA. . . . . . . . . . . . . . . . . . . . . . .   48
;   0062  1	!  22. SEND_FILE. . . . . . . . . . . . . . . . . . . . . . .   49
;   0063  1	!  23. SEND_EOF . . . . . . . . . . . . . . . . . . . . . . .   50
;   0064  1	!  24. SEND_INIT. . . . . . . . . . . . . . . . . . . . . . .   51
;   0065  1	!  25. SEND_OPEN_FILE - Open file for sending . . . . . . . .   52
;   0066  1	!  26. SEND_GENCMD. . . . . . . . . . . . . . . . . . . . . .   53
;   0067  1	!  27. SEND_BREAK . . . . . . . . . . . . . . . . . . . . . .   54
;   0068  1	!  28. REC_INIT . . . . . . . . . . . . . . . . . . . . . . .   55
;   0069  1	!  29. REC_FILE . . . . . . . . . . . . . . . . . . . . . . .   56
;   0070  1	!  30. REC_DATA . . . . . . . . . . . . . . . . . . . . . . .   57
;   0071  1	!  31. SERVER - Generic commands. . . . . . . . . . . . . . .   58
;   0072  1	!  32. HOST_COMMAND - perform a host command. . . . . . . . .   59
;   0073  1	!  33. CALL_SY_RTN - handle operating system dependent functions  60
;   0074  1	!  34. Message processing
;   0075  1	!       34.1.   PRS_SEND_INIT - Parse send init params. . . .   61
;   0076  1	!  35. SET_SEND_INIT. . . . . . . . . . . . . . . . . . . . .   62
;   0077  1	!  36. SEND_PACKET. . . . . . . . . . . . . . . . . . . . . .   63
;   0078  1	!  37. REC_MESSAGE - Receive a message. . . . . . . . . . . .   64
;   0079  1	!  38. REC_PACKET . . . . . . . . . . . . . . . . . . . . . .   65
;   0080  1	!  39. CALC_BLOCK_CHECK . . . . . . . . . . . . . . . . . . .   66
;   0081  1	!  40. NORMALIZE_FILE - Put file name into normal form. . . .   67
;   0082  1	!  41. Buffer filling
;   0083  1	!       41.1.   Main routine. . . . . . . . . . . . . . . . .   68
;   0084  1	!  42. BFR_EMPTY. . . . . . . . . . . . . . . . . . . . . . .   69
;   0085  1	!  43. Buffer filling and emptying subroutines. . . . . . . .   70
;   0086  1	!  44. Add parity routine . . . . . . . . . . . . . . . . . .   71
;   0087  1	!  45. Parity routine . . . . . . . . . . . . . . . . . . . .   72
;   0088  1	!  46. Per transfer
;   0089  1	!       46.1.   Initialization. . . . . . . . . . . . . . . .   73
;   0090  1	!  47. Statistics
;   0091  1	!       47.1.   Finish message transfer . . . . . . . . . . .   74
;   0092  1	!  48. Status type out
;   0093  1	!       48.1.   STS_OUTPUT. . . . . . . . . . . . . . . . . .   75
;   0094  1	!  49. TYPE_CHAR - Type out a character . . . . . . . . . . .   76
;   0095  1	!  50. Debugging
;   0096  1	!       50.1.   DBG_SEND. . . . . . . . . . . . . . . . . . .   77
;   0097  1	!       50.2.   DBG_RECEIVE . . . . . . . . . . . . . . . . .   78
;   0098  1	!       50.3.   DBG_MESSAGE . . . . . . . . . . . . . . . . .   79
;   0099  1	!  51. End of KERMSG. . . . . . . . . . . . . . . . . . . . .   80
;   0100  1	!.end lit.pag
;   0101  1	!-
;   0102  1	%SBTTL 'Revision History'
;   0103  1	
;   0104  1	!++
;   0105  1	! Start of version 1.
;   0106  1	!
;   0107  1	! 1.0.000	By: Robert C. McQueen		On: 4-Jan-1983
;   0108  1	!		Create this program.
;   0109  1	!
;   0110  1	! 1.0.001	By: Robert C. McQueen		On: 30-Apr-1983
;   0111  1	!		Change PAR_xxx to be PR_xxx, so that they can be used for
;   0112  1	!		KERMIT-10.
;   0113  1	!
;   0114  1	! 1.0.002	By: Robert C. McQueen		On: 1-May-1983
;   0115  1	!		Add DO_GENERIC routine to cause a generic Kermit command to
;   0116  1	!		be executed on the remote Kermit.
;   0117  1	!
;   0118  1	! 1.0.003	By: Robert C. McQueen		On: 3-May-1983
;   0119  1	!		Fix message number incrementing.
;   0120  1	!
;   0121  1	! 1.0.004	By: Robert C. McQueen		On: 4-May-1983
;   0122  1	!		Allow RECEIVE file-specification to work correctly.
;   0123  1	!
;   0124  1	! 1.0.005	By: Robert C. McQueen		On: 6-May-1983
;   0125  1	!		Add more stats support.
;   0126  1	!
;   0127  1	! 1.0.006	By: Nick Bush			On: 13-June-1983
;   0128  1	!		Fix SEND_PACKET to copy correct characters when fixing
;   0129  1	!		parity bits.
;   0130  1	!
;   0131  1	! 1.1.007	By: Nick Bush			On: 15-July-1983
;   0132  1	!		Correct SEND-INIT message handling to do the right things
;   0133  1	!		with the protocol version 3 items.
;   0134  1	!
;   0135  1	! 1.1.010	By: Robert C. McQueen		On: 20-July-1983
;   0136  1	!		Make PARITY a global routine, so that it can be called by
;   0137  1	!		CONNECT processing.  Change the name from PARITY to GEN_PARITY
;   0138  1	!		add a new routine to generate the parity, since it is not
;   0139  1	!		part of the checksum.
;   0140  1	!
;   0141  1	! 1.1.011	By: Robert C. McQueen		On: 28-July-1983
;   0142  1	!		KER_TIMEOUT errors in the SERVER loop would cause
;   0143  1	!		KER_UNISRV error messages to be returned to the remote.
;   0144  1	!		Check for receive failures and send NAKs instead.
;   0145  1	!
;   0146  1	! 1.2.012	By: Robert C. McQueen		On: 23-August-1983
;   0147  1	!		Don't abort if we get a message that is just an end of line
;   0148  1	!		character.  It could be noise on the line.
;   0149  1	!
;   0150  1	! 1.2.013	By: Nick Bush			On: 7-September-1983
;   0151  1	!		Fix several problems with the SEND_xxx parameters
;   0152  1	!
;   0153  1	! 1.2.014	By: Robert C. McQueen		On: 15-September-1983
;   0154  1	!		Add routine calls to XFR_STATUS to tell the user on the
;   0155  1	!		number of packets have changed.
;   0156  1	!
;   0157  1	! 1.2.015	By: Nick Bush			On: 5-October-1983
;   0158  1	!		Add 2 and 3 character checksum (block check) support.
;   0159  1	!		Add support for data within acknowledgement packets
;   0160  1	!		and withing end-of-file packets to allow for file
;   0161  1	!		transmission to be aborted.  Also add support for
;   0162  1	!		"I" packet to allow server parameters to be initialized.
;   0163  1	!
;   0164  1	! 1.2.016	By: Nick Bush			On: 19-October-1983
;   0165  1	!		Add repeat character support.
;   0166  1	!
;   0167  1	! 2.0.017	Release TOPS-10 Kermit-10 version 2.0
;   0168  1	!		Release VAX/VMS Kermit-32 version 2.0
;   0169  1	!
;   0170  1	! 2.0.018	By: Robert C. McQueen		On: 16-November-1983
;   0171  1	!		Fix four checks on the message number that were not
;   0172  1	!		mod 64.
;   0173  1	!
;   0174  1	! 2.0.019	By: Robert C. McQueen		On: 16-November-1983
;   0175  1	!		Remove the CLEAR routine.  It is not really needed.
;   0176  1	!
;   0177  1	! 2.0.020	By: Nick Bush			On: 12-Dec-1983
;   0178  1	!		Fix SEND_DATA and BFR_FILL to handle empty files and
;   0179  1	!		files which happen to end just on a message boundary.
;   0180  1	!		This would sometimes produce extra nulls.
;   0181  1	!
;   0182  1	! 2.0.021	By: Nick Bush			On: 15-Dec-1983
;   0183  1	!		Fix some problems with REC_MESSAGE which would cause
;   0184  1	!		aborts when a message timed out.
;   0185  1	!
;   0186  1	! 2.0.022	By: Robert C. McQueen		19-Dec-1983
;   0187  1	!		Make STATUS a local for most routines and remove FILE_DUMP
;   0188  1	!		as it is nolonger needed.
;   0189  1	!
;   0190  1	! 2.0.023	By: Nick Bush			On: 3-Jan-1984
;   0191  1	!		Change FIL_NORMAL_FORM to contain not just a flag, but
;   0192  1	!		a file name type instead.
;   0193  1	!
;   0194  1	! 2.0.024	By: Nick Bush			On: 11-Jan-1984
;   0195  1	!		Fix REC_MESSAGE to send NAK for packet we expect, not
;   0196  1	!		previous packet.
;   0197  1	!
;   0198  1	! 2.0.025	By: Nick Bush			On: 23-Jan-1984
;   0199  1	!		Re-enable server-init packet and complete code so that
;   0200  1	!		parameters set by it will remain set.
;   0201  1	!		Fix file name copying to use BFR_FILL or BFR_EMPTY
;   0202  1	!		so that all quoting/compression is done properly.
;   0203  1	!
;   0204  1	! 2.0.026	By: Nick Bush			On: 15-Feb-1984
;   0205  1	!		Add code for generic command support (both directions).
;   0206  1	!		There is now only one state dispatch loop, entered
;   0207  1	!		in various states for different functions.
;   0208  1	!
;   0209  1	! 2.0.027	By: Robert C. McQueen		On: 16-Feb-1984
;   0210  1	!		At some point SEND_TIMEOUT became global, but it was not moved
;   0211  1	!		to KERGLB.  This edit moves it to KERGLB.BLI.
;   0212  1	!
;   0213  1	! 2.0.030	By: Nick Bush			On: 2-March-1984
;   0214  1	!		Fix BFR_FILL to handle case of last repeated character
;   0215  1	!		not fitting within a packet.  It was forgetting to
;   0216  1	!		send the characters at all.
;   0217  1	!
;   0218  1	! 2.0.031	By: Nick Bush			On: 6-March-1984
;   0219  1	!		Make sure FILE_OPEN_FLAG is set properly when advancing
;   0220  1	!		to next file of a wild-card send.  The file was not
;   0221  1	!		being set true, leading to problems after a couple files.
;   0222  1	!
;   0223  1	! 2.0.032	By: Nick Bush			On: 9-March-1984
;   0224  1	!		Fix UNPACK_DATA in SERVER_GENERIC to properly store
;   0225  1	!		new string pointer.
;   0226  1	!
;   0227  1	! 2.0.033	By: Robert C. McQueen		On: 12-March-1984
;   0228  1	!		If NEXT_FILE fails with anything other than a NOMORFILES
;   0229  1	!		it should change state to STATE_A not STATE_SB.  This
;   0230  1	!		fixes a problem caused by Pro/Kermit and KERFIL (VMS).
;   0231  1	!
;   0232  1	! 2.0.034	By: Nick Bush			On: 15-March-1984
;   0233  1	!		Put file spec into X packet as well as F packet. This
;   0234  1	!		makes wild card TYPE's work nicer.
;   0235  1	!
;   0236  1	! 2.0.035	By: Nick Bush			On: 20-March-1984
;   0237  1	!		Fix send/receive quoting to conform to the way the
;   0238  1	!		protocol manual says it should be done, rather
;   0239  1	!		than the way we (and Kermit-20) have always done it.
;   0240  1	!
;   0241  1	! 2.0.036	By: Nick Bush			On: 28-March-1984
;   0242  1	!		Make SERVER_GENERIC more defensive against badly
;   0243  1	!		constructed packets.  If an argument has negative
;   0244  1	!		length, punt the request.  Also put angle brackets
;   0245  1	!		around data from "X" packet header, so file names will
;   0246  1	!		stick out.
;   0247  1	!
;   0248  1	! 3.0.037	Start of version 3.
;   0249  1	!
;   0250  1	! 3.0.040	By: Nick Bush			On: 2-April-1984
;   0251  1	!		Add separate server timeout.  This allows stopping the
;   0252  1	!		server NAK's without affecting the normal packet timeout.
;   0253  1	!
;   0254  1	! 3.0.041	By: Nick Bush			On: 12-April-1984
;   0255  1	!		Fix block check calculation to account for the fact
;   0256  1	!		that the parity bits are put onto the message when
;   0257  1	!		it is sent (in place), so that if a retransmission is
;   0258  1	!		done without refilling the buffer (as is normal with
;   0259  1	!		data messages), the parity bits will be there.  Make
;   0260  1	!		sure we strip them out for block check calculation.
;   0261  1	!
;   0262  1	! 3.1.042	By: Nick Bush			On: 27-August-1984
;   0263  1	!		If we get too many retries when sending a server init (I)
;   0264  1	!		packet, don't abort.  Instead, just try sending the server
;   0265  1	!		command, since the Kermit on the other end might be coded
;   0266  1	!		wrong and is responding to packets it doesn't understand
;   0267  1	!		with a NAK.
;   0268  1	!
;   0269  1	! 3.1.043	By: Nick Bush			On: 27-August-1984
;   0270  1	!		Don't abort receives on zero length messages.  Just treat
;   0271  1	!		it like a timeout.
;   0272  1	!
;   0273  1	! 3.1.044	By: Nick Bush			On: 10-April-1985
;   0274  1	!		Remove IBM mode.  It will be instituted by IBM_CHAR being
;   0275  1	!		set >= 0 if handshaking is needed.
;   0276  1	!
;   0277  1	! 3.1.045	BY: David Stevens		On: 15-July-1985
;   0278  1	!		Fix terminal message for multiple file sendings. Type out
;   0279  1	!		"Sending: " in the system dependent NEXT_FILE routine.
;   0280  1	!
;   0281  1	! Start of version 3.2
;   0282  1	!
;   0283  1	! 3.2.070	By: Robert McQueen		On: 17-Dec-1985
;   0284  1	!		Fix CRC calculations when sending 8 bit data and not 
;   0285  1	!		using 8 bit quoting.
;   0286  1	!
;   0287  1	! 3.2.071	By: Robert McQueen		On: 11-March-186
;   0288  1	!		Include space in the message buffer for the line termination
;   0289  1	!		character.
;   0290  1	!--
;   0291  1	
;   0292  1	%SBTTL 'Interface requirements'
;   0293  1	
;   0294  1	!++
;   0295  1	!		Interface requirements
;   0296  1	!
;   0297  1	! The following routines and data locations are rquired for a correct
;   0298  1	! implementation of KERMIT.
;   0299  1	!
;   0300  1	! File routines:
;   0301  1	!
;   0302  1	!	FILE_OPEN (Function)
;   0303  1	!		This routine will open a file for reading or writting.  It
;   0304  1	!		will assume that FILE_SIZE contains the number of bytes
;   0305  1	!		and FILE_NAME contains the file name of length FILE_SIZE.
;   0306  1	!		The function that is passed is either FNC_READ or FNC_WRITE.
;   0307  1	!
;   0308  1	!	FILE_CLOSE ()
;   0309  1	!		This routine will close the currently open file.  This
;   0310  1	!		routine will return the status of the operation.
;   0311  1	!
;   0312  1	!	GET_FILE (Character)
;   0313  1	!		This routine will get a character from the currently open file
;   0314  1	!		and store it in the location specified by "Character".  There
;   0315  1	!		will be a true/false value returned by the routine to determine
;   0316  1	!		if there was an error.
;   0317  1	!
;   0318  1	!	PUT_FILE (Character)
;   0319  1	!		This routine will output a character to the currently open
;   0320  1	!		file.  It will return a true/false value to determine if the
;   0321  1	!		routine was successful.
;   0322  1	!
;   0323  1	!	NEXT_FILE ()
;   0324  1	!		This routine will advance to the next file.  This routine
;   0325  1	!		will return false if there are no more files to process.
;   0326  1	!
;   0327  1	! Communications line routines:
;   0328  1	!
;   0329  1	!	RECEIVE (Buffer address, Address of var to store length into)
;   0330  1	!		This routine will receive a message from the remote Kermit.
;   0331  1	!
;   0332  1	!	SEND (Buffer address, Length in characters)
;   0333  1	!		This routine will send a message to the remote Kermit.
;   0334  1	!
;   0335  1	!	GEN_CRC (Buffer address, length in characters)
;   0336  1	!		This routine will calculate the CRC-CCITT for the characters
;   0337  1	!		in the buffer.
;   0338  1	!
;   0339  1	! Operating system routines:
;   0340  1	!
;   0341  1	!	SY_DISMISS (Seconds)
;   0342  1	!		This routine will cause Kermit to sleep for the specified
;   0343  1	!		number of seconds.  It is used to handle the DELAY parameter.
;   0344  1	!
;   0345  1	!	SY_LOGOUT ()
;   0346  1	!		Log the job off of the system. (Kill the process).
;   0347  1	!
;   0348  1	!	SY_TIME ()
;   0349  1	!		This routine will return the starting time milliseconds.
;   0350  1	!		It can be the start of Kermit, the system, etc, so long
;   0351  1	!		as it always is incrementing.
;   0352  1	!
;   0353  1	! Status routines:
;   0354  1	!
;   0355  1	!	XFR_STATUS (Type, Subtype);
;   0356  1	!		This routine is called to indicate the occurance of
;   0357  1	!		a significant event that the user interface may wish
;   0358  1	!		to inform the user about.  The arguments indicate the
;   0359  1	!		type of event.
;   0360  1	!		Type: "S" - Send, "R" - Receive
;   0361  1	!			Subtype: "P" - Packet
;   0362  1	!				 "N" - NAK
;   0363  1	!				 "T" - timeout
;   0364  1	!		For type = "I" (initiate), "T" (terminate):
;   0365  1	!			Subtype: "S" - a file send
;   0366  1	!				 "R" - a file receive
;   0367  1	!				 "G" - a generic command
;   0368  1	!				 "I" - for "T" only, returning to server idle
;   0369  1	!		For type = "F" (file operation):
;   0370  1	!			Subtype: "S" - open for sending
;   0371  1	!				 "R" - open for receiving
;   0372  1	!				 "C" - closing file OK
;   0373  1	!				 "X" - aborting file by user request
;   0374  1	!				 "Z" - aborting group by user request
;   0375  1	!				 "D" - aborting file, but saving due to disposition
;   0376  1	!				 "A" - aborting file due to protocol error
;   0377  1	!
;   0378  1	! Error processing:
;   0379  1	!
;   0380  1	!	KRM_ERROR (Error parameter)
;   0381  1	!		This routine will cause an error message to be issued.
;   0382  1	!		The error parameter is defined by KERERR.  This may cause
;   0383  1	!		SND_ERROR to be called to send an "E" message to the remote.
;   0384  1	!
;   0385  1	! Terminal I/O routines:
;   0386  1	!
;   0387  1	!	TERM_DUMP (Buffer, Count)
;   0388  1	!	DBG_DUMP (Buffer, Count)
;   0389  1	!		This routine will dump the buffer onto the user's terminal.
;   0390  1	!		The routine is supplied with the count of the characters
;   0391  1	!		and the address of the buffer.
;   0392  1	!		These may be the same routine or different.  DBG_DUMP
;   0393  1	!		is only called for debugging output.
;   0394  1	!
;   0395  1	!
;   0396  1	!			ENTRY POINTS
;   0397  1	!
;   0398  1	! KERMSG contains the following entry points for the KERMIT.
;   0399  1	!
;   0400  1	!	SERVER ()
;   0401  1	!		This routine will cause KERMIT go enter server mode.
;   0402  1	!
;   0403  1	!	SEND_SWITCH ()
;   0404  1	!		This routine will send a file.  It expects that the user
;   0405  1	!		has stored the text of the file name into FILE_NAME and
;   0406  1	!		the length of the text into FILE_SIZE.
;   0407  1	!
;   0408  1	!	REC_SWITCH ()
;   0409  1	!		This routine will receive a file.  It expects that the default
;   0410  1	!		file name is set up in FILE_NAME and the length is in
;   0411  1	!		FILE_SIZE.
;   0412  1	!
;   0413  1	!	GEN_PARITY (Character)
;   0414  1	!		This routine will return the character with the proper parity
;   0415  1	!		on the character.
;   0416  1	!
;   0417  1	!	SND_ERROR (COUNT, ADDRESS)
;   0418  1	!		This routine will send the text of an error to the remote
;   0419  1	!		Kermit.
;   0420  1	!
;   0421  1	!	DO_GENERIC (TYPE)
;   0422  1	!		This routine will cause a generic function to be sent to
;   0423  1	!		the remote Kermit.  This routine will then do all of the
;   0424  1	!		necessary hand shaking to handle the local end of the generic
;   0425  1	!		Kermit command.
;   0426  1	!
;   0427  1	!
;   0428  1	!		GLOBAL Storage
;   0429  1	!
;   0430  1	! The following are the global storage locations that are used to interface
;   0431  1	! to KERMSG.  These locations contains the various send and receive parameters.
;   0432  1	!
;   0433  1	! Receive parameters:
;   0434  1	!
;   0435  1	!	RCV_PKT_SIZE
;   0436  1	!		Receive packet size.
;   0437  1	!	RCV_NPAD
;   0438  1	!		Padding length
;   0439  1	!	RCV_PADCHAR
;   0440  1	!		Padding character
;   0441  1	!	RCV_TIMEOUT
;   0442  1	!		Time out
;   0443  1	!	RCV_EOL
;   0444  1	!		End of line character
;   0445  1	!	RCV_QUOTE_CHR
;   0446  1	!		Quote character
;   0447  1	!	RCV_8QUOTE_CHR
;   0448  1	!		8-bit quoting character
;   0449  1	!	RCV_SOH
;   0450  1	!		Start of header character
;   0451  1	!
;   0452  1	! Send parameters (Negative values denote the default, positive user supplied):
;   0453  1	!
;   0454  1	!	SND_PKT_SIZE
;   0455  1	!		Send packet size
;   0456  1	!	SND_NPAD
;   0457  1	!		Padding length
;   0458  1	!	SND_PADCHAR
;   0459  1	!		Padding character
;   0460  1	!	SND_TIMEOUT
;   0461  1	!		Time out
;   0462  1	!	SND_EOL
;   0463  1	!		End of line character
;   0464  1	!	SND_QUOTE_CHR
;   0465  1	!		Quote character
;   0466  1	!	SND_SOH
;   0467  1	!		Start of header character (normally 001)
;   0468  1	!
;   0469  1	! Statistics:
;   0470  1	!
;   0471  1	!	SND_TOTAL_CHARS
;   0472  1	!		Total characters sent for this Kermit session
;   0473  1	!	RCV_TOTAL_CHARS
;   0474  1	!		Total characters received for this Kermit session
;   0475  1	!	SND_DATA_CHARS
;   0476  1	!		Total number of data characters sent for this Kermit session
;   0477  1	!	RCV_DATA_CHARS
;   0478  1	!		Total number of data characters received for this Kermit session
;   0479  1	!	SND_COUNT
;   0480  1	!		Total number of packets that have been sent
;   0481  1	!	RCV_COUNT
;   0482  1	!		Total number of packets that have been received.
;   0483  1	!	SMSG_TOTAL_CHARS
;   0484  1	!		Total characters sent for this file transfer
;   0485  1	!	RMSG_TOTAL_CHARS
;   0486  1	!		Total characters received for this file transfer
;   0487  1	!	SMSG_DATA_CHARS
;   0488  1	!		Total data characters sent for this file transfer
;   0489  1	!	RMSG_DATA_CHARS
;   0490  1	!		Total data characters received for this file transfer
;   0491  1	!	SMSG_NAKS
;   0492  1	!		Total number of NAKs sent for this file transfer
;   0493  1	!	RMSG_NAKS
;   0494  1	!		Total number of NAKs received for this file transfer
;   0495  1	!	XFR_TIME
;   0496  1	!		Amount of time the last transfer took in milliseconds.
;   0497  1	!	TOTAL_TIME
;   0498  1	!		Total amount of time spend transfering data.
;   0499  1	!
;   0500  1	! Misc constants:
;   0501  1	!
;   0502  1	!	LAST_ERROR
;   0503  1	!		ASCIZ of the last error message issued.
;   0504  1	!	FILE_NAME
;   0505  1	!		Vector containing the ASCII characters of the file name.
;   0506  1	!	FILE_SIZE
;   0507  1	!		Number of characters in the FILE_NAME vector.
;   0508  1	!	DELAY
;   0509  1	!		Amount of time to delay
;   0510  1	!	DUPLEX
;   0511  1	!		DP_HALF or DP_FULL to denote either half duplex or full duplex.
;   0512  1	!		[Currently only DP_FULL is supported]
;   0513  1	!	PKT_RETRIES
;   0514  1	!		Number of retries to attempt to read a message.
;   0515  1	!	SI_RETRIES
;   0516  1	!		Number of retries to attempt on send inits
;   0517  1	!	DEBUG_FLAG
;   0518  1	!		Debugging mode on/off
;   0519  1	!	WARN_FLAG
;   0520  1	!		File warning flag
;   0521  1	!	IBM_FLAG
;   0522  1	!		True if talking to an IBM system, else false.
;   0523  1	!	ECHO_FLAG
;   0524  1	!		Local echo flag
;   0525  1	!	CONNECT_FLAG
;   0526  1	!		Connected flag; True if terminal and SET LINE are the same
;   0527  1	!	PARITY_TYPE
;   0528  1	!		Type of parity to use on sends.
;   0529  1	!	DEV_PARITY_FLAG
;   0530  1	!		Device will add parity to message.  True if device adds
;   0531  1	!		parity and false if we must do it.
;   0532  1	!
;   0533  1	!--
;   0534  1	
;   0535  1	%SBTTL 'Declarations -- Forward definitions'
;   0536  1	!<BLF/NOFORMAT>
;   0537  1	!
;   0538  1	! Forward definitions
;   0539  1	!
;   0540  1	
;   0541  1	FORWARD ROUTINE
;   0542  1	
;   0543  1	! Main loop for a complete transaction
;   0544  1	    DO_TRANSACTION,		! Perform a complete transaction
;   0545  1	
;   0546  1	! Send processing routines
;   0547  1	
;   0548  1	    SEND_SERVER_INIT,		![026] Send a server init packet
;   0549  1	    SEND_DATA,			! Send data to the micro
;   0550  1	    SEND_FILE,			! Send file name
;   0551  1	    SEND_OPEN_FILE,			! Open file for sending
;   0552  1	    SEND_GENCMD,		! Send generic command
;   0553  1	    SEND_EOF,			! Send EOF
;   0554  1	    SEND_INIT,			! Send initialization msg
;   0555  1	    SEND_BREAK,			! Send break end of transmission
;   0556  1	
;   0557  1	! Receive processing routines
;   0558  1	
;   0559  1	    REC_SERVER_IDLE,		! Wait for message while server is idle
;   0560  1	    REC_INIT,			! Receive initialization
;   0561  1	    REC_FILE,			! Receive file information
;   0562  1	    REC_DATA,			! Receive data
;   0563  1	!
;   0564  1	! Server processing routines
;   0565  1	!
;   0566  1	    SERVER_GENERIC,		! Process generic KERMIT commands
;   0567  1	    HOST_COMMAND,		! Process host command
;   0568  1	    KERMIT_COMMAND,		! Process Kermit command
;   0569  1	    CALL_SY_RTN,		! Handle calling system routine and returning result
;   0570  1	!
;   0571  1	! Statistic gathering routines
;   0572  1	!
;   0573  1	    END_STATS	: NOVALUE,	! End of a message processing stats routine
;   0574  1	
;   0575  1	! Low level send/receive routines
;   0576  1	
;   0577  1	    CALC_BLOCK_CHECK,		! Routine to calculate the block check value
;   0578  1	    SET_SEND_INIT : NOVALUE,	! Set up the MSG_SND_INIT parameters.
;   0579  1	    PRS_SEND_INIT,		! Parse MSG_SND_INIT parameters.
;   0580  1	    DO_PARITY : NOVALUE,	! Routine to generate parity for a message
;   0581  1	    GEN_PARITY,			! Routine to add parity to a character
;   0582  1	    SEND_PACKET,		! Send a packet to the remote
;   0583  1	    REC_MESSAGE,		! Receive a message with retry processing
;   0584  1	    REC_PACKET,			! Receive a packet from the remote
;   0585  1	
;   0586  1	! Utility routines
;   0587  1	
;   0588  1	    NORMALIZE_FILE : NOVALUE,	! Force file name into normal form
;   0589  1	    BFR_EMPTY,			! Empty the data buffer
;   0590  1	    BFR_FILL,			! Fill the data buffer from a file
;   0591  1	    SET_STRING,			![025] Routine to set alternate get/put routines
;   0592  1	    				! for use with in memory strings
;   0593  1	    TYPE_CHAR,			! Type a character from a packet
;   0594  1	    INIT_XFR	: NOVALUE,	! Initialize the per transfer processing
;   0595  1	    STS_OUTPUT	: NOVALUE,	! Output current transfer status
;   0596  1	!
;   0597  1	! Debugging routines
;   0598  1	!
;   0599  1	    DBG_MESSAGE	: NOVALUE,	! Type out a formatted message
;   0600  1	    DBG_SEND	: NOVALUE,	! Send message debugging routine
;   0601  1	    DBG_RECEIVE	: NOVALUE;	! Receive message debugging routine
;   0602  1		%SBTTL	'Require files'
;   0603  1	
;   0604  1	!
;   0605  1	!<BLF/FORMAT>
;   0606  1	!
;   0607  1	! REQUIRE FILES:
;   0608  1	!
;   0609  1	
; L 0610  1	%IF %BLISS (BLISS32)
;   0611  1	%THEN
;   0612  1	
;   0613  1	LIBRARY 'SYS$LIBRARY:STARLET';
;   0614  1	
;   0615  1	%FI
;   0616  1	
;   0617  1	REQUIRE 'KERCOM';
;   0825  1	
;   0826  1	REQUIRE 'KERERR';
;   0891  1	
;   0892  1	%SBTTL 'Macro definitions'
;   0893  1	!
;   0894  1	! MACROS:
;   0895  1	!
;   0896  1	
;   0897  1	MACRO
; M 0898  1	    CTL (C) =
;   0899  1	 ((C) XOR %O'100')%,
; M 0900  1	    CHAR (C) =
;   0901  1	 ((C) + %O'40')%,
; M 0902  1	    UNCHAR (C) =
;   0903  1	 ((C) - %O'40')%;
;   0904  1	
;   0905  1	%SBTTL 'KERMIT Protocol Definitions'
;   0906  1	
;   0907  1	!++
;   0908  1	! The following describes the various items that are found in the
;   0909  1	! KERMIT messages.  A complete and through desription of the protocol can be
;   0910  1	! found in the KERMIT PROTOCOL MANUAL.
;   0911  1	!
;   0912  1	!
;   0913  1	! All KERMIT messages have the following format:
;   0914  1	!
;   0915  1	! <Mark><CHAR(Count)><CHAR(Seq)><Message-dependent information><Check><EOL>
;   0916  1	!
;   0917  1	! <MARK>
;   0918  1	!	Normally SOH (Control-A, octal 001).
;   0919  1	!
;   0920  1	! <CHAR(Count)>
;   0921  1	!	Count of the number of characters following this position.
;   0922  1	!	Character counts of ONLY 0 to 94 are valid.
;   0923  1	!
;   0924  1	! <CHAR(Seq)>
;   0925  1	!	Packet sequence number, modulo 100 (octal).
;   0926  1	!
;   0927  1	! <MESSAGE-DEPENDENT INFORMATION>
;   0928  1	!	This field contains the message dependent information.  There can
;   0929  1	!	be multiple fields in this section.  See the KERMIT Protocol document
;   0930  1	!	for a complete description of this.
;   0931  1	!
;   0932  1	! <Check>
;   0933  1	!	A block check on the characters in the packet between, but not
;   0934  1	!	including, the mark and the checksum itself.  It may be one to three
;   0935  1	!	characters, depending upon the type agreed upon.
;   0936  1	!
;   0937  1	!	1. Single character arithmetic sum equal to:
;   0938  1	!		chksum = (s + ((s AND 300)/100)) AND 77
;   0939  1	!	    Character sent is CHAR(chksum).
;   0940  1	!
;   0941  1	!	2. Two character arithmetic sum.  CHAR of bits 6-11 are the first
;   0942  1	!	   character, CHAR of bits 0-5 are the second character.
;   0943  1	!
;   0944  1	!	3. Three character CRC-CCITT.  First character is CHAR of bits 12-15,
;   0945  1	!	   second is CHAR of bits 6-11, third is CHAR of bits 0-5.
;   0946  1	!
;   0947  1	!
;   0948  1	! <EOL>
;   0949  1	!	End of line.  Any line terminator that may be required by the host.
;   0950  1	!--
;   0951  1	
;   0952  1	%SBTTL 'KERMIT Protocol Definitions -- Packet offsets'
;   0953  1	
;   0954  1	!++
;   0955  1	! The following define the various offsets of the standard KERMIT
;   0956  1	! packets.
;   0957  1	!--
;   0958  1	
;   0959  1	LITERAL
;   0960  1	    PKT_MARK = 0,				! <MARK>
;   0961  1	    PKT_COUNT = 1,				! <CHAR(Count)>
;   0962  1	    PKT_SEQ = 2,				! <CHAR(Seq)>
;   0963  1	    PKT_TYPE = 3,				! <Message type>
;   0964  1	    PKT_MSG = 4,				! <MESSAGE-DEPENDENT INFORMATION>
;   0965  1	    PKT_MAX_MSG = 94 - 5,			! Maximum size of the message dependent
;   0966  1	    						!  information
;   0967  1	    PKT_CHKSUM = 0,				! <CHAR(Chksum)> offset from end of
;   0968  1	    						!    Message dependent information
;   0969  1	    PKT_EOL = 1,				! <Eol> offset from end of data
;   0970  1	    PKT_OVR_HEAD_B = 2,				! Header overhead
;   0971  1	    PKT_OVR_HEAD_E = 1,				! Overhead at the end
;   0972  1	    PKT_OVR_HEAD = 3,				! Overhead added to data length
;   0973  1	    PKT_TOT_OVR_HEAD = 6;			! Total overhead of the message
;   0974  1	
;   0975  1	%SBTTL 'KERMIT Protocol Definitions -- Message dependent field'
;   0976  1	
;   0977  1	!++
;   0978  1	! The MESSAGE-DEPENDENT information field of the message contains at
;   0979  1	! least one part.  That is the type of message.  The remainder of the message
;   0980  1	! MESSAGE-DEPENDENT field is different depending on the message.
;   0981  1	!
;   0982  1	! <TYPE><TYPE-DEPENDENT-INFORMATION>
;   0983  1	!
;   0984  1	! <TYPE>
;   0985  1	!	The type defines the type of message that is being processed.
;   0986  1	!
;   0987  1	!--
;   0988  1	
;   0989  1	! Protocol version 1.0 message types
;   0990  1	
;   0991  1	LITERAL
;   0992  1	    MSG_DATA = %C'D',				! Data packet
;   0993  1	    MSG_ACK = %C'Y',				! Acknowledgement
;   0994  1	    MSG_NAK = %C'N',				! Negative acknowledgement
;   0995  1	    MSG_SND_INIT = %C'S',			! Send initiate
;   0996  1	    MSG_BREAK = %C'B',				! Break transmission
;   0997  1	    MSG_FILE = %C'F',				! File header
;   0998  1	    MSG_EOF = %C'Z',				! End of file (EOF)
;   0999  1	    MSG_ERROR = %C'E';				! Error
;   1000  1	
;   1001  1	! Protocol version 2.0 message types
;   1002  1	
;   1003  1	LITERAL
;   1004  1	    MSG_RCV_INIT = %C'R',			! Receive initiate
;   1005  1	    MSG_COMMAND = %C'C',			! Host command
;   1006  1	    MSG_GENERIC = %C'G',			! Generic KERMIT command.
;   1007  1	    MSG_KERMIT = %C'K';				! Perform KERMIT command (text)
;   1008  1	
;   1009  1	! Protocol version 4.0 message types
;   1010  1	
;   1011  1	LITERAL
;   1012  1	    MSG_SER_INIT = %C'I',			! Server initialization
;   1013  1	    MSG_TEXT = %C'X';				! Text header message
;   1014  1	
;   1015  1	!++
;   1016  1	! Generic KERMIT commands
;   1017  1	!--
;   1018  1	
;   1019  1	LITERAL
;   1020  1	    MSG_GEN_LOGIN = %C'I',			! Login
;   1021  1	    MSG_GEN_EXIT = %C'F',			! Finish (exit to OS)
;   1022  1	    MSG_GEN_CONNECT = %C'C',			! Connect to a directory
;   1023  1	    MSG_GEN_LOGOUT = %C'L',			! Logout
;   1024  1	    MSG_GEN_DIRECTORY = %C'D',			! Directory
;   1025  1	    MSG_GEN_DISK_USAGE = %C'U',			! Disk usage
;   1026  1	    MSG_GEN_DELETE = %C'E',			! Delete a file
;   1027  1	    MSG_GEN_TYPE = %C'T',			! Type a file specification
;   1028  1	!    MSG_GEN_SUBMIT = %C'S',			! Submit
;   1029  1	!    MSG_GEN_PRINT = %C'P',			! Print
;   1030  1	    MSG_GEN_WHO = %C'W',			! Who's logged in
;   1031  1	    MSG_GEN_SEND = %C'M',			! Send a message to a user
;   1032  1	    MSG_GEN_HELP = %C'H',			! Help
;   1033  1	    MSG_GEN_QUERY = %C'Q',			! Query status
;   1034  1	    MSG_GEN_RENAME = %C'R',			! Rename file
;   1035  1	    MSG_GEN_COPY = %C'K',			! Copy file
;   1036  1	    MSG_GEN_PROGRAM = %C'P',			! Run program and pass data
;   1037  1	    MSG_GEN_JOURNAL = %C'J',			! Perform journal functions
;   1038  1	    MSG_GEN_VARIABLE = %C'V';			! Return/set variable state
;   1039  1	
;   1040  1	!
;   1041  1	! Acknowledgement modifiers (protocol 4.0)
;   1042  1	!
;   1043  1	
;   1044  1	LITERAL
;   1045  1	    MSG_ACK_ABT_CUR = %C'X',			! Abort current file
;   1046  1	    MSG_ACK_ABT_ALL = %C'Z';			! Abort entire stream of files
;   1047  1	
;   1048  1	!
;   1049  1	! End of file packet modifier
;   1050  1	!
;   1051  1	
;   1052  1	LITERAL
;   1053  1	    MSG_EOF_DISCARD = %C'D';			! Discard data from previous file
;   1054  1	
;   1055  1	%SBTTL 'KERMIT Protocol Definitions -- SEND initiate packet'
;   1056  1	
;   1057  1	!++
;   1058  1	!
;   1059  1	! The following describes the send initiate packet.  All fields in the message
;   1060  1	! data area are optional.
;   1061  1	!
;   1062  1	! <"S"><CHAR(Bufsiz)><CHAR(Timeout)><CHAR(npad)><CTL(pad)><CHAR(Eol)><Quote>
;   1063  1	!	<8-bit-quote><Check-type><Repeat-count-processing><Reserved><Reserved>
;   1064  1	!
;   1065  1	! BUFSIZ
;   1066  1	!	Sending Kermit's maximum buffer size.
;   1067  1	!
;   1068  1	! Timeout
;   1069  1	!	Number of seconds after which the sending Kermit wishes to be timed out
;   1070  1	!
;   1071  1	! Npad
;   1072  1	!	Number of padding caracters the sending Kermit needs preceding each
;   1073  1	!	packet.
;   1074  1	!
;   1075  1	! PAD
;   1076  1	!	Padding character.
;   1077  1	!
;   1078  1	! EOL
;   1079  1	!	A line terminator required on all packets set by the receiving
;   1080  1	!	Kermit.
;   1081  1	!
;   1082  1	! Quote
;   1083  1	!	The printable ASCII characer the sending Kermit will use when quoting
;   1084  1	!	the control cahracters.  Default is "#".
;   1085  1	!
;   1086  1	! 8-bit-quote
;   1087  1	!	Specify quoting mecanism for 8-bit quantities.  A quoting mecanism is
;   1088  1	!	mecessary when sending to hosts which prevent the use of the 8th bit
;   1089  1	!	for data.  When elected, the quoting mechanism will be used by both
;   1090  1	!	hosts, and the quote character must be in the range of 41-76 or 140-176
;   1091  1	!	octal, but different from the control-quoting character.  This field is
;   1092  1	!	interpreted as follows:
;   1093  1	!
;   1094  1	!	"Y" - I agree to 8-bit quoting if you request it.
;   1095  1	!	"N" - I will not do 8-bit quoting.
;   1096  1	!	"&" - (or any other character in the range of 41-76 or 140-176) I want
;   1097  1	!	      to do 8-bit quoting using this character (it will be done if the
;   1098  1	!	      other Kermit puts a "Y" in this field.
;   1099  1	!	Anything else: Quoting will not be done.
;   1100  1	!
;   1101  1	! Check-type
;   1102  1	!	Type of block check.  The only values presently allowed in this
;   1103  1	!	field are "1", "2" or "3".  Future implementations may allow other
;   1104  1	!	values.  Interpretation of the values is:
;   1105  1	!
;   1106  1	!	"1" - Single character checksum.  Default value if none specified.
;   1107  1	!	"2" - Double character checksum.
;   1108  1	!	"3" - Three character CRC.
;   1109  1	!
;   1110  1	! Repeat-count-processing
;   1111  1	!	The prefix character to be used to indicate a repeated character.
;   1112  1	!	This can be any printable cahracter other than blank (which denotes
;   1113  1	!	no repeat count).
;   1114  1	!
;   1115  1	! Fields 10 to 11 reserved.
;   1116  1	!--
;   1117  1	
;   1118  1	LITERAL
;   1119  1	    P_SI_BUFSIZ = 0,				! Buffersize
;   1120  1	    MY_PKT_SIZE = 80,				! My packet size
;   1121  1	    P_SI_TIMOUT = 1,				! Time out
;   1122  1	    MY_TIME_OUT = 15,				! My time out
;   1123  1	    P_SI_NPAD = 2,				! Number of padding characters
;   1124  1	    MY_NPAD = 0,				! Amount of padding I require
;   1125  1	    P_SI_PAD = 3,				! Padding character
;   1126  1	    MY_PAD_CHAR = 0,				! My pad character
;   1127  1	    P_SI_EOL = 4,				! End of line character
;   1128  1	    MY_EOL_CHAR = %O'015',			! My EOL cahracter
;   1129  1	    P_SI_QUOTE = 5,				! Quote character
;   1130  1	    MY_QUOTE_CHAR = %C'#',			! My quoting character
;   1131  1	    P_SI_8QUOTE = 6,				! 8-bit quote
;   1132  1	    MY_8BIT_QUOTE = %C'&',			! Don't do it
;   1133  1	    P_SI_CHKTYPE = 7,				! Checktype used
;   1134  1	    MY_CHKTYPE = CHK_1CHAR,			! Use single character checksum
;   1135  1	    P_SI_REPEAT = 8,				! Repeat character
;   1136  1	    MY_REPEAT = %C'~',				! My repeat character
;   1137  1	    P_SI_LENGTH = 9;				! Length of the message
;   1138  1	
;   1139  1	%SBTTL 'KERMIT Protocol States'
;   1140  1	
;   1141  1	!++
;   1142  1	! The following are the various states that KERMIT can be in.
;   1143  1	! The state transitions are defined in the KERMIT Protocol manual.
;   1144  1	!--
;   1145  1	
;   1146  1	LITERAL
;   1147  1	    STATE_MIN = 1,				! Min state number
;   1148  1	    STATE_S = 1,				! Send init state
;   1149  1	    STATE_SF = 2,				! Send file header
;   1150  1	    STATE_SD = 3,				! Send file data packet
;   1151  1	    STATE_SZ = 4,				! Send EOF packet
;   1152  1	    STATE_SB = 5,				! Send break
;   1153  1	    STATE_R = 6,				! Receive state (wait for send-init)
;   1154  1	    STATE_RF = 7,				! Receive file header packet
;   1155  1	    STATE_RD = 8,				! Receive file data packet
;   1156  1	    STATE_C = 9,				! Send complete
;   1157  1	    STATE_A = 10,				! Abort
;   1158  1	    STATE_SX = 11,				! Send text header
;   1159  1	    STATE_SG = 12,				! Send generic command
;   1160  1	    STATE_SI = 13,				! Send server init
;   1161  1	    STATE_ID = 14,				! Server idle loop
;   1162  1	    STATE_II = 15,				! Server idle after server init
;   1163  1	    STATE_FI = 16,				! Server should exit
;   1164  1	    STATE_LG = 17,				! Server should logout
;   1165  1	    STATE_OF = 18,				! Send - open first input file
;   1166  1	    STATE_EX = 19,				! Exit back to command parser
;   1167  1	    STATE_ER = 20,				! Retries exceeded error
;   1168  1	    STATE_MAX = 20;				! Max state number
;   1169  1	
;   1170  1	%SBTTL 'Internal constants'
;   1171  1	
;   1172  1	!++
;   1173  1	! The following represent various internal KERMSG constants.
;   1174  1	!--
;   1175  1	
;   1176  1	LITERAL
;   1177  1	    MAX_PKT_RETRIES = 16,			! Maximum packet retries
;   1178  1	    MAX_SI_RETRIES = 5;				! Maximum send init retries
;   1179  1	
;   1180  1	%SBTTL 'Storage - External'
;   1181  1	!
;   1182  1	! OWN STORAGE:
;   1183  1	!
;   1184  1	
;   1185  1	EXTERNAL
;   1186  1	!
;   1187  1	! Receive parameters
;   1188  1	!
;   1189  1	    RCV_PKT_SIZE,				! Receive packet size
;   1190  1	    RCV_NPAD,					! Padding length
;   1191  1	    RCV_PADCHAR,				! Padding character
;   1192  1	    RCV_TIMEOUT,				! Time out
;   1193  1	    RCV_EOL,					! EOL character
;   1194  1	    RCV_QUOTE_CHR,				! Quote character
;   1195  1	    RCV_SOH,					! Start of header character
;   1196  1	    RCV_8QUOTE_CHR,				! 8-bit quoting character
;   1197  1	!
;   1198  1	! Miscellaneous parameters
;   1199  1	!
;   1200  1	    SET_REPT_CHR,				! Repeat character
;   1201  1	!
;   1202  1	! Send parameters
;   1203  1	!
;   1204  1	    SND_PKT_SIZE,				! Send packet size
;   1205  1	    SND_NPAD,					! Padding length
;   1206  1	    SND_PADCHAR,				! Padding character
;   1207  1	    SND_TIMEOUT,				! Time out
;   1208  1	    SND_EOL,					! EOL character
;   1209  1	    SND_QUOTE_CHR,				! Quote character
;   1210  1	    SND_SOH,					! Start of header character
;   1211  1	    SEND_TIMEOUT,				! Time to wait for receiving message
;   1212  1	!
;   1213  1	! Server parameters
;   1214  1	!
;   1215  1	    SRV_TIMEOUT,				! Time between NAK's when server is idle
;   1216  1	!
;   1217  1	! Statistics
;   1218  1	!
;   1219  1	    SND_TOTAL_CHARS,				! Total characters sent
;   1220  1	    RCV_TOTAL_CHARS,				! Total characters received
;   1221  1	    SND_DATA_CHARS,				! Total number of data characters sent
;   1222  1	    RCV_DATA_CHARS,				! Total number of data characters received
;   1223  1	    SND_NAKS,					! Total NAKs sent
;   1224  1	    RCV_NAKS,					! Total NAKs received
;   1225  1	    SND_COUNT,					! Count of total number of packets
;   1226  1	    RCV_COUNT,					! Count of total number packets received
;   1227  1	    SMSG_COUNT,					! Total number of packets sent
;   1228  1	    RMSG_COUNT,					! Total number of packets received
;   1229  1	    SMSG_TOTAL_CHARS,				! Total chars sent this file xfer
;   1230  1	    RMSG_TOTAL_CHARS,				! Total chars rcvd this file xfer
;   1231  1	    SMSG_DATA_CHARS,				! Total data chars this file xfer
;   1232  1	    RMSG_DATA_CHARS,				! Total data chars this file xfer
;   1233  1	    SMSG_NAKS,					! Total number of NAKs this file xfer
;   1234  1	    RMSG_NAKS,					! Total number of NAKs received
;   1235  1	    XFR_TIME,					! Amount of time last xfr took
;   1236  1	    TOTAL_TIME,					! Total time of all xfrs
;   1237  1	    						!  this file xfer
;   1238  1	    LAST_ERROR : VECTOR [CH$ALLOCATION (MAX_MSG + 1)],	! Last error message
;   1239  1	!
;   1240  1	! Misc constants.
;   1241  1	!
;   1242  1	    FILE_NAME : VECTOR [CH$ALLOCATION (MAX_FILE_NAME)],
;   1243  1	    FILE_SIZE,
;   1244  1	    SI_RETRIES,					! Send init retries to attempt
;   1245  1	    PKT_RETRIES,				! Number of retries to try for a message
;   1246  1	    DELAY,					! Amount of time to delay
;   1247  1	    DUPLEX,					! Type of connection (half or full)
;   1248  1	    PARITY_TYPE,				! Type of parity to use
;   1249  1	    DEV_PARITY_FLAG,				! True if output device does
;   1250  1	    						!  parity, false if we do it
;   1251  1	    CHKTYPE,					! Type of block check desired
;   1252  1	    ABT_FLAG,					! True if aborted file should be discarded
;   1253  1	    DEBUG_FLAG,					! Debugging mode on/off
;   1254  1	    WARN_FLAG,					! File warning flag
;   1255  1	![044]    IBM_FLAG,					! Talking to an IBM system
;   1256  1	    IBM_CHAR,					! Turnaround character for IBM mode
;   1257  1	    ECHO_FLAG,					! Local echo flag
;   1258  1	    CONNECT_FLAG,				! Connected flag; True if
;   1259  1	    						!  terminal and SET LINE are
;   1260  1	    						!  the same
;   1261  1	    ABT_CUR_FILE,				! Abort current file
;   1262  1	    ABT_ALL_FILE,				! Abort all files in stream
;   1263  1	    TYP_STS_FLAG,				! Type status next message
;   1264  1	    TY_FIL,					! Type file specs
;   1265  1	    TY_PKT,					! Type packet info
;   1266  1	    FIL_NORMAL_FORM,				! If true, file names should be normalized
;   1267  1	    GEN_1DATA : VECTOR [CH$ALLOCATION (MAX_MSG)],	! Data for generic command
;   1268  1	    GEN_1SIZE,					! Size of data in GEN_1DATA
;   1269  1	    GEN_2DATA : VECTOR [CH$ALLOCATION (MAX_MSG)],	! Second argument for generic command
;   1270  1	    GEN_2SIZE,					! Size of data in GEN_2DATA
;   1271  1	    GEN_3DATA : VECTOR [CH$ALLOCATION (MAX_MSG)],	! Third arg for generic command
;   1272  1	    GEN_3SIZE;					! Size of data in GEN_3DATA
;   1273  1	
;   1274  1	%SBTTL 'Storage - Local'
;   1275  1	!
;   1276  1	! LOCAL OWN STORAGE:
;   1277  1	!
;   1278  1	
;   1279  1	OWN
;   1280  1	!
;   1281  1	! Receive parameters
;   1282  1	!
;   1283  1	    RECV_8QUOTE_CHR,				! 8th-bit quoting character
;   1284  1	    REPT_CHR,					! Repeat prefix character
;   1285  1	!
;   1286  1	! Send parameters
;   1287  1	!
;   1288  1	    SEND_PKT_SIZE,				! Send packet size
;   1289  1	    SEND_NPAD,					! Padding length
;   1290  1	    SEND_PADCHAR,				! Padding character
;   1291  1	    SEND_EOL,					! EOL character
;   1292  1	    SEND_QUOTE_CHR,				! Quote character
;   1293  1	    SEND_8QUOTE_CHR,				! 8-bit quoting character
;   1294  1	!
;   1295  1	! Misc parameters
;   1296  1	!
;   1297  1	    INI_CHK_TYPE,				! Type of block checking from init message
;   1298  1	    BLK_CHK_TYPE,				! Type of block check to use
;   1299  1	    FLAG_8QUOTE,				! Flag to determine if doing 8bit quoting
;   1300  1	    FLAG_REPEAT,				! True if doing repeated character compression
;   1301  1	    STATE,					! Current state
;   1302  1	    SIZE,					! Size of the current message
;   1303  1	    OLD_RETRIES,				! Saved number of retries done.
;   1304  1	    NUM_RETRIES,				! Number of retries
;   1305  1	    MSG_NUMBER,					! Current message number
;   1306  1	    REC_SEQ,					! Sequence number of msg in REC_MSG
;   1307  1	    REC_LENGTH,					! Length of the message recv'd
;   1308  1	    REC_TYPE,					! Type of the message received.
;   1309  1	    REC_MSG : VECTOR [CH$ALLOCATION (MAX_MSG + 1, CHR_SIZE)],	! Message received
;   1310  1	    SND_MSG : VECTOR [CH$ALLOCATION (MAX_MSG + 1, CHR_SIZE)],	! Message sent
;   1311  1	    FILE_OPEN_FLAG,				! File is opened.
;   1312  1	    FILE_CHARS,					! Number of characters sent or received
;   1313  1	    TEXT_HEAD_FLAG,				! Text header received, not file header
;   1314  1	    NO_FILE_NEEDED,				! Don't open a file
;   1315  1	    INIT_PKT_SENT,				! Server-init sent and ACKed
;   1316  1	    GEN_TYPE,					! Command message type
;   1317  1	    GEN_SUBTYPE,				! Generic command subtype
;   1318  1	    GET_CHR_ROUTINE,			![025] Address of routine to get a character for BFR_FILL
;   1319  1	    PUT_CHR_ROUTINE;			![025] Address of routine to put a character for BFR_EMPTY
;   1320  1	
;   1321  1	%SBTTL 'External references'
;   1322  1	!
;   1323  1	! EXTERNAL REFERENCES:
;   1324  1	!
;   1325  1	! Packet I/O routines
;   1326  1	
;   1327  1	EXTERNAL ROUTINE
;   1328  1	    SEND,					! Send a packet to the remote
;   1329  1	    IBM_WAIT,					! Wait for IBM turnaround
;   1330  1	    RECEIVE;					! Receive a packet from the remote
;   1331  1	
;   1332  1	!
;   1333  1	! Terminal I/O routines
;   1334  1	!
;   1335  1	
;   1336  1	EXTERNAL ROUTINE
;   1337  1	    TERM_DUMP : NOVALUE,			! Normal terminal output
;   1338  1	    DBG_DUMP : NOVALUE,				! Debugging output
;   1339  1	    TT_SET_OUTPUT,				! Set output routine
;   1340  1	    TT_CHAR : NOVALUE,				! Output a single character
;   1341  1	    TT_CRLF : NOVALUE,				! Output a CRLF
;   1342  1	    TT_NUMBER : NOVALUE,			! Output a three digit number to the
;   1343  1	    						!  terminal
;   1344  1	    TT_TEXT : NOVALUE,				! Output a string to the user's
;   1345  1	    TT_OUTPUT : NOVALUE;			! Force buffered output to terminal
;   1346  1	
;   1347  1	! Operating system routines and misc routines
;   1348  1	
;   1349  1	EXTERNAL ROUTINE
;   1350  1	    CRCCLC,					! Calculate a CRC-CCITT
;   1351  1	    XFR_STATUS : NOVALUE,			! Routine to tell the user the
;   1352  1	    						!  status of a transfer
;   1353  1	    KRM_ERROR : NOVALUE,			! Issue an error message
;   1354  1	    SY_LOGOUT : NOVALUE,			! Log the job off
;   1355  1	    SY_GENERIC,					! Perform a generic command
;   1356  1	    SY_TIME,					! Return elapsed time in milliseconds
;   1357  1	    SY_DISMISS : NOVALUE;			! Routine to dismiss for n seconds.
;   1358  1	
;   1359  1	!
;   1360  1	! External file processing routines
;   1361  1	!
;   1362  1	
;   1363  1	EXTERNAL ROUTINE
;   1364  1	    FILE_OPEN,					! Open a file for reading/writing
;   1365  1	    FILE_CLOSE,					! Close an open file
;   1366  1	    NEXT_FILE,					! Determine if there is a next file
;   1367  1	    						!  and open it for reading.
;   1368  1	    GET_FILE,					! Get a byte from the file
;   1369  1	    PUT_FILE;					! Put a byte in the file.
;   1370  1	
;   1371  1	%SBTTL 'MSG_INIT'
;   1372  1	
;   1373  1	GLOBAL ROUTINE MSG_INIT : NOVALUE =
;   1374  1	
;   1375  1	!++
;   1376  1	! FUNCTIONAL DESCRIPTION:
;   1377  1	!
;   1378  1	!	This routine will initialize the message processing for
;   1379  1	!	KERMIT-32/36.
;   1380  1	!
;   1381  1	! CALLING SEQUENCE:
;   1382  1	!
;   1383  1	!	MSG_INIT();
;   1384  1	!
;   1385  1	! INPUT PARAMETERS:
;   1386  1	!
;   1387  1	!	None.
;   1388  1	!
;   1389  1	! IMPLICIT INPUTS:
;   1390  1	!
;   1391  1	!	None.
;   1392  1	!
;   1393  1	! OUTPUT PARAMETERS:
;   1394  1	!
;   1395  1	!	None.
;   1396  1	!
;   1397  1	! IMPLICIT OUTPUTS:
;   1398  1	!
;   1399  1	!	None.
;   1400  1	!
;   1401  1	! COMPLETION CODES:
;   1402  1	!
;   1403  1	!	None.
;   1404  1	!
;   1405  1	! SIDE EFFECTS:
;   1406  1	!
;   1407  1	!	None.
;   1408  1	!
;   1409  1	!--
;   1410  1	
;   1411  2	    BEGIN
;   1412  2	!
;   1413  2	! Initialize some variables
;   1414  2	!
;   1415  2	! Receive parameters first
;   1416  2	!
;   1417  2	    RCV_PKT_SIZE = MY_PKT_SIZE;
;   1418  2	    RCV_NPAD = MY_NPAD;
;   1419  2	    RCV_PADCHAR = MY_PAD_CHAR;
;   1420  2	    RCV_TIMEOUT = MY_TIME_OUT;
;   1421  2	    RCV_EOL = MY_EOL_CHAR;
;   1422  2	    RCV_QUOTE_CHR = MY_QUOTE_CHAR;
;   1423  2	    RCV_SOH = CHR_SOH;
;   1424  2	    RCV_8QUOTE_CHR = MY_8BIT_QUOTE;
;   1425  2	    SET_REPT_CHR = MY_REPEAT;
;   1426  2	!
;   1427  2	! Send parameters.
;   1428  2	!
;   1429  2	    SND_PKT_SIZE = -MY_PKT_SIZE;
;   1430  2	    SND_NPAD = -MY_NPAD;
;   1431  2	    SND_PADCHAR = -MY_PAD_CHAR;
;   1432  2	    SND_TIMEOUT = -MY_TIME_OUT;
;   1433  2	    SND_EOL = -MY_EOL_CHAR;
;   1434  2	    SND_QUOTE_CHR = -MY_QUOTE_CHAR;
;   1435  2	    SND_SOH = CHR_SOH;
;   1436  2	!
;   1437  2	! Server parameters
;   1438  2	!
;   1439  2	    SRV_TIMEOUT = 5*MY_TIME_OUT;
;   1440  2	!
;   1441  2	! Other random parameters
;   1442  2	!
;   1443  2	    PKT_RETRIES = MAX_PKT_RETRIES;		! Number of retries per message
;   1444  2	    SI_RETRIES = MAX_SI_RETRIES;		! Number of retries on send inits
;   1445  2	    DELAY = INIT_DELAY;
;   1446  2	    DUPLEX = DP_FULL;				! Use full duplex
;   1447  2	    DEBUG_FLAG = FALSE;
;   1448  2	    WARN_FLAG = FALSE;
;   1449  2	    ECHO_FLAG = FALSE;
;   1450  2	    BLK_CHK_TYPE = CHK_1CHAR;			! Start using single char checksum
;   1451  2	    CHKTYPE = MY_CHKTYPE;			! Desired block check type
;   1452  2	    INI_CHK_TYPE = .CHKTYPE;			! Same as default for now
;   1453  2	    DEV_PARITY_FLAG = FALSE;			! We generate parity
;   1454  2	    PARITY_TYPE = PR_NONE;			! No parity
;   1455  2	    ABT_FLAG = TRUE;				! Discard incomplete files
;   1456  2	    FILE_OPEN_FLAG = FALSE;
;   1457  2	!    IBM_FLAG = FALSE;				! Not talking to an IBM
;   1458  2	    IBM_CHAR = -1;				![044] No handsake by default
;   1459  2	    TY_FIL = TRUE;				! Default to typing files
;   1460  2	    TY_PKT = FALSE;				! But not packet numbers
;   1461  2	    FIL_NORMAL_FORM = FNM_NORMAL;		! Default to normal form names
;   1462  2	    GET_CHR_ROUTINE = GET_FILE;			![025] Initialize the get-a-char routine
;   1463  2	    PUT_CHR_ROUTINE = PUT_FILE;			![025] And the put-a-char
;   1464  1	    END;					! End of MSG_INIT


	.TITLE  KERMSG KERMSG - Kermit message processing
	.IDENT  \3.2.071\

	.PSECT  $OWN$,NOEXE,2

;RECV_8QUOTE_CHR
U.37:	.BLKB   4
;REPT_CHR
U.38:	.BLKB   4
;SEND_PKT_SIZE
U.39:	.BLKB   4
;SEND_NPAD
U.40:	.BLKB   4
;SEND_PADCHAR
U.41:	.BLKB   4
;SEND_EOL
U.42:	.BLKB   4
;SEND_QUOTE_CHR
U.43:	.BLKB   4
;SEND_8QUOTE_CHR
U.44:	.BLKB   4
;INI_CHK_TYPE
U.45:	.BLKB   4
;BLK_CHK_TYPE
U.46:	.BLKB   4
;FLAG_8QUOTE
U.47:	.BLKB   4
;FLAG_REPEAT
U.48:	.BLKB   4
;STATE
U.49:	.BLKB   4
;SIZE
U.50:	.BLKB   4
;OLD_RETRIES
U.51:	.BLKB   4
;NUM_RETRIES
U.52:	.BLKB   4
;MSG_NUMBER
U.53:	.BLKB   4
;REC_SEQ
U.54:	.BLKB   4
;REC_LENGTH
U.55:	.BLKB   4
;REC_TYPE
U.56:	.BLKB   4
;REC_MSG
U.57:	.BLKB   100
;SND_MSG
U.58:	.BLKB   100
;FILE_OPEN_FLAG
U.59:	.BLKB   4
;FILE_CHARS
U.60:	.BLKB   4
;TEXT_HEAD_FLAG
U.61:	.BLKB   4
;NO_FILE_NEEDED
U.62:	.BLKB   4
;INIT_PKT_SENT
U.63:	.BLKB   4
;GEN_TYPE
U.64:	.BLKB   4
;GEN_SUBTYPE
U.65:	.BLKB   4
;GET_CHR_ROUTINE
U.66:	.BLKB   4
;PUT_CHR_ROUTINE
U.67:	.BLKB   4

FNM_NORMAL==	    1
FNM_FULL==	    2
FNM_UNTRAN==	    4
PR_MIN==	    0
PR_NONE==	    0
PR_MARK==	    1
PR_EVEN==	    2
PR_ODD==	    3
PR_SPACE==	    4
PR_MAX==	    4
GC_MIN==	    1
GC_EXIT==	    1
GC_DIRECTORY==	    2
GC_DISK_USAGE==     3
GC_DELETE==	    4
GC_TYPE==	    5
GC_HELP==	    6
GC_LOGOUT==	    7
GC_LGN==	    8
GC_CONNECT==	    9
GC_RENAME==	    10
GC_COPY==	    11
GC_WHO==	    12
GC_SEND_MSG==	    13
GC_STATUS==	    14
GC_COMMAND==	    15
GC_KERMIT==	    16
GC_JOURNAL==	    17
GC_VARIABLE==	    18
GC_PROGRAM==	    19
GC_MAX==	    19
DP_FULL==	    0
DP_HALF==	    1
CHK_1CHAR==	    49
CHK_2CHAR==	    50
CHK_CRC==	    51
MAX_MSG==	    96
	.EXTRN  RCV_PKT_SIZE, RCV_NPAD, RCV_PADCHAR, RCV_TIMEOUT, RCV_EOL, RCV_QUOTE_CHR, RCV_SOH
	.EXTRN  RCV_8QUOTE_CHR, SET_REPT_CHR, SND_PKT_SIZE, SND_NPAD, SND_PADCHAR, SND_TIMEOUT, SND_EOL
	.EXTRN  SND_QUOTE_CHR, SND_SOH, SEND_TIMEOUT, SRV_TIMEOUT, SND_TOTAL_CHARS, RCV_TOTAL_CHARS
	.EXTRN  SND_DATA_CHARS, RCV_DATA_CHARS, SND_NAKS, RCV_NAKS, SND_COUNT, RCV_COUNT, SMSG_COUNT
	.EXTRN  RMSG_COUNT, SMSG_TOTAL_CHARS, RMSG_TOTAL_CHARS, SMSG_DATA_CHARS, RMSG_DATA_CHARS, SMSG_NAKS
	.EXTRN  RMSG_NAKS, XFR_TIME, TOTAL_TIME, LAST_ERROR, FILE_NAME, FILE_SIZE, SI_RETRIES, PKT_RETRIES
	.EXTRN  DELAY, DUPLEX, PARITY_TYPE, DEV_PARITY_FLAG, CHKTYPE, ABT_FLAG, DEBUG_FLAG, WARN_FLAG
	.EXTRN  IBM_CHAR, ECHO_FLAG, CONNECT_FLAG, ABT_CUR_FILE, ABT_ALL_FILE, TYP_STS_FLAG, TY_FIL
	.EXTRN  TY_PKT, FIL_NORMAL_FORM, GEN_1DATA, GEN_1SIZE, GEN_2DATA, GEN_2SIZE, GEN_3DATA, GEN_3SIZE
	.EXTRN  SEND, IBM_WAIT, RECEIVE, TERM_DUMP, DBG_DUMP, TT_SET_OUTPUT, TT_CHAR, TT_CRLF, TT_NUMBER
	.EXTRN  TT_TEXT, TT_OUTPUT, CRCCLC, XFR_STATUS, KRM_ERROR, SY_LOGOUT, SY_GENERIC, SY_TIME
	.EXTRN  SY_DISMISS, FILE_OPEN, FILE_CLOSE, NEXT_FILE, GET_FILE, PUT_FILE

	.PSECT  $CODE$,NOWRT,2

	.ENTRY  MSG_INIT, ^M<>			     ;MSG_INIT, Save nothing						      ; 1373
	MOVZBL  #80, W^RCV_PKT_SIZE		     ;#80, RCV_PKT_SIZE							      ; 1417
	CLRL    W^RCV_NPAD			     ;RCV_NPAD								      ; 1418
	CLRL    W^RCV_PADCHAR			     ;RCV_PADCHAR							      ; 1419
	MOVL    #15, W^RCV_TIMEOUT		     ;#15, RCV_TIMEOUT							      ; 1420
	MOVL    #13, W^RCV_EOL			     ;#13, RCV_EOL							      ; 1421
	MOVL    #35, W^RCV_QUOTE_CHR		     ;#35, RCV_QUOTE_CHR						      ; 1422
	MOVL    #1, W^RCV_SOH			     ;#1, RCV_SOH							      ; 1423
	MOVL    #38, W^RCV_8QUOTE_CHR		     ;#38, RCV_8QUOTE_CHR						      ; 1424
	MOVZBL  #126, W^SET_REPT_CHR		     ;#126, SET_REPT_CHR						      ; 1425
	CVTBL   #-80, W^SND_PKT_SIZE		     ;#-80, SND_PKT_SIZE						      ; 1429
	CLRL    W^SND_NPAD			     ;SND_NPAD								      ; 1430
	CLRL    W^SND_PADCHAR			     ;SND_PADCHAR							      ; 1431
	MNEGL   #15, W^SND_TIMEOUT		     ;#15, SND_TIMEOUT							      ; 1432
	MNEGL   #13, W^SND_EOL			     ;#13, SND_EOL							      ; 1433
	MNEGL   #35, W^SND_QUOTE_CHR		     ;#35, SND_QUOTE_CHR						      ; 1434
	MOVL    #1, W^SND_SOH			     ;#1, SND_SOH							      ; 1435
	MOVZBL  #75, W^SRV_TIMEOUT		     ;#75, SRV_TIMEOUT							      ; 1439
	MOVL    #16, W^PKT_RETRIES		     ;#16, PKT_RETRIES							      ; 1443
	MOVL    #5, W^SI_RETRIES		     ;#5, SI_RETRIES							      ; 1444
	MOVL    #5, W^DELAY			     ;#5, DELAY								      ; 1445
	CLRL    W^DUPLEX			     ;DUPLEX								      ; 1446
	CLRL    W^DEBUG_FLAG			     ;DEBUG_FLAG							      ; 1447
	CLRL    W^WARN_FLAG			     ;WARN_FLAG								      ; 1448
	CLRL    W^ECHO_FLAG			     ;ECHO_FLAG								      ; 1449
	MOVL    #49, W^U.46			     ;#49, U.46								      ; 1450
	MOVL    #49, W^CHKTYPE			     ;#49, CHKTYPE							      ; 1451
	MOVL    W^CHKTYPE, W^U.45		     ;CHKTYPE, U.45							      ; 1452
	CLRL    W^DEV_PARITY_FLAG		     ;DEV_PARITY_FLAG							      ; 1453
	CLRL    W^PARITY_TYPE			     ;PARITY_TYPE							      ; 1454
	MOVL    #1, W^ABT_FLAG			     ;#1, ABT_FLAG							      ; 1455
	CLRL    W^U.59				     ;U.59								      ; 1456
	MNEGL   #1, W^IBM_CHAR			     ;#1, IBM_CHAR							      ; 1458
	MOVL    #1, W^TY_FIL			     ;#1, TY_FIL							      ; 1459
	CLRL    W^TY_PKT			     ;TY_PKT								      ; 1460
	MOVL    #1, W^FIL_NORMAL_FORM		     ;#1, FIL_NORMAL_FORM						      ; 1461
	MOVAB   W^GET_FILE, W^U.66		     ;GET_FILE, U.66							      ; 1462
	MOVAB   W^PUT_FILE, W^U.67		     ;PUT_FILE, U.67							      ; 1463
	RET     				     ;									      ; 1464

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


;   1465  1	
;   1466  1	%SBTTL 'SND_ERROR'
;   1467  1	
;   1468  1	GLOBAL ROUTINE SND_ERROR (COUNT, ADDRESS) : NOVALUE =
;   1469  1	
;   1470  1	!++
;   1471  1	! FUNCTIONAL DESCRIPTION:
;   1472  1	!
;   1473  1	!	This routine will send an error packet to the remote KERMIT.  It
;   1474  1	!	is called with the count of characters and the address of the text.
;   1475  1	!
;   1476  1	! CALLING SEQUENCE:
;   1477  1	!
;   1478  1	!	SND_ERROR(COUNT, %ASCII 'Error text');
;   1479  1	!
;   1480  1	! INPUT PARAMETERS:
;   1481  1	!
;   1482  1	!	None.
;   1483  1	!
;   1484  1	! IMPLICIT INPUTS:
;   1485  1	!
;   1486  1	!	None.
;   1487  1	!
;   1488  1	! OUTPUT PARAMETERS:
;   1489  1	!
;   1490  1	!	None.
;   1491  1	!
;   1492  1	! IMPLICIT OUTPUTS:
;   1493  1	!
;   1494  1	!	None.
;   1495  1	!
;   1496  1	! COMPLETION CODES:
;   1497  1	!
;   1498  1	!	None.
;   1499  1	!
;   1500  1	! SIDE EFFECTS:
;   1501  1	!
;   1502  1	!
;   1503  1	!--
;   1504  1	
;   1505  2	    BEGIN
;   1506  2	!
;   1507  2	! Pack the message into the buffer
;   1508  2	!
;   1509  2	    SET_STRING (CH$PTR (.ADDRESS), .COUNT, TRUE);
;   1510  2	    BFR_FILL (TRUE);
;   1511  2	    SET_STRING (0, 0, FALSE);
;   1512  2	!
;   1513  2	! Save the last error message also
;   1514  2	!
;   1515  2	
;   1516  2	    IF .COUNT GTR MAX_MSG THEN COUNT = MAX_MSG;
;   1517  2	
;   1518  2	    CH$COPY (.COUNT, CH$PTR (.ADDRESS), 0, MAX_MSG + 1, CH$PTR (LAST_ERROR));
;   1519  2	
;   1520  2	    IF NOT SEND_PACKET (MSG_ERROR, .SIZE, .MSG_NUMBER) THEN RETURN KER_ABORTED;
;   1521  2	
;   1522  1	    END;					! End of SND_ERROR





	.ENTRY  SND_ERROR, ^M<R2,R3,R4,R5>	     ;SND_ERROR, Save R2,R3,R4,R5					      ; 1468
	PUSHL   #1				     ;#1								      ; 1509
	PUSHL   4(AP)				     ;COUNT								      ;
	PUSHL   8(AP)				     ;ADDRESS								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	PUSHL   #1				     ;#1								      ; 1510
	CALLS   #1, W^U.29			     ;#1, U.29								      ;
	CLRQ    -(SP)				     ;-(SP)								      ; 1511
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	CMPL    4(AP), #96			     ;COUNT, #96							      ; 1516
	BLEQ    1$				     ;1$								      ;
	MOVZBL  #96, 4(AP)			     ;#96, COUNT							      ;
1$:	MOVC5   4(AP), @8(AP), #0, #97, W^LAST_ERROR ;COUNT, @ADDRESS, #0, #97, LAST_ERROR				      ; 1518
	PUSHL   W^U.53				     ;U.53								      ; 1520
	PUSHL   W^U.50				     ;U.50								      ;
	MOVZBL  #69, -(SP)			     ;#69, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	RET     				     ;									      ; 1522

; Routine Size:  76 bytes,    Routine Base:  $CODE$ + 00BA


;   1523  1	
;   1524  1	%SBTTL 'SERVER - Server mode'
;   1525  1	
;   1526  1	GLOBAL ROUTINE SERVER =
;   1527  1	
;   1528  1	!++
;   1529  1	! FUNCTIONAL DESCRIPTION:
;   1530  1	!
;   1531  1	!	This routine will handle the server function in the v2.0 protocol
;   1532  1	!	for KERMIT.  This routine by it's nature will call various operating
;   1533  1	!	system routines to do things like logging off the system.
;   1534  1	!
;   1535  1	! CALLING SEQUENCE:
;   1536  1	!
;   1537  1	!	EXIT_FLAG = SERVER();
;   1538  1	!
;   1539  1	! INPUT PARAMETERS:
;   1540  1	!
;   1541  1	!	None.
;   1542  1	!
;   1543  1	! IMPLICIT INPUTS:
;   1544  1	!
;   1545  1	!	None.
;   1546  1	!
;   1547  1	! OUTPUT PARAMETERS:
;   1548  1	!
;   1549  1	!	None.
;   1550  1	!
;   1551  1	! IMPLICIT OUTPUTS:
;   1552  1	!
;   1553  1	!	None.
;   1554  1	!
;   1555  1	! COMPLETION CODES:
;   1556  1	!
;   1557  1	!	None.
;   1558  1	!
;   1559  1	! SIDE EFFECTS:
;   1560  1	!
;   1561  1	!	None.
;   1562  1	!
;   1563  1	!--
;   1564  1	
;   1565  2	    BEGIN
;   1566  2	
;   1567  2	    LOCAL
;   1568  2		STATUS;					! Status returned by various routines
;   1569  2	
;   1570  2	    DO
;   1571  3		BEGIN
;   1572  3		INIT_XFR ();
;   1573  3		XFR_STATUS (%C'T', %C'I');		! Now idle
;   1574  3		STATUS = DO_TRANSACTION (STATE_ID);
;   1575  3		END
;   1576  2	    UNTIL .STATUS EQL KER_EXIT OR .STATUS EQL KER_ABORTED;
;   1577  2	
;   1578  2	    RETURN .STATUS;
;   1579  1	    END;					! End of GLOBAL ROUTINE SERVER





	.ENTRY  SERVER, ^M<R2>			     ;SERVER, Save R2							      ; 1526
1$:	CALLS   #0, W^U.32			     ;#0, U.32								      ; 1572
	MOVZBL  #73, -(SP)			     ;#73, -(SP)							      ; 1573
	MOVZBL  #84, -(SP)			     ;#84, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	PUSHL   #14				     ;#14								      ; 1574
	CALLS   #1, W^U.1			     ;#1, U.1								      ;
	MOVL    R0, R2				     ;R0, STATUS							      ;
	CMPL    R2, #134316203			     ;STATUS, #134316203						      ; 1576
	BEQL    2$				     ;2$								      ;
	CMPL    R2, #134316258			     ;STATUS, #134316258						      ;
	BNEQ    1$				     ;1$								      ;
2$:	MOVL    R2, R0				     ;STATUS, R0							      ; 1578
	RET     				     ;									      ; 1579

; Routine Size:  52 bytes,    Routine Base:  $CODE$ + 0106


;   1580  1	
;   1581  1	%SBTTL 'SEND_SWITCH'
;   1582  1	
;   1583  1	GLOBAL ROUTINE SEND_SWITCH =
;   1584  1	
;   1585  1	!++
;   1586  1	! FUNCTIONAL DESCRIPTION:
;   1587  1	!
;   1588  1	!	This routine is the state table switcher for sending files.  It
;   1589  1	!	loops until either it is finished or an error is encountered.  The
;   1590  1	!	routines called by SEND_SWITCH are responsible for changing the state.
;   1591  1	!
;   1592  1	! CALLING SEQUENCE:
;   1593  1	!
;   1594  1	!	SEND_SWITCH();
;   1595  1	!
;   1596  1	! INPUT PARAMETERS:
;   1597  1	!
;   1598  1	!	None.
;   1599  1	!
;   1600  1	! IMPLICIT INPUTS:
;   1601  1	!
;   1602  1	!	None.
;   1603  1	!
;   1604  1	! OUTPUT PARAMETERS:
;   1605  1	!
;   1606  1	!	Returns:
;   1607  1	!	    TRUE - File sent correctly.
;   1608  1	!	    FALSE - Aborted sending the file.
;   1609  1	!
;   1610  1	! IMPLICIT OUTPUTS:
;   1611  1	!
;   1612  1	!	None.
;   1613  1	!
;   1614  1	! COMPLETION CODES:
;   1615  1	!
;   1616  1	!	None.
;   1617  1	!
;   1618  1	! SIDE EFFECTS:
;   1619  1	!
;   1620  1	!	None.
;   1621  1	!
;   1622  1	!--
;   1623  1	
;   1624  2	    BEGIN
;   1625  2	
;   1626  2	    LOCAL
;   1627  2		STATUS;					! Status result
;   1628  2	
;   1629  2	    IF .CONNECT_FLAG THEN SY_DISMISS (.DELAY);	! Sleep if the user wanted us to
;   1630  2	
;   1631  2	    INIT_XFR ();				! Initialize for this transfer
;   1632  2	    TEXT_HEAD_FLAG = FALSE;			! Set text flag correctly
;   1633  2	    XFR_STATUS (%C'I', %C'S');			! Start of file send
;   1634  2	    STATUS = DO_TRANSACTION (STATE_S);		! Call routine to do real work
;   1635  2	    XFR_STATUS (%C'T', %C'S');			! Done with send
;   1636  2	    RETURN .STATUS;				! Return the result
;   1637  1	    END;





	.ENTRY  SEND_SWITCH, ^M<R2>		     ;SEND_SWITCH, Save R2						      ; 1583
	BLBC    W^CONNECT_FLAG, 1$		     ;CONNECT_FLAG, 1$							      ; 1629
	PUSHL   W^DELAY				     ;DELAY								      ;
	CALLS   #1, W^SY_DISMISS		     ;#1, SY_DISMISS							      ;
1$:	CALLS   #0, W^U.32			     ;#0, U.32								      ; 1631
	CLRL    W^U.61				     ;U.61								      ; 1632
	MOVZBL  #83, -(SP)			     ;#83, -(SP)							      ; 1633
	MOVZBL  #73, -(SP)			     ;#73, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	PUSHL   #1				     ;#1								      ; 1634
	CALLS   #1, W^U.1			     ;#1, U.1								      ;
	MOVL    R0, R2				     ;R0, STATUS							      ;
	MOVZBL  #83, -(SP)			     ;#83, -(SP)							      ; 1635
	MOVZBL  #84, -(SP)			     ;#84, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	MOVL    R2, R0				     ;STATUS, R0							      ; 1636
	RET     				     ;									      ; 1637

; Routine Size:  65 bytes,    Routine Base:  $CODE$ + 013A


;   1638  1	
;   1639  1	%SBTTL 'REC_SWITCH'
;   1640  1	
;   1641  1	GLOBAL ROUTINE REC_SWITCH =
;   1642  1	
;   1643  1	!++
;   1644  1	! FUNCTIONAL DESCRIPTION:
;   1645  1	!
;   1646  1	!	This routine will cause file(s) to be received by the remote
;   1647  1	!	KERMIT.  This routine contains the main loop for the sending of the
;   1648  1	!	data.
;   1649  1	!
;   1650  1	! CALLING SEQUENCE:
;   1651  1	!
;   1652  1	!	REC_SWITCH();
;   1653  1	!
;   1654  1	! INPUT PARAMETERS:
;   1655  1	!
;   1656  1	!	None.
;   1657  1	!
;   1658  1	! IMPLICIT INPUTS:
;   1659  1	!
;   1660  1	!	FILE_DESC - Descriptor describing the file to be received by
;   1661  1	!		the remote KERMIT.
;   1662  1	!
;   1663  1	! OUTPUT PARAMETERS:
;   1664  1	!
;   1665  1	!	None.
;   1666  1	!
;   1667  1	! IMPLICIT OUTPUTS:
;   1668  1	!
;   1669  1	!	None.
;   1670  1	!
;   1671  1	! COMPLETION CODES:
;   1672  1	!
;   1673  1	!	True - File received correctly.
;   1674  1	!	FALSE - File transfer aborted.
;   1675  1	!
;   1676  1	! SIDE EFFECTS:
;   1677  1	!
;   1678  1	!	None.
;   1679  1	!
;   1680  1	!--
;   1681  1	
;   1682  2	    BEGIN
;   1683  2	
;   1684  2	    LOCAL
;   1685  2		INIT_STATE,				! State to start up DO_TRANSACTION in
;   1686  2		STATUS;					! Status returned by various routines
;   1687  2	
;   1688  2	    INIT_STATE = STATE_R;			! Initialize the state
;   1689  2	    MSG_NUMBER = 0;
;   1690  2	    INIT_XFR ();				! Initialize the per transfer info
;   1691  2	!
;   1692  2	! Determine if they said REC <file-spec>
;   1693  2	!	Send MSG_RCV_INIT and then receive the file
;   1694  2	!
;   1695  2	
;   1696  2	    IF .FILE_SIZE GTR 0
;   1697  2	    THEN
;   1698  3		BEGIN
;   1699  3		GEN_TYPE = MSG_RCV_INIT;		! Use receive-init message
;   1700  3		CH$MOVE (.FILE_SIZE, CH$PTR (FILE_NAME), CH$PTR (GEN_1DATA));
;   1701  3		GEN_1SIZE = .FILE_SIZE;			! Save the length
;   1702  3		INIT_STATE = STATE_SI;			! Start out with server init
;   1703  2		END;
;   1704  2	
;   1705  2	!
;   1706  2	! Now receive the file normally
;   1707  2	!
;   1708  2	    XFR_STATUS (%C'I', %C'R');			! Start of a file receive
;   1709  2	    STATUS = DO_TRANSACTION (.INIT_STATE);
;   1710  2	    XFR_STATUS (%C'T', %C'R');			! End of file receive
;   1711  2	    RETURN .STATUS;				! Return the result
;   1712  1	    END;					! End of REC_SWITCH





	.ENTRY  REC_SWITCH, ^M<R2,R3,R4,R5,R6,R7>    ;REC_SWITCH, Save R2,R3,R4,R5,R6,R7				      ; 1641
	MOVL    #6, R7				     ;#6, INIT_STATE							      ; 1688
	CLRL    W^U.53				     ;U.53								      ; 1689
	CALLS   #0, W^U.32			     ;#0, U.32								      ; 1690
	MOVL    W^FILE_SIZE, R6			     ;FILE_SIZE, R6							      ; 1696
	BLEQ    1$				     ;1$								      ;
	MOVZBL  #82, W^U.64			     ;#82, U.64								      ; 1699
	MOVC3   R6, W^FILE_NAME, W^GEN_1DATA	     ;R6, FILE_NAME, GEN_1DATA						      ; 1700
	MOVL    R6, W^GEN_1SIZE			     ;R6, GEN_1SIZE							      ; 1701
	MOVL    #13, R7				     ;#13, INIT_STATE							      ; 1702
1$:	MOVZBL  #82, -(SP)			     ;#82, -(SP)							      ; 1708
	MOVZBL  #73, -(SP)			     ;#73, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	PUSHL   R7				     ;INIT_STATE							      ; 1709
	CALLS   #1, W^U.1			     ;#1, U.1								      ;
	MOVL    R0, R2				     ;R0, STATUS							      ;
	MOVZBL  #82, -(SP)			     ;#82, -(SP)							      ; 1710
	MOVZBL  #84, -(SP)			     ;#84, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	MOVL    R2, R0				     ;STATUS, R0							      ; 1711
	RET     				     ;									      ; 1712

; Routine Size:  83 bytes,    Routine Base:  $CODE$ + 017B


;   1713  1	
;   1714  1	%SBTTL 'Server -- DO_GENERIC - Execute a generic command'
;   1715  1	
;   1716  1	GLOBAL ROUTINE DO_GENERIC (TYPE) =
;   1717  1	
;   1718  1	!++
;   1719  1	! FUNCTIONAL DESCRIPTION:
;   1720  1	!
;   1721  1	!	This routine will send a generic command to the remote Kermit.
;   1722  1	!	it will do all the processing required for the generic command
;   1723  1	!	that was executed.  It will return to the caller after the
;   1724  1	!	command has be executed.
;   1725  1	!
;   1726  1	! CALLING SEQUENCE:
;   1727  1	!
;   1728  1	!	STATUS = DO_GENERIC (Command-type);
;   1729  1	!
;   1730  1	! INPUT PARAMETERS:
;   1731  1	!
;   1732  1	!	Command-type -- Command type to be executed.
;   1733  1	!
;   1734  1	! IMPLICIT INPUTS:
;   1735  1	!
;   1736  1	!	None.
;   1737  1	!
;   1738  1	! OUTPUT PARAMETERS:
;   1739  1	!
;   1740  1	!	None.
;   1741  1	!
;   1742  1	! IMPLICIT OUTPUTS:
;   1743  1	!
;   1744  1	!	None.
;   1745  1	!
;   1746  1	! COMPLETION CODES:
;   1747  1	!
;   1748  1	!	None.
;   1749  1	!
;   1750  1	! SIDE EFFECTS:
;   1751  1	!
;   1752  1	!	None.
;   1753  1	!
;   1754  1	!--
;   1755  1	
;   1756  2	    BEGIN
;   1757  2	
;   1758  2	    LOCAL
;   1759  2		INIT_STATE;				! Initial state for FSM
;   1760  2	
;   1761  2	!
;   1762  2	! Set up the per transfer items
;   1763  2	!
;   1764  2	    INIT_XFR ();
;   1765  2	    NUM_RETRIES = 0;
;   1766  2	    MSG_NUMBER = 0;
;   1767  2	!
;   1768  2	! These are all generic commands
;   1769  2	!
;   1770  2	    GEN_TYPE = MSG_GENERIC;
;   1771  2	!
;   1772  2	! Assume we will not need server init
;   1773  2	!
;   1774  2	    INIT_STATE = STATE_SG;
;   1775  2	
;   1776  2	    CASE .TYPE FROM GC_MIN TO GC_MAX OF
;   1777  2		SET
;   1778  2	
;   1779  2		[GC_EXIT] :
;   1780  2		    GEN_SUBTYPE = MSG_GEN_EXIT;
;   1781  2	
;   1782  2		[GC_LOGOUT] :
;   1783  2		    GEN_SUBTYPE = MSG_GEN_LOGOUT;
;   1784  2	
;   1785  2		[GC_DIRECTORY] :
;   1786  3		    BEGIN
;   1787  3		    INIT_STATE = STATE_SI;		! We will need server-init
;   1788  3		    GEN_SUBTYPE = MSG_GEN_DIRECTORY;
;   1789  2		    END;
;   1790  2	
;   1791  2		[GC_DISK_USAGE] :
;   1792  3		    BEGIN
;   1793  3		    INIT_STATE = STATE_SI;		! We will need server-init
;   1794  3		    GEN_SUBTYPE = MSG_GEN_DISK_USAGE;
;   1795  2		    END;
;   1796  2	
;   1797  2		[GC_DELETE] :
;   1798  2		    GEN_SUBTYPE = MSG_GEN_DELETE;
;   1799  2	
;   1800  2		[GC_TYPE] :
;   1801  3		    BEGIN
;   1802  3		    INIT_STATE = STATE_SI;		! We will need server-init
;   1803  3		    GEN_SUBTYPE = MSG_GEN_TYPE;
;   1804  2		    END;
;   1805  2	
;   1806  2		[GC_HELP] :
;   1807  3		    BEGIN
;   1808  3		    INIT_STATE = STATE_SI;		! We will need server-init
;   1809  3		    GEN_SUBTYPE = MSG_GEN_HELP;
;   1810  2		    END;
;   1811  2	
;   1812  2		[GC_LGN] :
;   1813  2		    GEN_SUBTYPE = MSG_GEN_LOGIN;	! Login just gets ACK
;   1814  2	
;   1815  2		[GC_CONNECT] :
;   1816  2		    GEN_SUBTYPE = MSG_GEN_CONNECT;	! CWD just gets ACK
;   1817  2	
;   1818  2		[GC_RENAME] :
;   1819  2		    GEN_SUBTYPE = MSG_GEN_RENAME;	! Rename file just needs ACK
;   1820  2	
;   1821  2		[GC_COPY] :
;   1822  2		    GEN_SUBTYPE = MSG_GEN_COPY;		! Copy file just needs ACK
;   1823  2	
;   1824  2		[GC_WHO] :
;   1825  3		    BEGIN
;   1826  3		    INIT_STATE = STATE_SI;		! May get large response
;   1827  3		    GEN_SUBTYPE = MSG_GEN_WHO;
;   1828  2		    END;
;   1829  2	
;   1830  2		[GC_SEND_MSG] :
;   1831  2		    GEN_SUBTYPE = MSG_GEN_SEND;		! Just need an ACK
;   1832  2	
;   1833  2		[GC_STATUS] :
;   1834  3		    BEGIN
;   1835  3		    INIT_STATE = STATE_SI;		! May get large response
;   1836  3		    GEN_SUBTYPE = MSG_GEN_QUERY;
;   1837  2		    END;
;   1838  2	
;   1839  2		[GC_COMMAND] :
;   1840  3		    BEGIN
;   1841  3		    INIT_STATE = STATE_SI;		! Large response likely
;   1842  3		    GEN_TYPE = MSG_COMMAND;		! This is host command
;   1843  2		    END;
;   1844  2	
;   1845  2		[GC_KERMIT] :
;   1846  2		    GEN_TYPE = MSG_KERMIT;		! Perform Kermit command (short response)
;   1847  2	
;   1848  2		[GC_PROGRAM] :
;   1849  3		    BEGIN
;   1850  3		    INIT_STATE = STATE_SI;		! Assume large response
;   1851  3		    GEN_SUBTYPE = MSG_GEN_PROGRAM;	! Generic program command
;   1852  2		    END;
;   1853  2	
;   1854  2		[GC_JOURNAL] :
;   1855  2		    GEN_SUBTYPE = MSG_GEN_JOURNAL;	! Do journal function (short reply)
;   1856  2	
;   1857  2		[GC_VARIABLE] :
;   1858  2		    GEN_SUBTYPE = MSG_GEN_VARIABLE;	! Set or get a variable value
;   1859  2	
;   1860  2		[INRANGE, OUTRANGE] :
;   1861  3		    BEGIN
;   1862  3		    KRM_ERROR (KER_UNIMPLGEN);
;   1863  3		    RETURN STATE_A;
;   1864  2		    END;
;   1865  2		TES;
;   1866  2	
;   1867  2	    RETURN DO_TRANSACTION (.INIT_STATE);	! Go do the command
;   1868  1	    END;					! End of DO_GENERIC





	.ENTRY  DO_GENERIC, ^M<R2,R3>		     ;DO_GENERIC, Save R2,R3						      ; 1716
	MOVAB   W^U.65, R3			     ;U.65, R3								      ;
	CALLS   #0, W^U.32			     ;#0, U.32								      ; 1764
	CLRQ    -244(R3)			     ;NUM_RETRIES							      ; 1765
	MOVZBL  #71, -4(R3)			     ;#71, GEN_TYPE							      ; 1770
	MOVL    #12, R2				     ;#12, INIT_STATE							      ; 1774
	CASEL   4(AP), #1, #18			     ;TYPE, #1, #18							      ; 1776
1$:	.WORD   2$-1$,-				     ;2$-1$,-								      ;
		4$-1$,-				     ;4$-1$,-								      ;
		5$-1$,-				     ;5$-1$,-								      ;
		6$-1$,-				     ;6$-1$,-								      ;
		7$-1$,-				     ;7$-1$,-								      ;
		8$-1$,-				     ;8$-1$,-								      ;
		3$-1$,-				     ;3$-1$,-								      ;
		9$-1$,-				     ;9$-1$,-								      ;
		10$-1$,-			     ;10$-1$,-								      ;
		11$-1$,-			     ;11$-1$,-								      ;
		12$-1$,-			     ;12$-1$,-								      ;
		13$-1$,-			     ;13$-1$,-								      ;
		14$-1$,-			     ;14$-1$,-								      ;
		15$-1$,-			     ;15$-1$,-								      ;
		16$-1$,-			     ;16$-1$,-								      ;
		17$-1$,-			     ;17$-1$,-								      ;
		19$-1$,-			     ;19$-1$,-								      ;
		21$-1$,-			     ;21$-1$,-								      ;
		18$-1$				     ;18$-1$								      ;
	PUSHL   #134316210			     ;#134316210							      ; 1862
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	MOVL    #10, R0				     ;#10, R0								      ; 1863
	RET     				     ;									      ;
2$:	MOVZBL  #70, (R3)			     ;#70, GEN_SUBTYPE							      ; 1780
	BRB     20$				     ;20$								      ;
3$:	MOVZBL  #76, (R3)			     ;#76, GEN_SUBTYPE							      ; 1783
	BRB     22$				     ;22$								      ;
4$:	MOVL    #13, R2				     ;#13, INIT_STATE							      ; 1787
	MOVZBL  #68, (R3)			     ;#68, GEN_SUBTYPE							      ; 1788
	BRB     22$				     ;22$								      ; 1776
5$:	MOVL    #13, R2				     ;#13, INIT_STATE							      ; 1793
	MOVZBL  #85, (R3)			     ;#85, GEN_SUBTYPE							      ; 1794
	BRB     22$				     ;22$								      ; 1776
6$:	MOVZBL  #69, (R3)			     ;#69, GEN_SUBTYPE							      ; 1798
	BRB     22$				     ;22$								      ;
7$:	MOVL    #13, R2				     ;#13, INIT_STATE							      ; 1802
	MOVZBL  #84, (R3)			     ;#84, GEN_SUBTYPE							      ; 1803
	BRB     22$				     ;22$								      ; 1776
8$:	MOVL    #13, R2				     ;#13, INIT_STATE							      ; 1808
	MOVZBL  #72, (R3)			     ;#72, GEN_SUBTYPE							      ; 1809
	BRB     22$				     ;22$								      ; 1776
9$:	MOVZBL  #73, (R3)			     ;#73, GEN_SUBTYPE							      ; 1813
	BRB     22$				     ;22$								      ;
10$:	MOVZBL  #67, (R3)			     ;#67, GEN_SUBTYPE							      ; 1816
	BRB     22$				     ;22$								      ;
11$:	MOVZBL  #82, (R3)			     ;#82, GEN_SUBTYPE							      ; 1819
	BRB     22$				     ;22$								      ;
12$:	MOVZBL  #75, (R3)			     ;#75, GEN_SUBTYPE							      ; 1822
	BRB     22$				     ;22$								      ;
13$:	MOVL    #13, R2				     ;#13, INIT_STATE							      ; 1826
	MOVZBL  #87, (R3)			     ;#87, GEN_SUBTYPE							      ; 1827
	BRB     22$				     ;22$								      ; 1776
14$:	MOVZBL  #77, (R3)			     ;#77, GEN_SUBTYPE							      ; 1831
	BRB     22$				     ;22$								      ;
15$:	MOVL    #13, R2				     ;#13, INIT_STATE							      ; 1835
	MOVZBL  #81, (R3)			     ;#81, GEN_SUBTYPE							      ; 1836
	BRB     22$				     ;22$								      ; 1776
16$:	MOVL    #13, R2				     ;#13, INIT_STATE							      ; 1841
	MOVZBL  #67, -4(R3)			     ;#67, GEN_TYPE							      ; 1842
	BRB     22$				     ;22$								      ; 1776
17$:	MOVZBL  #75, -4(R3)			     ;#75, GEN_TYPE							      ; 1846
	BRB     22$				     ;22$								      ;
18$:	MOVL    #13, R2				     ;#13, INIT_STATE							      ; 1850
	MOVZBL  #80, (R3)			     ;#80, GEN_SUBTYPE							      ; 1851
	BRB     22$				     ;22$								      ; 1776
19$:	MOVZBL  #74, (R3)			     ;#74, GEN_SUBTYPE							      ; 1855
20$:	BRB     22$				     ;22$								      ;
21$:	MOVZBL  #86, (R3)			     ;#86, GEN_SUBTYPE							      ; 1858
22$:	PUSHL   R2				     ;INIT_STATE							      ; 1867
	CALLS   #1, W^U.1			     ;#1, U.1								      ;
	RET     				     ;									      ; 1868

; Routine Size:  228 bytes,    Routine Base:  $CODE$ + 01CE


;   1869  1	
;   1870  1	%SBTTL 'DO_TRANSACTION - Main loop for FSM'
;   1871  1	ROUTINE DO_TRANSACTION (INIT_STATE) =
;   1872  1	
;   1873  1	!++
;   1874  1	! FUNCTIONAL DESCRIPTION:
;   1875  1	!
;   1876  1	!	This is the main routine for performing a Kermit transaction.
;   1877  1	!	It is structured as a finite state machine with each state
;   1878  1	!	determining the next based upon the packet which is received.
;   1879  1	!	It is supplied with the initial state by the caller.
;   1880  1	!
;   1881  1	! CALLING SEQUENCE:
;   1882  1	!
;   1883  1	!	Status = DO_TRANSACTION(.INIT_STATE);
;   1884  1	!
;   1885  1	! INPUT PARAMETERS:
;   1886  1	!
;   1887  1	!	INIT_STATE - Initial state.
;   1888  1	!
;   1889  1	! IMPLICIT INPUTS:
;   1890  1	!
;   1891  1	!	None.
;   1892  1	!
;   1893  1	! OUTPUT PARAMETERS:
;   1894  1	!
;   1895  1	!	None.
;   1896  1	!
;   1897  1	! IMPLICIT OUTPUTS:
;   1898  1	!
;   1899  1	!	None.
;   1900  1	!
;   1901  1	! COMPLETION CODES:
;   1902  1	!
;   1903  1	!	None.
;   1904  1	!
;   1905  1	! SIDE EFFECTS:
;   1906  1	!
;   1907  1	!	None.
;   1908  1	!
;   1909  1	!--
;   1910  1	
;   1911  2	    BEGIN
;   1912  2	
;   1913  2	    LOCAL
;   1914  2		RETURN_VALUE;
;   1915  2	
;   1916  2	    NUM_RETRIES = 0;				! Initialize the number of retries
;   1917  2	    STATE = .INIT_STATE;			! Initialize the state
;   1918  2	
;   1919  2	    WHILE TRUE DO
;   1920  2	
;   1921  2		CASE .STATE FROM STATE_MIN TO STATE_MAX OF
;   1922  2		    SET
;   1923  2	!
;   1924  2	! Send states
;   1925  2	!
;   1926  2	
;   1927  2		    [STATE_ID] :
;   1928  2	!
;   1929  2	! Server while idle.  Set the timeout to twice the normal wait
;   1930  2	! and wait for something to show up
;   1931  2	!
;   1932  3			BEGIN
;   1933  3	
;   1934  3			LOCAL
;   1935  3			    SAVED_TIMEOUT;
;   1936  3	
;   1937  3			SAVED_TIMEOUT = .SEND_TIMEOUT;
;   1938  3	
;   1939  3			IF .SEND_TIMEOUT NEQ 0 THEN SEND_TIMEOUT = .SRV_TIMEOUT;
;   1940  3	
;   1941  3			STATE = REC_SERVER_IDLE ();
;   1942  3			SEND_TIMEOUT = .SAVED_TIMEOUT;
;   1943  2			END;
;   1944  2	
;   1945  2		    [STATE_II] :
;   1946  2	!
;   1947  2	! Here while server idle after having received a server-init packet
;   1948  2	!
;   1949  2			STATE = REC_SERVER_IDLE ();
;   1950  2	
;   1951  2		    [STATE_FI, STATE_LG] :
;   1952  2	!
;   1953  2	! Here when we are supposed to exit
;   1954  2	!
;   1955  2			RETURN KER_EXIT;
;   1956  2	
;   1957  2		    [STATE_SD] :
;   1958  2			STATE = SEND_DATA ();
;   1959  2	
;   1960  2		    [STATE_SF] :
;   1961  2			STATE = SEND_FILE ();
;   1962  2	
;   1963  2		    [STATE_SZ] :
;   1964  2			STATE = SEND_EOF ();
;   1965  2	
;   1966  2		    [STATE_S] :
;   1967  2			STATE = SEND_INIT ();
;   1968  2	
;   1969  2		    [STATE_OF] :
;   1970  2			STATE = SEND_OPEN_FILE ();
;   1971  2	
;   1972  2		    [STATE_SI] :
;   1973  2			STATE = SEND_SERVER_INIT ();
;   1974  2	
;   1975  2		    [STATE_SG] :
;   1976  2			STATE = SEND_GENCMD ();
;   1977  2	
;   1978  2		    [STATE_SB] :
;   1979  2			STATE = SEND_BREAK ();
;   1980  2	!
;   1981  2	! Receiving of the data and the end of file message.
;   1982  2	!
;   1983  2	
;   1984  2		    [STATE_RD] :
;   1985  2			STATE = REC_DATA ();
;   1986  2	!
;   1987  2	! Receiving the FILE information of the break to end the transfer of
;   1988  2	! one or more files
;   1989  2	!
;   1990  2	
;   1991  2		    [STATE_RF] :
;   1992  2			STATE = REC_FILE ();
;   1993  2	!
;   1994  2	! Initialization for the receiving of a file
;   1995  2	!
;   1996  2	
;   1997  2		    [STATE_R] :
;   1998  2			STATE = REC_INIT ();
;   1999  2	!
;   2000  2	! Here if we have completed the receiving of the file
;   2001  2	!
;   2002  2	
;   2003  2		    [STATE_C] :
;   2004  3			BEGIN
;   2005  3			RETURN_VALUE = TRUE;
;   2006  3			EXITLOOP;
;   2007  2			END;
;   2008  2	!
;   2009  2	! Here if we aborted the transfer or we have gotten into some random
;   2010  2	! state (internal KERMSG problem).
;   2011  2	!
;   2012  2	
;   2013  2		    [STATE_A, STATE_EX, STATE_ER, INRANGE, OUTRANGE] :
;   2014  3			BEGIN
;   2015  3			RETURN_VALUE = FALSE;
;   2016  3	
;   2017  3			IF .STATE EQL STATE_EX THEN RETURN_VALUE = KER_ABORTED;
;   2018  3	
;   2019  3			!
;   2020  3			! Determine if the file is still open and if so close it
;   2021  3			!
;   2022  3	
;   2023  3			IF .FILE_OPEN_FLAG
;   2024  3			THEN
;   2025  4			    BEGIN
;   2026  4			    FILE_OPEN_FLAG = FALSE;
;   2027  4	
;   2028  4			    IF ( NOT .CONNECT_FLAG) AND .TY_FIL
;   2029  4			    THEN
;   2030  5				BEGIN
;   2031  5				TT_TEXT (UPLIT (%ASCIZ' [Aborted]'));
;   2032  5				TT_CRLF ();
;   2033  4				END;
;   2034  4	
;   2035  5			    FILE_CLOSE (.ABT_FLAG AND (.STATE EQL STATE_A OR .STATE EQL STATE_EX OR .STATE
;   2036  4				EQL STATE_ER));
;   2037  4			    XFR_STATUS (%C'F', %C'A');
;   2038  3			    END;
;   2039  3	
;   2040  3	!
;   2041  3	! Give error if aborted due to too many retries
;   2042  3	!
;   2043  3	
;   2044  3			IF .STATE EQL STATE_ER THEN KRM_ERROR (KER_RETRIES);
;   2045  3	
;   2046  3			EXITLOOP;
;   2047  2			END;
;   2048  2		    TES;
;   2049  2	
;   2050  2	!
;   2051  2	! End the stats and return to the caller
;   2052  2	!
;   2053  2	    END_STATS ();
;   2054  2	!
;   2055  2	    RETURN .RETURN_VALUE;
;   2056  1	    END;					! End of DO_TRANSACTION



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.AAA:	.ASCII  \ [Aborted]\<0><0>		     ;									      ;



	.PSECT  $CODE$,NOWRT,2

;DO_TRANSACTION
U.1:	.WORD   ^M<R2,R3,R4,R5,R6>		     ;Save R2,R3,R4,R5,R6						      ; 1871
	MOVAB   W^SEND_TIMEOUT, R6		     ;SEND_TIMEOUT, R6							      ;
	MOVAB   W^U.49, R5			     ;U.49, R5								      ;
	CLRL    12(R5)				     ;NUM_RETRIES							      ; 1916
	MOVL    4(AP), (R5)			     ;INIT_STATE, STATE							      ; 1917
1$:	CASEL   (R5), #1, #19			     ;STATE, #1, #19							      ; 1921
2$:	.WORD   18$-2$,-			     ;18$-2$,-								      ;
		16$-2$,-			     ;16$-2$,-								      ;
		15$-2$,-			     ;15$-2$,-								      ;
		17$-2$,-			     ;17$-2$,-								      ;
		22$-2$,-			     ;22$-2$,-								      ;
		25$-2$,-			     ;25$-2$,-								      ;
		24$-2$,-			     ;24$-2$,-								      ;
		23$-2$,-			     ;23$-2$,-								      ;
		28$-2$,-			     ;28$-2$,-								      ;
		3$-2$,-				     ;3$-2$,-								      ;
		3$-2$,-				     ;3$-2$,-								      ;
		21$-2$,-			     ;21$-2$,-								      ;
		20$-2$,-			     ;20$-2$,-								      ;
		11$-2$,-			     ;11$-2$,-								      ;
		13$-2$,-			     ;13$-2$,-								      ;
		14$-2$,-			     ;14$-2$,-								      ;
		14$-2$,-			     ;14$-2$,-								      ;
		19$-2$,-			     ;19$-2$,-								      ;
		3$-2$,-				     ;3$-2$,-								      ;
		3$-2$				     ;3$-2$								      ;
3$:	CLRL    R3				     ;RETURN_VALUE							      ; 2015
	CMPL    (R5), #19			     ;STATE, #19							      ; 2017
	BNEQ    4$				     ;4$								      ;
	MOVL    #134316258, R3			     ;#134316258, RETURN_VALUE						      ;
4$:	BLBC    232(R5), 9$			     ;FILE_OPEN_FLAG, 9$						      ; 2023
	CLRL    232(R5)				     ;FILE_OPEN_FLAG							      ; 2026
	BLBS    W^CONNECT_FLAG, 5$		     ;CONNECT_FLAG, 5$							      ; 2028
	BLBC    W^TY_FIL, 5$			     ;TY_FIL, 5$							      ;
	PUSHAB  W^P.AAA				     ;P.AAA								      ; 2031
	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 2032
5$:	MOVL    (R5), R2			     ;STATE, R2								      ; 2035
	CLRL    R0				     ;R0								      ;
	CMPL    R2, #10				     ;R2, #10								      ;
	BNEQ    6$				     ;6$								      ;
	INCL    R0				     ;R0								      ;
6$:	CLRL    R1				     ;R1								      ;
	CMPL    R2, #19				     ;R2, #19								      ;
	BNEQ    7$				     ;7$								      ;
	INCL    R1				     ;R1								      ;
7$:	BISL2   R0, R1				     ;R0, R1								      ;
	CLRL    R0				     ;R0								      ; 2036
	CMPL    R2, #20				     ;R2, #20								      ;
	BNEQ    8$				     ;8$								      ;
	INCL    R0				     ;R0								      ;
8$:	BISL2   R1, R0				     ;R1, R0								      ;
	MCOML   W^ABT_FLAG, R4			     ;ABT_FLAG, R4							      ; 2035
	BICL3   R4, R0, -(SP)			     ;R4, R0, -(SP)							      ;
	CALLS   #1, W^FILE_CLOSE		     ;#1, FILE_CLOSE							      ;
	MOVZBL  #65, -(SP)			     ;#65, -(SP)							      ; 2037
	MOVZBL  #70, -(SP)			     ;#70, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
9$:	CMPL    (R5), #20			     ;STATE, #20							      ; 2044
	BNEQ    10$				     ;10$								      ;
	PUSHL   #134316194			     ;#134316194							      ;
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
10$:	BRB     29$				     ;29$								      ; 2014
11$:	MOVL    (R6), R2			     ;SEND_TIMEOUT, SAVED_TIMEOUT					      ; 1937
	BEQL    12$				     ;12$								      ; 1939
	MOVL    W^SRV_TIMEOUT, (R6)		     ;SRV_TIMEOUT, SEND_TIMEOUT						      ;
12$:	CALLS   #0, W^U.10			     ;#0, U.10								      ; 1941
	MOVL    R0, (R5)			     ;R0, STATE								      ;
	MOVL    R2, (R6)			     ;SAVED_TIMEOUT, SEND_TIMEOUT					      ; 1942
	BRB     27$				     ;27$								      ; 1921
13$:	CALLS   #0, W^U.10			     ;#0, U.10								      ; 1949
	BRB     26$				     ;26$								      ;
14$:	MOVL    #134316203, R0			     ;#134316203, R0							      ; 1955
	RET     				     ;									      ;
15$:	CALLS   #0, W^U.3			     ;#0, U.3								      ; 1958
	BRB     26$				     ;26$								      ;
16$:	CALLS   #0, W^U.4			     ;#0, U.4								      ; 1961
	BRB     26$				     ;26$								      ;
17$:	CALLS   #0, W^U.7			     ;#0, U.7								      ; 1964
	BRB     26$				     ;26$								      ;
18$:	CALLS   #0, W^U.8			     ;#0, U.8								      ; 1967
	BRB     26$				     ;26$								      ;
19$:	CALLS   #0, W^U.5			     ;#0, U.5								      ; 1970
	BRB     26$				     ;26$								      ;
20$:	CALLS   #0, W^U.2			     ;#0, U.2								      ; 1973
	BRB     26$				     ;26$								      ;
21$:	CALLS   #0, W^U.6			     ;#0, U.6								      ; 1976
	BRB     26$				     ;26$								      ;
22$:	CALLS   #0, W^U.9			     ;#0, U.9								      ; 1979
	BRB     26$				     ;26$								      ;
23$:	CALLS   #0, W^U.13			     ;#0, U.13								      ; 1985
	BRB     26$				     ;26$								      ;
24$:	CALLS   #0, W^U.12			     ;#0, U.12								      ; 1992
	BRB     26$				     ;26$								      ;
25$:	CALLS   #0, W^U.11			     ;#0, U.11								      ; 1998
26$:	MOVL    R0, (R5)			     ;R0, STATE								      ;
27$:	BRW     1$				     ;1$								      ;
28$:	MOVL    #1, R3				     ;#1, RETURN_VALUE							      ; 2005
29$:	CALLS   #0, W^U.18			     ;#0, U.18								      ; 2053
	MOVL    R3, R0				     ;RETURN_VALUE, R0							      ; 2055
	RET     				     ;									      ; 2056

; Routine Size:  322 bytes,    Routine Base:  $CODE$ + 02B2


;   2057  1	%SBTTL 'REC_SERVER_IDLE - Idle server state'
;   2058  1	ROUTINE REC_SERVER_IDLE =
;   2059  1	
;   2060  1	!++
;   2061  1	! FUNCTIONAL DESCRIPTION:
;   2062  1	!
;   2063  1	! This routine is called from DO_TRANSACTION when is the server idle
;   2064  1	! state.  It will receive a message and properly dispatch to the new
;   2065  1	! state.
;   2066  1	!
;   2067  1	! CALLING SEQUENCE:
;   2068  1	!
;   2069  1	!	STATE = REC_SERVER_IDLE ();
;   2070  1	!
;   2071  1	! INPUT PARAMETERS:
;   2072  1	!
;   2073  1	!	None.
;   2074  1	!
;   2075  1	! IMPLICIT INPUTS:
;   2076  1	!
;   2077  1	!	Almost everything.
;   2078  1	!
;   2079  1	! OUPTUT PARAMETERS:
;   2080  1	!
;   2081  1	!	Routine value is new state for FSM
;   2082  1	!
;   2083  1	! IMPLICIT OUTPUTS:
;   2084  1	!
;   2085  1	!	None.
;   2086  1	!
;   2087  1	! COMPLETION CODES:
;   2088  1	!
;   2089  1	!	None.
;   2090  1	!
;   2091  1	! SIDE EFFECTS:
;   2092  1	!
;   2093  1	!	None.
;   2094  1	!
;   2095  1	!--
;   2096  1	
;   2097  2	    BEGIN
;   2098  2	
;   2099  2	    LOCAL
;   2100  2		STATUS;
;   2101  2	
;   2102  2	    STATUS = REC_PACKET ();
;   2103  2	!
;   2104  2	! Now determine what to do by the type of message we have receive.
;   2105  2	!
;   2106  2	
;   2107  2	    IF .STATUS EQL KER_ABORTED THEN RETURN STATE_EX;
;   2108  2	
;   2109  2	    IF .STATUS
;   2110  2	    THEN
;   2111  3		BEGIN
;   2112  3	
;   2113  3		SELECTONE .REC_TYPE OF
;   2114  3		    SET
;   2115  3		    !
;   2116  3		    ! Server initialization message received. ACK the
;   2117  3		    ! message and continue.
;   2118  3		    !
;   2119  3	
;   2120  3		    [MSG_SER_INIT] :
;   2121  4			BEGIN
;   2122  4	
;   2123  5			IF (STATUS = PRS_SEND_INIT ())
;   2124  4			THEN
;   2125  5			    BEGIN
;   2126  5			    SET_SEND_INIT ();
;   2127  5	
;   2128  6			    IF (STATUS = SEND_PACKET (MSG_ACK, P_SI_LENGTH, .REC_SEQ))
;   2129  5			    THEN
;   2130  6				BEGIN
;   2131  6				SND_PKT_SIZE = -.SEND_PKT_SIZE;
;   2132  6				SND_TIMEOUT = -.SEND_TIMEOUT;
;   2133  6				SND_NPAD = -.SEND_NPAD;
;   2134  6				SND_PADCHAR = -.SEND_PADCHAR;
;   2135  6				SND_EOL = -.SEND_EOL;
;   2136  6				SND_QUOTE_CHR = -.SEND_QUOTE_CHR;
;   2137  6				RCV_8QUOTE_CHR = .SEND_8QUOTE_CHR;
;   2138  6				CHKTYPE = .INI_CHK_TYPE;
;   2139  6				SET_REPT_CHR = .REPT_CHR;
;   2140  6				RETURN STATE_II;	! Now idle after INIT
;   2141  5				END;
;   2142  5	
;   2143  4			    END;
;   2144  4	
;   2145  4			KRM_ERROR (KER_PROTOERR);
;   2146  4			RETURN STATE_A;
;   2147  3			END;
;   2148  3		    !
;   2149  3		    ! Send init message received.  We must ACK the message and
;   2150  3		    ! then attempt to receive a file from the remote.
;   2151  3		    !
;   2152  3	
;   2153  3		    [MSG_SND_INIT] :
;   2154  4			BEGIN
;   2155  4			MSG_NUMBER = (.REC_SEQ + 1) AND %O'77';
;   2156  4	
;   2157  5			IF (STATUS = PRS_SEND_INIT ())
;   2158  4			THEN
;   2159  5			    BEGIN
;   2160  5			    SET_SEND_INIT ();
;   2161  5			    !
;   2162  5			    ! ACK the message then receive everything.
;   2163  5			    !
;   2164  5	
;   2165  5			    IF SEND_PACKET (MSG_ACK, P_SI_LENGTH, .REC_SEQ)
;   2166  5			    THEN
;   2167  6				BEGIN
;   2168  6				BLK_CHK_TYPE = .INI_CHK_TYPE;	! Switch to desired form of block check
;   2169  6				XFR_STATUS (%C'I', %C'R');	! Start of file receive
;   2170  6				RETURN STATE_RF;
;   2171  5				END;
;   2172  5	
;   2173  4			    END;
;   2174  4	
;   2175  4			KRM_ERROR (KER_PROTOERR);
;   2176  4			RETURN STATE_A;
;   2177  3			END;
;   2178  3		    !
;   2179  3		    ! Here if we receive a receive init message.
;   2180  3		    ! We will be sending a file to the other end.
;   2181  3		    !
;   2182  3	
;   2183  3		    [MSG_RCV_INIT] :
;   2184  4			BEGIN
;   2185  4			!
;   2186  4			! Move the file specification if we received one
;   2187  4			!
;   2188  4			SET_STRING (CH$PTR (FILE_NAME), MAX_FILE_NAME, TRUE);
;   2189  4			BFR_EMPTY ();
;   2190  4			FILE_SIZE = SET_STRING (0, 0, FALSE);
;   2191  4			CH$WCHAR (CHR_NUL, CH$PTR (FILE_NAME, .FILE_SIZE));
;   2192  4	
;   2193  4			IF .FILE_SIZE GTR 0
;   2194  4			THEN
;   2195  5			    BEGIN
;   2196  5			    XFR_STATUS (%C'I', %C'S');	! Start of a file send
;   2197  5			    RETURN STATE_S;
;   2198  4			    END;
;   2199  4	
;   2200  4			KRM_ERROR (KER_PROTOERR);
;   2201  4			RETURN STATE_A;
;   2202  3			END;
;   2203  3	!
;   2204  3	! Generic KERMIT commands
;   2205  3	!
;   2206  3	
;   2207  3		    [MSG_GENERIC] :
;   2208  3			RETURN SERVER_GENERIC ();
;   2209  3	!
;   2210  3	! Host command
;   2211  3	!
;   2212  3	
;   2213  3		    [MSG_COMMAND] :
;   2214  3			RETURN HOST_COMMAND ();
;   2215  3	!
;   2216  3	! Kermit command
;   2217  3	!
;   2218  3	
;   2219  3		    [MSG_KERMIT] :
;   2220  3			RETURN KERMIT_COMMAND ();
;   2221  3	!
;   2222  3	! Unimplimented server routines
;   2223  3	!
;   2224  3	
;   2225  3		    [OTHERWISE] :
;   2226  4			BEGIN
;   2227  4			KRM_ERROR (KER_UNISRV);
;   2228  4			RETURN STATE_A;
;   2229  3			END;
;   2230  3		    TES;
;   2231  3	
;   2232  2		END;
;   2233  2	
;   2234  2	!
;   2235  2	! If we get here, we must have gotten something random.  Therefore,
;   2236  2	! just send a NAK and remain in the current state (unless we have done this
;   2237  2	! too many times).
;   2238  2	!
;   2239  2	    NUM_RETRIES = .NUM_RETRIES + 1;
;   2240  2	
;   2241  2	    IF .NUM_RETRIES GTR .SI_RETRIES THEN RETURN STATE_A;
;   2242  2	
;   2243  2	    IF SEND_PACKET (MSG_NAK, 0, 0) THEN RETURN .STATE ELSE RETURN STATE_EX;
;   2244  2	
;   2245  1	    END;					! End of REC_SERVER_IDLE





;REC_SERVER_IDLE
U.10:	.WORD   ^M<R2,R3,R4,R5>			     ;Save R2,R3,R4,R5							      ; 2058
	MOVAB   W^U.24, R5			     ;U.24, R5								      ;
	MOVAB   W^U.54, R4			     ;U.54, R4								      ;
	CALLS   #0, W^U.26			     ;#0, U.26								      ; 2102
	MOVL    R0, R3				     ;R0, STATUS							      ;
	CMPL    R3, #134316258			     ;STATUS, #134316258						      ; 2107
	BNEQ    1$				     ;1$								      ;
	BRW     15$				     ;15$								      ;
1$:	BLBS    R3, 2$				     ;STATUS, 2$							      ; 2109
	BRW     12$				     ;12$								      ;
2$:	MOVL    8(R4), R2			     ;REC_TYPE, R2							      ; 2113
	CMPL    R2, #73				     ;R2, #73								      ; 2120
	BNEQ    3$				     ;3$								      ;
	CALLS   #0, W^U.21			     ;#0, U.21								      ; 2123
	MOVL    R0, R3				     ;R0, STATUS							      ;
	BLBC    R3, 4$				     ;STATUS, 4$							      ;
	CALLS   #0, W^U.20			     ;#0, U.20								      ; 2126
	PUSHL   (R4)				     ;REC_SEQ								      ; 2128
	PUSHL   #9				     ;#9								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, (R5)			     ;#3, SEND_PACKET							      ;
	MOVL    R0, R3				     ;R0, STATUS							      ;
	BLBC    R3, 4$				     ;STATUS, 4$							      ;
	MNEGL   -60(R4), W^SND_PKT_SIZE		     ;SEND_PKT_SIZE, SND_PKT_SIZE					      ; 2131
	MNEGL   W^SEND_TIMEOUT, W^SND_TIMEOUT	     ;SEND_TIMEOUT, SND_TIMEOUT						      ; 2132
	MNEGL   -56(R4), W^SND_NPAD		     ;SEND_NPAD, SND_NPAD						      ; 2133
	MNEGL   -52(R4), W^SND_PADCHAR		     ;SEND_PADCHAR, SND_PADCHAR						      ; 2134
	MNEGL   -48(R4), W^SND_EOL		     ;SEND_EOL, SND_EOL							      ; 2135
	MNEGL   -44(R4), W^SND_QUOTE_CHR	     ;SEND_QUOTE_CHR, SND_QUOTE_CHR					      ; 2136
	MOVL    -40(R4), W^RCV_8QUOTE_CHR	     ;SEND_8QUOTE_CHR, RCV_8QUOTE_CHR					      ; 2137
	MOVL    -36(R4), W^CHKTYPE		     ;INI_CHK_TYPE, CHKTYPE						      ; 2138
	MOVL    -64(R4), W^SET_REPT_CHR		     ;REPT_CHR, SET_REPT_CHR						      ; 2139
	MOVL    #15, R0				     ;#15, R0								      ; 2140
	RET     				     ;									      ;
3$:	CMPL    R2, #83				     ;R2, #83								      ; 2153
	BNEQ    5$				     ;5$								      ;
	ADDL3   #1, (R4), R0			     ;#1, REC_SEQ, R0							      ; 2155
	EXTZV   #0, #6, R0, -4(R4)		     ;#0, #6, R0, MSG_NUMBER						      ;
	CALLS   #0, W^U.21			     ;#0, U.21								      ; 2157
	MOVL    R0, R3				     ;R0, STATUS							      ;
4$:	BLBC    R3, 6$				     ;STATUS, 6$							      ;
	CALLS   #0, W^U.20			     ;#0, U.20								      ; 2160
	PUSHL   (R4)				     ;REC_SEQ								      ; 2165
	PUSHL   #9				     ;#9								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, (R5)			     ;#3, SEND_PACKET							      ;
	BLBC    R0, 6$				     ;R0, 6$								      ;
	MOVL    -36(R4), -32(R4)		     ;INI_CHK_TYPE, BLK_CHK_TYPE					      ; 2168
	MOVZBL  #82, -(SP)			     ;#82, -(SP)							      ; 2169
	MOVZBL  #73, -(SP)			     ;#73, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	MOVL    #7, R0				     ;#7, R0								      ; 2170
	RET     				     ;									      ;
5$:	CMPL    R2, #82				     ;R2, #82								      ; 2183
	BNEQ    8$				     ;8$								      ;
	PUSHL   #1				     ;#1								      ; 2188
	MOVZBL  #132, -(SP)			     ;#132, -(SP)							      ;
	PUSHAB  W^FILE_NAME			     ;FILE_NAME								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	CALLS   #0, W^U.28			     ;#0, U.28								      ; 2189
	CLRQ    -(SP)				     ;-(SP)								      ; 2190
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	MOVL    R0, W^FILE_SIZE			     ;R0, FILE_SIZE							      ;
	MOVAB   W^FILE_NAME, R0			     ;FILE_NAME, R0							      ; 2191
	CLRB    @W^FILE_SIZE[R0]		     ;@FILE_SIZE[R0]							      ;
	TSTL    W^FILE_SIZE			     ;FILE_SIZE								      ; 2193
	BLEQ    6$				     ;6$								      ;
	MOVZBL  #83, -(SP)			     ;#83, -(SP)							      ; 2196
	MOVZBL  #73, -(SP)			     ;#73, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	MOVL    #1, R0				     ;#1, R0								      ; 2197
	RET     				     ;									      ;
6$:	PUSHL   #134316226			     ;#134316226							      ; 2200
7$:	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	BRB     13$				     ;13$								      ; 2201
8$:	CMPL    R2, #71				     ;R2, #71								      ; 2207
	BNEQ    9$				     ;9$								      ;
	CALLS   #0, W^U.14			     ;#0, U.14								      ; 2208
	RET     				     ;									      ;
9$:	CMPL    R2, #67				     ;R2, #67								      ; 2213
	BNEQ    10$				     ;10$								      ;
	CALLS   #0, W^U.15			     ;#0, U.15								      ; 2214
	RET     				     ;									      ;
10$:	CMPL    R2, #75				     ;R2, #75								      ; 2219
	BNEQ    11$				     ;11$								      ;
	CALLS   #0, W^U.16			     ;#0, U.16								      ; 2220
	RET     				     ;									      ;
11$:	PUSHL   #134316218			     ;#134316218							      ; 2227
	BRB     7$				     ;7$								      ;
12$:	INCL    -8(R4)				     ;NUM_RETRIES							      ; 2239
	CMPL    -8(R4), W^SI_RETRIES		     ;NUM_RETRIES, SI_RETRIES						      ; 2241
	BLEQ    14$				     ;14$								      ;
13$:	MOVL    #10, R0				     ;#10, R0								      ;
	RET     				     ;									      ;
14$:	CLRQ    -(SP)				     ;-(SP)								      ; 2243
	MOVZBL  #78, -(SP)			     ;#78, -(SP)							      ;
	CALLS   #3, (R5)			     ;#3, SEND_PACKET							      ;
	BLBC    R0, 15$				     ;R0, 15$								      ;
	MOVL    -20(R4), R0			     ;STATE, R0								      ;
	RET     				     ;									      ;
15$:	MOVL    #19, R0				     ;#19, R0								      ;
	RET     				     ;									      ; 2245

; Routine Size:  392 bytes,    Routine Base:  $CODE$ + 03F4


;   2246  1	%SBTTL 'SEND_SERVER_INIT'
;   2247  1	ROUTINE SEND_SERVER_INIT =
;   2248  1	
;   2249  1	!++
;   2250  1	! FUNCTIONAL DESCRIPTION:
;   2251  1	!
;   2252  1	!	This routine will send a server initialization message to the
;   2253  1	!	remote KERMIT.
;   2254  1	!
;   2255  1	! CALLING SEQUENCE:
;   2256  1	!
;   2257  1	!	STATE = SEND_SERVER_INIT();
;   2258  1	!
;   2259  1	! INPUT PARAMETERS:
;   2260  1	!
;   2261  1	!	None.
;   2262  1	!
;   2263  1	! IMPLICIT INPUTS:
;   2264  1	!
;   2265  1	!	RECV_xxx - desired receive parameters
;   2266  1	!
;   2267  1	! OUTPUT PARAMETERS:
;   2268  1	!
;   2269  1	!	New state to change the finite state machine to.
;   2270  1	!
;   2271  1	! IMPLICIT OUTPUTS:
;   2272  1	!
;   2273  1	!	SEND_xxx - Other Kermit's desired parameters
;   2274  1	!
;   2275  1	! COMPLETION CODES:
;   2276  1	!
;   2277  1	!	None.
;   2278  1	!
;   2279  1	! SIDE EFFECTS:
;   2280  1	!
;   2281  1	!	None.
;   2282  1	!
;   2283  1	!--
;   2284  1	
;   2285  2	    BEGIN
;   2286  2	
;   2287  2	    LOCAL
;   2288  2		OLD_OUTPUT,				! Saved terminal output routine
;   2289  2		STATUS;					! Status returned by various routines
;   2290  2	
;   2291  2	![026] Local routine to ignore error message output
;   2292  2	    ROUTINE IGNORE_ERROR (ADDRESS, LENGTH) =
;   2293  3		BEGIN
;   2294  3		RETURN TRUE;
;   2295  2		END;





;IGNORE_ERROR
U.74:	.WORD   ^M<>				     ;Save nothing							      ; 2292
	MOVL    #1, R0				     ;#1, R0								      ; 2294
	RET     				     ;									      ; 2295

; Routine Size:  6 bytes,    Routine Base:  $CODE$ + 057C


;   2296  2	    SET_SEND_INIT ();
;   2297  2	![026] If too many tries, just give up.  Maybe the other Kermit doesn't
;   2298  2	![026] know what to do with this packet.
;   2299  2	
;   2300  2	    IF .NUM_RETRIES GTR .SI_RETRIES THEN RETURN STATE_SG;
;   2301  2	
;   2302  2	![026]
;   2303  2	![026] Count the number of times we try this
;   2304  2	![026]
;   2305  2	    NUM_RETRIES = .NUM_RETRIES + 1;
;   2306  2	
;   2307  2	    IF NOT SEND_PACKET (MSG_SER_INIT, P_SI_LENGTH, .MSG_NUMBER) THEN RETURN STATE_A;
;   2308  2	
;   2309  2	![026]
;   2310  2	![026] Determine if we received a packet it good condition.  If we timed out
;   2311  2	![026] just try again.  If we get an error packet back, ignore it and
;   2312  2	![026] just continue.  The other Kermit must not support this packet.
;   2313  2	![026]
;   2314  2	    OLD_OUTPUT = TT_SET_OUTPUT (IGNORE_ERROR);
;   2315  2	    STATUS = REC_PACKET ();
;   2316  2	    TT_OUTPUT ();
;   2317  2	    TT_SET_OUTPUT (.OLD_OUTPUT);
;   2318  2	
;   2319  2	    IF .STATUS EQL KER_ERRMSG THEN RETURN STATE_SG;
;   2320  2	
;   2321  2	    IF NOT .STATUS
;   2322  2	    THEN
;   2323  2	
;   2324  4		IF NOT ((.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL
;   2325  3		    KER_CHKSUMERR))
;   2326  2		THEN
;   2327  2		    RETURN STATE_EX
;   2328  2		ELSE
;   2329  2		    RETURN .STATE;
;   2330  2	
;   2331  2	!
;   2332  2	! Determine if the packet is good.
;   2333  2	!
;   2334  2	
;   2335  2	    IF .REC_TYPE EQL MSG_ACK AND .REC_SEQ EQL .MSG_NUMBER
;   2336  2	    THEN
;   2337  3		BEGIN
;   2338  3	!
;   2339  3	! Here if we have an ACK for the initialization message that was just sent
;   2340  3	! to the remote KERMIT.
;   2341  3	!
;   2342  3	
;   2343  3		IF NOT (STATUS = PRS_SEND_INIT ()) THEN RETURN STATE_A;
;   2344  3	
;   2345  3		NUM_RETRIES = 0;
;   2346  3		INIT_PKT_SENT = TRUE;			! We have exchanged init's
;   2347  3		RETURN STATE_SG;
;   2348  2		END;
;   2349  2	
;   2350  2	!
;   2351  2	! If we haven't returned yet, we must have gotten an invalid response.
;   2352  2	! Just stay in the same state so we try again
;   2353  2	!
;   2354  2	    RETURN .STATE;
;   2355  1	    END;





;SEND_SERVER_INIT
U.2:	.WORD   ^M<R2,R3,R4>			     ;Save R2,R3,R4							      ; 2247
	MOVAB   W^U.52, R4			     ;U.52, R4								      ;
	CALLS   #0, W^U.20			     ;#0, U.20								      ; 2296
	CMPL    (R4), W^SI_RETRIES		     ;NUM_RETRIES, SI_RETRIES						      ; 2300
	BLEQ    1$				     ;1$								      ;
	BRW     5$				     ;5$								      ;
1$:	INCL    (R4)				     ;NUM_RETRIES							      ; 2305
	PUSHL   4(R4)				     ;MSG_NUMBER							      ; 2307
	PUSHL   #9				     ;#9								      ;
	MOVZBL  #73, -(SP)			     ;#73, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	BLBC    R0, 3$				     ;R0, 3$								      ;
	PUSHAB  B^U.74				     ;U.74								      ; 2314
	CALLS   #1, W^TT_SET_OUTPUT		     ;#1, TT_SET_OUTPUT							      ;
	MOVL    R0, R3				     ;R0, OLD_OUTPUT							      ;
	CALLS   #0, W^U.26			     ;#0, U.26								      ; 2315
	MOVL    R0, R2				     ;R0, STATUS							      ;
	CALLS   #0, W^TT_OUTPUT			     ;#0, TT_OUTPUT							      ; 2316
	PUSHL   R3				     ;OLD_OUTPUT							      ; 2317
	CALLS   #1, W^TT_SET_OUTPUT		     ;#1, TT_SET_OUTPUT							      ;
	CMPL    R2, #134316170			     ;STATUS, #134316170						      ; 2319
	BEQL    5$				     ;5$								      ;
	BLBS    R2, 2$				     ;STATUS, 2$							      ; 2321
	CMPL    R2, #134316234			     ;STATUS, #134316234						      ; 2324
	BEQL    6$				     ;6$								      ;
	CMPL    R2, #134316248			     ;STATUS, #134316248						      ;
	BEQL    6$				     ;6$								      ;
	CMPL    R2, #134316178			     ;STATUS, #134316178						      ;
	BEQL    6$				     ;6$								      ;
	MOVL    #19, R0				     ;#19, R0								      ; 2329
	RET     				     ;									      ;
2$:	CMPL    16(R4), #89			     ;REC_TYPE, #89							      ; 2335
	BNEQ    6$				     ;6$								      ;
	CMPL    8(R4), 4(R4)			     ;REC_SEQ, MSG_NUMBER						      ;
	BNEQ    6$				     ;6$								      ;
	CALLS   #0, W^U.21			     ;#0, U.21								      ; 2343
	MOVL    R0, R2				     ;R0, STATUS							      ;
	BLBS    R2, 4$				     ;STATUS, 4$							      ;
3$:	MOVL    #10, R0				     ;#10, R0								      ;
	RET     				     ;									      ;
4$:	CLRL    (R4)				     ;NUM_RETRIES							      ; 2345
	MOVL    #1, 236(R4)			     ;#1, INIT_PKT_SENT							      ; 2346
5$:	MOVL    #12, R0				     ;#12, R0								      ; 2347
	RET     				     ;									      ;
6$:	MOVL    -12(R4), R0			     ;STATE, R0								      ; 2354
	RET     				     ;									      ; 2355

; Routine Size:  163 bytes,    Routine Base:  $CODE$ + 0582


;   2356  1	%SBTTL 'SEND_DATA'
;   2357  1	ROUTINE SEND_DATA =
;   2358  1	
;   2359  1	!++
;   2360  1	! FUNCTIONAL DESCRIPTION:
;   2361  1	!
;   2362  1	!	This routine will send a data message to the remote KERMIT.
;   2363  1	!
;   2364  1	! CALLING SEQUENCE:
;   2365  1	!
;   2366  1	!	STATE = SEND_DATA();
;   2367  1	!
;   2368  1	! INPUT PARAMETERS:
;   2369  1	!
;   2370  1	!	None.
;   2371  1	!
;   2372  1	! IMPLICIT INPUTS:
;   2373  1	!
;   2374  1	!	None.
;   2375  1	!
;   2376  1	! OUTPUT PARAMETERS:
;   2377  1	!
;   2378  1	!	New state to change the finite state machine to.
;   2379  1	!
;   2380  1	! IMPLICIT OUTPUTS:
;   2381  1	!
;   2382  1	!	None.
;   2383  1	!
;   2384  1	! COMPLETION CODES:
;   2385  1	!
;   2386  1	!	None.
;   2387  1	!
;   2388  1	! SIDE EFFECTS:
;   2389  1	!
;   2390  1	!	None.
;   2391  1	!
;   2392  1	!--
;   2393  1	
;   2394  2	    BEGIN
;   2395  2	
;   2396  2	    LOCAL
;   2397  2		SUB_TYPE,				! Subtype for XFR_STATUS call
;   2398  2		STATUS;					! Status returned by various routines
;   2399  2	
;   2400  2	!
;   2401  2	! If there is nothing in the data packet, we should not bother to send it.
;   2402  2	! Instead, we will just call BFR_FILL again to get some more data
;   2403  2	!
;   2404  2	
;   2405  2	    IF .SIZE GTR 0
;   2406  2	    THEN
;   2407  3		BEGIN
;   2408  3	!
;   2409  3	! Check to see if the number of retries have been exceeded.
;   2410  3	!
;   2411  3	
;   2412  3		IF .NUM_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER;
;   2413  3	
;   2414  3	!
;   2415  3	! Not exceeded yet.  Increment the number of retries we have attempted
;   2416  3	! on this message.
;   2417  3	!
;   2418  3		NUM_RETRIES = .NUM_RETRIES + 1;
;   2419  3	!
;   2420  3	! Attempt to send the packet and abort if the send fails.
;   2421  3	!
;   2422  3	
;   2423  3		IF NOT SEND_PACKET (MSG_DATA, .SIZE, .MSG_NUMBER) THEN RETURN STATE_EX;
;   2424  3	
;   2425  3	!
;   2426  3	! Attempt to receive a message from the remote KERMIT.
;   2427  3	!
;   2428  3		STATUS = REC_PACKET ();
;   2429  3	
;   2430  3		IF NOT .STATUS
;   2431  3		THEN
;   2432  4		    BEGIN
;   2433  4	
;   2434  5		    IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL
;   2435  5			KER_CHKSUMERR)
;   2436  4		    THEN
;   2437  4			RETURN .STATE
;   2438  4		    ELSE
;   2439  4			RETURN STATE_EX;
;   2440  4	
;   2441  3		    END;
;   2442  3	
;   2443  3	!
;   2444  3	! Determine if the message is a NAK and the NAK is for the message number
;   2445  3	! that we are current working on.  If the NAK is for the next packet then
;   2446  3	! treat it like an ACK for this packet
;   2447  3	!
;   2448  3	
;   2449  4		IF .REC_TYPE EQL MSG_NAK AND (.REC_SEQ NEQ ((.MSG_NUMBER + 1) AND %O'77'))
;   2450  3		THEN
;   2451  3		    RETURN .STATE;
;   2452  3	
;   2453  3	!
;   2454  3	! Make sure we have a NAK or ACK
;   2455  3	!
;   2456  3	
;   2457  4		IF NOT (.REC_TYPE EQL MSG_ACK OR .REC_TYPE EQL MSG_NAK)
;   2458  3		THEN
;   2459  3	!
;   2460  3	! Not an ACK or NAK, abort.
;   2461  3	!
;   2462  4		    BEGIN
;   2463  4		    KRM_ERROR (KER_PROTOERR);
;   2464  4		    RETURN STATE_A;
;   2465  3		    END;
;   2466  3	
;   2467  3	!
;   2468  3	! Is this for this message?
;   2469  3	!
;   2470  3	
;   2471  3		IF .REC_TYPE EQL MSG_ACK AND .REC_SEQ NEQ .MSG_NUMBER THEN RETURN .STATE;
;   2472  3	
;   2473  3	!
;   2474  3	! It was.  Set up for sending the next data message to the remote KERMIT
;   2475  3	! and return.
;   2476  3	!
;   2477  3	!
;   2478  3	! Check for data field in ACK indicating abort file or stream
;   2479  3	!
;   2480  3	!
;   2481  3	
;   2482  3		IF .REC_TYPE EQL MSG_ACK AND .REC_LENGTH EQL 1
;   2483  3		THEN
;   2484  3	
;   2485  3		    SELECTONE CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG, CHR_SIZE)) OF
;   2486  3			SET
;   2487  3	
;   2488  3			[MSG_ACK_ABT_CUR] :
;   2489  3			    ABT_CUR_FILE = TRUE;
;   2490  3	
;   2491  3			[MSG_ACK_ABT_ALL] :
;   2492  3			    ABT_ALL_FILE = TRUE;
;   2493  3			TES;
;   2494  3	
;   2495  3		NUM_RETRIES = 0;
;   2496  3		MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   2497  2		END;					! End of IF .SIZE GTR 0
;   2498  2	
;   2499  3	    IF (BFR_FILL (FALSE) EQL KER_NORMAL) AND NOT (.ABT_CUR_FILE OR .ABT_ALL_FILE)
;   2500  2	    THEN
;   2501  2		RETURN STATE_SD
;   2502  2	    ELSE
;   2503  3		BEGIN
;   2504  3	
;   2505  3		IF ( NOT .CONNECT_FLAG) AND .TY_FIL
;   2506  3		THEN
;   2507  4		    BEGIN
;   2508  4	
;   2509  4		    IF .ABT_ALL_FILE
;   2510  4		    THEN
;   2511  4			TT_TEXT (UPLIT (%ASCIZ' [Group interrupted]'))
;   2512  4		    ELSE
;   2513  4	
;   2514  4			IF .ABT_CUR_FILE
;   2515  4			THEN
;   2516  4			    TT_TEXT (UPLIT (%ASCIZ' [Interrupted]'))
;   2517  4			ELSE
;   2518  4			    TT_TEXT (UPLIT (%ASCIZ' [OK]'));
;   2519  4	
;   2520  4		    TT_CRLF ();
;   2521  3		    END;
;   2522  3	
;   2523  3		IF .FILE_OPEN_FLAG THEN FILE_CLOSE (FALSE);
;   2524  3	
;   2525  3		SUB_TYPE = %C'C';			! Assume ok
;   2526  3	
;   2527  3		IF .ABT_ALL_FILE
;   2528  3		THEN
;   2529  3		    SUB_TYPE = %C'Z'
;   2530  3		ELSE
;   2531  3	
;   2532  3		    IF .ABT_CUR_FILE THEN SUB_TYPE = %C'X';
;   2533  3	
;   2534  3		XFR_STATUS (%C'F', .SUB_TYPE);
;   2535  3		FILE_OPEN_FLAG = FALSE;
;   2536  3		RETURN STATE_SZ;
;   2537  2		END;
;   2538  2	
;   2539  1	    END;



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.AAB:	.ASCII  \ [Group interrupted]\<0><0><0><0>   ;									      ;
P.AAC:	.ASCII  \ [Interrupted]\<0><0>		     ;									      ;
P.AAD:	.ASCII  \ [OK]\<0><0><0>		     ;									      ;



	.PSECT  $CODE$,NOWRT,2

;SEND_DATA
U.3:	.WORD   ^M<R2,R3,R4>			     ;Save R2,R3,R4							      ; 2357
	MOVAB   W^ABT_ALL_FILE, R4		     ;ABT_ALL_FILE, R4							      ;
	MOVAB   W^ABT_CUR_FILE, R3		     ;ABT_CUR_FILE, R3							      ;
	MOVAB   W^U.53, R2			     ;U.53, R2								      ;
	MOVL    -12(R2), R0			     ;SIZE, R0								      ; 2405
	BGTR    1$				     ;1$								      ;
	BRW     11$				     ;11$								      ;
1$:	CMPL    -4(R2), W^PKT_RETRIES		     ;NUM_RETRIES, PKT_RETRIES						      ; 2412
	BLEQ    2$				     ;2$								      ;
	MOVL    #20, R0				     ;#20, R0								      ;
	RET     				     ;									      ;
2$:	INCL    -4(R2)				     ;NUM_RETRIES							      ; 2418
	PUSHL   (R2)				     ;MSG_NUMBER							      ; 2423
	PUSHL   R0				     ;R0								      ;
	MOVZBL  #68, -(SP)			     ;#68, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	BLBC    R0, 3$				     ;R0, 3$								      ;
	CALLS   #0, W^U.26			     ;#0, U.26								      ; 2428
	BLBS    R0, 4$				     ;STATUS, 4$							      ; 2430
	CMPL    R0, #134316234			     ;STATUS, #134316234						      ; 2434
	BEQL    7$				     ;7$								      ;
	CMPL    R0, #134316248			     ;STATUS, #134316248						      ;
	BEQL    7$				     ;7$								      ;
	CMPL    R0, #134316178			     ;STATUS, #134316178						      ;
	BEQL    7$				     ;7$								      ;
3$:	MOVL    #19, R0				     ;#19, R0								      ; 2439
	RET     				     ;									      ;
4$:	CLRL    R1				     ;R1								      ; 2449
	CMPL    12(R2), #78			     ;REC_TYPE, #78							      ;
	BNEQ    5$				     ;5$								      ;
	INCL    R1				     ;R1								      ;
	ADDL3   #1, (R2), R0			     ;#1, MSG_NUMBER, R0						      ;
	CMPZV   #0, #6, R0, 4(R2)		     ;#0, #6, R0, REC_SEQ						      ;
	BNEQ    7$				     ;7$								      ;
5$:	CMPL    12(R2), #89			     ;REC_TYPE, #89							      ; 2457
	BEQL    6$				     ;6$								      ;
	BLBS    R1, 6$				     ;R1, 6$								      ;
	PUSHL   #134316226			     ;#134316226							      ; 2463
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	MOVL    #10, R0				     ;#10, R0								      ; 2464
	RET     				     ;									      ;
6$:	CLRL    R0				     ;R0								      ; 2471
	CMPL    12(R2), #89			     ;REC_TYPE, #89							      ;
	BNEQ    8$				     ;8$								      ;
	INCL    R0				     ;R0								      ;
	CMPL    4(R2), (R2)			     ;REC_SEQ, MSG_NUMBER						      ;
	BEQL    8$				     ;8$								      ;
7$:	MOVL    -16(R2), R0			     ;STATE, R0								      ;
	RET     				     ;									      ;
8$:	BLBC    R0, 10$				     ;R0, 10$								      ; 2482
	CMPL    8(R2), #1			     ;REC_LENGTH, #1							      ;
	BNEQ    10$				     ;10$								      ;
	MOVZBL  20(R2), R0			     ;REC_MSG+4, R0							      ; 2485
	CMPB    R0, #88				     ;R0, #88								      ; 2488
	BNEQ    9$				     ;9$								      ;
	MOVL    #1, (R3)			     ;#1, ABT_CUR_FILE							      ; 2489
	BRB     10$				     ;10$								      ;
9$:	CMPB    R0, #90				     ;R0, #90								      ; 2491
	BNEQ    10$				     ;10$								      ;
	MOVL    #1, (R4)			     ;#1, ABT_ALL_FILE							      ; 2492
10$:	CLRL    -4(R2)				     ;NUM_RETRIES							      ; 2495
	ADDL3   #1, (R2), R0			     ;#1, MSG_NUMBER, R0						      ; 2496
	EXTZV   #0, #6, R0, (R2)		     ;#0, #6, R0, MSG_NUMBER						      ;
11$:	CLRL    -(SP)				     ;-(SP)								      ; 2499
	CALLS   #1, W^U.29			     ;#1, U.29								      ;
	CMPL    R0, #134316043			     ;R0, #134316043							      ;
	BNEQ    12$				     ;12$								      ;
	BLBS    (R3), 12$			     ;ABT_CUR_FILE, 12$							      ;
	BLBS    (R4), 12$			     ;ABT_ALL_FILE, 12$							      ;
	MOVL    #3, R0				     ;#3, R0								      ; 2503
	RET     				     ;									      ;
12$:	BLBS    W^CONNECT_FLAG, 16$		     ;CONNECT_FLAG, 16$							      ; 2505
	BLBC    W^TY_FIL, 16$			     ;TY_FIL, 16$							      ;
	BLBC    (R4), 13$			     ;ABT_ALL_FILE, 13$							      ; 2509
	PUSHAB  W^P.AAB				     ;P.AAB								      ; 2511
	BRB     15$				     ;15$								      ;
13$:	BLBC    (R3), 14$			     ;ABT_CUR_FILE, 14$							      ; 2514
	PUSHAB  W^P.AAC				     ;P.AAC								      ; 2516
	BRB     15$				     ;15$								      ;
14$:	PUSHAB  W^P.AAD				     ;P.AAD								      ; 2518
15$:	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 2520
16$:	BLBC    216(R2), 17$			     ;FILE_OPEN_FLAG, 17$						      ; 2523
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #1, W^FILE_CLOSE		     ;#1, FILE_CLOSE							      ;
17$:	MOVZBL  #67, R0				     ;#67, SUB_TYPE							      ; 2525
	BLBC    (R4), 18$			     ;ABT_ALL_FILE, 18$							      ; 2527
	MOVZBL  #90, R0				     ;#90, SUB_TYPE							      ; 2529
	BRB     19$				     ;19$								      ;
18$:	BLBC    (R3), 19$			     ;ABT_CUR_FILE, 19$							      ; 2532
	MOVZBL  #88, R0				     ;#88, SUB_TYPE							      ;
19$:	PUSHL   R0				     ;SUB_TYPE								      ; 2534
	MOVZBL  #70, -(SP)			     ;#70, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	CLRL    216(R2)				     ;FILE_OPEN_FLAG							      ; 2535
	MOVL    #4, R0				     ;#4, R0								      ; 2536
	RET     				     ;									      ; 2539

; Routine Size:  339 bytes,    Routine Base:  $CODE$ + 0625


;   2540  1	%SBTTL 'SEND_FILE'
;   2541  1	ROUTINE SEND_FILE =
;   2542  1	
;   2543  1	!++
;   2544  1	! FUNCTIONAL DESCRIPTION:
;   2545  1	!
;   2546  1	!	This routine will send the file specification that is being
;   2547  1	!	transfered, or it will send a text header message.
;   2548  1	!
;   2549  1	! CALLING SEQUENCE:
;   2550  1	!
;   2551  1	!	STATE = SEND_FILE();
;   2552  1	!
;   2553  1	! INPUT PARAMETERS:
;   2554  1	!
;   2555  1	!	None.
;   2556  1	!
;   2557  1	! IMPLICIT INPUTS:
;   2558  1	!
;   2559  1	!	TEXT_HEAD_FLAG - If true, send text header instead of file header
;   2560  1	!
;   2561  1	! OUTPUT PARAMETERS:
;   2562  1	!
;   2563  1	!	New state to change the finite state machine to.
;   2564  1	!
;   2565  1	! IMPLICIT OUTPUTS:
;   2566  1	!
;   2567  1	!	None.
;   2568  1	!
;   2569  1	! COMPLETION CODES:
;   2570  1	!
;   2571  1	!	None.
;   2572  1	!
;   2573  1	! SIDE EFFECTS:
;   2574  1	!
;   2575  1	!	None.
;   2576  1	!
;   2577  1	!--
;   2578  1	
;   2579  2	    BEGIN
;   2580  2	
;   2581  2	    LOCAL
;   2582  2		M_TYPE,					! Message type to send
;   2583  2		STATUS;					! Status returned by various routines
;   2584  2	
;   2585  2	!
;   2586  2	! Flag we don't want to abort yet
;   2587  2	!
;   2588  2	    ABT_CUR_FILE = FALSE;
;   2589  2	    ABT_ALL_FILE = FALSE;
;   2590  2	!
;   2591  2	! First determine if we have exceed the number of retries that are
;   2592  2	! allowed to attempt to send this message.
;   2593  2	!
;   2594  2	
;   2595  2	    IF .NUM_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER;
;   2596  2	
;   2597  2	!
;   2598  2	! The number of retries are not exceeded.  Increment the number and then
;   2599  2	! attempt to send the packet again.
;   2600  2	!
;   2601  2	    NUM_RETRIES = .NUM_RETRIES + 1;
;   2602  2	    SIZE = 0;					! Assume no name
;   2603  2	
;   2604  2	    IF .TEXT_HEAD_FLAG THEN M_TYPE = MSG_TEXT ELSE M_TYPE = MSG_FILE;
;   2605  2	
;   2606  2	    IF .FILE_SIZE NEQ 0 AND NOT .NO_FILE_NEEDED
;   2607  2	    THEN
;   2608  3		BEGIN
;   2609  3	![025]	CH$MOVE (.FILE_SIZE, CH$PTR (FILE_NAME),
;   2610  3	![025]	    CH$PTR (SND_MSG, PKT_MSG,
;   2611  3	![025]		CHR_SIZE));
;   2612  3	![025]
;   2613  3	![025] Fill packet with file name
;   2614  3	![025]
;   2615  3		SET_STRING (CH$PTR (FILE_NAME), .FILE_SIZE, TRUE);
;   2616  3		BFR_FILL (TRUE);
;   2617  3		SET_STRING (0, 0, FALSE);
;   2618  2		END;
;   2619  2	
;   2620  2	    IF NOT SEND_PACKET (.M_TYPE, .SIZE, .MSG_NUMBER) THEN RETURN STATE_EX;
;   2621  2	
;   2622  2	!
;   2623  2	! Now get the responce from the remote KERMIT.
;   2624  2	!
;   2625  2	    STATUS = REC_PACKET ();
;   2626  2	
;   2627  2	    IF NOT .STATUS
;   2628  2	    THEN
;   2629  3		BEGIN
;   2630  3	
;   2631  4		IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL KER_CHKSUMERR)
;   2632  3		THEN
;   2633  3		    RETURN .STATE
;   2634  3		ELSE
;   2635  3		    RETURN STATE_EX;
;   2636  3	
;   2637  2		END;
;   2638  2	
;   2639  2	!
;   2640  2	! Determine if the packet is good.
;   2641  2	!
;   2642  2	
;   2643  3	    IF NOT (.REC_TYPE EQL MSG_ACK OR .REC_TYPE EQL MSG_NAK)
;   2644  2	    THEN
;   2645  3		BEGIN
;   2646  3		KRM_ERROR (KER_PROTOERR);
;   2647  3		RETURN STATE_A;
;   2648  2		END;
;   2649  2	
;   2650  2	!
;   2651  2	! If this is a NAK and the message number is not the one we just send
;   2652  2	! treat this like an ACK, otherwise resend the last packet.
;   2653  2	!
;   2654  2	
;   2655  2	    IF .REC_TYPE EQL MSG_NAK AND (.REC_SEQ NEQ ((.MSG_NUMBER + 1) AND %O'77')) THEN RETURN .STATE;
;   2656  2	
;   2657  2	    IF .REC_TYPE EQL MSG_ACK AND .REC_SEQ NEQ .MSG_NUMBER THEN RETURN .STATE;
;   2658  2	
;   2659  2	!
;   2660  2	! If all is ok, bump the message number and fill first buffer
;   2661  2	!
;   2662  2	    NUM_RETRIES = 0;
;   2663  2	    MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   2664  2	
;   2665  2	    IF BFR_FILL (TRUE) THEN RETURN STATE_SD ELSE RETURN STATE_A;
;   2666  2	
;   2667  1	    END;					! End of SEND_FILE





;SEND_FILE
U.4:	.WORD   ^M<R2,R3>			     ;Save R2,R3							      ; 2541
	MOVAB   W^U.53, R3			     ;U.53, R3								      ;
	CLRL    W^ABT_CUR_FILE			     ;ABT_CUR_FILE							      ; 2588
	CLRL    W^ABT_ALL_FILE			     ;ABT_ALL_FILE							      ; 2589
	CMPL    -4(R3), W^PKT_RETRIES		     ;NUM_RETRIES, PKT_RETRIES						      ; 2595
	BLEQ    1$				     ;1$								      ;
	MOVL    #20, R0				     ;#20, R0								      ;
	RET     				     ;									      ;
1$:	INCL    -4(R3)				     ;NUM_RETRIES							      ; 2601
	CLRL    -12(R3)				     ;SIZE								      ; 2602
	BLBC    224(R3), 2$			     ;TEXT_HEAD_FLAG, 2$						      ; 2604
	MOVZBL  #88, R2				     ;#88, M_TYPE							      ;
	BRB     3$				     ;3$								      ;
2$:	MOVZBL  #70, R2				     ;#70, M_TYPE							      ;
3$:	MOVL    W^FILE_SIZE, R0			     ;FILE_SIZE, R0							      ; 2606
	BEQL    4$				     ;4$								      ;
	BLBS    228(R3), 4$			     ;NO_FILE_NEEDED, 4$						      ;
	PUSHL   #1				     ;#1								      ; 2615
	PUSHL   R0				     ;R0								      ;
	PUSHAB  W^FILE_NAME			     ;FILE_NAME								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	PUSHL   #1				     ;#1								      ; 2616
	CALLS   #1, W^U.29			     ;#1, U.29								      ;
	CLRQ    -(SP)				     ;-(SP)								      ; 2617
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
4$:	PUSHL   (R3)				     ;MSG_NUMBER							      ; 2620
	PUSHL   -12(R3)				     ;SIZE								      ;
	PUSHL   R2				     ;M_TYPE								      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	BLBC    R0, 5$				     ;R0, 5$								      ;
	CALLS   #0, W^U.26			     ;#0, U.26								      ; 2625
	BLBS    R0, 6$				     ;STATUS, 6$							      ; 2627
	CMPL    R0, #134316234			     ;STATUS, #134316234						      ; 2631
	BEQL    9$				     ;9$								      ;
	CMPL    R0, #134316248			     ;STATUS, #134316248						      ;
	BEQL    9$				     ;9$								      ;
	CMPL    R0, #134316178			     ;STATUS, #134316178						      ;
	BEQL    9$				     ;9$								      ;
5$:	MOVL    #19, R0				     ;#19, R0								      ; 2635
	RET     				     ;									      ;
6$:	CMPL    12(R3), #89			     ;REC_TYPE, #89							      ; 2643
	BEQL    7$				     ;7$								      ;
	CMPL    12(R3), #78			     ;REC_TYPE, #78							      ;
	BEQL    7$				     ;7$								      ;
	PUSHL   #134316226			     ;#134316226							      ; 2646
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	BRB     11$				     ;11$								      ; 2647
7$:	CMPL    12(R3), #78			     ;REC_TYPE, #78							      ; 2655
	BNEQ    8$				     ;8$								      ;
	ADDL3   #1, (R3), R0			     ;#1, MSG_NUMBER, R0						      ;
	CMPZV   #0, #6, R0, 4(R3)		     ;#0, #6, R0, REC_SEQ						      ;
	BNEQ    9$				     ;9$								      ;
8$:	CMPL    12(R3), #89			     ;REC_TYPE, #89							      ; 2657
	BNEQ    10$				     ;10$								      ;
	CMPL    4(R3), (R3)			     ;REC_SEQ, MSG_NUMBER						      ;
	BEQL    10$				     ;10$								      ;
9$:	MOVL    -16(R3), R0			     ;STATE, R0								      ;
	RET     				     ;									      ;
10$:	CLRL    -4(R3)				     ;NUM_RETRIES							      ; 2662
	ADDL3   #1, (R3), R0			     ;#1, MSG_NUMBER, R0						      ; 2663
	EXTZV   #0, #6, R0, (R3)		     ;#0, #6, R0, MSG_NUMBER						      ;
	PUSHL   #1				     ;#1								      ; 2665
	CALLS   #1, W^U.29			     ;#1, U.29								      ;
	BLBC    R0, 11$				     ;R0, 11$								      ;
	MOVL    #3, R0				     ;#3, R0								      ;
	RET     				     ;									      ;
11$:	MOVL    #10, R0				     ;#10, R0								      ;
	RET     				     ;									      ; 2667

; Routine Size:  249 bytes,    Routine Base:  $CODE$ + 0778


;   2668  1	%SBTTL 'SEND_EOF'
;   2669  1	ROUTINE SEND_EOF =
;   2670  1	
;   2671  1	!++
;   2672  1	! FUNCTIONAL DESCRIPTION:
;   2673  1	!
;   2674  1	!	This routine will send the end of file message to the remote
;   2675  1	!	KERMIT.  It will then determine if there are more files to
;   2676  1	!	send to the remote.
;   2677  1	!
;   2678  1	! CALLING SEQUENCE:
;   2679  1	!
;   2680  1	!	STATE = SEND_EOF();
;   2681  1	!
;   2682  1	! INPUT PARAMETERS:
;   2683  1	!
;   2684  1	!	None.
;   2685  1	!
;   2686  1	! IMPLICIT INPUTS:
;   2687  1	!
;   2688  1	!	None.
;   2689  1	!
;   2690  1	! OUTPUT PARAMETERS:
;   2691  1	!
;   2692  1	!	New state to change the finite state machine to.
;   2693  1	!
;   2694  1	! IMPLICIT OUTPUTS:
;   2695  1	!
;   2696  1	!	None.
;   2697  1	!
;   2698  1	! COMPLETION CODES:
;   2699  1	!
;   2700  1	!	None.
;   2701  1	!
;   2702  1	! SIDE EFFECTS:
;   2703  1	!
;   2704  1	!	Sets up for the next file to be processed if there is one.
;   2705  1	!
;   2706  1	!--
;   2707  1	
;   2708  2	    BEGIN
;   2709  2	
;   2710  2	    LOCAL
;   2711  2		STATUS,					! Status returned by various routines
;   2712  2		EOF_MSG_LEN;				! Length of EOF message to send
;   2713  2	
;   2714  2	!
;   2715  2	! First determine if we have exceed the number of retries that are
;   2716  2	! allowed to attempt to send this message.
;   2717  2	!
;   2718  2	
;   2719  2	    IF .NUM_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER;
;   2720  2	
;   2721  2	!
;   2722  2	! The number of retries are not exceeded.  Increment the number and then
;   2723  2	! attempt to send the packet again.
;   2724  2	!
;   2725  2	    NUM_RETRIES = .NUM_RETRIES + 1;
;   2726  2	!
;   2727  2	! Store character in packet to indicate discard of file
;   2728  2	! Character will only be sent if file should be discarded
;   2729  2	!
;   2730  2	    CH$WCHAR (MSG_EOF_DISCARD, CH$PTR (SND_MSG, PKT_MSG, CHR_SIZE));
;   2731  2	
;   2732  2	    IF .ABT_CUR_FILE OR .ABT_ALL_FILE THEN EOF_MSG_LEN = 1 ELSE EOF_MSG_LEN = 0;
;   2733  2	
;   2734  2	    IF NOT SEND_PACKET (MSG_EOF, .EOF_MSG_LEN, .MSG_NUMBER) THEN RETURN STATE_EX;
;   2735  2	
;   2736  2	!
;   2737  2	! Now get the responce from the remote KERMIT.
;   2738  2	!
;   2739  2	    STATUS = REC_PACKET ();
;   2740  2	
;   2741  2	    IF NOT .STATUS
;   2742  2	    THEN
;   2743  3		BEGIN
;   2744  3	
;   2745  4		IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL KER_CHKSUMERR)
;   2746  3		THEN
;   2747  3		    RETURN .STATE
;   2748  3		ELSE
;   2749  3		    RETURN STATE_EX;
;   2750  3	
;   2751  2		END;
;   2752  2	
;   2753  2	!
;   2754  2	! Determine if the packet is good.
;   2755  2	!
;   2756  2	
;   2757  3	    IF NOT (.REC_TYPE EQL MSG_ACK OR .REC_TYPE EQL MSG_NAK)
;   2758  2	    THEN
;   2759  3		BEGIN
;   2760  3		KRM_ERROR (KER_PROTOERR);
;   2761  3		RETURN STATE_A;
;   2762  2		END;
;   2763  2	
;   2764  2	!
;   2765  2	! If this is a NAK and the message number is not the one we just send
;   2766  2	! treat this like an ACK, otherwise resend the last packet.
;   2767  2	!
;   2768  2	
;   2769  2	    IF .REC_TYPE EQL MSG_NAK AND (.REC_SEQ NEQ ((.MSG_NUMBER + 1) AND %O'77')) THEN RETURN .STATE;
;   2770  2	
;   2771  2	    IF .REC_TYPE EQL MSG_ACK AND .REC_SEQ NEQ .MSG_NUMBER THEN RETURN .STATE;
;   2772  2	
;   2773  2	!
;   2774  2	! Here to determine if there is another file to send.
;   2775  2	!
;   2776  2	    NUM_RETRIES = 0;
;   2777  2	    MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   2778  2	
;   2779  2	    IF NOT .ABT_ALL_FILE THEN STATUS = NEXT_FILE () ELSE STATUS = KER_NOMORFILES;
;   2780  2	
;   2781  3	    IF ( NOT .STATUS) OR (.STATUS EQL KER_NOMORFILES)
;   2782  2	    THEN
;   2783  3		BEGIN
;   2784  3	
;   2785  3		IF (.STATUS NEQ KER_NOMORFILES) THEN RETURN STATE_A ELSE RETURN STATE_SB;
;   2786  3	
;   2787  3		END
;   2788  2	    ELSE
;   2789  3		BEGIN
;   2790  3		FILE_OPEN_FLAG = TRUE;			! Have a file open again
;   2791  3	
;   2792  3		IF .FIL_NORMAL_FORM THEN NORMALIZE_FILE (FILE_NAME, FILE_SIZE, -1, -1);
;   2793  3	
;   2794  3		XFR_STATUS (%C'F', %C'S');		! Inform display routine
;   2795  3	
;   2796  3		IF ( NOT .CONNECT_FLAG) AND .TY_FIL
;   2797  3		THEN
;   2798  4		    BEGIN
;   2799  4	!![045]	    TT_TEXT (UPLIT (%ASCIZ'Sending: '));
;   2800  4		    TT_TEXT (FILE_NAME);
;   2801  4		    TT_OUTPUT ();
;   2802  3		    END;
;   2803  3	
;   2804  3		FILE_CHARS = 0;				! No characters sent yet
;   2805  3		RETURN STATE_SF;
;   2806  2		END;
;   2807  2	
;   2808  1	    END;					! End of SEND_EOF





;SEND_EOF
U.7:	.WORD   ^M<R2,R3>			     ;Save R2,R3							      ; 2669
	MOVAB   W^U.53, R3			     ;U.53, R3								      ;
	CMPL    -4(R3), W^PKT_RETRIES		     ;NUM_RETRIES, PKT_RETRIES						      ; 2719
	BLEQ    1$				     ;1$								      ;
	MOVL    #20, R0				     ;#20, R0								      ;
	RET     				     ;									      ;
1$:	INCL    -4(R3)				     ;NUM_RETRIES							      ; 2725
	MOVB    #68, 120(R3)			     ;#68, SND_MSG+4							      ; 2730
	BLBS    W^ABT_CUR_FILE, 2$		     ;ABT_CUR_FILE, 2$							      ; 2732
	BLBC    W^ABT_ALL_FILE, 3$		     ;ABT_ALL_FILE, 3$							      ;
2$:	MOVL    #1, R0				     ;#1, EOF_MSG_LEN							      ;
	BRB     4$				     ;4$								      ;
3$:	CLRL    R0				     ;EOF_MSG_LEN							      ;
4$:	PUSHL   (R3)				     ;MSG_NUMBER							      ; 2734
	PUSHL   R0				     ;EOF_MSG_LEN							      ;
	MOVZBL  #90, -(SP)			     ;#90, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	BLBC    R0, 5$				     ;R0, 5$								      ;
	CALLS   #0, W^U.26			     ;#0, U.26								      ; 2739
	MOVL    R0, R2				     ;R0, STATUS							      ;
	BLBS    R2, 6$				     ;STATUS, 6$							      ; 2741
	CMPL    R2, #134316234			     ;STATUS, #134316234						      ; 2745
	BEQL    9$				     ;9$								      ;
	CMPL    R2, #134316248			     ;STATUS, #134316248						      ;
	BEQL    9$				     ;9$								      ;
	CMPL    R2, #134316178			     ;STATUS, #134316178						      ;
	BEQL    9$				     ;9$								      ;
5$:	MOVL    #19, R0				     ;#19, R0								      ; 2749
	RET     				     ;									      ;
6$:	CMPL    12(R3), #89			     ;REC_TYPE, #89							      ; 2757
	BEQL    7$				     ;7$								      ;
	CMPL    12(R3), #78			     ;REC_TYPE, #78							      ;
	BEQL    7$				     ;7$								      ;
	PUSHL   #134316226			     ;#134316226							      ; 2760
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	BRB     14$				     ;14$								      ; 2761
7$:	CMPL    12(R3), #78			     ;REC_TYPE, #78							      ; 2769
	BNEQ    8$				     ;8$								      ;
	ADDL3   #1, (R3), R0			     ;#1, MSG_NUMBER, R0						      ;
	CMPZV   #0, #6, R0, 4(R3)		     ;#0, #6, R0, REC_SEQ						      ;
	BNEQ    9$				     ;9$								      ;
8$:	CMPL    12(R3), #89			     ;REC_TYPE, #89							      ; 2771
	BNEQ    10$				     ;10$								      ;
	CMPL    4(R3), (R3)			     ;REC_SEQ, MSG_NUMBER						      ;
	BEQL    10$				     ;10$								      ;
9$:	MOVL    -16(R3), R0			     ;STATE, R0								      ;
	RET     				     ;									      ;
10$:	CLRL    -4(R3)				     ;NUM_RETRIES							      ; 2776
	ADDL3   #1, (R3), R0			     ;#1, MSG_NUMBER, R0						      ; 2777
	EXTZV   #0, #6, R0, (R3)		     ;#0, #6, R0, MSG_NUMBER						      ;
	BLBS    W^ABT_ALL_FILE, 11$		     ;ABT_ALL_FILE, 11$							      ; 2779
	CALLS   #0, W^NEXT_FILE			     ;#0, NEXT_FILE							      ;
	MOVL    R0, R2				     ;R0, STATUS							      ;
	BRB     12$				     ;12$								      ;
11$:	MOVL    #134316147, R2			     ;#134316147, STATUS						      ;
12$:	BLBC    R2, 13$				     ;STATUS, 13$							      ; 2781
	CMPL    R2, #134316147			     ;STATUS, #134316147						      ;
	BNEQ    16$				     ;16$								      ;
13$:	CMPL    R2, #134316147			     ;STATUS, #134316147						      ; 2785
	BEQL    15$				     ;15$								      ;
14$:	MOVL    #10, R0				     ;#10, R0								      ;
	RET     				     ;									      ;
15$:	MOVL    #5, R0				     ;#5, R0								      ;
	RET     				     ;									      ; 2789
16$:	MOVL    #1, 216(R3)			     ;#1, FILE_OPEN_FLAG						      ; 2790
	BLBC    W^FIL_NORMAL_FORM, 17$		     ;FIL_NORMAL_FORM, 17$						      ; 2792
	MNEGL   #1, -(SP)			     ;#1, -(SP)								      ;
	MNEGL   #1, -(SP)			     ;#1, -(SP)								      ;
	PUSHAB  W^FILE_SIZE			     ;FILE_SIZE								      ;
	PUSHAB  W^FILE_NAME			     ;FILE_NAME								      ;
	CALLS   #4, W^U.27			     ;#4, U.27								      ;
17$:	MOVZBL  #83, -(SP)			     ;#83, -(SP)							      ; 2794
	MOVZBL  #70, -(SP)			     ;#70, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	BLBS    W^CONNECT_FLAG, 18$		     ;CONNECT_FLAG, 18$							      ; 2796
	BLBC    W^TY_FIL, 18$			     ;TY_FIL, 18$							      ;
	PUSHAB  W^FILE_NAME			     ;FILE_NAME								      ; 2800
	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_OUTPUT			     ;#0, TT_OUTPUT							      ; 2801
18$:	CLRL    220(R3)				     ;FILE_CHARS							      ; 2804
	MOVL    #2, R0				     ;#2, R0								      ; 2805
	RET     				     ;									      ; 2808

; Routine Size:  315 bytes,    Routine Base:  $CODE$ + 0871


;   2809  1	%SBTTL 'SEND_INIT'
;   2810  1	ROUTINE SEND_INIT =
;   2811  1	
;   2812  1	!++
;   2813  1	! FUNCTIONAL DESCRIPTION:
;   2814  1	!
;   2815  1	!	This routine will send the initialization packet to the remote
;   2816  1	!	KERMIT.  The message type sent is S.
;   2817  1	!
;   2818  1	! CALLING SEQUENCE:
;   2819  1	!
;   2820  1	!	STATE = SEND_INIT();
;   2821  1	!
;   2822  1	! INPUT PARAMETERS:
;   2823  1	!
;   2824  1	!	None.
;   2825  1	!
;   2826  1	! IMPLICIT INPUTS:
;   2827  1	!
;   2828  1	!	None.
;   2829  1	!
;   2830  1	! OUTPUT PARAMETERS:
;   2831  1	!
;   2832  1	!	New state to change the finite state machine to.
;   2833  1	!
;   2834  1	! IMPLICIT OUTPUTS:
;   2835  1	!
;   2836  1	!	None.
;   2837  1	!
;   2838  1	! COMPLETION CODES:
;   2839  1	!
;   2840  1	!	None.
;   2841  1	!
;   2842  1	! SIDE EFFECTS:
;   2843  1	!
;   2844  1	!	None.
;   2845  1	!
;   2846  1	!--
;   2847  1	
;   2848  2	    BEGIN
;   2849  2	
;   2850  2	    LOCAL
;   2851  2		STATUS;					! Status returned by various routines
;   2852  2	
;   2853  2	    SET_SEND_INIT ();
;   2854  2	
;   2855  2	    IF .NUM_RETRIES GTR .SI_RETRIES THEN RETURN STATE_ER;
;   2856  2	
;   2857  2	!
;   2858  2	! Count the number of times we try this
;   2859  2	!
;   2860  2	    NUM_RETRIES = .NUM_RETRIES + 1;
;   2861  2	
;   2862  2	    IF NOT SEND_PACKET (MSG_SND_INIT, P_SI_LENGTH, .MSG_NUMBER) THEN RETURN STATE_EX;
;   2863  2	
;   2864  2	!
;   2865  2	! Determine if we received a packet it good condition.  If we timed out or
;   2866  2	! got an illegal message, just try again.
;   2867  2	!
;   2868  2	    STATUS = REC_PACKET ();
;   2869  2	
;   2870  2	    IF NOT .STATUS
;   2871  2	    THEN
;   2872  3		BEGIN
;   2873  3	
;   2874  4		IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL KER_CHKSUMERR)
;   2875  3		THEN
;   2876  3		    RETURN .STATE
;   2877  3		ELSE
;   2878  3		    RETURN STATE_EX;
;   2879  3	
;   2880  2		END;
;   2881  2	
;   2882  2	!
;   2883  2	! Determine if the packet is good.
;   2884  2	!
;   2885  2	
;   2886  2	    IF .REC_TYPE NEQ MSG_ACK THEN RETURN .STATE;
;   2887  2	
;   2888  2	    IF .REC_SEQ NEQ .MSG_NUMBER THEN RETURN .STATE;
;   2889  2	
;   2890  2	!
;   2891  2	! Here if we have an ACK for the initialization message that was just sent
;   2892  2	! to the remote KERMIT.
;   2893  2	!
;   2894  2	
;   2895  2	    IF NOT (STATUS = PRS_SEND_INIT ()) THEN RETURN STATE_A;
;   2896  2	
;   2897  2	    BLK_CHK_TYPE = .INI_CHK_TYPE;		! We now use agreed upon block check type
;   2898  2	    NUM_RETRIES = 0;
;   2899  2	    MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   2900  2	    RETURN STATE_OF;				! Now need to open the file
;   2901  1	    END;





;SEND_INIT
U.8:	.WORD   ^M<R2>				     ;Save R2								      ; 2810
	MOVAB   W^U.53, R2			     ;U.53, R2								      ;
	CALLS   #0, W^U.20			     ;#0, U.20								      ; 2853
	CMPL    -4(R2), W^SI_RETRIES		     ;NUM_RETRIES, SI_RETRIES						      ; 2855
	BLEQ    1$				     ;1$								      ;
	MOVL    #20, R0				     ;#20, R0								      ;
	RET     				     ;									      ;
1$:	INCL    -4(R2)				     ;NUM_RETRIES							      ; 2860
	PUSHL   (R2)				     ;MSG_NUMBER							      ; 2862
	PUSHL   #9				     ;#9								      ;
	MOVZBL  #83, -(SP)			     ;#83, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	BLBS    R0, 2$				     ;R0, 2$								      ;
	MOVL    #19, R0				     ;#19, R0								      ;
	RET     				     ;									      ;
2$:	CALLS   #0, W^U.26			     ;#0, U.26								      ; 2868
	BLBS    R0, 6$				     ;STATUS, 6$							      ; 2870
	CMPL    R0, #134316234			     ;STATUS, #134316234						      ; 2874
	BEQL    3$				     ;3$								      ;
	CMPL    R0, #134316248			     ;STATUS, #134316248						      ;
	BEQL    3$				     ;3$								      ;
	CMPL    R0, #134316178			     ;STATUS, #134316178						      ;
	BNEQ    4$				     ;4$								      ;
3$:	MOVL    -16(R2), R1			     ;STATE, R1								      ; 2878
	BRB     5$				     ;5$								      ;
4$:	MOVL    #19, R1				     ;#19, R1								      ;
5$:	MOVL    R1, R0				     ;R1, R0								      ;
	RET     				     ;									      ;
6$:	CMPL    12(R2), #89			     ;REC_TYPE, #89							      ; 2886
	BNEQ    7$				     ;7$								      ;
	CMPL    4(R2), (R2)			     ;REC_SEQ, MSG_NUMBER						      ; 2888
	BEQL    8$				     ;8$								      ;
7$:	MOVL    -16(R2), R0			     ;STATE, R0								      ;
	RET     				     ;									      ;
8$:	CALLS   #0, W^U.21			     ;#0, U.21								      ; 2895
	BLBS    R0, 9$				     ;STATUS, 9$							      ;
	MOVL    #10, R0				     ;#10, R0								      ;
	RET     				     ;									      ;
9$:	MOVL    -32(R2), -28(R2)		     ;INI_CHK_TYPE, BLK_CHK_TYPE					      ; 2897
	CLRL    -4(R2)				     ;NUM_RETRIES							      ; 2898
	ADDL3   #1, (R2), R0			     ;#1, MSG_NUMBER, R0						      ; 2899
	EXTZV   #0, #6, R0, (R2)		     ;#0, #6, R0, MSG_NUMBER						      ;
	MOVL    #18, R0				     ;#18, R0								      ; 2900
	RET     				     ;									      ; 2901

; Routine Size:  149 bytes,    Routine Base:  $CODE$ + 09AC


;   2902  1	%SBTTL 'SEND_OPEN_FILE - Open file for sending'
;   2903  1	ROUTINE SEND_OPEN_FILE =
;   2904  1	
;   2905  1	!++
;   2906  1	! FUNCTIONAL DESCRIPTION:
;   2907  1	!
;   2908  1	! This routine is called from DO_TRANSACTION when the first input file
;   2909  1	! needs to be opened.
;   2910  1	!
;   2911  1	! CALLING SEQUENCE:
;   2912  1	!
;   2913  1	!	STATE = SEND_OPEN_FILE ();
;   2914  1	!
;   2915  1	! INPUT PARAMETERS:
;   2916  1	!
;   2917  1	!	None.
;   2918  1	!
;   2919  1	! IMPLICIT INPUTS:
;   2920  1	!
;   2921  1	!	FILE_NAME, FILE_SIZE, etc.
;   2922  1	!
;   2923  1	! OUPTUT PARAMETERS:
;   2924  1	!
;   2925  1	!	New state for FSM.
;   2926  1	!
;   2927  1	! IMPLICIT OUTPUTS:
;   2928  1	!
;   2929  1	!	None.
;   2930  1	!
;   2931  1	! COMPLETION CODES:
;   2932  1	!
;   2933  1	!	None.
;   2934  1	!
;   2935  1	! SIDE EFFECTS:
;   2936  1	!
;   2937  1	!	None.
;   2938  1	!
;   2939  1	!--
;   2940  1	
;   2941  2	    BEGIN
;   2942  2	
;   2943  2	    IF ( NOT .CONNECT_FLAG) AND .TY_FIL
;   2944  2	    THEN
;   2945  3		BEGIN
;   2946  3		TT_TEXT (UPLIT (%ASCIZ'Sending: '));
;   2947  3		TT_OUTPUT ();
;   2948  2		END;
;   2949  2	
;   2950  2	    FILE_CHARS = 0;				! No characters sent yet
;   2951  2	
;   2952  2	    IF NOT .NO_FILE_NEEDED
;   2953  2	    THEN
;   2954  2	
;   2955  2		IF NOT FILE_OPEN (FNC_READ) THEN RETURN STATE_A ELSE FILE_OPEN_FLAG = TRUE;
;   2956  2	
;   2957  2	![023]
;   2958  2	![023] If we want normalized file names, beat up the name now
;   2959  2	![023]
;   2960  2	
;   2961  2	    IF .FIL_NORMAL_FORM THEN NORMALIZE_FILE (FILE_NAME, FILE_SIZE, -1, -1);
;   2962  2	
;   2963  2	    XFR_STATUS (%C'F', %C'S');			! Inform display routine
;   2964  2	
;   2965  2	    IF ( NOT .CONNECT_FLAG) AND .TY_FIL
;   2966  2	    THEN
;   2967  3		BEGIN
;   2968  3		TT_TEXT (FILE_NAME);
;   2969  3		TT_OUTPUT ();
;   2970  2		END;
;   2971  2	
;   2972  2	    RETURN STATE_SF;
;   2973  1	    END;					! End of FSM_OPEN_FILE



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.AAE:	.ASCII  \Sending: \<0><0><0>		     ;									      ;



	.PSECT  $CODE$,NOWRT,2

;SEND_OPEN_FILE
U.5:	.WORD   ^M<>				     ;Save nothing							      ; 2903
	BLBS    W^CONNECT_FLAG, 1$		     ;CONNECT_FLAG, 1$							      ; 2943
	BLBC    W^TY_FIL, 1$			     ;TY_FIL, 1$							      ;
	PUSHAB  W^P.AAE				     ;P.AAE								      ; 2946
	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_OUTPUT			     ;#0, TT_OUTPUT							      ; 2947
1$:	CLRL    W^U.60				     ;U.60								      ; 2950
	BLBS    W^U.62, 3$			     ;U.62, 3$								      ; 2952
	CLRL    -(SP)				     ;-(SP)								      ; 2955
	CALLS   #1, W^FILE_OPEN			     ;#1, FILE_OPEN							      ;
	BLBS    R0, 2$				     ;R0, 2$								      ;
	MOVL    #10, R0				     ;#10, R0								      ;
	RET     				     ;									      ;
2$:	MOVL    #1, W^U.59			     ;#1, U.59								      ;
3$:	BLBC    W^FIL_NORMAL_FORM, 4$		     ;FIL_NORMAL_FORM, 4$						      ; 2961
	MNEGL   #1, -(SP)			     ;#1, -(SP)								      ;
	MNEGL   #1, -(SP)			     ;#1, -(SP)								      ;
	PUSHAB  W^FILE_SIZE			     ;FILE_SIZE								      ;
	PUSHAB  W^FILE_NAME			     ;FILE_NAME								      ;
	CALLS   #4, W^U.27			     ;#4, U.27								      ;
4$:	MOVZBL  #83, -(SP)			     ;#83, -(SP)							      ; 2963
	MOVZBL  #70, -(SP)			     ;#70, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	BLBS    W^CONNECT_FLAG, 5$		     ;CONNECT_FLAG, 5$							      ; 2965
	BLBC    W^TY_FIL, 5$			     ;TY_FIL, 5$							      ;
	PUSHAB  W^FILE_NAME			     ;FILE_NAME								      ; 2968
	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_OUTPUT			     ;#0, TT_OUTPUT							      ; 2969
5$:	MOVL    #2, R0				     ;#2, R0								      ; 2972
	RET     				     ;									      ; 2973

; Routine Size:  119 bytes,    Routine Base:  $CODE$ + 0A41


;   2974  1	%SBTTL 'SEND_GENCMD'
;   2975  1	ROUTINE SEND_GENCMD =
;   2976  1	
;   2977  1	!++
;   2978  1	! FUNCTIONAL DESCRIPTION:
;   2979  1	!
;   2980  1	!	This routine will send a command packet to the server Kermit.
;   2981  1	!	The new state will depend upon the response.  If a send-init
;   2982  1	!	is received, it will process it and switch to STATE_RF.
;   2983  1	!	If a text-header is received it will switch to STATE_RD.
;   2984  1	!	If an ACK is received, it will type the data portion and
;   2985  1	!	switch to STATE_C.
;   2986  1	!
;   2987  1	! CALLING SEQUENCE:
;   2988  1	!
;   2989  1	!	STATE = SEND_GENCMD();
;   2990  1	!
;   2991  1	! INPUT PARAMETERS:
;   2992  1	!
;   2993  1	!	None.
;   2994  1	!
;   2995  1	! IMPLICIT INPUTS:
;   2996  1	!
;   2997  1	!	GEN_TYPE - Message type to send (normally MSG_GENERIC)
;   2998  1	!	GEN_SUBTYPE - Message subtype (only if MSG_GENERIC)
;   2999  1	!	GEN_1DATA - First argument string
;   3000  1	!	GEN_1SIZE - Size of first argument
;   3001  1	!	GEN_2DATA - Second argument string
;   3002  1	!	GEN_2SIZE - Size of second argument
;   3003  1	!	GEN_3DATA - Third argument string
;   3004  1	!	GEN_3SIZE - Size of third argument
;   3005  1	!
;   3006  1	! OUTPUT PARAMETERS:
;   3007  1	!
;   3008  1	!	New state for the finite state machine.
;   3009  1	!
;   3010  1	! IMPLICIT OUTPUTS:
;   3011  1	!
;   3012  1	!	None.
;   3013  1	!
;   3014  1	! COMPLETION CODES:
;   3015  1	!
;   3016  1	!	None.
;   3017  1	!
;   3018  1	! SIDE EFFECTS:
;   3019  1	!
;   3020  1	!	None.
;   3021  1	!
;   3022  1	!--
;   3023  1	
;   3024  2	    BEGIN
;   3025  2	
;   3026  2	    LOCAL
;   3027  2		POINTER,				! Pointer at DATA_TEXT
;   3028  2		DATA_TEXT : VECTOR [CH$ALLOCATION (MAX_MSG)],	! Data buffer
;   3029  2		DATA_SIZE,				! Length of data buffer used
;   3030  2		STATUS;					! Status returned by various routines
;   3031  2	
;   3032  2	    ROUTINE PACK_DATA (POINTER, LENGTH, SRC_ADDR, SRC_LEN) =
;   3033  2	!
;   3034  2	! Routine to pack an argument into the buffer.
;   3035  2	!
;   3036  3		BEGIN
;   3037  3	
;   3038  3		IF .SRC_LEN GTR MAX_MSG - .LENGTH - 1 THEN SRC_LEN = MAX_MSG - .LENGTH - 1;
;   3039  3	
;   3040  3		LENGTH = .LENGTH + .SRC_LEN + 1;
;   3041  3		CH$WCHAR_A (CHAR (.SRC_LEN), .POINTER);
;   3042  3		.POINTER = CH$MOVE (.SRC_LEN, CH$PTR (.SRC_ADDR), ..POINTER);
;   3043  3		RETURN .LENGTH;
;   3044  2		END;





;PACK_DATA
U.75:	.WORD   ^M<R2,R3,R4,R5>			     ;Save R2,R3,R4,R5							      ; 3032
	SUBL3   #95, 8(AP), R1			     ;#95, LENGTH, R1							      ; 3038
	MNEGL   R1, R0				     ;R1, R0								      ;
	CMPL    16(AP), R0			     ;SRC_LEN, R0							      ;
	BLEQ    1$				     ;1$								      ;
	MNEGL   R1, 16(AP)			     ;R1, SRC_LEN							      ;
1$:	ADDL3   16(AP), 8(AP), R0		     ;SRC_LEN, LENGTH, R0						      ; 3040
	MOVAB   1(R0), 8(AP)			     ;1(R0), LENGTH							      ;
	MOVL    4(AP), R0			     ;POINTER, R0							      ; 3041
	ADDB3   #32, 16(AP), @0(R0)		     ;#32, SRC_LEN, @0(R0)						      ;
	INCL    (R0)				     ;(R0)								      ;
	MOVL    @4(AP), R0			     ;@POINTER, R0							      ; 3042
	MOVC3   16(AP), @12(AP), (R0)		     ;SRC_LEN, @SRC_ADDR, (R0)						      ;
	MOVL    R3, @4(AP)			     ;R3, @POINTER							      ;
	MOVL    8(AP), R0			     ;LENGTH, R0							      ; 3043
	RET     				     ;									      ; 3044

; Routine Size:  66 bytes,    Routine Base:  $CODE$ + 0AB8


;   3045  2	!
;   3046  2	! First determine if we have exceed the number of retries that are
;   3047  2	! allowed to attempt to send this message.
;   3048  2	!
;   3049  2	
;   3050  2	    IF .NUM_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER;
;   3051  2	
;   3052  2	!
;   3053  2	! The number of retries are not exceeded.  Increment the number and then
;   3054  2	! attempt to send the packet again.
;   3055  2	!
;   3056  2	    NUM_RETRIES = .NUM_RETRIES + 1;
;   3057  2	!
;   3058  2	! Build the packet data field
;   3059  2	!
;   3060  2	    POINTER = CH$PTR (DATA_TEXT);
;   3061  2	    DATA_SIZE = 0;
;   3062  2	
;   3063  2	    IF .GEN_TYPE EQL MSG_GENERIC
;   3064  2	    THEN
;   3065  3		BEGIN
;   3066  3		CH$WCHAR_A (.GEN_SUBTYPE, POINTER);
;   3067  3		DATA_SIZE = 1;
;   3068  3	
;   3069  3		IF .GEN_1SIZE GTR 0 OR .GEN_2SIZE GTR 0 OR .GEN_3SIZE GTR 0
;   3070  3		THEN
;   3071  4		    BEGIN
;   3072  4		    DATA_SIZE = PACK_DATA (POINTER, .DATA_SIZE, GEN_1DATA, .GEN_1SIZE);
;   3073  4	
;   3074  4		    IF .GEN_2SIZE GTR 0 OR .GEN_3SIZE GTR 0
;   3075  4		    THEN
;   3076  5			BEGIN
;   3077  5			DATA_SIZE = PACK_DATA (POINTER, .DATA_SIZE, GEN_2DATA, .GEN_2SIZE);
;   3078  5	
;   3079  5			IF .GEN_3SIZE GTR 0
;   3080  5			THEN
;   3081  6			    BEGIN
;   3082  6			    DATA_SIZE = PACK_DATA (POINTER, .DATA_SIZE, GEN_3DATA, .GEN_3SIZE);
;   3083  5			    END;
;   3084  5	
;   3085  4			END;
;   3086  4	
;   3087  3		    END;
;   3088  3	
;   3089  3		END
;   3090  2	    ELSE
;   3091  3		BEGIN
;   3092  3	
;   3093  3		IF .GEN_1SIZE GTR MAX_MSG THEN GEN_1SIZE = MAX_MSG;
;   3094  3	
;   3095  3		DATA_SIZE = .GEN_1SIZE;
;   3096  3		CH$MOVE (.GEN_1SIZE, CH$PTR (GEN_1DATA), .POINTER);
;   3097  2		END;
;   3098  2	
;   3099  2	    SET_STRING (CH$PTR (DATA_TEXT), .DATA_SIZE, TRUE);
;   3100  2	    BFR_FILL (TRUE);
;   3101  2	    SET_STRING (0, 0, FALSE);
;   3102  2	!
;   3103  2	! Send the packet
;   3104  2	!
;   3105  2	
;   3106  2	    IF NOT SEND_PACKET (.GEN_TYPE, .SIZE, .MSG_NUMBER) THEN RETURN STATE_EX;
;   3107  2	
;   3108  2	!
;   3109  2	! Now get the responce from the remote KERMIT.
;   3110  2	!
;   3111  2	    STATUS = REC_PACKET ();
;   3112  2	
;   3113  2	    IF NOT .STATUS
;   3114  2	    THEN
;   3115  3		BEGIN
;   3116  3	
;   3117  4		IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL KER_CHKSUMERR)
;   3118  3		THEN
;   3119  3		    RETURN .STATE
;   3120  3		ELSE
;   3121  3		    RETURN STATE_EX;
;   3122  3	
;   3123  2		END;
;   3124  2	
;   3125  2	! Did we get a send-init?
;   3126  2	
;   3127  2	    SELECTONE .REC_TYPE OF
;   3128  2		SET
;   3129  2	
;   3130  2		[MSG_SND_INIT] :
;   3131  3		    BEGIN
;   3132  3		    MSG_NUMBER = .REC_SEQ;		! Initialize sequence numbers
;   3133  3	! Determine if the parameters are ok.  If not, give up
;   3134  3	
;   3135  3		    IF NOT (STATUS = PRS_SEND_INIT ()) THEN RETURN .STATUS;
;   3136  3	
;   3137  3		    SET_SEND_INIT ();			! Set up our acknowledgement to the send-init
;   3138  3		    SEND_PACKET (MSG_ACK, P_SI_LENGTH, .MSG_NUMBER);	! Send it
;   3139  3		    BLK_CHK_TYPE = .INI_CHK_TYPE;	! Can now use agreed upon type
;   3140  3		    OLD_RETRIES = .NUM_RETRIES;
;   3141  3		    NUM_RETRIES = 0;
;   3142  3		    MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   3143  3		    RETURN STATE_RF;			! Now expect file header
;   3144  2		    END;
;   3145  2	
;   3146  2		[MSG_TEXT] :
;   3147  2	!
;   3148  2	! If we just got a text header, set up for typing on the terminal and
;   3149  2	! shift to receiving data
;   3150  2	!
;   3151  3		    BEGIN
;   3152  3		    TEXT_HEAD_FLAG = TRUE;		! We want terminal output
;   3153  3		    PUT_CHR_ROUTINE = TYPE_CHAR;	! Set up the put a character routine
;   3154  3	
;   3155  3		    IF .REC_LENGTH GTR 0
;   3156  3		    THEN
;   3157  4			BEGIN
;   3158  4			TT_TEXT (UPLIT (%ASCIZ'<<'));	! Make sure file name sticks out
;   3159  4			BFR_EMPTY ();			! Dump the packet data to the terminal
;   3160  4			TT_TEXT (UPLIT (%ASCIZ'>>'));	! So user can tell where name ends
;   3161  4			TT_CRLF ();			! And a CRLF
;   3162  3			END;
;   3163  3	
;   3164  3		    SEND_PACKET (MSG_ACK, 0, .MSG_NUMBER);	! Send an ACK
;   3165  3		    OLD_RETRIES = .NUM_RETRIES;
;   3166  3		    NUM_RETRIES = 0;
;   3167  3		    MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   3168  3		    RETURN STATE_RD;			! We now want data
;   3169  2		    END;
;   3170  2	
;   3171  2		[MSG_ACK] :
;   3172  2	!
;   3173  2	! If we get an ACK, just type the data on the terminal and complete the
;   3174  2	! transaction.
;   3175  2	!
;   3176  3		    BEGIN
;   3177  3		    PUT_CHR_ROUTINE = TYPE_CHAR;	! Dump to terminal
;   3178  3		    BFR_EMPTY ();			! Do it
;   3179  3	
;   3180  3		    IF .REC_LENGTH GTR 0 THEN TT_CRLF ();
;   3181  3	
;   3182  3		    RETURN STATE_C;			! And go idle
;   3183  2		    END;
;   3184  2	
;   3185  2		[MSG_NAK] :
;   3186  2	!
;   3187  2	! If we get a NAK, stay in the same state.  We will re-transmit the
;   3188  2	! packet again.
;   3189  2	!
;   3190  2		    RETURN .STATE;
;   3191  2		TES;
;   3192  2	
;   3193  2	!
;   3194  2	! If we get here, we didn't get anything resembling an acceptable
;   3195  2	! packet, so we will abort.
;   3196  2	!
;   3197  2	    KRM_ERROR (KER_PROTOERR);
;   3198  2	    RETURN STATE_A;
;   3199  1	    END;



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.AAF:	.ASCII  \<<\<0><0>			     ;									      ;
P.AAG:	.ASCII  \>>\<0><0>			     ;									      ;



	.PSECT  $CODE$,NOWRT,2

;SEND_GENCMD
U.6:	.WORD   ^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>  ;Save R2,R3,R4,R5,R6,R7,R8,R9,R10,R11				      ; 2975
	MOVAB   W^U.24, R11			     ;U.24, R11								      ;
	MOVAB   B^U.75, R10			     ;U.75, R10								      ;
	MOVAB   W^GEN_3SIZE, R9			     ;GEN_3SIZE, R9							      ;
	MOVAB   W^GEN_1SIZE, R8			     ;GEN_1SIZE, R8							      ;
	MOVAB   W^U.53, R7			     ;U.53, R7								      ;
	MOVAB   -100(SP), SP			     ;-100(SP), SP							      ;
	CMPL    -4(R7), W^PKT_RETRIES		     ;NUM_RETRIES, PKT_RETRIES						      ; 3050
	BLEQ    1$				     ;1$								      ;
	MOVL    #20, R0				     ;#20, R0								      ;
	RET     				     ;									      ;
1$:	INCL    -4(R7)				     ;NUM_RETRIES							      ; 3056
	MOVAB   4(SP), (SP)			     ;DATA_TEXT, POINTER						      ; 3060
	CLRL    R6				     ;DATA_SIZE								      ; 3061
	MOVL    (R8), R0			     ;GEN_1SIZE, R0							      ; 3069
	CMPL    236(R7), #71			     ;GEN_TYPE, #71							      ; 3063
	BNEQ    4$				     ;4$								      ;
	MOVB    240(R7), @0(SP)			     ;GEN_SUBTYPE, @POINTER						      ; 3066
	INCL    (SP)				     ;POINTER								      ;
	MOVL    #1, R6				     ;#1, DATA_SIZE							      ; 3067
	TSTL    R0				     ;R0								      ; 3069
	BGTR    2$				     ;2$								      ;
	TSTL    W^GEN_2SIZE			     ;GEN_2SIZE								      ;
	BGTR    2$				     ;2$								      ;
	TSTL    (R9)				     ;GEN_3SIZE								      ;
	BLEQ    6$				     ;6$								      ;
2$:	PUSHL   R0				     ;R0								      ; 3072
	PUSHAB  W^GEN_1DATA			     ;GEN_1DATA								      ;
	PUSHL   R6				     ;DATA_SIZE								      ;
	PUSHAB  12(SP)				     ;POINTER								      ;
	CALLS   #4, (R10)			     ;#4, PACK_DATA							      ;
	MOVL    R0, R6				     ;R0, DATA_SIZE							      ;
	MOVL    W^GEN_2SIZE, R0			     ;GEN_2SIZE, R0							      ; 3074
	BGTR    3$				     ;3$								      ;
	TSTL    (R9)				     ;GEN_3SIZE								      ;
	BLEQ    6$				     ;6$								      ;
3$:	PUSHL   R0				     ;R0								      ; 3077
	PUSHAB  W^GEN_2DATA			     ;GEN_2DATA								      ;
	PUSHL   R6				     ;DATA_SIZE								      ;
	PUSHAB  12(SP)				     ;POINTER								      ;
	CALLS   #4, (R10)			     ;#4, PACK_DATA							      ;
	MOVL    R0, R6				     ;R0, DATA_SIZE							      ;
	MOVL    (R9), R0			     ;GEN_3SIZE, R0							      ; 3079
	BLEQ    6$				     ;6$								      ;
	PUSHL   R0				     ;R0								      ; 3082
	PUSHAB  W^GEN_3DATA			     ;GEN_3DATA								      ;
	PUSHL   R6				     ;DATA_SIZE								      ;
	PUSHAB  12(SP)				     ;POINTER								      ;
	CALLS   #4, (R10)			     ;#4, PACK_DATA							      ;
	MOVL    R0, R6				     ;R0, DATA_SIZE							      ;
	BRB     6$				     ;6$								      ; 3063
4$:	CMPL    R0, #96				     ;R0, #96								      ; 3093
	BLEQ    5$				     ;5$								      ;
	MOVZBL  #96, (R8)			     ;#96, GEN_1SIZE							      ;
5$:	MOVL    (R8), R6			     ;GEN_1SIZE, DATA_SIZE						      ; 3095
	MOVC3   (R8), W^GEN_1DATA, @0(SP)	     ;GEN_1SIZE, GEN_1DATA, @POINTER					      ; 3096
6$:	PUSHL   #1				     ;#1								      ; 3099
	PUSHL   R6				     ;DATA_SIZE								      ;
	PUSHAB  12(SP)				     ;DATA_TEXT								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	PUSHL   #1				     ;#1								      ; 3100
	CALLS   #1, W^U.29			     ;#1, U.29								      ;
	CLRQ    -(SP)				     ;-(SP)								      ; 3101
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	PUSHL   (R7)				     ;MSG_NUMBER							      ; 3106
	PUSHL   -12(R7)				     ;SIZE								      ;
	PUSHL   236(R7)				     ;GEN_TYPE								      ;
	CALLS   #3, (R11)			     ;#3, SEND_PACKET							      ;
	BLBS    R0, 7$				     ;R0, 7$								      ;
	MOVL    #19, R0				     ;#19, R0								      ;
	RET     				     ;									      ;
7$:	CALLS   #0, W^U.26			     ;#0, U.26								      ; 3111
	BLBS    R0, 11$				     ;STATUS, 11$							      ; 3113
	CMPL    R0, #134316234			     ;STATUS, #134316234						      ; 3117
	BEQL    8$				     ;8$								      ;
	CMPL    R0, #134316248			     ;STATUS, #134316248						      ;
	BEQL    8$				     ;8$								      ;
	CMPL    R0, #134316178			     ;STATUS, #134316178						      ;
	BNEQ    9$				     ;9$								      ;
8$:	MOVL    -16(R7), R1			     ;STATE, R1								      ; 3121
	BRB     10$				     ;10$								      ;
9$:	MOVL    #19, R1				     ;#19, R1								      ;
10$:	MOVL    R1, R0				     ;R1, R0								      ;
	RET     				     ;									      ;
11$:	MOVL    12(R7), R1			     ;REC_TYPE, R1							      ; 3127
	CMPL    R1, #83				     ;R1, #83								      ; 3130
	BNEQ    13$				     ;13$								      ;
	MOVL    4(R7), (R7)			     ;REC_SEQ, MSG_NUMBER						      ; 3132
	CALLS   #0, W^U.21			     ;#0, U.21								      ; 3135
	BLBS    R0, 12$				     ;STATUS, 12$							      ;
	RET     				     ;									      ;
12$:	CALLS   #0, W^U.20			     ;#0, U.20								      ; 3137
	PUSHL   (R7)				     ;MSG_NUMBER							      ; 3138
	PUSHL   #9				     ;#9								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, (R11)			     ;#3, SEND_PACKET							      ;
	MOVL    -32(R7), -28(R7)		     ;INI_CHK_TYPE, BLK_CHK_TYPE					      ; 3139
	MOVL    -4(R7), -8(R7)			     ;NUM_RETRIES, OLD_RETRIES						      ; 3140
	CLRL    -4(R7)				     ;NUM_RETRIES							      ; 3141
	ADDL3   #1, (R7), R0			     ;#1, MSG_NUMBER, R0						      ; 3142
	EXTZV   #0, #6, R0, (R7)		     ;#0, #6, R0, MSG_NUMBER						      ;
	MOVL    #7, R0				     ;#7, R0								      ; 3143
	RET     				     ;									      ;
13$:	CMPL    R1, #88				     ;R1, #88								      ; 3146
	BNEQ    15$				     ;15$								      ;
	MOVL    #1, 224(R7)			     ;#1, TEXT_HEAD_FLAG						      ; 3152
	MOVAB   W^U.31, 248(R7)			     ;U.31, PUT_CHR_ROUTINE						      ; 3153
	TSTL    8(R7)				     ;REC_LENGTH							      ; 3155
	BLEQ    14$				     ;14$								      ;
	PUSHAB  W^P.AAF				     ;P.AAF								      ; 3158
	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^U.28			     ;#0, U.28								      ; 3159
	PUSHAB  W^P.AAG				     ;P.AAG								      ; 3160
	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 3161
14$:	PUSHL   (R7)				     ;MSG_NUMBER							      ; 3164
	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, (R11)			     ;#3, SEND_PACKET							      ;
	MOVL    -4(R7), -8(R7)			     ;NUM_RETRIES, OLD_RETRIES						      ; 3165
	CLRL    -4(R7)				     ;NUM_RETRIES							      ; 3166
	ADDL3   #1, (R7), R0			     ;#1, MSG_NUMBER, R0						      ; 3167
	EXTZV   #0, #6, R0, (R7)		     ;#0, #6, R0, MSG_NUMBER						      ;
	MOVL    #8, R0				     ;#8, R0								      ; 3168
	RET     				     ;									      ;
15$:	CMPL    R1, #89				     ;R1, #89								      ; 3171
	BNEQ    17$				     ;17$								      ;
	MOVAB   W^U.31, 248(R7)			     ;U.31, PUT_CHR_ROUTINE						      ; 3177
	CALLS   #0, W^U.28			     ;#0, U.28								      ; 3178
	TSTL    8(R7)				     ;REC_LENGTH							      ; 3180
	BLEQ    16$				     ;16$								      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ;
16$:	MOVL    #9, R0				     ;#9, R0								      ; 3182
	RET     				     ;									      ;
17$:	CMPL    R1, #78				     ;R1, #78								      ; 3185
	BNEQ    18$				     ;18$								      ;
	MOVL    -16(R7), R0			     ;STATE, R0								      ; 3190
	RET     				     ;									      ;
18$:	PUSHL   #134316226			     ;#134316226							      ; 3197
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	MOVL    #10, R0				     ;#10, R0								      ; 3198
	RET     				     ;									      ; 3199

; Routine Size:  495 bytes,    Routine Base:  $CODE$ + 0AFA


;   3200  1	%SBTTL 'SEND_BREAK'
;   3201  1	ROUTINE SEND_BREAK =
;   3202  1	
;   3203  1	!++
;   3204  1	! FUNCTIONAL DESCRIPTION:
;   3205  1	!
;   3206  1	!	This routine will send the break (end of transmission) message
;   3207  1	!	to the remote KERMIT.  On an ACK the state becomes STATE_C.
;   3208  1	!
;   3209  1	! CALLING SEQUENCE:
;   3210  1	!
;   3211  1	!	STATE = SEND_BREAK();
;   3212  1	!
;   3213  1	! INPUT PARAMETERS:
;   3214  1	!
;   3215  1	!	None.
;   3216  1	!
;   3217  1	! IMPLICIT INPUTS:
;   3218  1	!
;   3219  1	!	None.
;   3220  1	!
;   3221  1	! OUTPUT PARAMETERS:
;   3222  1	!
;   3223  1	!	New state for the finite state machine.
;   3224  1	!
;   3225  1	! IMPLICIT OUTPUTS:
;   3226  1	!
;   3227  1	!	None.
;   3228  1	!
;   3229  1	! COMPLETION CODES:
;   3230  1	!
;   3231  1	!	None.
;   3232  1	!
;   3233  1	! SIDE EFFECTS:
;   3234  1	!
;   3235  1	!	None.
;   3236  1	!
;   3237  1	!--
;   3238  1	
;   3239  2	    BEGIN
;   3240  2	
;   3241  2	    LOCAL
;   3242  2		STATUS;					! Status returned by various routines
;   3243  2	
;   3244  2	!
;   3245  2	! First determine if we have exceed the number of retries that are
;   3246  2	! allowed to attempt to send this message.
;   3247  2	!
;   3248  2	
;   3249  2	    IF .NUM_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER;
;   3250  2	
;   3251  2	!
;   3252  2	! The number of retries are not exceeded.  Increment the number and then
;   3253  2	! attempt to send the packet again.
;   3254  2	!
;   3255  2	    NUM_RETRIES = .NUM_RETRIES + 1;
;   3256  2	
;   3257  2	    IF NOT SEND_PACKET (MSG_BREAK, 0, .MSG_NUMBER) THEN RETURN STATE_EX;
;   3258  2	
;   3259  2	!
;   3260  2	! Now get the responce from the remote KERMIT.
;   3261  2	!
;   3262  2	    STATUS = REC_PACKET ();
;   3263  2	
;   3264  2	    IF NOT .STATUS
;   3265  2	    THEN
;   3266  3		BEGIN
;   3267  3	
;   3268  4		IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL KER_CHKSUMERR)
;   3269  3		THEN
;   3270  3		    RETURN .STATE
;   3271  3		ELSE
;   3272  3		    RETURN STATE_EX;
;   3273  3	
;   3274  2		END;
;   3275  2	
;   3276  2	!
;   3277  2	! Determine if the packet is good.
;   3278  2	!
;   3279  2	
;   3280  3	    IF NOT (.REC_TYPE EQL MSG_ACK OR .REC_TYPE EQL MSG_NAK)
;   3281  2	    THEN
;   3282  3		BEGIN
;   3283  3		KRM_ERROR (KER_PROTOERR);
;   3284  3		RETURN STATE_A;
;   3285  2		END;
;   3286  2	
;   3287  2	!
;   3288  2	! If this is a NAK and the message number is not the one we just send
;   3289  2	! treat this like an ACK, otherwise resend the last packet.
;   3290  2	!
;   3291  2	
;   3292  2	    IF .REC_TYPE EQL MSG_NAK AND .REC_SEQ NEQ 0 THEN RETURN .STATE;
;   3293  2	
;   3294  2	    IF .REC_TYPE EQL MSG_ACK AND .REC_SEQ NEQ .MSG_NUMBER THEN RETURN .STATE;
;   3295  2	
;   3296  2	!
;   3297  2	! Here to determine if there is another file to send.
;   3298  2	!
;   3299  2	    NUM_RETRIES = 0;
;   3300  2	    MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   3301  2	    RETURN STATE_C;
;   3302  1	    END;





;SEND_BREAK
U.9:	.WORD   ^M<R2>				     ;Save R2								      ; 3201
	MOVAB   W^U.53, R2			     ;U.53, R2								      ;
	CMPL    -4(R2), W^PKT_RETRIES		     ;NUM_RETRIES, PKT_RETRIES						      ; 3249
	BLEQ    1$				     ;1$								      ;
	MOVL    #20, R0				     ;#20, R0								      ;
	RET     				     ;									      ;
1$:	INCL    -4(R2)				     ;NUM_RETRIES							      ; 3255
	PUSHL   (R2)				     ;MSG_NUMBER							      ; 3257
	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZBL  #66, -(SP)			     ;#66, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	BLBC    R0, 2$				     ;R0, 2$								      ;
	CALLS   #0, W^U.26			     ;#0, U.26								      ; 3262
	BLBS    R0, 3$				     ;STATUS, 3$							      ; 3264
	CMPL    R0, #134316234			     ;STATUS, #134316234						      ; 3268
	BEQL    6$				     ;6$								      ;
	CMPL    R0, #134316248			     ;STATUS, #134316248						      ;
	BEQL    6$				     ;6$								      ;
	CMPL    R0, #134316178			     ;STATUS, #134316178						      ;
	BEQL    6$				     ;6$								      ;
2$:	MOVL    #19, R0				     ;#19, R0								      ; 3272
	RET     				     ;									      ;
3$:	CMPL    12(R2), #89			     ;REC_TYPE, #89							      ; 3280
	BEQL    4$				     ;4$								      ;
	CMPL    12(R2), #78			     ;REC_TYPE, #78							      ;
	BEQL    4$				     ;4$								      ;
	PUSHL   #134316226			     ;#134316226							      ; 3283
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	MOVL    #10, R0				     ;#10, R0								      ; 3284
	RET     				     ;									      ;
4$:	CMPL    12(R2), #78			     ;REC_TYPE, #78							      ; 3292
	BNEQ    5$				     ;5$								      ;
	TSTL    4(R2)				     ;REC_SEQ								      ;
	BNEQ    6$				     ;6$								      ;
5$:	CMPL    12(R2), #89			     ;REC_TYPE, #89							      ; 3294
	BNEQ    7$				     ;7$								      ;
	CMPL    4(R2), (R2)			     ;REC_SEQ, MSG_NUMBER						      ;
	BEQL    7$				     ;7$								      ;
6$:	MOVL    -16(R2), R0			     ;STATE, R0								      ;
	RET     				     ;									      ;
7$:	CLRL    -4(R2)				     ;NUM_RETRIES							      ; 3299
	ADDL3   #1, (R2), R0			     ;#1, MSG_NUMBER, R0						      ; 3300
	EXTZV   #0, #6, R0, (R2)		     ;#0, #6, R0, MSG_NUMBER						      ;
	MOVL    #9, R0				     ;#9, R0								      ; 3301
	RET     				     ;									      ; 3302

; Routine Size:  164 bytes,    Routine Base:  $CODE$ + 0CE9


;   3303  1	%SBTTL 'REC_INIT'
;   3304  1	ROUTINE REC_INIT =
;   3305  1	
;   3306  1	!++
;   3307  1	! FUNCTIONAL DESCRIPTION:
;   3308  1	!
;   3309  1	!	This routine will process an initialization message received from
;   3310  1	!	the remote KERMIT.
;   3311  1	!
;   3312  1	! CALLING SEQUENCE:
;   3313  1	!
;   3314  1	!	STATE = REC_INIT();
;   3315  1	!
;   3316  1	! INPUT PARAMETERS:
;   3317  1	!
;   3318  1	!	None.
;   3319  1	!
;   3320  1	! IMPLICIT INPUTS:
;   3321  1	!
;   3322  1	!	None.
;   3323  1	!
;   3324  1	! OUTPUT PARAMETERS:
;   3325  1	!
;   3326  1	!	New machine state.
;   3327  1	!
;   3328  1	! IMPLICIT OUTPUTS:
;   3329  1	!
;   3330  1	!	None.
;   3331  1	!
;   3332  1	! COMPLETION CODES:
;   3333  1	!
;   3334  1	!	None.
;   3335  1	!
;   3336  1	! SIDE EFFECTS:
;   3337  1	!
;   3338  1	!	None.
;   3339  1	!
;   3340  1	!--
;   3341  1	
;   3342  2	    BEGIN
;   3343  2	
;   3344  2	    LOCAL
;   3345  2		STATUS;					! Status returned by various routines
;   3346  2	
;   3347  2	    ROUTINE CHECK_INIT =
;   3348  3		BEGIN
;   3349  3	
;   3350  3		IF .REC_TYPE EQL MSG_SND_INIT THEN RETURN TRUE ELSE RETURN FALSE;
;   3351  3	
;   3352  2		END;





;CHECK_INIT
U.76:	.WORD   ^M<>				     ;Save nothing							      ; 3347
	CMPL    W^U.56, #83			     ;U.56, #83								      ; 3350
	BNEQ    1$				     ;1$								      ;
	MOVL    #1, R0				     ;#1, R0								      ;
	RET     				     ;									      ;
1$:	CLRL    R0				     ;R0								      ;
	RET     				     ;									      ; 3352

; Routine Size:  20 bytes,    Routine Base:  $CODE$ + 0D8D


;   3353  2	
;   3354  3	    IF NOT (STATUS = REC_MESSAGE (CHECK_INIT))
;   3355  2	    THEN
;   3356  2	
;   3357  2		IF .STATUS NEQ KER_ABORTED THEN RETURN STATE_A ELSE RETURN STATE_EX;
;   3358  2	
;   3359  2	    MSG_NUMBER = .REC_SEQ;
;   3360  2	
;   3361  2	    IF NOT (STATUS = PRS_SEND_INIT ()) THEN RETURN STATE_A;
;   3362  2	
;   3363  2	    SET_SEND_INIT ();
;   3364  2	    SEND_PACKET (MSG_ACK, P_SI_LENGTH, .MSG_NUMBER);
;   3365  2	    BLK_CHK_TYPE = .INI_CHK_TYPE;		! Can now use agreed upon type
;   3366  2	    OLD_RETRIES = .NUM_RETRIES;
;   3367  2	    NUM_RETRIES = 0;
;   3368  2	    MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   3369  2	    RETURN STATE_RF;
;   3370  1	    END;					! End of REC_INIT





;REC_INIT
U.11:	.WORD   ^M<R2>				     ;Save R2								      ; 3304
	MOVAB   W^U.53, R2			     ;U.53, R2								      ;
	PUSHAB  B^U.76				     ;U.76								      ; 3354
	CALLS   #1, W^U.25			     ;#1, U.25								      ;
	BLBS    R0, 3$				     ;STATUS, 3$							      ;
	CMPL    R0, #134316258			     ;STATUS, #134316258						      ; 3357
	BEQL    1$				     ;1$								      ;
	MOVL    #10, R1				     ;#10, R1								      ;
	BRB     2$				     ;2$								      ;
1$:	MOVL    #19, R1				     ;#19, R1								      ;
2$:	MOVL    R1, R0				     ;R1, R0								      ;
	RET     				     ;									      ;
3$:	MOVL    4(R2), (R2)			     ;REC_SEQ, MSG_NUMBER						      ; 3359
	CALLS   #0, W^U.21			     ;#0, U.21								      ; 3361
	BLBS    R0, 4$				     ;STATUS, 4$							      ;
	MOVL    #10, R0				     ;#10, R0								      ;
	RET     				     ;									      ;
4$:	CALLS   #0, W^U.20			     ;#0, U.20								      ; 3363
	PUSHL   (R2)				     ;MSG_NUMBER							      ; 3364
	PUSHL   #9				     ;#9								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	MOVL    -32(R2), -28(R2)		     ;INI_CHK_TYPE, BLK_CHK_TYPE					      ; 3365
	MOVL    -4(R2), -8(R2)			     ;NUM_RETRIES, OLD_RETRIES						      ; 3366
	CLRL    -4(R2)				     ;NUM_RETRIES							      ; 3367
	ADDL3   #1, (R2), R0			     ;#1, MSG_NUMBER, R0						      ; 3368
	EXTZV   #0, #6, R0, (R2)		     ;#0, #6, R0, MSG_NUMBER						      ;
	MOVL    #7, R0				     ;#7, R0								      ; 3369
	RET     				     ;									      ; 3370

; Routine Size:  99 bytes,    Routine Base:  $CODE$ + 0DA1


;   3371  1	%SBTTL 'REC_FILE'
;   3372  1	ROUTINE REC_FILE =
;   3373  1	
;   3374  1	!++
;   3375  1	! FUNCTIONAL DESCRIPTION:
;   3376  1	!
;   3377  1	!	This routine expects to receive an MSG_FILE packet from the remote
;   3378  1	!	KERMIT.  If the message is correct this routine will change the state
;   3379  1	!	to STATE_RD.
;   3380  1	!
;   3381  1	!	This routine also expects MSG_SND_INIT, MSG_EOF, or MSG_BREAK.
;   3382  1	!
;   3383  1	! CALLING SEQUENCE:
;   3384  1	!
;   3385  1	!	STATE = REC_FILE();
;   3386  1	!
;   3387  1	! INPUT PARAMETERS:
;   3388  1	!
;   3389  1	!	None.
;   3390  1	!
;   3391  1	! IMPLICIT INPUTS:
;   3392  1	!
;   3393  1	!	None.
;   3394  1	!
;   3395  1	! OUTPUT PARAMETERS:
;   3396  1	!
;   3397  1	!	New state.
;   3398  1	!
;   3399  1	! IMPLICIT OUTPUTS:
;   3400  1	!
;   3401  1	!	None.
;   3402  1	!
;   3403  1	! COMPLETION CODES:
;   3404  1	!
;   3405  1	!	None.
;   3406  1	!
;   3407  1	! SIDE EFFECTS:
;   3408  1	!
;   3409  1	!	None.
;   3410  1	!
;   3411  1	!--
;   3412  1	
;   3413  2	    BEGIN
;   3414  2	
;   3415  2	    LOCAL
;   3416  2		STATUS;
;   3417  2	
;   3418  2	    ROUTINE CHECK_FILE =
;   3419  3		BEGIN
;   3420  3	
;   3421  4		IF (.REC_TYPE EQL MSG_SND_INIT) OR (.REC_TYPE EQL MSG_EOF) OR (.REC_TYPE EQL MSG_FILE) OR (
;   3422  4		    .REC_TYPE EQL MSG_BREAK) OR (.REC_TYPE EQL MSG_TEXT)
;   3423  3		THEN
;   3424  3		    RETURN TRUE
;   3425  3		ELSE
;   3426  3		    RETURN FALSE;
;   3427  3	
;   3428  2		END;





;CHECK_FILE
U.77:	.WORD   ^M<>				     ;Save nothing							      ; 3418
	MOVL    W^U.56, R0			     ;U.56, R0								      ; 3421
	CMPL    R0, #83				     ;R0, #83								      ;
	BEQL    1$				     ;1$								      ;
	CMPL    R0, #90				     ;R0, #90								      ;
	BEQL    1$				     ;1$								      ;
	CMPL    R0, #70				     ;R0, #70								      ;
	BEQL    1$				     ;1$								      ;
	CMPL    R0, #66				     ;R0, #66								      ; 3422
	BEQL    1$				     ;1$								      ;
	CMPL    R0, #88				     ;R0, #88								      ;
	BNEQ    2$				     ;2$								      ;
1$:	MOVL    #1, R0				     ;#1, R0								      ; 3426
	RET     				     ;									      ;
2$:	CLRL    R0				     ;R0								      ;
	RET     				     ;									      ; 3428

; Routine Size:  59 bytes,    Routine Base:  $CODE$ + 0E04


;   3429  2	!
;   3430  2	! Initialize the abort flags
;   3431  2	!
;   3432  2	    ABT_CUR_FILE = FALSE;
;   3433  2	    ABT_ALL_FILE = FALSE;
;   3434  2	!
;   3435  2	! Get a message
;   3436  2	!
;   3437  2	
;   3438  3	    IF NOT (STATUS = REC_MESSAGE (CHECK_FILE))
;   3439  2	    THEN
;   3440  2	
;   3441  2		IF .STATUS NEQ KER_ABORTED THEN RETURN STATE_A ELSE RETURN STATE_EX;
;   3442  2	
;   3443  2	    SELECTONE .REC_TYPE OF
;   3444  2		SET
;   3445  2	
;   3446  2		[MSG_SND_INIT] :
;   3447  3		    BEGIN
;   3448  3	
;   3449  3		    IF .OLD_RETRIES GTR .SI_RETRIES THEN RETURN STATE_ER;
;   3450  3	
;   3451  3		    OLD_RETRIES = .OLD_RETRIES + 1;
;   3452  3	
;   3453  3		    IF ((.MSG_NUMBER - 1) AND %O'77') EQL .REC_SEQ
;   3454  3		    THEN
;   3455  4			BEGIN
;   3456  4			SET_SEND_INIT ();
;   3457  4			BLK_CHK_TYPE = CHK_1CHAR;	! Must use 1 character CHKSUM
;   3458  4			SEND_PACKET (MSG_ACK, P_SI_LENGTH, .REC_SEQ);
;   3459  4			BLK_CHK_TYPE = .INI_CHK_TYPE;	! Back to agreed upon type
;   3460  4			NUM_RETRIES = 0;
;   3461  4			RETURN .STATE;
;   3462  4			END
;   3463  3		    ELSE
;   3464  4			BEGIN
;   3465  4			KRM_ERROR (KER_PROTOERR);
;   3466  4			RETURN STATE_A;
;   3467  3			END;
;   3468  3	
;   3469  2		    END;
;   3470  2	
;   3471  2		[MSG_EOF] :
;   3472  3		    BEGIN
;   3473  3	
;   3474  3		    IF .OLD_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER;
;   3475  3	
;   3476  3		    OLD_RETRIES = .OLD_RETRIES + 1;
;   3477  3	
;   3478  3		    IF ((.MSG_NUMBER - 1) AND %O'77') EQL .REC_SEQ
;   3479  3		    THEN
;   3480  4			BEGIN
;   3481  4			SEND_PACKET (MSG_ACK, 0, .REC_SEQ);
;   3482  4			NUM_RETRIES = 0;
;   3483  4			RETURN .STATE;
;   3484  4			END
;   3485  3		    ELSE
;   3486  4			BEGIN
;   3487  4			KRM_ERROR (KER_PROTOERR);
;   3488  4			RETURN STATE_A;
;   3489  3			END;
;   3490  3	
;   3491  2		    END;
;   3492  2	
;   3493  2		[MSG_FILE] :
;   3494  3		    BEGIN
;   3495  3	
;   3496  3		    IF .MSG_NUMBER NEQ .REC_SEQ THEN RETURN STATE_ER;
;   3497  3	
;   3498  3		    IF .REC_LENGTH EQL 0
;   3499  3		    THEN
;   3500  4			BEGIN
;   3501  4			KRM_ERROR (KER_PROTOERR);
;   3502  4			RETURN STATE_A;
;   3503  3			END;
;   3504  3	
;   3505  3	![025]
;   3506  3	![025] Get file name from packet with all quoting undone
;   3507  3	![025]
;   3508  3		    SET_STRING (CH$PTR (FILE_NAME), MAX_FILE_NAME, TRUE);
;   3509  3		    BFR_EMPTY ();
;   3510  3		    FILE_SIZE = SET_STRING (0, 0, FALSE);
;   3511  3		    CH$WCHAR (CHR_NUL, CH$PTR (FILE_NAME, .FILE_SIZE));
;   3512  3	![025]	    FILE_SIZE = .REC_LENGTH;
;   3513  3	![025]	    CH$COPY (.REC_LENGTH, CH$PTR (REC_MSG, PKT_MSG, CHR_SIZE), CHR_NUL, MAX_FILE_NAME,
;   3514  3	![025]		CH$PTR (FILE_NAME));
;   3515  3	
;   3516  3		    IF ( NOT .CONNECT_FLAG) AND .TY_FIL
;   3517  3		    THEN
;   3518  4			BEGIN
;   3519  4			TT_TEXT (UPLIT (%ASCIZ'Receiving: '));
;   3520  4			TT_TEXT (FILE_NAME);
;   3521  4			TT_OUTPUT ();
;   3522  3			END;
;   3523  3	
;   3524  3	![023]
;   3525  3	![023] Force file name into normal form if desired
;   3526  3	![023]
;   3527  3	
;   3528  3		    IF .FIL_NORMAL_FORM THEN NORMALIZE_FILE (FILE_NAME, FILE_SIZE, 9, 3);
;   3529  3	
;   3530  3		    FILE_CHARS = 0;			! No characters received yet
;   3531  3	
;   3532  3		    IF NOT FILE_OPEN (FNC_WRITE) THEN RETURN STATE_A;
;   3533  3	
;   3534  3		    XFR_STATUS (%C'F', %C'R');		! Tell display routine
;   3535  3		    TEXT_HEAD_FLAG = FALSE;		! Got an F, not an X
;   3536  3		    FILE_OPEN_FLAG = TRUE;
;   3537  3		    SEND_PACKET (MSG_ACK, 0, .MSG_NUMBER);
;   3538  3		    OLD_RETRIES = .NUM_RETRIES;
;   3539  3		    NUM_RETRIES = 0;
;   3540  3		    MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   3541  3		    RETURN STATE_RD;
;   3542  2		    END;
;   3543  2	
;   3544  2		[MSG_TEXT] :
;   3545  2	!
;   3546  2	! If we get a text header, we will want to type the data on
;   3547  2	! the terminal.  Set up the put a character routine correctly.
;   3548  2	!
;   3549  3		    BEGIN
;   3550  3	
;   3551  3		    IF .MSG_NUMBER NEQ .REC_SEQ
;   3552  3		    THEN
;   3553  4			BEGIN
;   3554  4			KRM_ERROR (KER_PROTOERR);
;   3555  4			RETURN STATE_A;
;   3556  3			END;
;   3557  3	
;   3558  3		    TEXT_HEAD_FLAG = TRUE;		! Got an X, not an F
;   3559  3		    PUT_CHR_ROUTINE = TYPE_CHAR;	! Empty buffer on terminal
;   3560  3	
;   3561  3		    IF .REC_LENGTH GTR 0
;   3562  3		    THEN
;   3563  4			BEGIN
;   3564  4			TT_TEXT (UPLIT (%ASCIZ'<<'));	! Make file name stick out
;   3565  4			BFR_EMPTY ();			! Do the header data
;   3566  4			TT_TEXT (UPLIT (%ASCIZ'>>'));
;   3567  4			TT_CRLF ();			! And a crlf
;   3568  3			END;
;   3569  3	
;   3570  3		    SEND_PACKET (MSG_ACK, 0, .MSG_NUMBER);
;   3571  3		    OLD_RETRIES = .NUM_RETRIES;
;   3572  3		    NUM_RETRIES = 0;
;   3573  3		    MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   3574  3		    RETURN STATE_RD;
;   3575  2		    END;
;   3576  2	
;   3577  2		[MSG_BREAK] :
;   3578  3		    BEGIN
;   3579  3	
;   3580  3		    IF .MSG_NUMBER NEQ .REC_SEQ
;   3581  3		    THEN
;   3582  4			BEGIN
;   3583  4			KRM_ERROR (KER_PROTOERR);
;   3584  4			RETURN STATE_A;
;   3585  3			END;
;   3586  3	
;   3587  3		    SEND_PACKET (MSG_ACK, 0, .REC_SEQ);
;   3588  3		    RETURN STATE_C;
;   3589  2		    END;
;   3590  2	
;   3591  2		[OTHERWISE] :
;   3592  3		    BEGIN
;   3593  3		    KRM_ERROR (KER_PROTOERR);
;   3594  3		    RETURN STATE_A;
;   3595  2		    END;
;   3596  2		TES;
;   3597  2	
;   3598  1	    END;					! End of REC_FILE



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.AAH:	.ASCII  \Receiving: \<0>		     ;									      ;
P.AAI:	.ASCII  \<<\<0><0>			     ;									      ;
P.AAJ:	.ASCII  \>>\<0><0>			     ;									      ;



	.PSECT  $CODE$,NOWRT,2

;REC_FILE
U.12:	.WORD   ^M<R2,R3,R4,R5>			     ;Save R2,R3,R4,R5							      ; 3372
	MOVAB   W^TT_TEXT, R5			     ;TT_TEXT, R5							      ;
	MOVAB   W^FILE_NAME, R4			     ;FILE_NAME, R4							      ;
	MOVAB   W^U.24, R3			     ;U.24, R3								      ;
	MOVAB   W^U.53, R2			     ;U.53, R2								      ;
	CLRL    W^ABT_CUR_FILE			     ;ABT_CUR_FILE							      ; 3432
	CLRL    W^ABT_ALL_FILE			     ;ABT_ALL_FILE							      ; 3433
	PUSHAB  B^U.77				     ;U.77								      ; 3438
	CALLS   #1, W^U.25			     ;#1, U.25								      ;
	BLBS    R0, 2$				     ;STATUS, 2$							      ;
	CMPL    R0, #134316258			     ;STATUS, #134316258						      ; 3441
	BEQL    1$				     ;1$								      ;
	BRW     18$				     ;18$								      ;
1$:	MOVL    #19, R0				     ;#19, R0								      ;
	RET     				     ;									      ;
2$:	MOVL    12(R2), R0			     ;REC_TYPE, R0							      ; 3443
	CMPL    R0, #83				     ;R0, #83								      ; 3446
	BNEQ    3$				     ;3$								      ;
	CMPL    -8(R2), W^SI_RETRIES		     ;OLD_RETRIES, SI_RETRIES						      ; 3449
	BGTR    7$				     ;7$								      ;
	INCL    -8(R2)				     ;OLD_RETRIES							      ; 3451
	SUBL3   #1, (R2), R0			     ;#1, MSG_NUMBER, R0						      ; 3453
	CMPZV   #0, #6, R0, 4(R2)		     ;#0, #6, R0, REC_SEQ						      ;
	BNEQ    9$				     ;9$								      ;
	CALLS   #0, W^U.20			     ;#0, U.20								      ; 3456
	MOVL    #49, -28(R2)			     ;#49, BLK_CHK_TYPE							      ; 3457
	PUSHL   4(R2)				     ;REC_SEQ								      ; 3458
	PUSHL   #9				     ;#9								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, (R3)			     ;#3, SEND_PACKET							      ;
	MOVL    -32(R2), -28(R2)		     ;INI_CHK_TYPE, BLK_CHK_TYPE					      ; 3459
	BRB     4$				     ;4$								      ; 3460
3$:	CMPL    R0, #90				     ;R0, #90								      ; 3471
	BNEQ    5$				     ;5$								      ;
	CMPL    -8(R2), W^PKT_RETRIES		     ;OLD_RETRIES, PKT_RETRIES						      ; 3474
	BGTR    7$				     ;7$								      ;
	INCL    -8(R2)				     ;OLD_RETRIES							      ; 3476
	SUBL3   #1, (R2), R0			     ;#1, MSG_NUMBER, R0						      ; 3478
	CMPZV   #0, #6, R0, 4(R2)		     ;#0, #6, R0, REC_SEQ						      ;
	BNEQ    9$				     ;9$								      ;
	PUSHL   4(R2)				     ;REC_SEQ								      ; 3481
	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, (R3)			     ;#3, SEND_PACKET							      ;
4$:	CLRL    -4(R2)				     ;NUM_RETRIES							      ; 3482
	MOVL    -16(R2), R0			     ;STATE, R0								      ; 3486
	RET     				     ;									      ;
5$:	CMPL    R0, #70				     ;R0, #70								      ; 3493
	BEQL    6$				     ;6$								      ;
	BRW     14$				     ;14$								      ;
6$:	CMPL    (R2), 4(R2)			     ;MSG_NUMBER, REC_SEQ						      ; 3496
	BEQL    8$				     ;8$								      ;
7$:	MOVL    #20, R0				     ;#20, R0								      ;
	RET     				     ;									      ;
8$:	TSTL    8(R2)				     ;REC_LENGTH							      ; 3498
	BNEQ    10$				     ;10$								      ;
9$:	BRW     17$				     ;17$								      ;
10$:	PUSHL   #1				     ;#1								      ; 3508
	MOVZBL  #132, -(SP)			     ;#132, -(SP)							      ;
	PUSHL   R4				     ;R4								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	CALLS   #0, W^U.28			     ;#0, U.28								      ; 3509
	CLRQ    -(SP)				     ;-(SP)								      ; 3510
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	MOVL    R0, W^FILE_SIZE			     ;R0, FILE_SIZE							      ;
	MOVAB   (R4), R0			     ;FILE_NAME, R0							      ; 3511
	CLRB    @W^FILE_SIZE[R0]		     ;@FILE_SIZE[R0]							      ;
	BLBS    W^CONNECT_FLAG, 11$		     ;CONNECT_FLAG, 11$							      ; 3516
	BLBC    W^TY_FIL, 11$			     ;TY_FIL, 11$							      ;
	PUSHAB  W^P.AAH				     ;P.AAH								      ; 3519
	CALLS   #1, (R5)			     ;#1, TT_TEXT							      ;
	PUSHL   R4				     ;R4								      ; 3520
	CALLS   #1, (R5)			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_OUTPUT			     ;#0, TT_OUTPUT							      ; 3521
11$:	BLBC    W^FIL_NORMAL_FORM, 12$		     ;FIL_NORMAL_FORM, 12$						      ; 3528
	PUSHL   #3				     ;#3								      ;
	PUSHL   #9				     ;#9								      ;
	PUSHAB  W^FILE_SIZE			     ;FILE_SIZE								      ;
	PUSHL   R4				     ;R4								      ;
	CALLS   #4, W^U.27			     ;#4, U.27								      ;
12$:	CLRL    220(R2)				     ;FILE_CHARS							      ; 3530
	PUSHL   #1				     ;#1								      ; 3532
	CALLS   #1, W^FILE_OPEN			     ;#1, FILE_OPEN							      ;
	BLBS    R0, 13$				     ;R0, 13$								      ;
	BRW     18$				     ;18$								      ;
13$:	MOVZBL  #82, -(SP)			     ;#82, -(SP)							      ; 3534
	MOVZBL  #70, -(SP)			     ;#70, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	CLRL    224(R2)				     ;TEXT_HEAD_FLAG							      ; 3535
	MOVL    #1, 216(R2)			     ;#1, FILE_OPEN_FLAG						      ; 3536
	BRB     15$				     ;15$								      ; 3537
14$:	CMPL    R0, #88				     ;R0, #88								      ; 3544
	BNEQ    16$				     ;16$								      ;
	CMPL    (R2), 4(R2)			     ;MSG_NUMBER, REC_SEQ						      ; 3551
	BNEQ    17$				     ;17$								      ;
	MOVL    #1, 224(R2)			     ;#1, TEXT_HEAD_FLAG						      ; 3558
	MOVAB   W^U.31, 248(R2)			     ;U.31, PUT_CHR_ROUTINE						      ; 3559
	TSTL    8(R2)				     ;REC_LENGTH							      ; 3561
	BLEQ    15$				     ;15$								      ;
	PUSHAB  W^P.AAI				     ;P.AAI								      ; 3564
	CALLS   #1, (R5)			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^U.28			     ;#0, U.28								      ; 3565
	PUSHAB  W^P.AAJ				     ;P.AAJ								      ; 3566
	CALLS   #1, (R5)			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 3567
15$:	PUSHL   (R2)				     ;MSG_NUMBER							      ; 3570
	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, (R3)			     ;#3, SEND_PACKET							      ;
	MOVL    -4(R2), -8(R2)			     ;NUM_RETRIES, OLD_RETRIES						      ; 3571
	CLRL    -4(R2)				     ;NUM_RETRIES							      ; 3572
	ADDL3   #1, (R2), R0			     ;#1, MSG_NUMBER, R0						      ; 3573
	EXTZV   #0, #6, R0, (R2)		     ;#0, #6, R0, MSG_NUMBER						      ;
	MOVL    #8, R0				     ;#8, R0								      ; 3574
	RET     				     ;									      ;
16$:	CMPL    R0, #66				     ;R0, #66								      ; 3577
	BNEQ    17$				     ;17$								      ;
	CMPL    (R2), 4(R2)			     ;MSG_NUMBER, REC_SEQ						      ; 3580
	BNEQ    17$				     ;17$								      ;
	PUSHL   4(R2)				     ;REC_SEQ								      ; 3587
	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, (R3)			     ;#3, SEND_PACKET							      ;
	MOVL    #9, R0				     ;#9, R0								      ; 3588
	RET     				     ;									      ;
17$:	PUSHL   #134316226			     ;#134316226							      ; 3593
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
18$:	MOVL    #10, R0				     ;#10, R0								      ; 3594
	RET     				     ;									      ; 3598

; Routine Size:  465 bytes,    Routine Base:  $CODE$ + 0E3F


;   3599  1	%SBTTL 'REC_DATA'
;   3600  1	ROUTINE REC_DATA =
;   3601  1	
;   3602  1	!++
;   3603  1	! FUNCTIONAL DESCRIPTION:
;   3604  1	!
;   3605  1	! This routine will accept data messages and write them to disk.
;   3606  1	! It will also accept MSG_FILE, MSG_TEXT and MSG_EOF messages.
;   3607  1	!
;   3608  1	! CALLING SEQUENCE:
;   3609  1	!
;   3610  1	!	STATE = REC_DATA();
;   3611  1	!
;   3612  1	! INPUT PARAMETERS:
;   3613  1	!
;   3614  1	!	None.
;   3615  1	!
;   3616  1	! IMPLICIT INPUTS:
;   3617  1	!
;   3618  1	!	None.
;   3619  1	!
;   3620  1	! OUTPUT PARAMETERS:
;   3621  1	!
;   3622  1	!	New state for the finite state machine.
;   3623  1	!
;   3624  1	! IMPLICIT OUTPUTS:
;   3625  1	!
;   3626  1	!	None.
;   3627  1	!
;   3628  1	! COMPLETION CODES:
;   3629  1	!
;   3630  1	!	None.
;   3631  1	!
;   3632  1	! SIDE EFFECTS:
;   3633  1	!
;   3634  1	!	None.
;   3635  1	!
;   3636  1	!--
;   3637  1	
;   3638  2	    BEGIN
;   3639  2	
;   3640  2	    LOCAL
;   3641  2		STATUS;
;   3642  2	
;   3643  2	    ROUTINE CHECK_DATA =
;   3644  3		BEGIN
;   3645  3	
;   3646  3		IF .REC_TYPE EQL MSG_DATA OR (.REC_TYPE EQL MSG_FILE AND NOT .TEXT_HEAD_FLAG) OR .REC_TYPE
;   3647  4		    EQL MSG_EOF OR (.REC_TYPE EQL MSG_TEXT AND .TEXT_HEAD_FLAG)
;   3648  3		THEN
;   3649  3		    RETURN TRUE
;   3650  3		ELSE
;   3651  3		    RETURN FALSE;
;   3652  3	
;   3653  2		END;





;CHECK_DATA
U.78:	.WORD   ^M<>				     ;Save nothing							      ; 3643
	MOVL    W^U.56, R0			     ;U.56, R0								      ; 3646
	CMPL    R0, #68				     ;R0, #68								      ;
	BEQL    2$				     ;2$								      ;
	CMPL    R0, #70				     ;R0, #70								      ;
	BNEQ    1$				     ;1$								      ;
	BLBC    W^U.61, 2$			     ;U.61, 2$								      ;
1$:	CMPL    R0, #90				     ;R0, #90								      ; 3647
	BEQL    2$				     ;2$								      ;
	CMPL    R0, #88				     ;R0, #88								      ;
	BNEQ    3$				     ;3$								      ;
	BLBC    W^U.61, 3$			     ;U.61, 3$								      ;
2$:	MOVL    #1, R0				     ;#1, R0								      ; 3651
	RET     				     ;									      ;
3$:	CLRL    R0				     ;R0								      ;
	RET     				     ;									      ; 3653

; Routine Size:  60 bytes,    Routine Base:  $CODE$ + 1010


;   3654  2	
;   3655  2	    LOCAL
;   3656  2		SUB_TYPE,				! Subtype for XFR_STATUS
;   3657  2		DISCARD_FILE_FLAG,			! Sender requested discard
;   3658  2		ACK_MSG_LEN;				! Length of ACK to send
;   3659  2	
;   3660  2	!
;   3661  2	! First get a message
;   3662  2	!
;   3663  2	
;   3664  3	    IF NOT (STATUS = REC_MESSAGE (CHECK_DATA))
;   3665  2	    THEN
;   3666  2	
;   3667  2		IF .STATUS NEQ KER_ABORTED THEN RETURN STATE_A ELSE RETURN STATE_EX;
;   3668  2	
;   3669  2	    SELECTONE .REC_TYPE OF
;   3670  2		SET
;   3671  2	
;   3672  2		[MSG_DATA] :
;   3673  3		    BEGIN
;   3674  3	
;   3675  3		    IF .MSG_NUMBER NEQ .REC_SEQ
;   3676  3		    THEN
;   3677  4			BEGIN
;   3678  4	
;   3679  4			IF .OLD_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER;
;   3680  4	
;   3681  4			OLD_RETRIES = .OLD_RETRIES + 1;
;   3682  4	
;   3683  4			IF ((.MSG_NUMBER - 1) AND %O'77') EQL .REC_SEQ
;   3684  4			THEN
;   3685  5			    BEGIN
;   3686  5			    SEND_PACKET (MSG_ACK, 0, .REC_SEQ);
;   3687  5			    NUM_RETRIES = 0;
;   3688  5			    RETURN .STATE;
;   3689  5			    END
;   3690  4			ELSE
;   3691  5			    BEGIN
;   3692  5			    KRM_ERROR (KER_PROTOERR);
;   3693  5			    RETURN STATE_A;
;   3694  4			    END;
;   3695  4	
;   3696  3			END;
;   3697  3	
;   3698  3	!
;   3699  3	! Here if we have a message with a valid message number
;   3700  3	!
;   3701  3	
;   3702  3		    IF NOT BFR_EMPTY () THEN RETURN STATE_A;
;   3703  3	
;   3704  3	!
;   3705  3	! Check if we wish to abort for some reason
;   3706  3	!
;   3707  3	
;   3708  3		    IF .ABT_CUR_FILE
;   3709  3		    THEN
;   3710  4			BEGIN
;   3711  4			CH$WCHAR (MSG_ACK_ABT_CUR, CH$PTR (SND_MSG, PKT_MSG, CHR_SIZE));
;   3712  4			ACK_MSG_LEN = 1;
;   3713  4			END
;   3714  3		    ELSE
;   3715  3	
;   3716  3			IF .ABT_ALL_FILE
;   3717  3			THEN
;   3718  4			    BEGIN
;   3719  4			    CH$WCHAR (MSG_ACK_ABT_ALL, CH$PTR (SND_MSG, PKT_MSG, CHR_SIZE));
;   3720  4			    ACK_MSG_LEN = 1;
;   3721  4			    END
;   3722  3			ELSE
;   3723  3			    ACK_MSG_LEN = 0;
;   3724  3	
;   3725  3	!
;   3726  3	! Now send the ACK
;   3727  3	!
;   3728  3		    SEND_PACKET (MSG_ACK, .ACK_MSG_LEN, .REC_SEQ);
;   3729  3		    OLD_RETRIES = .NUM_RETRIES;
;   3730  3		    NUM_RETRIES = 0;
;   3731  3		    MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   3732  3		    RETURN STATE_RD;
;   3733  2		    END;
;   3734  2	
;   3735  2		[MSG_FILE, MSG_TEXT] :
;   3736  3		    BEGIN
;   3737  3	
;   3738  3		    IF .OLD_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER;
;   3739  3	
;   3740  3		    OLD_RETRIES = .OLD_RETRIES + 1;
;   3741  3	
;   3742  3		    IF ((.MSG_NUMBER - 1) AND %O'77') EQL .REC_SEQ
;   3743  3		    THEN
;   3744  4			BEGIN
;   3745  4			SEND_PACKET (MSG_ACK, 0, .REC_SEQ);
;   3746  4			NUM_RETRIES = 0;
;   3747  4			RETURN .STATE;
;   3748  4			END
;   3749  3		    ELSE
;   3750  4			BEGIN
;   3751  4			KRM_ERROR (KER_PROTOERR);
;   3752  4			RETURN STATE_A;
;   3753  3			END;
;   3754  3	
;   3755  2		    END;
;   3756  2	
;   3757  2		[MSG_EOF] :
;   3758  3		    BEGIN
;   3759  3	
;   3760  3		    IF .MSG_NUMBER NEQ .REC_SEQ
;   3761  3		    THEN
;   3762  4			BEGIN
;   3763  4			KRM_ERROR (KER_PROTOERR);
;   3764  4			RETURN STATE_A;
;   3765  3			END;
;   3766  3	
;   3767  3		    SEND_PACKET (MSG_ACK, 0, .REC_SEQ);
;   3768  3	
;   3769  3		    IF NOT .TEXT_HEAD_FLAG
;   3770  3		    THEN
;   3771  4			BEGIN
;   3772  4			FILE_OPEN_FLAG = FALSE;
;   3773  4			DISCARD_FILE_FLAG = FALSE;	! Assume we want file
;   3774  4	
;   3775  4			IF .REC_LENGTH EQL 1
;   3776  4			THEN
;   3777  4	
;   3778  4			    IF CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG, CHR_SIZE)) EQL MSG_EOF_DISCARD
;   3779  4			    THEN
;   3780  4				DISCARD_FILE_FLAG = TRUE;
;   3781  4	
;   3782  4			IF ( NOT .CONNECT_FLAG) AND .TY_FIL
;   3783  4			THEN
;   3784  5			    BEGIN
;   3785  5	
;   3786  5			    IF .DISCARD_FILE_FLAG
;   3787  5			    THEN
;   3788  5	
;   3789  5				IF .ABT_FLAG
;   3790  5				THEN
;   3791  5				    TT_TEXT (UPLIT (%ASCIZ' [Interrupted]'))
;   3792  5				ELSE
;   3793  5				    TT_TEXT (UPLIT (%ASCIZ' [Interrupted, partial file saved]'))
;   3794  5	
;   3795  5			    ELSE
;   3796  5				TT_TEXT (UPLIT (%ASCIZ' [OK]'));
;   3797  5	
;   3798  5			    TT_CRLF ();
;   3799  4			    END;
;   3800  4	
;   3801  4			IF NOT FILE_CLOSE (.DISCARD_FILE_FLAG AND .ABT_FLAG) THEN RETURN STATE_A;
;   3802  4	
;   3803  4			IF .DISCARD_FILE_FLAG
;   3804  4			THEN
;   3805  4	
;   3806  4			    IF .ABT_FLAG THEN SUB_TYPE = %C'X' ELSE SUB_TYPE = %C'D'
;   3807  4	
;   3808  4			ELSE
;   3809  4			    SUB_TYPE = %C'C';
;   3810  4	
;   3811  4			END
;   3812  3		    ELSE
;   3813  4			BEGIN
;   3814  4			TT_CRLF ();			! Make sure we have a CRLF
;   3815  4			TT_OUTPUT ();			! And make sure all output is sent
;   3816  3			END;
;   3817  3	
;   3818  3		    XFR_STATUS (%C'F', .SUB_TYPE);
;   3819  3		    MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77';
;   3820  3		    RETURN STATE_RF;
;   3821  2		    END;
;   3822  2	
;   3823  2		[OTHERWISE] :
;   3824  3		    BEGIN
;   3825  3		    KRM_ERROR (KER_PROTOERR);
;   3826  3		    RETURN STATE_A;
;   3827  2		    END;
;   3828  2		TES;
;   3829  2	
;   3830  1	    END;					! End of REC_DATA



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.AAK:	.ASCII  \ [Interrupted]\<0><0>		     ;									      ;
P.AAL:	.ASCII  \ [Interrupted, partial file saved]\<0><0>
						     ;									      ;
P.AAM:	.ASCII  \ [OK]\<0><0><0>		     ;									      ;



	.PSECT  $CODE$,NOWRT,2

;REC_DATA
U.13:	.WORD   ^M<R2,R3,R4,R5>			     ;Save R2,R3,R4,R5							      ; 3600
	MOVAB   W^ABT_FLAG, R5			     ;ABT_FLAG, R5							      ;
	MOVAB   W^U.24, R4			     ;U.24, R4								      ;
	MOVAB   W^U.53, R3			     ;U.53, R3								      ;
	PUSHAB  B^U.78				     ;U.78								      ; 3664
	CALLS   #1, W^U.25			     ;#1, U.25								      ;
	BLBS    R0, 3$				     ;STATUS, 3$							      ;
	CMPL    R0, #134316258			     ;STATUS, #134316258						      ; 3667
	BEQL    2$				     ;2$								      ;
1$:	BRW     28$				     ;28$								      ;
2$:	MOVL    #19, R0				     ;#19, R0								      ;
	RET     				     ;									      ;
3$:	MOVL    12(R3), R0			     ;REC_TYPE, R0							      ; 3669
	CMPL    R0, #68				     ;R0, #68								      ; 3672
	BNEQ    9$				     ;9$								      ;
	MOVL    4(R3), R1			     ;REC_SEQ, R1							      ; 3675
	CMPL    (R3), R1			     ;MSG_NUMBER, R1							      ;
	BEQL    4$				     ;4$								      ;
	CMPL    -8(R3), W^PKT_RETRIES		     ;OLD_RETRIES, PKT_RETRIES						      ; 3679
	BGTR    11$				     ;11$								      ;
	INCL    -8(R3)				     ;OLD_RETRIES							      ; 3681
	SUBL3   #1, (R3), R0			     ;#1, MSG_NUMBER, R0						      ; 3683
	CMPZV   #0, #6, R0, R1			     ;#0, #6, R0, R1							      ;
	BNEQ    13$				     ;13$								      ;
	PUSHL   R1				     ;R1								      ; 3686
	BRB     14$				     ;14$								      ;
4$:	CALLS   #0, W^U.28			     ;#0, U.28								      ; 3702
	BLBC    R0, 1$				     ;R0, 1$								      ;
	BLBC    W^ABT_CUR_FILE, 5$		     ;ABT_CUR_FILE, 5$							      ; 3708
	MOVB    #88, 120(R3)			     ;#88, SND_MSG+4							      ; 3711
	BRB     6$				     ;6$								      ; 3712
5$:	BLBC    W^ABT_ALL_FILE, 7$		     ;ABT_ALL_FILE, 7$							      ; 3716
	MOVB    #90, 120(R3)			     ;#90, SND_MSG+4							      ; 3719
6$:	MOVL    #1, R0				     ;#1, ACK_MSG_LEN							      ; 3720
	BRB     8$				     ;8$								      ; 3716
7$:	CLRL    R0				     ;ACK_MSG_LEN							      ; 3723
8$:	PUSHL   4(R3)				     ;REC_SEQ								      ; 3728
	PUSHL   R0				     ;ACK_MSG_LEN							      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, (R4)			     ;#3, SEND_PACKET							      ;
	MOVL    -4(R3), -8(R3)			     ;NUM_RETRIES, OLD_RETRIES						      ; 3729
	CLRL    -4(R3)				     ;NUM_RETRIES							      ; 3730
	ADDL3   #1, (R3), R0			     ;#1, MSG_NUMBER, R0						      ; 3731
	EXTZV   #0, #6, R0, (R3)		     ;#0, #6, R0, MSG_NUMBER						      ;
	MOVL    #8, R0				     ;#8, R0								      ; 3732
	RET     				     ;									      ;
9$:	CMPL    R0, #70				     ;R0, #70								      ; 3735
	BEQL    10$				     ;10$								      ;
	CMPL    R0, #88				     ;R0, #88								      ;
	BNEQ    15$				     ;15$								      ;
10$:	CMPL    -8(R3), W^PKT_RETRIES		     ;OLD_RETRIES, PKT_RETRIES						      ; 3738
	BLEQ    12$				     ;12$								      ;
11$:	MOVL    #20, R0				     ;#20, R0								      ;
	RET     				     ;									      ;
12$:	INCL    -8(R3)				     ;OLD_RETRIES							      ; 3740
	SUBL3   #1, (R3), R0			     ;#1, MSG_NUMBER, R0						      ; 3742
	CMPZV   #0, #6, R0, 4(R3)		     ;#0, #6, R0, REC_SEQ						      ;
13$:	BNEQ    16$				     ;16$								      ;
	PUSHL   4(R3)				     ;REC_SEQ								      ; 3745
14$:	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, (R4)			     ;#3, SEND_PACKET							      ;
	CLRL    -4(R3)				     ;NUM_RETRIES							      ; 3746
	MOVL    -16(R3), R0			     ;STATE, R0								      ; 3750
	RET     				     ;									      ;
15$:	CMPL    R0, #90				     ;R0, #90								      ; 3757
	BNEQ    16$				     ;16$								      ;
	CMPL    (R3), 4(R3)			     ;MSG_NUMBER, REC_SEQ						      ; 3760
16$:	BEQL    17$				     ;17$								      ;
	BRW     27$				     ;27$								      ;
17$:	PUSHL   4(R3)				     ;REC_SEQ								      ; 3767
	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, (R4)			     ;#3, SEND_PACKET							      ;
	BLBS    224(R3), 25$			     ;TEXT_HEAD_FLAG, 25$						      ; 3769
	CLRL    216(R3)				     ;FILE_OPEN_FLAG							      ; 3772
	CLRL    R2				     ;DISCARD_FILE_FLAG							      ; 3773
	CMPL    8(R3), #1			     ;REC_LENGTH, #1							      ; 3775
	BNEQ    18$				     ;18$								      ;
	CMPB    20(R3), #68			     ;REC_MSG+4, #68							      ; 3778
	BNEQ    18$				     ;18$								      ;
	MOVL    #1, R2				     ;#1, DISCARD_FILE_FLAG						      ; 3780
18$:	BLBS    W^CONNECT_FLAG, 22$		     ;CONNECT_FLAG, 22$							      ; 3782
	BLBC    W^TY_FIL, 22$			     ;TY_FIL, 22$							      ;
	BLBC    R2, 20$				     ;DISCARD_FILE_FLAG, 20$						      ; 3786
	BLBC    (R5), 19$			     ;ABT_FLAG, 19$							      ; 3789
	PUSHAB  W^P.AAK				     ;P.AAK								      ; 3791
	BRB     21$				     ;21$								      ;
19$:	PUSHAB  W^P.AAL				     ;P.AAL								      ; 3793
	BRB     21$				     ;21$								      ;
20$:	PUSHAB  W^P.AAM				     ;P.AAM								      ; 3796
21$:	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 3798
22$:	MCOML   (R5), R0			     ;ABT_FLAG, R0							      ; 3801
	BICL3   R0, R2, -(SP)			     ;R0, DISCARD_FILE_FLAG, -(SP)					      ;
	CALLS   #1, W^FILE_CLOSE		     ;#1, FILE_CLOSE							      ;
	BLBC    R0, 28$				     ;R0, 28$								      ;
	BLBC    R2, 24$				     ;DISCARD_FILE_FLAG, 24$						      ; 3803
	BLBC    (R5), 23$			     ;ABT_FLAG, 23$							      ; 3806
	MOVZBL  #88, R0				     ;#88, SUB_TYPE							      ;
	BRB     26$				     ;26$								      ;
23$:	MOVZBL  #68, R0				     ;#68, SUB_TYPE							      ;
	BRB     26$				     ;26$								      ;
24$:	MOVZBL  #67, R0				     ;#67, SUB_TYPE							      ; 3809
	BRB     26$				     ;26$								      ; 3769
25$:	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 3814
	CALLS   #0, W^TT_OUTPUT			     ;#0, TT_OUTPUT							      ; 3815
26$:	PUSHL   R0				     ;SUB_TYPE								      ; 3818
	MOVZBL  #70, -(SP)			     ;#70, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	ADDL3   #1, (R3), R0			     ;#1, MSG_NUMBER, R0						      ; 3819
	EXTZV   #0, #6, R0, (R3)		     ;#0, #6, R0, MSG_NUMBER						      ;
	MOVL    #7, R0				     ;#7, R0								      ; 3820
	RET     				     ;									      ;
27$:	PUSHL   #134316226			     ;#134316226							      ; 3825
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
28$:	MOVL    #10, R0				     ;#10, R0								      ; 3826
	RET     				     ;									      ; 3830

; Routine Size:  414 bytes,    Routine Base:  $CODE$ + 104C


;   3831  1	%SBTTL 'SERVER - Generic commands'
;   3832  1	ROUTINE SERVER_GENERIC =
;   3833  1	
;   3834  1	!++
;   3835  1	! FUNCTIONAL DESCRIPTION:
;   3836  1	!
;   3837  1	!	This routine will handle the generic server messages.
;   3838  1	!	The generic server messages include FINISH, LOGOUT.
;   3839  1	!
;   3840  1	! CALLING SEQUENCE:
;   3841  1	!
;   3842  1	!	STATE = SERVER_GENERIC();
;   3843  1	!
;   3844  1	! INPUT PARAMETERS:
;   3845  1	!
;   3846  1	!	None.
;   3847  1	!
;   3848  1	! IMPLICIT INPUTS:
;   3849  1	!
;   3850  1	!	Generic message receive in REC_MSG.
;   3851  1	!
;   3852  1	! OUTPUT PARAMETERS:
;   3853  1	!
;   3854  1	!	Returns new state for FSM
;   3855  1	!
;   3856  1	! IMPLICIT OUTPUTS:
;   3857  1	!
;   3858  1	!	None.
;   3859  1	!
;   3860  1	! COMPLETION CODES:
;   3861  1	!
;   3862  1	!	None.
;   3863  1	!
;   3864  1	! SIDE EFFECTS:
;   3865  1	!
;   3866  1	!	None.
;   3867  1	!
;   3868  1	!--
;   3869  1	
;   3870  2	    BEGIN
;   3871  2	
;   3872  2	    LOCAL
;   3873  2		STATUS,					! Returned status
;   3874  2		G_FUNC,					! Generic command function
;   3875  2		POINTER,				! Character pointer
;   3876  2		DATA_TEXT : VECTOR [CH$ALLOCATION (MAX_MSG)],	! Unpacked message
;   3877  2		DATA_SIZE;				! Actual size of data
;   3878  2	
;   3879  2	    ROUTINE UNPACK_DATA (POINTER, SIZE, DST_ADDR, DST_LEN) =
;   3880  2	!
;   3881  2	! Routine to unpack an argument.
;   3882  2	! This will copy the argument data to the desired buffer.
;   3883  2	!
;   3884  3		BEGIN
;   3885  3	
;   3886  3		IF .SIZE GTR 0				! If we have something to unpack
;   3887  3		THEN
;   3888  4		    BEGIN
;   3889  4		    .DST_LEN = UNCHAR (CH$RCHAR_A (.POINTER));
;   3890  4	
;   3891  4		    IF ..DST_LEN LSS 0
;   3892  4		    THEN
;   3893  5			BEGIN
;   3894  5			KRM_ERROR (KER_PROTOERR);	! Someone screwed up
;   3895  5			..DST_LEN = 0;
;   3896  5			RETURN -1;
;   3897  4			END;
;   3898  4	
;   3899  4		    IF ..DST_LEN GTR .SIZE - 1 THEN .DST_LEN = .SIZE - 1;
;   3900  4	
;   3901  4		    CH$COPY (..DST_LEN, ..POINTER, CHR_NUL, MAX_MSG, CH$PTR (.DST_ADDR));
;   3902  4		    .POINTER = CH$PLUS (..POINTER, ..DST_LEN);
;   3903  4		    RETURN .SIZE - ..DST_LEN - 1;
;   3904  4		    END
;   3905  3		ELSE
;   3906  3	!
;   3907  3	! If nothing left in buffer, return the current size (0)
;   3908  3	!
;   3909  3		    RETURN .SIZE;
;   3910  3	
;   3911  2		END;





;UNPACK_DATA
U.79:	.WORD   ^M<R2,R3,R4,R5,R6>		     ;Save R2,R3,R4,R5,R6						      ; 3879
	MOVL    8(AP), R6			     ;SIZE, R6								      ; 3886
	BLEQ    3$				     ;3$								      ;
	MOVL    @4(AP), R1			     ;@POINTER, R1							      ; 3889
	MOVZBL  (R1), R0			     ;(R1), R0								      ;
	INCL    @4(AP)				     ;@POINTER								      ;
	MOVAB   -32(R0), @16(AP)		     ;-32(R0), @DST_LEN							      ;
	MOVL    @16(AP), R2			     ;@DST_LEN, R2							      ; 3891
	BGEQ    1$				     ;1$								      ;
	PUSHL   #134316226			     ;#134316226							      ; 3894
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	CLRL    (R2)				     ;(R2)								      ; 3895
	MNEGL   #1, R0				     ;#1, R0								      ; 3896
	RET     				     ;									      ;
1$:	MOVAB   -1(R6), R0			     ;-1(R6), R0							      ; 3899
	CMPL    R2, R0				     ;R2, R0								      ;
	BLEQ    2$				     ;2$								      ;
	MOVL    R0, @16(AP)			     ;R0, @DST_LEN							      ;
2$:	MOVL    @4(AP), R0			     ;@POINTER, R0							      ; 3901
	MOVC5   @16(AP), (R0), #0, #96, @12(AP)      ;@DST_LEN, (R0), #0, #96, @DST_ADDR				      ;
	ADDL2   @16(AP), @4(AP)			     ;@DST_LEN, @POINTER						      ; 3902
	SUBL3   @16(AP), R6, R0			     ;@DST_LEN, R6, R0							      ; 3903
	DECL    R0				     ;R0								      ;
	RET     				     ;									      ; 3909
3$:	MOVL    R6, R0				     ;R6, R0								      ;
	RET     				     ;									      ; 3911

; Routine Size:  90 bytes,    Routine Base:  $CODE$ + 11EA


;   3912  2	!
;   3913  2	! First unpack the message data into its various pieces
;   3914  2	!
;   3915  2	    SET_STRING (CH$PTR (DATA_TEXT), MAX_MSG, TRUE);	! Initialize for unpacking
;   3916  2	    BFR_EMPTY ();				! Unpack the data
;   3917  2	    DATA_SIZE = SET_STRING (0, 0, FALSE);	! All done, get size
;   3918  2	
;   3919  2	    IF .DATA_SIZE LEQ 0
;   3920  2	    THEN
;   3921  3		BEGIN
;   3922  3		KRM_ERROR (KER_PROTOERR);		! Someone screwed up
;   3923  3		RETURN STATE_A;				! Since no subtype
;   3924  2		END;
;   3925  2	
;   3926  2	!
;   3927  2	! Get the arguments from the unpacked data (if any)
;   3928  2	!
;   3929  2	    GEN_1SIZE = 0;				! Assume no args
;   3930  2	    GEN_2SIZE = 0;				! none at all
;   3931  2	    GEN_3SIZE = 0;
;   3932  2	    CH$WCHAR (CHR_NUL, CH$PTR (GEN_1DATA));	! Ensure all are null terminated
;   3933  2	    CH$WCHAR (CHR_NUL, CH$PTR (GEN_2DATA));
;   3934  2	    CH$WCHAR (CHR_NUL, CH$PTR (GEN_3DATA));
;   3935  2	    POINTER = CH$PTR (DATA_TEXT, 1);		! Point at second character
;   3936  2	    DATA_SIZE = .DATA_SIZE - 1;			! Account for subtype
;   3937  2	
;   3938  2	    IF .DATA_SIZE GTR 0				! Room for first arg?
;   3939  2	    THEN
;   3940  3		BEGIN
;   3941  3		DATA_SIZE = UNPACK_DATA (POINTER, .DATA_SIZE, GEN_1DATA, GEN_1SIZE);
;   3942  3	
;   3943  3		IF .DATA_SIZE LSS 0 THEN RETURN STATE_A;	! Punt if bad arguments
;   3944  3	
;   3945  3		IF .DATA_SIZE GTR 0			! Second argument present?
;   3946  3		THEN
;   3947  4		    BEGIN
;   3948  4		    DATA_SIZE = UNPACK_DATA (POINTER, .DATA_SIZE, GEN_2DATA, GEN_2SIZE);
;   3949  4	
;   3950  4		    IF .DATA_SIZE LSS 0 THEN RETURN STATE_A;	! Punt if bad arguments
;   3951  4	
;   3952  4		    IF .DATA_SIZE GTR 0			! Third argument here?
;   3953  4		    THEN
;   3954  5			BEGIN
;   3955  5			DATA_SIZE = UNPACK_DATA (POINTER, .DATA_SIZE, GEN_3DATA, GEN_3SIZE);
;   3956  5	
;   3957  5			IF .DATA_SIZE LSS 0 THEN RETURN STATE_A;	! Punt if bad arguments
;   3958  5	
;   3959  4			END;
;   3960  4	
;   3961  3		    END;
;   3962  3	
;   3963  2		END;
;   3964  2	
;   3965  2	    SELECTONE CH$RCHAR (CH$PTR (DATA_TEXT)) OF
;   3966  2		SET
;   3967  2		!
;   3968  2		! EXIT command, just return the status to the upper level
;   3969  2		!
;   3970  2	
;   3971  2		[MSG_GEN_EXIT] :
;   3972  3		    BEGIN
;   3973  3		    SEND_PACKET (MSG_ACK, 0, .REC_SEQ);
;   3974  3		    RETURN STATE_FI;
;   3975  2		    END;
;   3976  2		!
;   3977  2		! LOGOUT command, ACK the message then call the system routine to
;   3978  2		! kill the process (log the job out, etc.)
;   3979  2		!
;   3980  2	
;   3981  2		[MSG_GEN_LOGOUT] :
;   3982  3		    BEGIN
;   3983  3		    SEND_PACKET (MSG_ACK, 0, .REC_SEQ);
;   3984  3		    SY_LOGOUT ();
;   3985  3		    RETURN STATE_LG;
;   3986  2		    END;
;   3987  2	!
;   3988  2	! For a type command, just set up a transfer flagging we want a text header
;   3989  2	! instead of a file header.
;   3990  2	!
;   3991  2	
;   3992  2		[MSG_GEN_TYPE] :
;   3993  3		    BEGIN
;   3994  3		    CH$COPY (.GEN_1SIZE, CH$PTR (GEN_1DATA), CHR_NUL, MAX_FILE_NAME, CH$PTR (FILE_NAME));
;   3995  3		    FILE_SIZE = .GEN_1SIZE;
;   3996  3		    TEXT_HEAD_FLAG = TRUE;		! Now want text header
;   3997  3		    XFR_STATUS (%C'I', %C'G');		! Tell display routine we are doing a command
;   3998  3	
;   3999  3		    IF .STATE EQL STATE_II AND .BLK_CHK_TYPE EQL .INI_CHK_TYPE
;   4000  3		    THEN
;   4001  3			RETURN STATE_OF			! Must open the file
;   4002  3		    ELSE
;   4003  3			RETURN STATE_S;			! Start the transaction with a send
;   4004  3	
;   4005  2		    END;
;   4006  2	
;   4007  2		[MSG_GEN_DIRECTORY] :
;   4008  2		    G_FUNC = GC_DIRECTORY;
;   4009  2	
;   4010  2		[MSG_GEN_DISK_USAGE] :
;   4011  2		    G_FUNC = GC_DISK_USAGE;
;   4012  2	
;   4013  2		[MSG_GEN_DELETE] :
;   4014  2		    G_FUNC = GC_DELETE;
;   4015  2	
;   4016  2		[MSG_GEN_HELP] :
;   4017  2		    G_FUNC = GC_HELP;
;   4018  2	
;   4019  2		[MSG_GEN_LOGIN] :
;   4020  2		    G_FUNC = GC_LGN;
;   4021  2	
;   4022  2		[MSG_GEN_CONNECT] :
;   4023  2		    G_FUNC = GC_CONNECT;
;   4024  2	
;   4025  2		[MSG_GEN_RENAME] :
;   4026  2		    G_FUNC = GC_RENAME;
;   4027  2	
;   4028  2		[MSG_GEN_COPY] :
;   4029  2		    G_FUNC = GC_COPY;
;   4030  2	
;   4031  2		[MSG_GEN_WHO] :
;   4032  2		    G_FUNC = GC_WHO;
;   4033  2	
;   4034  2		[MSG_GEN_SEND] :
;   4035  2		    G_FUNC = GC_SEND_MSG;
;   4036  2	
;   4037  2		[MSG_GEN_QUERY] :
;   4038  2		    G_FUNC = GC_STATUS;
;   4039  2	
;   4040  2		[MSG_GEN_PROGRAM] :
;   4041  2		    G_FUNC = GC_PROGRAM;
;   4042  2	
;   4043  2		[MSG_GEN_JOURNAL] :
;   4044  2		    G_FUNC = GC_JOURNAL;
;   4045  2	
;   4046  2		[MSG_GEN_VARIABLE] :
;   4047  2		    G_FUNC = GC_VARIABLE;
;   4048  2	!
;   4049  2	! Here if we have a function that is not implemented in KERMSG.
;   4050  2	!
;   4051  2	
;   4052  2		[OTHERWISE] :
;   4053  3		    BEGIN
;   4054  3		    KRM_ERROR (KER_UNIMPLGEN);
;   4055  3		    RETURN STATE_A;
;   4056  2		    END;
;   4057  2		TES;
;   4058  2	
;   4059  2	!
;   4060  2	! If we get here, we have gotten a known type of generic message that
;   4061  2	! we need to have our operating system dependent routine handle.
;   4062  2	!
;   4063  2	    RETURN CALL_SY_RTN (.G_FUNC);
;   4064  1	    END;					! End of SERVER_GENERIC





;SERVER_GENERIC
U.14:	.WORD   ^M<R2,R3,R4,R5,R6,R7,R8,R9,R10>      ;Save R2,R3,R4,R5,R6,R7,R8,R9,R10					      ; 3832
	MOVAB   B^U.79, R10			     ;U.79, R10								      ;
	MOVAB   W^GEN_1DATA, R9			     ;GEN_1DATA, R9							      ;
	MOVAB   W^GEN_1SIZE, R8			     ;GEN_1SIZE, R8							      ;
	MOVAB   W^U.54, R7			     ;U.54, R7								      ;
	MOVAB   -100(SP), SP			     ;-100(SP), SP							      ;
	PUSHL   #1				     ;#1								      ; 3915
	MOVZBL  #96, -(SP)			     ;#96, -(SP)							      ;
	PUSHAB  12(SP)				     ;DATA_TEXT								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	CALLS   #0, W^U.28			     ;#0, U.28								      ; 3916
	CLRQ    -(SP)				     ;-(SP)								      ; 3917
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	MOVL    R0, R2				     ;R0, DATA_SIZE							      ;
	BGTR    1$				     ;1$								      ; 3919
	PUSHL   #134316226			     ;#134316226							      ; 3922
	BRW     25$				     ;25$								      ;
1$:	CLRL    (R8)				     ;GEN_1SIZE								      ; 3929
	CLRL    W^GEN_2SIZE			     ;GEN_2SIZE								      ; 3930
	CLRL    W^GEN_3SIZE			     ;GEN_3SIZE								      ; 3931
	CLRB    (R9)				     ;GEN_1DATA								      ; 3932
	CLRB    W^GEN_2DATA			     ;GEN_2DATA								      ; 3933
	CLRB    W^GEN_3DATA			     ;GEN_3DATA								      ; 3934
	MOVAB   5(SP), (SP)			     ;DATA_TEXT+1, POINTER						      ; 3935
	DECL    R2				     ;DATA_SIZE								      ; 3936
	BLEQ    3$				     ;3$								      ; 3938
	PUSHL   R8				     ;R8								      ; 3941
	PUSHR   #^M<R2,R9>			     ;#^M<R2,R9>							      ;
	PUSHAB  12(SP)				     ;POINTER								      ;
	CALLS   #4, (R10)			     ;#4, UNPACK_DATA							      ;
	MOVL    R0, R2				     ;R0, DATA_SIZE							      ;
	BLSS    2$				     ;2$								      ; 3943
	BLEQ    3$				     ;3$								      ; 3945
	PUSHAB  W^GEN_2SIZE			     ;GEN_2SIZE								      ; 3948
	PUSHAB  W^GEN_2DATA			     ;GEN_2DATA								      ;
	PUSHL   R2				     ;DATA_SIZE								      ;
	PUSHAB  12(SP)				     ;POINTER								      ;
	CALLS   #4, (R10)			     ;#4, UNPACK_DATA							      ;
	MOVL    R0, R2				     ;R0, DATA_SIZE							      ;
	BLSS    2$				     ;2$								      ; 3950
	BLEQ    3$				     ;3$								      ; 3952
	PUSHAB  W^GEN_3SIZE			     ;GEN_3SIZE								      ; 3955
	PUSHAB  W^GEN_3DATA			     ;GEN_3DATA								      ;
	PUSHL   R2				     ;DATA_SIZE								      ;
	PUSHAB  12(SP)				     ;POINTER								      ;
	CALLS   #4, (R10)			     ;#4, UNPACK_DATA							      ;
	MOVL    R0, R2				     ;R0, DATA_SIZE							      ;
2$:	BGEQ    3$				     ;3$								      ; 3957
	BRW     26$				     ;26$								      ;
3$:	MOVZBL  4(SP), R6			     ;DATA_TEXT, R6							      ; 3965
	CMPB    R6, #70				     ;R6, #70								      ; 3971
	BNEQ    4$				     ;4$								      ;
	PUSHL   (R7)				     ;REC_SEQ								      ; 3973
	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	MOVL    #16, R0				     ;#16, R0								      ; 3974
	RET     				     ;									      ;
4$:	CMPB    R6, #76				     ;R6, #76								      ; 3981
	BNEQ    5$				     ;5$								      ;
	PUSHL   (R7)				     ;REC_SEQ								      ; 3983
	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	CALLS   #0, W^SY_LOGOUT			     ;#0, SY_LOGOUT							      ; 3984
	MOVL    #17, R0				     ;#17, R0								      ; 3985
	RET     				     ;									      ;
5$:	CMPB    R6, #84				     ;R6, #84								      ; 3992
	BNEQ    7$				     ;7$								      ;
	MOVC5   (R8), (R9), #0, #132, W^FILE_NAME    ;GEN_1SIZE, GEN_1DATA, #0, #132, FILE_NAME				      ; 3994
	MOVL    (R8), W^FILE_SIZE		     ;GEN_1SIZE, FILE_SIZE						      ; 3995
	MOVL    #1, 220(R7)			     ;#1, TEXT_HEAD_FLAG						      ; 3996
	MOVZBL  #71, -(SP)			     ;#71, -(SP)							      ; 3997
	MOVZBL  #73, -(SP)			     ;#73, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	CMPL    -20(R7), #15			     ;STATE, #15							      ; 3999
	BNEQ    6$				     ;6$								      ;
	CMPL    -32(R7), -36(R7)		     ;BLK_CHK_TYPE, INI_CHK_TYPE					      ;
	BNEQ    6$				     ;6$								      ;
	MOVL    #18, R0				     ;#18, R0								      ; 4003
	RET     				     ;									      ;
6$:	MOVL    #1, R0				     ;#1, R0								      ;
	RET     				     ;									      ;
7$:	CMPB    R6, #68				     ;R6, #68								      ; 4007
	BNEQ    8$				     ;8$								      ;
	MOVL    #2, R2				     ;#2, G_FUNC							      ; 4008
	BRW     21$				     ;21$								      ;
8$:	CMPB    R6, #85				     ;R6, #85								      ; 4010
	BNEQ    9$				     ;9$								      ;
	MOVL    #3, R2				     ;#3, G_FUNC							      ; 4011
	BRB     10$				     ;10$								      ;
9$:	CMPB    R6, #69				     ;R6, #69								      ; 4013
	BNEQ    11$				     ;11$								      ;
	MOVL    #4, R2				     ;#4, G_FUNC							      ; 4014
10$:	BRB     23$				     ;23$								      ;
11$:	CMPB    R6, #72				     ;R6, #72								      ; 4016
	BNEQ    12$				     ;12$								      ;
	MOVL    #6, R2				     ;#6, G_FUNC							      ; 4017
	BRB     27$				     ;27$								      ;
12$:	CMPB    R6, #73				     ;R6, #73								      ; 4019
	BNEQ    13$				     ;13$								      ;
	MOVL    #8, R2				     ;#8, G_FUNC							      ; 4020
	BRB     27$				     ;27$								      ;
13$:	CMPB    R6, #67				     ;R6, #67								      ; 4022
	BNEQ    14$				     ;14$								      ;
	MOVL    #9, R2				     ;#9, G_FUNC							      ; 4023
	BRB     27$				     ;27$								      ;
14$:	CMPB    R6, #82				     ;R6, #82								      ; 4025
	BNEQ    15$				     ;15$								      ;
	MOVL    #10, R2				     ;#10, G_FUNC							      ; 4026
	BRB     27$				     ;27$								      ;
15$:	CMPB    R6, #75				     ;R6, #75								      ; 4028
	BNEQ    16$				     ;16$								      ;
	MOVL    #11, R2				     ;#11, G_FUNC							      ; 4029
	BRB     27$				     ;27$								      ;
16$:	CMPB    R6, #87				     ;R6, #87								      ; 4031
	BNEQ    17$				     ;17$								      ;
	MOVL    #12, R2				     ;#12, G_FUNC							      ; 4032
	BRB     27$				     ;27$								      ;
17$:	CMPB    R6, #77				     ;R6, #77								      ; 4034
	BNEQ    18$				     ;18$								      ;
	MOVL    #13, R2				     ;#13, G_FUNC							      ; 4035
	BRB     27$				     ;27$								      ;
18$:	CMPB    R6, #81				     ;R6, #81								      ; 4037
	BNEQ    19$				     ;19$								      ;
	MOVL    #14, R2				     ;#14, G_FUNC							      ; 4038
	BRB     27$				     ;27$								      ;
19$:	CMPB    R6, #80				     ;R6, #80								      ; 4040
	BNEQ    20$				     ;20$								      ;
	MOVL    #19, R2				     ;#19, G_FUNC							      ; 4041
	BRB     27$				     ;27$								      ;
20$:	CMPB    R6, #74				     ;R6, #74								      ; 4043
	BNEQ    22$				     ;22$								      ;
	MOVL    #17, R2				     ;#17, G_FUNC							      ; 4044
21$:	BRB     27$				     ;27$								      ;
22$:	CMPB    R6, #86				     ;R6, #86								      ; 4046
	BNEQ    24$				     ;24$								      ;
	MOVL    #18, R2				     ;#18, G_FUNC							      ; 4047
23$:	BRB     27$				     ;27$								      ;
24$:	PUSHL   #134316210			     ;#134316210							      ; 4054
25$:	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
26$:	MOVL    #10, R0				     ;#10, R0								      ; 4055
	RET     				     ;									      ;
27$:	PUSHL   R2				     ;G_FUNC								      ; 4063
	CALLS   #1, W^U.17			     ;#1, U.17								      ;
	RET     				     ;									      ; 4064

; Routine Size:  454 bytes,    Routine Base:  $CODE$ + 1244


;   4065  1	%SBTTL 'HOST_COMMAND - perform a host command'
;   4066  1	ROUTINE HOST_COMMAND =
;   4067  1	
;   4068  1	!++
;   4069  1	! FUNCTIONAL DESCRIPTION:
;   4070  1	!
;   4071  1	! This routine will handle the host command packet.
;   4072  1	! It will set up the data for the call to the system routine.
;   4073  1	!
;   4074  1	! CALLING SEQUENCE:
;   4075  1	!
;   4076  1	!	STATE = HOST_COMMAND();
;   4077  1	!
;   4078  1	! INPUT PARAMETERS:
;   4079  1	!
;   4080  1	!	None.
;   4081  1	!
;   4082  1	! IMPLICIT INPUTS:
;   4083  1	!
;   4084  1	!	Generic message receive in REC_MSG.
;   4085  1	!
;   4086  1	! OUTPUT PARAMETERS:
;   4087  1	!
;   4088  1	!	Returns new state for FSM
;   4089  1	!
;   4090  1	! IMPLICIT OUTPUTS:
;   4091  1	!
;   4092  1	!	None.
;   4093  1	!
;   4094  1	! COMPLETION CODES:
;   4095  1	!
;   4096  1	!	None.
;   4097  1	!
;   4098  1	! SIDE EFFECTS:
;   4099  1	!
;   4100  1	!	None.
;   4101  1	!
;   4102  1	!--
;   4103  1	
;   4104  2	    BEGIN
;   4105  2	    GEN_1SIZE = 0;
;   4106  2	    GEN_2SIZE = 0;
;   4107  2	    GEN_3SIZE = 0;
;   4108  2	
;   4109  2	    IF .REC_LENGTH LEQ 0
;   4110  2	    THEN
;   4111  3		BEGIN
;   4112  3		KRM_ERROR (KER_PROTOERR);		! Return an error
;   4113  3		RETURN STATE_A;				! Just abort
;   4114  2		END;
;   4115  2	
;   4116  2	    SET_STRING (CH$PTR (GEN_1DATA), MAX_MSG, TRUE);	! Start writing to buffer
;   4117  2	    BFR_EMPTY ();				! Dump the text
;   4118  2	    GEN_1SIZE = SET_STRING (0, 0, FALSE);	! Get the result
;   4119  2	    RETURN CALL_SY_RTN (GC_COMMAND);
;   4120  1	    END;					! End of HOST_COMMAND





;HOST_COMMAND
U.15:	.WORD   ^M<>				     ;Save nothing							      ; 4066
	CLRL    W^GEN_1SIZE			     ;GEN_1SIZE								      ; 4105
	CLRL    W^GEN_2SIZE			     ;GEN_2SIZE								      ; 4106
	CLRL    W^GEN_3SIZE			     ;GEN_3SIZE								      ; 4107
	TSTL    W^U.55				     ;U.55								      ; 4109
	BGTR    1$				     ;1$								      ;
	PUSHL   #134316226			     ;#134316226							      ; 4112
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	MOVL    #10, R0				     ;#10, R0								      ; 4113
	RET     				     ;									      ;
1$:	PUSHL   #1				     ;#1								      ; 4116
	MOVZBL  #96, -(SP)			     ;#96, -(SP)							      ;
	PUSHAB  W^GEN_1DATA			     ;GEN_1DATA								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	CALLS   #0, W^U.28			     ;#0, U.28								      ; 4117
	CLRQ    -(SP)				     ;-(SP)								      ; 4118
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	MOVL    R0, W^GEN_1SIZE			     ;R0, GEN_1SIZE							      ;
	PUSHL   #15				     ;#15								      ; 4119
	CALLS   #1, W^U.17			     ;#1, U.17								      ;
	RET     				     ;									      ; 4120

; Routine Size:  77 bytes,    Routine Base:  $CODE$ + 140A


;   4121  1	%SBTTL 'KERMIT_COMMAND - perform a KERMIT command'
;   4122  1	ROUTINE KERMIT_COMMAND =
;   4123  1	
;   4124  1	!++
;   4125  1	! FUNCTIONAL DESCRIPTION:
;   4126  1	!
;   4127  1	! This routine will handle the KERMIT command packet.
;   4128  1	! It will set up the data for the call to the system routine.
;   4129  1	!
;   4130  1	! CALLING SEQUENCE:
;   4131  1	!
;   4132  1	!	STATE = KERMIT_COMMAND();
;   4133  1	!
;   4134  1	! INPUT PARAMETERS:
;   4135  1	!
;   4136  1	!	None.
;   4137  1	!
;   4138  1	! IMPLICIT INPUTS:
;   4139  1	!
;   4140  1	!	Generic message receive in REC_MSG.
;   4141  1	!
;   4142  1	! OUTPUT PARAMETERS:
;   4143  1	!
;   4144  1	!	Returns new state for FSM
;   4145  1	!
;   4146  1	! IMPLICIT OUTPUTS:
;   4147  1	!
;   4148  1	!	None.
;   4149  1	!
;   4150  1	! COMPLETION CODES:
;   4151  1	!
;   4152  1	!	None.
;   4153  1	!
;   4154  1	! SIDE EFFECTS:
;   4155  1	!
;   4156  1	!	None.
;   4157  1	!
;   4158  1	!--
;   4159  1	
;   4160  2	    BEGIN
;   4161  2	    GEN_1SIZE = 0;
;   4162  2	    GEN_2SIZE = 0;
;   4163  2	    GEN_3SIZE = 0;
;   4164  2	
;   4165  2	    IF .REC_LENGTH LEQ 0
;   4166  2	    THEN
;   4167  3		BEGIN
;   4168  3		KRM_ERROR (KER_PROTOERR);		! Return an error
;   4169  3		RETURN STATE_A;				! Just abort
;   4170  2		END;
;   4171  2	
;   4172  2	    SET_STRING (CH$PTR (GEN_1DATA), MAX_MSG, TRUE);	! Start writing to buffer
;   4173  2	    BFR_EMPTY ();				! Dump the text
;   4174  2	    GEN_1SIZE = SET_STRING (0, 0, FALSE);	! Get the result
;   4175  2	    RETURN CALL_SY_RTN (GC_KERMIT);
;   4176  1	    END;					! End of KERMIT_COMMAND





;KERMIT_COMMAND
U.16:	.WORD   ^M<>				     ;Save nothing							      ; 4122
	CLRL    W^GEN_1SIZE			     ;GEN_1SIZE								      ; 4161
	CLRL    W^GEN_2SIZE			     ;GEN_2SIZE								      ; 4162
	CLRL    W^GEN_3SIZE			     ;GEN_3SIZE								      ; 4163
	TSTL    W^U.55				     ;U.55								      ; 4165
	BGTR    1$				     ;1$								      ;
	PUSHL   #134316226			     ;#134316226							      ; 4168
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	MOVL    #10, R0				     ;#10, R0								      ; 4169
	RET     				     ;									      ;
1$:	PUSHL   #1				     ;#1								      ; 4172
	MOVZBL  #96, -(SP)			     ;#96, -(SP)							      ;
	PUSHAB  W^GEN_1DATA			     ;GEN_1DATA								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	CALLS   #0, W^U.28			     ;#0, U.28								      ; 4173
	CLRQ    -(SP)				     ;-(SP)								      ; 4174
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	MOVL    R0, W^GEN_1SIZE			     ;R0, GEN_1SIZE							      ;
	PUSHL   #16				     ;#16								      ; 4175
	CALLS   #1, W^U.17			     ;#1, U.17								      ;
	RET     				     ;									      ; 4176

; Routine Size:  77 bytes,    Routine Base:  $CODE$ + 1457


;   4177  1	%SBTTL 'CALL_SY_RTN - handle operating system dependent functions'
;   4178  1	ROUTINE CALL_SY_RTN (G_FUNC) =
;   4179  1	
;   4180  1	!++
;   4181  1	! FUNCTIONAL DESCRIPTION:
;   4182  1	!
;   4183  1	! This routine will handle calling the operating system dependent routine
;   4184  1	! for a server function and returning the response.
;   4185  1	!
;   4186  1	! CALLING SEQUENCE:
;   4187  1	!
;   4188  1	!	STATE = CALL_SY_RTN(.G_FUNC);
;   4189  1	!
;   4190  1	! INPUT PARAMETERS:
;   4191  1	!
;   4192  1	!	G_FUNC - Generic function code
;   4193  1	!
;   4194  1	! IMPLICIT INPUTS:
;   4195  1	!
;   4196  1	!	Generic message data in GEN_1DATA
;   4197  1	!
;   4198  1	! OUTPUT PARAMETERS:
;   4199  1	!
;   4200  1	!	Returns new state for FSM
;   4201  1	!
;   4202  1	! IMPLICIT OUTPUTS:
;   4203  1	!
;   4204  1	!	None.
;   4205  1	!
;   4206  1	! COMPLETION CODES:
;   4207  1	!
;   4208  1	!	None.
;   4209  1	!
;   4210  1	! SIDE EFFECTS:
;   4211  1	!
;   4212  1	!	None.
;   4213  1	!
;   4214  1	!--
;   4215  1	
;   4216  2	    BEGIN
;   4217  2	
;   4218  2	    LOCAL
;   4219  2		STRING_ADDRESS,				! Address of string result
;   4220  2		STRING_LENGTH,				! Length of string result
;   4221  2		GET_CHR_SUBROUTINE,			! Routine to get a response character
;   4222  2		STATUS;					! Status value
;   4223  2	
;   4224  2	!
;   4225  2	! Call the routine with the desired type of command.
;   4226  2	!
;   4227  2	    STRING_LENGTH = 0;				! Initialize for no string
;   4228  2	    GET_CHR_SUBROUTINE = 0;			! And no subroutine
;   4229  2	
;   4230  2	    IF NOT SY_GENERIC (.G_FUNC, STRING_ADDRESS, STRING_LENGTH, GET_CHR_SUBROUTINE)
;   4231  2	    THEN
;   4232  2		RETURN STATE_A;				! And abort
;   4233  2	
;   4234  2	    IF .STRING_LENGTH GTR 0
;   4235  2	    THEN
;   4236  3		BEGIN
;   4237  3		SET_STRING (CH$PTR (.STRING_ADDRESS), .STRING_LENGTH, TRUE);
;   4238  3	
;   4239  3		IF .STRING_LENGTH LSS .SEND_PKT_SIZE - PKT_OVR_HEAD
;   4240  3		THEN
;   4241  4		    BEGIN
;   4242  4		    BFR_FILL (TRUE);			! If it should fit, pack it in
;   4243  4	
;   4244  4		    IF SET_STRING (0, 0, FALSE) GEQ .STRING_LENGTH
;   4245  4		    THEN 				! It fit, so just send the ACK
;   4246  4	
;   4247  4			IF SEND_PACKET (MSG_ACK, .SIZE, .REC_SEQ) THEN RETURN STATE_C ELSE RETURN STATE_EX;
;   4248  4	
;   4249  4	!
;   4250  4	! It didn't fit, reset the pointers to the beginning
;   4251  4	!
;   4252  4		    SET_STRING (CH$PTR (.STRING_ADDRESS), .STRING_LENGTH, TRUE);
;   4253  3		    END;
;   4254  3	
;   4255  3		NO_FILE_NEEDED = TRUE;			! Don't need a file
;   4256  3		END
;   4257  2	    ELSE
;   4258  2	
;   4259  2		IF .GET_CHR_SUBROUTINE NEQ 0		! If we got a subroutine back
;   4260  2		THEN
;   4261  3		    BEGIN
;   4262  3		    GET_CHR_ROUTINE = .GET_CHR_SUBROUTINE;
;   4263  3		    NO_FILE_NEEDED = TRUE;
;   4264  2		    END;
;   4265  2	
;   4266  2	    TEXT_HEAD_FLAG = TRUE;			! Send to be typed
;   4267  2	    XFR_STATUS (%C'I', %C'G');			! Doing a generic command
;   4268  2	
;   4269  2	    IF .STATE EQL STATE_II AND .BLK_CHK_TYPE EQL .INI_CHK_TYPE
;   4270  2	    THEN
;   4271  2		RETURN STATE_OF
;   4272  2	    ELSE
;   4273  2		RETURN STATE_S;				! Send the response
;   4274  2	
;   4275  1	    END;					! End of CALL_SY_RTN





;CALL_SY_RTN
U.17:	.WORD   ^M<R2,R3,R4>			     ;Save R2,R3,R4							      ; 4178
	MOVAB   W^U.30, R4			     ;U.30, R4								      ;
	MOVAB   W^U.39, R3			     ;U.39, R3								      ;
	SUBL2   #4, SP				     ;#4, SP								      ;
	CLRQ    -(SP)				     ;GET_CHR_SUBROUTINE						      ; 4228
	PUSHL   SP				     ;SP								      ; 4230
	PUSHAB  8(SP)				     ;STRING_LENGTH							      ;
	PUSHAB  16(SP)				     ;STRING_ADDRESS							      ;
	PUSHL   4(AP)				     ;G_FUNC								      ;
	CALLS   #4, W^SY_GENERIC		     ;#4, SY_GENERIC							      ;
	BLBS    R0, 1$				     ;R0, 1$								      ;
	MOVL    #10, R0				     ;#10, R0								      ; 4232
	RET     				     ;									      ;
1$:	MOVL    4(SP), R2			     ;STRING_LENGTH, R2							      ; 4234
	BLEQ    4$				     ;4$								      ;
	PUSHL   #1				     ;#1								      ; 4237
	PUSHL   R2				     ;R2								      ;
	PUSHL   16(SP)				     ;STRING_ADDRESS							      ;
	CALLS   #3, (R4)			     ;#3, SET_STRING							      ;
	SUBL3   #3, (R3), R0			     ;#3, SEND_PKT_SIZE, R0						      ; 4239
	CMPL    R2, R0				     ;R2, R0								      ;
	BGEQ    5$				     ;5$								      ;
	PUSHL   #1				     ;#1								      ; 4242
	CALLS   #1, W^U.29			     ;#1, U.29								      ;
	CLRQ    -(SP)				     ;-(SP)								      ; 4244
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #3, (R4)			     ;#3, SET_STRING							      ;
	CMPL    R0, R2				     ;R0, R2								      ;
	BLSS    3$				     ;3$								      ;
	PUSHL   60(R3)				     ;REC_SEQ								      ; 4247
	PUSHL   44(R3)				     ;SIZE								      ;
	MOVZBL  #89, -(SP)			     ;#89, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	BLBC    R0, 2$				     ;R0, 2$								      ;
	MOVL    #9, R0				     ;#9, R0								      ;
	RET     				     ;									      ;
2$:	MOVL    #19, R0				     ;#19, R0								      ;
	RET     				     ;									      ;
3$:	PUSHL   #1				     ;#1								      ; 4252
	PUSHL   R2				     ;R2								      ;
	PUSHL   16(SP)				     ;STRING_ADDRESS							      ;
	CALLS   #3, (R4)			     ;#3, SET_STRING							      ;
	BRB     5$				     ;5$								      ; 4255
4$:	TSTL    (SP)				     ;GET_CHR_SUBROUTINE						      ; 4259
	BEQL    6$				     ;6$								      ;
	MOVL    (SP), 300(R3)			     ;GET_CHR_SUBROUTINE, GET_CHR_ROUTINE				      ; 4262
5$:	MOVL    #1, 284(R3)			     ;#1, NO_FILE_NEEDED						      ; 4263
6$:	MOVL    #1, 280(R3)			     ;#1, TEXT_HEAD_FLAG						      ; 4266
	MOVZBL  #71, -(SP)			     ;#71, -(SP)							      ; 4267
	MOVZBL  #73, -(SP)			     ;#73, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	CMPL    40(R3), #15			     ;STATE, #15							      ; 4269
	BNEQ    7$				     ;7$								      ;
	CMPL    28(R3), 24(R3)			     ;BLK_CHK_TYPE, INI_CHK_TYPE					      ;
	BNEQ    7$				     ;7$								      ;
	MOVL    #18, R0				     ;#18, R0								      ; 4273
	RET     				     ;									      ;
7$:	MOVL    #1, R0				     ;#1, R0								      ;
	RET     				     ;									      ; 4275

; Routine Size:  175 bytes,    Routine Base:  $CODE$ + 14A4


;   4276  1	%SBTTL 'Message processing -- PRS_SEND_INIT - Parse send init params'
;   4277  1	ROUTINE PRS_SEND_INIT =
;   4278  1	
;   4279  1	!++
;   4280  1	! FUNCTIONAL DESCRIPTION:
;   4281  1	!
;   4282  1	!	This routine will parse the SEND_INIT parameters that were sent by
;   4283  1	!	the remote Kermit.  The items will be stored into the low segment.
;   4284  1	!
;   4285  1	! CALLING SEQUENCE:
;   4286  1	!
;   4287  1	!	PRS_SEND_INIT ();
;   4288  1	!
;   4289  1	! INPUT PARAMETERS:
;   4290  1	!
;   4291  1	!	None.
;   4292  1	!
;   4293  1	! IMPLICIT INPUTS:
;   4294  1	!
;   4295  1	!	Message stored in REC_MSG.
;   4296  1	!
;   4297  1	! OUTPUT PARAMETERS:
;   4298  1	!
;   4299  1	!	None.
;   4300  1	!
;   4301  1	! IMPLICIT OUTPUTS:
;   4302  1	!
;   4303  1	!	None.
;   4304  1	!
;   4305  1	! COMPLETION CODES:
;   4306  1	!
;   4307  1	!	None.
;   4308  1	!
;   4309  1	! SIDE EFFECTS:
;   4310  1	!
;   4311  1	!	None.
;   4312  1	!
;   4313  1	!--
;   4314  1	
;   4315  2	    BEGIN
;   4316  2	! The following section of code will parse the various send parameters
;   4317  2	! that are found in the send-init message.  The following code will store
;   4318  2	! the following as the value.
;   4319  2	!
;   4320  2	! If the user specified a value then the user supplied value will be used else
;   4321  2	! the value in the message and if none in the message then the default value.
;   4322  2	!
;   4323  2	! User supplied values are denoted as positive values in SND_xxxxxxx.
;   4324  2	!
;   4325  2	! Parse the packet size
;   4326  2	!
;   4327  3	    SEND_PKT_SIZE = (IF .SND_PKT_SIZE GEQ 0 THEN .SND_PKT_SIZE ELSE
;   4328  4		BEGIN
;   4329  4	
;   4330  4		IF .REC_LENGTH GTR P_SI_BUFSIZ
;   4331  4		THEN
; P 4332  4		    UNCHAR (CH$RCHAR (CH$PTR (REC_MSG,
;   4333  5				PKT_MSG + P_SI_BUFSIZ, CHR_SIZE)))
;   4334  4		ELSE
;   4335  4		    ABS (.SND_PKT_SIZE)
;   4336  4	
;   4337  4		END
;   4338  2	    );
;   4339  2	!
;   4340  2	! Parse the time out value
;   4341  2	!
;   4342  3	    SEND_TIMEOUT = (IF .SND_TIMEOUT GEQ 0 THEN .SND_TIMEOUT ELSE
;   4343  4		BEGIN
;   4344  4	
;   4345  4		IF .REC_LENGTH GTR P_SI_TIMOUT
;   4346  4		THEN
; P 4347  4		    UNCHAR (CH$RCHAR (CH$PTR (REC_MSG,
;   4348  5				PKT_MSG + P_SI_TIMOUT, CHR_SIZE)))
;   4349  4		ELSE
;   4350  4		    ABS (.SND_TIMEOUT)
;   4351  4	
;   4352  4		END
;   4353  2	    );
;   4354  2	!
;   4355  2	! Parse the number of padding characters supplied
;   4356  2	!
;   4357  3	    SEND_NPAD = (IF .SND_NPAD GEQ 0 THEN .SND_NPAD ELSE
;   4358  4		BEGIN
;   4359  4	
;   4360  4		IF .REC_LENGTH GTR P_SI_NPAD
;   4361  4		THEN
; P 4362  4		    UNCHAR (CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG + P_SI_NPAD,
;   4363  5				CHR_SIZE)))
;   4364  4		ELSE
;   4365  4		    ABS (.SND_NPAD)
;   4366  4	
;   4367  4		END
;   4368  2	    );
;   4369  2	!
;   4370  2	! Parse the padding character
;   4371  2	!
;   4372  3	    SEND_PADCHAR = (IF .SND_PADCHAR GEQ 0 THEN .SND_PADCHAR ELSE
;   4373  4		BEGIN
;   4374  4	
;   4375  4		IF .REC_LENGTH GTR P_SI_PAD
;   4376  4		THEN
; P 4377  4		    CTL (CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG + P_SI_PAD,
;   4378  5				CHR_SIZE)))
;   4379  4		ELSE
;   4380  4		    ABS (.SND_PADCHAR)
;   4381  4	
;   4382  4		END
;   4383  2	    );
;   4384  2	!
;   4385  2	! Parse the end of line character
;   4386  2	!
;   4387  3	    SEND_EOL = (IF .SND_EOL GEQ 0 THEN .SND_EOL ELSE
;   4388  4		BEGIN
;   4389  4	
;   4390  4		IF .REC_LENGTH GTR P_SI_EOL
;   4391  4		THEN
; P 4392  4		    UNCHAR (CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG + P_SI_EOL,
;   4393  5				CHR_SIZE)))
;   4394  4		ELSE
;   4395  4		    ABS (.SND_EOL)
;   4396  4	
;   4397  4		END
;   4398  2	    );
;   4399  2	!
;   4400  2	! Parse the quoting character
;   4401  2	!
;   4402  3	    SEND_QUOTE_CHR = (IF .SND_QUOTE_CHR GEQ 0 THEN .SND_QUOTE_CHR ELSE
;   4403  4		BEGIN
;   4404  4	
;   4405  4		IF .REC_LENGTH GTR P_SI_QUOTE
;   4406  4		THEN
;   4407  4		    CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG + P_SI_QUOTE,
;   4408  4			    CHR_SIZE))
;   4409  4		ELSE
;   4410  4		    ABS (.SND_QUOTE_CHR)
;   4411  4	
;   4412  4		END
;   4413  2	    );
;   4414  2	!
;   4415  2	! Parse the 8-bit quoting character
;   4416  2	!
;   4417  2	! If the character was not included in the packet, assume no eight-bit
;   4418  2	! quoting allowed (we are probably talking to an old version of Kermit).
;   4419  2	!
;   4420  3	    SEND_8QUOTE_CHR = (IF .REC_LENGTH GTR P_SI_8QUOTE THEN CH$RCHAR (CH$PTR (REC_MSG,
;   4421  3			PKT_MSG + P_SI_8QUOTE, CHR_SIZE)) ELSE %C'N'	! Assume no 8-bit quoting allowed
;   4422  2	    );
;   4423  2	!
;   4424  2	! Parse the checksum type
;   4425  2	!
;   4426  2	
;   4427  2	    IF .REC_LENGTH GTR P_SI_CHKTYPE
;   4428  2	    THEN
;   4429  3		BEGIN
;   4430  3	
;   4431  3		LOCAL
;   4432  3		    REQ_CHK_TYPE;
;   4433  3	
;   4434  3		REQ_CHK_TYPE = CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG + P_SI_CHKTYPE, CHR_SIZE));
;   4435  3	
;   4436  3		IF .REC_TYPE NEQ MSG_ACK
;   4437  3		THEN
;   4438  3	
;   4439  3		    IF .REQ_CHK_TYPE GEQ CHK_1CHAR AND .REQ_CHK_TYPE LEQ CHK_CRC
;   4440  3		    THEN
;   4441  3			INI_CHK_TYPE = .REQ_CHK_TYPE
;   4442  3		    ELSE
;   4443  3			INI_CHK_TYPE = CHK_1CHAR
;   4444  3	
;   4445  3		ELSE
;   4446  3	
;   4447  3		    IF .REQ_CHK_TYPE NEQ .CHKTYPE
;   4448  3		    THEN
;   4449  3			INI_CHK_TYPE = CHK_1CHAR
;   4450  3		    ELSE
;   4451  3			INI_CHK_TYPE = .REQ_CHK_TYPE
;   4452  3	
;   4453  3		END
;   4454  2	    ELSE
;   4455  2		INI_CHK_TYPE = CHK_1CHAR;		! Only single character checksum if not specified
;   4456  2	
;   4457  2	!
;   4458  2	! Parse the repeat character
;   4459  2	!
;   4460  3	    REPT_CHR = (IF .REC_LENGTH GTR P_SI_REPEAT THEN CH$RCHAR (CH$PTR (REC_MSG,
;   4461  2			PKT_MSG + P_SI_REPEAT, CHR_SIZE)) ELSE %C' ');
;   4462  2	!
;   4463  2	! Check for a valid quoting character.  If it is not valid, then we have
;   4464  2	! a protocol error
;   4465  2	!
;   4466  2	
;   4467  4	    IF NOT ((.SEND_QUOTE_CHR GEQ %O'41' AND .SEND_QUOTE_CHR LEQ %O'76') OR (.SEND_QUOTE_CHR GEQ %O
;   4468  3		'140' AND .SEND_QUOTE_CHR LEQ %O'176'))
;   4469  2	    THEN
;   4470  3		BEGIN
;   4471  3		KRM_ERROR (KER_PROTOERR);
;   4472  3		RETURN KER_PROTOERR;
;   4473  2		END;
;   4474  2	
;   4475  2	!
;   4476  2	! Check for a valid 8 bit quoting and set the 8 bit quoting flag as needed
;   4477  2	!
;   4478  2	
;   4479  5	    IF ( NOT ((.SEND_8QUOTE_CHR GEQ %O'041' AND .SEND_8QUOTE_CHR LEQ %O'076') OR (.SEND_8QUOTE_CHR
;   4480  5		GEQ %O'140' AND .SEND_8QUOTE_CHR LEQ %O'176') OR (.SEND_8QUOTE_CHR EQL %C'N') OR (
;   4481  2		.SEND_8QUOTE_CHR EQL %C'Y'))) OR .SEND_8QUOTE_CHR EQL .SEND_QUOTE_CHR OR .SEND_8QUOTE_CHR
;   4482  2		EQL .RCV_QUOTE_CHR
;   4483  2	    THEN
;   4484  3		BEGIN
;   4485  3		KRM_ERROR (KER_PROTOERR);
;   4486  3		RETURN KER_PROTOERR;
;   4487  2		END;
;   4488  2	
;   4489  2	    IF .SEND_8QUOTE_CHR EQL %C'Y' THEN SEND_8QUOTE_CHR = .RECV_8QUOTE_CHR;
;   4490  2	
;   4491  2	    IF .SEND_8QUOTE_CHR NEQ %C'N' AND .SEND_8QUOTE_CHR NEQ %C'Y'
;   4492  2	    THEN
;   4493  2		FLAG_8QUOTE = TRUE
;   4494  2	    ELSE
;   4495  2		FLAG_8QUOTE = FALSE;
;   4496  2	
;   4497  2	!
;   4498  2	! Check the repeat character and set flags
;   4499  2	!
;   4500  2	
;   4501  5	    IF ( NOT ((.REPT_CHR GEQ %O'41' AND .REPT_CHR LEQ %O'76') OR (.REPT_CHR GEQ %O'140' AND
;   4502  3		.REPT_CHR LEQ %O'176')) OR .REPT_CHR EQL .SEND_QUOTE_CHR OR .REPT_CHR EQL .SEND_8QUOTE_CHR
;   4503  2		OR .REPT_CHR EQL .RCV_QUOTE_CHR) AND .REPT_CHR NEQ %C' '
;   4504  2	    THEN
;   4505  3		BEGIN
;   4506  3		KRM_ERROR (KER_PROTOERR);
;   4507  3		RETURN KER_PROTOERR;
;   4508  2		END;
;   4509  2	
;   4510  2	    IF .REPT_CHR NEQ %C' ' THEN FLAG_REPEAT = TRUE ELSE FLAG_REPEAT = FALSE;
;   4511  2	
;   4512  2	    RETURN KER_NORMAL;
;   4513  1	    END;					! End of PRS_SEND_INIT





;PRS_SEND_INIT
U.21:	.WORD   ^M<R2>				     ;Save R2								      ; 4277
	MOVAB   W^U.55, R2			     ;U.55, R2								      ;
	MOVL    W^SND_PKT_SIZE, R0		     ;SND_PKT_SIZE, R0							      ; 4327
	BGEQ    2$				     ;2$								      ;
	TSTL    (R2)				     ;REC_LENGTH							      ; 4330
	BLEQ    1$				     ;1$								      ;
	MOVZBL  12(R2), R0			     ;REC_MSG+4, R0							      ; 4333
	SUBL2   #32, R0				     ;#32, R0								      ;
	BRB     2$				     ;2$								      ;
1$:	TSTL    R0				     ;R0								      ; 4335
	BGEQ    2$				     ;2$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
2$:	MOVL    R0, -64(R2)			     ;R0, SEND_PKT_SIZE							      ; 4327
	MOVL    W^SND_TIMEOUT, R0		     ;SND_TIMEOUT, R0							      ; 4342
	BGEQ    4$				     ;4$								      ;
	CMPL    (R2), #1			     ;REC_LENGTH, #1							      ; 4345
	BLEQ    3$				     ;3$								      ;
	MOVZBL  13(R2), R0			     ;REC_MSG+5, R0							      ; 4348
	SUBL2   #32, R0				     ;#32, R0								      ;
	BRB     4$				     ;4$								      ;
3$:	TSTL    R0				     ;R0								      ; 4350
	BGEQ    4$				     ;4$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
4$:	MOVL    R0, W^SEND_TIMEOUT		     ;R0, SEND_TIMEOUT							      ; 4342
	MOVL    W^SND_NPAD, R0			     ;SND_NPAD, R0							      ; 4357
	BGEQ    6$				     ;6$								      ;
	CMPL    (R2), #2			     ;REC_LENGTH, #2							      ; 4360
	BLEQ    5$				     ;5$								      ;
	MOVZBL  14(R2), R0			     ;REC_MSG+6, R0							      ; 4363
	SUBL2   #32, R0				     ;#32, R0								      ;
	BRB     6$				     ;6$								      ;
5$:	TSTL    R0				     ;R0								      ; 4365
	BGEQ    6$				     ;6$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
6$:	MOVL    R0, -60(R2)			     ;R0, SEND_NPAD							      ; 4357
	MOVL    W^SND_PADCHAR, R0		     ;SND_PADCHAR, R0							      ; 4372
	BGEQ    8$				     ;8$								      ;
	CMPL    (R2), #3			     ;REC_LENGTH, #3							      ; 4375
	BLEQ    7$				     ;7$								      ;
	MOVZBL  15(R2), R0			     ;REC_MSG+7, R0							      ; 4378
	XORL2   #64, R0				     ;#64, R0								      ;
	BRB     8$				     ;8$								      ;
7$:	TSTL    R0				     ;R0								      ; 4380
	BGEQ    8$				     ;8$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
8$:	MOVL    R0, -56(R2)			     ;R0, SEND_PADCHAR							      ; 4372
	MOVL    W^SND_EOL, R0			     ;SND_EOL, R0							      ; 4387
	BGEQ    10$				     ;10$								      ;
	CMPL    (R2), #4			     ;REC_LENGTH, #4							      ; 4390
	BLEQ    9$				     ;9$								      ;
	MOVZBL  16(R2), R0			     ;REC_MSG+8, R0							      ; 4393
	SUBL2   #32, R0				     ;#32, R0								      ;
	BRB     10$				     ;10$								      ;
9$:	TSTL    R0				     ;R0								      ; 4395
	BGEQ    10$				     ;10$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
10$:	MOVL    R0, -52(R2)			     ;R0, SEND_EOL							      ; 4387
	MOVL    W^SND_QUOTE_CHR, R0		     ;SND_QUOTE_CHR, R0							      ; 4402
	BGEQ    12$				     ;12$								      ;
	CMPL    (R2), #5			     ;REC_LENGTH, #5							      ; 4405
	BLEQ    11$				     ;11$								      ;
	MOVZBL  17(R2), R0			     ;REC_MSG+9, R0							      ; 4408
	BRB     12$				     ;12$								      ;
11$:	TSTL    R0				     ;R0								      ; 4410
	BGEQ    12$				     ;12$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
12$:	MOVL    R0, -48(R2)			     ;R0, SEND_QUOTE_CHR						      ; 4402
	MOVL    (R2), R1			     ;REC_LENGTH, R1							      ; 4420
	CMPL    R1, #6				     ;R1, #6								      ;
	BLEQ    13$				     ;13$								      ;
	MOVZBL  18(R2), R0			     ;REC_MSG+10, R0							      ; 4421
	BRB     14$				     ;14$								      ;
13$:	MOVZBL  #78, R0				     ;#78, R0								      ;
14$:	MOVL    R0, -44(R2)			     ;R0, SEND_8QUOTE_CHR						      ; 4420
	CMPL    R1, #7				     ;R1, #7								      ; 4427
	BLEQ    17$				     ;17$								      ;
	MOVZBL  19(R2), R0			     ;REC_MSG+11, REQ_CHK_TYPE						      ; 4434
	CMPL    4(R2), #89			     ;REC_TYPE, #89							      ; 4436
	BEQL    15$				     ;15$								      ;
	CMPL    R0, #49				     ;REQ_CHK_TYPE, #49							      ; 4439
	BLSS    17$				     ;17$								      ;
	CMPL    R0, #51				     ;REQ_CHK_TYPE, #51							      ;
	BGTR    17$				     ;17$								      ;
	BRB     16$				     ;16$								      ; 4441
15$:	CMPL    R0, W^CHKTYPE			     ;REQ_CHK_TYPE, CHKTYPE						      ; 4447
	BNEQ    17$				     ;17$								      ;
16$:	MOVL    R0, -40(R2)			     ;REQ_CHK_TYPE, INI_CHK_TYPE					      ; 4451
	BRB     18$				     ;18$								      ; 4436
17$:	MOVL    #49, -40(R2)			     ;#49, INI_CHK_TYPE							      ; 4455
18$:	CMPL    R1, #8				     ;R1, #8								      ; 4460
	BLEQ    19$				     ;19$								      ;
	MOVZBL  20(R2), R0			     ;REC_MSG+12, R0							      ; 4461
	BRB     20$				     ;20$								      ;
19$:	MOVL    #32, R0				     ;#32, R0								      ;
20$:	MOVL    R0, -68(R2)			     ;R0, REPT_CHR							      ; 4460
	MOVL    -48(R2), R0			     ;SEND_QUOTE_CHR, R0						      ; 4467
	CMPL    R0, #33				     ;R0, #33								      ;
	BLSS    21$				     ;21$								      ;
	CMPL    R0, #62				     ;R0, #62								      ;
	BLEQ    24$				     ;24$								      ;
21$:	CMPL    R0, #96				     ;R0, #96								      ;
	BGEQ    23$				     ;23$								      ;
22$:	BRW     34$				     ;34$								      ;
23$:	CMPL    R0, #126			     ;R0, #126								      ; 4468
	BGTR    22$				     ;22$								      ;
24$:	MOVL    -44(R2), R0			     ;SEND_8QUOTE_CHR, R0						      ; 4479
	CMPL    R0, #33				     ;R0, #33								      ;
	BLSS    25$				     ;25$								      ;
	CMPL    R0, #62				     ;R0, #62								      ;
	BLEQ    27$				     ;27$								      ;
25$:	CMPL    R0, #96				     ;R0, #96								      ; 4480
	BLSS    26$				     ;26$								      ;
	CMPL    R0, #126			     ;R0, #126								      ;
	BLEQ    27$				     ;27$								      ;
26$:	CMPL    R0, #78				     ;R0, #78								      ;
	BEQL    27$				     ;27$								      ;
	CMPL    R0, #89				     ;R0, #89								      ; 4481
	BNEQ    34$				     ;34$								      ;
27$:	CMPL    R0, -48(R2)			     ;R0, SEND_QUOTE_CHR						      ;
	BEQL    34$				     ;34$								      ;
	CMPL    R0, W^RCV_QUOTE_CHR		     ;R0, RCV_QUOTE_CHR							      ; 4482
	BEQL    34$				     ;34$								      ;
	CMPL    -44(R2), #89			     ;SEND_8QUOTE_CHR, #89						      ; 4489
	BNEQ    28$				     ;28$								      ;
	MOVL    -72(R2), -44(R2)		     ;RECV_8QUOTE_CHR, SEND_8QUOTE_CHR					      ;
28$:	MOVL    -44(R2), R1			     ;SEND_8QUOTE_CHR, R1						      ; 4491
	CMPL    R1, #78				     ;R1, #78								      ;
	BEQL    29$				     ;29$								      ;
	CMPL    R1, #89				     ;R1, #89								      ;
	BEQL    29$				     ;29$								      ;
	MOVL    #1, -32(R2)			     ;#1, FLAG_8QUOTE							      ; 4493
	BRB     30$				     ;30$								      ;
29$:	CLRL    -32(R2)				     ;FLAG_8QUOTE							      ; 4495
30$:	MOVL    -68(R2), R0			     ;REPT_CHR, R0							      ; 4501
	CMPL    R0, #33				     ;R0, #33								      ;
	BLSS    31$				     ;31$								      ;
	CMPL    R0, #62				     ;R0, #62								      ;
	BLEQ    32$				     ;32$								      ;
31$:	CMPL    R0, #96				     ;R0, #96								      ;
	BLSS    33$				     ;33$								      ;
	CMPL    R0, #126			     ;R0, #126								      ; 4502
	BGTR    33$				     ;33$								      ;
32$:	CMPL    R0, -48(R2)			     ;R0, SEND_QUOTE_CHR						      ;
	BEQL    33$				     ;33$								      ;
	CMPL    R0, R1				     ;R0, R1								      ;
	BEQL    33$				     ;33$								      ;
	CMPL    R0, W^RCV_QUOTE_CHR		     ;R0, RCV_QUOTE_CHR							      ; 4503
	BNEQ    35$				     ;35$								      ;
33$:	CMPL    R0, #32				     ;R0, #32								      ;
	BEQL    35$				     ;35$								      ;
34$:	PUSHL   #134316226			     ;#134316226							      ; 4506
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	MOVL    #134316226, R0			     ;#134316226, R0							      ; 4507
	RET     				     ;									      ;
35$:	CMPL    -68(R2), #32			     ;REPT_CHR, #32							      ; 4510
	BEQL    36$				     ;36$								      ;
	MOVL    #1, -28(R2)			     ;#1, FLAG_REPEAT							      ;
	BRB     37$				     ;37$								      ;
36$:	CLRL    -28(R2)				     ;FLAG_REPEAT							      ;
37$:	MOVL    #134316043, R0			     ;#134316043, R0							      ; 4512
	RET     				     ;									      ; 4513

; Routine Size:  529 bytes,    Routine Base:  $CODE$ + 1553


;   4514  1	%SBTTL 'SET_SEND_INIT'
;   4515  1	ROUTINE SET_SEND_INIT : NOVALUE =
;   4516  1	
;   4517  1	!++
;   4518  1	! FUNCTIONAL DESCRIPTION:
;   4519  1	!
;   4520  1	!	This routine will initialize the various parameters for the
;   4521  1	!	MSG_SND_INIT message.
;   4522  1	!
;   4523  1	! CALLING SEQUENCE:
;   4524  1	!
;   4525  1	!	SET_SEND_INIT();
;   4526  1	!
;   4527  1	! INPUT PARAMETERS:
;   4528  1	!
;   4529  1	!	None.
;   4530  1	!
;   4531  1	! IMPLICIT INPUTS:
;   4532  1	!
;   4533  1	!	None.
;   4534  1	!
;   4535  1	! OUTPUT PARAMETERS:
;   4536  1	!
;   4537  1	!	None.
;   4538  1	!
;   4539  1	! IMPLICIT OUTPUTS:
;   4540  1	!
;   4541  1	!	SND_MSG parameters set up.
;   4542  1	!
;   4543  1	! COMPLETION CODES:
;   4544  1	!
;   4545  1	!	None.
;   4546  1	!
;   4547  1	! SIDE EFFECTS:
;   4548  1	!
;   4549  1	!	None.
;   4550  1	!
;   4551  1	!--
;   4552  1	
;   4553  2	    BEGIN
;   4554  2	    CH$WCHAR (CHAR (.RCV_PKT_SIZE), CH$PTR (SND_MSG, PKT_MSG + P_SI_BUFSIZ, CHR_SIZE));
;   4555  2	    CH$WCHAR (CHAR (.RCV_TIMEOUT), CH$PTR (SND_MSG, PKT_MSG + P_SI_TIMOUT, CHR_SIZE));
;   4556  2	    CH$WCHAR (CHAR (.RCV_NPAD), CH$PTR (SND_MSG, PKT_MSG + P_SI_NPAD, CHR_SIZE));
;   4557  2	    CH$WCHAR (CTL (.RCV_PADCHAR), CH$PTR (SND_MSG, PKT_MSG + P_SI_PAD, CHR_SIZE));
;   4558  2	    CH$WCHAR (CHAR (.RCV_EOL), CH$PTR (SND_MSG, PKT_MSG + P_SI_EOL, CHR_SIZE));
;   4559  2	    CH$WCHAR (.RCV_QUOTE_CHR, CH$PTR (SND_MSG, PKT_MSG + P_SI_QUOTE, CHR_SIZE));
;   4560  2	    CH$WCHAR (.SEND_8QUOTE_CHR, CH$PTR (SND_MSG, PKT_MSG + P_SI_8QUOTE, CHR_SIZE));
;   4561  2	    CH$WCHAR (.INI_CHK_TYPE, CH$PTR (SND_MSG, PKT_MSG + P_SI_CHKTYPE, CHR_SIZE));
;   4562  2	    CH$WCHAR (.REPT_CHR, CH$PTR (SND_MSG, PKT_MSG + P_SI_REPEAT, CHR_SIZE));
;   4563  1	    END;					! End of SET_SEND_INIT





;SET_SEND_INIT
U.20:	.WORD   ^M<R2>				     ;Save R2								      ; 4515
	MOVAB   W^U.58+4, R2			     ;U.58+4, R2							      ;
	ADDB3   #32, W^RCV_PKT_SIZE, (R2)	     ;#32, RCV_PKT_SIZE, SND_MSG+4					      ; 4554
	ADDB3   #32, W^RCV_TIMEOUT, 1(R2)	     ;#32, RCV_TIMEOUT, SND_MSG+5					      ; 4555
	ADDB3   #32, W^RCV_NPAD, 2(R2)		     ;#32, RCV_NPAD, SND_MSG+6						      ; 4556
	XORB3   #64, W^RCV_PADCHAR, 3(R2)	     ;#64, RCV_PADCHAR, SND_MSG+7					      ; 4557
	ADDB3   #32, W^RCV_EOL, 4(R2)		     ;#32, RCV_EOL, SND_MSG+8						      ; 4558
	MOVB    W^RCV_QUOTE_CHR, 5(R2)		     ;RCV_QUOTE_CHR, SND_MSG+9						      ; 4559
	MOVB    -156(R2), 6(R2)			     ;SEND_8QUOTE_CHR, SND_MSG+10					      ; 4560
	MOVB    -152(R2), 7(R2)			     ;INI_CHK_TYPE, SND_MSG+11						      ; 4561
	MOVB    -180(R2), 8(R2)			     ;REPT_CHR, SND_MSG+12						      ; 4562
	RET     				     ;									      ; 4563

; Routine Size:  67 bytes,    Routine Base:  $CODE$ + 1764


;   4564  1	%SBTTL 'SEND_PACKET'
;   4565  1	ROUTINE SEND_PACKET (TYPE, LENGTH, MN) =
;   4566  1	
;   4567  1	!++
;   4568  1	! FUNCTIONAL DESCRIPTION:
;   4569  1	!
;   4570  1	!	This routine will cause a packet to be sent over the line
;   4571  1	!	that has been opened by OPEN_TERMINAL.
;   4572  1	!
;   4573  1	! CALLING SEQUENCE:
;   4574  1	!
;   4575  1	!	SEND_PACKET(Type, Length);
;   4576  1	!
;   4577  1	! INPUT PARAMETERS:
;   4578  1	!
;   4579  1	!	TYPE - Type of packet to send.
;   4580  1	!
;   4581  1	!	LENGTH - Length of the packet being sent.
;   4582  1	!
;   4583  1	! IMPLICIT INPUTS:
;   4584  1	!
;   4585  1	!	None.
;   4586  1	!
;   4587  1	! OUTPUT PARAMETERS:
;   4588  1	!
;   4589  1	!	None.
;   4590  1	!
;   4591  1	! IMPLICIT OUTPUTS:
;   4592  1	!
;   4593  1	!	None.
;   4594  1	!
;   4595  1	! COMPLETION CODES:
;   4596  1	!
;   4597  1	!	None.
;   4598  1	!
;   4599  1	! SIDE EFFECTS:
;   4600  1	!
;   4601  1	!	None.
;   4602  1	!
;   4603  1	!--
;   4604  1	
;   4605  2	    BEGIN
;   4606  2	
;   4607  2	    LOCAL
;   4608  2		FILLER : VECTOR [CH$ALLOCATION (MAX_MSG, CHR_SIZE)],
;   4609  2		TOT_MSG_LEN,				! Length of message including all characters
;   4610  2		CHKSUM,					! Checksum for the message we calculate
;   4611  2		POINTER;				! Pointer to the information in the message
;   4612  2	
;   4613  2	!
;   4614  2	! Do any filler processing that the remote KERMIT requires.
;   4615  2	!
;   4616  2	
;   4617  2	    IF .SEND_NPAD NEQ 0
;   4618  2	    THEN
;   4619  3		BEGIN
;   4620  3		CH$FILL (.SEND_PADCHAR, MAX_MSG, CH$PTR (FILLER, 0, CHR_SIZE));
;   4621  3	!
;   4622  3	! Update the send stats
;   4623  3	!
;   4624  3		SMSG_TOTAL_CHARS = .SMSG_TOTAL_CHARS + .SEND_NPAD;
;   4625  3	!
;   4626  3	! Send the fill
;   4627  3	!
;   4628  3		DO_PARITY (FILLER, .SEND_NPAD + PKT_TOT_OVR_HEAD);
;   4629  3		SEND (FILLER, .SEND_NPAD + PKT_TOT_OVR_HEAD);
;   4630  2		END;
;   4631  2	
;   4632  2	!
;   4633  2	! Store the header information into the message.
;   4634  2	!
;   4635  2	    CH$WCHAR (.TYPE, CH$PTR (SND_MSG, PKT_TYPE, CHR_SIZE));
;   4636  2	    CH$WCHAR (.SND_SOH, CH$PTR (SND_MSG, PKT_MARK, CHR_SIZE));
;   4637  2	    CH$WCHAR (CHAR (.LENGTH + PKT_OVR_HEAD + (.BLK_CHK_TYPE - CHK_1CHAR)),
;   4638  2		CH$PTR (SND_MSG,
;   4639  2		    PKT_COUNT, CHR_SIZE));
;   4640  2	    CH$WCHAR (CHAR ((IF .MN LSS 0 THEN 0 ELSE .MN)), CH$PTR (SND_MSG, PKT_SEQ, CHR_SIZE));
;   4641  2	!
;   4642  2	! Calculate the block check value
;   4643  2	!
;   4644  2	    POINTER = CH$PTR (SND_MSG, PKT_MARK + 1, CHR_SIZE);
;   4645  2	    CHKSUM = CALC_BLOCK_CHECK (.POINTER, .LENGTH + PKT_OVR_HEAD);
;   4646  2	    TOT_MSG_LEN = .LENGTH + PKT_TOT_OVR_HEAD;
;   4647  2	!
;   4648  2	! Store the checksum into the message
;   4649  2	!
;   4650  2	    POINTER = CH$PTR (SND_MSG, .LENGTH + PKT_OVR_HEAD + 1, CHR_SIZE);
;   4651  2	
;   4652  2	    CASE .BLK_CHK_TYPE FROM CHK_1CHAR TO CHK_CRC OF
;   4653  2		SET
;   4654  2	
;   4655  2		[CHK_1CHAR] :
;   4656  2		    CH$WCHAR_A (CHAR (.CHKSUM), POINTER);
;   4657  2	
;   4658  2		[CHK_2CHAR] :
;   4659  3		    BEGIN
;   4660  3		    CH$WCHAR_A (CHAR (.CHKSUM<6, 6>), POINTER);
;   4661  3		    CH$WCHAR_A (CHAR (.CHKSUM<0, 6>), POINTER);
;   4662  3		    TOT_MSG_LEN = .TOT_MSG_LEN + 1;
;   4663  2		    END;
;   4664  2	
;   4665  2		[CHK_CRC] :
;   4666  3		    BEGIN
;   4667  3		    CH$WCHAR_A (CHAR (.CHKSUM<12, 4>), POINTER);
;   4668  3		    CH$WCHAR_A (CHAR (.CHKSUM<6, 6>), POINTER);
;   4669  3		    CH$WCHAR_A (CHAR (.CHKSUM<0, 6>), POINTER);
;   4670  3		    TOT_MSG_LEN = .TOT_MSG_LEN + 2;
;   4671  2		    END;
;   4672  2		TES;
;   4673  2	
;   4674  2	!
;   4675  2	! Store in the end of line character
;   4676  2	!
;   4677  2	    CH$WCHAR_A (.SEND_EOL, POINTER);
;   4678  2	!
;   4679  2	! If we are debugging then type out the message we are sending.
;   4680  2	!
;   4681  2	    DBG_SEND (SND_MSG, (.TOT_MSG_LEN));
;   4682  2	!
;   4683  2	! Update the stats for total characters and the data characters
;   4684  2	!
;   4685  2	    SMSG_TOTAL_CHARS = .SMSG_TOTAL_CHARS + .TOT_MSG_LEN;
;   4686  2	! Make data characters really be that, not just characters in data field
;   4687  2	!    SMSG_DATA_CHARS = .SMSG_DATA_CHARS + .LENGTH;
;   4688  2	
;   4689  2	    IF .TYPE EQL MSG_NAK
;   4690  2	    THEN
;   4691  3		BEGIN
;   4692  3		SMSG_NAKS = .SMSG_NAKS + 1;
;   4693  3		XFR_STATUS (%C'S', %C'N');
;   4694  3		END
;   4695  2	    ELSE
;   4696  3		BEGIN
;   4697  3		SMSG_COUNT = .SMSG_COUNT + 1;
;   4698  3		XFR_STATUS (%C'S', %C'P');
;   4699  2		END;
;   4700  2	
;   4701  2	!
;   4702  2	! Check if we are in IBM mode and need to wait for an XON first
;   4703  2	! We will not wait if this is a packet which might be going out
;   4704  2	! without previous traffic (generic commands, init packets).
;   4705  2	
;   4706  2	    IF (.IBM_CHAR GEQ 0) AND 			![044] If handshaking on
;   4707  3		NOT (.TYPE EQL MSG_SND_INIT OR .TYPE EQL MSG_SER_INIT OR 	! And not starting
;   4708  3		.TYPE EQL MSG_RCV_INIT OR .TYPE EQL MSG_COMMAND OR 	! type of message
;   4709  3		.TYPE EQL MSG_GENERIC)			! Where other end doesn't know it is coming
;   4710  2	    THEN
;   4711  2	
;   4712  2		IF NOT IBM_WAIT () THEN RETURN KER_ABORTED;
;   4713  2	
;   4714  2	!
;   4715  2	! Now call the O/S routine to send the message out to the remote KERMIT
;   4716  2	!
;   4717  2	    DO_PARITY (SND_MSG, .TOT_MSG_LEN);
;   4718  2	    RETURN SEND (SND_MSG, .TOT_MSG_LEN);
;   4719  1	    END;					! End of SEND_PACKET





;SEND_PACKET
U.24:	.WORD   ^M<R2,R3,R4,R5,R6,R7>		     ;Save R2,R3,R4,R5,R6,R7						      ; 4565
	MOVAB   W^U.58, R7			     ;U.58, R7								      ;
	MOVAB   -96(SP), SP			     ;-96(SP), SP							      ;
	MOVL    -168(R7), R6			     ;SEND_NPAD, R6							      ; 4617
	BEQL    1$				     ;1$								      ;
	MOVC5   #0, (SP), -164(R7), #96, (SP)	     ;#0, (SP), SEND_PADCHAR, #96, FILLER				      ; 4620
	ADDL2   R6, W^SMSG_TOTAL_CHARS		     ;R6, SMSG_TOTAL_CHARS						      ; 4624
	PUSHAB  6(R6)				     ;6(R6)								      ; 4628
	PUSHAB  4(SP)				     ;FILLER								      ;
	CALLS   #2, W^U.22			     ;#2, U.22								      ;
	ADDL3   #6, -168(R7), -(SP)		     ;#6, SEND_NPAD, -(SP)						      ; 4629
	PUSHAB  4(SP)				     ;FILLER								      ;
	CALLS   #2, W^SEND			     ;#2, SEND								      ;
1$:	MOVL    4(AP), R3			     ;TYPE, R3								      ; 4635
	MOVB    R3, 3(R7)			     ;R3, SND_MSG+3							      ;
	MOVB    W^SND_SOH, (R7)			     ;SND_SOH, SND_MSG							      ; 4636
	ADDL3   -144(R7), 8(AP), R0		     ;BLK_CHK_TYPE, LENGTH, R0						      ; 4637
	SUBB3   #14, R0, 1(R7)			     ;#14, R0, SND_MSG+1						      ;
	TSTL    12(AP)				     ;MN								      ; 4640
	BGEQ    2$				     ;2$								      ;
	CLRL    R0				     ;R0								      ;
	BRB     3$				     ;3$								      ;
2$:	MOVL    12(AP), R0			     ;MN, R0								      ;
3$:	ADDB3   #32, R0, 2(R7)			     ;#32, R0, SND_MSG+2						      ;
	MOVAB   1(R7), R2			     ;SND_MSG+1, POINTER						      ; 4644
	ADDL3   #3, 8(AP), -(SP)		     ;#3, LENGTH, -(SP)							      ; 4645
	PUSHL   R2				     ;POINTER								      ;
	CALLS   #2, W^U.19			     ;#2, U.19								      ;
	ADDL3   #6, 8(AP), R4			     ;#6, LENGTH, TOT_MSG_LEN						      ; 4646
	MOVAB   (R7), R1			     ;SND_MSG, R1							      ; 4650
	ADDL2   8(AP), R1			     ;LENGTH, R1							      ;
	MOVAB   4(R1), R2			     ;4(R1), POINTER							      ;
	CASEL   -144(R7), #49, #2		     ;BLK_CHK_TYPE, #49, #2						      ; 4656
4$:	.WORD   5$-4$,-				     ;5$-4$,-								      ;
		6$-4$,-				     ;6$-4$,-								      ;
		7$-4$				     ;7$-4$								      ;
5$:	ADDB3   #32, R0, (R2)			     ;#32, CHKSUM, (POINTER)						      ;
	BRB     8$				     ;8$								      ;
6$:	EXTZV   #6, #6, R0, R1			     ;#6, #6, CHKSUM, R1						      ; 4660
	ADDB3   #32, R1, (R2)+			     ;#32, R1, (POINTER)+						      ;
	EXTZV   #0, #6, R0, R1			     ;#0, #6, CHKSUM, R1						      ; 4661
	ADDB3   #32, R1, (R2)			     ;#32, R1, (POINTER)						      ;
	INCL    R4				     ;TOT_MSG_LEN							      ; 4662
	BRB     8$				     ;8$								      ; 4656
7$:	EXTZV   #12, #4, R0, R1			     ;#12, #4, CHKSUM, R1						      ; 4667
	ADDB3   #32, R1, (R2)+			     ;#32, R1, (POINTER)+						      ;
	EXTZV   #6, #6, R0, R1			     ;#6, #6, CHKSUM, R1						      ; 4668
	ADDB3   #32, R1, (R2)+			     ;#32, R1, (POINTER)+						      ;
	EXTZV   #0, #6, R0, R1			     ;#0, #6, CHKSUM, R1						      ; 4669
	ADDB3   #32, R1, (R2)			     ;#32, R1, (POINTER)						      ;
	ADDL2   #2, R4				     ;#2, TOT_MSG_LEN							      ; 4670
8$:	INCL    R2				     ;POINTER								      ; 4656
	MOVB    -160(R7), (R2)+			     ;SEND_EOL, (POINTER)+						      ; 4677
	PUSHL   R4				     ;TOT_MSG_LEN							      ; 4681
	PUSHL   R7				     ;R7								      ;
	CALLS   #2, W^U.35			     ;#2, U.35								      ;
	ADDL2   R4, W^SMSG_TOTAL_CHARS		     ;TOT_MSG_LEN, SMSG_TOTAL_CHARS					      ; 4685
	CMPL    R3, #78				     ;R3, #78								      ; 4689
	BNEQ    9$				     ;9$								      ;
	INCL    W^SMSG_NAKS			     ;SMSG_NAKS								      ; 4692
	MOVZBL  #78, -(SP)			     ;#78, -(SP)							      ; 4693
	BRB     10$				     ;10$								      ;
9$:	INCL    W^SMSG_COUNT			     ;SMSG_COUNT							      ; 4697
	MOVZBL  #80, -(SP)			     ;#80, -(SP)							      ; 4698
10$:	MOVZBL  #83, -(SP)			     ;#83, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	TSTL    W^IBM_CHAR			     ;IBM_CHAR								      ; 4706
	BLSS    11$				     ;11$								      ;
	CMPL    R3, #83				     ;R3, #83								      ; 4707
	BEQL    11$				     ;11$								      ;
	CMPL    R3, #73				     ;R3, #73								      ;
	BEQL    11$				     ;11$								      ;
	CMPL    R3, #82				     ;R3, #82								      ; 4708
	BEQL    11$				     ;11$								      ;
	CMPL    R3, #67				     ;R3, #67								      ;
	BEQL    11$				     ;11$								      ;
	CMPL    R3, #71				     ;R3, #71								      ; 4709
	BEQL    11$				     ;11$								      ;
	CALLS   #0, W^IBM_WAIT			     ;#0, IBM_WAIT							      ; 4712
	BLBS    R0, 11$				     ;R0, 11$								      ;
	MOVL    #134316258, R0			     ;#134316258, R0							      ;
	RET     				     ;									      ;
11$:	PUSHL   R4				     ;TOT_MSG_LEN							      ; 4717
	PUSHL   R7				     ;R7								      ;
	CALLS   #2, W^U.22			     ;#2, U.22								      ;
	PUSHL   R4				     ;TOT_MSG_LEN							      ; 4718
	PUSHL   R7				     ;R7								      ;
	CALLS   #2, W^SEND			     ;#2, SEND								      ;
	RET     				     ;									      ; 4719

; Routine Size:  346 bytes,    Routine Base:  $CODE$ + 17A7


;   4720  1	%SBTTL 'REC_MESSAGE - Receive a message'
;   4721  1	ROUTINE REC_MESSAGE (CHK_ROUTINE) =
;   4722  1	
;   4723  1	!++
;   4724  1	! FUNCTIONAL DESCRIPTION:
;   4725  1	!
;   4726  1	!	This routine will handle the retry processing for the various
;   4727  1	!	messages that can be received.
;   4728  1	!
;   4729  1	! CALLING SEQUENCE:
;   4730  1	!
;   4731  1	! INPUT PARAMETERS:
;   4732  1	!
;   4733  1	!	None.
;   4734  1	!
;   4735  1	! IMPLICIT INPUTS:
;   4736  1	!
;   4737  1	!	None.
;   4738  1	!
;   4739  1	! OUTPUT PARAMETERS:
;   4740  1	!
;   4741  1	!	None.
;   4742  1	!
;   4743  1	! IMPLICIT OUTPUTS:
;   4744  1	!
;   4745  1	!	None.
;   4746  1	!
;   4747  1	! COMPLETION CODES:
;   4748  1	!
;   4749  1	!	KER_NORMAL - Normal return
;   4750  1	!	KER_RETRIES - Too many retries
;   4751  1	!	(What ever REC_PACKET returns).
;   4752  1	!
;   4753  1	! SIDE EFFECTS:
;   4754  1	!
;   4755  1	!	None.
;   4756  1	!
;   4757  1	!--
;   4758  1	
;   4759  2	    BEGIN
;   4760  2	
;   4761  2	    LOCAL
;   4762  2		STATUS;					! Status returned by various routines
;   4763  2	
;   4764  2	    RETURN
;   4765  2	
;   4766  2		WHILE TRUE DO
;   4767  3		    BEGIN
;   4768  3	
;   4769  3		    IF .NUM_RETRIES GTR .PKT_RETRIES
;   4770  3		    THEN
;   4771  4			BEGIN
;   4772  4			KRM_ERROR (KER_RETRIES);	! Report the error
;   4773  4			RETURN KER_RETRIES;
;   4774  3			END;
;   4775  3	
;   4776  3		    NUM_RETRIES = .NUM_RETRIES + 1;
;   4777  3		    STATUS = REC_PACKET ();
;   4778  3	![043] Don't abort on errors which might just be due to noise.
;   4779  3	
;   4780  3		    IF NOT .STATUS AND .STATUS NEQ KER_CHKSUMERR AND .STATUS NEQ KER_TIMEOUT AND .STATUS NEQ
;   4781  3			KER_ZEROLENMSG
;   4782  3		    THEN
;   4783  3			RETURN .STATUS;
;   4784  3	
;   4785  3		    IF NOT .STATUS
;   4786  3		    THEN
;   4787  3			SEND_PACKET (MSG_NAK, 0, .MSG_NUMBER)	![024]
;   4788  3		    ELSE
;   4789  4			BEGIN
;   4790  4	![021]
;   4791  4	![021] If the packet type is not acceptable by our caller, nak it so the
;   4792  4	![021] other end tries again, and abort the current operation.  This is so
;   4793  4	![021] we will return to server mode (if we are running that way) quickly
;   4794  4	![021] when the other Kermit has been aborted and then restarted, and should
;   4795  4	![021] also make restarting quick, since we will not need to wait for the
;   4796  4	![021] other Kermit to time this message out before retransmitting.
;   4797  4	![021]
;   4798  4	
;   4799  4			IF NOT (.CHK_ROUTINE) ()
;   4800  4			THEN
;   4801  5			    BEGIN
;   4802  5			    SEND_PACKET (MSG_NAK, 0, .REC_SEQ);
;   4803  5			    RETURN FALSE;		! Just indicate an error
;   4804  5			    END
;   4805  4			ELSE
;   4806  4			    EXITLOOP KER_NORMAL;
;   4807  4	
;   4808  3			END;
;   4809  3	
;   4810  2		    END;
;   4811  2	
;   4812  1	    END;					! End of REC_PARSE





;REC_MESSAGE
U.25:	.WORD   ^M<R2,R3>			     ;Save R2,R3							      ; 4721
	MOVAB   W^U.52, R3			     ;U.52, R3								      ;
1$:	CMPL    (R3), W^PKT_RETRIES		     ;NUM_RETRIES, PKT_RETRIES						      ; 4769
	BLEQ    2$				     ;2$								      ;
	PUSHL   #134316194			     ;#134316194							      ; 4772
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
	MOVL    #134316194, R0			     ;#134316194, R0							      ; 4773
	RET     				     ;									      ;
2$:	INCL    (R3)				     ;NUM_RETRIES							      ; 4776
	CALLS   #0, W^U.26			     ;#0, U.26								      ; 4777
	MOVL    R0, R2				     ;R0, STATUS							      ;
	BLBS    R2, 4$				     ;STATUS, 4$							      ; 4780
	CMPL    R2, #134316178			     ;STATUS, #134316178						      ;
	BEQL    3$				     ;3$								      ;
	CMPL    R2, #134316248			     ;STATUS, #134316248						      ;
	BEQL    3$				     ;3$								      ;
	CMPL    R2, #134316234			     ;STATUS, #134316234						      ;
	BEQL    3$				     ;3$								      ;
	MOVL    R2, R0				     ;STATUS, R0							      ; 4783
	RET     				     ;									      ;
3$:	BLBS    R2, 4$				     ;STATUS, 4$							      ; 4785
	PUSHL   4(R3)				     ;MSG_NUMBER							      ; 4787
	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZBL  #78, -(SP)			     ;#78, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	BRB     1$				     ;1$								      ;
4$:	CALLS   #0, @4(AP)			     ;#0, @CHK_ROUTINE							      ; 4799
	BLBS    R0, 5$				     ;R0, 5$								      ;
	PUSHL   8(R3)				     ;REC_SEQ								      ; 4802
	CLRL    -(SP)				     ;-(SP)								      ;
	MOVZBL  #78, -(SP)			     ;#78, -(SP)							      ;
	CALLS   #3, W^U.24			     ;#3, U.24								      ;
	BRB     6$				     ;6$								      ; 4803
5$:	MOVL    #134316043, R0			     ;#134316043, R0							      ; 4806
	RET     				     ;									      ;
6$:	CLRL    R0				     ;R0								      ; 4812
	RET     				     ;									      ;

; Routine Size:  130 bytes,    Routine Base:  $CODE$ + 1901


;   4813  1	%SBTTL 'REC_PACKET'
;   4814  1	ROUTINE REC_PACKET =
;   4815  1	
;   4816  1	!++
;   4817  1	! FUNCTIONAL DESCRIPTION:
;   4818  1	!
;   4819  1	!	This routine will do the oppoiste of SEND_PACKET.  It will wait
;   4820  1	!	for the message to be read from the remote and then it will
;   4821  1	!	check the message for validity.
;   4822  1	!
;   4823  1	! CALLING SEQUENCE:
;   4824  1	!
;   4825  1	!	Flag = REC_PACKET();
;   4826  1	!
;   4827  1	! INPUT PARAMETERS:
;   4828  1	!
;   4829  1	!	None.
;   4830  1	!
;   4831  1	! IMPLICIT INPUTS:
;   4832  1	!
;   4833  1	!	None.
;   4834  1	!
;   4835  1	! OUTPUT PARAMETERS:
;   4836  1	!
;   4837  1	!	None.
;   4838  1	!
;   4839  1	! IMPLICIT OUTPUTS:
;   4840  1	!
;   4841  1	!	REC_MSG - Contains the message received.
;   4842  1	!
;   4843  1	! COMPLETION CODES:
;   4844  1	!
;   4845  1	!	True - Packet receive ok.
;   4846  1	!	False - Problem occured during the receiving of the packet.
;   4847  1	!
;   4848  1	! SIDE EFFECTS:
;   4849  1	!
;   4850  1	!	None.
;   4851  1	!
;   4852  1	!--
;   4853  1	
;   4854  2	    BEGIN
;   4855  2	
;   4856  2	    BIND
;   4857  2		ATTEMPT_TEXT = UPLIT (%ASCIZ'Attempting to receive');
;   4858  2	
;   4859  2	    LOCAL
;   4860  2		STATUS,					! Status returned by various routines
;   4861  2		MSG_LENGTH,
;   4862  2		ERR_POINTER,				! Pointer to the error buffer
;   4863  2		POINTER,
;   4864  2		CHKSUM;					! Checksum of the message
;   4865  2	
;   4866  2	!
;   4867  2	! Attempt to read the message from the remote.
;   4868  2	!
;   4869  2	!    DO
;   4870  2	!	BEGIN
;   4871  2	
;   4872  2	    IF .DEBUG_FLAG
;   4873  2	    THEN
;   4874  3		BEGIN
;   4875  3	
;   4876  3		LOCAL
;   4877  3		    OLD_RTN;
;   4878  3	
;   4879  3		OLD_RTN = TT_SET_OUTPUT (DBG_DUMP);
;   4880  3		TT_TEXT (ATTEMPT_TEXT);
;   4881  3		TT_CRLF ();
;   4882  3		TT_SET_OUTPUT (.OLD_RTN);
;   4883  2		END;
;   4884  2	
;   4885  2	!
;   4886  2	! If status type out requested, do it once
;   4887  2	!
;   4888  2	
;   4889  2	    IF .TYP_STS_FLAG
;   4890  2	    THEN
;   4891  3		BEGIN
;   4892  3		STS_OUTPUT ();
;   4893  3		TYP_STS_FLAG = FALSE;
;   4894  2		END;
;   4895  2	
;   4896  2	!
;   4897  2	! Receive the message from the remote Kermit
;   4898  2	!
;   4899  2	    STATUS = RECEIVE (REC_MSG, MSG_LENGTH);
;   4900  2	!
;   4901  2	! Check for timeouts
;   4902  2	!
;   4903  2	
;   4904  2	    IF .STATUS EQL KER_TIMEOUT THEN XFR_STATUS (%C'R', %C'T');
;   4905  2	
;   4906  2	!
;   4907  2	! If it failed return the status to the upper level
;   4908  2	!
;   4909  2	
;   4910  2	    IF NOT .STATUS
;   4911  2	    THEN
;   4912  3		BEGIN
;   4913  3	
;   4914  3		IF .STATUS NEQ KER_ABORTED AND .STATUS NEQ KER_TIMEOUT THEN KRM_ERROR (.STATUS);
;   4915  3	
;   4916  3							! Report error
;   4917  3		RETURN .STATUS;
;   4918  2		END;
;   4919  2	
;   4920  2	!
;   4921  2	! Determine if we got a good message
;   4922  2	!
;   4923  2	
;   4924  2	    IF .MSG_LENGTH LSS PKT_TOT_OVR_HEAD - 1
;   4925  2	    THEN
;   4926  3		BEGIN
;   4927  3		RETURN KER_ZEROLENMSG;
;   4928  2		END;
;   4929  2	
;   4930  2	!
;   4931  2	! Update the stats on the total number of characters received.
;   4932  2	!
;   4933  2	    RMSG_TOTAL_CHARS = .RMSG_TOTAL_CHARS + .MSG_LENGTH;
;   4934  2	!
;   4935  2	! Initialize the checksum and others
;   4936  2	!
;   4937  2	    REC_TYPE = CH$RCHAR (CH$PTR (REC_MSG, PKT_TYPE, CHR_SIZE));
;   4938  2	!
;   4939  2	! Now break the message apart byte by byte.
;   4940  2	!
;   4941  3	    REC_LENGTH = UNCHAR (CH$RCHAR (CH$PTR (REC_MSG, PKT_COUNT, CHR_SIZE))) - PKT_OVR_HEAD - (
;   4942  2	    .BLK_CHK_TYPE - CHK_1CHAR);
;   4943  2	    REC_SEQ = UNCHAR (CH$RCHAR (CH$PTR (REC_MSG, PKT_SEQ, CHR_SIZE)));
;   4944  2	!
;   4945  2	! Typed the packet if we are debugging
;   4946  2	!
;   4947  2	    DBG_RECEIVE (REC_MSG);
;   4948  2	!
;   4949  2	! Now compute the final checksum and make sure that it is identical
;   4950  2	! to what we received from the remote KERMIT
;   4951  2	!
;   4952  2	    POINTER = CH$PTR (REC_MSG, PKT_MARK + 1, CHR_SIZE);
;   4953  2	    CHKSUM = CALC_BLOCK_CHECK (.POINTER, .REC_LENGTH + PKT_OVR_HEAD);
;   4954  2	    POINTER = CH$PTR (REC_MSG, .REC_LENGTH + PKT_OVR_HEAD + 1, CHR_SIZE);
;   4955  2	    STATUS = KER_NORMAL;			! Assume good checksum
;   4956  2	
;   4957  2	    CASE .BLK_CHK_TYPE FROM CHK_1CHAR TO CHK_CRC OF
;   4958  2		SET
;   4959  2	
;   4960  2		[CHK_1CHAR] :
;   4961  2	
;   4962  2		    IF .CHKSUM NEQ UNCHAR (CH$RCHAR_A (POINTER)) THEN STATUS = KER_CHKSUMERR;
;   4963  2	
;   4964  2		[CHK_2CHAR] :
;   4965  2	
; P 4966  3		    IF (.CHKSUM<6, 6> NEQ UNCHAR (CH$RCHAR_A (POINTER))) OR (.CHKSUM<0, 6> NEQ UNCHAR (
;   4967  3			    CH$RCHAR_A (POINTER)))
;   4968  2		    THEN
;   4969  2			STATUS = KER_CHKSUMERR;
;   4970  2	
;   4971  2		[CHK_CRC] :
;   4972  2	
; P 4973  3		    IF (.CHKSUM<12, 4> NEQ UNCHAR (CH$RCHAR_A (POINTER))) OR (.CHKSUM<6, 6> NEQ UNCHAR (
;   4974  3			    CH$RCHAR_A (POINTER))) OR (.CHKSUM<0, 6> NEQ UNCHAR (CH$RCHAR_A (POINTER)))
;   4975  2		    THEN
;   4976  2			STATUS = KER_CHKSUMERR;
;   4977  2	
;   4978  2		TES;
;   4979  2	
;   4980  2	!
;   4981  2	! If we have a bad checksum, check for the special cases when we might be out
;   4982  2	! of sync with the sender.  This can occur if the sender is retransmitting
;   4983  2	! a send-init (because our ACK got lost), and we have agreed on multi-char
;   4984  2	! checksums, or because the sender is a server who has aborted back to being
;   4985  2	! idle without telling us.
;   4986  2	! Note that in either case, we return back to using single character checksums
;   4987  2	!
;   4988  2	
;   4989  2	    IF .STATUS EQL KER_CHKSUMERR
;   4990  2	    THEN
;   4991  3		BEGIN
;   4992  3	
;   4993  5		IF (.BLK_CHK_TYPE NEQ CHK_1CHAR AND .REC_SEQ EQL 0) AND (.REC_LENGTH LSS 1 - (.BLK_CHK_TYPE
;   4994  4		    - CHK_1CHAR) AND .REC_TYPE EQL MSG_NAK) OR (.REC_TYPE EQL MSG_SND_INIT)
;   4995  3		THEN
;   4996  4		    BEGIN
;   4997  4	
;   4998  4		    LOCAL
;   4999  4			SAVE_BLK_CHK_TYPE;
;   5000  4	
;   5001  4		    SAVE_BLK_CHK_TYPE = .BLK_CHK_TYPE;	! Remember what we are using
;   5002  4		    BLK_CHK_TYPE = CHK_1CHAR;
;   5003  4		    POINTER = CH$PTR (REC_MSG, PKT_MARK + 1, CHR_SIZE);
;   5004  4		    CHKSUM = CALC_BLOCK_CHECK (.POINTER, .REC_LENGTH + PKT_OVR_HEAD);
;   5005  4		    POINTER = CH$PTR (REC_MSG, .REC_LENGTH + PKT_OVR_HEAD + 1, CHR_SIZE);
;   5006  4	
;   5007  5		    IF .CHKSUM NEQ UNCHAR (CH$RCHAR_A (POINTER))
;   5008  4		    THEN
;   5009  5			BEGIN
;   5010  5			BLK_CHK_TYPE = .SAVE_BLK_CHK_TYPE;
;   5011  5			RETURN KER_CHKSUMERR;
;   5012  4			END;
;   5013  4	
;   5014  4		    END
;   5015  3		ELSE
;   5016  3		    RETURN KER_CHKSUMERR;
;   5017  3	
;   5018  2		END;
;   5019  2	
;   5020  2	!
;   5021  2	! Update the stats
;   5022  2	!
;   5023  2	!    RMSG_DATA_CHARS = .RMSG_DATA_CHARS + .REC_LENGTH;
;   5024  2	
;   5025  2	    IF .REC_TYPE EQL MSG_NAK
;   5026  2	    THEN
;   5027  3		BEGIN
;   5028  3		RMSG_NAKS = .RMSG_NAKS + 1;
;   5029  3		XFR_STATUS (%C'R', %C'N');
;   5030  3		END
;   5031  2	    ELSE
;   5032  3		BEGIN
;   5033  3		RMSG_COUNT = .RMSG_COUNT + 1;
;   5034  3		XFR_STATUS (%C'R', %C'P');
;   5035  2		END;
;   5036  2	
;   5037  2	!
;   5038  2	! Now check to see if we have an E type (Error) packet.
;   5039  2	!
;   5040  2	
;   5041  2	    IF .REC_TYPE NEQ MSG_ERROR THEN RETURN KER_NORMAL;
;   5042  2	
;   5043  2	!
;   5044  2	! Here to process an error packet.  Call the user routine to output the
;   5045  2	! error message to the terminal.
;   5046  2	!
;   5047  2	!
;   5048  2	![026] Use decoding routine to fetch the error text
;   5049  2	!
;   5050  2	    CH$FILL (CHR_NUL, MAX_MSG + 1, CH$PTR (LAST_ERROR));
;   5051  2	    SET_STRING (CH$PTR (LAST_ERROR), MAX_MSG, TRUE);
;   5052  2	    BFR_EMPTY ();
;   5053  2	    SET_STRING (0, 0, FALSE);
;   5054  2	![026]    ERR_POINTER = CH$PTR (LAST_ERROR);
;   5055  2	![026]    POINTER = CH$PTR (REC_MSG, PKT_MSG, CHR_SIZE);
;   5056  2	![026]
;   5057  2	![026]    INCR I FROM 1 TO .REC_LENGTH DO
;   5058  2	![026]	CH$WCHAR_A (CH$RCHAR_A (POINTER), ERR_POINTER);
;   5059  2	![026]
;   5060  2	![026]    CH$WCHAR (CHR_NUL, ERR_POINTER);
;   5061  2	    TT_TEXT (LAST_ERROR);
;   5062  2	    TT_CRLF ();
;   5063  2	    RETURN KER_ERRMSG;
;   5064  1	    END;					! End of REC_PACKET



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.AAN:	.ASCII  \Attempting to receive\<0><0><0>     ;									      ;

U.80=		    P.AAN


	.PSECT  $CODE$,NOWRT,2

;REC_PACKET
U.26:	.WORD   ^M<R2,R3,R4,R5,R6,R7>		     ;Save R2,R3,R4,R5,R6,R7						      ; 4814
	MOVAB   W^LAST_ERROR, R7		     ;LAST_ERROR, R7							      ;
	MOVAB   W^U.56, R6			     ;U.56, R6								      ;
	SUBL2   #4, SP				     ;#4, SP								      ;
	BLBC    W^DEBUG_FLAG, 1$		     ;DEBUG_FLAG, 1$							      ; 4872
	PUSHAB  W^DBG_DUMP			     ;DBG_DUMP								      ; 4879
	CALLS   #1, W^TT_SET_OUTPUT		     ;#1, TT_SET_OUTPUT							      ;
	MOVL    R0, R2				     ;R0, OLD_RTN							      ;
	PUSHAB  W^U.80				     ;U.80								      ; 4880
	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 4881
	PUSHL   R2				     ;OLD_RTN								      ; 4882
	CALLS   #1, W^TT_SET_OUTPUT		     ;#1, TT_SET_OUTPUT							      ;
1$:	BLBC    W^TYP_STS_FLAG, 2$		     ;TYP_STS_FLAG, 2$							      ; 4889
	CALLS   #0, W^U.33			     ;#0, U.33								      ; 4892
	CLRL    W^TYP_STS_FLAG			     ;TYP_STS_FLAG							      ; 4893
2$:	PUSHL   SP				     ;SP								      ; 4899
	PUSHAB  4(R6)				     ;REC_MSG								      ;
	CALLS   #2, W^RECEIVE			     ;#2, RECEIVE							      ;
	MOVL    R0, R5				     ;R0, STATUS							      ;
	CMPL    R5, #134316248			     ;STATUS, #134316248						      ; 4904
	BNEQ    3$				     ;3$								      ;
	MOVZBL  #84, -(SP)			     ;#84, -(SP)							      ;
	MOVZBL  #82, -(SP)			     ;#82, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
3$:	BLBS    R5, 5$				     ;STATUS, 5$							      ; 4910
	CMPL    R5, #134316258			     ;STATUS, #134316258						      ; 4914
	BEQL    4$				     ;4$								      ;
	CMPL    R5, #134316248			     ;STATUS, #134316248						      ;
	BEQL    4$				     ;4$								      ;
	PUSHL   R5				     ;STATUS								      ;
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
4$:	MOVL    R5, R0				     ;STATUS, R0							      ; 4917
	RET     				     ;									      ;
5$:	CMPL    (SP), #5			     ;MSG_LENGTH, #5							      ; 4924
	BGEQ    6$				     ;6$								      ;
	MOVL    #134316234, R0			     ;#134316234, R0							      ; 4927
	RET     				     ;									      ;
6$:	ADDL2   (SP), W^RMSG_TOTAL_CHARS	     ;MSG_LENGTH, RMSG_TOTAL_CHARS					      ; 4933
	MOVZBL  7(R6), (R6)			     ;REC_MSG+3, REC_TYPE						      ; 4937
	MOVZBL  5(R6), R0			     ;REC_MSG+1, R0							      ; 4941
	SUBL2   -40(R6), R0			     ;BLK_CHK_TYPE, R0							      ;
	MOVAB   14(R0), -4(R6)			     ;14(R0), REC_LENGTH						      ;
	MOVZBL  6(R6), -8(R6)			     ;REC_MSG+2, REC_SEQ						      ; 4943
	SUBL2   #32, -8(R6)			     ;#32, REC_SEQ							      ;
	PUSHAB  4(R6)				     ;REC_MSG								      ; 4947
	CALLS   #1, W^U.36			     ;#1, U.36								      ;
	MOVAB   5(R6), R2			     ;REC_MSG+1, POINTER						      ; 4952
	ADDL3   #3, -4(R6), -(SP)		     ;#3, REC_LENGTH, -(SP)						      ; 4953
	PUSHL   R2				     ;POINTER								      ;
	CALLS   #2, W^U.19			     ;#2, U.19								      ;
	MOVL    -4(R6), R1			     ;REC_LENGTH, R1							      ; 4954
	MOVAB   8(R6)[R1], R2			     ;REC_MSG+4[R1], POINTER						      ;
	MOVL    #134316043, R5			     ;#134316043, STATUS						      ; 4955
	MOVL    -40(R6), R4			     ;BLK_CHK_TYPE, R4							      ; 4957
	CASEL   R4, #49, #2			     ;R4, #49, #2							      ;
7$:	.WORD   8$-7$,-				     ;8$-7$,-								      ;
		10$-7$,-			     ;10$-7$,-								      ;
		9$-7$				     ;9$-7$								      ;
8$:	MOVZBL  (R2)+, R3			     ;(POINTER)+, R3							      ; 4962
	SUBL2   #32, R3				     ;#32, R3								      ;
	CMPL    R0, R3				     ;CHKSUM, R3							      ;
	BRB     11$				     ;11$								      ;
9$:	MOVZBL  (R2)+, R3			     ;(POINTER)+, R3							      ; 4973
	SUBL2   #32, R3				     ;#32, R3								      ;
	CMPZV   #12, #4, R0, R3			     ;#12, #4, CHKSUM, R3						      ;
	BNEQ    12$				     ;12$								      ;
10$:	MOVZBL  (R2)+, R3			     ;(POINTER)+, R3							      ; 4974
	SUBL2   #32, R3				     ;#32, R3								      ;
	CMPZV   #6, #6, R0, R3			     ;#6, #6, CHKSUM, R3						      ;
	BNEQ    12$				     ;12$								      ;
	MOVZBL  (R2)+, R3			     ;(POINTER)+, R3							      ;
	SUBL2   #32, R3				     ;#32, R3								      ;
	CMPZV   #0, #6, R0, R3			     ;#0, #6, CHKSUM, R3						      ;
11$:	BEQL    13$				     ;13$								      ;
12$:	MOVL    #134316178, R5			     ;#134316178, STATUS						      ; 4976
13$:	CMPL    R5, #134316178			     ;STATUS, #134316178						      ; 4989
	BNEQ    17$				     ;17$								      ;
	CMPL    R4, #49				     ;R4, #49								      ; 4993
	BEQL    14$				     ;14$								      ;
	TSTL    -8(R6)				     ;REC_SEQ								      ;
	BNEQ    14$				     ;14$								      ;
	MOVAB   -50(R4), R3			     ;-50(R4), R3							      ;
	MNEGL   R3, R3				     ;R3, R3								      ;
	CMPL    R1, R3				     ;R1, R3								      ;
	BGEQ    14$				     ;14$								      ;
	CMPL    (R6), #78			     ;REC_TYPE, #78							      ; 4994
	BEQL    15$				     ;15$								      ;
14$:	CMPL    (R6), #83			     ;REC_TYPE, #83							      ;
	BNEQ    16$				     ;16$								      ;
15$:	MOVL    R4, R3				     ;R4, SAVE_BLK_CHK_TYPE						      ; 5001
	MOVL    #49, -40(R6)			     ;#49, BLK_CHK_TYPE							      ; 5002
	MOVAB   5(R6), R2			     ;REC_MSG+1, POINTER						      ; 5003
	PUSHAB  3(R1)				     ;3(R1)								      ; 5004
	PUSHL   R2				     ;POINTER								      ;
	CALLS   #2, W^U.19			     ;#2, U.19								      ;
	MOVAB   4(R6), R1			     ;REC_MSG, R1							      ; 5005
	ADDL2   -4(R6), R1			     ;REC_LENGTH, R1							      ;
	MOVAB   4(R1), R2			     ;4(R1), POINTER							      ;
	MOVZBL  (R2)+, R1			     ;(POINTER)+, R1							      ; 5007
	SUBL2   #32, R1				     ;#32, R1								      ;
	CMPL    R0, R1				     ;CHKSUM, R1							      ;
	BEQL    17$				     ;17$								      ;
	MOVL    R3, -40(R6)			     ;SAVE_BLK_CHK_TYPE, BLK_CHK_TYPE					      ; 5010
16$:	MOVL    #134316178, R0			     ;#134316178, R0							      ; 5016
	RET     				     ;									      ;
17$:	CMPL    (R6), #78			     ;REC_TYPE, #78							      ; 5025
	BNEQ    18$				     ;18$								      ;
	INCL    W^RMSG_NAKS			     ;RMSG_NAKS								      ; 5028
	MOVZBL  #78, -(SP)			     ;#78, -(SP)							      ; 5029
	BRB     19$				     ;19$								      ;
18$:	INCL    W^RMSG_COUNT			     ;RMSG_COUNT							      ; 5033
	MOVZBL  #80, -(SP)			     ;#80, -(SP)							      ; 5034
19$:	MOVZBL  #82, -(SP)			     ;#82, -(SP)							      ;
	CALLS   #2, W^XFR_STATUS		     ;#2, XFR_STATUS							      ;
	CMPL    (R6), #69			     ;REC_TYPE, #69							      ; 5041
	BEQL    20$				     ;20$								      ;
	MOVL    #134316043, R0			     ;#134316043, R0							      ;
	RET     				     ;									      ;
20$:	MOVC5   #0, (SP), #0, #97, (R7)		     ;#0, (SP), #0, #97, LAST_ERROR					      ; 5050
	PUSHL   #1				     ;#1								      ; 5051
	MOVZBL  #96, -(SP)			     ;#96, -(SP)							      ;
	PUSHL   R7				     ;R7								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	CALLS   #0, W^U.28			     ;#0, U.28								      ; 5052
	CLRQ    -(SP)				     ;-(SP)								      ; 5053
	CLRL    -(SP)				     ;-(SP)								      ;
	CALLS   #3, W^U.30			     ;#3, U.30								      ;
	PUSHL   R7				     ;R7								      ; 5061
	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 5062
	MOVL    #134316170, R0			     ;#134316170, R0							      ; 5063
	RET     				     ;									      ; 5064

; Routine Size:  502 bytes,    Routine Base:  $CODE$ + 1983


;   5065  1	%SBTTL 'CALC_BLOCK_CHECK'
;   5066  1	ROUTINE CALC_BLOCK_CHECK (POINTER, LENGTH) =
;   5067  1	
;   5068  1	!++
;   5069  1	! FUNCTIONAL DESCRIPTION:
;   5070  1	!
;   5071  1	!	This routine will calculate the proper value for the block check
;   5072  1	!	for a given message.  The value it returns is dependant upon the
;   5073  1	!	type of block check requested in BLK_CHK_TYPE.
;   5074  1	!
;   5075  1	! CALLING SEQUENCE:
;   5076  1	!
;   5077  1	!	CHKSUM = CALC_BLOCK_CHECK (.POINTER, .LENGTH);
;   5078  1	!
;   5079  1	! INPUT PARAMETERS:
;   5080  1	!
;   5081  1	!	POINTER - A character pointer to the first character to be
;   5082  1	!		included in the block check.
;   5083  1	!
;   5084  1	!	LENGTH - The number of characters to be included.
;   5085  1	!
;   5086  1	! IMPLICIT INPUTS:
;   5087  1	!
;   5088  1	!	BLK_CHK_TYPE - The type of block check to generate.
;   5089  1	!
;   5090  1	! OUPTUT PARAMETERS:
;   5091  1	!
;   5092  1	!	The value is the block check.
;   5093  1	!
;   5094  1	! IMPLICIT OUTPUTS:
;   5095  1	!
;   5096  1	!	None.
;   5097  1	!
;   5098  1	! COMPLETION CODES:
;   5099  1	!
;   5100  1	!	None.
;   5101  1	!
;   5102  1	! SIDE EFFECTS:
;   5103  1	!
;   5104  1	!	None.
;   5105  1	!
;   5106  1	!--
;   5107  1	
;   5108  2	    BEGIN
;   5109  2	
;   5110  2	    LOCAL
;   5111  2		CHAR_MASK,				! Mask for stripping bits
;   5112  2		BLOCK_CHECK;				! To build initial block check value
;   5113  2	
;   5114  2	    BLOCK_CHECK = 0;				! Start out at 0
;   5115  2	!
;   5116  2	! Set mask for characters so that we calculate the block check correctly
;   5117  2	!
;   5118  2	    CHAR_MASK = (IF .PARITY_TYPE EQL PR_NONE THEN %O'377' ELSE %O'177');
;   5119  2	
;   5120  2	    CASE .BLK_CHK_TYPE FROM CHK_1CHAR TO CHK_CRC OF
;   5121  2		SET
;   5122  2	
;   5123  2		[CHK_1CHAR, CHK_2CHAR] :
;   5124  2	
;   5125  2		    INCR I FROM 1 TO .LENGTH DO
;   5126  2			BLOCK_CHECK = .BLOCK_CHECK + (CH$RCHAR_A (POINTER) AND .CHAR_MASK);
;   5127  2	
;   5128  2		[CHK_CRC] :
;   5129  3		    BEGIN
;   5130  3	!
;   5131  3	! Ensure that the calculation is done with correct type of characters
;   5132  3	!
;   5133  3	
;   5134  3		    LOCAL
;   5135  3			TMP_PTR;			! Temp pointer for copying chars
;   5136  3	
;   5137  3		    TMP_PTR = .POINTER;
;   5138  3	
;   5139  3		    IF .PARITY_TYPE NEQ PR_NONE
;   5140  3		    THEN
;   5141  3	
;   5142  3			INCR I FROM 1 TO .LENGTH DO
;   5143  3			    CH$WCHAR_A ((CH$RCHAR (.TMP_PTR) AND %O'177'), TMP_PTR);
;   5144  3	
;   5145  3		    BLOCK_CHECK = CRCCLC (.POINTER, .LENGTH);
;   5146  2		    END;
;   5147  2		TES;
;   5148  2	
;   5149  2	    IF .BLK_CHK_TYPE EQL CHK_1CHAR
;   5150  2	    THEN
;   5151  2		BLOCK_CHECK = (.BLOCK_CHECK + ((.BLOCK_CHECK AND %O'300')/%O'100')) AND %O'77';
;   5152  2	
;   5153  2	    RETURN .BLOCK_CHECK;			! Return the correct value
;   5154  1	    END;					! End of CALC_BLOCK_CHK





;CALC_BLOCK_CHECK
U.19:	.WORD   ^M<R2,R3,R4>			     ;Save R2,R3,R4							      ; 5066
	CLRL    R3				     ;BLOCK_CHECK							      ; 5114
	MOVL    W^PARITY_TYPE, R1		     ;PARITY_TYPE, R1							      ; 5118
	BNEQ    1$				     ;1$								      ;
	MOVZBL  #255, R2			     ;#255, CHAR_MASK							      ;
	BRB     2$				     ;2$								      ;
1$:	MOVZBL  #127, R2			     ;#127, CHAR_MASK							      ;
2$:	CASEL   W^U.46, #49, #2			     ;U.46, #49, #2							      ; 5120
3$:	.WORD   4$-3$,-				     ;4$-3$,-								      ;
		4$-3$,-				     ;4$-3$,-								      ;
		7$-3$				     ;7$-3$								      ;
4$:	CLRL    R0				     ;I									      ; 5125
	BRB     6$				     ;6$								      ;
5$:	MOVZBL  @4(AP), R1			     ;@POINTER, R1							      ; 5126
	INCL    4(AP)				     ;POINTER								      ;
	MCOML   R2, R4				     ;CHAR_MASK, R4							      ;
	BICL2   R4, R1				     ;R4, R1								      ;
	ADDL2   R1, R3				     ;R1, BLOCK_CHECK							      ;
6$:	AOBLEQ  8(AP), R0, 5$			     ;LENGTH, I, 5$							      ;
	BRB     11$				     ;11$								      ; 5125
7$:	MOVL    4(AP), R2			     ;POINTER, TMP_PTR							      ; 5137
	TSTL    R1				     ;R1								      ; 5139
	BEQL    10$				     ;10$								      ;
	CLRL    R0				     ;I									      ; 5143
	BRB     9$				     ;9$								      ;
8$:	EXTZV   #0, #7, (R2), R1		     ;#0, #7, (TMP_PTR), R1						      ;
	MOVB    R1, (R2)+			     ;R1, (TMP_PTR)+							      ;
9$:	AOBLEQ  8(AP), R0, 8$			     ;LENGTH, I, 8$							      ;
10$:	MOVQ    4(AP), -(SP)			     ;POINTER, -(SP)							      ; 5145
	CALLS   #2, W^CRCCLC			     ;#2, CRCCLC							      ;
	MOVL    R0, R3				     ;R0, BLOCK_CHECK							      ;
11$:	CMPL    W^U.46, #49			     ;U.46, #49								      ; 5149
	BNEQ    12$				     ;12$								      ;
	BICL3   #-193, R3, R0			     ;#-193, BLOCK_CHECK, R0						      ; 5151
	DIVL2   #64, R0				     ;#64, R0								      ;
	ADDL2   R3, R0				     ;BLOCK_CHECK, R0							      ;
	EXTZV   #0, #6, R0, R3			     ;#0, #6, R0, BLOCK_CHECK						      ;
12$:	MOVL    R3, R0				     ;BLOCK_CHECK, R0							      ; 5153
	RET     				     ;									      ; 5154

; Routine Size:  131 bytes,    Routine Base:  $CODE$ + 1B79


;   5155  1	%SBTTL 'NORMALIZE_FILE - Put file name into normal form'
;   5156  1	ROUTINE NORMALIZE_FILE (FILE_ADDRESS, FILE_LENGTH, NAME_LENGTH, TYPE_LENGTH) : NOVALUE =
;   5157  1	
;   5158  1	!++
;   5159  1	! FUNCTIONAL DESCRIPTION:
;   5160  1	!
;   5161  1	!	This routine will ensure that a file specification is in normal
;   5162  1	!	form.  It does this by replacing all non-alphanumeric characters
;   5163  1	!	(except the first period) with "X".  It will also ensure that
;   5164  1	!	the resulting specification (of form name.type) has only
;   5165  1	!	a specified number of characters in the name portion and type portion.
;   5166  1	!
;   5167  1	! CALLING SEQUENCE:
;   5168  1	!
;   5169  1	!	NORMALIZE_FILE (FILE_ADDRESS, FILE_LENGTH, NAME_LENGTH, TYPE_LENGTH);
;   5170  1	!
;   5171  1	! INPUT PARAMETERS:
;   5172  1	!
;   5173  1	!	FILE_ADDRESS - Address of file specification string to be normalized
;   5174  1	!
;   5175  1	!	FILE_LENGTH - Length of file specification
;   5176  1	!
;   5177  1	!	NAME_LENGTH - Maximum length desired for "name" portion.
;   5178  1	!
;   5179  1	!	TYPE_LENGTH - Maximum length desired for "type" portion.
;   5180  1	!
;   5181  1	!	With both NAME_LENGTH and TYPE_LENGTH, a negative value indicates
;   5182  1	!	unlimited lenght.
;   5183  1	!
;   5184  1	! IMPLICIT INPUTS:
;   5185  1	!
;   5186  1	!	None.
;   5187  1	!
;   5188  1	! OUPTUT PARAMETERS:
;   5189  1	!
;   5190  1	!	FILE_LENGTH - The length of the resulting file spec
;   5191  1	!
;   5192  1	!	NAME_LENGTH - The actual length of the resulting file name
;   5193  1	!
;   5194  1	!	TYPE_LENGTH - The actual length of the resulting file type
;   5195  1	!
;   5196  1	! IMPLICIT OUTPUTS:
;   5197  1	!
;   5198  1	!	None.
;   5199  1	!
;   5200  1	! COMPLETION CODES:
;   5201  1	!
;   5202  1	!	None.
;   5203  1	!
;   5204  1	! SIDE EFFECTS:
;   5205  1	!
;   5206  1	!	None.
;   5207  1	!
;   5208  1	!--
;   5209  1	
;   5210  2	    BEGIN
;   5211  2	
;   5212  2	    LOCAL
;   5213  2		CH,					! Character being processed
;   5214  2		POINTER,				! Pointer to file spec
;   5215  2		WRT_POINTER,				! Pointer to write file spec
;   5216  2		WRT_SIZE,
;   5217  2		FIRST_PERIOD,				! Flag we have seen a period
;   5218  2		IGNORE_BAD,				! Flag we should ignore bad characters
;   5219  2		BAD_CHAR,				! Flag this character was bad
;   5220  2		FILE_CTR,				! Counter for overall length
;   5221  2		NAME_CTR,				! Counter for name characters
;   5222  2		TYPE_CTR;				! Counter for type characters
;   5223  2	
;   5224  2	    FILE_CTR = 0;
;   5225  2	    NAME_CTR = 0;
;   5226  2	    TYPE_CTR = 0;
;   5227  2	    WRT_SIZE = 0;
;   5228  2	    FIRST_PERIOD = FALSE;			! No periods yet
;   5229  2	    POINTER = CH$PTR (.FILE_ADDRESS);		! Set up pointer to file name
;   5230  2	    WRT_POINTER = .POINTER;
;   5231  2	
;   5232  2	    IF .NAME_LENGTH EQL 0 THEN FIRST_PERIOD = TRUE;	! Pretend we did name already
;   5233  2	
;   5234  2	    IGNORE_BAD = FALSE;
;   5235  2	
;   5236  2	    IF .NAME_LENGTH GTR 0
;   5237  2	    THEN
;   5238  3		BEGIN
;   5239  3	
;   5240  3		DECR I FROM ..FILE_LENGTH TO 0 DO
;   5241  3	
;   5242  3		    IF CH$RCHAR_A (POINTER) EQL %C'.'
;   5243  3		    THEN
;   5244  4			BEGIN
;   5245  4			IGNORE_BAD = TRUE;
;   5246  4			EXITLOOP;
;   5247  3			END;
;   5248  3	
;   5249  2		END;
;   5250  2	
;   5251  2	    POINTER = .WRT_POINTER;
;   5252  2	
;   5253  2	    WHILE .FILE_CTR LSS ..FILE_LENGTH DO
;   5254  3		BEGIN
;   5255  3		CH = CH$RCHAR_A (POINTER);		! Get a character
;   5256  3		FILE_CTR = .FILE_CTR + 1;
;   5257  3	
;   5258  4		IF (.CH LSS %C'0' AND (.CH NEQ %C'.' OR .FIRST_PERIOD)) OR .CH GTR %C'z' OR (.CH GTR %C'9'
;   5259  4		    AND .CH LSS %C'A') OR (.CH GTR %C'Z' AND .CH LSS %C'a')
;   5260  3		THEN
;   5261  4		    BEGIN
;   5262  4		    BAD_CHAR = TRUE;
;   5263  4		    CH = %C'X';
;   5264  4		    END
;   5265  3		ELSE
;   5266  4		    BEGIN
;   5267  4		    BAD_CHAR = FALSE;
;   5268  4	
;   5269  4		    IF .CH GEQ %C'a' THEN CH = .CH - (%C'a' - %C'A');
;   5270  4	
;   5271  3		    END;
;   5272  3	
;   5273  3		IF .CH EQL %C'.'
;   5274  3		THEN
;   5275  4		    BEGIN
;   5276  4		    FIRST_PERIOD = TRUE;
;   5277  4		    CH$WCHAR_A (.CH, WRT_POINTER);
;   5278  4		    WRT_SIZE = .WRT_SIZE + 1;
;   5279  4		    END
;   5280  3		ELSE
;   5281  3	
;   5282  3		    IF NOT .BAD_CHAR OR NOT .IGNORE_BAD
;   5283  3		    THEN
;   5284  3	
;   5285  3			IF NOT .FIRST_PERIOD
;   5286  3			THEN
;   5287  4			    BEGIN
;   5288  4	
;   5289  4			    IF .NAME_LENGTH LSS 0 OR .NAME_CTR LSS .NAME_LENGTH
;   5290  4			    THEN
;   5291  5				BEGIN
;   5292  5				NAME_CTR = .NAME_CTR + 1;
;   5293  5				WRT_SIZE = .WRT_SIZE + 1;
;   5294  5				CH$WCHAR_A (.CH, WRT_POINTER);
;   5295  4				END;
;   5296  4	
;   5297  4			    END
;   5298  3			ELSE
;   5299  3	
;   5300  3			    IF .TYPE_LENGTH LSS 0 OR .TYPE_CTR LSS .TYPE_LENGTH
;   5301  3			    THEN
;   5302  4				BEGIN
;   5303  4				TYPE_CTR = .TYPE_CTR + 1;
;   5304  4				WRT_SIZE = .WRT_SIZE + 1;
;   5305  4				CH$WCHAR_A (.CH, WRT_POINTER);
;   5306  3				END;
;   5307  3	
;   5308  2		END;
;   5309  2	
;   5310  2	    .FILE_LENGTH = .WRT_SIZE;
;   5311  2	    CH$WCHAR_A (CHR_NUL, WRT_POINTER);
;   5312  1	    END;					! End of NORMALIZE_FILE





;NORMALIZE_FILE
U.27:	.WORD   ^M<R2,R3,R4,R5,R6,R7,R8,R9,R10>      ;Save R2,R3,R4,R5,R6,R7,R8,R9,R10					      ; 5156
	CLRQ    R8				     ;NAME_CTR								      ; 5225
	CLRL    R7				     ;TYPE_CTR								      ; 5226
	CLRQ    R4				     ;FIRST_PERIOD							      ; 5228
	MOVL    4(AP), R6			     ;FILE_ADDRESS, POINTER						      ; 5229
	MOVL    R6, R1				     ;POINTER, WRT_POINTER						      ; 5230
	MOVL    12(AP), R3			     ;NAME_LENGTH, R3							      ; 5232
	BNEQ    1$				     ;1$								      ;
	MOVL    #1, R4				     ;#1, FIRST_PERIOD							      ;
1$:	CLRL    R10				     ;IGNORE_BAD							      ; 5234
	TSTL    R3				     ;R3								      ; 5236
	BLEQ    4$				     ;4$								      ;
	ADDL3   #1, @8(AP), R0			     ;#1, @FILE_LENGTH, I						      ; 5240
	BRB     3$				     ;3$								      ;
2$:	MOVZBL  (R6)+, R2			     ;(POINTER)+, R2							      ; 5242
	CMPB    R2, #46				     ;R2, #46								      ;
	BNEQ    3$				     ;3$								      ;
	MOVL    #1, R10				     ;#1, IGNORE_BAD							      ; 5245
	BRB     4$				     ;4$								      ; 5244
3$:	SOBGEQ  R0, 2$				     ;I, 2$								      ; 5242
4$:	MOVL    R1, R6				     ;WRT_POINTER, POINTER						      ; 5251
5$:	CMPL    R9, @8(AP)			     ;FILE_CTR, @FILE_LENGTH						      ; 5253
	BLSS    6$				     ;6$								      ;
	BRW     19$				     ;19$								      ;
6$:	MOVZBL  (R6)+, R0			     ;(POINTER)+, CH							      ; 5255
	INCL    R9				     ;FILE_CTR								      ; 5256
	CMPL    R0, #48				     ;CH, #48								      ; 5258
	BGEQ    7$				     ;7$								      ;
	CMPL    R0, #46				     ;CH, #46								      ;
	BNEQ    9$				     ;9$								      ;
	BLBS    R4, 9$				     ;FIRST_PERIOD, 9$							      ;
7$:	CMPL    R0, #122			     ;CH, #122								      ;
	BGTR    9$				     ;9$								      ;
	CMPL    R0, #57				     ;CH, #57								      ;
	BLEQ    8$				     ;8$								      ;
	CMPL    R0, #65				     ;CH, #65								      ; 5259
	BLSS    9$				     ;9$								      ;
8$:	CMPL    R0, #90				     ;CH, #90								      ;
	BLEQ    10$				     ;10$								      ;
	CMPL    R0, #97				     ;CH, #97								      ;
	BGEQ    10$				     ;10$								      ;
9$:	MOVL    #1, R2				     ;#1, BAD_CHAR							      ; 5262
	MOVZBL  #88, R0				     ;#88, CH								      ; 5263
	BRB     11$				     ;11$								      ; 5258
10$:	CLRL    R2				     ;BAD_CHAR								      ; 5267
	CMPL    R0, #97				     ;CH, #97								      ; 5269
	BLSS    11$				     ;11$								      ;
	SUBL2   #32, R0				     ;#32, CH								      ;
11$:	CMPL    R0, #46				     ;CH, #46								      ; 5273
	BNEQ    13$				     ;13$								      ;
	MOVL    #1, R4				     ;#1, FIRST_PERIOD							      ; 5276
	MOVB    R0, (R1)+			     ;CH, (WRT_POINTER)+						      ; 5277
	INCL    R5				     ;WRT_SIZE								      ; 5278
12$:	BRB     5$				     ;5$								      ; 5273
13$:	BLBC    R2, 14$				     ;BAD_CHAR, 14$							      ; 5282
	BLBS    R10, 5$				     ;IGNORE_BAD, 5$							      ;
14$:	BLBS    R4, 16$				     ;FIRST_PERIOD, 16$							      ; 5285
	TSTL    R3				     ;R3								      ; 5289
	BLSS    15$				     ;15$								      ;
	CMPL    R8, R3				     ;NAME_CTR, R3							      ;
	BGEQ    5$				     ;5$								      ;
15$:	INCL    R8				     ;NAME_CTR								      ; 5292
	BRB     18$				     ;18$								      ; 5293
16$:	TSTL    16(AP)				     ;TYPE_LENGTH							      ; 5300
	BLSS    17$				     ;17$								      ;
	CMPL    R7, 16(AP)			     ;TYPE_CTR, TYPE_LENGTH						      ;
	BGEQ    12$				     ;12$								      ;
17$:	INCL    R7				     ;TYPE_CTR								      ; 5303
18$:	INCL    R5				     ;WRT_SIZE								      ; 5304
	MOVB    R0, (R1)+			     ;CH, (WRT_POINTER)+						      ; 5305
	BRB     12$				     ;12$								      ; 5285
19$:	MOVL    R5, @8(AP)			     ;WRT_SIZE, @FILE_LENGTH						      ; 5310
	CLRB    (R1)+				     ;(WRT_POINTER)+							      ; 5311
	RET     				     ;									      ; 5312

; Routine Size:  211 bytes,    Routine Base:  $CODE$ + 1BFC


;   5313  1	%SBTTL 'Buffer filling -- Main routine'
;   5314  1	ROUTINE BFR_FILL (FIRST_FLAG) =
;   5315  1	
;   5316  1	!++
;   5317  1	! FUNCTIONAL DESCRIPTION:
;   5318  1	!
;   5319  1	!	This routine will fill the buffer with data from the file.  It
;   5320  1	!	will do all the quoting that is required.
;   5321  1	!
;   5322  1	! CALLING SEQUENCE:
;   5323  1	!
;   5324  1	!	EOF_FLAG = BFR_FILL(.FIRST_FLAG);
;   5325  1	!
;   5326  1	! INPUT PARAMETERS:
;   5327  1	!
;   5328  1	!	FIRST_FLAG - Flag whether first call for this file
;   5329  1	!
;   5330  1	! IMPLICIT INPUTS:
;   5331  1	!
;   5332  1	!	None.
;   5333  1	!
;   5334  1	! OUTPUT PARAMETERS:
;   5335  1	!
;   5336  1	!	True - Buffer filled may be at end of file.
;   5337  1	!	False - At end of file.
;   5338  1	!
;   5339  1	! IMPLICIT OUTPUTS:
;   5340  1	!
;   5341  1	!	Number of characters stored in the buffer.
;   5342  1	!
;   5343  1	! COMPLETION CODES:
;   5344  1	!
;   5345  1	!	None.
;   5346  1	!
;   5347  1	! SIDE EFFECTS:
;   5348  1	!
;   5349  1	!	None.
;   5350  1	!
;   5351  1	!--
;   5352  1	
;   5353  2	    BEGIN
;   5354  2	
;   5355  2	    LITERAL
;   5356  2		NO_CHAR = -1,				! No character next
;   5357  2		EOF_CHAR = -2;				! EOF seen
;   5358  2	
;   5359  2	    LOCAL
;   5360  2		I,					! Temp loop index
;   5361  2		MAX_SIZE,				! Maximum size of data
;   5362  2		POINTER;				! Pointer into the message buffer
;   5363  2	
;   5364  2	    OWN
;   5365  2		NEXT_CHR,				! Saved character
;   5366  2		STATUS,					! Status value
;   5367  2		REPEAT_COUNT,				! Number of times character repeated
;   5368  2		CHAR_8_BIT,				! 8 bit character from file
;   5369  2		CHRS : VECTOR [5],			! String needed to represent character
;   5370  2		CHR_IDX,				! Index into CHRS
;   5371  2		OLD_CHAR_8_BIT,				! Previous 8-bit character
;   5372  2		OLD_CHRS : VECTOR [5],			! String for previous character
;   5373  2		OLD_CHR_IDX;				! Index for previous character
;   5374  2	
;   5375  2	    ROUTINE GET_QUOTED_CHAR =
;   5376  2	!
;   5377  2	! This routine gets a character from the file and returns both
;   5378  2	! the character and the string needed to represent the character
;   5379  2	! if it needs quoting.
;   5380  2	!
;   5381  3		BEGIN
;   5382  3	
;   5383  3		IF .NEXT_CHR GEQ 0
;   5384  3		THEN
;   5385  4		    BEGIN
;   5386  4		    CHAR_8_BIT = .NEXT_CHR;
;   5387  4		    NEXT_CHR = NO_CHAR;
;   5388  4		    STATUS = KER_NORMAL;
;   5389  4		    END
;   5390  3		ELSE
;   5391  3	
;   5392  3		    IF .NEXT_CHR EQL NO_CHAR
;   5393  3		    THEN
;   5394  3			STATUS = (.GET_CHR_ROUTINE) (CHAR_8_BIT)
;   5395  3		    ELSE
;   5396  3			STATUS = KER_EOF;
;   5397  3	
;   5398  3		IF .STATUS EQL KER_NORMAL
;   5399  3		THEN
;   5400  4		    BEGIN
;   5401  4	!
;   5402  4	! Determine if we should just quote the character
;   5403  4	!	Either:
;   5404  4	!		Character is a delete (177 octal)
;   5405  4	!	or	Character is a control character (less than 40 octal)
;   5406  4	!	or	Character is a quote character
;   5407  4	!	or	Character is the repeat character and doing repeat compression
;   5408  4	!	or	Character is an eight bit quote character and doing eight bit
;   5409  4	!		  quoting.
;   5410  4	!
;   5411  4	
;   5412  5		    IF ((.CHAR_8_BIT AND %O'177') LSS %C' ') OR ((.CHAR_8_BIT AND %O'177') EQL CHR_DEL) OR (
;   5413  7			(.CHAR_8_BIT AND %O'177') EQL .RCV_QUOTE_CHR) OR (.FLAG_REPEAT AND ((.CHAR_8_BIT AND
;   5414  6			%O'177') EQL .REPT_CHR)) OR (.FLAG_8QUOTE AND ((.CHAR_8_BIT AND %O'177') EQL
;   5415  5			.SEND_8QUOTE_CHR))
;   5416  4		    THEN
;   5417  5			BEGIN
;   5418  5	!
;   5419  5	! If the character is a control character or delete we must do a CTL(Character)
;   5420  5	! so it is something that we can be sure we can send.
;   5421  5	!
;   5422  5	
;   5423  6			IF ((.CHAR_8_BIT AND %O'177') LSS %C' ') OR ((.CHAR_8_BIT AND %O'177') EQL CHR_DEL)
;   5424  5			THEN
;   5425  6			    CHRS [0] = CTL (.CHAR_8_BIT)
;   5426  5			ELSE
;   5427  5			    CHRS [0] = .CHAR_8_BIT;
;   5428  5	
;   5429  5			CHR_IDX = 1;
;   5430  5			CHRS [1] = .RCV_QUOTE_CHR;	![035] Use character we said we would send
;   5431  5			END
;   5432  4		    ELSE
;   5433  5			BEGIN
;   5434  5			CHR_IDX = 0;
;   5435  5			CHRS [0] = .CHAR_8_BIT;
;   5436  4			END;
;   5437  4	
;   5438  4		    END
;   5439  3		ELSE
;   5440  3	
;   5441  3		    IF .STATUS NEQ KER_EOF THEN KRM_ERROR (.STATUS);	! Report error
;   5442  3	
;   5443  3		RETURN .STATUS;
;   5444  2		END;



	.PSECT  $OWN$,NOEXE,2

;NEXT_CHR
U.81:	.BLKB   4
;STATUS
U.82:	.BLKB   4
;REPEAT_COUNT
U.83:	.BLKB   4
;CHAR_8_BIT
U.84:	.BLKB   4
;CHRS
U.85:	.BLKB   20
;CHR_IDX
U.86:	.BLKB   4
;OLD_CHAR_8_BIT
U.87:	.BLKB   4
;OLD_CHRS
U.88:	.BLKB   20
;OLD_CHR_IDX
U.89:	.BLKB   4



	.PSECT  $CODE$,NOWRT,2

;GET_QUOTED_CHAR
U.90:	.WORD   ^M<R2>				     ;Save R2								      ; 5375
	MOVAB   W^U.82, R2			     ;U.82, R2								      ;
	MOVL    -4(R2), R0			     ;NEXT_CHR, R0							      ; 5383
	BLSS    1$				     ;1$								      ;
	MOVL    R0, 8(R2)			     ;R0, CHAR_8_BIT							      ; 5386
	MNEGL   #1, -4(R2)			     ;#1, NEXT_CHR							      ; 5387
	MOVL    #134316043, (R2)		     ;#134316043, STATUS						      ; 5388
	BRB     3$				     ;3$								      ; 5383
1$:	CMPL    R0, #-1				     ;R0, #-1								      ; 5392
	BNEQ    2$				     ;2$								      ;
	PUSHAB  8(R2)				     ;CHAR_8_BIT							      ; 5394
	CALLS   #1, @-12(R2)			     ;#1, @GET_CHR_ROUTINE						      ;
	MOVL    R0, (R2)			     ;R0, STATUS							      ;
	BRB     3$				     ;3$								      ;
2$:	MOVL    #134316131, (R2)		     ;#134316131, STATUS						      ; 5396
3$:	MOVL    (R2), R0			     ;STATUS, R0							      ; 5398
	CMPL    R0, #134316043			     ;R0, #134316043							      ;
	BNEQ    11$				     ;11$								      ;
	MOVL    8(R2), R1			     ;CHAR_8_BIT, R1							      ; 5412
	CLRL    R0				     ;R0								      ;
	CMPZV   #0, #7, R1, #32			     ;#0, #7, R1, #32							      ;
	BGEQ    4$				     ;4$								      ;
	INCL    R0				     ;R0								      ;
	BRB     6$				     ;6$								      ;
4$:	CMPZV   #0, #7, R1, #127		     ;#0, #7, R1, #127							      ;
	BEQL    6$				     ;6$								      ;
	CMPZV   #0, #7, R1, W^RCV_QUOTE_CHR	     ;#0, #7, R1, RCV_QUOTE_CHR						      ; 5413
	BEQL    6$				     ;6$								      ;
	BLBC    -276(R2), 5$			     ;FLAG_REPEAT, 5$							      ;
	CMPZV   #0, #7, R1, -316(R2)		     ;#0, #7, R1, REPT_CHR						      ; 5414
	BEQL    6$				     ;6$								      ;
5$:	BLBC    -280(R2), 10$			     ;FLAG_8QUOTE, 10$							      ;
	CMPZV   #0, #7, R1, -292(R2)		     ;#0, #7, R1, SEND_8QUOTE_CHR					      ; 5415
	BNEQ    10$				     ;10$								      ;
6$:	BLBS    R0, 7$				     ;R0, 7$								      ; 5423
	CMPZV   #0, #7, R1, #127		     ;#0, #7, R1, #127							      ;
	BNEQ    8$				     ;8$								      ;
7$:	XORL3   #64, R1, 12(R2)			     ;#64, R1, CHRS							      ; 5425
	BRB     9$				     ;9$								      ;
8$:	MOVL    R1, 12(R2)			     ;R1, CHRS								      ; 5427
9$:	MOVL    #1, 32(R2)			     ;#1, CHR_IDX							      ; 5429
	MOVL    W^RCV_QUOTE_CHR, 16(R2)		     ;RCV_QUOTE_CHR, CHRS+4						      ; 5430
	BRB     12$				     ;12$								      ; 5412
10$:	CLRL    32(R2)				     ;CHR_IDX								      ; 5434
	MOVL    R1, 12(R2)			     ;R1, CHRS								      ; 5435
	BRB     12$				     ;12$								      ; 5398
11$:	CMPL    R0, #134316131			     ;R0, #134316131							      ; 5441
	BEQL    12$				     ;12$								      ;
	PUSHL   R0				     ;R0								      ;
	CALLS   #1, W^KRM_ERROR			     ;#1, KRM_ERROR							      ;
12$:	MOVL    (R2), R0			     ;STATUS, R0							      ; 5443
	RET     				     ;									      ; 5444

; Routine Size:  205 bytes,    Routine Base:  $CODE$ + 1CCF


;   5445  2	    ROUTINE GET_8_QUOTED_CHAR =
;   5446  2	!
;   5447  2	! This routine will get the quoted representation of a character
;   5448  2	! (by calling GET_QUOTED_CHAR), and return the 8th-bit quoted
;   5449  2	! representation.
;   5450  2	!
;   5451  3		BEGIN
;   5452  3	
;   5453  3		IF (STATUS = GET_QUOTED_CHAR ()) EQL KER_NORMAL
;   5454  3		THEN
;   5455  4		    BEGIN
;   5456  4	!
;   5457  4	! Determine if we must quote the eighth bit (parity bit on)
;   5458  4	!
;   5459  4	
;   5460  5		    IF (((.CHRS [0] AND %O'177') NEQ .CHRS [0]) AND .FLAG_8QUOTE)
;   5461  4		    THEN
;   5462  5			BEGIN
;   5463  5			CHRS [0] = .CHRS [0] AND %O'177';
;   5464  5			CHR_IDX = .CHR_IDX + 1;
;   5465  5			CHRS [.CHR_IDX] = .SEND_8QUOTE_CHR;
;   5466  4			END;
;   5467  4	
;   5468  3		    END;
;   5469  3	
;   5470  3		RETURN .STATUS;
;   5471  2		END;





;GET_8_QUOTED_CHAR
U.91:	.WORD   ^M<R2>				     ;Save R2								      ; 5445
	MOVAB   W^U.85, R2			     ;U.85, R2								      ;
	CALLS   #0, W^U.90			     ;#0, U.90								      ; 5453
	MOVL    R0, -12(R2)			     ;R0, STATUS							      ;
	CMPL    R0, #134316043			     ;R0, #134316043							      ;
	BNEQ    1$				     ;1$								      ;
	CMPZV   #0, #7, (R2), (R2)		     ;#0, #7, CHRS, CHRS						      ; 5460
	BEQL    1$				     ;1$								      ;
	BLBC    -292(R2), 1$			     ;FLAG_8QUOTE, 1$							      ;
	EXTZV   #0, #7, (R2), (R2)		     ;#0, #7, CHRS, CHRS						      ; 5463
	INCL    20(R2)				     ;CHR_IDX								      ; 5464
	MOVL    20(R2), R0			     ;CHR_IDX, R0							      ; 5465
	MOVL    -304(R2), (R2)[R0]		     ;SEND_8QUOTE_CHR, CHRS[R0]						      ;
1$:	MOVL    -12(R2), R0			     ;STATUS, R0							      ; 5470
	RET     				     ;									      ; 5471

; Routine Size:  60 bytes,    Routine Base:  $CODE$ + 1D9C


;   5472  2	!
;   5473  2	! Start of code for BFR_FILL
;   5474  2	!
;   5475  2	! Initialize pointer and count
;   5476  2	!
;   5477  2	    SIZE = 0;
;   5478  2	    POINTER = CH$PTR (SND_MSG, PKT_MSG, CHR_SIZE);
;   5479  2	    MAX_SIZE = .SEND_PKT_SIZE - PKT_OVR_HEAD - (.BLK_CHK_TYPE - CHK_1CHAR);
;   5480  2	!
;   5481  2	! If last call got an error or eof, return it now
;   5482  2	!
;   5483  2	
;   5484  2	    IF NOT .FIRST_FLAG AND (.STATUS NEQ KER_NORMAL) THEN RETURN .STATUS;
;   5485  2	
;   5486  2	!
;   5487  2	! If first time for a file prime the pump with the first character.
;   5488  2	!
;   5489  2	
;   5490  2	    IF .FIRST_FLAG
;   5491  2	    THEN
;   5492  3		BEGIN
;   5493  3		FIRST_FLAG = FALSE;
;   5494  3		NEXT_CHR = -1;				! No backed up character
;   5495  3	
;   5496  3		IF .FLAG_8QUOTE THEN STATUS = GET_8_QUOTED_CHAR () ELSE STATUS = GET_QUOTED_CHAR ();
;   5497  3	
;   5498  3		IF .STATUS NEQ KER_NORMAL THEN RETURN .STATUS;
;   5499  3	
;   5500  3		OLD_CHAR_8_BIT = .CHAR_8_BIT;
;   5501  3	
;   5502  3		INCR OLD_CHR_IDX FROM 0 TO .CHR_IDX DO
;   5503  3		    OLD_CHRS [.OLD_CHR_IDX] = .CHRS [.OLD_CHR_IDX];
;   5504  3	
;   5505  3		OLD_CHR_IDX = .CHR_IDX;
;   5506  3		REPEAT_COUNT = 0;			! Character was not repeated yet
;   5507  3							! Will always be incremented
;   5508  2		END;
;   5509  2	
;   5510  2	!
;   5511  2	! Otherwise, loop until we fill buffer
;   5512  2	!
;   5513  2	
;   5514  2	    WHILE .SIZE LSS .MAX_SIZE DO 		! Normal exit is via an EXITLOOP
;   5515  3		BEGIN
;   5516  3	!
;   5517  3	! Check if we are doing run compression
;   5518  3	!
;   5519  3	
;   5520  3		IF .FLAG_REPEAT
;   5521  3		THEN
;   5522  4		    BEGIN
;   5523  4	!
;   5524  4	! Here with previous character in OLD_xxx.  As long as we
;   5525  4	! are getting the same character, just count the run.
;   5526  4	!
;   5527  4	
;   5528  4		    WHILE (.CHAR_8_BIT EQL .OLD_CHAR_8_BIT) AND (.REPEAT_COUNT LSS 94) DO
;   5529  5			BEGIN
;   5530  5			REPEAT_COUNT = .REPEAT_COUNT + 1;
;   5531  5	
;   5532  5			IF .FLAG_8QUOTE THEN STATUS = GET_8_QUOTED_CHAR () ELSE STATUS = GET_QUOTED_CHAR ();
;   5533  5	
;   5534  5			IF .STATUS NEQ KER_NORMAL
;   5535  5			THEN
;   5536  5	
;   5537  5			    IF .STATUS NEQ KER_EOF
;   5538  5			    THEN
;   5539  5				CHAR_8_BIT = NO_CHAR
;   5540  5			    ELSE
;   5541  6				BEGIN
;   5542  6				CHAR_8_BIT = EOF_CHAR;
;   5543  6				CHR_IDX = -1;
;   5544  5				END;
;   5545  5	
;   5546  4			END;
;   5547  4	
;   5548  5		    IF .OLD_CHR_IDX + 1 + 2 LSS ((.OLD_CHR_IDX + 1)*.REPEAT_COUNT)
;   5549  4		    THEN
;   5550  5			BEGIN
;   5551  5	
;   5552  5			IF .SIZE + .OLD_CHR_IDX + 1 + 2 GTR .MAX_SIZE
;   5553  5			THEN
;   5554  6			    BEGIN
;   5555  6	
;   5556  6			    IF .CHAR_8_BIT EQL .OLD_CHAR_8_BIT
;   5557  6			    THEN
;   5558  7				BEGIN
;   5559  7				NEXT_CHR = .CHAR_8_BIT;
;   5560  7				REPEAT_COUNT = .REPEAT_COUNT - 1;
;   5561  6				END;
;   5562  6	
;   5563  6			    IF .CHAR_8_BIT EQL EOF_CHAR
;   5564  6			    THEN
;   5565  7				BEGIN
;   5566  7				NEXT_CHR = EOF_CHAR;	! Remember EOF for next time
;   5567  7				STATUS = KER_NORMAL;	! And give good return now
;   5568  6				END;
;   5569  6	
;   5570  6			    EXITLOOP;
;   5571  5			    END;
;   5572  5	
;   5573  5			OLD_CHRS [.OLD_CHR_IDX + 1] = CHAR (.REPEAT_COUNT);
;   5574  5			OLD_CHRS [.OLD_CHR_IDX + 2] = .REPT_CHR;
;   5575  5			OLD_CHR_IDX = .OLD_CHR_IDX + 2;
;   5576  5	!
;   5577  5	! Count the number of file characters this represents
;   5578  5	!
;   5579  5			SMSG_DATA_CHARS = .SMSG_DATA_CHARS + .REPEAT_COUNT - 1;
;   5580  5			FILE_CHARS = .FILE_CHARS + .REPEAT_COUNT - 1;
;   5581  5			REPEAT_COUNT = 1;		! Only one time for this string
;   5582  4			END;
;   5583  4	
;   5584  4	!
;   5585  4	! If we don't have enough room for this character, wait till next
;   5586  4	! time.
;   5587  4	!
;   5588  4	
;   5589  4		    IF .SIZE + (.OLD_CHR_IDX + 1)*.REPEAT_COUNT GTR .MAX_SIZE
;   5590  4		    THEN
;   5591  5			BEGIN
;   5592  5	! If the next character is the same, the count will get incremented
;   5593  5	! next time we enter, so back it off now.
;   5594  5	
;   5595  5			IF .CHAR_8_BIT EQL .OLD_CHAR_8_BIT
;   5596  5			THEN
;   5597  6			    BEGIN
;   5598  6			    NEXT_CHR = .CHAR_8_BIT;
;   5599  6			    REPEAT_COUNT = .REPEAT_COUNT - 1;
;   5600  5			    END;
;   5601  5	
;   5602  5			EXITLOOP;
;   5603  4			END;
;   5604  4	
;   5605  4		    SMSG_DATA_CHARS = .SMSG_DATA_CHARS + .REPEAT_COUNT;
;   5606  4		    FILE_CHARS = .FILE_CHARS + .REPEAT_COUNT;
;   5607  4	
;   5608  4		    DECR REPEAT_COUNT FROM .REPEAT_COUNT TO 1 DO
;   5609  4	
;   5610  4			DECR I FROM .OLD_CHR_IDX TO 0 DO
;   5611  5			    BEGIN
;   5612  5			    CH$WCHAR_A (.OLD_CHRS [.I], POINTER);
;   5613  5			    SIZE = .SIZE + 1;
;   5614  4			    END;
;   5615  4	
;   5616  4	!
;   5617  4	! If we got an error (or EOF) then exit
;   5618  4	!
;   5619  4	
;   5620  4		    IF (.STATUS NEQ KER_NORMAL) THEN EXITLOOP;
;   5621  4	
;   5622  4	!
;   5623  4	! Otherwise, copy the character which broke the run
;   5624  4	!
;   5625  4		    OLD_CHAR_8_BIT = .CHAR_8_BIT;
;   5626  4	
;   5627  4		    INCR OLD_CHR_IDX FROM 0 TO .CHR_IDX DO
;   5628  4			OLD_CHRS [.OLD_CHR_IDX] = .CHRS [.OLD_CHR_IDX];
;   5629  4	
;   5630  4		    OLD_CHR_IDX = .CHR_IDX;
;   5631  4		    REPEAT_COUNT = 0;
;   5632  4		    END
;   5633  3		ELSE
;   5634  3	!
;   5635  3	! Here if we are not doing run compression.  We can do things much
;   5636  3	! easier.
;   5637  3	!
;   5638  4		    BEGIN
;   5639  4	
;   5640  4		    IF (.SIZE + .CHR_IDX + 1) GTR .MAX_SIZE THEN EXITLOOP;
;   5641  4	
;   5642  4		    SMSG_DATA_CHARS = .SMSG_DATA_CHARS + 1;
;   5643  4		    FILE_CHARS = .FILE_CHARS + 1;
;   5644  4	
;   5645  4		    DECR CHR_IDX FROM .CHR_IDX TO 0 DO
;   5646  5			BEGIN
;   5647  5			CH$WCHAR_A (.CHRS [.CHR_IDX], POINTER);
;   5648  5			SIZE = .SIZE + 1;
;   5649  4			END;
;   5650  4	
;   5651  4		    IF .FLAG_8QUOTE THEN STATUS = GET_8_QUOTED_CHAR () ELSE STATUS = GET_QUOTED_CHAR ();
;   5652  4	
;   5653  4		    IF (.STATUS NEQ KER_NORMAL) THEN EXITLOOP;
;   5654  4	
;   5655  3		    END;
;   5656  3	
;   5657  2		END;
;   5658  2	
;   5659  2	!
;   5660  2	! Determine if we really stored anything into the buffer.
;   5661  2	!
;   5662  2	
;   5663  2	    IF .SIZE NEQ 0 THEN RETURN KER_NORMAL ELSE RETURN .STATUS;
;   5664  2	
;   5665  1	    END;					! End of BFR_FILL





;BFR_FILL
U.29:	.WORD   ^M<R2,R3,R4,R5,R6,R7,R8>	     ;Save R2,R3,R4,R5,R6,R7,R8						      ; 5314
	MOVAB   W^SMSG_DATA_CHARS, R8		     ;SMSG_DATA_CHARS, R8						      ;
	MOVAB   B^U.91, R7			     ;U.91, R7								      ;
	MOVAB   W^U.82, R6			     ;U.82, R6								      ;
	CLRL    -268(R6)			     ;SIZE								      ; 5477
	MOVAB   -136(R6), R5			     ;SND_MSG+4, POINTER						      ; 5478
	SUBL3   -284(R6), -312(R6), R2		     ;BLK_CHK_TYPE, SEND_PKT_SIZE, R2					      ; 5479
	ADDL2   #46, R2				     ;#46, MAX_SIZE							      ;
	BLBS    4(AP), 1$			     ;FIRST_FLAG, 1$							      ; 5484
	CMPL    (R6), #134316043		     ;STATUS, #134316043						      ;
	BNEQ    4$				     ;4$								      ;
	BLBC    4(AP), 9$			     ;FIRST_FLAG, 9$							      ; 5490
1$:	CLRL    4(AP)				     ;FIRST_FLAG							      ; 5493
	MNEGL   #1, -4(R6)			     ;#1, NEXT_CHR							      ; 5494
	BLBC    -280(R6), 2$			     ;FLAG_8QUOTE, 2$							      ; 5496
	CALLS   #0, (R7)			     ;#0, GET_8_QUOTED_CHAR						      ;
	BRB     3$				     ;3$								      ;
2$:	CALLS   #0, -205(R7)			     ;#0, GET_QUOTED_CHAR						      ;
3$:	MOVL    R0, (R6)			     ;R0, STATUS							      ;
	CMPL    (R6), #134316043		     ;STATUS, #134316043						      ; 5498
4$:	BEQL    5$				     ;5$								      ;
	BRW     34$				     ;34$								      ;
5$:	MOVL    8(R6), 36(R6)			     ;CHAR_8_BIT, OLD_CHAR_8_BIT					      ; 5500
	MNEGL   #1, R0				     ;#1, OLD_CHR_IDX							      ; 5502
	BRB     7$				     ;7$								      ;
6$:	MOVL    12(R6)[R0], 40(R6)[R0]		     ;CHRS[OLD_CHR_IDX], OLD_CHRS[OLD_CHR_IDX]				      ; 5503
7$:	AOBLEQ  32(R6), R0, 6$			     ;CHR_IDX, OLD_CHR_IDX, 6$						      ;
8$:	MOVL    32(R6), 60(R6)			     ;CHR_IDX, OLD_CHR_IDX						      ; 5505
	CLRL    4(R6)				     ;REPEAT_COUNT							      ; 5506
9$:	CMPL    -268(R6), R2			     ;SIZE, MAX_SIZE							      ; 5514
	BLSS    10$				     ;10$								      ;
	BRW     33$				     ;33$								      ;
10$:	BLBS    -276(R6), 11$			     ;FLAG_REPEAT, 11$							      ; 5520
	BRW     28$				     ;28$								      ;
11$:	CMPL    8(R6), 36(R6)			     ;CHAR_8_BIT, OLD_CHAR_8_BIT					      ; 5528
	BNEQ    15$				     ;15$								      ;
	CMPL    4(R6), #94			     ;REPEAT_COUNT, #94							      ;
	BGEQ    15$				     ;15$								      ;
	INCL    4(R6)				     ;REPEAT_COUNT							      ; 5530
	BLBC    -280(R6), 12$			     ;FLAG_8QUOTE, 12$							      ; 5532
	CALLS   #0, (R7)			     ;#0, GET_8_QUOTED_CHAR						      ;
	BRB     13$				     ;13$								      ;
12$:	CALLS   #0, -205(R7)			     ;#0, GET_QUOTED_CHAR						      ;
13$:	MOVL    R0, (R6)			     ;R0, STATUS							      ;
	CMPL    (R6), #134316043		     ;STATUS, #134316043						      ; 5534
	BEQL    11$				     ;11$								      ;
	CMPL    (R6), #134316131		     ;STATUS, #134316131						      ; 5537
	BEQL    14$				     ;14$								      ;
	MNEGL   #1, 8(R6)			     ;#1, CHAR_8_BIT							      ; 5539
	BRB     11$				     ;11$								      ;
14$:	MNEGL   #2, 8(R6)			     ;#2, CHAR_8_BIT							      ; 5542
	MNEGL   #1, 32(R6)			     ;#1, CHR_IDX							      ; 5543
	BRB     11$				     ;11$								      ; 5537
15$:	MOVL    60(R6), R1			     ;OLD_CHR_IDX, R1							      ; 5548
	MOVAB   3(R1), R4			     ;3(R1), R4								      ;
	MOVAB   1(R1), R0			     ;1(R1), R0								      ;
	MULL3   4(R6), R0, R3			     ;REPEAT_COUNT, R0, R3						      ;
	CMPL    R4, R3				     ;R4, R3								      ;
	BGEQ    18$				     ;18$								      ;
	ADDL3   -268(R6), R1, R3		     ;SIZE, R1, R3							      ; 5552
	ADDL2   #3, R3				     ;#3, R3								      ;
	CMPL    R3, R2				     ;R3, MAX_SIZE							      ;
	BLEQ    17$				     ;17$								      ;
	MOVL    8(R6), R3			     ;CHAR_8_BIT, R3							      ; 5556
	CMPL    R3, 36(R6)			     ;R3, OLD_CHAR_8_BIT						      ;
	BNEQ    16$				     ;16$								      ;
	MOVL    R3, -4(R6)			     ;R3, NEXT_CHR							      ; 5559
	DECL    4(R6)				     ;REPEAT_COUNT							      ; 5560
16$:	CMPL    R3, #-2				     ;R3, #-2								      ; 5563
	BNEQ    19$				     ;19$								      ;
	MNEGL   #2, -4(R6)			     ;#2, NEXT_CHR							      ; 5566
	MOVL    #134316043, (R6)		     ;#134316043, STATUS						      ; 5567
	BRB     19$				     ;19$								      ; 5554
17$:	MOVL    4(R6), R3			     ;REPEAT_COUNT, R3							      ; 5573
	MOVAB   32(R3), 40(R6)[R0]		     ;32(R3), OLD_CHRS[R0]						      ;
	MOVL    -316(R6), 48(R6)[R1]		     ;REPT_CHR, OLD_CHRS+8[R1]						      ; 5574
	ADDL2   #2, 60(R6)			     ;#2, OLD_CHR_IDX							      ; 5575
	ADDL3   R3, (R8), R0			     ;R3, SMSG_DATA_CHARS, R0						      ; 5579
	MOVAB   -1(R0), (R8)			     ;-1(R0), SMSG_DATA_CHARS						      ;
	ADDL3   -36(R6), R3, R0			     ;FILE_CHARS, R3, R0						      ; 5580
	MOVAB   -1(R0), -36(R6)			     ;-1(R0), FILE_CHARS						      ;
	MOVL    #1, 4(R6)			     ;#1, REPEAT_COUNT							      ; 5581
18$:	ADDL3   #1, 60(R6), R0			     ;#1, OLD_CHR_IDX, R0						      ; 5589
	MULL2   4(R6), R0			     ;REPEAT_COUNT, R0							      ;
	ADDL2   -268(R6), R0			     ;SIZE, R0								      ;
	CMPL    R0, R2				     ;R0, MAX_SIZE							      ;
	BLEQ    20$				     ;20$								      ;
	CMPL    8(R6), 36(R6)			     ;CHAR_8_BIT, OLD_CHAR_8_BIT					      ; 5595
	BNEQ    25$				     ;25$								      ;
	MOVL    8(R6), -4(R6)			     ;CHAR_8_BIT, NEXT_CHR						      ; 5598
	DECL    4(R6)				     ;REPEAT_COUNT							      ; 5599
19$:	BRW     33$				     ;33$								      ; 5591
20$:	MOVL    4(R6), R0			     ;REPEAT_COUNT, R0							      ; 5605
	ADDL2   R0, (R8)			     ;R0, SMSG_DATA_CHARS						      ;
	ADDL2   R0, -36(R6)			     ;R0, FILE_CHARS							      ; 5606
	INCL    R0				     ;REPEAT_COUNT							      ; 5608
	BRB     24$				     ;24$								      ;
21$:	ADDL3   #1, 60(R6), R1			     ;#1, OLD_CHR_IDX, I						      ; 5610
	BRB     23$				     ;23$								      ;
22$:	CVTLB   40(R6)[R1], (R5)+		     ;OLD_CHRS[I], (POINTER)+						      ; 5612
	INCL    -268(R6)			     ;SIZE								      ; 5613
23$:	SOBGEQ  R1, 22$				     ;I, 22$								      ; 5610
24$:	SOBGTR  R0, 21$				     ;REPEAT_COUNT, 21$							      ;
	CMPL    (R6), #134316043		     ;STATUS, #134316043						      ; 5620
25$:	BNEQ    33$				     ;33$								      ;
	MOVL    8(R6), 36(R6)			     ;CHAR_8_BIT, OLD_CHAR_8_BIT					      ; 5625
	MNEGL   #1, R0				     ;#1, OLD_CHR_IDX							      ; 5627
	BRB     27$				     ;27$								      ;
26$:	MOVL    12(R6)[R0], 40(R6)[R0]		     ;CHRS[OLD_CHR_IDX], OLD_CHRS[OLD_CHR_IDX]				      ; 5628
27$:	AOBLEQ  32(R6), R0, 26$			     ;CHR_IDX, OLD_CHR_IDX, 26$						      ;
	BRW     8$				     ;8$								      ; 5630
28$:	ADDL3   32(R6), -268(R6), R0		     ;CHR_IDX, SIZE, R0							      ; 5640
	INCL    R0				     ;R0								      ;
	CMPL    R0, R2				     ;R0, MAX_SIZE							      ;
	BGTR    33$				     ;33$								      ;
	INCL    (R8)				     ;SMSG_DATA_CHARS							      ; 5642
	INCL    -36(R6)				     ;FILE_CHARS							      ; 5643
	ADDL3   #1, 32(R6), R0			     ;#1, CHR_IDX, CHR_IDX						      ; 5645
	BRB     30$				     ;30$								      ;
29$:	CVTLB   12(R6)[R0], (R5)+		     ;CHRS[CHR_IDX], (POINTER)+						      ; 5647
	INCL    -268(R6)			     ;SIZE								      ; 5648
30$:	SOBGEQ  R0, 29$				     ;CHR_IDX, 29$							      ; 5645
	BLBC    -280(R6), 31$			     ;FLAG_8QUOTE, 31$							      ; 5651
	CALLS   #0, (R7)			     ;#0, GET_8_QUOTED_CHAR						      ;
	BRB     32$				     ;32$								      ;
31$:	CALLS   #0, -205(R7)			     ;#0, GET_QUOTED_CHAR						      ;
32$:	MOVL    R0, (R6)			     ;R0, STATUS							      ;
	CMPL    (R6), #134316043		     ;STATUS, #134316043						      ; 5653
	BNEQ    33$				     ;33$								      ;
	BRW     9$				     ;9$								      ;
33$:	TSTL    -268(R6)			     ;SIZE								      ; 5663
	BEQL    34$				     ;34$								      ;
	MOVL    #134316043, R0			     ;#134316043, R0							      ;
	RET     				     ;									      ;
34$:	MOVL    (R6), R0			     ;STATUS, R0							      ;
	RET     				     ;									      ; 5665

; Routine Size:  522 bytes,    Routine Base:  $CODE$ + 1DD8


;   5666  1	%SBTTL 'BFR_EMPTY'
;   5667  1	ROUTINE BFR_EMPTY =
;   5668  1	
;   5669  1	!++
;   5670  1	! FUNCTIONAL DESCRIPTION:
;   5671  1	!
;   5672  1	!	This routine will empty the data from the REC_MSG message buffer
;   5673  1	!	to the file.  It will process quoting characters.
;   5674  1	!
;   5675  1	! CALLING SEQUENCE:
;   5676  1	!
;   5677  1	!	Flag = BFR_EMPTY();
;   5678  1	!
;   5679  1	! INPUT PARAMETERS:
;   5680  1	!
;   5681  1	!	None.
;   5682  1	!
;   5683  1	! IMPLICIT INPUTS:
;   5684  1	!
;   5685  1	!	None.
;   5686  1	!
;   5687  1	! OUTPUT PARAMETERS:
;   5688  1	!
;   5689  1	!	True - No problems writing the file.
;   5690  1	!	False - I/O error writing the file.
;   5691  1	!
;   5692  1	! IMPLICIT OUTPUTS:
;   5693  1	!
;   5694  1	!	None.
;   5695  1	!
;   5696  1	! COMPLETION CODES:
;   5697  1	!
;   5698  1	!	None.
;   5699  1	!
;   5700  1	! SIDE EFFECTS:
;   5701  1	!
;   5702  1	!	None.
;   5703  1	!
;   5704  1	!--
;   5705  1	
;   5706  2	    BEGIN
;   5707  2	
;   5708  2	    LOCAL
;   5709  2		STATUS,					! Status returned by various routines
;   5710  2		REPEAT_COUNT,				! Count of times to repeat character
;   5711  2		TURN_BIT_8_ON,				! If eight bit quoting
;   5712  2		COUNTER,				! Count of the characters left
;   5713  2		CHARACTER,				! Character we are processing
;   5714  2		POINTER;				! Pointer to the data
;   5715  2	
;   5716  2	    POINTER = CH$PTR (REC_MSG, PKT_MSG, CHR_SIZE);
;   5717  2	    COUNTER = 0;
;   5718  2	
;   5719  2	    WHILE (.COUNTER LSS .REC_LENGTH) DO
;   5720  3		BEGIN
;   5721  3		CHARACTER = CH$RCHAR_A (POINTER);
;   5722  3		COUNTER = .COUNTER + 1;
;   5723  3	!
;   5724  3	! If the character is the repeat character (and we are doing repeat
;   5725  3	! compression), then get the count.
;   5726  3	!
;   5727  3	
;   5728  4		IF ((.CHARACTER EQL .REPT_CHR) AND .FLAG_REPEAT)
;   5729  3		THEN
;   5730  4		    BEGIN
;   5731  4		    REPEAT_COUNT = UNCHAR (CH$RCHAR_A (POINTER) AND %O'177');
;   5732  4		    CHARACTER = CH$RCHAR_A (POINTER);
;   5733  4		    COUNTER = .COUNTER + 2;
;   5734  4		    END
;   5735  3		ELSE
;   5736  3		    REPEAT_COUNT = 1;
;   5737  3	
;   5738  3	!
;   5739  3	! If the character is an eight bit quoting character and we are doing eight
;   5740  3	! bit quoting then turn on the flag so we turn the eighth bit on when we
;   5741  3	! get the real character.
;   5742  3	!
;   5743  3	
;   5744  4		IF ((.CHARACTER EQL .SEND_8QUOTE_CHR) AND .FLAG_8QUOTE)
;   5745  3		THEN
;   5746  4		    BEGIN
;   5747  4		    TURN_BIT_8_ON = TRUE;
;   5748  4		    COUNTER = .COUNTER + 1;
;   5749  4		    CHARACTER = CH$RCHAR_A (POINTER);
;   5750  4		    END
;   5751  3		ELSE
;   5752  3		    TURN_BIT_8_ON = FALSE;
;   5753  3	
;   5754  3	!
;   5755  3	! Now determine if we are quoting the character.  If so then we must eat
;   5756  3	! the quoting character and get the real character.
;   5757  3	!
;   5758  3	
;   5759  3		IF .CHARACTER EQL .SEND_QUOTE_CHR
;   5760  3						![035] Is this character other Kermit sends as quote?
;   5761  3		THEN
;   5762  4		    BEGIN
;   5763  4		    CHARACTER = CH$RCHAR_A (POINTER);
;   5764  4		    COUNTER = .COUNTER + 1;
;   5765  4	!
;   5766  4	! Determine if we must undo what someone else has done to the character
;   5767  4	!
;   5768  4	
; P 5769  5		    IF ((.CHARACTER AND %O'177') GEQ CTL (CHR_DEL)) AND ((.CHARACTER AND %O'177') LEQ CTL (
;   5770  5			    CHR_DEL) + %O'40')
;   5771  4		    THEN
;   5772  4			CHARACTER = CTL (.CHARACTER);
;   5773  4	
;   5774  3		    END;
;   5775  3	
;   5776  3	!
;   5777  3	! Turn on the eight bit if needed and then write the character out
;   5778  3	!
;   5779  3	
;   5780  3		IF .TURN_BIT_8_ON THEN CHARACTER = .CHARACTER OR %O'200';
;   5781  3	
;   5782  3		RMSG_DATA_CHARS = .RMSG_DATA_CHARS + .REPEAT_COUNT;
;   5783  3		FILE_CHARS = .FILE_CHARS + .REPEAT_COUNT;
;   5784  3	
;   5785  3		DECR REPEAT_COUNT FROM .REPEAT_COUNT TO 1 DO
;   5786  4		    BEGIN
;   5787  4		    STATUS = (.PUT_CHR_ROUTINE) (.CHARACTER);
;   5788  4	
;   5789  4		    IF NOT .STATUS THEN RETURN .STATUS;
;   5790  4	
;   5791  3		    END;
;   5792  3	
;   5793  2		END;
;   5794  2	
;   5795  2	    RETURN KER_NORMAL;
;   5796  1	    END;					! End of BFR_EMPTY





;BFR_EMPTY
U.28:	.WORD   ^M<R2,R3,R4,R5,R6,R7,R8>	     ;Save R2,R3,R4,R5,R6,R7,R8						      ; 5667
	MOVAB   W^U.57+4, R8			     ;U.57+4, R8							      ;
	MOVAB   (R8), R5			     ;REC_MSG+4, POINTER						      ; 5716
	CLRL    R6				     ;COUNTER								      ; 5717
1$:	CMPL    R6, -12(R8)			     ;COUNTER, REC_LENGTH						      ; 5719
	BLSS    2$				     ;2$								      ;
	BRW     11$				     ;11$								      ;
2$:	MOVZBL  (R5)+, R4			     ;(POINTER)+, CHARACTER						      ; 5721
	INCL    R6				     ;COUNTER								      ; 5722
	CMPL    R4, -80(R8)			     ;CHARACTER, REPT_CHR						      ; 5728
	BNEQ    3$				     ;3$								      ;
	BLBC    -40(R8), 3$			     ;FLAG_REPEAT, 3$							      ;
	MOVZBL  (R5)+, R1			     ;(POINTER)+, R1							      ; 5731
	EXTZV   #0, #7, R1, R3			     ;#0, #7, R1, REPEAT_COUNT						      ;
	SUBL2   #32, R3				     ;#32, REPEAT_COUNT							      ;
	MOVZBL  (R5)+, R4			     ;(POINTER)+, CHARACTER						      ; 5732
	ADDL2   #2, R6				     ;#2, COUNTER							      ; 5733
	BRB     4$				     ;4$								      ; 5728
3$:	MOVL    #1, R3				     ;#1, REPEAT_COUNT							      ; 5736
4$:	CMPL    R4, -56(R8)			     ;CHARACTER, SEND_8QUOTE_CHR					      ; 5744
	BNEQ    5$				     ;5$								      ;
	BLBC    -44(R8), 5$			     ;FLAG_8QUOTE, 5$							      ;
	MOVL    #1, R7				     ;#1, TURN_BIT_8_ON							      ; 5747
	INCL    R6				     ;COUNTER								      ; 5748
	MOVZBL  (R5)+, R4			     ;(POINTER)+, CHARACTER						      ; 5749
	BRB     6$				     ;6$								      ; 5744
5$:	CLRL    R7				     ;TURN_BIT_8_ON							      ; 5752
6$:	CMPL    R4, -60(R8)			     ;CHARACTER, SEND_QUOTE_CHR						      ; 5759
	BNEQ    7$				     ;7$								      ;
	MOVZBL  (R5)+, R4			     ;(POINTER)+, CHARACTER						      ; 5763
	INCL    R6				     ;COUNTER								      ; 5764
	CMPZV   #0, #7, R4, #63			     ;#0, #7, CHARACTER, #63						      ; 5769
	BLSS    7$				     ;7$								      ;
	CMPZV   #0, #7, R4, #95			     ;#0, #7, CHARACTER, #95						      ; 5770
	BGTR    7$				     ;7$								      ;
	XORB2   #64, R4				     ;#64, CHARACTER							      ; 5772
7$:	BLBC    R7, 8$				     ;TURN_BIT_8_ON, 8$							      ; 5780
	BISB2   #128, R4			     ;#128, CHARACTER							      ;
8$:	ADDL2   R3, W^RMSG_DATA_CHARS		     ;REPEAT_COUNT, RMSG_DATA_CHARS					      ; 5782
	ADDL2   R3, 200(R8)			     ;REPEAT_COUNT, FILE_CHARS						      ; 5783
	MOVAB   1(R3), R2			     ;1(R3), REPEAT_COUNT						      ; 5787
	BRB     10$				     ;10$								      ;
9$:	PUSHL   R4				     ;CHARACTER								      ;
	CALLS   #1, @228(R8)			     ;#1, @PUT_CHR_ROUTINE						      ;
	BLBC    R0, 12$				     ;STATUS, 12$							      ; 5789
10$:	SOBGTR  R2, 9$				     ;REPEAT_COUNT, 9$							      ; 5785
	BRW     1$				     ;1$								      ; 5719
11$:	MOVL    #134316043, R0			     ;#134316043, R0							      ; 5795
12$:	RET     				     ;									      ; 5796

; Routine Size:  160 bytes,    Routine Base:  $CODE$ + 1FE2


;   5797  1	%SBTTL 'Buffer filling and emptying subroutines'
;   5798  1	ROUTINE SET_STRING (POINTER, LENGTH, START) =
;   5799  1	
;   5800  1	!++
;   5801  1	! FUNCTIONAL DESCRIPTION:
;   5802  1	!
;   5803  1	!	This routine is used to set up the buffer filling and emptying
;   5804  1	!	routines to use a string for input (or output) rather than
;   5805  1	!	the file I/O routines.
;   5806  1	!
;   5807  1	! CALLING SEQUENCE:
;   5808  1	!
;   5809  1	!	SET_STRING (.POINTER, .LENGTH, .START)
;   5810  1	!
;   5811  1	! INPUT PARAMETERS:
;   5812  1	!
;   5813  1	!	POINTER - Character pointer to string
;   5814  1	!
;   5815  1	!	LENGTH - Number of characters in string
;   5816  1	!
;   5817  1	!	START - True to start string, false to end it
;   5818  1	!
;   5819  1	! IMPLICIT INPUTS:
;   5820  1	!
;   5821  1	!	None.
;   5822  1	!
;   5823  1	! OUPTUT PARAMETERS:
;   5824  1	!
;   5825  1	!	Returns 0 if START = TRUE, actual number of characters used
;   5826  1	!	by last string if START = FALSE.
;   5827  1	!
;   5828  1	! IMPLICIT OUTPUTS:
;   5829  1	!
;   5830  1	!	GET_CHR_ROUTINE and PUT_CHR_ROUTINE modifed so that string
;   5831  1	!	routines are called instead of file I/O.
;   5832  1	!
;   5833  1	! COMPLETION CODES:
;   5834  1	!
;   5835  1	!	None.
;   5836  1	!
;   5837  1	! SIDE EFFECTS:
;   5838  1	!
;   5839  1	!	None.
;   5840  1	!
;   5841  1	!--
;   5842  1	
;   5843  2	    BEGIN
;   5844  2	
;   5845  2	    OWN
;   5846  2		STR_POINTER,				! Pointer to string
;   5847  2		STR_LENGTH,				! Length of string
;   5848  2		STR_ORG_LENGTH,				! Original length of string
;   5849  2		OLD_GET_CHR,				! Old get-char routine
;   5850  2		OLD_PUT_CHR;				! Old put-char routine
;   5851  2	
;   5852  2	!
;   5853  2	! Routine to get a character from the string
;   5854  2	!
;   5855  2	    ROUTINE GET_STRING (CHAR_ADDRESS) =
;   5856  3		BEGIN
;   5857  3	!
;   5858  3	! If some characters are left, count down the length and get next character
;   5859  3	! Otherwise return and end of file indication.
;   5860  3	!
;   5861  3	
;   5862  3		IF .STR_LENGTH GTR 0
;   5863  3		THEN
;   5864  4		    BEGIN
;   5865  4		    STR_LENGTH = .STR_LENGTH - 1;
;   5866  4		    .CHAR_ADDRESS = CH$RCHAR_A (STR_POINTER);
;   5867  4		    RETURN KER_NORMAL;
;   5868  4		    END
;   5869  3		ELSE
;   5870  3		    RETURN KER_EOF;
;   5871  3	
;   5872  2		END;					! End of GET_STRING



	.PSECT  $OWN$,NOEXE,2

;STR_POINTER
U.92:	.BLKB   4
;STR_LENGTH
U.93:	.BLKB   4
;STR_ORG_LENGTH
U.94:	.BLKB   4
;OLD_GET_CHR
U.95:	.BLKB   4
;OLD_PUT_CHR
U.96:	.BLKB   4



	.PSECT  $CODE$,NOWRT,2

;GET_STRING
U.97:	.WORD   ^M<R2>				     ;Save R2								      ; 5855
	MOVAB   W^U.93, R2			     ;U.93, R2								      ;
	TSTL    (R2)				     ;STR_LENGTH							      ; 5862
	BLEQ    1$				     ;1$								      ;
	DECL    (R2)				     ;STR_LENGTH							      ; 5865
	MOVZBL  @-4(R2), @4(AP)			     ;@STR_POINTER, @CHAR_ADDRESS					      ; 5866
	INCL    -4(R2)				     ;STR_POINTER							      ;
	MOVL    #134316043, R0			     ;#134316043, R0							      ; 5870
	RET     				     ;									      ;
1$:	MOVL    #134316131, R0			     ;#134316131, R0							      ;
	RET     				     ;									      ; 5872

; Routine Size:  37 bytes,    Routine Base:  $CODE$ + 2082


;   5873  2	    ROUTINE PUT_STRING (CHAR_VALUE) =
;   5874  3		BEGIN
;   5875  3	!
;   5876  3	! If there is enough room to store another character, store the character
;   5877  3	! and count it.  Otherwise return a line too long indication.
;   5878  3	!
;   5879  3	
;   5880  3		IF .STR_LENGTH GTR 0
;   5881  3		THEN
;   5882  4		    BEGIN
;   5883  4		    STR_LENGTH = .STR_LENGTH - 1;
;   5884  4		    CH$WCHAR_A (.CHAR_VALUE, STR_POINTER);
;   5885  4		    RETURN KER_NORMAL;
;   5886  4		    END
;   5887  3		ELSE
;   5888  3		    RETURN KER_LINTOOLNG;
;   5889  3	
;   5890  2		END;					! End of PUT_STRING





;PUT_STRING
U.98:	.WORD   ^M<R2>				     ;Save R2								      ; 5873
	MOVAB   W^U.93, R2			     ;U.93, R2								      ;
	TSTL    (R2)				     ;STR_LENGTH							      ; 5880
	BLEQ    1$				     ;1$								      ;
	DECL    (R2)				     ;STR_LENGTH							      ; 5883
	MOVB    4(AP), @-4(R2)			     ;CHAR_VALUE, @STR_POINTER						      ; 5884
	INCL    -4(R2)				     ;STR_POINTER							      ;
	MOVL    #134316043, R0			     ;#134316043, R0							      ; 5888
	RET     				     ;									      ;
1$:	MOVL    #134316098, R0			     ;#134316098, R0							      ;
	RET     				     ;									      ; 5890

; Routine Size:  37 bytes,    Routine Base:  $CODE$ + 20A7


;   5891  2	!
;   5892  2	! If we have a request to start a string (input or output), save the old
;   5893  2	! routines and set up ours.  Also save the string pointer and length for
;   5894  2	! use by our get/put routines.
;   5895  2	! Otherwise this is a request to stop using the string routines, so reset
;   5896  2	! the old routines and return the actual number of characters read or
;   5897  2	! written
;   5898  2	!
;   5899  2	
;   5900  2	    IF .START
;   5901  2	    THEN
;   5902  3		BEGIN
;   5903  3		STR_POINTER = .POINTER;
;   5904  3		STR_ORG_LENGTH = .LENGTH;
;   5905  3		STR_LENGTH = .LENGTH;
;   5906  3		OLD_GET_CHR = .GET_CHR_ROUTINE;
;   5907  3		OLD_PUT_CHR = .PUT_CHR_ROUTINE;
;   5908  3		GET_CHR_ROUTINE = GET_STRING;
;   5909  3		PUT_CHR_ROUTINE = PUT_STRING;
;   5910  3		RETURN 0;
;   5911  3		END
;   5912  2	    ELSE
;   5913  3		BEGIN
;   5914  3		GET_CHR_ROUTINE = .OLD_GET_CHR;
;   5915  3		PUT_CHR_ROUTINE = .OLD_PUT_CHR;
;   5916  3		RETURN .STR_ORG_LENGTH - .STR_LENGTH;
;   5917  2		END;
;   5918  2	
;   5919  1	    END;					! End of SET_STRING





;SET_STRING
U.30:	.WORD   ^M<R2>				     ;Save R2								      ; 5798
	MOVAB   W^U.66, R2			     ;U.66, R2								      ;
	BLBC    12(AP), 1$			     ;START, 1$								      ; 5900
	MOVL    8(AP), 84(R2)			     ;LENGTH, STR_ORG_LENGTH						      ; 5904
	MOVQ    4(AP), 76(R2)			     ;POINTER, STR_POINTER						      ; 5903
	MOVQ    (R2), 88(R2)			     ;GET_CHR_ROUTINE, OLD_GET_CHR					      ; 5906
	MOVAB   B^U.97, (R2)			     ;U.97, GET_CHR_ROUTINE						      ; 5908
	MOVAB   B^U.98, 4(R2)			     ;U.98, PUT_CHR_ROUTINE						      ; 5909
	CLRL    R0				     ;R0								      ; 5913
	RET     				     ;									      ;
1$:	MOVQ    88(R2), (R2)			     ;OLD_GET_CHR, GET_CHR_ROUTINE					      ; 5914
	SUBL3   80(R2), 84(R2), R0		     ;STR_LENGTH, STR_ORG_LENGTH, R0					      ; 5916
	RET     				     ;									      ; 5919

; Routine Size:  48 bytes,    Routine Base:  $CODE$ + 20CC


;   5920  1	%SBTTL 'Add parity routine'
;   5921  1	ROUTINE DO_PARITY (MESSAGE, LENGTH) : NOVALUE =
;   5922  1	
;   5923  1	!++
;   5924  1	! FUNCTIONAL DESCRIPTION:
;   5925  1	!
;   5926  1	!	This routine will add parity for a complete message that is to be
;   5927  1	!	sent to the remote Kermit.
;   5928  1	!
;   5929  1	! CALLING SEQUENCE:
;   5930  1	!
;   5931  1	!	DO_PARITY (Message_address, Message_length);
;   5932  1	!
;   5933  1	! INPUT PARAMETERS:
;   5934  1	!
;   5935  1	!	Message_address - Address of the message to put parity on.
;   5936  1	!	Message_length  - Lengtho of the message.
;   5937  1	!
;   5938  1	! IMPLICIT INPUTS:
;   5939  1	!
;   5940  1	!	None.
;   5941  1	!
;   5942  1	! OUTPUT PARAMETERS:
;   5943  1	!
;   5944  1	!	None.
;   5945  1	!
;   5946  1	! IMPLICIT OUTPUTS:
;   5947  1	!
;   5948  1	!	None.
;   5949  1	!
;   5950  1	! COMPLETION CODES:
;   5951  1	!
;   5952  1	!	None.
;   5953  1	!
;   5954  1	! SIDE EFFECTS:
;   5955  1	!
;   5956  1	!	None.
;   5957  1	!
;   5958  1	!--
;   5959  1	
;   5960  2	    BEGIN
;   5961  2	
;   5962  2	    MAP
;   5963  2		MESSAGE : REF VECTOR [CH$ALLOCATION (MAX_MSG, CHR_SIZE)];
;   5964  2	
;   5965  2	    LOCAL
;   5966  2		POINTER;				! Point into the message
;   5967  2	
;   5968  2	    IF NOT .DEV_PARITY_FLAG
;   5969  2	    THEN
;   5970  3		BEGIN
;   5971  3		POINTER = CH$PTR (.MESSAGE,, CHR_SIZE);
;   5972  3	
;   5973  3		INCR I FROM 1 TO .LENGTH DO
;   5974  3		    CH$WCHAR_A (GEN_PARITY (CH$RCHAR (.POINTER)), POINTER);
;   5975  3	
;   5976  2		END;
;   5977  2	
;   5978  1	    END;					! End of DO_PARITY





;DO_PARITY
U.22:	.WORD   ^M<R2,R3>			     ;Save R2,R3							      ; 5921
	BLBS    W^DEV_PARITY_FLAG, 3$		     ;DEV_PARITY_FLAG, 3$						      ; 5968
	MOVL    4(AP), R2			     ;MESSAGE, POINTER							      ; 5971
	CLRL    R3				     ;I									      ; 5974
	BRB     2$				     ;2$								      ;
1$:	MOVZBL  (R2), -(SP)			     ;(POINTER), -(SP)							      ;
	CALLS   #1, W^U.23			     ;#1, U.23								      ;
	MOVB    R0, (R2)+			     ;R0, (POINTER)+							      ;
2$:	AOBLEQ  8(AP), R3, 1$			     ;LENGTH, I, 1$							      ;
3$:	RET     				     ;									      ; 5978

; Routine Size:  32 bytes,    Routine Base:  $CODE$ + 20FC


;   5979  1	%SBTTL 'Parity routine'
;   5980  1	
;   5981  1	GLOBAL ROUTINE GEN_PARITY (CHARACTER) =
;   5982  1	
;   5983  1	!++
;   5984  1	! FUNCTIONAL DESCRIPTION:
;   5985  1	!
;   5986  1	!	This routine will add parity to the character that is supplied.
;   5987  1	!
;   5988  1	! CALLING SEQUENCE:
;   5989  1	!
;   5990  1	!	CHARACTER = GEN_PARITY(CHARACTER)
;   5991  1	!
;   5992  1	! INPUT PARAMETERS:
;   5993  1	!
;   5994  1	!	CHARACTER - Produce the parity for this character depending on the
;   5995  1	!		setting of the SET PARITY switch.
;   5996  1	!
;   5997  1	! IMPLICIT INPUTS:
;   5998  1	!
;   5999  1	!	None.
;   6000  1	!
;   6001  1	! OUTPUT PARAMETERS:
;   6002  1	!
;   6003  1	!	None.
;   6004  1	!
;   6005  1	! IMPLICIT OUTPUTS:
;   6006  1	!
;   6007  1	!	None.
;   6008  1	!
;   6009  1	! COMPLETION CODES:
;   6010  1	!
;   6011  1	!	None.
;   6012  1	!
;   6013  1	! SIDE EFFECTS:
;   6014  1	!
;   6015  1	!	None.
;   6016  1	!
;   6017  1	!--
;   6018  1	
;   6019  2	    BEGIN
;   6020  2	
;   6021  2	    LOCAL
;   6022  2		TEMP_CHAR;
;   6023  2	
;   6024  2	![044]    IF .IBM_FLAG THEN RETURN .CHARACTER OR %O'200';
;   6025  2	
;   6026  2	    CASE .PARITY_TYPE FROM PR_MIN TO PR_MAX OF
;   6027  2		SET
;   6028  2	
;   6029  2		[PR_NONE] :
;   6030  2		    RETURN .CHARACTER;
;   6031  2	
;   6032  2		[PR_SPACE] :
;   6033  2		    RETURN .CHARACTER AND %O'177';
;   6034  2	
;   6035  2		[PR_MARK] :
;   6036  2		    RETURN .CHARACTER OR %O'200';
;   6037  2	
;   6038  2		[PR_ODD] :
;   6039  2		    TEMP_CHAR = .CHARACTER AND %O'177' OR %O'200';
;   6040  2	
;   6041  2		[PR_EVEN] :
;   6042  2		    TEMP_CHAR = .CHARACTER AND %O'177';
;   6043  2		TES;
;   6044  2	
;   6045  2	    TEMP_CHAR = .TEMP_CHAR XOR (.TEMP_CHAR^-4);
;   6046  2	    TEMP_CHAR = .TEMP_CHAR XOR (.TEMP_CHAR^-2);
;   6047  2	
;   6048  2	    IF .TEMP_CHAR<0, 2> EQL %B'01' OR .TEMP_CHAR<0, 2> EQL %B'10'
;   6049  2	    THEN
;   6050  2		RETURN .CHARACTER AND %O'177' OR %O'200'
;   6051  2	    ELSE
;   6052  2		RETURN .CHARACTER AND %O'177';
;   6053  2	
;   6054  1	    END;					! End of GEN_PARITY





U.23:
	.ENTRY  GEN_PARITY, ^M<R2>		     ;GEN_PARITY, Save R2						      ; 5981
	MOVL    4(AP), R2			     ;CHARACTER, R2							      ; 6030
	CASEL   W^PARITY_TYPE, #0, #4		     ;PARITY_TYPE, #0, #4						      ; 6026
1$:	.WORD   2$-1$,-				     ;2$-1$,-								      ;
		3$-1$,-				     ;3$-1$,-								      ;
		5$-1$,-				     ;5$-1$,-								      ;
		4$-1$,-				     ;4$-1$,-								      ;
		8$-1$				     ;8$-1$								      ;
2$:	MOVL    R2, R0				     ;R2, R0								      ; 6030
	RET     				     ;									      ;
3$:	BISL3   #128, R2, R0			     ;#128, R2, R0							      ; 6036
	RET     				     ;									      ;
4$:	EXTZV   #0, #7, R2, R0			     ;#0, #7, R2, TEMP_CHAR						      ; 6039
	INSV    #1, #7, #1, R0			     ;#1, #7, #1, TEMP_CHAR						      ;
	BRB     6$				     ;6$								      ;
5$:	EXTZV   #0, #7, R2, R0			     ;#0, #7, R2, TEMP_CHAR						      ; 6042
6$:	ASHL    #-4, R0, R1			     ;#-4, TEMP_CHAR, R1						      ; 6045
	XORL2   R1, R0				     ;R1, TEMP_CHAR							      ;
	ASHL    #-2, R0, R1			     ;#-2, TEMP_CHAR, R1						      ; 6046
	XORL2   R1, R0				     ;R1, TEMP_CHAR							      ;
	CMPZV   #0, #2, R0, #1			     ;#0, #2, TEMP_CHAR, #1						      ; 6048
	BEQL    7$				     ;7$								      ;
	CMPZV   #0, #2, R0, #2			     ;#0, #2, TEMP_CHAR, #2						      ;
	BNEQ    8$				     ;8$								      ;
7$:	EXTZV   #0, #7, R2, R0			     ;#0, #7, R2, R0							      ; 6050
	INSV    #1, #7, #1, R0			     ;#1, #7, #1, R0							      ;
	RET     				     ;									      ; 6052
8$:	EXTZV   #0, #7, R2, R0			     ;#0, #7, R2, R0							      ;
	RET     				     ;									      ; 6054

; Routine Size:  99 bytes,    Routine Base:  $CODE$ + 211C


;   6055  1	
;   6056  1	%SBTTL 'Per transfer -- Initialization'
;   6057  1	ROUTINE INIT_XFR : NOVALUE =
;   6058  1	
;   6059  1	!++
;   6060  1	! FUNCTIONAL DESCRIPTION:
;   6061  1	!
;   6062  1	!	This routine will initialize the various locations that the
;   6063  1	!	send and receive statistics are kept.
;   6064  1	!
;   6065  1	! CALLING SEQUENCE:
;   6066  1	!
;   6067  1	!	INIT_XFR();
;   6068  1	!
;   6069  1	! INPUT PARAMETERS:
;   6070  1	!
;   6071  1	!	None.
;   6072  1	!
;   6073  1	! IMPLICIT INPUTS:
;   6074  1	!
;   6075  1	!	None.
;   6076  1	!
;   6077  1	! OUTPUT PARAMETERS:
;   6078  1	!
;   6079  1	!	None.
;   6080  1	!
;   6081  1	! IMPLICIT OUTPUTS:
;   6082  1	!
;   6083  1	!	None.
;   6084  1	!
;   6085  1	! COMPLETION CODES:
;   6086  1	!
;   6087  1	!	None.
;   6088  1	!
;   6089  1	! SIDE EFFECTS:
;   6090  1	!
;   6091  1	!	None.
;   6092  1	!
;   6093  1	!--
;   6094  1	
;   6095  2	    BEGIN
;   6096  2	!
;   6097  2	! Determine if we should do 8 bit quoting
;   6098  2	!
;   6099  2	
;   6100  2	    IF .PARITY_TYPE NEQ PR_NONE
;   6101  2	    THEN
;   6102  3		BEGIN
;   6103  3		RECV_8QUOTE_CHR = .RCV_8QUOTE_CHR;
;   6104  3		END
;   6105  2	    ELSE
;   6106  3		BEGIN
;   6107  3		RECV_8QUOTE_CHR = %C'Y';
;   6108  2		END;
;   6109  2	
;   6110  2	    NUM_RETRIES = 0;
;   6111  2	    SEND_8QUOTE_CHR = .RECV_8QUOTE_CHR;
;   6112  2	!
;   6113  2	! Send parameters that may not get set before we need them for the first
;   6114  2	! time.
;   6115  2	!
;   6116  2	    SEND_PKT_SIZE = ABS (.SND_PKT_SIZE);
;   6117  2	    SEND_NPAD = ABS (.SND_NPAD);
;   6118  2	    SEND_PADCHAR = ABS (.SND_PADCHAR);
;   6119  2	    SEND_TIMEOUT = ABS (.SND_TIMEOUT);
;   6120  2	    SEND_EOL = ABS (.SND_EOL);
;   6121  2	    SEND_QUOTE_CHR = ABS (.SND_QUOTE_CHR);
;   6122  2	!
;   6123  2	! For initialization messages, we must use single character checksum
;   6124  2	! When the send-init/ack sequence has been done, we will switch to the
;   6125  2	! desired form
;   6126  2	!
;   6127  2	    BLK_CHK_TYPE = CHK_1CHAR;
;   6128  2	    INI_CHK_TYPE = .CHKTYPE;			! Send desired type
;   6129  2	!
;   6130  2	! Set desired repeat character for use in we are doing send-init
;   6131  2	! Will be overwritten by other ends desired character if it sends
;   6132  2	! the send-init.
;   6133  2	!
;   6134  2	    REPT_CHR = .SET_REPT_CHR;
;   6135  2	!
;   6136  2	! Assume packet assembly/disassembly uses characters from a file
;   6137  2	!
;   6138  2	    GET_CHR_ROUTINE = GET_FILE;			! Initialize the get-a-char routine
;   6139  2	    PUT_CHR_ROUTINE = PUT_FILE;			! And the put-a-char
;   6140  2	    TEXT_HEAD_FLAG = FALSE;			! And assume we will get an File header
;   6141  2	    NO_FILE_NEEDED = FALSE;			! Assume will do file ops
;   6142  2	    INIT_PKT_SENT = FALSE;			! And no server-init sent
;   6143  2	!
;   6144  2	! Always start with packet number 0
;   6145  2	!
;   6146  2	    MSG_NUMBER = 0;				! Initial message number
;   6147  2	!
;   6148  2	! Stats information
;   6149  2	!
;   6150  2	    SMSG_TOTAL_CHARS = 0;
;   6151  2	    RMSG_TOTAL_CHARS = 0;
;   6152  2	    SMSG_DATA_CHARS = 0;
;   6153  2	    RMSG_DATA_CHARS = 0;
;   6154  2	    SMSG_COUNT = 0;
;   6155  2	    RMSG_COUNT = 0;
;   6156  2	    RMSG_NAKS = 0;
;   6157  2	    SMSG_NAKS = 0;
;   6158  2	    XFR_TIME = SY_TIME ();
;   6159  1	    END;					! End of INIT_XFR





;INIT_XFR
U.32:	.WORD   ^M<R2>				     ;Save R2								      ; 6057
	MOVAB   W^U.37, R2			     ;U.37, R2								      ;
	TSTL    W^PARITY_TYPE			     ;PARITY_TYPE							      ; 6100
	BEQL    1$				     ;1$								      ;
	MOVL    W^RCV_8QUOTE_CHR, (R2)		     ;RCV_8QUOTE_CHR, RECV_8QUOTE_CHR					      ; 6103
	BRB     2$				     ;2$								      ; 6100
1$:	MOVZBL  #89, (R2)			     ;#89, RECV_8QUOTE_CHR						      ; 6107
2$:	CLRL    60(R2)				     ;NUM_RETRIES							      ; 6110
	MOVL    (R2), 28(R2)			     ;RECV_8QUOTE_CHR, SEND_8QUOTE_CHR					      ; 6111
	MOVL    W^SND_PKT_SIZE, R0		     ;SND_PKT_SIZE, R0							      ; 6116
	BGEQ    3$				     ;3$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
3$:	MOVL    R0, 8(R2)			     ;R0, SEND_PKT_SIZE							      ;
	MOVL    W^SND_NPAD, R0			     ;SND_NPAD, R0							      ; 6117
	BGEQ    4$				     ;4$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
4$:	MOVL    R0, 12(R2)			     ;R0, SEND_NPAD							      ;
	MOVL    W^SND_PADCHAR, R0		     ;SND_PADCHAR, R0							      ; 6118
	BGEQ    5$				     ;5$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
5$:	MOVL    R0, 16(R2)			     ;R0, SEND_PADCHAR							      ;
	MOVL    W^SND_TIMEOUT, R0		     ;SND_TIMEOUT, R0							      ; 6119
	BGEQ    6$				     ;6$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
6$:	MOVL    R0, W^SEND_TIMEOUT		     ;R0, SEND_TIMEOUT							      ;
	MOVL    W^SND_EOL, R0			     ;SND_EOL, R0							      ; 6120
	BGEQ    7$				     ;7$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
7$:	MOVL    R0, 20(R2)			     ;R0, SEND_EOL							      ;
	MOVL    W^SND_QUOTE_CHR, R0		     ;SND_QUOTE_CHR, R0							      ; 6121
	BGEQ    8$				     ;8$								      ;
	MNEGL   R0, R0				     ;R0, R0								      ;
8$:	MOVL    R0, 24(R2)			     ;R0, SEND_QUOTE_CHR						      ;
	MOVL    #49, 36(R2)			     ;#49, BLK_CHK_TYPE							      ; 6127
	MOVL    W^CHKTYPE, 32(R2)		     ;CHKTYPE, INI_CHK_TYPE						      ; 6128
	MOVL    W^SET_REPT_CHR, 4(R2)		     ;SET_REPT_CHR, REPT_CHR						      ; 6134
	MOVAB   W^GET_FILE, 308(R2)		     ;GET_FILE, GET_CHR_ROUTINE						      ; 6138
	MOVAB   W^PUT_FILE, 312(R2)		     ;PUT_FILE, PUT_CHR_ROUTINE						      ; 6139
	CLRQ    288(R2)				     ;TEXT_HEAD_FLAG							      ; 6140
	CLRL    296(R2)				     ;INIT_PKT_SENT							      ; 6142
	CLRL    64(R2)				     ;MSG_NUMBER							      ; 6146
	CLRL    W^SMSG_TOTAL_CHARS		     ;SMSG_TOTAL_CHARS							      ; 6150
	CLRL    W^RMSG_TOTAL_CHARS		     ;RMSG_TOTAL_CHARS							      ; 6151
	CLRL    W^SMSG_DATA_CHARS		     ;SMSG_DATA_CHARS							      ; 6152
	CLRL    W^RMSG_DATA_CHARS		     ;RMSG_DATA_CHARS							      ; 6153
	CLRL    W^SMSG_COUNT			     ;SMSG_COUNT							      ; 6154
	CLRL    W^RMSG_COUNT			     ;RMSG_COUNT							      ; 6155
	CLRL    W^RMSG_NAKS			     ;RMSG_NAKS								      ; 6156
	CLRL    W^SMSG_NAKS			     ;SMSG_NAKS								      ; 6157
	CALLS   #0, W^SY_TIME			     ;#0, SY_TIME							      ; 6158
	MOVL    R0, W^XFR_TIME			     ;R0, XFR_TIME							      ;
	RET     				     ;									      ; 6159

; Routine Size:  200 bytes,    Routine Base:  $CODE$ + 217F


;   6160  1	%SBTTL 'Statistics -- Finish message transfer'
;   6161  1	ROUTINE END_STATS : NOVALUE =
;   6162  1	
;   6163  1	!++
;   6164  1	! FUNCTIONAL DESCRIPTION:
;   6165  1	!
;   6166  1	!	This routine will end the collection of the statistices.  It will
;   6167  1	!	update the various overall statistic parameters.
;   6168  1	!
;   6169  1	! CALLING SEQUENCE:
;   6170  1	!
;   6171  1	!	END_STATS ();
;   6172  1	!
;   6173  1	! INPUT PARAMETERS:
;   6174  1	!
;   6175  1	!	None.
;   6176  1	!
;   6177  1	! IMPLICIT INPUTS:
;   6178  1	!
;   6179  1	!	None.
;   6180  1	!
;   6181  1	! OUTPUT PARAMETERS:
;   6182  1	!
;   6183  1	!	None.
;   6184  1	!
;   6185  1	! IMPLICIT OUTPUTS:
;   6186  1	!
;   6187  1	!	None.
;   6188  1	!
;   6189  1	! COMPLETION CODES:
;   6190  1	!
;   6191  1	!	None.
;   6192  1	!
;   6193  1	! SIDE EFFECTS:
;   6194  1	!
;   6195  1	!	None.
;   6196  1	!
;   6197  1	!--
;   6198  1	
;   6199  2	    BEGIN
;   6200  2	    SND_COUNT = .SND_COUNT + .SMSG_COUNT;
;   6201  2	    RCV_COUNT = .RCV_COUNT + .RMSG_COUNT;
;   6202  2	    SND_TOTAL_CHARS = .SND_TOTAL_CHARS + .SMSG_TOTAL_CHARS;
;   6203  2	    SND_DATA_CHARS = .SND_DATA_CHARS + .SMSG_DATA_CHARS;
;   6204  2	    RCV_TOTAL_CHARS = .RCV_TOTAL_CHARS + .RMSG_TOTAL_CHARS;
;   6205  2	    RCV_DATA_CHARS = .RCV_DATA_CHARS + .RMSG_DATA_CHARS;
;   6206  2	    SND_NAKS = .SND_NAKS + .SMSG_NAKS;
;   6207  2	    RCV_NAKS = .RCV_NAKS + .RMSG_NAKS;
;   6208  2	    XFR_TIME = SY_TIME () - .XFR_TIME;
;   6209  2	    TOTAL_TIME = .TOTAL_TIME + .XFR_TIME;
;   6210  1	    END;					! End of END_STATS





;END_STATS
U.18:	.WORD   ^M<R2>				     ;Save R2								      ; 6161
	MOVAB   W^XFR_TIME, R2			     ;XFR_TIME, R2							      ;
	ADDL2   W^SMSG_COUNT, W^SND_COUNT	     ;SMSG_COUNT, SND_COUNT						      ; 6200
	ADDL2   W^RMSG_COUNT, W^RCV_COUNT	     ;RMSG_COUNT, RCV_COUNT						      ; 6201
	ADDL2   W^SMSG_TOTAL_CHARS, -		     ;SMSG_TOTAL_CHARS, SND_TOTAL_CHARS					      ; 6202
		W^SND_TOTAL_CHARS		     ;									      ;
	ADDL2   W^SMSG_DATA_CHARS, W^SND_DATA_CHARS  ;SMSG_DATA_CHARS, SND_DATA_CHARS					      ; 6203
	ADDL2   W^RMSG_TOTAL_CHARS, -		     ;RMSG_TOTAL_CHARS, RCV_TOTAL_CHARS					      ; 6204
		W^RCV_TOTAL_CHARS		     ;									      ;
	ADDL2   W^RMSG_DATA_CHARS, W^RCV_DATA_CHARS  ;RMSG_DATA_CHARS, RCV_DATA_CHARS					      ; 6205
	ADDL2   W^SMSG_NAKS, W^SND_NAKS		     ;SMSG_NAKS, SND_NAKS						      ; 6206
	ADDL2   W^RMSG_NAKS, W^RCV_NAKS		     ;RMSG_NAKS, RCV_NAKS						      ; 6207
	CALLS   #0, W^SY_TIME			     ;#0, SY_TIME							      ; 6208
	SUBL3   (R2), R0, (R2)			     ;XFR_TIME, R0, XFR_TIME						      ;
	ADDL2   (R2), W^TOTAL_TIME		     ;XFR_TIME, TOTAL_TIME						      ; 6209
	RET     				     ;									      ; 6210

; Routine Size:  78 bytes,    Routine Base:  $CODE$ + 2247


;   6211  1	%SBTTL 'Status type out -- STS_OUTPUT'
;   6212  1	ROUTINE STS_OUTPUT : NOVALUE =
;   6213  1	
;   6214  1	!++
;   6215  1	! FUNCTIONAL DESCRIPTION:
;   6216  1	!
;   6217  1	!	This routine will output the current status of a transfer.
;   6218  1	!	This is used when the user types a ^A during a transfer.
;   6219  1	!
;   6220  1	! CALLING SEQUENCE:
;   6221  1	!
;   6222  1	!	STS_OUTPUT ()
;   6223  1	!
;   6224  1	! INPUT PARAMETERS:
;   6225  1	!
;   6226  1	!	None.
;   6227  1	!
;   6228  1	! IMPLICIT INPUTS:
;   6229  1	!
;   6230  1	!	Statistics blocks, file names, etc.
;   6231  1	!
;   6232  1	! OUPTUT PARAMETERS:
;   6233  1	!
;   6234  1	!	None.
;   6235  1	!
;   6236  1	! IMPLICIT OUTPUTS:
;   6237  1	!
;   6238  1	!	None.
;   6239  1	!
;   6240  1	! COMPLETION CODES:
;   6241  1	!
;   6242  1	!	None.
;   6243  1	!
;   6244  1	! SIDE EFFECTS:
;   6245  1	!
;   6246  1	!	None.
;   6247  1	!
;   6248  1	!--
;   6249  1	
;   6250  2	    BEGIN
;   6251  2	    TT_CHAR (%C'[');				! Start the message
;   6252  2	
;   6253  2	    CASE .STATE FROM STATE_MIN TO STATE_MAX OF
;   6254  2		SET
;   6255  2	
;   6256  2		[STATE_ID, STATE_II] :
;   6257  2		    TT_TEXT (UPLIT (%ASCIZ'Idle in server mode'));
;   6258  2	
;   6259  2		[STATE_S, STATE_SF] :
;   6260  3		    BEGIN
;   6261  3		    TT_TEXT (UPLIT (%ASCIZ'Initializing for sending file '));
;   6262  3		    TT_TEXT (FILE_NAME);
;   6263  2		    END;
;   6264  2	
;   6265  2		[STATE_SI] :
;   6266  2		    TT_TEXT (UPLIT (%ASCIZ'Initializing for remote command'));
;   6267  2	
;   6268  2		[STATE_SG] :
;   6269  2		    TT_TEXT (UPLIT (%ASCIZ'Waiting for response to remote command'));
;   6270  2	
;   6271  2		[STATE_SD] :
;   6272  3		    BEGIN
;   6273  3		    TT_NUMBER (.FILE_CHARS);
;   6274  3		    TT_TEXT (UPLIT (%ASCIZ' characters sent for file '));
;   6275  3		    TT_TEXT (FILE_NAME);
;   6276  2		    END;
;   6277  2	
;   6278  2		[STATE_SZ] :
;   6279  3		    BEGIN
;   6280  3		    TT_TEXT (UPLIT (%ASCIZ'At end of file '));
;   6281  3		    TT_TEXT (FILE_NAME);
;   6282  2		    END;
;   6283  2	
;   6284  2		[STATE_SB] :
;   6285  2		    TT_TEXT (UPLIT (%ASCIZ'Finishing transfer session'));
;   6286  2	
;   6287  2		[STATE_R] :
;   6288  2		    TT_TEXT (UPLIT (%ASCIZ'Waiting for initialization'));
;   6289  2	
;   6290  2		[STATE_RF] :
;   6291  2		    TT_TEXT (UPLIT (%ASCIZ'Waiting for next file or end of session'));
;   6292  2	
;   6293  2		[STATE_RD] :
;   6294  3		    BEGIN
;   6295  3		    TT_NUMBER (.FILE_CHARS);
;   6296  3		    TT_TEXT (UPLIT (%ASCIZ' characters received for file '));
;   6297  3		    TT_TEXT (FILE_NAME);
;   6298  2		    END;
;   6299  2	
;   6300  2		[STATE_C] :
;   6301  2		    TT_TEXT (UPLIT (%ASCIZ' Session complete'));
;   6302  2	
;   6303  2		[STATE_A] :
;   6304  2		    TT_TEXT (UPLIT (%ASCIZ' Session aborted'));
;   6305  2	
;   6306  2		[INRANGE, OUTRANGE] :
;   6307  2		    TT_TEXT (UPLIT (%ASCIZ' Unknown state'));
;   6308  2		TES;
;   6309  2	
;   6310  2	    SELECTONE .STATE OF
;   6311  2		SET
;   6312  2	
;   6313  2		[STATE_S, STATE_SF, STATE_SD, STATE_SZ, STATE_SB] :
;   6314  3		    BEGIN
;   6315  3	
;   6316  3		    IF .RMSG_NAKS GTR 0
;   6317  3		    THEN
;   6318  4			BEGIN
;   6319  4			TT_TEXT (UPLIT (%ASCIZ', '));
;   6320  4			TT_NUMBER (.RMSG_NAKS);
;   6321  4			TT_TEXT (UPLIT (%ASCIZ' NAKs received'));
;   6322  3			END;
;   6323  3	
;   6324  2		    END;
;   6325  2	
;   6326  2		[STATE_R, STATE_RF, STATE_RD] :
;   6327  3		    BEGIN
;   6328  3	
;   6329  3		    IF .SMSG_NAKS GTR 0
;   6330  3		    THEN
;   6331  4			BEGIN
;   6332  4			TT_TEXT (UPLIT (%ASCIZ', '));
;   6333  4			TT_NUMBER (.SMSG_NAKS);
;   6334  4			TT_TEXT (UPLIT (%ASCIZ' NAKs sent'));
;   6335  3			END;
;   6336  3	
;   6337  2		    END;
;   6338  2		TES;
;   6339  2	
;   6340  2	    TT_CHAR (%C']');				! End the line
;   6341  2	    TT_CRLF ();					! with a CRLF
;   6342  1	    END;					! End of STS_OUTPUT



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.AAO:	.ASCII  \Idle in server mode\<0>	     ;									      ;
P.AAP:	.ASCII  \Initializing for sending file \<0><0>
						     ;									      ;
P.AAQ:	.ASCII  \Initializing for remote command\<0> ;									      ;
P.AAR:	.ASCII  \Waiting for response to remote command\<0><0>
						     ;									      ;
P.AAS:	.ASCII  \ characters sent for file \<0><0>   ;									      ;
P.AAT:	.ASCII  \At end of file \<0>		     ;									      ;
P.AAU:	.ASCII  \Finishing transfer session\<0><0>   ;									      ;
P.AAV:	.ASCII  \Waiting for initialization\<0><0>   ;									      ;
P.AAW:	.ASCII  \Waiting for next file or end of session\<0>
						     ;									      ;
P.AAX:	.ASCII  \ characters received for file \<0><0>
						     ;									      ;
P.AAY:	.ASCII  \ Session complete\<0><0><0>	     ;									      ;
P.AAZ:	.ASCII  \ Session aborted\<0><0><0><0>	     ;									      ;
P.ABA:	.ASCII  \ Unknown state\<0><0>		     ;									      ;
P.ABB:	.ASCII  \, \<0><0>			     ;									      ;
P.ABC:	.ASCII  \ NAKs received\<0><0>		     ;									      ;
P.ABD:	.ASCII  \, \<0><0>			     ;									      ;
P.ABE:	.ASCII  \ NAKs sent\<0><0>		     ;									      ;



	.PSECT  $CODE$,NOWRT,2

;STS_OUTPUT
U.33:	.WORD   ^M<R2,R3,R4>			     ;Save R2,R3,R4							      ; 6212
	MOVAB   W^TT_NUMBER, R4			     ;TT_NUMBER, R4							      ;
	MOVAB   W^TT_TEXT, R3			     ;TT_TEXT, R3							      ;
	MOVAB   W^P.ABA, R2			     ;P.ABA, R2								      ;
	MOVZBL  #91, -(SP)			     ;#91, -(SP)							      ; 6251
	CALLS   #1, W^TT_CHAR			     ;#1, TT_CHAR							      ;
	CASEL   W^U.49, #1, #19			     ;U.49, #1, #19							      ; 6253
1$:	.WORD   4$-1$,-				     ;4$-1$,-								      ;
		4$-1$,-				     ;4$-1$,-								      ;
		7$-1$,-				     ;7$-1$,-								      ;
		8$-1$,-				     ;8$-1$,-								      ;
		10$-1$,-			     ;10$-1$,-								      ;
		11$-1$,-			     ;11$-1$,-								      ;
		12$-1$,-			     ;12$-1$,-								      ;
		13$-1$,-			     ;13$-1$,-								      ;
		14$-1$,-			     ;14$-1$,-								      ;
		15$-1$,-			     ;15$-1$,-								      ;
		2$-1$,-				     ;2$-1$,-								      ;
		6$-1$,-				     ;6$-1$,-								      ;
		5$-1$,-				     ;5$-1$,-								      ;
		3$-1$,-				     ;3$-1$,-								      ;
		3$-1$,-				     ;3$-1$,-								      ;
		2$-1$,-				     ;2$-1$,-								      ;
		2$-1$,-				     ;2$-1$,-								      ;
		2$-1$,-				     ;2$-1$,-								      ;
		2$-1$,-				     ;2$-1$,-								      ;
		2$-1$				     ;2$-1$								      ;
2$:	PUSHL   R2				     ;R2								      ; 6307
	BRB     16$				     ;16$								      ;
3$:	PUSHAB  -336(R2)			     ;P.AAO								      ; 6257
	BRB     16$				     ;16$								      ;
4$:	PUSHAB  -316(R2)			     ;P.AAP								      ; 6261
	BRB     9$				     ;9$								      ;
5$:	PUSHAB  -284(R2)			     ;P.AAQ								      ; 6266
	BRB     16$				     ;16$								      ;
6$:	PUSHAB  -252(R2)			     ;P.AAR								      ; 6269
	BRB     16$				     ;16$								      ;
7$:	PUSHL   W^U.60				     ;U.60								      ; 6273
	CALLS   #1, (R4)			     ;#1, TT_NUMBER							      ;
	PUSHAB  -212(R2)			     ;P.AAS								      ; 6274
	BRB     9$				     ;9$								      ;
8$:	PUSHAB  -184(R2)			     ;P.AAT								      ; 6280
9$:	CALLS   #1, (R3)			     ;#1, TT_TEXT							      ;
	PUSHAB  W^FILE_NAME			     ;FILE_NAME								      ; 6281
	BRB     16$				     ;16$								      ;
10$:	PUSHAB  -168(R2)			     ;P.AAU								      ; 6285
	BRB     16$				     ;16$								      ;
11$:	PUSHAB  -140(R2)			     ;P.AAV								      ; 6288
	BRB     16$				     ;16$								      ;
12$:	PUSHAB  -112(R2)			     ;P.AAW								      ; 6291
	BRB     16$				     ;16$								      ;
13$:	PUSHL   W^U.60				     ;U.60								      ; 6295
	CALLS   #1, (R4)			     ;#1, TT_NUMBER							      ;
	PUSHAB  -72(R2)				     ;P.AAX								      ; 6296
	BRB     9$				     ;9$								      ;
14$:	PUSHAB  -40(R2)				     ;P.AAY								      ; 6301
	BRB     16$				     ;16$								      ;
15$:	PUSHAB  -20(R2)				     ;P.AAZ								      ; 6304
16$:	CALLS   #1, (R3)			     ;#1, TT_TEXT							      ;
	MOVL    W^U.49, R0			     ;U.49, R0								      ; 6310
	BLEQ    17$				     ;17$								      ; 6313
	CMPL    R0, #5				     ;R0, #5								      ;
	BGTR    17$				     ;17$								      ;
	TSTL    W^RMSG_NAKS			     ;RMSG_NAKS								      ; 6316
	BLEQ    19$				     ;19$								      ;
	PUSHAB  16(R2)				     ;P.ABB								      ; 6319
	CALLS   #1, (R3)			     ;#1, TT_TEXT							      ;
	PUSHL   W^RMSG_NAKS			     ;RMSG_NAKS								      ; 6320
	CALLS   #1, (R4)			     ;#1, TT_NUMBER							      ;
	PUSHAB  20(R2)				     ;P.ABC								      ; 6321
	BRB     18$				     ;18$								      ;
17$:	CMPL    R0, #6				     ;R0, #6								      ; 6326
	BLSS    19$				     ;19$								      ;
	CMPL    R0, #8				     ;R0, #8								      ;
	BGTR    19$				     ;19$								      ;
	TSTL    W^SMSG_NAKS			     ;SMSG_NAKS								      ; 6329
	BLEQ    19$				     ;19$								      ;
	PUSHAB  36(R2)				     ;P.ABD								      ; 6332
	CALLS   #1, (R3)			     ;#1, TT_TEXT							      ;
	PUSHL   W^SMSG_NAKS			     ;SMSG_NAKS								      ; 6333
	CALLS   #1, (R4)			     ;#1, TT_NUMBER							      ;
	PUSHAB  40(R2)				     ;P.ABE								      ; 6334
18$:	CALLS   #1, (R3)			     ;#1, TT_TEXT							      ;
19$:	MOVZBL  #93, -(SP)			     ;#93, -(SP)							      ; 6340
	CALLS   #1, W^TT_CHAR			     ;#1, TT_CHAR							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 6341
	RET     				     ;									      ; 6342

; Routine Size:  252 bytes,    Routine Base:  $CODE$ + 2295


;   6343  1	%SBTTL 'TYPE_CHAR - Type out a character'
;   6344  1	ROUTINE TYPE_CHAR (CHARACTER) =
;   6345  1	
;   6346  1	!++
;   6347  1	! FUNCTIONAL DESCRIPTION:
;   6348  1	!
;   6349  1	! This routine is used as an alternate output routine for BFR_EMPTY.
;   6350  1	! It will type the character on the terminal, and always return a
;   6351  1	! true status.
;   6352  1	!
;   6353  1	! CALLING SEQUENCE:
;   6354  1	!
;   6355  1	!	STATUS = TYPE_CHAR (.CHARACTER);
;   6356  1	!
;   6357  1	! INPUT PARAMETERS:
;   6358  1	!
;   6359  1	!	CHARACTER - The character to type
;   6360  1	!
;   6361  1	! IMPLICIT INPUTS:
;   6362  1	!
;   6363  1	!	None.
;   6364  1	!
;   6365  1	! OUPTUT PARAMETERS:
;   6366  1	!
;   6367  1	!	None.
;   6368  1	!
;   6369  1	! IMPLICIT OUTPUTS:
;   6370  1	!
;   6371  1	!	None.
;   6372  1	!
;   6373  1	! COMPLETION CODES:
;   6374  1	!
;   6375  1	!	None.
;   6376  1	!
;   6377  1	! SIDE EFFECTS:
;   6378  1	!
;   6379  1	!	None.
;   6380  1	!
;   6381  1	!--
;   6382  1	
;   6383  2	    BEGIN
;   6384  2	    TT_CHAR (.CHARACTER);			! Type the character
;   6385  2	    RETURN KER_NORMAL;				! And return OK
;   6386  1	    END;					! End of TYPE_CHAR





;TYPE_CHAR
U.31:	.WORD   ^M<>				     ;Save nothing							      ; 6344
	PUSHL   4(AP)				     ;CHARACTER								      ; 6384
	CALLS   #1, W^TT_CHAR			     ;#1, TT_CHAR							      ;
	MOVL    #134316043, R0			     ;#134316043, R0							      ; 6385
	RET     				     ;									      ; 6386

; Routine Size:  18 bytes,    Routine Base:  $CODE$ + 2391


;   6387  1	%SBTTL 'Debugging -- DBG_SEND'
;   6388  1	ROUTINE DBG_SEND (ADDRESS, LENGTH) : NOVALUE =
;   6389  1	
;   6390  1	!++
;   6391  1	! FUNCTIONAL DESCRIPTION:
;   6392  1	!
;   6393  1	!	This routine will output the message that is going to be sent
;   6394  1	!	as part of the debugging information that is turned on in the
;   6395  1	!	SET DEBUG command.
;   6396  1	!
;   6397  1	! CALLING SEQUENCE:
;   6398  1	!
;   6399  1	!	DBG_SEND(MSG_ADDRESS, MSG_LENGTH);
;   6400  1	!
;   6401  1	! INPUT PARAMETERS:
;   6402  1	!
;   6403  1	!	MSG_ADDRESS - Address of the message that is going to be sent
;   6404  1	!		to the remote KERMIT.  The bytes are CHR_SIZE.
;   6405  1	!	MSG_LENGTH - Length of the message.
;   6406  1	!
;   6407  1	! IMPLICIT INPUTS:
;   6408  1	!
;   6409  1	!	None.
;   6410  1	!
;   6411  1	! OUTPUT PARAMETERS:
;   6412  1	!
;   6413  1	!	None.
;   6414  1	!
;   6415  1	! IMPLICIT OUTPUTS:
;   6416  1	!
;   6417  1	!	None.
;   6418  1	!
;   6419  1	! COMPLETION CODES:
;   6420  1	!
;   6421  1	!	None.
;   6422  1	!
;   6423  1	! SIDE EFFECTS:
;   6424  1	!
;   6425  1	!	None.
;   6426  1	!
;   6427  1	!--
;   6428  1	
;   6429  2	    BEGIN
;   6430  2	
;   6431  2	    BIND
;   6432  2		SEND_TEXT = UPLIT (%ASCIZ'Sending...');
;   6433  2	
;   6434  2	    IF .DEBUG_FLAG
;   6435  2	    THEN
;   6436  3		BEGIN
;   6437  3	
;   6438  3		LOCAL
;   6439  3		    OLD_RTN;
;   6440  3	
;   6441  3		OLD_RTN = TT_SET_OUTPUT (DBG_DUMP);
;   6442  3		TT_TEXT (SEND_TEXT);
;   6443  3		DBG_MESSAGE (.ADDRESS, .LENGTH);
;   6444  3		TT_SET_OUTPUT (.OLD_RTN);
;   6445  2		END;
;   6446  2	
;   6447  1	    END;					! End of DBG_SEND



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.ABF:	.ASCII  \Sending...\<0><0>		     ;									      ;

U.100=		    P.ABF


	.PSECT  $CODE$,NOWRT,2

;DBG_SEND
U.35:	.WORD   ^M<R2>				     ;Save R2								      ; 6388
	BLBC    W^DEBUG_FLAG, 1$		     ;DEBUG_FLAG, 1$							      ; 6434
	PUSHAB  W^DBG_DUMP			     ;DBG_DUMP								      ; 6441
	CALLS   #1, W^TT_SET_OUTPUT		     ;#1, TT_SET_OUTPUT							      ;
	MOVL    R0, R2				     ;R0, OLD_RTN							      ;
	PUSHAB  W^U.100				     ;U.100								      ; 6442
	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	MOVQ    4(AP), -(SP)			     ;ADDRESS, -(SP)							      ; 6443
	CALLS   #2, W^U.34			     ;#2, U.34								      ;
	PUSHL   R2				     ;OLD_RTN								      ; 6444
	CALLS   #1, W^TT_SET_OUTPUT		     ;#1, TT_SET_OUTPUT							      ;
1$:	RET     				     ;									      ; 6447

; Routine Size:  45 bytes,    Routine Base:  $CODE$ + 23A3


;   6448  1	%SBTTL 'Debugging -- DBG_RECEIVE'
;   6449  1	ROUTINE DBG_RECEIVE (ADDRESS) : NOVALUE =
;   6450  1	
;   6451  1	!++
;   6452  1	! FUNCTIONAL DESCRIPTION:
;   6453  1	!
;   6454  1	!	This routine will output the message that was received from
;   6455  1	!	the remote KERMIT.  This routine is called only if the DEBUG_FLAG
;   6456  1	!	is true.
;   6457  1	!
;   6458  1	! CALLING SEQUENCE:
;   6459  1	!
;   6460  1	!	DBG_RECEIVE(MSG_ADDRESS);
;   6461  1	!
;   6462  1	! INPUT PARAMETERS:
;   6463  1	!
;   6464  1	!	MSG_ADDRESS - Address of the message received by the remote KERMIT.
;   6465  1	!
;   6466  1	! IMPLICIT INPUTS:
;   6467  1	!
;   6468  1	!	None.
;   6469  1	!
;   6470  1	! OUTPUT PARAMETERS:
;   6471  1	!
;   6472  1	!	None.
;   6473  1	!
;   6474  1	! IMPLICIT OUTPUTS:
;   6475  1	!
;   6476  1	!	None.
;   6477  1	!
;   6478  1	! COMPLETION CODES:
;   6479  1	!
;   6480  1	!	None.
;   6481  1	!
;   6482  1	! SIDE EFFECTS:
;   6483  1	!
;   6484  1	!	None.
;   6485  1	!
;   6486  1	!--
;   6487  1	
;   6488  2	    BEGIN
;   6489  2	
;   6490  2	    BIND
;   6491  2		RECEIVE_TEXT = UPLIT (%ASCIZ'Received...');
;   6492  2	
;   6493  2	    IF .DEBUG_FLAG
;   6494  2	    THEN
;   6495  3		BEGIN
;   6496  3	
;   6497  3		LOCAL
;   6498  3		    OLD_RTN;
;   6499  3	
;   6500  3		OLD_RTN = TT_SET_OUTPUT (DBG_DUMP);
;   6501  3		TT_TEXT (RECEIVE_TEXT);
;   6502  3		DBG_MESSAGE (.ADDRESS, .REC_LENGTH);
;   6503  3		TT_SET_OUTPUT (.OLD_RTN);
;   6504  2		END;
;   6505  2	
;   6506  1	    END;					! End of DBG_RECEIVE



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.ABG:	.ASCII  \Received...\<0>		     ;									      ;

U.101=		    P.ABG


	.PSECT  $CODE$,NOWRT,2

;DBG_RECEIVE
U.36:	.WORD   ^M<R2>				     ;Save R2								      ; 6449
	BLBC    W^DEBUG_FLAG, 1$		     ;DEBUG_FLAG, 1$							      ; 6493
	PUSHAB  W^DBG_DUMP			     ;DBG_DUMP								      ; 6500
	CALLS   #1, W^TT_SET_OUTPUT		     ;#1, TT_SET_OUTPUT							      ;
	MOVL    R0, R2				     ;R0, OLD_RTN							      ;
	PUSHAB  W^U.101				     ;U.101								      ; 6501
	CALLS   #1, W^TT_TEXT			     ;#1, TT_TEXT							      ;
	PUSHL   W^U.55				     ;U.55								      ; 6502
	PUSHL   4(AP)				     ;ADDRESS								      ;
	CALLS   #2, W^U.34			     ;#2, U.34								      ;
	PUSHL   R2				     ;OLD_RTN								      ; 6503
	CALLS   #1, W^TT_SET_OUTPUT		     ;#1, TT_SET_OUTPUT							      ;
1$:	RET     				     ;									      ; 6506

; Routine Size:  48 bytes,    Routine Base:  $CODE$ + 23D0


;   6507  1	%SBTTL 'Debugging -- DBG_MESSAGE'
;   6508  1	ROUTINE DBG_MESSAGE (MSG_ADDRESS, MSG_LENGTH) : NOVALUE =
;   6509  1	
;   6510  1	!++
;   6511  1	! FUNCTIONAL DESCRIPTION:
;   6512  1	!
;   6513  1	!	This routine will display a message that is either being sent
;   6514  1	!	or received on the user's terminal.
;   6515  1	!
;   6516  1	! CALLING SEQUENCE:
;   6517  1	!
;   6518  1	!	DBG_MESSAGE(MSG_ADDRESS, MSG_LENGTH);
;   6519  1	!
;   6520  1	! INPUT PARAMETERS:
;   6521  1	!
;   6522  1	!	MSG_ADDRESS - Address of the message to be output
;   6523  1	!	MSG_LENGTH - Length of the message to be output.
;   6524  1	!
;   6525  1	! IMPLICIT INPUTS:
;   6526  1	!
;   6527  1	!	None.
;   6528  1	!
;   6529  1	! OUTPUT PARAMETERS:
;   6530  1	!
;   6531  1	!	None.
;   6532  1	!
;   6533  1	! IMPLICIT OUTPUTS:
;   6534  1	!
;   6535  1	!	None.
;   6536  1	!
;   6537  1	! COMPLETION CODES:
;   6538  1	!
;   6539  1	!	None.
;   6540  1	!
;   6541  1	! SIDE EFFECTS:
;   6542  1	!
;   6543  1	!	None.
;   6544  1	!
;   6545  1	!--
;   6546  1	
;   6547  2	    BEGIN
;   6548  2	
;   6549  2	    MAP
;   6550  2		MSG_ADDRESS : REF VECTOR [CH$ALLOCATION (MAX_MSG, CHR_SIZE)];	! Point to the vector
;   6551  2	
;   6552  2	    LOCAL
;   6553  2		OLD_RTN,				! Old type out routine
;   6554  2		CHKSUM,					! Numeric value of block check
;   6555  2		TEMP_POINTER,				! Temporary character pointer
;   6556  2		MSG_LEN;
;   6557  2	
;   6558  2	!
;   6559  2	! Message type text
;   6560  2	!
;   6561  2	
;   6562  2	    BIND
;   6563  2		DATA_TEXT = UPLIT (%ASCIZ' (Data)'),
;   6564  2		ACK_TEXT = UPLIT (%ASCIZ' (ACK)'),
;   6565  2		NAK_TEXT = UPLIT (%ASCIZ' (NAK)'),
;   6566  2		SND_INIT_TEXT = UPLIT (%ASCIZ' (Send init)'),
;   6567  2		BREAK_TEXT = UPLIT (%ASCIZ' (Break)'),
;   6568  2		TEXT_TEXT = UPLIT (%ASCIZ' (Text header)'),
;   6569  2		FILE_TEXT = UPLIT (%ASCIZ' (File header)'),
;   6570  2		EOF_TEXT = UPLIT (%ASCIZ' (EOF)'),
;   6571  2		ERROR_TEXT = UPLIT (%ASCIZ' (Error)'),
;   6572  2		RCV_INIT_TEXT = UPLIT (%ASCIZ' (Receive initiate)'),
;   6573  2		COMMAND_TEXT = UPLIT (%ASCIZ' (Command)'),
;   6574  2		KERMIT_TEXT = UPLIT (%ASCIZ' (Generic KERMIT command)');
;   6575  2	
;   6576  2	!
;   6577  2	! Header information
;   6578  2	!
;   6579  2	
;   6580  2	    BIND
;   6581  2		MN_TEXT = UPLIT (%ASCIZ'Message number: '),
;   6582  2		LENGTH_TEXT = UPLIT (%ASCIZ'	Length: '),
;   6583  2		DEC_TEXT = UPLIT (%ASCIZ' (dec)'),
;   6584  2		MSG_TYP_TEXT = UPLIT (%ASCIZ'Message type: '),
;   6585  2		CHKSUM_TEXT = UPLIT (%ASCIZ'Checksum: '),
;   6586  2		CHKSUM_NUM_TEXT = UPLIT (%ASCIZ' = '),
;   6587  2		OPT_DATA_TEXT = UPLIT (%ASCIZ'Optional data: '),
;   6588  2		PRE_CHAR_TEXT = UPLIT (%ASCIZ' "');
;   6589  2	
;   6590  2	!
;   6591  2	! Ensure that the type out will go to the debugging location
;   6592  2	!
;   6593  2	    OLD_RTN = TT_SET_OUTPUT (DBG_DUMP);
;   6594  2	!
;   6595  2	! Preliminary calculations
;   6596  2	!
;   6597  2	    MSG_LEN = UNCHAR (CH$RCHAR (CH$PTR (.MSG_ADDRESS, PKT_COUNT, CHR_SIZE)));
;   6598  2	!
;   6599  2	! First output some header information for the packet.
;   6600  2	!
;   6601  2	    TT_CRLF ();
;   6602  2	    TT_TEXT (MN_TEXT);
;   6603  2	    TT_NUMBER (UNCHAR (CH$RCHAR (CH$PTR (.MSG_ADDRESS, PKT_SEQ, CHR_SIZE))));
;   6604  2	    TT_TEXT (DEC_TEXT);
;   6605  2	    TT_TEXT (LENGTH_TEXT);
;   6606  2	    TT_NUMBER (.MSG_LEN);
;   6607  2	    TT_TEXT (DEC_TEXT);
;   6608  2	    TT_CRLF ();
;   6609  2	!
;   6610  2	! Now output the message type and dependent information
;   6611  2	!
;   6612  2	    TT_TEXT (MSG_TYP_TEXT);
;   6613  2	    TT_CHAR (CH$RCHAR (CH$PTR (.MSG_ADDRESS, PKT_TYPE, CHR_SIZE)));
;   6614  2	
;   6615  2	    SELECTONE CH$RCHAR (CH$PTR (.MSG_ADDRESS, PKT_TYPE, CHR_SIZE)) OF
;   6616  2		SET
;   6617  2	
;   6618  2		[MSG_DATA] :
;   6619  2		    TT_TEXT (DATA_TEXT);
;   6620  2	
;   6621  2		[MSG_ACK] :
;   6622  2		    TT_TEXT (ACK_TEXT);
;   6623  2	
;   6624  2		[MSG_NAK] :
;   6625  2		    TT_TEXT (NAK_TEXT);
;   6626  2	
;   6627  2		[MSG_SND_INIT] :
;   6628  2		    TT_TEXT (SND_INIT_TEXT);
;   6629  2	
;   6630  2		[MSG_BREAK] :
;   6631  2		    TT_TEXT (BREAK_TEXT);
;   6632  2	
;   6633  2		[MSG_FILE] :
;   6634  2		    TT_TEXT (FILE_TEXT);
;   6635  2	
;   6636  2		[MSG_TEXT] :
;   6637  2		    TT_TEXT (TEXT_TEXT);
;   6638  2	
;   6639  2		[MSG_EOF] :
;   6640  2		    TT_TEXT (EOF_TEXT);
;   6641  2	
;   6642  2		[MSG_ERROR] :
;   6643  2		    TT_TEXT (ERROR_TEXT);
;   6644  2	
;   6645  2		[MSG_GENERIC] :
;   6646  2		    TT_TEXT (KERMIT_TEXT);
;   6647  2	
;   6648  2		[MSG_COMMAND] :
;   6649  2		    TT_TEXT (COMMAND_TEXT);
;   6650  2		TES;
;   6651  2	
;   6652  2	    TT_CRLF ();
;   6653  2	!
;   6654  2	! Now output any of the optional data.
;   6655  2	!
;   6656  2	
;   6657  2	    IF .MSG_LEN - PKT_OVR_HEAD - (.BLK_CHK_TYPE - CHK_1CHAR) NEQ 0
;   6658  2	    THEN
;   6659  3		BEGIN
;   6660  3		TT_TEXT (OPT_DATA_TEXT);
;   6661  3		TT_CRLF ();
;   6662  3		TEMP_POINTER = CH$PTR (.MSG_ADDRESS, PKT_MSG, CHR_SIZE);
;   6663  3	
;   6664  3		INCR I FROM 1 TO .MSG_LEN - PKT_OVR_HEAD - (.BLK_CHK_TYPE - CHK_1CHAR) DO
;   6665  4		    BEGIN
;   6666  4	
;   6667  4		    IF (.I MOD 10) EQL 1
;   6668  4		    THEN
;   6669  5			BEGIN
;   6670  5			TT_CRLF ();
;   6671  5			TT_CHAR (CHR_TAB);
;   6672  4			END;
;   6673  4	
;   6674  4		    TT_TEXT (PRE_CHAR_TEXT);
;   6675  4		    TT_CHAR (CH$RCHAR_A (TEMP_POINTER));
;   6676  4		    TT_CHAR (%C'"');
;   6677  3		    END;
;   6678  3	
;   6679  3		IF ((.MSG_LEN - PKT_OVR_HEAD - (.BLK_CHK_TYPE - CHK_1CHAR)) MOD 10) EQL 1 THEN TT_CRLF ();
;   6680  3	
;   6681  3		TT_CRLF ();
;   6682  2		END;
;   6683  2	
;   6684  2	!
;   6685  2	! Now output the checksum for the message that we received
;   6686  2	!
;   6687  2	! This could be either 1 two or three characters.
;   6688  2	    TT_TEXT (CHKSUM_TEXT);
;   6689  2	    TEMP_POINTER = CH$PTR (.MSG_ADDRESS,
;   6690  2		PKT_MSG + .MSG_LEN + PKT_CHKSUM - PKT_OVR_HEAD - (.BLK_CHK_TYPE - CHK_1CHAR), CHR_SIZE);
;   6691  2	
;   6692  2	    CASE .BLK_CHK_TYPE FROM CHK_1CHAR TO CHK_CRC OF
;   6693  2		SET
;   6694  2	
;   6695  2		[CHK_1CHAR] :
;   6696  3		    BEGIN
;   6697  3		    TT_TEXT (PRE_CHAR_TEXT);
;   6698  3		    TT_CHAR (CH$RCHAR (.TEMP_POINTER));
;   6699  3		    TT_CHAR (%C'"');
;   6700  3		    CHKSUM = UNCHAR (CH$RCHAR (.TEMP_POINTER));
;   6701  2		    END;
;   6702  2	
;   6703  2		[CHK_2CHAR] :
;   6704  3		    BEGIN
;   6705  3		    CHKSUM = 0;
;   6706  3		    TT_TEXT (PRE_CHAR_TEXT);
;   6707  3		    TT_CHAR (CH$RCHAR (.TEMP_POINTER));
;   6708  3		    TT_CHAR (%C'"');
;   6709  3		    CHKSUM<6, 6> = UNCHAR (CH$RCHAR_A (TEMP_POINTER));
;   6710  3		    TT_TEXT (PRE_CHAR_TEXT);
;   6711  3		    TT_CHAR (CH$RCHAR (.TEMP_POINTER));
;   6712  3		    TT_CHAR (%C'"');
;   6713  3		    CHKSUM<0, 6> = UNCHAR (CH$RCHAR (.TEMP_POINTER));
;   6714  2		    END;
;   6715  2	
;   6716  2		[CHK_CRC] :
;   6717  3		    BEGIN
;   6718  3		    CHKSUM = 0;
;   6719  3		    TT_TEXT (PRE_CHAR_TEXT);
;   6720  3		    TT_CHAR (CH$RCHAR (.TEMP_POINTER));
;   6721  3		    TT_CHAR (%C'"');
;   6722  3		    CHKSUM<12, 4> = UNCHAR (CH$RCHAR_A (TEMP_POINTER));
;   6723  3		    TT_TEXT (PRE_CHAR_TEXT);
;   6724  3		    TT_CHAR (CH$RCHAR (.TEMP_POINTER));
;   6725  3		    TT_CHAR (%C'"');
;   6726  3		    CHKSUM<6, 6> = UNCHAR (CH$RCHAR_A (TEMP_POINTER));
;   6727  3		    TT_TEXT (PRE_CHAR_TEXT);
;   6728  3		    TT_CHAR (CH$RCHAR (.TEMP_POINTER));
;   6729  3		    TT_CHAR (%C'"');
;   6730  3		    CHKSUM<0, 6> = UNCHAR (CH$RCHAR (.TEMP_POINTER));
;   6731  2		    END;
;   6732  2		TES;
;   6733  2	
;   6734  2	    TT_TEXT (CHKSUM_NUM_TEXT);
;   6735  2	    TT_NUMBER (.CHKSUM);
;   6736  2	    TT_TEXT (DEC_TEXT);
;   6737  2	    TT_CRLF ();
;   6738  2	    TT_SET_OUTPUT (.OLD_RTN);			! Reset output destination
;   6739  1	    END;					! End of DBG_MESSAGE



	.PSECT  $PLIT$,NOWRT,NOEXE,2

P.ABH:	.ASCII  \ (Data)\<0>			     ;									      ;
P.ABI:	.ASCII  \ (ACK)\<0><0>			     ;									      ;
P.ABJ:	.ASCII  \ (NAK)\<0><0>			     ;									      ;
P.ABK:	.ASCII  \ (Send init)\<0><0><0><0>	     ;									      ;
P.ABL:	.ASCII  \ (Break)\<0><0><0><0>		     ;									      ;
P.ABM:	.ASCII  \ (Text header)\<0><0>		     ;									      ;
P.ABN:	.ASCII  \ (File header)\<0><0>		     ;									      ;
P.ABO:	.ASCII  \ (EOF)\<0><0>			     ;									      ;
P.ABP:	.ASCII  \ (Error)\<0><0><0><0>		     ;									      ;
P.ABQ:	.ASCII  \ (Receive initiate)\<0>	     ;									      ;
P.ABR:	.ASCII  \ (Command)\<0><0>		     ;									      ;
P.ABS:	.ASCII  \ (Generic KERMIT command)\<0><0><0> ;									      ;
P.ABT:	.ASCII  \Message number: \<0><0><0><0>	     ;									      ;
P.ABU:	.ASCII  <9>\Length: \<0><0><0>		     ;									      ;
P.ABV:	.ASCII  \ (dec)\<0><0>			     ;									      ;
P.ABW:	.ASCII  \Message type: \<0><0>		     ;									      ;
P.ABX:	.ASCII  \Checksum: \<0><0>		     ;									      ;
P.ABY:	.ASCII  \ = \<0>			     ;									      ;
P.ABZ:	.ASCII  \Optional data: \<0>		     ;									      ;
P.ACA:	.ASCII  \ "\<0><0>			     ;									      ;

U.103=		    P.ABH
U.104=		    P.ABI
U.105=		    P.ABJ
U.106=		    P.ABK
U.107=		    P.ABL
U.108=		    P.ABM
U.109=		    P.ABN
U.110=		    P.ABO
U.111=		    P.ABP
U.112=		    P.ABQ
U.113=		    P.ABR
U.114=		    P.ABS
U.115=		    P.ABT
U.116=		    P.ABU
U.117=		    P.ABV
U.118=		    P.ABW
U.119=		    P.ABX
U.120=		    P.ABY
U.121=		    P.ABZ
U.122=		    P.ACA


	.PSECT  $CODE$,NOWRT,2

;DBG_MESSAGE
U.34:	.WORD   ^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>  ;Save R2,R3,R4,R5,R6,R7,R8,R9,R10,R11				      ; 6508
	MOVAB   W^TT_CHAR, R11			     ;TT_CHAR, R11							      ;
	MOVAB   W^TT_TEXT, R10			     ;TT_TEXT, R10							      ;
	MOVAB   W^U.122, R9			     ;U.122, R9								      ;
	PUSHAB  W^DBG_DUMP			     ;DBG_DUMP								      ; 6593
	CALLS   #1, W^TT_SET_OUTPUT		     ;#1, TT_SET_OUTPUT							      ;
	MOVL    R0, R8				     ;R0, OLD_RTN							      ;
	MOVL    4(AP), R4			     ;MSG_ADDRESS, R4							      ; 6597
	MOVZBL  1(R4), R3			     ;1(R4), MSG_LEN							      ;
	SUBL2   #32, R3				     ;#32, MSG_LEN							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 6601
	PUSHAB  -88(R9)				     ;MN_TEXT								      ; 6602
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	MOVZBL  2(R4), -(SP)			     ;2(R4), -(SP)							      ; 6603
	SUBL2   #32, (SP)			     ;#32, (SP)								      ;
	CALLS   #1, W^TT_NUMBER			     ;#1, TT_NUMBER							      ;
	PUSHAB  -56(R9)				     ;DEC_TEXT								      ; 6604
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	PUSHAB  -68(R9)				     ;LENGTH_TEXT							      ; 6605
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	PUSHL   R3				     ;MSG_LEN								      ; 6606
	CALLS   #1, W^TT_NUMBER			     ;#1, TT_NUMBER							      ;
	PUSHAB  -56(R9)				     ;DEC_TEXT								      ; 6607
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 6608
	PUSHAB  -48(R9)				     ;MSG_TYP_TEXT							      ; 6612
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	MOVZBL  3(R4), R2			     ;3(R4), R2								      ; 6613
	PUSHL   R2				     ;R2								      ;
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
	CMPB    R2, #68				     ;R2, #68								      ; 6618
	BNEQ    1$				     ;1$								      ;
	PUSHAB  -252(R9)			     ;DATA_TEXT								      ; 6619
	BRB     11$				     ;11$								      ;
1$:	CMPB    R2, #89				     ;R2, #89								      ; 6621
	BNEQ    2$				     ;2$								      ;
	PUSHAB  -244(R9)			     ;ACK_TEXT								      ; 6622
	BRB     11$				     ;11$								      ;
2$:	CMPB    R2, #78				     ;R2, #78								      ; 6624
	BNEQ    3$				     ;3$								      ;
	PUSHAB  -236(R9)			     ;NAK_TEXT								      ; 6625
	BRB     11$				     ;11$								      ;
3$:	CMPB    R2, #83				     ;R2, #83								      ; 6627
	BNEQ    4$				     ;4$								      ;
	PUSHAB  -228(R9)			     ;SND_INIT_TEXT							      ; 6628
	BRB     11$				     ;11$								      ;
4$:	CMPB    R2, #66				     ;R2, #66								      ; 6630
	BNEQ    5$				     ;5$								      ;
	PUSHAB  -212(R9)			     ;BREAK_TEXT							      ; 6631
	BRB     11$				     ;11$								      ;
5$:	CMPB    R2, #70				     ;R2, #70								      ; 6633
	BNEQ    6$				     ;6$								      ;
	PUSHAB  -184(R9)			     ;FILE_TEXT								      ; 6634
	BRB     11$				     ;11$								      ;
6$:	CMPB    R2, #88				     ;R2, #88								      ; 6636
	BNEQ    7$				     ;7$								      ;
	PUSHAB  -200(R9)			     ;TEXT_TEXT								      ; 6637
	BRB     11$				     ;11$								      ;
7$:	CMPB    R2, #90				     ;R2, #90								      ; 6639
	BNEQ    8$				     ;8$								      ;
	PUSHAB  -168(R9)			     ;EOF_TEXT								      ; 6640
	BRB     11$				     ;11$								      ;
8$:	CMPB    R2, #69				     ;R2, #69								      ; 6642
	BNEQ    9$				     ;9$								      ;
	PUSHAB  -160(R9)			     ;ERROR_TEXT							      ; 6643
	BRB     11$				     ;11$								      ;
9$:	CMPB    R2, #71				     ;R2, #71								      ; 6645
	BNEQ    10$				     ;10$								      ;
	PUSHAB  -116(R9)			     ;KERMIT_TEXT							      ; 6646
	BRB     11$				     ;11$								      ;
10$:	CMPB    R2, #67				     ;R2, #67								      ; 6648
	BNEQ    12$				     ;12$								      ;
	PUSHAB  -128(R9)			     ;COMMAND_TEXT							      ; 6649
11$:	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
12$:	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 6652
	MOVAB   -3(R3), R6			     ;-3(R3), R6							      ; 6657
	SUBL3   #49, W^U.46, R0			     ;#49, U.46, R0							      ;
	CMPL    R6, R0				     ;R6, R0								      ;
	BEQL    17$				     ;17$								      ;
	PUSHAB  -16(R9)				     ;OPT_DATA_TEXT							      ; 6660
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 6661
	MOVAB   4(R4), R2			     ;4(R4), TEMP_POINTER						      ; 6662
	SUBL3   W^U.46, R6, R0			     ;U.46, R6, R0							      ; 6664
	MOVAB   49(R0), R7			     ;49(R0), R7							      ;
	CLRL    R5				     ;I									      ;
	BRB     15$				     ;15$								      ;
13$:	EMUL    #1, R5, #0, -(SP)		     ;#1, I, #0, -(SP)							      ; 6667
	EDIV    #10, (SP)+, R0, R0		     ;#10, (SP)+, R0, R0						      ;
	CMPL    R0, #1				     ;R0, #1								      ;
	BNEQ    14$				     ;14$								      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 6670
	PUSHL   #9				     ;#9								      ; 6671
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
14$:	PUSHL   R9				     ;R9								      ; 6674
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	MOVZBL  (R2)+, -(SP)			     ;(TEMP_POINTER)+, -(SP)						      ; 6675
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
	PUSHL   #34				     ;#34								      ; 6676
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
15$:	AOBLEQ  R7, R5, 13$			     ;R7, I, 13$							      ; 6664
	SUBL3   W^U.46, R6, R0			     ;U.46, R6, R0							      ; 6679
	EMUL    #1, R0, #49, -(SP)		     ;#1, R0, #49, -(SP)						      ;
	EDIV    #10, (SP)+, R0, R0		     ;#10, (SP)+, R0, R0						      ;
	CMPL    R0, #1				     ;R0, #1								      ;
	BNEQ    16$				     ;16$								      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ;
16$:	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 6681
17$:	PUSHAB  -32(R9)				     ;CHKSUM_TEXT							      ; 6688
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	SUBL2   W^U.46, R3			     ;U.46, R3								      ; 6690
	MOVAB   50(R3)[R4], R2			     ;50(R3)[R4], TEMP_POINTER						      ;
	CASEL   W^U.46, #49, #2			     ;U.46, #49, #2							      ; 6692
18$:	.WORD   19$-18$,-			     ;19$-18$,-								      ;
		20$-18$,-			     ;20$-18$,-								      ;
		21$-18$				     ;21$-18$								      ;
19$:	PUSHL   R9				     ;R9								      ; 6697
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	MOVZBL  (R2), -(SP)			     ;(TEMP_POINTER), -(SP)						      ; 6698
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
	PUSHL   #34				     ;#34								      ; 6699
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
	MOVZBL  (R2), R3			     ;(TEMP_POINTER), CHKSUM						      ; 6700
	SUBL2   #32, R3				     ;#32, CHKSUM							      ;
	BRB     23$				     ;23$								      ; 6692
20$:	CLRL    R3				     ;CHKSUM								      ; 6705
	BRB     22$				     ;22$								      ; 6706
21$:	CLRL    R3				     ;CHKSUM								      ; 6718
	PUSHL   R9				     ;R9								      ; 6719
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	MOVZBL  (R2), -(SP)			     ;(TEMP_POINTER), -(SP)						      ; 6720
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
	PUSHL   #34				     ;#34								      ; 6721
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
	MOVZBL  (R2)+, R0			     ;(TEMP_POINTER)+, R0						      ; 6722
	MOVAB   -32(R0), R1			     ;-32(R0), R1							      ;
	INSV    R1, #12, #4, R3			     ;R1, #12, #4, CHKSUM						      ;
22$:	PUSHL   R9				     ;R9								      ; 6723
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	MOVZBL  (R2), -(SP)			     ;(TEMP_POINTER), -(SP)						      ; 6724
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
	PUSHL   #34				     ;#34								      ; 6725
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
	MOVZBL  (R2)+, R0			     ;(TEMP_POINTER)+, R0						      ; 6726
	MOVAB   -32(R0), R1			     ;-32(R0), R1							      ;
	INSV    R1, #6, #6, R3			     ;R1, #6, #6, CHKSUM						      ;
	PUSHL   R9				     ;R9								      ; 6727
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	MOVZBL  (R2), -(SP)			     ;(TEMP_POINTER), -(SP)						      ; 6728
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
	PUSHL   #34				     ;#34								      ; 6729
	CALLS   #1, (R11)			     ;#1, TT_CHAR							      ;
	MOVZBL  (R2), R0			     ;(TEMP_POINTER), R0						      ; 6730
	SUBL2   #32, R0				     ;#32, R0								      ;
	INSV    R0, #0, #6, R3			     ;R0, #0, #6, CHKSUM						      ;
23$:	PUSHAB  -20(R9)				     ;CHKSUM_NUM_TEXT							      ; 6734
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	PUSHL   R3				     ;CHKSUM								      ; 6735
	CALLS   #1, W^TT_NUMBER			     ;#1, TT_NUMBER							      ;
	PUSHAB  -56(R9)				     ;DEC_TEXT								      ; 6736
	CALLS   #1, (R10)			     ;#1, TT_TEXT							      ;
	CALLS   #0, W^TT_CRLF			     ;#0, TT_CRLF							      ; 6737
	PUSHL   R8				     ;OLD_RTN								      ; 6738
	CALLS   #1, W^TT_SET_OUTPUT		     ;#1, TT_SET_OUTPUT							      ;
	RET     				     ;									      ; 6739

; Routine Size:  537 bytes,    Routine Base:  $CODE$ + 2400


;   6740  1	%SBTTL 'End of KERMSG'
;   6741  1	END
;   6742  1	
;   6743  0	ELUDOM






;				       PSECT SUMMARY
;
;	Name			 Bytes			       Attributes
;
;  $OWN$			      404  NOVEC,  WRT,  RD ,NOEXE,NOSHR,  LCL,  REL,  CON,NOPIC,ALIGN(2)
;  $CODE$			     9753  NOVEC,NOWRT,  RD ,  EXE,NOSHR,  LCL,  REL,  CON,NOPIC,ALIGN(2)
;  .  ABS  .			        0  NOVEC,NOWRT,NORD ,NOEXE,NOSHR,  LCL,  ABS,  CON,NOPIC,ALIGN(0)
;  $PLIT$			      852  NOVEC,NOWRT,  RD ,NOEXE,NOSHR,  LCL,  REL,  CON,NOPIC,ALIGN(2)




;				Library Statistics
;
;					     -------- Symbols --------	    Pages	Processing
;	File				     Total    Loaded   Percent      Mapped	Time
;
;  SYS$COMMON:[SYSLIB]STARLET.L32;1	      9776         4         0       581          00:00.8







;					COMMAND QUALIFIERS

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

; Compilation Complete

	.END
