home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / d / k10msg.mac < prev    next >
Text File  |  2020-01-01  |  333KB  |  11,470 lines

  1. ;   0001  0    %TITLE 'KERMSG - Kermit message processing'
  2. ;   0002  0    MODULE KERMSG (IDENT = '3.3.109'
  3. ;   0003  0            ) =
  4. ;   0004  1    BEGIN
  5. ;   0005  1    
  6. ;   0006  1    SWITCHES LANGUAGE (COMMON);
  7. ;   0007  1    
  8. ;   0008  1    !<BLF/WIDTH:100>
  9. ;   0009  1    
  10. ;   0010  1    !++
  11. ;   0011  1    ! FACILITY:
  12. ;   0012  1    !   Kermit-10, VMS Kermit, Pro/Kermit
  13. ;   0013  1    !
  14. ;   0014  1    ! ABSTRACT:
  15. ;   0015  1    !    KERMSG is the message processing routines for Kermit-10, VMS Kermit,
  16. ;   0016  1    !    and PRO/Kermit.
  17. ;   0017  1    !    This module is written in common BLISS, so that it can be
  18. ;   0018  1    !    transported for the DECsystem-10 and VAX/VMS systems.
  19. ;   0019  1    !
  20. ;   0020  1    ! ENVIRONMENT:
  21. ;   0021  1    !   User mode
  22. ;   0022  1    !
  23. ;   0023  1    ! AUTHOR: Robert C. McQueen, CREATION DATE: 24-January-1983
  24. ;   0024  1    !
  25. ;   0025  1    ! MODIFIED BY:
  26. ;   0026  1    !
  27. ;   0027  1    !--
  28. ;   0028  1    
  29. ;   0029  1    %SBTTL 'Table of Contents'
  30. ;   0030  1    !+
  31. ;   0031  1    !.pag.lit
  32. ;   0032  1    !        Table of Contents for KERMSG
  33. ;   0033  1    !
  34. ;   0034  1    !
  35. ;   0035  1    !               Section                  Page
  36. ;   0036  1    !   1. Revision History . . . . . . . . . . . . . . . . . . .    3
  37. ;   0037  1    !   2. Interface requirements . . . . . . . . . . . . . . . .    4
  38. ;   0038  1    !   3. Declarations
  39. ;   0039  1    !        3.1.   Forward definitions . . . . . . . . . . . . .    5
  40. ;   0040  1    !   4. Require files. . . . . . . . . . . . . . . . . . . . .   28
  41. ;   0041  1    !   5. Macro definitions. . . . . . . . . . . . . . . . . . .   29
  42. ;   0042  1    !   6. KERMIT Protocol Definitions. . . . . . . . . . . . . .   30
  43. ;   0043  1    !        6.1.   Packet offsets. . . . . . . . . . . . . . . .   31
  44. ;   0044  1    !        6.2.   Message dependent field . . . . . . . . . . .   32
  45. ;   0045  1    !        6.3.   SEND initiate packet. . . . . . . . . . . . .   33
  46. ;   0046  1    !   7. KERMIT Protocol States . . . . . . . . . . . . . . . .   34
  47. ;   0047  1    !   8. Internal constants . . . . . . . . . . . . . . . . . .   35
  48. ;   0048  1    !   9. Storage - External . . . . . . . . . . . . . . . . . .   36
  49. ;   0049  1    !  10. Storage - Local. . . . . . . . . . . . . . . . . . . .   37
  50. ;   0050  1    !  11. External references. . . . . . . . . . . . . . . . . .   38
  51. ;   0051  1    !  12. MSG%INIT . . . . . . . . . . . . . . . . . . . . . . .   39
  52. ;   0052  1    !  13. SND%ERROR. . . . . . . . . . . . . . . . . . . . . . .   40
  53. ;   0053  1    !  14. SERVER - Server mode . . . . . . . . . . . . . . . . .   41
  54. ;   0054  1    !  15. SEND%SWITCH. . . . . . . . . . . . . . . . . . . . . .   42
  55. ;   0055  1    !  16. REC%SWITCH . . . . . . . . . . . . . . . . . . . . . .   43
  56. ;   0056  1    !  17. Server
  57. ;   0057  1    !       17.1.   DO%GENERIC - Execute a generic command. . . .   44
  58. ;   0058  1    !  18. DO%TRANSACTION - Main loop for FSM . . . . . . . . . .   45
  59. ;   0059  1    !  19. REC%SERVER%IDLE - Idle server state. . . . . . . . . .   46
  60. ;   0060  1    !  20. SEND%SERVER%INIT . . . . . . . . . . . . . . . . . . .   47
  61. ;   0061  1    !  21. SEND%DATA. . . . . . . . . . . . . . . . . . . . . . .   48
  62. ;   0062  1    !  22. SEND%FILE. . . . . . . . . . . . . . . . . . . . . . .   49
  63. ;   0063  1    !  23. SEND%EOF . . . . . . . . . . . . . . . . . . . . . . .   50
  64. ;   0064  1    !  24. SEND%INIT. . . . . . . . . . . . . . . . . . . . . . .   51
  65. ;   0065  1    !  25. SEND%OPEN%FILE - Open file for sending . . . . . . . .   52
  66. ;   0066  1    !  26. SEND%GENCMD. . . . . . . . . . . . . . . . . . . . . .   53
  67. ;   0067  1    !  27. SEND%BREAK . . . . . . . . . . . . . . . . . . . . . .   54
  68. ;   0068  1    !  28. REC%INIT . . . . . . . . . . . . . . . . . . . . . . .   55
  69. ;   0069  1    !  29. REC%FILE . . . . . . . . . . . . . . . . . . . . . . .   56
  70. ;   0070  1    !  30. REC%DATA . . . . . . . . . . . . . . . . . . . . . . .   57
  71. ;   0071  1    !  31. SERVER - Generic commands. . . . . . . . . . . . . . .   58
  72. ;   0072  1    !  32. HOST%COMMAND - perform a host command. . . . . . . . .   59
  73. ;   0073  1    !  33. CALL%SY%RTN - handle operating system dependent functions  60
  74. ;   0074  1    !  34. Message processing
  75. ;   0075  1    !       34.1.   PRS%SEND%INIT - Parse send init params. . . .   61
  76. ;   0076  1    !  35. SET%SEND%INIT. . . . . . . . . . . . . . . . . . . . .   62
  77. ;   0077  1    !  36. SEND%PACKET. . . . . . . . . . . . . . . . . . . . . .   63
  78. ;   0078  1    !  37. REC%MESSAGE - Receive a message. . . . . . . . . . . .   64
  79. ;   0079  1    !  38. REC%PACKET . . . . . . . . . . . . . . . . . . . . . .   65
  80. ;   0080  1    !  39. CALC%BLOCK%CHECK . . . . . . . . . . . . . . . . . . .   66
  81. ;   0081  1    !  40. NORMALIZE%FILE - Put file name into normal form. . . .   67
  82. ;   0082  1    !  41. Buffer filling
  83. ;   0083  1    !       41.1.   Main routine. . . . . . . . . . . . . . . . .   68
  84. ;   0084  1    !  42. BFR%EMPTY. . . . . . . . . . . . . . . . . . . . . . .   69
  85. ;   0085  1    !  43. Buffer filling and emptying subroutines. . . . . . . .   70
  86. ;   0086  1    !  44. Add parity routine . . . . . . . . . . . . . . . . . .   71
  87. ;   0087  1    !  45. Parity routine . . . . . . . . . . . . . . . . . . . .   72
  88. ;   0088  1    !  46. Per transfer
  89. ;   0089  1    !       46.1.   Initialization. . . . . . . . . . . . . . . .   73
  90. ;   0090  1    !  47. Statistics
  91. ;   0091  1    !       47.1.   Finish message transfer . . . . . . . . . . .   74
  92. ;   0092  1    !  48. Status type out
  93. ;   0093  1    !       48.1.   STS%OUTPUT. . . . . . . . . . . . . . . . . .   75
  94. ;   0094  1    !  49. TYPE%CHAR - Type out a character . . . . . . . . . . .   76
  95. ;   0095  1    !  50. Debugging
  96. ;   0096  1    !       50.1.   DBG%SEND. . . . . . . . . . . . . . . . . . .   77
  97. ;   0097  1    !       50.2.   DBG%RECEIVE . . . . . . . . . . . . . . . . .   78
  98. ;   0098  1    !       50.3.   DBG%MESSAGE . . . . . . . . . . . . . . . . .   79
  99. ;   0099  1    !  51. End of KERMSG. . . . . . . . . . . . . . . . . . . . .   80
  100. ;   0100  1    !.end lit.pag
  101. ;   0101  1    !-
  102. ;   0102  1    %SBTTL 'Revision History'
  103. ;   0103  1    
  104. ;   0104  1    !++
  105. ;   0105  1    ! Start of version 1.
  106. ;   0106  1    !
  107. ;   0107  1    ! 1.0.000    By: Robert C. McQueen        On: 4-Jan-1983
  108. ;   0108  1    !        Create this program.
  109. ;   0109  1    !
  110. ;   0110  1    ! 1.0.001    By: Robert C. McQueen        On: 30-Apr-1983
  111. ;   0111  1    !        Change PAR%xxx to be PR%xxx, so that they can be used for
  112. ;   0112  1    !        KERMIT-10.
  113. ;   0113  1    !
  114. ;   0114  1    ! 1.0.002    By: Robert C. McQueen        On: 1-May-1983
  115. ;   0115  1    !        Add DO%GENERIC routine to cause a generic Kermit command to
  116. ;   0116  1    !        be executed on the remote Kermit.
  117. ;   0117  1    !
  118. ;   0118  1    ! 1.0.003    By: Robert C. McQueen        On: 3-May-1983
  119. ;   0119  1    !        Fix message number incrementing.
  120. ;   0120  1    !
  121. ;   0121  1    ! 1.0.004    By: Robert C. McQueen        On: 4-May-1983
  122. ;   0122  1    !        Allow RECEIVE file-specification to work correctly.
  123. ;   0123  1    !
  124. ;   0124  1    ! 1.0.005    By: Robert C. McQueen        On: 6-May-1983
  125. ;   0125  1    !        Add more stats support.
  126. ;   0126  1    !
  127. ;   0127  1    ! 1.0.006    By: Nick Bush            On: 13-June-1983
  128. ;   0128  1    !        Fix SEND%PACKET to copy correct characters when fixing
  129. ;   0129  1    !        parity bits.
  130. ;   0130  1    !
  131. ;   0131  1    ! 1.1.007    By: Nick Bush            On: 15-July-1983
  132. ;   0132  1    !        Correct SEND-INIT message handling to do the right things
  133. ;   0133  1    !        with the protocol version 3 items.
  134. ;   0134  1    !
  135. ;   0135  1    ! 1.1.010    By: Robert C. McQueen        On: 20-July-1983
  136. ;   0136  1    !        Make PARITY a global routine, so that it can be called by
  137. ;   0137  1    !        CONNECT processing.  Change the name from PARITY to GEN%PARITY
  138. ;   0138  1    !        add a new routine to generate the parity, since it is not
  139. ;   0139  1    !        part of the checksum.
  140. ;   0140  1    !
  141. ;   0141  1    ! 1.1.011    By: Robert C. McQueen        On: 28-July-1983
  142. ;   0142  1    !        KER%TIMEOUT errors in the SERVER loop would cause
  143. ;   0143  1    !        KER%UNISRV error messages to be returned to the remote.
  144. ;   0144  1    !        Check for receive failures and send NAKs instead.
  145. ;   0145  1    !
  146. ;   0146  1    ! 1.2.012    By: Robert C. McQueen        On: 23-August-1983
  147. ;   0147  1    !        Don't abort if we get a message that is just an end of line
  148. ;   0148  1    !        character.  It could be noise on the line.
  149. ;   0149  1    !
  150. ;   0150  1    ! 1.2.013    By: Nick Bush            On: 7-September-1983
  151. ;   0151  1    !        Fix several problems with the SEND%xxx parameters
  152. ;   0152  1    !
  153. ;   0153  1    ! 1.2.014    By: Robert C. McQueen        On: 15-September-1983
  154. ;   0154  1    !        Add routine calls to XFR%STATUS to tell the user on the
  155. ;   0155  1    !        number of packets have changed.
  156. ;   0156  1    !
  157. ;   0157  1    ! 1.2.015    By: Nick Bush            On: 5-October-1983
  158. ;   0158  1    !        Add 2 and 3 character checksum (block check) support.
  159. ;   0159  1    !        Add support for data within acknowledgement packets
  160. ;   0160  1    !        and withing end-of-file packets to allow for file
  161. ;   0161  1    !        transmission to be aborted.  Also add support for
  162. ;   0162  1    !        "I" packet to allow server parameters to be initialized.
  163. ;   0163  1    !
  164. ;   0164  1    ! 1.2.016    By: Nick Bush            On: 19-October-1983
  165. ;   0165  1    !        Add repeat character support.
  166. ;   0166  1    !
  167. ;   0167  1    ! 2.0.017    Release TOPS-10 Kermit-10 version 2.0
  168. ;   0168  1    !        Release VAX/VMS Kermit-32 version 2.0
  169. ;   0169  1    !
  170. ;   0170  1    ! 2.0.018    By: Robert C. McQueen        On: 16-November-1983
  171. ;   0171  1    !        Fix four checks on the message number that were not
  172. ;   0172  1    !        mod 64.
  173. ;   0173  1    !
  174. ;   0174  1    ! 2.0.019    By: Robert C. McQueen        On: 16-November-1983
  175. ;   0175  1    !        Remove the CLEAR routine.  It is not really needed.
  176. ;   0176  1    !
  177. ;   0177  1    ! 2.0.020    By: Nick Bush            On: 12-Dec-1983
  178. ;   0178  1    !        Fix SEND%DATA and BFR%FILL to handle empty files and
  179. ;   0179  1    !        files which happen to end just on a message boundary.
  180. ;   0180  1    !        This would sometimes produce extra nulls.
  181. ;   0181  1    !
  182. ;   0182  1    ! 2.0.021    By: Nick Bush            On: 15-Dec-1983
  183. ;   0183  1    !        Fix some problems with REC%MESSAGE which would cause
  184. ;   0184  1    !        aborts when a message timed out.
  185. ;   0185  1    !
  186. ;   0186  1    ! 2.0.022    By: Robert C. McQueen        19-Dec-1983
  187. ;   0187  1    !        Make STATUS a local for most routines and remove FILE%DUMP
  188. ;   0188  1    !        as it is nolonger needed.
  189. ;   0189  1    !
  190. ;   0190  1    ! 2.0.023    By: Nick Bush            On: 3-Jan-1984
  191. ;   0191  1    !        Change FIL%NORMAL%FORM to contain not just a flag, but
  192. ;   0192  1    !        a file name type instead.
  193. ;   0193  1    !
  194. ;   0194  1    ! 2.0.024    By: Nick Bush            On: 11-Jan-1984
  195. ;   0195  1    !        Fix REC%MESSAGE to send NAK for packet we expect, not
  196. ;   0196  1    !        previous packet.
  197. ;   0197  1    !
  198. ;   0198  1    ! 2.0.025    By: Nick Bush            On: 23-Jan-1984
  199. ;   0199  1    !        Re-enable server-init packet and complete code so that
  200. ;   0200  1    !        parameters set by it will remain set.
  201. ;   0201  1    !        Fix file name copying to use BFR%FILL or BFR%EMPTY
  202. ;   0202  1    !        so that all quoting/compression is done properly.
  203. ;   0203  1    !
  204. ;   0204  1    ! 2.0.026    By: Nick Bush            On: 15-Feb-1984
  205. ;   0205  1    !        Add code for generic command support (both directions).
  206. ;   0206  1    !        There is now only one state dispatch loop, entered
  207. ;   0207  1    !        in various states for different functions.
  208. ;   0208  1    !
  209. ;   0209  1    ! 2.0.027    By: Robert C. McQueen        On: 16-Feb-1984
  210. ;   0210  1    !        At some point SEND%TIMEOUT became global, but it was not moved
  211. ;   0211  1    !        to KERGLB.  This edit moves it to KERGLB.BLI.
  212. ;   0212  1    !
  213. ;   0213  1    ! 2.0.030    By: Nick Bush            On: 2-March-1984
  214. ;   0214  1    !        Fix BFR%FILL to handle case of last repeated character
  215. ;   0215  1    !        not fitting within a packet.  It was forgetting to
  216. ;   0216  1    !        send the characters at all.
  217. ;   0217  1    !
  218. ;   0218  1    ! 2.0.031    By: Nick Bush            On: 6-March-1984
  219. ;   0219  1    !        Make sure FILE%OPEN%FLAG is set properly when advancing
  220. ;   0220  1    !        to next file of a wild-card send.  The file was not
  221. ;   0221  1    !        being set true, leading to problems after a couple files.
  222. ;   0222  1    !
  223. ;   0223  1    ! 2.0.032    By: Nick Bush            On: 9-March-1984
  224. ;   0224  1    !        Fix UNPACK%DATA in SERVER%GENERIC to properly store
  225. ;   0225  1    !        new string pointer.
  226. ;   0226  1    !
  227. ;   0227  1    ! 2.0.033    By: Robert C. McQueen        On: 12-March-1984
  228. ;   0228  1    !        If NEXT%FILE fails with anything other than a NOMORFILES
  229. ;   0229  1    !        it should change state to STATE%A not STATE%SB.  This
  230. ;   0230  1    !        fixes a problem caused by Pro/Kermit and KERFIL (VMS).
  231. ;   0231  1    !
  232. ;   0232  1    ! 2.0.034    By: Nick Bush            On: 15-March-1984
  233. ;   0233  1    !        Put file spec into X packet as well as F packet. This
  234. ;   0234  1    !        makes wild card TYPE's work nicer.
  235. ;   0235  1    !
  236. ;   0236  1    ! 2.0.035    By: Nick Bush            On: 20-March-1984
  237. ;   0237  1    !        Fix send/receive quoting to conform to the way the
  238. ;   0238  1    !        protocol manual says it should be done, rather
  239. ;   0239  1    !        than the way we (and Kermit-20) have always done it.
  240. ;   0240  1    !
  241. ;   0241  1    ! 2.0.036    By: Nick Bush            On: 28-March-1984
  242. ;   0242  1    !        Make SERVER%GENERIC more defensive against badly
  243. ;   0243  1    !        constructed packets.  If an argument has negative
  244. ;   0244  1    !        length, punt the request.  Also put angle brackets
  245. ;   0245  1    !        around data from "X" packet header, so file names will
  246. ;   0246  1    !        stick out.
  247. ;   0247  1    !
  248. ;   0248  1    ! 3.0.037    Start of version 3.
  249. ;   0249  1    !
  250. ;   0250  1    ! 3.0.040    By: Nick Bush            On: 2-April-1984
  251. ;   0251  1    !        Add separate server timeout.  This allows stopping the
  252. ;   0252  1    !        server NAK's without affecting the normal packet timeout.
  253. ;   0253  1    !
  254. ;   0254  1    ! 3.0.041    By: Nick Bush            On: 12-April-1984
  255. ;   0255  1    !        Fix block check calculation to account for the fact
  256. ;   0256  1    !        that the parity bits are put onto the message when
  257. ;   0257  1    !        it is sent (in place), so that if a retransmission is
  258. ;   0258  1    !        done without refilling the buffer (as is normal with
  259. ;   0259  1    !        data messages), the parity bits will be there.  Make
  260. ;   0260  1    !        sure we strip them out for block check calculation.
  261. ;   0261  1    !
  262. ;   0262  1    ! 3.1.042    By: Nick Bush            On: 27-August-1984
  263. ;   0263  1    !        If we get too many retries when sending a server init (I)
  264. ;   0264  1    !        packet, don't abort.  Instead, just try sending the server
  265. ;   0265  1    !        command, since the Kermit on the other end might be coded
  266. ;   0266  1    !        wrong and is responding to packets it doesn't understand
  267. ;   0267  1    !        with a NAK.
  268. ;   0268  1    !
  269. ;   0269  1    ! 3.1.043    By: Nick Bush            On: 27-August-1984
  270. ;   0270  1    !        Don't abort receives on zero length messages.  Just treat
  271. ;   0271  1    !        it like a timeout.
  272. ;   0272  1    !
  273. ;   0273  1    ! 3.1.044    By: Nick Bush            On: 10-April-1985
  274. ;   0274  1    !        Remove IBM mode.  It will be instituted by IBM%CHAR being
  275. ;   0275  1    !        set >= 0 if handshaking is needed.
  276. ;   0276  1    !
  277. ;   0277  1    ! 3.1.045    BY: David Stevens        On: 15-July-1985
  278. ;   0278  1    !        Fix terminal message for multiple file sendings. Type out
  279. ;   0279  1    !        "Sending: " in the system dependent NEXT%FILE routine.
  280. ;   0280  1    !
  281. ;   0281  1    ! Start of version 3.2
  282. ;   0282  1    !
  283. ;   0283  1    ! 3.2.070    By: Robert McQueen        On: 17-Dec-1985
  284. ;   0284  1    !        Fix CRC calculations when sending 8 bit data and not
  285. ;   0285  1    !        using 8 bit quoting.
  286. ;   0286  1    !
  287. ;   0287  1    ! 3.2.071    By: Robert McQueen        On: 11-March-186
  288. ;   0288  1    !        Include space in the message buffer for the line termination
  289. ;   0289  1    !        character.
  290. ;   0290  1    !
  291. ;   0291  1    ! 3.3.100    By: Gregory P. Welsh        On: 1-June-1986
  292. ;   0292  1    !        Made FILE%OPEN%FLAG GLOBAL so it could be updated properly for
  293. ;   0293  1    !        Transmit function from module KERTRM. Also renamed it to
  294. ;   0294  1    !        FFILE%OPEN%FLAG so it could be distinguished externally from
  295. ;   0295  1    !        routine FILE%OPEN.
  296. ;   0296  1    !
  297. ;   0297  1    ! 3.3.104    By: Robert McQueen            On: 5-July-1986
  298. ;   0298  1    !        Add changes/fixes suggested by Art Guion and David Deley for
  299. ;   0299  1    !        KERMSG.BLI.
  300. ;   0300  1    !        - Always attempt a handshake in IBM mode.  Failing to handshake
  301. ;   0301  1    !          may cause 3704/5 style controller to hang a VM system.
  302. ;   0302  1    !        - Don't lose the last character in a buffer.   BFR%FILL logic
  303. ;   0303  1    !          forgets to send the last cahracters of a file when it doesn't
  304. ;   0304  1    !          fit into the current packet.
  305. ;   0305  1    !
  306. ;   0306  1    ! 3.3.107    By: Antonino N. Mione            On: 8-Sep-1986
  307. ;   0307  1    !        Do not abort on ERROR packet while in SERVER mode. Instead,
  308. ;   0308  1    !        return to SERVER IDLE mode.
  309. ;   0309  1    !
  310. ;   0310  1    ! 3.3.108    By: Dan Norstedt        On: 17-June-1989
  311. ;   0311  1    !        Added sketchy support for Extended Length packets;
  312. ;   0312  1    !        Header parity is computed, but not used.
  313. ;   0313  1    !        Undone 3.3.107, to allow for Ctrl-Cs to work properly
  314. ;   0314  1    !
  315. ;   0315  1    ! 3.3.109    By: Nick Bush            On: 24-April-2006
  316. ;   0316  1    !        Added comment to line fixed by Mike Freeman many
  317. ;   0317  1    !        years ago to officialize the edit history. The fix
  318. ;   0318  1    !        corrected the CRC support to handle parity settings
  319. ;   0319  1    !        properly.
  320. ;   0320  1    !--
  321. ;   0321  1    
  322. ;   0322  1    %SBTTL 'Interface requirements'
  323. ;   0323  1    
  324. ;   0324  1    !++
  325. ;   0325  1    !        Interface requirements
  326. ;   0326  1    !
  327. ;   0327  1    ! The following routines and data locations are rquired for a correct
  328. ;   0328  1    ! implementation of KERMIT.
  329. ;   0329  1    !
  330. ;   0330  1    ! File routines:
  331. ;   0331  1    !
  332. ;   0332  1    !    FILE%OPEN (Function)
  333. ;   0333  1    !        This routine will open a file for reading or writting.  It
  334. ;   0334  1    !        will assume that FILE%SIZE contains the number of bytes
  335. ;   0335  1    !        and FILE%NAME contains the file name of length FILE%SIZE.
  336. ;   0336  1    !        The function that is passed is either FNC%READ or FNC%WRITE.
  337. ;   0337  1    !
  338. ;   0338  1    !    FILE%CLOSE ()
  339. ;   0339  1    !        This routine will close the currently open file.  This
  340. ;   0340  1    !        routine will return the status of the operation.
  341. ;   0341  1    !
  342. ;   0342  1    !    GET%FILE (Character)
  343. ;   0343  1    !        This routine will get a character from the currently open file
  344. ;   0344  1    !        and store it in the location specified by "Character".  There
  345. ;   0345  1    !        will be a true/false value returned by the routine to determine
  346. ;   0346  1    !        if there was an error.
  347. ;   0347  1    !
  348. ;   0348  1    !    PUT%FILE (Character)
  349. ;   0349  1    !        This routine will output a character to the currently open
  350. ;   0350  1    !        file.  It will return a true/false value to determine if the
  351. ;   0351  1    !        routine was successful.
  352. ;   0352  1    !
  353. ;   0353  1    !    NEXT%FILE ()
  354. ;   0354  1    !        This routine will advance to the next file.  This routine
  355. ;   0355  1    !        will return false if there are no more files to process.
  356. ;   0356  1    !
  357. ;   0357  1    ! Communications line routines:
  358. ;   0358  1    !
  359. ;   0359  1    !    RECEIVE (Buffer address, Address of var to store length into)
  360. ;   0360  1    !        This routine will receive a message from the remote Kermit.
  361. ;   0361  1    !
  362. ;   0362  1    !    SEND (Buffer address, Length in characters)
  363. ;   0363  1    !        This routine will send a message to the remote Kermit.
  364. ;   0364  1    !
  365. ;   0365  1    !    GEN%CRC (Buffer address, length in characters)
  366. ;   0366  1    !        This routine will calculate the CRC-CCITT for the characters
  367. ;   0367  1    !        in the buffer.
  368. ;   0368  1    !
  369. ;   0369  1    ! Operating system routines:
  370. ;   0370  1    !
  371. ;   0371  1    !    SY%DISMISS (Seconds)
  372. ;   0372  1    !        This routine will cause Kermit to sleep for the specified
  373. ;   0373  1    !        number of seconds.  It is used to handle the DELAY parameter.
  374. ;   0374  1    !
  375. ;   0375  1    !    SY%LOGOUT ()
  376. ;   0376  1    !        Log the job off of the system. (Kill the process).
  377. ;   0377  1    !
  378. ;   0378  1    !    SY%TIME ()
  379. ;   0379  1    !        This routine will return the starting time milliseconds.
  380. ;   0380  1    !        It can be the start of Kermit, the system, etc, so long
  381. ;   0381  1    !        as it always is incrementing.
  382. ;   0382  1    !
  383. ;   0383  1    ! Status routines:
  384. ;   0384  1    !
  385. ;   0385  1    !    XFR%STATUS (Type, Subtype);
  386. ;   0386  1    !        This routine is called to indicate the occurance of
  387. ;   0387  1    !        a significant event that the user interface may wish
  388. ;   0388  1    !        to inform the user about.  The arguments indicate the
  389. ;   0389  1    !        type of event.
  390. ;   0390  1    !        Type: "S" - Send, "R" - Receive
  391. ;   0391  1    !            Subtype: "P" - Packet
  392. ;   0392  1    !                 "N" - NAK
  393. ;   0393  1    !                 "T" - timeout
  394. ;   0394  1    !        For type = "I" (initiate), "T" (terminate):
  395. ;   0395  1    !            Subtype: "S" - a file send
  396. ;   0396  1    !                 "R" - a file receive
  397. ;   0397  1    !                 "G" - a generic command
  398. ;   0398  1    !                 "I" - for "T" only, returning to server idle
  399. ;   0399  1    !        For type = "F" (file operation):
  400. ;   0400  1    !            Subtype: "S" - open for sending
  401. ;   0401  1    !                 "R" - open for receiving
  402. ;   0402  1    !                 "C" - closing file OK
  403. ;   0403  1    !                 "X" - aborting file by user request
  404. ;   0404  1    !                 "Z" - aborting group by user request
  405. ;   0405  1    !                 "D" - aborting file, but saving due to disposition
  406. ;   0406  1    !                 "A" - aborting file due to protocol error
  407. ;   0407  1    !
  408. ;   0408  1    ! Error processing:
  409. ;   0409  1    !
  410. ;   0410  1    !    KRM%ERROR (Error parameter)
  411. ;   0411  1    !        This routine will cause an error message to be issued.
  412. ;   0412  1    !        The error parameter is defined by KERERR.  This may cause
  413. ;   0413  1    !        SND%ERROR to be called to send an "E" message to the remote.
  414. ;   0414  1    !
  415. ;   0415  1    ! Terminal I/O routines:
  416. ;   0416  1    !
  417. ;   0417  1    !    TERM%DUMP (Buffer, Count)
  418. ;   0418  1    !    DBG%DUMP (Buffer, Count)
  419. ;   0419  1    !        This routine will dump the buffer onto the user's terminal.
  420. ;   0420  1    !        The routine is supplied with the count of the characters
  421. ;   0421  1    !        and the address of the buffer.
  422. ;   0422  1    !        These may be the same routine or different.  DBG%DUMP
  423. ;   0423  1    !        is only called for debugging output.
  424. ;   0424  1    !
  425. ;   0425  1    !
  426. ;   0426  1    !            ENTRY POINTS
  427. ;   0427  1    !
  428. ;   0428  1    ! KERMSG contains the following entry points for the KERMIT.
  429. ;   0429  1    !
  430. ;   0430  1    !    SERVER ()
  431. ;   0431  1    !        This routine will cause KERMIT go enter server mode.
  432. ;   0432  1    !
  433. ;   0433  1    !    SEND%SWITCH ()
  434. ;   0434  1    !        This routine will send a file.  It expects that the user
  435. ;   0435  1    !        has stored the text of the file name into FILE%NAME and
  436. ;   0436  1    !        the length of the text into FILE%SIZE.
  437. ;   0437  1    !
  438. ;   0438  1    !    REC%SWITCH ()
  439. ;   0439  1    !        This routine will receive a file.  It expects that the default
  440. ;   0440  1    !        file name is set up in FILE%NAME and the length is in
  441. ;   0441  1    !        FILE%SIZE.
  442. ;   0442  1    !
  443. ;   0443  1    !    GEN%PARITY (Character)
  444. ;   0444  1    !        This routine will return the character with the proper parity
  445. ;   0445  1    !        on the character.
  446. ;   0446  1    !
  447. ;   0447  1    !    SND%ERROR (COUNT, ADDRESS)
  448. ;   0448  1    !        This routine will send the text of an error to the remote
  449. ;   0449  1    !        Kermit.
  450. ;   0450  1    !
  451. ;   0451  1    !    DO%GENERIC (TYPE)
  452. ;   0452  1    !        This routine will cause a generic function to be sent to
  453. ;   0453  1    !        the remote Kermit.  This routine will then do all of the
  454. ;   0454  1    !        necessary hand shaking to handle the local end of the generic
  455. ;   0455  1    !        Kermit command.
  456. ;   0456  1    !
  457. ;   0457  1    !
  458. ;   0458  1    !        GLOBAL Storage
  459. ;   0459  1    !
  460. ;   0460  1    ! The following are the global storage locations that are used to interface
  461. ;   0461  1    ! to KERMSG.  These locations contains the various send and receive parameters.
  462. ;   0462  1    !
  463. ;   0463  1    ! Receive parameters:
  464. ;   0464  1    !
  465. ;   0465  1    !    RCV%PKT%SIZE
  466. ;   0466  1    !        Receive packet size.
  467. ;   0467  1    !    RCV%NPAD
  468. ;   0468  1    !        Padding length
  469. ;   0469  1    !    RCV%PADCHAR
  470. ;   0470  1    !        Padding character
  471. ;   0471  1    !    RCV%TIMEOUT
  472. ;   0472  1    !        Time out
  473. ;   0473  1    !    RCV%EOL
  474. ;   0474  1    !        End of line character
  475. ;   0475  1    !    RCV%QUOTE%CHR
  476. ;   0476  1    !        Quote character
  477. ;   0477  1    !    RCV%8QUOTE%CHR
  478. ;   0478  1    !        8-bit quoting character
  479. ;   0479  1    !    RCV%SOH
  480. ;   0480  1    !        Start of header character
  481. ;   0481  1    !
  482. ;   0482  1    ! Send parameters (Negative values denote the default, positive user supplied):
  483. ;   0483  1    !
  484. ;   0484  1    !    SND%PKT%SIZE
  485. ;   0485  1    !        Send packet size
  486. ;   0486  1    !    SND%NPAD
  487. ;   0487  1    !        Padding length
  488. ;   0488  1    !    SND%PADCHAR
  489. ;   0489  1    !        Padding character
  490. ;   0490  1    !    SND%TIMEOUT
  491. ;   0491  1    !        Time out
  492. ;   0492  1    !    SND%EOL
  493. ;   0493  1    !        End of line character
  494. ;   0494  1    !    SND%QUOTE%CHR
  495. ;   0495  1    !        Quote character
  496. ;   0496  1    !    SND%SOH
  497. ;   0497  1    !        Start of header character (normally 001)
  498. ;   0498  1    !
  499. ;   0499  1    ! Statistics:
  500. ;   0500  1    !
  501. ;   0501  1    !    SND%TOTAL%CHARS
  502. ;   0502  1    !        Total characters sent for this Kermit session
  503. ;   0503  1    !    RCV%TOTAL%CHARS
  504. ;   0504  1    !        Total characters received for this Kermit session
  505. ;   0505  1    !    SND%DATA%CHARS
  506. ;   0506  1    !        Total number of data characters sent for this Kermit session
  507. ;   0507  1    !    RCV%DATA%CHARS
  508. ;   0508  1    !        Total number of data characters received for this Kermit session
  509. ;   0509  1    !    SND%COUNT
  510. ;   0510  1    !        Total number of packets that have been sent
  511. ;   0511  1    !    RCV%COUNT
  512. ;   0512  1    !        Total number of packets that have been received.
  513. ;   0513  1    !    SMSG%TOTAL%CHARS
  514. ;   0514  1    !        Total characters sent for this file transfer
  515. ;   0515  1    !    RMSG%TOTAL%CHARS
  516. ;   0516  1    !        Total characters received for this file transfer
  517. ;   0517  1    !    SMSG%DATA%CHARS
  518. ;   0518  1    !        Total data characters sent for this file transfer
  519. ;   0519  1    !    RMSG%DATA%CHARS
  520. ;   0520  1    !        Total data characters received for this file transfer
  521. ;   0521  1    !    SMSG%NAKS
  522. ;   0522  1    !        Total number of NAKs sent for this file transfer
  523. ;   0523  1    !    RMSG%NAKS
  524. ;   0524  1    !        Total number of NAKs received for this file transfer
  525. ;   0525  1    !    XFR%TIME
  526. ;   0526  1    !        Amount of time the last transfer took in milliseconds.
  527. ;   0527  1    !    TOTAL%TIME
  528. ;   0528  1    !        Total amount of time spend transfering data.
  529. ;   0529  1    !
  530. ;   0530  1    ! Misc constants:
  531. ;   0531  1    !
  532. ;   0532  1    !    LAST%ERROR
  533. ;   0533  1    !        ASCIZ of the last error message issued.
  534. ;   0534  1    !    FILE%NAME
  535. ;   0535  1    !        Vector containing the ASCII characters of the file name.
  536. ;   0536  1    !    FILE%SIZE
  537. ;   0537  1    !        Number of characters in the FILE%NAME vector.
  538. ;   0538  1    !    DELAY
  539. ;   0539  1    !        Amount of time to delay
  540. ;   0540  1    !    DUPLEX
  541. ;   0541  1    !        DP%HALF or DP%FULL to denote either half duplex or full duplex.
  542. ;   0542  1    !        [Currently only DP%FULL is supported]
  543. ;   0543  1    !    PKT%RETRIES
  544. ;   0544  1    !        Number of retries to attempt to read a message.
  545. ;   0545  1    !    SI%RETRIES
  546. ;   0546  1    !        Number of retries to attempt on send inits
  547. ;   0547  1    !    DEBUG%FLAG
  548. ;   0548  1    !        Debugging mode on/off
  549. ;   0549  1    !    WARN%FLAG
  550. ;   0550  1    !        File warning flag
  551. ;   0551  1    !    IBM%FLAG
  552. ;   0552  1    !        True if talking to an IBM system, else false.
  553. ;   0553  1    !    ECHO%FLAG
  554. ;   0554  1    !        Local echo flag
  555. ;   0555  1    !    CONNECT%FLAG
  556. ;   0556  1    !        Connected flag; True if terminal and SET LINE are the same
  557. ;   0557  1    !    PARITY%TYPE
  558. ;   0558  1    !        Type of parity to use on sends.
  559. ;   0559  1    !    DEV%PARITY%FLAG
  560. ;   0560  1    !        Device will add parity to message.  True if device adds
  561. ;   0561  1    !        parity and false if we must do it.
  562. ;   0562  1    !    FLAG%FILE%OPEN
  563. ;   0563  1    !        File is opened.
  564. ;   0564  1    !
  565. ;   0565  1    !--
  566. ;   0566  1    
  567. ;   0567  1    %SBTTL 'Declarations -- Forward definitions'
  568. ;   0568  1    !<BLF/NOFORMAT>
  569. ;   0569  1    !
  570. ;   0570  1    ! Forward definitions
  571. ;   0571  1    !
  572. ;   0572  1    
  573. ;   0573  1    FORWARD ROUTINE
  574. ;   0574  1    
  575. ;   0575  1    ! Main loop for a complete transaction
  576. ;   0576  1        DO%TRANSACTION,        ! Perform a complete transaction
  577. ;   0577  1    
  578. ;   0578  1    ! Send processing routines
  579. ;   0579  1    
  580. ;   0580  1        SEND%SERVER%INIT,        ![026] Send a server init packet
  581. ;   0581  1        SEND%DATA,            ! Send data to the micro
  582. ;   0582  1        SEND%FILE,            ! Send file name
  583. ;   0583  1        SEND%OPEN%FILE,            ! Open file for sending
  584. ;   0584  1        SEND%GENCMD,        ! Send generic command
  585. ;   0585  1        SEND%EOF,            ! Send EOF
  586. ;   0586  1        SEND%INIT,            ! Send initialization msg
  587. ;   0587  1        SEND%BREAK,            ! Send break end of transmission
  588. ;   0588  1    
  589. ;   0589  1    ! Receive processing routines
  590. ;   0590  1    
  591. ;   0591  1        REC%SERVER%IDLE,        ! Wait for message while server is idle
  592. ;   0592  1        REC%INIT,            ! Receive initialization
  593. ;   0593  1        REC%FILE,            ! Receive file information
  594. ;   0594  1        REC%DATA,            ! Receive data
  595. ;   0595  1    !
  596. ;   0596  1    ! Server processing routines
  597. ;   0597  1    !
  598. ;   0598  1        SERVER%GENERIC,        ! Process generic KERMIT commands
  599. ;   0599  1        HOST%COMMAND,        ! Process host command
  600. ;   0600  1        KERMIT%COMMAND,        ! Process Kermit command
  601. ;   0601  1        CALL%SY%RTN,        ! Handle calling system routine and returning result
  602. ;   0602  1    !
  603. ;   0603  1    ! Statistic gathering routines
  604. ;   0604  1    !
  605. ;   0605  1        END%STATS    : NOVALUE,    ! End of a message processing stats routine
  606. ;   0606  1    
  607. ;   0607  1    ! Low level send/receive routines
  608. ;   0608  1    
  609. ;   0609  1        CALC%BLOCK%CHECK,        ! Routine to calculate the block check value
  610. ;   0610  1        SET%SEND%INIT : NOVALUE,    ! Set up the MSG%SND%INIT parameters.
  611. ;   0611  1        PRS%SEND%INIT,        ! Parse MSG%SND%INIT parameters.
  612. ;   0612  1        DO%PARITY : NOVALUE,    ! Routine to generate parity for a message
  613. ;   0613  1        GEN%PARITY,            ! Routine to add parity to a character
  614. ;   0614  1        SEND%PACKET,        ! Send a packet to the remote
  615. ;   0615  1        REC%MESSAGE,        ! Receive a message with retry processing
  616. ;   0616  1        REC%PACKET,            ! Receive a packet from the remote
  617. ;   0617  1    
  618. ;   0618  1    ! Utility routines
  619. ;   0619  1    
  620. ;   0620  1        NORMALIZE%FILE : NOVALUE,    ! Force file name into normal form
  621. ;   0621  1        BFR%EMPTY,            ! Empty the data buffer
  622. ;   0622  1        BFR%FILL,            ! Fill the data buffer from a file
  623. ;   0623  1        SET%STRING,            ![025] Routine to set alternate get/put routines
  624. ;   0624  1                        ! for use with in memory strings
  625. ;   0625  1        TYPE%CHAR,            ! Type a character from a packet
  626. ;   0626  1        INIT%XFR    : NOVALUE,    ! Initialize the per transfer processing
  627. ;   0627  1        STS%OUTPUT    : NOVALUE,    ! Output current transfer status
  628. ;   0628  1    !
  629. ;   0629  1    ! Debugging routines
  630. ;   0630  1    !
  631. ;   0631  1        DBG%MESSAGE    : NOVALUE,    ! Type out a formatted message
  632. ;   0632  1        DBG%SEND    : NOVALUE,    ! Send message debugging routine
  633. ;   0633  1        DBG%RECEIVE    : NOVALUE;    ! Receive message debugging routine
  634. ;   0634  1        %SBTTL    'Require files'
  635. ;   0635  1    
  636. ;   0636  1    !
  637. ;   0637  1    !<BLF/FORMAT>
  638. ;   0638  1    !
  639. ;   0639  1    ! REQUIRE FILES:
  640. ;   0640  1    !
  641. ;   0641  1    
  642. ; L 0642  1    %IF %BLISS (BLISS32)
  643. ; U 0643  1    %THEN
  644. ; U 0644  1    
  645. ; U 0645  1    LIBRARY 'SYS$LIBRARY:STARLET';
  646. ; U 0646  1    
  647. ;   0647  1    %FI
  648. ;   0648  1    
  649. ;   0649  1    REQUIRE 'KERCOM';
  650. ;   0854  1    
  651. ;   0855  1    REQUIRE 'KERERR';
  652. ;   0878  1    
  653. ;   0879  1    %SBTTL 'Macro definitions'
  654. ;   0880  1    !
  655. ;   0881  1    ! MACROS:
  656. ;   0882  1    !
  657. ;   0883  1    
  658. ;   0884  1    MACRO
  659. ; M 0885  1        CTL (C) =
  660. ;   0886  1     ((C) XOR %O'100')%,
  661. ; M 0887  1        CHAR (C) =
  662. ;   0888  1     ((C) + %O'40')%,
  663. ; M 0889  1        UNCHAR (C) =
  664. ;   0890  1     ((C) - %O'40')%;
  665. ;   0891  1    
  666. ;   0892  1    %SBTTL 'KERMIT Protocol Definitions'
  667. ;   0893  1    
  668. ;   0894  1    !++
  669. ;   0895  1    ! The following describes the various items that are found in the
  670. ;   0896  1    ! KERMIT messages.  A complete and through desription of the protocol can be
  671. ;   0897  1    ! found in the KERMIT PROTOCOL MANUAL.
  672. ;   0898  1    !
  673. ;   0899  1    !
  674. ;   0900  1    ! All KERMIT messages have the following format:
  675. ;   0901  1    !
  676. ;   0902  1    ! <Mark><CHAR(Count)><CHAR(Seq)><Message-dependent information><Check><EOL>
  677. ;   0903  1    !
  678. ;   0904  1    ! <MARK>
  679. ;   0905  1    !    Normally SOH (Control-A, octal 001).
  680. ;   0906  1    !
  681. ;   0907  1    ! <CHAR(Count)>
  682. ;   0908  1    !    Count of the number of characters following this position.
  683. ;   0909  1    !    Character counts of ONLY 0 to 94 are valid.
  684. ;   0910  1    ! [108] Charavcter count = 0 means extended length type packet.
  685. ;   0911  1    !
  686. ;   0912  1    ! <CHAR(Seq)>
  687. ;   0913  1    !    Packet sequence number, modulo 100 (octal).
  688. ;   0914  1    !
  689. ;   0915  1    ! [108]    <CHAR(Type)>
  690. ;   0916  1    ! [108]        Packet type, usually a mnemonic ASCII character.
  691. ;   0917  1    ! [108]
  692. ;   0918  1    ! [108]    For Extended Length packets only:
  693. ;   0919  1    ! [108]   <CHAR(Count/95)>
  694. ;   0920  1    ! [108]        Count of the number of characters / 95, from (HeaderCheck)
  695. ;   0921  1    ! [108]
  696. ;   0922  1    ! [108]   <CHAR(Count MOD 95)>
  697. ;   0923  1    ! [108]        Count of the number of characters MOD 95, from (HeaderCheck)
  698. ;   0924  1    ! [108]
  699. ;   0925  1    ! [108]   <CHAR(HeaderCheck)>
  700. ;   0926  1    ! [108]        Kermit type-1 checksum of the 5 preceding ASCII characters.
  701. ;   0927  1    !
  702. ;   0928  1    ! <MESSAGE-DEPENDENT INFORMATION>
  703. ;   0929  1    !    This field contains the message dependent information.  There can
  704. ;   0930  1    !    be multiple fields in this section.  See the KERMIT Protocol document
  705. ;   0931  1    !    for a complete description of this.
  706. ;   0932  1    !
  707. ;   0933  1    ! <Check>
  708. ;   0934  1    !    A block check on the characters in the packet between, but not
  709. ;   0935  1    !    including, the mark and the checksum itself.  It may be one to three
  710. ;   0936  1    !    characters, depending upon the type agreed upon.
  711. ;   0937  1    !
  712. ;   0938  1    !    1. Single character arithmetic sum equal to:
  713. ;   0939  1    !        chksum = (s + ((s AND 300)/100)) AND 77
  714. ;   0940  1    !        Character sent is CHAR(chksum).
  715. ;   0941  1    !
  716. ;   0942  1    !    2. Two character arithmetic sum.  CHAR of bits 6-11 are the first
  717. ;   0943  1    !       character, CHAR of bits 0-5 are the second character.
  718. ;   0944  1    !
  719. ;   0945  1    !    3. Three character CRC-CCITT.  First character is CHAR of bits 12-15,
  720. ;   0946  1    !       second is CHAR of bits 6-11, third is CHAR of bits 0-5.
  721. ;   0947  1    !
  722. ;   0948  1    !
  723. ;   0949  1    ! <EOL>
  724. ;   0950  1    !    End of line.  Any line terminator that may be required by the host.
  725. ;   0951  1    !--
  726. ;   0952  1    
  727. ;   0953  1    %SBTTL 'KERMIT Protocol Definitions -- Packet offsets'
  728. ;   0954  1    
  729. ;   0955  1    !++
  730. ;   0956  1    ! The following define the various offsets of the standard KERMIT
  731. ;   0957  1    ! packets.
  732. ;   0958  1    !--
  733. ;   0959  1    
  734. ;   0960  1    LITERAL
  735. ;   0961  1        PKT%MARK = 0,                ! <MARK>
  736. ;   0962  1        PKT%COUNT = 1,                ! <CHAR(Count)>
  737. ;   0963  1        PKT%SEQ = 2,                ! <CHAR(Seq)>
  738. ;   0964  1        PKT%TYPE = 3,                ! <Message type>
  739. ;   0965  1        PKT%MSG = 4,                ! <MESSAGE-DEPENDENT INFORMATION>
  740. ;   0966  1        PKT%COUNTX1 = 4,            ! [108]    ! Ext. pkt: <CHAR(MSB(Count))>
  741. ;   0967  1        PKT%COUNTX2 = 5,            ! [108]    ! Ext. pkt: <CHAR(LSB(Count))>
  742. ;   0968  1        PKT%HCHECK = 6,            ! [108]    ! Ext. pkt: Header parity
  743. ;   0969  1        PKT%MSGX = 7,            ! [108]    ! <MESSAGE-DEPENDENT INFORMATION>
  744. ;   0970  1        PKT%MAX%MSG = 94 - 5,            ! Maximum size of the message dependent
  745. ;   0971  1                                !  information
  746. ;   0972  1        PKT%CHKSUM = 0,                ! <CHAR(Chksum)> offset from end of
  747. ;   0973  1                                !    Message dependent information
  748. ;   0974  1        PKT%EOL = 1,                ! <Eol> offset from end of data
  749. ;   0975  1    ! [108]   PKT%OVR%HEAD%B = 2,            ! Header overhead
  750. ;   0976  1    ! [108]   PKT%OVR%HEAD%E = 1,            ! Overhead at the end
  751. ;   0977  1        PKT%OVR%HEAD = 3,                ! Overhead added to data length
  752. ;   0978  1        PKT%TOT%OVR%HEAD = 6;            ! Total overhead of the message
  753. ;   0979  1    
  754. ;   0980  1    %SBTTL 'KERMIT Protocol Definitions -- Message dependent field'
  755. ;   0981  1    
  756. ;   0982  1    !++
  757. ;   0983  1    ! The MESSAGE-DEPENDENT information field of the message contains at
  758. ;   0984  1    ! least one part.  That is the type of message.  The remainder of the message
  759. ;   0985  1    ! MESSAGE-DEPENDENT field is different depending on the message.
  760. ;   0986  1    !
  761. ;   0987  1    ! <TYPE><TYPE-DEPENDENT-INFORMATION>
  762. ;   0988  1    !
  763. ;   0989  1    ! <TYPE>
  764. ;   0990  1    !    The type defines the type of message that is being processed.
  765. ;   0991  1    !
  766. ;   0992  1    !--
  767. ;   0993  1    
  768. ;   0994  1    ! Protocol version 1.0 message types
  769. ;   0995  1    
  770. ;   0996  1    LITERAL
  771. ;   0997  1        MSG%DATA = %C'D',                ! Data packet
  772. ;   0998  1        MSG%ACK = %C'Y',                ! Acknowledgement
  773. ;   0999  1        MSG%NAK = %C'N',                ! Negative acknowledgement
  774. ;   1000  1        MSG%SND%INIT = %C'S',            ! Send initiate
  775. ;   1001  1        MSG%BREAK = %C'B',                ! Break transmission
  776. ;   1002  1        MSG%FILE = %C'F',                ! File header
  777. ;   1003  1        MSG%EOF = %C'Z',                ! End of file (EOF)
  778. ;   1004  1        MSG%ERROR = %C'E';                ! Error
  779. ;   1005  1    
  780. ;   1006  1    ! Protocol version 2.0 message types
  781. ;   1007  1    
  782. ;   1008  1    LITERAL
  783. ;   1009  1        MSG%RCV%INIT = %C'R',            ! Receive initiate
  784. ;   1010  1        MSG%COMMAND = %C'C',            ! Host command
  785. ;   1011  1        MSG%GENERIC = %C'G',            ! Generic KERMIT command.
  786. ;   1012  1        MSG%KERMIT = %C'K';                ! Perform KERMIT command (text)
  787. ;   1013  1    
  788. ;   1014  1    ! Protocol version 4.0 message types
  789. ;   1015  1    
  790. ;   1016  1    LITERAL
  791. ;   1017  1        MSG%SER%INIT = %C'I',            ! Server initialization
  792. ;   1018  1        MSG%TEXT = %C'X';                ! Text header message
  793. ;   1019  1    
  794. ;   1020  1    !++
  795. ;   1021  1    ! Generic KERMIT commands
  796. ;   1022  1    !--
  797. ;   1023  1    
  798. ;   1024  1    LITERAL
  799. ;   1025  1        MSG%GEN%LOGIN = %C'I',            ! Login
  800. ;   1026  1        MSG%GEN%EXIT = %C'F',            ! Finish (exit to OS)
  801. ;   1027  1        MSG%GEN%CONNECT = %C'C',            ! Connect to a directory
  802. ;   1028  1        MSG%GEN%LOGOUT = %C'L',            ! Logout
  803. ;   1029  1        MSG%GEN%DIRECTORY = %C'D',            ! Directory
  804. ;   1030  1        MSG%GEN%DISK%USAGE = %C'U',            ! Disk usage
  805. ;   1031  1        MSG%GEN%DELETE = %C'E',            ! Delete a file
  806. ;   1032  1        MSG%GEN%TYPE = %C'T',            ! Type a file specification
  807. ;   1033  1    !    MSG%GEN%SUBMIT = %C'S',            ! Submit
  808. ;   1034  1    !    MSG%GEN%PRINT = %C'P',            ! Print
  809. ;   1035  1        MSG%GEN%WHO = %C'W',            ! Who's logged in
  810. ;   1036  1        MSG%GEN%SEND = %C'M',            ! Send a message to a user
  811. ;   1037  1        MSG%GEN%HELP = %C'H',            ! Help
  812. ;   1038  1        MSG%GEN%QUERY = %C'Q',            ! Query status
  813. ;   1039  1        MSG%GEN%RENAME = %C'R',            ! Rename file
  814. ;   1040  1        MSG%GEN%COPY = %C'K',            ! Copy file
  815. ;   1041  1        MSG%GEN%PROGRAM = %C'P',            ! Run program and pass data
  816. ;   1042  1        MSG%GEN%JOURNAL = %C'J',            ! Perform journal functions
  817. ;   1043  1        MSG%GEN%VARIABLE = %C'V';            ! Return/set variable state
  818. ;   1044  1    
  819. ;   1045  1    !
  820. ;   1046  1    ! Acknowledgement modifiers (protocol 4.0)
  821. ;   1047  1    !
  822. ;   1048  1    
  823. ;   1049  1    LITERAL
  824. ;   1050  1        MSG%ACK%ABT%CUR = %C'X',            ! Abort current file
  825. ;   1051  1        MSG%ACK%ABT%ALL = %C'Z';            ! Abort entire stream of files
  826. ;   1052  1    
  827. ;   1053  1    !
  828. ;   1054  1    ! End of file packet modifier
  829. ;   1055  1    !
  830. ;   1056  1    
  831. ;   1057  1    LITERAL
  832. ;   1058  1        MSG%EOF%DISCARD = %C'D';            ! Discard data from previous file
  833. ;   1059  1    
  834. ;   1060  1    %SBTTL 'KERMIT Protocol Definitions -- SEND initiate packet'
  835. ;   1061  1    
  836. ;   1062  1    !++
  837. ;   1063  1    !
  838. ;   1064  1    ! The following describes the send initiate packet.  All fields in the message
  839. ;   1065  1    ! data area are optional.
  840. ;   1066  1    !
  841. ;   1067  1    ! <"S"><CHAR(Bufsiz)><CHAR(Timeout)><CHAR(npad)><CTL(pad)><CHAR(Eol)><Quote>
  842. ;   1068  1    !    <8-bit-quote><Check-type><Repeat-count-processing><Reserved><Reserved>
  843. ;   1069  1    !
  844. ;   1070  1    ! BUFSIZ
  845. ;   1071  1    !    Sending Kermit's maximum buffer size.
  846. ;   1072  1    !
  847. ;   1073  1    ! Timeout
  848. ;   1074  1    !    Number of seconds after which the sending Kermit wishes to be timed out
  849. ;   1075  1    !
  850. ;   1076  1    ! Npad
  851. ;   1077  1    !    Number of padding caracters the sending Kermit needs preceding each
  852. ;   1078  1    !    packet.
  853. ;   1079  1    !
  854. ;   1080  1    ! PAD
  855. ;   1081  1    !    Padding character.
  856. ;   1082  1    !
  857. ;   1083  1    ! EOL
  858. ;   1084  1    !    A line terminator required on all packets set by the receiving
  859. ;   1085  1    !    Kermit.
  860. ;   1086  1    !
  861. ;   1087  1    ! Quote
  862. ;   1088  1    !    The printable ASCII characer the sending Kermit will use when quoting
  863. ;   1089  1    !    the control cahracters.  Default is "#".
  864. ;   1090  1    !
  865. ;   1091  1    ! 8-bit-quote
  866. ;   1092  1    !    Specify quoting mecanism for 8-bit quantities.  A quoting mecanism is
  867. ;   1093  1    !    mecessary when sending to hosts which prevent the use of the 8th bit
  868. ;   1094  1    !    for data.  When elected, the quoting mechanism will be used by both
  869. ;   1095  1    !    hosts, and the quote character must be in the range of 41-76 or 140-176
  870. ;   1096  1    !    octal, but different from the control-quoting character.  This field is
  871. ;   1097  1    !    interpreted as follows:
  872. ;   1098  1    !
  873. ;   1099  1    !    "Y" - I agree to 8-bit quoting if you request it.
  874. ;   1100  1    !    "N" - I will not do 8-bit quoting.
  875. ;   1101  1    !    "&" - (or any other character in the range of 41-76 or 140-176) I want
  876. ;   1102  1    !          to do 8-bit quoting using this character (it will be done if the
  877. ;   1103  1    !          other Kermit puts a "Y" in this field.
  878. ;   1104  1    !    Anything else: Quoting will not be done.
  879. ;   1105  1    !
  880. ;   1106  1    ! Check-type
  881. ;   1107  1    !    Type of block check.  The only values presently allowed in this
  882. ;   1108  1    !    field are "1", "2" or "3".  Future implementations may allow other
  883. ;   1109  1    !    values.  Interpretation of the values is:
  884. ;   1110  1    !
  885. ;   1111  1    !    "1" - Single character checksum.  Default value if none specified.
  886. ;   1112  1    !    "2" - Double character checksum.
  887. ;   1113  1    !    "3" - Three character CRC.
  888. ;   1114  1    !
  889. ;   1115  1    ! Repeat-count-processing
  890. ;   1116  1    !    The prefix character to be used to indicate a repeated character.
  891. ;   1117  1    !    This can be any printable cahracter other than blank (which denotes
  892. ;   1118  1    !    no repeat count).
  893. ;   1119  1    !
  894. ;   1120  1    ! [108]    Capability byte(s)
  895. ;   1121  1    ! [108]        Bit mask containing extra capabilities, currently we only use
  896. ;   1122  1    ! [108]        bit 1 (extended-length packets) and bit 0 (more capability
  897. ;   1123  1    ! [108]        bytes follows).
  898. ;   1124  1    ! [108]
  899. ;   1125  1    ! [108]    Window length (not used)
  900. ;   1126  1    ! [108]
  901. ;   1127  1    ! [108]    Extended packet length
  902. ;   1128  1    ! [108]        Maximum length for extended-length packets
  903. ;   1129  1    !
  904. ;   1130  1    !--
  905. ;   1131  1    
  906. ;   1132  1    LITERAL
  907. ;   1133  1        P%SI%BUFSIZ = 0,                ! Buffersize
  908. ;   1134  1        MY%PKT%SIZE = 80,                ! My packet size
  909. ;   1135  1        P%SI%TIMOUT = 1,                ! Time out
  910. ;   1136  1        MY%TIME%OUT = 60,            ! [046] Increased ! My time out
  911. ;   1137  1        P%SI%NPAD = 2,                ! Number of padding characters
  912. ;   1138  1        MY%NPAD = 0,                ! Amount of padding I require
  913. ;   1139  1        P%SI%PAD = 3,                ! Padding character
  914. ;   1140  1        MY%PAD%CHAR = 0,                ! My pad character
  915. ;   1141  1        P%SI%EOL = 4,                ! End of line character
  916. ;   1142  1        MY%EOL%CHAR = %O'015',            ! My EOL cahracter
  917. ;   1143  1        P%SI%QUOTE = 5,                ! Quote character
  918. ;   1144  1        MY%QUOTE%CHAR = %C'#',            ! My quoting character
  919. ;   1145  1        P%SI%8QUOTE = 6,                ! 8-bit quote
  920. ;   1146  1        MY%8BIT%QUOTE = %C'&',            ! Don't do it
  921. ;   1147  1        P%SI%CHKTYPE = 7,                ! Checktype used
  922. ;   1148  1        MY%CHKTYPE = CHK%1CHAR,            ! Use single character checksum
  923. ;   1149  1        P%SI%REPEAT = 8,                ! Repeat character
  924. ;   1150  1        MY%REPEAT = %C'~',                ! My repeat character
  925. ;   1151  1        P%SI%LENGTH = 9,                ! Length of the std message
  926. ;   1152  1                        ! [108]
  927. ;   1153  1        P%SI%CAPAS = 9,            ! [108]    ! Capability field (if used)
  928. ;   1154  1        EXTLEN%CAPAS = 2,            ! [108]    ! Extended length packets
  929. ;   1155  1        P%SI%WINDO = 10,            ! [108]    ! (Send only) Not used, filler
  930. ;   1156  1        P%SI%MAXLX1 = 11,            ! [108]    ! (Send only) Ext. len / 95
  931. ;   1157  1        MY%MAXLX1 = 0,            ! [108]
  932. ;   1158  1        P%SI%MAXLX2 = 12,            ! [108]    ! (Send only) Ext. len MOD 95
  933. ;   1159  1        MY%MAXLX2 = 80,            ! [108]
  934. ;   1160  1                        ! [108]
  935. ;   1161  1        P%SI%XLENGTH = 13;            ! [108]    ! (Send only) Len of ext. msg
  936. ;   1162  1    
  937. ;   1163  1    %SBTTL 'KERMIT Protocol States'
  938. ;   1164  1    
  939. ;   1165  1    !++
  940. ;   1166  1    ! The following are the various states that KERMIT can be in.
  941. ;   1167  1    ! The state transitions are defined in the KERMIT Protocol manual.
  942. ;   1168  1    !--
  943. ;   1169  1    
  944. ;   1170  1    LITERAL
  945. ;   1171  1        STATE%MIN = 1,                ! Min state number
  946. ;   1172  1        STATE%S = 1,                ! Send init state
  947. ;   1173  1        STATE%SF = 2,                ! Send file header
  948. ;   1174  1        STATE%SD = 3,                ! Send file data packet
  949. ;   1175  1        STATE%SZ = 4,                ! Send EOF packet
  950. ;   1176  1        STATE%SB = 5,                ! Send break
  951. ;   1177  1        STATE%R = 6,                ! Receive state (wait for send-init)
  952. ;   1178  1        STATE%RF = 7,                ! Receive file header packet
  953. ;   1179  1        STATE%RD = 8,                ! Receive file data packet
  954. ;   1180  1        STATE%C = 9,                ! Send complete
  955. ;   1181  1        STATE%A = 10,                ! Abort
  956. ;   1182  1        STATE%SX = 11,                ! Send text header
  957. ;   1183  1        STATE%SG = 12,                ! Send generic command
  958. ;   1184  1        STATE%SI = 13,                ! Send server init
  959. ;   1185  1        STATE%ID = 14,                ! Server idle loop
  960. ;   1186  1        STATE%II = 15,                ! Server idle after server init
  961. ;   1187  1        STATE%FI = 16,                ! Server should exit
  962. ;   1188  1        STATE%LG = 17,                ! Server should logout
  963. ;   1189  1        STATE%OF = 18,                ! Send - open first input file
  964. ;   1190  1        STATE%EX = 19,                ! Exit back to command parser
  965. ;   1191  1        STATE%ER = 20,                ! Retries exceeded error
  966. ;   1192  1        STATE%MAX = 20;                ! Max state number
  967. ;   1193  1    
  968. ;   1194  1    %SBTTL 'Internal constants'
  969. ;   1195  1    
  970. ;   1196  1    !++
  971. ;   1197  1    ! The following represent various internal KERMSG constants.
  972. ;   1198  1    !--
  973. ;   1199  1    
  974. ;   1200  1    LITERAL
  975. ;   1201  1        MAX%PKT%RETRIES = 16,            ! Maximum packet retries
  976. ;   1202  1        MAX%SI%RETRIES = 5;                ! Maximum send init retries
  977. ;   1203  1    
  978. ;   1204  1    %SBTTL 'Storage - External'
  979. ;   1205  1    !
  980. ;   1206  1    ! OWN STORAGE:
  981. ;   1207  1    !
  982. ;   1208  1    
  983. ;   1209  1    EXTERNAL
  984. ;   1210  1    !
  985. ;   1211  1    ! Receive parameters
  986. ;   1212  1    !
  987. ;   1213  1        RCV%PKT%SIZE,                ! Receive packet size
  988. ;   1214  1        RCV%NPAD,                    ! Padding length
  989. ;   1215  1        RCV%PADCHAR,                ! Padding character
  990. ;   1216  1        RCV%TIMEOUT,                ! Time out
  991. ;   1217  1        RCV%EOL,                    ! EOL character
  992. ;   1218  1        RCV%QUOTE%CHR,                ! Quote character
  993. ;   1219  1        RCV%SOH,                    ! Start of header character
  994. ;   1220  1        RCV%8QUOTE%CHR,                ! 8-bit quoting character
  995. ;   1221  1    !
  996. ;   1222  1    ! Miscellaneous parameters
  997. ;   1223  1    !
  998. ;   1224  1        SET%REPT%CHR,                ! Repeat character
  999. ;   1225  1    !
  1000. ;   1226  1    ! Send parameters
  1001. ;   1227  1    !
  1002. ;   1228  1        SND%PKT%SIZE,                ! Send packet size
  1003. ;   1229  1        SND%NPAD,                    ! Padding length
  1004. ;   1230  1        SND%PADCHAR,                ! Padding character
  1005. ;   1231  1        SND%TIMEOUT,                ! Time out
  1006. ;   1232  1        SND%EOL,                    ! EOL character
  1007. ;   1233  1        SND%QUOTE%CHR,                ! Quote character
  1008. ;   1234  1        SND%SOH,                    ! Start of header character
  1009. ;   1235  1        SEND%TIMEOUT,                ! Time to wait for receiving message
  1010. ;   1236  1    !
  1011. ;   1237  1    ! Server parameters
  1012. ;   1238  1    !
  1013. ;   1239  1        SRV%TIMEOUT,                ! Time between NAK's when server is idle
  1014. ;   1240  1    !
  1015. ;   1241  1    ! Statistics
  1016. ;   1242  1    !
  1017. ;   1243  1        SND%TOTAL%CHARS,                ! Total characters sent
  1018. ;   1244  1        RCV%TOTAL%CHARS,                ! Total characters received
  1019. ;   1245  1        SND%DATA%CHARS,                ! Total number of data characters sent
  1020. ;   1246  1        RCV%DATA%CHARS,                ! Total number of data characters received
  1021. ;   1247  1        SND%NAKS,                    ! Total NAKs sent
  1022. ;   1248  1        RCV%NAKS,                    ! Total NAKs received
  1023. ;   1249  1        SND%COUNT,                    ! Count of total number of packets
  1024. ;   1250  1        RCV%COUNT,                    ! Count of total number packets received
  1025. ;   1251  1        SMSG%COUNT,                    ! Total number of packets sent
  1026. ;   1252  1        RMSG%COUNT,                    ! Total number of packets received
  1027. ;   1253  1        SMSG%TOTAL%CHARS,                ! Total chars sent this file xfer
  1028. ;   1254  1        RMSG%TOTAL%CHARS,                ! Total chars rcvd this file xfer
  1029. ;   1255  1        SMSG%DATA%CHARS,                ! Total data chars this file xfer
  1030. ;   1256  1        RMSG%DATA%CHARS,                ! Total data chars this file xfer
  1031. ;   1257  1        SMSG%NAKS,                    ! Total number of NAKs this file xfer
  1032. ;   1258  1        RMSG%NAKS,                    ! Total number of NAKs received
  1033. ;   1259  1        XFR%TIME,                    ! Amount of time last xfr took
  1034. ;   1260  1        TOTAL%TIME,                    ! Total time of all xfrs
  1035. ;   1261  1                                !  this file xfer
  1036. ;   1262  1        LAST%ERROR : VECTOR [CH$ALLOCATION (MAX%MSG + 1)],    ! Last error message
  1037. ;   1263  1    !
  1038. ;   1264  1    ! Misc constants.
  1039. ;   1265  1    !
  1040. ;   1266  1        FILE%NAME : VECTOR [CH$ALLOCATION (MAX%FILE%NAME)],
  1041. ;   1267  1        FILE%SIZE,
  1042. ;   1268  1        SI%RETRIES,                    ! Send init retries to attempt
  1043. ;   1269  1        PKT%RETRIES,                ! Number of retries to try for a message
  1044. ;   1270  1        DELAY,                    ! Amount of time to delay
  1045. ;   1271  1        DUPLEX,                    ! Type of connection (half or full)
  1046. ;   1272  1        PARITY%TYPE,                ! Type of parity to use
  1047. ;   1273  1        DEV%PARITY%FLAG,                ! True if output device does
  1048. ;   1274  1                                !  parity, false if we do it
  1049. ;   1275  1        CHKTYPE,                    ! Type of block check desired
  1050. ;   1276  1        ABT%FLAG,                    ! True if aborted file should be discarded
  1051. ;   1277  1        DEBUG%FLAG,                    ! Debugging mode on/off
  1052. ;   1278  1        WARN%FLAG,                    ! File warning flag
  1053. ;   1279  1        IBM%CHAR,                    ! Turnaround character for IBM mode
  1054. ;   1280  1        ECHO%FLAG,                    ! Local echo flag
  1055. ;   1281  1        CONNECT%FLAG,                ! Connected flag; True if
  1056. ;   1282  1                                !  terminal and SET LINE are
  1057. ;   1283  1                                !  the same
  1058. ;   1284  1        ABT%CUR%FILE,                ! Abort current file
  1059. ;   1285  1        ABT%ALL%FILE,                ! Abort all files in stream
  1060. ;   1286  1        TYP%STS%FLAG,                ! Type status next message
  1061. ;   1287  1        TY%FIL,                    ! Type file specs
  1062. ;   1288  1        TY%PKT,                    ! Type packet info
  1063. ;   1289  1        FIL%NORMAL%FORM,                ! If true, file names should be normalized
  1064. ;   1290  1        GEN%1DATA : VECTOR [CH$ALLOCATION (MAX%MSG)],    ! Data for generic command
  1065. ;   1291  1        GEN%1SIZE,                    ! Size of data in GEN%1DATA
  1066. ;   1292  1        GEN%2DATA : VECTOR [CH$ALLOCATION (MAX%MSG)],    ! Second argument for generic command
  1067. ;   1293  1        GEN%2SIZE,                    ! Size of data in GEN%2DATA
  1068. ;   1294  1        GEN%3DATA : VECTOR [CH$ALLOCATION (MAX%MSG)],    ! Third arg for generic command
  1069. ;   1295  1        GEN%3SIZE;                    ! Size of data in GEN%3DATA
  1070. ;   1296  1    
  1071. ;   1297  1    %SBTTL 'Storage - Local'
  1072. ;   1298  1    !
  1073. ;   1299  1    ! LOCAL OWN STORAGE:
  1074. ;   1300  1    !
  1075. ;   1301  1    
  1076. ;   1302  1    OWN
  1077. ;   1303  1    !
  1078. ;   1304  1    ! Receive parameters
  1079. ;   1305  1    !
  1080. ;   1306  1        RECV%8QUOTE%CHR,                ! 8th-bit quoting character
  1081. ;   1307  1        REPT%CHR,                    ! Repeat prefix character
  1082. ;   1308  1        RECV%PKT%MSG,            ! [108]    ! Msg offset (4 std, 7 ext.)
  1083. ;   1309  1    !
  1084. ;   1310  1    ! Send parameters
  1085. ;   1311  1    !
  1086. ;   1312  1        SEND%PKT%SIZE,                ! Send packet size
  1087. ;   1313  1        SEND%NPAD,                    ! Padding length
  1088. ;   1314  1        SEND%PADCHAR,                ! Padding character
  1089. ;   1315  1        SEND%EOL,                    ! EOL character
  1090. ;   1316  1        SEND%QUOTE%CHR,                ! Quote character
  1091. ;   1317  1        SEND%8QUOTE%CHR,                ! 8-bit quoting character
  1092. ;   1318  1        SEND%INIT%SIZE,                ! Size of INIT message
  1093. ;   1319  1    !
  1094. ;   1320  1    ! Misc parameters
  1095. ;   1321  1    !
  1096. ;   1322  1        INI%CHK%TYPE,                ! Type of block checking from init message
  1097. ;   1323  1        BLK%CHK%TYPE,                ! Type of block check to use
  1098. ;   1324  1        FLAG%8QUOTE,                ! Flag to determine if doing 8bit quoting
  1099. ;   1325  1        FLAG%REPEAT,                ! True if doing repeated character compression
  1100. ;   1326  1        STATE,                    ! Current state
  1101. ;   1327  1        SIZE,                    ! Size of the current message
  1102. ;   1328  1    ! [108]                          Negative len for ext msgs
  1103. ;   1329  1        OLD%RETRIES,                ! Saved number of retries done.
  1104. ;   1330  1        NUM%RETRIES,                ! Number of retries
  1105. ;   1331  1        MSG%NUMBER,                    ! Current message number
  1106. ;   1332  1        REC%SEQ,                    ! Sequence number of msg in REC%MSG
  1107. ;   1333  1        REC%LENGTH,                    ! Length of the message recv'd
  1108. ;   1334  1        REC%TYPE,                    ! Type of the message received.
  1109. ;   1335  1        REC%MSG : VECTOR [CH$ALLOCATION (MAX%MSG + 1, CHR%SIZE)],    ! Message received
  1110. ;   1336  1        SND%MSG : VECTOR [CH$ALLOCATION (MAX%MSG + 1, CHR%SIZE)],    ! Message sent
  1111. ;   1337  1        FILE%CHARS,                    ! Number of characters sent or received
  1112. ;   1338  1        TEXT%HEAD%FLAG,                ! Text header received, not file header
  1113. ;   1339  1        NO%FILE%NEEDED,                ! Don't open a file
  1114. ;   1340  1        INIT%PKT%SENT,                ! Server-init sent and ACKed
  1115. ;   1341  1        GEN%TYPE,                    ! Command message type
  1116. ;   1342  1        GEN%SUBTYPE,                ! Generic command subtype
  1117. ;   1343  1        GET%CHR%ROUTINE,            ! Address of routine to get a character for BFR%FILL
  1118. ;   1344  1        PUT%CHR%ROUTINE;            ! Address of routine to put a character for BFR%EMPTY
  1119. ;   1345  1    !
  1120. ;   1346  1    ! KERMSG Global storage
  1121. ;   1347  1    !
  1122. ;   1348  1    GLOBAL
  1123. ;   1349  1        FLAG%FILE%OPEN;            ! File is opened.
  1124. ;   1350  1    
  1125. ;   1351  1    %SBTTL 'External references'
  1126. ;   1352  1    !
  1127. ;   1353  1    ! EXTERNAL REFERENCES:
  1128. ;   1354  1    !
  1129. ;   1355  1    ! Packet I/O routines
  1130. ;   1356  1    
  1131. ;   1357  1    EXTERNAL ROUTINE
  1132. ;   1358  1        SEND,                    ! Send a packet to the remote
  1133. ;   1359  1        IBM%WAIT,                    ! Wait for IBM turnaround
  1134. ;   1360  1        RECEIVE;                    ! Receive a packet from the remote
  1135. ;   1361  1    
  1136. ;   1362  1    !
  1137. ;   1363  1    ! Terminal I/O routines
  1138. ;   1364  1    !
  1139. ;   1365  1    
  1140. ;   1366  1    EXTERNAL ROUTINE
  1141. ;   1367  1        TERM%DUMP : NOVALUE,            ! Normal terminal output
  1142. ;   1368  1        DBG%DUMP : NOVALUE,                ! Debugging output
  1143. ;   1369  1        TT%SET%OUTPUT,                ! Set output routine
  1144. ;   1370  1        TT%CHAR : NOVALUE,                ! Output a single character
  1145. ;   1371  1        TT%CRLF : NOVALUE,                ! Output a CRLF
  1146. ;   1372  1        TT%NUMBER : NOVALUE,            ! Output a three digit number to the
  1147. ;   1373  1                                !  terminal
  1148. ;   1374  1        TT%TEXT : NOVALUE,                ! Output a string to the user's
  1149. ;   1375  1        TT%OUTPUT : NOVALUE;            ! Force buffered output to terminal
  1150. ;   1376  1    
  1151. ;   1377  1    ! Operating system routines and misc routines
  1152. ;   1378  1    
  1153. ;   1379  1    EXTERNAL ROUTINE
  1154. ;   1380  1        CRCCLC,                    ! Calculate a CRC-CCITT
  1155. ;   1381  1        XFR%STATUS : NOVALUE,            ! Routine to tell the user the
  1156. ;   1382  1                                !  status of a transfer
  1157. ;   1383  1        KRM%ERROR : NOVALUE,            ! Issue an error message
  1158. ;   1384  1        SY%LOGOUT : NOVALUE,            ! Log the job off
  1159. ;   1385  1        SY%GENERIC,                    ! Perform a generic command
  1160. ;   1386  1        SY%TIME,                    ! Return elapsed time in milliseconds
  1161. ;   1387  1        SY%DISMISS : NOVALUE;            ! Routine to dismiss for n seconds.
  1162. ;   1388  1    
  1163. ;   1389  1    !
  1164. ;   1390  1    ! External file processing routines
  1165. ;   1391  1    !
  1166. ;   1392  1    
  1167. ;   1393  1    EXTERNAL ROUTINE
  1168. ;   1394  1        FILE%OPEN,                    ! Open a file for reading/writing
  1169. ;   1395  1        FILE%CLOSE,                    ! Close an open file
  1170. ;   1396  1        NEXT%FILE,                    ! Determine if there is a next file
  1171. ;   1397  1                                !  and open it for reading.
  1172. ;   1398  1        GET%FILE,                    ! Get a byte from the file
  1173. ;   1399  1        PUT%FILE;                    ! Put a byte in the file.
  1174. ;   1400  1    
  1175. ;   1401  1    %SBTTL 'MSG%INIT'
  1176. ;   1402  1    
  1177. ;   1403  1    GLOBAL ROUTINE MSG%INIT : NOVALUE =
  1178. ;   1404  1    
  1179. ;   1405  1    !++
  1180. ;   1406  1    ! FUNCTIONAL DESCRIPTION:
  1181. ;   1407  1    !
  1182. ;   1408  1    !    This routine will initialize the message processing for
  1183. ;   1409  1    !    KERMIT-32/36.
  1184. ;   1410  1    !
  1185. ;   1411  1    ! CALLING SEQUENCE:
  1186. ;   1412  1    !
  1187. ;   1413  1    !    MSG%INIT();
  1188. ;   1414  1    !
  1189. ;   1415  1    ! INPUT PARAMETERS:
  1190. ;   1416  1    !
  1191. ;   1417  1    !    None.
  1192. ;   1418  1    !
  1193. ;   1419  1    ! IMPLICIT INPUTS:
  1194. ;   1420  1    !
  1195. ;   1421  1    !    None.
  1196. ;   1422  1    !
  1197. ;   1423  1    ! OUTPUT PARAMETERS:
  1198. ;   1424  1    !
  1199. ;   1425  1    !    None.
  1200. ;   1426  1    !
  1201. ;   1427  1    ! IMPLICIT OUTPUTS:
  1202. ;   1428  1    !
  1203. ;   1429  1    !    None.
  1204. ;   1430  1    !
  1205. ;   1431  1    ! COMPLETION CODES:
  1206. ;   1432  1    !
  1207. ;   1433  1    !    None.
  1208. ;   1434  1    !
  1209. ;   1435  1    ! SIDE EFFECTS:
  1210. ;   1436  1    !
  1211. ;   1437  1    !    None.
  1212. ;   1438  1    !
  1213. ;   1439  1    !--
  1214. ;   1440  1    
  1215. ;   1441  2        BEGIN
  1216. ;   1442  2    !
  1217. ;   1443  2    ! Initialize some variables
  1218. ;   1444  2    !
  1219. ;   1445  2    ! Receive parameters first
  1220. ;   1446  2    !
  1221. ;   1447  2        RCV%PKT%SIZE = MY%PKT%SIZE;
  1222. ;   1448  2        RCV%NPAD = MY%NPAD;
  1223. ;   1449  2        RCV%PADCHAR = MY%PAD%CHAR;
  1224. ;   1450  2        RCV%TIMEOUT = MY%TIME%OUT;
  1225. ;   1451  2        RCV%EOL = MY%EOL%CHAR;
  1226. ;   1452  2        RCV%QUOTE%CHR = MY%QUOTE%CHAR;
  1227. ;   1453  2        RCV%SOH = CHR%SOH;
  1228. ;   1454  2        RCV%8QUOTE%CHR = MY%8BIT%QUOTE;
  1229. ;   1455  2        SET%REPT%CHR = MY%REPEAT;
  1230. ;   1456  2    !
  1231. ;   1457  2    ! Send parameters.
  1232. ;   1458  2    !
  1233. ;   1459  2        SND%PKT%SIZE = -MY%PKT%SIZE;
  1234. ;   1460  2        SND%NPAD = -MY%NPAD;
  1235. ;   1461  2        SND%PADCHAR = -MY%PAD%CHAR;
  1236. ;   1462  2        SND%TIMEOUT = -MY%TIME%OUT;
  1237. ;   1463  2        SND%EOL = -MY%EOL%CHAR;
  1238. ;   1464  2        SND%QUOTE%CHR = -MY%QUOTE%CHAR;
  1239. ;   1465  2        SND%SOH = CHR%SOH;
  1240. ;   1466  2    !
  1241. ;   1467  2    ! Server parameters
  1242. ;   1468  2    !
  1243. ;   1469  2        SRV%TIMEOUT = 5*MY%TIME%OUT;
  1244. ;   1470  2    !
  1245. ;   1471  2    ! Other random parameters
  1246. ;   1472  2    !
  1247. ;   1473  2        PKT%RETRIES = MAX%PKT%RETRIES;        ! Number of retries per message
  1248. ;   1474  2        SI%RETRIES = MAX%SI%RETRIES;        ! Number of retries on send inits
  1249. ;   1475  2        DELAY = INIT%DELAY;
  1250. ;   1476  2        DUPLEX = DP%FULL;                ! Use full duplex
  1251. ;   1477  2        DEBUG%FLAG = FALSE;
  1252. ;   1478  2        WARN%FLAG = FALSE;
  1253. ;   1479  2        ECHO%FLAG = FALSE;
  1254. ;   1480  2        BLK%CHK%TYPE = CHK%1CHAR;            ! Start using single char checksum
  1255. ;   1481  2        CHKTYPE = MY%CHKTYPE;            ! Desired block check type
  1256. ;   1482  2        INI%CHK%TYPE = .CHKTYPE;            ! Same as default for now
  1257. ;   1483  2        DEV%PARITY%FLAG = FALSE;            ! We generate parity
  1258. ;   1484  2        PARITY%TYPE = PR%NONE;            ! No parity
  1259. ;   1485  2        ABT%FLAG = TRUE;                ! Discard incomplete files
  1260. ;   1486  2        FLAG%FILE%OPEN = FALSE;
  1261. ;   1487  2        IBM%CHAR = -1;                ![044] No handsake by default
  1262. ;   1488  2        TY%FIL = TRUE;                ! Default to typing files
  1263. ;   1489  2        TY%PKT = FALSE;                ! But not packet numbers
  1264. ;   1490  2        FIL%NORMAL%FORM = FNM%NORMAL;        ! Default to normal form names
  1265. ;   1491  2        GET%CHR%ROUTINE = GET%FILE;            ![025] Initialize the get-a-char routine
  1266. ;   1492  2        PUT%CHR%ROUTINE = PUT%FILE;            ![025] And the put-a-char
  1267. ;   1493  1        END;                    ! End of MSG%INIT
  1268.  
  1269.  
  1270.     TITLE    KERMSG
  1271.     TWOSEG
  1272.  
  1273.  
  1274.     .REQUEST  SYS:B361LB.REL
  1275.  
  1276.  
  1277.     RELOC    0
  1278. ; RECV%8QUOTE%CHR
  1279. U.37:    BLOCK    1
  1280. ; REPT%CHR
  1281. U.38:    BLOCK    1
  1282. ; RECV%PKT%MSG
  1283. U.39:    BLOCK    1
  1284. ; SEND%PKT%SIZE
  1285. U.40:    BLOCK    1
  1286. ; SEND%NPAD
  1287. U.41:    BLOCK    1
  1288. ; SEND%PADCHAR
  1289. U.42:    BLOCK    1
  1290. ; SEND%EOL
  1291. U.43:    BLOCK    1
  1292. ; SEND%QUOTE%CHR
  1293. U.44:    BLOCK    1
  1294. ; SEND%8QUOTE%CHR
  1295. U.45:    BLOCK    1
  1296. ; SEND%INIT%SIZE
  1297. U.46:    BLOCK    1
  1298. ; INI%CHK%TYPE
  1299. U.47:    BLOCK    1
  1300. ; BLK%CHK%TYPE
  1301. U.48:    BLOCK    1
  1302. ; FLAG%8QUOTE
  1303. U.49:    BLOCK    1
  1304. ; FLAG%REPEAT
  1305. U.50:    BLOCK    1
  1306. ; STATE
  1307. U.51:    BLOCK    1
  1308. ; SIZE
  1309. U.52:    BLOCK    1
  1310. ; OLD%RETRIES
  1311. U.53:    BLOCK    1
  1312. ; NUM%RETRIES
  1313. U.54:    BLOCK    1
  1314. ; MSG%NUMBER
  1315. U.55:    BLOCK    1
  1316. ; REC%SEQ
  1317. U.56:    BLOCK    1
  1318. ; REC%LENGTH
  1319. U.57:    BLOCK    1
  1320. ; REC%TYPE
  1321. U.58:    BLOCK    1
  1322. ; REC%MSG
  1323. U.59:    BLOCK    373
  1324. ; SND%MSG
  1325. U.60:    BLOCK    373
  1326. ; FILE%CHARS
  1327. U.61:    BLOCK    1
  1328. ; TEXT%HEAD%FLAG
  1329. U.62:    BLOCK    1
  1330. ; NO%FILE%NEEDED
  1331. U.63:    BLOCK    1
  1332. ; INIT%PKT%SENT
  1333. U.64:    BLOCK    1
  1334. ; GEN%TYPE
  1335. U.65:    BLOCK    1
  1336. ; GEN%SUBTYPE
  1337. U.66:    BLOCK    1
  1338. ; GET%CHR%ROUTINE
  1339. U.67:    BLOCK    1
  1340. ; PUT%CHR%ROUTINE
  1341. U.68:    BLOCK    1
  1342. FLAG%FILE%OPEN::
  1343.     BLOCK    1
  1344.  
  1345.  
  1346.     EXTERN    RCV%PKT%SIZE, RCV%NPAD, RCV%PADCHAR, RCV%TIMEOUT, RCV%EOL, RCV%QUOTE%CHR, RCV%SOH
  1347.     EXTERN    RCV%8QUOTE%CHR, SET%REPT%CHR, SND%PKT%SIZE, SND%NPAD, SND%PADCHAR, SND%TIMEOUT, SND%EOL
  1348.     EXTERN    SND%QUOTE%CHR, SND%SOH, SEND%TIMEOUT, SRV%TIMEOUT, SND%TOTAL%CHARS, RCV%TOTAL%CHARS
  1349.     EXTERN    SND%DATA%CHARS, RCV%DATA%CHARS, SND%NAKS, RCV%NAKS, SND%COUNT, RCV%COUNT, SMSG%COUNT
  1350.     EXTERN    RMSG%COUNT, SMSG%TOTAL%CHARS, RMSG%TOTAL%CHARS, SMSG%DATA%CHARS, RMSG%DATA%CHARS, SMSG%NAKS
  1351.     EXTERN    RMSG%NAKS, XFR%TIME, TOTAL%TIME, LAST%ERROR, FILE%NAME, FILE%SIZE, SI%RETRIES, PKT%RETRIES
  1352.     EXTERN    DELAY, DUPLEX, PARITY%TYPE, DEV%PARITY%FLAG, CHKTYPE, ABT%FLAG, DEBUG%FLAG, WARN%FLAG
  1353.     EXTERN    IBM%CHAR, ECHO%FLAG, CONNECT%FLAG, ABT%CUR%FILE, ABT%ALL%FILE, TYP%STS%FLAG, TY%FIL
  1354.     EXTERN    TY%PKT, FIL%NORMAL%FORM, GEN%1DATA, GEN%1SIZE, GEN%2DATA, GEN%2SIZE, GEN%3DATA, GEN%3SIZE
  1355.     EXTERN    SEND, IBM%WAIT, RECEIVE, TERM%DUMP, DBG%DUMP, TT%SET%OUTPUT, TT%CHAR, TT%CRLF, TT%NUMBER
  1356.     EXTERN    TT%TEXT, TT%OUTPUT, CRCCLC, XFR%STATUS, KRM%ERROR, SY%LOGOUT, SY%GENERIC, SY%TIME
  1357.     EXTERN    SY%DISMISS, FILE%OPEN, FILE%CLOSE, NEXT%FILE, GET%FILE, PUT%FILE
  1358.  
  1359.  
  1360. FNM%NORMAL==:        1
  1361. FNM%FULL==:        2
  1362. FNM%UNTRAN==:        4
  1363. PR%MIN==:        0
  1364. PR%NONE==:        0
  1365. PR%MARK==:        1
  1366. PR%EVEN==:        2
  1367. PR%ODD==:        3
  1368. PR%SPACE==:        4
  1369. PR%MAX==:        4
  1370. GC%MIN==:        1
  1371. GC%EXIT==:        1
  1372. GC%DIRECTORY==:     2
  1373. GC%DISK%USAGE==:    3
  1374. GC%DELETE==:        4
  1375. GC%TYPE==:        5
  1376. GC%HELP==:        6
  1377. GC%LOGOUT==:        7
  1378. GC%LGN==:        10
  1379. GC%CONNECT==:        11
  1380. GC%RENAME==:        12
  1381. GC%COPY==:        13
  1382. GC%WHO==:        14
  1383. GC%SEND%MSG==:        15
  1384. GC%STATUS==:        16
  1385. GC%COMMAND==:        17
  1386. GC%KERMIT==:        20
  1387. GC%JOURNAL==:        21
  1388. GC%VARIABLE==:        22
  1389. GC%PROGRAM==:        23
  1390. GC%MAX==:        23
  1391. DP%FULL==:        0
  1392. DP%HALF==:        1
  1393. CHK%1CHAR==:        61
  1394. CHK%2CHAR==:        62
  1395. CHK%CRC==:        63
  1396. MAX%MSG==:        1752
  1397.  
  1398.  
  1399. AC0=    0
  1400. AC1=    1
  1401. AC2=    2
  1402. AC3=    3
  1403. AC4=    4
  1404. AC5=    5
  1405. AC6=    6
  1406. AC7=    7
  1407. AC10=    10
  1408. AC11=    11
  1409. AC12=    12
  1410. AC13=    13
  1411. AC14=    14
  1412. FP=    15
  1413. AC16=    16
  1414. SP=    17
  1415.  
  1416.  
  1417.     RELOC    400000
  1418. MSG%INIT::
  1419.     MOVEI    AC1,120                ;                                        1447
  1420.     MOVEM    AC1,RCV%PKT%SIZE
  1421.     SETZM    RCV%NPAD            ;                                        1448
  1422.     SETZM    RCV%PADCHAR            ;                                        1449
  1423.     MOVEI    AC1,74                ;                                        1450
  1424.     MOVEM    AC1,RCV%TIMEOUT
  1425.     MOVEI    AC1,15                ;                                        1451
  1426.     MOVEM    AC1,RCV%EOL
  1427.     MOVEI    AC1,43                ;                                        1452
  1428.     MOVEM    AC1,RCV%QUOTE%CHR
  1429.     MOVEI    AC1,1                ;                                        1453
  1430.     MOVEM    AC1,RCV%SOH
  1431.     MOVEI    AC1,46                ;                                        1454
  1432.     MOVEM    AC1,RCV%8QUOTE%CHR
  1433.     MOVEI    AC1,176                ;                                        1455
  1434.     MOVEM    AC1,SET%REPT%CHR
  1435.     HRROI    AC1,-120            ;                                        1459
  1436.     MOVEM    AC1,SND%PKT%SIZE
  1437.     SETZM    SND%NPAD            ;                                        1460
  1438.     SETZM    SND%PADCHAR            ;                                        1461
  1439.     HRROI    AC1,-74                ;                                        1462
  1440.     MOVEM    AC1,SND%TIMEOUT
  1441.     HRROI    AC1,-15                ;                                        1463
  1442.     MOVEM    AC1,SND%EOL
  1443.     HRROI    AC1,-43                ;                                        1464
  1444.     MOVEM    AC1,SND%QUOTE%CHR
  1445.     MOVEI    AC1,1                ;                                        1465
  1446.     MOVEM    AC1,SND%SOH
  1447.     MOVEI    AC1,454                ;                                        1469
  1448.     MOVEM    AC1,SRV%TIMEOUT
  1449.     MOVEI    AC1,20                ;                                        1473
  1450.     MOVEM    AC1,PKT%RETRIES
  1451.     MOVEI    AC1,5                ;                                        1474
  1452.     MOVEM    AC1,SI%RETRIES
  1453.     MOVEI    AC1,5                ;                                        1475
  1454.     MOVEM    AC1,DELAY
  1455.     SETZM    DUPLEX                ;                                        1476
  1456.     SETZM    DEBUG%FLAG            ;                                        1477
  1457.     SETZM    WARN%FLAG            ;                                        1478
  1458.     SETZM    ECHO%FLAG            ;                                        1479
  1459.     MOVEI    AC1,61                ;                                        1480
  1460.     MOVEM    AC1,U.48
  1461.     MOVEI    AC1,61                ;                                        1481
  1462.     MOVEM    AC1,CHKTYPE
  1463.     MOVEM    AC1,U.47            ;                                        1482
  1464.     SETZM    DEV%PARITY%FLAG            ;                                        1483
  1465.     SETZM    PARITY%TYPE            ;                                        1484
  1466.     MOVEI    AC1,1                ;                                        1485
  1467.     MOVEM    AC1,ABT%FLAG
  1468.     SETZM    FLAG%FILE%OPEN            ;                                        1486
  1469.     SETOM    IBM%CHAR            ;                                        1487
  1470.     MOVEI    AC1,1                ;                                        1488
  1471.     MOVEM    AC1,TY%FIL
  1472.     SETZM    TY%PKT                ;                                        1489
  1473.     MOVEI    AC1,1                ;                                        1490
  1474.     MOVEM    AC1,FIL%NORMAL%FORM
  1475.     MOVEI    AC1,GET%FILE            ;                                        1491
  1476.     MOVEM    AC1,U.67
  1477.     MOVEI    AC1,PUT%FILE            ;                                        1492
  1478.     MOVEM    AC1,U.68
  1479.     POPJ    SP,                ;                                        1403
  1480.  
  1481. ; Routine Size:  61 words
  1482.  
  1483.  
  1484. ;   1494  1    
  1485. ;   1495  1    %SBTTL 'SND%ERROR'
  1486. ;   1496  1    
  1487. ;   1497  1    GLOBAL ROUTINE SND%ERROR (COUNT, ADDRESS) : NOVALUE =
  1488. ;   1498  1    
  1489. ;   1499  1    !++
  1490. ;   1500  1    ! FUNCTIONAL DESCRIPTION:
  1491. ;   1501  1    !
  1492. ;   1502  1    !    This routine will send an error packet to the remote KERMIT.  It
  1493. ;   1503  1    !    is called with the count of characters and the address of the text.
  1494. ;   1504  1    !
  1495. ;   1505  1    ! CALLING SEQUENCE:
  1496. ;   1506  1    !
  1497. ;   1507  1    !    SND%ERROR(COUNT, %ASCII 'Error text');
  1498. ;   1508  1    !
  1499. ;   1509  1    ! INPUT PARAMETERS:
  1500. ;   1510  1    !
  1501. ;   1511  1    !    None.
  1502. ;   1512  1    !
  1503. ;   1513  1    ! IMPLICIT INPUTS:
  1504. ;   1514  1    !
  1505. ;   1515  1    !    None.
  1506. ;   1516  1    !
  1507. ;   1517  1    ! OUTPUT PARAMETERS:
  1508. ;   1518  1    !
  1509. ;   1519  1    !    None.
  1510. ;   1520  1    !
  1511. ;   1521  1    ! IMPLICIT OUTPUTS:
  1512. ;   1522  1    !
  1513. ;   1523  1    !    None.
  1514. ;   1524  1    !
  1515. ;   1525  1    ! COMPLETION CODES:
  1516. ;   1526  1    !
  1517. ;   1527  1    !    None.
  1518. ;   1528  1    !
  1519. ;   1529  1    ! SIDE EFFECTS:
  1520. ;   1530  1    !
  1521. ;   1531  1    !
  1522. ;   1532  1    !--
  1523. ;   1533  1    
  1524. ;   1534  2        BEGIN
  1525. ;   1535  2    !
  1526. ;   1536  2    ! Pack the message into the buffer
  1527. ;   1537  2    !
  1528. ;   1538  2        SET%STRING (CH$PTR (.ADDRESS), .COUNT, TRUE);
  1529. ;   1539  2        BFR%FILL (TRUE);
  1530. ;   1540  2        SET%STRING (0, 0, FALSE);
  1531. ;   1541  2    !
  1532. ;   1542  2    ! Save the last error message also
  1533. ;   1543  2    !
  1534. ;   1544  2    
  1535. ;   1545  2        IF .COUNT GTR MAX%MSG THEN COUNT = MAX%MSG;
  1536. ;   1546  2    
  1537. ;   1547  2        CH$COPY (.COUNT, CH$PTR (.ADDRESS), 0, MAX%MSG + 1, CH$PTR (LAST%ERROR));
  1538. ;   1548  2    
  1539. ;   1549  2        IF NOT SEND%PACKET (MSG%ERROR, .SIZE, .MSG%NUMBER) THEN RETURN KER%ABORTED;
  1540. ;   1550  2    
  1541. ;   1551  1        END;                    ! End of SND%ERROR
  1542.  
  1543.  
  1544. SND%ERROR::
  1545.     PUSH    SP,AC14                ;                                        1497
  1546.     PUSH    SP,AC16
  1547.     MOVE    AC16,-3(SP)            ;                                        1538
  1548.     MOVEI    AC1,-1(AC16)
  1549.     HRLI    AC1,10700
  1550.     PUSH    SP,AC1
  1551.     MOVE    AC14,-5(SP)
  1552.     PUSH    SP,AC14
  1553.     PUSH    SP,C.2
  1554.     PUSHJ    SP,U.30
  1555.     PUSH    SP,C.2                ;                                        1539
  1556.     PUSHJ    SP,U.29
  1557.     SETZM    -2(SP)                ;                                        1540
  1558.     SETZM    -1(SP)
  1559.     SETZM    0(SP)
  1560.     PUSHJ    SP,U.30
  1561.     CAIG    AC14,1752            ;                                        1545
  1562.     JRST    L.1
  1563.     MOVEI    AC1,1752
  1564.     MOVEM    AC1,-10(SP)
  1565. L.1:    MOVEI    AC2,-1(AC16)            ;                                        1547
  1566.     HRLI    AC2,10700
  1567.     MOVE    AC1,-10(SP)
  1568.     MOVEI    AC4,1753
  1569.     MOVE    AC5,C.3
  1570.     EXTEND    AC1,C.1
  1571.     JFCL    
  1572.     PUSH    SP,C.4                ;                                        1549
  1573.     PUSH    SP,U.52
  1574.     PUSH    SP,U.55
  1575.     PUSHJ    SP,U.24
  1576.     ADJSP    SP,-7
  1577.     POP    SP,AC16                ;                                        1497
  1578.     POP    SP,AC14
  1579.     POPJ    SP,
  1580. C.1:    MOVSLJ    
  1581.     EXP    0
  1582. C.2:    EXP    1
  1583. C.3:    POINT    7,LAST%ERROR-1,34
  1584. C.4:    EXP    105
  1585.  
  1586. ; Routine Size:  40 words
  1587.  
  1588.  
  1589. ;   1552  1    
  1590. ;   1553  1    %SBTTL 'SERVER - Server mode'
  1591. ;   1554  1    
  1592. ;   1555  1    GLOBAL ROUTINE SERVER =
  1593. ;   1556  1    
  1594. ;   1557  1    !++
  1595. ;   1558  1    ! FUNCTIONAL DESCRIPTION:
  1596. ;   1559  1    !
  1597. ;   1560  1    !    This routine will handle the server function in the v2.0 protocol
  1598. ;   1561  1    !    for KERMIT.  This routine by it's nature will call various operating
  1599. ;   1562  1    !    system routines to do things like logging off the system.
  1600. ;   1563  1    !
  1601. ;   1564  1    ! CALLING SEQUENCE:
  1602. ;   1565  1    !
  1603. ;   1566  1    !    EXIT%FLAG = SERVER();
  1604. ;   1567  1    !
  1605. ;   1568  1    ! INPUT PARAMETERS:
  1606. ;   1569  1    !
  1607. ;   1570  1    !    None.
  1608. ;   1571  1    !
  1609. ;   1572  1    ! IMPLICIT INPUTS:
  1610. ;   1573  1    !
  1611. ;   1574  1    !    None.
  1612. ;   1575  1    !
  1613. ;   1576  1    ! OUTPUT PARAMETERS:
  1614. ;   1577  1    !
  1615. ;   1578  1    !    None.
  1616. ;   1579  1    !
  1617. ;   1580  1    ! IMPLICIT OUTPUTS:
  1618. ;   1581  1    !
  1619. ;   1582  1    !    None.
  1620. ;   1583  1    !
  1621. ;   1584  1    ! COMPLETION CODES:
  1622. ;   1585  1    !
  1623. ;   1586  1    !    None.
  1624. ;   1587  1    !
  1625. ;   1588  1    ! SIDE EFFECTS:
  1626. ;   1589  1    !
  1627. ;   1590  1    !    None.
  1628. ;   1591  1    !
  1629. ;   1592  1    !--
  1630. ;   1593  1    
  1631. ;   1594  2        BEGIN
  1632. ;   1595  2    
  1633. ;   1596  2        LOCAL
  1634. ;   1597  2        STATUS;                    ! Status returned by various routines
  1635. ;   1598  2    
  1636. ;   1599  2        DO
  1637. ;   1600  3        BEGIN
  1638. ;   1601  3        INIT%XFR ();
  1639. ;   1602  3        XFR%STATUS (%C'T', %C'I');        ! Now idle
  1640. ;   1603  3        STATUS = DO%TRANSACTION (STATE%ID);
  1641. ;   1604  3        END
  1642. ;   1605  2        UNTIL .STATUS EQL KER%EXIT OR .STATUS EQL KER%ABORTED;
  1643. ;   1606  2    
  1644. ;   1607  2        RETURN .STATUS;
  1645. ;   1608  1        END;                    ! End of GLOBAL ROUTINE SERVER
  1646.  
  1647.  
  1648. SERVER::PUSH    SP,AC16                ;                                        1555
  1649. L.2:    PUSHJ    SP,U.32                ;                                        1601
  1650.     PUSH    SP,C.5                ;                                        1602
  1651.     PUSH    SP,C.6
  1652.     PUSHJ    SP,XFR%STATUS
  1653.     PUSH    SP,C.7                ;                                        1603
  1654.     PUSHJ    SP,U.1
  1655.     MOVE    AC16,AC1
  1656.     ADJSP    SP,-3                ;                                        1600
  1657.     CAIN    AC16,223            ;                                        1605
  1658.     JRST    L.3
  1659.     CAIE    AC16,312
  1660.     JRST    L.2                ;                                        1599
  1661. L.3:    MOVE    AC1,AC16            ;                                        1594
  1662.     POP    SP,AC16                ;                                        1555
  1663.     POPJ    SP,
  1664. C.5:    EXP    124
  1665. C.6:    EXP    111
  1666. C.7:    EXP    16
  1667.  
  1668. ; Routine Size:  19 words
  1669.  
  1670.  
  1671. ;   1609  1    
  1672. ;   1610  1    %SBTTL 'SEND%SWITCH'
  1673. ;   1611  1    
  1674. ;   1612  1    GLOBAL ROUTINE SEND%SWITCH =
  1675. ;   1613  1    
  1676. ;   1614  1    !++
  1677. ;   1615  1    ! FUNCTIONAL DESCRIPTION:
  1678. ;   1616  1    !
  1679. ;   1617  1    !    This routine is the state table switcher for sending files.  It
  1680. ;   1618  1    !    loops until either it is finished or an error is encountered.  The
  1681. ;   1619  1    !    routines called by SEND%SWITCH are responsible for changing the state.
  1682. ;   1620  1    !
  1683. ;   1621  1    ! CALLING SEQUENCE:
  1684. ;   1622  1    !
  1685. ;   1623  1    !    SEND%SWITCH();
  1686. ;   1624  1    !
  1687. ;   1625  1    ! INPUT PARAMETERS:
  1688. ;   1626  1    !
  1689. ;   1627  1    !    None.
  1690. ;   1628  1    !
  1691. ;   1629  1    ! IMPLICIT INPUTS:
  1692. ;   1630  1    !
  1693. ;   1631  1    !    None.
  1694. ;   1632  1    !
  1695. ;   1633  1    ! OUTPUT PARAMETERS:
  1696. ;   1634  1    !
  1697. ;   1635  1    !    Returns:
  1698. ;   1636  1    !        TRUE - File sent correctly.
  1699. ;   1637  1    !        FALSE - Aborted sending the file.
  1700. ;   1638  1    !
  1701. ;   1639  1    ! IMPLICIT OUTPUTS:
  1702. ;   1640  1    !
  1703. ;   1641  1    !    None.
  1704. ;   1642  1    !
  1705. ;   1643  1    ! COMPLETION CODES:
  1706. ;   1644  1    !
  1707. ;   1645  1    !    None.
  1708. ;   1646  1    !
  1709. ;   1647  1    ! SIDE EFFECTS:
  1710. ;   1648  1    !
  1711. ;   1649  1    !    None.
  1712. ;   1650  1    !
  1713. ;   1651  1    !--
  1714. ;   1652  1    
  1715. ;   1653  2        BEGIN
  1716. ;   1654  2    
  1717. ;   1655  2        LOCAL
  1718. ;   1656  2        STATUS;                    ! Status result
  1719. ;   1657  2    
  1720. ;   1658  2        IF .CONNECT%FLAG THEN SY%DISMISS (.DELAY);    ! Sleep if the user wanted us to
  1721. ;   1659  2    
  1722. ;   1660  2        INIT%XFR ();                ! Initialize for this transfer
  1723. ;   1661  2        TEXT%HEAD%FLAG = FALSE;            ! Set text flag correctly
  1724. ;   1662  2        XFR%STATUS (%C'I', %C'S');            ! Start of file send
  1725. ;   1663  2        STATUS = DO%TRANSACTION (STATE%S);        ! Call routine to do real work
  1726. ;   1664  2        XFR%STATUS (%C'T', %C'S');            ! Done with send
  1727. ;   1665  2        RETURN .STATUS;                ! Return the result
  1728. ;   1666  1        END;
  1729.  
  1730.  
  1731. SEND%SWITCH::
  1732.     PUSH    SP,AC16                ;                                        1612
  1733.     MOVEI    AC1,1                ;                                        1658
  1734.     TDNN    AC1,CONNECT%FLAG
  1735.     JRST    L.4
  1736.     PUSH    SP,DELAY
  1737.     PUSHJ    SP,SY%DISMISS
  1738.     ADJSP    SP,-1
  1739. L.4:    PUSHJ    SP,U.32                ;                                        1660
  1740.     SETZM    U.62                ;                                        1661
  1741.     PUSH    SP,C.6                ;                                        1662
  1742.     PUSH    SP,C.8
  1743.     PUSHJ    SP,XFR%STATUS
  1744.     PUSH    SP,C.2                ;                                        1663
  1745.     PUSHJ    SP,U.1
  1746.     MOVE    AC16,AC1
  1747.     PUSH    SP,C.5                ;                                        1664
  1748.     PUSH    SP,C.8
  1749.     PUSHJ    SP,XFR%STATUS
  1750.     ADJSP    SP,-5                ;                                        1665
  1751.     MOVE    AC1,AC16            ;                                        1653
  1752.     POP    SP,AC16                ;                                        1612
  1753.     POPJ    SP,
  1754. C.8:    EXP    123
  1755.  
  1756. ; Routine Size:  23 words
  1757.  
  1758.  
  1759. ;   1667  1    
  1760. ;   1668  1    %SBTTL 'REC%SWITCH'
  1761. ;   1669  1    
  1762. ;   1670  1    GLOBAL ROUTINE REC%SWITCH =
  1763. ;   1671  1    
  1764. ;   1672  1    !++
  1765. ;   1673  1    ! FUNCTIONAL DESCRIPTION:
  1766. ;   1674  1    !
  1767. ;   1675  1    !    This routine will cause file(s) to be received by the remote
  1768. ;   1676  1    !    KERMIT.  This routine contains the main loop for the sending of the
  1769. ;   1677  1    !    data.
  1770. ;   1678  1    !
  1771. ;   1679  1    ! CALLING SEQUENCE:
  1772. ;   1680  1    !
  1773. ;   1681  1    !    REC%SWITCH();
  1774. ;   1682  1    !
  1775. ;   1683  1    ! INPUT PARAMETERS:
  1776. ;   1684  1    !
  1777. ;   1685  1    !    None.
  1778. ;   1686  1    !
  1779. ;   1687  1    ! IMPLICIT INPUTS:
  1780. ;   1688  1    !
  1781. ;   1689  1    !    FILE%DESC - Descriptor describing the file to be received by
  1782. ;   1690  1    !        the remote KERMIT.
  1783. ;   1691  1    !
  1784. ;   1692  1    ! OUTPUT PARAMETERS:
  1785. ;   1693  1    !
  1786. ;   1694  1    !    None.
  1787. ;   1695  1    !
  1788. ;   1696  1    ! IMPLICIT OUTPUTS:
  1789. ;   1697  1    !
  1790. ;   1698  1    !    None.
  1791. ;   1699  1    !
  1792. ;   1700  1    ! COMPLETION CODES:
  1793. ;   1701  1    !
  1794. ;   1702  1    !    True - File received correctly.
  1795. ;   1703  1    !    FALSE - File transfer aborted.
  1796. ;   1704  1    !
  1797. ;   1705  1    ! SIDE EFFECTS:
  1798. ;   1706  1    !
  1799. ;   1707  1    !    None.
  1800. ;   1708  1    !
  1801. ;   1709  1    !--
  1802. ;   1710  1    
  1803. ;   1711  2        BEGIN
  1804. ;   1712  2    
  1805. ;   1713  2        LOCAL
  1806. ;   1714  2        INIT%STATE,                ! State to start up DO%TRANSACTION in
  1807. ;   1715  2        STATUS;                    ! Status returned by various routines
  1808. ;   1716  2    
  1809. ;   1717  2        INIT%STATE = STATE%R;            ! Initialize the state
  1810. ;   1718  2        MSG%NUMBER = 0;
  1811. ;   1719  2        INIT%XFR ();                ! Initialize the per transfer info
  1812. ;   1720  2    !
  1813. ;   1721  2    ! Determine if they said REC <file-spec>
  1814. ;   1722  2    !    Send MSG%RCV%INIT and then receive the file
  1815. ;   1723  2    !
  1816. ;   1724  2    
  1817. ;   1725  2        IF .FILE%SIZE GTR 0
  1818. ;   1726  2        THEN
  1819. ;   1727  3        BEGIN
  1820. ;   1728  3        GEN%TYPE = MSG%RCV%INIT;        ! Use receive-init message
  1821. ;   1729  3        CH$MOVE (.FILE%SIZE, CH$PTR (FILE%NAME), CH$PTR (GEN%1DATA));
  1822. ;   1730  3        GEN%1SIZE = .FILE%SIZE;            ! Save the length
  1823. ;   1731  3        INIT%STATE = STATE%SI;            ! Start out with server init
  1824. ;   1732  2        END;
  1825. ;   1733  2    
  1826. ;   1734  2    !
  1827. ;   1735  2    ! Now receive the file normally
  1828. ;   1736  2    !
  1829. ;   1737  2        XFR%STATUS (%C'I', %C'R');            ! Start of a file receive
  1830. ;   1738  2        STATUS = DO%TRANSACTION (.INIT%STATE);
  1831. ;   1739  2        XFR%STATUS (%C'T', %C'R');            ! End of file receive
  1832. ;   1740  2        RETURN .STATUS;                ! Return the result
  1833. ;   1741  1        END;                    ! End of REC%SWITCH
  1834.  
  1835.  
  1836. REC%SWITCH::
  1837.     PUSH    SP,AC16                ;                                        1670
  1838.     MOVEI    AC16,6                ;                                        1717
  1839.     SETZM    U.55                ;                                        1718
  1840.     PUSHJ    SP,U.32                ;                                        1719
  1841.     MOVE    AC3,FILE%SIZE            ;                                        1725
  1842.     JUMPLE    AC3,L.5
  1843.     MOVEI    AC1,122                ;                                        1728
  1844.     MOVEM    AC1,U.65
  1845.     MOVE    AC1,AC3                ;                                        1729
  1846.     MOVE    AC2,C.10
  1847.     MOVE    AC4,AC3
  1848.     MOVE    AC5,C.11
  1849.     EXTEND    AC1,C.9
  1850.     JFCL    
  1851.     MOVEM    AC3,GEN%1SIZE            ;                                        1730
  1852.     MOVEI    AC16,15                ;                                        1731
  1853. L.5:    PUSH    SP,C.6                ;                                        1737
  1854.     PUSH    SP,C.12
  1855.     PUSHJ    SP,XFR%STATUS
  1856.     MOVEM    AC16,0(SP)            ;                                        1738
  1857.     PUSHJ    SP,U.1
  1858.     MOVE    AC16,AC1
  1859.     PUSH    SP,C.5                ;                                        1739
  1860.     PUSH    SP,C.12
  1861.     PUSHJ    SP,XFR%STATUS
  1862.     ADJSP    SP,-4                ;                                        1740
  1863.     MOVE    AC1,AC16            ;                                        1711
  1864.     POP    SP,AC16                ;                                        1670
  1865.     POPJ    SP,
  1866. C.9:    MOVSLJ    
  1867. C.10:    POINT    7,FILE%NAME-1,34
  1868. C.11:    POINT    7,GEN%1DATA-1,34
  1869. C.12:    EXP    122
  1870.  
  1871. ; Routine Size:  33 words
  1872.  
  1873.  
  1874. ;   1742  1    
  1875. ;   1743  1    %SBTTL 'Server -- DO%GENERIC - Execute a generic command'
  1876. ;   1744  1    
  1877. ;   1745  1    GLOBAL ROUTINE DO%GENERIC (TYPE) =
  1878. ;   1746  1    
  1879. ;   1747  1    !++
  1880. ;   1748  1    ! FUNCTIONAL DESCRIPTION:
  1881. ;   1749  1    !
  1882. ;   1750  1    !    This routine will send a generic command to the remote Kermit.
  1883. ;   1751  1    !    it will do all the processing required for the generic command
  1884. ;   1752  1    !    that was executed.  It will return to the caller after the
  1885. ;   1753  1    !    command has be executed.
  1886. ;   1754  1    !
  1887. ;   1755  1    ! CALLING SEQUENCE:
  1888. ;   1756  1    !
  1889. ;   1757  1    !    STATUS = DO%GENERIC (Command-type);
  1890. ;   1758  1    !
  1891. ;   1759  1    ! INPUT PARAMETERS:
  1892. ;   1760  1    !
  1893. ;   1761  1    !    Command-type -- Command type to be executed.
  1894. ;   1762  1    !
  1895. ;   1763  1    ! IMPLICIT INPUTS:
  1896. ;   1764  1    !
  1897. ;   1765  1    !    None.
  1898. ;   1766  1    !
  1899. ;   1767  1    ! OUTPUT PARAMETERS:
  1900. ;   1768  1    !
  1901. ;   1769  1    !    None.
  1902. ;   1770  1    !
  1903. ;   1771  1    ! IMPLICIT OUTPUTS:
  1904. ;   1772  1    !
  1905. ;   1773  1    !    None.
  1906. ;   1774  1    !
  1907. ;   1775  1    ! COMPLETION CODES:
  1908. ;   1776  1    !
  1909. ;   1777  1    !    None.
  1910. ;   1778  1    !
  1911. ;   1779  1    ! SIDE EFFECTS:
  1912. ;   1780  1    !
  1913. ;   1781  1    !    None.
  1914. ;   1782  1    !
  1915. ;   1783  1    !--
  1916. ;   1784  1    
  1917. ;   1785  2        BEGIN
  1918. ;   1786  2    
  1919. ;   1787  2        LOCAL
  1920. ;   1788  2        INIT%STATE;                ! Initial state for FSM
  1921. ;   1789  2    
  1922. ;   1790  2    !
  1923. ;   1791  2    ! Set up the per transfer items
  1924. ;   1792  2    !
  1925. ;   1793  2        INIT%XFR ();
  1926. ;   1794  2        NUM%RETRIES = 0;
  1927. ;   1795  2        MSG%NUMBER = 0;
  1928. ;   1796  2    !
  1929. ;   1797  2    ! These are all generic commands
  1930. ;   1798  2    !
  1931. ;   1799  2        GEN%TYPE = MSG%GENERIC;
  1932. ;   1800  2    !
  1933. ;   1801  2    ! Assume we will not need server init
  1934. ;   1802  2    !
  1935. ;   1803  2        INIT%STATE = STATE%SG;
  1936. ;   1804  2    
  1937. ;   1805  2        CASE .TYPE FROM GC%MIN TO GC%MAX OF
  1938. ;   1806  2        SET
  1939. ;   1807  2    
  1940. ;   1808  2        [GC%EXIT] :
  1941. ;   1809  2            GEN%SUBTYPE = MSG%GEN%EXIT;
  1942. ;   1810  2    
  1943. ;   1811  2        [GC%LOGOUT] :
  1944. ;   1812  2            GEN%SUBTYPE = MSG%GEN%LOGOUT;
  1945. ;   1813  2    
  1946. ;   1814  2        [GC%DIRECTORY] :
  1947. ;   1815  3            BEGIN
  1948. ;   1816  3            INIT%STATE = STATE%SI;        ! We will need server-init
  1949. ;   1817  3            GEN%SUBTYPE = MSG%GEN%DIRECTORY;
  1950. ;   1818  2            END;
  1951. ;   1819  2    
  1952. ;   1820  2        [GC%DISK%USAGE] :
  1953. ;   1821  3            BEGIN
  1954. ;   1822  3            INIT%STATE = STATE%SI;        ! We will need server-init
  1955. ;   1823  3            GEN%SUBTYPE = MSG%GEN%DISK%USAGE;
  1956. ;   1824  2            END;
  1957. ;   1825  2    
  1958. ;   1826  2        [GC%DELETE] :
  1959. ;   1827  2            GEN%SUBTYPE = MSG%GEN%DELETE;
  1960. ;   1828  2    
  1961. ;   1829  2        [GC%TYPE] :
  1962. ;   1830  3            BEGIN
  1963. ;   1831  3            INIT%STATE = STATE%SI;        ! We will need server-init
  1964. ;   1832  3            GEN%SUBTYPE = MSG%GEN%TYPE;
  1965. ;   1833  2            END;
  1966. ;   1834  2    
  1967. ;   1835  2        [GC%HELP] :
  1968. ;   1836  3            BEGIN
  1969. ;   1837  3            INIT%STATE = STATE%SI;        ! We will need server-init
  1970. ;   1838  3            GEN%SUBTYPE = MSG%GEN%HELP;
  1971. ;   1839  2            END;
  1972. ;   1840  2    
  1973. ;   1841  2        [GC%LGN] :
  1974. ;   1842  2            GEN%SUBTYPE = MSG%GEN%LOGIN;    ! Login just gets ACK
  1975. ;   1843  2    
  1976. ;   1844  2        [GC%CONNECT] :
  1977. ;   1845  2            GEN%SUBTYPE = MSG%GEN%CONNECT;    ! CWD just gets ACK
  1978. ;   1846  2    
  1979. ;   1847  2        [GC%RENAME] :
  1980. ;   1848  2            GEN%SUBTYPE = MSG%GEN%RENAME;    ! Rename file just needs ACK
  1981. ;   1849  2    
  1982. ;   1850  2        [GC%COPY] :
  1983. ;   1851  2            GEN%SUBTYPE = MSG%GEN%COPY;        ! Copy file just needs ACK
  1984. ;   1852  2    
  1985. ;   1853  2        [GC%WHO] :
  1986. ;   1854  3            BEGIN
  1987. ;   1855  3            INIT%STATE = STATE%SI;        ! May get large response
  1988. ;   1856  3            GEN%SUBTYPE = MSG%GEN%WHO;
  1989. ;   1857  2            END;
  1990. ;   1858  2    
  1991. ;   1859  2        [GC%SEND%MSG] :
  1992. ;   1860  2            GEN%SUBTYPE = MSG%GEN%SEND;        ! Just need an ACK
  1993. ;   1861  2    
  1994. ;   1862  2        [GC%STATUS] :
  1995. ;   1863  3            BEGIN
  1996. ;   1864  3            INIT%STATE = STATE%SI;        ! May get large response
  1997. ;   1865  3            GEN%SUBTYPE = MSG%GEN%QUERY;
  1998. ;   1866  2            END;
  1999. ;   1867  2    
  2000. ;   1868  2        [GC%COMMAND] :
  2001. ;   1869  3            BEGIN
  2002. ;   1870  3            INIT%STATE = STATE%SI;        ! Large response likely
  2003. ;   1871  3            GEN%TYPE = MSG%COMMAND;        ! This is host command
  2004. ;   1872  2            END;
  2005. ;   1873  2    
  2006. ;   1874  2        [GC%KERMIT] :
  2007. ;   1875  2            GEN%TYPE = MSG%KERMIT;        ! Perform Kermit command (short response)
  2008. ;   1876  2    
  2009. ;   1877  2        [GC%PROGRAM] :
  2010. ;   1878  3            BEGIN
  2011. ;   1879  3            INIT%STATE = STATE%SI;        ! Assume large response
  2012. ;   1880  3            GEN%SUBTYPE = MSG%GEN%PROGRAM;    ! Generic program command
  2013. ;   1881  2            END;
  2014. ;   1882  2    
  2015. ;   1883  2        [GC%JOURNAL] :
  2016. ;   1884  2            GEN%SUBTYPE = MSG%GEN%JOURNAL;    ! Do journal function (short reply)
  2017. ;   1885  2    
  2018. ;   1886  2        [GC%VARIABLE] :
  2019. ;   1887  2            GEN%SUBTYPE = MSG%GEN%VARIABLE;    ! Set or get a variable value
  2020. ;   1888  2    
  2021. ;   1889  2        [INRANGE, OUTRANGE] :
  2022. ;   1890  3            BEGIN
  2023. ;   1891  3            KRM%ERROR (KER%UNIMPLGEN);
  2024. ;   1892  3            RETURN STATE%A;
  2025. ;   1893  2            END;
  2026. ;   1894  2        TES;
  2027. ;   1895  2    
  2028. ;   1896  2        RETURN DO%TRANSACTION (.INIT%STATE);    ! Go do the command
  2029. ;   1897  1        END;                    ! End of DO%GENERIC
  2030.  
  2031.  
  2032. DO%GENERIC::
  2033.     PUSH    SP,AC16                ;                                        1745
  2034.     PUSHJ    SP,U.32                ;                                        1793
  2035.     SETZM    U.54                ;                                        1794
  2036.     SETZM    U.55                ;                                        1795
  2037.     MOVEI    AC1,107                ;                                        1799
  2038.     MOVEM    AC1,U.65
  2039.     MOVEI    AC16,14                ;                                        1803
  2040.     MOVE    AC1,-2(SP)            ;                                        1805
  2041.     SOJL    AC1,L.7
  2042.     CAIGE    AC1,23
  2043.     JRST    L.6(AC1)
  2044.     JRST    L.7
  2045. L.6:    JRST    L.8
  2046.     JRST    L.10
  2047.     JRST    L.11
  2048.     JRST    L.12
  2049.     JRST    L.13
  2050.     JRST    L.14
  2051.     JRST    L.9
  2052.     JRST    L.15
  2053.     JRST    L.16
  2054.     JRST    L.17
  2055.     JRST    L.18
  2056.     JRST    L.19
  2057.     JRST    L.20
  2058.     JRST    L.21
  2059.     JRST    L.22
  2060.     JRST    L.23
  2061.     JRST    L.26
  2062.     JRST    L.27
  2063.     JRST    L.25
  2064. L.7:    PUSH    SP,C.13                ;                                        1891
  2065.     PUSHJ    SP,KRM%ERROR
  2066.     ADJSP    SP,-1                ;                                        1892
  2067.     MOVEI    AC1,12                ;                                        1890
  2068.     JRST    L.30
  2069. L.8:    MOVEI    AC1,106                ;                                        1809
  2070.     JRST    L.28
  2071. L.9:    MOVEI    AC1,114                ;                                        1812
  2072.     JRST    L.28
  2073. L.10:    MOVEI    AC16,15                ;                                        1816
  2074.     MOVEI    AC1,104                ;                                        1817
  2075.     JRST    L.28
  2076. L.11:    MOVEI    AC16,15                ;                                        1822
  2077.     MOVEI    AC1,125                ;                                        1823
  2078.     JRST    L.28
  2079. L.12:    MOVEI    AC1,105                ;                                        1827
  2080.     JRST    L.28
  2081. L.13:    MOVEI    AC16,15                ;                                        1831
  2082.     MOVEI    AC1,124                ;                                        1832
  2083.     JRST    L.28
  2084. L.14:    MOVEI    AC16,15                ;                                        1837
  2085.     MOVEI    AC1,110                ;                                        1838
  2086.     JRST    L.28
  2087. L.15:    MOVEI    AC1,111                ;                                        1842
  2088.     JRST    L.28
  2089. L.16:    MOVEI    AC1,103                ;                                        1845
  2090.     JRST    L.28
  2091. L.17:    MOVEI    AC1,122                ;                                        1848
  2092.     JRST    L.28
  2093. L.18:    MOVEI    AC1,113                ;                                        1851
  2094.     JRST    L.28
  2095. L.19:    MOVEI    AC16,15                ;                                        1855
  2096.     MOVEI    AC1,127                ;                                        1856
  2097.     JRST    L.28
  2098. L.20:    MOVEI    AC1,115                ;                                        1860
  2099.     JRST    L.28
  2100. L.21:    MOVEI    AC16,15                ;                                        1864
  2101.     MOVEI    AC1,121                ;                                        1865
  2102.     JRST    L.28
  2103. L.22:    MOVEI    AC16,15                ;                                        1870
  2104.     MOVEI    AC1,103                ;                                        1871
  2105.     JRST    L.24
  2106. L.23:    MOVEI    AC1,113                ;                                        1875
  2107. L.24:    MOVEM    AC1,U.65
  2108.     JRST    L.29                ;                                        1805
  2109. L.25:    MOVEI    AC16,15                ;                                        1879
  2110.     MOVEI    AC1,120                ;                                        1880
  2111.     JRST    L.28
  2112. L.26:    MOVEI    AC1,112                ;                                        1884
  2113.     JRST    L.28
  2114. L.27:    MOVEI    AC1,126                ;                                        1887
  2115. L.28:    MOVEM    AC1,U.66
  2116. L.29:    PUSH    SP,AC16                ;                                        1896
  2117.     PUSHJ    SP,U.1
  2118.     ADJSP    SP,-1
  2119. L.30:    POP    SP,AC16                ;                                        1745
  2120.     POPJ    SP,
  2121. C.13:    EXP    232
  2122.  
  2123. ; Routine Size:  89 words
  2124.  
  2125.  
  2126. ;   1898  1    
  2127. ;   1899  1    %SBTTL 'DO%TRANSACTION - Main loop for FSM'
  2128. ;   1900  1    ROUTINE DO%TRANSACTION (INIT%STATE) =
  2129. ;   1901  1    
  2130. ;   1902  1    !++
  2131. ;   1903  1    ! FUNCTIONAL DESCRIPTION:
  2132. ;   1904  1    !
  2133. ;   1905  1    !    This is the main routine for performing a Kermit transaction.
  2134. ;   1906  1    !    It is structured as a finite state machine with each state
  2135. ;   1907  1    !    determining the next based upon the packet which is received.
  2136. ;   1908  1    !    It is supplied with the initial state by the caller.
  2137. ;   1909  1    !
  2138. ;   1910  1    ! CALLING SEQUENCE:
  2139. ;   1911  1    !
  2140. ;   1912  1    !    Status = DO%TRANSACTION(.INIT%STATE);
  2141. ;   1913  1    !
  2142. ;   1914  1    ! INPUT PARAMETERS:
  2143. ;   1915  1    !
  2144. ;   1916  1    !    INIT%STATE - Initial state.
  2145. ;   1917  1    !
  2146. ;   1918  1    ! IMPLICIT INPUTS:
  2147. ;   1919  1    !
  2148. ;   1920  1    !    None.
  2149. ;   1921  1    !
  2150. ;   1922  1    ! OUTPUT PARAMETERS:
  2151. ;   1923  1    !
  2152. ;   1924  1    !    None.
  2153. ;   1925  1    !
  2154. ;   1926  1    ! IMPLICIT OUTPUTS:
  2155. ;   1927  1    !
  2156. ;   1928  1    !    None.
  2157. ;   1929  1    !
  2158. ;   1930  1    ! COMPLETION CODES:
  2159. ;   1931  1    !
  2160. ;   1932  1    !    None.
  2161. ;   1933  1    !
  2162. ;   1934  1    ! SIDE EFFECTS:
  2163. ;   1935  1    !
  2164. ;   1936  1    !    None.
  2165. ;   1937  1    !
  2166. ;   1938  1    !--
  2167. ;   1939  1    
  2168. ;   1940  2        BEGIN
  2169. ;   1941  2    
  2170. ;   1942  2        LOCAL
  2171. ;   1943  2        RETURN%VALUE;
  2172. ;   1944  2    
  2173. ;   1945  2        NUM%RETRIES = 0;                ! Initialize the number of retries
  2174. ;   1946  2        STATE = .INIT%STATE;            ! Initialize the state
  2175. ;   1947  2    
  2176. ;   1948  2        WHILE TRUE DO
  2177. ;   1949  2    
  2178. ;   1950  2        CASE .STATE FROM STATE%MIN TO STATE%MAX OF
  2179. ;   1951  2            SET
  2180. ;   1952  2    !
  2181. ;   1953  2    ! Send states
  2182. ;   1954  2    !
  2183. ;   1955  2    
  2184. ;   1956  2            [STATE%ID] :
  2185. ;   1957  2    !
  2186. ;   1958  2    ! Server while idle.  Set the timeout to twice the normal wait
  2187. ;   1959  2    ! and wait for something to show up
  2188. ;   1960  2    !
  2189. ;   1961  3            BEGIN
  2190. ;   1962  3    
  2191. ;   1963  3            LOCAL
  2192. ;   1964  3                SAVED%TIMEOUT;
  2193. ;   1965  3    
  2194. ;   1966  3            SAVED%TIMEOUT = .SEND%TIMEOUT;
  2195. ;   1967  3    
  2196. ;   1968  3            IF .SEND%TIMEOUT NEQ 0 THEN SEND%TIMEOUT = .SRV%TIMEOUT;
  2197. ;   1969  3    
  2198. ;   1970  3            STATE = REC%SERVER%IDLE ();
  2199. ;   1971  3            SEND%TIMEOUT = .SAVED%TIMEOUT;
  2200. ;   1972  2            END;
  2201. ;   1973  2    
  2202. ;   1974  2            [STATE%II] :
  2203. ;   1975  2    !
  2204. ;   1976  2    ! Here while server idle after having received a server-init packet
  2205. ;   1977  2    !
  2206. ;   1978  2            STATE = REC%SERVER%IDLE ();
  2207. ;   1979  2    
  2208. ;   1980  2            [STATE%FI, STATE%LG] :
  2209. ;   1981  2    !
  2210. ;   1982  2    ! Here when we are supposed to exit
  2211. ;   1983  2    !
  2212. ;   1984  2            RETURN KER%EXIT;
  2213. ;   1985  2    
  2214. ;   1986  2            [STATE%SD] :
  2215. ;   1987  2            STATE = SEND%DATA ();
  2216. ;   1988  2    
  2217. ;   1989  2            [STATE%SF] :
  2218. ;   1990  2            STATE = SEND%FILE ();
  2219. ;   1991  2    
  2220. ;   1992  2            [STATE%SZ] :
  2221. ;   1993  2            STATE = SEND%EOF ();
  2222. ;   1994  2    
  2223. ;   1995  2            [STATE%S] :
  2224. ;   1996  2            STATE = SEND%INIT ();
  2225. ;   1997  2    
  2226. ;   1998  2            [STATE%OF] :
  2227. ;   1999  2            STATE = SEND%OPEN%FILE ();
  2228. ;   2000  2    
  2229. ;   2001  2            [STATE%SI] :
  2230. ;   2002  2            STATE = SEND%SERVER%INIT ();
  2231. ;   2003  2    
  2232. ;   2004  2            [STATE%SG] :
  2233. ;   2005  2            STATE = SEND%GENCMD ();
  2234. ;   2006  2    
  2235. ;   2007  2            [STATE%SB] :
  2236. ;   2008  2            STATE = SEND%BREAK ();
  2237. ;   2009  2    !
  2238. ;   2010  2    ! Receiving of the data and the end of file message.
  2239. ;   2011  2    !
  2240. ;   2012  2    
  2241. ;   2013  2            [STATE%RD] :
  2242. ;   2014  2            STATE = REC%DATA ();
  2243. ;   2015  2    !
  2244. ;   2016  2    ! Receiving the FILE information of the break to end the transfer of
  2245. ;   2017  2    ! one or more files
  2246. ;   2018  2    !
  2247. ;   2019  2    
  2248. ;   2020  2            [STATE%RF] :
  2249. ;   2021  2            STATE = REC%FILE ();
  2250. ;   2022  2    !
  2251. ;   2023  2    ! Initialization for the receiving of a file
  2252. ;   2024  2    !
  2253. ;   2025  2    
  2254. ;   2026  2            [STATE%R] :
  2255. ;   2027  2            STATE = REC%INIT ();
  2256. ;   2028  2    !
  2257. ;   2029  2    ! Here if we have completed the receiving of the file
  2258. ;   2030  2    !
  2259. ;   2031  2    
  2260. ;   2032  2            [STATE%C] :
  2261. ;   2033  3            BEGIN
  2262. ;   2034  3            RETURN%VALUE = TRUE;
  2263. ;   2035  3            EXITLOOP;
  2264. ;   2036  2            END;
  2265. ;   2037  2    !
  2266. ;   2038  2    ! Here if we aborted the transfer or we have gotten into some random
  2267. ;   2039  2    ! state (internal KERMSG problem).
  2268. ;   2040  2    !
  2269. ;   2041  2    
  2270. ;   2042  2            [STATE%A, STATE%EX, STATE%ER, INRANGE, OUTRANGE] :
  2271. ;   2043  3            BEGIN
  2272. ;   2044  3            RETURN%VALUE = FALSE;
  2273. ;   2045  3    
  2274. ;   2046  3            IF .STATE EQL STATE%EX THEN RETURN%VALUE = KER%ABORTED;
  2275. ;   2047  3    
  2276. ;   2048  3            !
  2277. ;   2049  3            ! Determine if the file is still open and if so close it
  2278. ;   2050  3            !
  2279. ;   2051  3    
  2280. ;   2052  3            IF .FLAG%FILE%OPEN
  2281. ;   2053  3            THEN
  2282. ;   2054  4                BEGIN
  2283. ;   2055  4                FLAG%FILE%OPEN = FALSE;
  2284. ;   2056  4    
  2285. ;   2057  4                IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  2286. ;   2058  4                THEN
  2287. ;   2059  5                BEGIN
  2288. ;   2060  5                TT%TEXT (UPLIT (%ASCIZ' [Aborted]'));
  2289. ;   2061  5                TT%CRLF ();
  2290. ;   2062  4                END;
  2291. ;   2063  4    
  2292. ;   2064  5                FILE%CLOSE (.ABT%FLAG AND (.STATE EQL STATE%A OR .STATE EQL STATE%EX OR
  2293. ;   2065  5     .STATE
  2294. ;   2066  4                EQL STATE%ER));
  2295. ;   2067  4                XFR%STATUS (%C'F', %C'A');
  2296. ;   2068  3                END;
  2297. ;   2069  3    
  2298. ;   2070  3    !
  2299. ;   2071  3    ! Give error if aborted due to too many retries
  2300. ;   2072  3    !
  2301. ;   2073  3    
  2302. ;   2074  3            IF .STATE EQL STATE%ER THEN KRM%ERROR (KER%RETRIES);
  2303. ;   2075  3    
  2304. ;   2076  3            EXITLOOP;
  2305. ;   2077  2            END;
  2306. ;   2078  2            TES;
  2307. ;   2079  2    
  2308. ;   2080  2    !
  2309. ;   2081  2    ! End the stats and return to the caller
  2310. ;   2082  2    !
  2311. ;   2083  2        END%STATS ();
  2312. ;   2084  2    !
  2313. ;   2085  2        RETURN .RETURN%VALUE;
  2314. ;   2086  1        END;                    ! End of DO%TRANSACTION
  2315.  
  2316.  
  2317. P.AAA:    BYTE    (7)" ","[","A","b","o"
  2318.     BYTE    (7)"r","t","e","d","]"
  2319.     BYTE    (7)000,000,000,000,000
  2320.  
  2321.  
  2322. ; DO%TRANSACTION
  2323. U.1:    PUSH    SP,AC14                ;                                        1900
  2324.     PUSH    SP,AC16
  2325.     SETZM    U.54                ;                                        1945
  2326.     MOVE    AC1,-3(SP)            ;                                        1946
  2327. L.31:    MOVEM    AC1,U.51
  2328. L.32:    MOVE    AC1,U.51            ;                                        1950
  2329.     MOVE    AC2,AC1
  2330.     SOJL    AC2,L.34
  2331.     CAIGE    AC2,24
  2332.     JRST    L.33(AC2)
  2333.     JRST    L.34
  2334. L.33:    JRST    L.44
  2335.     JRST    L.42
  2336.     JRST    L.41
  2337.     JRST    L.43
  2338.     JRST    L.48
  2339.     JRST    L.51
  2340.     JRST    L.50
  2341.     JRST    L.49
  2342.     JRST    L.52
  2343.     JRST    L.34
  2344.     JRST    L.34
  2345.     JRST    L.47
  2346.     JRST    L.46
  2347.     JRST    L.37
  2348.     JRST    L.39
  2349.     JRST    L.40
  2350.     JRST    L.40
  2351.     JRST    L.45
  2352.     JRST    L.34
  2353.     JRST    L.34
  2354. L.34:    SETZ    AC14,                ;                                        2044
  2355.     CAIN    AC1,23                ;                                        2046
  2356.     MOVEI    AC14,312
  2357.     MOVEI    AC1,1                ;                                        2052
  2358.     TDNN    AC1,FLAG%FILE%OPEN
  2359.     JRST    L.36
  2360.     SETZM    FLAG%FILE%OPEN            ;                                        2055
  2361.     MOVEI    AC1,1                ;                                        2057
  2362.     TDNE    AC1,CONNECT%FLAG
  2363.     JRST    L.35
  2364.     MOVEI    AC1,1
  2365.     TDNN    AC1,TY%FIL
  2366.     JRST    L.35
  2367.     PUSH    SP,C.14                ;                                        2060
  2368.     PUSHJ    SP,TT%TEXT
  2369.     ADJSP    SP,-1
  2370.     PUSHJ    SP,TT%CRLF            ;                                        2061
  2371. L.35:    MOVE    AC3,U.51            ;                                        2064
  2372.     SETZ    AC1,
  2373.     CAIN    AC3,12
  2374.     MOVEI    AC1,1
  2375.     SETZ    AC2,
  2376.     CAIN    AC3,23
  2377.     MOVEI    AC2,1
  2378.     IOR    AC2,AC1
  2379.     SETZ    AC1,                ;                                        2066
  2380.     CAIN    AC3,24
  2381.     MOVEI    AC1,1
  2382.     IOR    AC1,AC2                ;                                        2064
  2383.     AND    AC1,ABT%FLAG
  2384.     PUSH    SP,AC1
  2385.     PUSHJ    SP,FILE%CLOSE
  2386.     ADJSP    SP,-1
  2387.     PUSH    SP,C.15                ;                                        2067
  2388.     PUSH    SP,C.16
  2389.     PUSHJ    SP,XFR%STATUS
  2390.     ADJSP    SP,-2
  2391. L.36:    MOVEI    AC1,24                ;                                        2074
  2392.     CAME    AC1,U.51
  2393.     JRST    L.53
  2394.     PUSH    SP,C.17
  2395.     PUSHJ    SP,KRM%ERROR
  2396.     ADJSP    SP,-1
  2397.     JRST    L.53
  2398. L.37:    MOVE    AC1,SEND%TIMEOUT        ;                                        1966
  2399.     MOVE    AC16,AC1
  2400.     JUMPE    AC1,L.38            ;                                        1968
  2401.     MOVE    AC1,SRV%TIMEOUT
  2402.     MOVEM    AC1,SEND%TIMEOUT
  2403. L.38:    PUSHJ    SP,U.10                ;                                        1970
  2404.     MOVEM    AC1,U.51
  2405.     MOVEM    AC16,SEND%TIMEOUT        ;                                        1971
  2406.     JRST    L.32                ;                                        1950
  2407. L.39:    PUSHJ    SP,U.10                ;                                        1978
  2408.     JRST    L.31
  2409. L.40:    MOVEI    AC1,223                ;                                        1984
  2410.     JRST    L.54
  2411. L.41:    PUSHJ    SP,U.3                ;                                        1987
  2412.     JRST    L.31
  2413. L.42:    PUSHJ    SP,U.4                ;                                        1990
  2414.     JRST    L.31
  2415. L.43:    PUSHJ    SP,U.7                ;                                        1993
  2416.     JRST    L.31
  2417. L.44:    PUSHJ    SP,U.8                ;                                        1996
  2418.     JRST    L.31
  2419. L.45:    PUSHJ    SP,U.5                ;                                        1999
  2420.     JRST    L.31
  2421. L.46:    PUSHJ    SP,U.2                ;                                        2002
  2422.     JRST    L.31
  2423. L.47:    PUSHJ    SP,U.6                ;                                        2005
  2424.     JRST    L.31
  2425. L.48:    PUSHJ    SP,U.9                ;                                        2008
  2426.     JRST    L.31
  2427. L.49:    PUSHJ    SP,U.13                ;                                        2014
  2428.     JRST    L.31
  2429. L.50:    PUSHJ    SP,U.12                ;                                        2021
  2430.     JRST    L.31
  2431. L.51:    PUSHJ    SP,U.11                ;                                        2027
  2432.     JRST    L.31
  2433. L.52:    MOVEI    AC14,1                ;                                        2034
  2434. L.53:    PUSHJ    SP,U.18                ;                                        2083
  2435.     MOVE    AC1,AC14            ;                                        1940
  2436. L.54:    POP    SP,AC16                ;                                        1900
  2437.     POP    SP,AC14
  2438.     POPJ    SP,
  2439. C.14:    XWD    0,P.AAA
  2440. C.15:    EXP    106
  2441. C.16:    EXP    101
  2442. C.17:    EXP    212
  2443.  
  2444. ; Routine Size:  120 words
  2445.  
  2446.  
  2447. ;   2087  1    %SBTTL 'REC%SERVER%IDLE - Idle server state'
  2448. ;   2088  1    ROUTINE REC%SERVER%IDLE =
  2449. ;   2089  1    
  2450. ;   2090  1    !++
  2451. ;   2091  1    ! FUNCTIONAL DESCRIPTION:
  2452. ;   2092  1    !
  2453. ;   2093  1    ! This routine is called from DO%TRANSACTION when is the server idle
  2454. ;   2094  1    ! state.  It will receive a message and properly dispatch to the new
  2455. ;   2095  1    ! state.
  2456. ;   2096  1    !
  2457. ;   2097  1    ! CALLING SEQUENCE:
  2458. ;   2098  1    !
  2459. ;   2099  1    !    STATE = REC%SERVER%IDLE ();
  2460. ;   2100  1    !
  2461. ;   2101  1    ! INPUT PARAMETERS:
  2462. ;   2102  1    !
  2463. ;   2103  1    !    None.
  2464. ;   2104  1    !
  2465. ;   2105  1    ! IMPLICIT INPUTS:
  2466. ;   2106  1    !
  2467. ;   2107  1    !    Almost everything.
  2468. ;   2108  1    !
  2469. ;   2109  1    ! OUPTUT PARAMETERS:
  2470. ;   2110  1    !
  2471. ;   2111  1    !    Routine value is new state for FSM
  2472. ;   2112  1    !
  2473. ;   2113  1    ! IMPLICIT OUTPUTS:
  2474. ;   2114  1    !
  2475. ;   2115  1    !    None.
  2476. ;   2116  1    !
  2477. ;   2117  1    ! COMPLETION CODES:
  2478. ;   2118  1    !
  2479. ;   2119  1    !    None.
  2480. ;   2120  1    !
  2481. ;   2121  1    ! SIDE EFFECTS:
  2482. ;   2122  1    !
  2483. ;   2123  1    !    None.
  2484. ;   2124  1    !
  2485. ;   2125  1    !--
  2486. ;   2126  1    
  2487. ;   2127  2        BEGIN
  2488. ;   2128  2    
  2489. ;   2129  2        LOCAL
  2490. ;   2130  2        STATUS;
  2491. ;   2131  2    
  2492. ;   2132  2        STATUS = REC%PACKET ();
  2493. ;   2133  2    !
  2494. ;   2134  2    ! Now determine what to do by the type of message we have receive.
  2495. ;   2135  2    !
  2496. ;   2136  2    
  2497. ;   2137  2        IF .STATUS EQL KER%ABORTED THEN RETURN STATE%EX;
  2498. ;   2138  2    
  2499. ;   2139  2        IF .STATUS
  2500. ;   2140  2        THEN
  2501. ;   2141  3        BEGIN
  2502. ;   2142  3    
  2503. ;   2143  3        SELECTONE .REC%TYPE OF
  2504. ;   2144  3            SET
  2505. ;   2145  3            !
  2506. ;   2146  3            ! Server initialization message received. ACK the
  2507. ;   2147  3            ! message and continue.
  2508. ;   2148  3            !
  2509. ;   2149  3    
  2510. ;   2150  3            [MSG%SER%INIT] :
  2511. ;   2151  4            BEGIN
  2512. ;   2152  4    
  2513. ;   2153  5            IF (STATUS = PRS%SEND%INIT ())
  2514. ;   2154  4            THEN
  2515. ;   2155  5                BEGIN
  2516. ;   2156  5                SET%SEND%INIT ();
  2517. ;   2157  5    
  2518. ;   2158  6                IF (STATUS = SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .REC%SEQ)) ! [108]
  2519. ;   2159  5                THEN
  2520. ;   2160  6                BEGIN
  2521. ;   2161  6                SND%PKT%SIZE = -.SEND%PKT%SIZE;
  2522. ;   2162  6                SND%TIMEOUT = -.SEND%TIMEOUT;
  2523. ;   2163  6                SND%NPAD = -.SEND%NPAD;
  2524. ;   2164  6                SND%PADCHAR = -.SEND%PADCHAR;
  2525. ;   2165  6                SND%EOL = -.SEND%EOL;
  2526. ;   2166  6                SND%QUOTE%CHR = -.SEND%QUOTE%CHR;
  2527. ;   2167  6                RCV%8QUOTE%CHR = .SEND%8QUOTE%CHR;
  2528. ;   2168  6                CHKTYPE = .INI%CHK%TYPE;
  2529. ;   2169  6                SET%REPT%CHR = .REPT%CHR;
  2530. ;   2170  6                RETURN STATE%II;    ! Now idle after INIT
  2531. ;   2171  5                END;
  2532. ;   2172  5    
  2533. ;   2173  4                END;
  2534. ;   2174  4    
  2535. ;   2175  4            KRM%ERROR (KER%PROTOERR);
  2536. ;   2176  4            RETURN STATE%A;
  2537. ;   2177  3            END;
  2538. ;   2178  3            !
  2539. ;   2179  3            ! Send init message received.  We must ACK the message and
  2540. ;   2180  3            ! then attempt to receive a file from the remote.
  2541. ;   2181  3            !
  2542. ;   2182  3    
  2543. ;   2183  3            [MSG%SND%INIT] :
  2544. ;   2184  4            BEGIN
  2545. ;   2185  4            MSG%NUMBER = (.REC%SEQ + 1) AND %O'77';
  2546. ;   2186  4    
  2547. ;   2187  5            IF (STATUS = PRS%SEND%INIT ())
  2548. ;   2188  4            THEN
  2549. ;   2189  5                BEGIN
  2550. ;   2190  5                SET%SEND%INIT ();
  2551. ;   2191  5                !
  2552. ;   2192  5                ! ACK the message then receive everything.
  2553. ;   2193  5                !
  2554. ;   2194  5    
  2555. ;   2195  5                IF SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .REC%SEQ) ! [108]
  2556. ;   2196  5                THEN
  2557. ;   2197  6                BEGIN
  2558. ;   2198  6                BLK%CHK%TYPE = .INI%CHK%TYPE;    ! Switch to desired form of block check
  2559. ;   2199  6                XFR%STATUS (%C'I', %C'R');    ! Start of file receive
  2560. ;   2200  6                RETURN STATE%RF;
  2561. ;   2201  5                END;
  2562. ;   2202  5    
  2563. ;   2203  4                END;
  2564. ;   2204  4    
  2565. ;   2205  4            KRM%ERROR (KER%PROTOERR);
  2566. ;   2206  4            RETURN STATE%A;
  2567. ;   2207  3            END;
  2568. ;   2208  3            !
  2569. ;   2209  3            ! Here if we receive a receive init message.
  2570. ;   2210  3            ! We will be sending a file to the other end.
  2571. ;   2211  3            !
  2572. ;   2212  3    
  2573. ;   2213  3            [MSG%RCV%INIT] :
  2574. ;   2214  4            BEGIN
  2575. ;   2215  4            !
  2576. ;   2216  4            ! Move the file specification if we received one
  2577. ;   2217  4            !
  2578. ;   2218  4            SET%STRING (CH$PTR (FILE%NAME), MAX%FILE%NAME, TRUE);
  2579. ;   2219  4            BFR%EMPTY ();
  2580. ;   2220  4            FILE%SIZE = SET%STRING (0, 0, FALSE);
  2581. ;   2221  4            CH$WCHAR (CHR%NUL, CH$PTR (FILE%NAME, .FILE%SIZE));
  2582. ;   2222  4    
  2583. ;   2223  4            IF .FILE%SIZE GTR 0
  2584. ;   2224  4            THEN
  2585. ;   2225  5                BEGIN
  2586. ;   2226  5                XFR%STATUS (%C'I', %C'S');    ! Start of a file send
  2587. ;   2227  5                RETURN STATE%S;
  2588. ;   2228  4                END;
  2589. ;   2229  4    
  2590. ;   2230  4            KRM%ERROR (KER%PROTOERR);
  2591. ;   2231  4            RETURN STATE%A;
  2592. ;   2232  3            END;
  2593. ;   2233  3    !
  2594. ;   2234  3    ! Generic KERMIT commands
  2595. ;   2235  3    !
  2596. ;   2236  3    
  2597. ;   2237  3            [MSG%GENERIC] :
  2598. ;   2238  3            RETURN SERVER%GENERIC ();
  2599. ;   2239  3    !
  2600. ;   2240  3    ! Host command
  2601. ;   2241  3    !
  2602. ;   2242  3    
  2603. ;   2243  3            [MSG%COMMAND] :
  2604. ;   2244  3            RETURN HOST%COMMAND ();
  2605. ;   2245  3    !
  2606. ;   2246  3    ! Kermit command
  2607. ;   2247  3    !
  2608. ;   2248  3    
  2609. ;   2249  3            [MSG%KERMIT] :
  2610. ;   2250  3            RETURN KERMIT%COMMAND ();
  2611. ;   2251  3    !
  2612. ;   2252  3    ! Unimplimented server routines
  2613. ;   2253  3    !
  2614. ;   2254  3    
  2615. ;   2255  3            [OTHERWISE] :
  2616. ;   2256  4            BEGIN
  2617. ;   2257  4            KRM%ERROR (KER%UNISRV);
  2618. ;   2258  4            RETURN STATE%A;
  2619. ;   2259  3            END;
  2620. ;   2260  3            TES;
  2621. ;   2261  3    
  2622. ;   2262  2        END;
  2623. ;   2263  2    
  2624. ;   2264  2    !
  2625. ;   2265  2    ! If we get here, we must have gotten something random.  Therefore,
  2626. ;   2266  2    ! just send a NAK and remain in the current state (unless we have done this
  2627. ;   2267  2    ! too many times).
  2628. ;   2268  2    !
  2629. ;   2269  2        NUM%RETRIES = .NUM%RETRIES + 1;
  2630. ;   2270  2    
  2631. ;   2271  2        IF .NUM%RETRIES GTR .SI%RETRIES THEN RETURN STATE%A;
  2632. ;   2272  2    
  2633. ;   2273  2        IF SEND%PACKET (MSG%NAK, 0, 0) THEN RETURN .STATE ELSE RETURN STATE%EX;
  2634. ;   2274  2    
  2635. ;   2275  1        END;                    ! End of REC%SERVER%IDLE
  2636.  
  2637.  
  2638. ; REC%SERVER%IDLE
  2639. U.10:    PUSH    SP,AC14                ;                                        2088
  2640.     PUSH    SP,AC16
  2641.     PUSHJ    SP,U.26                ;                                        2132
  2642.     MOVE    AC14,AC1
  2643.     CAIN    AC14,312            ;                                        2137
  2644.     JRST    L.67
  2645.     TRNN    AC14,1                ;                                        2139
  2646.     JRST    L.64
  2647.     MOVE    AC16,U.58            ;                                        2143
  2648.     CAIE    AC16,111            ;                                        2150
  2649.     JRST    L.55
  2650.     PUSHJ    SP,U.21                ;                                        2153
  2651.     MOVE    AC14,AC1
  2652.     TRNN    AC14,1
  2653.     JRST    L.56
  2654.     PUSHJ    SP,U.20                ;                                        2156
  2655.     PUSH    SP,C.20                ;                                        2158
  2656.     PUSH    SP,U.46
  2657.     PUSH    SP,U.56
  2658.     PUSHJ    SP,U.24
  2659.     MOVE    AC14,AC1
  2660.     ADJSP    SP,-3
  2661.     TRNN    AC14,1
  2662.     JRST    L.56
  2663.     MOVE    AC1,U.40            ;                                        2161
  2664.     MOVNM    AC1,SND%PKT%SIZE
  2665.     MOVE    AC1,SEND%TIMEOUT        ;                                        2162
  2666.     MOVNM    AC1,SND%TIMEOUT
  2667.     MOVE    AC1,U.41            ;                                        2163
  2668.     MOVNM    AC1,SND%NPAD
  2669.     MOVE    AC1,U.42            ;                                        2164
  2670.     MOVNM    AC1,SND%PADCHAR
  2671.     MOVE    AC1,U.43            ;                                        2165
  2672.     MOVNM    AC1,SND%EOL
  2673.     MOVE    AC1,U.44            ;                                        2166
  2674.     MOVNM    AC1,SND%QUOTE%CHR
  2675.     MOVE    AC1,U.45            ;                                        2167
  2676.     MOVEM    AC1,RCV%8QUOTE%CHR
  2677.     MOVE    AC1,U.47            ;                                        2168
  2678.     MOVEM    AC1,CHKTYPE
  2679.     MOVE    AC1,U.38            ;                                        2169
  2680.     MOVEM    AC1,SET%REPT%CHR
  2681.     MOVEI    AC1,17                ;                                        2160
  2682.     JRST    L.68
  2683. L.55:    CAIE    AC16,123            ;                                        2183
  2684.     JRST    L.57
  2685.     MOVE    AC1,U.56            ;                                        2185
  2686.     ADDI    AC1,1
  2687.     LDB    AC2,C.18
  2688.     MOVEM    AC2,U.55
  2689.     PUSHJ    SP,U.21                ;                                        2187
  2690.     MOVE    AC14,AC1
  2691.     TRNN    AC14,1
  2692.     JRST    L.56
  2693.     PUSHJ    SP,U.20                ;                                        2190
  2694.     PUSH    SP,C.20                ;                                        2195
  2695.     PUSH    SP,U.46
  2696.     PUSH    SP,U.56
  2697.     PUSHJ    SP,U.24
  2698.     ADJSP    SP,-3
  2699.     TRNN    AC1,1
  2700.     JRST    L.56
  2701.     MOVE    AC1,U.47            ;                                        2198
  2702.     MOVEM    AC1,U.48
  2703.     PUSH    SP,C.6                ;                                        2199
  2704.     PUSH    SP,C.12
  2705.     PUSHJ    SP,XFR%STATUS
  2706.     ADJSP    SP,-2                ;                                        2200
  2707.     MOVEI    AC1,7                ;                                        2197
  2708.     JRST    L.68
  2709. L.56:    PUSH    SP,C.21                ;                                        2205
  2710.     JRST    L.63
  2711. L.57:    CAIE    AC16,122            ;                                        2213
  2712.     JRST    L.59
  2713.     PUSH    SP,C.10                ;                                        2218
  2714.     PUSH    SP,C.22
  2715.     PUSH    SP,C.2
  2716.     PUSHJ    SP,U.30
  2717.     PUSHJ    SP,U.28                ;                                        2219
  2718.     SETZM    -2(SP)                ;                                        2220
  2719.     SETZM    -1(SP)
  2720.     SETZM    0(SP)
  2721.     PUSHJ    SP,U.30
  2722.     MOVEM    AC1,FILE%SIZE
  2723.     SETZ    AC3,                ;                                        2221
  2724.     MOVE    AC2,FILE%SIZE
  2725.     MOVE    AC4,C.19
  2726.     MOVE    AC1,AC2
  2727.     ADJBP    AC1,AC4
  2728.     IDPB    AC3,AC1
  2729.     JUMPLE    AC2,L.58            ;                                        2223
  2730.     PUSH    SP,C.6                ;                                        2226
  2731.     PUSH    SP,C.8
  2732.     PUSHJ    SP,XFR%STATUS
  2733.     ADJSP    SP,-5                ;                                        2227
  2734.     MOVEI    AC1,1                ;                                        2225
  2735.     JRST    L.68
  2736. L.58:    PUSH    SP,C.21                ;                                        2230
  2737.     PUSHJ    SP,KRM%ERROR
  2738.     ADJSP    SP,-4                ;                                        2214
  2739.     JRST    L.65
  2740. L.59:    CAIE    AC16,107            ;                                        2237
  2741.     JRST    L.60
  2742.     PUSHJ    SP,U.14                ;                                        2238
  2743.     JRST    L.68                ;                                        2143
  2744. L.60:    CAIE    AC16,103            ;                                        2243
  2745.     JRST    L.61
  2746.     PUSHJ    SP,U.15                ;                                        2244
  2747.     JRST    L.68                ;                                        2143
  2748. L.61:    CAIE    AC16,113            ;                                        2249
  2749.     JRST    L.62
  2750.     PUSHJ    SP,U.16                ;                                        2250
  2751.     JRST    L.68                ;                                        2143
  2752. L.62:    PUSH    SP,C.23                ;                                        2257
  2753. L.63:    PUSHJ    SP,KRM%ERROR
  2754.     ADJSP    SP,-1                ;                                        2256
  2755.     JRST    L.65
  2756. L.64:    AOS    AC1,U.54            ;                                        2271
  2757.     CAMG    AC1,SI%RETRIES
  2758.     JRST    L.66
  2759. L.65:    MOVEI    AC1,12
  2760.     JRST    L.68
  2761. L.66:    PUSH    SP,C.24                ;                                        2273
  2762.     PUSH    SP,C.25
  2763.     PUSH    SP,C.25
  2764.     PUSHJ    SP,U.24
  2765.     ADJSP    SP,-3
  2766.     TRNE    AC1,1
  2767.     SKIPA    AC1,U.51
  2768. L.67:    MOVEI    AC1,23
  2769. L.68:    POP    SP,AC16                ;                                        2088
  2770.     POP    SP,AC14
  2771.     POPJ    SP,
  2772. C.18:    POINT    6,AC1,35
  2773. C.19:    POINT    7,FILE%NAME,-1
  2774. C.20:    EXP    131
  2775. C.21:    EXP    252
  2776. C.22:    EXP    204
  2777. C.23:    EXP    242
  2778. C.24:    EXP    116
  2779. C.25:    EXP    0
  2780.  
  2781. ; Routine Size:  141 words
  2782.  
  2783.  
  2784. ;   2276  1    %SBTTL 'SEND%SERVER%INIT'
  2785. ;   2277  1    ROUTINE SEND%SERVER%INIT =
  2786. ;   2278  1    
  2787. ;   2279  1    !++
  2788. ;   2280  1    ! FUNCTIONAL DESCRIPTION:
  2789. ;   2281  1    !
  2790. ;   2282  1    !    This routine will send a server initialization message to the
  2791. ;   2283  1    !    remote KERMIT.
  2792. ;   2284  1    !
  2793. ;   2285  1    ! CALLING SEQUENCE:
  2794. ;   2286  1    !
  2795. ;   2287  1    !    STATE = SEND%SERVER%INIT();
  2796. ;   2288  1    !
  2797. ;   2289  1    ! INPUT PARAMETERS:
  2798. ;   2290  1    !
  2799. ;   2291  1    !    None.
  2800. ;   2292  1    !
  2801. ;   2293  1    ! IMPLICIT INPUTS:
  2802. ;   2294  1    !
  2803. ;   2295  1    !    RECV%xxx - desired receive parameters
  2804. ;   2296  1    !
  2805. ;   2297  1    ! OUTPUT PARAMETERS:
  2806. ;   2298  1    !
  2807. ;   2299  1    !    New state to change the finite state machine to.
  2808. ;   2300  1    !
  2809. ;   2301  1    ! IMPLICIT OUTPUTS:
  2810. ;   2302  1    !
  2811. ;   2303  1    !    SEND%xxx - Other Kermit's desired parameters
  2812. ;   2304  1    !
  2813. ;   2305  1    ! COMPLETION CODES:
  2814. ;   2306  1    !
  2815. ;   2307  1    !    None.
  2816. ;   2308  1    !
  2817. ;   2309  1    ! SIDE EFFECTS:
  2818. ;   2310  1    !
  2819. ;   2311  1    !    None.
  2820. ;   2312  1    !
  2821. ;   2313  1    !--
  2822. ;   2314  1    
  2823. ;   2315  2        BEGIN
  2824. ;   2316  2    
  2825. ;   2317  2        LOCAL
  2826. ;   2318  2        OLD%OUTPUT,                ! Saved terminal output routine
  2827. ;   2319  2        STATUS;                    ! Status returned by various routines
  2828. ;   2320  2    
  2829. ;   2321  2    ![026] Local routine to ignore error message output
  2830. ;   2322  2        ROUTINE IGNORE%ERROR (ADDRESS, LENGTH) =
  2831. ;   2323  3        BEGIN
  2832. ;   2324  3        RETURN TRUE;
  2833. ;   2325  2        END;
  2834.  
  2835.  
  2836. ; IGNORE%ERROR
  2837. U.76:    MOVEI    AC1,1                ;                                        2323
  2838.     POPJ    SP,                ;                                        2322
  2839.  
  2840. ; Routine Size:  2 words
  2841.  
  2842.  
  2843. ;   2326  2        SET%SEND%INIT ();
  2844. ;   2327  2    ![026] If too many tries, just give up.  Maybe the other Kermit doesn't
  2845. ;   2328  2    ![026] know what to do with this packet.
  2846. ;   2329  2    
  2847. ;   2330  2        IF .NUM%RETRIES GTR .SI%RETRIES THEN RETURN STATE%SG;
  2848. ;   2331  2    
  2849. ;   2332  2    ![026]
  2850. ;   2333  2    ![026] Count the number of times we try this
  2851. ;   2334  2    ![026]
  2852. ;   2335  2        NUM%RETRIES = .NUM%RETRIES + 1;
  2853. ;   2336  2    
  2854. ;   2337  2        IF NOT SEND%PACKET (MSG%SER%INIT, .SEND%INIT%SIZE, .MSG%NUMBER) THEN RETURN
  2855. ;   2338  2     STATE%A; ! [108]
  2856. ;   2339  2    
  2857. ;   2340  2    ![026]
  2858. ;   2341  2    ![026] Determine if we received a packet it good condition.  If we timed out
  2859. ;   2342  2    ![026] just try again.  If we get an error packet back, ignore it and
  2860. ;   2343  2    ![026] just continue.  The other Kermit must not support this packet.
  2861. ;   2344  2    ![026]
  2862. ;   2345  2        OLD%OUTPUT = TT%SET%OUTPUT (IGNORE%ERROR);
  2863. ;   2346  2        STATUS = REC%PACKET ();
  2864. ;   2347  2        TT%OUTPUT ();
  2865. ;   2348  2        TT%SET%OUTPUT (.OLD%OUTPUT);
  2866. ;   2349  2    
  2867. ;   2350  2        IF .STATUS EQL KER%ERRMSG THEN RETURN STATE%SG;
  2868. ;   2351  2    
  2869. ;   2352  2        IF NOT .STATUS
  2870. ;   2353  2        THEN
  2871. ;   2354  2    
  2872. ;   2355  4        IF NOT ((.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS
  2873. ;   2356  4     EQL
  2874. ;   2357  3            KER%CHKSUMERR))
  2875. ;   2358  2        THEN
  2876. ;   2359  2            RETURN STATE%EX
  2877. ;   2360  2        ELSE
  2878. ;   2361  2            RETURN .STATE;
  2879. ;   2362  2    
  2880. ;   2363  2    !
  2881. ;   2364  2    ! Determine if the packet is good.
  2882. ;   2365  2    !
  2883. ;   2366  2    
  2884. ;   2367  2        IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ EQL .MSG%NUMBER
  2885. ;   2368  2        THEN
  2886. ;   2369  3        BEGIN
  2887. ;   2370  3    !
  2888. ;   2371  3    ! Here if we have an ACK for the initialization message that was just sent
  2889. ;   2372  3    ! to the remote KERMIT.
  2890. ;   2373  3    !
  2891. ;   2374  3    
  2892. ;   2375  3        IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN STATE%A;
  2893. ;   2376  3    
  2894. ;   2377  3        NUM%RETRIES = 0;
  2895. ;   2378  3        INIT%PKT%SENT = TRUE;            ! We have exchanged init's
  2896. ;   2379  3        RETURN STATE%SG;
  2897. ;   2380  2        END;
  2898. ;   2381  2    
  2899. ;   2382  2    !
  2900. ;   2383  2    ! If we haven't returned yet, we must have gotten an invalid response.
  2901. ;   2384  2    ! Just stay in the same state so we try again
  2902. ;   2385  2    !
  2903. ;   2386  2        RETURN .STATE;
  2904. ;   2387  1        END;
  2905.  
  2906.  
  2907. ; SEND%SERVER%INIT
  2908. U.2:    PUSH    SP,AC14                ;                                        2277
  2909.     PUSH    SP,AC16
  2910.     PUSHJ    SP,U.20                ;                                        2326
  2911.     MOVE    AC1,U.54            ;                                        2330
  2912.     CAMLE    AC1,SI%RETRIES
  2913.     JRST    L.75
  2914.     AOS    U.54                ;                                        2335
  2915.     PUSH    SP,C.6                ;                                        2337
  2916.     PUSH    SP,U.46
  2917.     PUSH    SP,U.55
  2918.     PUSHJ    SP,U.24
  2919.     ADJSP    SP,-3
  2920.     TRNN    AC1,1
  2921.     JRST    L.72
  2922.     PUSH    SP,C.26                ;                                        2345
  2923.     PUSHJ    SP,TT%SET%OUTPUT
  2924.     MOVE    AC14,AC1
  2925.     PUSHJ    SP,U.26                ;                                        2346
  2926.     MOVE    AC16,AC1
  2927.     PUSHJ    SP,TT%OUTPUT            ;                                        2347
  2928.     MOVEM    AC14,0(SP)            ;                                        2348
  2929.     PUSHJ    SP,TT%SET%OUTPUT
  2930.     CAIN    AC16,162            ;                                        2350
  2931.     JRST    L.74
  2932.     TRNE    AC16,1                ;                                        2352
  2933.     JRST    L.71
  2934.     CAIE    AC16,262            ;                                        2355
  2935.     CAIN    AC16,300
  2936.     JRST    L.69
  2937.     CAIN    AC16,172
  2938.     JRST    L.69
  2939.     MOVEI    AC1,23                ;                                        2361
  2940.     JRST    L.70
  2941. L.69:    MOVE    AC1,U.51
  2942. L.70:    ADJSP    SP,-1
  2943.     JRST    L.77                ;                                        2355
  2944. L.71:    MOVEI    AC1,131                ;                                        2367
  2945.     CAME    AC1,U.58
  2946.     JRST    L.76
  2947.     MOVE    AC1,U.56
  2948.     CAME    AC1,U.55
  2949.     JRST    L.76
  2950.     PUSHJ    SP,U.21                ;                                        2375
  2951.     MOVE    AC16,AC1
  2952.     TRNE    AC16,1
  2953.     JRST    L.73
  2954.     ADJSP    SP,-1
  2955. L.72:    MOVEI    AC1,12
  2956.     JRST    L.77
  2957. L.73:    SETZM    U.54                ;                                        2377
  2958.     MOVEI    AC1,1                ;                                        2378
  2959.     MOVEM    AC1,U.64
  2960. L.74:    ADJSP    SP,-1                ;                                        2379
  2961. L.75:    MOVEI    AC1,14                ;                                        2369
  2962.     JRST    L.77
  2963. L.76:    ADJSP    SP,-1                ;                                        2386
  2964.     MOVE    AC1,U.51            ;                                        2315
  2965. L.77:    POP    SP,AC16                ;                                        2277
  2966.     POP    SP,AC14
  2967.     POPJ    SP,
  2968. C.26:    XWD    0,U.76
  2969.  
  2970. ; Routine Size:  61 words
  2971.  
  2972.  
  2973. ;   2388  1    %SBTTL 'SEND%DATA'
  2974. ;   2389  1    ROUTINE SEND%DATA =
  2975. ;   2390  1    
  2976. ;   2391  1    !++
  2977. ;   2392  1    ! FUNCTIONAL DESCRIPTION:
  2978. ;   2393  1    !
  2979. ;   2394  1    !    This routine will send a data message to the remote KERMIT.
  2980. ;   2395  1    !
  2981. ;   2396  1    ! CALLING SEQUENCE:
  2982. ;   2397  1    !
  2983. ;   2398  1    !    STATE = SEND%DATA();
  2984. ;   2399  1    !
  2985. ;   2400  1    ! INPUT PARAMETERS:
  2986. ;   2401  1    !
  2987. ;   2402  1    !    None.
  2988. ;   2403  1    !
  2989. ;   2404  1    ! IMPLICIT INPUTS:
  2990. ;   2405  1    !
  2991. ;   2406  1    !    None.
  2992. ;   2407  1    !
  2993. ;   2408  1    ! OUTPUT PARAMETERS:
  2994. ;   2409  1    !
  2995. ;   2410  1    !    New state to change the finite state machine to.
  2996. ;   2411  1    !
  2997. ;   2412  1    ! IMPLICIT OUTPUTS:
  2998. ;   2413  1    !
  2999. ;   2414  1    !    None.
  3000. ;   2415  1    !
  3001. ;   2416  1    ! COMPLETION CODES:
  3002. ;   2417  1    !
  3003. ;   2418  1    !    None.
  3004. ;   2419  1    !
  3005. ;   2420  1    ! SIDE EFFECTS:
  3006. ;   2421  1    !
  3007. ;   2422  1    !    None.
  3008. ;   2423  1    !
  3009. ;   2424  1    !--
  3010. ;   2425  1    
  3011. ;   2426  2        BEGIN
  3012. ;   2427  2    
  3013. ;   2428  2        LOCAL
  3014. ;   2429  2        SUB%TYPE,                ! Subtype for XFR%STATUS call
  3015. ;   2430  2        STATUS;                    ! Status returned by various routines
  3016. ;   2431  2    
  3017. ;   2432  2    !
  3018. ;   2433  2    ! If there is nothing in the data packet, we should not bother to send it.
  3019. ;   2434  2    ! Instead, we will just call BFR%FILL again to get some more data
  3020. ;   2435  2    !
  3021. ;   2436  2    
  3022. ;   2437  2        IF .SIZE NEQ 0            ! [108]
  3023. ;   2438  2        THEN
  3024. ;   2439  3        BEGIN
  3025. ;   2440  3    !
  3026. ;   2441  3    ! Check to see if the number of retries have been exceeded.
  3027. ;   2442  3    !
  3028. ;   2443  3    
  3029. ;   2444  3        IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  3030. ;   2445  3    
  3031. ;   2446  3    !
  3032. ;   2447  3    ! Not exceeded yet.  Increment the number of retries we have attempted
  3033. ;   2448  3    ! on this message.
  3034. ;   2449  3    !
  3035. ;   2450  3        NUM%RETRIES = .NUM%RETRIES + 1;
  3036. ;   2451  3    !
  3037. ;   2452  3    ! Attempt to send the packet and abort if the send fails.
  3038. ;   2453  3    !
  3039. ;   2454  3    
  3040. ;   2455  3        IF NOT SEND%PACKET (MSG%DATA, .SIZE, .MSG%NUMBER) THEN RETURN STATE%EX;
  3041. ;   2456  3    
  3042. ;   2457  3    !
  3043. ;   2458  3    ! Attempt to receive a message from the remote KERMIT.
  3044. ;   2459  3    !
  3045. ;   2460  3        STATUS = REC%PACKET ();
  3046. ;   2461  3    
  3047. ;   2462  3        IF NOT .STATUS
  3048. ;   2463  3        THEN
  3049. ;   2464  4            BEGIN
  3050. ;   2465  4    
  3051. ;   2466  5            IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS
  3052. ;   2467  5     EQL
  3053. ;   2468  5            KER%CHKSUMERR)
  3054. ;   2469  4            THEN
  3055. ;   2470  4            RETURN .STATE
  3056. ;   2471  4            ELSE
  3057. ;   2472  4            RETURN STATE%EX;
  3058. ;   2473  4    
  3059. ;   2474  3            END;
  3060. ;   2475  3    
  3061. ;   2476  3    !
  3062. ;   2477  3    ! Determine if the message is a NAK and the NAK is for the message number
  3063. ;   2478  3    ! that we are current working on.  If the NAK is for the next packet then
  3064. ;   2479  3    ! treat it like an ACK for this packet
  3065. ;   2480  3    !
  3066. ;   2481  3    
  3067. ;   2482  4        IF .REC%TYPE EQL MSG%NAK AND (.REC%SEQ NEQ ((.MSG%NUMBER + 1) AND %O'77'))
  3068. ;   2483  3        THEN
  3069. ;   2484  3            RETURN .STATE;
  3070. ;   2485  3    
  3071. ;   2486  3    !
  3072. ;   2487  3    ! Make sure we have a NAK or ACK
  3073. ;   2488  3    !
  3074. ;   2489  3    
  3075. ;   2490  4        IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK)
  3076. ;   2491  3        THEN
  3077. ;   2492  3    !
  3078. ;   2493  3    ! Not an ACK or NAK, abort.
  3079. ;   2494  3    !
  3080. ;   2495  4            BEGIN
  3081. ;   2496  4            KRM%ERROR (KER%PROTOERR);
  3082. ;   2497  4            RETURN STATE%A;
  3083. ;   2498  3            END;
  3084. ;   2499  3    
  3085. ;   2500  3    !
  3086. ;   2501  3    ! Is this for this message?
  3087. ;   2502  3    !
  3088. ;   2503  3    
  3089. ;   2504  3        IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE;
  3090. ;   2505  3    
  3091. ;   2506  3    !
  3092. ;   2507  3    ! It was.  Set up for sending the next data message to the remote KERMIT
  3093. ;   2508  3    ! and return.
  3094. ;   2509  3    !
  3095. ;   2510  3    !
  3096. ;   2511  3    ! Check for data field in ACK indicating abort file or stream
  3097. ;   2512  3    !
  3098. ;   2513  3    !
  3099. ;   2514  3    
  3100. ;   2515  3        IF .REC%TYPE EQL MSG%ACK AND .REC%LENGTH EQL 1
  3101. ;   2516  3        THEN
  3102. ;   2517  3    
  3103. ;   2518  3            SELECTONE CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG, CHR%SIZE)) OF ! [108]
  3104. ;   2519  3            SET
  3105. ;   2520  3    
  3106. ;   2521  3            [MSG%ACK%ABT%CUR] :
  3107. ;   2522  3                ABT%CUR%FILE = TRUE;
  3108. ;   2523  3    
  3109. ;   2524  3            [MSG%ACK%ABT%ALL] :
  3110. ;   2525  3                ABT%ALL%FILE = TRUE;
  3111. ;   2526  3            TES;
  3112. ;   2527  3    
  3113. ;   2528  3        NUM%RETRIES = 0;
  3114. ;   2529  3        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  3115. ;   2530  2        END;                    ! End of IF .SIZE NEQ 0
  3116. ;   2531  2    
  3117. ;   2532  3        IF (BFR%FILL (FALSE) EQL KER%NORMAL) AND NOT (.ABT%CUR%FILE OR
  3118. ;   2533  3     .ABT%ALL%FILE)
  3119. ;   2534  2        THEN
  3120. ;   2535  2        RETURN STATE%SD
  3121. ;   2536  2        ELSE
  3122. ;   2537  3        BEGIN
  3123. ;   2538  3    
  3124. ;   2539  3        IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  3125. ;   2540  3        THEN
  3126. ;   2541  4            BEGIN
  3127. ;   2542  4    
  3128. ;   2543  4            IF .ABT%ALL%FILE
  3129. ;   2544  4            THEN
  3130. ;   2545  4            TT%TEXT (UPLIT (%ASCIZ' [Group interrupted]'))
  3131. ;   2546  4            ELSE
  3132. ;   2547  4    
  3133. ;   2548  4            IF .ABT%CUR%FILE
  3134. ;   2549  4            THEN
  3135. ;   2550  4                TT%TEXT (UPLIT (%ASCIZ' [Interrupted]'))
  3136. ;   2551  4            ELSE
  3137. ;   2552  4                TT%TEXT (UPLIT (%ASCIZ' [OK]'));
  3138. ;   2553  4    
  3139. ;   2554  4            TT%CRLF ();
  3140. ;   2555  3            END;
  3141. ;   2556  3    
  3142. ;   2557  3        IF .FLAG%FILE%OPEN THEN FILE%CLOSE (FALSE);
  3143. ;   2558  3    
  3144. ;   2559  3        SUB%TYPE = %C'C';            ! Assume ok
  3145. ;   2560  3    
  3146. ;   2561  3        IF .ABT%ALL%FILE
  3147. ;   2562  3        THEN
  3148. ;   2563  3            SUB%TYPE = %C'Z'
  3149. ;   2564  3        ELSE
  3150. ;   2565  3    
  3151. ;   2566  3            IF .ABT%CUR%FILE THEN SUB%TYPE = %C'X';
  3152. ;   2567  3    
  3153. ;   2568  3        XFR%STATUS (%C'F', .SUB%TYPE);
  3154. ;   2569  3        FLAG%FILE%OPEN = FALSE;
  3155. ;   2570  3        RETURN STATE%SZ;
  3156. ;   2571  2        END;
  3157. ;   2572  2    
  3158. ;   2573  1        END;
  3159.  
  3160.  
  3161. P.AAB:    BYTE    (7)" ","[","G","r","o"
  3162.     BYTE    (7)"u","p"," ","i","n"
  3163.     BYTE    (7)"t","e","r","r","u"
  3164.     BYTE    (7)"p","t","e","d","]"
  3165.     BYTE    (7)000,000,000,000,000
  3166. P.AAC:    BYTE    (7)" ","[","I","n","t"
  3167.     BYTE    (7)"e","r","r","u","p"
  3168.     BYTE    (7)"t","e","d","]",000
  3169. P.AAD:    BYTE    (7)" ","[","O","K","]"
  3170.     BYTE    (7)000,000,000,000,000
  3171.  
  3172.  
  3173. ; SEND%DATA
  3174. U.3:    MOVE    AC1,U.52            ;                                        2437
  3175.     JUMPE    AC1,L.87
  3176.     MOVE    AC2,U.54            ;                                        2444
  3177.     CAMG    AC2,PKT%RETRIES
  3178.     JRST    L.78
  3179.     MOVEI    AC1,24
  3180.     POPJ    SP,
  3181. L.78:    AOS    U.54                ;                                        2450
  3182.     PUSH    SP,C.28                ;                                        2455
  3183.     PUSH    SP,AC1
  3184.     PUSH    SP,U.55
  3185.     PUSHJ    SP,U.24
  3186.     ADJSP    SP,-3
  3187.     TRNN    AC1,1
  3188.     JRST    L.79
  3189.     PUSHJ    SP,U.26                ;                                        2460
  3190.     TRNE    AC1,1                ;                                        2462
  3191.     JRST    L.80
  3192.     CAIE    AC1,262                ;                                        2466
  3193.     CAIN    AC1,300
  3194.     JRST    L.83
  3195.     CAIN    AC1,172
  3196.     JRST    L.83                ;                                        2470
  3197. L.79:    MOVEI    AC1,23                ;                                        2472
  3198.     POPJ    SP,                ;                                        2464
  3199. L.80:    MOVE    AC2,U.58            ;                                        2482
  3200.     SETZ    AC3,
  3201.     CAIE    AC2,116
  3202.     JRST    L.81
  3203.     MOVEI    AC3,1
  3204.     MOVE    AC1,U.55
  3205.     ADDI    AC1,1
  3206.     LDB    AC4,C.18
  3207.     CAME    AC4,U.56
  3208.     JRST    L.83
  3209. L.81:    CAIE    AC2,131                ;                                        2490
  3210.     TRNE    AC3,1
  3211.     JRST    L.82
  3212.     PUSH    SP,C.21                ;                                        2496
  3213.     PUSHJ    SP,KRM%ERROR
  3214.     ADJSP    SP,-1                ;                                        2497
  3215.     MOVEI    AC1,12                ;                                        2495
  3216.     POPJ    SP,
  3217. L.82:    SETZ    AC1,                ;                                        2504
  3218.     MOVEI    AC2,131
  3219.     CAME    AC2,U.58
  3220.     JRST    L.84
  3221.     MOVEI    AC1,1
  3222.     MOVE    AC2,U.56
  3223.     CAMN    AC2,U.55
  3224.     JRST    L.84
  3225. L.83:    MOVE    AC1,U.51
  3226.     POPJ    SP,
  3227. L.84:    TRNN    AC1,1                ;                                        2515
  3228.     JRST    L.86
  3229.     MOVEI    AC1,1
  3230.     CAME    AC1,U.57
  3231.     JRST    L.86
  3232.     MOVE    AC2,C.27            ;                                        2518
  3233.     MOVE    AC1,U.39
  3234.     ADJBP    AC1,AC2
  3235.     ILDB    AC1,AC1
  3236.     CAIE    AC1,130                ;                                        2521
  3237.     JRST    L.85
  3238.     MOVEI    AC2,1                ;                                        2522
  3239.     MOVEM    AC2,ABT%CUR%FILE
  3240.     JRST    L.86                ;                                        2518
  3241. L.85:    CAIE    AC1,132                ;                                        2524
  3242.     JRST    L.86
  3243.     MOVEI    AC1,1                ;                                        2525
  3244.     MOVEM    AC1,ABT%ALL%FILE
  3245. L.86:    SETZM    U.54                ;                                        2528
  3246.     MOVE    AC1,U.55            ;                                        2529
  3247.     ADDI    AC1,1
  3248.     LDB    AC2,C.18
  3249.     MOVEM    AC2,U.55
  3250. L.87:    PUSH    SP,C.25                ;                                        2532
  3251.     PUSHJ    SP,U.29
  3252.     ADJSP    SP,-1
  3253.     CAIE    AC1,13
  3254.     JRST    L.88
  3255.     MOVEI    AC1,1
  3256.     TDNE    AC1,ABT%CUR%FILE
  3257.     JRST    L.88
  3258.     MOVEI    AC1,1                ;                                        2533
  3259.     TDNE    AC1,ABT%ALL%FILE
  3260.     JRST    L.88
  3261.     MOVEI    AC1,3                ;                                        2537
  3262.     POPJ    SP,
  3263. L.88:    MOVEI    AC1,1                ;                                        2539
  3264.     TDNE    AC1,CONNECT%FLAG
  3265.     JRST    L.92
  3266.     MOVEI    AC1,1
  3267.     TDNN    AC1,TY%FIL
  3268.     JRST    L.92
  3269.     MOVEI    AC1,1                ;                                        2543
  3270.     TDNN    AC1,ABT%ALL%FILE
  3271.     JRST    L.89
  3272.     PUSH    SP,C.29                ;                                        2545
  3273.     JRST    L.91
  3274. L.89:    MOVEI    AC1,1                ;                                        2548
  3275.     TDNN    AC1,ABT%CUR%FILE
  3276.     JRST    L.90
  3277.     PUSH    SP,C.30                ;                                        2550
  3278.     JRST    L.91
  3279. L.90:    PUSH    SP,C.31                ;                                        2552
  3280. L.91:    PUSHJ    SP,TT%TEXT
  3281.     PUSHJ    SP,TT%CRLF            ;                                        2554
  3282.     ADJSP    SP,-1                ;                                        2541
  3283. L.92:    MOVEI    AC1,1                ;                                        2557
  3284.     TDNN    AC1,FLAG%FILE%OPEN
  3285.     JRST    L.93
  3286.     PUSH    SP,C.25
  3287.     PUSHJ    SP,FILE%CLOSE
  3288.     ADJSP    SP,-1
  3289. L.93:    MOVEI    AC1,103                ;                                        2559
  3290.     MOVEI    AC2,1                ;                                        2561
  3291.     TDNN    AC2,ABT%ALL%FILE
  3292.     JRST    L.94
  3293.     MOVEI    AC1,132                ;                                        2563
  3294.     JRST    L.95                ;                                        2561
  3295. L.94:    MOVEI    AC2,1                ;                                        2566
  3296.     TDNE    AC2,ABT%CUR%FILE
  3297.     MOVEI    AC1,130
  3298. L.95:    PUSH    SP,C.15                ;                                        2568
  3299.     PUSH    SP,AC1
  3300.     PUSHJ    SP,XFR%STATUS
  3301.     SETZM    FLAG%FILE%OPEN            ;                                        2569
  3302.     ADJSP    SP,-2                ;                                        2537
  3303.     MOVEI    AC1,4
  3304.     POPJ    SP,                ;                                        2389
  3305. C.27:    POINT    8,U.59,-1
  3306. C.28:    EXP    104
  3307. C.29:    XWD    0,P.AAB
  3308. C.30:    XWD    0,P.AAC
  3309. C.31:    XWD    0,P.AAD
  3310.  
  3311. ; Routine Size:  136 words
  3312.  
  3313.  
  3314. ;   2574  1    %SBTTL 'SEND%FILE'
  3315. ;   2575  1    ROUTINE SEND%FILE =
  3316. ;   2576  1    
  3317. ;   2577  1    !++
  3318. ;   2578  1    ! FUNCTIONAL DESCRIPTION:
  3319. ;   2579  1    !
  3320. ;   2580  1    !    This routine will send the file specification that is being
  3321. ;   2581  1    !    transfered, or it will send a text header message.
  3322. ;   2582  1    !
  3323. ;   2583  1    ! CALLING SEQUENCE:
  3324. ;   2584  1    !
  3325. ;   2585  1    !    STATE = SEND%FILE();
  3326. ;   2586  1    !
  3327. ;   2587  1    ! INPUT PARAMETERS:
  3328. ;   2588  1    !
  3329. ;   2589  1    !    None.
  3330. ;   2590  1    !
  3331. ;   2591  1    ! IMPLICIT INPUTS:
  3332. ;   2592  1    !
  3333. ;   2593  1    !    TEXT%HEAD%FLAG - If true, send text header instead of file header
  3334. ;   2594  1    !
  3335. ;   2595  1    ! OUTPUT PARAMETERS:
  3336. ;   2596  1    !
  3337. ;   2597  1    !    New state to change the finite state machine to.
  3338. ;   2598  1    !
  3339. ;   2599  1    ! IMPLICIT OUTPUTS:
  3340. ;   2600  1    !
  3341. ;   2601  1    !    None.
  3342. ;   2602  1    !
  3343. ;   2603  1    ! COMPLETION CODES:
  3344. ;   2604  1    !
  3345. ;   2605  1    !    None.
  3346. ;   2606  1    !
  3347. ;   2607  1    ! SIDE EFFECTS:
  3348. ;   2608  1    !
  3349. ;   2609  1    !    None.
  3350. ;   2610  1    !
  3351. ;   2611  1    !--
  3352. ;   2612  1    
  3353. ;   2613  2        BEGIN
  3354. ;   2614  2    
  3355. ;   2615  2        LOCAL
  3356. ;   2616  2        M%TYPE,                    ! Message type to send
  3357. ;   2617  2        STATUS;                    ! Status returned by various routines
  3358. ;   2618  2    
  3359. ;   2619  2    !
  3360. ;   2620  2    ! Flag we don't want to abort yet
  3361. ;   2621  2    !
  3362. ;   2622  2        ABT%CUR%FILE = FALSE;
  3363. ;   2623  2        ABT%ALL%FILE = FALSE;
  3364. ;   2624  2    !
  3365. ;   2625  2    ! First determine if we have exceed the number of retries that are
  3366. ;   2626  2    ! allowed to attempt to send this message.
  3367. ;   2627  2    !
  3368. ;   2628  2    
  3369. ;   2629  2        IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  3370. ;   2630  2    
  3371. ;   2631  2    !
  3372. ;   2632  2    ! The number of retries are not exceeded.  Increment the number and then
  3373. ;   2633  2    ! attempt to send the packet again.
  3374. ;   2634  2    !
  3375. ;   2635  2        NUM%RETRIES = .NUM%RETRIES + 1;
  3376. ;   2636  2        SIZE = 0;                    ! Assume no name
  3377. ;   2637  2    
  3378. ;   2638  2        IF .TEXT%HEAD%FLAG THEN M%TYPE = MSG%TEXT ELSE M%TYPE = MSG%FILE;
  3379. ;   2639  2    
  3380. ;   2640  2        IF .FILE%SIZE NEQ 0 AND NOT .NO%FILE%NEEDED
  3381. ;   2641  2        THEN
  3382. ;   2642  3        BEGIN
  3383. ;   2643  3    ![025]    CH$MOVE (.FILE%SIZE, CH$PTR (FILE%NAME),
  3384. ;   2644  3    ![025]        CH$PTR (SND%MSG, PKT%MSG,
  3385. ;   2645  3    ![025]        CHR%SIZE));
  3386. ;   2646  3    ![025]
  3387. ;   2647  3    ![025] Fill packet with file name
  3388. ;   2648  3    ![025]
  3389. ;   2649  3        SET%STRING (CH$PTR (FILE%NAME), .FILE%SIZE, TRUE);
  3390. ;   2650  3        BFR%FILL (TRUE);
  3391. ;   2651  3        SET%STRING (0, 0, FALSE);
  3392. ;   2652  2        END;
  3393. ;   2653  2    
  3394. ;   2654  2        IF NOT SEND%PACKET (.M%TYPE, .SIZE, .MSG%NUMBER) THEN RETURN STATE%EX;
  3395. ;   2655  2    
  3396. ;   2656  2    !
  3397. ;   2657  2    ! Now get the responce from the remote KERMIT.
  3398. ;   2658  2    !
  3399. ;   2659  2        STATUS = REC%PACKET ();
  3400. ;   2660  2    
  3401. ;   2661  2        IF NOT .STATUS
  3402. ;   2662  2        THEN
  3403. ;   2663  3        BEGIN
  3404. ;   2664  3    
  3405. ;   2665  4        IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL
  3406. ;   2666  4     KER%CHKSUMERR)
  3407. ;   2667  3        THEN
  3408. ;   2668  3            RETURN .STATE
  3409. ;   2669  3        ELSE
  3410. ;   2670  3            RETURN STATE%EX;
  3411. ;   2671  3    
  3412. ;   2672  2        END;
  3413. ;   2673  2    
  3414. ;   2674  2    !
  3415. ;   2675  2    ! Determine if the packet is good.
  3416. ;   2676  2    !
  3417. ;   2677  2    
  3418. ;   2678  3        IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK)
  3419. ;   2679  2        THEN
  3420. ;   2680  3        BEGIN
  3421. ;   2681  3        KRM%ERROR (KER%PROTOERR);
  3422. ;   2682  3        RETURN STATE%A;
  3423. ;   2683  2        END;
  3424. ;   2684  2    
  3425. ;   2685  2    !
  3426. ;   2686  2    ! If this is a NAK and the message number is not the one we just send
  3427. ;   2687  2    ! treat this like an ACK, otherwise resend the last packet.
  3428. ;   2688  2    !
  3429. ;   2689  2    
  3430. ;   2690  3        IF .REC%TYPE EQL MSG%NAK AND (.REC%SEQ NEQ ((.MSG%NUMBER + 1) AND %O'77'))
  3431. ;   2691  2     THEN RETURN .STATE;
  3432. ;   2692  2    
  3433. ;   2693  2        IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE;
  3434. ;   2694  2    
  3435. ;   2695  2    !
  3436. ;   2696  2    ! If all is ok, bump the message number and fill first buffer
  3437. ;   2697  2    !
  3438. ;   2698  2        NUM%RETRIES = 0;
  3439. ;   2699  2        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  3440. ;   2700  2    
  3441. ;   2701  2        IF BFR%FILL (TRUE) THEN RETURN STATE%SD ELSE RETURN STATE%A;
  3442. ;   2702  2    
  3443. ;   2703  1        END;                    ! End of SEND%FILE
  3444.  
  3445.  
  3446. ; SEND%FILE
  3447. U.4:    PUSH    SP,AC16                ;                                        2575
  3448.     SETZM    ABT%CUR%FILE            ;                                        2622
  3449.     SETZM    ABT%ALL%FILE            ;                                        2623
  3450.     MOVE    AC1,U.54            ;                                        2629
  3451.     CAMG    AC1,PKT%RETRIES
  3452.     JRST    L.96
  3453.     MOVEI    AC1,24
  3454.     JRST    L.107
  3455. L.96:    AOS    U.54                ;                                        2635
  3456.     SETZM    U.52                ;                                        2636
  3457.     MOVEI    AC1,1                ;                                        2638
  3458.     TDNN    AC1,U.62
  3459.     JRST    L.97
  3460.     MOVEI    AC16,130
  3461.     JRST    L.98
  3462. L.97:    MOVEI    AC16,106
  3463. L.98:    MOVE    AC1,FILE%SIZE            ;                                        2640
  3464.     JUMPE    AC1,L.99
  3465.     MOVEI    AC2,1
  3466.     TDNE    AC2,U.63
  3467.     JRST    L.99
  3468.     PUSH    SP,C.10                ;                                        2649
  3469.     PUSH    SP,AC1
  3470.     PUSH    SP,C.2
  3471.     PUSHJ    SP,U.30
  3472.     PUSH    SP,C.2                ;                                        2650
  3473.     PUSHJ    SP,U.29
  3474.     SETZM    -2(SP)                ;                                        2651
  3475.     SETZM    -1(SP)
  3476.     SETZM    0(SP)
  3477.     PUSHJ    SP,U.30
  3478.     ADJSP    SP,-4                ;                                        2642
  3479. L.99:    PUSH    SP,AC16                ;                                        2654
  3480.     PUSH    SP,U.52
  3481.     PUSH    SP,U.55
  3482.     PUSHJ    SP,U.24
  3483.     ADJSP    SP,-3
  3484.     TRNN    AC1,1
  3485.     JRST    L.100
  3486.     PUSHJ    SP,U.26                ;                                        2659
  3487.     TRNE    AC1,1                ;                                        2661
  3488.     JRST    L.101
  3489.     CAIE    AC1,262                ;                                        2665
  3490.     CAIN    AC1,300
  3491.     JRST    L.104
  3492.     CAIN    AC1,172
  3493.     JRST    L.104                ;                                        2668
  3494. L.100:    MOVEI    AC1,23                ;                                        2670
  3495.     JRST    L.107                ;                                        2663
  3496. L.101:    MOVE    AC1,U.58            ;                                        2678
  3497.     CAIE    AC1,131
  3498.     CAIN    AC1,116
  3499.     JRST    L.102
  3500.     PUSH    SP,C.21                ;                                        2681
  3501.     PUSHJ    SP,KRM%ERROR
  3502.     ADJSP    SP,-1                ;                                        2682
  3503.     JRST    L.106
  3504. L.102:    MOVE    AC2,U.58            ;                                        2690
  3505.     CAIE    AC2,116
  3506.     JRST    L.103
  3507.     MOVE    AC1,U.55
  3508.     ADDI    AC1,1
  3509.     LDB    AC3,C.18
  3510.     CAME    AC3,U.56
  3511.     JRST    L.104
  3512. L.103:    CAIE    AC2,131                ;                                        2693
  3513.     JRST    L.105
  3514.     MOVE    AC1,U.56
  3515.     CAMN    AC1,U.55
  3516.     JRST    L.105
  3517. L.104:    MOVE    AC1,U.51
  3518.     JRST    L.107
  3519. L.105:    SETZM    U.54                ;                                        2698
  3520.     MOVE    AC1,U.55            ;                                        2699
  3521.     ADDI    AC1,1
  3522.     LDB    AC2,C.18
  3523.     MOVEM    AC2,U.55
  3524.     PUSH    SP,C.2                ;                                        2701
  3525.     PUSHJ    SP,U.29
  3526.     ADJSP    SP,-1
  3527.     TRNN    AC1,1
  3528.     JRST    L.106
  3529.     MOVEI    AC1,3
  3530.     JRST    L.107
  3531. L.106:    MOVEI    AC1,12
  3532. L.107:    POP    SP,AC16                ;                                        2575
  3533.     POPJ    SP,
  3534.  
  3535. ; Routine Size:  87 words
  3536.  
  3537.  
  3538. ;   2704  1    %SBTTL 'SEND%EOF'
  3539. ;   2705  1    ROUTINE SEND%EOF =
  3540. ;   2706  1    
  3541. ;   2707  1    !++
  3542. ;   2708  1    ! FUNCTIONAL DESCRIPTION:
  3543. ;   2709  1    !
  3544. ;   2710  1    !    This routine will send the end of file message to the remote
  3545. ;   2711  1    !    KERMIT.  It will then determine if there are more files to
  3546. ;   2712  1    !    send to the remote.
  3547. ;   2713  1    !
  3548. ;   2714  1    ! CALLING SEQUENCE:
  3549. ;   2715  1    !
  3550. ;   2716  1    !    STATE = SEND%EOF();
  3551. ;   2717  1    !
  3552. ;   2718  1    ! INPUT PARAMETERS:
  3553. ;   2719  1    !
  3554. ;   2720  1    !    None.
  3555. ;   2721  1    !
  3556. ;   2722  1    ! IMPLICIT INPUTS:
  3557. ;   2723  1    !
  3558. ;   2724  1    !    None.
  3559. ;   2725  1    !
  3560. ;   2726  1    ! OUTPUT PARAMETERS:
  3561. ;   2727  1    !
  3562. ;   2728  1    !    New state to change the finite state machine to.
  3563. ;   2729  1    !
  3564. ;   2730  1    ! IMPLICIT OUTPUTS:
  3565. ;   2731  1    !
  3566. ;   2732  1    !    None.
  3567. ;   2733  1    !
  3568. ;   2734  1    ! COMPLETION CODES:
  3569. ;   2735  1    !
  3570. ;   2736  1    !    None.
  3571. ;   2737  1    !
  3572. ;   2738  1    ! SIDE EFFECTS:
  3573. ;   2739  1    !
  3574. ;   2740  1    !    Sets up for the next file to be processed if there is one.
  3575. ;   2741  1    !
  3576. ;   2742  1    !--
  3577. ;   2743  1    
  3578. ;   2744  2        BEGIN
  3579. ;   2745  2    
  3580. ;   2746  2        LOCAL
  3581. ;   2747  2        STATUS,                    ! Status returned by various routines
  3582. ;   2748  2        EOF%MSG%LEN;                ! Length of EOF message to send
  3583. ;   2749  2    
  3584. ;   2750  2    !
  3585. ;   2751  2    ! First determine if we have exceed the number of retries that are
  3586. ;   2752  2    ! allowed to attempt to send this message.
  3587. ;   2753  2    !
  3588. ;   2754  2    
  3589. ;   2755  2        IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  3590. ;   2756  2    
  3591. ;   2757  2    !
  3592. ;   2758  2    ! The number of retries are not exceeded.  Increment the number and then
  3593. ;   2759  2    ! attempt to send the packet again.
  3594. ;   2760  2    !
  3595. ;   2761  2        NUM%RETRIES = .NUM%RETRIES + 1;
  3596. ;   2762  2    !
  3597. ;   2763  2    ! Store character in packet to indicate discard of file
  3598. ;   2764  2    ! Character will only be sent if file should be discarded
  3599. ;   2765  2    !
  3600. ;   2766  2        CH$WCHAR (MSG%EOF%DISCARD, CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE));
  3601. ;   2767  2    
  3602. ;   2768  2        IF .ABT%CUR%FILE OR .ABT%ALL%FILE THEN EOF%MSG%LEN = 1 ELSE EOF%MSG%LEN = 0;
  3603. ;   2769  2    
  3604. ;   2770  2        IF NOT SEND%PACKET (MSG%EOF, .EOF%MSG%LEN, .MSG%NUMBER) THEN RETURN
  3605. ;   2771  2     STATE%EX;
  3606. ;   2772  2    
  3607. ;   2773  2    !
  3608. ;   2774  2    ! Now get the responce from the remote KERMIT.
  3609. ;   2775  2    !
  3610. ;   2776  2        STATUS = REC%PACKET ();
  3611. ;   2777  2    
  3612. ;   2778  2        IF NOT .STATUS
  3613. ;   2779  2        THEN
  3614. ;   2780  3        BEGIN
  3615. ;   2781  3    
  3616. ;   2782  4        IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL
  3617. ;   2783  4     KER%CHKSUMERR)
  3618. ;   2784  3        THEN
  3619. ;   2785  3            RETURN .STATE
  3620. ;   2786  3        ELSE
  3621. ;   2787  3            RETURN STATE%EX;
  3622. ;   2788  3    
  3623. ;   2789  2        END;
  3624. ;   2790  2    
  3625. ;   2791  2    !
  3626. ;   2792  2    ! Determine if the packet is good.
  3627. ;   2793  2    !
  3628. ;   2794  2    
  3629. ;   2795  3        IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK)
  3630. ;   2796  2        THEN
  3631. ;   2797  3        BEGIN
  3632. ;   2798  3        KRM%ERROR (KER%PROTOERR);
  3633. ;   2799  3        RETURN STATE%A;
  3634. ;   2800  2        END;
  3635. ;   2801  2    
  3636. ;   2802  2    !
  3637. ;   2803  2    ! If this is a NAK and the message number is not the one we just send
  3638. ;   2804  2    ! treat this like an ACK, otherwise resend the last packet.
  3639. ;   2805  2    !
  3640. ;   2806  2    
  3641. ;   2807  3        IF .REC%TYPE EQL MSG%NAK AND (.REC%SEQ NEQ ((.MSG%NUMBER + 1) AND %O'77'))
  3642. ;   2808  2     THEN RETURN .STATE;
  3643. ;   2809  2    
  3644. ;   2810  2        IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE;
  3645. ;   2811  2    
  3646. ;   2812  2    !
  3647. ;   2813  2    ! Here to determine if there is another file to send.
  3648. ;   2814  2    !
  3649. ;   2815  2        NUM%RETRIES = 0;
  3650. ;   2816  2        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  3651. ;   2817  2    
  3652. ;   2818  2        IF NOT .ABT%ALL%FILE THEN STATUS = NEXT%FILE () ELSE STATUS =
  3653. ;   2819  2     KER%NOMORFILES;
  3654. ;   2820  2    
  3655. ;   2821  3        IF ( NOT .STATUS) OR (.STATUS EQL KER%NOMORFILES)
  3656. ;   2822  2        THEN
  3657. ;   2823  3        BEGIN
  3658. ;   2824  3    
  3659. ;   2825  3        IF (.STATUS NEQ KER%NOMORFILES) THEN RETURN STATE%A ELSE RETURN STATE%SB;
  3660. ;   2826  3    
  3661. ;   2827  3        END
  3662. ;   2828  2        ELSE
  3663. ;   2829  3        BEGIN
  3664. ;   2830  3        FLAG%FILE%OPEN = TRUE;            ! Have a file open again
  3665. ;   2831  3    
  3666. ;   2832  3        IF .FIL%NORMAL%FORM THEN NORMALIZE%FILE (FILE%NAME, FILE%SIZE, -1, -1);
  3667. ;   2833  3    
  3668. ;   2834  3        XFR%STATUS (%C'F', %C'S');        ! Inform display routine
  3669. ;   2835  3    
  3670. ;   2836  3        IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  3671. ;   2837  3        THEN
  3672. ;   2838  4            BEGIN
  3673. ;   2839  4    !![045]        TT%TEXT (UPLIT (%ASCIZ'Sending: '));
  3674. ;   2840  4            TT%TEXT (FILE%NAME);
  3675. ;   2841  4            TT%OUTPUT ();
  3676. ;   2842  3            END;
  3677. ;   2843  3    
  3678. ;   2844  3        FILE%CHARS = 0;                ! No characters sent yet
  3679. ;   2845  3        RETURN STATE%SF;
  3680. ;   2846  2        END;
  3681. ;   2847  2    
  3682. ;   2848  1        END;                    ! End of SEND%EOF
  3683.  
  3684.  
  3685. ; SEND%EOF
  3686. U.7:    PUSH    SP,AC16                ;                                        2705
  3687.     MOVE    AC1,U.54            ;                                        2755
  3688.     CAMG    AC1,PKT%RETRIES
  3689.     JRST    L.108
  3690.     MOVEI    AC1,24
  3691.     JRST    L.125
  3692. L.108:    AOS    U.54                ;                                        2761
  3693.     MOVEI    AC2,104                ;                                        2766
  3694.     MOVE    AC1,C.32
  3695.     IDPB    AC2,AC1
  3696.     MOVEI    AC1,1                ;                                        2768
  3697.     TDNE    AC1,ABT%CUR%FILE
  3698.     JRST    L.109
  3699.     MOVEI    AC1,1
  3700.     TDNN    AC1,ABT%ALL%FILE
  3701.     JRST    L.110
  3702. L.109:    MOVEI    AC1,1
  3703.     JRST    L.111
  3704. L.110:    SETZ    AC1,
  3705. L.111:    PUSH    SP,C.33                ;                                        2770
  3706.     PUSH    SP,AC1
  3707.     PUSH    SP,U.55
  3708.     PUSHJ    SP,U.24
  3709.     ADJSP    SP,-3
  3710.     TRNN    AC1,1
  3711.     JRST    L.112
  3712.     PUSHJ    SP,U.26                ;                                        2776
  3713.     MOVE    AC16,AC1
  3714.     TRNE    AC16,1                ;                                        2778
  3715.     JRST    L.113
  3716.     CAIE    AC16,262            ;                                        2782
  3717.     CAIN    AC16,300
  3718.     JRST    L.116
  3719.     CAIN    AC16,172
  3720.     JRST    L.116                ;                                        2785
  3721. L.112:    MOVEI    AC1,23                ;                                        2787
  3722.     JRST    L.125                ;                                        2780
  3723. L.113:    MOVE    AC1,U.58            ;                                        2795
  3724.     CAIE    AC1,131
  3725.     CAIN    AC1,116
  3726.     JRST    L.114
  3727.     PUSH    SP,C.21                ;                                        2798
  3728.     PUSHJ    SP,KRM%ERROR
  3729.     ADJSP    SP,-1                ;                                        2799
  3730.     JRST    L.120
  3731. L.114:    MOVE    AC2,U.58            ;                                        2807
  3732.     CAIE    AC2,116
  3733.     JRST    L.115
  3734.     MOVE    AC1,U.55
  3735.     ADDI    AC1,1
  3736.     LDB    AC3,C.18
  3737.     CAME    AC3,U.56
  3738.     JRST    L.116
  3739. L.115:    CAIE    AC2,131                ;                                        2810
  3740.     JRST    L.117
  3741.     MOVE    AC1,U.56
  3742.     CAMN    AC1,U.55
  3743.     JRST    L.117
  3744. L.116:    MOVE    AC1,U.51
  3745.     JRST    L.125
  3746. L.117:    SETZM    U.54                ;                                        2815
  3747.     MOVE    AC1,U.55            ;                                        2816
  3748.     ADDI    AC1,1
  3749.     LDB    AC2,C.18
  3750.     MOVEM    AC2,U.55
  3751.     MOVEI    AC1,1                ;                                        2818
  3752.     TDNE    AC1,ABT%ALL%FILE
  3753.     JRST    L.118
  3754.     PUSHJ    SP,NEXT%FILE
  3755.     SKIPA    AC16,AC1
  3756. L.118:    MOVEI    AC16,133
  3757.     TRNN    AC16,1                ;                                        2821
  3758.     JRST    L.119
  3759.     CAIE    AC16,133
  3760.     JRST    L.122
  3761. L.119:    CAIN    AC16,133            ;                                        2825
  3762.     JRST    L.121
  3763. L.120:    MOVEI    AC1,12
  3764.     JRST    L.125
  3765. L.121:    MOVEI    AC1,5
  3766.     JRST    L.125                ;                                        2829
  3767. L.122:    MOVEI    AC1,1                ;                                        2830
  3768.     MOVEM    AC1,FLAG%FILE%OPEN
  3769.     MOVEI    AC1,1                ;                                        2832
  3770.     TDNN    AC1,FIL%NORMAL%FORM
  3771.     JRST    L.123
  3772.     PUSH    SP,C.34
  3773.     PUSH    SP,C.35
  3774.     PUSH    SP,C.36
  3775.     PUSH    SP,C.36
  3776.     PUSHJ    SP,U.27
  3777.     ADJSP    SP,-4
  3778. L.123:    PUSH    SP,C.15                ;                                        2834
  3779.     PUSH    SP,C.8
  3780.     PUSHJ    SP,XFR%STATUS
  3781.     MOVEI    AC1,1                ;                                        2836
  3782.     TDNE    AC1,CONNECT%FLAG
  3783.     JRST    L.124
  3784.     MOVEI    AC1,1
  3785.     TDNN    AC1,TY%FIL
  3786.     JRST    L.124
  3787.     PUSH    SP,C.34                ;                                        2840
  3788.     PUSHJ    SP,TT%TEXT
  3789.     PUSHJ    SP,TT%OUTPUT            ;                                        2841
  3790.     ADJSP    SP,-1                ;                                        2838
  3791. L.124:    SETZM    U.61                ;                                        2844
  3792.     ADJSP    SP,-2                ;                                        2829
  3793.     MOVEI    AC1,2
  3794. L.125:    POP    SP,AC16                ;                                        2705
  3795.     POPJ    SP,
  3796. C.32:    POINT    8,U.60,31
  3797. C.33:    EXP    132
  3798. C.34:    XWD    0,FILE%NAME
  3799. C.35:    XWD    0,FILE%SIZE
  3800. C.36:    EXP    -1
  3801.  
  3802. ; Routine Size:  115 words
  3803.  
  3804.  
  3805. ;   2849  1    %SBTTL 'SEND%INIT'
  3806. ;   2850  1    ROUTINE SEND%INIT =
  3807. ;   2851  1    
  3808. ;   2852  1    !++
  3809. ;   2853  1    ! FUNCTIONAL DESCRIPTION:
  3810. ;   2854  1    !
  3811. ;   2855  1    !    This routine will send the initialization packet to the remote
  3812. ;   2856  1    !    KERMIT.  The message type sent is S.
  3813. ;   2857  1    !
  3814. ;   2858  1    ! CALLING SEQUENCE:
  3815. ;   2859  1    !
  3816. ;   2860  1    !    STATE = SEND%INIT();
  3817. ;   2861  1    !
  3818. ;   2862  1    ! INPUT PARAMETERS:
  3819. ;   2863  1    !
  3820. ;   2864  1    !    None.
  3821. ;   2865  1    !
  3822. ;   2866  1    ! IMPLICIT INPUTS:
  3823. ;   2867  1    !
  3824. ;   2868  1    !    None.
  3825. ;   2869  1    !
  3826. ;   2870  1    ! OUTPUT PARAMETERS:
  3827. ;   2871  1    !
  3828. ;   2872  1    !    New state to change the finite state machine to.
  3829. ;   2873  1    !
  3830. ;   2874  1    ! IMPLICIT OUTPUTS:
  3831. ;   2875  1    !
  3832. ;   2876  1    !    None.
  3833. ;   2877  1    !
  3834. ;   2878  1    ! COMPLETION CODES:
  3835. ;   2879  1    !
  3836. ;   2880  1    !    None.
  3837. ;   2881  1    !
  3838. ;   2882  1    ! SIDE EFFECTS:
  3839. ;   2883  1    !
  3840. ;   2884  1    !    None.
  3841. ;   2885  1    !
  3842. ;   2886  1    !--
  3843. ;   2887  1    
  3844. ;   2888  2        BEGIN
  3845. ;   2889  2    
  3846. ;   2890  2        LOCAL
  3847. ;   2891  2        STATUS;                    ! Status returned by various routines
  3848. ;   2892  2    
  3849. ;   2893  2        SET%SEND%INIT ();
  3850. ;   2894  2    
  3851. ;   2895  2        IF .NUM%RETRIES GTR .SI%RETRIES THEN RETURN STATE%ER;
  3852. ;   2896  2    
  3853. ;   2897  2    !
  3854. ;   2898  2    ! Count the number of times we try this
  3855. ;   2899  2    !
  3856. ;   2900  2        NUM%RETRIES = .NUM%RETRIES + 1;
  3857. ;   2901  2    
  3858. ;   2902  2        IF NOT SEND%PACKET (MSG%SND%INIT, .SEND%INIT%SIZE, .MSG%NUMBER) THEN RETURN
  3859. ;   2903  2     STATE%EX; ! [108]
  3860. ;   2904  2    
  3861. ;   2905  2    !
  3862. ;   2906  2    ! Determine if we received a packet it good condition.  If we timed out or
  3863. ;   2907  2    ! got an illegal message, just try again.
  3864. ;   2908  2    !
  3865. ;   2909  2        STATUS = REC%PACKET ();
  3866. ;   2910  2    
  3867. ;   2911  2        IF NOT .STATUS
  3868. ;   2912  2        THEN
  3869. ;   2913  3        BEGIN
  3870. ;   2914  3    
  3871. ;   2915  4        IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL
  3872. ;   2916  4     KER%CHKSUMERR)
  3873. ;   2917  3        THEN
  3874. ;   2918  3            RETURN .STATE
  3875. ;   2919  3        ELSE
  3876. ;   2920  3            RETURN STATE%EX;
  3877. ;   2921  3    
  3878. ;   2922  2        END;
  3879. ;   2923  2    
  3880. ;   2924  2    !
  3881. ;   2925  2    ! Determine if the packet is good.
  3882. ;   2926  2    !
  3883. ;   2927  2    
  3884. ;   2928  2        IF .REC%TYPE NEQ MSG%ACK THEN RETURN .STATE;
  3885. ;   2929  2    
  3886. ;   2930  2        IF .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE;
  3887. ;   2931  2    
  3888. ;   2932  2    !
  3889. ;   2933  2    ! Here if we have an ACK for the initialization message that was just sent
  3890. ;   2934  2    ! to the remote KERMIT.
  3891. ;   2935  2    !
  3892. ;   2936  2    
  3893. ;   2937  2        IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN STATE%A;
  3894. ;   2938  2    
  3895. ;   2939  2        BLK%CHK%TYPE = .INI%CHK%TYPE;        ! We now use agreed upon block check type
  3896. ;   2940  2        NUM%RETRIES = 0;
  3897. ;   2941  2        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  3898. ;   2942  2        RETURN STATE%OF;                ! Now need to open the file
  3899. ;   2943  1        END;
  3900.  
  3901.  
  3902. ; SEND%INIT
  3903. U.8:    PUSHJ    SP,U.20                ;                                        2893
  3904.     MOVE    AC1,U.54            ;                                        2895
  3905.     CAMG    AC1,SI%RETRIES
  3906.     JRST    L.126
  3907.     MOVEI    AC1,24
  3908.     POPJ    SP,
  3909. L.126:    AOS    U.54                ;                                        2900
  3910.     PUSH    SP,C.8                ;                                        2902
  3911.     PUSH    SP,U.46
  3912.     PUSH    SP,U.55
  3913.     PUSHJ    SP,U.24
  3914.     ADJSP    SP,-3
  3915.     TRNE    AC1,1
  3916.     JRST    L.127
  3917.     MOVEI    AC1,23
  3918.     POPJ    SP,
  3919. L.127:    PUSHJ    SP,U.26                ;                                        2909
  3920.     TRNE    AC1,1                ;                                        2911
  3921.     JRST    L.129
  3922.     CAIE    AC1,262                ;                                        2915
  3923.     CAIN    AC1,300
  3924.     JRST    L.128
  3925.     CAIN    AC1,172
  3926. L.128:    SKIPA    AC2,U.51            ;                                        2920
  3927.     MOVEI    AC2,23
  3928.     MOVE    AC1,AC2                ;                                        2913
  3929.     POPJ    SP,
  3930. L.129:    MOVEI    AC2,131                ;                                        2928
  3931.     CAME    AC2,U.58
  3932.     JRST    L.130
  3933.     MOVE    AC2,U.56            ;                                        2930
  3934.     CAMN    AC2,U.55
  3935.     JRST    L.131
  3936. L.130:    MOVE    AC1,U.51
  3937.     POPJ    SP,
  3938. L.131:    PUSHJ    SP,U.21                ;                                        2937
  3939.     TRNE    AC1,1
  3940.     JRST    L.132
  3941.     MOVEI    AC1,12
  3942.     POPJ    SP,
  3943. L.132:    MOVE    AC1,U.47            ;                                        2939
  3944.     MOVEM    AC1,U.48
  3945.     SETZM    U.54                ;                                        2940
  3946.     MOVE    AC1,U.55            ;                                        2941
  3947.     ADDI    AC1,1
  3948.     LDB    AC2,C.18
  3949.     MOVEM    AC2,U.55
  3950.     MOVEI    AC1,22                ;                                        2888
  3951.     POPJ    SP,                ;                                        2850
  3952.  
  3953. ; Routine Size:  49 words
  3954.  
  3955.  
  3956. ;   2944  1    %SBTTL 'SEND%OPEN%FILE - Open file for sending'
  3957. ;   2945  1    ROUTINE SEND%OPEN%FILE =
  3958. ;   2946  1    
  3959. ;   2947  1    !++
  3960. ;   2948  1    ! FUNCTIONAL DESCRIPTION:
  3961. ;   2949  1    !
  3962. ;   2950  1    ! This routine is called from DO%TRANSACTION when the first input file
  3963. ;   2951  1    ! needs to be opened.
  3964. ;   2952  1    !
  3965. ;   2953  1    ! CALLING SEQUENCE:
  3966. ;   2954  1    !
  3967. ;   2955  1    !    STATE = SEND%OPEN%FILE ();
  3968. ;   2956  1    !
  3969. ;   2957  1    ! INPUT PARAMETERS:
  3970. ;   2958  1    !
  3971. ;   2959  1    !    None.
  3972. ;   2960  1    !
  3973. ;   2961  1    ! IMPLICIT INPUTS:
  3974. ;   2962  1    !
  3975. ;   2963  1    !    FILE%NAME, FILE%SIZE, etc.
  3976. ;   2964  1    !
  3977. ;   2965  1    ! OUPTUT PARAMETERS:
  3978. ;   2966  1    !
  3979. ;   2967  1    !    New state for FSM.
  3980. ;   2968  1    !
  3981. ;   2969  1    ! IMPLICIT OUTPUTS:
  3982. ;   2970  1    !
  3983. ;   2971  1    !    None.
  3984. ;   2972  1    !
  3985. ;   2973  1    ! COMPLETION CODES:
  3986. ;   2974  1    !
  3987. ;   2975  1    !    None.
  3988. ;   2976  1    !
  3989. ;   2977  1    ! SIDE EFFECTS:
  3990. ;   2978  1    !
  3991. ;   2979  1    !    None.
  3992. ;   2980  1    !
  3993. ;   2981  1    !--
  3994. ;   2982  1    
  3995. ;   2983  2        BEGIN
  3996. ;   2984  2    
  3997. ;   2985  2        IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  3998. ;   2986  2        THEN
  3999. ;   2987  3        BEGIN
  4000. ;   2988  3        TT%TEXT (UPLIT (%ASCIZ'Sending: '));
  4001. ;   2989  3        TT%OUTPUT ();
  4002. ;   2990  2        END;
  4003. ;   2991  2    
  4004. ;   2992  2        FILE%CHARS = 0;                ! No characters sent yet
  4005. ;   2993  2    
  4006. ;   2994  2        IF NOT .NO%FILE%NEEDED
  4007. ;   2995  2        THEN
  4008. ;   2996  2    
  4009. ;   2997  2        IF NOT FILE%OPEN (FNC%READ) THEN RETURN STATE%A ELSE FLAG%FILE%OPEN = TRUE;
  4010. ;   2998  2    
  4011. ;   2999  2    ![023]
  4012. ;   3000  2    ![023] If we want normalized file names, beat up the name now
  4013. ;   3001  2    ![023]
  4014. ;   3002  2    
  4015. ;   3003  2        IF .FIL%NORMAL%FORM THEN NORMALIZE%FILE (FILE%NAME, FILE%SIZE, -1, -1);
  4016. ;   3004  2    
  4017. ;   3005  2        XFR%STATUS (%C'F', %C'S');            ! Inform display routine
  4018. ;   3006  2    
  4019. ;   3007  2        IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  4020. ;   3008  2        THEN
  4021. ;   3009  3        BEGIN
  4022. ;   3010  3        TT%TEXT (FILE%NAME);
  4023. ;   3011  3        TT%OUTPUT ();
  4024. ;   3012  2        END;
  4025. ;   3013  2    
  4026. ;   3014  2        RETURN STATE%SF;
  4027. ;   3015  1        END;                    ! End of FSM%OPEN%FILE
  4028.  
  4029.  
  4030. P.AAE:    BYTE    (7)"S","e","n","d","i"
  4031.     BYTE    (7)"n","g",":"," ",000
  4032.  
  4033.  
  4034. ; SEND%OPEN%FILE
  4035. U.5:    MOVEI    AC1,1                ;                                        2985
  4036.     TDNE    AC1,CONNECT%FLAG
  4037.     JRST    L.133
  4038.     MOVEI    AC1,1
  4039.     TDNN    AC1,TY%FIL
  4040.     JRST    L.133
  4041.     PUSH    SP,C.37                ;                                        2988
  4042.     PUSHJ    SP,TT%TEXT
  4043.     PUSHJ    SP,TT%OUTPUT            ;                                        2989
  4044.     ADJSP    SP,-1                ;                                        2987
  4045. L.133:    SETZM    U.61                ;                                        2992
  4046.     MOVEI    AC1,1                ;                                        2994
  4047.     TDNE    AC1,U.63
  4048.     JRST    L.135
  4049.     PUSH    SP,C.25                ;                                        2997
  4050.     PUSHJ    SP,FILE%OPEN
  4051.     ADJSP    SP,-1
  4052.     TRNE    AC1,1
  4053.     JRST    L.134
  4054.     MOVEI    AC1,12
  4055.     POPJ    SP,
  4056. L.134:    MOVEI    AC1,1
  4057.     MOVEM    AC1,FLAG%FILE%OPEN
  4058. L.135:    MOVEI    AC1,1                ;                                        3003
  4059.     TDNN    AC1,FIL%NORMAL%FORM
  4060.     JRST    L.136
  4061.     PUSH    SP,C.34
  4062.     PUSH    SP,C.35
  4063.     PUSH    SP,C.36
  4064.     PUSH    SP,C.36
  4065.     PUSHJ    SP,U.27
  4066.     ADJSP    SP,-4
  4067. L.136:    PUSH    SP,C.15                ;                                        3005
  4068.     PUSH    SP,C.8
  4069.     PUSHJ    SP,XFR%STATUS
  4070.     MOVEI    AC1,1                ;                                        3007
  4071.     TDNE    AC1,CONNECT%FLAG
  4072.     JRST    L.137
  4073.     MOVEI    AC1,1
  4074.     TDNN    AC1,TY%FIL
  4075.     JRST    L.137
  4076.     PUSH    SP,C.34                ;                                        3010
  4077.     PUSHJ    SP,TT%TEXT
  4078.     PUSHJ    SP,TT%OUTPUT            ;                                        3011
  4079.     ADJSP    SP,-1                ;                                        3009
  4080. L.137:    ADJSP    SP,-2                ;                                        3014
  4081.     MOVEI    AC1,2                ;                                        2983
  4082.     POPJ    SP,                ;                                        2945
  4083. C.37:    XWD    0,P.AAE
  4084.  
  4085. ; Routine Size:  49 words
  4086.  
  4087.  
  4088. ;   3016  1    %SBTTL 'SEND%GENCMD'
  4089. ;   3017  1    ROUTINE SEND%GENCMD =
  4090. ;   3018  1    
  4091. ;   3019  1    !++
  4092. ;   3020  1    ! FUNCTIONAL DESCRIPTION:
  4093. ;   3021  1    !
  4094. ;   3022  1    !    This routine will send a command packet to the server Kermit.
  4095. ;   3023  1    !    The new state will depend upon the response.  If a send-init
  4096. ;   3024  1    !    is received, it will process it and switch to STATE%RF.
  4097. ;   3025  1    !    If a text-header is received it will switch to STATE%RD.
  4098. ;   3026  1    !    If an ACK is received, it will type the data portion and
  4099. ;   3027  1    !    switch to STATE%C.
  4100. ;   3028  1    !
  4101. ;   3029  1    ! CALLING SEQUENCE:
  4102. ;   3030  1    !
  4103. ;   3031  1    !    STATE = SEND%GENCMD();
  4104. ;   3032  1    !
  4105. ;   3033  1    ! INPUT PARAMETERS:
  4106. ;   3034  1    !
  4107. ;   3035  1    !    None.
  4108. ;   3036  1    !
  4109. ;   3037  1    ! IMPLICIT INPUTS:
  4110. ;   3038  1    !
  4111. ;   3039  1    !    GEN%TYPE - Message type to send (normally MSG%GENERIC)
  4112. ;   3040  1    !    GEN%SUBTYPE - Message subtype (only if MSG%GENERIC)
  4113. ;   3041  1    !    GEN%1DATA - First argument string
  4114. ;   3042  1    !    GEN%1SIZE - Size of first argument
  4115. ;   3043  1    !    GEN%2DATA - Second argument string
  4116. ;   3044  1    !    GEN%2SIZE - Size of second argument
  4117. ;   3045  1    !    GEN%3DATA - Third argument string
  4118. ;   3046  1    !    GEN%3SIZE - Size of third argument
  4119. ;   3047  1    !
  4120. ;   3048  1    ! OUTPUT PARAMETERS:
  4121. ;   3049  1    !
  4122. ;   3050  1    !    New state for the finite state machine.
  4123. ;   3051  1    !
  4124. ;   3052  1    ! IMPLICIT OUTPUTS:
  4125. ;   3053  1    !
  4126. ;   3054  1    !    None.
  4127. ;   3055  1    !
  4128. ;   3056  1    ! COMPLETION CODES:
  4129. ;   3057  1    !
  4130. ;   3058  1    !    None.
  4131. ;   3059  1    !
  4132. ;   3060  1    ! SIDE EFFECTS:
  4133. ;   3061  1    !
  4134. ;   3062  1    !    None.
  4135. ;   3063  1    !
  4136. ;   3064  1    !--
  4137. ;   3065  1    
  4138. ;   3066  2        BEGIN
  4139. ;   3067  2    
  4140. ;   3068  2        LOCAL
  4141. ;   3069  2        POINTER,                ! Pointer at DATA%TEXT
  4142. ;   3070  2        DATA%TEXT : VECTOR [CH$ALLOCATION (MAX%MSG)],    ! Data buffer
  4143. ;   3071  2        DATA%SIZE,                ! Length of data buffer used
  4144. ;   3072  2        STATUS;                    ! Status returned by various routines
  4145. ;   3073  2    
  4146. ;   3074  2        ROUTINE PACK%DATA (POINTER, LENGTH, SRC%ADDR, SRC%LEN) =
  4147. ;   3075  2    !
  4148. ;   3076  2    ! Routine to pack an argument into the buffer.
  4149. ;   3077  2    !
  4150. ;   3078  3        BEGIN
  4151. ;   3079  3    
  4152. ;   3080  3        IF .SRC%LEN GTR MAX%MSG - .LENGTH - 1 THEN SRC%LEN = MAX%MSG - .LENGTH - 1;
  4153. ;   3081  3    
  4154. ;   3082  3        LENGTH = .LENGTH + .SRC%LEN + 1;
  4155. ;   3083  3        CH$WCHAR%A (CHAR (.SRC%LEN), .POINTER);
  4156. ;   3084  3        .POINTER = CH$MOVE (.SRC%LEN, CH$PTR (.SRC%ADDR), ..POINTER);
  4157. ;   3085  3        RETURN .LENGTH;
  4158. ;   3086  2        END;
  4159.  
  4160.  
  4161. ; PACK%DATA
  4162. U.77:    MOVE    AC1,-3(SP)            ;                                        3080
  4163.     SUBI    AC1,1751
  4164.     MOVN    AC2,AC1
  4165.     CAMGE    AC2,-1(SP)
  4166.     MOVNM    AC1,-1(SP)
  4167.     MOVE    AC1,-3(SP)            ;                                        3082
  4168.     ADD    AC1,-1(SP)
  4169.     ADDI    AC1,1
  4170.     MOVEM    AC1,-3(SP)
  4171.     MOVE    AC2,-1(SP)            ;                                        3083
  4172.     ADDI    AC2,40
  4173.     MOVE    AC1,-4(SP)
  4174.     IDPB    AC2,0(AC1)
  4175.     MOVE    AC3,-4(SP)            ;                                        3084
  4176.     MOVE    AC1,-2(SP)
  4177.     MOVEI    AC2,-1(AC1)
  4178.     HRLI    AC2,10700
  4179.     MOVE    AC1,-1(SP)
  4180.     MOVE    AC4,-1(SP)
  4181.     MOVE    AC5,0(AC3)
  4182.     EXTEND    AC1,C.9
  4183.     JFCL    
  4184.     MOVEM    AC5,0(AC3)
  4185.     MOVE    AC1,-3(SP)            ;                                        3078
  4186.     POPJ    SP,                ;                                        3074
  4187.  
  4188. ; Routine Size:  25 words
  4189.  
  4190.  
  4191. ;   3087  2    !
  4192. ;   3088  2    ! First determine if we have exceed the number of retries that are
  4193. ;   3089  2    ! allowed to attempt to send this message.
  4194. ;   3090  2    !
  4195. ;   3091  2    
  4196. ;   3092  2        IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  4197. ;   3093  2    
  4198. ;   3094  2    !
  4199. ;   3095  2    ! The number of retries are not exceeded.  Increment the number and then
  4200. ;   3096  2    ! attempt to send the packet again.
  4201. ;   3097  2    !
  4202. ;   3098  2        NUM%RETRIES = .NUM%RETRIES + 1;
  4203. ;   3099  2    !
  4204. ;   3100  2    ! Build the packet data field
  4205. ;   3101  2    !
  4206. ;   3102  2        POINTER = CH$PTR (DATA%TEXT);
  4207. ;   3103  2        DATA%SIZE = 0;
  4208. ;   3104  2    
  4209. ;   3105  2        IF .GEN%TYPE EQL MSG%GENERIC
  4210. ;   3106  2        THEN
  4211. ;   3107  3        BEGIN
  4212. ;   3108  3        CH$WCHAR%A (.GEN%SUBTYPE, POINTER);
  4213. ;   3109  3        DATA%SIZE = 1;
  4214. ;   3110  3    
  4215. ;   3111  3        IF .GEN%1SIZE GTR 0 OR .GEN%2SIZE GTR 0 OR .GEN%3SIZE GTR 0
  4216. ;   3112  3        THEN
  4217. ;   3113  4            BEGIN
  4218. ;   3114  4            DATA%SIZE = PACK%DATA (POINTER, .DATA%SIZE, GEN%1DATA, .GEN%1SIZE);
  4219. ;   3115  4    
  4220. ;   3116  4            IF .GEN%2SIZE GTR 0 OR .GEN%3SIZE GTR 0
  4221. ;   3117  4            THEN
  4222. ;   3118  5            BEGIN
  4223. ;   3119  5            DATA%SIZE = PACK%DATA (POINTER, .DATA%SIZE, GEN%2DATA, .GEN%2SIZE);
  4224. ;   3120  5    
  4225. ;   3121  5            IF .GEN%3SIZE GTR 0
  4226. ;   3122  5            THEN
  4227. ;   3123  6                BEGIN
  4228. ;   3124  6                DATA%SIZE = PACK%DATA (POINTER, .DATA%SIZE, GEN%3DATA, .GEN%3SIZE);
  4229. ;   3125  5                END;
  4230. ;   3126  5    
  4231. ;   3127  4            END;
  4232. ;   3128  4    
  4233. ;   3129  3            END;
  4234. ;   3130  3    
  4235. ;   3131  3        END
  4236. ;   3132  2        ELSE
  4237. ;   3133  3        BEGIN
  4238. ;   3134  3    
  4239. ;   3135  3        IF .GEN%1SIZE GTR MAX%MSG THEN GEN%1SIZE = MAX%MSG;
  4240. ;   3136  3    
  4241. ;   3137  3        DATA%SIZE = .GEN%1SIZE;
  4242. ;   3138  3        CH$MOVE (.GEN%1SIZE, CH$PTR (GEN%1DATA), .POINTER);
  4243. ;   3139  2        END;
  4244. ;   3140  2    
  4245. ;   3141  2        SET%STRING (CH$PTR (DATA%TEXT), .DATA%SIZE, TRUE);
  4246. ;   3142  2        BFR%FILL (TRUE);
  4247. ;   3143  2        SET%STRING (0, 0, FALSE);
  4248. ;   3144  2    !
  4249. ;   3145  2    ! Send the packet
  4250. ;   3146  2    !
  4251. ;   3147  2    
  4252. ;   3148  2        IF NOT SEND%PACKET (.GEN%TYPE, .SIZE, .MSG%NUMBER) THEN RETURN STATE%EX;
  4253. ;   3149  2    
  4254. ;   3150  2    !
  4255. ;   3151  2    ! Now get the responce from the remote KERMIT.
  4256. ;   3152  2    !
  4257. ;   3153  2        STATUS = REC%PACKET ();
  4258. ;   3154  2    
  4259. ;   3155  2        IF NOT .STATUS
  4260. ;   3156  2        THEN
  4261. ;   3157  3        BEGIN
  4262. ;   3158  3    
  4263. ;   3159  4        IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL
  4264. ;   3160  4     KER%CHKSUMERR)
  4265. ;   3161  3        THEN
  4266. ;   3162  3            RETURN .STATE
  4267. ;   3163  3        ELSE
  4268. ;   3164  3            RETURN STATE%EX;
  4269. ;   3165  3    
  4270. ;   3166  2        END;
  4271. ;   3167  2    
  4272. ;   3168  2    ! Did we get a send-init?
  4273. ;   3169  2    
  4274. ;   3170  2        SELECTONE .REC%TYPE OF
  4275. ;   3171  2        SET
  4276. ;   3172  2    
  4277. ;   3173  2        [MSG%SND%INIT] :
  4278. ;   3174  3            BEGIN
  4279. ;   3175  3            MSG%NUMBER = .REC%SEQ;        ! Initialize sequence numbers
  4280. ;   3176  3    ! Determine if the parameters are ok.  If not, give up
  4281. ;   3177  3    
  4282. ;   3178  3            IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN .STATUS;
  4283. ;   3179  3    
  4284. ;   3180  3            SET%SEND%INIT ();            ! Set up our acknowledgement to the send-init
  4285. ;   3181  3            SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .MSG%NUMBER);    ! [108] ! Send it
  4286. ;   3182  3            BLK%CHK%TYPE = .INI%CHK%TYPE;    ! Can now use agreed upon type
  4287. ;   3183  3            OLD%RETRIES = .NUM%RETRIES;
  4288. ;   3184  3            NUM%RETRIES = 0;
  4289. ;   3185  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  4290. ;   3186  3            RETURN STATE%RF;            ! Now expect file header
  4291. ;   3187  2            END;
  4292. ;   3188  2    
  4293. ;   3189  2        [MSG%TEXT] :
  4294. ;   3190  2    !
  4295. ;   3191  2    ! If we just got a text header, set up for typing on the terminal and
  4296. ;   3192  2    ! shift to receiving data
  4297. ;   3193  2    !
  4298. ;   3194  3            BEGIN
  4299. ;   3195  3            TEXT%HEAD%FLAG = TRUE;        ! We want terminal output
  4300. ;   3196  3            PUT%CHR%ROUTINE = TYPE%CHAR;    ! Set up the put a character routine
  4301. ;   3197  3    
  4302. ;   3198  3            IF .REC%LENGTH GTR 0
  4303. ;   3199  3            THEN
  4304. ;   3200  4            BEGIN
  4305. ;   3201  4            TT%TEXT (UPLIT (%ASCIZ'<<'));    ! Make sure file name sticks out
  4306. ;   3202  4            BFR%EMPTY ();            ! Dump the packet data to the terminal
  4307. ;   3203  4            TT%TEXT (UPLIT (%ASCIZ'>>'));    ! So user can tell where name ends
  4308. ;   3204  4            TT%CRLF ();            ! And a CRLF
  4309. ;   3205  3            END;
  4310. ;   3206  3    
  4311. ;   3207  3            SEND%PACKET (MSG%ACK, 0, .MSG%NUMBER);    ! Send an ACK
  4312. ;   3208  3            OLD%RETRIES = .NUM%RETRIES;
  4313. ;   3209  3            NUM%RETRIES = 0;
  4314. ;   3210  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  4315. ;   3211  3            RETURN STATE%RD;            ! We now want data
  4316. ;   3212  2            END;
  4317. ;   3213  2    
  4318. ;   3214  2        [MSG%ACK] :
  4319. ;   3215  2    !
  4320. ;   3216  2    ! If we get an ACK, just type the data on the terminal and complete the
  4321. ;   3217  2    ! transaction.
  4322. ;   3218  2    !
  4323. ;   3219  3            BEGIN
  4324. ;   3220  3            PUT%CHR%ROUTINE = TYPE%CHAR;    ! Dump to terminal
  4325. ;   3221  3            BFR%EMPTY ();            ! Do it
  4326. ;   3222  3    
  4327. ;   3223  3            IF .REC%LENGTH GTR 0 THEN TT%CRLF ();
  4328. ;   3224  3    
  4329. ;   3225  3            RETURN STATE%C;            ! And go idle
  4330. ;   3226  2            END;
  4331. ;   3227  2    
  4332. ;   3228  2        [MSG%NAK] :
  4333. ;   3229  2    !
  4334. ;   3230  2    ! If we get a NAK, stay in the same state.  We will re-transmit the
  4335. ;   3231  2    ! packet again.
  4336. ;   3232  2    !
  4337. ;   3233  2            RETURN .STATE;
  4338. ;   3234  2        TES;
  4339. ;   3235  2    
  4340. ;   3236  2    !
  4341. ;   3237  2    ! If we get here, we didn't get anything resembling an acceptable
  4342. ;   3238  2    ! packet, so we will abort.
  4343. ;   3239  2    !
  4344. ;   3240  2        KRM%ERROR (KER%PROTOERR);
  4345. ;   3241  2        RETURN STATE%A;
  4346. ;   3242  1        END;
  4347.  
  4348.  
  4349. P.AAF:    BYTE    (7)"<","<",000,000,000
  4350. P.AAG:    BYTE    (7)">",">",000,000,000
  4351.  
  4352.  
  4353. ; SEND%GENCMD
  4354. U.6:    ADJSP    SP,312                ;                                        3017
  4355.     MOVE    AC1,U.54            ;                                        3092
  4356.     CAMG    AC1,PKT%RETRIES
  4357.     JRST    L.138
  4358.     MOVEI    AC1,24
  4359.     JRST    L.155
  4360. L.138:    AOS    U.54                ;                                        3098
  4361.     MOVEI    AC1,-312(SP)            ;                                        3102
  4362.     HRLI    AC1,10700
  4363.     MOVEM    AC1,0(SP)
  4364.     SETZ    AC3,                ;                                        3103
  4365.     MOVEI    AC1,107                ;                                        3105
  4366.     CAME    AC1,U.65
  4367.     JRST    L.143
  4368.     MOVE    AC1,U.66            ;                                        3108
  4369.     IDPB    AC1,0(SP)
  4370.     MOVEI    AC3,1                ;                                        3109
  4371.     MOVE    AC1,GEN%1SIZE            ;                                        3111
  4372.     JUMPG    AC1,L.139
  4373.     SKIPLE    GEN%2SIZE
  4374.     JRST    L.139
  4375.     SKIPG    GEN%3SIZE
  4376.     JRST    L.145
  4377. L.139:    MOVEI    AC2,0(SP)            ;                                        3114
  4378.     PUSH    SP,AC2
  4379.     PUSH    SP,AC3
  4380.     PUSH    SP,C.38
  4381.     PUSH    SP,AC1
  4382.     PUSHJ    SP,U.77
  4383.     MOVE    AC3,AC1
  4384.     MOVE    AC1,GEN%2SIZE            ;                                        3116
  4385.     JUMPG    AC1,L.140
  4386.     SKIPG    GEN%3SIZE
  4387.     JRST    L.142
  4388. L.140:    MOVEI    AC2,-4(SP)            ;                                        3119
  4389.     PUSH    SP,AC2
  4390.     PUSH    SP,AC3
  4391.     PUSH    SP,C.39
  4392.     PUSH    SP,AC1
  4393.     PUSHJ    SP,U.77
  4394.     MOVE    AC3,AC1
  4395.     MOVE    AC1,GEN%3SIZE            ;                                        3121
  4396.     JUMPLE    AC1,L.141
  4397.     MOVEI    AC2,-10(SP)            ;                                        3124
  4398.     PUSH    SP,AC2
  4399.     PUSH    SP,AC3
  4400.     PUSH    SP,C.40
  4401.     PUSH    SP,AC1
  4402.     PUSHJ    SP,U.77
  4403.     MOVE    AC3,AC1
  4404.     ADJSP    SP,-4                ;                                        3123
  4405. L.141:    ADJSP    SP,-4                ;                                        3118
  4406. L.142:    ADJSP    SP,-4                ;                                        3113
  4407.     JRST    L.145                ;                                        3111
  4408. L.143:    MOVEI    AC1,1752            ;                                        3135
  4409.     CAML    AC1,GEN%1SIZE
  4410.     JRST    L.144
  4411.     MOVEI    AC1,1752
  4412.     MOVEM    AC1,GEN%1SIZE
  4413. L.144:    MOVE    AC3,GEN%1SIZE            ;                                        3137
  4414.     MOVE    AC1,GEN%1SIZE            ;                                        3138
  4415.     MOVE    AC2,C.11
  4416.     MOVE    AC4,GEN%1SIZE
  4417.     MOVE    AC5,0(SP)
  4418.     EXTEND    AC1,C.9
  4419.     JFCL    
  4420. L.145:    MOVEI    AC1,-312(SP)            ;                                        3141
  4421.     HRLI    AC1,10700
  4422.     PUSH    SP,AC1
  4423.     PUSH    SP,AC3
  4424.     PUSH    SP,C.2
  4425.     PUSHJ    SP,U.30
  4426.     PUSH    SP,C.2                ;                                        3142
  4427.     PUSHJ    SP,U.29
  4428.     SETZM    -2(SP)                ;                                        3143
  4429.     SETZM    -1(SP)
  4430.     SETZM    0(SP)
  4431.     PUSHJ    SP,U.30
  4432.     PUSH    SP,U.65                ;                                        3148
  4433.     PUSH    SP,U.52
  4434.     PUSH    SP,U.55
  4435.     PUSHJ    SP,U.24
  4436.     ADJSP    SP,-3
  4437.     TRNE    AC1,1
  4438.     JRST    L.146
  4439.     ADJSP    SP,-4
  4440.     MOVEI    AC1,23
  4441.     JRST    L.155
  4442. L.146:    PUSHJ    SP,U.26                ;                                        3153
  4443.     TRNE    AC1,1                ;                                        3155
  4444.     JRST    L.148
  4445.     CAIE    AC1,262                ;                                        3159
  4446.     CAIN    AC1,300
  4447.     JRST    L.147
  4448.     CAIN    AC1,172
  4449. L.147:    SKIPA    AC2,U.51            ;                                        3164
  4450.     MOVEI    AC2,23
  4451.     ADJSP    SP,-4                ;                                        3159
  4452.     MOVE    AC1,AC2                ;                                        3157
  4453.     JRST    L.155
  4454. L.148:    MOVE    AC2,U.58            ;                                        3170
  4455.     CAIE    AC2,123                ;                                        3173
  4456.     JRST    L.150
  4457.     MOVE    AC3,U.56            ;                                        3175
  4458.     MOVEM    AC3,U.55
  4459.     PUSHJ    SP,U.21                ;                                        3178
  4460.     TRNE    AC1,1
  4461.     JRST    L.149
  4462.     ADJSP    SP,-4
  4463.     JRST    L.155
  4464. L.149:    PUSHJ    SP,U.20                ;                                        3180
  4465.     PUSH    SP,C.20                ;                                        3181
  4466.     PUSH    SP,U.46
  4467.     PUSH    SP,U.55
  4468.     PUSHJ    SP,U.24
  4469.     MOVE    AC1,U.47            ;                                        3182
  4470.     MOVEM    AC1,U.48
  4471.     MOVE    AC1,U.54            ;                                        3183
  4472.     MOVEM    AC1,U.53
  4473.     SETZM    U.54                ;                                        3184
  4474.     MOVE    AC1,U.55            ;                                        3185
  4475.     ADDI    AC1,1
  4476.     LDB    AC2,C.18
  4477.     MOVEM    AC2,U.55
  4478.     ADJSP    SP,-7                ;                                        3186
  4479.     MOVEI    AC1,7                ;                                        3174
  4480.     JRST    L.155
  4481. L.150:    CAIE    AC2,130                ;                                        3189
  4482.     JRST    L.152
  4483.     MOVEI    AC1,1                ;                                        3195
  4484.     MOVEM    AC1,U.62
  4485.     MOVEI    AC1,U.31            ;                                        3196
  4486.     MOVEM    AC1,U.68
  4487.     SKIPG    U.57                ;                                        3198
  4488.     JRST    L.151
  4489.     PUSH    SP,C.41                ;                                        3201
  4490.     PUSHJ    SP,TT%TEXT
  4491.     PUSHJ    SP,U.28                ;                                        3202
  4492.     PUSH    SP,C.42                ;                                        3203
  4493.     PUSHJ    SP,TT%TEXT
  4494.     PUSHJ    SP,TT%CRLF            ;                                        3204
  4495.     ADJSP    SP,-2                ;                                        3200
  4496. L.151:    PUSH    SP,C.20                ;                                        3207
  4497.     PUSH    SP,C.25
  4498.     PUSH    SP,U.55
  4499.     PUSHJ    SP,U.24
  4500.     MOVE    AC1,U.54            ;                                        3208
  4501.     MOVEM    AC1,U.53
  4502.     SETZM    U.54                ;                                        3209
  4503.     MOVE    AC1,U.55            ;                                        3210
  4504.     ADDI    AC1,1
  4505.     LDB    AC2,C.18
  4506.     MOVEM    AC2,U.55
  4507.     ADJSP    SP,-7                ;                                        3211
  4508.     MOVEI    AC1,10                ;                                        3194
  4509.     JRST    L.155
  4510. L.152:    CAIE    AC2,131                ;                                        3214
  4511.     JRST    L.153
  4512.     MOVEI    AC1,U.31            ;                                        3220
  4513.     MOVEM    AC1,U.68
  4514.     PUSHJ    SP,U.28                ;                                        3221
  4515.     SKIPLE    U.57                ;                                        3223
  4516.     PUSHJ    SP,TT%CRLF
  4517.     ADJSP    SP,-4                ;                                        3225
  4518.     MOVEI    AC1,11                ;                                        3219
  4519.     JRST    L.155
  4520. L.153:    CAIE    AC2,116                ;                                        3228
  4521.     JRST    L.154
  4522.     ADJSP    SP,-4                ;                                        3233
  4523.     MOVE    AC1,U.51
  4524.     JRST    L.155
  4525. L.154:    PUSH    SP,C.21                ;                                        3240
  4526.     PUSHJ    SP,KRM%ERROR
  4527.     ADJSP    SP,-5                ;                                        3241
  4528.     MOVEI    AC1,12                ;                                        3066
  4529. L.155:    ADJSP    SP,-312                ;                                        3017
  4530.     POPJ    SP,
  4531. C.38:    XWD    0,GEN%1DATA
  4532. C.39:    XWD    0,GEN%2DATA
  4533. C.40:    XWD    0,GEN%3DATA
  4534. C.41:    XWD    0,P.AAF
  4535. C.42:    XWD    0,P.AAG
  4536.  
  4537. ; Routine Size:  182 words
  4538.  
  4539.  
  4540. ;   3243  1    %SBTTL 'SEND%BREAK'
  4541. ;   3244  1    ROUTINE SEND%BREAK =
  4542. ;   3245  1    
  4543. ;   3246  1    !++
  4544. ;   3247  1    ! FUNCTIONAL DESCRIPTION:
  4545. ;   3248  1    !
  4546. ;   3249  1    !    This routine will send the break (end of transmission) message
  4547. ;   3250  1    !    to the remote KERMIT.  On an ACK the state becomes STATE%C.
  4548. ;   3251  1    !
  4549. ;   3252  1    ! CALLING SEQUENCE:
  4550. ;   3253  1    !
  4551. ;   3254  1    !    STATE = SEND%BREAK();
  4552. ;   3255  1    !
  4553. ;   3256  1    ! INPUT PARAMETERS:
  4554. ;   3257  1    !
  4555. ;   3258  1    !    None.
  4556. ;   3259  1    !
  4557. ;   3260  1    ! IMPLICIT INPUTS:
  4558. ;   3261  1    !
  4559. ;   3262  1    !    None.
  4560. ;   3263  1    !
  4561. ;   3264  1    ! OUTPUT PARAMETERS:
  4562. ;   3265  1    !
  4563. ;   3266  1    !    New state for the finite state machine.
  4564. ;   3267  1    !
  4565. ;   3268  1    ! IMPLICIT OUTPUTS:
  4566. ;   3269  1    !
  4567. ;   3270  1    !    None.
  4568. ;   3271  1    !
  4569. ;   3272  1    ! COMPLETION CODES:
  4570. ;   3273  1    !
  4571. ;   3274  1    !    None.
  4572. ;   3275  1    !
  4573. ;   3276  1    ! SIDE EFFECTS:
  4574. ;   3277  1    !
  4575. ;   3278  1    !    None.
  4576. ;   3279  1    !
  4577. ;   3280  1    !--
  4578. ;   3281  1    
  4579. ;   3282  2        BEGIN
  4580. ;   3283  2    
  4581. ;   3284  2        LOCAL
  4582. ;   3285  2        STATUS;                    ! Status returned by various routines
  4583. ;   3286  2    
  4584. ;   3287  2    !
  4585. ;   3288  2    ! First determine if we have exceed the number of retries that are
  4586. ;   3289  2    ! allowed to attempt to send this message.
  4587. ;   3290  2    !
  4588. ;   3291  2    
  4589. ;   3292  2        IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  4590. ;   3293  2    
  4591. ;   3294  2    !
  4592. ;   3295  2    ! The number of retries are not exceeded.  Increment the number and then
  4593. ;   3296  2    ! attempt to send the packet again.
  4594. ;   3297  2    !
  4595. ;   3298  2        NUM%RETRIES = .NUM%RETRIES + 1;
  4596. ;   3299  2    
  4597. ;   3300  2        IF NOT SEND%PACKET (MSG%BREAK, 0, .MSG%NUMBER) THEN RETURN STATE%EX;
  4598. ;   3301  2    
  4599. ;   3302  2    !
  4600. ;   3303  2    ! Now get the responce from the remote KERMIT.
  4601. ;   3304  2    !
  4602. ;   3305  2        STATUS = REC%PACKET ();
  4603. ;   3306  2    
  4604. ;   3307  2        IF NOT .STATUS
  4605. ;   3308  2        THEN
  4606. ;   3309  3        BEGIN
  4607. ;   3310  3    
  4608. ;   3311  4        IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL
  4609. ;   3312  4     KER%CHKSUMERR)
  4610. ;   3313  3        THEN
  4611. ;   3314  3            RETURN .STATE
  4612. ;   3315  3        ELSE
  4613. ;   3316  3            RETURN STATE%EX;
  4614. ;   3317  3    
  4615. ;   3318  2        END;
  4616. ;   3319  2    
  4617. ;   3320  2    !
  4618. ;   3321  2    ! Determine if the packet is good.
  4619. ;   3322  2    !
  4620. ;   3323  2    
  4621. ;   3324  3        IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK)
  4622. ;   3325  2        THEN
  4623. ;   3326  3        BEGIN
  4624. ;   3327  3        KRM%ERROR (KER%PROTOERR);
  4625. ;   3328  3        RETURN STATE%A;
  4626. ;   3329  2        END;
  4627. ;   3330  2    
  4628. ;   3331  2    !
  4629. ;   3332  2    ! If this is a NAK and the message number is not the one we just send
  4630. ;   3333  2    ! treat this like an ACK, otherwise resend the last packet.
  4631. ;   3334  2    !
  4632. ;   3335  2    
  4633. ;   3336  2        IF .REC%TYPE EQL MSG%NAK AND .REC%SEQ NEQ 0 THEN RETURN .STATE;
  4634. ;   3337  2    
  4635. ;   3338  2        IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE;
  4636. ;   3339  2    
  4637. ;   3340  2    !
  4638. ;   3341  2    ! Here to determine if there is another file to send.
  4639. ;   3342  2    !
  4640. ;   3343  2        NUM%RETRIES = 0;
  4641. ;   3344  2        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  4642. ;   3345  2        RETURN STATE%C;
  4643. ;   3346  1        END;
  4644.  
  4645.  
  4646. ; SEND%BREAK
  4647. U.9:    MOVE    AC1,U.54            ;                                        3292
  4648.     CAMG    AC1,PKT%RETRIES
  4649.     JRST    L.156
  4650.     MOVEI    AC1,24
  4651.     POPJ    SP,
  4652. L.156:    AOS    U.54                ;                                        3298
  4653.     PUSH    SP,C.43                ;                                        3300
  4654.     PUSH    SP,C.25
  4655.     PUSH    SP,U.55
  4656.     PUSHJ    SP,U.24
  4657.     ADJSP    SP,-3
  4658.     TRNN    AC1,1
  4659.     JRST    L.157
  4660.     PUSHJ    SP,U.26                ;                                        3305
  4661.     TRNE    AC1,1                ;                                        3307
  4662.     JRST    L.158
  4663.     CAIE    AC1,262                ;                                        3311
  4664.     CAIN    AC1,300
  4665.     JRST    L.161
  4666.     CAIN    AC1,172
  4667.     JRST    L.161                ;                                        3314
  4668. L.157:    MOVEI    AC1,23                ;                                        3316
  4669.     POPJ    SP,                ;                                        3309
  4670. L.158:    MOVE    AC1,U.58            ;                                        3324
  4671.     CAIE    AC1,131
  4672.     CAIN    AC1,116
  4673.     JRST    L.159
  4674.     PUSH    SP,C.21                ;                                        3327
  4675.     PUSHJ    SP,KRM%ERROR
  4676.     ADJSP    SP,-1                ;                                        3328
  4677.     MOVEI    AC1,12                ;                                        3326
  4678.     POPJ    SP,
  4679. L.159:    MOVE    AC1,U.58            ;                                        3336
  4680.     CAIN    AC1,116
  4681.     SKIPN    U.56
  4682.     JRST    L.160
  4683.     JRST    L.161
  4684. L.160:    CAIE    AC1,131                ;                                        3338
  4685.     JRST    L.162
  4686.     MOVE    AC1,U.56
  4687.     CAMN    AC1,U.55
  4688.     JRST    L.162
  4689. L.161:    MOVE    AC1,U.51
  4690.     POPJ    SP,
  4691. L.162:    SETZM    U.54                ;                                        3343
  4692.     MOVE    AC1,U.55            ;                                        3344
  4693.     ADDI    AC1,1
  4694.     LDB    AC2,C.18
  4695.     MOVEM    AC2,U.55
  4696.     MOVEI    AC1,11                ;                                        3282
  4697.     POPJ    SP,                ;                                        3244
  4698. C.43:    EXP    102
  4699.  
  4700. ; Routine Size:  52 words
  4701.  
  4702.  
  4703. ;   3347  1    %SBTTL 'REC%INIT'
  4704. ;   3348  1    ROUTINE REC%INIT =
  4705. ;   3349  1    
  4706. ;   3350  1    !++
  4707. ;   3351  1    ! FUNCTIONAL DESCRIPTION:
  4708. ;   3352  1    !
  4709. ;   3353  1    !    This routine will process an initialization message received from
  4710. ;   3354  1    !    the remote KERMIT.
  4711. ;   3355  1    !
  4712. ;   3356  1    ! CALLING SEQUENCE:
  4713. ;   3357  1    !
  4714. ;   3358  1    !    STATE = REC%INIT();
  4715. ;   3359  1    !
  4716. ;   3360  1    ! INPUT PARAMETERS:
  4717. ;   3361  1    !
  4718. ;   3362  1    !    None.
  4719. ;   3363  1    !
  4720. ;   3364  1    ! IMPLICIT INPUTS:
  4721. ;   3365  1    !
  4722. ;   3366  1    !    None.
  4723. ;   3367  1    !
  4724. ;   3368  1    ! OUTPUT PARAMETERS:
  4725. ;   3369  1    !
  4726. ;   3370  1    !    New machine state.
  4727. ;   3371  1    !
  4728. ;   3372  1    ! IMPLICIT OUTPUTS:
  4729. ;   3373  1    !
  4730. ;   3374  1    !    None.
  4731. ;   3375  1    !
  4732. ;   3376  1    ! COMPLETION CODES:
  4733. ;   3377  1    !
  4734. ;   3378  1    !    None.
  4735. ;   3379  1    !
  4736. ;   3380  1    ! SIDE EFFECTS:
  4737. ;   3381  1    !
  4738. ;   3382  1    !    None.
  4739. ;   3383  1    !
  4740. ;   3384  1    !--
  4741. ;   3385  1    
  4742. ;   3386  2        BEGIN
  4743. ;   3387  2    
  4744. ;   3388  2        LOCAL
  4745. ;   3389  2        STATUS;                    ! Status returned by various routines
  4746. ;   3390  2    
  4747. ;   3391  2        ROUTINE CHECK%INIT =
  4748. ;   3392  3        BEGIN
  4749. ;   3393  3    
  4750. ;   3394  3        IF .REC%TYPE EQL MSG%SND%INIT THEN RETURN TRUE ELSE RETURN FALSE;
  4751. ;   3395  3    
  4752. ;   3396  2        END;
  4753.  
  4754.  
  4755. ; CHECK%INIT
  4756. U.78:    MOVEI    AC1,123                ;                                        3394
  4757.     CAME    AC1,U.58
  4758.     JRST    L.163
  4759.     MOVEI    AC1,1
  4760.     POPJ    SP,
  4761. L.163:    SETZ    AC1,
  4762.     POPJ    SP,                ;                                        3391
  4763.  
  4764. ; Routine Size:  7 words
  4765.  
  4766.  
  4767. ;   3397  2    
  4768. ;   3398  3        IF NOT (STATUS = REC%MESSAGE (CHECK%INIT))
  4769. ;   3399  2        THEN
  4770. ;   3400  2    
  4771. ;   3401  2        IF .STATUS NEQ KER%ABORTED THEN RETURN STATE%A ELSE RETURN STATE%EX;
  4772. ;   3402  2    
  4773. ;   3403  2        MSG%NUMBER = .REC%SEQ;
  4774. ;   3404  2    
  4775. ;   3405  2        IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN STATE%A;
  4776. ;   3406  2    
  4777. ;   3407  2        SET%SEND%INIT ();
  4778. ;   3408  2        SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .MSG%NUMBER);    ! [108]
  4779. ;   3409  2        BLK%CHK%TYPE = .INI%CHK%TYPE;        ! Can now use agreed upon type
  4780. ;   3410  2        OLD%RETRIES = .NUM%RETRIES;
  4781. ;   3411  2        NUM%RETRIES = 0;
  4782. ;   3412  2        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  4783. ;   3413  2        RETURN STATE%RF;
  4784. ;   3414  1        END;                    ! End of REC%INIT
  4785.  
  4786.  
  4787. ; REC%INIT
  4788. U.11:    PUSH    SP,C.44                ;                                        3398
  4789.     PUSHJ    SP,U.25
  4790.     ADJSP    SP,-1
  4791.     TRNE    AC1,1
  4792.     JRST    L.166
  4793.     CAIN    AC1,312                ;                                        3401
  4794.     JRST    L.164
  4795.     MOVEI    AC2,12
  4796.     JRST    L.165
  4797. L.164:    MOVEI    AC2,23
  4798. L.165:    MOVE    AC1,AC2
  4799.     POPJ    SP,
  4800. L.166:    MOVE    AC2,U.56            ;                                        3403
  4801.     MOVEM    AC2,U.55
  4802.     PUSHJ    SP,U.21                ;                                        3405
  4803.     TRNE    AC1,1
  4804.     JRST    L.167
  4805.     MOVEI    AC1,12
  4806.     POPJ    SP,
  4807. L.167:    PUSHJ    SP,U.20                ;                                        3407
  4808.     PUSH    SP,C.20                ;                                        3408
  4809.     PUSH    SP,U.46
  4810.     PUSH    SP,U.55
  4811.     PUSHJ    SP,U.24
  4812.     MOVE    AC1,U.47            ;                                        3409
  4813.     MOVEM    AC1,U.48
  4814.     MOVE    AC1,U.54            ;                                        3410
  4815.     MOVEM    AC1,U.53
  4816.     SETZM    U.54                ;                                        3411
  4817.     MOVE    AC1,U.55            ;                                        3412
  4818.     ADDI    AC1,1
  4819.     LDB    AC2,C.18
  4820.     MOVEM    AC2,U.55
  4821.     ADJSP    SP,-3                ;                                        3413
  4822.     MOVEI    AC1,7                ;                                        3386
  4823.     POPJ    SP,                ;                                        3348
  4824. C.44:    XWD    0,U.78
  4825.  
  4826. ; Routine Size:  37 words
  4827.  
  4828.  
  4829. ;   3415  1    %SBTTL 'REC%FILE'
  4830. ;   3416  1    ROUTINE REC%FILE =
  4831. ;   3417  1    
  4832. ;   3418  1    !++
  4833. ;   3419  1    ! FUNCTIONAL DESCRIPTION:
  4834. ;   3420  1    !
  4835. ;   3421  1    !    This routine expects to receive an MSG%FILE packet from the remote
  4836. ;   3422  1    !    KERMIT.  If the message is correct this routine will change the state
  4837. ;   3423  1    !    to STATE%RD.
  4838. ;   3424  1    !
  4839. ;   3425  1    !    This routine also expects MSG%SND%INIT, MSG%EOF, or MSG%BREAK.
  4840. ;   3426  1    !
  4841. ;   3427  1    ! CALLING SEQUENCE:
  4842. ;   3428  1    !
  4843. ;   3429  1    !    STATE = REC%FILE();
  4844. ;   3430  1    !
  4845. ;   3431  1    ! INPUT PARAMETERS:
  4846. ;   3432  1    !
  4847. ;   3433  1    !    None.
  4848. ;   3434  1    !
  4849. ;   3435  1    ! IMPLICIT INPUTS:
  4850. ;   3436  1    !
  4851. ;   3437  1    !    None.
  4852. ;   3438  1    !
  4853. ;   3439  1    ! OUTPUT PARAMETERS:
  4854. ;   3440  1    !
  4855. ;   3441  1    !    New state.
  4856. ;   3442  1    !
  4857. ;   3443  1    ! IMPLICIT OUTPUTS:
  4858. ;   3444  1    !
  4859. ;   3445  1    !    None.
  4860. ;   3446  1    !
  4861. ;   3447  1    ! COMPLETION CODES:
  4862. ;   3448  1    !
  4863. ;   3449  1    !    None.
  4864. ;   3450  1    !
  4865. ;   3451  1    ! SIDE EFFECTS:
  4866. ;   3452  1    !
  4867. ;   3453  1    !    None.
  4868. ;   3454  1    !
  4869. ;   3455  1    !--
  4870. ;   3456  1    
  4871. ;   3457  2        BEGIN
  4872. ;   3458  2    
  4873. ;   3459  2        LOCAL
  4874. ;   3460  2        STATUS;
  4875. ;   3461  2    
  4876. ;   3462  2        ROUTINE CHECK%FILE =
  4877. ;   3463  3        BEGIN
  4878. ;   3464  3    
  4879. ;   3465  4        IF (.REC%TYPE EQL MSG%SND%INIT) OR (.REC%TYPE EQL MSG%EOF) OR (.REC%TYPE EQL
  4880. ;   3466  4     MSG%FILE) OR (
  4881. ;   3467  4            .REC%TYPE EQL MSG%BREAK) OR (.REC%TYPE EQL MSG%TEXT)
  4882. ;   3468  3        THEN
  4883. ;   3469  3            RETURN TRUE
  4884. ;   3470  3        ELSE
  4885. ;   3471  3            RETURN FALSE;
  4886. ;   3472  3    
  4887. ;   3473  2        END;
  4888.  
  4889.  
  4890. ; CHECK%FILE
  4891. U.79:    MOVE    AC1,U.58            ;                                        3465
  4892.     CAIE    AC1,123
  4893.     CAIN    AC1,132
  4894.     JRST    L.168
  4895.     CAIE    AC1,106
  4896.     CAIN    AC1,102                ;                                        3466
  4897.     JRST    L.168
  4898.     CAIE    AC1,130                ;                                        3467
  4899.     JRST    L.169
  4900. L.168:    MOVEI    AC1,1                ;                                        3471
  4901.     POPJ    SP,
  4902. L.169:    SETZ    AC1,
  4903.     POPJ    SP,                ;                                        3462
  4904.  
  4905. ; Routine Size:  13 words
  4906.  
  4907.  
  4908. ;   3474  2    !
  4909. ;   3475  2    ! Initialize the abort flags
  4910. ;   3476  2    !
  4911. ;   3477  2        ABT%CUR%FILE = FALSE;
  4912. ;   3478  2        ABT%ALL%FILE = FALSE;
  4913. ;   3479  2    !
  4914. ;   3480  2    ! Get a message
  4915. ;   3481  2    !
  4916. ;   3482  2    
  4917. ;   3483  3        IF NOT (STATUS = REC%MESSAGE (CHECK%FILE))
  4918. ;   3484  2        THEN
  4919. ;   3485  2    
  4920. ;   3486  2        IF .STATUS NEQ KER%ABORTED THEN RETURN STATE%A ELSE RETURN STATE%EX;
  4921. ;   3487  2    
  4922. ;   3488  2        SELECTONE .REC%TYPE OF
  4923. ;   3489  2        SET
  4924. ;   3490  2    
  4925. ;   3491  2        [MSG%SND%INIT] :
  4926. ;   3492  3            BEGIN
  4927. ;   3493  3    
  4928. ;   3494  3            IF .OLD%RETRIES GTR .SI%RETRIES THEN RETURN STATE%ER;
  4929. ;   3495  3    
  4930. ;   3496  3            OLD%RETRIES = .OLD%RETRIES + 1;
  4931. ;   3497  3    
  4932. ;   3498  3            IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ
  4933. ;   3499  3            THEN
  4934. ;   3500  4            BEGIN
  4935. ;   3501  4            SET%SEND%INIT ();
  4936. ;   3502  4            BLK%CHK%TYPE = CHK%1CHAR;    ! Must use 1 character CHKSUM
  4937. ;   3503  4            SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .REC%SEQ); ! [108]
  4938. ;   3504  4            BLK%CHK%TYPE = .INI%CHK%TYPE;    ! Back to agreed upon type
  4939. ;   3505  4            NUM%RETRIES = 0;
  4940. ;   3506  4            RETURN .STATE;
  4941. ;   3507  4            END
  4942. ;   3508  3            ELSE
  4943. ;   3509  4            BEGIN
  4944. ;   3510  4            KRM%ERROR (KER%PROTOERR);
  4945. ;   3511  4            RETURN STATE%A;
  4946. ;   3512  3            END;
  4947. ;   3513  3    
  4948. ;   3514  2            END;
  4949. ;   3515  2    
  4950. ;   3516  2        [MSG%EOF] :
  4951. ;   3517  3            BEGIN
  4952. ;   3518  3    
  4953. ;   3519  3            IF .OLD%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  4954. ;   3520  3    
  4955. ;   3521  3            OLD%RETRIES = .OLD%RETRIES + 1;
  4956. ;   3522  3    
  4957. ;   3523  3            IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ
  4958. ;   3524  3            THEN
  4959. ;   3525  4            BEGIN
  4960. ;   3526  4            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  4961. ;   3527  4            NUM%RETRIES = 0;
  4962. ;   3528  4            RETURN .STATE;
  4963. ;   3529  4            END
  4964. ;   3530  3            ELSE
  4965. ;   3531  4            BEGIN
  4966. ;   3532  4            KRM%ERROR (KER%PROTOERR);
  4967. ;   3533  4            RETURN STATE%A;
  4968. ;   3534  3            END;
  4969. ;   3535  3    
  4970. ;   3536  2            END;
  4971. ;   3537  2    
  4972. ;   3538  2        [MSG%FILE] :
  4973. ;   3539  3            BEGIN
  4974. ;   3540  3    
  4975. ;   3541  3            IF .MSG%NUMBER NEQ .REC%SEQ THEN RETURN STATE%ER;
  4976. ;   3542  3    
  4977. ;   3543  3            IF .REC%LENGTH EQL 0
  4978. ;   3544  3            THEN
  4979. ;   3545  4            BEGIN
  4980. ;   3546  4            KRM%ERROR (KER%PROTOERR);
  4981. ;   3547  4            RETURN STATE%A;
  4982. ;   3548  3            END;
  4983. ;   3549  3    
  4984. ;   3550  3    ![025]
  4985. ;   3551  3    ![025] Get file name from packet with all quoting undone
  4986. ;   3552  3    ![025]
  4987. ;   3553  3            SET%STRING (CH$PTR (FILE%NAME), MAX%FILE%NAME, TRUE);
  4988. ;   3554  3            BFR%EMPTY ();
  4989. ;   3555  3            FILE%SIZE = SET%STRING (0, 0, FALSE);
  4990. ;   3556  3            CH$WCHAR (CHR%NUL, CH$PTR (FILE%NAME, .FILE%SIZE));
  4991. ;   3557  3    ![025]        FILE%SIZE = .REC%LENGTH;
  4992. ;   3558  3    ![025]        CH$COPY (.REC%LENGTH, CH$PTR (REC%MSG, PKT%MSG, CHR%SIZE), CHR%NUL, MAX%FILE%NAME,
  4993. ;   3559  3    ![025]        CH$PTR (FILE%NAME));
  4994. ;   3560  3    
  4995. ;   3561  3            IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  4996. ;   3562  3            THEN
  4997. ;   3563  4            BEGIN
  4998. ;   3564  4            TT%TEXT (UPLIT (%ASCIZ'Receiving: '));
  4999. ;   3565  4            TT%TEXT (FILE%NAME);
  5000. ;   3566  4            TT%OUTPUT ();
  5001. ;   3567  3            END;
  5002. ;   3568  3    
  5003. ;   3569  3    ![023]
  5004. ;   3570  3    ![023] Force file name into normal form if desired
  5005. ;   3571  3    ![023]
  5006. ;   3572  3    
  5007. ;   3573  3            IF .FIL%NORMAL%FORM THEN NORMALIZE%FILE (FILE%NAME, FILE%SIZE, 9, 3);
  5008. ;   3574  3    
  5009. ;   3575  3            FILE%CHARS = 0;            ! No characters received yet
  5010. ;   3576  3    
  5011. ;   3577  3            IF NOT FILE%OPEN (FNC%WRITE) THEN RETURN STATE%A;
  5012. ;   3578  3    
  5013. ;   3579  3            XFR%STATUS (%C'F', %C'R');        ! Tell display routine
  5014. ;   3580  3            TEXT%HEAD%FLAG = FALSE;        ! Got an F, not an X
  5015. ;   3581  3            FLAG%FILE%OPEN = TRUE;
  5016. ;   3582  3            SEND%PACKET (MSG%ACK, 0, .MSG%NUMBER);
  5017. ;   3583  3            OLD%RETRIES = .NUM%RETRIES;
  5018. ;   3584  3            NUM%RETRIES = 0;
  5019. ;   3585  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  5020. ;   3586  3            RETURN STATE%RD;
  5021. ;   3587  2            END;
  5022. ;   3588  2    
  5023. ;   3589  2        [MSG%TEXT] :
  5024. ;   3590  2    !
  5025. ;   3591  2    ! If we get a text header, we will want to type the data on
  5026. ;   3592  2    ! the terminal.  Set up the put a character routine correctly.
  5027. ;   3593  2    !
  5028. ;   3594  3            BEGIN
  5029. ;   3595  3    
  5030. ;   3596  3            IF .MSG%NUMBER NEQ .REC%SEQ
  5031. ;   3597  3            THEN
  5032. ;   3598  4            BEGIN
  5033. ;   3599  4            KRM%ERROR (KER%PROTOERR);
  5034. ;   3600  4            RETURN STATE%A;
  5035. ;   3601  3            END;
  5036. ;   3602  3    
  5037. ;   3603  3            TEXT%HEAD%FLAG = TRUE;        ! Got an X, not an F
  5038. ;   3604  3            PUT%CHR%ROUTINE = TYPE%CHAR;    ! Empty buffer on terminal
  5039. ;   3605  3    
  5040. ;   3606  3            IF .REC%LENGTH GTR 0
  5041. ;   3607  3            THEN
  5042. ;   3608  4            BEGIN
  5043. ;   3609  4            TT%TEXT (UPLIT (%ASCIZ'<<'));    ! Make file name stick out
  5044. ;   3610  4            BFR%EMPTY ();            ! Do the header data
  5045. ;   3611  4            TT%TEXT (UPLIT (%ASCIZ'>>'));
  5046. ;   3612  4            TT%CRLF ();            ! And a crlf
  5047. ;   3613  3            END;
  5048. ;   3614  3    
  5049. ;   3615  3            SEND%PACKET (MSG%ACK, 0, .MSG%NUMBER);
  5050. ;   3616  3            OLD%RETRIES = .NUM%RETRIES;
  5051. ;   3617  3            NUM%RETRIES = 0;
  5052. ;   3618  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  5053. ;   3619  3            RETURN STATE%RD;
  5054. ;   3620  2            END;
  5055. ;   3621  2    
  5056. ;   3622  2        [MSG%BREAK] :
  5057. ;   3623  3            BEGIN
  5058. ;   3624  3    
  5059. ;   3625  3            IF .MSG%NUMBER NEQ .REC%SEQ
  5060. ;   3626  3            THEN
  5061. ;   3627  4            BEGIN
  5062. ;   3628  4            KRM%ERROR (KER%PROTOERR);
  5063. ;   3629  4            RETURN STATE%A;
  5064. ;   3630  3            END;
  5065. ;   3631  3    
  5066. ;   3632  3            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5067. ;   3633  3            RETURN STATE%C;
  5068. ;   3634  2            END;
  5069. ;   3635  2    
  5070. ;   3636  2        [OTHERWISE] :
  5071. ;   3637  3            BEGIN
  5072. ;   3638  3            KRM%ERROR (KER%PROTOERR);
  5073. ;   3639  3            RETURN STATE%A;
  5074. ;   3640  2            END;
  5075. ;   3641  2        TES;
  5076. ;   3642  2    
  5077. ;   3643  1        END;                    ! End of REC%FILE
  5078.  
  5079.  
  5080. P.AAH:    BYTE    (7)"R","e","c","e","i"
  5081.     BYTE    (7)"v","i","n","g",":"
  5082.     BYTE    (7)" ",000,000,000,000
  5083. P.AAI:    BYTE    (7)"<","<",000,000,000
  5084. P.AAJ:    BYTE    (7)">",">",000,000,000
  5085.  
  5086.  
  5087. ; REC%FILE
  5088. U.12:    SETZM    ABT%CUR%FILE            ;                                        3477
  5089.     SETZM    ABT%ALL%FILE            ;                                        3478
  5090.     PUSH    SP,C.45                ;                                        3483
  5091.     PUSHJ    SP,U.25
  5092.     ADJSP    SP,-1
  5093.     TRNE    AC1,1
  5094.     JRST    L.170
  5095.     CAIE    AC1,312                ;                                        3486
  5096.     JRST    L.184
  5097.     MOVEI    AC1,23
  5098.     POPJ    SP,
  5099. L.170:    MOVE    AC1,U.58            ;                                        3488
  5100.     CAIE    AC1,123                ;                                        3491
  5101.     JRST    L.171
  5102.     MOVE    AC2,U.53            ;                                        3494
  5103.     CAMLE    AC2,SI%RETRIES
  5104.     JRST    L.174
  5105.     AOS    U.53                ;                                        3496
  5106.     MOVE    AC1,U.55            ;                                        3498
  5107.     SUBI    AC1,1
  5108.     LDB    AC2,C.18
  5109.     CAME    AC2,U.56
  5110.     JRST    L.186
  5111.     PUSHJ    SP,U.20                ;                                        3501
  5112.     MOVEI    AC1,61                ;                                        3502
  5113.     MOVEM    AC1,U.48
  5114.     PUSH    SP,C.20                ;                                        3503
  5115.     PUSH    SP,U.46
  5116.     PUSH    SP,U.56
  5117.     PUSHJ    SP,U.24
  5118.     MOVE    AC1,U.47            ;                                        3504
  5119.     MOVEM    AC1,U.48
  5120.     JRST    L.172
  5121. L.171:    CAIE    AC1,132                ;                                        3516
  5122.     JRST    L.173
  5123.     MOVE    AC2,U.53            ;                                        3519
  5124.     CAMLE    AC2,PKT%RETRIES
  5125.     JRST    L.174
  5126.     AOS    U.53                ;                                        3521
  5127.     MOVE    AC1,U.55            ;                                        3523
  5128.     SUBI    AC1,1
  5129.     LDB    AC2,C.18
  5130.     CAME    AC2,U.56
  5131.     JRST    L.186
  5132.     PUSH    SP,C.20                ;                                        3526
  5133.     PUSH    SP,C.25
  5134.     PUSH    SP,U.56
  5135.     PUSHJ    SP,U.24
  5136. L.172:    SETZM    U.54                ;                                        3527
  5137.     ADJSP    SP,-2                ;                                        3525
  5138.     MOVE    AC1,U.51            ;                                        3531
  5139.     JRST    L.187
  5140. L.173:    CAIE    AC1,106                ;                                        3538
  5141.     JRST    L.179
  5142.     MOVE    AC2,U.55            ;                                        3541
  5143.     CAMN    AC2,U.56
  5144.     JRST    L.175
  5145. L.174:    MOVEI    AC1,24
  5146.     POPJ    SP,
  5147. L.175:    SKIPN    U.57                ;                                        3543
  5148.     JRST    L.183
  5149.     PUSH    SP,C.10                ;                                        3553
  5150.     PUSH    SP,C.22
  5151.     PUSH    SP,C.2
  5152.     PUSHJ    SP,U.30
  5153.     PUSHJ    SP,U.28                ;                                        3554
  5154.     SETZM    -2(SP)                ;                                        3555
  5155.     SETZM    -1(SP)
  5156.     SETZM    0(SP)
  5157.     PUSHJ    SP,U.30
  5158.     MOVEM    AC1,FILE%SIZE
  5159.     SETZ    AC2,                ;                                        3556
  5160.     MOVE    AC3,C.19
  5161.     MOVE    AC1,FILE%SIZE
  5162.     ADJBP    AC1,AC3
  5163.     IDPB    AC2,AC1
  5164.     MOVEI    AC1,1                ;                                        3561
  5165.     TDNE    AC1,CONNECT%FLAG
  5166.     JRST    L.176
  5167.     MOVEI    AC1,1
  5168.     TDNN    AC1,TY%FIL
  5169.     JRST    L.176
  5170.     PUSH    SP,C.46                ;                                        3564
  5171.     PUSHJ    SP,TT%TEXT
  5172.     PUSH    SP,C.34                ;                                        3565
  5173.     PUSHJ    SP,TT%TEXT
  5174.     PUSHJ    SP,TT%OUTPUT            ;                                        3566
  5175.     ADJSP    SP,-2                ;                                        3563
  5176. L.176:    MOVEI    AC1,1                ;                                        3573
  5177.     TDNN    AC1,FIL%NORMAL%FORM
  5178.     JRST    L.177
  5179.     PUSH    SP,C.34
  5180.     PUSH    SP,C.35
  5181.     PUSH    SP,C.47
  5182.     PUSH    SP,C.48
  5183.     PUSHJ    SP,U.27
  5184.     ADJSP    SP,-4
  5185. L.177:    SETZM    U.61                ;                                        3575
  5186.     PUSH    SP,C.2                ;                                        3577
  5187.     PUSHJ    SP,FILE%OPEN
  5188.     ADJSP    SP,-1
  5189.     TRNE    AC1,1
  5190.     JRST    L.178
  5191.     ADJSP    SP,-3
  5192.     JRST    L.184
  5193. L.178:    PUSH    SP,C.15                ;                                        3579
  5194.     PUSH    SP,C.12
  5195.     PUSHJ    SP,XFR%STATUS
  5196.     SETZM    U.62                ;                                        3580
  5197.     MOVEI    AC1,1                ;                                        3581
  5198.     MOVEM    AC1,FLAG%FILE%OPEN
  5199.     PUSH    SP,C.20                ;                                        3582
  5200.     PUSH    SP,C.25
  5201.     PUSH    SP,U.55
  5202.     PUSHJ    SP,U.24
  5203.     MOVE    AC1,U.54            ;                                        3583
  5204.     MOVEM    AC1,U.53
  5205.     SETZM    U.54                ;                                        3584
  5206.     MOVE    AC1,U.55            ;                                        3585
  5207.     ADDI    AC1,1
  5208.     LDB    AC2,C.18
  5209.     MOVEM    AC2,U.55
  5210.     ADJSP    SP,-7                ;                                        3539
  5211.     JRST    L.181
  5212. L.179:    CAIE    AC1,130                ;                                        3589
  5213.     JRST    L.182
  5214.     MOVE    AC1,U.55            ;                                        3596
  5215.     CAME    AC1,U.56
  5216.     JRST    L.183
  5217.     MOVEI    AC1,1                ;                                        3603
  5218.     MOVEM    AC1,U.62
  5219.     MOVEI    AC1,U.31            ;                                        3604
  5220.     MOVEM    AC1,U.68
  5221.     SKIPG    U.57                ;                                        3606
  5222.     JRST    L.180
  5223.     PUSH    SP,C.49                ;                                        3609
  5224.     PUSHJ    SP,TT%TEXT
  5225.     PUSHJ    SP,U.28                ;                                        3610
  5226.     PUSH    SP,C.50                ;                                        3611
  5227.     PUSHJ    SP,TT%TEXT
  5228.     PUSHJ    SP,TT%CRLF            ;                                        3612
  5229.     ADJSP    SP,-2                ;                                        3608
  5230. L.180:    PUSH    SP,C.20                ;                                        3615
  5231.     PUSH    SP,C.25
  5232.     PUSH    SP,U.55
  5233.     PUSHJ    SP,U.24
  5234.     MOVE    AC1,U.54            ;                                        3616
  5235.     MOVEM    AC1,U.53
  5236.     SETZM    U.54                ;                                        3617
  5237.     MOVE    AC1,U.55            ;                                        3618
  5238.     ADDI    AC1,1
  5239.     LDB    AC2,C.18
  5240.     MOVEM    AC2,U.55
  5241.     ADJSP    SP,-2                ;                                        3594
  5242. L.181:    MOVEI    AC1,10                ;                                        3488
  5243.     JRST    L.187
  5244. L.182:    CAIE    AC1,102                ;                                        3622
  5245.     JRST    L.186
  5246.     MOVE    AC1,U.55            ;                                        3625
  5247.     CAMN    AC1,U.56
  5248.     JRST    L.185
  5249. L.183:    PUSH    SP,C.21                ;                                        3628
  5250.     PUSHJ    SP,KRM%ERROR
  5251.     ADJSP    SP,-1                ;                                        3629
  5252. L.184:    MOVEI    AC1,12                ;                                        3627
  5253.     POPJ    SP,
  5254. L.185:    PUSH    SP,C.20                ;                                        3632
  5255.     PUSH    SP,C.25
  5256.     PUSH    SP,U.56
  5257.     PUSHJ    SP,U.24
  5258.     ADJSP    SP,-2                ;                                        3623
  5259.     MOVEI    AC1,11                ;                                        3488
  5260.     JRST    L.187
  5261. L.186:    PUSH    SP,C.21                ;                                        3638
  5262.     PUSHJ    SP,KRM%ERROR
  5263.     MOVEI    AC1,12                ;                                        3488
  5264. L.187:    ADJSP    SP,-1                ;                                        3637
  5265.     POPJ    SP,                ;                                        3416
  5266. C.45:    XWD    0,U.79
  5267. C.46:    XWD    0,P.AAH
  5268. C.47:    EXP    11
  5269. C.48:    EXP    3
  5270. C.49:    XWD    0,P.AAI
  5271. C.50:    XWD    0,P.AAJ
  5272.  
  5273. ; Routine Size:  184 words
  5274.  
  5275.  
  5276. ;   3644  1    %SBTTL 'REC%DATA'
  5277. ;   3645  1    ROUTINE REC%DATA =
  5278. ;   3646  1    
  5279. ;   3647  1    !++
  5280. ;   3648  1    ! FUNCTIONAL DESCRIPTION:
  5281. ;   3649  1    !
  5282. ;   3650  1    ! This routine will accept data messages and write them to disk.
  5283. ;   3651  1    ! It will also accept MSG%FILE, MSG%TEXT and MSG%EOF messages.
  5284. ;   3652  1    !
  5285. ;   3653  1    ! CALLING SEQUENCE:
  5286. ;   3654  1    !
  5287. ;   3655  1    !    STATE = REC%DATA();
  5288. ;   3656  1    !
  5289. ;   3657  1    ! INPUT PARAMETERS:
  5290. ;   3658  1    !
  5291. ;   3659  1    !    None.
  5292. ;   3660  1    !
  5293. ;   3661  1    ! IMPLICIT INPUTS:
  5294. ;   3662  1    !
  5295. ;   3663  1    !    None.
  5296. ;   3664  1    !
  5297. ;   3665  1    ! OUTPUT PARAMETERS:
  5298. ;   3666  1    !
  5299. ;   3667  1    !    New state for the finite state machine.
  5300. ;   3668  1    !
  5301. ;   3669  1    ! IMPLICIT OUTPUTS:
  5302. ;   3670  1    !
  5303. ;   3671  1    !    None.
  5304. ;   3672  1    !
  5305. ;   3673  1    ! COMPLETION CODES:
  5306. ;   3674  1    !
  5307. ;   3675  1    !    None.
  5308. ;   3676  1    !
  5309. ;   3677  1    ! SIDE EFFECTS:
  5310. ;   3678  1    !
  5311. ;   3679  1    !    None.
  5312. ;   3680  1    !
  5313. ;   3681  1    !--
  5314. ;   3682  1    
  5315. ;   3683  2        BEGIN
  5316. ;   3684  2    
  5317. ;   3685  2        LOCAL
  5318. ;   3686  2        STATUS;
  5319. ;   3687  2    
  5320. ;   3688  2        ROUTINE CHECK%DATA =
  5321. ;   3689  3        BEGIN
  5322. ;   3690  3    
  5323. ;   3691  4        IF .REC%TYPE EQL MSG%DATA OR (.REC%TYPE EQL MSG%FILE AND NOT .TEXT%HEAD%FLAG)
  5324. ;   3692  3     OR .REC%TYPE
  5325. ;   3693  4            EQL MSG%EOF OR (.REC%TYPE EQL MSG%TEXT AND .TEXT%HEAD%FLAG)
  5326. ;   3694  3        THEN
  5327. ;   3695  3            RETURN TRUE
  5328. ;   3696  3        ELSE
  5329. ;   3697  3            RETURN FALSE;
  5330. ;   3698  3    
  5331. ;   3699  2        END;
  5332.  
  5333.  
  5334. ; CHECK%DATA
  5335. U.80:    MOVE    AC1,U.58            ;                                        3691
  5336.     CAIN    AC1,104
  5337.     JRST    L.189
  5338.     CAIE    AC1,106
  5339.     JRST    L.188
  5340.     MOVEI    AC2,1
  5341.     TDNN    AC2,U.62
  5342.     JRST    L.189
  5343. L.188:    CAIN    AC1,132                ;                                        3693
  5344.     JRST    L.189
  5345.     CAIE    AC1,130
  5346.     JRST    L.190
  5347.     MOVEI    AC1,1
  5348.     TDNN    AC1,U.62
  5349.     JRST    L.190
  5350. L.189:    MOVEI    AC1,1                ;                                        3697
  5351.     POPJ    SP,
  5352. L.190:    SETZ    AC1,
  5353.     POPJ    SP,                ;                                        3688
  5354.  
  5355. ; Routine Size:  19 words
  5356.  
  5357.  
  5358. ;   3700  2    
  5359. ;   3701  2        LOCAL
  5360. ;   3702  2        SUB%TYPE,                ! Subtype for XFR%STATUS
  5361. ;   3703  2        DISCARD%FILE%FLAG,            ! Sender requested discard
  5362. ;   3704  2        ACK%MSG%LEN;                ! Length of ACK to send
  5363. ;   3705  2    
  5364. ;   3706  2    !
  5365. ;   3707  2    ! First get a message
  5366. ;   3708  2    !
  5367. ;   3709  2    
  5368. ;   3710  3        IF NOT (STATUS = REC%MESSAGE (CHECK%DATA))
  5369. ;   3711  2        THEN
  5370. ;   3712  2    
  5371. ;   3713  2        IF .STATUS NEQ KER%ABORTED THEN RETURN STATE%A ELSE RETURN STATE%EX;
  5372. ;   3714  2    
  5373. ;   3715  2        SELECTONE .REC%TYPE OF
  5374. ;   3716  2        SET
  5375. ;   3717  2    
  5376. ;   3718  2        [MSG%DATA] :
  5377. ;   3719  3            BEGIN
  5378. ;   3720  3    
  5379. ;   3721  3            IF .MSG%NUMBER NEQ .REC%SEQ
  5380. ;   3722  3            THEN
  5381. ;   3723  4            BEGIN
  5382. ;   3724  4    
  5383. ;   3725  4            IF .OLD%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  5384. ;   3726  4    
  5385. ;   3727  4            OLD%RETRIES = .OLD%RETRIES + 1;
  5386. ;   3728  4    
  5387. ;   3729  4            IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ
  5388. ;   3730  4            THEN
  5389. ;   3731  5                BEGIN
  5390. ;   3732  5                SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5391. ;   3733  5                NUM%RETRIES = 0;
  5392. ;   3734  5                RETURN .STATE;
  5393. ;   3735  5                END
  5394. ;   3736  4            ELSE
  5395. ;   3737  5                BEGIN
  5396. ;   3738  5                KRM%ERROR (KER%PROTOERR);
  5397. ;   3739  5                RETURN STATE%A;
  5398. ;   3740  4                END;
  5399. ;   3741  4    
  5400. ;   3742  3            END;
  5401. ;   3743  3    
  5402. ;   3744  3    !
  5403. ;   3745  3    ! Here if we have a message with a valid message number
  5404. ;   3746  3    !
  5405. ;   3747  3    
  5406. ;   3748  3            IF NOT BFR%EMPTY () THEN RETURN STATE%A;
  5407. ;   3749  3    
  5408. ;   3750  3    !
  5409. ;   3751  3    ! Check if we wish to abort for some reason
  5410. ;   3752  3    !
  5411. ;   3753  3    
  5412. ;   3754  3            IF .ABT%CUR%FILE
  5413. ;   3755  3            THEN
  5414. ;   3756  4            BEGIN
  5415. ;   3757  4            CH$WCHAR (MSG%ACK%ABT%CUR, CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE));
  5416. ;   3758  4            ACK%MSG%LEN = 1;
  5417. ;   3759  4            END
  5418. ;   3760  3            ELSE
  5419. ;   3761  3    
  5420. ;   3762  3            IF .ABT%ALL%FILE
  5421. ;   3763  3            THEN
  5422. ;   3764  4                BEGIN
  5423. ;   3765  4                CH$WCHAR (MSG%ACK%ABT%ALL, CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE));
  5424. ;   3766  4                ACK%MSG%LEN = 1;
  5425. ;   3767  4                END
  5426. ;   3768  3            ELSE
  5427. ;   3769  3                ACK%MSG%LEN = 0;
  5428. ;   3770  3    
  5429. ;   3771  3    !
  5430. ;   3772  3    ! Now send the ACK
  5431. ;   3773  3    !
  5432. ;   3774  3            SEND%PACKET (MSG%ACK, .ACK%MSG%LEN, .REC%SEQ);
  5433. ;   3775  3            OLD%RETRIES = .NUM%RETRIES;
  5434. ;   3776  3            NUM%RETRIES = 0;
  5435. ;   3777  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  5436. ;   3778  3            RETURN STATE%RD;
  5437. ;   3779  2            END;
  5438. ;   3780  2    
  5439. ;   3781  2        [MSG%FILE, MSG%TEXT] :
  5440. ;   3782  3            BEGIN
  5441. ;   3783  3    
  5442. ;   3784  3            IF .OLD%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  5443. ;   3785  3    
  5444. ;   3786  3            OLD%RETRIES = .OLD%RETRIES + 1;
  5445. ;   3787  3    
  5446. ;   3788  3            IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ
  5447. ;   3789  3            THEN
  5448. ;   3790  4            BEGIN
  5449. ;   3791  4            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5450. ;   3792  4            NUM%RETRIES = 0;
  5451. ;   3793  4            RETURN .STATE;
  5452. ;   3794  4            END
  5453. ;   3795  3            ELSE
  5454. ;   3796  4            BEGIN
  5455. ;   3797  4            KRM%ERROR (KER%PROTOERR);
  5456. ;   3798  4            RETURN STATE%A;
  5457. ;   3799  3            END;
  5458. ;   3800  3    
  5459. ;   3801  2            END;
  5460. ;   3802  2    
  5461. ;   3803  2        [MSG%EOF] :
  5462. ;   3804  3            BEGIN
  5463. ;   3805  3    
  5464. ;   3806  3            IF .MSG%NUMBER NEQ .REC%SEQ
  5465. ;   3807  3            THEN
  5466. ;   3808  4            BEGIN
  5467. ;   3809  4            KRM%ERROR (KER%PROTOERR);
  5468. ;   3810  4            RETURN STATE%A;
  5469. ;   3811  3            END;
  5470. ;   3812  3    
  5471. ;   3813  3            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5472. ;   3814  3    
  5473. ;   3815  3            IF NOT .TEXT%HEAD%FLAG
  5474. ;   3816  3            THEN
  5475. ;   3817  4            BEGIN
  5476. ;   3818  4            FLAG%FILE%OPEN = FALSE;
  5477. ;   3819  4            DISCARD%FILE%FLAG = FALSE;    ! Assume we want file
  5478. ;   3820  4    
  5479. ;   3821  4            IF .REC%LENGTH EQL 1
  5480. ;   3822  4            THEN
  5481. ;   3823  4    
  5482. ;   3824  4                IF CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG, CHR%SIZE)) EQL
  5483. ;   3825  4     MSG%EOF%DISCARD ! [108]
  5484. ;   3826  4                THEN
  5485. ;   3827  4                DISCARD%FILE%FLAG = TRUE;
  5486. ;   3828  4    
  5487. ;   3829  4            IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  5488. ;   3830  4            THEN
  5489. ;   3831  5                BEGIN
  5490. ;   3832  5    
  5491. ;   3833  5                IF .DISCARD%FILE%FLAG
  5492. ;   3834  5                THEN
  5493. ;   3835  5    
  5494. ;   3836  5                IF .ABT%FLAG
  5495. ;   3837  5                THEN
  5496. ;   3838  5                    TT%TEXT (UPLIT (%ASCIZ' [Interrupted]'))
  5497. ;   3839  5                ELSE
  5498. ;   3840  5                    TT%TEXT (UPLIT (%ASCIZ' [Interrupted, partial file saved]'))
  5499. ;   3841  5    
  5500. ;   3842  5                ELSE
  5501. ;   3843  5                TT%TEXT (UPLIT (%ASCIZ' [OK]'));
  5502. ;   3844  5    
  5503. ;   3845  5                TT%CRLF ();
  5504. ;   3846  4                END;
  5505. ;   3847  4    
  5506. ;   3848  4            IF NOT FILE%CLOSE (.DISCARD%FILE%FLAG AND .ABT%FLAG) THEN RETURN STATE%A;
  5507. ;   3849  4    
  5508. ;   3850  4            IF .DISCARD%FILE%FLAG
  5509. ;   3851  4            THEN
  5510. ;   3852  4    
  5511. ;   3853  4                IF .ABT%FLAG THEN SUB%TYPE = %C'X' ELSE SUB%TYPE = %C'D'
  5512. ;   3854  4    
  5513. ;   3855  4            ELSE
  5514. ;   3856  4                SUB%TYPE = %C'C';
  5515. ;   3857  4    
  5516. ;   3858  4            END
  5517. ;   3859  3            ELSE
  5518. ;   3860  4            BEGIN
  5519. ;   3861  4            TT%CRLF ();            ! Make sure we have a CRLF
  5520. ;   3862  4            TT%OUTPUT ();            ! And make sure all output is sent
  5521. ;   3863  3            END;
  5522. ;   3864  3    
  5523. ;   3865  3            XFR%STATUS (%C'F', .SUB%TYPE);
  5524. ;   3866  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  5525. ;   3867  3            RETURN STATE%RF;
  5526. ;   3868  2            END;
  5527. ;   3869  2    
  5528. ;   3870  2        [OTHERWISE] :
  5529. ;   3871  3            BEGIN
  5530. ;   3872  3            KRM%ERROR (KER%PROTOERR);
  5531. ;   3873  3            RETURN STATE%A;
  5532. ;   3874  2            END;
  5533. ;   3875  2        TES;
  5534. ;   3876  2    
  5535. ;   3877  1        END;                    ! End of REC%DATA
  5536.  
  5537.  
  5538. P.AAK:    BYTE    (7)" ","[","I","n","t"
  5539.     BYTE    (7)"e","r","r","u","p"
  5540.     BYTE    (7)"t","e","d","]",000
  5541. P.AAL:    BYTE    (7)" ","[","I","n","t"
  5542.     BYTE    (7)"e","r","r","u","p"
  5543.     BYTE    (7)"t","e","d",","," "
  5544.     BYTE    (7)"p","a","r","t","i"
  5545.     BYTE    (7)"a","l"," ","f","i"
  5546.     BYTE    (7)"l","e"," ","s","a"
  5547.     BYTE    (7)"v","e","d","]",000
  5548. P.AAM:    BYTE    (7)" ","[","O","K","]"
  5549.     BYTE    (7)000,000,000,000,000
  5550.  
  5551.  
  5552. ; REC%DATA
  5553. U.13:    PUSH    SP,AC16                ;                                        3645
  5554.     PUSH    SP,C.51                ;                                        3710
  5555.     PUSHJ    SP,U.25
  5556.     ADJSP    SP,-1
  5557.     TRNE    AC1,1
  5558.     JRST    L.191
  5559.     CAIE    AC1,312                ;                                        3713
  5560.     JRST    L.208
  5561.     MOVEI    AC1,23
  5562.     JRST    L.216
  5563. L.191:    MOVE    AC1,U.58            ;                                        3715
  5564.     CAIE    AC1,104                ;                                        3718
  5565.     JRST    L.197
  5566.     MOVE    AC2,U.55            ;                                        3721
  5567.     CAMN    AC2,U.56
  5568.     JRST    L.192
  5569.     MOVE    AC1,U.53            ;                                        3725
  5570.     CAMLE    AC1,PKT%RETRIES
  5571.     JRST    L.199
  5572.     JRST    L.200                ;                                        3645
  5573. L.192:    PUSHJ    SP,U.28                ;                                        3748
  5574.     TRNN    AC1,1
  5575.     JRST    L.208
  5576.     MOVEI    AC1,1                ;                                        3754
  5577.     TDNN    AC1,ABT%CUR%FILE
  5578.     JRST    L.193
  5579.     MOVEI    AC2,130                ;                                        3757
  5580.     MOVE    AC1,C.32
  5581.     IDPB    AC2,AC1
  5582.     JRST    L.194
  5583. L.193:    MOVEI    AC1,1                ;                                        3762
  5584.     TDNN    AC1,ABT%ALL%FILE
  5585.     JRST    L.195
  5586.     MOVEI    AC3,132                ;                                        3765
  5587.     MOVE    AC1,C.32
  5588.     IDPB    AC3,AC1
  5589. L.194:    MOVEI    AC2,1                ;                                        3766
  5590.     JRST    L.196                ;                                        3762
  5591. L.195:    SETZ    AC2,                ;                                        3769
  5592. L.196:    PUSH    SP,C.20                ;                                        3774
  5593.     PUSH    SP,AC2
  5594.     PUSH    SP,U.56
  5595.     PUSHJ    SP,U.24
  5596.     MOVE    AC1,U.54            ;                                        3775
  5597.     MOVEM    AC1,U.53
  5598.     SETZM    U.54                ;                                        3776
  5599.     MOVE    AC1,U.55            ;                                        3777
  5600.     ADDI    AC1,1
  5601.     LDB    AC2,C.18
  5602.     MOVEM    AC2,U.55
  5603.     ADJSP    SP,-2                ;                                        3719
  5604.     MOVEI    AC1,10                ;                                        3715
  5605.     JRST    L.215
  5606. L.197:    CAIE    AC1,106                ;                                        3781
  5607.     CAIN    AC1,130
  5608.     JRST    L.198
  5609.     JRST    L.201
  5610. L.198:    MOVE    AC1,U.53            ;                                        3784
  5611.     CAMG    AC1,PKT%RETRIES
  5612.     JRST    L.200
  5613. L.199:    MOVEI    AC1,24
  5614.     JRST    L.216
  5615. L.200:    AOS    U.53                ;                                        3786
  5616.     MOVE    AC1,U.55            ;                                        3788
  5617.     SUBI    AC1,1
  5618.     LDB    AC2,C.18
  5619.     CAME    AC2,U.56
  5620.     JRST    L.214
  5621.     PUSH    SP,C.20                ;                                        3791
  5622.     PUSH    SP,C.25
  5623.     PUSH    SP,U.56
  5624.     PUSHJ    SP,U.24
  5625.     SETZM    U.54                ;                                        3792
  5626.     ADJSP    SP,-2                ;                                        3790
  5627.     MOVE    AC1,U.51            ;                                        3796
  5628.     JRST    L.215
  5629. L.201:    CAIE    AC1,132                ;                                        3803
  5630.     JRST    L.214
  5631.     MOVE    AC1,U.55            ;                                        3806
  5632.     CAMN    AC1,U.56
  5633.     JRST    L.202
  5634.     PUSH    SP,C.21                ;                                        3809
  5635.     PUSHJ    SP,KRM%ERROR
  5636.     ADJSP    SP,-1                ;                                        3810
  5637.     JRST    L.208
  5638. L.202:    PUSH    SP,C.20                ;                                        3813
  5639.     PUSH    SP,C.25
  5640.     PUSH    SP,U.56
  5641.     PUSHJ    SP,U.24
  5642.     MOVEI    AC1,1                ;                                        3815
  5643.     TDNE    AC1,U.62
  5644.     JRST    L.212
  5645.     SETZB    AC16,FLAG%FILE%OPEN        ;                                        3818
  5646.     MOVEI    AC1,1                ;                                        3821
  5647.     CAME    AC1,U.57
  5648.     JRST    L.203
  5649.     MOVE    AC2,C.27            ;                                        3824
  5650.     MOVE    AC1,U.39
  5651.     ADJBP    AC1,AC2
  5652.     ILDB    AC1,AC1
  5653.     CAIN    AC1,104
  5654.     MOVEI    AC16,1                ;                                        3827
  5655. L.203:    MOVEI    AC1,1                ;                                        3829
  5656.     TDNE    AC1,CONNECT%FLAG
  5657.     JRST    L.207
  5658.     MOVEI    AC1,1
  5659.     TDNN    AC1,TY%FIL
  5660.     JRST    L.207
  5661.     TRNN    AC16,1                ;                                        3833
  5662.     JRST    L.205
  5663.     MOVEI    AC1,1                ;                                        3836
  5664.     TDNN    AC1,ABT%FLAG
  5665.     JRST    L.204
  5666.     PUSH    SP,C.52                ;                                        3838
  5667.     JRST    L.206
  5668. L.204:    PUSH    SP,C.53                ;                                        3840
  5669.     JRST    L.206
  5670. L.205:    PUSH    SP,C.54                ;                                        3843
  5671. L.206:    PUSHJ    SP,TT%TEXT
  5672.     PUSHJ    SP,TT%CRLF            ;                                        3845
  5673.     ADJSP    SP,-1                ;                                        3831
  5674. L.207:    MOVE    AC1,AC16            ;                                        3848
  5675.     AND    AC1,ABT%FLAG
  5676.     PUSH    SP,AC1
  5677.     PUSHJ    SP,FILE%CLOSE
  5678.     ADJSP    SP,-1
  5679.     TRNE    AC1,1
  5680.     JRST    L.209
  5681.     ADJSP    SP,-3
  5682. L.208:    MOVEI    AC1,12
  5683.     JRST    L.216
  5684. L.209:    TRNN    AC16,1                ;                                        3850
  5685.     JRST    L.211
  5686.     MOVEI    AC1,1                ;                                        3853
  5687.     TDNN    AC1,ABT%FLAG
  5688.     JRST    L.210
  5689.     MOVEI    AC1,130
  5690.     JRST    L.213
  5691. L.210:    MOVEI    AC1,104
  5692.     JRST    L.213                ;                                        3850
  5693. L.211:    MOVEI    AC1,103                ;                                        3856
  5694.     JRST    L.213                ;                                        3815
  5695. L.212:    PUSHJ    SP,TT%CRLF            ;                                        3861
  5696.     PUSHJ    SP,TT%OUTPUT            ;                                        3862
  5697. L.213:    PUSH    SP,C.15                ;                                        3865
  5698.     PUSH    SP,AC1
  5699.     PUSHJ    SP,XFR%STATUS
  5700.     MOVE    AC1,U.55            ;                                        3866
  5701.     ADDI    AC1,1
  5702.     LDB    AC2,C.18
  5703.     MOVEM    AC2,U.55
  5704.     ADJSP    SP,-4                ;                                        3804
  5705.     MOVEI    AC1,7                ;                                        3715
  5706.     JRST    L.215
  5707. L.214:    PUSH    SP,C.21                ;                                        3872
  5708.     PUSHJ    SP,KRM%ERROR
  5709.     MOVEI    AC1,12                ;                                        3715
  5710. L.215:    ADJSP    SP,-1                ;                                        3871
  5711. L.216:    POP    SP,AC16                ;                                        3645
  5712.     POPJ    SP,
  5713. C.51:    XWD    0,U.80
  5714. C.52:    XWD    0,P.AAK
  5715. C.53:    XWD    0,P.AAL
  5716. C.54:    XWD    0,P.AAM
  5717.  
  5718. ; Routine Size:  164 words
  5719.  
  5720.  
  5721. ;   3878  1    %SBTTL 'SERVER - Generic commands'
  5722. ;   3879  1    ROUTINE SERVER%GENERIC =
  5723. ;   3880  1    
  5724. ;   3881  1    !++
  5725. ;   3882  1    ! FUNCTIONAL DESCRIPTION:
  5726. ;   3883  1    !
  5727. ;   3884  1    !    This routine will handle the generic server messages.
  5728. ;   3885  1    !    The generic server messages include FINISH, LOGOUT.
  5729. ;   3886  1    !
  5730. ;   3887  1    ! CALLING SEQUENCE:
  5731. ;   3888  1    !
  5732. ;   3889  1    !    STATE = SERVER%GENERIC();
  5733. ;   3890  1    !
  5734. ;   3891  1    ! INPUT PARAMETERS:
  5735. ;   3892  1    !
  5736. ;   3893  1    !    None.
  5737. ;   3894  1    !
  5738. ;   3895  1    ! IMPLICIT INPUTS:
  5739. ;   3896  1    !
  5740. ;   3897  1    !    Generic message receive in REC%MSG.
  5741. ;   3898  1    !
  5742. ;   3899  1    ! OUTPUT PARAMETERS:
  5743. ;   3900  1    !
  5744. ;   3901  1    !    Returns new state for FSM
  5745. ;   3902  1    !
  5746. ;   3903  1    ! IMPLICIT OUTPUTS:
  5747. ;   3904  1    !
  5748. ;   3905  1    !    None.
  5749. ;   3906  1    !
  5750. ;   3907  1    ! COMPLETION CODES:
  5751. ;   3908  1    !
  5752. ;   3909  1    !    None.
  5753. ;   3910  1    !
  5754. ;   3911  1    ! SIDE EFFECTS:
  5755. ;   3912  1    !
  5756. ;   3913  1    !    None.
  5757. ;   3914  1    !
  5758. ;   3915  1    !--
  5759. ;   3916  1    
  5760. ;   3917  2        BEGIN
  5761. ;   3918  2    
  5762. ;   3919  2        LOCAL
  5763. ;   3920  2        STATUS,                    ! Returned status
  5764. ;   3921  2        G%FUNC,                    ! Generic command function
  5765. ;   3922  2        POINTER,                ! Character pointer
  5766. ;   3923  2        DATA%TEXT : VECTOR [CH$ALLOCATION (MAX%MSG)],    ! Unpacked message
  5767. ;   3924  2        DATA%SIZE;                ! Actual size of data
  5768. ;   3925  2    
  5769. ;   3926  2        ROUTINE UNPACK%DATA (POINTER, SIZE, DST%ADDR, DST%LEN) =
  5770. ;   3927  2    !
  5771. ;   3928  2    ! Routine to unpack an argument.
  5772. ;   3929  2    ! This will copy the argument data to the desired buffer.
  5773. ;   3930  2    !
  5774. ;   3931  3        BEGIN
  5775. ;   3932  3    
  5776. ;   3933  3        IF .SIZE GTR 0                ! If we have something to unpack
  5777. ;   3934  3        THEN
  5778. ;   3935  4            BEGIN
  5779. ;   3936  4            .DST%LEN = UNCHAR (CH$RCHAR%A (.POINTER));
  5780. ;   3937  4    
  5781. ;   3938  4            IF ..DST%LEN LSS 0
  5782. ;   3939  4            THEN
  5783. ;   3940  5            BEGIN
  5784. ;   3941  5            KRM%ERROR (KER%PROTOERR);    ! Someone screwed up
  5785. ;   3942  5            ..DST%LEN = 0;
  5786. ;   3943  5            RETURN -1;
  5787. ;   3944  4            END;
  5788. ;   3945  4    
  5789. ;   3946  4            IF ..DST%LEN GTR .SIZE - 1 THEN .DST%LEN = .SIZE - 1;
  5790. ;   3947  4    
  5791. ;   3948  4            CH$COPY (..DST%LEN, ..POINTER, CHR%NUL, MAX%MSG, CH$PTR (.DST%ADDR));
  5792. ;   3949  4            .POINTER = CH$PLUS (..POINTER, ..DST%LEN);
  5793. ;   3950  4            RETURN .SIZE - ..DST%LEN - 1;
  5794. ;   3951  4            END
  5795. ;   3952  3        ELSE
  5796. ;   3953  3    !
  5797. ;   3954  3    ! If nothing left in buffer, return the current size (0)
  5798. ;   3955  3    !
  5799. ;   3956  3            RETURN .SIZE;
  5800. ;   3957  3    
  5801. ;   3958  2        END;
  5802.  
  5803.  
  5804. ; UNPACK%DATA
  5805. U.81:    PUSH    SP,AC12                ;                                        3926
  5806.     PUSH    SP,AC13
  5807.     PUSH    SP,AC14
  5808.     PUSH    SP,AC16
  5809.     MOVE    AC12,-7(SP)            ;                                        3933
  5810.     JUMPLE    AC12,L.218
  5811.     MOVE    AC13,-5(SP)            ;                                        3936
  5812.     MOVE    AC16,-10(SP)
  5813.     ILDB    AC1,0(AC16)
  5814.     SUBI    AC1,40
  5815.     MOVEM    AC1,0(AC13)
  5816.     MOVE    AC14,0(AC13)            ;                                        3938
  5817.     JUMPGE    AC14,L.217
  5818.     PUSH    SP,C.21                ;                                        3941
  5819.     PUSHJ    SP,KRM%ERROR
  5820.     SETZM    0(AC14)                ;                                        3942
  5821.     ADJSP    SP,-1                ;                                        3943
  5822.     SETO    AC1,                ;                                        3940
  5823.     JRST    L.219
  5824. L.217:    MOVE    AC1,AC12            ;                                        3946
  5825.     SUBI    AC1,1
  5826.     CAMLE    AC14,AC1
  5827.     MOVEM    AC1,0(AC13)
  5828.     MOVE    AC1,-6(SP)            ;                                        3948
  5829.     MOVEI    AC5,-1(AC1)
  5830.     HRLI    AC5,10700
  5831.     MOVE    AC1,0(AC13)
  5832.     MOVE    AC2,0(AC16)
  5833.     MOVEI    AC4,1752
  5834.     EXTEND    AC1,C.1
  5835.     JFCL    
  5836.     MOVE    AC1,0(AC13)            ;                                        3949
  5837.     ADJBP    AC1,0(AC16)
  5838.     MOVEM    AC1,0(AC16)
  5839.     MOVE    AC1,AC12            ;                                        3950
  5840.     SUB    AC1,0(AC13)
  5841.     SOJA    AC1,L.219            ;                                        3956
  5842. L.218:    MOVE    AC1,AC12
  5843. L.219:    POP    SP,AC16                ;                                        3926
  5844.     POP    SP,AC14
  5845.     POP    SP,AC13
  5846.     POP    SP,AC12
  5847.     POPJ    SP,
  5848.  
  5849. ; Routine Size:  43 words
  5850.  
  5851.  
  5852. ;   3959  2    !
  5853. ;   3960  2    ! First unpack the message data into its various pieces
  5854. ;   3961  2    !
  5855. ;   3962  2        SET%STRING (CH$PTR (DATA%TEXT), MAX%MSG, TRUE);    ! Initialize for unpacking
  5856. ;   3963  2        BFR%EMPTY ();                ! Unpack the data
  5857. ;   3964  2        DATA%SIZE = SET%STRING (0, 0, FALSE);    ! All done, get size
  5858. ;   3965  2    
  5859. ;   3966  2        IF .DATA%SIZE LEQ 0
  5860. ;   3967  2        THEN
  5861. ;   3968  3        BEGIN
  5862. ;   3969  3        KRM%ERROR (KER%PROTOERR);        ! Someone screwed up
  5863. ;   3970  3        RETURN STATE%A;                ! Since no subtype
  5864. ;   3971  2        END;
  5865. ;   3972  2    
  5866. ;   3973  2    !
  5867. ;   3974  2    ! Get the arguments from the unpacked data (if any)
  5868. ;   3975  2    !
  5869. ;   3976  2        GEN%1SIZE = 0;                ! Assume no args
  5870. ;   3977  2        GEN%2SIZE = 0;                ! none at all
  5871. ;   3978  2        GEN%3SIZE = 0;
  5872. ;   3979  2        CH$WCHAR (CHR%NUL, CH$PTR (GEN%1DATA));    ! Ensure all are null terminated
  5873. ;   3980  2        CH$WCHAR (CHR%NUL, CH$PTR (GEN%2DATA));
  5874. ;   3981  2        CH$WCHAR (CHR%NUL, CH$PTR (GEN%3DATA));
  5875. ;   3982  2        POINTER = CH$PTR (DATA%TEXT, 1);        ! Point at second character
  5876. ;   3983  2        DATA%SIZE = .DATA%SIZE - 1;            ! Account for subtype
  5877. ;   3984  2    
  5878. ;   3985  2        IF .DATA%SIZE GTR 0                ! Room for first arg?
  5879. ;   3986  2        THEN
  5880. ;   3987  3        BEGIN
  5881. ;   3988  3        DATA%SIZE = UNPACK%DATA (POINTER, .DATA%SIZE, GEN%1DATA, GEN%1SIZE);
  5882. ;   3989  3    
  5883. ;   3990  3        IF .DATA%SIZE LSS 0 THEN RETURN STATE%A;    ! Punt if bad arguments
  5884. ;   3991  3    
  5885. ;   3992  3        IF .DATA%SIZE GTR 0            ! Second argument present?
  5886. ;   3993  3        THEN
  5887. ;   3994  4            BEGIN
  5888. ;   3995  4            DATA%SIZE = UNPACK%DATA (POINTER, .DATA%SIZE, GEN%2DATA, GEN%2SIZE);
  5889. ;   3996  4    
  5890. ;   3997  4            IF .DATA%SIZE LSS 0 THEN RETURN STATE%A;    ! Punt if bad arguments
  5891. ;   3998  4    
  5892. ;   3999  4            IF .DATA%SIZE GTR 0            ! Third argument here?
  5893. ;   4000  4            THEN
  5894. ;   4001  5            BEGIN
  5895. ;   4002  5            DATA%SIZE = UNPACK%DATA (POINTER, .DATA%SIZE, GEN%3DATA, GEN%3SIZE);
  5896. ;   4003  5    
  5897. ;   4004  5            IF .DATA%SIZE LSS 0 THEN RETURN STATE%A;    ! Punt if bad arguments
  5898. ;   4005  5    
  5899. ;   4006  4            END;
  5900. ;   4007  4    
  5901. ;   4008  3            END;
  5902. ;   4009  3    
  5903. ;   4010  2        END;
  5904. ;   4011  2    
  5905. ;   4012  2        SELECTONE CH$RCHAR (CH$PTR (DATA%TEXT)) OF
  5906. ;   4013  2        SET
  5907. ;   4014  2        !
  5908. ;   4015  2        ! EXIT command, just return the status to the upper level
  5909. ;   4016  2        !
  5910. ;   4017  2    
  5911. ;   4018  2        [MSG%GEN%EXIT] :
  5912. ;   4019  3            BEGIN
  5913. ;   4020  3            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5914. ;   4021  3            RETURN STATE%FI;
  5915. ;   4022  2            END;
  5916. ;   4023  2        !
  5917. ;   4024  2        ! LOGOUT command, ACK the message then call the system routine to
  5918. ;   4025  2        ! kill the process (log the job out, etc.)
  5919. ;   4026  2        !
  5920. ;   4027  2    
  5921. ;   4028  2        [MSG%GEN%LOGOUT] :
  5922. ;   4029  3            BEGIN
  5923. ;   4030  3            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5924. ;   4031  3            SY%LOGOUT ();
  5925. ;   4032  3            RETURN STATE%LG;
  5926. ;   4033  2            END;
  5927. ;   4034  2    !
  5928. ;   4035  2    ! For a type command, just set up a transfer flagging we want a text header
  5929. ;   4036  2    ! instead of a file header.
  5930. ;   4037  2    !
  5931. ;   4038  2    
  5932. ;   4039  2        [MSG%GEN%TYPE] :
  5933. ;   4040  3            BEGIN
  5934. ;   4041  3            CH$COPY (.GEN%1SIZE, CH$PTR (GEN%1DATA), CHR%NUL, MAX%FILE%NAME, CH$PTR
  5935. ;   4042  3    (FILE%NAME));
  5936. ;   4043  3            FILE%SIZE = .GEN%1SIZE;
  5937. ;   4044  3            TEXT%HEAD%FLAG = TRUE;        ! Now want text header
  5938. ;   4045  3            XFR%STATUS (%C'I', %C'G');        ! Tell display routine we are doing a command
  5939. ;   4046  3    
  5940. ;   4047  3            IF .STATE EQL STATE%II AND .BLK%CHK%TYPE EQL .INI%CHK%TYPE
  5941. ;   4048  3            THEN
  5942. ;   4049  3            RETURN STATE%OF            ! Must open the file
  5943. ;   4050  3            ELSE
  5944. ;   4051  3            RETURN STATE%S;            ! Start the transaction with a send
  5945. ;   4052  3    
  5946. ;   4053  2            END;
  5947. ;   4054  2    
  5948. ;   4055  2        [MSG%GEN%DIRECTORY] :
  5949. ;   4056  2            G%FUNC = GC%DIRECTORY;
  5950. ;   4057  2    
  5951. ;   4058  2        [MSG%GEN%DISK%USAGE] :
  5952. ;   4059  2            G%FUNC = GC%DISK%USAGE;
  5953. ;   4060  2    
  5954. ;   4061  2        [MSG%GEN%DELETE] :
  5955. ;   4062  2            G%FUNC = GC%DELETE;
  5956. ;   4063  2    
  5957. ;   4064  2        [MSG%GEN%HELP] :
  5958. ;   4065  2            G%FUNC = GC%HELP;
  5959. ;   4066  2    
  5960. ;   4067  2        [MSG%GEN%LOGIN] :
  5961. ;   4068  2            G%FUNC = GC%LGN;
  5962. ;   4069  2    
  5963. ;   4070  2        [MSG%GEN%CONNECT] :
  5964. ;   4071  2            G%FUNC = GC%CONNECT;
  5965. ;   4072  2    
  5966. ;   4073  2        [MSG%GEN%RENAME] :
  5967. ;   4074  2            G%FUNC = GC%RENAME;
  5968. ;   4075  2    
  5969. ;   4076  2        [MSG%GEN%COPY] :
  5970. ;   4077  2            G%FUNC = GC%COPY;
  5971. ;   4078  2    
  5972. ;   4079  2        [MSG%GEN%WHO] :
  5973. ;   4080  2            G%FUNC = GC%WHO;
  5974. ;   4081  2    
  5975. ;   4082  2        [MSG%GEN%SEND] :
  5976. ;   4083  2            G%FUNC = GC%SEND%MSG;
  5977. ;   4084  2    
  5978. ;   4085  2        [MSG%GEN%QUERY] :
  5979. ;   4086  2            G%FUNC = GC%STATUS;
  5980. ;   4087  2    
  5981. ;   4088  2        [MSG%GEN%PROGRAM] :
  5982. ;   4089  2            G%FUNC = GC%PROGRAM;
  5983. ;   4090  2    
  5984. ;   4091  2        [MSG%GEN%JOURNAL] :
  5985. ;   4092  2            G%FUNC = GC%JOURNAL;
  5986. ;   4093  2    
  5987. ;   4094  2        [MSG%GEN%VARIABLE] :
  5988. ;   4095  2            G%FUNC = GC%VARIABLE;
  5989. ;   4096  2    !
  5990. ;   4097  2    ! Here if we have a function that is not implemented in KERMSG.
  5991. ;   4098  2    !
  5992. ;   4099  2    
  5993. ;   4100  2        [OTHERWISE] :
  5994. ;   4101  3            BEGIN
  5995. ;   4102  3            KRM%ERROR (KER%UNIMPLGEN);
  5996. ;   4103  3            RETURN STATE%A;
  5997. ;   4104  2            END;
  5998. ;   4105  2        TES;
  5999. ;   4106  2    
  6000. ;   4107  2    !
  6001. ;   4108  2    ! If we get here, we have gotten a known type of generic message that
  6002. ;   4109  2    ! we need to have our operating system dependent routine handle.
  6003. ;   4110  2    !
  6004. ;   4111  2        RETURN CALL%SY%RTN (.G%FUNC);
  6005. ;   4112  1        END;                    ! End of SERVER%GENERIC
  6006.  
  6007.  
  6008. ; SERVER%GENERIC
  6009. U.14:    PUSH    SP,AC14                ;                                        3879
  6010.     PUSH    SP,AC16
  6011.     ADJSP    SP,312
  6012.     MOVEI    AC1,-312(SP)            ;                                        3962
  6013.     HRLI    AC1,10700
  6014.     PUSH    SP,AC1
  6015.     PUSH    SP,C.55
  6016.     PUSH    SP,C.2
  6017.     PUSHJ    SP,U.30
  6018.     PUSHJ    SP,U.28                ;                                        3963
  6019.     SETZM    -2(SP)                ;                                        3964
  6020.     SETZM    -1(SP)
  6021.     SETZM    0(SP)
  6022.     PUSHJ    SP,U.30
  6023.     MOVE    AC14,AC1
  6024.     JUMPG    AC14,L.220            ;                                        3966
  6025.     PUSH    SP,C.21                ;                                        3969
  6026.     JRST    L.246
  6027. L.220:    SETZM    GEN%1SIZE            ;                                        3976
  6028.     SETZM    GEN%2SIZE            ;                                        3977
  6029.     SETZB    AC2,GEN%3SIZE            ;                                        3978
  6030.     MOVE    AC1,C.11            ;                                        3979
  6031.     IDPB    AC2,AC1
  6032.     SETZ    AC2,                ;                                        3980
  6033.     MOVE    AC1,C.56
  6034.     IDPB    AC2,AC1
  6035.     SETZ    AC2,                ;                                        3981
  6036.     MOVE    AC1,C.57
  6037.     IDPB    AC2,AC1
  6038.     MOVEI    AC1,-314(SP)            ;                                        3982
  6039.     HRLI    AC1,350700
  6040.     MOVEM    AC1,-3(SP)
  6041.     SOJLE    AC14,L.226            ;                                        3985
  6042.     MOVEI    AC1,-3(SP)            ;                                        3988
  6043.     PUSH    SP,AC1
  6044.     PUSH    SP,AC14
  6045.     PUSH    SP,C.38
  6046.     PUSH    SP,C.58
  6047.     PUSHJ    SP,U.81
  6048.     MOVE    AC14,AC1
  6049.     JUMPGE    AC14,L.221            ;                                        3990
  6050.     ADJSP    SP,-7
  6051.     JRST    L.247
  6052. L.221:    JUMPLE    AC14,L.225            ;                                        3992
  6053.     MOVEI    AC1,-7(SP)            ;                                        3995
  6054.     PUSH    SP,AC1
  6055.     PUSH    SP,AC14
  6056.     PUSH    SP,C.39
  6057.     PUSH    SP,C.59
  6058.     PUSHJ    SP,U.81
  6059.     MOVE    AC14,AC1
  6060.     JUMPGE    AC14,L.222            ;                                        3997
  6061.     ADJSP    SP,-13
  6062.     JRST    L.247
  6063. L.222:    JUMPLE    AC14,L.224            ;                                        3999
  6064.     MOVEI    AC1,-13(SP)            ;                                        4002
  6065.     PUSH    SP,AC1
  6066.     PUSH    SP,AC14
  6067.     PUSH    SP,C.40
  6068.     PUSH    SP,C.60
  6069.     PUSHJ    SP,U.81
  6070.     MOVE    AC14,AC1
  6071.     JUMPGE    AC14,L.223            ;                                        4004
  6072.     ADJSP    SP,-17
  6073.     JRST    L.247
  6074. L.223:    ADJSP    SP,-4                ;                                        4001
  6075. L.224:    ADJSP    SP,-4                ;                                        3994
  6076. L.225:    ADJSP    SP,-4                ;                                        3987
  6077. L.226:    MOVEI    AC1,-315(SP)            ;                                        4012
  6078.     HRLI    AC1,10700
  6079.     ILDB    AC16,AC1
  6080.     CAIE    AC16,106            ;                                        4018
  6081.     JRST    L.227
  6082.     PUSH    SP,C.20                ;                                        4020
  6083.     PUSH    SP,C.25
  6084.     PUSH    SP,U.56
  6085.     PUSHJ    SP,U.24
  6086.     ADJSP    SP,-6                ;                                        4021
  6087.     MOVEI    AC1,20                ;                                        4019
  6088.     JRST    L.249
  6089. L.227:    CAIE    AC16,114            ;                                        4028
  6090.     JRST    L.228
  6091.     PUSH    SP,C.20                ;                                        4030
  6092.     PUSH    SP,C.25
  6093.     PUSH    SP,U.56
  6094.     PUSHJ    SP,U.24
  6095.     PUSHJ    SP,SY%LOGOUT            ;                                        4031
  6096.     ADJSP    SP,-6                ;                                        4032
  6097.     MOVEI    AC1,21                ;                                        4029
  6098.     JRST    L.249
  6099. L.228:    CAIE    AC16,124            ;                                        4039
  6100.     JRST    L.231
  6101.     MOVE    AC1,GEN%1SIZE            ;                                        4041
  6102.     MOVE    AC2,C.11
  6103.     MOVEI    AC4,204
  6104.     MOVE    AC5,C.10
  6105.     EXTEND    AC1,C.1
  6106.     JFCL    
  6107.     MOVE    AC1,GEN%1SIZE            ;                                        4043
  6108.     MOVEM    AC1,FILE%SIZE
  6109.     MOVEI    AC1,1                ;                                        4044
  6110.     MOVEM    AC1,U.62
  6111.     PUSH    SP,C.6                ;                                        4045
  6112.     PUSH    SP,C.61
  6113.     PUSHJ    SP,XFR%STATUS
  6114.     MOVEI    AC1,17                ;                                        4047
  6115.     CAME    AC1,U.51
  6116.     JRST    L.229
  6117.     MOVE    AC1,U.48
  6118.     CAME    AC1,U.47
  6119.     JRST    L.229
  6120.     MOVEI    AC1,22                ;                                        4051
  6121.     JRST    L.230
  6122. L.229:    MOVEI    AC1,1
  6123. L.230:    ADJSP    SP,-5                ;                                        4047
  6124.     JRST    L.249                ;                                        4040
  6125. L.231:    CAIE    AC16,104            ;                                        4055
  6126.     JRST    L.232
  6127.     MOVEI    AC14,2                ;                                        4056
  6128.     JRST    L.248                ;                                        4012
  6129. L.232:    CAIE    AC16,125            ;                                        4058
  6130.     JRST    L.233
  6131.     MOVEI    AC14,3                ;                                        4059
  6132.     JRST    L.248                ;                                        4012
  6133. L.233:    CAIE    AC16,105            ;                                        4061
  6134.     JRST    L.234
  6135.     MOVEI    AC14,4                ;                                        4062
  6136.     JRST    L.248                ;                                        4012
  6137. L.234:    CAIE    AC16,110            ;                                        4064
  6138.     JRST    L.235
  6139.     MOVEI    AC14,6                ;                                        4065
  6140.     JRST    L.248                ;                                        4012
  6141. L.235:    CAIE    AC16,111            ;                                        4067
  6142.     JRST    L.236
  6143.     MOVEI    AC14,10                ;                                        4068
  6144.     JRST    L.248                ;                                        4012
  6145. L.236:    CAIE    AC16,103            ;                                        4070
  6146.     JRST    L.237
  6147.     MOVEI    AC14,11                ;                                        4071
  6148.     JRST    L.248                ;                                        4012
  6149. L.237:    CAIE    AC16,122            ;                                        4073
  6150.     JRST    L.238
  6151.     MOVEI    AC14,12                ;                                        4074
  6152.     JRST    L.248                ;                                        4012
  6153. L.238:    CAIE    AC16,113            ;                                        4076
  6154.     JRST    L.239
  6155.     MOVEI    AC14,13                ;                                        4077
  6156.     JRST    L.248                ;                                        4012
  6157. L.239:    CAIE    AC16,127            ;                                        4079
  6158.     JRST    L.240
  6159.     MOVEI    AC14,14                ;                                        4080
  6160.     JRST    L.248                ;                                        4012
  6161. L.240:    CAIE    AC16,115            ;                                        4082
  6162.     JRST    L.241
  6163.     MOVEI    AC14,15                ;                                        4083
  6164.     JRST    L.248                ;                                        4012
  6165. L.241:    CAIE    AC16,121            ;                                        4085
  6166.     JRST    L.242
  6167.     MOVEI    AC14,16                ;                                        4086
  6168.     JRST    L.248                ;                                        4012
  6169. L.242:    CAIE    AC16,120            ;                                        4088
  6170.     JRST    L.243
  6171.     MOVEI    AC14,23                ;                                        4089
  6172.     JRST    L.248                ;                                        4012
  6173. L.243:    CAIE    AC16,112            ;                                        4091
  6174.     JRST    L.244
  6175.     MOVEI    AC14,21                ;                                        4092
  6176.     JRST    L.248                ;                                        4012
  6177. L.244:    CAIE    AC16,126            ;                                        4094
  6178.     JRST    L.245
  6179.     MOVEI    AC14,22                ;                                        4095
  6180.     JRST    L.248                ;                                        4012
  6181. L.245:    PUSH    SP,C.13                ;                                        4102
  6182. L.246:    PUSHJ    SP,KRM%ERROR
  6183.     ADJSP    SP,-4                ;                                        4103
  6184. L.247:    MOVEI    AC1,12                ;                                        4101
  6185.     JRST    L.249
  6186. L.248:    MOVEM    AC14,0(SP)            ;                                        4111
  6187.     PUSHJ    SP,U.17
  6188.     ADJSP    SP,-3
  6189. L.249:    ADJSP    SP,-312                ;                                        3879
  6190.     POP    SP,AC16
  6191.     POP    SP,AC14
  6192.     POPJ    SP,
  6193. C.55:    EXP    1752
  6194. C.56:    POINT    7,GEN%2DATA-1,34
  6195. C.57:    POINT    7,GEN%3DATA-1,34
  6196. C.58:    XWD    0,GEN%1SIZE
  6197. C.59:    XWD    0,GEN%2SIZE
  6198. C.60:    XWD    0,GEN%3SIZE
  6199. C.61:    EXP    107
  6200.  
  6201. ; Routine Size:  191 words
  6202.  
  6203.  
  6204. ;   4113  1    %SBTTL 'HOST%COMMAND - perform a host command'
  6205. ;   4114  1    ROUTINE HOST%COMMAND =
  6206. ;   4115  1    
  6207. ;   4116  1    !++
  6208. ;   4117  1    ! FUNCTIONAL DESCRIPTION:
  6209. ;   4118  1    !
  6210. ;   4119  1    ! This routine will handle the host command packet.
  6211. ;   4120  1    ! It will set up the data for the call to the system routine.
  6212. ;   4121  1    !
  6213. ;   4122  1    ! CALLING SEQUENCE:
  6214. ;   4123  1    !
  6215. ;   4124  1    !    STATE = HOST%COMMAND();
  6216. ;   4125  1    !
  6217. ;   4126  1    ! INPUT PARAMETERS:
  6218. ;   4127  1    !
  6219. ;   4128  1    !    None.
  6220. ;   4129  1    !
  6221. ;   4130  1    ! IMPLICIT INPUTS:
  6222. ;   4131  1    !
  6223. ;   4132  1    !    Generic message receive in REC%MSG.
  6224. ;   4133  1    !
  6225. ;   4134  1    ! OUTPUT PARAMETERS:
  6226. ;   4135  1    !
  6227. ;   4136  1    !    Returns new state for FSM
  6228. ;   4137  1    !
  6229. ;   4138  1    ! IMPLICIT OUTPUTS:
  6230. ;   4139  1    !
  6231. ;   4140  1    !    None.
  6232. ;   4141  1    !
  6233. ;   4142  1    ! COMPLETION CODES:
  6234. ;   4143  1    !
  6235. ;   4144  1    !    None.
  6236. ;   4145  1    !
  6237. ;   4146  1    ! SIDE EFFECTS:
  6238. ;   4147  1    !
  6239. ;   4148  1    !    None.
  6240. ;   4149  1    !
  6241. ;   4150  1    !--
  6242. ;   4151  1    
  6243. ;   4152  2        BEGIN
  6244. ;   4153  2        GEN%1SIZE = 0;
  6245. ;   4154  2        GEN%2SIZE = 0;
  6246. ;   4155  2        GEN%3SIZE = 0;
  6247. ;   4156  2    
  6248. ;   4157  2        IF .REC%LENGTH LEQ 0
  6249. ;   4158  2        THEN
  6250. ;   4159  3        BEGIN
  6251. ;   4160  3        KRM%ERROR (KER%PROTOERR);        ! Return an error
  6252. ;   4161  3        RETURN STATE%A;                ! Just abort
  6253. ;   4162  2        END;
  6254. ;   4163  2    
  6255. ;   4164  2        SET%STRING (CH$PTR (GEN%1DATA), MAX%MSG, TRUE);    ! Start writing to buffer
  6256. ;   4165  2        BFR%EMPTY ();                ! Dump the text
  6257. ;   4166  2        GEN%1SIZE = SET%STRING (0, 0, FALSE);    ! Get the result
  6258. ;   4167  2        RETURN CALL%SY%RTN (GC%COMMAND);
  6259. ;   4168  1        END;                    ! End of HOST%COMMAND
  6260.  
  6261.  
  6262. ; HOST%COMMAND
  6263. U.15:    SETZM    GEN%1SIZE            ;                                        4153
  6264.     SETZM    GEN%2SIZE            ;                                        4154
  6265.     SETZM    GEN%3SIZE            ;                                        4155
  6266.     SKIPLE    U.57                ;                                        4157
  6267.     JRST    L.250
  6268.     PUSH    SP,C.21                ;                                        4160
  6269.     PUSHJ    SP,KRM%ERROR
  6270.     ADJSP    SP,-1                ;                                        4161
  6271.     MOVEI    AC1,12                ;                                        4159
  6272.     POPJ    SP,
  6273. L.250:    PUSH    SP,C.11                ;                                        4164
  6274.     PUSH    SP,C.55
  6275.     PUSH    SP,C.2
  6276.     PUSHJ    SP,U.30
  6277.     PUSHJ    SP,U.28                ;                                        4165
  6278.     SETZM    -2(SP)                ;                                        4166
  6279.     SETZM    -1(SP)
  6280.     SETZM    0(SP)
  6281.     PUSHJ    SP,U.30
  6282.     MOVEM    AC1,GEN%1SIZE
  6283.     PUSH    SP,C.62                ;                                        4167
  6284.     PUSHJ    SP,U.17
  6285.     ADJSP    SP,-4
  6286.     POPJ    SP,                ;                                        4114
  6287. C.62:    EXP    17
  6288.  
  6289. ; Routine Size:  25 words
  6290.  
  6291.  
  6292. ;   4169  1    %SBTTL 'KERMIT%COMMAND - perform a KERMIT command'
  6293. ;   4170  1    ROUTINE KERMIT%COMMAND =
  6294. ;   4171  1    
  6295. ;   4172  1    !++
  6296. ;   4173  1    ! FUNCTIONAL DESCRIPTION:
  6297. ;   4174  1    !
  6298. ;   4175  1    ! This routine will handle the KERMIT command packet.
  6299. ;   4176  1    ! It will set up the data for the call to the system routine.
  6300. ;   4177  1    !
  6301. ;   4178  1    ! CALLING SEQUENCE:
  6302. ;   4179  1    !
  6303. ;   4180  1    !    STATE = KERMIT%COMMAND();
  6304. ;   4181  1    !
  6305. ;   4182  1    ! INPUT PARAMETERS:
  6306. ;   4183  1    !
  6307. ;   4184  1    !    None.
  6308. ;   4185  1    !
  6309. ;   4186  1    ! IMPLICIT INPUTS:
  6310. ;   4187  1    !
  6311. ;   4188  1    !    Generic message receive in REC%MSG.
  6312. ;   4189  1    !
  6313. ;   4190  1    ! OUTPUT PARAMETERS:
  6314. ;   4191  1    !
  6315. ;   4192  1    !    Returns new state for FSM
  6316. ;   4193  1    !
  6317. ;   4194  1    ! IMPLICIT OUTPUTS:
  6318. ;   4195  1    !
  6319. ;   4196  1    !    None.
  6320. ;   4197  1    !
  6321. ;   4198  1    ! COMPLETION CODES:
  6322. ;   4199  1    !
  6323. ;   4200  1    !    None.
  6324. ;   4201  1    !
  6325. ;   4202  1    ! SIDE EFFECTS:
  6326. ;   4203  1    !
  6327. ;   4204  1    !    None.
  6328. ;   4205  1    !
  6329. ;   4206  1    !--
  6330. ;   4207  1    
  6331. ;   4208  2        BEGIN
  6332. ;   4209  2        GEN%1SIZE = 0;
  6333. ;   4210  2        GEN%2SIZE = 0;
  6334. ;   4211  2        GEN%3SIZE = 0;
  6335. ;   4212  2    
  6336. ;   4213  2        IF .REC%LENGTH LEQ 0
  6337. ;   4214  2        THEN
  6338. ;   4215  3        BEGIN
  6339. ;   4216  3        KRM%ERROR (KER%PROTOERR);        ! Return an error
  6340. ;   4217  3        RETURN STATE%A;                ! Just abort
  6341. ;   4218  2        END;
  6342. ;   4219  2    
  6343. ;   4220  2        SET%STRING (CH$PTR (GEN%1DATA), MAX%MSG, TRUE);    ! Start writing to buffer
  6344. ;   4221  2        BFR%EMPTY ();                ! Dump the text
  6345. ;   4222  2        GEN%1SIZE = SET%STRING (0, 0, FALSE);    ! Get the result
  6346. ;   4223  2        RETURN CALL%SY%RTN (GC%KERMIT);
  6347. ;   4224  1        END;                    ! End of KERMIT%COMMAND
  6348.  
  6349.  
  6350. ; KERMIT%COMMAND
  6351. U.16:    SETZM    GEN%1SIZE            ;                                        4209
  6352.     SETZM    GEN%2SIZE            ;                                        4210
  6353.     SETZM    GEN%3SIZE            ;                                        4211
  6354.     SKIPLE    U.57                ;                                        4213
  6355.     JRST    L.251
  6356.     PUSH    SP,C.21                ;                                        4216
  6357.     PUSHJ    SP,KRM%ERROR
  6358.     ADJSP    SP,-1                ;                                        4217
  6359.     MOVEI    AC1,12                ;                                        4215
  6360.     POPJ    SP,
  6361. L.251:    PUSH    SP,C.11                ;                                        4220
  6362.     PUSH    SP,C.55
  6363.     PUSH    SP,C.2
  6364.     PUSHJ    SP,U.30
  6365.     PUSHJ    SP,U.28                ;                                        4221
  6366.     SETZM    -2(SP)                ;                                        4222
  6367.     SETZM    -1(SP)
  6368.     SETZM    0(SP)
  6369.     PUSHJ    SP,U.30
  6370.     MOVEM    AC1,GEN%1SIZE
  6371.     PUSH    SP,C.63                ;                                        4223
  6372.     PUSHJ    SP,U.17
  6373.     ADJSP    SP,-4
  6374.     POPJ    SP,                ;                                        4170
  6375. C.63:    EXP    20
  6376.  
  6377. ; Routine Size:  25 words
  6378.  
  6379.  
  6380. ;   4225  1    %SBTTL 'CALL%SY%RTN - handle operating system dependent functions'
  6381. ;   4226  1    ROUTINE CALL%SY%RTN (G%FUNC) =
  6382. ;   4227  1    
  6383. ;   4228  1    !++
  6384. ;   4229  1    ! FUNCTIONAL DESCRIPTION:
  6385. ;   4230  1    !
  6386. ;   4231  1    ! This routine will handle calling the operating system dependent routine
  6387. ;   4232  1    ! for a server function and returning the response.
  6388. ;   4233  1    !
  6389. ;   4234  1    ! CALLING SEQUENCE:
  6390. ;   4235  1    !
  6391. ;   4236  1    !    STATE = CALL%SY%RTN(.G%FUNC);
  6392. ;   4237  1    !
  6393. ;   4238  1    ! INPUT PARAMETERS:
  6394. ;   4239  1    !
  6395. ;   4240  1    !    G%FUNC - Generic function code
  6396. ;   4241  1    !
  6397. ;   4242  1    ! IMPLICIT INPUTS:
  6398. ;   4243  1    !
  6399. ;   4244  1    !    Generic message data in GEN%1DATA
  6400. ;   4245  1    !
  6401. ;   4246  1    ! OUTPUT PARAMETERS:
  6402. ;   4247  1    !
  6403. ;   4248  1    !    Returns new state for FSM
  6404. ;   4249  1    !
  6405. ;   4250  1    ! IMPLICIT OUTPUTS:
  6406. ;   4251  1    !
  6407. ;   4252  1    !    None.
  6408. ;   4253  1    !
  6409. ;   4254  1    ! COMPLETION CODES:
  6410. ;   4255  1    !
  6411. ;   4256  1    !    None.
  6412. ;   4257  1    !
  6413. ;   4258  1    ! SIDE EFFECTS:
  6414. ;   4259  1    !
  6415. ;   4260  1    !    None.
  6416. ;   4261  1    !
  6417. ;   4262  1    !--
  6418. ;   4263  1    
  6419. ;   4264  2        BEGIN
  6420. ;   4265  2    
  6421. ;   4266  2        LOCAL
  6422. ;   4267  2        STRING%ADDRESS,                ! Address of string result
  6423. ;   4268  2        STRING%LENGTH,                ! Length of string result
  6424. ;   4269  2        GET%CHR%SUBROUTINE,            ! Routine to get a response character
  6425. ;   4270  2        STATUS;                    ! Status value
  6426. ;   4271  2    
  6427. ;   4272  2    !
  6428. ;   4273  2    ! Call the routine with the desired type of command.
  6429. ;   4274  2    !
  6430. ;   4275  2        STRING%LENGTH = 0;                ! Initialize for no string
  6431. ;   4276  2        GET%CHR%SUBROUTINE = 0;            ! And no subroutine
  6432. ;   4277  2    
  6433. ;   4278  2        IF NOT SY%GENERIC (.G%FUNC, STRING%ADDRESS, STRING%LENGTH,
  6434. ;   4279  2     GET%CHR%SUBROUTINE)
  6435. ;   4280  2        THEN
  6436. ;   4281  2        RETURN STATE%A;                ! And abort
  6437. ;   4282  2    
  6438. ;   4283  2        IF .STRING%LENGTH GTR 0
  6439. ;   4284  2        THEN
  6440. ;   4285  3        BEGIN
  6441. ;   4286  3        SET%STRING (CH$PTR (.STRING%ADDRESS), .STRING%LENGTH, TRUE);
  6442. ;   4287  3    
  6443. ;   4288  3        IF .STRING%LENGTH LSS .SEND%PKT%SIZE - PKT%OVR%HEAD
  6444. ;   4289  3        THEN
  6445. ;   4290  4            BEGIN
  6446. ;   4291  4            BFR%FILL (TRUE);            ! If it should fit, pack it in
  6447. ;   4292  4    
  6448. ;   4293  4            IF SET%STRING (0, 0, FALSE) GEQ .STRING%LENGTH
  6449. ;   4294  4            THEN                 ! It fit, so just send the ACK
  6450. ;   4295  4    
  6451. ;   4296  4            IF SEND%PACKET (MSG%ACK, .SIZE, .REC%SEQ) THEN RETURN STATE%C ELSE RETURN
  6452. ;   4297  4     STATE%EX;
  6453. ;   4298  4    
  6454. ;   4299  4    !
  6455. ;   4300  4    ! It didn't fit, reset the pointers to the beginning
  6456. ;   4301  4    !
  6457. ;   4302  4            SET%STRING (CH$PTR (.STRING%ADDRESS), .STRING%LENGTH, TRUE);
  6458. ;   4303  3            END;
  6459. ;   4304  3    
  6460. ;   4305  3        NO%FILE%NEEDED = TRUE;            ! Don't need a file
  6461. ;   4306  3        END
  6462. ;   4307  2        ELSE
  6463. ;   4308  2    
  6464. ;   4309  2        IF .GET%CHR%SUBROUTINE NEQ 0        ! If we got a subroutine back
  6465. ;   4310  2        THEN
  6466. ;   4311  3            BEGIN
  6467. ;   4312  3            GET%CHR%ROUTINE = .GET%CHR%SUBROUTINE;
  6468. ;   4313  3            NO%FILE%NEEDED = TRUE;
  6469. ;   4314  2            END;
  6470. ;   4315  2    
  6471. ;   4316  2        TEXT%HEAD%FLAG = TRUE;            ! Send to be typed
  6472. ;   4317  2        XFR%STATUS (%C'I', %C'G');            ! Doing a generic command
  6473. ;   4318  2    
  6474. ;   4319  2        IF .STATE EQL STATE%II AND .BLK%CHK%TYPE EQL .INI%CHK%TYPE
  6475. ;   4320  2        THEN
  6476. ;   4321  2        RETURN STATE%OF
  6477. ;   4322  2        ELSE
  6478. ;   4323  2        RETURN STATE%S;                ! Send the response
  6479. ;   4324  2    
  6480. ;   4325  1        END;                    ! End of CALL%SY%RTN
  6481.  
  6482.  
  6483. ; CALL%SY%RTN
  6484. U.17:    PUSH    SP,AC14                ;                                        4226
  6485.     PUSH    SP,AC16
  6486.     ADJSP    SP,3
  6487.     SETZM    -1(SP)                ;                                        4275
  6488.     SETZM    -2(SP)                ;                                        4276
  6489.     PUSH    SP,-6(SP)            ;                                        4278
  6490.     MOVEI    AC1,-1(SP)
  6491.     PUSH    SP,AC1
  6492.     MOVEI    AC1,-3(SP)
  6493.     PUSH    SP,AC1
  6494.     MOVEI    AC1,-5(SP)
  6495.     PUSH    SP,AC1
  6496.     PUSHJ    SP,SY%GENERIC
  6497.     ADJSP    SP,-4
  6498.     TRNE    AC1,1
  6499.     JRST    L.252
  6500.     MOVEI    AC1,12                ;                                        4281
  6501.     JRST    L.261
  6502. L.252:    MOVE    AC14,-1(SP)            ;                                        4283
  6503.     JUMPLE    AC14,L.257
  6504.     MOVE    AC16,0(SP)            ;                                        4286
  6505.     MOVEI    AC1,-1(AC16)
  6506.     HRLI    AC1,10700
  6507.     PUSH    SP,AC1
  6508.     PUSH    SP,AC14
  6509.     PUSH    SP,C.2
  6510.     PUSHJ    SP,U.30
  6511.     MOVE    AC1,U.40            ;                                        4288
  6512.     SUBI    AC1,3
  6513.     CAML    AC14,AC1
  6514.     JRST    L.256
  6515.     PUSH    SP,C.2                ;                                        4291
  6516.     PUSHJ    SP,U.29
  6517.     SETZM    -2(SP)                ;                                        4293
  6518.     SETZM    -1(SP)
  6519.     SETZM    0(SP)
  6520.     PUSHJ    SP,U.30
  6521.     CAMGE    AC1,AC14
  6522.     JRST    L.255
  6523.     PUSH    SP,C.20                ;                                        4296
  6524.     PUSH    SP,U.52
  6525.     PUSH    SP,U.56
  6526.     PUSHJ    SP,U.24
  6527.     ADJSP    SP,-3
  6528.     TRNN    AC1,1
  6529.     JRST    L.253
  6530.     MOVEI    AC1,11
  6531.     JRST    L.254
  6532. L.253:    MOVEI    AC1,23
  6533. L.254:    ADJSP    SP,-4
  6534.     JRST    L.261
  6535. L.255:    MOVEI    AC1,-1(AC16)            ;                                        4302
  6536.     HRLI    AC1,10700
  6537.     PUSH    SP,AC1
  6538.     PUSH    SP,AC14
  6539.     PUSH    SP,C.2
  6540.     PUSHJ    SP,U.30
  6541.     ADJSP    SP,-4                ;                                        4290
  6542. L.256:    MOVEI    AC1,1                ;                                        4305
  6543.     MOVEM    AC1,U.63
  6544.     ADJSP    SP,-3                ;                                        4285
  6545.     JRST    L.258                ;                                        4283
  6546. L.257:    MOVE    AC1,-2(SP)            ;                                        4309
  6547.     JUMPE    AC1,L.258
  6548.     MOVEM    AC1,U.67            ;                                        4312
  6549.     MOVEI    AC1,1                ;                                        4313
  6550.     MOVEM    AC1,U.63
  6551. L.258:    MOVEI    AC1,1                ;                                        4316
  6552.     MOVEM    AC1,U.62
  6553.     PUSH    SP,C.6                ;                                        4317
  6554.     PUSH    SP,C.61
  6555.     PUSHJ    SP,XFR%STATUS
  6556.     MOVEI    AC1,17                ;                                        4319
  6557.     CAME    AC1,U.51
  6558.     JRST    L.259
  6559.     MOVE    AC1,U.48
  6560.     CAME    AC1,U.47
  6561.     JRST    L.259
  6562.     MOVEI    AC1,22                ;                                        4323
  6563.     JRST    L.260
  6564. L.259:    MOVEI    AC1,1
  6565. L.260:    ADJSP    SP,-2                ;                                        4319
  6566. L.261:    ADJSP    SP,-3                ;                                        4226
  6567.     POP    SP,AC16
  6568.     POP    SP,AC14
  6569.     POPJ    SP,
  6570.  
  6571. ; Routine Size:  86 words
  6572.  
  6573.  
  6574. ;   4326  1    %SBTTL 'Message processing -- PRS%SEND%INIT - Parse send init params'
  6575. ;   4327  1    ROUTINE PRS%SEND%INIT =
  6576. ;   4328  1    
  6577. ;   4329  1    !++
  6578. ;   4330  1    ! FUNCTIONAL DESCRIPTION:
  6579. ;   4331  1    !
  6580. ;   4332  1    !    This routine will parse the SEND%INIT parameters that were sent by
  6581. ;   4333  1    !    the remote Kermit.  The items will be stored into the low segment.
  6582. ;   4334  1    !
  6583. ;   4335  1    ! CALLING SEQUENCE:
  6584. ;   4336  1    !
  6585. ;   4337  1    !    PRS%SEND%INIT ();
  6586. ;   4338  1    !
  6587. ;   4339  1    ! INPUT PARAMETERS:
  6588. ;   4340  1    !
  6589. ;   4341  1    !    None.
  6590. ;   4342  1    !
  6591. ;   4343  1    ! IMPLICIT INPUTS:
  6592. ;   4344  1    !
  6593. ;   4345  1    !    Message stored in REC%MSG.
  6594. ;   4346  1    !
  6595. ;   4347  1    ! OUTPUT PARAMETERS:
  6596. ;   4348  1    !
  6597. ;   4349  1    !    None.
  6598. ;   4350  1    !
  6599. ;   4351  1    ! IMPLICIT OUTPUTS:
  6600. ;   4352  1    !
  6601. ;   4353  1    !    None.
  6602. ;   4354  1    !
  6603. ;   4355  1    ! COMPLETION CODES:
  6604. ;   4356  1    !
  6605. ;   4357  1    !    None.
  6606. ;   4358  1    !
  6607. ;   4359  1    ! SIDE EFFECTS:
  6608. ;   4360  1    !
  6609. ;   4361  1    !    None.
  6610. ;   4362  1    !
  6611. ;   4363  1    !--
  6612. ;   4364  1    
  6613. ;   4365  2        BEGIN
  6614. ;   4366  2    ! The following section of code will parse the various send parameters
  6615. ;   4367  2    ! that are found in the send-init message.  The following code will store
  6616. ;   4368  2    ! the following as the value.
  6617. ;   4369  2    !
  6618. ;   4370  2    ! If the user specified a value then the user supplied value will be used else
  6619. ;   4371  2    ! the value in the message and if none in the message then the default value.
  6620. ;   4372  2    !
  6621. ;   4373  2    ! User supplied values are denoted as positive values in SND%xxxxxxx.
  6622. ;   4374  2    !
  6623. ;   4375  2    ! Parse the packet size
  6624. ;   4376  2    !
  6625. ;   4377  3        SEND%PKT%SIZE = (IF .SND%PKT%SIZE GEQ 0 THEN        ! [108]
  6626. ;   4378  3          (IF .SND%PKT%SIZE GTR 94 THEN 94 ELSE .SND%PKT%SIZE) ELSE    ! [108]
  6627. ;   4379  4        BEGIN
  6628. ;   4380  4    
  6629. ;   4381  4        IF .REC%LENGTH GTR P%SI%BUFSIZ
  6630. ;   4382  4        THEN
  6631. ; P 4383  4            UNCHAR (CH$RCHAR (CH$PTR (REC%MSG,
  6632. ;   4384  5                .RECV%PKT%MSG + P%SI%BUFSIZ, CHR%SIZE))) ! [108]
  6633. ;   4385  4        ELSE
  6634. ;   4386  4            ABS (.SND%PKT%SIZE)
  6635. ;   4387  4    
  6636. ;   4388  4        END
  6637. ;   4389  2        );
  6638. ;   4390  2    !
  6639. ;   4391  2    ! Parse the time out value
  6640. ;   4392  2    !
  6641. ;   4393  3        SEND%TIMEOUT = (IF .SND%TIMEOUT GEQ 0 THEN .SND%TIMEOUT ELSE
  6642. ;   4394  4        BEGIN
  6643. ;   4395  4    
  6644. ;   4396  4        IF .REC%LENGTH GTR P%SI%TIMOUT
  6645. ;   4397  4        THEN
  6646. ; P 4398  4            UNCHAR (CH$RCHAR (CH$PTR (REC%MSG,
  6647. ;   4399  5                .RECV%PKT%MSG + P%SI%TIMOUT, CHR%SIZE))) ! [108]
  6648. ;   4400  4        ELSE
  6649. ;   4401  4            ABS (.SND%TIMEOUT)
  6650. ;   4402  4    
  6651. ;   4403  4        END
  6652. ;   4404  2        );
  6653. ;   4405  2    !
  6654. ;   4406  2    ! Parse the number of padding characters supplied
  6655. ;   4407  2    !
  6656. ;   4408  3        SEND%NPAD = (IF .SND%NPAD GEQ 0 THEN .SND%NPAD ELSE
  6657. ;   4409  4        BEGIN
  6658. ;   4410  4    
  6659. ;   4411  4        IF .REC%LENGTH GTR P%SI%NPAD
  6660. ;   4412  4        THEN
  6661. ; P 4413  4            UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%NPAD,
  6662. ;   4414  5                CHR%SIZE)))                       ! [108]
  6663. ;   4415  4        ELSE
  6664. ;   4416  4            ABS (.SND%NPAD)
  6665. ;   4417  4    
  6666. ;   4418  4        END
  6667. ;   4419  2        );
  6668. ;   4420  2    !
  6669. ;   4421  2    ! Parse the padding character
  6670. ;   4422  2    !
  6671. ;   4423  3        SEND%PADCHAR = (IF .SND%PADCHAR GEQ 0 THEN .SND%PADCHAR ELSE
  6672. ;   4424  4        BEGIN
  6673. ;   4425  4    
  6674. ;   4426  4        IF .REC%LENGTH GTR P%SI%PAD
  6675. ;   4427  4        THEN
  6676. ; P 4428  4            CTL (CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%PAD,
  6677. ;   4429  5                CHR%SIZE)))                       ! [108]
  6678. ;   4430  4        ELSE
  6679. ;   4431  4            ABS (.SND%PADCHAR)
  6680. ;   4432  4    
  6681. ;   4433  4        END
  6682. ;   4434  2        );
  6683. ;   4435  2    !
  6684. ;   4436  2    ! Parse the end of line character
  6685. ;   4437  2    !
  6686. ;   4438  3        SEND%EOL = (IF .SND%EOL GEQ 0 THEN .SND%EOL ELSE
  6687. ;   4439  4        BEGIN
  6688. ;   4440  4    
  6689. ;   4441  4        IF .REC%LENGTH GTR P%SI%EOL
  6690. ;   4442  4        THEN
  6691. ; P 4443  4            UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%EOL,
  6692. ;   4444  5                CHR%SIZE)))                       ! [108]
  6693. ;   4445  4        ELSE
  6694. ;   4446  4            ABS (.SND%EOL)
  6695. ;   4447  4    
  6696. ;   4448  4        END
  6697. ;   4449  2        );
  6698. ;   4450  2    !
  6699. ;   4451  2    ! Parse the quoting character
  6700. ;   4452  2    !
  6701. ;   4453  3        SEND%QUOTE%CHR = (IF .SND%QUOTE%CHR GEQ 0 THEN .SND%QUOTE%CHR ELSE
  6702. ;   4454  4        BEGIN
  6703. ;   4455  4    
  6704. ;   4456  4        IF .REC%LENGTH GTR P%SI%QUOTE
  6705. ;   4457  4        THEN
  6706. ;   4458  4            CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%QUOTE,     ! [108]
  6707. ;   4459  4                CHR%SIZE))
  6708. ;   4460  4        ELSE
  6709. ;   4461  4            ABS (.SND%QUOTE%CHR)
  6710. ;   4462  4    
  6711. ;   4463  4        END
  6712. ;   4464  2        );
  6713. ;   4465  2    !
  6714. ;   4466  2    ! Parse the 8-bit quoting character
  6715. ;   4467  2    !
  6716. ;   4468  2    ! If the character was not included in the packet, assume no eight-bit
  6717. ;   4469  2    ! quoting allowed (we are probably talking to an old version of Kermit).
  6718. ;   4470  2    !
  6719. ;   4471  3        SEND%8QUOTE%CHR = (IF .REC%LENGTH GTR P%SI%8QUOTE THEN CH$RCHAR (CH$PTR
  6720. ;   4472  3    (REC%MSG,
  6721. ;   4473  3            .RECV%PKT%MSG + P%SI%8QUOTE, CHR%SIZE)) ELSE %C'N' ! [108] ! Assume no 8-bit quoting allowed
  6722. ;   4474  2        );
  6723. ;   4475  2    !
  6724. ;   4476  2    ! Parse the checksum type
  6725. ;   4477  2    !
  6726. ;   4478  2    
  6727. ;   4479  2        IF .REC%LENGTH GTR P%SI%CHKTYPE
  6728. ;   4480  2        THEN
  6729. ;   4481  3        BEGIN
  6730. ;   4482  3    
  6731. ;   4483  3        LOCAL
  6732. ;   4484  3            REQ%CHK%TYPE;
  6733. ;   4485  3    
  6734. ;   4486  3        REQ%CHK%TYPE = CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG +      ! [108]
  6735. ;   4487  3                        P%SI%CHKTYPE, CHR%SIZE));
  6736. ;   4488  3    
  6737. ;   4489  3        IF .REC%TYPE NEQ MSG%ACK
  6738. ;   4490  3        THEN
  6739. ;   4491  3    
  6740. ;   4492  3            IF .REQ%CHK%TYPE GEQ CHK%1CHAR AND .REQ%CHK%TYPE LEQ CHK%CRC
  6741. ;   4493  3            THEN
  6742. ;   4494  3            INI%CHK%TYPE = .REQ%CHK%TYPE
  6743. ;   4495  3            ELSE
  6744. ;   4496  3            INI%CHK%TYPE = CHK%1CHAR
  6745. ;   4497  3    
  6746. ;   4498  3        ELSE
  6747. ;   4499  3    
  6748. ;   4500  3            IF .REQ%CHK%TYPE NEQ .CHKTYPE
  6749. ;   4501  3            THEN
  6750. ;   4502  3            INI%CHK%TYPE = CHK%1CHAR
  6751. ;   4503  3            ELSE
  6752. ;   4504  3            INI%CHK%TYPE = .REQ%CHK%TYPE
  6753. ;   4505  3    
  6754. ;   4506  3        END
  6755. ;   4507  2        ELSE
  6756. ;   4508  2        INI%CHK%TYPE = CHK%1CHAR;        ! Only single character checksum if not specified
  6757. ;   4509  2    
  6758. ;   4510  2    !
  6759. ;   4511  2    ! Parse the repeat character
  6760. ;   4512  2    !
  6761. ;   4513  3        REPT%CHR = (IF .REC%LENGTH GTR P%SI%REPEAT THEN CH$RCHAR (CH$PTR (REC%MSG,
  6762. ;   4514  2            .RECV%PKT%MSG + P%SI%REPEAT, CHR%SIZE)) ELSE %C' ');   ! [108]
  6763. ;   4515  2    !                                       ! [108]
  6764. ;   4516  2    ! Parse the capas field, if present and if we enabled extended length  ! [108]
  6765. ;   4517  2    !                                       ! [108]
  6766. ;   4518  2                                           ! [108]
  6767. ;   4519  3        IF (.REC%LENGTH GTR P%SI%CAPAS) AND (ABS(.SND%PKT%SIZE) GTR 94)    ! [108]
  6768. ;   4520  2        THEN                                   ! [108]
  6769. ;   4521  3        BEGIN                                   ! [108]
  6770. ;   4522  3                                           ! [108]
  6771. ;   4523  3        LOCAL                                   ! [108]
  6772. ;   4524  3            CAPAS%OFFSET;                           ! [108]
  6773. ;   4525  3                                           ! [108]
  6774. ;   4526  3        CAPAS%OFFSET = .RECV%PKT%MSG + P%SI%CAPAS;               ! [108]
  6775. ;   4527  3    
  6776. ;   4528  3        IF (UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .CAPAS%OFFSET, CHR%SIZE))) AND 2) NEQ 0
  6777. ;   4529  3        THEN                                   ! [108]
  6778. ;   4530  4            BEGIN                               ! [108]
  6779. ;   4531  4                                           ! [108]
  6780. ;   4532  4            SEND%PKT%SIZE = 500;                       ! [108]
  6781. ;   4533  4                                           ! [108]
  6782. ;   4534  4            WHILE (.REC%LENGTH GTR .CAPAS%OFFSET-.RECV%PKT%MSG) AND    ! [108]
  6783. ; P 4535  6              ((UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .CAPAS%OFFSET,  ! [108]
  6784. ;   4536  4                            CHR%SIZE))) AND 1) EQL 1) DO   ! [108]
  6785. ;   4537  5            BEGIN                               ! [108]
  6786. ;   4538  5            CAPAS%OFFSET = .CAPAS%OFFSET + 1;               ! [108]
  6787. ;   4539  4            END;                               ! [108]
  6788. ;   4540  4            IF .REC%LENGTH GTR .CAPAS%OFFSET-.RECV%PKT%MSG+3           ! [108]
  6789. ;   4541  4            THEN                               ! [108]
  6790. ; P 4542  4            SEND%PKT%SIZE = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG,     ! [108]
  6791. ;   4543  4                        .CAPAS%OFFSET+2, CHR%SIZE))) * 95 +
  6792. ; P 4544  4                    UNCHAR (CH$RCHAR (CH$PTR (REC%MSG,     ! [108]
  6793. ;   4545  4                        .CAPAS%OFFSET+3, CHR%SIZE)));  ! [108]
  6794. ;   4546  4            IF .SEND%PKT%SIZE GTR MAX%MSG - 2                   ! [108]
  6795. ;   4547  4            THEN                               ! [108]
  6796. ;   4548  4            SEND%PKT%SIZE = MAX%MSG - 2;                   ! [108]
  6797. ;   4549  4            IF .SEND%PKT%SIZE GTR ABS(.SND%PKT%SIZE)               ! [108]
  6798. ;   4550  4            THEN                               ! [108]
  6799. ;   4551  4            SEND%PKT%SIZE = ABS(.SND%PKT%SIZE);               ! [108]
  6800. ;   4552  3            END;                               ! [108]
  6801. ;   4553  2        END;                                   ! [108]
  6802. ;   4554  2    !
  6803. ;   4555  2    ! Check for a valid quoting character.  If it is not valid, then we have
  6804. ;   4556  2    ! a protocol error
  6805. ;   4557  2    !
  6806. ;   4558  2    
  6807. ;   4559  3        IF NOT ((.SEND%QUOTE%CHR GEQ %O'41' AND .SEND%QUOTE%CHR LEQ %O'76') OR
  6808. ;   4560  4    (.SEND%QUOTE%CHR GEQ %O
  6809. ;   4561  3        '140' AND .SEND%QUOTE%CHR LEQ %O'176'))
  6810. ;   4562  2        THEN
  6811. ;   4563  3        BEGIN
  6812. ;   4564  3        KRM%ERROR (KER%PROTOERR);
  6813. ;   4565  3        RETURN KER%PROTOERR;
  6814. ;   4566  2        END;
  6815. ;   4567  2    
  6816. ;   4568  2    !
  6817. ;   4569  2    ! Check for a valid 8 bit quoting and set the 8 bit quoting flag as needed
  6818. ;   4570  2    !
  6819. ;   4571  2    
  6820. ;   4572  4        IF ( NOT ((.SEND%8QUOTE%CHR GEQ %O'041' AND .SEND%8QUOTE%CHR LEQ %O'076') OR
  6821. ;   4573  5     (.SEND%8QUOTE%CHR
  6822. ;   4574  5        GEQ %O'140' AND .SEND%8QUOTE%CHR LEQ %O'176') OR (.SEND%8QUOTE%CHR EQL %C'N')
  6823. ;   4575  5     OR (
  6824. ;   4576  2        .SEND%8QUOTE%CHR EQL %C'Y'))) OR .SEND%8QUOTE%CHR EQL .SEND%QUOTE%CHR OR
  6825. ;   4577  2     .SEND%8QUOTE%CHR
  6826. ;   4578  2        EQL .RCV%QUOTE%CHR
  6827. ;   4579  2        THEN
  6828. ;   4580  3        BEGIN
  6829. ;   4581  3        KRM%ERROR (KER%PROTOERR);
  6830. ;   4582  3        RETURN KER%PROTOERR;
  6831. ;   4583  2        END;
  6832. ;   4584  2    
  6833. ;   4585  2        IF .SEND%8QUOTE%CHR EQL %C'Y' THEN SEND%8QUOTE%CHR = .RECV%8QUOTE%CHR;
  6834. ;   4586  2    
  6835. ;   4587  2        IF .SEND%8QUOTE%CHR NEQ %C'N' AND .SEND%8QUOTE%CHR NEQ %C'Y'
  6836. ;   4588  2        THEN
  6837. ;   4589  2        FLAG%8QUOTE = TRUE
  6838. ;   4590  2        ELSE
  6839. ;   4591  2        FLAG%8QUOTE = FALSE;
  6840. ;   4592  2    
  6841. ;   4593  2    !
  6842. ;   4594  2    ! Check the repeat character and set flags
  6843. ;   4595  2    !
  6844. ;   4596  2    
  6845. ;   4597  5        IF ( NOT ((.REPT%CHR GEQ %O'41' AND .REPT%CHR LEQ %O'76') OR (.REPT%CHR GEQ
  6846. ;   4598  5     %O'140' AND
  6847. ;   4599  3        .REPT%CHR LEQ %O'176')) OR .REPT%CHR EQL .SEND%QUOTE%CHR OR .REPT%CHR EQL
  6848. ;   4600  3     .SEND%8QUOTE%CHR
  6849. ;   4601  2        OR .REPT%CHR EQL .RCV%QUOTE%CHR) AND .REPT%CHR NEQ %C' '
  6850. ;   4602  2        THEN
  6851. ;   4603  3        BEGIN
  6852. ;   4604  3        KRM%ERROR (KER%PROTOERR);
  6853. ;   4605  3        RETURN KER%PROTOERR;
  6854. ;   4606  2        END;
  6855. ;   4607  2    
  6856. ;   4608  2        IF .REPT%CHR NEQ %C' ' THEN FLAG%REPEAT = TRUE ELSE FLAG%REPEAT = FALSE;
  6857. ;   4609  2    
  6858. ;   4610  2        RETURN KER%NORMAL;
  6859. ;   4611  1        END;                    ! End of PRS%SEND%INIT
  6860.  
  6861.  
  6862. ; PRS%SEND%INIT
  6863. U.21:    MOVE    AC4,SND%PKT%SIZE        ;                                        4377
  6864.     JUMPL    AC4,L.263
  6865.     CAIG    AC4,136                ;                                        4378
  6866.     JRST    L.262
  6867.     MOVEI    AC1,136
  6868.     JRST    L.265
  6869. L.262:    MOVE    AC1,AC4
  6870.     JRST    L.265                ;                                        4377
  6871. L.263:    SKIPG    U.57                ;                                        4381
  6872.     JRST    L.264
  6873.     MOVE    AC2,C.27            ;                                        4384
  6874.     MOVE    AC1,U.39
  6875.     ADJBP    AC1,AC2
  6876.     ILDB    AC1,AC1
  6877.     SUBI    AC1,40
  6878.     JRST    L.265                ;                                        4379
  6879. L.264:    MOVM    AC1,AC4                ;                                        4386
  6880. L.265:    MOVEM    AC1,U.40            ;                                        4377
  6881.     MOVE    AC1,SND%TIMEOUT            ;                                        4393
  6882.     JUMPGE    AC1,L.267
  6883.     MOVEI    AC2,1                ;                                        4396
  6884.     CAML    AC2,U.57
  6885.     JRST    L.266
  6886.     MOVE    AC1,U.39            ;                                        4399
  6887.     ADDI    AC1,1
  6888.     MOVE    AC2,C.27
  6889.     ADJBP    AC1,AC2
  6890.     ILDB    AC1,AC1
  6891.     SUBI    AC1,40
  6892.     JRST    L.267                ;                                        4394
  6893. L.266:    MOVM    AC1,AC1                ;                                        4401
  6894. L.267:    MOVEM    AC1,SEND%TIMEOUT        ;                                        4393
  6895.     MOVE    AC1,SND%NPAD            ;                                        4408
  6896.     JUMPGE    AC1,L.269
  6897.     MOVEI    AC2,2                ;                                        4411
  6898.     CAML    AC2,U.57
  6899.     JRST    L.268
  6900.     MOVE    AC1,U.39            ;                                        4414
  6901.     ADDI    AC1,2
  6902.     MOVE    AC2,C.27
  6903.     ADJBP    AC1,AC2
  6904.     ILDB    AC1,AC1
  6905.     SUBI    AC1,40
  6906.     JRST    L.269                ;                                        4409
  6907. L.268:    MOVM    AC1,AC1                ;                                        4416
  6908. L.269:    MOVEM    AC1,U.41            ;                                        4408
  6909.     MOVE    AC1,SND%PADCHAR            ;                                        4423
  6910.     JUMPGE    AC1,L.271
  6911.     MOVEI    AC2,3                ;                                        4426
  6912.     CAML    AC2,U.57
  6913.     JRST    L.270
  6914.     MOVE    AC1,U.39            ;                                        4429
  6915.     ADDI    AC1,3
  6916.     MOVE    AC2,C.27
  6917.     ADJBP    AC1,AC2
  6918.     ILDB    AC1,AC1
  6919.     TRCA    AC1,100
  6920. L.270:    MOVM    AC1,AC1                ;                                        4431
  6921. L.271:    MOVEM    AC1,U.42            ;                                        4423
  6922.     MOVE    AC1,SND%EOL            ;                                        4438
  6923.     JUMPGE    AC1,L.273
  6924.     MOVEI    AC2,4                ;                                        4441
  6925.     CAML    AC2,U.57
  6926.     JRST    L.272
  6927.     MOVE    AC1,U.39            ;                                        4444
  6928.     ADDI    AC1,4
  6929.     MOVE    AC2,C.27
  6930.     ADJBP    AC1,AC2
  6931.     ILDB    AC1,AC1
  6932.     SUBI    AC1,40
  6933.     JRST    L.273                ;                                        4439
  6934. L.272:    MOVM    AC1,AC1                ;                                        4446
  6935. L.273:    MOVEM    AC1,U.43            ;                                        4438
  6936.     MOVE    AC1,SND%QUOTE%CHR        ;                                        4453
  6937.     JUMPGE    AC1,L.275
  6938.     MOVEI    AC2,5                ;                                        4456
  6939.     CAML    AC2,U.57
  6940.     JRST    L.274
  6941.     MOVE    AC1,U.39            ;                                        4458
  6942.     ADDI    AC1,5
  6943.     MOVE    AC2,C.27
  6944.     ADJBP    AC1,AC2
  6945.     ILDB    AC1,AC1
  6946.     JRST    L.275                ;                                        4454
  6947. L.274:    MOVM    AC1,AC1                ;                                        4461
  6948. L.275:    MOVEM    AC1,U.44            ;                                        4453
  6949.     MOVE    AC3,U.57            ;                                        4471
  6950.     CAIG    AC3,6
  6951.     JRST    L.276
  6952.     MOVE    AC1,U.39            ;                                        4473
  6953.     ADDI    AC1,6
  6954.     MOVE    AC2,C.27
  6955.     ADJBP    AC1,AC2
  6956.     ILDB    AC1,AC1
  6957.     JRST    L.277                ;                                        4471
  6958. L.276:    MOVEI    AC1,116
  6959. L.277:    MOVEM    AC1,U.45
  6960.     CAIG    AC3,7                ;                                        4479
  6961.     JRST    L.280
  6962.     MOVE    AC1,U.39            ;                                        4486
  6963.     ADDI    AC1,7
  6964.     MOVE    AC2,C.27
  6965.     ADJBP    AC1,AC2
  6966.     ILDB    AC1,AC1
  6967.     MOVEI    AC2,131                ;                                        4489
  6968.     CAMN    AC2,U.58
  6969.     JRST    L.278
  6970.     CAIL    AC1,61                ;                                        4492
  6971.     CAILE    AC1,63
  6972.     JRST    L.279
  6973.     JRST    L.281
  6974. L.278:    CAMN    AC1,CHKTYPE            ;                                        4500
  6975.     JRST    L.281
  6976. L.279:    MOVEI    AC2,61                ;                                        4502
  6977.     MOVEM    AC2,U.47
  6978.     JRST    L.282                ;                                        4500
  6979. L.280:    MOVEI    AC1,61                ;                                        4508
  6980. L.281:    MOVEM    AC1,U.47
  6981. L.282:    CAIG    AC3,10                ;                                        4513
  6982.     JRST    L.283
  6983.     MOVE    AC1,U.39            ;                                        4514
  6984.     ADDI    AC1,10
  6985.     MOVE    AC2,C.27
  6986.     ADJBP    AC1,AC2
  6987.     ILDB    AC1,AC1
  6988.     JRST    L.284                ;                                        4513
  6989. L.283:    MOVEI    AC1,40
  6990. L.284:    MOVEM    AC1,U.38
  6991.     CAIG    AC3,11                ;                                        4519
  6992.     JRST    L.289
  6993.     MOVM    AC1,AC4
  6994.     CAIG    AC1,136
  6995.     JRST    L.289
  6996.     MOVE    AC1,U.39            ;                                        4526
  6997.     ADDI    AC1,11
  6998.     MOVE    AC5,C.27            ;                                        4528
  6999.     MOVE    AC2,AC1
  7000.     ADJBP    AC2,AC5
  7001.     ILDB    AC2,AC2
  7002.     SUBI    AC2,40
  7003.     TRNN    AC2,2
  7004.     JRST    L.289
  7005.     MOVEI    AC2,764                ;                                        4532
  7006.     MOVEM    AC2,U.40
  7007. L.285:    MOVE    AC2,AC1                ;                                        4534
  7008.     SUB    AC2,U.39
  7009.     CAMG    AC3,AC2
  7010.     JRST    L.286
  7011.     MOVE    AC5,C.27            ;                                        4536
  7012.     MOVE    AC2,AC1
  7013.     ADJBP    AC2,AC5
  7014.     ILDB    AC2,AC2
  7015.     SUBI    AC2,40
  7016.     TRNE    AC2,1                ;                                        4535
  7017.     AOJA    AC1,L.285            ;                                        4534
  7018. L.286:    MOVE    AC2,AC1                ;                                        4540
  7019.     SUB    AC2,U.39
  7020.     ADDI    AC2,3
  7021.     CAMG    AC3,AC2
  7022.     JRST    L.287
  7023.     MOVE    AC2,AC1                ;                                        4543
  7024.     ADDI    AC2,2
  7025.     MOVE    AC3,C.27
  7026.     ADJBP    AC2,AC3
  7027.     ILDB    AC2,AC2
  7028.     IMULI    AC2,137
  7029.     ADDI    AC1,3                ;                                        4545
  7030.     MOVE    AC3,C.27
  7031.     ADJBP    AC1,AC3
  7032.     ILDB    AC1,AC1
  7033.     ADD    AC2,AC1                ;                                        4543
  7034.     SUBI    AC2,6000
  7035.     MOVEM    AC2,U.40
  7036. L.287:    MOVEI    AC1,1750            ;                                        4546
  7037.     CAML    AC1,U.40
  7038.     JRST    L.288
  7039.     MOVEI    AC1,1750            ;                                        4548
  7040.     MOVEM    AC1,U.40
  7041. L.288:    MOVM    AC1,AC4                ;                                        4549
  7042.     CAMGE    AC1,U.40
  7043.     MOVEM    AC1,U.40            ;                                        4551
  7044. L.289:    MOVE    AC1,U.44            ;                                        4559
  7045.     CAIGE    AC1,41
  7046.     JRST    L.290
  7047.     CAIG    AC1,76
  7048.     JRST    L.291
  7049. L.290:    CAIL    AC1,140                ;                                        4560
  7050.     CAILE    AC1,176                ;                                        4561
  7051.     JRST    L.301                ;                                        4563
  7052. L.291:    MOVE    AC1,U.45            ;                                        4572
  7053.     CAIGE    AC1,41
  7054.     JRST    L.292
  7055.     CAIG    AC1,76
  7056.     JRST    L.294
  7057. L.292:    CAIGE    AC1,140                ;                                        4574
  7058.     JRST    L.293
  7059.     CAIG    AC1,176
  7060.     JRST    L.294
  7061. L.293:    CAIN    AC1,116
  7062.     JRST    L.294
  7063.     CAIE    AC1,131                ;                                        4575
  7064.     JRST    L.301
  7065. L.294:    CAME    AC1,U.44            ;                                        4576
  7066.     CAMN    AC1,RCV%QUOTE%CHR        ;                                        4578
  7067.     JRST    L.301                ;                                        4580
  7068.     MOVEI    AC1,131                ;                                        4585
  7069.     CAME    AC1,U.45
  7070.     JRST    L.295
  7071.     MOVE    AC1,U.37
  7072.     MOVEM    AC1,U.45
  7073. L.295:    MOVE    AC2,U.45            ;                                        4587
  7074.     CAIE    AC2,116
  7075.     CAIN    AC2,131
  7076.     JRST    L.296
  7077.     MOVEI    AC1,1                ;                                        4589
  7078.     MOVEM    AC1,U.49
  7079.     JRST    L.297                ;                                        4587
  7080. L.296:    SETZM    U.49                ;                                        4591
  7081. L.297:    MOVE    AC1,U.38            ;                                        4597
  7082.     CAIGE    AC1,41
  7083.     JRST    L.298
  7084.     CAIG    AC1,76
  7085.     JRST    L.299
  7086. L.298:    CAIL    AC1,140
  7087.     CAILE    AC1,176                ;                                        4599
  7088.     JRST    L.300
  7089. L.299:    CAME    AC1,U.44
  7090.     CAMN    AC1,AC2
  7091.     JRST    L.300
  7092.     CAME    AC1,RCV%QUOTE%CHR        ;                                        4601
  7093.     JRST    L.302
  7094. L.300:    CAIN    AC1,40
  7095.     JRST    L.302
  7096. L.301:    PUSH    SP,C.21                ;                                        4604
  7097.     PUSHJ    SP,KRM%ERROR
  7098.     ADJSP    SP,-1                ;                                        4605
  7099.     MOVEI    AC1,252                ;                                        4603
  7100.     POPJ    SP,
  7101. L.302:    MOVEI    AC1,40                ;                                        4608
  7102.     CAMN    AC1,U.38
  7103.     JRST    L.303
  7104.     MOVEI    AC1,1
  7105.     MOVEM    AC1,U.50
  7106.     JRST    L.304
  7107. L.303:    SETZM    U.50
  7108. L.304:    MOVEI    AC1,13                ;                                        4365
  7109.     POPJ    SP,                ;                                        4327
  7110.  
  7111. ; Routine Size:  247 words
  7112.  
  7113.  
  7114. ;   4612  1    %SBTTL 'SET%SEND%INIT'
  7115. ;   4613  1    ROUTINE SET%SEND%INIT : NOVALUE =
  7116. ;   4614  1    
  7117. ;   4615  1    !++
  7118. ;   4616  1    ! FUNCTIONAL DESCRIPTION:
  7119. ;   4617  1    !
  7120. ;   4618  1    !    This routine will initialize the various parameters for the
  7121. ;   4619  1    !    MSG%SND%INIT message.
  7122. ;   4620  1    !
  7123. ;   4621  1    ! CALLING SEQUENCE:
  7124. ;   4622  1    !
  7125. ;   4623  1    !    SET%SEND%INIT();
  7126. ;   4624  1    !
  7127. ;   4625  1    ! INPUT PARAMETERS:
  7128. ;   4626  1    !
  7129. ;   4627  1    !    None.
  7130. ;   4628  1    !
  7131. ;   4629  1    ! IMPLICIT INPUTS:
  7132. ;   4630  1    !
  7133. ;   4631  1    !    None.
  7134. ;   4632  1    !
  7135. ;   4633  1    ! OUTPUT PARAMETERS:
  7136. ;   4634  1    !
  7137. ;   4635  1    !    None.
  7138. ;   4636  1    !
  7139. ;   4637  1    ! IMPLICIT OUTPUTS:
  7140. ;   4638  1    !
  7141. ;   4639  1    !    SND%MSG parameters set up.
  7142. ;   4640  1    !
  7143. ;   4641  1    ! COMPLETION CODES:
  7144. ;   4642  1    !
  7145. ;   4643  1    !    None.
  7146. ;   4644  1    !
  7147. ;   4645  1    ! SIDE EFFECTS:
  7148. ;   4646  1    !
  7149. ;   4647  1    !    None.
  7150. ;   4648  1    !
  7151. ;   4649  1    !--
  7152. ;   4650  1    
  7153. ;   4651  2        BEGIN
  7154. ;   4652  2        CH$WCHAR (CHAR ((IF .RCV%PKT%SIZE LSS 94 THEN .RCV%PKT%SIZE ELSE 94)),
  7155. ;   4653  2            CH$PTR (SND%MSG, PKT%MSG + P%SI%BUFSIZ, CHR%SIZE)); ! [108]
  7156. ;   4654  2        CH$WCHAR (CHAR (.RCV%TIMEOUT), CH$PTR (SND%MSG, PKT%MSG + P%SI%TIMOUT,
  7157. ;   4655  2     CHR%SIZE));
  7158. ;   4656  2        CH$WCHAR (CHAR (.RCV%NPAD), CH$PTR (SND%MSG, PKT%MSG + P%SI%NPAD,
  7159. ;   4657  2     CHR%SIZE));
  7160. ;   4658  2        CH$WCHAR (CTL (.RCV%PADCHAR), CH$PTR (SND%MSG, PKT%MSG + P%SI%PAD,
  7161. ;   4659  2     CHR%SIZE));
  7162. ;   4660  2        CH$WCHAR (CHAR (.RCV%EOL), CH$PTR (SND%MSG, PKT%MSG + P%SI%EOL, CHR%SIZE));
  7163. ;   4661  2        CH$WCHAR (.RCV%QUOTE%CHR, CH$PTR (SND%MSG, PKT%MSG + P%SI%QUOTE, CHR%SIZE));
  7164. ;   4662  2        CH$WCHAR (.SEND%8QUOTE%CHR, CH$PTR (SND%MSG, PKT%MSG + P%SI%8QUOTE,
  7165. ;   4663  2     CHR%SIZE));
  7166. ;   4664  2        CH$WCHAR (.INI%CHK%TYPE, CH$PTR (SND%MSG, PKT%MSG + P%SI%CHKTYPE,
  7167. ;   4665  2     CHR%SIZE));
  7168. ;   4666  2        CH$WCHAR (.REPT%CHR, CH$PTR (SND%MSG, PKT%MSG + P%SI%REPEAT, CHR%SIZE));
  7169. ;   4667  2        SEND%INIT%SIZE = P%SI%LENGTH;                       ! [108]
  7170. ;   4668  2        IF .RCV%PKT%SIZE GTR 94                           ! [108]
  7171. ;   4669  2        THEN                                   ! [108]
  7172. ;   4670  3        BEGIN                                   ! [108]
  7173. ;   4671  3        CH$WCHAR (CHAR (EXTLEN%CAPAS), CH$PTR (SND%MSG, PKT%MSG + P%SI%CAPAS,
  7174. ;   4672  3     CHR%SIZE));
  7175. ;   4673  3        CH$WCHAR (CHAR (0), CH$PTR (SND%MSG, PKT%MSG + P%SI%WINDO, CHR%SIZE));
  7176. ;   4674  3        CH$WCHAR (CHAR (.RCV%PKT%SIZE/95), CH$PTR (SND%MSG, PKT%MSG + P%SI%MAXLX1,
  7177. ;   4675  3     CHR%SIZE));
  7178. ;   4676  3        CH$WCHAR (CHAR (.RCV%PKT%SIZE MOD 95), CH$PTR (SND%MSG, PKT%MSG + P%SI%MAXLX2,
  7179. ;   4677  3     CHR%SIZE));
  7180. ;   4678  3                                           ! [108]
  7181. ;   4679  3        SEND%INIT%SIZE = P%SI%XLENGTH;                       ! [108]
  7182. ;   4680  2        END;                                   ! [108]
  7183. ;   4681  2    
  7184. ;   4682  1        END;                    ! End of SET%SEND%INIT
  7185.  
  7186.  
  7187. ; SET%SEND%INIT
  7188. U.20:    MOVE    AC3,RCV%PKT%SIZE        ;                                        4652
  7189.     CAIGE    AC3,136
  7190.     SKIPA    AC1,AC3
  7191.     MOVEI    AC1,136
  7192.     ADDI    AC1,40
  7193.     MOVE    AC2,C.32            ;                                        4653
  7194.     IDPB    AC1,AC2                ;                                        4652
  7195.     MOVE    AC2,RCV%TIMEOUT            ;                                        4654
  7196.     ADDI    AC2,40
  7197.     MOVE    AC1,C.64
  7198.     IDPB    AC2,AC1
  7199.     MOVE    AC2,RCV%NPAD            ;                                        4656
  7200.     ADDI    AC2,40
  7201.     MOVE    AC1,C.65
  7202.     IDPB    AC2,AC1
  7203.     MOVE    AC2,RCV%PADCHAR            ;                                        4658
  7204.     TRC    AC2,100
  7205.     MOVE    AC1,C.66
  7206.     IDPB    AC2,AC1
  7207.     MOVE    AC2,RCV%EOL            ;                                        4660
  7208.     ADDI    AC2,40
  7209.     MOVE    AC1,C.67
  7210.     IDPB    AC2,AC1
  7211.     MOVE    AC2,RCV%QUOTE%CHR        ;                                        4661
  7212.     MOVE    AC1,C.68
  7213.     IDPB    AC2,AC1
  7214.     MOVE    AC2,U.45            ;                                        4662
  7215.     MOVE    AC1,C.69
  7216.     IDPB    AC2,AC1
  7217.     MOVE    AC2,U.47            ;                                        4664
  7218.     MOVE    AC1,C.70
  7219.     IDPB    AC2,AC1
  7220.     MOVE    AC2,U.38            ;                                        4666
  7221.     MOVE    AC1,C.71
  7222.     IDPB    AC2,AC1
  7223.     MOVEI    AC1,11                ;                                        4667
  7224.     MOVEM    AC1,U.46
  7225.     CAIG    AC3,136                ;                                        4668
  7226.     POPJ    SP,
  7227.     MOVEI    AC2,42                ;                                        4671
  7228.     MOVE    AC1,C.72
  7229.     IDPB    AC2,AC1
  7230.     MOVEI    AC2,40                ;                                        4673
  7231.     MOVE    AC1,C.73
  7232.     IDPB    AC2,AC1
  7233.     MOVE    AC1,AC3                ;                                        4674
  7234.     IDIVI    AC1,137
  7235.     ADDI    AC1,40
  7236.     MOVE    AC2,C.74
  7237.     IDPB    AC1,AC2
  7238.     MOVE    AC1,AC3                ;                                        4676
  7239.     IDIVI    AC1,137
  7240.     ADDI    AC2,40
  7241.     MOVE    AC1,C.75
  7242.     IDPB    AC2,AC1
  7243.     MOVEI    AC1,15                ;                                        4679
  7244.     MOVEM    AC1,U.46
  7245.     POPJ    SP,                ;                                        4613
  7246. C.64:    POINT    8,U.60+1,7
  7247. C.65:    POINT    8,U.60+1,15
  7248. C.66:    POINT    8,U.60+1,23
  7249. C.67:    POINT    8,U.60+1,31
  7250. C.68:    POINT    8,U.60+2,7
  7251. C.69:    POINT    8,U.60+2,15
  7252. C.70:    POINT    8,U.60+2,23
  7253. C.71:    POINT    8,U.60+2,31
  7254. C.72:    POINT    8,U.60+3,7
  7255. C.73:    POINT    8,U.60+3,15
  7256. C.74:    POINT    8,U.60+3,23
  7257. C.75:    POINT    8,U.60+3,31
  7258.  
  7259. ; Routine Size:  70 words
  7260.  
  7261.  
  7262. ;   4683  1    %SBTTL 'SEND%PACKET'
  7263. ;   4684  1    ROUTINE SEND%PACKET (TYPE, LENGTH, MN) =
  7264. ;   4685  1    
  7265. ;   4686  1    !++
  7266. ;   4687  1    ! FUNCTIONAL DESCRIPTION:
  7267. ;   4688  1    !
  7268. ;   4689  1    !    This routine will cause a packet to be sent over the line
  7269. ;   4690  1    !    that has been opened by OPEN%TERMINAL.
  7270. ;   4691  1    !
  7271. ;   4692  1    ! CALLING SEQUENCE:
  7272. ;   4693  1    !
  7273. ;   4694  1    !    SEND%PACKET(Type, Length);
  7274. ;   4695  1    !
  7275. ;   4696  1    ! INPUT PARAMETERS:
  7276. ;   4697  1    !
  7277. ;   4698  1    !    TYPE - Type of packet to send.
  7278. ;   4699  1    !
  7279. ;   4700  1    !    LENGTH - Length of the packet being sent.
  7280. ;   4701  1    ! [108]         Negative length means it's an extended length packet
  7281. ;   4702  1    !
  7282. ;   4703  1    ! IMPLICIT INPUTS:
  7283. ;   4704  1    !
  7284. ;   4705  1    !    None.
  7285. ;   4706  1    !
  7286. ;   4707  1    ! OUTPUT PARAMETERS:
  7287. ;   4708  1    !
  7288. ;   4709  1    !    None.
  7289. ;   4710  1    !
  7290. ;   4711  1    ! IMPLICIT OUTPUTS:
  7291. ;   4712  1    !
  7292. ;   4713  1    !    None.
  7293. ;   4714  1    !
  7294. ;   4715  1    ! COMPLETION CODES:
  7295. ;   4716  1    !
  7296. ;   4717  1    !    None.
  7297. ;   4718  1    !
  7298. ;   4719  1    ! SIDE EFFECTS:
  7299. ;   4720  1    !
  7300. ;   4721  1    !    None.
  7301. ;   4722  1    !
  7302. ;   4723  1    !--
  7303. ;   4724  1    
  7304. ;   4725  2        BEGIN
  7305. ;   4726  2    
  7306. ;   4727  2        LOCAL
  7307. ;   4728  2        FILLER : VECTOR [CH$ALLOCATION (MAX%MSG, CHR%SIZE)],
  7308. ;   4729  2        TOT%MSG%LEN,                ! Length of message including all characters
  7309. ;   4730  2        CHKSUM,                    ! Checksum for the message we calculate
  7310. ;   4731  2        POINTER;                ! Pointer to the information in the message
  7311. ;   4732  2    
  7312. ;   4733  2    !
  7313. ;   4734  2    ! Do any filler processing that the remote KERMIT requires.
  7314. ;   4735  2    !
  7315. ;   4736  2    
  7316. ;   4737  2        IF .SEND%NPAD NEQ 0
  7317. ;   4738  2        THEN
  7318. ;   4739  3        BEGIN
  7319. ;   4740  3        CH$FILL (.SEND%PADCHAR, MAX%MSG, CH$PTR (FILLER, 0, CHR%SIZE));
  7320. ;   4741  3    !
  7321. ;   4742  3    ! Update the send stats
  7322. ;   4743  3    !
  7323. ;   4744  3        SMSG%TOTAL%CHARS = .SMSG%TOTAL%CHARS + .SEND%NPAD;
  7324. ;   4745  3    !
  7325. ;   4746  3    ! Send the fill
  7326. ;   4747  3    !
  7327. ;   4748  3        DO%PARITY (FILLER, .SEND%NPAD + PKT%TOT%OVR%HEAD);
  7328. ;   4749  3        SEND (FILLER, .SEND%NPAD + PKT%TOT%OVR%HEAD);
  7329. ;   4750  2        END;
  7330. ;   4751  2    
  7331. ;   4752  2    !
  7332. ;   4753  2    ! Store the header information into the message.
  7333. ;   4754  2    !
  7334. ;   4755  2        CH$WCHAR (.TYPE, CH$PTR (SND%MSG, PKT%TYPE, CHR%SIZE));
  7335. ;   4756  2        CH$WCHAR (.SND%SOH, CH$PTR (SND%MSG, PKT%MARK, CHR%SIZE));
  7336. ;   4757  2        CH$WCHAR (CHAR (IF .MN LSS 0 THEN 0 ELSE .MN), CH$PTR (SND%MSG, PKT%SEQ,
  7337. ;   4758  2     CHR%SIZE));
  7338. ;   4759  2    
  7339. ;   4760  2        IF .LENGTH LSS 0                               ! [108]
  7340. ;   4761  2        THEN                                   ! [108]
  7341. ;   4762  3        BEGIN                                   ! [108]
  7342. ;   4763  3        TOT%MSG%LEN = PKT%OVR%HEAD + 3 - .LENGTH;               ! [108]
  7343. ;   4764  3        CH$WCHAR (CHAR (0), CH$PTR (SND%MSG, PKT%COUNT, CHR%SIZE));    ! [108]
  7344. ; P 4765  3        CH$WCHAR (CHAR ((.TOT%MSG%LEN - PKT%HCHECK + 1 +           ! [108]
  7345. ;   4766  3                 (.BLK%CHK%TYPE - CHK%1CHAR)) / 95),           ! [108]
  7346. ;   4767  3                CH$PTR (SND%MSG, PKT%COUNTX1, CHR%SIZE));      ! [108]
  7347. ; P 4768  3        CH$WCHAR (CHAR ((.TOT%MSG%LEN - PKT%HCHECK + 1 +           ! [108]
  7348. ;   4769  3                 (.BLK%CHK%TYPE - CHK%1CHAR)) MOD 95),           ! [108]
  7349. ;   4770  3                CH$PTR (SND%MSG, PKT%COUNTX2, CHR%SIZE));      ! [108]
  7350. ;   4771  3    
  7351. ;   4772  3        POINTER = CH$PTR(SND%MSG, PKT%SEQ, CHR%SIZE);               ! [108]
  7352. ;   4773  3        CHKSUM = CHAR (0) + CH$RCHAR%A (POINTER);               ! [108]
  7353. ;   4774  3        CHKSUM = .CHKSUM + CH$RCHAR%A (POINTER);               ! [108]
  7354. ;   4775  3        CHKSUM = .CHKSUM + CH$RCHAR%A (POINTER);               ! [108]
  7355. ;   4776  3        CHKSUM = .CHKSUM + CH$RCHAR%A (POINTER);               ! [108]
  7356. ;   4777  3    
  7357. ;   4778  3        CH$WCHAR (CHAR ((.CHKSUM + ((.CHKSUM AND %O'300')/%O'100')) AND %O'77'),
  7358. ;   4779  3                CH$PTR (SND%MSG, PKT%HCHECK, CHR%SIZE));       ! [108]
  7359. ;   4780  3        END                                   ! [108]
  7360. ;   4781  2        ELSE                                   ! [108]
  7361. ;   4782  3        BEGIN                                   ! [108]
  7362. ;   4783  3        TOT%MSG%LEN = PKT%OVR%HEAD + .LENGTH;                   ! [108]
  7363. ;   4784  3        CH$WCHAR (CHAR (.TOT%MSG%LEN + (.BLK%CHK%TYPE - CHK%1CHAR)),   ! [108]
  7364. ;   4785  3                    CH$PTR (SND%MSG, PKT%COUNT, CHR%SIZE));
  7365. ;   4786  2        END;                                   ! [108]
  7366. ;   4787  2    
  7367. ;   4788  2    !
  7368. ;   4789  2    ! Calculate the block check value
  7369. ;   4790  2    !
  7370. ;   4791  2        POINTER = CH$PTR (SND%MSG, PKT%MARK + 1, CHR%SIZE);
  7371. ;   4792  2        CHKSUM = CALC%BLOCK%CHECK (.POINTER, .TOT%MSG%LEN);               ! [108]
  7372. ;   4793  2    !
  7373. ;   4794  2    ! Store the checksum into the message
  7374. ;   4795  2    !
  7375. ;   4796  2        POINTER = CH$PTR (SND%MSG, .TOT%MSG%LEN + 1, CHR%SIZE);           ! [108]
  7376. ;   4797  2    
  7377. ;   4798  2        CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF
  7378. ;   4799  2        SET
  7379. ;   4800  2    
  7380. ;   4801  2        [CHK%1CHAR] :
  7381. ;   4802  2            CH$WCHAR%A (CHAR (.CHKSUM), POINTER);
  7382. ;   4803  2    
  7383. ;   4804  2        [CHK%2CHAR] :
  7384. ;   4805  3            BEGIN
  7385. ;   4806  3            CH$WCHAR%A (CHAR (.CHKSUM<6, 6>), POINTER);
  7386. ;   4807  3            CH$WCHAR%A (CHAR (.CHKSUM<0, 6>), POINTER);
  7387. ;   4808  3            TOT%MSG%LEN = .TOT%MSG%LEN + 1;
  7388. ;   4809  2            END;
  7389. ;   4810  2    
  7390. ;   4811  2        [CHK%CRC] :
  7391. ;   4812  3            BEGIN
  7392. ;   4813  3            CH$WCHAR%A (CHAR (.CHKSUM<12, 4>), POINTER);
  7393. ;   4814  3            CH$WCHAR%A (CHAR (.CHKSUM<6, 6>), POINTER);
  7394. ;   4815  3            CH$WCHAR%A (CHAR (.CHKSUM<0, 6>), POINTER);
  7395. ;   4816  3            TOT%MSG%LEN = .TOT%MSG%LEN + 2;
  7396. ;   4817  2            END;
  7397. ;   4818  2        TES;
  7398. ;   4819  2    
  7399. ;   4820  2    !
  7400. ;   4821  2    ! Store in the end of line character
  7401. ;   4822  2    !
  7402. ;   4823  2        CH$WCHAR%A (.SEND%EOL, POINTER);
  7403. ;   4824  2    !
  7404. ;   4825  2    ! If we are debugging then type out the message we are sending.
  7405. ;   4826  2    !
  7406. ;   4827  2        DBG%SEND (SND%MSG, (.TOT%MSG%LEN + PKT%TOT%OVR%HEAD - PKT%OVR%HEAD));
  7407. ;   4828  2    !
  7408. ;   4829  2    ! Update the stats for total characters and the data characters
  7409. ;   4830  2    !
  7410. ;   4831  2        SMSG%TOTAL%CHARS = .SMSG%TOTAL%CHARS + .TOT%MSG%LEN + PKT%TOT%OVR%HEAD -
  7411. ;   4832  2     PKT%OVR%HEAD;
  7412. ;   4833  2    ! Make data characters really be that, not just characters in data field
  7413. ;   4834  2    !    SMSG%DATA%CHARS = .SMSG%DATA%CHARS + .LENGTH;
  7414. ;   4835  2    
  7415. ;   4836  2        IF .TYPE EQL MSG%NAK
  7416. ;   4837  2        THEN
  7417. ;   4838  3        BEGIN
  7418. ;   4839  3        SMSG%NAKS = .SMSG%NAKS + 1;
  7419. ;   4840  3        XFR%STATUS (%C'S', %C'N');
  7420. ;   4841  3        END
  7421. ;   4842  2        ELSE
  7422. ;   4843  3        BEGIN
  7423. ;   4844  3        SMSG%COUNT = .SMSG%COUNT + 1;
  7424. ;   4845  3        XFR%STATUS (%C'S', %C'P');
  7425. ;   4846  2        END;
  7426. ;   4847  2    
  7427. ;   4848  2    !
  7428. ;   4849  2    ! Check if we are in IBM mode and need to wait for an XON first
  7429. ;   4850  2    ! We will not wait if this is a packet which might be going out
  7430. ;   4851  2    ! without previous traffic (generic commands, init packets).
  7431. ;   4852  2    
  7432. ;   4853  3        IF (.IBM%CHAR GEQ 0)             ! If handshaking on
  7433. ;   4854  2        THEN
  7434. ;   4855  2        IF NOT IBM%WAIT () THEN RETURN KER%ABORTED;
  7435. ;   4856  2    
  7436. ;   4857  2    !
  7437. ;   4858  2    ! Now call the O/S routine to send the message out to the remote KERMIT
  7438. ;   4859  2    !
  7439. ;   4860  2        DO%PARITY (SND%MSG, .TOT%MSG%LEN + PKT%TOT%OVR%HEAD - PKT%OVR%HEAD);
  7440. ;   4861  2        RETURN SEND (SND%MSG, .TOT%MSG%LEN + PKT%TOT%OVR%HEAD - PKT%OVR%HEAD);
  7441. ;   4862  1        END;                    ! End of SEND%PACKET
  7442.  
  7443.  
  7444. ; SEND%PACKET
  7445. U.24:    PUSH    SP,AC14                ;                                        4684
  7446.     PUSH    SP,AC16
  7447.     ADJSP    SP,375
  7448.     MOVE    AC3,U.41            ;                                        4737
  7449.     JUMPE    AC3,L.305
  7450.     MOVEI    AC5,-375(SP)            ;                                        4740
  7451.     HRLI    AC5,41000
  7452.     SETZB    AC1,AC2
  7453.     MOVEI    AC4,1752
  7454.     MOVEI    AC14,-2(SP)
  7455.     PUSH    AC14,C.9
  7456.     PUSH    AC14,U.42
  7457.     EXTEND    AC1,-1(SP)
  7458.     JFCL    
  7459.     ADDM    AC3,SMSG%TOTAL%CHARS        ;                                        4744
  7460.     MOVEI    AC1,-374(SP)            ;                                        4748
  7461.     PUSH    SP,AC1
  7462.     ADDI    AC3,6
  7463.     PUSH    SP,AC3
  7464.     PUSHJ    SP,U.22
  7465.     MOVEI    AC1,-376(SP)            ;                                        4749
  7466.     PUSH    SP,AC1
  7467.     MOVE    AC1,U.41
  7468.     ADDI    AC1,6
  7469.     PUSH    SP,AC1
  7470.     PUSHJ    SP,SEND
  7471.     ADJSP    SP,-4                ;                                        4739
  7472. L.305:    MOVE    AC2,-402(SP)            ;                                        4755
  7473.     MOVE    AC1,C.80
  7474.     IDPB    AC2,AC1
  7475.     MOVE    AC2,SND%SOH            ;                                        4756
  7476.     MOVE    AC1,C.81
  7477.     IDPB    AC2,AC1
  7478.     SKIPGE    AC1,-400(SP)            ;                                        4757
  7479.     SETZ    AC1,
  7480.     ADDI    AC1,40
  7481.     MOVE    AC2,C.82
  7482.     IDPB    AC1,AC2
  7483.     MOVE    AC3,U.48            ;                                        4766
  7484.     SUBI    AC3,61
  7485.     MOVE    AC16,-401(SP)            ;                                        4760
  7486.     JUMPGE    AC16,L.306
  7487.     MOVEI    AC14,6                ;                                        4763
  7488.     SUB    AC14,AC16
  7489.     MOVEI    AC2,40                ;                                        4764
  7490.     MOVE    AC1,C.83
  7491.     IDPB    AC2,AC1
  7492.     MOVE    AC16,AC14            ;                                        4766
  7493.     ADD    AC16,AC3
  7494.     SUBI    AC16,5
  7495.     MOVE    AC1,AC16
  7496.     IDIVI    AC1,137
  7497.     ADDI    AC1,40
  7498.     MOVE    AC2,C.32            ;                                        4767
  7499.     IDPB    AC1,AC2                ;                                        4766
  7500.     MOVE    AC1,AC16            ;                                        4769
  7501.     IDIVI    AC1,137
  7502.     ADDI    AC2,40
  7503.     MOVE    AC1,C.64            ;                                        4770
  7504.     IDPB    AC2,AC1                ;                                        4769
  7505.     MOVE    AC16,C.82            ;                                        4772
  7506.     ILDB    AC1,AC16            ;                                        4773
  7507.     MOVE    AC3,AC1
  7508.     ADDI    AC3,40
  7509.     ILDB    AC1,AC16            ;                                        4774
  7510.     ADD    AC3,AC1
  7511.     ILDB    AC1,AC16            ;                                        4775
  7512.     ADD    AC3,AC1
  7513.     ILDB    AC1,AC16            ;                                        4776
  7514.     ADD    AC3,AC1
  7515.     MOVE    AC1,AC3                ;                                        4778
  7516.     ANDI    AC1,300
  7517.     IDIVI    AC1,100
  7518.     ADD    AC1,AC3
  7519.     LDB    AC2,C.18
  7520.     ADDI    AC2,40
  7521.     MOVE    AC1,C.65            ;                                        4779
  7522.     IDPB    AC2,AC1                ;                                        4778
  7523.     JRST    L.307                ;                                        4760
  7524. L.306:    MOVE    AC14,AC16            ;                                        4783
  7525.     ADDI    AC14,3
  7526.     MOVE    AC16,AC14            ;                                        4784
  7527.     ADD    AC16,AC3
  7528.     ADDI    AC16,40
  7529.     MOVE    AC1,C.83            ;                                        4785
  7530.     IDPB    AC16,AC1            ;                                        4784
  7531. L.307:    MOVE    AC16,C.83            ;                                        4791
  7532.     PUSH    SP,AC16                ;                                        4792
  7533.     PUSH    SP,AC14
  7534.     PUSHJ    SP,U.19
  7535.     MOVE    AC3,AC1
  7536.     MOVE    AC1,AC14            ;                                        4796
  7537.     ADDI    AC1,1
  7538.     MOVE    AC2,C.76
  7539.     ADJBP    AC1,AC2
  7540.     MOVE    AC16,AC1
  7541.     MOVE    AC1,U.48            ;                                        4798
  7542.     SUBI    AC1,61
  7543.     JRST    L.308(AC1)
  7544. L.308:    JRST    L.309
  7545.     JRST    L.310
  7546.     JRST    L.311
  7547. L.309:    MOVE    AC1,AC3                ;                                        4802
  7548.     ADDI    AC1,40
  7549.     IDPB    AC1,AC16
  7550.     JRST    L.312                ;                                        4798
  7551. L.310:    LDB    AC1,C.77            ;                                        4806
  7552.     ADDI    AC1,40
  7553.     IDPB    AC1,AC16
  7554.     LDB    AC1,C.78            ;                                        4807
  7555.     ADDI    AC1,40
  7556.     IDPB    AC1,AC16
  7557.     AOJA    AC14,L.312            ;                                        4798
  7558. L.311:    LDB    AC1,C.79            ;                                        4813
  7559.     ADDI    AC1,40
  7560.     IDPB    AC1,AC16
  7561.     LDB    AC1,C.77            ;                                        4814
  7562.     ADDI    AC1,40
  7563.     IDPB    AC1,AC16
  7564.     LDB    AC1,C.78            ;                                        4815
  7565.     ADDI    AC1,40
  7566.     IDPB    AC1,AC16
  7567.     ADDI    AC14,2                ;                                        4816
  7568. L.312:    MOVE    AC1,U.43            ;                                        4823
  7569.     IDPB    AC1,AC16
  7570.     PUSH    SP,C.84                ;                                        4827
  7571.     MOVE    AC16,AC14
  7572.     ADDI    AC16,3
  7573.     PUSH    SP,AC16
  7574.     PUSHJ    SP,U.35
  7575.     MOVE    AC1,SMSG%TOTAL%CHARS        ;                                        4831
  7576.     ADD    AC1,AC14
  7577.     ADDI    AC1,3
  7578.     MOVEM    AC1,SMSG%TOTAL%CHARS
  7579.     MOVEI    AC1,116                ;                                        4836
  7580.     CAME    AC1,-406(SP)
  7581.     JRST    L.313
  7582.     AOS    SMSG%NAKS            ;                                        4839
  7583.     PUSH    SP,C.8                ;                                        4840
  7584.     PUSH    SP,C.24
  7585.     JRST    L.314
  7586. L.313:    AOS    SMSG%COUNT            ;                                        4844
  7587.     PUSH    SP,C.8                ;                                        4845
  7588.     PUSH    SP,C.85
  7589. L.314:    PUSHJ    SP,XFR%STATUS
  7590.     SKIPGE    IBM%CHAR            ;                                        4853
  7591.     JRST    L.315
  7592.     PUSHJ    SP,IBM%WAIT            ;                                        4855
  7593.     TRNE    AC1,1
  7594.     JRST    L.315
  7595.     ADJSP    SP,-6
  7596.     MOVEI    AC1,312
  7597.     JRST    L.316
  7598. L.315:    PUSH    SP,C.84                ;                                        4860
  7599.     PUSH    SP,AC16
  7600.     PUSHJ    SP,U.22
  7601.     PUSH    SP,C.84                ;                                        4861
  7602.     PUSH    SP,AC16
  7603.     PUSHJ    SP,SEND
  7604.     ADJSP    SP,-12
  7605. L.316:    ADJSP    SP,-375                ;                                        4684
  7606.     POP    SP,AC16
  7607.     POP    SP,AC14
  7608.     POPJ    SP,
  7609. C.76:    POINT    8,U.60,-1
  7610. C.77:    POINT    6,AC3,29
  7611. C.78:    POINT    6,AC3,35
  7612. C.79:    POINT    4,AC3,23
  7613. C.80:    POINT    8,U.60,23
  7614. C.81:    POINT    8,U.60-1,31
  7615. C.82:    POINT    8,U.60,15
  7616. C.83:    POINT    8,U.60,7
  7617. C.84:    XWD    0,U.60
  7618. C.85:    EXP    120
  7619.  
  7620. ; Routine Size:  174 words
  7621.  
  7622.  
  7623. ;   4863  1    %SBTTL 'REC%MESSAGE - Receive a message'
  7624. ;   4864  1    ROUTINE REC%MESSAGE (CHK%ROUTINE) =
  7625. ;   4865  1    
  7626. ;   4866  1    !++
  7627. ;   4867  1    ! FUNCTIONAL DESCRIPTION:
  7628. ;   4868  1    !
  7629. ;   4869  1    !    This routine will handle the retry processing for the various
  7630. ;   4870  1    !    messages that can be received.
  7631. ;   4871  1    !
  7632. ;   4872  1    ! CALLING SEQUENCE:
  7633. ;   4873  1    !
  7634. ;   4874  1    ! INPUT PARAMETERS:
  7635. ;   4875  1    !
  7636. ;   4876  1    !    None.
  7637. ;   4877  1    !
  7638. ;   4878  1    ! IMPLICIT INPUTS:
  7639. ;   4879  1    !
  7640. ;   4880  1    !    None.
  7641. ;   4881  1    !
  7642. ;   4882  1    ! OUTPUT PARAMETERS:
  7643. ;   4883  1    !
  7644. ;   4884  1    !    None.
  7645. ;   4885  1    !
  7646. ;   4886  1    ! IMPLICIT OUTPUTS:
  7647. ;   4887  1    !
  7648. ;   4888  1    !    None.
  7649. ;   4889  1    !
  7650. ;   4890  1    ! COMPLETION CODES:
  7651. ;   4891  1    !
  7652. ;   4892  1    !    KER%NORMAL - Normal return
  7653. ;   4893  1    !    KER%RETRIES - Too many retries
  7654. ;   4894  1    !    (What ever REC%PACKET returns).
  7655. ;   4895  1    !
  7656. ;   4896  1    ! SIDE EFFECTS:
  7657. ;   4897  1    !
  7658. ;   4898  1    !    None.
  7659. ;   4899  1    !
  7660. ;   4900  1    !--
  7661. ;   4901  1    
  7662. ;   4902  2        BEGIN
  7663. ;   4903  2    
  7664. ;   4904  2        LOCAL
  7665. ;   4905  2        STATUS;                    ! Status returned by various routines
  7666. ;   4906  2    
  7667. ;   4907  2        RETURN
  7668. ;   4908  2    
  7669. ;   4909  2        WHILE TRUE DO
  7670. ;   4910  3            BEGIN
  7671. ;   4911  3    
  7672. ;   4912  3            IF .NUM%RETRIES GTR .PKT%RETRIES
  7673. ;   4913  3            THEN
  7674. ;   4914  4            BEGIN
  7675. ;   4915  4            KRM%ERROR (KER%RETRIES);    ! Report the error
  7676. ;   4916  4            RETURN KER%RETRIES;
  7677. ;   4917  3            END;
  7678. ;   4918  3    
  7679. ;   4919  3            NUM%RETRIES = .NUM%RETRIES + 1;
  7680. ;   4920  3            STATUS = REC%PACKET ();
  7681. ;   4921  3    ![043] Don't abort on errors which might just be due to noise.
  7682. ;   4922  3    
  7683. ;   4923  3            IF NOT .STATUS AND .STATUS NEQ KER%CHKSUMERR AND .STATUS NEQ KER%TIMEOUT
  7684. ;   4924  3     AND .STATUS NEQ
  7685. ;   4925  3            KER%ZEROLENMSG
  7686. ;   4926  3            THEN
  7687. ;   4927  3            RETURN .STATUS;
  7688. ;   4928  3    
  7689. ;   4929  3            IF NOT .STATUS
  7690. ;   4930  3            THEN
  7691. ;   4931  3            SEND%PACKET (MSG%NAK, 0, .MSG%NUMBER)    ![024]
  7692. ;   4932  3            ELSE
  7693. ;   4933  4            BEGIN
  7694. ;   4934  4    ![021]
  7695. ;   4935  4    ![021] If the packet type is not acceptable by our caller, nak it so the
  7696. ;   4936  4    ![021] other end tries again, and abort the current operation.  This is so
  7697. ;   4937  4    ![021] we will return to server mode (if we are running that way) quickly
  7698. ;   4938  4    ![021] when the other Kermit has been aborted and then restarted, and should
  7699. ;   4939  4    ![021] also make restarting quick, since we will not need to wait for the
  7700. ;   4940  4    ![021] other Kermit to time this message out before retransmitting.
  7701. ;   4941  4    ![021]
  7702. ;   4942  4    
  7703. ;   4943  4            IF NOT (.CHK%ROUTINE) ()
  7704. ;   4944  4            THEN
  7705. ;   4945  5                BEGIN
  7706. ;   4946  5                SEND%PACKET (MSG%NAK, 0, .REC%SEQ);
  7707. ;   4947  5                RETURN FALSE;        ! Just indicate an error
  7708. ;   4948  5                END
  7709. ;   4949  4            ELSE
  7710. ;   4950  4                EXITLOOP KER%NORMAL;
  7711. ;   4951  4    
  7712. ;   4952  3            END;
  7713. ;   4953  3    
  7714. ;   4954  2            END;
  7715. ;   4955  2    
  7716. ;   4956  1        END;                    ! End of REC%PARSE
  7717.  
  7718.  
  7719. ; REC%MESSAGE
  7720. U.25:    PUSH    SP,AC16                ;                                        4864
  7721. L.317:    MOVE    AC1,U.54            ;                                        4912
  7722.     CAMG    AC1,PKT%RETRIES
  7723.     JRST    L.318
  7724.     PUSH    SP,C.17                ;                                        4915
  7725.     PUSHJ    SP,KRM%ERROR
  7726.     ADJSP    SP,-1                ;                                        4916
  7727.     MOVEI    AC1,212                ;                                        4914
  7728.     JRST    L.322
  7729. L.318:    AOS    U.54                ;                                        4919
  7730.     PUSHJ    SP,U.26                ;                                        4920
  7731.     MOVE    AC16,AC1
  7732.     TRNN    AC16,1                ;                                        4923
  7733.     CAIN    AC16,172
  7734.     JRST    L.319
  7735.     CAIE    AC16,300
  7736.     CAIN    AC16,262            ;                                        4924
  7737.     JRST    L.319
  7738.     MOVE    AC1,AC16            ;                                        4927
  7739.     JRST    L.322
  7740. L.319:    TRNE    AC16,1                ;                                        4929
  7741.     JRST    L.320
  7742.     PUSH    SP,C.24                ;                                        4931
  7743.     PUSH    SP,C.25
  7744.     PUSH    SP,U.55
  7745.     PUSHJ    SP,U.24
  7746.     ADJSP    SP,-3
  7747.     JRST    L.317                ;                                        4929
  7748. L.320:    MOVE    AC1,-2(SP)            ;                                        4943
  7749.     PUSHJ    SP,0(AC1)
  7750.     TRNE    AC1,1
  7751.     JRST    L.321
  7752.     PUSH    SP,C.24                ;                                        4946
  7753.     PUSH    SP,C.25
  7754.     PUSH    SP,U.56
  7755.     PUSHJ    SP,U.24
  7756.     ADJSP    SP,-3                ;                                        4947
  7757.     TDZA    AC1,AC1                ;                                        4945
  7758. L.321:    MOVEI    AC1,13                ;                                        4950
  7759. L.322:    POP    SP,AC16                ;                                        4864
  7760.     POPJ    SP,
  7761.  
  7762. ; Routine Size:  41 words
  7763.  
  7764.  
  7765. ;   4957  1    %SBTTL 'REC%PACKET'
  7766. ;   4958  1    ROUTINE REC%PACKET =
  7767. ;   4959  1    
  7768. ;   4960  1    !++
  7769. ;   4961  1    ! FUNCTIONAL DESCRIPTION:
  7770. ;   4962  1    !
  7771. ;   4963  1    !    This routine will do the oppoiste of SEND%PACKET.  It will wait
  7772. ;   4964  1    !    for the message to be read from the remote and then it will
  7773. ;   4965  1    !    check the message for validity.
  7774. ;   4966  1    !
  7775. ;   4967  1    ! CALLING SEQUENCE:
  7776. ;   4968  1    !
  7777. ;   4969  1    !    Flag = REC%PACKET();
  7778. ;   4970  1    !
  7779. ;   4971  1    ! INPUT PARAMETERS:
  7780. ;   4972  1    !
  7781. ;   4973  1    !    None.
  7782. ;   4974  1    !
  7783. ;   4975  1    ! IMPLICIT INPUTS:
  7784. ;   4976  1    !
  7785. ;   4977  1    !    None.
  7786. ;   4978  1    !
  7787. ;   4979  1    ! OUTPUT PARAMETERS:
  7788. ;   4980  1    !
  7789. ;   4981  1    !    None.
  7790. ;   4982  1    !
  7791. ;   4983  1    ! IMPLICIT OUTPUTS:
  7792. ;   4984  1    !
  7793. ;   4985  1    !    REC%MSG - Contains the message received.
  7794. ;   4986  1    !
  7795. ;   4987  1    ! COMPLETION CODES:
  7796. ;   4988  1    !
  7797. ;   4989  1    !    True - Packet receive ok.
  7798. ;   4990  1    !    False - Problem occured during the receiving of the packet.
  7799. ;   4991  1    !
  7800. ;   4992  1    ! SIDE EFFECTS:
  7801. ;   4993  1    !
  7802. ;   4994  1    !    None.
  7803. ;   4995  1    !
  7804. ;   4996  1    !--
  7805. ;   4997  1    
  7806. ;   4998  2        BEGIN
  7807. ;   4999  2    
  7808. ;   5000  2        BIND
  7809. ;   5001  2        ATTEMPT%TEXT = UPLIT (%ASCIZ'Attempting to receive');
  7810. ;   5002  2    
  7811. ;   5003  2        LOCAL
  7812. ;   5004  2        STATUS,                    ! Status returned by various routines
  7813. ;   5005  2        MSG%LENGTH,
  7814. ;   5006  2        ERR%POINTER,                ! Pointer to the error buffer
  7815. ;   5007  2        POINTER,
  7816. ;   5008  2        CHKSUM;                    ! Checksum of the message
  7817. ;   5009  2    
  7818. ;   5010  2    !
  7819. ;   5011  2    ! Attempt to read the message from the remote.
  7820. ;   5012  2    !
  7821. ;   5013  2    !    DO
  7822. ;   5014  2    !    BEGIN
  7823. ;   5015  2    
  7824. ;   5016  2        IF .DEBUG%FLAG
  7825. ;   5017  2        THEN
  7826. ;   5018  3        BEGIN
  7827. ;   5019  3    
  7828. ;   5020  3        LOCAL
  7829. ;   5021  3            OLD%RTN;
  7830. ;   5022  3    
  7831. ;   5023  3        OLD%RTN = TT%SET%OUTPUT (DBG%DUMP);
  7832. ;   5024  3        TT%TEXT (ATTEMPT%TEXT);
  7833. ;   5025  3        TT%CRLF ();
  7834. ;   5026  3        TT%SET%OUTPUT (.OLD%RTN);
  7835. ;   5027  2        END;
  7836. ;   5028  2    
  7837. ;   5029  2    !
  7838. ;   5030  2    ! If status type out requested, do it once
  7839. ;   5031  2    !
  7840. ;   5032  2    
  7841. ;   5033  2        IF .TYP%STS%FLAG
  7842. ;   5034  2        THEN
  7843. ;   5035  3        BEGIN
  7844. ;   5036  3        STS%OUTPUT ();
  7845. ;   5037  3        TYP%STS%FLAG = FALSE;
  7846. ;   5038  2        END;
  7847. ;   5039  2    
  7848. ;   5040  2    !
  7849. ;   5041  2    ! Receive the message from the remote Kermit
  7850. ;   5042  2    !
  7851. ;   5043  2        STATUS = RECEIVE (REC%MSG, MSG%LENGTH);
  7852. ;   5044  2    !
  7853. ;   5045  2    ! Check for timeouts
  7854. ;   5046  2    !
  7855. ;   5047  2    
  7856. ;   5048  2        IF .STATUS EQL KER%TIMEOUT THEN XFR%STATUS (%C'R', %C'T');
  7857. ;   5049  2    
  7858. ;   5050  2    !
  7859. ;   5051  2    ! If it failed return the status to the upper level
  7860. ;   5052  2    !
  7861. ;   5053  2    
  7862. ;   5054  2        IF NOT .STATUS
  7863. ;   5055  2        THEN
  7864. ;   5056  3        BEGIN
  7865. ;   5057  3    
  7866. ;   5058  3        IF .STATUS NEQ KER%ABORTED AND .STATUS NEQ KER%TIMEOUT THEN KRM%ERROR
  7867. ;   5059  3    (.STATUS);
  7868. ;   5060  3    
  7869. ;   5061  3                            ! Report error
  7870. ;   5062  3        RETURN .STATUS;
  7871. ;   5063  2        END;
  7872. ;   5064  2    
  7873. ;   5065  2    !
  7874. ;   5066  2    ! Determine if we got a good message
  7875. ;   5067  2    !
  7876. ;   5068  2    
  7877. ;   5069  2        IF .MSG%LENGTH LSS PKT%TOT%OVR%HEAD - 1
  7878. ;   5070  2        THEN
  7879. ;   5071  3        BEGIN
  7880. ;   5072  3        RETURN KER%ZEROLENMSG;
  7881. ;   5073  2        END;
  7882. ;   5074  2    
  7883. ;   5075  2        IF UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNT, CHR%SIZE))) EQL 0 ! [108]
  7884. ;   5076  2        THEN                                   ! [108]
  7885. ;   5077  3        BEGIN                                   ! [108]
  7886. ;   5078  3        IF .MSG%LENGTH LSS PKT%TOT%OVR%HEAD - 1 + 3               ! [108]
  7887. ;   5079  3        THEN                                   ! [108]
  7888. ;   5080  4            BEGIN                               ! [108]
  7889. ;   5081  4            RETURN KER%ZEROLENMSG;                       ! [108]
  7890. ;   5082  3            END;                               ! [108]
  7891. ;   5083  2        END;                                   ! [108]
  7892. ;   5084  2    !
  7893. ;   5085  2    ! Update the stats on the total number of characters received.
  7894. ;   5086  2    !
  7895. ;   5087  2        RMSG%TOTAL%CHARS = .RMSG%TOTAL%CHARS + .MSG%LENGTH;
  7896. ;   5088  2    !
  7897. ;   5089  2    ! Initialize the checksum and others
  7898. ;   5090  2    !
  7899. ;   5091  2        REC%TYPE = CH$RCHAR (CH$PTR (REC%MSG, PKT%TYPE, CHR%SIZE));
  7900. ;   5092  2    !
  7901. ;   5093  2    ! Now break the message apart byte by byte.
  7902. ;   5094  2    !
  7903. ;   5095  2        RECV%PKT%MSG = PKT%MSG;                           ! [108]
  7904. ;   5096  2        REC%LENGTH = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNT, CHR%SIZE)));
  7905. ;   5097  2        IF .REC%LENGTH EQL 0                           ! [108]
  7906. ;   5098  2        THEN                                   ! [108]
  7907. ;   5099  3        BEGIN                                   ! [108]
  7908. ;   5100  3        REC%LENGTH = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNTX1, CHR%SIZE))) * 95 +
  7909. ;   5101  3            UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNTX2, CHR%SIZE))) +
  7910. ;   5102  3                            PKT%HCHECK - 1;           ! [108]
  7911. ;   5103  3        RECV%PKT%MSG = PKT%MSGX;                       ! [108]
  7912. ;   5104  2        END;                                   ! [108]
  7913. ;   5105  2    
  7914. ;   5106  2        REC%SEQ = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%SEQ, CHR%SIZE)));
  7915. ;   5107  2    !
  7916. ;   5108  2    ! Typed the packet if we are debugging
  7917. ;   5109  2    !
  7918. ;   5110  2        DBG%RECEIVE (REC%MSG);
  7919. ;   5111  2    !
  7920. ;   5112  2    ! Now compute the final checksum and make sure that it is identical
  7921. ;   5113  2    ! to what we received from the remote KERMIT
  7922. ;   5114  2    !
  7923. ;   5115  2        POINTER = CH$PTR (REC%MSG, PKT%MARK + 1, CHR%SIZE);
  7924. ;   5116  2        REC%LENGTH = .REC%LENGTH - (.BLK%CHK%TYPE - CHK%1CHAR);           ! [108]
  7925. ;   5117  2        CHKSUM = CALC%BLOCK%CHECK (.POINTER, .REC%LENGTH);               ! [108]
  7926. ;   5118  2        POINTER = CH$PTR (REC%MSG, .REC%LENGTH + 1, CHR%SIZE);           ! [108]
  7927. ;   5119  2        REC%LENGTH = .REC%LENGTH - .RECV%PKT%MSG + 1;               ! [108]
  7928. ;   5120  2        STATUS = KER%NORMAL;            ! Assume good checksum
  7929. ;   5121  2    
  7930. ;   5122  2        CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF
  7931. ;   5123  2        SET
  7932. ;   5124  2    
  7933. ;   5125  2        [CHK%1CHAR] :
  7934. ;   5126  2    
  7935. ;   5127  2            IF .CHKSUM NEQ UNCHAR (CH$RCHAR%A (POINTER)) THEN STATUS = KER%CHKSUMERR;
  7936. ;   5128  2    
  7937. ;   5129  2        [CHK%2CHAR] :
  7938. ;   5130  2    
  7939. ;   5131  3            IF (.CHKSUM<6, 6> NEQ UNCHAR (CH$RCHAR%A (POINTER))) OR (.CHKSUM<0, 6> NEQ
  7940. ; P 5132  3     UNCHAR (
  7941. ;   5133  3                CH$RCHAR%A (POINTER)))
  7942. ;   5134  2            THEN
  7943. ;   5135  2            STATUS = KER%CHKSUMERR;
  7944. ;   5136  2    
  7945. ;   5137  2        [CHK%CRC] :
  7946. ;   5138  2    
  7947. ;   5139  3            IF (.CHKSUM<12, 4> NEQ UNCHAR (CH$RCHAR%A (POINTER))) OR (.CHKSUM<6, 6> NEQ
  7948. ; P 5140  3     UNCHAR (
  7949. ; P 5141  3                CH$RCHAR%A (POINTER))) OR (.CHKSUM<0, 6> NEQ UNCHAR (CH$RCHAR%A
  7950. ;   5142  3    (POINTER)))
  7951. ;   5143  2            THEN
  7952. ;   5144  2            STATUS = KER%CHKSUMERR;
  7953. ;   5145  2    
  7954. ;   5146  2        TES;
  7955. ;   5147  2    
  7956. ;   5148  2    !
  7957. ;   5149  2    ! If we have a bad checksum, check for the special cases when we might be out
  7958. ;   5150  2    ! of sync with the sender.  This can occur if the sender is retransmitting
  7959. ;   5151  2    ! a send-init (because our ACK got lost), and we have agreed on multi-char
  7960. ;   5152  2    ! checksums, or because the sender is a server who has aborted back to being
  7961. ;   5153  2    ! idle without telling us.
  7962. ;   5154  2    ! Note that in either case, we return back to using single character checksums
  7963. ;   5155  2    !
  7964. ;   5156  2    
  7965. ;   5157  2        IF .STATUS EQL KER%CHKSUMERR
  7966. ;   5158  2        THEN
  7967. ;   5159  3        BEGIN
  7968. ;   5160  3    
  7969. ;   5161  4        IF (.BLK%CHK%TYPE NEQ CHK%1CHAR AND .REC%SEQ EQL 0) AND (.REC%LENGTH LSS 1 -
  7970. ;   5162  5    (.BLK%CHK%TYPE
  7971. ;   5163  4            - CHK%1CHAR) AND .REC%TYPE EQL MSG%NAK) OR (.REC%TYPE EQL MSG%SND%INIT)
  7972. ;   5164  3        THEN
  7973. ;   5165  4            BEGIN
  7974. ;   5166  4    
  7975. ;   5167  4            LOCAL
  7976. ;   5168  4            SAVE%BLK%CHK%TYPE;
  7977. ;   5169  4    
  7978. ;   5170  4            SAVE%BLK%CHK%TYPE = .BLK%CHK%TYPE;    ! Remember what we are using
  7979. ;   5171  4            BLK%CHK%TYPE = CHK%1CHAR;
  7980. ;   5172  4            POINTER = CH$PTR (REC%MSG, PKT%MARK + 1, CHR%SIZE);
  7981. ;   5173  4            CHKSUM = CALC%BLOCK%CHECK (.POINTER, .REC%LENGTH + .RECV%PKT%MSG - 1); ! [108]
  7982. ;   5174  4            POINTER = CH$PTR (REC%MSG, .REC%LENGTH + .RECV%PKT%MSG, CHR%SIZE); ! [108]
  7983. ;   5175  4    
  7984. ;   5176  5            IF .CHKSUM NEQ UNCHAR (CH$RCHAR%A (POINTER))
  7985. ;   5177  4            THEN
  7986. ;   5178  5            BEGIN
  7987. ;   5179  5            BLK%CHK%TYPE = .SAVE%BLK%CHK%TYPE;
  7988. ;   5180  5            RETURN KER%CHKSUMERR;
  7989. ;   5181  4            END;
  7990. ;   5182  4    
  7991. ;   5183  4            END
  7992. ;   5184  3        ELSE
  7993. ;   5185  3            RETURN KER%CHKSUMERR;
  7994. ;   5186  3    
  7995. ;   5187  2        END;
  7996. ;   5188  2    
  7997. ;   5189  2    !
  7998. ;   5190  2    ! Update the stats
  7999. ;   5191  2    !
  8000. ;   5192  2    !    RMSG%DATA%CHARS = .RMSG%DATA%CHARS + .REC%LENGTH;
  8001. ;   5193  2    
  8002. ;   5194  2        IF .REC%TYPE EQL MSG%NAK
  8003. ;   5195  2        THEN
  8004. ;   5196  3        BEGIN
  8005. ;   5197  3        RMSG%NAKS = .RMSG%NAKS + 1;
  8006. ;   5198  3        XFR%STATUS (%C'R', %C'N');
  8007. ;   5199  3        END
  8008. ;   5200  2        ELSE
  8009. ;   5201  3        BEGIN
  8010. ;   5202  3        RMSG%COUNT = .RMSG%COUNT + 1;
  8011. ;   5203  3        XFR%STATUS (%C'R', %C'P');
  8012. ;   5204  2        END;
  8013. ;   5205  2    
  8014. ;   5206  2    !
  8015. ;   5207  2    ! Now check to see if we have an E type (Error) packet.
  8016. ;   5208  2    !
  8017. ;   5209  2    
  8018. ;   5210  2        IF .REC%TYPE NEQ MSG%ERROR THEN RETURN KER%NORMAL;
  8019. ;   5211  2    
  8020. ;   5212  2    !
  8021. ;   5213  2    ! Here to process an error packet.  Call the user routine to output the
  8022. ;   5214  2    ! error message to the terminal.
  8023. ;   5215  2    !
  8024. ;   5216  2    !
  8025. ;   5217  2    ![026] Use decoding routine to fetch the error text
  8026. ;   5218  2    !
  8027. ;   5219  2        CH$FILL (CHR%NUL, MAX%MSG + 1, CH$PTR (LAST%ERROR));
  8028. ;   5220  2        SET%STRING (CH$PTR (LAST%ERROR), MAX%MSG, TRUE);
  8029. ;   5221  2        BFR%EMPTY ();
  8030. ;   5222  2        SET%STRING (0, 0, FALSE);
  8031. ;   5223  2    ![026]    ERR%POINTER = CH$PTR (LAST%ERROR);
  8032. ;   5224  2    ![026]    POINTER = CH$PTR (REC%MSG, PKT%MSG, CHR%SIZE);
  8033. ;   5225  2    ![026]
  8034. ;   5226  2    ![026]    INCR I FROM 1 TO .REC%LENGTH DO
  8035. ;   5227  2    ![026]    CH$WCHAR%A (CH$RCHAR%A (POINTER), ERR%POINTER);
  8036. ;   5228  2    ![026]
  8037. ;   5229  2    ![026]    CH$WCHAR (CHR%NUL, ERR%POINTER);
  8038. ;   5230  2        TT%TEXT (LAST%ERROR);
  8039. ;   5231  2        TT%CRLF ();
  8040. ;   5232  2        RETURN KER%ERRMSG;
  8041. ;   5233  1        END;                    ! End of REC%PACKET
  8042.  
  8043.  
  8044. P.AAN:    BYTE    (7)"A","t","t","e","m"
  8045.     BYTE    (7)"p","t","i","n","g"
  8046.     BYTE    (7)" ","t","o"," ","r"
  8047.     BYTE    (7)"e","c","e","i","v"
  8048.     BYTE    (7)"e",000,000,000,000
  8049.  
  8050.  
  8051. ; ATTEMPT%TEXT
  8052. U.82=            P.AAN
  8053.  
  8054.  
  8055. ; REC%PACKET
  8056. U.26:    PUSH    SP,AC14                ;                                        4958
  8057.     PUSH    SP,AC16
  8058.     ADJSP    SP,1
  8059.     MOVEI    AC1,1                ;                                        5016
  8060.     TDNN    AC1,DEBUG%FLAG
  8061.     JRST    L.323
  8062.     PUSH    SP,C.88                ;                                        5023
  8063.     PUSHJ    SP,TT%SET%OUTPUT
  8064.     MOVE    AC14,AC1
  8065.     PUSH    SP,C.89                ;                                        5024
  8066.     PUSHJ    SP,TT%TEXT
  8067.     PUSHJ    SP,TT%CRLF            ;                                        5025
  8068.     MOVEM    AC14,0(SP)            ;                                        5026
  8069.     PUSHJ    SP,TT%SET%OUTPUT
  8070.     ADJSP    SP,-2                ;                                        5018
  8071. L.323:    MOVEI    AC1,1                ;                                        5033
  8072.     TDNN    AC1,TYP%STS%FLAG
  8073.     JRST    L.324
  8074.     PUSHJ    SP,U.33                ;                                        5036
  8075.     SETZM    TYP%STS%FLAG            ;                                        5037
  8076. L.324:    PUSH    SP,C.90                ;                                        5043
  8077.     MOVEI    AC1,-1(SP)
  8078.     PUSH    SP,AC1
  8079.     PUSHJ    SP,RECEIVE
  8080.     MOVE    AC14,AC1
  8081.     CAIE    AC14,300            ;                                        5048
  8082.     JRST    L.325
  8083.     PUSH    SP,C.12
  8084.     PUSH    SP,C.5
  8085.     PUSHJ    SP,XFR%STATUS
  8086.     ADJSP    SP,-2
  8087. L.325:    TRNE    AC14,1                ;                                        5054
  8088.     JRST    L.327
  8089.     CAIE    AC14,312            ;                                        5058
  8090.     CAIN    AC14,300
  8091.     JRST    L.326
  8092.     MOVEM    AC14,0(SP)            ;                                        5059
  8093.     PUSHJ    SP,KRM%ERROR
  8094. L.326:    ADJSP    SP,-2                ;                                        5062
  8095.     MOVE    AC1,AC14            ;                                        5056
  8096.     JRST    L.346
  8097. L.327:    MOVE    AC1,-2(SP)            ;                                        5069
  8098.     CAIGE    AC1,5
  8099.     JRST    L.328
  8100.     MOVE    AC2,C.91            ;                                        5075
  8101.     ILDB    AC2,AC2
  8102.     CAIN    AC2,40
  8103.     CAIL    AC1,10                ;                                        5078
  8104.     JRST    L.329
  8105. L.328:    ADJSP    SP,-2                ;                                        5081
  8106.     MOVEI    AC1,262                ;                                        5080
  8107.     JRST    L.346
  8108. L.329:    ADDM    AC1,RMSG%TOTAL%CHARS        ;                                        5087
  8109.     MOVE    AC1,C.92            ;                                        5091
  8110.     ILDB    AC1,AC1
  8111.     MOVEM    AC1,U.58
  8112.     MOVEI    AC1,4                ;                                        5095
  8113.     MOVEM    AC1,U.39
  8114.     MOVE    AC1,C.91            ;                                        5096
  8115.     ILDB    AC1,AC1
  8116.     SUBI    AC1,40
  8117.     MOVEM    AC1,U.57
  8118.     JUMPN    AC1,L.330            ;                                        5097
  8119.     MOVE    AC1,C.93            ;                                        5100
  8120.     ILDB    AC1,AC1
  8121.     IMULI    AC1,137
  8122.     MOVE    AC2,C.94            ;                                        5101
  8123.     ILDB    AC2,AC2
  8124.     ADD    AC1,AC2                ;                                        5100
  8125.     SUBI    AC1,5773            ;                                        5102
  8126.     MOVEM    AC1,U.57
  8127.     MOVEI    AC1,7                ;                                        5103
  8128.     MOVEM    AC1,U.39
  8129. L.330:    MOVE    AC1,C.95            ;                                        5106
  8130.     ILDB    AC1,AC1
  8131.     SUBI    AC1,40
  8132.     MOVEM    AC1,U.56
  8133.     PUSH    SP,C.90                ;                                        5110
  8134.     PUSHJ    SP,U.36
  8135.     MOVE    AC16,C.91            ;                                        5115
  8136.     MOVE    AC1,U.57            ;                                        5116
  8137.     SUB    AC1,U.48
  8138.     ADDI    AC1,61
  8139.     MOVEM    AC1,U.57
  8140.     MOVEM    AC16,0(SP)            ;                                        5117
  8141.     PUSH    SP,U.57
  8142.     PUSHJ    SP,U.19
  8143.     MOVE    AC2,U.57            ;                                        5118
  8144.     ADDI    AC2,1
  8145.     MOVE    AC3,C.27
  8146.     ADJBP    AC2,AC3
  8147.     MOVE    AC16,AC2
  8148.     MOVE    AC2,U.57            ;                                        5119
  8149.     SUB    AC2,U.39
  8150.     ADDI    AC2,1
  8151.     MOVEM    AC2,U.57
  8152.     MOVEI    AC14,13                ;                                        5120
  8153.     MOVE    AC3,U.48            ;                                        5122
  8154.     MOVE    AC2,AC3
  8155.     SUBI    AC2,61
  8156.     JRST    L.331(AC2)
  8157. L.331:    JRST    L.332
  8158.     JRST    L.334
  8159.     JRST    L.333
  8160. L.332:    ILDB    AC2,AC16            ;                                        5127
  8161.     SUBI    AC2,40
  8162.     CAMN    AC1,AC2
  8163.     JRST    L.336
  8164.     JRST    L.335
  8165. L.333:    ILDB    AC2,AC16            ;                                        5139
  8166.     SUBI    AC2,40
  8167.     LDB    AC4,C.86
  8168.     CAME    AC4,AC2
  8169.     JRST    L.335
  8170. L.334:    ILDB    AC2,AC16            ;                                        5141
  8171.     SUBI    AC2,40
  8172.     LDB    AC4,C.87            ;                                        5139
  8173.     CAME    AC4,AC2
  8174.     JRST    L.335
  8175.     ILDB    AC2,AC16            ;                                        5142
  8176.     SUBI    AC2,40
  8177.     LDB    AC4,C.18            ;                                        5141
  8178.     CAME    AC4,AC2
  8179. L.335:    MOVEI    AC14,172            ;                                        5144
  8180. L.336:    CAIE    AC14,172            ;                                        5157
  8181.     JRST    L.342
  8182.     CAIE    AC3,61                ;                                        5161
  8183.     SKIPE    U.56
  8184.     JRST    L.337
  8185.     MOVE    AC2,AC3
  8186.     SUBI    AC2,62
  8187.     MOVN    AC2,AC2
  8188.     CAMG    AC2,U.57
  8189.     JRST    L.337
  8190.     MOVEI    AC2,116                ;                                        5163
  8191.     CAMN    AC2,U.58
  8192.     JRST    L.338
  8193. L.337:    MOVEI    AC2,123
  8194.     CAME    AC2,U.58
  8195.     JRST    L.340
  8196. L.338:    MOVE    AC14,AC3            ;                                        5170
  8197.     MOVEI    AC2,61                ;                                        5171
  8198.     MOVEM    AC2,U.48
  8199.     MOVE    AC16,C.91            ;                                        5172
  8200.     MOVEM    AC16,0(SP)            ;                                        5173
  8201.     MOVE    AC2,U.57
  8202.     ADD    AC2,U.39
  8203.     SUBI    AC2,1
  8204.     PUSH    SP,AC2
  8205.     PUSHJ    SP,U.19
  8206.     MOVE    AC2,U.57            ;                                        5174
  8207.     ADD    AC2,U.39
  8208.     MOVE    AC3,C.27
  8209.     ADJBP    AC2,AC3
  8210.     MOVE    AC16,AC2
  8211.     ILDB    AC2,AC16            ;                                        5176
  8212.     SUBI    AC2,40
  8213.     CAMN    AC1,AC2
  8214.     JRST    L.339
  8215.     MOVEM    AC14,U.48            ;                                        5179
  8216.     ADJSP    SP,-5                ;                                        5180
  8217.     JRST    L.341
  8218. L.339:    ADJSP    SP,-1                ;                                        5165
  8219.     JRST    L.342                ;                                        5161
  8220. L.340:    ADJSP    SP,-4                ;                                        5185
  8221. L.341:    MOVEI    AC1,172
  8222.     JRST    L.346
  8223. L.342:    MOVEI    AC1,116                ;                                        5194
  8224.     CAME    AC1,U.58
  8225.     JRST    L.343
  8226.     AOS    RMSG%NAKS            ;                                        5197
  8227.     PUSH    SP,C.12                ;                                        5198
  8228.     PUSH    SP,C.24
  8229.     JRST    L.344
  8230. L.343:    AOS    RMSG%COUNT            ;                                        5202
  8231.     PUSH    SP,C.12                ;                                        5203
  8232.     PUSH    SP,C.85
  8233. L.344:    PUSHJ    SP,XFR%STATUS
  8234.     MOVEI    AC1,105                ;                                        5210
  8235.     CAMN    AC1,U.58
  8236.     JRST    L.345
  8237.     ADJSP    SP,-6
  8238.     MOVEI    AC1,13
  8239.     JRST    L.346
  8240. L.345:    SETZB    AC1,AC2                ;                                        5219
  8241.     MOVEI    AC4,1753
  8242.     MOVE    AC5,C.3
  8243.     EXTEND    AC1,C.1
  8244.     JFCL    
  8245.     PUSH    SP,C.3                ;                                        5220
  8246.     PUSH    SP,C.55
  8247.     PUSH    SP,C.2
  8248.     PUSHJ    SP,U.30
  8249.     PUSHJ    SP,U.28                ;                                        5221
  8250.     SETZM    -2(SP)                ;                                        5222
  8251.     SETZM    -1(SP)
  8252.     SETZM    0(SP)
  8253.     PUSHJ    SP,U.30
  8254.     PUSH    SP,C.96                ;                                        5230
  8255.     PUSHJ    SP,TT%TEXT
  8256.     PUSHJ    SP,TT%CRLF            ;                                        5231
  8257.     ADJSP    SP,-12                ;                                        5232
  8258.     MOVEI    AC1,162                ;                                        4998
  8259. L.346:    ADJSP    SP,-1                ;                                        4958
  8260.     POP    SP,AC16
  8261.     POP    SP,AC14
  8262.     POPJ    SP,
  8263. C.86:    POINT    4,AC1,23
  8264. C.87:    POINT    6,AC1,29
  8265. C.88:    XWD    0,DBG%DUMP
  8266. C.89:    XWD    0,U.82
  8267. C.90:    XWD    0,U.59
  8268. C.91:    POINT    8,U.59,7
  8269. C.92:    POINT    8,U.59,23
  8270. C.93:    POINT    8,U.59,31
  8271. C.94:    POINT    8,U.59+1,7
  8272. C.95:    POINT    8,U.59,15
  8273. C.96:    XWD    0,LAST%ERROR
  8274.  
  8275. ; Routine Size:  218 words
  8276.  
  8277.  
  8278. ;   5234  1    %SBTTL 'CALC%BLOCK%CHECK'
  8279. ;   5235  1    ROUTINE CALC%BLOCK%CHECK (POINTER, LENGTH) =
  8280. ;   5236  1    
  8281. ;   5237  1    !++
  8282. ;   5238  1    ! FUNCTIONAL DESCRIPTION:
  8283. ;   5239  1    !
  8284. ;   5240  1    !    This routine will calculate the proper value for the block check
  8285. ;   5241  1    !    for a given message.  The value it returns is dependant upon the
  8286. ;   5242  1    !    type of block check requested in BLK%CHK%TYPE.
  8287. ;   5243  1    !
  8288. ;   5244  1    ! CALLING SEQUENCE:
  8289. ;   5245  1    !
  8290. ;   5246  1    !    CHKSUM = CALC%BLOCK%CHECK (.POINTER, .LENGTH);
  8291. ;   5247  1    !
  8292. ;   5248  1    ! INPUT PARAMETERS:
  8293. ;   5249  1    !
  8294. ;   5250  1    !    POINTER - A character pointer to the first character to be
  8295. ;   5251  1    !        included in the block check.
  8296. ;   5252  1    !
  8297. ;   5253  1    !    LENGTH - The number of characters to be included.
  8298. ;   5254  1    !
  8299. ;   5255  1    ! IMPLICIT INPUTS:
  8300. ;   5256  1    !
  8301. ;   5257  1    !    BLK%CHK%TYPE - The type of block check to generate.
  8302. ;   5258  1    !
  8303. ;   5259  1    ! OUPTUT PARAMETERS:
  8304. ;   5260  1    !
  8305. ;   5261  1    !    The value is the block check.
  8306. ;   5262  1    !
  8307. ;   5263  1    ! IMPLICIT OUTPUTS:
  8308. ;   5264  1    !
  8309. ;   5265  1    !    None.
  8310. ;   5266  1    !
  8311. ;   5267  1    ! COMPLETION CODES:
  8312. ;   5268  1    !
  8313. ;   5269  1    !    None.
  8314. ;   5270  1    !
  8315. ;   5271  1    ! SIDE EFFECTS:
  8316. ;   5272  1    !
  8317. ;   5273  1    !    None.
  8318. ;   5274  1    !
  8319. ;   5275  1    !--
  8320. ;   5276  1    
  8321. ;   5277  2        BEGIN
  8322. ;   5278  2    
  8323. ;   5279  2        LOCAL
  8324. ;   5280  2        CHAR%MASK,                ! Mask for stripping bits
  8325. ;   5281  2        BLOCK%CHECK;                ! To build initial block check value
  8326. ;   5282  2    
  8327. ;   5283  2        BLOCK%CHECK = 0;                ! Start out at 0
  8328. ;   5284  2    !
  8329. ;   5285  2    ! Set mask for characters so that we calculate the block check correctly
  8330. ;   5286  2    !
  8331. ;   5287  2        CHAR%MASK = (IF .PARITY%TYPE EQL PR%NONE THEN %O'377' ELSE %O'177');
  8332. ;   5288  2    
  8333. ;   5289  2        CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF
  8334. ;   5290  2        SET
  8335. ;   5291  2    
  8336. ;   5292  2        [CHK%1CHAR, CHK%2CHAR] :
  8337. ;   5293  2    
  8338. ;   5294  2            INCR I FROM 1 TO .LENGTH DO
  8339. ;   5295  2            BLOCK%CHECK = .BLOCK%CHECK + (CH$RCHAR%A (POINTER) AND .CHAR%MASK);
  8340. ;   5296  2    
  8341. ;   5297  2        [CHK%CRC] :
  8342. ;   5298  3            BEGIN
  8343. ;   5299  3    !
  8344. ;   5300  3    ! Ensure that the calculation is done with correct type of characters
  8345. ;   5301  3    !
  8346. ;   5302  3    
  8347. ;   5303  3            LOCAL
  8348. ;   5304  3            TMP%PTR;            ! Temp pointer for copying chars
  8349. ;   5305  3    
  8350. ;   5306  3            TMP%PTR = .POINTER;
  8351. ;   5307  3    
  8352. ;   5308  3            IF .PARITY%TYPE NEQ PR%NONE        ![136] Strip high bit if any parity applied
  8353. ;   5309  3            THEN
  8354. ;   5310  3    
  8355. ;   5311  3            INCR I FROM 1 TO .LENGTH DO
  8356. ;   5312  3                CH$WCHAR%A ((CH$RCHAR (.TMP%PTR) AND %O'177'), TMP%PTR);
  8357. ;   5313  3    
  8358. ;   5314  3            BLOCK%CHECK = CRCCLC (.POINTER, .LENGTH);
  8359. ;   5315  2            END;
  8360. ;   5316  2        TES;
  8361. ;   5317  2    
  8362. ;   5318  2        IF .BLK%CHK%TYPE EQL CHK%1CHAR
  8363. ;   5319  2        THEN
  8364. ;   5320  2        BLOCK%CHECK = (.BLOCK%CHECK + ((.BLOCK%CHECK AND %O'300')/%O'100')) AND %O'77';
  8365. ;   5321  2    
  8366. ;   5322  2        RETURN .BLOCK%CHECK;            ! Return the correct value
  8367. ;   5323  1        END;                    ! End of CALC%BLOCK%CHK
  8368.  
  8369.  
  8370. ; CALC%BLOCK%CHECK
  8371. U.19:    SETZ    AC5,                ;                                        5283
  8372.     MOVE    AC4,PARITY%TYPE            ;                                        5287
  8373.     JUMPN    AC4,L.347
  8374.     MOVEI    AC3,377
  8375.     JRST    L.348
  8376. L.347:    MOVEI    AC3,177
  8377. L.348:    MOVE    AC1,U.48            ;                                        5289
  8378.     SUBI    AC1,61
  8379.     JRST    L.349(AC1)
  8380. L.349:    JRST    L.350
  8381.     JRST    L.350
  8382.     JRST    L.353
  8383. L.350:    SETZ    AC2,                ;                                        5294
  8384.     JRST    L.352
  8385. L.351:    ILDB    AC1,-2(SP)            ;                                        5295
  8386.     AND    AC1,AC3
  8387.     ADD    AC5,AC1
  8388. L.352:    ADDI    AC2,1                ;                                        5294
  8389.     CAMG    AC2,-1(SP)
  8390.     JRST    L.351
  8391.     JRST    L.357                ;                                        5289
  8392. L.353:    MOVE    AC1,-2(SP)            ;                                        5306
  8393.     JUMPE    AC4,L.356            ;                                        5308
  8394.     MOVE    AC4,-1(SP)            ;                                        5311
  8395.     SETZ    AC3,
  8396.     JRST    L.355
  8397. L.354:    MOVE    AC2,AC1                ;                                        5312
  8398.     ILDB    AC2,AC2
  8399.     ANDI    AC2,177
  8400.     IDPB    AC2,AC1
  8401. L.355:    ADDI    AC3,1                ;                                        5311
  8402.     CAMG    AC3,AC4
  8403.     JRST    L.354
  8404. L.356:    PUSH    SP,-2(SP)            ;                                        5314
  8405.     PUSH    SP,-2(SP)
  8406.     PUSHJ    SP,CRCCLC
  8407.     MOVE    AC5,AC1
  8408.     ADJSP    SP,-2                ;                                        5298
  8409. L.357:    MOVEI    AC1,61                ;                                        5318
  8410.     CAME    AC1,U.48
  8411.     JRST    L.358
  8412.     MOVE    AC1,AC5                ;                                        5320
  8413.     ANDI    AC1,300
  8414.     IDIVI    AC1,100
  8415.     ADD    AC1,AC5
  8416.     LDB    AC5,C.18
  8417. L.358:    MOVE    AC1,AC5                ;                                        5277
  8418.     POPJ    SP,                ;                                        5235
  8419.  
  8420. ; Routine Size:  48 words
  8421.  
  8422.  
  8423. ;   5324  1    %SBTTL 'NORMALIZE%FILE - Put file name into normal form'
  8424. ;   5325  1    ROUTINE NORMALIZE%FILE (FILE%ADDRESS, FILE%LENGTH, NAME%LENGTH, TYPE%LENGTH) :
  8425. ;   5326  1     NOVALUE =
  8426. ;   5327  1    
  8427. ;   5328  1    !++
  8428. ;   5329  1    ! FUNCTIONAL DESCRIPTION:
  8429. ;   5330  1    !
  8430. ;   5331  1    !    This routine will ensure that a file specification is in normal
  8431. ;   5332  1    !    form.  It does this by replacing all non-alphanumeric characters
  8432. ;   5333  1    !    (except the first period) with "X".  It will also ensure that
  8433. ;   5334  1    !    the resulting specification (of form name.type) has only
  8434. ;   5335  1    !    a specified number of characters in the name portion and type portion.
  8435. ;   5336  1    !
  8436. ;   5337  1    ! CALLING SEQUENCE:
  8437. ;   5338  1    !
  8438. ;   5339  1    !    NORMALIZE%FILE (FILE%ADDRESS, FILE%LENGTH, NAME%LENGTH, TYPE%LENGTH);
  8439. ;   5340  1    !
  8440. ;   5341  1    ! INPUT PARAMETERS:
  8441. ;   5342  1    !
  8442. ;   5343  1    !    FILE%ADDRESS - Address of file specification string to be normalized
  8443. ;   5344  1    !
  8444. ;   5345  1    !    FILE%LENGTH - Length of file specification
  8445. ;   5346  1    !
  8446. ;   5347  1    !    NAME%LENGTH - Maximum length desired for "name" portion.
  8447. ;   5348  1    !
  8448. ;   5349  1    !    TYPE%LENGTH - Maximum length desired for "type" portion.
  8449. ;   5350  1    !
  8450. ;   5351  1    !    With both NAME%LENGTH and TYPE%LENGTH, a negative value indicates
  8451. ;   5352  1    !    unlimited lenght.
  8452. ;   5353  1    !
  8453. ;   5354  1    ! IMPLICIT INPUTS:
  8454. ;   5355  1    !
  8455. ;   5356  1    !    None.
  8456. ;   5357  1    !
  8457. ;   5358  1    ! OUPTUT PARAMETERS:
  8458. ;   5359  1    !
  8459. ;   5360  1    !    FILE%LENGTH - The length of the resulting file spec
  8460. ;   5361  1    !
  8461. ;   5362  1    !    NAME%LENGTH - The actual length of the resulting file name
  8462. ;   5363  1    !
  8463. ;   5364  1    !    TYPE%LENGTH - The actual length of the resulting file type
  8464. ;   5365  1    !
  8465. ;   5366  1    ! IMPLICIT OUTPUTS:
  8466. ;   5367  1    !
  8467. ;   5368  1    !    None.
  8468. ;   5369  1    !
  8469. ;   5370  1    ! COMPLETION CODES:
  8470. ;   5371  1    !
  8471. ;   5372  1    !    None.
  8472. ;   5373  1    !
  8473. ;   5374  1    ! SIDE EFFECTS:
  8474. ;   5375  1    !
  8475. ;   5376  1    !    None.
  8476. ;   5377  1    !
  8477. ;   5378  1    !--
  8478. ;   5379  1    
  8479. ;   5380  2        BEGIN
  8480. ;   5381  2    
  8481. ;   5382  2        LOCAL
  8482. ;   5383  2        CH,                    ! Character being processed
  8483. ;   5384  2        POINTER,                ! Pointer to file spec
  8484. ;   5385  2        WRT%POINTER,                ! Pointer to write file spec
  8485. ;   5386  2        WRT%SIZE,
  8486. ;   5387  2        FIRST%PERIOD,                ! Flag we have seen a period
  8487. ;   5388  2        IGNORE%BAD,                ! Flag we should ignore bad characters
  8488. ;   5389  2        BAD%CHAR,                ! Flag this character was bad
  8489. ;   5390  2        FILE%CTR,                ! Counter for overall length
  8490. ;   5391  2        NAME%CTR,                ! Counter for name characters
  8491. ;   5392  2        TYPE%CTR;                ! Counter for type characters
  8492. ;   5393  2    
  8493. ;   5394  2        FILE%CTR = 0;
  8494. ;   5395  2        NAME%CTR = 0;
  8495. ;   5396  2        TYPE%CTR = 0;
  8496. ;   5397  2        WRT%SIZE = 0;
  8497. ;   5398  2        FIRST%PERIOD = FALSE;            ! No periods yet
  8498. ;   5399  2        POINTER = CH$PTR (.FILE%ADDRESS);        ! Set up pointer to file name
  8499. ;   5400  2        WRT%POINTER = .POINTER;
  8500. ;   5401  2    
  8501. ;   5402  2        IF .NAME%LENGTH EQL 0 THEN FIRST%PERIOD = TRUE;    ! Pretend we did name already
  8502. ;   5403  2    
  8503. ;   5404  2        IGNORE%BAD = FALSE;
  8504. ;   5405  2    
  8505. ;   5406  2        IF .NAME%LENGTH GTR 0
  8506. ;   5407  2        THEN
  8507. ;   5408  3        BEGIN
  8508. ;   5409  3    
  8509. ;   5410  3        DECR I FROM ..FILE%LENGTH TO 0 DO
  8510. ;   5411  3    
  8511. ;   5412  3            IF CH$RCHAR%A (POINTER) EQL %C'.'
  8512. ;   5413  3            THEN
  8513. ;   5414  4            BEGIN
  8514. ;   5415  4            IGNORE%BAD = TRUE;
  8515. ;   5416  4            EXITLOOP;
  8516. ;   5417  3            END;
  8517. ;   5418  3    
  8518. ;   5419  2        END;
  8519. ;   5420  2    
  8520. ;   5421  2        POINTER = .WRT%POINTER;
  8521. ;   5422  2    
  8522. ;   5423  2        WHILE .FILE%CTR LSS ..FILE%LENGTH DO
  8523. ;   5424  3        BEGIN
  8524. ;   5425  3        CH = CH$RCHAR%A (POINTER);        ! Get a character
  8525. ;   5426  3        FILE%CTR = .FILE%CTR + 1;
  8526. ;   5427  3    
  8527. ;   5428  3        IF (.CH LSS %C'0' AND (.CH NEQ %C'.' OR .FIRST%PERIOD)) OR .CH GTR %C'z' OR
  8528. ;   5429  4    (.CH GTR %C'9'
  8529. ;   5430  4            AND .CH LSS %C'A') OR (.CH GTR %C'Z' AND .CH LSS %C'a')
  8530. ;   5431  3        THEN
  8531. ;   5432  4            BEGIN
  8532. ;   5433  4            BAD%CHAR = TRUE;
  8533. ;   5434  4            CH = %C'X';
  8534. ;   5435  4            END
  8535. ;   5436  3        ELSE
  8536. ;   5437  4            BEGIN
  8537. ;   5438  4            BAD%CHAR = FALSE;
  8538. ;   5439  4    
  8539. ;   5440  4            IF .CH GEQ %C'a' THEN CH = .CH - (%C'a' - %C'A');
  8540. ;   5441  4    
  8541. ;   5442  3            END;
  8542. ;   5443  3    
  8543. ;   5444  3        IF .CH EQL %C'.'
  8544. ;   5445  3        THEN
  8545. ;   5446  4            BEGIN
  8546. ;   5447  4            FIRST%PERIOD = TRUE;
  8547. ;   5448  4            CH$WCHAR%A (.CH, WRT%POINTER);
  8548. ;   5449  4            WRT%SIZE = .WRT%SIZE + 1;
  8549. ;   5450  4            END
  8550. ;   5451  3        ELSE
  8551. ;   5452  3    
  8552. ;   5453  3            IF NOT .BAD%CHAR OR NOT .IGNORE%BAD
  8553. ;   5454  3            THEN
  8554. ;   5455  3    
  8555. ;   5456  3            IF NOT .FIRST%PERIOD
  8556. ;   5457  3            THEN
  8557. ;   5458  4                BEGIN
  8558. ;   5459  4    
  8559. ;   5460  4                IF .NAME%LENGTH LSS 0 OR .NAME%CTR LSS .NAME%LENGTH
  8560. ;   5461  4                THEN
  8561. ;   5462  5                BEGIN
  8562. ;   5463  5                NAME%CTR = .NAME%CTR + 1;
  8563. ;   5464  5                WRT%SIZE = .WRT%SIZE + 1;
  8564. ;   5465  5                CH$WCHAR%A (.CH, WRT%POINTER);
  8565. ;   5466  4                END;
  8566. ;   5467  4    
  8567. ;   5468  4                END
  8568. ;   5469  3            ELSE
  8569. ;   5470  3    
  8570. ;   5471  3                IF .TYPE%LENGTH LSS 0 OR .TYPE%CTR LSS .TYPE%LENGTH
  8571. ;   5472  3                THEN
  8572. ;   5473  4                BEGIN
  8573. ;   5474  4                TYPE%CTR = .TYPE%CTR + 1;
  8574. ;   5475  4                WRT%SIZE = .WRT%SIZE + 1;
  8575. ;   5476  4                CH$WCHAR%A (.CH, WRT%POINTER);
  8576. ;   5477  3                END;
  8577. ;   5478  3    
  8578. ;   5479  2        END;
  8579. ;   5480  2    
  8580. ;   5481  2        .FILE%LENGTH = .WRT%SIZE;
  8581. ;   5482  2        CH$WCHAR%A (CHR%NUL, WRT%POINTER);
  8582. ;   5483  1        END;                    ! End of NORMALIZE%FILE
  8583.  
  8584.  
  8585. ; NORMALIZE%FILE
  8586. U.27:    PUSH    SP,AC10                ;                                        5325
  8587.     PUSH    SP,AC11
  8588.     PUSH    SP,AC12
  8589.     PUSH    SP,AC13
  8590.     PUSH    SP,AC14
  8591.     PUSH    SP,AC16
  8592.     SETZB    AC16,AC11            ;                                        5394
  8593.     SETZB    AC10,AC12            ;                                        5396
  8594.     SETZ    AC13,                ;                                        5398
  8595.     MOVE    AC1,-12(SP)            ;                                        5399
  8596.     MOVEI    AC1,-1(AC1)
  8597.     HRLI    AC1,10700
  8598.     MOVE    AC4,AC1                ;                                        5400
  8599.     SKIPN    AC2,-10(SP)            ;                                        5402
  8600.     MOVEI    AC13,1
  8601.     SETZ    AC14,                ;                                        5404
  8602.     JUMPLE    AC2,L.361            ;                                        5406
  8603.     MOVE    AC2,-11(SP)            ;                                        5410
  8604.     MOVE    AC3,0(AC2)
  8605.     AOJA    AC3,L.360
  8606. L.359:    ILDB    AC2,AC1                ;                                        5412
  8607.     CAIE    AC2,56
  8608.     JRST    L.360
  8609.     MOVEI    AC14,1                ;                                        5415
  8610.     JRST    L.361                ;                                        5414
  8611. L.360:    SOJGE    AC3,L.359            ;                                        5410
  8612. L.361:    MOVE    AC1,AC4                ;                                        5421
  8613. L.362:    MOVE    AC3,-11(SP)            ;                                        5423
  8614.     CAML    AC16,0(AC3)
  8615.     JRST    L.374
  8616.     ILDB    AC2,AC1                ;                                        5425
  8617.     ADDI    AC16,1                ;                                        5426
  8618.     CAIL    AC2,60                ;                                        5428
  8619.     JRST    L.363
  8620.     CAIN    AC2,56
  8621.     TRNE    AC13,1
  8622.     JRST    L.365
  8623. L.363:    CAILE    AC2,172
  8624.     JRST    L.365
  8625.     CAIG    AC2,71                ;                                        5429
  8626.     JRST    L.364
  8627.     CAIGE    AC2,101                ;                                        5430
  8628.     JRST    L.365
  8629. L.364:    CAILE    AC2,132
  8630.     CAIL    AC2,141
  8631.     JRST    L.366
  8632. L.365:    MOVEI    AC5,1                ;                                        5433
  8633.     MOVEI    AC2,130                ;                                        5434
  8634.     JRST    L.367                ;                                        5428
  8635. L.366:    SETZ    AC5,                ;                                        5438
  8636.     CAIL    AC2,141                ;                                        5440
  8637.     SUBI    AC2,40
  8638. L.367:    CAIE    AC2,56                ;                                        5444
  8639.     JRST    L.368
  8640.     MOVEI    AC13,1                ;                                        5447
  8641.     IDPB    AC2,AC4                ;                                        5448
  8642.     AOJA    AC12,L.362            ;                                        5444
  8643. L.368:    TRNN    AC5,1                ;                                        5453
  8644.     JRST    L.369
  8645.     TRNE    AC14,1
  8646.     JRST    L.362
  8647. L.369:    TRNE    AC13,1                ;                                        5456
  8648.     JRST    L.371
  8649.     MOVE    AC3,-10(SP)            ;                                        5460
  8650.     JUMPL    AC3,L.370
  8651.     CAML    AC11,AC3
  8652.     JRST    L.362
  8653. L.370:    AOJA    AC11,L.373            ;                                        5463
  8654. L.371:    MOVE    AC3,-7(SP)            ;                                        5471
  8655.     JUMPL    AC3,L.372
  8656.     CAML    AC10,AC3
  8657.     JRST    L.362
  8658. L.372:    ADDI    AC10,1                ;                                        5474
  8659. L.373:    ADDI    AC12,1                ;                                        5475
  8660.     IDPB    AC2,AC4                ;                                        5476
  8661.     JRST    L.362                ;                                        5471
  8662. L.374:    MOVE    AC1,-11(SP)            ;                                        5481
  8663.     MOVEM    AC12,0(AC1)
  8664.     SETZ    AC1,                ;                                        5482
  8665.     IDPB    AC1,AC4
  8666.     POP    SP,AC16                ;                                        5325
  8667.     POP    SP,AC14
  8668.     POP    SP,AC13
  8669.     POP    SP,AC12
  8670.     POP    SP,AC11
  8671.     POP    SP,AC10
  8672.     POPJ    SP,
  8673.  
  8674. ; Routine Size:  87 words
  8675.  
  8676.  
  8677. ;   5484  1    %SBTTL 'Buffer filling -- Main routine'
  8678. ;   5485  1    ROUTINE BFR%FILL (FIRST%FLAG) =
  8679. ;   5486  1    
  8680. ;   5487  1    !++
  8681. ;   5488  1    ! FUNCTIONAL DESCRIPTION:
  8682. ;   5489  1    !
  8683. ;   5490  1    !    This routine will fill the buffer with data from the file.  It
  8684. ;   5491  1    !    will do all the quoting that is required.
  8685. ;   5492  1    !
  8686. ;   5493  1    ! CALLING SEQUENCE:
  8687. ;   5494  1    !
  8688. ;   5495  1    !    EOF%FLAG = BFR%FILL(.FIRST%FLAG);
  8689. ;   5496  1    !
  8690. ;   5497  1    ! INPUT PARAMETERS:
  8691. ;   5498  1    !
  8692. ;   5499  1    !    FIRST%FLAG - Flag whether first call for this file
  8693. ;   5500  1    !
  8694. ;   5501  1    ! IMPLICIT INPUTS:
  8695. ;   5502  1    !
  8696. ;   5503  1    !    None.
  8697. ;   5504  1    !
  8698. ;   5505  1    ! OUTPUT PARAMETERS:
  8699. ;   5506  1    !
  8700. ;   5507  1    !    True - Buffer filled may be at end of file.
  8701. ;   5508  1    !    False - At end of file.
  8702. ;   5509  1    !
  8703. ;   5510  1    ! IMPLICIT OUTPUTS:
  8704. ;   5511  1    !
  8705. ;   5512  1    !    Number of characters stored in the buffer.
  8706. ;   5513  1    !
  8707. ;   5514  1    ! COMPLETION CODES:
  8708. ;   5515  1    !
  8709. ;   5516  1    !    None.
  8710. ;   5517  1    !
  8711. ;   5518  1    ! SIDE EFFECTS:
  8712. ;   5519  1    !
  8713. ;   5520  1    !    None.
  8714. ;   5521  1    !
  8715. ;   5522  1    !--
  8716. ;   5523  1    
  8717. ;   5524  2        BEGIN
  8718. ;   5525  2    
  8719. ;   5526  2        LITERAL
  8720. ;   5527  2        NO%CHAR = -1,                ! No character next
  8721. ;   5528  2        EOF%CHAR = -2;                ! EOF seen
  8722. ;   5529  2    
  8723. ;   5530  2        LOCAL
  8724. ;   5531  2        I,                    ! Temp loop index
  8725. ;   5532  2        MAX%SIZE,                ! Maximum size of data
  8726. ;   5533  2        POINTER;                ! Pointer into the message buffer
  8727. ;   5534  2    
  8728. ;   5535  2        OWN
  8729. ;   5536  2        NEXT%CHR,                ! Saved character
  8730. ;   5537  2        STATUS,                    ! Status value
  8731. ;   5538  2        REPEAT%COUNT,                ! Number of times character repeated
  8732. ;   5539  2        CHAR%8%BIT,                ! 8 bit character from file
  8733. ;   5540  2        CHRS : VECTOR [5],            ! String needed to represent character
  8734. ;   5541  2        CHR%IDX,                ! Index into CHRS
  8735. ;   5542  2        OLD%CHAR%8%BIT,                ! Previous 8-bit character
  8736. ;   5543  2        OLD%CHRS : VECTOR [5],            ! String for previous character
  8737. ;   5544  2        OLD%CHR%IDX;                ! Index for previous character
  8738. ;   5545  2    
  8739. ;   5546  2        ROUTINE GET%QUOTED%CHAR =
  8740. ;   5547  2    !
  8741. ;   5548  2    ! This routine gets a character from the file and returns both
  8742. ;   5549  2    ! the character and the string needed to represent the character
  8743. ;   5550  2    ! if it needs quoting.
  8744. ;   5551  2    !
  8745. ;   5552  3        BEGIN
  8746. ;   5553  3    
  8747. ;   5554  3        IF .NEXT%CHR GEQ 0
  8748. ;   5555  3        THEN
  8749. ;   5556  4            BEGIN
  8750. ;   5557  4            CHAR%8%BIT = .NEXT%CHR;
  8751. ;   5558  4            NEXT%CHR = NO%CHAR;
  8752. ;   5559  4            STATUS = KER%NORMAL;
  8753. ;   5560  4            END
  8754. ;   5561  3        ELSE
  8755. ;   5562  3    
  8756. ;   5563  3            IF .NEXT%CHR EQL NO%CHAR
  8757. ;   5564  3            THEN
  8758. ;   5565  3            STATUS = (.GET%CHR%ROUTINE) (CHAR%8%BIT)
  8759. ;   5566  3            ELSE
  8760. ;   5567  3            STATUS = KER%EOF;
  8761. ;   5568  3    
  8762. ;   5569  3        IF .STATUS EQL KER%NORMAL
  8763. ;   5570  3        THEN
  8764. ;   5571  4            BEGIN
  8765. ;   5572  4    !
  8766. ;   5573  4    ! Determine if we should just quote the character
  8767. ;   5574  4    !    Either:
  8768. ;   5575  4    !        Character is a delete (177 octal)
  8769. ;   5576  4    !    or    Character is a control character (less than 40 octal)
  8770. ;   5577  4    !    or    Character is a quote character
  8771. ;   5578  4    !    or    Character is the repeat character and doing repeat compression
  8772. ;   5579  4    !    or    Character is an eight bit quote character and doing eight bit
  8773. ;   5580  4    !          quoting.
  8774. ;   5581  4    !
  8775. ;   5582  4    
  8776. ;   5583  5            IF ((.CHAR%8%BIT AND %O'177') LSS %C' ') OR ((.CHAR%8%BIT AND %O'177') EQL
  8777. ;   5584  5     CHR%DEL) OR (
  8778. ;   5585  6            (.CHAR%8%BIT AND %O'177') EQL .RCV%QUOTE%CHR) OR (.FLAG%REPEAT AND (
  8779. ;   5586  7    (.CHAR%8%BIT AND
  8780. ;   5587  6            %O'177') EQL .REPT%CHR)) OR (.FLAG%8QUOTE AND ((.CHAR%8%BIT AND %O'177') EQL
  8781. ;   5588  5            .SEND%8QUOTE%CHR))
  8782. ;   5589  4            THEN
  8783. ;   5590  5            BEGIN
  8784. ;   5591  5    !
  8785. ;   5592  5    ! If the character is a control character or delete we must do a CTL(Character)
  8786. ;   5593  5    ! so it is something that we can be sure we can send.
  8787. ;   5594  5    !
  8788. ;   5595  5    
  8789. ;   5596  6            IF ((.CHAR%8%BIT AND %O'177') LSS %C' ') OR ((.CHAR%8%BIT AND %O'177') EQL
  8790. ;   5597  6     CHR%DEL)
  8791. ;   5598  5            THEN
  8792. ;   5599  6                CHRS [0] = CTL (.CHAR%8%BIT)
  8793. ;   5600  5            ELSE
  8794. ;   5601  5                CHRS [0] = .CHAR%8%BIT;
  8795. ;   5602  5    
  8796. ;   5603  5            CHR%IDX = 1;
  8797. ;   5604  5            CHRS [1] = .RCV%QUOTE%CHR;    ![035] Use character we said we would send
  8798. ;   5605  5            END
  8799. ;   5606  4            ELSE
  8800. ;   5607  5            BEGIN
  8801. ;   5608  5            CHR%IDX = 0;
  8802. ;   5609  5            CHRS [0] = .CHAR%8%BIT;
  8803. ;   5610  4            END;
  8804. ;   5611  4    
  8805. ;   5612  4            END
  8806. ;   5613  3        ELSE
  8807. ;   5614  3    
  8808. ;   5615  3            IF .STATUS NEQ KER%EOF THEN KRM%ERROR (.STATUS);    ! Report error
  8809. ;   5616  3    
  8810. ;   5617  3        RETURN .STATUS;
  8811. ;   5618  2        END;
  8812.  
  8813.  
  8814.     RELOC    1025
  8815. ; NEXT%CHR
  8816. U.83:    BLOCK    1
  8817. ; STATUS
  8818. U.84:    BLOCK    1
  8819. ; REPEAT%COUNT
  8820. U.85:    BLOCK    1
  8821. ; CHAR%8%BIT
  8822. U.86:    BLOCK    1
  8823. ; CHRS
  8824. U.87:    BLOCK    5
  8825. ; CHR%IDX
  8826. U.88:    BLOCK    1
  8827. ; OLD%CHAR%8%BIT
  8828. U.89:    BLOCK    1
  8829. ; OLD%CHRS
  8830. U.90:    BLOCK    5
  8831. ; OLD%CHR%IDX
  8832. U.91:    BLOCK    1
  8833.  
  8834.  
  8835.     RELOC    405672
  8836. ; GET%QUOTED%CHAR
  8837. U.92:    MOVE    AC1,U.83            ;                                        5554
  8838.     JUMPL    AC1,L.375
  8839.     MOVEM    AC1,U.86            ;                                        5557
  8840.     SETOM    U.83                ;                                        5558
  8841.     MOVEI    AC1,13                ;                                        5559
  8842.     JRST    L.377
  8843. L.375:    CAME    AC1,C.36            ;                                        5563
  8844.     JRST    L.376
  8845.     MOVE    AC1,U.67            ;                                        5565
  8846.     PUSH    SP,C.98
  8847.     PUSHJ    SP,0(AC1)
  8848.     MOVEM    AC1,U.84
  8849.     ADJSP    SP,-1
  8850.     JRST    L.378                ;                                        5563
  8851. L.376:    MOVEI    AC1,113                ;                                        5567
  8852. L.377:    MOVEM    AC1,U.84
  8853. L.378:    MOVE    AC1,U.84            ;                                        5569
  8854.     CAIE    AC1,13
  8855.     JRST    L.383
  8856.     MOVE    AC2,U.86            ;                                        5583
  8857.     LDB    AC1,C.97
  8858.     SETZ    AC3,
  8859.     CAIL    AC1,40
  8860.     JRST    L.379
  8861.     MOVEI    AC3,1
  8862.     JRST    L.381
  8863. L.379:    CAIE    AC1,177
  8864.     CAMN    AC1,RCV%QUOTE%CHR        ;                                        5584
  8865.     JRST    L.381
  8866.     MOVEI    AC4,1                ;                                        5585
  8867.     TDNN    AC4,U.50
  8868.     JRST    L.380
  8869.     CAMN    AC1,U.38
  8870.     JRST    L.381
  8871. L.380:    MOVEI    AC4,1                ;                                        5587
  8872.     TDNE    AC4,U.49
  8873.     CAME    AC1,U.45
  8874.     JRST    L.382
  8875. L.381:    TRNN    AC3,1                ;                                        5596
  8876.     CAIN    AC1,177
  8877.     TRC    AC2,100                ;                                        5599
  8878.     MOVEM    AC2,U.87            ;                                        5601
  8879.     MOVEI    AC1,1                ;                                        5603
  8880.     MOVEM    AC1,U.88
  8881.     MOVE    AC1,RCV%QUOTE%CHR        ;                                        5604
  8882.     MOVEM    AC1,U.87+1
  8883.     JRST    L.384                ;                                        5583
  8884. L.382:    SETZM    U.88                ;                                        5608
  8885.     MOVEM    AC2,U.87            ;                                        5609
  8886.     JRST    L.384                ;                                        5569
  8887. L.383:    CAIN    AC1,113                ;                                        5615
  8888.     JRST    L.384
  8889.     PUSH    SP,AC1
  8890.     PUSHJ    SP,KRM%ERROR
  8891.     ADJSP    SP,-1
  8892. L.384:    MOVE    AC1,U.84            ;                                        5552
  8893.     POPJ    SP,                ;                                        5546
  8894. C.97:    POINT    7,AC2,35
  8895. C.98:    XWD    0,U.86
  8896.  
  8897. ; Routine Size:  59 words
  8898.  
  8899.  
  8900. ;   5619  2        ROUTINE GET%8%QUOTED%CHAR =
  8901. ;   5620  2    !
  8902. ;   5621  2    ! This routine will get the quoted representation of a character
  8903. ;   5622  2    ! (by calling GET%QUOTED%CHAR), and return the 8th-bit quoted
  8904. ;   5623  2    ! representation.
  8905. ;   5624  2    !
  8906. ;   5625  3        BEGIN
  8907. ;   5626  3    
  8908. ;   5627  3        IF (STATUS = GET%QUOTED%CHAR ()) EQL KER%NORMAL
  8909. ;   5628  3        THEN
  8910. ;   5629  4            BEGIN
  8911. ;   5630  4    !
  8912. ;   5631  4    ! Determine if we must quote the eighth bit (parity bit on)
  8913. ;   5632  4    !
  8914. ;   5633  4    
  8915. ;   5634  5            IF (((.CHRS [0] AND %O'177') NEQ .CHRS [0]) AND .FLAG%8QUOTE)
  8916. ;   5635  4            THEN
  8917. ;   5636  5            BEGIN
  8918. ;   5637  5            CHRS [0] = .CHRS [0] AND %O'177';
  8919. ;   5638  5            CHR%IDX = .CHR%IDX + 1;
  8920. ;   5639  5            CHRS [.CHR%IDX] = .SEND%8QUOTE%CHR;
  8921. ;   5640  4            END;
  8922. ;   5641  4    
  8923. ;   5642  3            END;
  8924. ;   5643  3    
  8925. ;   5644  3        RETURN .STATUS;
  8926. ;   5645  2        END;
  8927.  
  8928.  
  8929. ; GET%8%QUOTED%CHAR
  8930. U.93:    PUSHJ    SP,U.92                ;                                        5627
  8931.     MOVEM    AC1,U.84
  8932.     CAIE    AC1,13
  8933.     JRST    L.385
  8934.     LDB    AC1,C.99            ;                                        5634
  8935.     CAMN    AC1,U.87
  8936.     JRST    L.385
  8937.     MOVEI    AC1,1
  8938.     TDNN    AC1,U.49
  8939.     JRST    L.385
  8940.     LDB    AC1,C.99            ;                                        5637
  8941.     MOVEM    AC1,U.87
  8942.     AOS    AC1,U.88            ;                                        5639
  8943.     MOVE    AC2,U.45
  8944.     MOVEM    AC2,U.87(AC1)
  8945. L.385:    MOVE    AC1,U.84            ;                                        5625
  8946.     POPJ    SP,                ;                                        5619
  8947. C.99:    POINT    7,U.87,35
  8948.  
  8949. ; Routine Size:  18 words
  8950.  
  8951.  
  8952. ;   5646  2    !
  8953. ;   5647  2    ! Start of code for BFR%FILL
  8954. ;   5648  2    !
  8955. ;   5649  2    ! Initialize pointer and count
  8956. ;   5650  2    !
  8957. ;   5651  2        SIZE = 0;
  8958. ;   5652  2        IF .SEND%PKT%SIZE GTR 94                           ! [108]
  8959. ;   5653  2        THEN                                   ! [108]
  8960. ;   5654  3        BEGIN                                   ! [108]
  8961. ;   5655  3        POINTER = CH$PTR (SND%MSG, PKT%MSGX, CHR%SIZE);               ! [108]
  8962. ;   5656  3        MAX%SIZE = .SEND%PKT%SIZE - PKT%MSGX + 1 - (.BLK%CHK%TYPE - CHK%1CHAR);
  8963. ;   5657  3        END                                   ! [108]
  8964. ;   5658  2        ELSE                                   ! [108]
  8965. ;   5659  3        BEGIN                                   ! [108]
  8966. ;   5660  3        POINTER = CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE);               ! [108]
  8967. ;   5661  3        MAX%SIZE = .SEND%PKT%SIZE - PKT%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR);
  8968. ;   5662  2            END;                                   ! [108]
  8969. ;   5663  2    !
  8970. ;   5664  2    ! If last call got an error or eof, return it now
  8971. ;   5665  2    !
  8972. ;   5666  2    
  8973. ;   5667  2        IF NOT .FIRST%FLAG AND (.STATUS NEQ KER%NORMAL) THEN RETURN .STATUS;
  8974. ;   5668  2    
  8975. ;   5669  2    !
  8976. ;   5670  2    ! If first time for a file prime the pump with the first character.
  8977. ;   5671  2    !
  8978. ;   5672  2    
  8979. ;   5673  2        IF .FIRST%FLAG
  8980. ;   5674  2        THEN
  8981. ;   5675  3        BEGIN
  8982. ;   5676  3        FIRST%FLAG = FALSE;
  8983. ;   5677  3        NEXT%CHR = -1;                ! No backed up character
  8984. ;   5678  3    
  8985. ;   5679  3        IF .FLAG%8QUOTE THEN STATUS = GET%8%QUOTED%CHAR () ELSE STATUS =
  8986. ;   5680  3     GET%QUOTED%CHAR ();
  8987. ;   5681  3    
  8988. ;   5682  3        IF .STATUS NEQ KER%NORMAL THEN RETURN .STATUS;
  8989. ;   5683  3    
  8990. ;   5684  3        OLD%CHAR%8%BIT = .CHAR%8%BIT;
  8991. ;   5685  3    
  8992. ;   5686  3        INCR OLD%CHR%IDX FROM 0 TO .CHR%IDX DO
  8993. ;   5687  3            OLD%CHRS [.OLD%CHR%IDX] = .CHRS [.OLD%CHR%IDX];
  8994. ;   5688  3    
  8995. ;   5689  3        OLD%CHR%IDX = .CHR%IDX;
  8996. ;   5690  3        REPEAT%COUNT = 0;            ! Character was not repeated yet
  8997. ;   5691  3                            ! Will always be incremented
  8998. ;   5692  2        END;
  8999. ;   5693  2    
  9000. ;   5694  2    !
  9001. ;   5695  2    ! Otherwise, loop until we fill buffer
  9002. ;   5696  2    !
  9003. ;   5697  2    
  9004. ;   5698  2        WHILE .SIZE LSS .MAX%SIZE DO         ! Normal exit is via an EXITLOOP
  9005. ;   5699  3        BEGIN
  9006. ;   5700  3    !
  9007. ;   5701  3    ! Check if we are doing run compression
  9008. ;   5702  3    !
  9009. ;   5703  3    
  9010. ;   5704  3        IF .FLAG%REPEAT
  9011. ;   5705  3        THEN
  9012. ;   5706  4            BEGIN
  9013. ;   5707  4    !
  9014. ;   5708  4    ! Here with previous character in OLD%xxx.  As long as we
  9015. ;   5709  4    ! are getting the same character, just count the run.
  9016. ;   5710  4    !
  9017. ;   5711  4    
  9018. ;   5712  4            WHILE (.CHAR%8%BIT EQL .OLD%CHAR%8%BIT) AND (.REPEAT%COUNT LSS 94) DO
  9019. ;   5713  5            BEGIN
  9020. ;   5714  5            REPEAT%COUNT = .REPEAT%COUNT + 1;
  9021. ;   5715  5    
  9022. ;   5716  5            IF .FLAG%8QUOTE THEN STATUS = GET%8%QUOTED%CHAR () ELSE STATUS =
  9023. ;   5717  5     GET%QUOTED%CHAR ();
  9024. ;   5718  5    
  9025. ;   5719  5            IF .STATUS NEQ KER%NORMAL
  9026. ;   5720  5            THEN
  9027. ;   5721  5    
  9028. ;   5722  5                IF .STATUS NEQ KER%EOF
  9029. ;   5723  5                THEN
  9030. ;   5724  5                CHAR%8%BIT = NO%CHAR
  9031. ;   5725  5                ELSE
  9032. ;   5726  6                BEGIN
  9033. ;   5727  6                CHAR%8%BIT = EOF%CHAR;
  9034. ;   5728  6                CHR%IDX = -1;
  9035. ;   5729  5                END;
  9036. ;   5730  5    
  9037. ;   5731  4            END;
  9038. ;   5732  4    
  9039. ;   5733  5            IF .OLD%CHR%IDX + 1 + 2 LSS ((.OLD%CHR%IDX + 1)*.REPEAT%COUNT)
  9040. ;   5734  4            THEN
  9041. ;   5735  5            BEGIN
  9042. ;   5736  5    
  9043. ;   5737  5            IF .SIZE + .OLD%CHR%IDX + 1 + 2 GTR .MAX%SIZE
  9044. ;   5738  5            THEN
  9045. ;   5739  6                BEGIN
  9046. ;   5740  6    
  9047. ;   5741  6                IF .CHAR%8%BIT EQL .OLD%CHAR%8%BIT
  9048. ;   5742  6                THEN
  9049. ;   5743  7                BEGIN
  9050. ;   5744  7                NEXT%CHR = .CHAR%8%BIT;
  9051. ;   5745  7                REPEAT%COUNT = .REPEAT%COUNT - 1;
  9052. ;   5746  6                END;
  9053. ;   5747  6    
  9054. ;   5748  6                IF .CHAR%8%BIT EQL EOF%CHAR
  9055. ;   5749  6                THEN
  9056. ;   5750  7                BEGIN
  9057. ;   5751  7                NEXT%CHR = EOF%CHAR;    ! Remember EOF for next time
  9058. ;   5752  7                STATUS = KER%NORMAL;    ! And give good return now
  9059. ;   5753  6                END;
  9060. ;   5754  6    
  9061. ;   5755  6                EXITLOOP;
  9062. ;   5756  5                END;
  9063. ;   5757  5    
  9064. ;   5758  5            OLD%CHRS [.OLD%CHR%IDX + 1] = CHAR (.REPEAT%COUNT);
  9065. ;   5759  5            OLD%CHRS [.OLD%CHR%IDX + 2] = .REPT%CHR;
  9066. ;   5760  5            OLD%CHR%IDX = .OLD%CHR%IDX + 2;
  9067. ;   5761  5    !
  9068. ;   5762  5    ! Count the number of file characters this represents
  9069. ;   5763  5    !
  9070. ;   5764  5            SMSG%DATA%CHARS = .SMSG%DATA%CHARS + .REPEAT%COUNT - 1;
  9071. ;   5765  5            FILE%CHARS = .FILE%CHARS + .REPEAT%COUNT - 1;
  9072. ;   5766  5            REPEAT%COUNT = 1;        ! Only one time for this string
  9073. ;   5767  4            END;
  9074. ;   5768  4    
  9075. ;   5769  4    !
  9076. ;   5770  4    ! If we don't have enough room for this character, wait till next
  9077. ;   5771  4    ! time.
  9078. ;   5772  4    !
  9079. ;   5773  4    
  9080. ;   5774  4            IF .SIZE + (.OLD%CHR%IDX + 1)*.REPEAT%COUNT GTR .MAX%SIZE
  9081. ;   5775  4            THEN
  9082. ;   5776  5            BEGIN
  9083. ;   5777  5    ! If the next character is the same, the count will get incremented
  9084. ;   5778  5    ! next time we enter, so back it off now.
  9085. ;   5779  5    
  9086. ;   5780  5            IF .CHAR%8%BIT EQL .OLD%CHAR%8%BIT
  9087. ;   5781  5            THEN
  9088. ;   5782  6                BEGIN
  9089. ;   5783  6                NEXT%CHR = .CHAR%8%BIT;
  9090. ;   5784  6                REPEAT%COUNT = .REPEAT%COUNT - 1;
  9091. ;   5785  5                END;
  9092. ;   5786  5    !
  9093. ;   5787  5    ! If this is the last character of the file,
  9094. ;   5788  5    ! remember that for next time, but give good return now.
  9095. ;   5789  5    !
  9096. ;   5790  5            IF .CHAR%8%BIT EQL EOF%CHAR
  9097. ;   5791  5            THEN
  9098. ;   5792  6                BEGIN
  9099. ;   5793  6                NEXT%CHR = EOF%CHAR;
  9100. ;   5794  6                STATUS = KER%NORMAL
  9101. ;   5795  5                END;
  9102. ;   5796  5    
  9103. ;   5797  5            EXITLOOP;
  9104. ;   5798  4            END;
  9105. ;   5799  4    
  9106. ;   5800  4            SMSG%DATA%CHARS = .SMSG%DATA%CHARS + .REPEAT%COUNT;
  9107. ;   5801  4            FILE%CHARS = .FILE%CHARS + .REPEAT%COUNT;
  9108. ;   5802  4    
  9109. ;   5803  4            DECR REPEAT%COUNT FROM .REPEAT%COUNT TO 1 DO
  9110. ;   5804  4    
  9111. ;   5805  4            DECR I FROM .OLD%CHR%IDX TO 0 DO
  9112. ;   5806  5                BEGIN
  9113. ;   5807  5                CH$WCHAR%A (.OLD%CHRS [.I], POINTER);
  9114. ;   5808  5                SIZE = .SIZE + 1;
  9115. ;   5809  4                END;
  9116. ;   5810  4    
  9117. ;   5811  4    !
  9118. ;   5812  4    ! If we had to defer EOF condition, reactivate it now.
  9119. ;   5813  4    !
  9120. ;   5814  4            IF (.CHAR%8%BIT EQL EOF%CHAR) THEN STATUS = KER%EOF;
  9121. ;   5815  4    !
  9122. ;   5816  4    ! If we got an error (or EOF) then exit
  9123. ;   5817  4    !
  9124. ;   5818  4    
  9125. ;   5819  4            IF (.STATUS NEQ KER%NORMAL) THEN EXITLOOP;
  9126. ;   5820  4    
  9127. ;   5821  4    !
  9128. ;   5822  4    ! Otherwise, copy the character which broke the run
  9129. ;   5823  4    !
  9130. ;   5824  4            OLD%CHAR%8%BIT = .CHAR%8%BIT;
  9131. ;   5825  4    
  9132. ;   5826  4            INCR OLD%CHR%IDX FROM 0 TO .CHR%IDX DO
  9133. ;   5827  4            OLD%CHRS [.OLD%CHR%IDX] = .CHRS [.OLD%CHR%IDX];
  9134. ;   5828  4    
  9135. ;   5829  4            OLD%CHR%IDX = .CHR%IDX;
  9136. ;   5830  4            REPEAT%COUNT = 0;
  9137. ;   5831  4            END
  9138. ;   5832  3        ELSE
  9139. ;   5833  3    !
  9140. ;   5834  3    ! Here if we are not doing run compression.  We can do things much
  9141. ;   5835  3    ! easier.
  9142. ;   5836  3    !
  9143. ;   5837  4            BEGIN
  9144. ;   5838  4    
  9145. ;   5839  4            IF (.SIZE + .CHR%IDX + 1) GTR .MAX%SIZE THEN EXITLOOP;
  9146. ;   5840  4    
  9147. ;   5841  4            SMSG%DATA%CHARS = .SMSG%DATA%CHARS + 1;
  9148. ;   5842  4            FILE%CHARS = .FILE%CHARS + 1;
  9149. ;   5843  4    
  9150. ;   5844  4            DECR CHR%IDX FROM .CHR%IDX TO 0 DO
  9151. ;   5845  5            BEGIN
  9152. ;   5846  5            CH$WCHAR%A (.CHRS [.CHR%IDX], POINTER);
  9153. ;   5847  5            SIZE = .SIZE + 1;
  9154. ;   5848  4            END;
  9155. ;   5849  4    
  9156. ;   5850  4            IF .FLAG%8QUOTE THEN STATUS = GET%8%QUOTED%CHAR () ELSE STATUS =
  9157. ;   5851  4     GET%QUOTED%CHAR ();
  9158. ;   5852  4    
  9159. ;   5853  4            IF (.STATUS NEQ KER%NORMAL) THEN EXITLOOP;
  9160. ;   5854  4    
  9161. ;   5855  3            END;
  9162. ;   5856  3    
  9163. ;   5857  2        END;
  9164. ;   5858  2    
  9165. ;   5859  2    ! [108] Return negative size if we use extend packet format
  9166. ;   5860  2    
  9167. ;   5861  2        IF .SEND%PKT%SIZE GTR 94                           ! [108]
  9168. ;   5862  2        THEN                                   ! [108]
  9169. ;   5863  2        SIZE = -.SIZE;                               ! [108]
  9170. ;   5864  2    
  9171. ;   5865  2    !
  9172. ;   5866  2    ! Determine if we really stored anything into the buffer.
  9173. ;   5867  2    !
  9174. ;   5868  2    
  9175. ;   5869  2        IF .SIZE NEQ 0 THEN RETURN KER%NORMAL ELSE RETURN .STATUS;
  9176. ;   5870  2    
  9177. ;   5871  1        END;                    ! End of BFR%FILL
  9178.  
  9179.  
  9180. ; BFR%FILL
  9181. U.29:    PUSH    SP,AC14                ;                                        5485
  9182.     PUSH    SP,AC16
  9183.     SETZM    U.52                ;                                        5651
  9184.     MOVE    AC2,U.48            ;                                        5656
  9185.     SUBI    AC2,61
  9186.     MOVE    AC16,U.40            ;                                        5652
  9187.     CAIG    AC16,136
  9188.     JRST    L.386
  9189.     MOVE    AC14,C.66            ;                                        5655
  9190.     MOVE    AC1,AC16            ;                                        5656
  9191.     SUB    AC1,AC2
  9192.     MOVE    AC16,AC1
  9193.     SUBI    AC16,6
  9194.     JRST    L.387                ;                                        5652
  9195. L.386:    MOVE    AC14,C.32            ;                                        5660
  9196.     SUB    AC16,AC2            ;                                        5661
  9197.     SUBI    AC16,3
  9198. L.387:    MOVE    AC1,-3(SP)            ;                                        5667
  9199.     TRNE    AC1,1
  9200.     JRST    L.388
  9201.     MOVEI    AC2,13
  9202.     CAME    AC2,U.84
  9203.     JRST    L.418
  9204. L.388:    TRNN    AC1,1                ;                                        5673
  9205.     JRST    L.394
  9206.     SETZM    -3(SP)                ;                                        5676
  9207.     SETOM    U.83                ;                                        5677
  9208.     MOVEI    AC1,1                ;                                        5679
  9209.     TDNN    AC1,U.49
  9210.     JRST    L.389
  9211.     PUSHJ    SP,U.93
  9212.     JRST    L.390
  9213. L.389:    PUSHJ    SP,U.92                ;                                        5680
  9214. L.390:    MOVEM    AC1,U.84
  9215.     CAIE    AC1,13                ;                                        5682
  9216.     JRST    L.419
  9217.     MOVE    AC1,U.86            ;                                        5684
  9218.     MOVEM    AC1,U.89
  9219.     SETO    AC1,                ;                                        5686
  9220.     JRST    L.392
  9221. L.391:    MOVE    AC2,U.87(AC1)            ;                                        5687
  9222.     MOVEM    AC2,U.90(AC1)
  9223. L.392:    ADDI    AC1,1                ;                                        5686
  9224.     CAMG    AC1,U.88
  9225.     JRST    L.391
  9226. L.393:    MOVE    AC1,U.88            ;                                        5689
  9227.     MOVEM    AC1,U.91
  9228.     SETZM    U.85                ;                                        5690
  9229. L.394:    CAMG    AC16,U.52            ;                                        5698
  9230.     JRST    L.417
  9231.     MOVEI    AC1,1                ;                                        5704
  9232.     TDNN    AC1,U.50
  9233.     JRST    L.412
  9234. L.395:    MOVE    AC1,U.86            ;                                        5712
  9235.     CAME    AC1,U.89
  9236.     JRST    L.399
  9237.     MOVEI    AC1,136
  9238.     CAMG    AC1,U.85
  9239.     JRST    L.399
  9240.     AOS    U.85                ;                                        5714
  9241.     MOVEI    AC1,1                ;                                        5716
  9242.     TDNN    AC1,U.49
  9243.     JRST    L.396
  9244.     PUSHJ    SP,U.93
  9245.     JRST    L.397
  9246. L.396:    PUSHJ    SP,U.92                ;                                        5717
  9247. L.397:    MOVEM    AC1,U.84
  9248.     CAIN    AC1,13                ;                                        5719
  9249.     JRST    L.395
  9250.     CAIN    AC1,113                ;                                        5722
  9251.     JRST    L.398
  9252.     SETOM    U.86                ;                                        5724
  9253.     JRST    L.395                ;                                        5722
  9254. L.398:    HRROI    AC1,-2                ;                                        5727
  9255.     MOVEM    AC1,U.86
  9256.     SETOM    U.88                ;                                        5728
  9257.     JRST    L.395                ;                                        5719
  9258. L.399:    MOVE    AC2,U.91            ;                                        5733
  9259.     MOVE    AC4,AC2
  9260.     ADDI    AC4,3
  9261.     MOVE    AC1,AC2
  9262.     AOS    AC3,AC1
  9263.     IMUL    AC3,U.85
  9264.     CAML    AC4,AC3
  9265.     JRST    L.402
  9266.     MOVE    AC3,U.52            ;                                        5737
  9267.     ADD    AC3,AC2
  9268.     ADDI    AC3,3
  9269.     CAMG    AC3,AC16
  9270.     JRST    L.401
  9271.     MOVE    AC3,U.86            ;                                        5741
  9272.     CAME    AC3,U.89
  9273.     JRST    L.400
  9274.     MOVE    AC3,U.86            ;                                        5744
  9275.     MOVEM    AC3,U.83
  9276.     SOS    U.85                ;                                        5745
  9277. L.400:    HRROI    AC3,-2                ;                                        5748
  9278.     CAME    AC3,U.86
  9279.     JRST    L.417
  9280.     HRROI    AC3,-2                ;                                        5751
  9281.     MOVEM    AC3,U.83
  9282.     MOVEI    AC3,13                ;                                        5752
  9283.     MOVEM    AC3,U.84
  9284.     JRST    L.417                ;                                        5748
  9285. L.401:    MOVE    AC3,U.85            ;                                        5758
  9286.     ADDI    AC3,40
  9287.     MOVEM    AC3,U.90(AC1)
  9288.     MOVE    AC1,U.38            ;                                        5759
  9289.     MOVEM    AC1,U.90+2(AC2)
  9290.     MOVEI    AC1,2                ;                                        5760
  9291.     ADDM    AC1,U.91
  9292.     MOVE    AC1,SMSG%DATA%CHARS        ;                                        5764
  9293.     ADD    AC1,U.85
  9294.     SUBI    AC1,1
  9295.     MOVEM    AC1,SMSG%DATA%CHARS
  9296.     MOVE    AC1,U.61            ;                                        5765
  9297.     ADD    AC1,U.85
  9298.     SUBI    AC1,1
  9299.     MOVEM    AC1,U.61
  9300.     MOVEI    AC1,1                ;                                        5766
  9301.     MOVEM    AC1,U.85
  9302. L.402:    MOVE    AC1,U.91            ;                                        5774
  9303.     ADDI    AC1,1
  9304.     IMUL    AC1,U.85
  9305.     ADD    AC1,U.52
  9306.     CAMG    AC1,AC16
  9307.     JRST    L.404
  9308.     MOVE    AC1,U.86            ;                                        5780
  9309.     CAME    AC1,U.89
  9310.     JRST    L.403
  9311.     MOVE    AC1,U.86            ;                                        5783
  9312.     MOVEM    AC1,U.83
  9313.     SOS    U.85                ;                                        5784
  9314. L.403:    HRROI    AC1,-2                ;                                        5790
  9315.     CAME    AC1,U.86
  9316.     JRST    L.417
  9317.     HRROI    AC1,-2                ;                                        5793
  9318.     MOVEM    AC1,U.83
  9319.     MOVEI    AC1,13                ;                                        5794
  9320.     MOVEM    AC1,U.84
  9321.     JRST    L.417                ;                                        5790
  9322. L.404:    MOVE    AC1,U.85            ;                                        5800
  9323.     ADDM    AC1,SMSG%DATA%CHARS
  9324.     MOVE    AC1,U.85            ;                                        5801
  9325.     ADDM    AC1,U.61
  9326.     MOVE    AC3,U.85            ;                                        5803
  9327.     AOJA    AC3,L.408
  9328. L.405:    MOVE    AC1,U.91            ;                                        5805
  9329.     AOJA    AC1,L.407
  9330. L.406:    MOVE    AC2,U.90(AC1)            ;                                        5807
  9331.     IDPB    AC2,AC14
  9332.     AOS    U.52                ;                                        5808
  9333. L.407:    SOJGE    AC1,L.406            ;                                        5805
  9334. L.408:    SOJG    AC3,L.405            ;                                        5803
  9335.     HRROI    AC1,-2                ;                                        5814
  9336.     CAME    AC1,U.86
  9337.     JRST    L.409
  9338.     MOVEI    AC1,113
  9339.     MOVEM    AC1,U.84
  9340. L.409:    MOVEI    AC1,13                ;                                        5819
  9341.     CAME    AC1,U.84
  9342.     JRST    L.417
  9343.     MOVE    AC1,U.86            ;                                        5824
  9344.     MOVEM    AC1,U.89
  9345.     SETO    AC1,                ;                                        5826
  9346.     JRST    L.411
  9347. L.410:    MOVE    AC2,U.87(AC1)            ;                                        5827
  9348.     MOVEM    AC2,U.90(AC1)
  9349. L.411:    ADDI    AC1,1                ;                                        5826
  9350.     CAMG    AC1,U.88
  9351.     JRST    L.410
  9352.     JRST    L.393
  9353. L.412:    MOVE    AC1,U.52            ;                                        5839
  9354.     ADD    AC1,U.88
  9355.     ADDI    AC1,1
  9356.     CAMLE    AC1,AC16
  9357.     JRST    L.417
  9358.     AOS    SMSG%DATA%CHARS            ;                                        5841
  9359.     AOS    U.61                ;                                        5842
  9360.     MOVE    AC1,U.88            ;                                        5844
  9361.     AOJA    AC1,L.414
  9362. L.413:    MOVE    AC2,U.87(AC1)            ;                                        5846
  9363.     IDPB    AC2,AC14
  9364.     AOS    U.52                ;                                        5847
  9365. L.414:    SOJGE    AC1,L.413            ;                                        5844
  9366.     MOVEI    AC1,1                ;                                        5850
  9367.     TDNN    AC1,U.49
  9368.     JRST    L.415
  9369.     PUSHJ    SP,U.93
  9370.     JRST    L.416
  9371. L.415:    PUSHJ    SP,U.92                ;                                        5851
  9372. L.416:    MOVEM    AC1,U.84
  9373.     MOVEI    AC1,13                ;                                        5853
  9374.     CAMN    AC1,U.84
  9375.     JRST    L.394                ;                                        5698
  9376. L.417:    MOVEI    AC1,136                ;                                        5861
  9377.     CAMGE    AC1,U.40
  9378.     MOVNS    U.52                ;                                        5863
  9379.     SKIPN    U.52                ;                                        5869
  9380.     JRST    L.418
  9381.     MOVEI    AC1,13
  9382.     JRST    L.419
  9383. L.418:    MOVE    AC1,U.84
  9384. L.419:    POP    SP,AC16                ;                                        5485
  9385.     POP    SP,AC14
  9386.     POPJ    SP,
  9387.  
  9388. ; Routine Size:  206 words
  9389.  
  9390.  
  9391. ;   5872  1    %SBTTL 'BFR%EMPTY'
  9392. ;   5873  1    ROUTINE BFR%EMPTY =
  9393. ;   5874  1    
  9394. ;   5875  1    !++
  9395. ;   5876  1    ! FUNCTIONAL DESCRIPTION:
  9396. ;   5877  1    !
  9397. ;   5878  1    !    This routine will empty the data from the REC%MSG message buffer
  9398. ;   5879  1    !    to the file.  It will process quoting characters.
  9399. ;   5880  1    !
  9400. ;   5881  1    ! CALLING SEQUENCE:
  9401. ;   5882  1    !
  9402. ;   5883  1    !    Flag = BFR%EMPTY();
  9403. ;   5884  1    !
  9404. ;   5885  1    ! INPUT PARAMETERS:
  9405. ;   5886  1    !
  9406. ;   5887  1    !    None.
  9407. ;   5888  1    !
  9408. ;   5889  1    ! IMPLICIT INPUTS:
  9409. ;   5890  1    !
  9410. ;   5891  1    !    None.
  9411. ;   5892  1    !
  9412. ;   5893  1    ! OUTPUT PARAMETERS:
  9413. ;   5894  1    !
  9414. ;   5895  1    !    True - No problems writing the file.
  9415. ;   5896  1    !    False - I/O error writing the file.
  9416. ;   5897  1    !
  9417. ;   5898  1    ! IMPLICIT OUTPUTS:
  9418. ;   5899  1    !
  9419. ;   5900  1    !    None.
  9420. ;   5901  1    !
  9421. ;   5902  1    ! COMPLETION CODES:
  9422. ;   5903  1    !
  9423. ;   5904  1    !    None.
  9424. ;   5905  1    !
  9425. ;   5906  1    ! SIDE EFFECTS:
  9426. ;   5907  1    !
  9427. ;   5908  1    !    None.
  9428. ;   5909  1    !
  9429. ;   5910  1    !--
  9430. ;   5911  1    
  9431. ;   5912  2        BEGIN
  9432. ;   5913  2    
  9433. ;   5914  2        LOCAL
  9434. ;   5915  2        STATUS,                    ! Status returned by various routines
  9435. ;   5916  2        REPEAT%COUNT,                ! Count of times to repeat character
  9436. ;   5917  2        TURN%BIT%8%ON,                ! If eight bit quoting
  9437. ;   5918  2        COUNTER,                ! Count of the characters left
  9438. ;   5919  2        CHARACTER,                ! Character we are processing
  9439. ;   5920  2        POINTER;                ! Pointer to the data
  9440. ;   5921  2    
  9441. ;   5922  2        POINTER = CH$PTR (REC%MSG, .RECV%PKT%MSG, CHR%SIZE);           ! [108]
  9442. ;   5923  2        COUNTER = 0;
  9443. ;   5924  2    
  9444. ;   5925  2        WHILE (.COUNTER LSS .REC%LENGTH) DO
  9445. ;   5926  3        BEGIN
  9446. ;   5927  3        CHARACTER = CH$RCHAR%A (POINTER);
  9447. ;   5928  3        COUNTER = .COUNTER + 1;
  9448. ;   5929  3    !
  9449. ;   5930  3    ! If the character is the repeat character (and we are doing repeat
  9450. ;   5931  3    ! compression), then get the count.
  9451. ;   5932  3    !
  9452. ;   5933  3    
  9453. ;   5934  4        IF ((.CHARACTER EQL .REPT%CHR) AND .FLAG%REPEAT)
  9454. ;   5935  3        THEN
  9455. ;   5936  4            BEGIN
  9456. ;   5937  4            REPEAT%COUNT = UNCHAR (CH$RCHAR%A (POINTER) AND %O'177');
  9457. ;   5938  4            CHARACTER = CH$RCHAR%A (POINTER);
  9458. ;   5939  4            COUNTER = .COUNTER + 2;
  9459. ;   5940  4            END
  9460. ;   5941  3        ELSE
  9461. ;   5942  3            REPEAT%COUNT = 1;
  9462. ;   5943  3    
  9463. ;   5944  3    !
  9464. ;   5945  3    ! If the character is an eight bit quoting character and we are doing eight
  9465. ;   5946  3    ! bit quoting then turn on the flag so we turn the eighth bit on when we
  9466. ;   5947  3    ! get the real character.
  9467. ;   5948  3    !
  9468. ;   5949  3    
  9469. ;   5950  4        IF ((.CHARACTER EQL .SEND%8QUOTE%CHR) AND .FLAG%8QUOTE)
  9470. ;   5951  3        THEN
  9471. ;   5952  4            BEGIN
  9472. ;   5953  4            TURN%BIT%8%ON = TRUE;
  9473. ;   5954  4            COUNTER = .COUNTER + 1;
  9474. ;   5955  4            CHARACTER = CH$RCHAR%A (POINTER);
  9475. ;   5956  4            END
  9476. ;   5957  3        ELSE
  9477. ;   5958  3            TURN%BIT%8%ON = FALSE;
  9478. ;   5959  3    
  9479. ;   5960  3    !
  9480. ;   5961  3    ! Now determine if we are quoting the character.  If so then we must eat
  9481. ;   5962  3    ! the quoting character and get the real character.
  9482. ;   5963  3    !
  9483. ;   5964  3    
  9484. ;   5965  3        IF .CHARACTER EQL .SEND%QUOTE%CHR
  9485. ;   5966  3                        ![035] Is this character other Kermit sends as quote?
  9486. ;   5967  3        THEN
  9487. ;   5968  4            BEGIN
  9488. ;   5969  4            CHARACTER = CH$RCHAR%A (POINTER);
  9489. ;   5970  4            COUNTER = .COUNTER + 1;
  9490. ;   5971  4    !
  9491. ;   5972  4    ! Determine if we must undo what someone else has done to the character
  9492. ;   5973  4    !
  9493. ;   5974  4    
  9494. ;   5975  6            IF ((.CHARACTER AND %O'177') GEQ CTL (CHR%DEL)) AND ((.CHARACTER AND
  9495. ; P 5976  5     %O'177') LEQ CTL (
  9496. ;   5977  5                CHR%DEL) + %O'40')
  9497. ;   5978  4            THEN
  9498. ;   5979  4            CHARACTER = CTL (.CHARACTER);
  9499. ;   5980  4    
  9500. ;   5981  3            END;
  9501. ;   5982  3    
  9502. ;   5983  3    !
  9503. ;   5984  3    ! Turn on the eight bit if needed and then write the character out
  9504. ;   5985  3    !
  9505. ;   5986  3    
  9506. ;   5987  3        IF .TURN%BIT%8%ON THEN CHARACTER = .CHARACTER OR %O'200';
  9507. ;   5988  3    
  9508. ;   5989  3        RMSG%DATA%CHARS = .RMSG%DATA%CHARS + .REPEAT%COUNT;
  9509. ;   5990  3        FILE%CHARS = .FILE%CHARS + .REPEAT%COUNT;
  9510. ;   5991  3    
  9511. ;   5992  3        DECR REPEAT%COUNT FROM .REPEAT%COUNT TO 1 DO
  9512. ;   5993  4            BEGIN
  9513. ;   5994  4            STATUS = (.PUT%CHR%ROUTINE) (.CHARACTER);
  9514. ;   5995  4    
  9515. ;   5996  4            IF NOT .STATUS THEN RETURN .STATUS;
  9516. ;   5997  4    
  9517. ;   5998  3            END;
  9518. ;   5999  3    
  9519. ;   6000  2        END;
  9520. ;   6001  2    
  9521. ;   6002  2        RETURN KER%NORMAL;
  9522. ;   6003  1        END;                    ! End of BFR%EMPTY
  9523.  
  9524.  
  9525. ; BFR%EMPTY
  9526. U.28:    PUSH    SP,AC10                ;                                        5873
  9527.     PUSH    SP,AC11
  9528.     PUSH    SP,AC12
  9529.     PUSH    SP,AC13
  9530.     PUSH    SP,AC14
  9531.     PUSH    SP,AC16
  9532.     MOVE    AC1,C.27            ;                                        5922
  9533.     MOVE    AC14,U.39
  9534.     ADJBP    AC14,AC1
  9535.     SETZ    AC11,                ;                                        5923
  9536. L.420:    CAML    AC11,U.57            ;                                        5925
  9537.     JRST    L.429
  9538.     ILDB    AC12,AC14            ;                                        5927
  9539.     ADDI    AC11,1                ;                                        5928
  9540.     CAME    AC12,U.38            ;                                        5934
  9541.     JRST    L.421
  9542.     MOVEI    AC2,1
  9543.     TDNN    AC2,U.50
  9544.     JRST    L.421
  9545.     ILDB    AC2,AC14            ;                                        5937
  9546.     LDB    AC13,C.97
  9547.     SUBI    AC13,40
  9548.     ILDB    AC12,AC14            ;                                        5938
  9549.     ADDI    AC11,2                ;                                        5939
  9550.     JRST    L.422                ;                                        5934
  9551. L.421:    MOVEI    AC13,1                ;                                        5942
  9552. L.422:    CAME    AC12,U.45            ;                                        5950
  9553.     JRST    L.423
  9554.     MOVEI    AC2,1
  9555.     TDNN    AC2,U.49
  9556.     JRST    L.423
  9557.     MOVEI    AC10,1                ;                                        5953
  9558.     ADDI    AC11,1                ;                                        5954
  9559.     ILDB    AC12,AC14            ;                                        5955
  9560.     JRST    L.424                ;                                        5950
  9561. L.423:    SETZ    AC10,                ;                                        5958
  9562. L.424:    CAME    AC12,U.44            ;                                        5965
  9563.     JRST    L.425
  9564.     ILDB    AC12,AC14            ;                                        5969
  9565.     ADDI    AC11,1                ;                                        5970
  9566.     LDB    AC2,C.100            ;                                        5975
  9567.     CAIL    AC2,77
  9568.     CAILE    AC2,137
  9569.     JRST    L.425
  9570.     TRC    AC12,100            ;                                        5979
  9571. L.425:    TRNE    AC10,1                ;                                        5987
  9572.     TRO    AC12,200
  9573.     ADDM    AC13,RMSG%DATA%CHARS        ;                                        5989
  9574.     ADDM    AC13,U.61            ;                                        5990
  9575.     MOVE    AC16,AC13            ;                                        5992
  9576.     AOJA    AC16,L.428
  9577. L.426:    MOVE    AC2,U.68            ;                                        5994
  9578.     PUSH    SP,AC12
  9579.     PUSHJ    SP,0(AC2)
  9580.     TRNE    AC1,1                ;                                        5996
  9581.     JRST    L.427
  9582.     ADJSP    SP,-1
  9583.     JRST    L.430
  9584. L.427:    ADJSP    SP,-1                ;                                        5993
  9585. L.428:    SOJG    AC16,L.426            ;                                        5992
  9586.     JRST    L.420                ;                                        5925
  9587. L.429:    MOVEI    AC1,13                ;                                        5912
  9588. L.430:    POP    SP,AC16                ;                                        5873
  9589.     POP    SP,AC14
  9590.     POP    SP,AC13
  9591.     POP    SP,AC12
  9592.     POP    SP,AC11
  9593.     POP    SP,AC10
  9594.     POPJ    SP,
  9595. C.100:    POINT    7,AC12,35
  9596.  
  9597. ; Routine Size:  70 words
  9598.  
  9599.  
  9600. ;   6004  1    %SBTTL 'Buffer filling and emptying subroutines'
  9601. ;   6005  1    ROUTINE SET%STRING (POINTER, LENGTH, START) =
  9602. ;   6006  1    
  9603. ;   6007  1    !++
  9604. ;   6008  1    ! FUNCTIONAL DESCRIPTION:
  9605. ;   6009  1    !
  9606. ;   6010  1    !    This routine is used to set up the buffer filling and emptying
  9607. ;   6011  1    !    routines to use a string for input (or output) rather than
  9608. ;   6012  1    !    the file I/O routines.
  9609. ;   6013  1    !
  9610. ;   6014  1    ! CALLING SEQUENCE:
  9611. ;   6015  1    !
  9612. ;   6016  1    !    SET%STRING (.POINTER, .LENGTH, .START)
  9613. ;   6017  1    !
  9614. ;   6018  1    ! INPUT PARAMETERS:
  9615. ;   6019  1    !
  9616. ;   6020  1    !    POINTER - Character pointer to string
  9617. ;   6021  1    !
  9618. ;   6022  1    !    LENGTH - Number of characters in string
  9619. ;   6023  1    !
  9620. ;   6024  1    !    START - True to start string, false to end it
  9621. ;   6025  1    !
  9622. ;   6026  1    ! IMPLICIT INPUTS:
  9623. ;   6027  1    !
  9624. ;   6028  1    !    None.
  9625. ;   6029  1    !
  9626. ;   6030  1    ! OUPTUT PARAMETERS:
  9627. ;   6031  1    !
  9628. ;   6032  1    !    Returns 0 if START = TRUE, actual number of characters used
  9629. ;   6033  1    !    by last string if START = FALSE.
  9630. ;   6034  1    !
  9631. ;   6035  1    ! IMPLICIT OUTPUTS:
  9632. ;   6036  1    !
  9633. ;   6037  1    !    GET%CHR%ROUTINE and PUT%CHR%ROUTINE modifed so that string
  9634. ;   6038  1    !    routines are called instead of file I/O.
  9635. ;   6039  1    !
  9636. ;   6040  1    ! COMPLETION CODES:
  9637. ;   6041  1    !
  9638. ;   6042  1    !    None.
  9639. ;   6043  1    !
  9640. ;   6044  1    ! SIDE EFFECTS:
  9641. ;   6045  1    !
  9642. ;   6046  1    !    None.
  9643. ;   6047  1    !
  9644. ;   6048  1    !--
  9645. ;   6049  1    
  9646. ;   6050  2        BEGIN
  9647. ;   6051  2    
  9648. ;   6052  2        OWN
  9649. ;   6053  2        STR%POINTER,                ! Pointer to string
  9650. ;   6054  2        STR%LENGTH,                ! Length of string
  9651. ;   6055  2        STR%ORG%LENGTH,                ! Original length of string
  9652. ;   6056  2        OLD%GET%CHR,                ! Old get-char routine
  9653. ;   6057  2        OLD%PUT%CHR;                ! Old put-char routine
  9654. ;   6058  2    
  9655. ;   6059  2    !
  9656. ;   6060  2    ! Routine to get a character from the string
  9657. ;   6061  2    !
  9658. ;   6062  2        ROUTINE GET%STRING (CHAR%ADDRESS) =
  9659. ;   6063  3        BEGIN
  9660. ;   6064  3    !
  9661. ;   6065  3    ! If some characters are left, count down the length and get next character
  9662. ;   6066  3    ! Otherwise return and end of file indication.
  9663. ;   6067  3    !
  9664. ;   6068  3    
  9665. ;   6069  3        IF .STR%LENGTH GTR 0
  9666. ;   6070  3        THEN
  9667. ;   6071  4            BEGIN
  9668. ;   6072  4            STR%LENGTH = .STR%LENGTH - 1;
  9669. ;   6073  4            .CHAR%ADDRESS = CH$RCHAR%A (STR%POINTER);
  9670. ;   6074  4            RETURN KER%NORMAL;
  9671. ;   6075  4            END
  9672. ;   6076  3        ELSE
  9673. ;   6077  3            RETURN KER%EOF;
  9674. ;   6078  3    
  9675. ;   6079  2        END;                    ! End of GET%STRING
  9676.  
  9677.  
  9678.     RELOC    1046
  9679. ; STR%POINTER
  9680. U.94:    BLOCK    1
  9681. ; STR%LENGTH
  9682. U.95:    BLOCK    1
  9683. ; STR%ORG%LENGTH
  9684. U.96:    BLOCK    1
  9685. ; OLD%GET%CHR
  9686. U.97:    BLOCK    1
  9687. ; OLD%PUT%CHR
  9688. U.98:    BLOCK    1
  9689.  
  9690.  
  9691.     RELOC    406433
  9692. ; GET%STRING
  9693. U.99:    SKIPG    U.95                ;                                        6069
  9694.     JRST    L.431
  9695.     SOS    U.95                ;                                        6072
  9696.     MOVE    AC2,-1(SP)            ;                                        6073
  9697.     ILDB    AC1,U.94
  9698.     MOVEM    AC1,0(AC2)
  9699.     MOVEI    AC1,13                ;                                        6077
  9700.     POPJ    SP,
  9701. L.431:    MOVEI    AC1,113
  9702.     POPJ    SP,                ;                                        6062
  9703.  
  9704. ; Routine Size:  10 words
  9705.  
  9706.  
  9707. ;   6080  2        ROUTINE PUT%STRING (CHAR%VALUE) =
  9708. ;   6081  3        BEGIN
  9709. ;   6082  3    !
  9710. ;   6083  3    ! If there is enough room to store another character, store the character
  9711. ;   6084  3    ! and count it.  Otherwise return a line too long indication.
  9712. ;   6085  3    !
  9713. ;   6086  3    
  9714. ;   6087  3        IF .STR%LENGTH GTR 0
  9715. ;   6088  3        THEN
  9716. ;   6089  4            BEGIN
  9717. ;   6090  4            STR%LENGTH = .STR%LENGTH - 1;
  9718. ;   6091  4            CH$WCHAR%A (.CHAR%VALUE, STR%POINTER);
  9719. ;   6092  4            RETURN KER%NORMAL;
  9720. ;   6093  4            END
  9721. ;   6094  3        ELSE
  9722. ;   6095  3            RETURN KER%LINTOOLNG;
  9723. ;   6096  3    
  9724. ;   6097  2        END;                    ! End of PUT%STRING
  9725.  
  9726.  
  9727. ; PUT%STRING
  9728. U.100:    SKIPG    U.95                ;                                        6087
  9729.     JRST    L.432
  9730.     SOS    U.95                ;                                        6090
  9731.     MOVE    AC1,-1(SP)            ;                                        6091
  9732.     IDPB    AC1,U.94
  9733.     MOVEI    AC1,13                ;                                        6095
  9734.     POPJ    SP,
  9735. L.432:    MOVEI    AC1,102
  9736.     POPJ    SP,                ;                                        6080
  9737.  
  9738. ; Routine Size:  9 words
  9739.  
  9740.  
  9741. ;   6098  2    !
  9742. ;   6099  2    ! If we have a request to start a string (input or output), save the old
  9743. ;   6100  2    ! routines and set up ours.  Also save the string pointer and length for
  9744. ;   6101  2    ! use by our get/put routines.
  9745. ;   6102  2    ! Otherwise this is a request to stop using the string routines, so reset
  9746. ;   6103  2    ! the old routines and return the actual number of characters read or
  9747. ;   6104  2    ! written
  9748. ;   6105  2    !
  9749. ;   6106  2    
  9750. ;   6107  2        IF .START
  9751. ;   6108  2        THEN
  9752. ;   6109  3        BEGIN
  9753. ;   6110  3        STR%POINTER = .POINTER;
  9754. ;   6111  3        STR%ORG%LENGTH = .LENGTH;
  9755. ;   6112  3        STR%LENGTH = .LENGTH;
  9756. ;   6113  3        OLD%GET%CHR = .GET%CHR%ROUTINE;
  9757. ;   6114  3        OLD%PUT%CHR = .PUT%CHR%ROUTINE;
  9758. ;   6115  3        GET%CHR%ROUTINE = GET%STRING;
  9759. ;   6116  3        PUT%CHR%ROUTINE = PUT%STRING;
  9760. ;   6117  3        RETURN 0;
  9761. ;   6118  3        END
  9762. ;   6119  2        ELSE
  9763. ;   6120  3        BEGIN
  9764. ;   6121  3        GET%CHR%ROUTINE = .OLD%GET%CHR;
  9765. ;   6122  3        PUT%CHR%ROUTINE = .OLD%PUT%CHR;
  9766. ;   6123  3        RETURN .STR%ORG%LENGTH - .STR%LENGTH;
  9767. ;   6124  2        END;
  9768. ;   6125  2    
  9769. ;   6126  1        END;                    ! End of SET%STRING
  9770.  
  9771.  
  9772. ; SET%STRING
  9773. U.30:    MOVEI    AC1,1                ;                                        6107
  9774.     TDNN    AC1,-1(SP)
  9775.     JRST    L.433
  9776.     MOVE    AC1,-3(SP)            ;                                        6110
  9777.     MOVEM    AC1,U.94
  9778.     MOVE    AC1,-2(SP)            ;                                        6111
  9779.     MOVEM    AC1,U.96
  9780.     MOVE    AC1,-2(SP)            ;                                        6112
  9781.     MOVEM    AC1,U.95
  9782.     MOVE    AC1,U.67            ;                                        6113
  9783.     MOVEM    AC1,U.97
  9784.     MOVE    AC1,U.68            ;                                        6114
  9785.     MOVEM    AC1,U.98
  9786.     MOVEI    AC1,U.99            ;                                        6115
  9787.     MOVEM    AC1,U.67
  9788.     MOVEI    AC1,U.100            ;                                        6116
  9789.     MOVEM    AC1,U.68
  9790.     SETZ    AC1,                ;                                        6120
  9791.     POPJ    SP,
  9792. L.433:    MOVE    AC1,U.97            ;                                        6121
  9793.     MOVEM    AC1,U.67
  9794.     MOVE    AC1,U.98            ;                                        6122
  9795.     MOVEM    AC1,U.68
  9796.     MOVE    AC1,U.96            ;                                        6123
  9797.     SUB    AC1,U.95
  9798.     POPJ    SP,                ;                                        6005
  9799.  
  9800. ; Routine Size:  26 words
  9801.  
  9802.  
  9803. ;   6127  1    %SBTTL 'Add parity routine'
  9804. ;   6128  1    ROUTINE DO%PARITY (MESSAGE, LENGTH) : NOVALUE =
  9805. ;   6129  1    
  9806. ;   6130  1    !++
  9807. ;   6131  1    ! FUNCTIONAL DESCRIPTION:
  9808. ;   6132  1    !
  9809. ;   6133  1    !    This routine will add parity for a complete message that is to be
  9810. ;   6134  1    !    sent to the remote Kermit.
  9811. ;   6135  1    !
  9812. ;   6136  1    ! CALLING SEQUENCE:
  9813. ;   6137  1    !
  9814. ;   6138  1    !    DO%PARITY (Message%address, Message%length);
  9815. ;   6139  1    !
  9816. ;   6140  1    ! INPUT PARAMETERS:
  9817. ;   6141  1    !
  9818. ;   6142  1    !    Message%address - Address of the message to put parity on.
  9819. ;   6143  1    !    Message%length  - Lengtho of the message.
  9820. ;   6144  1    !
  9821. ;   6145  1    ! IMPLICIT INPUTS:
  9822. ;   6146  1    !
  9823. ;   6147  1    !    None.
  9824. ;   6148  1    !
  9825. ;   6149  1    ! OUTPUT PARAMETERS:
  9826. ;   6150  1    !
  9827. ;   6151  1    !    None.
  9828. ;   6152  1    !
  9829. ;   6153  1    ! IMPLICIT OUTPUTS:
  9830. ;   6154  1    !
  9831. ;   6155  1    !    None.
  9832. ;   6156  1    !
  9833. ;   6157  1    ! COMPLETION CODES:
  9834. ;   6158  1    !
  9835. ;   6159  1    !    None.
  9836. ;   6160  1    !
  9837. ;   6161  1    ! SIDE EFFECTS:
  9838. ;   6162  1    !
  9839. ;   6163  1    !    None.
  9840. ;   6164  1    !
  9841. ;   6165  1    !--
  9842. ;   6166  1    
  9843. ;   6167  2        BEGIN
  9844. ;   6168  2    
  9845. ;   6169  2        MAP
  9846. ;   6170  2        MESSAGE : REF VECTOR [CH$ALLOCATION (MAX%MSG, CHR%SIZE)];
  9847. ;   6171  2    
  9848. ;   6172  2        LOCAL
  9849. ;   6173  2        POINTER;                ! Point into the message
  9850. ;   6174  2    
  9851. ;   6175  2        IF NOT .DEV%PARITY%FLAG
  9852. ;   6176  2        THEN
  9853. ;   6177  3        BEGIN
  9854. ;   6178  3        POINTER = CH$PTR (.MESSAGE,, CHR%SIZE);
  9855. ;   6179  3    
  9856. ;   6180  3        INCR I FROM 1 TO .LENGTH DO
  9857. ;   6181  3            CH$WCHAR%A (GEN%PARITY (CH$RCHAR (.POINTER)), POINTER);
  9858. ;   6182  3    
  9859. ;   6183  2        END;
  9860. ;   6184  2    
  9861. ;   6185  1        END;                    ! End of DO%PARITY
  9862.  
  9863.  
  9864. ; DO%PARITY
  9865. U.22:    PUSH    SP,AC13                ;                                        6128
  9866.     PUSH    SP,AC14
  9867.     PUSH    SP,AC16
  9868.     MOVEI    AC1,1                ;                                        6175
  9869.     TDNE    AC1,DEV%PARITY%FLAG
  9870.     JRST    L.436
  9871.     MOVE    AC1,-5(SP)            ;                                        6178
  9872.     MOVEI    AC16,-1(AC1)
  9873.     HRLI    AC16,41000
  9874.     MOVE    AC13,-4(SP)            ;                                        6180
  9875.     SETZ    AC14,
  9876.     JRST    L.435
  9877. L.434:    MOVE    AC1,AC16            ;                                        6181
  9878.     ILDB    AC1,AC1
  9879.     PUSH    SP,AC1
  9880.     PUSHJ    SP,U.23
  9881.     IDPB    AC1,AC16
  9882.     ADJSP    SP,-1
  9883. L.435:    ADDI    AC14,1                ;                                        6180
  9884.     CAMG    AC14,AC13
  9885.     JRST    L.434
  9886. L.436:    POP    SP,AC16                ;                                        6128
  9887.     POP    SP,AC14
  9888.     POP    SP,AC13
  9889.     POPJ    SP,
  9890.  
  9891. ; Routine Size:  25 words
  9892.  
  9893.  
  9894. ;   6186  1    %SBTTL 'Parity routine'
  9895. ;   6187  1    
  9896. ;   6188  1    GLOBAL ROUTINE GEN%PARITY (CHARACTER) =
  9897. ;   6189  1    
  9898. ;   6190  1    !++
  9899. ;   6191  1    ! FUNCTIONAL DESCRIPTION:
  9900. ;   6192  1    !
  9901. ;   6193  1    !    This routine will add parity to the character that is supplied.
  9902. ;   6194  1    !
  9903. ;   6195  1    ! CALLING SEQUENCE:
  9904. ;   6196  1    !
  9905. ;   6197  1    !    CHARACTER = GEN%PARITY(CHARACTER)
  9906. ;   6198  1    !
  9907. ;   6199  1    ! INPUT PARAMETERS:
  9908. ;   6200  1    !
  9909. ;   6201  1    !    CHARACTER - Produce the parity for this character depending on the
  9910. ;   6202  1    !        setting of the SET PARITY switch.
  9911. ;   6203  1    !
  9912. ;   6204  1    ! IMPLICIT INPUTS:
  9913. ;   6205  1    !
  9914. ;   6206  1    !    None.
  9915. ;   6207  1    !
  9916. ;   6208  1    ! OUTPUT PARAMETERS:
  9917. ;   6209  1    !
  9918. ;   6210  1    !    None.
  9919. ;   6211  1    !
  9920. ;   6212  1    ! IMPLICIT OUTPUTS:
  9921. ;   6213  1    !
  9922. ;   6214  1    !    None.
  9923. ;   6215  1    !
  9924. ;   6216  1    ! COMPLETION CODES:
  9925. ;   6217  1    !
  9926. ;   6218  1    !    None.
  9927. ;   6219  1    !
  9928. ;   6220  1    ! SIDE EFFECTS:
  9929. ;   6221  1    !
  9930. ;   6222  1    !    None.
  9931. ;   6223  1    !
  9932. ;   6224  1    !--
  9933. ;   6225  1    
  9934. ;   6226  2        BEGIN
  9935. ;   6227  2    
  9936. ;   6228  2        LOCAL
  9937. ;   6229  2        TEMP%CHAR;
  9938. ;   6230  2    
  9939. ;   6231  2    
  9940. ;   6232  2        CASE .PARITY%TYPE FROM PR%MIN TO PR%MAX OF
  9941. ;   6233  2        SET
  9942. ;   6234  2    
  9943. ;   6235  2        [PR%NONE] :
  9944. ;   6236  2            RETURN .CHARACTER;
  9945. ;   6237  2    
  9946. ;   6238  2        [PR%SPACE] :
  9947. ;   6239  2            RETURN .CHARACTER AND %O'177';
  9948. ;   6240  2    
  9949. ;   6241  2        [PR%MARK] :
  9950. ;   6242  2            RETURN .CHARACTER OR %O'200';
  9951. ;   6243  2    
  9952. ;   6244  2        [PR%ODD] :
  9953. ;   6245  2            TEMP%CHAR = .CHARACTER AND %O'177' OR %O'200';
  9954. ;   6246  2    
  9955. ;   6247  2        [PR%EVEN] :
  9956. ;   6248  2            TEMP%CHAR = .CHARACTER AND %O'177';
  9957. ;   6249  2        TES;
  9958. ;   6250  2    
  9959. ;   6251  2        TEMP%CHAR = .TEMP%CHAR XOR (.TEMP%CHAR^-4);
  9960. ;   6252  2        TEMP%CHAR = .TEMP%CHAR XOR (.TEMP%CHAR^-2);
  9961. ;   6253  2    
  9962. ;   6254  2        IF .TEMP%CHAR<0, 2> EQL %B'01' OR .TEMP%CHAR<0, 2> EQL %B'10'
  9963. ;   6255  2        THEN
  9964. ;   6256  2        RETURN .CHARACTER AND %O'177' OR %O'200'
  9965. ;   6257  2        ELSE
  9966. ;   6258  2        RETURN .CHARACTER AND %O'177';
  9967. ;   6259  2    
  9968. ;   6260  1        END;                    ! End of GEN%PARITY
  9969.  
  9970.  
  9971. U.23:
  9972. GEN%PARITY::
  9973.     MOVE    AC3,-1(SP)            ;                                        6236
  9974.     MOVE    AC1,PARITY%TYPE            ;                                        6232
  9975.     JRST    L.437(AC1)
  9976. L.437:    JRST    L.438
  9977.     JRST    L.439
  9978.     JRST    L.441
  9979.     JRST    L.440
  9980.     JRST    L.444
  9981. L.438:    MOVE    AC1,AC3                ;                                        6236
  9982.     POPJ    SP,
  9983. L.439:    MOVE    AC1,AC3                ;                                        6242
  9984.     JRST    L.443
  9985. L.440:    LDB    AC1,C.101            ;                                        6245
  9986.     TROA    AC1,200
  9987. L.441:    LDB    AC1,C.101            ;                                        6248
  9988.     MOVE    AC2,AC1                ;                                        6251
  9989.     ASH    AC2,-4
  9990.     XOR    AC1,AC2
  9991.     MOVE    AC2,AC1                ;                                        6252
  9992.     ASH    AC2,-2
  9993.     XOR    AC1,AC2
  9994.     ANDI    AC1,3                ;                                        6254
  9995.     CAIN    AC1,1
  9996.     JRST    L.442
  9997.     CAIE    AC1,2
  9998.     JRST    L.444
  9999. L.442:    LDB    AC1,C.101            ;                                        6256
  10000. L.443:    TROA    AC1,200
  10001. L.444:    LDB    AC1,C.101            ;                                        6258
  10002.     POPJ    SP,                ;                                        6188
  10003. C.101:    POINT    7,AC3,35
  10004.  
  10005. ; Routine Size:  31 words
  10006.  
  10007.  
  10008. ;   6261  1    
  10009. ;   6262  1    %SBTTL 'Per transfer -- Initialization'
  10010. ;   6263  1    ROUTINE INIT%XFR : NOVALUE =
  10011. ;   6264  1    
  10012. ;   6265  1    !++
  10013. ;   6266  1    ! FUNCTIONAL DESCRIPTION:
  10014. ;   6267  1    !
  10015. ;   6268  1    !    This routine will initialize the various locations that the
  10016. ;   6269  1    !    send and receive statistics are kept.
  10017. ;   6270  1    !
  10018. ;   6271  1    ! CALLING SEQUENCE:
  10019. ;   6272  1    !
  10020. ;   6273  1    !    INIT%XFR();
  10021. ;   6274  1    !
  10022. ;   6275  1    ! INPUT PARAMETERS:
  10023. ;   6276  1    !
  10024. ;   6277  1    !    None.
  10025. ;   6278  1    !
  10026. ;   6279  1    ! IMPLICIT INPUTS:
  10027. ;   6280  1    !
  10028. ;   6281  1    !    None.
  10029. ;   6282  1    !
  10030. ;   6283  1    ! OUTPUT PARAMETERS:
  10031. ;   6284  1    !
  10032. ;   6285  1    !    None.
  10033. ;   6286  1    !
  10034. ;   6287  1    ! IMPLICIT OUTPUTS:
  10035. ;   6288  1    !
  10036. ;   6289  1    !    None.
  10037. ;   6290  1    !
  10038. ;   6291  1    ! COMPLETION CODES:
  10039. ;   6292  1    !
  10040. ;   6293  1    !    None.
  10041. ;   6294  1    !
  10042. ;   6295  1    ! SIDE EFFECTS:
  10043. ;   6296  1    !
  10044. ;   6297  1    !    None.
  10045. ;   6298  1    !
  10046. ;   6299  1    !--
  10047. ;   6300  1    
  10048. ;   6301  2        BEGIN
  10049. ;   6302  2    !
  10050. ;   6303  2    ! Determine if we should do 8 bit quoting
  10051. ;   6304  2    !
  10052. ;   6305  2    
  10053. ;   6306  2        IF .PARITY%TYPE NEQ PR%NONE
  10054. ;   6307  2        THEN
  10055. ;   6308  3        BEGIN
  10056. ;   6309  3        RECV%8QUOTE%CHR = .RCV%8QUOTE%CHR;
  10057. ;   6310  3        END
  10058. ;   6311  2        ELSE
  10059. ;   6312  3        BEGIN
  10060. ;   6313  3        RECV%8QUOTE%CHR = %C'Y';
  10061. ;   6314  2        END;
  10062. ;   6315  2    
  10063. ;   6316  2        NUM%RETRIES = 0;
  10064. ;   6317  2        SEND%8QUOTE%CHR = .RECV%8QUOTE%CHR;
  10065. ;   6318  2    !
  10066. ;   6319  2    ! Send parameters that may not get set before we need them for the first
  10067. ;   6320  2    ! time.
  10068. ;   6321  2    !
  10069. ;   6322  2        SEND%PKT%SIZE = ABS (.SND%PKT%SIZE);
  10070. ;   6323  2        SEND%NPAD = ABS (.SND%NPAD);
  10071. ;   6324  2        SEND%PADCHAR = ABS (.SND%PADCHAR);
  10072. ;   6325  2        SEND%TIMEOUT = ABS (.SND%TIMEOUT);
  10073. ;   6326  2        SEND%EOL = ABS (.SND%EOL);
  10074. ;   6327  2        SEND%QUOTE%CHR = ABS (.SND%QUOTE%CHR);
  10075. ;   6328  2    !
  10076. ;   6329  2    ! For initialization messages, we must use single character checksum
  10077. ;   6330  2    ! When the send-init/ack sequence has been done, we will switch to the
  10078. ;   6331  2    ! desired form
  10079. ;   6332  2    !
  10080. ;   6333  2        BLK%CHK%TYPE = CHK%1CHAR;
  10081. ;   6334  2        INI%CHK%TYPE = .CHKTYPE;            ! Send desired type
  10082. ;   6335  2    !
  10083. ;   6336  2    ! Set desired repeat character for use in we are doing send-init
  10084. ;   6337  2    ! Will be overwritten by other ends desired character if it sends
  10085. ;   6338  2    ! the send-init.
  10086. ;   6339  2    !
  10087. ;   6340  2        REPT%CHR = .SET%REPT%CHR;
  10088. ;   6341  2    !
  10089. ;   6342  2    ! Assume packet assembly/disassembly uses characters from a file
  10090. ;   6343  2    !
  10091. ;   6344  2        GET%CHR%ROUTINE = GET%FILE;            ! Initialize the get-a-char routine
  10092. ;   6345  2        PUT%CHR%ROUTINE = PUT%FILE;            ! And the put-a-char
  10093. ;   6346  2        TEXT%HEAD%FLAG = FALSE;            ! And assume we will get an File header
  10094. ;   6347  2        NO%FILE%NEEDED = FALSE;            ! Assume will do file ops
  10095. ;   6348  2        INIT%PKT%SENT = FALSE;            ! And no server-init sent
  10096. ;   6349  2    !
  10097. ;   6350  2    ! Always start with packet number 0
  10098. ;   6351  2    !
  10099. ;   6352  2        MSG%NUMBER = 0;                ! Initial message number
  10100. ;   6353  2    !
  10101. ;   6354  2    ! Stats information
  10102. ;   6355  2    !
  10103. ;   6356  2        SMSG%TOTAL%CHARS = 0;
  10104. ;   6357  2        RMSG%TOTAL%CHARS = 0;
  10105. ;   6358  2        SMSG%DATA%CHARS = 0;
  10106. ;   6359  2        RMSG%DATA%CHARS = 0;
  10107. ;   6360  2        SMSG%COUNT = 0;
  10108. ;   6361  2        RMSG%COUNT = 0;
  10109. ;   6362  2        RMSG%NAKS = 0;
  10110. ;   6363  2        SMSG%NAKS = 0;
  10111. ;   6364  2        XFR%TIME = SY%TIME ();
  10112. ;   6365  1        END;                    ! End of INIT%XFR
  10113.  
  10114.  
  10115. ; INIT%XFR
  10116. U.32:    SKIPE    PARITY%TYPE            ;                                        6306
  10117.     SKIPA    AC1,RCV%8QUOTE%CHR        ;                                        6309
  10118.     MOVEI    AC1,131                ;                                        6313
  10119.     MOVEM    AC1,U.37
  10120.     SETZM    U.54                ;                                        6316
  10121.     MOVE    AC1,U.37            ;                                        6317
  10122.     MOVEM    AC1,U.45
  10123.     MOVE    AC1,SND%PKT%SIZE        ;                                        6322
  10124.     MOVMM    AC1,U.40
  10125.     MOVE    AC1,SND%NPAD            ;                                        6323
  10126.     MOVMM    AC1,U.41
  10127.     MOVE    AC1,SND%PADCHAR            ;                                        6324
  10128.     MOVMM    AC1,U.42
  10129.     MOVE    AC1,SND%TIMEOUT            ;                                        6325
  10130.     MOVMM    AC1,SEND%TIMEOUT
  10131.     MOVE    AC1,SND%EOL            ;                                        6326
  10132.     MOVMM    AC1,U.43
  10133.     MOVE    AC1,SND%QUOTE%CHR        ;                                        6327
  10134.     MOVMM    AC1,U.44
  10135.     MOVEI    AC1,61                ;                                        6333
  10136.     MOVEM    AC1,U.48
  10137.     MOVE    AC1,CHKTYPE            ;                                        6334
  10138.     MOVEM    AC1,U.47
  10139.     MOVE    AC1,SET%REPT%CHR        ;                                        6340
  10140.     MOVEM    AC1,U.38
  10141.     MOVEI    AC1,GET%FILE            ;                                        6344
  10142.     MOVEM    AC1,U.67
  10143.     MOVEI    AC1,PUT%FILE            ;                                        6345
  10144.     MOVEM    AC1,U.68
  10145.     SETZM    U.62                ;                                        6346
  10146.     SETZM    U.63                ;                                        6347
  10147.     SETZM    U.64                ;                                        6348
  10148.     SETZM    U.55                ;                                        6352
  10149.     SETZM    SMSG%TOTAL%CHARS        ;                                        6356
  10150.     SETZM    RMSG%TOTAL%CHARS        ;                                        6357
  10151.     SETZM    SMSG%DATA%CHARS            ;                                        6358
  10152.     SETZM    RMSG%DATA%CHARS            ;                                        6359
  10153.     SETZM    SMSG%COUNT            ;                                        6360
  10154.     SETZM    RMSG%COUNT            ;                                        6361
  10155.     SETZM    RMSG%NAKS            ;                                        6362
  10156.     SETZM    SMSG%NAKS            ;                                        6363
  10157.     PUSHJ    SP,SY%TIME            ;                                        6364
  10158.     MOVEM    AC1,XFR%TIME
  10159.     POPJ    SP,                ;                                        6263
  10160.  
  10161. ; Routine Size:  44 words
  10162.  
  10163.  
  10164. ;   6366  1    %SBTTL 'Statistics -- Finish message transfer'
  10165. ;   6367  1    ROUTINE END%STATS : NOVALUE =
  10166. ;   6368  1    
  10167. ;   6369  1    !++
  10168. ;   6370  1    ! FUNCTIONAL DESCRIPTION:
  10169. ;   6371  1    !
  10170. ;   6372  1    !    This routine will end the collection of the statistices.  It will
  10171. ;   6373  1    !    update the various overall statistic parameters.
  10172. ;   6374  1    !
  10173. ;   6375  1    ! CALLING SEQUENCE:
  10174. ;   6376  1    !
  10175. ;   6377  1    !    END%STATS ();
  10176. ;   6378  1    !
  10177. ;   6379  1    ! INPUT PARAMETERS:
  10178. ;   6380  1    !
  10179. ;   6381  1    !    None.
  10180. ;   6382  1    !
  10181. ;   6383  1    ! IMPLICIT INPUTS:
  10182. ;   6384  1    !
  10183. ;   6385  1    !    None.
  10184. ;   6386  1    !
  10185. ;   6387  1    ! OUTPUT PARAMETERS:
  10186. ;   6388  1    !
  10187. ;   6389  1    !    None.
  10188. ;   6390  1    !
  10189. ;   6391  1    ! IMPLICIT OUTPUTS:
  10190. ;   6392  1    !
  10191. ;   6393  1    !    None.
  10192. ;   6394  1    !
  10193. ;   6395  1    ! COMPLETION CODES:
  10194. ;   6396  1    !
  10195. ;   6397  1    !    None.
  10196. ;   6398  1    !
  10197. ;   6399  1    ! SIDE EFFECTS:
  10198. ;   6400  1    !
  10199. ;   6401  1    !    None.
  10200. ;   6402  1    !
  10201. ;   6403  1    !--
  10202. ;   6404  1    
  10203. ;   6405  2        BEGIN
  10204. ;   6406  2        SND%COUNT = .SND%COUNT + .SMSG%COUNT;
  10205. ;   6407  2        RCV%COUNT = .RCV%COUNT + .RMSG%COUNT;
  10206. ;   6408  2        SND%TOTAL%CHARS = .SND%TOTAL%CHARS + .SMSG%TOTAL%CHARS;
  10207. ;   6409  2        SND%DATA%CHARS = .SND%DATA%CHARS + .SMSG%DATA%CHARS;
  10208. ;   6410  2        RCV%TOTAL%CHARS = .RCV%TOTAL%CHARS + .RMSG%TOTAL%CHARS;
  10209. ;   6411  2        RCV%DATA%CHARS = .RCV%DATA%CHARS + .RMSG%DATA%CHARS;
  10210. ;   6412  2        SND%NAKS = .SND%NAKS + .SMSG%NAKS;
  10211. ;   6413  2        RCV%NAKS = .RCV%NAKS + .RMSG%NAKS;
  10212. ;   6414  2        XFR%TIME = SY%TIME () - .XFR%TIME;
  10213. ;   6415  2        TOTAL%TIME = .TOTAL%TIME + .XFR%TIME;
  10214. ;   6416  1        END;                    ! End of END%STATS
  10215.  
  10216.  
  10217. ; END%STATS
  10218. U.18:    MOVE    AC1,SMSG%COUNT            ;                                        6406
  10219.     ADDM    AC1,SND%COUNT
  10220.     MOVE    AC1,RMSG%COUNT            ;                                        6407
  10221.     ADDM    AC1,RCV%COUNT
  10222.     MOVE    AC1,SMSG%TOTAL%CHARS        ;                                        6408
  10223.     ADDM    AC1,SND%TOTAL%CHARS
  10224.     MOVE    AC1,SMSG%DATA%CHARS        ;                                        6409
  10225.     ADDM    AC1,SND%DATA%CHARS
  10226.     MOVE    AC1,RMSG%TOTAL%CHARS        ;                                        6410
  10227.     ADDM    AC1,RCV%TOTAL%CHARS
  10228.     MOVE    AC1,RMSG%DATA%CHARS        ;                                        6411
  10229.     ADDM    AC1,RCV%DATA%CHARS
  10230.     MOVE    AC1,SMSG%NAKS            ;                                        6412
  10231.     ADDM    AC1,SND%NAKS
  10232.     MOVE    AC1,RMSG%NAKS            ;                                        6413
  10233.     ADDM    AC1,RCV%NAKS
  10234.     PUSHJ    SP,SY%TIME            ;                                        6414
  10235.     SUBB    AC1,XFR%TIME
  10236.     ADDM    AC1,TOTAL%TIME            ;                                        6415
  10237.     POPJ    SP,                ;                                        6367
  10238.  
  10239. ; Routine Size:  20 words
  10240.  
  10241.  
  10242. ;   6417  1    %SBTTL 'Status type out -- STS%OUTPUT'
  10243. ;   6418  1    ROUTINE STS%OUTPUT : NOVALUE =
  10244. ;   6419  1    
  10245. ;   6420  1    !++
  10246. ;   6421  1    ! FUNCTIONAL DESCRIPTION:
  10247. ;   6422  1    !
  10248. ;   6423  1    !    This routine will output the current status of a transfer.
  10249. ;   6424  1    !    This is used when the user types a ^A during a transfer.
  10250. ;   6425  1    !
  10251. ;   6426  1    ! CALLING SEQUENCE:
  10252. ;   6427  1    !
  10253. ;   6428  1    !    STS%OUTPUT ()
  10254. ;   6429  1    !
  10255. ;   6430  1    ! INPUT PARAMETERS:
  10256. ;   6431  1    !
  10257. ;   6432  1    !    None.
  10258. ;   6433  1    !
  10259. ;   6434  1    ! IMPLICIT INPUTS:
  10260. ;   6435  1    !
  10261. ;   6436  1    !    Statistics blocks, file names, etc.
  10262. ;   6437  1    !
  10263. ;   6438  1    ! OUPTUT PARAMETERS:
  10264. ;   6439  1    !
  10265. ;   6440  1    !    None.
  10266. ;   6441  1    !
  10267. ;   6442  1    ! IMPLICIT OUTPUTS:
  10268. ;   6443  1    !
  10269. ;   6444  1    !    None.
  10270. ;   6445  1    !
  10271. ;   6446  1    ! COMPLETION CODES:
  10272. ;   6447  1    !
  10273. ;   6448  1    !    None.
  10274. ;   6449  1    !
  10275. ;   6450  1    ! SIDE EFFECTS:
  10276. ;   6451  1    !
  10277. ;   6452  1    !    None.
  10278. ;   6453  1    !
  10279. ;   6454  1    !--
  10280. ;   6455  1    
  10281. ;   6456  2        BEGIN
  10282. ;   6457  2        TT%CHAR (%C'[');                ! Start the message
  10283. ;   6458  2    
  10284. ;   6459  2        CASE .STATE FROM STATE%MIN TO STATE%MAX OF
  10285. ;   6460  2        SET
  10286. ;   6461  2    
  10287. ;   6462  2        [STATE%ID, STATE%II] :
  10288. ;   6463  2            TT%TEXT (UPLIT (%ASCIZ'Idle in server mode'));
  10289. ;   6464  2    
  10290. ;   6465  2        [STATE%S, STATE%SF] :
  10291. ;   6466  3            BEGIN
  10292. ;   6467  3            TT%TEXT (UPLIT (%ASCIZ'Initializing for sending file '));
  10293. ;   6468  3            TT%TEXT (FILE%NAME);
  10294. ;   6469  2            END;
  10295. ;   6470  2    
  10296. ;   6471  2        [STATE%SI] :
  10297. ;   6472  2            TT%TEXT (UPLIT (%ASCIZ'Initializing for remote command'));
  10298. ;   6473  2    
  10299. ;   6474  2        [STATE%SG] :
  10300. ;   6475  2            TT%TEXT (UPLIT (%ASCIZ'Waiting for response to remote command'));
  10301. ;   6476  2    
  10302. ;   6477  2        [STATE%SD] :
  10303. ;   6478  3            BEGIN
  10304. ;   6479  3            TT%NUMBER (.FILE%CHARS);
  10305. ;   6480  3            TT%TEXT (UPLIT (%ASCIZ' characters sent for file '));
  10306. ;   6481  3            TT%TEXT (FILE%NAME);
  10307. ;   6482  2            END;
  10308. ;   6483  2    
  10309. ;   6484  2        [STATE%SZ] :
  10310. ;   6485  3            BEGIN
  10311. ;   6486  3            TT%TEXT (UPLIT (%ASCIZ'At end of file '));
  10312. ;   6487  3            TT%TEXT (FILE%NAME);
  10313. ;   6488  2            END;
  10314. ;   6489  2    
  10315. ;   6490  2        [STATE%SB] :
  10316. ;   6491  2            TT%TEXT (UPLIT (%ASCIZ'Finishing transfer session'));
  10317. ;   6492  2    
  10318. ;   6493  2        [STATE%R] :
  10319. ;   6494  2            TT%TEXT (UPLIT (%ASCIZ'Waiting for initialization'));
  10320. ;   6495  2    
  10321. ;   6496  2        [STATE%RF] :
  10322. ;   6497  2            TT%TEXT (UPLIT (%ASCIZ'Waiting for next file or end of session'));
  10323. ;   6498  2    
  10324. ;   6499  2        [STATE%RD] :
  10325. ;   6500  3            BEGIN
  10326. ;   6501  3            TT%NUMBER (.FILE%CHARS);
  10327. ;   6502  3            TT%TEXT (UPLIT (%ASCIZ' characters received for file '));
  10328. ;   6503  3            TT%TEXT (FILE%NAME);
  10329. ;   6504  2            END;
  10330. ;   6505  2    
  10331. ;   6506  2        [STATE%C] :
  10332. ;   6507  2            TT%TEXT (UPLIT (%ASCIZ' Session complete'));
  10333. ;   6508  2    
  10334. ;   6509  2        [STATE%A] :
  10335. ;   6510  2            TT%TEXT (UPLIT (%ASCIZ' Session aborted'));
  10336. ;   6511  2    
  10337. ;   6512  2        [INRANGE, OUTRANGE] :
  10338. ;   6513  2            TT%TEXT (UPLIT (%ASCIZ' Unknown state'));
  10339. ;   6514  2        TES;
  10340. ;   6515  2    
  10341. ;   6516  2        SELECTONE .STATE OF
  10342. ;   6517  2        SET
  10343. ;   6518  2    
  10344. ;   6519  2        [STATE%S, STATE%SF, STATE%SD, STATE%SZ, STATE%SB] :
  10345. ;   6520  3            BEGIN
  10346. ;   6521  3    
  10347. ;   6522  3            IF .RMSG%NAKS GTR 0
  10348. ;   6523  3            THEN
  10349. ;   6524  4            BEGIN
  10350. ;   6525  4            TT%TEXT (UPLIT (%ASCIZ', '));
  10351. ;   6526  4            TT%NUMBER (.RMSG%NAKS);
  10352. ;   6527  4            TT%TEXT (UPLIT (%ASCIZ' NAKs received'));
  10353. ;   6528  3            END;
  10354. ;   6529  3    
  10355. ;   6530  2            END;
  10356. ;   6531  2    
  10357. ;   6532  2        [STATE%R, STATE%RF, STATE%RD] :
  10358. ;   6533  3            BEGIN
  10359. ;   6534  3    
  10360. ;   6535  3            IF .SMSG%NAKS GTR 0
  10361. ;   6536  3            THEN
  10362. ;   6537  4            BEGIN
  10363. ;   6538  4            TT%TEXT (UPLIT (%ASCIZ', '));
  10364. ;   6539  4            TT%NUMBER (.SMSG%NAKS);
  10365. ;   6540  4            TT%TEXT (UPLIT (%ASCIZ' NAKs sent'));
  10366. ;   6541  3            END;
  10367. ;   6542  3    
  10368. ;   6543  2            END;
  10369. ;   6544  2        TES;
  10370. ;   6545  2    
  10371. ;   6546  2        TT%CHAR (%C']');                ! End the line
  10372. ;   6547  2        TT%CRLF ();                    ! with a CRLF
  10373. ;   6548  1        END;                    ! End of STS%OUTPUT
  10374.  
  10375.  
  10376. P.AAO:    BYTE    (7)"I","d","l","e"," "
  10377.     BYTE    (7)"i","n"," ","s","e"
  10378.     BYTE    (7)"r","v","e","r"," "
  10379.     BYTE    (7)"m","o","d","e",000
  10380. P.AAP:    BYTE    (7)"I","n","i","t","i"
  10381.     BYTE    (7)"a","l","i","z","i"
  10382.     BYTE    (7)"n","g"," ","f","o"
  10383.     BYTE    (7)"r"," ","s","e","n"
  10384.     BYTE    (7)"d","i","n","g"," "
  10385.     BYTE    (7)"f","i","l","e"," "
  10386.     BYTE    (7)000,000,000,000,000
  10387. P.AAQ:    BYTE    (7)"I","n","i","t","i"
  10388.     BYTE    (7)"a","l","i","z","i"
  10389.     BYTE    (7)"n","g"," ","f","o"
  10390.     BYTE    (7)"r"," ","r","e","m"
  10391.     BYTE    (7)"o","t","e"," ","c"
  10392.     BYTE    (7)"o","m","m","a","n"
  10393.     BYTE    (7)"d",000,000,000,000
  10394. P.AAR:    BYTE    (7)"W","a","i","t","i"
  10395.     BYTE    (7)"n","g"," ","f","o"
  10396.     BYTE    (7)"r"," ","r","e","s"
  10397.     BYTE    (7)"p","o","n","s","e"
  10398.     BYTE    (7)" ","t","o"," ","r"
  10399.     BYTE    (7)"e","m","o","t","e"
  10400.     BYTE    (7)" ","c","o","m","m"
  10401.     BYTE    (7)"a","n","d",000,000
  10402. P.AAS:    BYTE    (7)" ","c","h","a","r"
  10403.     BYTE    (7)"a","c","t","e","r"
  10404.     BYTE    (7)"s"," ","s","e","n"
  10405.     BYTE    (7)"t"," ","f","o","r"
  10406.     BYTE    (7)" ","f","i","l","e"
  10407.     BYTE    (7)" ",000,000,000,000
  10408. P.AAT:    BYTE    (7)"A","t"," ","e","n"
  10409.     BYTE    (7)"d"," ","o","f"," "
  10410.     BYTE    (7)"f","i","l","e"," "
  10411.     BYTE    (7)000,000,000,000,000
  10412. P.AAU:    BYTE    (7)"F","i","n","i","s"
  10413.     BYTE    (7)"h","i","n","g"," "
  10414.     BYTE    (7)"t","r","a","n","s"
  10415.     BYTE    (7)"f","e","r"," ","s"
  10416.     BYTE    (7)"e","s","s","i","o"
  10417.     BYTE    (7)"n",000,000,000,000
  10418. P.AAV:    BYTE    (7)"W","a","i","t","i"
  10419.     BYTE    (7)"n","g"," ","f","o"
  10420.     BYTE    (7)"r"," ","i","n","i"
  10421.     BYTE    (7)"t","i","a","l","i"
  10422.     BYTE    (7)"z","a","t","i","o"
  10423.     BYTE    (7)"n",000,000,000,000
  10424. P.AAW:    BYTE    (7)"W","a","i","t","i"
  10425.     BYTE    (7)"n","g"," ","f","o"
  10426.     BYTE    (7)"r"," ","n","e","x"
  10427.     BYTE    (7)"t"," ","f","i","l"
  10428.     BYTE    (7)"e"," ","o","r"," "
  10429.     BYTE    (7)"e","n","d"," ","o"
  10430.     BYTE    (7)"f"," ","s","e","s"
  10431.     BYTE    (7)"s","i","o","n",000
  10432. P.AAX:    BYTE    (7)" ","c","h","a","r"
  10433.     BYTE    (7)"a","c","t","e","r"
  10434.     BYTE    (7)"s"," ","r","e","c"
  10435.     BYTE    (7)"e","i","v","e","d"
  10436.     BYTE    (7)" ","f","o","r"," "
  10437.     BYTE    (7)"f","i","l","e"," "
  10438.     BYTE    (7)000,000,000,000,000
  10439. P.AAY:    BYTE    (7)" ","S","e","s","s"
  10440.     BYTE    (7)"i","o","n"," ","c"
  10441.     BYTE    (7)"o","m","p","l","e"
  10442.     BYTE    (7)"t","e",000,000,000
  10443. P.AAZ:    BYTE    (7)" ","S","e","s","s"
  10444.     BYTE    (7)"i","o","n"," ","a"
  10445.     BYTE    (7)"b","o","r","t","e"
  10446.     BYTE    (7)"d",000,000,000,000
  10447. P.ABA:    BYTE    (7)" ","U","n","k","n"
  10448.     BYTE    (7)"o","w","n"," ","s"
  10449.     BYTE    (7)"t","a","t","e",000
  10450. P.ABB:    BYTE    (7)","," ",000,000,000
  10451. P.ABC:    BYTE    (7)" ","N","A","K","s"
  10452.     BYTE    (7)" ","r","e","c","e"
  10453.     BYTE    (7)"i","v","e","d",000
  10454. P.ABD:    BYTE    (7)","," ",000,000,000
  10455. P.ABE:    BYTE    (7)" ","N","A","K","s"
  10456.     BYTE    (7)" ","s","e","n","t"
  10457.     BYTE    (7)000,000,000,000,000
  10458.  
  10459.  
  10460. ; STS%OUTPUT
  10461. U.33:    PUSH    SP,C.102            ;                                        6457
  10462.     PUSHJ    SP,TT%CHAR
  10463.     MOVE    AC1,U.51            ;                                        6459
  10464.     SOJL    AC1,L.446
  10465.     CAIGE    AC1,24
  10466.     JRST    L.445(AC1)
  10467.     JRST    L.446
  10468. L.445:    JRST    L.448
  10469.     JRST    L.448
  10470.     JRST    L.451
  10471.     JRST    L.452
  10472.     JRST    L.454
  10473.     JRST    L.455
  10474.     JRST    L.456
  10475.     JRST    L.457
  10476.     JRST    L.459
  10477.     JRST    L.460
  10478.     JRST    L.446
  10479.     JRST    L.450
  10480.     JRST    L.449
  10481.     JRST    L.447
  10482.     JRST    L.447
  10483.     JRST    L.446
  10484.     JRST    L.446
  10485.     JRST    L.446
  10486.     JRST    L.446
  10487.     JRST    L.446
  10488. L.446:    PUSH    SP,C.103            ;                                        6513
  10489.     JRST    L.461
  10490. L.447:    PUSH    SP,C.104            ;                                        6463
  10491.     JRST    L.461
  10492. L.448:    PUSH    SP,C.105            ;                                        6467
  10493.     JRST    L.453
  10494. L.449:    PUSH    SP,C.106            ;                                        6472
  10495.     JRST    L.461
  10496. L.450:    PUSH    SP,C.107            ;                                        6475
  10497.     JRST    L.461
  10498. L.451:    PUSH    SP,U.61                ;                                        6479
  10499.     PUSHJ    SP,TT%NUMBER
  10500.     PUSH    SP,C.108            ;                                        6480
  10501.     JRST    L.458
  10502. L.452:    PUSH    SP,C.109            ;                                        6486
  10503. L.453:    PUSHJ    SP,TT%TEXT
  10504.     PUSH    SP,C.34                ;                                        6487
  10505.     PUSHJ    SP,TT%TEXT
  10506.     ADJSP    SP,-1                ;                                        6485
  10507.     JRST    L.462                ;                                        6459
  10508. L.454:    PUSH    SP,C.110            ;                                        6491
  10509.     JRST    L.461
  10510. L.455:    PUSH    SP,C.111            ;                                        6494
  10511.     JRST    L.461
  10512. L.456:    PUSH    SP,C.112            ;                                        6497
  10513.     JRST    L.461
  10514. L.457:    PUSH    SP,U.61                ;                                        6501
  10515.     PUSHJ    SP,TT%NUMBER
  10516.     PUSH    SP,C.113            ;                                        6502
  10517. L.458:    PUSHJ    SP,TT%TEXT
  10518.     PUSH    SP,C.34                ;                                        6503
  10519.     PUSHJ    SP,TT%TEXT
  10520.     ADJSP    SP,-2                ;                                        6500
  10521.     JRST    L.462                ;                                        6459
  10522. L.459:    PUSH    SP,C.114            ;                                        6507
  10523.     JRST    L.461
  10524. L.460:    PUSH    SP,C.115            ;                                        6510
  10525. L.461:    PUSHJ    SP,TT%TEXT
  10526. L.462:    MOVE    AC1,U.51            ;                                        6516
  10527.     JUMPLE    AC1,L.463            ;                                        6519
  10528.     CAILE    AC1,5
  10529.     JRST    L.463
  10530.     SKIPG    RMSG%NAKS            ;                                        6522
  10531.     JRST    L.465
  10532.     PUSH    SP,C.116            ;                                        6525
  10533.     PUSHJ    SP,TT%TEXT
  10534.     PUSH    SP,RMSG%NAKS            ;                                        6526
  10535.     PUSHJ    SP,TT%NUMBER
  10536.     PUSH    SP,C.117            ;                                        6527
  10537.     JRST    L.464
  10538. L.463:    CAIL    AC1,6                ;                                        6532
  10539.     CAILE    AC1,10
  10540.     JRST    L.465
  10541.     SKIPG    SMSG%NAKS            ;                                        6535
  10542.     JRST    L.465
  10543.     PUSH    SP,C.118            ;                                        6538
  10544.     PUSHJ    SP,TT%TEXT
  10545.     PUSH    SP,SMSG%NAKS            ;                                        6539
  10546.     PUSHJ    SP,TT%NUMBER
  10547.     PUSH    SP,C.119            ;                                        6540
  10548. L.464:    PUSHJ    SP,TT%TEXT
  10549.     ADJSP    SP,-3                ;                                        6537
  10550. L.465:    PUSH    SP,C.120            ;                                        6546
  10551.     PUSHJ    SP,TT%CHAR
  10552.     PUSHJ    SP,TT%CRLF            ;                                        6547
  10553.     ADJSP    SP,-3                ;                                        6456
  10554.     POPJ    SP,                ;                                        6418
  10555. C.102:    EXP    133
  10556. C.103:    XWD    0,P.ABA
  10557. C.104:    XWD    0,P.AAO
  10558. C.105:    XWD    0,P.AAP
  10559. C.106:    XWD    0,P.AAQ
  10560. C.107:    XWD    0,P.AAR
  10561. C.108:    XWD    0,P.AAS
  10562. C.109:    XWD    0,P.AAT
  10563. C.110:    XWD    0,P.AAU
  10564. C.111:    XWD    0,P.AAV
  10565. C.112:    XWD    0,P.AAW
  10566. C.113:    XWD    0,P.AAX
  10567. C.114:    XWD    0,P.AAY
  10568. C.115:    XWD    0,P.AAZ
  10569. C.116:    XWD    0,P.ABB
  10570. C.117:    XWD    0,P.ABC
  10571. C.118:    XWD    0,P.ABD
  10572. C.119:    XWD    0,P.ABE
  10573. C.120:    EXP    135
  10574.  
  10575. ; Routine Size:  113 words
  10576.  
  10577.  
  10578. ;   6549  1    %SBTTL 'TYPE%CHAR - Type out a character'
  10579. ;   6550  1    ROUTINE TYPE%CHAR (CHARACTER) =
  10580. ;   6551  1    
  10581. ;   6552  1    !++
  10582. ;   6553  1    ! FUNCTIONAL DESCRIPTION:
  10583. ;   6554  1    !
  10584. ;   6555  1    ! This routine is used as an alternate output routine for BFR%EMPTY.
  10585. ;   6556  1    ! It will type the character on the terminal, and always return a
  10586. ;   6557  1    ! true status.
  10587. ;   6558  1    !
  10588. ;   6559  1    ! CALLING SEQUENCE:
  10589. ;   6560  1    !
  10590. ;   6561  1    !    STATUS = TYPE%CHAR (.CHARACTER);
  10591. ;   6562  1    !
  10592. ;   6563  1    ! INPUT PARAMETERS:
  10593. ;   6564  1    !
  10594. ;   6565  1    !    CHARACTER - The character to type
  10595. ;   6566  1    !
  10596. ;   6567  1    ! IMPLICIT INPUTS:
  10597. ;   6568  1    !
  10598. ;   6569  1    !    None.
  10599. ;   6570  1    !
  10600. ;   6571  1    ! OUPTUT PARAMETERS:
  10601. ;   6572  1    !
  10602. ;   6573  1    !    None.
  10603. ;   6574  1    !
  10604. ;   6575  1    ! IMPLICIT OUTPUTS:
  10605. ;   6576  1    !
  10606. ;   6577  1    !    None.
  10607. ;   6578  1    !
  10608. ;   6579  1    ! COMPLETION CODES:
  10609. ;   6580  1    !
  10610. ;   6581  1    !    None.
  10611. ;   6582  1    !
  10612. ;   6583  1    ! SIDE EFFECTS:
  10613. ;   6584  1    !
  10614. ;   6585  1    !    None.
  10615. ;   6586  1    !
  10616. ;   6587  1    !--
  10617. ;   6588  1    
  10618. ;   6589  2        BEGIN
  10619. ;   6590  2        TT%CHAR (.CHARACTER);            ! Type the character
  10620. ;   6591  2        RETURN KER%NORMAL;                ! And return OK
  10621. ;   6592  1        END;                    ! End of TYPE%CHAR
  10622.  
  10623.  
  10624. ; TYPE%CHAR
  10625. U.31:    PUSH    SP,-1(SP)            ;                                        6590
  10626.     PUSHJ    SP,TT%CHAR
  10627.     ADJSP    SP,-1                ;                                        6591
  10628.     MOVEI    AC1,13                ;                                        6589
  10629.     POPJ    SP,                ;                                        6550
  10630.  
  10631. ; Routine Size:  5 words
  10632.  
  10633.  
  10634. ;   6593  1    %SBTTL 'Debugging -- DBG%SEND'
  10635. ;   6594  1    ROUTINE DBG%SEND (ADDRESS, LENGTH) : NOVALUE =
  10636. ;   6595  1    
  10637. ;   6596  1    !++
  10638. ;   6597  1    ! FUNCTIONAL DESCRIPTION:
  10639. ;   6598  1    !
  10640. ;   6599  1    !    This routine will output the message that is going to be sent
  10641. ;   6600  1    !    as part of the debugging information that is turned on in the
  10642. ;   6601  1    !    SET DEBUG command.
  10643. ;   6602  1    !
  10644. ;   6603  1    ! CALLING SEQUENCE:
  10645. ;   6604  1    !
  10646. ;   6605  1    !    DBG%SEND(MSG%ADDRESS, MSG%LENGTH);
  10647. ;   6606  1    !
  10648. ;   6607  1    ! INPUT PARAMETERS:
  10649. ;   6608  1    !
  10650. ;   6609  1    !    MSG%ADDRESS - Address of the message that is going to be sent
  10651. ;   6610  1    !        to the remote KERMIT.  The bytes are CHR%SIZE.
  10652. ;   6611  1    !    MSG%LENGTH - Length of the message.
  10653. ;   6612  1    !
  10654. ;   6613  1    ! IMPLICIT INPUTS:
  10655. ;   6614  1    !
  10656. ;   6615  1    !    None.
  10657. ;   6616  1    !
  10658. ;   6617  1    ! OUTPUT PARAMETERS:
  10659. ;   6618  1    !
  10660. ;   6619  1    !    None.
  10661. ;   6620  1    !
  10662. ;   6621  1    ! IMPLICIT OUTPUTS:
  10663. ;   6622  1    !
  10664. ;   6623  1    !    None.
  10665. ;   6624  1    !
  10666. ;   6625  1    ! COMPLETION CODES:
  10667. ;   6626  1    !
  10668. ;   6627  1    !    None.
  10669. ;   6628  1    !
  10670. ;   6629  1    ! SIDE EFFECTS:
  10671. ;   6630  1    !
  10672. ;   6631  1    !    None.
  10673. ;   6632  1    !
  10674. ;   6633  1    !--
  10675. ;   6634  1    
  10676. ;   6635  2        BEGIN
  10677. ;   6636  2    
  10678. ;   6637  2        BIND
  10679. ;   6638  2        SEND%TEXT = UPLIT (%ASCIZ'Sending...');
  10680. ;   6639  2    
  10681. ;   6640  2        IF .DEBUG%FLAG
  10682. ;   6641  2        THEN
  10683. ;   6642  3        BEGIN
  10684. ;   6643  3    
  10685. ;   6644  3        LOCAL
  10686. ;   6645  3            OLD%RTN;
  10687. ;   6646  3    
  10688. ;   6647  3        OLD%RTN = TT%SET%OUTPUT (DBG%DUMP);
  10689. ;   6648  3        TT%TEXT (SEND%TEXT);
  10690. ;   6649  3        DBG%MESSAGE (.ADDRESS, .LENGTH);
  10691. ;   6650  3        TT%SET%OUTPUT (.OLD%RTN);
  10692. ;   6651  2        END;
  10693. ;   6652  2    
  10694. ;   6653  1        END;                    ! End of DBG%SEND
  10695.  
  10696.  
  10697. P.ABF:    BYTE    (7)"S","e","n","d","i"
  10698.     BYTE    (7)"n","g",".",".","."
  10699.     BYTE    (7)000,000,000,000,000
  10700.  
  10701.  
  10702. ; SEND%TEXT
  10703. U.102=            P.ABF
  10704.  
  10705.  
  10706. ; DBG%SEND
  10707. U.35:    PUSH    SP,AC16                ;                                        6594
  10708.     MOVEI    AC1,1                ;                                        6640
  10709.     TDNN    AC1,DEBUG%FLAG
  10710.     JRST    L.466
  10711.     PUSH    SP,C.88                ;                                        6647
  10712.     PUSHJ    SP,TT%SET%OUTPUT
  10713.     MOVE    AC16,AC1
  10714.     PUSH    SP,C.121            ;                                        6648
  10715.     PUSHJ    SP,TT%TEXT
  10716.     PUSH    SP,-5(SP)            ;                                        6649
  10717.     PUSH    SP,-5(SP)
  10718.     PUSHJ    SP,U.34
  10719.     MOVEM    AC16,0(SP)            ;                                        6650
  10720.     PUSHJ    SP,TT%SET%OUTPUT
  10721.     ADJSP    SP,-4                ;                                        6642
  10722. L.466:    POP    SP,AC16                ;                                        6594
  10723.     POPJ    SP,
  10724. C.121:    XWD    0,U.102
  10725.  
  10726. ; Routine Size:  18 words
  10727.  
  10728.  
  10729. ;   6654  1    %SBTTL 'Debugging -- DBG%RECEIVE'
  10730. ;   6655  1    ROUTINE DBG%RECEIVE (ADDRESS) : NOVALUE =
  10731. ;   6656  1    
  10732. ;   6657  1    !++
  10733. ;   6658  1    ! FUNCTIONAL DESCRIPTION:
  10734. ;   6659  1    !
  10735. ;   6660  1    !    This routine will output the message that was received from
  10736. ;   6661  1    !    the remote KERMIT.  This routine is called only if the DEBUG%FLAG
  10737. ;   6662  1    !    is true.
  10738. ;   6663  1    !
  10739. ;   6664  1    ! CALLING SEQUENCE:
  10740. ;   6665  1    !
  10741. ;   6666  1    !    DBG%RECEIVE(MSG%ADDRESS);
  10742. ;   6667  1    !
  10743. ;   6668  1    ! INPUT PARAMETERS:
  10744. ;   6669  1    !
  10745. ;   6670  1    !    MSG%ADDRESS - Address of the message received by the remote KERMIT.
  10746. ;   6671  1    !
  10747. ;   6672  1    ! IMPLICIT INPUTS:
  10748. ;   6673  1    !
  10749. ;   6674  1    !    None.
  10750. ;   6675  1    !
  10751. ;   6676  1    ! OUTPUT PARAMETERS:
  10752. ;   6677  1    !
  10753. ;   6678  1    !    None.
  10754. ;   6679  1    !
  10755. ;   6680  1    ! IMPLICIT OUTPUTS:
  10756. ;   6681  1    !
  10757. ;   6682  1    !    None.
  10758. ;   6683  1    !
  10759. ;   6684  1    ! COMPLETION CODES:
  10760. ;   6685  1    !
  10761. ;   6686  1    !    None.
  10762. ;   6687  1    !
  10763. ;   6688  1    ! SIDE EFFECTS:
  10764. ;   6689  1    !
  10765. ;   6690  1    !    None.
  10766. ;   6691  1    !
  10767. ;   6692  1    !--
  10768. ;   6693  1    
  10769. ;   6694  2        BEGIN
  10770. ;   6695  2    
  10771. ;   6696  2        BIND
  10772. ;   6697  2        RECEIVE%TEXT = UPLIT (%ASCIZ'Received...');
  10773. ;   6698  2    
  10774. ;   6699  2        IF .DEBUG%FLAG
  10775. ;   6700  2        THEN
  10776. ;   6701  3        BEGIN
  10777. ;   6702  3    
  10778. ;   6703  3        LOCAL
  10779. ;   6704  3            OLD%RTN;
  10780. ;   6705  3    
  10781. ;   6706  3        OLD%RTN = TT%SET%OUTPUT (DBG%DUMP);
  10782. ;   6707  3        TT%TEXT (RECEIVE%TEXT);
  10783. ;   6708  3        DBG%MESSAGE (.ADDRESS, .REC%LENGTH);
  10784. ;   6709  3        TT%SET%OUTPUT (.OLD%RTN);
  10785. ;   6710  2        END;
  10786. ;   6711  2    
  10787. ;   6712  1        END;                    ! End of DBG%RECEIVE
  10788.  
  10789.  
  10790. P.ABG:    BYTE    (7)"R","e","c","e","i"
  10791.     BYTE    (7)"v","e","d",".","."
  10792.     BYTE    (7)".",000,000,000,000
  10793.  
  10794.  
  10795. ; RECEIVE%TEXT
  10796. U.103=            P.ABG
  10797.  
  10798.  
  10799. ; DBG%RECEIVE
  10800. U.36:    PUSH    SP,AC16                ;                                        6655
  10801.     MOVEI    AC1,1                ;                                        6699
  10802.     TDNN    AC1,DEBUG%FLAG
  10803.     JRST    L.467
  10804.     PUSH    SP,C.88                ;                                        6706
  10805.     PUSHJ    SP,TT%SET%OUTPUT
  10806.     MOVE    AC16,AC1
  10807.     PUSH    SP,C.122            ;                                        6707
  10808.     PUSHJ    SP,TT%TEXT
  10809.     PUSH    SP,-4(SP)            ;                                        6708
  10810.     PUSH    SP,U.57
  10811.     PUSHJ    SP,U.34
  10812.     MOVEM    AC16,0(SP)            ;                                        6709
  10813.     PUSHJ    SP,TT%SET%OUTPUT
  10814.     ADJSP    SP,-4                ;                                        6701
  10815. L.467:    POP    SP,AC16                ;                                        6655
  10816.     POPJ    SP,
  10817. C.122:    XWD    0,U.103
  10818.  
  10819. ; Routine Size:  18 words
  10820.  
  10821.  
  10822. ;   6713  1    %SBTTL 'Debugging -- DBG%MESSAGE'
  10823. ;   6714  1    ROUTINE DBG%MESSAGE (MSG%ADDRESS, MSG%LENGTH) : NOVALUE =
  10824. ;   6715  1    
  10825. ;   6716  1    !++
  10826. ;   6717  1    ! FUNCTIONAL DESCRIPTION:
  10827. ;   6718  1    !
  10828. ;   6719  1    !    This routine will display a message that is either being sent
  10829. ;   6720  1    !    or received on the user's terminal.
  10830. ;   6721  1    !
  10831. ;   6722  1    ! CALLING SEQUENCE:
  10832. ;   6723  1    !
  10833. ;   6724  1    !    DBG%MESSAGE(MSG%ADDRESS, MSG%LENGTH);
  10834. ;   6725  1    !
  10835. ;   6726  1    ! INPUT PARAMETERS:
  10836. ;   6727  1    !
  10837. ;   6728  1    !    MSG%ADDRESS - Address of the message to be output
  10838. ;   6729  1    !    MSG%LENGTH - Length of the message to be output.
  10839. ;   6730  1    !
  10840. ;   6731  1    ! IMPLICIT INPUTS:
  10841. ;   6732  1    !
  10842. ;   6733  1    !    None.
  10843. ;   6734  1    !
  10844. ;   6735  1    ! OUTPUT PARAMETERS:
  10845. ;   6736  1    !
  10846. ;   6737  1    !    None.
  10847. ;   6738  1    !
  10848. ;   6739  1    ! IMPLICIT OUTPUTS:
  10849. ;   6740  1    !
  10850. ;   6741  1    !    None.
  10851. ;   6742  1    !
  10852. ;   6743  1    ! COMPLETION CODES:
  10853. ;   6744  1    !
  10854. ;   6745  1    !    None.
  10855. ;   6746  1    !
  10856. ;   6747  1    ! SIDE EFFECTS:
  10857. ;   6748  1    !
  10858. ;   6749  1    !    None.
  10859. ;   6750  1    !
  10860. ;   6751  1    !--
  10861. ;   6752  1    
  10862. ;   6753  2        BEGIN
  10863. ;   6754  2    
  10864. ;   6755  2        MAP
  10865. ;   6756  2        MSG%ADDRESS : REF VECTOR [CH$ALLOCATION (MAX%MSG, CHR%SIZE)];    ! Point to the vector
  10866. ;   6757  2    
  10867. ;   6758  2        LOCAL
  10868. ;   6759  2        OLD%RTN,                ! Old type out routine
  10869. ;   6760  2        CHKSUM,                    ! Numeric value of block check
  10870. ;   6761  2        TEMP%POINTER,                ! Temporary character pointer
  10871. ;   6762  2        MSG%MSG,            ! [108]    ! Starting point for data
  10872. ;   6763  2        MSG%LEN;
  10873. ;   6764  2    
  10874. ;   6765  2    !
  10875. ;   6766  2    ! Message type text
  10876. ;   6767  2    !
  10877. ;   6768  2    
  10878. ;   6769  2        BIND
  10879. ;   6770  2        DATA%TEXT = UPLIT (%ASCIZ' (Data)'),
  10880. ;   6771  2        ACK%TEXT = UPLIT (%ASCIZ' (ACK)'),
  10881. ;   6772  2        NAK%TEXT = UPLIT (%ASCIZ' (NAK)'),
  10882. ;   6773  2        SND%INIT%TEXT = UPLIT (%ASCIZ' (Send init)'),
  10883. ;   6774  2        BREAK%TEXT = UPLIT (%ASCIZ' (Break)'),
  10884. ;   6775  2        TEXT%TEXT = UPLIT (%ASCIZ' (Text header)'),
  10885. ;   6776  2        FILE%TEXT = UPLIT (%ASCIZ' (File header)'),
  10886. ;   6777  2        EOF%TEXT = UPLIT (%ASCIZ' (EOF)'),
  10887. ;   6778  2        ERROR%TEXT = UPLIT (%ASCIZ' (Error)'),
  10888. ;   6779  2        RCV%INIT%TEXT = UPLIT (%ASCIZ' (Receive initiate)'),
  10889. ;   6780  2        COMMAND%TEXT = UPLIT (%ASCIZ' (Command)'),
  10890. ;   6781  2        KERMIT%TEXT = UPLIT (%ASCIZ' (Generic KERMIT command)');
  10891. ;   6782  2    
  10892. ;   6783  2    !
  10893. ;   6784  2    ! Header information
  10894. ;   6785  2    !
  10895. ;   6786  2    
  10896. ;   6787  2        BIND
  10897. ;   6788  2        MN%TEXT = UPLIT (%ASCIZ'Message number: '),
  10898. ;   6789  2        LENGTH%TEXT = UPLIT (%ASCIZ'    Length: '),
  10899. ;   6790  2        DEC%TEXT = UPLIT (%ASCIZ' (dec)'),
  10900. ;   6791  2        MSG%TYP%TEXT = UPLIT (%ASCIZ'Message type: '),
  10901. ;   6792  2        CHKSUM%TEXT = UPLIT (%ASCIZ'Checksum: '),
  10902. ;   6793  2        CHKSUM%NUM%TEXT = UPLIT (%ASCIZ' = '),
  10903. ;   6794  2        OPT%DATA%TEXT = UPLIT (%ASCIZ'Optional data: '),
  10904. ;   6795  2        PRE%CHAR%TEXT = UPLIT (%ASCIZ' "');
  10905. ;   6796  2    
  10906. ;   6797  2    !
  10907. ;   6798  2    ! Ensure that the type out will go to the debugging location
  10908. ;   6799  2    !
  10909. ;   6800  2        OLD%RTN = TT%SET%OUTPUT (DBG%DUMP);
  10910. ;   6801  2    !
  10911. ;   6802  2    ! Preliminary calculations
  10912. ;   6803  2    !
  10913. ;   6804  2        MSG%LEN = UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%COUNT, CHR%SIZE)));
  10914. ;   6805  2        MSG%MSG = PKT%MSG;                               ! [108]
  10915. ;   6806  2        IF .MSG%LEN EQL 0                               ! [108]
  10916. ;   6807  2        THEN                                   ! [108]
  10917. ;   6808  3        BEGIN                                   ! [108]
  10918. ;   6809  3        MSG%LEN = UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%COUNTX1, CHR%SIZE))) * 95
  10919. ;   6810  3     +
  10920. ;   6811  3            UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%COUNTX2, CHR%SIZE))) +
  10921. ;   6812  3                            PKT%HCHECK - 1;           ! [108]
  10922. ;   6813  3        MSG%MSG = PKT%MSGX;                           ! [108]
  10923. ;   6814  2        END;                                   ! [108]
  10924. ;   6815  2    
  10925. ;   6816  2    !
  10926. ;   6817  2    ! First output some header information for the packet.
  10927. ;   6818  2    !
  10928. ;   6819  2        TT%CRLF ();
  10929. ;   6820  2        TT%TEXT (MN%TEXT);
  10930. ;   6821  2        TT%NUMBER (UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%SEQ, CHR%SIZE))));
  10931. ;   6822  2        TT%TEXT (DEC%TEXT);
  10932. ;   6823  2        TT%TEXT (LENGTH%TEXT);
  10933. ;   6824  2        TT%NUMBER (.MSG%LEN);
  10934. ;   6825  2        TT%TEXT (DEC%TEXT);
  10935. ;   6826  2        TT%CRLF ();
  10936. ;   6827  2    !
  10937. ;   6828  2    ! Now output the message type and dependent information
  10938. ;   6829  2    !
  10939. ;   6830  2        TT%TEXT (MSG%TYP%TEXT);
  10940. ;   6831  2        TT%CHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%TYPE, CHR%SIZE)));
  10941. ;   6832  2    
  10942. ;   6833  2        SELECTONE CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%TYPE, CHR%SIZE)) OF
  10943. ;   6834  2        SET
  10944. ;   6835  2    
  10945. ;   6836  2        [MSG%DATA] :
  10946. ;   6837  2            TT%TEXT (DATA%TEXT);
  10947. ;   6838  2    
  10948. ;   6839  2        [MSG%ACK] :
  10949. ;   6840  2            TT%TEXT (ACK%TEXT);
  10950. ;   6841  2    
  10951. ;   6842  2        [MSG%NAK] :
  10952. ;   6843  2            TT%TEXT (NAK%TEXT);
  10953. ;   6844  2    
  10954. ;   6845  2        [MSG%SND%INIT] :
  10955. ;   6846  2            TT%TEXT (SND%INIT%TEXT);
  10956. ;   6847  2    
  10957. ;   6848  2        [MSG%BREAK] :
  10958. ;   6849  2            TT%TEXT (BREAK%TEXT);
  10959. ;   6850  2    
  10960. ;   6851  2        [MSG%FILE] :
  10961. ;   6852  2            TT%TEXT (FILE%TEXT);
  10962. ;   6853  2    
  10963. ;   6854  2        [MSG%TEXT] :
  10964. ;   6855  2            TT%TEXT (TEXT%TEXT);
  10965. ;   6856  2    
  10966. ;   6857  2        [MSG%EOF] :
  10967. ;   6858  2            TT%TEXT (EOF%TEXT);
  10968. ;   6859  2    
  10969. ;   6860  2        [MSG%ERROR] :
  10970. ;   6861  2            TT%TEXT (ERROR%TEXT);
  10971. ;   6862  2    
  10972. ;   6863  2        [MSG%GENERIC] :
  10973. ;   6864  2            TT%TEXT (KERMIT%TEXT);
  10974. ;   6865  2    
  10975. ;   6866  2        [MSG%COMMAND] :
  10976. ;   6867  2            TT%TEXT (COMMAND%TEXT);
  10977. ;   6868  2        TES;
  10978. ;   6869  2    
  10979. ;   6870  2        TT%CRLF ();
  10980. ;   6871  2    !
  10981. ;   6872  2    ! Now output any of the optional data.
  10982. ;   6873  2    !
  10983. ;   6874  2    
  10984. ;   6875  2        IF .MSG%LEN - .MSG%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR) NEQ 0     ! [108]
  10985. ;   6876  2        THEN
  10986. ;   6877  3        BEGIN
  10987. ;   6878  3        TT%TEXT (OPT%DATA%TEXT);
  10988. ;   6879  3        TT%CRLF ();
  10989. ;   6880  3        TEMP%POINTER = CH$PTR (.MSG%ADDRESS, .MSG%MSG, CHR%SIZE);      ! [108]
  10990. ;   6881  3    
  10991. ;   6882  3        INCR I FROM 1 TO .MSG%LEN - .MSG%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR) DO ! [108]
  10992. ;   6883  4            BEGIN
  10993. ;   6884  4    
  10994. ;   6885  4            IF (.I MOD 10) EQL 1
  10995. ;   6886  4            THEN
  10996. ;   6887  5            BEGIN
  10997. ;   6888  5            TT%CRLF ();
  10998. ;   6889  5            TT%CHAR (CHR%TAB);
  10999. ;   6890  4            END;
  11000. ;   6891  4    
  11001. ;   6892  4            TT%TEXT (PRE%CHAR%TEXT);
  11002. ;   6893  4            TT%CHAR (CH$RCHAR%A (TEMP%POINTER));
  11003. ;   6894  4            TT%CHAR (%C'"');
  11004. ;   6895  3            END;
  11005. ;   6896  3    
  11006. ;   6897  3        IF ((.MSG%LEN - .MSG%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR)) MOD 10) EQL 1 THEN
  11007. ;   6898  3     TT%CRLF (); ! [108]
  11008. ;   6899  3    
  11009. ;   6900  3        TT%CRLF ();
  11010. ;   6901  2        END;
  11011. ;   6902  2    
  11012. ;   6903  2    !
  11013. ;   6904  2    ! Now output the checksum for the message that we received
  11014. ;   6905  2    !
  11015. ;   6906  2    ! This could be either 1 two or three characters.
  11016. ;   6907  2        TT%TEXT (CHKSUM%TEXT);
  11017. ;   6908  2        TEMP%POINTER = CH$PTR (.MSG%ADDRESS,
  11018. ;   6909  2        .MSG%LEN + PKT%CHKSUM + 1 - (.BLK%CHK%TYPE - CHK%1CHAR), CHR%SIZE); ! [108]
  11019. ;   6910  2    
  11020. ;   6911  2        CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF
  11021. ;   6912  2        SET
  11022. ;   6913  2    
  11023. ;   6914  2        [CHK%1CHAR] :
  11024. ;   6915  3            BEGIN
  11025. ;   6916  3            TT%TEXT (PRE%CHAR%TEXT);
  11026. ;   6917  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  11027. ;   6918  3            TT%CHAR (%C'"');
  11028. ;   6919  3            CHKSUM = UNCHAR (CH$RCHAR (.TEMP%POINTER));
  11029. ;   6920  2            END;
  11030. ;   6921  2    
  11031. ;   6922  2        [CHK%2CHAR] :
  11032. ;   6923  3            BEGIN
  11033. ;   6924  3            CHKSUM = 0;
  11034. ;   6925  3            TT%TEXT (PRE%CHAR%TEXT);
  11035. ;   6926  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  11036. ;   6927  3            TT%CHAR (%C'"');
  11037. ;   6928  3            CHKSUM<6, 6> = UNCHAR (CH$RCHAR%A (TEMP%POINTER));
  11038. ;   6929  3            TT%TEXT (PRE%CHAR%TEXT);
  11039. ;   6930  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  11040. ;   6931  3            TT%CHAR (%C'"');
  11041. ;   6932  3            CHKSUM<0, 6> = UNCHAR (CH$RCHAR (.TEMP%POINTER));
  11042. ;   6933  2            END;
  11043. ;   6934  2    
  11044. ;   6935  2        [CHK%CRC] :
  11045. ;   6936  3            BEGIN
  11046. ;   6937  3            CHKSUM = 0;
  11047. ;   6938  3            TT%TEXT (PRE%CHAR%TEXT);
  11048. ;   6939  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  11049. ;   6940  3            TT%CHAR (%C'"');
  11050. ;   6941  3            CHKSUM<12, 4> = UNCHAR (CH$RCHAR%A (TEMP%POINTER));
  11051. ;   6942  3            TT%TEXT (PRE%CHAR%TEXT);
  11052. ;   6943  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  11053. ;   6944  3            TT%CHAR (%C'"');
  11054. ;   6945  3            CHKSUM<6, 6> = UNCHAR (CH$RCHAR%A (TEMP%POINTER));
  11055. ;   6946  3            TT%TEXT (PRE%CHAR%TEXT);
  11056. ;   6947  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  11057. ;   6948  3            TT%CHAR (%C'"');
  11058. ;   6949  3            CHKSUM<0, 6> = UNCHAR (CH$RCHAR (.TEMP%POINTER));
  11059. ;   6950  2            END;
  11060. ;   6951  2        TES;
  11061. ;   6952  2    
  11062. ;   6953  2        TT%TEXT (CHKSUM%NUM%TEXT);
  11063. ;   6954  2        TT%NUMBER (.CHKSUM);
  11064. ;   6955  2        TT%TEXT (DEC%TEXT);
  11065. ;   6956  2        TT%CRLF ();
  11066. ;   6957  2        TT%SET%OUTPUT (.OLD%RTN);            ! Reset output destination
  11067. ;   6958  1        END;                    ! End of DBG%MESSAGE
  11068.  
  11069.  
  11070. P.ABH:    BYTE    (7)" ","(","D","a","t"
  11071.     BYTE    (7)"a",")",000,000,000
  11072. P.ABI:    BYTE    (7)" ","(","A","C","K"
  11073.     BYTE    (7)")",000,000,000,000
  11074. P.ABJ:    BYTE    (7)" ","(","N","A","K"
  11075.     BYTE    (7)")",000,000,000,000
  11076. P.ABK:    BYTE    (7)" ","(","S","e","n"
  11077.     BYTE    (7)"d"," ","i","n","i"
  11078.     BYTE    (7)"t",")",000,000,000
  11079. P.ABL:    BYTE    (7)" ","(","B","r","e"
  11080.     BYTE    (7)"a","k",")",000,000
  11081. P.ABM:    BYTE    (7)" ","(","T","e","x"
  11082.     BYTE    (7)"t"," ","h","e","a"
  11083.     BYTE    (7)"d","e","r",")",000
  11084. P.ABN:    BYTE    (7)" ","(","F","i","l"
  11085.     BYTE    (7)"e"," ","h","e","a"
  11086.     BYTE    (7)"d","e","r",")",000
  11087. P.ABO:    BYTE    (7)" ","(","E","O","F"
  11088.     BYTE    (7)")",000,000,000,000
  11089. P.ABP:    BYTE    (7)" ","(","E","r","r"
  11090.     BYTE    (7)"o","r",")",000,000
  11091. P.ABQ:    BYTE    (7)" ","(","R","e","c"
  11092.     BYTE    (7)"e","i","v","e"," "
  11093.     BYTE    (7)"i","n","i","t","i"
  11094.     BYTE    (7)"a","t","e",")",000
  11095. P.ABR:    BYTE    (7)" ","(","C","o","m"
  11096.     BYTE    (7)"m","a","n","d",")"
  11097.     BYTE    (7)000,000,000,000,000
  11098. P.ABS:    BYTE    (7)" ","(","G","e","n"
  11099.     BYTE    (7)"e","r","i","c"," "
  11100.     BYTE    (7)"K","E","R","M","I"
  11101.     BYTE    (7)"T"," ","c","o","m"
  11102.     BYTE    (7)"m","a","n","d",")"
  11103.     BYTE    (7)000,000,000,000,000
  11104. P.ABT:    BYTE    (7)"M","e","s","s","a"
  11105.     BYTE    (7)"g","e"," ","n","u"
  11106.     BYTE    (7)"m","b","e","r",":"
  11107.     BYTE    (7)" ",000,000,000,000
  11108. P.ABU:    BYTE    (7)011,"L","e","n","g"
  11109.     BYTE    (7)"t","h",":"," ",000
  11110. P.ABV:    BYTE    (7)" ","(","d","e","c"
  11111.     BYTE    (7)")",000,000,000,000
  11112. P.ABW:    BYTE    (7)"M","e","s","s","a"
  11113.     BYTE    (7)"g","e"," ","t","y"
  11114.     BYTE    (7)"p","e",":"," ",000
  11115. P.ABX:    BYTE    (7)"C","h","e","c","k"
  11116.     BYTE    (7)"s","u","m",":"," "
  11117.     BYTE    (7)000,000,000,000,000
  11118. P.ABY:    BYTE    (7)" ","="," ",000,000
  11119. P.ABZ:    BYTE    (7)"O","p","t","i","o"
  11120.     BYTE    (7)"n","a","l"," ","d"
  11121.     BYTE    (7)"a","t","a",":"," "
  11122.     BYTE    (7)000,000,000,000,000
  11123. P.ACA:    BYTE    (7)" ",042,000,000,000
  11124.  
  11125.  
  11126. ; DATA%TEXT
  11127. U.105=            P.ABH
  11128. ; ACK%TEXT
  11129. U.106=            P.ABI
  11130. ; NAK%TEXT
  11131. U.107=            P.ABJ
  11132. ; SND%INIT%TEXT
  11133. U.108=            P.ABK
  11134. ; BREAK%TEXT
  11135. U.109=            P.ABL
  11136. ; TEXT%TEXT
  11137. U.110=            P.ABM
  11138. ; FILE%TEXT
  11139. U.111=            P.ABN
  11140. ; EOF%TEXT
  11141. U.112=            P.ABO
  11142. ; ERROR%TEXT
  11143. U.113=            P.ABP
  11144. ; RCV%INIT%TEXT
  11145. U.114=            P.ABQ
  11146. ; COMMAND%TEXT
  11147. U.115=            P.ABR
  11148. ; KERMIT%TEXT
  11149. U.116=            P.ABS
  11150. ; MN%TEXT
  11151. U.117=            P.ABT
  11152. ; LENGTH%TEXT
  11153. U.118=            P.ABU
  11154. ; DEC%TEXT
  11155. U.119=            P.ABV
  11156. ; MSG%TYP%TEXT
  11157. U.120=            P.ABW
  11158. ; CHKSUM%TEXT
  11159. U.121=            P.ABX
  11160. ; CHKSUM%NUM%TEXT
  11161. U.122=            P.ABY
  11162. ; OPT%DATA%TEXT
  11163. U.123=            P.ABZ
  11164. ; PRE%CHAR%TEXT
  11165. U.124=            P.ACA
  11166.  
  11167.  
  11168. ; DBG%MESSAGE
  11169. U.34:    PUSH    SP,AC0                ;                                        6714
  11170.     PUSH    SP,AC10
  11171.     PUSH    SP,AC11
  11172.     PUSH    SP,AC12
  11173.     PUSH    SP,AC13
  11174.     PUSH    SP,AC14
  11175.     PUSH    SP,AC16
  11176.     PUSH    SP,C.88                ;                                        6800
  11177.     PUSHJ    SP,TT%SET%OUTPUT
  11178.     MOVE    AC0,AC1
  11179.     MOVE    AC12,-12(SP)            ;                                        6804
  11180.     MOVEI    AC1,0(AC12)
  11181.     HRLI    AC1,341000
  11182.     ILDB    AC2,AC1
  11183.     MOVE    AC14,AC2
  11184.     SUBI    AC14,40
  11185.     MOVEI    AC16,4                ;                                        6805
  11186.     JUMPN    AC14,L.468            ;                                        6806
  11187.     MOVEI    AC1,0(AC12)            ;                                        6809
  11188.     HRLI    AC1,41000
  11189.     ILDB    AC2,AC1
  11190.     IMULI    AC2,137
  11191.     MOVEI    AC1,1(AC12)            ;                                        6811
  11192.     HRLI    AC1,341000
  11193.     ILDB    AC1,AC1
  11194.     ADD    AC2,AC1                ;                                        6810
  11195.     MOVE    AC14,AC2            ;                                        6812
  11196.     SUBI    AC14,5773
  11197.     MOVEI    AC16,7                ;                                        6813
  11198. L.468:    PUSHJ    SP,TT%CRLF            ;                                        6819
  11199.     PUSH    SP,C.126            ;                                        6820
  11200.     PUSHJ    SP,TT%TEXT
  11201.     MOVEI    AC1,0(AC12)            ;                                        6821
  11202.     HRLI    AC1,241000
  11203.     ILDB    AC1,AC1
  11204.     SUBI    AC1,40
  11205.     PUSH    SP,AC1
  11206.     PUSHJ    SP,TT%NUMBER
  11207.     PUSH    SP,C.127            ;                                        6822
  11208.     PUSHJ    SP,TT%TEXT
  11209.     PUSH    SP,C.128            ;                                        6823
  11210.     PUSHJ    SP,TT%TEXT
  11211.     MOVEM    AC14,0(SP)            ;                                        6824
  11212.     PUSHJ    SP,TT%NUMBER
  11213.     PUSH    SP,C.127            ;                                        6825
  11214.     PUSHJ    SP,TT%TEXT
  11215.     PUSHJ    SP,TT%CRLF            ;                                        6826
  11216.     PUSH    SP,C.129            ;                                        6830
  11217.     PUSHJ    SP,TT%TEXT
  11218.     MOVEI    AC1,0(AC12)            ;                                        6831
  11219.     HRLI    AC1,141000
  11220.     ILDB    AC1,AC1
  11221.     PUSH    SP,AC1
  11222.     PUSHJ    SP,TT%CHAR
  11223.     MOVEI    AC1,0(AC12)            ;                                        6833
  11224.     HRLI    AC1,141000
  11225.     ILDB    AC13,AC1
  11226.     CAIE    AC13,104            ;                                        6836
  11227.     JRST    L.469
  11228.     PUSH    SP,C.130            ;                                        6837
  11229.     JRST    L.479
  11230. L.469:    CAIE    AC13,131            ;                                        6839
  11231.     JRST    L.470
  11232.     PUSH    SP,C.131            ;                                        6840
  11233.     JRST    L.479
  11234. L.470:    CAIE    AC13,116            ;                                        6842
  11235.     JRST    L.471
  11236.     PUSH    SP,C.132            ;                                        6843
  11237.     JRST    L.479
  11238. L.471:    CAIE    AC13,123            ;                                        6845
  11239.     JRST    L.472
  11240.     PUSH    SP,C.133            ;                                        6846
  11241.     JRST    L.479
  11242. L.472:    CAIE    AC13,102            ;                                        6848
  11243.     JRST    L.473
  11244.     PUSH    SP,C.134            ;                                        6849
  11245.     JRST    L.479
  11246. L.473:    CAIE    AC13,106            ;                                        6851
  11247.     JRST    L.474
  11248.     PUSH    SP,C.135            ;                                        6852
  11249.     JRST    L.479
  11250. L.474:    CAIE    AC13,130            ;                                        6854
  11251.     JRST    L.475
  11252.     PUSH    SP,C.136            ;                                        6855
  11253.     JRST    L.479
  11254. L.475:    CAIE    AC13,132            ;                                        6857
  11255.     JRST    L.476
  11256.     PUSH    SP,C.137            ;                                        6858
  11257.     JRST    L.479
  11258. L.476:    CAIE    AC13,105            ;                                        6860
  11259.     JRST    L.477
  11260.     PUSH    SP,C.138            ;                                        6861
  11261.     JRST    L.479
  11262. L.477:    CAIE    AC13,107            ;                                        6863
  11263.     JRST    L.478
  11264.     PUSH    SP,C.139            ;                                        6864
  11265.     JRST    L.479
  11266. L.478:    CAIE    AC13,103            ;                                        6866
  11267.     JRST    L.480
  11268.     PUSH    SP,C.140            ;                                        6867
  11269. L.479:    PUSHJ    SP,TT%TEXT
  11270.     ADJSP    SP,-1
  11271. L.480:    PUSHJ    SP,TT%CRLF            ;                                        6870
  11272.     MOVE    AC2,AC14            ;                                        6875
  11273.     SUB    AC2,AC16
  11274.     MOVE    AC11,AC2
  11275.     ADDI    AC11,1
  11276.     MOVE    AC1,U.48
  11277.     SUBI    AC1,61
  11278.     CAMN    AC11,AC1
  11279.     JRST    L.484
  11280.     PUSH    SP,C.141            ;                                        6878
  11281.     PUSHJ    SP,TT%TEXT
  11282.     PUSHJ    SP,TT%CRLF            ;                                        6879
  11283.     MOVEI    AC1,0(AC12)            ;                                        6880
  11284.     HRLI    AC1,-337000
  11285.     ADJBP    AC16,AC1
  11286.     MOVE    AC2,AC11            ;                                        6882
  11287.     SUB    AC2,U.48
  11288.     MOVE    AC10,AC2
  11289.     ADDI    AC10,61
  11290.     SETZ    AC13,
  11291.     JRST    L.483
  11292. L.481:    MOVE    AC1,AC13            ;                                        6885
  11293.     IDIVI    AC1,12
  11294.     CAIE    AC2,1
  11295.     JRST    L.482
  11296.     PUSHJ    SP,TT%CRLF            ;                                        6888
  11297.     PUSH    SP,C.47                ;                                        6889
  11298.     PUSHJ    SP,TT%CHAR
  11299.     ADJSP    SP,-1                ;                                        6887
  11300. L.482:    PUSH    SP,C.142            ;                                        6892
  11301.     PUSHJ    SP,TT%TEXT
  11302.     ILDB    AC1,AC16            ;                                        6893
  11303.     PUSH    SP,AC1
  11304.     PUSHJ    SP,TT%CHAR
  11305.     PUSH    SP,C.143            ;                                        6894
  11306.     PUSHJ    SP,TT%CHAR
  11307.     ADJSP    SP,-3                ;                                        6883
  11308. L.483:    ADDI    AC13,1                ;                                        6882
  11309.     CAMG    AC13,AC10
  11310.     JRST    L.481
  11311.     MOVE    AC2,AC11            ;                                        6897
  11312.     SUB    AC2,U.48
  11313.     ADDI    AC2,61
  11314.     MOVE    AC1,AC2
  11315.     IDIVI    AC1,12
  11316.     CAIN    AC2,1
  11317.     PUSHJ    SP,TT%CRLF            ;                                        6898
  11318.     PUSHJ    SP,TT%CRLF            ;                                        6900
  11319.     ADJSP    SP,-1                ;                                        6877
  11320. L.484:    PUSH    SP,C.144            ;                                        6907
  11321.     PUSHJ    SP,TT%TEXT
  11322.     MOVE    AC1,U.48            ;                                        6909
  11323.     SUB    AC14,AC1
  11324.     ADDI    AC14,62
  11325.     MOVEI    AC2,0(AC12)
  11326.     HRLI    AC2,-337000
  11327.     ADJBP    AC14,AC2
  11328.     MOVE    AC16,AC14
  11329.     SUBI    AC1,61                ;                                        6911
  11330.     JRST    L.485(AC1)
  11331. L.485:    JRST    L.486
  11332.     JRST    L.487
  11333.     JRST    L.488
  11334. L.486:    PUSH    SP,C.142            ;                                        6916
  11335.     PUSHJ    SP,TT%TEXT
  11336.     MOVE    AC14,AC16            ;                                        6917
  11337.     ILDB    AC1,AC14
  11338.     PUSH    SP,AC1
  11339.     PUSHJ    SP,TT%CHAR
  11340.     PUSH    SP,C.143            ;                                        6918
  11341.     PUSHJ    SP,TT%CHAR
  11342.     MOVE    AC14,AC16            ;                                        6919
  11343.     ILDB    AC14,AC14
  11344.     SUBI    AC14,40
  11345.     JRST    L.489                ;                                        6911
  11346. L.487:    SETZ    AC14,                ;                                        6924
  11347.     PUSH    SP,C.142            ;                                        6925
  11348.     PUSHJ    SP,TT%TEXT
  11349.     MOVE    AC2,AC16            ;                                        6926
  11350.     ILDB    AC1,AC2
  11351.     PUSH    SP,AC1
  11352.     PUSHJ    SP,TT%CHAR
  11353.     PUSH    SP,C.143            ;                                        6927
  11354.     PUSHJ    SP,TT%CHAR
  11355.     ILDB    AC1,AC16            ;                                        6928
  11356.     SUBI    AC1,40
  11357.     DPB    AC1,C.123
  11358.     PUSH    SP,C.142            ;                                        6929
  11359.     PUSHJ    SP,TT%TEXT
  11360.     MOVE    AC2,AC16            ;                                        6930
  11361.     ILDB    AC1,AC2
  11362.     PUSH    SP,AC1
  11363.     PUSHJ    SP,TT%CHAR
  11364.     PUSH    SP,C.143            ;                                        6931
  11365.     PUSHJ    SP,TT%CHAR
  11366.     MOVE    AC2,AC16            ;                                        6932
  11367.     ILDB    AC1,AC2
  11368.     SUBI    AC1,40
  11369.     DPB    AC1,C.124
  11370.     ADJSP    SP,-3                ;                                        6923
  11371.     JRST    L.489                ;                                        6911
  11372. L.488:    SETZ    AC14,                ;                                        6937
  11373.     PUSH    SP,C.142            ;                                        6938
  11374.     PUSHJ    SP,TT%TEXT
  11375.     MOVE    AC2,AC16            ;                                        6939
  11376.     ILDB    AC1,AC2
  11377.     PUSH    SP,AC1
  11378.     PUSHJ    SP,TT%CHAR
  11379.     PUSH    SP,C.143            ;                                        6940
  11380.     PUSHJ    SP,TT%CHAR
  11381.     ILDB    AC1,AC16            ;                                        6941
  11382.     SUBI    AC1,40
  11383.     DPB    AC1,C.125
  11384.     PUSH    SP,C.142            ;                                        6942
  11385.     PUSHJ    SP,TT%TEXT
  11386.     MOVE    AC2,AC16            ;                                        6943
  11387.     ILDB    AC1,AC2
  11388.     PUSH    SP,AC1
  11389.     PUSHJ    SP,TT%CHAR
  11390.     PUSH    SP,C.143            ;                                        6944
  11391.     PUSHJ    SP,TT%CHAR
  11392.     ILDB    AC1,AC16            ;                                        6945
  11393.     SUBI    AC1,40
  11394.     DPB    AC1,C.123
  11395.     PUSH    SP,C.142            ;                                        6946
  11396.     PUSHJ    SP,TT%TEXT
  11397.     MOVE    AC2,AC16            ;                                        6947
  11398.     ILDB    AC1,AC2
  11399.     PUSH    SP,AC1
  11400.     PUSHJ    SP,TT%CHAR
  11401.     PUSH    SP,C.143            ;                                        6948
  11402.     PUSHJ    SP,TT%CHAR
  11403.     ILDB    AC1,AC16            ;                                        6949
  11404.     SUBI    AC1,40
  11405.     DPB    AC1,C.124
  11406.     ADJSP    SP,-6                ;                                        6936
  11407. L.489:    PUSH    SP,C.145            ;                                        6953
  11408.     PUSHJ    SP,TT%TEXT
  11409.     MOVEM    AC14,0(SP)            ;                                        6954
  11410.     PUSHJ    SP,TT%NUMBER
  11411.     PUSH    SP,C.127            ;                                        6955
  11412.     PUSHJ    SP,TT%TEXT
  11413.     PUSHJ    SP,TT%CRLF            ;                                        6956
  11414.     MOVEM    AC0,0(SP)            ;                                        6957
  11415.     PUSHJ    SP,TT%SET%OUTPUT
  11416.     ADJSP    SP,-16                ;                                        6753
  11417.     POP    SP,AC16                ;                                        6714
  11418.     POP    SP,AC14
  11419.     POP    SP,AC13
  11420.     POP    SP,AC12
  11421.     POP    SP,AC11
  11422.     POP    SP,AC10
  11423.     POP    SP,AC0
  11424.     POPJ    SP,
  11425. C.123:    POINT    6,AC14,29
  11426. C.124:    POINT    6,AC14,35
  11427. C.125:    POINT    4,AC14,23
  11428. C.126:    XWD    0,U.117
  11429. C.127:    XWD    0,U.119
  11430. C.128:    XWD    0,U.118
  11431. C.129:    XWD    0,U.120
  11432. C.130:    XWD    0,U.105
  11433. C.131:    XWD    0,U.106
  11434. C.132:    XWD    0,U.107
  11435. C.133:    XWD    0,U.108
  11436. C.134:    XWD    0,U.109
  11437. C.135:    XWD    0,U.111
  11438. C.136:    XWD    0,U.110
  11439. C.137:    XWD    0,U.112
  11440. C.138:    XWD    0,U.113
  11441. C.139:    XWD    0,U.116
  11442. C.140:    XWD    0,U.115
  11443. C.141:    XWD    0,U.123
  11444. C.142:    XWD    0,U.124
  11445. C.143:    EXP    42
  11446. C.144:    XWD    0,U.121
  11447. C.145:    XWD    0,U.122
  11448.  
  11449. ; Routine Size:  279 words
  11450.  
  11451.  
  11452. ;   6959  1    %SBTTL 'End of KERMSG'
  11453. ;   6960  1    END
  11454. ;   6961  1    
  11455. ;   6962  0    ELUDOM
  11456.  
  11457.  
  11458.  
  11459.  
  11460. ; Low  segment length:     555 words
  11461. ; High segment length:    4095 words
  11462.  
  11463.  
  11464.  
  11465.  
  11466.  
  11467. ; Compilation Complete
  11468.  
  11469.     END