home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / old / misc / pdp10 / k10msg.mac < prev    next >
Text File  |  2020-01-01  |  331KB  |  11,400 lines

  1. ;   0001  0    %TITLE 'KERMSG - Kermit message processing'
  2. ;   0002  0    MODULE KERMSG (IDENT = '3.3.108'
  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
  316. ;   0316  1    %SBTTL 'Interface requirements'
  317. ;   0317  1
  318. ;   0318  1    !++
  319. ;   0319  1    !        Interface requirements
  320. ;   0320  1    !
  321. ;   0321  1    ! The following routines and data locations are rquired for a correct
  322. ;   0322  1    ! implementation of KERMIT.
  323. ;   0323  1    !
  324. ;   0324  1    ! File routines:
  325. ;   0325  1    !
  326. ;   0326  1    !    FILE%OPEN (Function)
  327. ;   0327  1    !        This routine will open a file for reading or writting.  It
  328. ;   0328  1    !        will assume that FILE%SIZE contains the number of bytes
  329. ;   0329  1    !        and FILE%NAME contains the file name of length FILE%SIZE.
  330. ;   0330  1    !        The function that is passed is either FNC%READ or FNC%WRITE.
  331. ;   0331  1    !
  332. ;   0332  1    !    FILE%CLOSE ()
  333. ;   0333  1    !        This routine will close the currently open file.  This
  334. ;   0334  1    !        routine will return the status of the operation.
  335. ;   0335  1    !
  336. ;   0336  1    !    GET%FILE (Character)
  337. ;   0337  1    !        This routine will get a character from the currently open file
  338. ;   0338  1    !        and store it in the location specified by "Character".  There
  339. ;   0339  1    !        will be a true/false value returned by the routine to determine
  340. ;   0340  1    !        if there was an error.
  341. ;   0341  1    !
  342. ;   0342  1    !    PUT%FILE (Character)
  343. ;   0343  1    !        This routine will output a character to the currently open
  344. ;   0344  1    !        file.  It will return a true/false value to determine if the
  345. ;   0345  1    !        routine was successful.
  346. ;   0346  1    !
  347. ;   0347  1    !    NEXT%FILE ()
  348. ;   0348  1    !        This routine will advance to the next file.  This routine
  349. ;   0349  1    !        will return false if there are no more files to process.
  350. ;   0350  1    !
  351. ;   0351  1    ! Communications line routines:
  352. ;   0352  1    !
  353. ;   0353  1    !    RECEIVE (Buffer address, Address of var to store length into)
  354. ;   0354  1    !        This routine will receive a message from the remote Kermit.
  355. ;   0355  1    !
  356. ;   0356  1    !    SEND (Buffer address, Length in characters)
  357. ;   0357  1    !        This routine will send a message to the remote Kermit.
  358. ;   0358  1    !
  359. ;   0359  1    !    GEN%CRC (Buffer address, length in characters)
  360. ;   0360  1    !        This routine will calculate the CRC-CCITT for the characters
  361. ;   0361  1    !        in the buffer.
  362. ;   0362  1    !
  363. ;   0363  1    ! Operating system routines:
  364. ;   0364  1    !
  365. ;   0365  1    !    SY%DISMISS (Seconds)
  366. ;   0366  1    !        This routine will cause Kermit to sleep for the specified
  367. ;   0367  1    !        number of seconds.  It is used to handle the DELAY parameter.
  368. ;   0368  1    !
  369. ;   0369  1    !    SY%LOGOUT ()
  370. ;   0370  1    !        Log the job off of the system. (Kill the process).
  371. ;   0371  1    !
  372. ;   0372  1    !    SY%TIME ()
  373. ;   0373  1    !        This routine will return the starting time milliseconds.
  374. ;   0374  1    !        It can be the start of Kermit, the system, etc, so long
  375. ;   0375  1    !        as it always is incrementing.
  376. ;   0376  1    !
  377. ;   0377  1    ! Status routines:
  378. ;   0378  1    !
  379. ;   0379  1    !    XFR%STATUS (Type, Subtype);
  380. ;   0380  1    !        This routine is called to indicate the occurance of
  381. ;   0381  1    !        a significant event that the user interface may wish
  382. ;   0382  1    !        to inform the user about.  The arguments indicate the
  383. ;   0383  1    !        type of event.
  384. ;   0384  1    !        Type: "S" - Send, "R" - Receive
  385. ;   0385  1    !            Subtype: "P" - Packet
  386. ;   0386  1    !                 "N" - NAK
  387. ;   0387  1    !                 "T" - timeout
  388. ;   0388  1    !        For type = "I" (initiate), "T" (terminate):
  389. ;   0389  1    !            Subtype: "S" - a file send
  390. ;   0390  1    !                 "R" - a file receive
  391. ;   0391  1    !                 "G" - a generic command
  392. ;   0392  1    !                 "I" - for "T" only, returning to server idle
  393. ;   0393  1    !        For type = "F" (file operation):
  394. ;   0394  1    !            Subtype: "S" - open for sending
  395. ;   0395  1    !                 "R" - open for receiving
  396. ;   0396  1    !                 "C" - closing file OK
  397. ;   0397  1    !                 "X" - aborting file by user request
  398. ;   0398  1    !                 "Z" - aborting group by user request
  399. ;   0399  1    !                 "D" - aborting file, but saving due to disposition
  400. ;   0400  1    !                 "A" - aborting file due to protocol error
  401. ;   0401  1    !
  402. ;   0402  1    ! Error processing:
  403. ;   0403  1    !
  404. ;   0404  1    !    KRM%ERROR (Error parameter)
  405. ;   0405  1    !        This routine will cause an error message to be issued.
  406. ;   0406  1    !        The error parameter is defined by KERERR.  This may cause
  407. ;   0407  1    !        SND%ERROR to be called to send an "E" message to the remote.
  408. ;   0408  1    !
  409. ;   0409  1    ! Terminal I/O routines:
  410. ;   0410  1    !
  411. ;   0411  1    !    TERM%DUMP (Buffer, Count)
  412. ;   0412  1    !    DBG%DUMP (Buffer, Count)
  413. ;   0413  1    !        This routine will dump the buffer onto the user's terminal.
  414. ;   0414  1    !        The routine is supplied with the count of the characters
  415. ;   0415  1    !        and the address of the buffer.
  416. ;   0416  1    !        These may be the same routine or different.  DBG%DUMP
  417. ;   0417  1    !        is only called for debugging output.
  418. ;   0418  1    !
  419. ;   0419  1    !
  420. ;   0420  1    !            ENTRY POINTS
  421. ;   0421  1    !
  422. ;   0422  1    ! KERMSG contains the following entry points for the KERMIT.
  423. ;   0423  1    !
  424. ;   0424  1    !    SERVER ()
  425. ;   0425  1    !        This routine will cause KERMIT go enter server mode.
  426. ;   0426  1    !
  427. ;   0427  1    !    SEND%SWITCH ()
  428. ;   0428  1    !        This routine will send a file.  It expects that the user
  429. ;   0429  1    !        has stored the text of the file name into FILE%NAME and
  430. ;   0430  1    !        the length of the text into FILE%SIZE.
  431. ;   0431  1    !
  432. ;   0432  1    !    REC%SWITCH ()
  433. ;   0433  1    !        This routine will receive a file.  It expects that the default
  434. ;   0434  1    !        file name is set up in FILE%NAME and the length is in
  435. ;   0435  1    !        FILE%SIZE.
  436. ;   0436  1    !
  437. ;   0437  1    !    GEN%PARITY (Character)
  438. ;   0438  1    !        This routine will return the character with the proper parity
  439. ;   0439  1    !        on the character.
  440. ;   0440  1    !
  441. ;   0441  1    !    SND%ERROR (COUNT, ADDRESS)
  442. ;   0442  1    !        This routine will send the text of an error to the remote
  443. ;   0443  1    !        Kermit.
  444. ;   0444  1    !
  445. ;   0445  1    !    DO%GENERIC (TYPE)
  446. ;   0446  1    !        This routine will cause a generic function to be sent to
  447. ;   0447  1    !        the remote Kermit.  This routine will then do all of the
  448. ;   0448  1    !        necessary hand shaking to handle the local end of the generic
  449. ;   0449  1    !        Kermit command.
  450. ;   0450  1    !
  451. ;   0451  1    !
  452. ;   0452  1    !        GLOBAL Storage
  453. ;   0453  1    !
  454. ;   0454  1    ! The following are the global storage locations that are used to interface
  455. ;   0455  1    ! to KERMSG.  These locations contains the various send and receive parameters.
  456. ;   0456  1    !
  457. ;   0457  1    ! Receive parameters:
  458. ;   0458  1    !
  459. ;   0459  1    !    RCV%PKT%SIZE
  460. ;   0460  1    !        Receive packet size.
  461. ;   0461  1    !    RCV%NPAD
  462. ;   0462  1    !        Padding length
  463. ;   0463  1    !    RCV%PADCHAR
  464. ;   0464  1    !        Padding character
  465. ;   0465  1    !    RCV%TIMEOUT
  466. ;   0466  1    !        Time out
  467. ;   0467  1    !    RCV%EOL
  468. ;   0468  1    !        End of line character
  469. ;   0469  1    !    RCV%QUOTE%CHR
  470. ;   0470  1    !        Quote character
  471. ;   0471  1    !    RCV%8QUOTE%CHR
  472. ;   0472  1    !        8-bit quoting character
  473. ;   0473  1    !    RCV%SOH
  474. ;   0474  1    !        Start of header character
  475. ;   0475  1    !
  476. ;   0476  1    ! Send parameters (Negative values denote the default, positive user supplied):
  477. ;   0477  1    !
  478. ;   0478  1    !    SND%PKT%SIZE
  479. ;   0479  1    !        Send packet size
  480. ;   0480  1    !    SND%NPAD
  481. ;   0481  1    !        Padding length
  482. ;   0482  1    !    SND%PADCHAR
  483. ;   0483  1    !        Padding character
  484. ;   0484  1    !    SND%TIMEOUT
  485. ;   0485  1    !        Time out
  486. ;   0486  1    !    SND%EOL
  487. ;   0487  1    !        End of line character
  488. ;   0488  1    !    SND%QUOTE%CHR
  489. ;   0489  1    !        Quote character
  490. ;   0490  1    !    SND%SOH
  491. ;   0491  1    !        Start of header character (normally 001)
  492. ;   0492  1    !
  493. ;   0493  1    ! Statistics:
  494. ;   0494  1    !
  495. ;   0495  1    !    SND%TOTAL%CHARS
  496. ;   0496  1    !        Total characters sent for this Kermit session
  497. ;   0497  1    !    RCV%TOTAL%CHARS
  498. ;   0498  1    !        Total characters received for this Kermit session
  499. ;   0499  1    !    SND%DATA%CHARS
  500. ;   0500  1    !        Total number of data characters sent for this Kermit session
  501. ;   0501  1    !    RCV%DATA%CHARS
  502. ;   0502  1    !        Total number of data characters received for this Kermit session
  503. ;   0503  1    !    SND%COUNT
  504. ;   0504  1    !        Total number of packets that have been sent
  505. ;   0505  1    !    RCV%COUNT
  506. ;   0506  1    !        Total number of packets that have been received.
  507. ;   0507  1    !    SMSG%TOTAL%CHARS
  508. ;   0508  1    !        Total characters sent for this file transfer
  509. ;   0509  1    !    RMSG%TOTAL%CHARS
  510. ;   0510  1    !        Total characters received for this file transfer
  511. ;   0511  1    !    SMSG%DATA%CHARS
  512. ;   0512  1    !        Total data characters sent for this file transfer
  513. ;   0513  1    !    RMSG%DATA%CHARS
  514. ;   0514  1    !        Total data characters received for this file transfer
  515. ;   0515  1    !    SMSG%NAKS
  516. ;   0516  1    !        Total number of NAKs sent for this file transfer
  517. ;   0517  1    !    RMSG%NAKS
  518. ;   0518  1    !        Total number of NAKs received for this file transfer
  519. ;   0519  1    !    XFR%TIME
  520. ;   0520  1    !        Amount of time the last transfer took in milliseconds.
  521. ;   0521  1    !    TOTAL%TIME
  522. ;   0522  1    !        Total amount of time spend transfering data.
  523. ;   0523  1    !
  524. ;   0524  1    ! Misc constants:
  525. ;   0525  1    !
  526. ;   0526  1    !    LAST%ERROR
  527. ;   0527  1    !        ASCIZ of the last error message issued.
  528. ;   0528  1    !    FILE%NAME
  529. ;   0529  1    !        Vector containing the ASCII characters of the file name.
  530. ;   0530  1    !    FILE%SIZE
  531. ;   0531  1    !        Number of characters in the FILE%NAME vector.
  532. ;   0532  1    !    DELAY
  533. ;   0533  1    !        Amount of time to delay
  534. ;   0534  1    !    DUPLEX
  535. ;   0535  1    !        DP%HALF or DP%FULL to denote either half duplex or full duplex.
  536. ;   0536  1    !        [Currently only DP%FULL is supported]
  537. ;   0537  1    !    PKT%RETRIES
  538. ;   0538  1    !        Number of retries to attempt to read a message.
  539. ;   0539  1    !    SI%RETRIES
  540. ;   0540  1    !        Number of retries to attempt on send inits
  541. ;   0541  1    !    DEBUG%FLAG
  542. ;   0542  1    !        Debugging mode on/off
  543. ;   0543  1    !    WARN%FLAG
  544. ;   0544  1    !        File warning flag
  545. ;   0545  1    !    IBM%FLAG
  546. ;   0546  1    !        True if talking to an IBM system, else false.
  547. ;   0547  1    !    ECHO%FLAG
  548. ;   0548  1    !        Local echo flag
  549. ;   0549  1    !    CONNECT%FLAG
  550. ;   0550  1    !        Connected flag; True if terminal and SET LINE are the same
  551. ;   0551  1    !    PARITY%TYPE
  552. ;   0552  1    !        Type of parity to use on sends.
  553. ;   0553  1    !    DEV%PARITY%FLAG
  554. ;   0554  1    !        Device will add parity to message.  True if device adds
  555. ;   0555  1    !        parity and false if we must do it.
  556. ;   0556  1    !    FLAG%FILE%OPEN
  557. ;   0557  1    !        File is opened.
  558. ;   0558  1    !
  559. ;   0559  1    !--
  560. ;   0560  1
  561. ;   0561  1    %SBTTL 'Declarations -- Forward definitions'
  562. ;   0562  1    !<BLF/NOFORMAT>
  563. ;   0563  1    !
  564. ;   0564  1    ! Forward definitions
  565. ;   0565  1    !
  566. ;   0566  1
  567. ;   0567  1    FORWARD ROUTINE
  568. ;   0568  1
  569. ;   0569  1    ! Main loop for a complete transaction
  570. ;   0570  1        DO%TRANSACTION,        ! Perform a complete transaction
  571. ;   0571  1
  572. ;   0572  1    ! Send processing routines
  573. ;   0573  1
  574. ;   0574  1        SEND%SERVER%INIT,        ![026] Send a server init packet
  575. ;   0575  1        SEND%DATA,            ! Send data to the micro
  576. ;   0576  1        SEND%FILE,            ! Send file name
  577. ;   0577  1        SEND%OPEN%FILE,            ! Open file for sending
  578. ;   0578  1        SEND%GENCMD,        ! Send generic command
  579. ;   0579  1        SEND%EOF,            ! Send EOF
  580. ;   0580  1        SEND%INIT,            ! Send initialization msg
  581. ;   0581  1        SEND%BREAK,            ! Send break end of transmission
  582. ;   0582  1
  583. ;   0583  1    ! Receive processing routines
  584. ;   0584  1
  585. ;   0585  1        REC%SERVER%IDLE,        ! Wait for message while server is idle
  586. ;   0586  1        REC%INIT,            ! Receive initialization
  587. ;   0587  1        REC%FILE,            ! Receive file information
  588. ;   0588  1        REC%DATA,            ! Receive data
  589. ;   0589  1    !
  590. ;   0590  1    ! Server processing routines
  591. ;   0591  1    !
  592. ;   0592  1        SERVER%GENERIC,        ! Process generic KERMIT commands
  593. ;   0593  1        HOST%COMMAND,        ! Process host command
  594. ;   0594  1        KERMIT%COMMAND,        ! Process Kermit command
  595. ;   0595  1        CALL%SY%RTN,        ! Handle calling system routine and returning result
  596. ;   0596  1    !
  597. ;   0597  1    ! Statistic gathering routines
  598. ;   0598  1    !
  599. ;   0599  1        END%STATS    : NOVALUE,    ! End of a message processing stats routine
  600. ;   0600  1
  601. ;   0601  1    ! Low level send/receive routines
  602. ;   0602  1
  603. ;   0603  1        CALC%BLOCK%CHECK,        ! Routine to calculate the block check value
  604. ;   0604  1        SET%SEND%INIT : NOVALUE,    ! Set up the MSG%SND%INIT parameters.
  605. ;   0605  1        PRS%SEND%INIT,        ! Parse MSG%SND%INIT parameters.
  606. ;   0606  1        DO%PARITY : NOVALUE,    ! Routine to generate parity for a message
  607. ;   0607  1        GEN%PARITY,            ! Routine to add parity to a character
  608. ;   0608  1        SEND%PACKET,        ! Send a packet to the remote
  609. ;   0609  1        REC%MESSAGE,        ! Receive a message with retry processing
  610. ;   0610  1        REC%PACKET,            ! Receive a packet from the remote
  611. ;   0611  1
  612. ;   0612  1    ! Utility routines
  613. ;   0613  1
  614. ;   0614  1        NORMALIZE%FILE : NOVALUE,    ! Force file name into normal form
  615. ;   0615  1        BFR%EMPTY,            ! Empty the data buffer
  616. ;   0616  1        BFR%FILL,            ! Fill the data buffer from a file
  617. ;   0617  1        SET%STRING,            ![025] Routine to set alternate get/put routines
  618. ;   0618  1                        ! for use with in memory strings
  619. ;   0619  1        TYPE%CHAR,            ! Type a character from a packet
  620. ;   0620  1        INIT%XFR    : NOVALUE,    ! Initialize the per transfer processing
  621. ;   0621  1        STS%OUTPUT    : NOVALUE,    ! Output current transfer status
  622. ;   0622  1    !
  623. ;   0623  1    ! Debugging routines
  624. ;   0624  1    !
  625. ;   0625  1        DBG%MESSAGE    : NOVALUE,    ! Type out a formatted message
  626. ;   0626  1        DBG%SEND    : NOVALUE,    ! Send message debugging routine
  627. ;   0627  1        DBG%RECEIVE    : NOVALUE;    ! Receive message debugging routine
  628. ;   0628  1        %SBTTL    'Require files'
  629. ;   0629  1
  630. ;   0630  1    !
  631. ;   0631  1    !<BLF/FORMAT>
  632. ;   0632  1    !
  633. ;   0633  1    ! REQUIRE FILES:
  634. ;   0634  1    !
  635. ;   0635  1
  636. ; L 0636  1    %IF %BLISS (BLISS32)
  637. ; U 0637  1    %THEN
  638. ; U 0638  1
  639. ; U 0639  1    LIBRARY 'SYS$LIBRARY:STARLET';
  640. ; U 0640  1
  641. ;   0641  1    %FI
  642. ;   0642  1
  643. ;   0643  1    REQUIRE 'KERCOM';
  644. ;   0850  1
  645. ;   0851  1    REQUIRE 'KERERR';
  646. ;   0874  1
  647. ;   0875  1    %SBTTL 'Macro definitions'
  648. ;   0876  1    !
  649. ;   0877  1    ! MACROS:
  650. ;   0878  1    !
  651. ;   0879  1
  652. ;   0880  1    MACRO
  653. ; M 0881  1        CTL (C) =
  654. ;   0882  1     ((C) XOR %O'100')%,
  655. ; M 0883  1        CHAR (C) =
  656. ;   0884  1     ((C) + %O'40')%,
  657. ; M 0885  1        UNCHAR (C) =
  658. ;   0886  1     ((C) - %O'40')%;
  659. ;   0887  1
  660. ;   0888  1    %SBTTL 'KERMIT Protocol Definitions'
  661. ;   0889  1
  662. ;   0890  1    !++
  663. ;   0891  1    ! The following describes the various items that are found in the
  664. ;   0892  1    ! KERMIT messages.  A complete and through desription of the protocol can be
  665. ;   0893  1    ! found in the KERMIT PROTOCOL MANUAL.
  666. ;   0894  1    !
  667. ;   0895  1    !
  668. ;   0896  1    ! All KERMIT messages have the following format:
  669. ;   0897  1    !
  670. ;   0898  1    ! <Mark><CHAR(Count)><CHAR(Seq)><Message-dependent information><Check><EOL>
  671. ;   0899  1    !
  672. ;   0900  1    ! <MARK>
  673. ;   0901  1    !    Normally SOH (Control-A, octal 001).
  674. ;   0902  1    !
  675. ;   0903  1    ! <CHAR(Count)>
  676. ;   0904  1    !    Count of the number of characters following this position.
  677. ;   0905  1    !    Character counts of ONLY 0 to 94 are valid.
  678. ;   0906  1    ! [108] Charavcter count = 0 means extended length type packet.
  679. ;   0907  1    !
  680. ;   0908  1    ! <CHAR(Seq)>
  681. ;   0909  1    !    Packet sequence number, modulo 100 (octal).
  682. ;   0910  1    !
  683. ;   0911  1    ! [108]    <CHAR(Type)>
  684. ;   0912  1    ! [108]        Packet type, usually a mnemonic ASCII character.
  685. ;   0913  1    ! [108]
  686. ;   0914  1    ! [108]    For Extended Length packets only:
  687. ;   0915  1    ! [108]   <CHAR(Count/95)>
  688. ;   0916  1    ! [108]        Count of the number of characters / 95, from (HeaderCheck)
  689. ;   0917  1    ! [108]
  690. ;   0918  1    ! [108]   <CHAR(Count MOD 95)>
  691. ;   0919  1    ! [108]        Count of the number of characters MOD 95, from (HeaderCheck)
  692. ;   0920  1    ! [108]
  693. ;   0921  1    ! [108]   <CHAR(HeaderCheck)>
  694. ;   0922  1    ! [108]        Kermit type-1 checksum of the 5 preceding ASCII characters.
  695. ;   0923  1    !
  696. ;   0924  1    ! <MESSAGE-DEPENDENT INFORMATION>
  697. ;   0925  1    !    This field contains the message dependent information.  There can
  698. ;   0926  1    !    be multiple fields in this section.  See the KERMIT Protocol document
  699. ;   0927  1    !    for a complete description of this.
  700. ;   0928  1    !
  701. ;   0929  1    ! <Check>
  702. ;   0930  1    !    A block check on the characters in the packet between, but not
  703. ;   0931  1    !    including, the mark and the checksum itself.  It may be one to three
  704. ;   0932  1    !    characters, depending upon the type agreed upon.
  705. ;   0933  1    !
  706. ;   0934  1    !    1. Single character arithmetic sum equal to:
  707. ;   0935  1    !        chksum = (s + ((s AND 300)/100)) AND 77
  708. ;   0936  1    !        Character sent is CHAR(chksum).
  709. ;   0937  1    !
  710. ;   0938  1    !    2. Two character arithmetic sum.  CHAR of bits 6-11 are the first
  711. ;   0939  1    !       character, CHAR of bits 0-5 are the second character.
  712. ;   0940  1    !
  713. ;   0941  1    !    3. Three character CRC-CCITT.  First character is CHAR of bits 12-15,
  714. ;   0942  1    !       second is CHAR of bits 6-11, third is CHAR of bits 0-5.
  715. ;   0943  1    !
  716. ;   0944  1    !
  717. ;   0945  1    ! <EOL>
  718. ;   0946  1    !    End of line.  Any line terminator that may be required by the host.
  719. ;   0947  1    !--
  720. ;   0948  1
  721. ;   0949  1    %SBTTL 'KERMIT Protocol Definitions -- Packet offsets'
  722. ;   0950  1
  723. ;   0951  1    !++
  724. ;   0952  1    ! The following define the various offsets of the standard KERMIT
  725. ;   0953  1    ! packets.
  726. ;   0954  1    !--
  727. ;   0955  1
  728. ;   0956  1    LITERAL
  729. ;   0957  1        PKT%MARK = 0,                ! <MARK>
  730. ;   0958  1        PKT%COUNT = 1,                ! <CHAR(Count)>
  731. ;   0959  1        PKT%SEQ = 2,                ! <CHAR(Seq)>
  732. ;   0960  1        PKT%TYPE = 3,                ! <Message type>
  733. ;   0961  1        PKT%MSG = 4,                ! <MESSAGE-DEPENDENT INFORMATION>
  734. ;   0962  1        PKT%COUNTX1 = 4,            ! [108]    ! Ext. pkt: <CHAR(MSB(Count))>
  735. ;   0963  1        PKT%COUNTX2 = 5,            ! [108]    ! Ext. pkt: <CHAR(LSB(Count))>
  736. ;   0964  1        PKT%HCHECK = 6,            ! [108]    ! Ext. pkt: Header parity
  737. ;   0965  1        PKT%MSGX = 7,            ! [108]    ! <MESSAGE-DEPENDENT INFORMATION>
  738. ;   0966  1        PKT%MAX%MSG = 94 - 5,            ! Maximum size of the message dependent
  739. ;   0967  1                                !  information
  740. ;   0968  1        PKT%CHKSUM = 0,                ! <CHAR(Chksum)> offset from end of
  741. ;   0969  1                                !    Message dependent information
  742. ;   0970  1        PKT%EOL = 1,                ! <Eol> offset from end of data
  743. ;   0971  1    ! [108]   PKT%OVR%HEAD%B = 2,            ! Header overhead
  744. ;   0972  1    ! [108]   PKT%OVR%HEAD%E = 1,            ! Overhead at the end
  745. ;   0973  1        PKT%OVR%HEAD = 3,                ! Overhead added to data length
  746. ;   0974  1        PKT%TOT%OVR%HEAD = 6;            ! Total overhead of the message
  747. ;   0975  1
  748. ;   0976  1    %SBTTL 'KERMIT Protocol Definitions -- Message dependent field'
  749. ;   0977  1
  750. ;   0978  1    !++
  751. ;   0979  1    ! The MESSAGE-DEPENDENT information field of the message contains at
  752. ;   0980  1    ! least one part.  That is the type of message.  The remainder of the message
  753. ;   0981  1    ! MESSAGE-DEPENDENT field is different depending on the message.
  754. ;   0982  1    !
  755. ;   0983  1    ! <TYPE><TYPE-DEPENDENT-INFORMATION>
  756. ;   0984  1    !
  757. ;   0985  1    ! <TYPE>
  758. ;   0986  1    !    The type defines the type of message that is being processed.
  759. ;   0987  1    !
  760. ;   0988  1    !--
  761. ;   0989  1
  762. ;   0990  1    ! Protocol version 1.0 message types
  763. ;   0991  1
  764. ;   0992  1    LITERAL
  765. ;   0993  1        MSG%DATA = %C'D',                ! Data packet
  766. ;   0994  1        MSG%ACK = %C'Y',                ! Acknowledgement
  767. ;   0995  1        MSG%NAK = %C'N',                ! Negative acknowledgement
  768. ;   0996  1        MSG%SND%INIT = %C'S',            ! Send initiate
  769. ;   0997  1        MSG%BREAK = %C'B',                ! Break transmission
  770. ;   0998  1        MSG%FILE = %C'F',                ! File header
  771. ;   0999  1        MSG%EOF = %C'Z',                ! End of file (EOF)
  772. ;   1000  1        MSG%ERROR = %C'E';                ! Error
  773. ;   1001  1
  774. ;   1002  1    ! Protocol version 2.0 message types
  775. ;   1003  1
  776. ;   1004  1    LITERAL
  777. ;   1005  1        MSG%RCV%INIT = %C'R',            ! Receive initiate
  778. ;   1006  1        MSG%COMMAND = %C'C',            ! Host command
  779. ;   1007  1        MSG%GENERIC = %C'G',            ! Generic KERMIT command.
  780. ;   1008  1        MSG%KERMIT = %C'K';                ! Perform KERMIT command (text)
  781. ;   1009  1
  782. ;   1010  1    ! Protocol version 4.0 message types
  783. ;   1011  1
  784. ;   1012  1    LITERAL
  785. ;   1013  1        MSG%SER%INIT = %C'I',            ! Server initialization
  786. ;   1014  1        MSG%TEXT = %C'X';                ! Text header message
  787. ;   1015  1
  788. ;   1016  1    !++
  789. ;   1017  1    ! Generic KERMIT commands
  790. ;   1018  1    !--
  791. ;   1019  1
  792. ;   1020  1    LITERAL
  793. ;   1021  1        MSG%GEN%LOGIN = %C'I',            ! Login
  794. ;   1022  1        MSG%GEN%EXIT = %C'F',            ! Finish (exit to OS)
  795. ;   1023  1        MSG%GEN%CONNECT = %C'C',            ! Connect to a directory
  796. ;   1024  1        MSG%GEN%LOGOUT = %C'L',            ! Logout
  797. ;   1025  1        MSG%GEN%DIRECTORY = %C'D',            ! Directory
  798. ;   1026  1        MSG%GEN%DISK%USAGE = %C'U',            ! Disk usage
  799. ;   1027  1        MSG%GEN%DELETE = %C'E',            ! Delete a file
  800. ;   1028  1        MSG%GEN%TYPE = %C'T',            ! Type a file specification
  801. ;   1029  1    !    MSG%GEN%SUBMIT = %C'S',            ! Submit
  802. ;   1030  1    !    MSG%GEN%PRINT = %C'P',            ! Print
  803. ;   1031  1        MSG%GEN%WHO = %C'W',            ! Who's logged in
  804. ;   1032  1        MSG%GEN%SEND = %C'M',            ! Send a message to a user
  805. ;   1033  1        MSG%GEN%HELP = %C'H',            ! Help
  806. ;   1034  1        MSG%GEN%QUERY = %C'Q',            ! Query status
  807. ;   1035  1        MSG%GEN%RENAME = %C'R',            ! Rename file
  808. ;   1036  1        MSG%GEN%COPY = %C'K',            ! Copy file
  809. ;   1037  1        MSG%GEN%PROGRAM = %C'P',            ! Run program and pass data
  810. ;   1038  1        MSG%GEN%JOURNAL = %C'J',            ! Perform journal functions
  811. ;   1039  1        MSG%GEN%VARIABLE = %C'V';            ! Return/set variable state
  812. ;   1040  1
  813. ;   1041  1    !
  814. ;   1042  1    ! Acknowledgement modifiers (protocol 4.0)
  815. ;   1043  1    !
  816. ;   1044  1
  817. ;   1045  1    LITERAL
  818. ;   1046  1        MSG%ACK%ABT%CUR = %C'X',            ! Abort current file
  819. ;   1047  1        MSG%ACK%ABT%ALL = %C'Z';            ! Abort entire stream of files
  820. ;   1048  1
  821. ;   1049  1    !
  822. ;   1050  1    ! End of file packet modifier
  823. ;   1051  1    !
  824. ;   1052  1
  825. ;   1053  1    LITERAL
  826. ;   1054  1        MSG%EOF%DISCARD = %C'D';            ! Discard data from previous file
  827. ;   1055  1
  828. ;   1056  1    %SBTTL 'KERMIT Protocol Definitions -- SEND initiate packet'
  829. ;   1057  1
  830. ;   1058  1    !++
  831. ;   1059  1    !
  832. ;   1060  1    ! The following describes the send initiate packet.  All fields in the message
  833. ;   1061  1    ! data area are optional.
  834. ;   1062  1    !
  835. ;   1063  1    ! <"S"><CHAR(Bufsiz)><CHAR(Timeout)><CHAR(npad)><CTL(pad)><CHAR(Eol)><Quote>
  836. ;   1064 1    !    <8-bit-quote><Check-type><Repeat-count-processing><Reserved><Reserved>
  837. ;   1065  1    !
  838. ;   1066  1    ! BUFSIZ
  839. ;   1067  1    !    Sending Kermit's maximum buffer size.
  840. ;   1068  1    !
  841. ;   1069  1    ! Timeout
  842. ;   1070  1    !    Number of seconds after which the sending Kermit wishes to be timed out
  843. ;   1071  1    !
  844. ;   1072  1    ! Npad
  845. ;   1073  1    !    Number of padding caracters the sending Kermit needs preceding each
  846. ;   1074  1    !    packet.
  847. ;   1075  1    !
  848. ;   1076  1    ! PAD
  849. ;   1077  1    !    Padding character.
  850. ;   1078  1    !
  851. ;   1079  1    ! EOL
  852. ;   1080  1    !    A line terminator required on all packets set by the receiving
  853. ;   1081  1    !    Kermit.
  854. ;   1082  1    !
  855. ;   1083  1    ! Quote
  856. ;   1084  1    !    The printable ASCII characer the sending Kermit will use when quoting
  857. ;   1085  1    !    the control cahracters.  Default is "#".
  858. ;   1086  1    !
  859. ;   1087  1    ! 8-bit-quote
  860. ;   1088  1    !    Specify quoting mecanism for 8-bit quantities.  A quoting mecanism is
  861. ;   1089  1    !    mecessary when sending to hosts which prevent the use of the 8th bit
  862. ;   1090  1    !    for data.  When elected, the quoting mechanism will be used by both
  863. ;   1091  1    !    hosts, and the quote character must be in the range of 41-76 or 140-176
  864. ;   1092  1    !    octal, but different from the control-quoting character.  This field is
  865. ;   1093  1    !    interpreted as follows:
  866. ;   1094  1    !
  867. ;   1095  1    !    "Y" - I agree to 8-bit quoting if you request it.
  868. ;   1096  1    !    "N" - I will not do 8-bit quoting.
  869. ;   1097  1    !    "&" - (or any other character in the range of 41-76 or 140-176) I want
  870. ;   1098  1    !          to do 8-bit quoting using this character (it will be done if the
  871. ;   1099  1    !          other Kermit puts a "Y" in this field.
  872. ;   1100  1    !    Anything else: Quoting will not be done.
  873. ;   1101  1    !
  874. ;   1102  1    ! Check-type
  875. ;   1103  1    !    Type of block check.  The only values presently allowed in this
  876. ;   1104  1    !    field are "1", "2" or "3".  Future implementations may allow other
  877. ;   1105  1    !    values.  Interpretation of the values is:
  878. ;   1106  1    !
  879. ;   1107  1    !    "1" - Single character checksum.  Default value if none specified.
  880. ;   1108  1    !    "2" - Double character checksum.
  881. ;   1109  1    !    "3" - Three character CRC.
  882. ;   1110  1    !
  883. ;   1111  1    ! Repeat-count-processing
  884. ;   1112  1    !    The prefix character to be used to indicate a repeated character.
  885. ;   1113  1    !    This can be any printable cahracter other than blank (which denotes
  886. ;   1114  1    !    no repeat count).
  887. ;   1115  1    !
  888. ;   1116  1    ! [108]    Capability byte(s)
  889. ;   1117  1    ! [108]        Bit mask containing extra capabilities, currently we only use
  890. ;   1118  1    ! [108]        bit 1 (extended-length packets) and bit 0 (more capability
  891. ;   1119  1    ! [108]        bytes follows).
  892. ;   1120  1    ! [108]
  893. ;   1121  1    ! [108]    Window length (not used)
  894. ;   1122  1    ! [108]
  895. ;   1123  1    ! [108]    Extended packet length
  896. ;   1124  1    ! [108]        Maximum length for extended-length packets
  897. ;   1125  1    !
  898. ;   1126  1    !--
  899. ;   1127  1
  900. ;   1128  1    LITERAL
  901. ;   1129  1        P%SI%BUFSIZ = 0,                ! Buffersize
  902. ;   1130  1        MY%PKT%SIZE = 80,                ! My packet size
  903. ;   1131  1        P%SI%TIMOUT = 1,                ! Time out
  904. ;   1132  1        MY%TIME%OUT = 60,            ! [046] Increased ! My time out
  905. ;   1133  1        P%SI%NPAD = 2,                ! Number of padding characters
  906. ;   1134  1        MY%NPAD = 0,                ! Amount of padding I require
  907. ;   1135  1        P%SI%PAD = 3,                ! Padding character
  908. ;   1136  1        MY%PAD%CHAR = 0,                ! My pad character
  909. ;   1137  1        P%SI%EOL = 4,                ! End of line character
  910. ;   1138  1        MY%EOL%CHAR = %O'015',            ! My EOL cahracter
  911. ;   1139  1        P%SI%QUOTE = 5,                ! Quote character
  912. ;   1140  1        MY%QUOTE%CHAR = %C'#',            ! My quoting character
  913. ;   1141  1        P%SI%8QUOTE = 6,                ! 8-bit quote
  914. ;   1142  1        MY%8BIT%QUOTE = %C'&',            ! Don't do it
  915. ;   1143  1        P%SI%CHKTYPE = 7,                ! Checktype used
  916. ;   1144  1        MY%CHKTYPE = CHK%1CHAR,            ! Use single character checksum
  917. ;   1145  1        P%SI%REPEAT = 8,                ! Repeat character
  918. ;   1146  1        MY%REPEAT = %C'~',                ! My repeat character
  919. ;   1147  1        P%SI%LENGTH = 9,                ! Length of the std message
  920. ;   1148  1                        ! [108]
  921. ;   1149  1        P%SI%CAPAS = 9,            ! [108]    ! Capability field (if used)
  922. ;   1150  1        EXTLEN%CAPAS = 2,            ! [108]    ! Extended length packets
  923. ;   1151  1        P%SI%WINDO = 10,            ! [108]    ! (Send only) Not used, filler
  924. ;   1152  1        P%SI%MAXLX1 = 11,            ! [108]    ! (Send only) Ext. len / 95
  925. ;   1153  1        MY%MAXLX1 = 0,            ! [108]
  926. ;   1154  1        P%SI%MAXLX2 = 12,            ! [108]    ! (Send only) Ext. len MOD 95
  927. ;   1155  1        MY%MAXLX2 = 80,            ! [108]
  928. ;   1156  1                        ! [108]
  929. ;   1157  1        P%SI%XLENGTH = 13;            ! [108]    ! (Send only) Len of ext. msg
  930. ;   1158  1
  931. ;   1159  1    %SBTTL 'KERMIT Protocol States'
  932. ;   1160  1
  933. ;   1161  1    !++
  934. ;   1162  1    ! The following are the various states that KERMIT can be in.
  935. ;   1163  1    ! The state transitions are defined in the KERMIT Protocol manual.
  936. ;   1164  1    !--
  937. ;   1165  1
  938. ;   1166  1    LITERAL
  939. ;   1167  1        STATE%MIN = 1,                ! Min state number
  940. ;   1168  1        STATE%S = 1,                ! Send init state
  941. ;   1169  1        STATE%SF = 2,                ! Send file header
  942. ;   1170  1        STATE%SD = 3,                ! Send file data packet
  943. ;   1171  1        STATE%SZ = 4,                ! Send EOF packet
  944. ;   1172  1        STATE%SB = 5,                ! Send break
  945. ;   1173  1        STATE%R = 6,                ! Receive state (wait for send-init)
  946. ;   1174  1        STATE%RF = 7,                ! Receive file header packet
  947. ;   1175  1        STATE%RD = 8,                ! Receive file data packet
  948. ;   1176  1        STATE%C = 9,                ! Send complete
  949. ;   1177  1        STATE%A = 10,                ! Abort
  950. ;   1178  1        STATE%SX = 11,                ! Send text header
  951. ;   1179  1        STATE%SG = 12,                ! Send generic command
  952. ;   1180  1        STATE%SI = 13,                ! Send server init
  953. ;   1181  1        STATE%ID = 14,                ! Server idle loop
  954. ;   1182  1        STATE%II = 15,                ! Server idle after server init
  955. ;   1183  1        STATE%FI = 16,                ! Server should exit
  956. ;   1184  1        STATE%LG = 17,                ! Server should logout
  957. ;   1185  1        STATE%OF = 18,                ! Send - open first input file
  958. ;   1186  1        STATE%EX = 19,                ! Exit back to command parser
  959. ;   1187  1        STATE%ER = 20,                ! Retries exceeded error
  960. ;   1188  1        STATE%MAX = 20;                ! Max state number
  961. ;   1189  1
  962. ;   1190  1    %SBTTL 'Internal constants'
  963. ;   1191  1
  964. ;   1192  1    !++
  965. ;   1193  1    ! The following represent various internal KERMSG constants.
  966. ;   1194  1    !--
  967. ;   1195  1
  968. ;   1196  1    LITERAL
  969. ;   1197  1        MAX%PKT%RETRIES = 16,            ! Maximum packet retries
  970. ;   1198  1        MAX%SI%RETRIES = 5;                ! Maximum send init retries
  971. ;   1199  1
  972. ;   1200  1    %SBTTL 'Storage - External'
  973. ;   1201  1    !
  974. ;   1202  1    ! OWN STORAGE:
  975. ;   1203  1    !
  976. ;   1204  1
  977. ;   1205  1    EXTERNAL
  978. ;   1206  1    !
  979. ;   1207  1    ! Receive parameters
  980. ;   1208  1    !
  981. ;   1209  1        RCV%PKT%SIZE,                ! Receive packet size
  982. ;   1210  1        RCV%NPAD,                    ! Padding length
  983. ;   1211  1        RCV%PADCHAR,                ! Padding character
  984. ;   1212  1        RCV%TIMEOUT,                ! Time out
  985. ;   1213  1        RCV%EOL,                    ! EOL character
  986. ;   1214  1        RCV%QUOTE%CHR,                ! Quote character
  987. ;   1215  1        RCV%SOH,                    ! Start of header character
  988. ;   1216  1        RCV%8QUOTE%CHR,                ! 8-bit quoting character
  989. ;   1217  1    !
  990. ;   1218  1    ! Miscellaneous parameters
  991. ;   1219  1    !
  992. ;   1220  1        SET%REPT%CHR,                ! Repeat character
  993. ;   1221  1    !
  994. ;   1222  1    ! Send parameters
  995. ;   1223  1    !
  996. ;   1224  1        SND%PKT%SIZE,                ! Send packet size
  997. ;   1225  1        SND%NPAD,                    ! Padding length
  998. ;   1226  1        SND%PADCHAR,                ! Padding character
  999. ;   1227  1        SND%TIMEOUT,                ! Time out
  1000. ;   1228  1        SND%EOL,                    ! EOL character
  1001. ;   1229  1        SND%QUOTE%CHR,                ! Quote character
  1002. ;   1230  1        SND%SOH,                    ! Start of header character
  1003. ;   1231  1        SEND%TIMEOUT,                ! Time to wait for receiving message
  1004. ;   1232  1    !
  1005. ;   1233  1    ! Server parameters
  1006. ;   1234  1    !
  1007. ;   1235  1        SRV%TIMEOUT,                ! Time between NAK's when server is idle
  1008. ;   1236  1    !
  1009. ;   1237  1    ! Statistics
  1010. ;   1238  1    !
  1011. ;   1239  1        SND%TOTAL%CHARS,                ! Total characters sent
  1012. ;   1240  1        RCV%TOTAL%CHARS,                ! Total characters received
  1013. ;   1241  1        SND%DATA%CHARS,                ! Total number of data characters sent
  1014. ;   1242  1        RCV%DATA%CHARS,                ! Total number of data characters received
  1015. ;   1243  1        SND%NAKS,                    ! Total NAKs sent
  1016. ;   1244  1        RCV%NAKS,                    ! Total NAKs received
  1017. ;   1245  1        SND%COUNT,                    ! Count of total number of packets
  1018. ;   1246  1        RCV%COUNT,                    ! Count of total number packets received
  1019. ;   1247  1        SMSG%COUNT,                    ! Total number of packets sent
  1020. ;   1248  1        RMSG%COUNT,                    ! Total number of packets received
  1021. ;   1249  1        SMSG%TOTAL%CHARS,                ! Total chars sent this file xfer
  1022. ;   1250  1        RMSG%TOTAL%CHARS,                ! Total chars rcvd this file xfer
  1023. ;   1251  1        SMSG%DATA%CHARS,                ! Total data chars this file xfer
  1024. ;   1252  1        RMSG%DATA%CHARS,                ! Total data chars this file xfer
  1025. ;   1253  1        SMSG%NAKS,                    ! Total number of NAKs this file xfer
  1026. ;   1254  1        RMSG%NAKS,                    ! Total number of NAKs received
  1027. ;   1255  1        XFR%TIME,                    ! Amount of time last xfr took
  1028. ;   1256  1        TOTAL%TIME,                    ! Total time of all xfrs
  1029. ;   1257  1                                !  this file xfer
  1030. ;   1258  1        LAST%ERROR : VECTOR [CH$ALLOCATION (MAX%MSG + 1)],    ! Last error message
  1031. ;   1259  1    !
  1032. ;   1260  1    ! Misc constants.
  1033. ;   1261  1    !
  1034. ;   1262  1        FILE%NAME : VECTOR [CH$ALLOCATION (MAX%FILE%NAME)],
  1035. ;   1263  1        FILE%SIZE,
  1036. ;   1264  1        SI%RETRIES,                    ! Send init retries to attempt
  1037. ;   1265  1        PKT%RETRIES,                ! Number of retries to try for a message
  1038. ;   1266  1        DELAY,                    ! Amount of time to delay
  1039. ;   1267  1        DUPLEX,                    ! Type of connection (half or full)
  1040. ;   1268  1        PARITY%TYPE,                ! Type of parity to use
  1041. ;   1269  1        DEV%PARITY%FLAG,                ! True if output device does
  1042. ;   1270  1                                !  parity, false if we do it
  1043. ;   1271  1        CHKTYPE,                    ! Type of block check desired
  1044. ;   1272  1        ABT%FLAG,                    ! True if aborted file should be discarded
  1045. ;   1273  1        DEBUG%FLAG,                    ! Debugging mode on/off
  1046. ;   1274  1        WARN%FLAG,                    ! File warning flag
  1047. ;   1275  1        IBM%CHAR,                    ! Turnaround character for IBM mode
  1048. ;   1276  1        ECHO%FLAG,                    ! Local echo flag
  1049. ;   1277  1        CONNECT%FLAG,                ! Connected flag; True if
  1050. ;   1278  1                                !  terminal and SET LINE are
  1051. ;   1279  1                                !  the same
  1052. ;   1280  1        ABT%CUR%FILE,                ! Abort current file
  1053. ;   1281  1        ABT%ALL%FILE,                ! Abort all files in stream
  1054. ;   1282  1        TYP%STS%FLAG,                ! Type status next message
  1055. ;   1283  1        TY%FIL,                    ! Type file specs
  1056. ;   1284  1        TY%PKT,                    ! Type packet info
  1057. ;   1285  1        FIL%NORMAL%FORM,                ! If true, file names should be normalized
  1058. ;   1286  1        GEN%1DATA : VECTOR [CH$ALLOCATION (MAX%MSG)],    ! Data for generic command
  1059. ;   1287  1        GEN%1SIZE,                    ! Size of data in GEN%1DATA
  1060. ;   1288  1        GEN%2DATA : VECTOR [CH$ALLOCATION (MAX%MSG)],    ! Second argument for generic command
  1061. ;   1289  1        GEN%2SIZE,                    ! Size of data in GEN%2DATA
  1062. ;   1290  1        GEN%3DATA : VECTOR [CH$ALLOCATION (MAX%MSG)],    ! Third arg for generic command
  1063. ;   1291  1        GEN%3SIZE;                    ! Size of data in GEN%3DATA
  1064. ;   1292  1
  1065. ;   1293  1    %SBTTL 'Storage - Local'
  1066. ;   1294  1    !
  1067. ;   1295  1    ! LOCAL OWN STORAGE:
  1068. ;   1296  1    !
  1069. ;   1297  1
  1070. ;   1298  1    OWN
  1071. ;   1299  1    !
  1072. ;   1300  1    ! Receive parameters
  1073. ;   1301  1    !
  1074. ;   1302  1        RECV%8QUOTE%CHR,                ! 8th-bit quoting character
  1075. ;   1303  1        REPT%CHR,                    ! Repeat prefix character
  1076. ;   1304  1        RECV%PKT%MSG,            ! [108]    ! Msg offset (4 std, 7 ext.)
  1077. ;   1305  1    !
  1078. ;   1306  1    ! Send parameters
  1079. ;   1307  1    !
  1080. ;   1308  1        SEND%PKT%SIZE,                ! Send packet size
  1081. ;   1309  1        SEND%NPAD,                    ! Padding length
  1082. ;   1310  1        SEND%PADCHAR,                ! Padding character
  1083. ;   1311  1        SEND%EOL,                    ! EOL character
  1084. ;   1312  1        SEND%QUOTE%CHR,                ! Quote character
  1085. ;   1313  1        SEND%8QUOTE%CHR,                ! 8-bit quoting character
  1086. ;   1314  1        SEND%INIT%SIZE,                ! Size of INIT message
  1087. ;   1315  1    !
  1088. ;   1316  1    ! Misc parameters
  1089. ;   1317  1    !
  1090. ;   1318  1        INI%CHK%TYPE,                ! Type of block checking from init message
  1091. ;   1319  1        BLK%CHK%TYPE,                ! Type of block check to use
  1092. ;   1320  1        FLAG%8QUOTE,                ! Flag to determine if doing 8bit quoting
  1093. ;   1321  1        FLAG%REPEAT,                ! True if doing repeated character compression
  1094. ;   1322  1        STATE,                    ! Current state
  1095. ;   1323  1        SIZE,                    ! Size of the current message
  1096. ;   1324  1    ! [108]                          Negative len for ext msgs
  1097. ;   1325  1        OLD%RETRIES,                ! Saved number of retries done.
  1098. ;   1326  1        NUM%RETRIES,                ! Number of retries
  1099. ;   1327  1        MSG%NUMBER,                    ! Current message number
  1100. ;   1328  1        REC%SEQ,                    ! Sequence number of msg in REC%MSG
  1101. ;   1329  1        REC%LENGTH,                    ! Length of the message recv'd
  1102. ;   1330  1        REC%TYPE,                    ! Type of the message received.
  1103. ;   1331  1        REC%MSG : VECTOR [CH$ALLOCATION (MAX%MSG + 1, CHR%SIZE)],    ! Message received
  1104. ;   1332  1        SND%MSG : VECTOR [CH$ALLOCATION (MAX%MSG + 1, CHR%SIZE)],    ! Message sent
  1105. ;   1333  1        FILE%CHARS,                    ! Number of characters sent or received
  1106. ;   1334  1        TEXT%HEAD%FLAG,                ! Text header received, not file header
  1107. ;   1335  1        NO%FILE%NEEDED,                ! Don't open a file
  1108. ;   1336  1        INIT%PKT%SENT,                ! Server-init sent and ACKed
  1109. ;   1337  1        GEN%TYPE,                    ! Command message type
  1110. ;   1338  1        GEN%SUBTYPE,                ! Generic command subtype
  1111. ;   1339  1        GET%CHR%ROUTINE,            ! Address of routine to get a character for BFR%FILL
  1112. ;   1340  1        PUT%CHR%ROUTINE;            ! Address of routine to put a character for BFR%EMPTY
  1113. ;   1341  1    !
  1114. ;   1342  1    ! KERMSG Global storage
  1115. ;   1343  1    !
  1116. ;   1344  1    GLOBAL
  1117. ;   1345  1        FLAG%FILE%OPEN;            ! File is opened.
  1118. ;   1346  1
  1119. ;   1347  1    %SBTTL 'External references'
  1120. ;   1348  1    !
  1121. ;   1349  1    ! EXTERNAL REFERENCES:
  1122. ;   1350  1    !
  1123. ;   1351  1    ! Packet I/O routines
  1124. ;   1352  1
  1125. ;   1353  1    EXTERNAL ROUTINE
  1126. ;   1354  1        SEND,                    ! Send a packet to the remote
  1127. ;   1355  1        IBM%WAIT,                    ! Wait for IBM turnaround
  1128. ;   1356  1        RECEIVE;                    ! Receive a packet from the remote
  1129. ;   1357  1
  1130. ;   1358  1    !
  1131. ;   1359  1    ! Terminal I/O routines
  1132. ;   1360  1    !
  1133. ;   1361  1
  1134. ;   1362  1    EXTERNAL ROUTINE
  1135. ;   1363  1        TERM%DUMP : NOVALUE,            ! Normal terminal output
  1136. ;   1364  1        DBG%DUMP : NOVALUE,                ! Debugging output
  1137. ;   1365  1        TT%SET%OUTPUT,                ! Set output routine
  1138. ;   1366  1        TT%CHAR : NOVALUE,                ! Output a single character
  1139. ;   1367  1        TT%CRLF : NOVALUE,                ! Output a CRLF
  1140. ;   1368  1        TT%NUMBER : NOVALUE,            ! Output a three digit number to the
  1141. ;   1369  1                                !  terminal
  1142. ;   1370  1        TT%TEXT : NOVALUE,                ! Output a string to the user's
  1143. ;   1371  1        TT%OUTPUT : NOVALUE;            ! Force buffered output to terminal
  1144. ;   1372  1
  1145. ;   1373  1    ! Operating system routines and misc routines
  1146. ;   1374  1
  1147. ;   1375  1    EXTERNAL ROUTINE
  1148. ;   1376  1        CRCCLC,                    ! Calculate a CRC-CCITT
  1149. ;   1377  1        XFR%STATUS : NOVALUE,            ! Routine to tell the user the
  1150. ;   1378  1                                !  status of a transfer
  1151. ;   1379  1        KRM%ERROR : NOVALUE,            ! Issue an error message
  1152. ;   1380  1        SY%LOGOUT : NOVALUE,            ! Log the job off
  1153. ;   1381  1        SY%GENERIC,                    ! Perform a generic command
  1154. ;   1382  1        SY%TIME,                    ! Return elapsed time in milliseconds
  1155. ;   1383  1        SY%DISMISS : NOVALUE;            ! Routine to dismiss for n seconds.
  1156. ;   1384  1
  1157. ;   1385  1    !
  1158. ;   1386  1    ! External file processing routines
  1159. ;   1387  1    !
  1160. ;   1388  1
  1161. ;   1389  1    EXTERNAL ROUTINE
  1162. ;   1390  1        FILE%OPEN,                    ! Open a file for reading/writing
  1163. ;   1391  1        FILE%CLOSE,                    ! Close an open file
  1164. ;   1392  1        NEXT%FILE,                    ! Determine if there is a next file
  1165. ;   1393  1                                !  and open it for reading.
  1166. ;   1394  1        GET%FILE,                    ! Get a byte from the file
  1167. ;   1395  1        PUT%FILE;                    ! Put a byte in the file.
  1168. ;   1396  1
  1169. ;   1397  1    %SBTTL 'MSG%INIT'
  1170. ;   1398  1
  1171. ;   1399  1    GLOBAL ROUTINE MSG%INIT : NOVALUE =
  1172. ;   1400  1
  1173. ;   1401  1    !++
  1174. ;   1402  1    ! FUNCTIONAL DESCRIPTION:
  1175. ;   1403  1    !
  1176. ;   1404  1    !    This routine will initialize the message processing for
  1177. ;   1405  1    !    KERMIT-32/36.
  1178. ;   1406  1    !
  1179. ;   1407  1    ! CALLING SEQUENCE:
  1180. ;   1408  1    !
  1181. ;   1409  1    !    MSG%INIT();
  1182. ;   1410  1    !
  1183. ;   1411  1    ! INPUT PARAMETERS:
  1184. ;   1412  1    !
  1185. ;   1413  1    !    None.
  1186. ;   1414  1    !
  1187. ;   1415  1    ! IMPLICIT INPUTS:
  1188. ;   1416  1    !
  1189. ;   1417  1    !    None.
  1190. ;   1418  1    !
  1191. ;   1419  1    ! OUTPUT PARAMETERS:
  1192. ;   1420  1    !
  1193. ;   1421  1    !    None.
  1194. ;   1422  1    !
  1195. ;   1423  1    ! IMPLICIT OUTPUTS:
  1196. ;   1424  1    !
  1197. ;   1425  1    !    None.
  1198. ;   1426  1    !
  1199. ;   1427  1    ! COMPLETION CODES:
  1200. ;   1428  1    !
  1201. ;   1429  1    !    None.
  1202. ;   1430  1    !
  1203. ;   1431  1    ! SIDE EFFECTS:
  1204. ;   1432  1    !
  1205. ;   1433  1    !    None.
  1206. ;   1434  1    !
  1207. ;   1435  1    !--
  1208. ;   1436  1
  1209. ;   1437  2        BEGIN
  1210. ;   1438  2    !
  1211. ;   1439  2    ! Initialize some variables
  1212. ;   1440  2    !
  1213. ;   1441  2    ! Receive parameters first
  1214. ;   1442  2    !
  1215. ;   1443  2        RCV%PKT%SIZE = MY%PKT%SIZE;
  1216. ;   1444  2        RCV%NPAD = MY%NPAD;
  1217. ;   1445  2        RCV%PADCHAR = MY%PAD%CHAR;
  1218. ;   1446  2        RCV%TIMEOUT = MY%TIME%OUT;
  1219. ;   1447  2        RCV%EOL = MY%EOL%CHAR;
  1220. ;   1448  2        RCV%QUOTE%CHR = MY%QUOTE%CHAR;
  1221. ;   1449  2        RCV%SOH = CHR%SOH;
  1222. ;   1450  2        RCV%8QUOTE%CHR = MY%8BIT%QUOTE;
  1223. ;   1451  2        SET%REPT%CHR = MY%REPEAT;
  1224. ;   1452  2    !
  1225. ;   1453  2    ! Send parameters.
  1226. ;   1454  2    !
  1227. ;   1455  2        SND%PKT%SIZE = -MY%PKT%SIZE;
  1228. ;   1456  2        SND%NPAD = -MY%NPAD;
  1229. ;   1457  2        SND%PADCHAR = -MY%PAD%CHAR;
  1230. ;   1458  2        SND%TIMEOUT = -MY%TIME%OUT;
  1231. ;   1459  2        SND%EOL = -MY%EOL%CHAR;
  1232. ;   1460  2        SND%QUOTE%CHR = -MY%QUOTE%CHAR;
  1233. ;   1461  2        SND%SOH = CHR%SOH;
  1234. ;   1462  2    !
  1235. ;   1463  2    ! Server parameters
  1236. ;   1464  2    !
  1237. ;   1465  2        SRV%TIMEOUT = 5*MY%TIME%OUT;
  1238. ;   1466  2    !
  1239. ;   1467  2    ! Other random parameters
  1240. ;   1468  2    !
  1241. ;   1469  2        PKT%RETRIES = MAX%PKT%RETRIES;        ! Number of retries per message
  1242. ;   1470  2        SI%RETRIES = MAX%SI%RETRIES;        ! Number of retries on send inits
  1243. ;   1471  2        DELAY = INIT%DELAY;
  1244. ;   1472  2        DUPLEX = DP%FULL;                ! Use full duplex
  1245. ;   1473  2        DEBUG%FLAG = FALSE;
  1246. ;   1474  2        WARN%FLAG = FALSE;
  1247. ;   1475  2        ECHO%FLAG = FALSE;
  1248. ;   1476  2        BLK%CHK%TYPE = CHK%1CHAR;            ! Start using single char checksum
  1249. ;   1477  2        CHKTYPE = MY%CHKTYPE;            ! Desired block check type
  1250. ;   1478  2        INI%CHK%TYPE = .CHKTYPE;            ! Same as default for now
  1251. ;   1479  2        DEV%PARITY%FLAG = FALSE;            ! We generate parity
  1252. ;   1480  2        PARITY%TYPE = PR%NONE;            ! No parity
  1253. ;   1481  2        ABT%FLAG = TRUE;                ! Discard incomplete files
  1254. ;   1482  2        FLAG%FILE%OPEN = FALSE;
  1255. ;   1483  2        IBM%CHAR = -1;                ![044] No handsake by default
  1256. ;   1484  2        TY%FIL = TRUE;                ! Default to typing files
  1257. ;   1485  2        TY%PKT = FALSE;                ! But not packet numbers
  1258. ;   1486  2        FIL%NORMAL%FORM = FNM%NORMAL;        ! Default to normal form names
  1259. ;   1487  2        GET%CHR%ROUTINE = GET%FILE;            ![025] Initialize the get-a-char routine
  1260. ;   1488  2        PUT%CHR%ROUTINE = PUT%FILE;            ![025] And the put-a-char
  1261. ;   1489  1        END;                    ! End of MSG%INIT
  1262.  
  1263.  
  1264.     TITLE    KERMSG
  1265.     TWOSEG
  1266.  
  1267.  
  1268.     .REQUEST  REL:B361LB.REL
  1269.  
  1270.  
  1271.     RELOC    0
  1272. ; RECV%8QUOTE%CHR
  1273. U.37:    BLOCK    1
  1274. ; REPT%CHR
  1275. U.38:    BLOCK    1
  1276. ; RECV%PKT%MSG
  1277. U.39:    BLOCK    1
  1278. ; SEND%PKT%SIZE
  1279. U.40:    BLOCK    1
  1280. ; SEND%NPAD
  1281. U.41:    BLOCK    1
  1282. ; SEND%PADCHAR
  1283. U.42:    BLOCK    1
  1284. ; SEND%EOL
  1285. U.43:    BLOCK    1
  1286. ; SEND%QUOTE%CHR
  1287. U.44:    BLOCK    1
  1288. ; SEND%8QUOTE%CHR
  1289. U.45:    BLOCK    1
  1290. ; SEND%INIT%SIZE
  1291. U.46:    BLOCK    1
  1292. ; INI%CHK%TYPE
  1293. U.47:    BLOCK    1
  1294. ; BLK%CHK%TYPE
  1295. U.48:    BLOCK    1
  1296. ; FLAG%8QUOTE
  1297. U.49:    BLOCK    1
  1298. ; FLAG%REPEAT
  1299. U.50:    BLOCK    1
  1300. ; STATE
  1301. U.51:    BLOCK    1
  1302. ; SIZE
  1303. U.52:    BLOCK    1
  1304. ; OLD%RETRIES
  1305. U.53:    BLOCK    1
  1306. ; NUM%RETRIES
  1307. U.54:    BLOCK    1
  1308. ; MSG%NUMBER
  1309. U.55:    BLOCK    1
  1310. ; REC%SEQ
  1311. U.56:    BLOCK    1
  1312. ; REC%LENGTH
  1313. U.57:    BLOCK    1
  1314. ; REC%TYPE
  1315. U.58:    BLOCK    1
  1316. ; REC%MSG
  1317. U.59:    BLOCK    373
  1318. ; SND%MSG
  1319. U.60:    BLOCK    373
  1320. ; FILE%CHARS
  1321. U.61:    BLOCK    1
  1322. ; TEXT%HEAD%FLAG
  1323. U.62:    BLOCK    1
  1324. ; NO%FILE%NEEDED
  1325. U.63:    BLOCK    1
  1326. ; INIT%PKT%SENT
  1327. U.64:    BLOCK    1
  1328. ; GEN%TYPE
  1329. U.65:    BLOCK    1
  1330. ; GEN%SUBTYPE
  1331. U.66:    BLOCK    1
  1332. ; GET%CHR%ROUTINE
  1333. U.67:    BLOCK    1
  1334. ; PUT%CHR%ROUTINE
  1335. U.68:    BLOCK    1
  1336. FLAG%FILE%OPEN::
  1337.     BLOCK    1
  1338.  
  1339.  
  1340.     EXTERN    RCV%PKT%SIZE, RCV%NPAD, RCV%PADCHAR, RCV%TIMEOUT, RCV%EOL, RCV%QUOTE%CHR, RCV%SOH
  1341.     EXTERN    RCV%8QUOTE%CHR, SET%REPT%CHR, SND%PKT%SIZE, SND%NPAD, SND%PADCHAR, SND%TIMEOUT, SND%EOL
  1342.     EXTERN    SND%QUOTE%CHR, SND%SOH, SEND%TIMEOUT, SRV%TIMEOUT, SND%TOTAL%CHARS, RCV%TOTAL%CHARS
  1343.     EXTERN    SND%DATA%CHARS, RCV%DATA%CHARS, SND%NAKS, RCV%NAKS, SND%COUNT, RCV%COUNT, SMSG%COUNT
  1344.     EXTERN    RMSG%COUNT, SMSG%TOTAL%CHARS, RMSG%TOTAL%CHARS, SMSG%DATA%CHARS, RMSG%DATA%CHARS, SMSG%NAKS
  1345.     EXTERN    RMSG%NAKS, XFR%TIME, TOTAL%TIME, LAST%ERROR, FILE%NAME, FILE%SIZE, SI%RETRIES, PKT%RETRIES
  1346.     EXTERN    DELAY, DUPLEX, PARITY%TYPE, DEV%PARITY%FLAG, CHKTYPE, ABT%FLAG, DEBUG%FLAG, WARN%FLAG
  1347.     EXTERN    IBM%CHAR, ECHO%FLAG, CONNECT%FLAG, ABT%CUR%FILE, ABT%ALL%FILE, TYP%STS%FLAG, TY%FIL
  1348.     EXTERN    TY%PKT, FIL%NORMAL%FORM, GEN%1DATA, GEN%1SIZE, GEN%2DATA, GEN%2SIZE, GEN%3DATA, GEN%3SIZE
  1349.     EXTERN    SEND, IBM%WAIT, RECEIVE, TERM%DUMP, DBG%DUMP, TT%SET%OUTPUT, TT%CHAR, TT%CRLF, TT%NUMBER
  1350.     EXTERN    TT%TEXT, TT%OUTPUT, CRCCLC, XFR%STATUS, KRM%ERROR, SY%LOGOUT, SY%GENERIC, SY%TIME
  1351.     EXTERN    SY%DISMISS, FILE%OPEN, FILE%CLOSE, NEXT%FILE, GET%FILE, PUT%FILE
  1352.  
  1353.  
  1354. FNM%NORMAL==:        1
  1355. FNM%FULL==:        2
  1356. FNM%UNTRAN==:        4
  1357. PR%MIN==:        0
  1358. PR%NONE==:        0
  1359. PR%MARK==:        1
  1360. PR%EVEN==:        2
  1361. PR%ODD==:        3
  1362. PR%SPACE==:        4
  1363. PR%MAX==:        4
  1364. GC%MIN==:        1
  1365. GC%EXIT==:        1
  1366. GC%DIRECTORY==:     2
  1367. GC%DISK%USAGE==:    3
  1368. GC%DELETE==:        4
  1369. GC%TYPE==:        5
  1370. GC%HELP==:        6
  1371. GC%LOGOUT==:        7
  1372. GC%LGN==:        10
  1373. GC%CONNECT==:        11
  1374. GC%RENAME==:        12
  1375. GC%COPY==:        13
  1376. GC%WHO==:        14
  1377. GC%SEND%MSG==:        15
  1378. GC%STATUS==:        16
  1379. GC%COMMAND==:        17
  1380. GC%KERMIT==:        20
  1381. GC%JOURNAL==:        21
  1382. GC%VARIABLE==:        22
  1383. GC%PROGRAM==:        23
  1384. GC%MAX==:        23
  1385. DP%FULL==:        0
  1386. DP%HALF==:        1
  1387. CHK%1CHAR==:        61
  1388. CHK%2CHAR==:        62
  1389. CHK%CRC==:        63
  1390. MAX%MSG==:        1752
  1391.  
  1392.  
  1393. AC0=    0
  1394. AC1=    1
  1395. AC2=    2
  1396. AC3=    3
  1397. AC4=    4
  1398. AC5=    5
  1399. AC6=    6
  1400. AC7=    7
  1401. AC10=    10
  1402. AC11=    11
  1403. AC12=    12
  1404. AC13=    13
  1405. AC14=    14
  1406. FP=    15
  1407. AC16=    16
  1408. SP=    17
  1409.  
  1410.  
  1411.     RELOC    400000
  1412. MSG%INIT::
  1413.     MOVEI    AC1,120                ;                                        1443
  1414.     MOVEM    AC1,RCV%PKT%SIZE
  1415.     SETZM    RCV%NPAD            ;                                        1444
  1416.     SETZM    RCV%PADCHAR            ;                                        1445
  1417.     MOVEI    AC1,74                ;                                        1446
  1418.     MOVEM    AC1,RCV%TIMEOUT
  1419.     MOVEI    AC1,15                ;                                        1447
  1420.     MOVEM    AC1,RCV%EOL
  1421.     MOVEI    AC1,43                ;                                        1448
  1422.     MOVEM    AC1,RCV%QUOTE%CHR
  1423.     MOVEI    AC1,1                ;                                        1449
  1424.     MOVEM    AC1,RCV%SOH
  1425.     MOVEI    AC1,46                ;                                        1450
  1426.     MOVEM    AC1,RCV%8QUOTE%CHR
  1427.     MOVEI    AC1,176                ;                                        1451
  1428.     MOVEM    AC1,SET%REPT%CHR
  1429.     HRROI    AC1,-120            ;                                        1455
  1430.     MOVEM    AC1,SND%PKT%SIZE
  1431.     SETZM    SND%NPAD            ;                                        1456
  1432.     SETZM    SND%PADCHAR            ;                                        1457
  1433.     HRROI    AC1,-74                ;                                        1458
  1434.     MOVEM    AC1,SND%TIMEOUT
  1435.     HRROI    AC1,-15                ;                                        1459
  1436.     MOVEM    AC1,SND%EOL
  1437.     HRROI    AC1,-43                ;                                        1460
  1438.     MOVEM    AC1,SND%QUOTE%CHR
  1439.     MOVEI    AC1,1                ;                                        1461
  1440.     MOVEM    AC1,SND%SOH
  1441.     MOVEI    AC1,454                ;                                        1465
  1442.     MOVEM    AC1,SRV%TIMEOUT
  1443.     MOVEI    AC1,20                ;                                        1469
  1444.     MOVEM    AC1,PKT%RETRIES
  1445.     MOVEI    AC1,5                ;                                        1470
  1446.     MOVEM    AC1,SI%RETRIES
  1447.     MOVEI    AC1,5                ;                                        1471
  1448.     MOVEM    AC1,DELAY
  1449.     SETZM    DUPLEX                ;                                        1472
  1450.     SETZM    DEBUG%FLAG            ;                                        1473
  1451.     SETZM    WARN%FLAG            ;                                        1474
  1452.     SETZM    ECHO%FLAG            ;                                        1475
  1453.     MOVEI    AC1,61                ;                                        1476
  1454.     MOVEM    AC1,U.48
  1455.     MOVEI    AC1,61                ;                                        1477
  1456.     MOVEM    AC1,CHKTYPE
  1457.     MOVEM    AC1,U.47            ;                                        1478
  1458.     SETZM    DEV%PARITY%FLAG            ;                                        1479
  1459.     SETZM    PARITY%TYPE            ;                                        1480
  1460.     MOVEI    AC1,1                ;                                        1481
  1461.     MOVEM    AC1,ABT%FLAG
  1462.     SETZM    FLAG%FILE%OPEN            ;                                        1482
  1463.     SETOM    IBM%CHAR            ;                                        1483
  1464.     MOVEI    AC1,1                ;                                        1484
  1465.     MOVEM    AC1,TY%FIL
  1466.     SETZM    TY%PKT                ;                                        1485
  1467.     MOVEI    AC1,1                ;                                        1486
  1468.     MOVEM    AC1,FIL%NORMAL%FORM
  1469.     MOVEI    AC1,GET%FILE            ;                                        1487
  1470.     MOVEM    AC1,U.67
  1471.     MOVEI    AC1,PUT%FILE            ;                                        1488
  1472.     MOVEM    AC1,U.68
  1473.     POPJ    SP,                ;                                        1399
  1474.  
  1475. ; Routine Size:  61 words
  1476.  
  1477.  
  1478. ;   1490  1
  1479. ;   1491  1    %SBTTL 'SND%ERROR'
  1480. ;   1492  1
  1481. ;   1493  1    GLOBAL ROUTINE SND%ERROR (COUNT, ADDRESS) : NOVALUE =
  1482. ;   1494  1
  1483. ;   1495  1    !++
  1484. ;   1496  1    ! FUNCTIONAL DESCRIPTION:
  1485. ;   1497  1    !
  1486. ;   1498  1    !    This routine will send an error packet to the remote KERMIT.  It
  1487. ;   1499  1    !    is called with the count of characters and the address of the text.
  1488. ;   1500  1    !
  1489. ;   1501  1    ! CALLING SEQUENCE:
  1490. ;   1502  1    !
  1491. ;   1503  1    !    SND%ERROR(COUNT, %ASCII 'Error text');
  1492. ;   1504  1    !
  1493. ;   1505  1    ! INPUT PARAMETERS:
  1494. ;   1506  1    !
  1495. ;   1507  1    !    None.
  1496. ;   1508  1    !
  1497. ;   1509  1    ! IMPLICIT INPUTS:
  1498. ;   1510  1    !
  1499. ;   1511  1    !    None.
  1500. ;   1512  1    !
  1501. ;   1513  1    ! OUTPUT PARAMETERS:
  1502. ;   1514  1    !
  1503. ;   1515  1    !    None.
  1504. ;   1516  1    !
  1505. ;   1517  1    ! IMPLICIT OUTPUTS:
  1506. ;   1518  1    !
  1507. ;   1519  1    !    None.
  1508. ;   1520  1    !
  1509. ;   1521  1    ! COMPLETION CODES:
  1510. ;   1522  1    !
  1511. ;   1523  1    !    None.
  1512. ;   1524  1    !
  1513. ;   1525  1    ! SIDE EFFECTS:
  1514. ;   1526  1    !
  1515. ;   1527  1    !
  1516. ;   1528  1    !--
  1517. ;   1529  1
  1518. ;   1530  2        BEGIN
  1519. ;   1531  2    !
  1520. ;   1532  2    ! Pack the message into the buffer
  1521. ;   1533  2    !
  1522. ;   1534  2        SET%STRING (CH$PTR (.ADDRESS), .COUNT, TRUE);
  1523. ;   1535  2        BFR%FILL (TRUE);
  1524. ;   1536  2        SET%STRING (0, 0, FALSE);
  1525. ;   1537  2    !
  1526. ;   1538  2    ! Save the last error message also
  1527. ;   1539  2    !
  1528. ;   1540  2
  1529. ;   1541  2        IF .COUNT GTR MAX%MSG THEN COUNT = MAX%MSG;
  1530. ;   1542  2
  1531. ;   1543  2        CH$COPY (.COUNT, CH$PTR (.ADDRESS), 0, MAX%MSG + 1, CH$PTR(LAST%ERROR));
  1532. ;   1544  2
  1533. ;   1545  2        IF NOT SEND%PACKET (MSG%ERROR, .SIZE, .MSG%NUMBER) THEN RETURN KER%ABORTED;
  1534. ;   1546  2
  1535. ;   1547  1        END;                    ! End of SND%ERROR
  1536.  
  1537.  
  1538. SND%ERROR::
  1539.     PUSH    SP,AC14                ;                                        1493
  1540.     PUSH    SP,AC16
  1541.     MOVE    AC16,-3(SP)            ;                                        1534
  1542.     MOVEI    AC1,-1(AC16)
  1543.     HRLI    AC1,10700
  1544.     PUSH    SP,AC1
  1545.     MOVE    AC14,-5(SP)
  1546.     PUSH    SP,AC14
  1547.     PUSH    SP,C.2
  1548.     PUSHJ    SP,U.30
  1549.     PUSH    SP,C.2                ;                                        1535
  1550.     PUSHJ    SP,U.29
  1551.     SETZM    -2(SP)                ;                                        1536
  1552.     SETZM    -1(SP)
  1553.     SETZM    0(SP)
  1554.     PUSHJ    SP,U.30
  1555.     CAIG    AC14,1752            ;                                        1541
  1556.     JRST    L.1
  1557.     MOVEI    AC1,1752
  1558.     MOVEM    AC1,-10(SP)
  1559. L.1:    MOVEI    AC2,-1(AC16)            ;                                        1543
  1560.     HRLI    AC2,10700
  1561.     MOVE    AC1,-10(SP)
  1562.     MOVEI    AC4,1753
  1563.     MOVE    AC5,C.3
  1564.     EXTEND    AC1,C.1
  1565.     JFCL
  1566.     PUSH    SP,C.4                ;                                        1545
  1567.     PUSH    SP,U.52
  1568.     PUSH    SP,U.55
  1569.     PUSHJ    SP,U.24
  1570.     ADJSP    SP,-7
  1571.     POP    SP,AC16                ;                                        1493
  1572.     POP    SP,AC14
  1573.     POPJ    SP,
  1574. C.1:    MOVSLJ
  1575.     EXP    0
  1576. C.2:    EXP    1
  1577. C.3:    POINT    7,LAST%ERROR-1,34
  1578. C.4:    EXP    105
  1579.  
  1580. ; Routine Size:  40 words
  1581.  
  1582.  
  1583. ;   1548  1
  1584. ;   1549  1    %SBTTL 'SERVER - Server mode'
  1585. ;   1550  1
  1586. ;   1551  1    GLOBAL ROUTINE SERVER =
  1587. ;   1552  1
  1588. ;   1553  1    !++
  1589. ;   1554  1    ! FUNCTIONAL DESCRIPTION:
  1590. ;   1555  1    !
  1591. ;   1556  1    !    This routine will handle the server function in the v2.0 protocol
  1592. ;   1557  1    !    for KERMIT.  This routine by it's nature will call various operating
  1593. ;   1558  1    !    system routines to do things like logging off the system.
  1594. ;   1559  1    !
  1595. ;   1560  1    ! CALLING SEQUENCE:
  1596. ;   1561  1    !
  1597. ;   1562  1    !    EXIT%FLAG = SERVER();
  1598. ;   1563  1    !
  1599. ;   1564  1    ! INPUT PARAMETERS:
  1600. ;   1565  1    !
  1601. ;   1566  1    !    None.
  1602. ;   1567  1    !
  1603. ;   1568  1    ! IMPLICIT INPUTS:
  1604. ;   1569  1    !
  1605. ;   1570  1    !    None.
  1606. ;   1571  1    !
  1607. ;   1572  1    ! OUTPUT PARAMETERS:
  1608. ;   1573  1    !
  1609. ;   1574  1    !    None.
  1610. ;   1575  1    !
  1611. ;   1576  1    ! IMPLICIT OUTPUTS:
  1612. ;   1577  1    !
  1613. ;   1578  1    !    None.
  1614. ;   1579  1    !
  1615. ;   1580  1    ! COMPLETION CODES:
  1616. ;   1581  1    !
  1617. ;   1582  1    !    None.
  1618. ;   1583  1    !
  1619. ;   1584  1    ! SIDE EFFECTS:
  1620. ;   1585  1    !
  1621. ;   1586  1    !    None.
  1622. ;   1587  1    !
  1623. ;   1588  1    !--
  1624. ;   1589  1
  1625. ;   1590  2        BEGIN
  1626. ;   1591  2
  1627. ;   1592  2        LOCAL
  1628. ;   1593  2        STATUS;                    ! Status returned by various routines
  1629. ;   1594  2
  1630. ;   1595  2        DO
  1631. ;   1596  3        BEGIN
  1632. ;   1597  3        INIT%XFR ();
  1633. ;   1598  3        XFR%STATUS (%C'T', %C'I');        ! Now idle
  1634. ;   1599  3        STATUS = DO%TRANSACTION (STATE%ID);
  1635. ;   1600  3        END
  1636. ;   1601  2        UNTIL .STATUS EQL KER%EXIT OR .STATUS EQL KER%ABORTED;
  1637. ;   1602  2
  1638. ;   1603  2        RETURN .STATUS;
  1639. ;   1604  1        END;                    ! End of GLOBAL ROUTINE SERVER
  1640.  
  1641.  
  1642. SERVER::PUSH    SP,AC16                ;                                        1551
  1643. L.2:    PUSHJ    SP,U.32                ;                                        1597
  1644.     PUSH    SP,C.5                ;                                        1598
  1645.     PUSH    SP,C.6
  1646.     PUSHJ    SP,XFR%STATUS
  1647.     PUSH    SP,C.7                ;                                        1599
  1648.     PUSHJ    SP,U.1
  1649.     MOVE    AC16,AC1
  1650.     ADJSP    SP,-3                ;                                        1596
  1651.     CAIN    AC16,223            ;                                        1601
  1652.     JRST    L.3
  1653.     CAIE    AC16,312
  1654.     JRST    L.2                ;                                        1595
  1655. L.3:    MOVE    AC1,AC16            ;                                        1590
  1656.     POP    SP,AC16                ;                                        1551
  1657.     POPJ    SP,
  1658. C.5:    EXP    124
  1659. C.6:    EXP    111
  1660. C.7:    EXP    16
  1661.  
  1662. ; Routine Size:  19 words
  1663.  
  1664.  
  1665. ;   1605  1
  1666. ;   1606  1    %SBTTL 'SEND%SWITCH'
  1667. ;   1607  1
  1668. ;   1608  1    GLOBAL ROUTINE SEND%SWITCH =
  1669. ;   1609  1
  1670. ;   1610  1    !++
  1671. ;   1611  1    ! FUNCTIONAL DESCRIPTION:
  1672. ;   1612  1    !
  1673. ;   1613  1    !    This routine is the state table switcher for sending files.  It
  1674. ;   1614  1    !    loops until either it is finished or an error is encountered.  The
  1675. ;   1615  1    !    routines called by SEND%SWITCH are responsible for changing the state.
  1676. ;   1616  1    !
  1677. ;   1617  1    ! CALLING SEQUENCE:
  1678. ;   1618  1    !
  1679. ;   1619  1    !    SEND%SWITCH();
  1680. ;   1620  1    !
  1681. ;   1621  1    ! INPUT PARAMETERS:
  1682. ;   1622  1    !
  1683. ;   1623  1    !    None.
  1684. ;   1624  1    !
  1685. ;   1625  1    ! IMPLICIT INPUTS:
  1686. ;   1626  1    !
  1687. ;   1627  1    !    None.
  1688. ;   1628  1    !
  1689. ;   1629  1    ! OUTPUT PARAMETERS:
  1690. ;   1630  1    !
  1691. ;   1631  1    !    Returns:
  1692. ;   1632  1    !        TRUE - File sent correctly.
  1693. ;   1633  1    !        FALSE - Aborted sending the file.
  1694. ;   1634  1    !
  1695. ;   1635  1    ! IMPLICIT OUTPUTS:
  1696. ;   1636  1    !
  1697. ;   1637  1    !    None.
  1698. ;   1638  1    !
  1699. ;   1639  1    ! COMPLETION CODES:
  1700. ;   1640  1    !
  1701. ;   1641  1    !    None.
  1702. ;   1642  1    !
  1703. ;   1643  1    ! SIDE EFFECTS:
  1704. ;   1644  1    !
  1705. ;   1645  1    !    None.
  1706. ;   1646  1    !
  1707. ;   1647  1    !--
  1708. ;   1648  1
  1709. ;   1649  2        BEGIN
  1710. ;   1650  2
  1711. ;   1651  2        LOCAL
  1712. ;   1652  2        STATUS;                    ! Status result
  1713. ;   1653  2
  1714. ;   1654  2        IF .CONNECT%FLAG THEN SY%DISMISS (.DELAY);    ! Sleep if the user wanted us to
  1715. ;   1655  2
  1716. ;   1656  2        INIT%XFR ();                ! Initialize for this transfer
  1717. ;   1657  2        TEXT%HEAD%FLAG = FALSE;            ! Set text flag correctly
  1718. ;   1658  2        XFR%STATUS (%C'I', %C'S');            ! Start of file send
  1719. ;   1659  2        STATUS = DO%TRANSACTION (STATE%S);        ! Call routine to do real work
  1720. ;   1660  2        XFR%STATUS (%C'T', %C'S');            ! Done with send
  1721. ;   1661  2        RETURN .STATUS;                ! Return the result
  1722. ;   1662  1        END;
  1723.  
  1724.  
  1725. SEND%SWITCH::
  1726.     PUSH    SP,AC16                ;                                        1608
  1727.     MOVEI    AC1,1                ;                                        1654
  1728.     TDNN    AC1,CONNECT%FLAG
  1729.     JRST    L.4
  1730.     PUSH    SP,DELAY
  1731.     PUSHJ    SP,SY%DISMISS
  1732.     ADJSP    SP,-1
  1733. L.4:    PUSHJ    SP,U.32                ;                                        1656
  1734.     SETZM    U.62                ;                                        1657
  1735.     PUSH    SP,C.6                ;                                        1658
  1736.     PUSH    SP,C.8
  1737.     PUSHJ    SP,XFR%STATUS
  1738.     PUSH    SP,C.2                ;                                        1659
  1739.     PUSHJ    SP,U.1
  1740.     MOVE    AC16,AC1
  1741.     PUSH    SP,C.5                ;                                        1660
  1742.     PUSH    SP,C.8
  1743.     PUSHJ    SP,XFR%STATUS
  1744.     ADJSP    SP,-5                ;                                        1661
  1745.     MOVE    AC1,AC16            ;                                        1649
  1746.     POP    SP,AC16                ;                                        1608
  1747.     POPJ    SP,
  1748. C.8:    EXP    123
  1749.  
  1750. ; Routine Size:  23 words
  1751.  
  1752.  
  1753. ;   1663  1
  1754. ;   1664  1    %SBTTL 'REC%SWITCH'
  1755. ;   1665  1
  1756. ;   1666  1    GLOBAL ROUTINE REC%SWITCH =
  1757. ;   1667  1
  1758. ;   1668  1    !++
  1759. ;   1669  1    ! FUNCTIONAL DESCRIPTION:
  1760. ;   1670  1    !
  1761. ;   1671  1    !    This routine will cause file(s) to be received by the remote
  1762. ;   1672  1    !    KERMIT.  This routine contains the main loop for the sending of the
  1763. ;   1673  1    !    data.
  1764. ;   1674  1    !
  1765. ;   1675  1    ! CALLING SEQUENCE:
  1766. ;   1676  1    !
  1767. ;   1677  1    !    REC%SWITCH();
  1768. ;   1678  1    !
  1769. ;   1679  1    ! INPUT PARAMETERS:
  1770. ;   1680  1    !
  1771. ;   1681  1    !    None.
  1772. ;   1682  1    !
  1773. ;   1683  1    ! IMPLICIT INPUTS:
  1774. ;   1684  1    !
  1775. ;   1685  1    !    FILE%DESC - Descriptor describing the file to be received by
  1776. ;   1686  1    !        the remote KERMIT.
  1777. ;   1687  1    !
  1778. ;   1688  1    ! OUTPUT PARAMETERS:
  1779. ;   1689  1    !
  1780. ;   1690  1    !    None.
  1781. ;   1691  1    !
  1782. ;   1692  1    ! IMPLICIT OUTPUTS:
  1783. ;   1693  1    !
  1784. ;   1694  1    !    None.
  1785. ;   1695  1    !
  1786. ;   1696  1    ! COMPLETION CODES:
  1787. ;   1697  1    !
  1788. ;   1698  1    !    True - File received correctly.
  1789. ;   1699  1    !    FALSE - File transfer aborted.
  1790. ;   1700  1    !
  1791. ;   1701  1    ! SIDE EFFECTS:
  1792. ;   1702  1    !
  1793. ;   1703  1    !    None.
  1794. ;   1704  1    !
  1795. ;   1705  1    !--
  1796. ;   1706  1
  1797. ;   1707  2        BEGIN
  1798. ;   1708  2
  1799. ;   1709  2        LOCAL
  1800. ;   1710  2        INIT%STATE,                ! State to start up DO%TRANSACTION in
  1801. ;   1711  2        STATUS;                    ! Status returned by various routines
  1802. ;   1712  2
  1803. ;   1713  2        INIT%STATE = STATE%R;            ! Initialize the state
  1804. ;   1714  2        MSG%NUMBER = 0;
  1805. ;   1715  2        INIT%XFR ();                ! Initialize the per transfer info
  1806. ;   1716  2    !
  1807. ;   1717  2    ! Determine if they said REC <file-spec>
  1808. ;   1718  2    !    Send MSG%RCV%INIT and then receive the file
  1809. ;   1719  2    !
  1810. ;   1720  2
  1811. ;   1721  2        IF .FILE%SIZE GTR 0
  1812. ;   1722  2        THEN
  1813. ;   1723  3        BEGIN
  1814. ;   1724  3        GEN%TYPE = MSG%RCV%INIT;        ! Use receive-init message
  1815. ;   1725  3        CH$MOVE (.FILE%SIZE, CH$PTR (FILE%NAME), CH$PTR (GEN%1DATA));
  1816. ;   1726  3        GEN%1SIZE = .FILE%SIZE;            ! Save the length
  1817. ;   1727  3        INIT%STATE = STATE%SI;            ! Start out with server init
  1818. ;   1728  2        END;
  1819. ;   1729  2
  1820. ;   1730  2    !
  1821. ;   1731  2    ! Now receive the file normally
  1822. ;   1732  2    !
  1823. ;   1733  2        XFR%STATUS (%C'I', %C'R');            ! Start of a file receive
  1824. ;   1734  2        STATUS = DO%TRANSACTION (.INIT%STATE);
  1825. ;   1735  2        XFR%STATUS (%C'T', %C'R');            ! End of file receive
  1826. ;   1736  2        RETURN .STATUS;                ! Return the result
  1827. ;   1737  1        END;                    ! End of REC%SWITCH
  1828.  
  1829.  
  1830. REC%SWITCH::
  1831.     PUSH    SP,AC16                ;                                        1666
  1832.     MOVEI    AC16,6                ;                                        1713
  1833.     SETZM    U.55                ;                                        1714
  1834.     PUSHJ    SP,U.32                ;                                        1715
  1835.     MOVE    AC3,FILE%SIZE            ;                                        1721
  1836.     JUMPLE    AC3,L.5
  1837.     MOVEI    AC1,122                ;                                        1724
  1838.     MOVEM    AC1,U.65
  1839.     MOVE    AC1,AC3                ;                                        1725
  1840.     MOVE    AC2,C.10
  1841.     MOVE    AC4,AC3
  1842.     MOVE    AC5,C.11
  1843.     EXTEND    AC1,C.9
  1844.     JFCL
  1845.     MOVEM    AC3,GEN%1SIZE            ;                                        1726
  1846.     MOVEI    AC16,15                ;                                        1727
  1847. L.5:    PUSH    SP,C.6                ;                                        1733
  1848.     PUSH    SP,C.12
  1849.     PUSHJ    SP,XFR%STATUS
  1850.     MOVEM    AC16,0(SP)            ;                                        1734
  1851.     PUSHJ    SP,U.1
  1852.     MOVE    AC16,AC1
  1853.     PUSH    SP,C.5                ;                                        1735
  1854.     PUSH    SP,C.12
  1855.     PUSHJ    SP,XFR%STATUS
  1856.     ADJSP    SP,-4                ;                                        1736
  1857.     MOVE    AC1,AC16            ;                                        1707
  1858.     POP    SP,AC16                ;                                        1666
  1859.     POPJ    SP,
  1860. C.9:    MOVSLJ
  1861. C.10:    POINT    7,FILE%NAME-1,34
  1862. C.11:    POINT    7,GEN%1DATA-1,34
  1863. C.12:    EXP    122
  1864.  
  1865. ; Routine Size:  33 words
  1866.  
  1867.  
  1868. ;   1738  1
  1869. ;   1739  1    %SBTTL 'Server -- DO%GENERIC - Execute a generic command'
  1870. ;   1740  1
  1871. ;   1741  1    GLOBAL ROUTINE DO%GENERIC (TYPE) =
  1872. ;   1742  1
  1873. ;   1743  1    !++
  1874. ;   1744  1    ! FUNCTIONAL DESCRIPTION:
  1875. ;   1745  1    !
  1876. ;   1746  1    !    This routine will send a generic command to the remote Kermit.
  1877. ;   1747  1    !    it will do all the processing required for the generic command
  1878. ;   1748  1    !    that was executed.  It will return to the caller after the
  1879. ;   1749  1    !    command has be executed.
  1880. ;   1750  1    !
  1881. ;   1751  1    ! CALLING SEQUENCE:
  1882. ;   1752  1    !
  1883. ;   1753  1    !    STATUS = DO%GENERIC (Command-type);
  1884. ;   1754  1    !
  1885. ;   1755  1    ! INPUT PARAMETERS:
  1886. ;   1756  1    !
  1887. ;   1757  1    !    Command-type -- Command type to be executed.
  1888. ;   1758  1    !
  1889. ;   1759  1    ! IMPLICIT INPUTS:
  1890. ;   1760  1    !
  1891. ;   1761  1    !    None.
  1892. ;   1762  1    !
  1893. ;   1763  1    ! OUTPUT PARAMETERS:
  1894. ;   1764  1    !
  1895. ;   1765  1    !    None.
  1896. ;   1766  1    !
  1897. ;   1767  1    ! IMPLICIT OUTPUTS:
  1898. ;   1768  1    !
  1899. ;   1769  1    !    None.
  1900. ;   1770  1    !
  1901. ;   1771  1    ! COMPLETION CODES:
  1902. ;   1772  1    !
  1903. ;   1773  1    !    None.
  1904. ;   1774  1    !
  1905. ;   1775  1    ! SIDE EFFECTS:
  1906. ;   1776  1    !
  1907. ;   1777  1    !    None.
  1908. ;   1778  1    !
  1909. ;   1779  1    !--
  1910. ;   1780  1
  1911. ;   1781  2        BEGIN
  1912. ;   1782  2
  1913. ;   1783  2        LOCAL
  1914. ;   1784  2        INIT%STATE;                ! Initial state for FSM
  1915. ;   1785  2
  1916. ;   1786  2    !
  1917. ;   1787  2    ! Set up the per transfer items
  1918. ;   1788  2    !
  1919. ;   1789  2        INIT%XFR ();
  1920. ;   1790  2        NUM%RETRIES = 0;
  1921. ;   1791  2        MSG%NUMBER = 0;
  1922. ;   1792  2    !
  1923. ;   1793  2    ! These are all generic commands
  1924. ;   1794  2    !
  1925. ;   1795  2        GEN%TYPE = MSG%GENERIC;
  1926. ;   1796  2    !
  1927. ;   1797  2    ! Assume we will not need server init
  1928. ;   1798  2    !
  1929. ;   1799  2        INIT%STATE = STATE%SG;
  1930. ;   1800  2
  1931. ;   1801  2        CASE .TYPE FROM GC%MIN TO GC%MAX OF
  1932. ;   1802  2        SET
  1933. ;   1803  2
  1934. ;   1804  2        [GC%EXIT] :
  1935. ;   1805  2            GEN%SUBTYPE = MSG%GEN%EXIT;
  1936. ;   1806  2
  1937. ;   1807  2        [GC%LOGOUT] :
  1938. ;   1808  2            GEN%SUBTYPE = MSG%GEN%LOGOUT;
  1939. ;   1809  2
  1940. ;   1810  2        [GC%DIRECTORY] :
  1941. ;   1811  3            BEGIN
  1942. ;   1812  3            INIT%STATE = STATE%SI;        ! We will need server-init
  1943. ;   1813  3            GEN%SUBTYPE = MSG%GEN%DIRECTORY;
  1944. ;   1814  2            END;
  1945. ;   1815  2
  1946. ;   1816  2        [GC%DISK%USAGE] :
  1947. ;   1817  3            BEGIN
  1948. ;   1818  3            INIT%STATE = STATE%SI;        ! We will need server-init
  1949. ;   1819  3            GEN%SUBTYPE = MSG%GEN%DISK%USAGE;
  1950. ;   1820  2            END;
  1951. ;   1821  2
  1952. ;   1822  2        [GC%DELETE] :
  1953. ;   1823  2            GEN%SUBTYPE = MSG%GEN%DELETE;
  1954. ;   1824  2
  1955. ;   1825  2        [GC%TYPE] :
  1956. ;   1826  3            BEGIN
  1957. ;   1827  3            INIT%STATE = STATE%SI;        ! We will need server-init
  1958. ;   1828  3            GEN%SUBTYPE = MSG%GEN%TYPE;
  1959. ;   1829  2            END;
  1960. ;   1830  2
  1961. ;   1831  2        [GC%HELP] :
  1962. ;   1832  3            BEGIN
  1963. ;   1833  3            INIT%STATE = STATE%SI;        ! We will need server-init
  1964. ;   1834  3            GEN%SUBTYPE = MSG%GEN%HELP;
  1965. ;   1835  2            END;
  1966. ;   1836  2
  1967. ;   1837  2        [GC%LGN] :
  1968. ;   1838  2            GEN%SUBTYPE = MSG%GEN%LOGIN;    ! Login just gets ACK
  1969. ;   1839  2
  1970. ;   1840  2        [GC%CONNECT] :
  1971. ;   1841  2            GEN%SUBTYPE = MSG%GEN%CONNECT;    ! CWD just gets ACK
  1972. ;   1842  2
  1973. ;   1843  2        [GC%RENAME] :
  1974. ;   1844  2            GEN%SUBTYPE = MSG%GEN%RENAME;    ! Rename file just needs ACK
  1975. ;   1845  2
  1976. ;   1846  2        [GC%COPY] :
  1977. ;   1847  2            GEN%SUBTYPE = MSG%GEN%COPY;        ! Copy file just needs ACK
  1978. ;   1848  2
  1979. ;   1849  2        [GC%WHO] :
  1980. ;   1850  3            BEGIN
  1981. ;   1851  3            INIT%STATE = STATE%SI;        ! May get large response
  1982. ;   1852  3            GEN%SUBTYPE = MSG%GEN%WHO;
  1983. ;   1853  2            END;
  1984. ;   1854  2
  1985. ;   1855  2        [GC%SEND%MSG] :
  1986. ;   1856  2            GEN%SUBTYPE = MSG%GEN%SEND;        ! Just need an ACK
  1987. ;   1857  2
  1988. ;   1858  2        [GC%STATUS] :
  1989. ;   1859  3            BEGIN
  1990. ;   1860  3            INIT%STATE = STATE%SI;        ! May get large response
  1991. ;   1861  3            GEN%SUBTYPE = MSG%GEN%QUERY;
  1992. ;   1862  2            END;
  1993. ;   1863  2
  1994. ;   1864  2        [GC%COMMAND] :
  1995. ;   1865  3            BEGIN
  1996. ;   1866  3            INIT%STATE = STATE%SI;        ! Large response likely
  1997. ;   1867  3            GEN%TYPE = MSG%COMMAND;        ! This is host command
  1998. ;   1868  2            END;
  1999. ;   1869  2
  2000. ;   1870  2        [GC%KERMIT] :
  2001. ;   1871  2            GEN%TYPE = MSG%KERMIT;        ! Perform Kermit command (short response)
  2002. ;   1872  2
  2003. ;   1873  2        [GC%PROGRAM] :
  2004. ;   1874  3            BEGIN
  2005. ;   1875  3            INIT%STATE = STATE%SI;        ! Assume large response
  2006. ;   1876  3            GEN%SUBTYPE = MSG%GEN%PROGRAM;    ! Generic program command
  2007. ;   1877  2            END;
  2008. ;   1878  2
  2009. ;   1879  2        [GC%JOURNAL] :
  2010. ;   1880  2            GEN%SUBTYPE = MSG%GEN%JOURNAL;    ! Do journal function (short reply)
  2011. ;   1881  2
  2012. ;   1882  2        [GC%VARIABLE] :
  2013. ;   1883  2            GEN%SUBTYPE = MSG%GEN%VARIABLE;    ! Set or get a variable value
  2014. ;   1884  2
  2015. ;   1885  2        [INRANGE, OUTRANGE] :
  2016. ;   1886  3            BEGIN
  2017. ;   1887  3            KRM%ERROR (KER%UNIMPLGEN);
  2018. ;   1888  3            RETURN STATE%A;
  2019. ;   1889  2            END;
  2020. ;   1890  2        TES;
  2021. ;   1891  2
  2022. ;   1892  2        RETURN DO%TRANSACTION (.INIT%STATE);    ! Go do the command
  2023. ;   1893  1        END;                    ! End of DO%GENERIC
  2024.  
  2025.  
  2026. DO%GENERIC::
  2027.     PUSH    SP,AC16                ;                                        1741
  2028.     PUSHJ    SP,U.32                ;                                        1789
  2029.     SETZM    U.54                ;                                        1790
  2030.     SETZM    U.55                ;                                        1791
  2031.     MOVEI    AC1,107                ;                                        1795
  2032.     MOVEM    AC1,U.65
  2033.     MOVEI    AC16,14                ;                                        1799
  2034.     MOVE    AC1,-2(SP)            ;                                        1801
  2035.     SOJL    AC1,L.7
  2036.     CAIGE    AC1,23
  2037.     JRST    L.6(AC1)
  2038.     JRST    L.7
  2039. L.6:    JRST    L.8
  2040.     JRST    L.10
  2041.     JRST    L.11
  2042.     JRST    L.12
  2043.     JRST    L.13
  2044.     JRST    L.14
  2045.     JRST    L.9
  2046.     JRST    L.15
  2047.     JRST    L.16
  2048.     JRST    L.17
  2049.     JRST    L.18
  2050.     JRST    L.19
  2051.     JRST    L.20
  2052.     JRST    L.21
  2053.     JRST    L.22
  2054.     JRST    L.23
  2055.     JRST    L.26
  2056.     JRST    L.27
  2057.     JRST    L.25
  2058. L.7:    PUSH    SP,C.13                ;                                        1887
  2059.     PUSHJ    SP,KRM%ERROR
  2060.     ADJSP    SP,-1                ;                                        1888
  2061.     MOVEI    AC1,12                ;                                        1886
  2062.     JRST    L.30
  2063. L.8:    MOVEI    AC1,106                ;                                        1805
  2064.     JRST    L.28
  2065. L.9:    MOVEI    AC1,114                ;                                        1808
  2066.     JRST    L.28
  2067. L.10:    MOVEI    AC16,15                ;                                        1812
  2068.     MOVEI    AC1,104                ;                                        1813
  2069.     JRST    L.28
  2070. L.11:    MOVEI    AC16,15                ;                                        1818
  2071.     MOVEI    AC1,125                ;                                        1819
  2072.     JRST    L.28
  2073. L.12:    MOVEI    AC1,105                ;                                        1823
  2074.     JRST    L.28
  2075. L.13:    MOVEI    AC16,15                ;                                        1827
  2076.     MOVEI    AC1,124                ;                                        1828
  2077.     JRST    L.28
  2078. L.14:    MOVEI    AC16,15                ;                                        1833
  2079.     MOVEI    AC1,110                ;                                        1834
  2080.     JRST    L.28
  2081. L.15:    MOVEI    AC1,111                ;                                        1838
  2082.     JRST    L.28
  2083. L.16:    MOVEI    AC1,103                ;                                        1841
  2084.     JRST    L.28
  2085. L.17:    MOVEI    AC1,122                ;                                        1844
  2086.     JRST    L.28
  2087. L.18:    MOVEI    AC1,113                ;                                        1847
  2088.     JRST    L.28
  2089. L.19:    MOVEI    AC16,15                ;                                        1851
  2090.     MOVEI    AC1,127                ;                                        1852
  2091.     JRST    L.28
  2092. L.20:    MOVEI    AC1,115                ;                                        1856
  2093.     JRST    L.28
  2094. L.21:    MOVEI    AC16,15                ;                                        1860
  2095.     MOVEI    AC1,121                ;                                        1861
  2096.     JRST    L.28
  2097. L.22:    MOVEI    AC16,15                ;                                        1866
  2098.     MOVEI    AC1,103                ;                                        1867
  2099.     JRST    L.24
  2100. L.23:    MOVEI    AC1,113                ;                                        1871
  2101. L.24:    MOVEM    AC1,U.65
  2102.     JRST    L.29                ;                                        1801
  2103. L.25:    MOVEI    AC16,15                ;                                        1875
  2104.     MOVEI    AC1,120                ;                                        1876
  2105.     JRST    L.28
  2106. L.26:    MOVEI    AC1,112                ;                                        1880
  2107.     JRST    L.28
  2108. L.27:    MOVEI    AC1,126                ;                                        1883
  2109. L.28:    MOVEM    AC1,U.66
  2110. L.29:    PUSH    SP,AC16                ;                                        1892
  2111.     PUSHJ    SP,U.1
  2112.     ADJSP    SP,-1
  2113. L.30:    POP    SP,AC16                ;                                        1741
  2114.     POPJ    SP,
  2115. C.13:    EXP    232
  2116.  
  2117. ; Routine Size:  89 words
  2118.  
  2119.  
  2120. ;   1894  1
  2121. ;   1895  1    %SBTTL 'DO%TRANSACTION - Main loop for FSM'
  2122. ;   1896  1    ROUTINE DO%TRANSACTION (INIT%STATE) =
  2123. ;   1897  1
  2124. ;   1898  1    !++
  2125. ;   1899  1    ! FUNCTIONAL DESCRIPTION:
  2126. ;   1900  1    !
  2127. ;   1901  1    !    This is the main routine for performing a Kermit transaction.
  2128. ;   1902  1    !    It is structured as a finite state machine with each state
  2129. ;   1903  1    !    determining the next based upon the packet which is received.
  2130. ;   1904  1    !    It is supplied with the initial state by the caller.
  2131. ;   1905  1    !
  2132. ;   1906  1    ! CALLING SEQUENCE:
  2133. ;   1907  1    !
  2134. ;   1908  1    !    Status = DO%TRANSACTION(.INIT%STATE);
  2135. ;   1909  1    !
  2136. ;   1910  1    ! INPUT PARAMETERS:
  2137. ;   1911  1    !
  2138. ;   1912  1    !    INIT%STATE - Initial state.
  2139. ;   1913  1    !
  2140. ;   1914  1    ! IMPLICIT INPUTS:
  2141. ;   1915  1    !
  2142. ;   1916  1    !    None.
  2143. ;   1917  1    !
  2144. ;   1918  1    ! OUTPUT PARAMETERS:
  2145. ;   1919  1    !
  2146. ;   1920  1    !    None.
  2147. ;   1921  1    !
  2148. ;   1922  1    ! IMPLICIT OUTPUTS:
  2149. ;   1923  1    !
  2150. ;   1924  1    !    None.
  2151. ;   1925  1    !
  2152. ;   1926  1    ! COMPLETION CODES:
  2153. ;   1927  1    !
  2154. ;   1928  1    !    None.
  2155. ;   1929  1    !
  2156. ;   1930  1    ! SIDE EFFECTS:
  2157. ;   1931  1    !
  2158. ;   1932  1    !    None.
  2159. ;   1933  1    !
  2160. ;   1934  1    !--
  2161. ;   1935  1
  2162. ;   1936  2        BEGIN
  2163. ;   1937  2
  2164. ;   1938  2        LOCAL
  2165. ;   1939  2        RETURN%VALUE;
  2166. ;   1940  2
  2167. ;   1941  2        NUM%RETRIES = 0;                ! Initialize the number of retries
  2168. ;   1942  2        STATE = .INIT%STATE;            ! Initialize the state
  2169. ;   1943  2
  2170. ;   1944  2        WHILE TRUE DO
  2171. ;   1945  2
  2172. ;   1946  2        CASE .STATE FROM STATE%MIN TO STATE%MAX OF
  2173. ;   1947  2            SET
  2174. ;   1948  2    !
  2175. ;   1949  2    ! Send states
  2176. ;   1950  2    !
  2177. ;   1951  2
  2178. ;   1952  2            [STATE%ID] :
  2179. ;   1953  2    !
  2180. ;   1954  2    ! Server while idle.  Set the timeout to twice the normal wait
  2181. ;   1955  2    ! and wait for something to show up
  2182. ;   1956  2    !
  2183. ;   1957  3            BEGIN
  2184. ;   1958  3
  2185. ;   1959  3            LOCAL
  2186. ;   1960  3                SAVED%TIMEOUT;
  2187. ;   1961  3
  2188. ;   1962  3            SAVED%TIMEOUT = .SEND%TIMEOUT;
  2189. ;   1963  3
  2190. ;   1964  3            IF .SEND%TIMEOUT NEQ 0 THEN SEND%TIMEOUT = .SRV%TIMEOUT;
  2191. ;   1965  3
  2192. ;   1966  3            STATE = REC%SERVER%IDLE ();
  2193. ;   1967  3            SEND%TIMEOUT = .SAVED%TIMEOUT;
  2194. ;   1968  2            END;
  2195. ;   1969  2
  2196. ;   1970  2            [STATE%II] :
  2197. ;   1971  2    !
  2198. ;   1972  2    ! Here while server idle after having received a server-init packet
  2199. ;   1973  2    !
  2200. ;   1974  2            STATE = REC%SERVER%IDLE ();
  2201. ;   1975  2
  2202. ;   1976  2            [STATE%FI, STATE%LG] :
  2203. ;   1977  2    !
  2204. ;   1978  2    ! Here when we are supposed to exit
  2205. ;   1979  2    !
  2206. ;   1980  2            RETURN KER%EXIT;
  2207. ;   1981  2
  2208. ;   1982  2            [STATE%SD] :
  2209. ;   1983  2            STATE = SEND%DATA ();
  2210. ;   1984  2
  2211. ;   1985  2            [STATE%SF] :
  2212. ;   1986  2            STATE = SEND%FILE ();
  2213. ;   1987  2
  2214. ;   1988  2            [STATE%SZ] :
  2215. ;   1989  2            STATE = SEND%EOF ();
  2216. ;   1990  2
  2217. ;   1991  2            [STATE%S] :
  2218. ;   1992  2            STATE = SEND%INIT ();
  2219. ;   1993  2
  2220. ;   1994  2            [STATE%OF] :
  2221. ;   1995  2            STATE = SEND%OPEN%FILE ();
  2222. ;   1996  2
  2223. ;   1997  2            [STATE%SI] :
  2224. ;   1998  2            STATE = SEND%SERVER%INIT ();
  2225. ;   1999  2
  2226. ;   2000  2            [STATE%SG] :
  2227. ;   2001  2            STATE = SEND%GENCMD ();
  2228. ;   2002  2
  2229. ;   2003  2            [STATE%SB] :
  2230. ;   2004  2            STATE = SEND%BREAK ();
  2231. ;   2005  2    !
  2232. ;   2006  2    ! Receiving of the data and the end of file message.
  2233. ;   2007  2    !
  2234. ;   2008  2
  2235. ;   2009  2            [STATE%RD] :
  2236. ;   2010  2            STATE = REC%DATA ();
  2237. ;   2011  2    !
  2238. ;   2012  2    ! Receiving the FILE information of the break to end the transfer of
  2239. ;   2013  2    ! one or more files
  2240. ;   2014  2    !
  2241. ;   2015  2
  2242. ;   2016  2            [STATE%RF] :
  2243. ;   2017  2            STATE = REC%FILE ();
  2244. ;   2018  2    !
  2245. ;   2019  2    ! Initialization for the receiving of a file
  2246. ;   2020  2    !
  2247. ;   2021  2
  2248. ;   2022  2            [STATE%R] :
  2249. ;   2023  2            STATE = REC%INIT ();
  2250. ;   2024  2    !
  2251. ;   2025  2    ! Here if we have completed the receiving of the file
  2252. ;   2026  2    !
  2253. ;   2027  2
  2254. ;   2028  2            [STATE%C] :
  2255. ;   2029  3            BEGIN
  2256. ;   2030  3            RETURN%VALUE = TRUE;
  2257. ;   2031  3            EXITLOOP;
  2258. ;   2032  2            END;
  2259. ;   2033  2    !
  2260. ;   2034  2    ! Here if we aborted the transfer or we have gotten into some random
  2261. ;   2035  2    ! state (internal KERMSG problem).
  2262. ;   2036  2    !
  2263. ;   2037  2
  2264. ;   2038  2            [STATE%A, STATE%EX, STATE%ER, INRANGE, OUTRANGE] :
  2265. ;   2039  3            BEGIN
  2266. ;   2040  3            RETURN%VALUE = FALSE;
  2267. ;   2041  3
  2268. ;   2042  3            IF .STATE EQL STATE%EX THEN RETURN%VALUE = KER%ABORTED;
  2269. ;   2043  3
  2270. ;   2044  3            !
  2271. ;   2045  3            ! Determine if the file is still open and if so close it
  2272. ;   2046  3            !
  2273. ;   2047  3
  2274. ;   2048  3            IF .FLAG%FILE%OPEN
  2275. ;   2049  3            THEN
  2276. ;   2050  4                BEGIN
  2277. ;   2051  4                FLAG%FILE%OPEN = FALSE;
  2278. ;   2052  4
  2279. ;   2053  4                IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  2280. ;   2054  4                THEN
  2281. ;   2055  5                BEGIN
  2282. ;   2056  5                TT%TEXT (UPLIT (%ASCIZ' [Aborted]'));
  2283. ;   2057  5                TT%CRLF ();
  2284. ;   2058  4                END;
  2285. ;   2059  4
  2286. ;   2060  5                FILE%CLOSE (.ABT%FLAG AND (.STATE EQL STATE%A OR .STATE EQL STATE%EX OR .STATE
  2287. ;   2061  4                EQL STATE%ER));
  2288. ;   2062  4                XFR%STATUS (%C'F', %C'A');
  2289. ;   2063  3                END;
  2290. ;   2064  3
  2291. ;   2065  3    !
  2292. ;   2066  3    ! Give error if aborted due to too many retries
  2293. ;   2067  3    !
  2294. ;   2068  3
  2295. ;   2069  3            IF .STATE EQL STATE%ER THEN KRM%ERROR (KER%RETRIES);
  2296. ;   2070  3
  2297. ;   2071  3            EXITLOOP;
  2298. ;   2072  2            END;
  2299. ;   2073  2            TES;
  2300. ;   2074  2
  2301. ;   2075  2    !
  2302. ;   2076  2    ! End the stats and return to the caller
  2303. ;   2077  2    !
  2304. ;   2078  2        END%STATS ();
  2305. ;   2079  2    !
  2306. ;   2080  2        RETURN .RETURN%VALUE;
  2307. ;   2081  1        END;                    ! End of DO%TRANSACTION
  2308.  
  2309.  
  2310. P.AAA:    BYTE    (7)" ","[","A","b","o"
  2311.     BYTE    (7)"r","t","e","d","]"
  2312.     BYTE    (7)000,000,000,000,000
  2313.  
  2314.  
  2315. ; DO%TRANSACTION
  2316. U.1:    PUSH    SP,AC14                ;                                        1896
  2317.     PUSH    SP,AC16
  2318.     SETZM    U.54                ;                                        1941
  2319.     MOVE    AC1,-3(SP)            ;                                        1942
  2320. L.31:    MOVEM    AC1,U.51
  2321. L.32:    MOVE    AC1,U.51            ;                                        1946
  2322.     MOVE    AC2,AC1
  2323.     SOJL    AC2,L.34
  2324.     CAIGE    AC2,24
  2325.     JRST    L.33(AC2)
  2326.     JRST    L.34
  2327. L.33:    JRST    L.44
  2328.     JRST    L.42
  2329.     JRST    L.41
  2330.     JRST    L.43
  2331.     JRST    L.48
  2332.     JRST    L.51
  2333.     JRST    L.50
  2334.     JRST    L.49
  2335.     JRST    L.52
  2336.     JRST    L.34
  2337.     JRST    L.34
  2338.     JRST    L.47
  2339.     JRST    L.46
  2340.     JRST    L.37
  2341.     JRST    L.39
  2342.     JRST    L.40
  2343.     JRST    L.40
  2344.     JRST    L.45
  2345.     JRST    L.34
  2346.     JRST    L.34
  2347. L.34:    SETZ    AC14,                ;                                        2040
  2348.     CAIN    AC1,23                ;                                        2042
  2349.     MOVEI    AC14,312
  2350.     MOVEI    AC1,1                ;                                        2048
  2351.     TDNN    AC1,FLAG%FILE%OPEN
  2352.     JRST    L.36
  2353.     SETZM    FLAG%FILE%OPEN            ;                                        2051
  2354.     MOVEI    AC1,1                ;                                        2053
  2355.     TDNE    AC1,CONNECT%FLAG
  2356.     JRST    L.35
  2357.     MOVEI    AC1,1
  2358.     TDNN    AC1,TY%FIL
  2359.     JRST    L.35
  2360.     PUSH    SP,C.14                ;                                        2056
  2361.     PUSHJ    SP,TT%TEXT
  2362.     ADJSP    SP,-1
  2363.     PUSHJ    SP,TT%CRLF            ;                                        2057
  2364. L.35:    MOVE    AC3,U.51            ;                                        2060
  2365.     SETZ    AC1,
  2366.     CAIN    AC3,12
  2367.     MOVEI    AC1,1
  2368.     SETZ    AC2,
  2369.     CAIN    AC3,23
  2370.     MOVEI    AC2,1
  2371.     IOR    AC2,AC1
  2372.     SETZ    AC1,                ;                                        2061
  2373.     CAIN    AC3,24
  2374.     MOVEI    AC1,1
  2375.     IOR    AC1,AC2                ;                                        2060
  2376.     AND    AC1,ABT%FLAG
  2377.     PUSH    SP,AC1
  2378.     PUSHJ    SP,FILE%CLOSE
  2379.     ADJSP    SP,-1
  2380.     PUSH    SP,C.15                ;                                        2062
  2381.     PUSH    SP,C.16
  2382.     PUSHJ    SP,XFR%STATUS
  2383.     ADJSP    SP,-2
  2384. L.36:    MOVEI    AC1,24                ;                                        2069
  2385.     CAME    AC1,U.51
  2386.     JRST    L.53
  2387.     PUSH    SP,C.17
  2388.     PUSHJ    SP,KRM%ERROR
  2389.     ADJSP    SP,-1
  2390.     JRST    L.53
  2391. L.37:    MOVE    AC1,SEND%TIMEOUT        ;                                        1962
  2392.     MOVE    AC16,AC1
  2393.     JUMPE    AC1,L.38            ;                                        1964
  2394.     MOVE    AC1,SRV%TIMEOUT
  2395.     MOVEM    AC1,SEND%TIMEOUT
  2396. L.38:    PUSHJ    SP,U.10                ;                                        1966
  2397.     MOVEM    AC1,U.51
  2398.     MOVEM    AC16,SEND%TIMEOUT        ;                                        1967
  2399.     JRST    L.32                ;                                        1946
  2400. L.39:    PUSHJ    SP,U.10                ;                                        1974
  2401.     JRST    L.31
  2402. L.40:    MOVEI    AC1,223                ;                                        1980
  2403.     JRST    L.54
  2404. L.41:    PUSHJ    SP,U.3                ;                                        1983
  2405.     JRST    L.31
  2406. L.42:    PUSHJ    SP,U.4                ;                                        1986
  2407.     JRST    L.31
  2408. L.43:    PUSHJ    SP,U.7                ;                                        1989
  2409.     JRST    L.31
  2410. L.44:    PUSHJ    SP,U.8                ;                                        1992
  2411.     JRST    L.31
  2412. L.45:    PUSHJ    SP,U.5                ;                                        1995
  2413.     JRST    L.31
  2414. L.46:    PUSHJ    SP,U.2                ;                                        1998
  2415.     JRST    L.31
  2416. L.47:    PUSHJ    SP,U.6                ;                                        2001
  2417.     JRST    L.31
  2418. L.48:    PUSHJ    SP,U.9                ;                                        2004
  2419.     JRST    L.31
  2420. L.49:    PUSHJ    SP,U.13                ;                                        2010
  2421.     JRST    L.31
  2422. L.50:    PUSHJ    SP,U.12                ;                                        2017
  2423.     JRST    L.31
  2424. L.51:    PUSHJ    SP,U.11                ;                                        2023
  2425.     JRST    L.31
  2426. L.52:    MOVEI    AC14,1                ;                                        2030
  2427. L.53:    PUSHJ    SP,U.18                ;                                        2078
  2428.     MOVE    AC1,AC14            ;                                        1936
  2429. L.54:    POP    SP,AC16                ;                                        1896
  2430.     POP    SP,AC14
  2431.     POPJ    SP,
  2432. C.14:    XWD    0,P.AAA
  2433. C.15:    EXP    106
  2434. C.16:    EXP    101
  2435. C.17:    EXP    212
  2436.  
  2437. ; Routine Size:  120 words
  2438.  
  2439.  
  2440. ;   2082  1    %SBTTL 'REC%SERVER%IDLE - Idle server state'
  2441. ;   2083  1    ROUTINE REC%SERVER%IDLE =
  2442. ;   2084  1
  2443. ;   2085  1    !++
  2444. ;   2086  1    ! FUNCTIONAL DESCRIPTION:
  2445. ;   2087  1    !
  2446. ;   2088  1    ! This routine is called from DO%TRANSACTION when is the server idle
  2447. ;   2089  1    ! state.  It will receive a message and properly dispatch to the new
  2448. ;   2090  1    ! state.
  2449. ;   2091  1    !
  2450. ;   2092  1    ! CALLING SEQUENCE:
  2451. ;   2093  1    !
  2452. ;   2094  1    !    STATE = REC%SERVER%IDLE ();
  2453. ;   2095  1    !
  2454. ;   2096  1    ! INPUT PARAMETERS:
  2455. ;   2097  1    !
  2456. ;   2098  1    !    None.
  2457. ;   2099  1    !
  2458. ;   2100  1    ! IMPLICIT INPUTS:
  2459. ;   2101  1    !
  2460. ;   2102  1    !    Almost everything.
  2461. ;   2103  1    !
  2462. ;   2104  1    ! OUPTUT PARAMETERS:
  2463. ;   2105  1    !
  2464. ;   2106  1    !    Routine value is new state for FSM
  2465. ;   2107  1    !
  2466. ;   2108  1    ! IMPLICIT OUTPUTS:
  2467. ;   2109  1    !
  2468. ;   2110  1    !    None.
  2469. ;   2111  1    !
  2470. ;   2112  1    ! COMPLETION CODES:
  2471. ;   2113  1    !
  2472. ;   2114  1    !    None.
  2473. ;   2115  1    !
  2474. ;   2116  1    ! SIDE EFFECTS:
  2475. ;   2117  1    !
  2476. ;   2118  1    !    None.
  2477. ;   2119  1    !
  2478. ;   2120  1    !--
  2479. ;   2121  1
  2480. ;   2122  2        BEGIN
  2481. ;   2123  2
  2482. ;   2124  2        LOCAL
  2483. ;   2125  2        STATUS;
  2484. ;   2126  2
  2485. ;   2127  2        STATUS = REC%PACKET ();
  2486. ;   2128  2    !
  2487. ;   2129  2    ! Now determine what to do by the type of message we have receive.
  2488. ;   2130  2    !
  2489. ;   2131  2
  2490. ;   2132  2        IF .STATUS EQL KER%ABORTED THEN RETURN STATE%EX;
  2491. ;   2133  2
  2492. ;   2134  2        IF .STATUS
  2493. ;   2135  2        THEN
  2494. ;   2136  3        BEGIN
  2495. ;   2137  3
  2496. ;   2138  3        SELECTONE .REC%TYPE OF
  2497. ;   2139  3            SET
  2498. ;   2140  3            !
  2499. ;   2141  3            ! Server initialization message received. ACK the
  2500. ;   2142  3            ! message and continue.
  2501. ;   2143  3            !
  2502. ;   2144  3
  2503. ;   2145  3            [MSG%SER%INIT] :
  2504. ;   2146  4            BEGIN
  2505. ;   2147  4
  2506. ;   2148  5            IF (STATUS = PRS%SEND%INIT ())
  2507. ;   2149  4            THEN
  2508. ;   2150  5                BEGIN
  2509. ;   2151  5                SET%SEND%INIT ();
  2510. ;   2152  5
  2511. ;   2153  6                IF (STATUS = SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .REC%SEQ)) ! [108]
  2512. ;   2154  5                THEN
  2513. ;   2155  6                BEGIN
  2514. ;   2156  6                SND%PKT%SIZE = -.SEND%PKT%SIZE;
  2515. ;   2157  6                SND%TIMEOUT = -.SEND%TIMEOUT;
  2516. ;   2158  6                SND%NPAD = -.SEND%NPAD;
  2517. ;   2159  6                SND%PADCHAR = -.SEND%PADCHAR;
  2518. ;   2160  6                SND%EOL = -.SEND%EOL;
  2519. ;   2161  6                SND%QUOTE%CHR = -.SEND%QUOTE%CHR;
  2520. ;   2162  6                RCV%8QUOTE%CHR = .SEND%8QUOTE%CHR;
  2521. ;   2163  6                CHKTYPE = .INI%CHK%TYPE;
  2522. ;   2164  6                SET%REPT%CHR = .REPT%CHR;
  2523. ;   2165  6                RETURN STATE%II;    ! Now idle after INIT
  2524. ;   2166  5                END;
  2525. ;   2167  5
  2526. ;   2168  4                END;
  2527. ;   2169  4
  2528. ;   2170  4            KRM%ERROR (KER%PROTOERR);
  2529. ;   2171  4            RETURN STATE%A;
  2530. ;   2172  3            END;
  2531. ;   2173  3            !
  2532. ;   2174  3            ! Send init message received.  We must ACK the message and
  2533. ;   2175  3            ! then attempt to receive a file from the remote.
  2534. ;   2176  3            !
  2535. ;   2177  3
  2536. ;   2178  3            [MSG%SND%INIT] :
  2537. ;   2179  4            BEGIN
  2538. ;   2180  4            MSG%NUMBER = (.REC%SEQ + 1) AND %O'77';
  2539. ;   2181  4
  2540. ;   2182  5            IF (STATUS = PRS%SEND%INIT ())
  2541. ;   2183  4            THEN
  2542. ;   2184  5                BEGIN
  2543. ;   2185  5                SET%SEND%INIT ();
  2544. ;   2186  5                !
  2545. ;   2187  5                ! ACK the message then receive everything.
  2546. ;   2188  5                !
  2547. ;   2189  5
  2548. ;   2190  5                IF SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .REC%SEQ) ! [108]
  2549. ;   2191  5                THEN
  2550. ;   2192  6                BEGIN
  2551. ;   2193  6                BLK%CHK%TYPE = .INI%CHK%TYPE;    ! Switch to desired form of block check
  2552. ;   2194  6                XFR%STATUS (%C'I', %C'R');    ! Start of file receive
  2553. ;   2195  6                RETURN STATE%RF;
  2554. ;   2196  5                END;
  2555. ;   2197  5
  2556. ;   2198  4                END;
  2557. ;   2199  4
  2558. ;   2200  4            KRM%ERROR (KER%PROTOERR);
  2559. ;   2201  4            RETURN STATE%A;
  2560. ;   2202  3            END;
  2561. ;   2203  3            !
  2562. ;   2204  3            ! Here if we receive a receive init message.
  2563. ;   2205  3            ! We will be sending a file to the other end.
  2564. ;   2206  3            !
  2565. ;   2207  3
  2566. ;   2208  3            [MSG%RCV%INIT] :
  2567. ;   2209  4            BEGIN
  2568. ;   2210  4            !
  2569. ;   2211  4            ! Move the file specification if we received one
  2570. ;   2212  4            !
  2571. ;   2213  4            SET%STRING (CH$PTR (FILE%NAME), MAX%FILE%NAME, TRUE);
  2572. ;   2214  4            BFR%EMPTY ();
  2573. ;   2215  4            FILE%SIZE = SET%STRING (0, 0, FALSE);
  2574. ;   2216  4            CH$WCHAR (CHR%NUL, CH$PTR (FILE%NAME, .FILE%SIZE));
  2575. ;   2217  4
  2576. ;   2218  4            IF .FILE%SIZE GTR 0
  2577. ;   2219  4            THEN
  2578. ;   2220  5                BEGIN
  2579. ;   2221  5                XFR%STATUS (%C'I', %C'S');    ! Start of a file send
  2580. ;   2222  5                RETURN STATE%S;
  2581. ;   2223  4                END;
  2582. ;   2224  4
  2583. ;   2225  4            KRM%ERROR (KER%PROTOERR);
  2584. ;   2226  4            RETURN STATE%A;
  2585. ;   2227  3            END;
  2586. ;   2228  3    !
  2587. ;   2229  3    ! Generic KERMIT commands
  2588. ;   2230  3    !
  2589. ;   2231  3
  2590. ;   2232  3            [MSG%GENERIC] :
  2591. ;   2233  3            RETURN SERVER%GENERIC ();
  2592. ;   2234  3    !
  2593. ;   2235  3    ! Host command
  2594. ;   2236  3    !
  2595. ;   2237  3
  2596. ;   2238  3            [MSG%COMMAND] :
  2597. ;   2239  3            RETURN HOST%COMMAND ();
  2598. ;   2240  3    !
  2599. ;   2241  3    ! Kermit command
  2600. ;   2242  3    !
  2601. ;   2243  3
  2602. ;   2244  3            [MSG%KERMIT] :
  2603. ;   2245  3            RETURN KERMIT%COMMAND ();
  2604. ;   2246  3    !
  2605. ;   2247  3    ! Unimplimented server routines
  2606. ;   2248  3    !
  2607. ;   2249  3
  2608. ;   2250  3            [OTHERWISE] :
  2609. ;   2251  4            BEGIN
  2610. ;   2252  4            KRM%ERROR (KER%UNISRV);
  2611. ;   2253  4            RETURN STATE%A;
  2612. ;   2254  3            END;
  2613. ;   2255  3            TES;
  2614. ;   2256  3
  2615. ;   2257  2        END;
  2616. ;   2258  2
  2617. ;   2259  2    !
  2618. ;   2260  2    ! If we get here, we must have gotten something random.  Therefore,
  2619. ;   2261  2    ! just send a NAK and remain in the current state (unless we have done this
  2620. ;   2262  2    ! too many times).
  2621. ;   2263  2    !
  2622. ;   2264  2        NUM%RETRIES = .NUM%RETRIES + 1;
  2623. ;   2265  2
  2624. ;   2266  2        IF .NUM%RETRIES GTR .SI%RETRIES THEN RETURN STATE%A;
  2625. ;   2267  2
  2626. ;   2268  2        IF SEND%PACKET (MSG%NAK, 0, 0) THEN RETURN .STATE ELSE RETURN STATE%EX;
  2627. ;   2269  2
  2628. ;   2270  1        END;                    ! End of REC%SERVER%IDLE
  2629.  
  2630.  
  2631. ; REC%SERVER%IDLE
  2632. U.10:    PUSH    SP,AC14                ;                                        2083
  2633.     PUSH    SP,AC16
  2634.     PUSHJ    SP,U.26                ;                                        2127
  2635.     MOVE    AC14,AC1
  2636.     CAIN    AC14,312            ;                                        2132
  2637.     JRST    L.67
  2638.     TRNN    AC14,1                ;                                        2134
  2639.     JRST    L.64
  2640.     MOVE    AC16,U.58            ;                                        2138
  2641.     CAIE    AC16,111            ;                                        2145
  2642.     JRST    L.55
  2643.     PUSHJ    SP,U.21                ;                                        2148
  2644.     MOVE    AC14,AC1
  2645.     TRNN    AC14,1
  2646.     JRST    L.56
  2647.     PUSHJ    SP,U.20                ;                                        2151
  2648.     PUSH    SP,C.20                ;                                        2153
  2649.     PUSH    SP,U.46
  2650.     PUSH    SP,U.56
  2651.     PUSHJ    SP,U.24
  2652.     MOVE    AC14,AC1
  2653.     ADJSP    SP,-3
  2654.     TRNN    AC14,1
  2655.     JRST    L.56
  2656.     MOVE    AC1,U.40            ;                                        2156
  2657.     MOVNM    AC1,SND%PKT%SIZE
  2658.     MOVE    AC1,SEND%TIMEOUT        ;                                        2157
  2659.     MOVNM    AC1,SND%TIMEOUT
  2660.     MOVE    AC1,U.41            ;                                        2158
  2661.     MOVNM    AC1,SND%NPAD
  2662.     MOVE    AC1,U.42            ;                                        2159
  2663.     MOVNM    AC1,SND%PADCHAR
  2664.     MOVE    AC1,U.43            ;                                        2160
  2665.     MOVNM    AC1,SND%EOL
  2666.     MOVE    AC1,U.44            ;                                        2161
  2667.     MOVNM    AC1,SND%QUOTE%CHR
  2668.     MOVE    AC1,U.45            ;                                        2162
  2669.     MOVEM    AC1,RCV%8QUOTE%CHR
  2670.     MOVE    AC1,U.47            ;                                        2163
  2671.     MOVEM    AC1,CHKTYPE
  2672.     MOVE    AC1,U.38            ;                                        2164
  2673.     MOVEM    AC1,SET%REPT%CHR
  2674.     MOVEI    AC1,17                ;                                        2155
  2675.     JRST    L.68
  2676. L.55:    CAIE    AC16,123            ;                                        2178
  2677.     JRST    L.57
  2678.     MOVE    AC1,U.56            ;                                        2180
  2679.     ADDI    AC1,1
  2680.     LDB    AC2,C.18
  2681.     MOVEM    AC2,U.55
  2682.     PUSHJ    SP,U.21                ;                                        2182
  2683.     MOVE    AC14,AC1
  2684.     TRNN    AC14,1
  2685.     JRST    L.56
  2686.     PUSHJ    SP,U.20                ;                                        2185
  2687.     PUSH    SP,C.20                ;                                        2190
  2688.     PUSH    SP,U.46
  2689.     PUSH    SP,U.56
  2690.     PUSHJ    SP,U.24
  2691.     ADJSP    SP,-3
  2692.     TRNN    AC1,1
  2693.     JRST    L.56
  2694.     MOVE    AC1,U.47            ;                                        2193
  2695.     MOVEM    AC1,U.48
  2696.     PUSH    SP,C.6                ;                                        2194
  2697.     PUSH    SP,C.12
  2698.     PUSHJ    SP,XFR%STATUS
  2699.     ADJSP    SP,-2                ;                                        2195
  2700.     MOVEI    AC1,7                ;                                        2192
  2701.     JRST    L.68
  2702. L.56:    PUSH    SP,C.21                ;                                        2200
  2703.     JRST    L.63
  2704. L.57:    CAIE    AC16,122            ;                                        2208
  2705.     JRST    L.59
  2706.     PUSH    SP,C.10                ;                                        2213
  2707.     PUSH    SP,C.22
  2708.     PUSH    SP,C.2
  2709.     PUSHJ    SP,U.30
  2710.     PUSHJ    SP,U.28                ;                                        2214
  2711.     SETZM    -2(SP)                ;                                        2215
  2712.     SETZM    -1(SP)
  2713.     SETZM    0(SP)
  2714.     PUSHJ    SP,U.30
  2715.     MOVEM    AC1,FILE%SIZE
  2716.     SETZ    AC3,                ;                                        2216
  2717.     MOVE    AC2,FILE%SIZE
  2718.     MOVE    AC4,C.19
  2719.     MOVE    AC1,AC2
  2720.     ADJBP    AC1,AC4
  2721.     IDPB    AC3,AC1
  2722.     JUMPLE    AC2,L.58            ;                                        2218
  2723.     PUSH    SP,C.6                ;                                        2221
  2724.     PUSH    SP,C.8
  2725.     PUSHJ    SP,XFR%STATUS
  2726.     ADJSP    SP,-5                ;                                        2222
  2727.     MOVEI    AC1,1                ;                                        2220
  2728.     JRST    L.68
  2729. L.58:    PUSH    SP,C.21                ;                                        2225
  2730.     PUSHJ    SP,KRM%ERROR
  2731.     ADJSP    SP,-4                ;                                        2209
  2732.     JRST    L.65
  2733. L.59:    CAIE    AC16,107            ;                                        2232
  2734.     JRST    L.60
  2735.     PUSHJ    SP,U.14                ;                                        2233
  2736.     JRST    L.68                ;                                        2138
  2737. L.60:    CAIE    AC16,103            ;                                        2238
  2738.     JRST    L.61
  2739.     PUSHJ    SP,U.15                ;                                        2239
  2740.     JRST    L.68                ;                                        2138
  2741. L.61:    CAIE    AC16,113            ;                                        2244
  2742.     JRST    L.62
  2743.     PUSHJ    SP,U.16                ;                                        2245
  2744.     JRST    L.68                ;                                        2138
  2745. L.62:    PUSH    SP,C.23                ;                                        2252
  2746. L.63:    PUSHJ    SP,KRM%ERROR
  2747.     ADJSP    SP,-1                ;                                        2251
  2748.     JRST    L.65
  2749. L.64:    AOS    AC1,U.54            ;                                        2266
  2750.     CAMG    AC1,SI%RETRIES
  2751.     JRST    L.66
  2752. L.65:    MOVEI    AC1,12
  2753.     JRST    L.68
  2754. L.66:    PUSH    SP,C.24                ;                                        2268
  2755.     PUSH    SP,C.25
  2756.     PUSH    SP,C.25
  2757.     PUSHJ    SP,U.24
  2758.     ADJSP    SP,-3
  2759.     TRNE    AC1,1
  2760.     SKIPA    AC1,U.51
  2761. L.67:    MOVEI    AC1,23
  2762. L.68:    POP    SP,AC16                ;                                        2083
  2763.     POP    SP,AC14
  2764.     POPJ    SP,
  2765. C.18:    POINT    6,AC1,35
  2766. C.19:    POINT    7,FILE%NAME,-1
  2767. C.20:    EXP    131
  2768. C.21:    EXP    252
  2769. C.22:    EXP    204
  2770. C.23:    EXP    242
  2771. C.24:    EXP    116
  2772. C.25:    EXP    0
  2773.  
  2774. ; Routine Size:  141 words
  2775.  
  2776.  
  2777. ;   2271  1    %SBTTL 'SEND%SERVER%INIT'
  2778. ;   2272  1    ROUTINE SEND%SERVER%INIT =
  2779. ;   2273  1
  2780. ;   2274  1    !++
  2781. ;   2275  1    ! FUNCTIONAL DESCRIPTION:
  2782. ;   2276  1    !
  2783. ;   2277  1    !    This routine will send a server initialization message to the
  2784. ;   2278  1    !    remote KERMIT.
  2785. ;   2279  1    !
  2786. ;   2280  1    ! CALLING SEQUENCE:
  2787. ;   2281  1    !
  2788. ;   2282  1    !    STATE = SEND%SERVER%INIT();
  2789. ;   2283  1    !
  2790. ;   2284  1    ! INPUT PARAMETERS:
  2791. ;   2285  1    !
  2792. ;   2286  1    !    None.
  2793. ;   2287  1    !
  2794. ;   2288  1    ! IMPLICIT INPUTS:
  2795. ;   2289  1    !
  2796. ;   2290  1    !    RECV%xxx - desired receive parameters
  2797. ;   2291  1    !
  2798. ;   2292  1    ! OUTPUT PARAMETERS:
  2799. ;   2293  1    !
  2800. ;   2294  1    !    New state to change the finite state machine to.
  2801. ;   2295  1    !
  2802. ;   2296  1    ! IMPLICIT OUTPUTS:
  2803. ;   2297  1    !
  2804. ;   2298  1    !    SEND%xxx - Other Kermit's desired parameters
  2805. ;   2299  1    !
  2806. ;   2300  1    ! COMPLETION CODES:
  2807. ;   2301  1    !
  2808. ;   2302  1    !    None.
  2809. ;   2303  1    !
  2810. ;   2304  1    ! SIDE EFFECTS:
  2811. ;   2305  1    !
  2812. ;   2306  1    !    None.
  2813. ;   2307  1    !
  2814. ;   2308  1    !--
  2815. ;   2309  1
  2816. ;   2310  2        BEGIN
  2817. ;   2311  2
  2818. ;   2312  2        LOCAL
  2819. ;   2313  2        OLD%OUTPUT,                ! Saved terminal output routine
  2820. ;   2314  2        STATUS;                    ! Status returned by various routines
  2821. ;   2315  2
  2822. ;   2316  2    ![026] Local routine to ignore error message output
  2823. ;   2317  2        ROUTINE IGNORE%ERROR (ADDRESS, LENGTH) =
  2824. ;   2318  3        BEGIN
  2825. ;   2319  3        RETURN TRUE;
  2826. ;   2320  2        END;
  2827.  
  2828.  
  2829. ; IGNORE%ERROR
  2830. U.76:    MOVEI    AC1,1                ;                                        2318
  2831.     POPJ    SP,                ;                                        2317
  2832.  
  2833. ; Routine Size:  2 words
  2834.  
  2835.  
  2836. ;   2321  2        SET%SEND%INIT ();
  2837. ;   2322  2    ![026] If too many tries, just give up.  Maybe the other Kermit doesn't
  2838. ;   2323  2    ![026] know what to do with this packet.
  2839. ;   2324  2
  2840. ;   2325  2        IF .NUM%RETRIES GTR .SI%RETRIES THEN RETURN STATE%SG;
  2841. ;   2326  2
  2842. ;   2327  2    ![026]
  2843. ;   2328  2    ![026] Count the number of times we try this
  2844. ;   2329  2    ![026]
  2845. ;   2330  2        NUM%RETRIES = .NUM%RETRIES + 1;
  2846. ;   2331  2
  2847. ;   2332  2        IF NOT SEND%PACKET (MSG%SER%INIT, .SEND%INIT%SIZE, .MSG%NUMBER) THEN RETURN STATE%A; ! [108]
  2848. ;   2333  2
  2849. ;   2334  2    ![026]
  2850. ;   2335  2    ![026] Determine if we received a packet it good condition.  If we timed out
  2851. ;   2336  2    ![026] just try again.  If we get an error packet back, ignore it and
  2852. ;   2337  2    ![026] just continue.  The other Kermit must not support this packet.
  2853. ;   2338  2    ![026]
  2854. ;   2339  2        OLD%OUTPUT = TT%SET%OUTPUT (IGNORE%ERROR);
  2855. ;   2340  2        STATUS = REC%PACKET ();
  2856. ;   2341  2        TT%OUTPUT ();
  2857. ;   2342  2        TT%SET%OUTPUT (.OLD%OUTPUT);
  2858. ;   2343  2
  2859. ;   2344  2        IF .STATUS EQL KER%ERRMSG THEN RETURN STATE%SG;
  2860. ;   2345  2
  2861. ;   2346  2        IF NOT .STATUS
  2862. ;   2347  2        THEN
  2863. ;   2348  2
  2864. ;   2349  4        IF NOT ((.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL
  2865. ;   2350  3            KER%CHKSUMERR))
  2866. ;   2351  2        THEN
  2867. ;   2352  2            RETURN STATE%EX
  2868. ;   2353  2        ELSE
  2869. ;   2354  2            RETURN .STATE;
  2870. ;   2355  2
  2871. ;   2356  2    !
  2872. ;   2357  2    ! Determine if the packet is good.
  2873. ;   2358  2    !
  2874. ;   2359  2
  2875. ;   2360  2        IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ EQL .MSG%NUMBER
  2876. ;   2361  2        THEN
  2877. ;   2362  3        BEGIN
  2878. ;   2363  3    !
  2879. ;   2364  3    ! Here if we have an ACK for the initialization message that was just sent
  2880. ;   2365  3    ! to the remote KERMIT.
  2881. ;   2366  3    !
  2882. ;   2367  3
  2883. ;   2368  3        IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN STATE%A;
  2884. ;   2369  3
  2885. ;   2370  3        NUM%RETRIES = 0;
  2886. ;   2371  3        INIT%PKT%SENT = TRUE;            ! We have exchanged init's
  2887. ;   2372  3        RETURN STATE%SG;
  2888. ;   2373  2        END;
  2889. ;   2374  2
  2890. ;   2375  2    !
  2891. ;   2376  2    ! If we haven't returned yet, we must have gotten an invalid response.
  2892. ;   2377  2    ! Just stay in the same state so we try again
  2893. ;   2378  2    !
  2894. ;   2379  2        RETURN .STATE;
  2895. ;   2380  1        END;
  2896.  
  2897.  
  2898. ; SEND%SERVER%INIT
  2899. U.2:    PUSH    SP,AC14                ;                                        2272
  2900.     PUSH    SP,AC16
  2901.     PUSHJ    SP,U.20                ;                                        2321
  2902.     MOVE    AC1,U.54            ;                                        2325
  2903.     CAMLE    AC1,SI%RETRIES
  2904.     JRST    L.75
  2905.     AOS    U.54                ;                                        2330
  2906.     PUSH    SP,C.6                ;                                        2332
  2907.     PUSH    SP,U.46
  2908.     PUSH    SP,U.55
  2909.     PUSHJ    SP,U.24
  2910.     ADJSP    SP,-3
  2911.     TRNN    AC1,1
  2912.     JRST    L.72
  2913.     PUSH    SP,C.26                ;                                        2339
  2914.     PUSHJ    SP,TT%SET%OUTPUT
  2915.     MOVE    AC14,AC1
  2916.     PUSHJ    SP,U.26                ;                                        2340
  2917.     MOVE    AC16,AC1
  2918.     PUSHJ    SP,TT%OUTPUT            ;                                        2341
  2919.     MOVEM    AC14,0(SP)            ;                                        2342
  2920.     PUSHJ    SP,TT%SET%OUTPUT
  2921.     CAIN    AC16,162            ;                                        2344
  2922.     JRST    L.74
  2923.     TRNE    AC16,1                ;                                        2346
  2924.     JRST    L.71
  2925.     CAIE    AC16,262            ;                                        2349
  2926.     CAIN    AC16,300
  2927.     JRST    L.69
  2928.     CAIN    AC16,172
  2929.     JRST    L.69
  2930.     MOVEI    AC1,23                ;                                        2354
  2931.     JRST    L.70
  2932. L.69:    MOVE    AC1,U.51
  2933. L.70:    ADJSP    SP,-1
  2934.     JRST    L.77                ;                                        2349
  2935. L.71:    MOVEI    AC1,131                ;                                        2360
  2936.     CAME    AC1,U.58
  2937.     JRST    L.76
  2938.     MOVE    AC1,U.56
  2939.     CAME    AC1,U.55
  2940.     JRST    L.76
  2941.     PUSHJ    SP,U.21                ;                                        2368
  2942.     MOVE    AC16,AC1
  2943.     TRNE    AC16,1
  2944.     JRST    L.73
  2945.     ADJSP    SP,-1
  2946. L.72:    MOVEI    AC1,12
  2947.     JRST    L.77
  2948. L.73:    SETZM    U.54                ;                                        2370
  2949.     MOVEI    AC1,1                ;                                        2371
  2950.     MOVEM    AC1,U.64
  2951. L.74:    ADJSP    SP,-1                ;                                        2372
  2952. L.75:    MOVEI    AC1,14                ;                                        2362
  2953.     JRST    L.77
  2954. L.76:    ADJSP    SP,-1                ;                                        2379
  2955.     MOVE    AC1,U.51            ;                                        2310
  2956. L.77:    POP    SP,AC16                ;                                        2272
  2957.     POP    SP,AC14
  2958.     POPJ    SP,
  2959. C.26:    XWD    0,U.76
  2960.  
  2961. ; Routine Size:  61 words
  2962.  
  2963.  
  2964. ;   2381  1    %SBTTL 'SEND%DATA'
  2965. ;   2382  1    ROUTINE SEND%DATA =
  2966. ;   2383  1
  2967. ;   2384  1    !++
  2968. ;   2385  1    ! FUNCTIONAL DESCRIPTION:
  2969. ;   2386  1    !
  2970. ;   2387  1    !    This routine will send a data message to the remote KERMIT.
  2971. ;   2388  1    !
  2972. ;   2389  1    ! CALLING SEQUENCE:
  2973. ;   2390  1    !
  2974. ;   2391  1    !    STATE = SEND%DATA();
  2975. ;   2392  1    !
  2976. ;   2393  1    ! INPUT PARAMETERS:
  2977. ;   2394  1    !
  2978. ;   2395  1    !    None.
  2979. ;   2396  1    !
  2980. ;   2397  1    ! IMPLICIT INPUTS:
  2981. ;   2398  1    !
  2982. ;   2399  1    !    None.
  2983. ;   2400  1    !
  2984. ;   2401  1    ! OUTPUT PARAMETERS:
  2985. ;   2402  1    !
  2986. ;   2403  1    !    New state to change the finite state machine to.
  2987. ;   2404  1    !
  2988. ;   2405  1    ! IMPLICIT OUTPUTS:
  2989. ;   2406  1    !
  2990. ;   2407  1    !    None.
  2991. ;   2408  1    !
  2992. ;   2409  1    ! COMPLETION CODES:
  2993. ;   2410  1    !
  2994. ;   2411  1    !    None.
  2995. ;   2412  1    !
  2996. ;   2413  1    ! SIDE EFFECTS:
  2997. ;   2414  1    !
  2998. ;   2415  1    !    None.
  2999. ;   2416  1    !
  3000. ;   2417  1    !--
  3001. ;   2418  1
  3002. ;   2419  2        BEGIN
  3003. ;   2420  2
  3004. ;   2421  2        LOCAL
  3005. ;   2422  2        SUB%TYPE,                ! Subtype for XFR%STATUS call
  3006. ;   2423  2        STATUS;                    ! Status returned by various routines
  3007. ;   2424  2
  3008. ;   2425  2    !
  3009. ;   2426  2    ! If there is nothing in the data packet, we should not bother to send it.
  3010. ;   2427  2    ! Instead, we will just call BFR%FILL again to get some more data
  3011. ;   2428  2    !
  3012. ;   2429  2
  3013. ;   2430  2        IF .SIZE NEQ 0            ! [108]
  3014. ;   2431  2        THEN
  3015. ;   2432  3        BEGIN
  3016. ;   2433  3    !
  3017. ;   2434  3    ! Check to see if the number of retries have been exceeded.
  3018. ;   2435  3    !
  3019. ;   2436  3
  3020. ;   2437  3        IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  3021. ;   2438  3
  3022. ;   2439  3    !
  3023. ;   2440  3    ! Not exceeded yet.  Increment the number of retries we have attempted
  3024. ;   2441  3    ! on this message.
  3025. ;   2442  3    !
  3026. ;   2443  3        NUM%RETRIES = .NUM%RETRIES + 1;
  3027. ;   2444  3    !
  3028. ;   2445  3    ! Attempt to send the packet and abort if the send fails.
  3029. ;   2446  3    !
  3030. ;   2447  3
  3031. ;   2448  3        IF NOT SEND%PACKET (MSG%DATA, .SIZE, .MSG%NUMBER) THEN RETURN STATE%EX;
  3032. ;   2449  3
  3033. ;   2450  3    !
  3034. ;   2451  3    ! Attempt to receive a message from the remote KERMIT.
  3035. ;   2452  3    !
  3036. ;   2453  3        STATUS = REC%PACKET ();
  3037. ;   2454  3
  3038. ;   2455  3        IF NOT .STATUS
  3039. ;   2456  3        THEN
  3040. ;   2457  4            BEGIN
  3041. ;   2458  4
  3042. ;   2459  5            IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL
  3043. ;   2460  5            KER%CHKSUMERR)
  3044. ;   2461  4            THEN
  3045. ;   2462  4            RETURN .STATE
  3046. ;   2463  4            ELSE
  3047. ;   2464  4            RETURN STATE%EX;
  3048. ;   2465  4
  3049. ;   2466  3            END;
  3050. ;   2467  3
  3051. ;   2468  3    !
  3052. ;   2469  3    ! Determine if the message is a NAK and the NAK is for the message number
  3053. ;   2470  3    ! that we are current working on.  If the NAK is for the next packet then
  3054. ;   2471  3    ! treat it like an ACK for this packet
  3055. ;   2472  3    !
  3056. ;   2473  3
  3057. ;   2474  4        IF .REC%TYPE EQL MSG%NAK AND (.REC%SEQ NEQ ((.MSG%NUMBER + 1) AND %O'77'))
  3058. ;   2475  3        THEN
  3059. ;   2476  3            RETURN .STATE;
  3060. ;   2477  3
  3061. ;   2478  3    !
  3062. ;   2479  3    ! Make sure we have a NAK or ACK
  3063. ;   2480  3    !
  3064. ;   2481  3
  3065. ;   2482  4        IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK)
  3066. ;   2483  3        THEN
  3067. ;   2484  3    !
  3068. ;   2485  3    ! Not an ACK or NAK, abort.
  3069. ;   2486  3    !
  3070. ;   2487  4            BEGIN
  3071. ;   2488  4            KRM%ERROR (KER%PROTOERR);
  3072. ;   2489  4            RETURN STATE%A;
  3073. ;   2490  3            END;
  3074. ;   2491  3
  3075. ;   2492  3    !
  3076. ;   2493  3    ! Is this for this message?
  3077. ;   2494  3    !
  3078. ;   2495  3
  3079. ;   2496  3        IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE;
  3080. ;   2497  3
  3081. ;   2498  3    !
  3082. ;   2499  3    ! It was.  Set up for sending the next data message to the remote KERMIT
  3083. ;   2500  3    ! and return.
  3084. ;   2501  3    !
  3085. ;   2502  3    !
  3086. ;   2503  3    ! Check for data field in ACK indicating abort file or stream
  3087. ;   2504  3    !
  3088. ;   2505  3    !
  3089. ;   2506  3
  3090. ;   2507  3        IF .REC%TYPE EQL MSG%ACK AND .REC%LENGTH EQL 1
  3091. ;   2508  3        THEN
  3092. ;   2509  3
  3093. ;   2510  3            SELECTONE CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG, CHR%SIZE)) OF ! [108]
  3094. ;   2511  3            SET
  3095. ;   2512  3
  3096. ;   2513  3            [MSG%ACK%ABT%CUR] :
  3097. ;   2514  3                ABT%CUR%FILE = TRUE;
  3098. ;   2515  3
  3099. ;   2516  3            [MSG%ACK%ABT%ALL] :
  3100. ;   2517  3                ABT%ALL%FILE = TRUE;
  3101. ;   2518  3            TES;
  3102. ;   2519  3
  3103. ;   2520  3        NUM%RETRIES = 0;
  3104. ;   2521  3        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  3105. ;   2522  2        END;                    ! End of IF .SIZE NEQ 0
  3106. ;   2523  2
  3107. ;   2524  3        IF (BFR%FILL (FALSE) EQL KER%NORMAL) AND NOT (.ABT%CUR%FILE OR .ABT%ALL%FILE)
  3108. ;   2525  2        THEN
  3109. ;   2526  2        RETURN STATE%SD
  3110. ;   2527  2        ELSE
  3111. ;   2528  3        BEGIN
  3112. ;   2529  3
  3113. ;   2530  3        IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  3114. ;   2531  3        THEN
  3115. ;   2532  4            BEGIN
  3116. ;   2533  4
  3117. ;   2534  4            IF .ABT%ALL%FILE
  3118. ;   2535  4            THEN
  3119. ;   2536  4            TT%TEXT (UPLIT (%ASCIZ' [Group interrupted]'))
  3120. ;   2537  4            ELSE
  3121. ;   2538  4
  3122. ;   2539  4            IF .ABT%CUR%FILE
  3123. ;   2540  4            THEN
  3124. ;   2541  4                TT%TEXT (UPLIT (%ASCIZ' [Interrupted]'))
  3125. ;   2542  4            ELSE
  3126. ;   2543  4                TT%TEXT (UPLIT (%ASCIZ' [OK]'));
  3127. ;   2544  4
  3128. ;   2545  4            TT%CRLF ();
  3129. ;   2546  3            END;
  3130. ;   2547  3
  3131. ;   2548  3        IF .FLAG%FILE%OPEN THEN FILE%CLOSE (FALSE);
  3132. ;   2549  3
  3133. ;   2550  3        SUB%TYPE = %C'C';            ! Assume ok
  3134. ;   2551  3
  3135. ;   2552  3        IF .ABT%ALL%FILE
  3136. ;   2553  3        THEN
  3137. ;   2554  3            SUB%TYPE = %C'Z'
  3138. ;   2555  3        ELSE
  3139. ;   2556  3
  3140. ;   2557  3            IF .ABT%CUR%FILE THEN SUB%TYPE = %C'X';
  3141. ;   2558  3
  3142. ;   2559  3        XFR%STATUS (%C'F', .SUB%TYPE);
  3143. ;   2560  3        FLAG%FILE%OPEN = FALSE;
  3144. ;   2561  3        RETURN STATE%SZ;
  3145. ;   2562  2        END;
  3146. ;   2563  2
  3147. ;   2564  1        END;
  3148.  
  3149.  
  3150. P.AAB:    BYTE    (7)" ","[","G","r","o"
  3151.     BYTE    (7)"u","p"," ","i","n"
  3152.     BYTE    (7)"t","e","r","r","u"
  3153.     BYTE    (7)"p","t","e","d","]"
  3154.     BYTE    (7)000,000,000,000,000
  3155. P.AAC:    BYTE    (7)" ","[","I","n","t"
  3156.     BYTE    (7)"e","r","r","u","p"
  3157.     BYTE    (7)"t","e","d","]",000
  3158. P.AAD:    BYTE    (7)" ","[","O","K","]"
  3159.     BYTE    (7)000,000,000,000,000
  3160.  
  3161.  
  3162. ; SEND%DATA
  3163. U.3:    MOVE    AC1,U.52            ;                                        2430
  3164.     JUMPE    AC1,L.87
  3165.     MOVE    AC2,U.54            ;                                        2437
  3166.     CAMG    AC2,PKT%RETRIES
  3167.     JRST    L.78
  3168.     MOVEI    AC1,24
  3169.     POPJ    SP,
  3170. L.78:    AOS    U.54                ;                                        2443
  3171.     PUSH    SP,C.28                ;                                        2448
  3172.     PUSH    SP,AC1
  3173.     PUSH    SP,U.55
  3174.     PUSHJ    SP,U.24
  3175.     ADJSP    SP,-3
  3176.     TRNN    AC1,1
  3177.     JRST    L.79
  3178.     PUSHJ    SP,U.26                ;                                        2453
  3179.     TRNE    AC1,1                ;                                        2455
  3180.     JRST    L.80
  3181.     CAIE    AC1,262                ;                                        2459
  3182.     CAIN    AC1,300
  3183.     JRST    L.83
  3184.     CAIN    AC1,172
  3185.     JRST    L.83                ;                                        2462
  3186. L.79:    MOVEI    AC1,23                ;                                        2464
  3187.     POPJ    SP,                ;                                        2457
  3188. L.80:    MOVE    AC2,U.58            ;                                        2474
  3189.     SETZ    AC3,
  3190.     CAIE    AC2,116
  3191.     JRST    L.81
  3192.     MOVEI    AC3,1
  3193.     MOVE    AC1,U.55
  3194.     ADDI    AC1,1
  3195.     LDB    AC4,C.18
  3196.     CAME    AC4,U.56
  3197.     JRST    L.83
  3198. L.81:    CAIE    AC2,131                ;                                        2482
  3199.     TRNE    AC3,1
  3200.     JRST    L.82
  3201.     PUSH    SP,C.21                ;                                        2488
  3202.     PUSHJ    SP,KRM%ERROR
  3203.     ADJSP    SP,-1                ;                                        2489
  3204.     MOVEI    AC1,12                ;                                        2487
  3205.     POPJ    SP,
  3206. L.82:    SETZ    AC1,                ;                                        2496
  3207.     MOVEI    AC2,131
  3208.     CAME    AC2,U.58
  3209.     JRST    L.84
  3210.     MOVEI    AC1,1
  3211.     MOVE    AC2,U.56
  3212.     CAMN    AC2,U.55
  3213.     JRST    L.84
  3214. L.83:    MOVE    AC1,U.51
  3215.     POPJ    SP,
  3216. L.84:    TRNN    AC1,1                ;                                        2507
  3217.     JRST    L.86
  3218.     MOVEI    AC1,1
  3219.     CAME    AC1,U.57
  3220.     JRST    L.86
  3221.     MOVE    AC2,C.27            ;                                        2510
  3222.     MOVE    AC1,U.39
  3223.     ADJBP    AC1,AC2
  3224.     ILDB    AC1,AC1
  3225.     CAIE    AC1,130                ;                                        2513
  3226.     JRST    L.85
  3227.     MOVEI    AC2,1                ;                                        2514
  3228.     MOVEM    AC2,ABT%CUR%FILE
  3229.     JRST    L.86                ;                                        2510
  3230. L.85:    CAIE    AC1,132                ;                                        2516
  3231.     JRST    L.86
  3232.     MOVEI    AC1,1                ;                                        2517
  3233.     MOVEM    AC1,ABT%ALL%FILE
  3234. L.86:    SETZM    U.54                ;                                        2520
  3235.     MOVE    AC1,U.55            ;                                        2521
  3236.     ADDI    AC1,1
  3237.     LDB    AC2,C.18
  3238.     MOVEM    AC2,U.55
  3239. L.87:    PUSH    SP,C.25                ;                                        2524
  3240.     PUSHJ    SP,U.29
  3241.     ADJSP    SP,-1
  3242.     CAIE    AC1,13
  3243.     JRST    L.88
  3244.     MOVEI    AC1,1
  3245.     TDNE    AC1,ABT%CUR%FILE
  3246.     JRST    L.88
  3247.     MOVEI    AC1,1
  3248.     TDNE    AC1,ABT%ALL%FILE
  3249.     JRST    L.88
  3250.     MOVEI    AC1,3                ;                                        2528
  3251.     POPJ    SP,
  3252. L.88:    MOVEI    AC1,1                ;                                        2530
  3253.     TDNE    AC1,CONNECT%FLAG
  3254.     JRST    L.92
  3255.     MOVEI    AC1,1
  3256.     TDNN    AC1,TY%FIL
  3257.     JRST    L.92
  3258.     MOVEI    AC1,1                ;                                        2534
  3259.     TDNN    AC1,ABT%ALL%FILE
  3260.     JRST    L.89
  3261.     PUSH    SP,C.29                ;                                        2536
  3262.     JRST    L.91
  3263. L.89:    MOVEI    AC1,1                ;                                        2539
  3264.     TDNN    AC1,ABT%CUR%FILE
  3265.     JRST    L.90
  3266.     PUSH    SP,C.30                ;                                        2541
  3267.     JRST    L.91
  3268. L.90:    PUSH    SP,C.31                ;                                        2543
  3269. L.91:    PUSHJ    SP,TT%TEXT
  3270.     PUSHJ    SP,TT%CRLF            ;                                        2545
  3271.     ADJSP    SP,-1                ;                                        2532
  3272. L.92:    MOVEI    AC1,1                ;                                        2548
  3273.     TDNN    AC1,FLAG%FILE%OPEN
  3274.     JRST    L.93
  3275.     PUSH    SP,C.25
  3276.     PUSHJ    SP,FILE%CLOSE
  3277.     ADJSP    SP,-1
  3278. L.93:    MOVEI    AC1,103                ;                                        2550
  3279.     MOVEI    AC2,1                ;                                        2552
  3280.     TDNN    AC2,ABT%ALL%FILE
  3281.     JRST    L.94
  3282.     MOVEI    AC1,132                ;                                        2554
  3283.     JRST    L.95                ;                                        2552
  3284. L.94:    MOVEI    AC2,1                ;                                        2557
  3285.     TDNE    AC2,ABT%CUR%FILE
  3286.     MOVEI    AC1,130
  3287. L.95:    PUSH    SP,C.15                ;                                        2559
  3288.     PUSH    SP,AC1
  3289.     PUSHJ    SP,XFR%STATUS
  3290.     SETZM    FLAG%FILE%OPEN            ;                                        2560
  3291.     ADJSP    SP,-2                ;                                        2528
  3292.     MOVEI    AC1,4
  3293.     POPJ    SP,                ;                                        2382
  3294. C.27:    POINT    8,U.59,-1
  3295. C.28:    EXP    104
  3296. C.29:    XWD    0,P.AAB
  3297. C.30:    XWD    0,P.AAC
  3298. C.31:    XWD    0,P.AAD
  3299.  
  3300. ; Routine Size:  136 words
  3301.  
  3302.  
  3303. ;   2565  1    %SBTTL 'SEND%FILE'
  3304. ;   2566  1    ROUTINE SEND%FILE =
  3305. ;   2567  1
  3306. ;   2568  1    !++
  3307. ;   2569  1    ! FUNCTIONAL DESCRIPTION:
  3308. ;   2570  1    !
  3309. ;   2571  1    !    This routine will send the file specification that is being
  3310. ;   2572  1    !    transfered, or it will send a text header message.
  3311. ;   2573  1    !
  3312. ;   2574  1    ! CALLING SEQUENCE:
  3313. ;   2575  1    !
  3314. ;   2576  1    !    STATE = SEND%FILE();
  3315. ;   2577  1    !
  3316. ;   2578  1    ! INPUT PARAMETERS:
  3317. ;   2579  1    !
  3318. ;   2580  1    !    None.
  3319. ;   2581  1    !
  3320. ;   2582  1    ! IMPLICIT INPUTS:
  3321. ;   2583  1    !
  3322. ;   2584  1    !    TEXT%HEAD%FLAG - If true, send text header instead of file header
  3323. ;   2585  1    !
  3324. ;   2586  1    ! OUTPUT PARAMETERS:
  3325. ;   2587  1    !
  3326. ;   2588  1    !    New state to change the finite state machine to.
  3327. ;   2589  1    !
  3328. ;   2590  1    ! IMPLICIT OUTPUTS:
  3329. ;   2591  1    !
  3330. ;   2592  1    !    None.
  3331. ;   2593  1    !
  3332. ;   2594  1    ! COMPLETION CODES:
  3333. ;   2595  1    !
  3334. ;   2596  1    !    None.
  3335. ;   2597  1    !
  3336. ;   2598  1    ! SIDE EFFECTS:
  3337. ;   2599  1    !
  3338. ;   2600  1    !    None.
  3339. ;   2601  1    !
  3340. ;   2602  1    !--
  3341. ;   2603  1
  3342. ;   2604  2        BEGIN
  3343. ;   2605  2
  3344. ;   2606  2        LOCAL
  3345. ;   2607  2        M%TYPE,                    ! Message type to send
  3346. ;   2608  2        STATUS;                    ! Status returned by various routines
  3347. ;   2609  2
  3348. ;   2610  2    !
  3349. ;   2611  2    ! Flag we don't want to abort yet
  3350. ;   2612  2    !
  3351. ;   2613  2        ABT%CUR%FILE = FALSE;
  3352. ;   2614  2        ABT%ALL%FILE = FALSE;
  3353. ;   2615  2    !
  3354. ;   2616  2    ! First determine if we have exceed the number of retries that are
  3355. ;   2617  2    ! allowed to attempt to send this message.
  3356. ;   2618  2    !
  3357. ;   2619  2
  3358. ;   2620  2        IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  3359. ;   2621  2
  3360. ;   2622  2    !
  3361. ;   2623  2    ! The number of retries are not exceeded.  Increment the number and then
  3362. ;   2624  2    ! attempt to send the packet again.
  3363. ;   2625  2    !
  3364. ;   2626  2        NUM%RETRIES = .NUM%RETRIES + 1;
  3365. ;   2627  2        SIZE = 0;                    ! Assume no name
  3366. ;   2628  2
  3367. ;   2629  2        IF .TEXT%HEAD%FLAG THEN M%TYPE = MSG%TEXT ELSE M%TYPE = MSG%FILE;
  3368. ;   2630  2
  3369. ;   2631  2        IF .FILE%SIZE NEQ 0 AND NOT .NO%FILE%NEEDED
  3370. ;   2632  2        THEN
  3371. ;   2633  3        BEGIN
  3372. ;   2634  3    ![025]    CH$MOVE (.FILE%SIZE, CH$PTR (FILE%NAME),
  3373. ;   2635  3    ![025]        CH$PTR (SND%MSG, PKT%MSG,
  3374. ;   2636  3    ![025]        CHR%SIZE));
  3375. ;   2637  3    ![025]
  3376. ;   2638  3    ![025] Fill packet with file name
  3377. ;   2639  3    ![025]
  3378. ;   2640  3        SET%STRING (CH$PTR (FILE%NAME), .FILE%SIZE, TRUE);
  3379. ;   2641  3        BFR%FILL (TRUE);
  3380. ;   2642  3        SET%STRING (0, 0, FALSE);
  3381. ;   2643  2        END;
  3382. ;   2644  2
  3383. ;   2645  2        IF NOT SEND%PACKET (.M%TYPE, .SIZE, .MSG%NUMBER) THEN RETURN STATE%EX;
  3384. ;   2646  2
  3385. ;   2647  2    !
  3386. ;   2648  2    ! Now get the responce from the remote KERMIT.
  3387. ;   2649  2    !
  3388. ;   2650  2        STATUS = REC%PACKET ();
  3389. ;   2651  2
  3390. ;   2652  2        IF NOT .STATUS
  3391. ;   2653  2        THEN
  3392. ;   2654  3        BEGIN
  3393. ;   2655  3
  3394. ;   2656  4        IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR(.STATUS EQL KER%CHKSUMERR)
  3395. ;   2657  3        THEN
  3396. ;   2658  3            RETURN .STATE
  3397. ;   2659  3        ELSE
  3398. ;   2660  3            RETURN STATE%EX;
  3399. ;   2661  3
  3400. ;   2662  2        END;
  3401. ;   2663  2
  3402. ;   2664  2    !
  3403. ;   2665  2    ! Determine if the packet is good.
  3404. ;   2666  2    !
  3405. ;   2667  2
  3406. ;   2668  3        IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK)
  3407. ;   2669  2        THEN
  3408. ;   2670  3        BEGIN
  3409. ;   2671  3        KRM%ERROR (KER%PROTOERR);
  3410. ;   2672  3        RETURN STATE%A;
  3411. ;   2673  2        END;
  3412. ;   2674  2
  3413. ;   2675  2    !
  3414. ;   2676  2    ! If this is a NAK and the message number is not the one we just send
  3415. ;   2677  2    ! treat this like an ACK, otherwise resend the last packet.
  3416. ;   2678  2    !
  3417. ;   2679  2
  3418. ;   2680  2        IF .REC%TYPE EQL MSG%NAK AND (.REC%SEQ NEQ ((.MSG%NUMBER + 1) AND %O'77')) THEN RETURN .STATE;
  3419. ;   2681  2
  3420. ;   2682  2        IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE;
  3421. ;   2683  2
  3422. ;   2684  2    !
  3423. ;   2685  2    ! If all is ok, bump the message number and fill first buffer
  3424. ;   2686  2    !
  3425. ;   2687  2        NUM%RETRIES = 0;
  3426. ;   2688  2        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  3427. ;   2689  2
  3428. ;   2690  2        IF BFR%FILL (TRUE) THEN RETURN STATE%SD ELSE RETURN STATE%A;
  3429. ;   2691  2
  3430. ;   2692  1        END;                    ! End of SEND%FILE
  3431.  
  3432.  
  3433. ; SEND%FILE
  3434. U.4:    PUSH    SP,AC16                ;                                        2566
  3435.     SETZM    ABT%CUR%FILE            ;                                        2613
  3436.     SETZM    ABT%ALL%FILE            ;                                        2614
  3437.     MOVE    AC1,U.54            ;                                        2620
  3438.     CAMG    AC1,PKT%RETRIES
  3439.     JRST    L.96
  3440.     MOVEI    AC1,24
  3441.     JRST    L.107
  3442. L.96:    AOS    U.54                ;                                        2626
  3443.     SETZM    U.52                ;                                        2627
  3444.     MOVEI    AC1,1                ;                                        2629
  3445.     TDNN    AC1,U.62
  3446.     JRST    L.97
  3447.     MOVEI    AC16,130
  3448.     JRST    L.98
  3449. L.97:    MOVEI    AC16,106
  3450. L.98:    MOVE    AC1,FILE%SIZE            ;                                        2631
  3451.     JUMPE    AC1,L.99
  3452.     MOVEI    AC2,1
  3453.     TDNE    AC2,U.63
  3454.     JRST    L.99
  3455.     PUSH    SP,C.10                ;                                        2640
  3456.     PUSH    SP,AC1
  3457.     PUSH    SP,C.2
  3458.     PUSHJ    SP,U.30
  3459.     PUSH    SP,C.2                ;                                        2641
  3460.     PUSHJ    SP,U.29
  3461.     SETZM    -2(SP)                ;                                        2642
  3462.     SETZM    -1(SP)
  3463.     SETZM    0(SP)
  3464.     PUSHJ    SP,U.30
  3465.     ADJSP    SP,-4                ;                                        2633
  3466. L.99:    PUSH    SP,AC16                ;                                        2645
  3467.     PUSH    SP,U.52
  3468.     PUSH    SP,U.55
  3469.     PUSHJ    SP,U.24
  3470.     ADJSP    SP,-3
  3471.     TRNN    AC1,1
  3472.     JRST    L.100
  3473.     PUSHJ    SP,U.26                ;                                        2650
  3474.     TRNE    AC1,1                ;                                        2652
  3475.     JRST    L.101
  3476.     CAIE    AC1,262                ;                                        2656
  3477.     CAIN    AC1,300
  3478.     JRST    L.104
  3479.     CAIN    AC1,172
  3480.     JRST    L.104                ;                                        2658
  3481. L.100:    MOVEI    AC1,23                ;                                        2660
  3482.     JRST    L.107                ;                                        2654
  3483. L.101:    MOVE    AC1,U.58            ;                                        2668
  3484.     CAIE    AC1,131
  3485.     CAIN    AC1,116
  3486.     JRST    L.102
  3487.     PUSH    SP,C.21                ;                                        2671
  3488.     PUSHJ    SP,KRM%ERROR
  3489.     ADJSP    SP,-1                ;                                        2672
  3490.     JRST    L.106
  3491. L.102:    MOVE    AC2,U.58            ;                                        2680
  3492.     CAIE    AC2,116
  3493.     JRST    L.103
  3494.     MOVE    AC1,U.55
  3495.     ADDI    AC1,1
  3496.     LDB    AC3,C.18
  3497.     CAME    AC3,U.56
  3498.     JRST    L.104
  3499. L.103:    CAIE    AC2,131                ;                                        2682
  3500.     JRST    L.105
  3501.     MOVE    AC1,U.56
  3502.     CAMN    AC1,U.55
  3503.     JRST    L.105
  3504. L.104:    MOVE    AC1,U.51
  3505.     JRST    L.107
  3506. L.105:    SETZM    U.54                ;                                        2687
  3507.     MOVE    AC1,U.55            ;                                        2688
  3508.     ADDI    AC1,1
  3509.     LDB    AC2,C.18
  3510.     MOVEM    AC2,U.55
  3511.     PUSH    SP,C.2                ;                                        2690
  3512.     PUSHJ    SP,U.29
  3513.     ADJSP    SP,-1
  3514.     TRNN    AC1,1
  3515.     JRST    L.106
  3516.     MOVEI    AC1,3
  3517.     JRST    L.107
  3518. L.106:    MOVEI    AC1,12
  3519. L.107:    POP    SP,AC16                ;                                        2566
  3520.     POPJ    SP,
  3521.  
  3522. ; Routine Size:  87 words
  3523.  
  3524.  
  3525. ;   2693  1    %SBTTL 'SEND%EOF'
  3526. ;   2694  1    ROUTINE SEND%EOF =
  3527. ;   2695  1
  3528. ;   2696  1    !++
  3529. ;   2697  1    ! FUNCTIONAL DESCRIPTION:
  3530. ;   2698  1    !
  3531. ;   2699  1    !    This routine will send the end of file message to the remote
  3532. ;   2700  1    !    KERMIT.  It will then determine if there are more files to
  3533. ;   2701  1    !    send to the remote.
  3534. ;   2702  1    !
  3535. ;   2703  1    ! CALLING SEQUENCE:
  3536. ;   2704  1    !
  3537. ;   2705  1    !    STATE = SEND%EOF();
  3538. ;   2706  1    !
  3539. ;   2707  1    ! INPUT PARAMETERS:
  3540. ;   2708  1    !
  3541. ;   2709  1    !    None.
  3542. ;   2710  1    !
  3543. ;   2711  1    ! IMPLICIT INPUTS:
  3544. ;   2712  1    !
  3545. ;   2713  1    !    None.
  3546. ;   2714  1    !
  3547. ;   2715  1    ! OUTPUT PARAMETERS:
  3548. ;   2716  1    !
  3549. ;   2717  1    !    New state to change the finite state machine to.
  3550. ;   2718  1    !
  3551. ;   2719  1    ! IMPLICIT OUTPUTS:
  3552. ;   2720  1    !
  3553. ;   2721  1    !    None.
  3554. ;   2722  1    !
  3555. ;   2723  1    ! COMPLETION CODES:
  3556. ;   2724  1    !
  3557. ;   2725  1    !    None.
  3558. ;   2726  1    !
  3559. ;   2727  1    ! SIDE EFFECTS:
  3560. ;   2728  1    !
  3561. ;   2729  1    !    Sets up for the next file to be processed if there is one.
  3562. ;   2730  1    !
  3563. ;   2731  1    !--
  3564. ;   2732  1
  3565. ;   2733  2        BEGIN
  3566. ;   2734  2
  3567. ;   2735  2        LOCAL
  3568. ;   2736  2        STATUS,                    ! Status returned by various routines
  3569. ;   2737  2        EOF%MSG%LEN;                ! Length of EOF message to send
  3570. ;   2738  2
  3571. ;   2739  2    !
  3572. ;   2740  2    ! First determine if we have exceed the number of retries that are
  3573. ;   2741  2    ! allowed to attempt to send this message.
  3574. ;   2742  2    !
  3575. ;   2743  2
  3576. ;   2744  2        IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  3577. ;   2745  2
  3578. ;   2746  2    !
  3579. ;   2747  2    ! The number of retries are not exceeded.  Increment the number and then
  3580. ;   2748  2    ! attempt to send the packet again.
  3581. ;   2749  2    !
  3582. ;   2750  2        NUM%RETRIES = .NUM%RETRIES + 1;
  3583. ;   2751  2    !
  3584. ;   2752  2    ! Store character in packet to indicate discard of file
  3585. ;   2753  2    ! Character will only be sent if file should be discarded
  3586. ;   2754  2    !
  3587. ;   2755  2        CH$WCHAR (MSG%EOF%DISCARD, CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE));
  3588. ;   2756  2
  3589. ;   2757  2        IF .ABT%CUR%FILE OR .ABT%ALL%FILE THEN EOF%MSG%LEN = 1 ELSE EOF%MSG%LEN = 0;
  3590. ;   2758  2
  3591. ;   2759  2        IF NOT SEND%PACKET (MSG%EOF, .EOF%MSG%LEN, .MSG%NUMBER) THEN RETURN STATE%EX;
  3592. ;   2760  2
  3593. ;   2761  2    !
  3594. ;   2762  2    ! Now get the responce from the remote KERMIT.
  3595. ;   2763  2    !
  3596. ;   2764  2        STATUS = REC%PACKET ();
  3597. ;   2765  2
  3598. ;   2766  2        IF NOT .STATUS
  3599. ;   2767  2        THEN
  3600. ;   2768  3        BEGIN
  3601. ;   2769  3
  3602. ;   2770  4        IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR(.STATUS EQL KER%CHKSUMERR)
  3603. ;   2771  3        THEN
  3604. ;   2772  3            RETURN .STATE
  3605. ;   2773  3        ELSE
  3606. ;   2774  3            RETURN STATE%EX;
  3607. ;   2775  3
  3608. ;   2776  2        END;
  3609. ;   2777  2
  3610. ;   2778  2    !
  3611. ;   2779  2    ! Determine if the packet is good.
  3612. ;   2780  2    !
  3613. ;   2781  2
  3614. ;   2782  3        IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK)
  3615. ;   2783  2        THEN
  3616. ;   2784  3        BEGIN
  3617. ;   2785  3        KRM%ERROR (KER%PROTOERR);
  3618. ;   2786  3        RETURN STATE%A;
  3619. ;   2787  2        END;
  3620. ;   2788  2
  3621. ;   2789  2    !
  3622. ;   2790  2    ! If this is a NAK and the message number is not the one we just send
  3623. ;   2791  2    ! treat this like an ACK, otherwise resend the last packet.
  3624. ;   2792  2    !
  3625. ;   2793  2
  3626. ;   2794  2        IF .REC%TYPE EQL MSG%NAK AND (.REC%SEQ NEQ ((.MSG%NUMBER + 1) AND %O'77')) THEN RETURN .STATE;
  3627. ;   2795  2
  3628. ;   2796  2        IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE;
  3629. ;   2797  2
  3630. ;   2798  2    !
  3631. ;   2799  2    ! Here to determine if there is another file to send.
  3632. ;   2800  2    !
  3633. ;   2801  2        NUM%RETRIES = 0;
  3634. ;   2802  2        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  3635. ;   2803  2
  3636. ;   2804  2        IF NOT .ABT%ALL%FILE THEN STATUS = NEXT%FILE () ELSE STATUS = KER%NOMORFILES;
  3637. ;   2805  2
  3638. ;   2806  3        IF ( NOT .STATUS) OR (.STATUS EQL KER%NOMORFILES)
  3639. ;   2807  2        THEN
  3640. ;   2808  3        BEGIN
  3641. ;   2809  3
  3642. ;   2810  3        IF (.STATUS NEQ KER%NOMORFILES) THEN RETURN STATE%A ELSE RETURN STATE%SB;
  3643. ;   2811  3
  3644. ;   2812  3        END
  3645. ;   2813  2        ELSE
  3646. ;   2814  3        BEGIN
  3647. ;   2815  3        FLAG%FILE%OPEN = TRUE;            ! Have a file open again
  3648. ;   2816  3
  3649. ;   2817  3        IF .FIL%NORMAL%FORM THEN NORMALIZE%FILE (FILE%NAME, FILE%SIZE, -1, -1);
  3650. ;   2818  3
  3651. ;   2819  3        XFR%STATUS (%C'F', %C'S');        ! Inform display routine
  3652. ;   2820  3
  3653. ;   2821  3        IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  3654. ;   2822  3        THEN
  3655. ;   2823  4            BEGIN
  3656. ;   2824  4    !![045]        TT%TEXT (UPLIT (%ASCIZ'Sending: '));
  3657. ;   2825  4            TT%TEXT (FILE%NAME);
  3658. ;   2826  4            TT%OUTPUT ();
  3659. ;   2827  3            END;
  3660. ;   2828  3
  3661. ;   2829  3        FILE%CHARS = 0;                ! No characters sent yet
  3662. ;   2830  3        RETURN STATE%SF;
  3663. ;   2831  2        END;
  3664. ;   2832  2
  3665. ;   2833  1        END;                    ! End of SEND%EOF
  3666.  
  3667.  
  3668. ; SEND%EOF
  3669. U.7:    PUSH    SP,AC16                ;                                        2694
  3670.     MOVE    AC1,U.54            ;                                        2744
  3671.     CAMG    AC1,PKT%RETRIES
  3672.     JRST    L.108
  3673.     MOVEI    AC1,24
  3674.     JRST    L.125
  3675. L.108:    AOS    U.54                ;                                        2750
  3676.     MOVEI    AC2,104                ;                                        2755
  3677.     MOVE    AC1,C.32
  3678.     IDPB    AC2,AC1
  3679.     MOVEI    AC1,1                ;                                        2757
  3680.     TDNE    AC1,ABT%CUR%FILE
  3681.     JRST    L.109
  3682.     MOVEI    AC1,1
  3683.     TDNN    AC1,ABT%ALL%FILE
  3684.     JRST    L.110
  3685. L.109:    MOVEI    AC1,1
  3686.     JRST    L.111
  3687. L.110:    SETZ    AC1,
  3688. L.111:    PUSH    SP,C.33                ;                                        2759
  3689.     PUSH    SP,AC1
  3690.     PUSH    SP,U.55
  3691.     PUSHJ    SP,U.24
  3692.     ADJSP    SP,-3
  3693.     TRNN    AC1,1
  3694.     JRST    L.112
  3695.     PUSHJ    SP,U.26                ;                                        2764
  3696.     MOVE    AC16,AC1
  3697.     TRNE    AC16,1                ;                                        2766
  3698.     JRST    L.113
  3699.     CAIE    AC16,262            ;                                        2770
  3700.     CAIN    AC16,300
  3701.     JRST    L.116
  3702.     CAIN    AC16,172
  3703.     JRST    L.116                ;                                        2772
  3704. L.112:    MOVEI    AC1,23                ;                                        2774
  3705.     JRST    L.125                ;                                        2768
  3706. L.113:    MOVE    AC1,U.58            ;                                        2782
  3707.     CAIE    AC1,131
  3708.     CAIN    AC1,116
  3709.     JRST    L.114
  3710.     PUSH    SP,C.21                ;                                        2785
  3711.     PUSHJ    SP,KRM%ERROR
  3712.     ADJSP    SP,-1                ;                                        2786
  3713.     JRST    L.120
  3714. L.114:    MOVE    AC2,U.58            ;                                        2794
  3715.     CAIE    AC2,116
  3716.     JRST    L.115
  3717.     MOVE    AC1,U.55
  3718.     ADDI    AC1,1
  3719.     LDB    AC3,C.18
  3720.     CAME    AC3,U.56
  3721.     JRST    L.116
  3722. L.115:    CAIE    AC2,131                ;                                        2796
  3723.     JRST    L.117
  3724.     MOVE    AC1,U.56
  3725.     CAMN    AC1,U.55
  3726.     JRST    L.117
  3727. L.116:    MOVE    AC1,U.51
  3728.     JRST    L.125
  3729. L.117:    SETZM    U.54                ;                                        2801
  3730.     MOVE    AC1,U.55            ;                                        2802
  3731.     ADDI    AC1,1
  3732.     LDB    AC2,C.18
  3733.     MOVEM    AC2,U.55
  3734.     MOVEI    AC1,1                ;                                        2804
  3735.     TDNE    AC1,ABT%ALL%FILE
  3736.     JRST    L.118
  3737.     PUSHJ    SP,NEXT%FILE
  3738.     SKIPA    AC16,AC1
  3739. L.118:    MOVEI    AC16,133
  3740.     TRNN    AC16,1                ;                                        2806
  3741.     JRST    L.119
  3742.     CAIE    AC16,133
  3743.     JRST    L.122
  3744. L.119:    CAIN    AC16,133            ;                                        2810
  3745.     JRST    L.121
  3746. L.120:    MOVEI    AC1,12
  3747.     JRST    L.125
  3748. L.121:    MOVEI    AC1,5
  3749.     JRST    L.125                ;                                        2814
  3750. L.122:    MOVEI    AC1,1                ;                                        2815
  3751.     MOVEM    AC1,FLAG%FILE%OPEN
  3752.     MOVEI    AC1,1                ;                                        2817
  3753.     TDNN    AC1,FIL%NORMAL%FORM
  3754.     JRST    L.123
  3755.     PUSH    SP,C.34
  3756.     PUSH    SP,C.35
  3757.     PUSH    SP,C.36
  3758.     PUSH    SP,C.36
  3759.     PUSHJ    SP,U.27
  3760.     ADJSP    SP,-4
  3761. L.123:    PUSH    SP,C.15                ;                                        2819
  3762.     PUSH    SP,C.8
  3763.     PUSHJ    SP,XFR%STATUS
  3764.     MOVEI    AC1,1                ;                                        2821
  3765.     TDNE    AC1,CONNECT%FLAG
  3766.     JRST    L.124
  3767.     MOVEI    AC1,1
  3768.     TDNN    AC1,TY%FIL
  3769.     JRST    L.124
  3770.     PUSH    SP,C.34                ;                                        2825
  3771.     PUSHJ    SP,TT%TEXT
  3772.     PUSHJ    SP,TT%OUTPUT            ;                                        2826
  3773.     ADJSP    SP,-1                ;                                        2823
  3774. L.124:    SETZM    U.61                ;                                        2829
  3775.     ADJSP    SP,-2                ;                                        2814
  3776.     MOVEI    AC1,2
  3777. L.125:    POP    SP,AC16                ;                                        2694
  3778.     POPJ    SP,
  3779. C.32:    POINT    8,U.60,31
  3780. C.33:    EXP    132
  3781. C.34:    XWD    0,FILE%NAME
  3782. C.35:    XWD    0,FILE%SIZE
  3783. C.36:    EXP    -1
  3784.  
  3785. ; Routine Size:  115 words
  3786.  
  3787.  
  3788. ;   2834  1    %SBTTL 'SEND%INIT'
  3789. ;   2835  1    ROUTINE SEND%INIT =
  3790. ;   2836  1
  3791. ;   2837  1    !++
  3792. ;   2838  1    ! FUNCTIONAL DESCRIPTION:
  3793. ;   2839  1    !
  3794. ;   2840  1    !    This routine will send the initialization packet to the remote
  3795. ;   2841  1    !    KERMIT.  The message type sent is S.
  3796. ;   2842  1    !
  3797. ;   2843  1    ! CALLING SEQUENCE:
  3798. ;   2844  1    !
  3799. ;   2845  1    !    STATE = SEND%INIT();
  3800. ;   2846  1    !
  3801. ;   2847  1    ! INPUT PARAMETERS:
  3802. ;   2848  1    !
  3803. ;   2849  1    !    None.
  3804. ;   2850  1    !
  3805. ;   2851  1    ! IMPLICIT INPUTS:
  3806. ;   2852  1    !
  3807. ;   2853  1    !    None.
  3808. ;   2854  1    !
  3809. ;   2855  1    ! OUTPUT PARAMETERS:
  3810. ;   2856  1    !
  3811. ;   2857  1    !    New state to change the finite state machine to.
  3812. ;   2858  1    !
  3813. ;   2859  1    ! IMPLICIT OUTPUTS:
  3814. ;   2860  1    !
  3815. ;   2861  1    !    None.
  3816. ;   2862  1    !
  3817. ;   2863  1    ! COMPLETION CODES:
  3818. ;   2864  1    !
  3819. ;   2865  1    !    None.
  3820. ;   2866  1    !
  3821. ;   2867  1    ! SIDE EFFECTS:
  3822. ;   2868  1    !
  3823. ;   2869  1    !    None.
  3824. ;   2870  1    !
  3825. ;   2871  1    !--
  3826. ;   2872  1
  3827. ;   2873  2        BEGIN
  3828. ;   2874  2
  3829. ;   2875  2        LOCAL
  3830. ;   2876  2        STATUS;                    ! Status returned by various routines
  3831. ;   2877  2
  3832. ;   2878  2        SET%SEND%INIT ();
  3833. ;   2879  2
  3834. ;   2880  2        IF .NUM%RETRIES GTR .SI%RETRIES THEN RETURN STATE%ER;
  3835. ;   2881  2
  3836. ;   2882  2    !
  3837. ;   2883  2    ! Count the number of times we try this
  3838. ;   2884  2    !
  3839. ;   2885  2        NUM%RETRIES = .NUM%RETRIES + 1;
  3840. ;   2886  2
  3841. ;   2887  2        IF NOT SEND%PACKET (MSG%SND%INIT, .SEND%INIT%SIZE, .MSG%NUMBER) THEN RETURN STATE%EX; ! [108]
  3842. ;   2888  2
  3843. ;   2889  2    !
  3844. ;   2890  2    ! Determine if we received a packet it good condition.  If we timed out or
  3845. ;   2891  2    ! got an illegal message, just try again.
  3846. ;   2892  2    !
  3847. ;   2893  2        STATUS = REC%PACKET ();
  3848. ;   2894  2
  3849. ;   2895  2        IF NOT .STATUS
  3850. ;   2896  2        THEN
  3851. ;   2897  3        BEGIN
  3852. ;   2898  3
  3853. ;   2899  4        IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR(.STATUS EQL KER%CHKSUMERR)
  3854. ;   2900  3        THEN
  3855. ;   2901  3            RETURN .STATE
  3856. ;   2902  3        ELSE
  3857. ;   2903  3            RETURN STATE%EX;
  3858. ;   2904  3
  3859. ;   2905  2        END;
  3860. ;   2906  2
  3861. ;   2907  2    !
  3862. ;   2908  2    ! Determine if the packet is good.
  3863. ;   2909  2    !
  3864. ;   2910  2
  3865. ;   2911  2        IF .REC%TYPE NEQ MSG%ACK THEN RETURN .STATE;
  3866. ;   2912  2
  3867. ;   2913  2        IF .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE;
  3868. ;   2914  2
  3869. ;   2915  2    !
  3870. ;   2916  2    ! Here if we have an ACK for the initialization message that was just sent
  3871. ;   2917  2    ! to the remote KERMIT.
  3872. ;   2918  2    !
  3873. ;   2919  2
  3874. ;   2920  2        IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN STATE%A;
  3875. ;   2921  2
  3876. ;   2922  2        BLK%CHK%TYPE = .INI%CHK%TYPE;        ! We now use agreed upon block check type
  3877. ;   2923  2        NUM%RETRIES = 0;
  3878. ;   2924  2        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  3879. ;   2925  2        RETURN STATE%OF;                ! Now need to open the file
  3880. ;   2926  1        END;
  3881.  
  3882.  
  3883. ; SEND%INIT
  3884. U.8:    PUSHJ    SP,U.20                ;                                        2878
  3885.     MOVE    AC1,U.54            ;                                        2880
  3886.     CAMG    AC1,SI%RETRIES
  3887.     JRST    L.126
  3888.     MOVEI    AC1,24
  3889.     POPJ    SP,
  3890. L.126:    AOS    U.54                ;                                        2885
  3891.     PUSH    SP,C.8                ;                                        2887
  3892.     PUSH    SP,U.46
  3893.     PUSH    SP,U.55
  3894.     PUSHJ    SP,U.24
  3895.     ADJSP    SP,-3
  3896.     TRNE    AC1,1
  3897.     JRST    L.127
  3898.     MOVEI    AC1,23
  3899.     POPJ    SP,
  3900. L.127:    PUSHJ    SP,U.26                ;                                        2893
  3901.     TRNE    AC1,1                ;                                        2895
  3902.     JRST    L.129
  3903.     CAIE    AC1,262                ;                                        2899
  3904.     CAIN    AC1,300
  3905.     JRST    L.128
  3906.     CAIN    AC1,172
  3907. L.128:    SKIPA    AC2,U.51            ;                                        2903
  3908.     MOVEI    AC2,23
  3909.     MOVE    AC1,AC2                ;                                        2897
  3910.     POPJ    SP,
  3911. L.129:    MOVEI    AC2,131                ;                                        2911
  3912.     CAME    AC2,U.58
  3913.     JRST    L.130
  3914.     MOVE    AC2,U.56            ;                                        2913
  3915.     CAMN    AC2,U.55
  3916.     JRST    L.131
  3917. L.130:    MOVE    AC1,U.51
  3918.     POPJ    SP,
  3919. L.131:    PUSHJ    SP,U.21                ;                                        2920
  3920.     TRNE    AC1,1
  3921.     JRST    L.132
  3922.     MOVEI    AC1,12
  3923.     POPJ    SP,
  3924. L.132:    MOVE    AC1,U.47            ;                                        2922
  3925.     MOVEM    AC1,U.48
  3926.     SETZM    U.54                ;                                        2923
  3927.     MOVE    AC1,U.55            ;                                        2924
  3928.     ADDI    AC1,1
  3929.     LDB    AC2,C.18
  3930.     MOVEM    AC2,U.55
  3931.     MOVEI    AC1,22                ;                                        2873
  3932.     POPJ    SP,                ;                                        2835
  3933.  
  3934. ; Routine Size:  49 words
  3935.  
  3936.  
  3937. ;   2927  1    %SBTTL 'SEND%OPEN%FILE - Open file for sending'
  3938. ;   2928  1    ROUTINE SEND%OPEN%FILE =
  3939. ;   2929  1
  3940. ;   2930  1    !++
  3941. ;   2931  1    ! FUNCTIONAL DESCRIPTION:
  3942. ;   2932  1    !
  3943. ;   2933  1    ! This routine is called from DO%TRANSACTION when the first input file
  3944. ;   2934  1    ! needs to be opened.
  3945. ;   2935  1    !
  3946. ;   2936  1    ! CALLING SEQUENCE:
  3947. ;   2937  1    !
  3948. ;   2938  1    !    STATE = SEND%OPEN%FILE ();
  3949. ;   2939  1    !
  3950. ;   2940  1    ! INPUT PARAMETERS:
  3951. ;   2941  1    !
  3952. ;   2942  1    !    None.
  3953. ;   2943  1    !
  3954. ;   2944  1    ! IMPLICIT INPUTS:
  3955. ;   2945  1    !
  3956. ;   2946  1    !    FILE%NAME, FILE%SIZE, etc.
  3957. ;   2947  1    !
  3958. ;   2948  1    ! OUPTUT PARAMETERS:
  3959. ;   2949  1    !
  3960. ;   2950  1    !    New state for FSM.
  3961. ;   2951  1    !
  3962. ;   2952  1    ! IMPLICIT OUTPUTS:
  3963. ;   2953  1    !
  3964. ;   2954  1    !    None.
  3965. ;   2955  1    !
  3966. ;   2956  1    ! COMPLETION CODES:
  3967. ;   2957  1    !
  3968. ;   2958  1    !    None.
  3969. ;   2959  1    !
  3970. ;   2960  1    ! SIDE EFFECTS:
  3971. ;   2961  1    !
  3972. ;   2962  1    !    None.
  3973. ;   2963  1    !
  3974. ;   2964  1    !--
  3975. ;   2965  1
  3976. ;   2966  2        BEGIN
  3977. ;   2967  2
  3978. ;   2968  2        IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  3979. ;   2969  2        THEN
  3980. ;   2970  3        BEGIN
  3981. ;   2971  3        TT%TEXT (UPLIT (%ASCIZ'Sending: '));
  3982. ;   2972  3        TT%OUTPUT ();
  3983. ;   2973  2        END;
  3984. ;   2974  2
  3985. ;   2975  2        FILE%CHARS = 0;                ! No characters sent yet
  3986. ;   2976  2
  3987. ;   2977  2        IF NOT .NO%FILE%NEEDED
  3988. ;   2978  2        THEN
  3989. ;   2979  2
  3990. ;   2980  2        IF NOT FILE%OPEN (FNC%READ) THEN RETURN STATE%A ELSE FLAG%FILE%OPEN = TRUE;
  3991. ;   2981  2
  3992. ;   2982  2    ![023]
  3993. ;   2983  2    ![023] If we want normalized file names, beat up the name now
  3994. ;   2984  2    ![023]
  3995. ;   2985  2
  3996. ;   2986  2        IF .FIL%NORMAL%FORM THEN NORMALIZE%FILE (FILE%NAME, FILE%SIZE, -1, -1);
  3997. ;   2987  2
  3998. ;   2988  2        XFR%STATUS (%C'F', %C'S');            ! Inform display routine
  3999. ;   2989  2
  4000. ;   2990  2        IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  4001. ;   2991  2        THEN
  4002. ;   2992  3        BEGIN
  4003. ;   2993  3        TT%TEXT (FILE%NAME);
  4004. ;   2994  3        TT%OUTPUT ();
  4005. ;   2995  2        END;
  4006. ;   2996  2
  4007. ;   2997  2        RETURN STATE%SF;
  4008. ;   2998  1        END;                    ! End of FSM%OPEN%FILE
  4009.  
  4010.  
  4011. P.AAE:    BYTE    (7)"S","e","n","d","i"
  4012.     BYTE    (7)"n","g",":"," ",000
  4013.  
  4014.  
  4015. ; SEND%OPEN%FILE
  4016. U.5:    MOVEI    AC1,1                ;                                        2968
  4017.     TDNE    AC1,CONNECT%FLAG
  4018.     JRST    L.133
  4019.     MOVEI    AC1,1
  4020.     TDNN    AC1,TY%FIL
  4021.     JRST    L.133
  4022.     PUSH    SP,C.37                ;                                        2971
  4023.     PUSHJ    SP,TT%TEXT
  4024.     PUSHJ    SP,TT%OUTPUT            ;                                        2972
  4025.     ADJSP    SP,-1                ;                                        2970
  4026. L.133:    SETZM    U.61                ;                                        2975
  4027.     MOVEI    AC1,1                ;                                        2977
  4028.     TDNE    AC1,U.63
  4029.     JRST    L.135
  4030.     PUSH    SP,C.25                ;                                        2980
  4031.     PUSHJ    SP,FILE%OPEN
  4032.     ADJSP    SP,-1
  4033.     TRNE    AC1,1
  4034.     JRST    L.134
  4035.     MOVEI    AC1,12
  4036.     POPJ    SP,
  4037. L.134:    MOVEI    AC1,1
  4038.     MOVEM    AC1,FLAG%FILE%OPEN
  4039. L.135:    MOVEI    AC1,1                ;                                        2986
  4040.     TDNN    AC1,FIL%NORMAL%FORM
  4041.     JRST    L.136
  4042.     PUSH    SP,C.34
  4043.     PUSH    SP,C.35
  4044.     PUSH    SP,C.36
  4045.     PUSH    SP,C.36
  4046.     PUSHJ    SP,U.27
  4047.     ADJSP    SP,-4
  4048. L.136:    PUSH    SP,C.15                ;                                        2988
  4049.     PUSH    SP,C.8
  4050.     PUSHJ    SP,XFR%STATUS
  4051.     MOVEI    AC1,1                ;                                        2990
  4052.     TDNE    AC1,CONNECT%FLAG
  4053.     JRST    L.137
  4054.     MOVEI    AC1,1
  4055.     TDNN    AC1,TY%FIL
  4056.     JRST    L.137
  4057.     PUSH    SP,C.34                ;                                        2993
  4058.     PUSHJ    SP,TT%TEXT
  4059.     PUSHJ    SP,TT%OUTPUT            ;                                        2994
  4060.     ADJSP    SP,-1                ;                                        2992
  4061. L.137:    ADJSP    SP,-2                ;                                        2997
  4062.     MOVEI    AC1,2                ;                                        2966
  4063.     POPJ    SP,                ;                                        2928
  4064. C.37:    XWD    0,P.AAE
  4065.  
  4066. ; Routine Size:  49 words
  4067.  
  4068.  
  4069. ;   2999  1    %SBTTL 'SEND%GENCMD'
  4070. ;   3000  1    ROUTINE SEND%GENCMD =
  4071. ;   3001  1
  4072. ;   3002  1    !++
  4073. ;   3003  1    ! FUNCTIONAL DESCRIPTION:
  4074. ;   3004  1    !
  4075. ;   3005  1    !    This routine will send a command packet to the server Kermit.
  4076. ;   3006  1    !    The new state will depend upon the response.  If a send-init
  4077. ;   3007  1    !    is received, it will process it and switch to STATE%RF.
  4078. ;   3008  1    !    If a text-header is received it will switch to STATE%RD.
  4079. ;   3009  1    !    If an ACK is received, it will type the data portion and
  4080. ;   3010  1    !    switch to STATE%C.
  4081. ;   3011  1    !
  4082. ;   3012  1    ! CALLING SEQUENCE:
  4083. ;   3013  1    !
  4084. ;   3014  1    !    STATE = SEND%GENCMD();
  4085. ;   3015  1    !
  4086. ;   3016  1    ! INPUT PARAMETERS:
  4087. ;   3017  1    !
  4088. ;   3018  1    !    None.
  4089. ;   3019  1    !
  4090. ;   3020  1    ! IMPLICIT INPUTS:
  4091. ;   3021  1    !
  4092. ;   3022  1    !    GEN%TYPE - Message type to send (normally MSG%GENERIC)
  4093. ;   3023  1    !    GEN%SUBTYPE - Message subtype (only if MSG%GENERIC)
  4094. ;   3024  1    !    GEN%1DATA - First argument string
  4095. ;   3025  1    !    GEN%1SIZE - Size of first argument
  4096. ;   3026  1    !    GEN%2DATA - Second argument string
  4097. ;   3027  1    !    GEN%2SIZE - Size of second argument
  4098. ;   3028  1    !    GEN%3DATA - Third argument string
  4099. ;   3029  1    !    GEN%3SIZE - Size of third argument
  4100. ;   3030  1    !
  4101. ;   3031  1    ! OUTPUT PARAMETERS:
  4102. ;   3032  1    !
  4103. ;   3033  1    !    New state for the finite state machine.
  4104. ;   3034  1    !
  4105. ;   3035  1    ! IMPLICIT OUTPUTS:
  4106. ;   3036  1    !
  4107. ;   3037  1    !    None.
  4108. ;   3038  1    !
  4109. ;   3039  1    ! COMPLETION CODES:
  4110. ;   3040  1    !
  4111. ;   3041  1    !    None.
  4112. ;   3042  1    !
  4113. ;   3043  1    ! SIDE EFFECTS:
  4114. ;   3044  1    !
  4115. ;   3045  1    !    None.
  4116. ;   3046  1    !
  4117. ;   3047  1    !--
  4118. ;   3048  1
  4119. ;   3049  2        BEGIN
  4120. ;   3050  2
  4121. ;   3051  2        LOCAL
  4122. ;   3052  2        POINTER,                ! Pointer at DATA%TEXT
  4123. ;   3053  2        DATA%TEXT : VECTOR [CH$ALLOCATION (MAX%MSG)],    ! Data buffer
  4124. ;   3054  2        DATA%SIZE,                ! Length of data buffer used
  4125. ;   3055  2        STATUS;                    ! Status returned by various routines
  4126. ;   3056  2
  4127. ;   3057  2        ROUTINE PACK%DATA (POINTER, LENGTH, SRC%ADDR, SRC%LEN) =
  4128. ;   3058  2    !
  4129. ;   3059  2    ! Routine to pack an argument into the buffer.
  4130. ;   3060  2    !
  4131. ;   3061  3        BEGIN
  4132. ;   3062  3
  4133. ;   3063  3        IF .SRC%LEN GTR MAX%MSG - .LENGTH - 1 THEN SRC%LEN = MAX%MSG - .LENGTH - 1;
  4134. ;   3064  3
  4135. ;   3065  3        LENGTH = .LENGTH + .SRC%LEN + 1;
  4136. ;   3066  3        CH$WCHAR%A (CHAR (.SRC%LEN), .POINTER);
  4137. ;   3067  3        .POINTER = CH$MOVE (.SRC%LEN, CH$PTR (.SRC%ADDR), ..POINTER);
  4138. ;   3068  3        RETURN .LENGTH;
  4139. ;   3069  2        END;
  4140.  
  4141.  
  4142. ; PACK%DATA
  4143. U.77:    MOVE    AC1,-3(SP)            ;                                        3063
  4144.     SUBI    AC1,1751
  4145.     MOVN    AC2,AC1
  4146.     CAMGE    AC2,-1(SP)
  4147.     MOVNM    AC1,-1(SP)
  4148.     MOVE    AC1,-3(SP)            ;                                        3065
  4149.     ADD    AC1,-1(SP)
  4150.     ADDI    AC1,1
  4151.     MOVEM    AC1,-3(SP)
  4152.     MOVE    AC2,-1(SP)            ;                                        3066
  4153.     ADDI    AC2,40
  4154.     MOVE    AC1,-4(SP)
  4155.     IDPB    AC2,0(AC1)
  4156.     MOVE    AC3,-4(SP)            ;                                        3067
  4157.     MOVE    AC1,-2(SP)
  4158.     MOVEI    AC2,-1(AC1)
  4159.     HRLI    AC2,10700
  4160.     MOVE    AC1,-1(SP)
  4161.     MOVE    AC4,-1(SP)
  4162.     MOVE    AC5,0(AC3)
  4163.     EXTEND    AC1,C.9
  4164.     JFCL
  4165.     MOVEM    AC5,0(AC3)
  4166.     MOVE    AC1,-3(SP)            ;                                        3061
  4167.     POPJ    SP,                ;                                        3057
  4168.  
  4169. ; Routine Size:  25 words
  4170.  
  4171.  
  4172. ;   3070  2    !
  4173. ;   3071  2    ! First determine if we have exceed the number of retries that are
  4174. ;   3072  2    ! allowed to attempt to send this message.
  4175. ;   3073  2    !
  4176. ;   3074  2
  4177. ;   3075  2        IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  4178. ;   3076  2
  4179. ;   3077  2    !
  4180. ;   3078  2    ! The number of retries are not exceeded.  Increment the number and then
  4181. ;   3079  2    ! attempt to send the packet again.
  4182. ;   3080  2    !
  4183. ;   3081  2        NUM%RETRIES = .NUM%RETRIES + 1;
  4184. ;   3082  2    !
  4185. ;   3083  2    ! Build the packet data field
  4186. ;   3084  2    !
  4187. ;   3085  2        POINTER = CH$PTR (DATA%TEXT);
  4188. ;   3086  2        DATA%SIZE = 0;
  4189. ;   3087  2
  4190. ;   3088  2        IF .GEN%TYPE EQL MSG%GENERIC
  4191. ;   3089  2        THEN
  4192. ;   3090  3        BEGIN
  4193. ;   3091  3        CH$WCHAR%A (.GEN%SUBTYPE, POINTER);
  4194. ;   3092  3        DATA%SIZE = 1;
  4195. ;   3093  3
  4196. ;   3094  3        IF .GEN%1SIZE GTR 0 OR .GEN%2SIZE GTR 0 OR .GEN%3SIZE GTR 0
  4197. ;   3095  3        THEN
  4198. ;   3096  4            BEGIN
  4199. ;   3097  4            DATA%SIZE = PACK%DATA (POINTER, .DATA%SIZE, GEN%1DATA, .GEN%1SIZE);
  4200. ;   3098  4
  4201. ;   3099  4            IF .GEN%2SIZE GTR 0 OR .GEN%3SIZE GTR 0
  4202. ;   3100  4            THEN
  4203. ;   3101  5            BEGIN
  4204. ;   3102  5            DATA%SIZE = PACK%DATA (POINTER, .DATA%SIZE, GEN%2DATA, .GEN%2SIZE);
  4205. ;   3103  5
  4206. ;   3104  5            IF .GEN%3SIZE GTR 0
  4207. ;   3105  5            THEN
  4208. ;   3106  6                BEGIN
  4209. ;   3107  6                DATA%SIZE = PACK%DATA (POINTER, .DATA%SIZE, GEN%3DATA, .GEN%3SIZE);
  4210. ;   3108  5                END;
  4211. ;   3109  5
  4212. ;   3110  4            END;
  4213. ;   3111  4
  4214. ;   3112  3            END;
  4215. ;   3113  3
  4216. ;   3114  3        END
  4217. ;   3115  2        ELSE
  4218. ;   3116  3        BEGIN
  4219. ;   3117  3
  4220. ;   3118  3        IF .GEN%1SIZE GTR MAX%MSG THEN GEN%1SIZE = MAX%MSG;
  4221. ;   3119  3
  4222. ;   3120  3        DATA%SIZE = .GEN%1SIZE;
  4223. ;   3121  3        CH$MOVE (.GEN%1SIZE, CH$PTR (GEN%1DATA), .POINTER);
  4224. ;   3122  2        END;
  4225. ;   3123  2
  4226. ;   3124  2        SET%STRING (CH$PTR (DATA%TEXT), .DATA%SIZE, TRUE);
  4227. ;   3125  2        BFR%FILL (TRUE);
  4228. ;   3126  2        SET%STRING (0, 0, FALSE);
  4229. ;   3127  2    !
  4230. ;   3128  2    ! Send the packet
  4231. ;   3129  2    !
  4232. ;   3130  2
  4233. ;   3131  2        IF NOT SEND%PACKET (.GEN%TYPE, .SIZE, .MSG%NUMBER) THEN RETURN STATE%EX;
  4234. ;   3132  2
  4235. ;   3133  2    !
  4236. ;   3134  2    ! Now get the responce from the remote KERMIT.
  4237. ;   3135  2    !
  4238. ;   3136  2        STATUS = REC%PACKET ();
  4239. ;   3137  2
  4240. ;   3138  2        IF NOT .STATUS
  4241. ;   3139  2        THEN
  4242. ;   3140  3        BEGIN
  4243. ;   3141  3
  4244. ;   3142  4        IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR(.STATUS EQL KER%CHKSUMERR)
  4245. ;   3143  3        THEN
  4246. ;   3144  3            RETURN .STATE
  4247. ;   3145  3        ELSE
  4248. ;   3146  3            RETURN STATE%EX;
  4249. ;   3147  3
  4250. ;   3148  2        END;
  4251. ;   3149  2
  4252. ;   3150  2    ! Did we get a send-init?
  4253. ;   3151  2
  4254. ;   3152  2        SELECTONE .REC%TYPE OF
  4255. ;   3153  2        SET
  4256. ;   3154  2
  4257. ;   3155  2        [MSG%SND%INIT] :
  4258. ;   3156  3            BEGIN
  4259. ;   3157  3            MSG%NUMBER = .REC%SEQ;        ! Initialize sequence numbers
  4260. ;   3158  3    ! Determine if the parameters are ok.  If not, give up
  4261. ;   3159  3
  4262. ;   3160  3            IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN .STATUS;
  4263. ;   3161  3
  4264. ;   3162  3            SET%SEND%INIT ();            ! Set up our acknowledgement to the send-init
  4265. ;   3163  3            SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .MSG%NUMBER);    ! [108] ! Send it
  4266. ;   3164  3            BLK%CHK%TYPE = .INI%CHK%TYPE;    ! Can now use agreed upon type
  4267. ;   3165  3            OLD%RETRIES = .NUM%RETRIES;
  4268. ;   3166  3            NUM%RETRIES = 0;
  4269. ;   3167  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  4270. ;   3168  3            RETURN STATE%RF;            ! Now expect file header
  4271. ;   3169  2            END;
  4272. ;   3170  2
  4273. ;   3171  2        [MSG%TEXT] :
  4274. ;   3172  2    !
  4275. ;   3173  2    ! If we just got a text header, set up for typing on the terminal and
  4276. ;   3174  2    ! shift to receiving data
  4277. ;   3175  2    !
  4278. ;   3176  3            BEGIN
  4279. ;   3177  3            TEXT%HEAD%FLAG = TRUE;        ! We want terminal output
  4280. ;   3178  3            PUT%CHR%ROUTINE = TYPE%CHAR;    ! Set up the put a character routine
  4281. ;   3179  3
  4282. ;   3180  3            IF .REC%LENGTH GTR 0
  4283. ;   3181  3            THEN
  4284. ;   3182  4            BEGIN
  4285. ;   3183  4            TT%TEXT (UPLIT (%ASCIZ'<<'));    ! Make sure file name sticks out
  4286. ;   3184  4            BFR%EMPTY ();            ! Dump the packet data to the terminal
  4287. ;   3185  4            TT%TEXT (UPLIT (%ASCIZ'>>'));    ! So user can tell where name ends
  4288. ;   3186  4            TT%CRLF ();            ! And a CRLF
  4289. ;   3187  3            END;
  4290. ;   3188  3
  4291. ;   3189  3            SEND%PACKET (MSG%ACK, 0, .MSG%NUMBER);    ! Send an ACK
  4292. ;   3190  3            OLD%RETRIES = .NUM%RETRIES;
  4293. ;   3191  3            NUM%RETRIES = 0;
  4294. ;   3192  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  4295. ;   3193  3            RETURN STATE%RD;            ! We now want data
  4296. ;   3194  2            END;
  4297. ;   3195  2
  4298. ;   3196  2        [MSG%ACK] :
  4299. ;   3197  2    !
  4300. ;   3198  2    ! If we get an ACK, just type the data on the terminal and complete the
  4301. ;   3199  2    ! transaction.
  4302. ;   3200  2    !
  4303. ;   3201  3            BEGIN
  4304. ;   3202  3            PUT%CHR%ROUTINE = TYPE%CHAR;    ! Dump to terminal
  4305. ;   3203  3            BFR%EMPTY ();            ! Do it
  4306. ;   3204  3
  4307. ;   3205  3            IF .REC%LENGTH GTR 0 THEN TT%CRLF ();
  4308. ;   3206  3
  4309. ;   3207  3            RETURN STATE%C;            ! And go idle
  4310. ;   3208  2            END;
  4311. ;   3209  2
  4312. ;   3210  2        [MSG%NAK] :
  4313. ;   3211  2    !
  4314. ;   3212  2    ! If we get a NAK, stay in the same state.  We will re-transmit the
  4315. ;   3213  2    ! packet again.
  4316. ;   3214  2    !
  4317. ;   3215  2            RETURN .STATE;
  4318. ;   3216  2        TES;
  4319. ;   3217  2
  4320. ;   3218  2    !
  4321. ;   3219  2    ! If we get here, we didn't get anything resembling an acceptable
  4322. ;   3220  2    ! packet, so we will abort.
  4323. ;   3221  2    !
  4324. ;   3222  2        KRM%ERROR (KER%PROTOERR);
  4325. ;   3223  2        RETURN STATE%A;
  4326. ;   3224  1        END;
  4327.  
  4328.  
  4329. P.AAF:    BYTE    (7)"<","<",000,000,000
  4330. P.AAG:    BYTE    (7)">",">",000,000,000
  4331.  
  4332.  
  4333. ; SEND%GENCMD
  4334. U.6:    ADJSP    SP,312                ;                                        3000
  4335.     MOVE    AC1,U.54            ;                                        3075
  4336.     CAMG    AC1,PKT%RETRIES
  4337.     JRST    L.138
  4338.     MOVEI    AC1,24
  4339.     JRST    L.155
  4340. L.138:    AOS    U.54                ;                                        3081
  4341.     MOVEI    AC1,-312(SP)            ;                                        3085
  4342.     HRLI    AC1,10700
  4343.     MOVEM    AC1,0(SP)
  4344.     SETZ    AC3,                ;                                        3086
  4345.     MOVEI    AC1,107                ;                                        3088
  4346.     CAME    AC1,U.65
  4347.     JRST    L.143
  4348.     MOVE    AC1,U.66            ;                                        3091
  4349.     IDPB    AC1,0(SP)
  4350.     MOVEI    AC3,1                ;                                        3092
  4351.     MOVE    AC1,GEN%1SIZE            ;                                        3094
  4352.     JUMPG    AC1,L.139
  4353.     SKIPLE    GEN%2SIZE
  4354.     JRST    L.139
  4355.     SKIPG    GEN%3SIZE
  4356.     JRST    L.145
  4357. L.139:    MOVEI    AC2,0(SP)            ;                                        3097
  4358.     PUSH    SP,AC2
  4359.     PUSH    SP,AC3
  4360.     PUSH    SP,C.38
  4361.     PUSH    SP,AC1
  4362.     PUSHJ    SP,U.77
  4363.     MOVE    AC3,AC1
  4364.     MOVE    AC1,GEN%2SIZE            ;                                        3099
  4365.     JUMPG    AC1,L.140
  4366.     SKIPG    GEN%3SIZE
  4367.     JRST    L.142
  4368. L.140:    MOVEI    AC2,-4(SP)            ;                                        3102
  4369.     PUSH    SP,AC2
  4370.     PUSH    SP,AC3
  4371.     PUSH    SP,C.39
  4372.     PUSH    SP,AC1
  4373.     PUSHJ    SP,U.77
  4374.     MOVE    AC3,AC1
  4375.     MOVE    AC1,GEN%3SIZE            ;                                        3104
  4376.     JUMPLE    AC1,L.141
  4377.     MOVEI    AC2,-10(SP)            ;                                        3107
  4378.     PUSH    SP,AC2
  4379.     PUSH    SP,AC3
  4380.     PUSH    SP,C.40
  4381.     PUSH    SP,AC1
  4382.     PUSHJ    SP,U.77
  4383.     MOVE    AC3,AC1
  4384.     ADJSP    SP,-4                ;                                        3106
  4385. L.141:    ADJSP    SP,-4                ;                                        3101
  4386. L.142:    ADJSP    SP,-4                ;                                        3096
  4387.     JRST    L.145                ;                                        3094
  4388. L.143:    MOVEI    AC1,1752            ;                                        3118
  4389.     CAML    AC1,GEN%1SIZE
  4390.     JRST    L.144
  4391.     MOVEI    AC1,1752
  4392.     MOVEM    AC1,GEN%1SIZE
  4393. L.144:    MOVE    AC3,GEN%1SIZE            ;                                        3120
  4394.     MOVE    AC1,GEN%1SIZE            ;                                        3121
  4395.     MOVE    AC2,C.11
  4396.     MOVE    AC4,GEN%1SIZE
  4397.     MOVE    AC5,0(SP)
  4398.     EXTEND    AC1,C.9
  4399.     JFCL
  4400. L.145:    MOVEI    AC1,-312(SP)            ;                                        3124
  4401.     HRLI    AC1,10700
  4402.     PUSH    SP,AC1
  4403.     PUSH    SP,AC3
  4404.     PUSH    SP,C.2
  4405.     PUSHJ    SP,U.30
  4406.     PUSH    SP,C.2                ;                                        3125
  4407.     PUSHJ    SP,U.29
  4408.     SETZM    -2(SP)                ;                                        3126
  4409.     SETZM    -1(SP)
  4410.     SETZM    0(SP)
  4411.     PUSHJ    SP,U.30
  4412.     PUSH    SP,U.65                ;                                        3131
  4413.     PUSH    SP,U.52
  4414.     PUSH    SP,U.55
  4415.     PUSHJ    SP,U.24
  4416.     ADJSP    SP,-3
  4417.     TRNE    AC1,1
  4418.     JRST    L.146
  4419.     ADJSP    SP,-4
  4420.     MOVEI    AC1,23
  4421.     JRST    L.155
  4422. L.146:    PUSHJ    SP,U.26                ;                                        3136
  4423.     TRNE    AC1,1                ;                                        3138
  4424.     JRST    L.148
  4425.     CAIE    AC1,262                ;                                        3142
  4426.     CAIN    AC1,300
  4427.     JRST    L.147
  4428.     CAIN    AC1,172
  4429. L.147:    SKIPA    AC2,U.51            ;                                        3146
  4430.     MOVEI    AC2,23
  4431.     ADJSP    SP,-4                ;                                        3142
  4432.     MOVE    AC1,AC2                ;                                        3140
  4433.     JRST    L.155
  4434. L.148:    MOVE    AC2,U.58            ;                                        3152
  4435.     CAIE    AC2,123                ;                                        3155
  4436.     JRST    L.150
  4437.     MOVE    AC3,U.56            ;                                        3157
  4438.     MOVEM    AC3,U.55
  4439.     PUSHJ    SP,U.21                ;                                        3160
  4440.     TRNE    AC1,1
  4441.     JRST    L.149
  4442.     ADJSP    SP,-4
  4443.     JRST    L.155
  4444. L.149:    PUSHJ    SP,U.20                ;                                        3162
  4445.     PUSH    SP,C.20                ;                                        3163
  4446.     PUSH    SP,U.46
  4447.     PUSH    SP,U.55
  4448.     PUSHJ    SP,U.24
  4449.     MOVE    AC1,U.47            ;                                        3164
  4450.     MOVEM    AC1,U.48
  4451.     MOVE    AC1,U.54            ;                                        3165
  4452.     MOVEM    AC1,U.53
  4453.     SETZM    U.54                ;                                        3166
  4454.     MOVE    AC1,U.55            ;                                        3167
  4455.     ADDI    AC1,1
  4456.     LDB    AC2,C.18
  4457.     MOVEM    AC2,U.55
  4458.     ADJSP    SP,-7                ;                                        3168
  4459.     MOVEI    AC1,7                ;                                        3156
  4460.     JRST    L.155
  4461. L.150:    CAIE    AC2,130                ;                                        3171
  4462.     JRST    L.152
  4463.     MOVEI    AC1,1                ;                                        3177
  4464.     MOVEM    AC1,U.62
  4465.     MOVEI    AC1,U.31            ;                                        3178
  4466.     MOVEM    AC1,U.68
  4467.     SKIPG    U.57                ;                                        3180
  4468.     JRST    L.151
  4469.     PUSH    SP,C.41                ;                                        3183
  4470.     PUSHJ    SP,TT%TEXT
  4471.     PUSHJ    SP,U.28                ;                                        3184
  4472.     PUSH    SP,C.42                ;                                        3185
  4473.     PUSHJ    SP,TT%TEXT
  4474.     PUSHJ    SP,TT%CRLF            ;                                        3186
  4475.     ADJSP    SP,-2                ;                                        3182
  4476. L.151:    PUSH    SP,C.20                ;                                        3189
  4477.     PUSH    SP,C.25
  4478.     PUSH    SP,U.55
  4479.     PUSHJ    SP,U.24
  4480.     MOVE    AC1,U.54            ;                                        3190
  4481.     MOVEM    AC1,U.53
  4482.     SETZM    U.54                ;                                        3191
  4483.     MOVE    AC1,U.55            ;                                        3192
  4484.     ADDI    AC1,1
  4485.     LDB    AC2,C.18
  4486.     MOVEM    AC2,U.55
  4487.     ADJSP    SP,-7                ;                                        3193
  4488.     MOVEI    AC1,10                ;                                        3176
  4489.     JRST    L.155
  4490. L.152:    CAIE    AC2,131                ;                                        3196
  4491.     JRST    L.153
  4492.     MOVEI    AC1,U.31            ;                                        3202
  4493.     MOVEM    AC1,U.68
  4494.     PUSHJ    SP,U.28                ;                                        3203
  4495.     SKIPLE    U.57                ;                                        3205
  4496.     PUSHJ    SP,TT%CRLF
  4497.     ADJSP    SP,-4                ;                                        3207
  4498.     MOVEI    AC1,11                ;                                        3201
  4499.     JRST    L.155
  4500. L.153:    CAIE    AC2,116                ;                                        3210
  4501.     JRST    L.154
  4502.     ADJSP    SP,-4                ;                                        3215
  4503.     MOVE    AC1,U.51
  4504.     JRST    L.155
  4505. L.154:    PUSH    SP,C.21                ;                                        3222
  4506.     PUSHJ    SP,KRM%ERROR
  4507.     ADJSP    SP,-5                ;                                        3223
  4508.     MOVEI    AC1,12                ;                                        3049
  4509. L.155:    ADJSP    SP,-312                ;                                        3000
  4510.     POPJ    SP,
  4511. C.38:    XWD    0,GEN%1DATA
  4512. C.39:    XWD    0,GEN%2DATA
  4513. C.40:    XWD    0,GEN%3DATA
  4514. C.41:    XWD    0,P.AAF
  4515. C.42:    XWD    0,P.AAG
  4516.  
  4517. ; Routine Size:  182 words
  4518.  
  4519.  
  4520. ;   3225  1    %SBTTL 'SEND%BREAK'
  4521. ;   3226  1    ROUTINE SEND%BREAK =
  4522. ;   3227  1
  4523. ;   3228  1    !++
  4524. ;   3229  1    ! FUNCTIONAL DESCRIPTION:
  4525. ;   3230  1    !
  4526. ;   3231  1    !    This routine will send the break (end of transmission) message
  4527. ;   3232  1    !    to the remote KERMIT.  On an ACK the state becomes STATE%C.
  4528. ;   3233  1    !
  4529. ;   3234  1    ! CALLING SEQUENCE:
  4530. ;   3235  1    !
  4531. ;   3236  1    !    STATE = SEND%BREAK();
  4532. ;   3237  1    !
  4533. ;   3238  1    ! INPUT PARAMETERS:
  4534. ;   3239  1    !
  4535. ;   3240  1    !    None.
  4536. ;   3241  1    !
  4537. ;   3242  1    ! IMPLICIT INPUTS:
  4538. ;   3243  1    !
  4539. ;   3244  1    !    None.
  4540. ;   3245  1    !
  4541. ;   3246  1    ! OUTPUT PARAMETERS:
  4542. ;   3247  1    !
  4543. ;   3248  1    !    New state for the finite state machine.
  4544. ;   3249  1    !
  4545. ;   3250  1    ! IMPLICIT OUTPUTS:
  4546. ;   3251  1    !
  4547. ;   3252  1    !    None.
  4548. ;   3253  1    !
  4549. ;   3254  1    ! COMPLETION CODES:
  4550. ;   3255  1    !
  4551. ;   3256  1    !    None.
  4552. ;   3257  1    !
  4553. ;   3258  1    ! SIDE EFFECTS:
  4554. ;   3259  1    !
  4555. ;   3260  1    !    None.
  4556. ;   3261  1    !
  4557. ;   3262  1    !--
  4558. ;   3263  1
  4559. ;   3264  2        BEGIN
  4560. ;   3265  2
  4561. ;   3266  2        LOCAL
  4562. ;   3267  2        STATUS;                    ! Status returned by various routines
  4563. ;   3268  2
  4564. ;   3269  2    !
  4565. ;   3270  2    ! First determine if we have exceed the number of retries that are
  4566. ;   3271  2    ! allowed to attempt to send this message.
  4567. ;   3272  2    !
  4568. ;   3273  2
  4569. ;   3274  2        IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  4570. ;   3275  2
  4571. ;   3276  2    !
  4572. ;   3277  2    ! The number of retries are not exceeded.  Increment the number and then
  4573. ;   3278  2    ! attempt to send the packet again.
  4574. ;   3279  2    !
  4575. ;   3280  2        NUM%RETRIES = .NUM%RETRIES + 1;
  4576. ;   3281  2
  4577. ;   3282  2        IF NOT SEND%PACKET (MSG%BREAK, 0, .MSG%NUMBER) THEN RETURN STATE%EX;
  4578. ;   3283  2
  4579. ;   3284  2    !
  4580. ;   3285  2    ! Now get the responce from the remote KERMIT.
  4581. ;   3286  2    !
  4582. ;   3287  2        STATUS = REC%PACKET ();
  4583. ;   3288  2
  4584. ;   3289  2        IF NOT .STATUS
  4585. ;   3290  2        THEN
  4586. ;   3291  3        BEGIN
  4587. ;   3292  3
  4588. ;   3293  4        IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR(.STATUS EQL KER%CHKSUMERR)
  4589. ;   3294  3        THEN
  4590. ;   3295  3            RETURN .STATE
  4591. ;   3296  3        ELSE
  4592. ;   3297  3            RETURN STATE%EX;
  4593. ;   3298  3
  4594. ;   3299  2        END;
  4595. ;   3300  2
  4596. ;   3301  2    !
  4597. ;   3302  2    ! Determine if the packet is good.
  4598. ;   3303  2    !
  4599. ;   3304  2
  4600. ;   3305  3        IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK)
  4601. ;   3306  2        THEN
  4602. ;   3307  3        BEGIN
  4603. ;   3308  3        KRM%ERROR (KER%PROTOERR);
  4604. ;   3309  3        RETURN STATE%A;
  4605. ;   3310  2        END;
  4606. ;   3311  2
  4607. ;   3312  2    !
  4608. ;   3313  2    ! If this is a NAK and the message number is not the one we just send
  4609. ;   3314  2    ! treat this like an ACK, otherwise resend the last packet.
  4610. ;   3315  2    !
  4611. ;   3316  2
  4612. ;   3317  2        IF .REC%TYPE EQL MSG%NAK AND .REC%SEQ NEQ 0 THEN RETURN .STATE;
  4613. ;   3318  2
  4614. ;   3319  2        IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE;
  4615. ;   3320  2
  4616. ;   3321  2    !
  4617. ;   3322  2    ! Here to determine if there is another file to send.
  4618. ;   3323  2    !
  4619. ;   3324  2        NUM%RETRIES = 0;
  4620. ;   3325  2        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  4621. ;   3326  2        RETURN STATE%C;
  4622. ;   3327  1        END;
  4623.  
  4624.  
  4625. ; SEND%BREAK
  4626. U.9:    MOVE    AC1,U.54            ;                                        3274
  4627.     CAMG    AC1,PKT%RETRIES
  4628.     JRST    L.156
  4629.     MOVEI    AC1,24
  4630.     POPJ    SP,
  4631. L.156:    AOS    U.54                ;                                        3280
  4632.     PUSH    SP,C.43                ;                                        3282
  4633.     PUSH    SP,C.25
  4634.     PUSH    SP,U.55
  4635.     PUSHJ    SP,U.24
  4636.     ADJSP    SP,-3
  4637.     TRNN    AC1,1
  4638.     JRST    L.157
  4639.     PUSHJ    SP,U.26                ;                                        3287
  4640.     TRNE    AC1,1                ;                                        3289
  4641.     JRST    L.158
  4642.     CAIE    AC1,262                ;                                        3293
  4643.     CAIN    AC1,300
  4644.     JRST    L.161
  4645.     CAIN    AC1,172
  4646.     JRST    L.161                ;                                        3295
  4647. L.157:    MOVEI    AC1,23                ;                                        3297
  4648.     POPJ    SP,                ;                                        3291
  4649. L.158:    MOVE    AC1,U.58            ;                                        3305
  4650.     CAIE    AC1,131
  4651.     CAIN    AC1,116
  4652.     JRST    L.159
  4653.     PUSH    SP,C.21                ;                                        3308
  4654.     PUSHJ    SP,KRM%ERROR
  4655.     ADJSP    SP,-1                ;                                        3309
  4656.     MOVEI    AC1,12                ;                                        3307
  4657.     POPJ    SP,
  4658. L.159:    MOVE    AC1,U.58            ;                                        3317
  4659.     CAIN    AC1,116
  4660.     SKIPN    U.56
  4661.     JRST    L.160
  4662.     JRST    L.161
  4663. L.160:    CAIE    AC1,131                ;                                        3319
  4664.     JRST    L.162
  4665.     MOVE    AC1,U.56
  4666.     CAMN    AC1,U.55
  4667.     JRST    L.162
  4668. L.161:    MOVE    AC1,U.51
  4669.     POPJ    SP,
  4670. L.162:    SETZM    U.54                ;                                        3324
  4671.     MOVE    AC1,U.55            ;                                        3325
  4672.     ADDI    AC1,1
  4673.     LDB    AC2,C.18
  4674.     MOVEM    AC2,U.55
  4675.     MOVEI    AC1,11                ;                                        3264
  4676.     POPJ    SP,                ;                                        3226
  4677. C.43:    EXP    102
  4678.  
  4679. ; Routine Size:  52 words
  4680.  
  4681.  
  4682. ;   3328  1    %SBTTL 'REC%INIT'
  4683. ;   3329  1    ROUTINE REC%INIT =
  4684. ;   3330  1
  4685. ;   3331  1    !++
  4686. ;   3332  1    ! FUNCTIONAL DESCRIPTION:
  4687. ;   3333  1    !
  4688. ;   3334  1    !    This routine will process an initialization message received from
  4689. ;   3335  1    !    the remote KERMIT.
  4690. ;   3336  1    !
  4691. ;   3337  1    ! CALLING SEQUENCE:
  4692. ;   3338  1    !
  4693. ;   3339  1    !    STATE = REC%INIT();
  4694. ;   3340  1    !
  4695. ;   3341  1    ! INPUT PARAMETERS:
  4696. ;   3342  1    !
  4697. ;   3343  1    !    None.
  4698. ;   3344  1    !
  4699. ;   3345  1    ! IMPLICIT INPUTS:
  4700. ;   3346  1    !
  4701. ;   3347  1    !    None.
  4702. ;   3348  1    !
  4703. ;   3349  1    ! OUTPUT PARAMETERS:
  4704. ;   3350  1    !
  4705. ;   3351  1    !    New machine state.
  4706. ;   3352  1    !
  4707. ;   3353  1    ! IMPLICIT OUTPUTS:
  4708. ;   3354  1    !
  4709. ;   3355  1    !    None.
  4710. ;   3356  1    !
  4711. ;   3357  1    ! COMPLETION CODES:
  4712. ;   3358  1    !
  4713. ;   3359  1    !    None.
  4714. ;   3360  1    !
  4715. ;   3361  1    ! SIDE EFFECTS:
  4716. ;   3362  1    !
  4717. ;   3363  1    !    None.
  4718. ;   3364  1    !
  4719. ;   3365  1    !--
  4720. ;   3366  1
  4721. ;   3367  2        BEGIN
  4722. ;   3368  2
  4723. ;   3369  2        LOCAL
  4724. ;   3370  2        STATUS;                    ! Status returned by various routines
  4725. ;   3371  2
  4726. ;   3372  2        ROUTINE CHECK%INIT =
  4727. ;   3373  3        BEGIN
  4728. ;   3374  3
  4729. ;   3375  3        IF .REC%TYPE EQL MSG%SND%INIT THEN RETURN TRUE ELSE RETURN FALSE;
  4730. ;   3376  3
  4731. ;   3377  2        END;
  4732.  
  4733.  
  4734. ; CHECK%INIT
  4735. U.78:    MOVEI    AC1,123                ;                                        3375
  4736.     CAME    AC1,U.58
  4737.     JRST    L.163
  4738.     MOVEI    AC1,1
  4739.     POPJ    SP,
  4740. L.163:    SETZ    AC1,
  4741.     POPJ    SP,                ;                                        3372
  4742.  
  4743. ; Routine Size:  7 words
  4744.  
  4745.  
  4746. ;   3378  2
  4747. ;   3379  3        IF NOT (STATUS = REC%MESSAGE (CHECK%INIT))
  4748. ;   3380  2        THEN
  4749. ;   3381  2
  4750. ;   3382  2        IF .STATUS NEQ KER%ABORTED THEN RETURN STATE%A ELSE RETURN STATE%EX;
  4751. ;   3383  2
  4752. ;   3384  2        MSG%NUMBER = .REC%SEQ;
  4753. ;   3385  2
  4754. ;   3386  2        IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN STATE%A;
  4755. ;   3387  2
  4756. ;   3388  2        SET%SEND%INIT ();
  4757. ;   3389  2        SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .MSG%NUMBER);    ! [108]
  4758. ;   3390  2        BLK%CHK%TYPE = .INI%CHK%TYPE;        ! Can now use agreed upon type
  4759. ;   3391  2        OLD%RETRIES = .NUM%RETRIES;
  4760. ;   3392  2        NUM%RETRIES = 0;
  4761. ;   3393  2        MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  4762. ;   3394  2        RETURN STATE%RF;
  4763. ;   3395  1        END;                    ! End of REC%INIT
  4764.  
  4765.  
  4766. ; REC%INIT
  4767. U.11:    PUSH    SP,C.44                ;                                        3379
  4768.     PUSHJ    SP,U.25
  4769.     ADJSP    SP,-1
  4770.     TRNE    AC1,1
  4771.     JRST    L.166
  4772.     CAIN    AC1,312                ;                                        3382
  4773.     JRST    L.164
  4774.     MOVEI    AC2,12
  4775.     JRST    L.165
  4776. L.164:    MOVEI    AC2,23
  4777. L.165:    MOVE    AC1,AC2
  4778.     POPJ    SP,
  4779. L.166:    MOVE    AC2,U.56            ;                                        3384
  4780.     MOVEM    AC2,U.55
  4781.     PUSHJ    SP,U.21                ;                                        3386
  4782.     TRNE    AC1,1
  4783.     JRST    L.167
  4784.     MOVEI    AC1,12
  4785.     POPJ    SP,
  4786. L.167:    PUSHJ    SP,U.20                ;                                        3388
  4787.     PUSH    SP,C.20                ;                                        3389
  4788.     PUSH    SP,U.46
  4789.     PUSH    SP,U.55
  4790.     PUSHJ    SP,U.24
  4791.     MOVE    AC1,U.47            ;                                        3390
  4792.     MOVEM    AC1,U.48
  4793.     MOVE    AC1,U.54            ;                                        3391
  4794.     MOVEM    AC1,U.53
  4795.     SETZM    U.54                ;                                        3392
  4796.     MOVE    AC1,U.55            ;                                        3393
  4797.     ADDI    AC1,1
  4798.     LDB    AC2,C.18
  4799.     MOVEM    AC2,U.55
  4800.     ADJSP    SP,-3                ;                                        3394
  4801.     MOVEI    AC1,7                ;                                        3367
  4802.     POPJ    SP,                ;                                        3329
  4803. C.44:    XWD    0,U.78
  4804.  
  4805. ; Routine Size:  37 words
  4806.  
  4807.  
  4808. ;   3396  1    %SBTTL 'REC%FILE'
  4809. ;   3397  1    ROUTINE REC%FILE =
  4810. ;   3398  1
  4811. ;   3399  1    !++
  4812. ;   3400  1    ! FUNCTIONAL DESCRIPTION:
  4813. ;   3401  1    !
  4814. ;   3402  1    !    This routine expects to receive an MSG%FILE packet from the remote
  4815. ;   3403  1    !    KERMIT.  If the message is correct this routine will change the state
  4816. ;   3404  1    !    to STATE%RD.
  4817. ;   3405  1    !
  4818. ;   3406  1    !    This routine also expects MSG%SND%INIT, MSG%EOF, or MSG%BREAK.
  4819. ;   3407  1    !
  4820. ;   3408  1    ! CALLING SEQUENCE:
  4821. ;   3409  1    !
  4822. ;   3410  1    !    STATE = REC%FILE();
  4823. ;   3411  1    !
  4824. ;   3412  1    ! INPUT PARAMETERS:
  4825. ;   3413  1    !
  4826. ;   3414  1    !    None.
  4827. ;   3415  1    !
  4828. ;   3416  1    ! IMPLICIT INPUTS:
  4829. ;   3417  1    !
  4830. ;   3418  1    !    None.
  4831. ;   3419  1    !
  4832. ;   3420  1    ! OUTPUT PARAMETERS:
  4833. ;   3421  1    !
  4834. ;   3422  1    !    New state.
  4835. ;   3423  1    !
  4836. ;   3424  1    ! IMPLICIT OUTPUTS:
  4837. ;   3425  1    !
  4838. ;   3426  1    !    None.
  4839. ;   3427  1    !
  4840. ;   3428  1    ! COMPLETION CODES:
  4841. ;   3429  1    !
  4842. ;   3430  1    !    None.
  4843. ;   3431  1    !
  4844. ;   3432  1    ! SIDE EFFECTS:
  4845. ;   3433  1    !
  4846. ;   3434  1    !    None.
  4847. ;   3435  1    !
  4848. ;   3436  1    !--
  4849. ;   3437  1
  4850. ;   3438  2        BEGIN
  4851. ;   3439  2
  4852. ;   3440  2        LOCAL
  4853. ;   3441  2        STATUS;
  4854. ;   3442  2
  4855. ;   3443  2        ROUTINE CHECK%FILE =
  4856. ;   3444  3        BEGIN
  4857. ;   3445  3
  4858. ;   3446  4        IF (.REC%TYPE EQL MSG%SND%INIT) OR (.REC%TYPE EQL MSG%EOF) OR(.REC%TYPE EQL MSG%FILE) OR (
  4859. ;   3447  4            .REC%TYPE EQL MSG%BREAK) OR (.REC%TYPE EQL MSG%TEXT)
  4860. ;   3448  3        THEN
  4861. ;   3449  3            RETURN TRUE
  4862. ;   3450  3        ELSE
  4863. ;   3451  3            RETURN FALSE;
  4864. ;   3452  3
  4865. ;   3453  2        END;
  4866.  
  4867.  
  4868. ; CHECK%FILE
  4869. U.79:    MOVE    AC1,U.58            ;                                        3446
  4870.     CAIE    AC1,123
  4871.     CAIN    AC1,132
  4872.     JRST    L.168
  4873.     CAIE    AC1,106
  4874.     CAIN    AC1,102
  4875.     JRST    L.168
  4876.     CAIE    AC1,130                ;                                        3447
  4877.     JRST    L.169
  4878. L.168:    MOVEI    AC1,1                ;                                        3451
  4879.     POPJ    SP,
  4880. L.169:    SETZ    AC1,
  4881.     POPJ    SP,                ;                                        3443
  4882.  
  4883. ; Routine Size:  13 words
  4884.  
  4885.  
  4886. ;   3454  2    !
  4887. ;   3455  2    ! Initialize the abort flags
  4888. ;   3456  2    !
  4889. ;   3457  2        ABT%CUR%FILE = FALSE;
  4890. ;   3458  2        ABT%ALL%FILE = FALSE;
  4891. ;   3459  2    !
  4892. ;   3460  2    ! Get a message
  4893. ;   3461  2    !
  4894. ;   3462  2
  4895. ;   3463  3        IF NOT (STATUS = REC%MESSAGE (CHECK%FILE))
  4896. ;   3464  2        THEN
  4897. ;   3465  2
  4898. ;   3466  2        IF .STATUS NEQ KER%ABORTED THEN RETURN STATE%A ELSE RETURN STATE%EX;
  4899. ;   3467  2
  4900. ;   3468  2        SELECTONE .REC%TYPE OF
  4901. ;   3469  2        SET
  4902. ;   3470  2
  4903. ;   3471  2        [MSG%SND%INIT] :
  4904. ;   3472  3            BEGIN
  4905. ;   3473  3
  4906. ;   3474  3            IF .OLD%RETRIES GTR .SI%RETRIES THEN RETURN STATE%ER;
  4907. ;   3475  3
  4908. ;   3476  3            OLD%RETRIES = .OLD%RETRIES + 1;
  4909. ;   3477  3
  4910. ;   3478  3            IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ
  4911. ;   3479  3            THEN
  4912. ;   3480  4            BEGIN
  4913. ;   3481  4            SET%SEND%INIT ();
  4914. ;   3482  4            BLK%CHK%TYPE = CHK%1CHAR;    ! Must use 1 character CHKSUM
  4915. ;   3483  4            SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .REC%SEQ); ! [108]
  4916. ;   3484  4            BLK%CHK%TYPE = .INI%CHK%TYPE;    ! Back to agreed upon type
  4917. ;   3485  4            NUM%RETRIES = 0;
  4918. ;   3486  4            RETURN .STATE;
  4919. ;   3487  4            END
  4920. ;   3488  3            ELSE
  4921. ;   3489  4            BEGIN
  4922. ;   3490  4            KRM%ERROR (KER%PROTOERR);
  4923. ;   3491  4            RETURN STATE%A;
  4924. ;   3492  3            END;
  4925. ;   3493  3
  4926. ;   3494  2            END;
  4927. ;   3495  2
  4928. ;   3496  2        [MSG%EOF] :
  4929. ;   3497  3            BEGIN
  4930. ;   3498  3
  4931. ;   3499  3            IF .OLD%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  4932. ;   3500  3
  4933. ;   3501  3            OLD%RETRIES = .OLD%RETRIES + 1;
  4934. ;   3502  3
  4935. ;   3503  3            IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ
  4936. ;   3504  3            THEN
  4937. ;   3505  4            BEGIN
  4938. ;   3506  4            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  4939. ;   3507  4            NUM%RETRIES = 0;
  4940. ;   3508  4            RETURN .STATE;
  4941. ;   3509  4            END
  4942. ;   3510  3            ELSE
  4943. ;   3511  4            BEGIN
  4944. ;   3512  4            KRM%ERROR (KER%PROTOERR);
  4945. ;   3513  4            RETURN STATE%A;
  4946. ;   3514  3            END;
  4947. ;   3515  3
  4948. ;   3516  2            END;
  4949. ;   3517  2
  4950. ;   3518  2        [MSG%FILE] :
  4951. ;   3519  3            BEGIN
  4952. ;   3520  3
  4953. ;   3521  3            IF .MSG%NUMBER NEQ .REC%SEQ THEN RETURN STATE%ER;
  4954. ;   3522  3
  4955. ;   3523  3            IF .REC%LENGTH EQL 0
  4956. ;   3524  3            THEN
  4957. ;   3525  4            BEGIN
  4958. ;   3526  4            KRM%ERROR (KER%PROTOERR);
  4959. ;   3527  4            RETURN STATE%A;
  4960. ;   3528  3            END;
  4961. ;   3529  3
  4962. ;   3530  3    ![025]
  4963. ;   3531  3    ![025] Get file name from packet with all quoting undone
  4964. ;   3532  3    ![025]
  4965. ;   3533  3            SET%STRING (CH$PTR (FILE%NAME), MAX%FILE%NAME, TRUE);
  4966. ;   3534  3            BFR%EMPTY ();
  4967. ;   3535  3            FILE%SIZE = SET%STRING (0, 0, FALSE);
  4968. ;   3536  3            CH$WCHAR (CHR%NUL, CH$PTR (FILE%NAME, .FILE%SIZE));
  4969. ;   3537  3    ![025]        FILE%SIZE = .REC%LENGTH;
  4970. ;   3538  3    ![025]        CH$COPY (.REC%LENGTH, CH$PTR (REC%MSG, PKT%MSG, CHR%SIZE), CHR%NUL, MAX%FILE%NAME,
  4971. ;   3539  3    ![025]        CH$PTR (FILE%NAME));
  4972. ;   3540  3
  4973. ;   3541  3            IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  4974. ;   3542  3            THEN
  4975. ;   3543  4            BEGIN
  4976. ;   3544  4            TT%TEXT (UPLIT (%ASCIZ'Receiving: '));
  4977. ;   3545  4            TT%TEXT (FILE%NAME);
  4978. ;   3546  4            TT%OUTPUT ();
  4979. ;   3547  3            END;
  4980. ;   3548  3
  4981. ;   3549  3    ![023]
  4982. ;   3550  3    ![023] Force file name into normal form if desired
  4983. ;   3551  3    ![023]
  4984. ;   3552  3
  4985. ;   3553  3            IF .FIL%NORMAL%FORM THEN NORMALIZE%FILE (FILE%NAME, FILE%SIZE, 9, 3);
  4986. ;   3554  3
  4987. ;   3555  3            FILE%CHARS = 0;            ! No characters received yet
  4988. ;   3556  3
  4989. ;   3557  3            IF NOT FILE%OPEN (FNC%WRITE) THEN RETURN STATE%A;
  4990. ;   3558  3
  4991. ;   3559  3            XFR%STATUS (%C'F', %C'R');        ! Tell display routine
  4992. ;   3560  3            TEXT%HEAD%FLAG = FALSE;        ! Got an F, not an X
  4993. ;   3561  3            FLAG%FILE%OPEN = TRUE;
  4994. ;   3562  3            SEND%PACKET (MSG%ACK, 0, .MSG%NUMBER);
  4995. ;   3563  3            OLD%RETRIES = .NUM%RETRIES;
  4996. ;   3564  3            NUM%RETRIES = 0;
  4997. ;   3565  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  4998. ;   3566  3            RETURN STATE%RD;
  4999. ;   3567  2            END;
  5000. ;   3568  2
  5001. ;   3569  2        [MSG%TEXT] :
  5002. ;   3570  2    !
  5003. ;   3571  2    ! If we get a text header, we will want to type the data on
  5004. ;   3572  2    ! the terminal.  Set up the put a character routine correctly.
  5005. ;   3573  2    !
  5006. ;   3574  3            BEGIN
  5007. ;   3575  3
  5008. ;   3576  3            IF .MSG%NUMBER NEQ .REC%SEQ
  5009. ;   3577  3            THEN
  5010. ;   3578  4            BEGIN
  5011. ;   3579  4            KRM%ERROR (KER%PROTOERR);
  5012. ;   3580  4            RETURN STATE%A;
  5013. ;   3581  3            END;
  5014. ;   3582  3
  5015. ;   3583  3            TEXT%HEAD%FLAG = TRUE;        ! Got an X, not an F
  5016. ;   3584  3            PUT%CHR%ROUTINE = TYPE%CHAR;    ! Empty buffer on terminal
  5017. ;   3585  3
  5018. ;   3586  3            IF .REC%LENGTH GTR 0
  5019. ;   3587  3            THEN
  5020. ;   3588  4            BEGIN
  5021. ;   3589  4            TT%TEXT (UPLIT (%ASCIZ'<<'));    ! Make file name stick out
  5022. ;   3590  4            BFR%EMPTY ();            ! Do the header data
  5023. ;   3591  4            TT%TEXT (UPLIT (%ASCIZ'>>'));
  5024. ;   3592  4            TT%CRLF ();            ! And a crlf
  5025. ;   3593  3            END;
  5026. ;   3594  3
  5027. ;   3595  3            SEND%PACKET (MSG%ACK, 0, .MSG%NUMBER);
  5028. ;   3596  3            OLD%RETRIES = .NUM%RETRIES;
  5029. ;   3597  3            NUM%RETRIES = 0;
  5030. ;   3598  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  5031. ;   3599  3            RETURN STATE%RD;
  5032. ;   3600  2            END;
  5033. ;   3601  2
  5034. ;   3602  2        [MSG%BREAK] :
  5035. ;   3603  3            BEGIN
  5036. ;   3604  3
  5037. ;   3605  3            IF .MSG%NUMBER NEQ .REC%SEQ
  5038. ;   3606  3            THEN
  5039. ;   3607  4            BEGIN
  5040. ;   3608  4            KRM%ERROR (KER%PROTOERR);
  5041. ;   3609  4            RETURN STATE%A;
  5042. ;   3610  3            END;
  5043. ;   3611  3
  5044. ;   3612  3            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5045. ;   3613  3            RETURN STATE%C;
  5046. ;   3614  2            END;
  5047. ;   3615  2
  5048. ;   3616  2        [OTHERWISE] :
  5049. ;   3617  3            BEGIN
  5050. ;   3618  3            KRM%ERROR (KER%PROTOERR);
  5051. ;   3619  3            RETURN STATE%A;
  5052. ;   3620  2            END;
  5053. ;   3621  2        TES;
  5054. ;   3622  2
  5055. ;   3623  1        END;                    ! End of REC%FILE
  5056.  
  5057.  
  5058. P.AAH:    BYTE    (7)"R","e","c","e","i"
  5059.     BYTE    (7)"v","i","n","g",":"
  5060.     BYTE    (7)" ",000,000,000,000
  5061. P.AAI:    BYTE    (7)"<","<",000,000,000
  5062. P.AAJ:    BYTE    (7)">",">",000,000,000
  5063.  
  5064.  
  5065. ; REC%FILE
  5066. U.12:    SETZM    ABT%CUR%FILE            ;                                        3457
  5067.     SETZM    ABT%ALL%FILE            ;                                        3458
  5068.     PUSH    SP,C.45                ;                                        3463
  5069.     PUSHJ    SP,U.25
  5070.     ADJSP    SP,-1
  5071.     TRNE    AC1,1
  5072.     JRST    L.170
  5073.     CAIE    AC1,312                ;                                        3466
  5074.     JRST    L.184
  5075.     MOVEI    AC1,23
  5076.     POPJ    SP,
  5077. L.170:    MOVE    AC1,U.58            ;                                        3468
  5078.     CAIE    AC1,123                ;                                        3471
  5079.     JRST    L.171
  5080.     MOVE    AC2,U.53            ;                                        3474
  5081.     CAMLE    AC2,SI%RETRIES
  5082.     JRST    L.174
  5083.     AOS    U.53                ;                                        3476
  5084.     MOVE    AC1,U.55            ;                                        3478
  5085.     SUBI    AC1,1
  5086.     LDB    AC2,C.18
  5087.     CAME    AC2,U.56
  5088.     JRST    L.186
  5089.     PUSHJ    SP,U.20                ;                                        3481
  5090.     MOVEI    AC1,61                ;                                        3482
  5091.     MOVEM    AC1,U.48
  5092.     PUSH    SP,C.20                ;                                        3483
  5093.     PUSH    SP,U.46
  5094.     PUSH    SP,U.56
  5095.     PUSHJ    SP,U.24
  5096.     MOVE    AC1,U.47            ;                                        3484
  5097.     MOVEM    AC1,U.48
  5098.     JRST    L.172
  5099. L.171:    CAIE    AC1,132                ;                                        3496
  5100.     JRST    L.173
  5101.     MOVE    AC2,U.53            ;                                        3499
  5102.     CAMLE    AC2,PKT%RETRIES
  5103.     JRST    L.174
  5104.     AOS    U.53                ;                                        3501
  5105.     MOVE    AC1,U.55            ;                                        3503
  5106.     SUBI    AC1,1
  5107.     LDB    AC2,C.18
  5108.     CAME    AC2,U.56
  5109.     JRST    L.186
  5110.     PUSH    SP,C.20                ;                                        3506
  5111.     PUSH    SP,C.25
  5112.     PUSH    SP,U.56
  5113.     PUSHJ    SP,U.24
  5114. L.172:    SETZM    U.54                ;                                        3507
  5115.     ADJSP    SP,-2                ;                                        3505
  5116.     MOVE    AC1,U.51            ;                                        3511
  5117.     JRST    L.187
  5118. L.173:    CAIE    AC1,106                ;                                        3518
  5119.     JRST    L.179
  5120.     MOVE    AC2,U.55            ;                                        3521
  5121.     CAMN    AC2,U.56
  5122.     JRST    L.175
  5123. L.174:    MOVEI    AC1,24
  5124.     POPJ    SP,
  5125. L.175:    SKIPN    U.57                ;                                        3523
  5126.     JRST    L.183
  5127.     PUSH    SP,C.10                ;                                        3533
  5128.     PUSH    SP,C.22
  5129.     PUSH    SP,C.2
  5130.     PUSHJ    SP,U.30
  5131.     PUSHJ    SP,U.28                ;                                        3534
  5132.     SETZM    -2(SP)                ;                                        3535
  5133.     SETZM    -1(SP)
  5134.     SETZM    0(SP)
  5135.     PUSHJ    SP,U.30
  5136.     MOVEM    AC1,FILE%SIZE
  5137.     SETZ    AC2,                ;                                        3536
  5138.     MOVE    AC3,C.19
  5139.     MOVE    AC1,FILE%SIZE
  5140.     ADJBP    AC1,AC3
  5141.     IDPB    AC2,AC1
  5142.     MOVEI    AC1,1                ;                                        3541
  5143.     TDNE    AC1,CONNECT%FLAG
  5144.     JRST    L.176
  5145.     MOVEI    AC1,1
  5146.     TDNN    AC1,TY%FIL
  5147.     JRST    L.176
  5148.     PUSH    SP,C.46                ;                                        3544
  5149.     PUSHJ    SP,TT%TEXT
  5150.     PUSH    SP,C.34                ;                                        3545
  5151.     PUSHJ    SP,TT%TEXT
  5152.     PUSHJ    SP,TT%OUTPUT            ;                                        3546
  5153.     ADJSP    SP,-2                ;                                        3543
  5154. L.176:    MOVEI    AC1,1                ;                                        3553
  5155.     TDNN    AC1,FIL%NORMAL%FORM
  5156.     JRST    L.177
  5157.     PUSH    SP,C.34
  5158.     PUSH    SP,C.35
  5159.     PUSH    SP,C.47
  5160.     PUSH    SP,C.48
  5161.     PUSHJ    SP,U.27
  5162.     ADJSP    SP,-4
  5163. L.177:    SETZM    U.61                ;                                        3555
  5164.     PUSH    SP,C.2                ;                                        3557
  5165.     PUSHJ    SP,FILE%OPEN
  5166.     ADJSP    SP,-1
  5167.     TRNE    AC1,1
  5168.     JRST    L.178
  5169.     ADJSP    SP,-3
  5170.     JRST    L.184
  5171. L.178:    PUSH    SP,C.15                ;                                        3559
  5172.     PUSH    SP,C.12
  5173.     PUSHJ    SP,XFR%STATUS
  5174.     SETZM    U.62                ;                                        3560
  5175.     MOVEI    AC1,1                ;                                        3561
  5176.     MOVEM    AC1,FLAG%FILE%OPEN
  5177.     PUSH    SP,C.20                ;                                        3562
  5178.     PUSH    SP,C.25
  5179.     PUSH    SP,U.55
  5180.     PUSHJ    SP,U.24
  5181.     MOVE    AC1,U.54            ;                                        3563
  5182.     MOVEM    AC1,U.53
  5183.     SETZM    U.54                ;                                        3564
  5184.     MOVE    AC1,U.55            ;                                        3565
  5185.     ADDI    AC1,1
  5186.     LDB    AC2,C.18
  5187.     MOVEM    AC2,U.55
  5188.     ADJSP    SP,-7                ;                                        3519
  5189.     JRST    L.181
  5190. L.179:    CAIE    AC1,130                ;                                        3569
  5191.     JRST    L.182
  5192.     MOVE    AC1,U.55            ;                                        3576
  5193.     CAME    AC1,U.56
  5194.     JRST    L.183
  5195.     MOVEI    AC1,1                ;                                        3583
  5196.     MOVEM    AC1,U.62
  5197.     MOVEI    AC1,U.31            ;                                        3584
  5198.     MOVEM    AC1,U.68
  5199.     SKIPG    U.57                ;                                        3586
  5200.     JRST    L.180
  5201.     PUSH    SP,C.49                ;                                        3589
  5202.     PUSHJ    SP,TT%TEXT
  5203.     PUSHJ    SP,U.28                ;                                        3590
  5204.     PUSH    SP,C.50                ;                                        3591
  5205.     PUSHJ    SP,TT%TEXT
  5206.     PUSHJ    SP,TT%CRLF            ;                                        3592
  5207.     ADJSP    SP,-2                ;                                        3588
  5208. L.180:    PUSH    SP,C.20                ;                                        3595
  5209.     PUSH    SP,C.25
  5210.     PUSH    SP,U.55
  5211.     PUSHJ    SP,U.24
  5212.     MOVE    AC1,U.54            ;                                        3596
  5213.     MOVEM    AC1,U.53
  5214.     SETZM    U.54                ;                                        3597
  5215.     MOVE    AC1,U.55            ;                                        3598
  5216.     ADDI    AC1,1
  5217.     LDB    AC2,C.18
  5218.     MOVEM    AC2,U.55
  5219.     ADJSP    SP,-2                ;                                        3574
  5220. L.181:    MOVEI    AC1,10                ;                                        3468
  5221.     JRST    L.187
  5222. L.182:    CAIE    AC1,102                ;                                        3602
  5223.     JRST    L.186
  5224.     MOVE    AC1,U.55            ;                                        3605
  5225.     CAMN    AC1,U.56
  5226.     JRST    L.185
  5227. L.183:    PUSH    SP,C.21                ;                                        3608
  5228.     PUSHJ    SP,KRM%ERROR
  5229.     ADJSP    SP,-1                ;                                        3609
  5230. L.184:    MOVEI    AC1,12                ;                                        3607
  5231.     POPJ    SP,
  5232. L.185:    PUSH    SP,C.20                ;                                        3612
  5233.     PUSH    SP,C.25
  5234.     PUSH    SP,U.56
  5235.     PUSHJ    SP,U.24
  5236.     ADJSP    SP,-2                ;                                        3603
  5237.     MOVEI    AC1,11                ;                                        3468
  5238.     JRST    L.187
  5239. L.186:    PUSH    SP,C.21                ;                                        3618
  5240.     PUSHJ    SP,KRM%ERROR
  5241.     MOVEI    AC1,12                ;                                        3468
  5242. L.187:    ADJSP    SP,-1                ;                                        3617
  5243.     POPJ    SP,                ;                                        3397
  5244. C.45:    XWD    0,U.79
  5245. C.46:    XWD    0,P.AAH
  5246. C.47:    EXP    11
  5247. C.48:    EXP    3
  5248. C.49:    XWD    0,P.AAI
  5249. C.50:    XWD    0,P.AAJ
  5250.  
  5251. ; Routine Size:  184 words
  5252.  
  5253.  
  5254. ;   3624  1    %SBTTL 'REC%DATA'
  5255. ;   3625  1    ROUTINE REC%DATA =
  5256. ;   3626  1
  5257. ;   3627  1    !++
  5258. ;   3628  1    ! FUNCTIONAL DESCRIPTION:
  5259. ;   3629  1    !
  5260. ;   3630  1    ! This routine will accept data messages and write them to disk.
  5261. ;   3631  1    ! It will also accept MSG%FILE, MSG%TEXT and MSG%EOF messages.
  5262. ;   3632  1    !
  5263. ;   3633  1    ! CALLING SEQUENCE:
  5264. ;   3634  1    !
  5265. ;   3635  1    !    STATE = REC%DATA();
  5266. ;   3636  1    !
  5267. ;   3637  1    ! INPUT PARAMETERS:
  5268. ;   3638  1    !
  5269. ;   3639  1    !    None.
  5270. ;   3640  1    !
  5271. ;   3641  1    ! IMPLICIT INPUTS:
  5272. ;   3642  1    !
  5273. ;   3643  1    !    None.
  5274. ;   3644  1    !
  5275. ;   3645  1    ! OUTPUT PARAMETERS:
  5276. ;   3646  1    !
  5277. ;   3647  1    !    New state for the finite state machine.
  5278. ;   3648  1    !
  5279. ;   3649  1    ! IMPLICIT OUTPUTS:
  5280. ;   3650  1    !
  5281. ;   3651  1    !    None.
  5282. ;   3652  1    !
  5283. ;   3653  1    ! COMPLETION CODES:
  5284. ;   3654  1    !
  5285. ;   3655  1    !    None.
  5286. ;   3656  1    !
  5287. ;   3657  1    ! SIDE EFFECTS:
  5288. ;   3658  1    !
  5289. ;   3659  1    !    None.
  5290. ;   3660  1    !
  5291. ;   3661  1    !--
  5292. ;   3662  1
  5293. ;   3663  2        BEGIN
  5294. ;   3664  2
  5295. ;   3665  2        LOCAL
  5296. ;   3666  2        STATUS;
  5297. ;   3667  2
  5298. ;   3668  2        ROUTINE CHECK%DATA =
  5299. ;   3669  3        BEGIN
  5300. ;   3670  3
  5301. ;   3671  3        IF .REC%TYPE EQL MSG%DATA OR (.REC%TYPE EQL MSG%FILE AND NOT .TEXT%HEAD%FLAG) OR .REC%TYPE
  5302. ;   3672  4            EQL MSG%EOF OR (.REC%TYPE EQL MSG%TEXT AND .TEXT%HEAD%FLAG)
  5303. ;   3673  3        THEN
  5304. ;   3674  3            RETURN TRUE
  5305. ;   3675  3        ELSE
  5306. ;   3676  3            RETURN FALSE;
  5307. ;   3677  3
  5308. ;   3678  2        END;
  5309.  
  5310.  
  5311. ; CHECK%DATA
  5312. U.80:    MOVE    AC1,U.58            ;                                        3671
  5313.     CAIN    AC1,104
  5314.     JRST    L.189
  5315.     CAIE    AC1,106
  5316.     JRST    L.188
  5317.     MOVEI    AC2,1
  5318.     TDNN    AC2,U.62
  5319.     JRST    L.189
  5320. L.188:    CAIN    AC1,132                ;                                        3672
  5321.     JRST    L.189
  5322.     CAIE    AC1,130
  5323.     JRST    L.190
  5324.     MOVEI    AC1,1
  5325.     TDNN    AC1,U.62
  5326.     JRST    L.190
  5327. L.189:    MOVEI    AC1,1                ;                                        3676
  5328.     POPJ    SP,
  5329. L.190:    SETZ    AC1,
  5330.     POPJ    SP,                ;                                        3668
  5331.  
  5332. ; Routine Size:  19 words
  5333.  
  5334.  
  5335. ;   3679  2
  5336. ;   3680  2        LOCAL
  5337. ;   3681  2        SUB%TYPE,                ! Subtype for XFR%STATUS
  5338. ;   3682  2        DISCARD%FILE%FLAG,            ! Sender requested discard
  5339. ;   3683  2        ACK%MSG%LEN;                ! Length of ACK to send
  5340. ;   3684  2
  5341. ;   3685  2    !
  5342. ;   3686  2    ! First get a message
  5343. ;   3687  2    !
  5344. ;   3688  2
  5345. ;   3689  3        IF NOT (STATUS = REC%MESSAGE (CHECK%DATA))
  5346. ;   3690  2        THEN
  5347. ;   3691  2
  5348. ;   3692  2        IF .STATUS NEQ KER%ABORTED THEN RETURN STATE%A ELSE RETURN STATE%EX;
  5349. ;   3693  2
  5350. ;   3694  2        SELECTONE .REC%TYPE OF
  5351. ;   3695  2        SET
  5352. ;   3696  2
  5353. ;   3697  2        [MSG%DATA] :
  5354. ;   3698  3            BEGIN
  5355. ;   3699  3
  5356. ;   3700  3            IF .MSG%NUMBER NEQ .REC%SEQ
  5357. ;   3701  3            THEN
  5358. ;   3702  4            BEGIN
  5359. ;   3703  4
  5360. ;   3704  4            IF .OLD%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  5361. ;   3705  4
  5362. ;   3706  4            OLD%RETRIES = .OLD%RETRIES + 1;
  5363. ;   3707  4
  5364. ;   3708  4            IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ
  5365. ;   3709  4            THEN
  5366. ;   3710  5                BEGIN
  5367. ;   3711  5                SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5368. ;   3712  5                NUM%RETRIES = 0;
  5369. ;   3713  5                RETURN .STATE;
  5370. ;   3714  5                END
  5371. ;   3715  4            ELSE
  5372. ;   3716  5                BEGIN
  5373. ;   3717  5                KRM%ERROR (KER%PROTOERR);
  5374. ;   3718  5                RETURN STATE%A;
  5375. ;   3719  4                END;
  5376. ;   3720  4
  5377. ;   3721  3            END;
  5378. ;   3722  3
  5379. ;   3723  3    !
  5380. ;   3724  3    ! Here if we have a message with a valid message number
  5381. ;   3725  3    !
  5382. ;   3726  3
  5383. ;   3727  3            IF NOT BFR%EMPTY () THEN RETURN STATE%A;
  5384. ;   3728  3
  5385. ;   3729  3    !
  5386. ;   3730  3    ! Check if we wish to abort for some reason
  5387. ;   3731  3    !
  5388. ;   3732  3
  5389. ;   3733  3            IF .ABT%CUR%FILE
  5390. ;   3734  3            THEN
  5391. ;   3735  4            BEGIN
  5392. ;   3736  4            CH$WCHAR (MSG%ACK%ABT%CUR, CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE));
  5393. ;   3737  4            ACK%MSG%LEN = 1;
  5394. ;   3738  4            END
  5395. ;   3739  3            ELSE
  5396. ;   3740  3
  5397. ;   3741  3            IF .ABT%ALL%FILE
  5398. ;   3742  3            THEN
  5399. ;   3743  4                BEGIN
  5400. ;   3744  4                CH$WCHAR (MSG%ACK%ABT%ALL, CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE));
  5401. ;   3745  4                ACK%MSG%LEN = 1;
  5402. ;   3746  4                END
  5403. ;   3747  3            ELSE
  5404. ;   3748  3                ACK%MSG%LEN = 0;
  5405. ;   3749  3
  5406. ;   3750  3    !
  5407. ;   3751  3    ! Now send the ACK
  5408. ;   3752  3    !
  5409. ;   3753  3            SEND%PACKET (MSG%ACK, .ACK%MSG%LEN, .REC%SEQ);
  5410. ;   3754  3            OLD%RETRIES = .NUM%RETRIES;
  5411. ;   3755  3            NUM%RETRIES = 0;
  5412. ;   3756  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  5413. ;   3757  3            RETURN STATE%RD;
  5414. ;   3758  2            END;
  5415. ;   3759  2
  5416. ;   3760  2        [MSG%FILE, MSG%TEXT] :
  5417. ;   3761  3            BEGIN
  5418. ;   3762  3
  5419. ;   3763  3            IF .OLD%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER;
  5420. ;   3764  3
  5421. ;   3765  3            OLD%RETRIES = .OLD%RETRIES + 1;
  5422. ;   3766  3
  5423. ;   3767  3            IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ
  5424. ;   3768  3            THEN
  5425. ;   3769  4            BEGIN
  5426. ;   3770  4            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5427. ;   3771  4            NUM%RETRIES = 0;
  5428. ;   3772  4            RETURN .STATE;
  5429. ;   3773  4            END
  5430. ;   3774  3            ELSE
  5431. ;   3775  4            BEGIN
  5432. ;   3776  4            KRM%ERROR (KER%PROTOERR);
  5433. ;   3777  4            RETURN STATE%A;
  5434. ;   3778  3            END;
  5435. ;   3779  3
  5436. ;   3780  2            END;
  5437. ;   3781  2
  5438. ;   3782  2        [MSG%EOF] :
  5439. ;   3783  3            BEGIN
  5440. ;   3784  3
  5441. ;   3785  3            IF .MSG%NUMBER NEQ .REC%SEQ
  5442. ;   3786  3            THEN
  5443. ;   3787  4            BEGIN
  5444. ;   3788  4            KRM%ERROR (KER%PROTOERR);
  5445. ;   3789  4            RETURN STATE%A;
  5446. ;   3790  3            END;
  5447. ;   3791  3
  5448. ;   3792  3            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5449. ;   3793  3
  5450. ;   3794  3            IF NOT .TEXT%HEAD%FLAG
  5451. ;   3795  3            THEN
  5452. ;   3796  4            BEGIN
  5453. ;   3797  4            FLAG%FILE%OPEN = FALSE;
  5454. ;   3798  4            DISCARD%FILE%FLAG = FALSE;    ! Assume we want file
  5455. ;   3799  4
  5456. ;   3800  4            IF .REC%LENGTH EQL 1
  5457. ;   3801  4            THEN
  5458. ;   3802  4
  5459. ;   3803  4                IF CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG, CHR%SIZE)) EQL MSG%EOF%DISCARD ! [108]
  5460. ;   3804  4                THEN
  5461. ;   3805  4                DISCARD%FILE%FLAG = TRUE;
  5462. ;   3806  4
  5463. ;   3807  4            IF ( NOT .CONNECT%FLAG) AND .TY%FIL
  5464. ;   3808  4            THEN
  5465. ;   3809  5                BEGIN
  5466. ;   3810  5
  5467. ;   3811  5                IF .DISCARD%FILE%FLAG
  5468. ;   3812  5                THEN
  5469. ;   3813  5
  5470. ;   3814  5                IF .ABT%FLAG
  5471. ;   3815  5                THEN
  5472. ;   3816  5                    TT%TEXT (UPLIT (%ASCIZ' [Interrupted]'))
  5473. ;   3817  5                ELSE
  5474. ;   3818  5                    TT%TEXT (UPLIT (%ASCIZ' [Interrupted, partial file saved]'))
  5475. ;   3819  5
  5476. ;   3820  5                ELSE
  5477. ;   3821  5                TT%TEXT (UPLIT (%ASCIZ' [OK]'));
  5478. ;   3822  5
  5479. ;   3823  5                TT%CRLF ();
  5480. ;   3824  4                END;
  5481. ;   3825  4
  5482. ;   3826  4            IF NOT FILE%CLOSE (.DISCARD%FILE%FLAG AND .ABT%FLAG) THEN RETURN STATE%A;
  5483. ;   3827  4
  5484. ;   3828  4            IF .DISCARD%FILE%FLAG
  5485. ;   3829  4            THEN
  5486. ;   3830  4
  5487. ;   3831  4                IF .ABT%FLAG THEN SUB%TYPE = %C'X' ELSE SUB%TYPE = %C'D'
  5488. ;   3832  4
  5489. ;   3833  4            ELSE
  5490. ;   3834  4                SUB%TYPE = %C'C';
  5491. ;   3835  4
  5492. ;   3836  4            END
  5493. ;   3837  3            ELSE
  5494. ;   3838  4            BEGIN
  5495. ;   3839  4            TT%CRLF ();            ! Make sure we have a CRLF
  5496. ;   3840  4            TT%OUTPUT ();            ! And make sure all output is sent
  5497. ;   3841  3            END;
  5498. ;   3842  3
  5499. ;   3843  3            XFR%STATUS (%C'F', .SUB%TYPE);
  5500. ;   3844  3            MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77';
  5501. ;   3845  3            RETURN STATE%RF;
  5502. ;   3846  2            END;
  5503. ;   3847  2
  5504. ;   3848  2        [OTHERWISE] :
  5505. ;   3849  3            BEGIN
  5506. ;   3850  3            KRM%ERROR (KER%PROTOERR);
  5507. ;   3851  3            RETURN STATE%A;
  5508. ;   3852  2            END;
  5509. ;   3853  2        TES;
  5510. ;   3854  2
  5511. ;   3855  1        END;                    ! End of REC%DATA
  5512.  
  5513.  
  5514. P.AAK:    BYTE    (7)" ","[","I","n","t"
  5515.     BYTE    (7)"e","r","r","u","p"
  5516.     BYTE    (7)"t","e","d","]",000
  5517. P.AAL:    BYTE    (7)" ","[","I","n","t"
  5518.     BYTE    (7)"e","r","r","u","p"
  5519.     BYTE    (7)"t","e","d",","," "
  5520.     BYTE    (7)"p","a","r","t","i"
  5521.     BYTE    (7)"a","l"," ","f","i"
  5522.     BYTE    (7)"l","e"," ","s","a"
  5523.     BYTE    (7)"v","e","d","]",000
  5524. P.AAM:    BYTE    (7)" ","[","O","K","]"
  5525.     BYTE    (7)000,000,000,000,000
  5526.  
  5527.  
  5528. ; REC%DATA
  5529. U.13:    PUSH    SP,AC16                ;                                        3625
  5530.     PUSH    SP,C.51                ;                                        3689
  5531.     PUSHJ    SP,U.25
  5532.     ADJSP    SP,-1
  5533.     TRNE    AC1,1
  5534.     JRST    L.191
  5535.     CAIE    AC1,312                ;                                        3692
  5536.     JRST    L.208
  5537.     MOVEI    AC1,23
  5538.     JRST    L.216
  5539. L.191:    MOVE    AC1,U.58            ;                                        3694
  5540.     CAIE    AC1,104                ;                                        3697
  5541.     JRST    L.197
  5542.     MOVE    AC2,U.55            ;                                        3700
  5543.     CAMN    AC2,U.56
  5544.     JRST    L.192
  5545.     MOVE    AC1,U.53            ;                                        3704
  5546.     CAMLE    AC1,PKT%RETRIES
  5547.     JRST    L.199
  5548.     JRST    L.200                ;                                        3625
  5549. L.192:    PUSHJ    SP,U.28                ;                                        3727
  5550.     TRNN    AC1,1
  5551.     JRST    L.208
  5552.     MOVEI    AC1,1                ;                                        3733
  5553.     TDNN    AC1,ABT%CUR%FILE
  5554.     JRST    L.193
  5555.     MOVEI    AC2,130                ;                                        3736
  5556.     MOVE    AC1,C.32
  5557.     IDPB    AC2,AC1
  5558.     JRST    L.194
  5559. L.193:    MOVEI    AC1,1                ;                                        3741
  5560.     TDNN    AC1,ABT%ALL%FILE
  5561.     JRST    L.195
  5562.     MOVEI    AC3,132                ;                                        3744
  5563.     MOVE    AC1,C.32
  5564.     IDPB    AC3,AC1
  5565. L.194:    MOVEI    AC2,1                ;                                        3745
  5566.     JRST    L.196                ;                                        3741
  5567. L.195:    SETZ    AC2,                ;                                        3748
  5568. L.196:    PUSH    SP,C.20                ;                                        3753
  5569.     PUSH    SP,AC2
  5570.     PUSH    SP,U.56
  5571.     PUSHJ    SP,U.24
  5572.     MOVE    AC1,U.54            ;                                        3754
  5573.     MOVEM    AC1,U.53
  5574.     SETZM    U.54                ;                                        3755
  5575.     MOVE    AC1,U.55            ;                                        3756
  5576.     ADDI    AC1,1
  5577.     LDB    AC2,C.18
  5578.     MOVEM    AC2,U.55
  5579.     ADJSP    SP,-2                ;                                        3698
  5580.     MOVEI    AC1,10                ;                                        3694
  5581.     JRST    L.215
  5582. L.197:    CAIE    AC1,106                ;                                        3760
  5583.     CAIN    AC1,130
  5584.     JRST    L.198
  5585.     JRST    L.201
  5586. L.198:    MOVE    AC1,U.53            ;                                        3763
  5587.     CAMG    AC1,PKT%RETRIES
  5588.     JRST    L.200
  5589. L.199:    MOVEI    AC1,24
  5590.     JRST    L.216
  5591. L.200:    AOS    U.53                ;                                        3765
  5592.     MOVE    AC1,U.55            ;                                        3767
  5593.     SUBI    AC1,1
  5594.     LDB    AC2,C.18
  5595.     CAME    AC2,U.56
  5596.     JRST    L.214
  5597.     PUSH    SP,C.20                ;                                        3770
  5598.     PUSH    SP,C.25
  5599.     PUSH    SP,U.56
  5600.     PUSHJ    SP,U.24
  5601.     SETZM    U.54                ;                                        3771
  5602.     ADJSP    SP,-2                ;                                        3769
  5603.     MOVE    AC1,U.51            ;                                        3775
  5604.     JRST    L.215
  5605. L.201:    CAIE    AC1,132                ;                                        3782
  5606.     JRST    L.214
  5607.     MOVE    AC1,U.55            ;                                        3785
  5608.     CAMN    AC1,U.56
  5609.     JRST    L.202
  5610.     PUSH    SP,C.21                ;                                        3788
  5611.     PUSHJ    SP,KRM%ERROR
  5612.     ADJSP    SP,-1                ;                                        3789
  5613.     JRST    L.208
  5614. L.202:    PUSH    SP,C.20                ;                                        3792
  5615.     PUSH    SP,C.25
  5616.     PUSH    SP,U.56
  5617.     PUSHJ    SP,U.24
  5618.     MOVEI    AC1,1                ;                                        3794
  5619.     TDNE    AC1,U.62
  5620.     JRST    L.212
  5621.     SETZB    AC16,FLAG%FILE%OPEN        ;                                        3797
  5622.     MOVEI    AC1,1                ;                                        3800
  5623.     CAME    AC1,U.57
  5624.     JRST    L.203
  5625.     MOVE    AC2,C.27            ;                                        3803
  5626.     MOVE    AC1,U.39
  5627.     ADJBP    AC1,AC2
  5628.     ILDB    AC1,AC1
  5629.     CAIN    AC1,104
  5630.     MOVEI    AC16,1                ;                                        3805
  5631. L.203:    MOVEI    AC1,1                ;                                        3807
  5632.     TDNE    AC1,CONNECT%FLAG
  5633.     JRST    L.207
  5634.     MOVEI    AC1,1
  5635.     TDNN    AC1,TY%FIL
  5636.     JRST    L.207
  5637.     TRNN    AC16,1                ;                                        3811
  5638.     JRST    L.205
  5639.     MOVEI    AC1,1                ;                                        3814
  5640.     TDNN    AC1,ABT%FLAG
  5641.     JRST    L.204
  5642.     PUSH    SP,C.52                ;                                        3816
  5643.     JRST    L.206
  5644. L.204:    PUSH    SP,C.53                ;                                        3818
  5645.     JRST    L.206
  5646. L.205:    PUSH    SP,C.54                ;                                        3821
  5647. L.206:    PUSHJ    SP,TT%TEXT
  5648.     PUSHJ    SP,TT%CRLF            ;                                        3823
  5649.     ADJSP    SP,-1                ;                                        3809
  5650. L.207:    MOVE    AC1,AC16            ;                                        3826
  5651.     AND    AC1,ABT%FLAG
  5652.     PUSH    SP,AC1
  5653.     PUSHJ    SP,FILE%CLOSE
  5654.     ADJSP    SP,-1
  5655.     TRNE    AC1,1
  5656.     JRST    L.209
  5657.     ADJSP    SP,-3
  5658. L.208:    MOVEI    AC1,12
  5659.     JRST    L.216
  5660. L.209:    TRNN    AC16,1                ;                                        3828
  5661.     JRST    L.211
  5662.     MOVEI    AC1,1                ;                                        3831
  5663.     TDNN    AC1,ABT%FLAG
  5664.     JRST    L.210
  5665.     MOVEI    AC1,130
  5666.     JRST    L.213
  5667. L.210:    MOVEI    AC1,104
  5668.     JRST    L.213                ;                                        3828
  5669. L.211:    MOVEI    AC1,103                ;                                        3834
  5670.     JRST    L.213                ;                                        3794
  5671. L.212:    PUSHJ    SP,TT%CRLF            ;                                        3839
  5672.     PUSHJ    SP,TT%OUTPUT            ;                                        3840
  5673. L.213:    PUSH    SP,C.15                ;                                        3843
  5674.     PUSH    SP,AC1
  5675.     PUSHJ    SP,XFR%STATUS
  5676.     MOVE    AC1,U.55            ;                                        3844
  5677.     ADDI    AC1,1
  5678.     LDB    AC2,C.18
  5679.     MOVEM    AC2,U.55
  5680.     ADJSP    SP,-4                ;                                        3783
  5681.     MOVEI    AC1,7                ;                                        3694
  5682.     JRST    L.215
  5683. L.214:    PUSH    SP,C.21                ;                                        3850
  5684.     PUSHJ    SP,KRM%ERROR
  5685.     MOVEI    AC1,12                ;                                        3694
  5686. L.215:    ADJSP    SP,-1                ;                                        3849
  5687. L.216:    POP    SP,AC16                ;                                        3625
  5688.     POPJ    SP,
  5689. C.51:    XWD    0,U.80
  5690. C.52:    XWD    0,P.AAK
  5691. C.53:    XWD    0,P.AAL
  5692. C.54:    XWD    0,P.AAM
  5693.  
  5694. ; Routine Size:  164 words
  5695.  
  5696.  
  5697. ;   3856  1    %SBTTL 'SERVER - Generic commands'
  5698. ;   3857  1    ROUTINE SERVER%GENERIC =
  5699. ;   3858  1
  5700. ;   3859  1    !++
  5701. ;   3860  1    ! FUNCTIONAL DESCRIPTION:
  5702. ;   3861  1    !
  5703. ;   3862  1    !    This routine will handle the generic server messages.
  5704. ;   3863  1    !    The generic server messages include FINISH, LOGOUT.
  5705. ;   3864  1    !
  5706. ;   3865  1    ! CALLING SEQUENCE:
  5707. ;   3866  1    !
  5708. ;   3867  1    !    STATE = SERVER%GENERIC();
  5709. ;   3868  1    !
  5710. ;   3869  1    ! INPUT PARAMETERS:
  5711. ;   3870  1    !
  5712. ;   3871  1    !    None.
  5713. ;   3872  1    !
  5714. ;   3873  1    ! IMPLICIT INPUTS:
  5715. ;   3874  1    !
  5716. ;   3875  1    !    Generic message receive in REC%MSG.
  5717. ;   3876  1    !
  5718. ;   3877  1    ! OUTPUT PARAMETERS:
  5719. ;   3878  1    !
  5720. ;   3879  1    !    Returns new state for FSM
  5721. ;   3880  1    !
  5722. ;   3881  1    ! IMPLICIT OUTPUTS:
  5723. ;   3882  1    !
  5724. ;   3883  1    !    None.
  5725. ;   3884  1    !
  5726. ;   3885  1    ! COMPLETION CODES:
  5727. ;   3886  1    !
  5728. ;   3887  1    !    None.
  5729. ;   3888  1    !
  5730. ;   3889  1    ! SIDE EFFECTS:
  5731. ;   3890  1    !
  5732. ;   3891  1    !    None.
  5733. ;   3892  1    !
  5734. ;   3893  1    !--
  5735. ;   3894  1
  5736. ;   3895  2        BEGIN
  5737. ;   3896  2
  5738. ;   3897  2        LOCAL
  5739. ;   3898  2        STATUS,                    ! Returned status
  5740. ;   3899  2        G%FUNC,                    ! Generic command function
  5741. ;   3900  2        POINTER,                ! Character pointer
  5742. ;   3901  2        DATA%TEXT : VECTOR [CH$ALLOCATION (MAX%MSG)],    ! Unpacked message
  5743. ;   3902  2        DATA%SIZE;                ! Actual size of data
  5744. ;   3903  2
  5745. ;   3904  2        ROUTINE UNPACK%DATA (POINTER, SIZE, DST%ADDR, DST%LEN) =
  5746. ;   3905  2    !
  5747. ;   3906  2    ! Routine to unpack an argument.
  5748. ;   3907  2    ! This will copy the argument data to the desired buffer.
  5749. ;   3908  2    !
  5750. ;   3909  3        BEGIN
  5751. ;   3910  3
  5752. ;   3911  3        IF .SIZE GTR 0                ! If we have something to unpack
  5753. ;   3912  3        THEN
  5754. ;   3913  4            BEGIN
  5755. ;   3914  4            .DST%LEN = UNCHAR (CH$RCHAR%A (.POINTER));
  5756. ;   3915  4
  5757. ;   3916  4            IF ..DST%LEN LSS 0
  5758. ;   3917  4            THEN
  5759. ;   3918  5            BEGIN
  5760. ;   3919  5            KRM%ERROR (KER%PROTOERR);    ! Someone screwed up
  5761. ;   3920  5            ..DST%LEN = 0;
  5762. ;   3921  5            RETURN -1;
  5763. ;   3922  4            END;
  5764. ;   3923  4
  5765. ;   3924  4            IF ..DST%LEN GTR .SIZE - 1 THEN .DST%LEN = .SIZE - 1;
  5766. ;   3925  4
  5767. ;   3926  4            CH$COPY (..DST%LEN, ..POINTER, CHR%NUL, MAX%MSG, CH$PTR(.DST%ADDR));
  5768. ;   3927  4            .POINTER = CH$PLUS (..POINTER, ..DST%LEN);
  5769. ;   3928  4            RETURN .SIZE - ..DST%LEN - 1;
  5770. ;   3929  4            END
  5771. ;   3930  3        ELSE
  5772. ;   3931  3    !
  5773. ;   3932  3    ! If nothing left in buffer, return the current size (0)
  5774. ;   3933  3    !
  5775. ;   3934  3            RETURN .SIZE;
  5776. ;   3935  3
  5777. ;   3936  2        END;
  5778.  
  5779.  
  5780. ; UNPACK%DATA
  5781. U.81:    PUSH    SP,AC12                ;                                        3904
  5782.     PUSH    SP,AC13
  5783.     PUSH    SP,AC14
  5784.     PUSH    SP,AC16
  5785.     MOVE    AC12,-7(SP)            ;                                        3911
  5786.     JUMPLE    AC12,L.218
  5787.     MOVE    AC13,-5(SP)            ;                                        3914
  5788.     MOVE    AC16,-10(SP)
  5789.     ILDB    AC1,0(AC16)
  5790.     SUBI    AC1,40
  5791.     MOVEM    AC1,0(AC13)
  5792.     MOVE    AC14,0(AC13)            ;                                        3916
  5793.     JUMPGE    AC14,L.217
  5794.     PUSH    SP,C.21                ;                                        3919
  5795.     PUSHJ    SP,KRM%ERROR
  5796.     SETZM    0(AC14)                ;                                        3920
  5797.     ADJSP    SP,-1                ;                                        3921
  5798.     SETO    AC1,                ;                                        3918
  5799.     JRST    L.219
  5800. L.217:    MOVE    AC1,AC12            ;                                        3924
  5801.     SUBI    AC1,1
  5802.     CAMLE    AC14,AC1
  5803.     MOVEM    AC1,0(AC13)
  5804.     MOVE    AC1,-6(SP)            ;                                        3926
  5805.     MOVEI    AC5,-1(AC1)
  5806.     HRLI    AC5,10700
  5807.     MOVE    AC1,0(AC13)
  5808.     MOVE    AC2,0(AC16)
  5809.     MOVEI    AC4,1752
  5810.     EXTEND    AC1,C.1
  5811.     JFCL
  5812.     MOVE    AC1,0(AC13)            ;                                        3927
  5813.     ADJBP    AC1,0(AC16)
  5814.     MOVEM    AC1,0(AC16)
  5815.     MOVE    AC1,AC12            ;                                        3928
  5816.     SUB    AC1,0(AC13)
  5817.     SOJA    AC1,L.219            ;                                        3934
  5818. L.218:    MOVE    AC1,AC12
  5819. L.219:    POP    SP,AC16                ;                                        3904
  5820.     POP    SP,AC14
  5821.     POP    SP,AC13
  5822.     POP    SP,AC12
  5823.     POPJ    SP,
  5824.  
  5825. ; Routine Size:  43 words
  5826.  
  5827.  
  5828. ;   3937  2    !
  5829. ;   3938  2    ! First unpack the message data into its various pieces
  5830. ;   3939  2    !
  5831. ;   3940  2        SET%STRING (CH$PTR (DATA%TEXT), MAX%MSG, TRUE);    ! Initialize for unpacking
  5832. ;   3941  2        BFR%EMPTY ();                ! Unpack the data
  5833. ;   3942  2        DATA%SIZE = SET%STRING (0, 0, FALSE);    ! All done, get size
  5834. ;   3943  2
  5835. ;   3944  2        IF .DATA%SIZE LEQ 0
  5836. ;   3945  2        THEN
  5837. ;   3946  3        BEGIN
  5838. ;   3947  3        KRM%ERROR (KER%PROTOERR);        ! Someone screwed up
  5839. ;   3948  3        RETURN STATE%A;                ! Since no subtype
  5840. ;   3949  2        END;
  5841. ;   3950  2
  5842. ;   3951  2    !
  5843. ;   3952  2    ! Get the arguments from the unpacked data (if any)
  5844. ;   3953  2    !
  5845. ;   3954  2        GEN%1SIZE = 0;                ! Assume no args
  5846. ;   3955  2        GEN%2SIZE = 0;                ! none at all
  5847. ;   3956  2        GEN%3SIZE = 0;
  5848. ;   3957  2        CH$WCHAR (CHR%NUL, CH$PTR (GEN%1DATA));    ! Ensure all are null terminated
  5849. ;   3958  2        CH$WCHAR (CHR%NUL, CH$PTR (GEN%2DATA));
  5850. ;   3959  2        CH$WCHAR (CHR%NUL, CH$PTR (GEN%3DATA));
  5851. ;   3960  2        POINTER = CH$PTR (DATA%TEXT, 1);        ! Point at second character
  5852. ;   3961  2        DATA%SIZE = .DATA%SIZE - 1;            ! Account for subtype
  5853. ;   3962  2
  5854. ;   3963  2        IF .DATA%SIZE GTR 0                ! Room for first arg?
  5855. ;   3964  2        THEN
  5856. ;   3965  3        BEGIN
  5857. ;   3966  3        DATA%SIZE = UNPACK%DATA (POINTER, .DATA%SIZE, GEN%1DATA, GEN%1SIZE);
  5858. ;   3967  3
  5859. ;   3968  3        IF .DATA%SIZE LSS 0 THEN RETURN STATE%A;    ! Punt if bad arguments
  5860. ;   3969  3
  5861. ;   3970  3        IF .DATA%SIZE GTR 0            ! Second argument present?
  5862. ;   3971  3        THEN
  5863. ;   3972  4            BEGIN
  5864. ;   3973  4            DATA%SIZE = UNPACK%DATA (POINTER, .DATA%SIZE, GEN%2DATA, GEN%2SIZE);
  5865. ;   3974  4
  5866. ;   3975  4            IF .DATA%SIZE LSS 0 THEN RETURN STATE%A;    ! Punt if bad arguments
  5867. ;   3976  4
  5868. ;   3977  4            IF .DATA%SIZE GTR 0            ! Third argument here?
  5869. ;   3978  4            THEN
  5870. ;   3979  5            BEGIN
  5871. ;   3980  5            DATA%SIZE = UNPACK%DATA (POINTER, .DATA%SIZE, GEN%3DATA, GEN%3SIZE);
  5872. ;   3981  5
  5873. ;   3982  5            IF .DATA%SIZE LSS 0 THEN RETURN STATE%A;    ! Punt if bad arguments
  5874. ;   3983  5
  5875. ;   3984  4            END;
  5876. ;   3985  4
  5877. ;   3986  3            END;
  5878. ;   3987  3
  5879. ;   3988  2        END;
  5880. ;   3989  2
  5881. ;   3990  2        SELECTONE CH$RCHAR (CH$PTR (DATA%TEXT)) OF
  5882. ;   3991  2        SET
  5883. ;   3992  2        !
  5884. ;   3993  2        ! EXIT command, just return the status to the upper level
  5885. ;   3994  2        !
  5886. ;   3995  2
  5887. ;   3996  2        [MSG%GEN%EXIT] :
  5888. ;   3997  3            BEGIN
  5889. ;   3998  3            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5890. ;   3999  3            RETURN STATE%FI;
  5891. ;   4000  2            END;
  5892. ;   4001  2        !
  5893. ;   4002  2        ! LOGOUT command, ACK the message then call the system routine to
  5894. ;   4003  2        ! kill the process (log the job out, etc.)
  5895. ;   4004  2        !
  5896. ;   4005  2
  5897. ;   4006  2        [MSG%GEN%LOGOUT] :
  5898. ;   4007  3            BEGIN
  5899. ;   4008  3            SEND%PACKET (MSG%ACK, 0, .REC%SEQ);
  5900. ;   4009  3            SY%LOGOUT ();
  5901. ;   4010  3            RETURN STATE%LG;
  5902. ;   4011  2            END;
  5903. ;   4012  2    !
  5904. ;   4013  2    ! For a type command, just set up a transfer flagging we want a text header
  5905. ;   4014  2    ! instead of a file header.
  5906. ;   4015  2    !
  5907. ;   4016  2
  5908. ;   4017  2        [MSG%GEN%TYPE] :
  5909. ;   4018  3            BEGIN
  5910. ;   4019  3            CH$COPY (.GEN%1SIZE, CH$PTR (GEN%1DATA), CHR%NUL, MAX%FILE%NAME, CH$PTR (FILE%NAME));
  5911. ;   4020  3            FILE%SIZE = .GEN%1SIZE;
  5912. ;   4021  3            TEXT%HEAD%FLAG = TRUE;        ! Now want text header
  5913. ;   4022  3            XFR%STATUS (%C'I', %C'G');        ! Tell display routine we are doing a command
  5914. ;   4023  3
  5915. ;   4024  3            IF .STATE EQL STATE%II AND .BLK%CHK%TYPE EQL .INI%CHK%TYPE
  5916. ;   4025  3            THEN
  5917. ;   4026  3            RETURN STATE%OF            ! Must open the file
  5918. ;   4027  3            ELSE
  5919. ;   4028  3            RETURN STATE%S;            ! Start the transaction with a send
  5920. ;   4029  3
  5921. ;   4030  2            END;
  5922. ;   4031  2
  5923. ;   4032  2        [MSG%GEN%DIRECTORY] :
  5924. ;   4033  2            G%FUNC = GC%DIRECTORY;
  5925. ;   4034  2
  5926. ;   4035  2        [MSG%GEN%DISK%USAGE] :
  5927. ;   4036  2            G%FUNC = GC%DISK%USAGE;
  5928. ;   4037  2
  5929. ;   4038  2        [MSG%GEN%DELETE] :
  5930. ;   4039  2            G%FUNC = GC%DELETE;
  5931. ;   4040  2
  5932. ;   4041  2        [MSG%GEN%HELP] :
  5933. ;   4042  2            G%FUNC = GC%HELP;
  5934. ;   4043  2
  5935. ;   4044  2        [MSG%GEN%LOGIN] :
  5936. ;   4045  2            G%FUNC = GC%LGN;
  5937. ;   4046  2
  5938. ;   4047  2        [MSG%GEN%CONNECT] :
  5939. ;   4048  2            G%FUNC = GC%CONNECT;
  5940. ;   4049  2
  5941. ;   4050  2        [MSG%GEN%RENAME] :
  5942. ;   4051  2            G%FUNC = GC%RENAME;
  5943. ;   4052  2
  5944. ;   4053  2        [MSG%GEN%COPY] :
  5945. ;   4054  2            G%FUNC = GC%COPY;
  5946. ;   4055  2
  5947. ;   4056  2        [MSG%GEN%WHO] :
  5948. ;   4057  2            G%FUNC = GC%WHO;
  5949. ;   4058  2
  5950. ;   4059  2        [MSG%GEN%SEND] :
  5951. ;   4060  2            G%FUNC = GC%SEND%MSG;
  5952. ;   4061  2
  5953. ;   4062  2        [MSG%GEN%QUERY] :
  5954. ;   4063  2            G%FUNC = GC%STATUS;
  5955. ;   4064  2
  5956. ;   4065  2        [MSG%GEN%PROGRAM] :
  5957. ;   4066  2            G%FUNC = GC%PROGRAM;
  5958. ;   4067  2
  5959. ;   4068  2        [MSG%GEN%JOURNAL] :
  5960. ;   4069  2            G%FUNC = GC%JOURNAL;
  5961. ;   4070  2
  5962. ;   4071  2        [MSG%GEN%VARIABLE] :
  5963. ;   4072  2            G%FUNC = GC%VARIABLE;
  5964. ;   4073  2    !
  5965. ;   4074  2    ! Here if we have a function that is not implemented in KERMSG.
  5966. ;   4075  2    !
  5967. ;   4076  2
  5968. ;   4077  2        [OTHERWISE] :
  5969. ;   4078  3            BEGIN
  5970. ;   4079  3            KRM%ERROR (KER%UNIMPLGEN);
  5971. ;   4080  3            RETURN STATE%A;
  5972. ;   4081  2            END;
  5973. ;   4082  2        TES;
  5974. ;   4083  2
  5975. ;   4084  2    !
  5976. ;   4085  2    ! If we get here, we have gotten a known type of generic message that
  5977. ;   4086  2    ! we need to have our operating system dependent routine handle.
  5978. ;   4087  2    !
  5979. ;   4088  2        RETURN CALL%SY%RTN (.G%FUNC);
  5980. ;   4089  1        END;                    ! End of SERVER%GENERIC
  5981.  
  5982.  
  5983. ; SERVER%GENERIC
  5984. U.14:    PUSH    SP,AC14                ;                                        3857
  5985.     PUSH    SP,AC16
  5986.     ADJSP    SP,312
  5987.     MOVEI    AC1,-312(SP)            ;                                        3940
  5988.     HRLI    AC1,10700
  5989.     PUSH    SP,AC1
  5990.     PUSH    SP,C.55
  5991.     PUSH    SP,C.2
  5992.     PUSHJ    SP,U.30
  5993.     PUSHJ    SP,U.28                ;                                        3941
  5994.     SETZM    -2(SP)                ;                                        3942
  5995.     SETZM    -1(SP)
  5996.     SETZM    0(SP)
  5997.     PUSHJ    SP,U.30
  5998.     MOVE    AC14,AC1
  5999.     JUMPG    AC14,L.220            ;                                        3944
  6000.     PUSH    SP,C.21                ;                                        3947
  6001.     JRST    L.246
  6002. L.220:    SETZM    GEN%1SIZE            ;                                        3954
  6003.     SETZM    GEN%2SIZE            ;                                        3955
  6004.     SETZB    AC2,GEN%3SIZE            ;                                        3956
  6005.     MOVE    AC1,C.11            ;                                        3957
  6006.     IDPB    AC2,AC1
  6007.     SETZ    AC2,                ;                                        3958
  6008.     MOVE    AC1,C.56
  6009.     IDPB    AC2,AC1
  6010.     SETZ    AC2,                ;                                        3959
  6011.     MOVE    AC1,C.57
  6012.     IDPB    AC2,AC1
  6013.     MOVEI    AC1,-314(SP)            ;                                        3960
  6014.     HRLI    AC1,350700
  6015.     MOVEM    AC1,-3(SP)
  6016.     SOJLE    AC14,L.226            ;                                        3963
  6017.     MOVEI    AC1,-3(SP)            ;                                        3966
  6018.     PUSH    SP,AC1
  6019.     PUSH    SP,AC14
  6020.     PUSH    SP,C.38
  6021.     PUSH    SP,C.58
  6022.     PUSHJ    SP,U.81
  6023.     MOVE    AC14,AC1
  6024.     JUMPGE    AC14,L.221            ;                                        3968
  6025.     ADJSP    SP,-7
  6026.     JRST    L.247
  6027. L.221:    JUMPLE    AC14,L.225            ;                                        3970
  6028.     MOVEI    AC1,-7(SP)            ;                                        3973
  6029.     PUSH    SP,AC1
  6030.     PUSH    SP,AC14
  6031.     PUSH    SP,C.39
  6032.     PUSH    SP,C.59
  6033.     PUSHJ    SP,U.81
  6034.     MOVE    AC14,AC1
  6035.     JUMPGE    AC14,L.222            ;                                        3975
  6036.     ADJSP    SP,-13
  6037.     JRST    L.247
  6038. L.222:    JUMPLE    AC14,L.224            ;                                        3977
  6039.     MOVEI    AC1,-13(SP)            ;                                        3980
  6040.     PUSH    SP,AC1
  6041.     PUSH    SP,AC14
  6042.     PUSH    SP,C.40
  6043.     PUSH    SP,C.60
  6044.     PUSHJ    SP,U.81
  6045.     MOVE    AC14,AC1
  6046.     JUMPGE    AC14,L.223            ;                                        3982
  6047.     ADJSP    SP,-17
  6048.     JRST    L.247
  6049. L.223:    ADJSP    SP,-4                ;                                        3979
  6050. L.224:    ADJSP    SP,-4                ;                                        3972
  6051. L.225:    ADJSP    SP,-4                ;                                        3965
  6052. L.226:    MOVEI    AC1,-315(SP)            ;                                        3990
  6053.     HRLI    AC1,10700
  6054.     ILDB    AC16,AC1
  6055.     CAIE    AC16,106            ;                                        3996
  6056.     JRST    L.227
  6057.     PUSH    SP,C.20                ;                                        3998
  6058.     PUSH    SP,C.25
  6059.     PUSH    SP,U.56
  6060.     PUSHJ    SP,U.24
  6061.     ADJSP    SP,-6                ;                                        3999
  6062.     MOVEI    AC1,20                ;                                        3997
  6063.     JRST    L.249
  6064. L.227:    CAIE    AC16,114            ;                                        4006
  6065.     JRST    L.228
  6066.     PUSH    SP,C.20                ;                                        4008
  6067.     PUSH    SP,C.25
  6068.     PUSH    SP,U.56
  6069.     PUSHJ    SP,U.24
  6070.     PUSHJ    SP,SY%LOGOUT            ;                                        4009
  6071.     ADJSP    SP,-6                ;                                        4010
  6072.     MOVEI    AC1,21                ;                                        4007
  6073.     JRST    L.249
  6074. L.228:    CAIE    AC16,124            ;                                        4017
  6075.     JRST    L.231
  6076.     MOVE    AC1,GEN%1SIZE            ;                                        4019
  6077.     MOVE    AC2,C.11
  6078.     MOVEI    AC4,204
  6079.     MOVE    AC5,C.10
  6080.     EXTEND    AC1,C.1
  6081.     JFCL
  6082.     MOVE    AC1,GEN%1SIZE            ;                                        4020
  6083.     MOVEM    AC1,FILE%SIZE
  6084.     MOVEI    AC1,1                ;                                        4021
  6085.     MOVEM    AC1,U.62
  6086.     PUSH    SP,C.6                ;                                        4022
  6087.     PUSH    SP,C.61
  6088.     PUSHJ    SP,XFR%STATUS
  6089.     MOVEI    AC1,17                ;                                        4024
  6090.     CAME    AC1,U.51
  6091.     JRST    L.229
  6092.     MOVE    AC1,U.48
  6093.     CAME    AC1,U.47
  6094.     JRST    L.229
  6095.     MOVEI    AC1,22                ;                                        4028
  6096.     JRST    L.230
  6097. L.229:    MOVEI    AC1,1
  6098. L.230:    ADJSP    SP,-5                ;                                        4024
  6099.     JRST    L.249                ;                                        4018
  6100. L.231:    CAIE    AC16,104            ;                                        4032
  6101.     JRST    L.232
  6102.     MOVEI    AC14,2                ;                                        4033
  6103.     JRST    L.248                ;                                        3990
  6104. L.232:    CAIE    AC16,125            ;                                        4035
  6105.     JRST    L.233
  6106.     MOVEI    AC14,3                ;                                        4036
  6107.     JRST    L.248                ;                                        3990
  6108. L.233:    CAIE    AC16,105            ;                                        4038
  6109.     JRST    L.234
  6110.     MOVEI    AC14,4                ;                                        4039
  6111.     JRST    L.248                ;                                        3990
  6112. L.234:    CAIE    AC16,110            ;                                        4041
  6113.     JRST    L.235
  6114.     MOVEI    AC14,6                ;                                        4042
  6115.     JRST    L.248                ;                                        3990
  6116. L.235:    CAIE    AC16,111            ;                                        4044
  6117.     JRST    L.236
  6118.     MOVEI    AC14,10                ;                                        4045
  6119.     JRST    L.248                ;                                        3990
  6120. L.236:    CAIE    AC16,103            ;                                        4047
  6121.     JRST    L.237
  6122.     MOVEI    AC14,11                ;                                        4048
  6123.     JRST    L.248                ;                                        3990
  6124. L.237:    CAIE    AC16,122            ;                                        4050
  6125.     JRST    L.238
  6126.     MOVEI    AC14,12                ;                                        4051
  6127.     JRST    L.248                ;                                        3990
  6128. L.238:    CAIE    AC16,113            ;                                        4053
  6129.     JRST    L.239
  6130.     MOVEI    AC14,13                ;                                        4054
  6131.     JRST    L.248                ;                                        3990
  6132. L.239:    CAIE    AC16,127            ;                                        4056
  6133.     JRST    L.240
  6134.     MOVEI    AC14,14                ;                                        4057
  6135.     JRST    L.248                ;                                        3990
  6136. L.240:    CAIE    AC16,115            ;                                        4059
  6137.     JRST    L.241
  6138.     MOVEI    AC14,15                ;                                        4060
  6139.     JRST    L.248                ;                                        3990
  6140. L.241:    CAIE    AC16,121            ;                                        4062
  6141.     JRST    L.242
  6142.     MOVEI    AC14,16                ;                                        4063
  6143.     JRST    L.248                ;                                        3990
  6144. L.242:    CAIE    AC16,120            ;                                        4065
  6145.     JRST    L.243
  6146.     MOVEI    AC14,23                ;                                        4066
  6147.     JRST    L.248                ;                                        3990
  6148. L.243:    CAIE    AC16,112            ;                                        4068
  6149.     JRST    L.244
  6150.     MOVEI    AC14,21                ;                                        4069
  6151.     JRST    L.248                ;                                        3990
  6152. L.244:    CAIE    AC16,126            ;                                        4071
  6153.     JRST    L.245
  6154.     MOVEI    AC14,22                ;                                        4072
  6155.     JRST    L.248                ;                                        3990
  6156. L.245:    PUSH    SP,C.13                ;                                        4079
  6157. L.246:    PUSHJ    SP,KRM%ERROR
  6158.     ADJSP    SP,-4                ;                                        4080
  6159. L.247:    MOVEI    AC1,12                ;                                        4078
  6160.     JRST    L.249
  6161. L.248:    MOVEM    AC14,0(SP)            ;                                        4088
  6162.     PUSHJ    SP,U.17
  6163.     ADJSP    SP,-3
  6164. L.249:    ADJSP    SP,-312                ;                                        3857
  6165.     POP    SP,AC16
  6166.     POP    SP,AC14
  6167.     POPJ    SP,
  6168. C.55:    EXP    1752
  6169. C.56:    POINT    7,GEN%2DATA-1,34
  6170. C.57:    POINT    7,GEN%3DATA-1,34
  6171. C.58:    XWD    0,GEN%1SIZE
  6172. C.59:    XWD    0,GEN%2SIZE
  6173. C.60:    XWD    0,GEN%3SIZE
  6174. C.61:    EXP    107
  6175.  
  6176. ; Routine Size:  191 words
  6177.  
  6178.  
  6179. ;   4090  1    %SBTTL 'HOST%COMMAND - perform a host command'
  6180. ;   4091  1    ROUTINE HOST%COMMAND =
  6181. ;   4092  1
  6182. ;   4093  1    !++
  6183. ;   4094  1    ! FUNCTIONAL DESCRIPTION:
  6184. ;   4095  1    !
  6185. ;   4096  1    ! This routine will handle the host command packet.
  6186. ;   4097  1    ! It will set up the data for the call to the system routine.
  6187. ;   4098  1    !
  6188. ;   4099  1    ! CALLING SEQUENCE:
  6189. ;   4100  1    !
  6190. ;   4101  1    !    STATE = HOST%COMMAND();
  6191. ;   4102  1    !
  6192. ;   4103  1    ! INPUT PARAMETERS:
  6193. ;   4104  1    !
  6194. ;   4105  1    !    None.
  6195. ;   4106  1    !
  6196. ;   4107  1    ! IMPLICIT INPUTS:
  6197. ;   4108  1    !
  6198. ;   4109  1    !    Generic message receive in REC%MSG.
  6199. ;   4110  1    !
  6200. ;   4111  1    ! OUTPUT PARAMETERS:
  6201. ;   4112  1    !
  6202. ;   4113  1    !    Returns new state for FSM
  6203. ;   4114  1    !
  6204. ;   4115  1    ! IMPLICIT OUTPUTS:
  6205. ;   4116  1    !
  6206. ;   4117  1    !    None.
  6207. ;   4118  1    !
  6208. ;   4119  1    ! COMPLETION CODES:
  6209. ;   4120  1    !
  6210. ;   4121  1    !    None.
  6211. ;   4122  1    !
  6212. ;   4123  1    ! SIDE EFFECTS:
  6213. ;   4124  1    !
  6214. ;   4125  1    !    None.
  6215. ;   4126  1    !
  6216. ;   4127  1    !--
  6217. ;   4128  1
  6218. ;   4129  2        BEGIN
  6219. ;   4130  2        GEN%1SIZE = 0;
  6220. ;   4131  2        GEN%2SIZE = 0;
  6221. ;   4132  2        GEN%3SIZE = 0;
  6222. ;   4133  2
  6223. ;   4134  2        IF .REC%LENGTH LEQ 0
  6224. ;   4135  2        THEN
  6225. ;   4136  3        BEGIN
  6226. ;   4137  3        KRM%ERROR (KER%PROTOERR);        ! Return an error
  6227. ;   4138  3        RETURN STATE%A;                ! Just abort
  6228. ;   4139  2        END;
  6229. ;   4140  2
  6230. ;   4141  2        SET%STRING (CH$PTR (GEN%1DATA), MAX%MSG, TRUE);    ! Start writing to buffer
  6231. ;   4142  2        BFR%EMPTY ();                ! Dump the text
  6232. ;   4143  2        GEN%1SIZE = SET%STRING (0, 0, FALSE);    ! Get the result
  6233. ;   4144  2        RETURN CALL%SY%RTN (GC%COMMAND);
  6234. ;   4145  1        END;                    ! End of HOST%COMMAND
  6235.  
  6236.  
  6237. ; HOST%COMMAND
  6238. U.15:    SETZM    GEN%1SIZE            ;                                        4130
  6239.     SETZM    GEN%2SIZE            ;                                        4131
  6240.     SETZM    GEN%3SIZE            ;                                        4132
  6241.     SKIPLE    U.57                ;                                        4134
  6242.     JRST    L.250
  6243.     PUSH    SP,C.21                ;                                        4137
  6244.     PUSHJ    SP,KRM%ERROR
  6245.     ADJSP    SP,-1                ;                                        4138
  6246.     MOVEI    AC1,12                ;                                        4136
  6247.     POPJ    SP,
  6248. L.250:    PUSH    SP,C.11                ;                                        4141
  6249.     PUSH    SP,C.55
  6250.     PUSH    SP,C.2
  6251.     PUSHJ    SP,U.30
  6252.     PUSHJ    SP,U.28                ;                                        4142
  6253.     SETZM    -2(SP)                ;                                        4143
  6254.     SETZM    -1(SP)
  6255.     SETZM    0(SP)
  6256.     PUSHJ    SP,U.30
  6257.     MOVEM    AC1,GEN%1SIZE
  6258.     PUSH    SP,C.62                ;                                        4144
  6259.     PUSHJ    SP,U.17
  6260.     ADJSP    SP,-4
  6261.     POPJ    SP,                ;                                        4091
  6262. C.62:    EXP    17
  6263.  
  6264. ; Routine Size:  25 words
  6265.  
  6266.  
  6267. ;   4146  1    %SBTTL 'KERMIT%COMMAND - perform a KERMIT command'
  6268. ;   4147  1    ROUTINE KERMIT%COMMAND =
  6269. ;   4148  1
  6270. ;   4149  1    !++
  6271. ;   4150  1    ! FUNCTIONAL DESCRIPTION:
  6272. ;   4151  1    !
  6273. ;   4152  1    ! This routine will handle the KERMIT command packet.
  6274. ;   4153  1    ! It will set up the data for the call to the system routine.
  6275. ;   4154  1    !
  6276. ;   4155  1    ! CALLING SEQUENCE:
  6277. ;   4156  1    !
  6278. ;   4157  1    !    STATE = KERMIT%COMMAND();
  6279. ;   4158  1    !
  6280. ;   4159  1    ! INPUT PARAMETERS:
  6281. ;   4160  1    !
  6282. ;   4161  1    !    None.
  6283. ;   4162  1    !
  6284. ;   4163  1    ! IMPLICIT INPUTS:
  6285. ;   4164  1    !
  6286. ;   4165  1    !    Generic message receive in REC%MSG.
  6287. ;   4166  1    !
  6288. ;   4167  1    ! OUTPUT PARAMETERS:
  6289. ;   4168  1    !
  6290. ;   4169  1    !    Returns new state for FSM
  6291. ;   4170  1    !
  6292. ;   4171  1    ! IMPLICIT OUTPUTS:
  6293. ;   4172  1    !
  6294. ;   4173  1    !    None.
  6295. ;   4174  1    !
  6296. ;   4175  1    ! COMPLETION CODES:
  6297. ;   4176  1    !
  6298. ;   4177  1    !    None.
  6299. ;   4178  1    !
  6300. ;   4179  1    ! SIDE EFFECTS:
  6301. ;   4180  1    !
  6302. ;   4181  1    !    None.
  6303. ;   4182  1    !
  6304. ;   4183  1    !--
  6305. ;   4184  1
  6306. ;   4185  2        BEGIN
  6307. ;   4186  2        GEN%1SIZE = 0;
  6308. ;   4187  2        GEN%2SIZE = 0;
  6309. ;   4188  2        GEN%3SIZE = 0;
  6310. ;   4189  2
  6311. ;   4190  2        IF .REC%LENGTH LEQ 0
  6312. ;   4191  2        THEN
  6313. ;   4192  3        BEGIN
  6314. ;   4193  3        KRM%ERROR (KER%PROTOERR);        ! Return an error
  6315. ;   4194  3        RETURN STATE%A;                ! Just abort
  6316. ;   4195  2        END;
  6317. ;   4196  2
  6318. ;   4197  2        SET%STRING (CH$PTR (GEN%1DATA), MAX%MSG, TRUE);    ! Start writing to buffer
  6319. ;   4198  2        BFR%EMPTY ();                ! Dump the text
  6320. ;   4199  2        GEN%1SIZE = SET%STRING (0, 0, FALSE);    ! Get the result
  6321. ;   4200  2        RETURN CALL%SY%RTN (GC%KERMIT);
  6322. ;   4201  1        END;                    ! End of KERMIT%COMMAND
  6323.  
  6324.  
  6325. ; KERMIT%COMMAND
  6326. U.16:    SETZM    GEN%1SIZE            ;                                        4186
  6327.     SETZM    GEN%2SIZE            ;                                        4187
  6328.     SETZM    GEN%3SIZE            ;                                        4188
  6329.     SKIPLE    U.57                ;                                        4190
  6330.     JRST    L.251
  6331.     PUSH    SP,C.21                ;                                        4193
  6332.     PUSHJ    SP,KRM%ERROR
  6333.     ADJSP    SP,-1                ;                                        4194
  6334.     MOVEI    AC1,12                ;                                        4192
  6335.     POPJ    SP,
  6336. L.251:    PUSH    SP,C.11                ;                                        4197
  6337.     PUSH    SP,C.55
  6338.     PUSH    SP,C.2
  6339.     PUSHJ    SP,U.30
  6340.     PUSHJ    SP,U.28                ;                                        4198
  6341.     SETZM    -2(SP)                ;                                        4199
  6342.     SETZM    -1(SP)
  6343.     SETZM    0(SP)
  6344.     PUSHJ    SP,U.30
  6345.     MOVEM    AC1,GEN%1SIZE
  6346.     PUSH    SP,C.63                ;                                        4200
  6347.     PUSHJ    SP,U.17
  6348.     ADJSP    SP,-4
  6349.     POPJ    SP,                ;                                        4147
  6350. C.63:    EXP    20
  6351.  
  6352. ; Routine Size:  25 words
  6353.  
  6354.  
  6355. ;   4202  1    %SBTTL 'CALL%SY%RTN - handle operating system dependent functions'
  6356. ;   4203  1    ROUTINE CALL%SY%RTN (G%FUNC) =
  6357. ;   4204  1
  6358. ;   4205  1    !++
  6359. ;   4206  1    ! FUNCTIONAL DESCRIPTION:
  6360. ;   4207  1    !
  6361. ;   4208  1    ! This routine will handle calling the operating system dependent routine
  6362. ;   4209  1    ! for a server function and returning the response.
  6363. ;   4210  1    !
  6364. ;   4211  1    ! CALLING SEQUENCE:
  6365. ;   4212  1    !
  6366. ;   4213  1    !    STATE = CALL%SY%RTN(.G%FUNC);
  6367. ;   4214  1    !
  6368. ;   4215  1    ! INPUT PARAMETERS:
  6369. ;   4216  1    !
  6370. ;   4217  1    !    G%FUNC - Generic function code
  6371. ;   4218  1    !
  6372. ;   4219  1    ! IMPLICIT INPUTS:
  6373. ;   4220  1    !
  6374. ;   4221  1    !    Generic message data in GEN%1DATA
  6375. ;   4222  1    !
  6376. ;   4223  1    ! OUTPUT PARAMETERS:
  6377. ;   4224  1    !
  6378. ;   4225  1    !    Returns new state for FSM
  6379. ;   4226  1    !
  6380. ;   4227  1    ! IMPLICIT OUTPUTS:
  6381. ;   4228  1    !
  6382. ;   4229  1    !    None.
  6383. ;   4230  1    !
  6384. ;   4231  1    ! COMPLETION CODES:
  6385. ;   4232  1    !
  6386. ;   4233  1    !    None.
  6387. ;   4234  1    !
  6388. ;   4235  1    ! SIDE EFFECTS:
  6389. ;   4236  1    !
  6390. ;   4237  1    !    None.
  6391. ;   4238  1    !
  6392. ;   4239  1    !--
  6393. ;   4240  1
  6394. ;   4241  2        BEGIN
  6395. ;   4242  2
  6396. ;   4243  2        LOCAL
  6397. ;   4244  2        STRING%ADDRESS,                ! Address of string result
  6398. ;   4245  2        STRING%LENGTH,                ! Length of string result
  6399. ;   4246  2        GET%CHR%SUBROUTINE,            ! Routine to get a response character
  6400. ;   4247  2        STATUS;                    ! Status value
  6401. ;   4248  2
  6402. ;   4249  2    !
  6403. ;   4250  2    ! Call the routine with the desired type of command.
  6404. ;   4251  2    !
  6405. ;   4252  2        STRING%LENGTH = 0;                ! Initialize for no string
  6406. ;   4253  2        GET%CHR%SUBROUTINE = 0;            ! And no subroutine
  6407. ;   4254  2
  6408. ;   4255  2        IF NOT SY%GENERIC (.G%FUNC, STRING%ADDRESS, STRING%LENGTH, GET%CHR%SUBROUTINE)
  6409. ;   4256  2        THEN
  6410. ;   4257  2        RETURN STATE%A;                ! And abort
  6411. ;   4258  2
  6412. ;   4259  2        IF .STRING%LENGTH GTR 0
  6413. ;   4260  2        THEN
  6414. ;   4261  3        BEGIN
  6415. ;   4262  3        SET%STRING (CH$PTR (.STRING%ADDRESS), .STRING%LENGTH, TRUE);
  6416. ;   4263  3
  6417. ;   4264  3        IF .STRING%LENGTH LSS .SEND%PKT%SIZE - PKT%OVR%HEAD
  6418. ;   4265  3        THEN
  6419. ;   4266  4            BEGIN
  6420. ;   4267  4            BFR%FILL (TRUE);            ! If it should fit, pack it in
  6421. ;   4268  4
  6422. ;   4269  4            IF SET%STRING (0, 0, FALSE) GEQ .STRING%LENGTH
  6423. ;   4270  4            THEN                 ! It fit, so just send the ACK
  6424. ;   4271  4
  6425. ;   4272  4            IF SEND%PACKET (MSG%ACK, .SIZE, .REC%SEQ) THEN RETURN STATE%C ELSE RETURN STATE%EX;
  6426. ;   4273  4
  6427. ;   4274  4    !
  6428. ;   4275  4    ! It didn't fit, reset the pointers to the beginning
  6429. ;   4276  4    !
  6430. ;   4277  4            SET%STRING (CH$PTR (.STRING%ADDRESS), .STRING%LENGTH, TRUE);
  6431. ;   4278  3            END;
  6432. ;   4279  3
  6433. ;   4280  3        NO%FILE%NEEDED = TRUE;            ! Don't need a file
  6434. ;   4281  3        END
  6435. ;   4282  2        ELSE
  6436. ;   4283  2
  6437. ;   4284  2        IF .GET%CHR%SUBROUTINE NEQ 0        ! If we got a subroutine back
  6438. ;   4285  2        THEN
  6439. ;   4286  3            BEGIN
  6440. ;   4287  3            GET%CHR%ROUTINE = .GET%CHR%SUBROUTINE;
  6441. ;   4288  3            NO%FILE%NEEDED = TRUE;
  6442. ;   4289  2            END;
  6443. ;   4290  2
  6444. ;   4291  2        TEXT%HEAD%FLAG = TRUE;            ! Send to be typed
  6445. ;   4292  2        XFR%STATUS (%C'I', %C'G');            ! Doing a generic command
  6446. ;   4293  2
  6447. ;   4294  2        IF .STATE EQL STATE%II AND .BLK%CHK%TYPE EQL .INI%CHK%TYPE
  6448. ;   4295  2        THEN
  6449. ;   4296  2        RETURN STATE%OF
  6450. ;   4297  2        ELSE
  6451. ;   4298  2        RETURN STATE%S;                ! Send the response
  6452. ;   4299  2
  6453. ;   4300  1        END;                    ! End of CALL%SY%RTN
  6454.  
  6455.  
  6456. ; CALL%SY%RTN
  6457. U.17:    PUSH    SP,AC14                ;                                        4203
  6458.     PUSH    SP,AC16
  6459.     ADJSP    SP,3
  6460.     SETZM    -1(SP)                ;                                        4252
  6461.     SETZM    -2(SP)                ;                                        4253
  6462.     PUSH    SP,-6(SP)            ;                                        4255
  6463.     MOVEI    AC1,-1(SP)
  6464.     PUSH    SP,AC1
  6465.     MOVEI    AC1,-3(SP)
  6466.     PUSH    SP,AC1
  6467.     MOVEI    AC1,-5(SP)
  6468.     PUSH    SP,AC1
  6469.     PUSHJ    SP,SY%GENERIC
  6470.     ADJSP    SP,-4
  6471.     TRNE    AC1,1
  6472.     JRST    L.252
  6473.     MOVEI    AC1,12                ;                                        4257
  6474.     JRST    L.261
  6475. L.252:    MOVE    AC14,-1(SP)            ;                                        4259
  6476.     JUMPLE    AC14,L.257
  6477.     MOVE    AC16,0(SP)            ;                                        4262
  6478.     MOVEI    AC1,-1(AC16)
  6479.     HRLI    AC1,10700
  6480.     PUSH    SP,AC1
  6481.     PUSH    SP,AC14
  6482.     PUSH    SP,C.2
  6483.     PUSHJ    SP,U.30
  6484.     MOVE    AC1,U.40            ;                                        4264
  6485.     SUBI    AC1,3
  6486.     CAML    AC14,AC1
  6487.     JRST    L.256
  6488.     PUSH    SP,C.2                ;                                        4267
  6489.     PUSHJ    SP,U.29
  6490.     SETZM    -2(SP)                ;                                        4269
  6491.     SETZM    -1(SP)
  6492.     SETZM    0(SP)
  6493.     PUSHJ    SP,U.30
  6494.     CAMGE    AC1,AC14
  6495.     JRST    L.255
  6496.     PUSH    SP,C.20                ;                                        4272
  6497.     PUSH    SP,U.52
  6498.     PUSH    SP,U.56
  6499.     PUSHJ    SP,U.24
  6500.     ADJSP    SP,-3
  6501.     TRNN    AC1,1
  6502.     JRST    L.253
  6503.     MOVEI    AC1,11
  6504.     JRST    L.254
  6505. L.253:    MOVEI    AC1,23
  6506. L.254:    ADJSP    SP,-4
  6507.     JRST    L.261
  6508. L.255:    MOVEI    AC1,-1(AC16)            ;                                        4277
  6509.     HRLI    AC1,10700
  6510.     PUSH    SP,AC1
  6511.     PUSH    SP,AC14
  6512.     PUSH    SP,C.2
  6513.     PUSHJ    SP,U.30
  6514.     ADJSP    SP,-4                ;                                        4266
  6515. L.256:    MOVEI    AC1,1                ;                                        4280
  6516.     MOVEM    AC1,U.63
  6517.     ADJSP    SP,-3                ;                                        4261
  6518.     JRST    L.258                ;                                        4259
  6519. L.257:    MOVE    AC1,-2(SP)            ;                                        4284
  6520.     JUMPE    AC1,L.258
  6521.     MOVEM    AC1,U.67            ;                                        4287
  6522.     MOVEI    AC1,1                ;                                        4288
  6523.     MOVEM    AC1,U.63
  6524. L.258:    MOVEI    AC1,1                ;                                        4291
  6525.     MOVEM    AC1,U.62
  6526.     PUSH    SP,C.6                ;                                        4292
  6527.     PUSH    SP,C.61
  6528.     PUSHJ    SP,XFR%STATUS
  6529.     MOVEI    AC1,17                ;                                        4294
  6530.     CAME    AC1,U.51
  6531.     JRST    L.259
  6532.     MOVE    AC1,U.48
  6533.     CAME    AC1,U.47
  6534.     JRST    L.259
  6535.     MOVEI    AC1,22                ;                                        4298
  6536.     JRST    L.260
  6537. L.259:    MOVEI    AC1,1
  6538. L.260:    ADJSP    SP,-2                ;                                        4294
  6539. L.261:    ADJSP    SP,-3                ;                                        4203
  6540.     POP    SP,AC16
  6541.     POP    SP,AC14
  6542.     POPJ    SP,
  6543.  
  6544. ; Routine Size:  86 words
  6545.  
  6546.  
  6547. ;   4301  1    %SBTTL 'Message processing -- PRS%SEND%INIT - Parse send init params'
  6548. ;   4302  1    ROUTINE PRS%SEND%INIT =
  6549. ;   4303  1
  6550. ;   4304  1    !++
  6551. ;   4305  1    ! FUNCTIONAL DESCRIPTION:
  6552. ;   4306  1    !
  6553. ;   4307  1    !    This routine will parse the SEND%INIT parameters that were sent by
  6554. ;   4308  1    !    the remote Kermit.  The items will be stored into the low segment.
  6555. ;   4309  1    !
  6556. ;   4310  1    ! CALLING SEQUENCE:
  6557. ;   4311  1    !
  6558. ;   4312  1    !    PRS%SEND%INIT ();
  6559. ;   4313  1    !
  6560. ;   4314  1    ! INPUT PARAMETERS:
  6561. ;   4315  1    !
  6562. ;   4316  1    !    None.
  6563. ;   4317  1    !
  6564. ;   4318  1    ! IMPLICIT INPUTS:
  6565. ;   4319  1    !
  6566. ;   4320  1    !    Message stored in REC%MSG.
  6567. ;   4321  1    !
  6568. ;   4322  1    ! OUTPUT PARAMETERS:
  6569. ;   4323  1    !
  6570. ;   4324  1    !    None.
  6571. ;   4325  1    !
  6572. ;   4326  1    ! IMPLICIT OUTPUTS:
  6573. ;   4327  1    !
  6574. ;   4328  1    !    None.
  6575. ;   4329  1    !
  6576. ;   4330  1    ! COMPLETION CODES:
  6577. ;   4331  1    !
  6578. ;   4332  1    !    None.
  6579. ;   4333  1    !
  6580. ;   4334  1    ! SIDE EFFECTS:
  6581. ;   4335  1    !
  6582. ;   4336  1    !    None.
  6583. ;   4337  1    !
  6584. ;   4338  1    !--
  6585. ;   4339  1
  6586. ;   4340  2        BEGIN
  6587. ;   4341  2    ! The following section of code will parse the various send parameters
  6588. ;   4342  2    ! that are found in the send-init message.  The following code will store
  6589. ;   4343  2    ! the following as the value.
  6590. ;   4344  2    !
  6591. ;   4345  2    ! If the user specified a value then the user supplied value will be used else
  6592. ;   4346  2    ! the value in the message and if none in the message then the default value.
  6593. ;   4347  2    !
  6594. ;   4348  2    ! User supplied values are denoted as positive values in SND%xxxxxxx.
  6595. ;   4349  2    !
  6596. ;   4350  2    ! Parse the packet size
  6597. ;   4351  2    !
  6598. ;   4352  3        SEND%PKT%SIZE = (IF .SND%PKT%SIZE GEQ 0 THEN        ! [108]
  6599. ;   4353  3          (IF .SND%PKT%SIZE GTR 94 THEN 94 ELSE .SND%PKT%SIZE) ELSE    ! [108]
  6600. ;   4354  4        BEGIN
  6601. ;   4355  4
  6602. ;   4356  4        IF .REC%LENGTH GTR P%SI%BUFSIZ
  6603. ;   4357  4        THEN
  6604. ; P 4358  4            UNCHAR (CH$RCHAR (CH$PTR (REC%MSG,
  6605. ;   4359  5                .RECV%PKT%MSG + P%SI%BUFSIZ, CHR%SIZE))) ! [108]
  6606. ;   4360  4        ELSE
  6607. ;   4361  4            ABS (.SND%PKT%SIZE)
  6608. ;   4362  4
  6609. ;   4363  4        END
  6610. ;   4364  2        );
  6611. ;   4365  2    !
  6612. ;   4366  2    ! Parse the time out value
  6613. ;   4367  2    !
  6614. ;   4368  3        SEND%TIMEOUT = (IF .SND%TIMEOUT GEQ 0 THEN .SND%TIMEOUT ELSE
  6615. ;   4369  4        BEGIN
  6616. ;   4370  4
  6617. ;   4371  4        IF .REC%LENGTH GTR P%SI%TIMOUT
  6618. ;   4372  4        THEN
  6619. ; P 4373  4            UNCHAR (CH$RCHAR (CH$PTR (REC%MSG,
  6620. ;   4374  5                .RECV%PKT%MSG + P%SI%TIMOUT, CHR%SIZE))) ! [108]
  6621. ;   4375  4        ELSE
  6622. ;   4376  4            ABS (.SND%TIMEOUT)
  6623. ;   4377  4
  6624. ;   4378  4        END
  6625. ;   4379  2        );
  6626. ;   4380  2    !
  6627. ;   4381  2    ! Parse the number of padding characters supplied
  6628. ;   4382  2    !
  6629. ;   4383  3        SEND%NPAD = (IF .SND%NPAD GEQ 0 THEN .SND%NPAD ELSE
  6630. ;   4384  4        BEGIN
  6631. ;   4385  4
  6632. ;   4386  4        IF .REC%LENGTH GTR P%SI%NPAD
  6633. ;   4387  4        THEN
  6634. ; P 4388  4            UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%NPAD,
  6635. ;   4389  5                CHR%SIZE)))                       ! [108]
  6636. ;   4390  4        ELSE
  6637. ;   4391  4            ABS (.SND%NPAD)
  6638. ;   4392  4
  6639. ;   4393  4        END
  6640. ;   4394  2        );
  6641. ;   4395  2    !
  6642. ;   4396  2    ! Parse the padding character
  6643. ;   4397  2    !
  6644. ;   4398  3        SEND%PADCHAR = (IF .SND%PADCHAR GEQ 0 THEN .SND%PADCHAR ELSE
  6645. ;   4399  4        BEGIN
  6646. ;   4400  4
  6647. ;   4401  4        IF .REC%LENGTH GTR P%SI%PAD
  6648. ;   4402  4        THEN
  6649. ; P 4403  4            CTL (CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%PAD,
  6650. ;   4404  5                CHR%SIZE)))                       ! [108]
  6651. ;   4405  4        ELSE
  6652. ;   4406  4            ABS (.SND%PADCHAR)
  6653. ;   4407  4
  6654. ;   4408  4        END
  6655. ;   4409  2        );
  6656. ;   4410  2    !
  6657. ;   4411  2    ! Parse the end of line character
  6658. ;   4412  2    !
  6659. ;   4413  3        SEND%EOL = (IF .SND%EOL GEQ 0 THEN .SND%EOL ELSE
  6660. ;   4414  4        BEGIN
  6661. ;   4415  4
  6662. ;   4416  4        IF .REC%LENGTH GTR P%SI%EOL
  6663. ;   4417  4        THEN
  6664. ; P 4418  4            UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%EOL,
  6665. ;   4419  5                CHR%SIZE)))                       ! [108]
  6666. ;   4420  4        ELSE
  6667. ;   4421  4            ABS (.SND%EOL)
  6668. ;   4422  4
  6669. ;   4423  4        END
  6670. ;   4424  2        );
  6671. ;   4425  2    !
  6672. ;   4426  2    ! Parse the quoting character
  6673. ;   4427  2    !
  6674. ;   4428  3        SEND%QUOTE%CHR = (IF .SND%QUOTE%CHR GEQ 0 THEN .SND%QUOTE%CHR ELSE
  6675. ;   4429  4        BEGIN
  6676. ;   4430  4
  6677. ;   4431  4        IF .REC%LENGTH GTR P%SI%QUOTE
  6678. ;   4432  4        THEN
  6679. ;   4433  4            CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%QUOTE,     ! [108]
  6680. ;   4434  4                CHR%SIZE))
  6681. ;   4435  4        ELSE
  6682. ;   4436  4            ABS (.SND%QUOTE%CHR)
  6683. ;   4437  4
  6684. ;   4438  4        END
  6685. ;   4439  2        );
  6686. ;   4440  2    !
  6687. ;   4441  2    ! Parse the 8-bit quoting character
  6688. ;   4442  2    !
  6689. ;   4443  2    ! If the character was not included in the packet, assume no eight-bit
  6690. ;   4444  2    ! quoting allowed (we are probably talking to an old version of Kermit).
  6691. ;   4445  2    !
  6692. ;   4446  3        SEND%8QUOTE%CHR = (IF .REC%LENGTH GTR P%SI%8QUOTE THEN CH$RCHAR(CH$PTR (REC%MSG,
  6693. ;   4447  3            .RECV%PKT%MSG + P%SI%8QUOTE, CHR%SIZE)) ELSE %C'N' ! [108] ! Assume no 8-bit quoting allowed
  6694. ;   4448  2        );
  6695. ;   4449  2    !
  6696. ;   4450  2    ! Parse the checksum type
  6697. ;   4451  2    !
  6698. ;   4452  2
  6699. ;   4453  2        IF .REC%LENGTH GTR P%SI%CHKTYPE
  6700. ;   4454  2        THEN
  6701. ;   4455  3        BEGIN
  6702. ;   4456  3
  6703. ;   4457  3        LOCAL
  6704. ;   4458  3            REQ%CHK%TYPE;
  6705. ;   4459  3
  6706. ;   4460  3        REQ%CHK%TYPE = CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG +      ! [108]
  6707. ;   4461  3                        P%SI%CHKTYPE, CHR%SIZE));
  6708. ;   4462  3
  6709. ;   4463  3        IF .REC%TYPE NEQ MSG%ACK
  6710. ;   4464  3        THEN
  6711. ;   4465  3
  6712. ;   4466  3            IF .REQ%CHK%TYPE GEQ CHK%1CHAR AND .REQ%CHK%TYPE LEQ CHK%CRC
  6713. ;   4467  3            THEN
  6714. ;   4468  3            INI%CHK%TYPE = .REQ%CHK%TYPE
  6715. ;   4469  3            ELSE
  6716. ;   4470  3            INI%CHK%TYPE = CHK%1CHAR
  6717. ;   4471  3
  6718. ;   4472  3        ELSE
  6719. ;   4473  3
  6720. ;   4474  3            IF .REQ%CHK%TYPE NEQ .CHKTYPE
  6721. ;   4475  3            THEN
  6722. ;   4476  3            INI%CHK%TYPE = CHK%1CHAR
  6723. ;   4477  3            ELSE
  6724. ;   4478  3            INI%CHK%TYPE = .REQ%CHK%TYPE
  6725. ;   4479  3
  6726. ;   4480  3        END
  6727. ;   4481  2        ELSE
  6728. ;   4482  2        INI%CHK%TYPE = CHK%1CHAR;        ! Only single character checksum if not specified
  6729. ;   4483  2
  6730. ;   4484  2    !
  6731. ;   4485  2    ! Parse the repeat character
  6732. ;   4486  2    !
  6733. ;   4487  3        REPT%CHR = (IF .REC%LENGTH GTR P%SI%REPEAT THEN CH$RCHAR (CH$PTR (REC%MSG,
  6734. ;   4488  2            .RECV%PKT%MSG + P%SI%REPEAT, CHR%SIZE)) ELSE %C' ');   ! [108]
  6735. ;   4489  2    !                                       ! [108]
  6736. ;   4490  2    ! Parse the capas field, if present and if we enabled extended length  ! [108]
  6737. ;   4491  2    !                                       ! [108]
  6738. ;   4492  2                                           ! [108]
  6739. ;   4493  3        IF (.REC%LENGTH GTR P%SI%CAPAS) AND (ABS(.SND%PKT%SIZE) GTR 94)   ! [108]
  6740. ;   4494  2        THEN                                   ! [108]
  6741. ;   4495  3        BEGIN                                   ! [108]
  6742. ;   4496  3                                           ! [108]
  6743. ;   4497  3        LOCAL                                   ! [108]
  6744. ;   4498  3            CAPAS%OFFSET;                           ! [108]
  6745. ;   4499  3                                           ! [108]
  6746. ;   4500  3        CAPAS%OFFSET = .RECV%PKT%MSG + P%SI%CAPAS;               ! [108]
  6747. ;   4501  3
  6748. ;   4502  3        IF (UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .CAPAS%OFFSET, CHR%SIZE))) AND 2) NEQ 0
  6749. ;   4503  3        THEN                                   ! [108]
  6750. ;   4504  4            BEGIN                               ! [108]
  6751. ;   4505  4                                           ! [108]
  6752. ;   4506  4            SEND%PKT%SIZE = 500;                       ! [108]
  6753. ;   4507  4                                           ! [108]
  6754. ;   4508  4            WHILE (.REC%LENGTH GTR .CAPAS%OFFSET-.RECV%PKT%MSG) AND    ! [108]
  6755. ; P 4509  6              ((UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .CAPAS%OFFSET,  ! [108]
  6756. ;   4510  4                            CHR%SIZE))) AND 1) EQL 1) DO   ! [108]
  6757. ;   4511  5            BEGIN                               ! [108]
  6758. ;   4512  5            CAPAS%OFFSET = .CAPAS%OFFSET + 1;               ! [108]
  6759. ;   4513  4            END;                               ! [108]
  6760. ;   4514  4            IF .REC%LENGTH GTR .CAPAS%OFFSET-.RECV%PKT%MSG+3           ! [108]
  6761. ;   4515  4            THEN                               ! [108]
  6762. ; P 4516  4            SEND%PKT%SIZE = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG,     ! [108]
  6763. ;   4517  4                        .CAPAS%OFFSET+2, CHR%SIZE))) * 95 +
  6764. ; P 4518  4                    UNCHAR (CH$RCHAR (CH$PTR (REC%MSG,     ! [108]
  6765. ;   4519  4                        .CAPAS%OFFSET+3, CHR%SIZE)));  ! [108]
  6766. ;   4520  4            IF .SEND%PKT%SIZE GTR MAX%MSG - 2                   ! [108]
  6767. ;   4521  4            THEN                               ! [108]
  6768. ;   4522  4            SEND%PKT%SIZE = MAX%MSG - 2;                   ! [108]
  6769. ;   4523  4            IF .SEND%PKT%SIZE GTR ABS(.SND%PKT%SIZE)               ! [108]
  6770. ;   4524  4            THEN                               ! [108]
  6771. ;   4525  4            SEND%PKT%SIZE = ABS(.SND%PKT%SIZE);               ! [108]
  6772. ;   4526  3            END;                               ! [108]
  6773. ;   4527  2        END;                                   ! [108]
  6774. ;   4528  2    !
  6775. ;   4529  2    ! Check for a valid quoting character.  If it is not valid, then we have
  6776. ;   4530  2    ! a protocol error
  6777. ;   4531  2    !
  6778. ;   4532  2
  6779. ;   4533  4        IF NOT ((.SEND%QUOTE%CHR GEQ %O'41' AND .SEND%QUOTE%CHR LEQ %O'76') OR (.SEND%QUOTE%CHR GEQ %O
  6780. ;   4534  3        '140' AND .SEND%QUOTE%CHR LEQ %O'176'))
  6781. ;   4535  2        THEN
  6782. ;   4536  3        BEGIN
  6783. ;   4537  3        KRM%ERROR (KER%PROTOERR);
  6784. ;   4538  3        RETURN KER%PROTOERR;
  6785. ;   4539  2        END;
  6786. ;   4540  2
  6787. ;   4541  2    !
  6788. ;   4542  2    ! Check for a valid 8 bit quoting and set the 8 bit quoting flag as needed
  6789. ;   4543  2    !
  6790. ;   4544  2
  6791. ;   4545  5        IF ( NOT ((.SEND%8QUOTE%CHR GEQ %O'041' AND .SEND%8QUOTE%CHR LEQ %O'076') OR (.SEND%8QUOTE%CHR
  6792. ;   4546  5        GEQ %O'140' AND .SEND%8QUOTE%CHR LEQ %O'176') OR (.SEND%8QUOTE%CHR EQL %C'N') OR (
  6793. ;   4547  2        .SEND%8QUOTE%CHR EQL %C'Y'))) OR .SEND%8QUOTE%CHR EQL .SEND%QUOTE%CHR OR .SEND%8QUOTE%CHR
  6794. ;   4548  2        EQL .RCV%QUOTE%CHR
  6795. ;   4549  2        THEN
  6796. ;   4550  3        BEGIN
  6797. ;   4551  3        KRM%ERROR (KER%PROTOERR);
  6798. ;   4552  3        RETURN KER%PROTOERR;
  6799. ;   4553  2        END;
  6800. ;   4554  2
  6801. ;   4555  2        IF .SEND%8QUOTE%CHR EQL %C'Y' THEN SEND%8QUOTE%CHR = .RECV%8QUOTE%CHR;
  6802. ;   4556  2
  6803. ;   4557  2        IF .SEND%8QUOTE%CHR NEQ %C'N' AND .SEND%8QUOTE%CHR NEQ %C'Y'
  6804. ;   4558  2        THEN
  6805. ;   4559  2        FLAG%8QUOTE = TRUE
  6806. ;   4560  2        ELSE
  6807. ;   4561  2        FLAG%8QUOTE = FALSE;
  6808. ;   4562  2
  6809. ;   4563  2    !
  6810. ;   4564  2    ! Check the repeat character and set flags
  6811. ;   4565  2    !
  6812. ;   4566  2
  6813. ;   4567  5        IF ( NOT ((.REPT%CHR GEQ %O'41' AND .REPT%CHR LEQ %O'76') OR(.REPT%CHR GEQ %O'140' AND
  6814. ;   4568  3        .REPT%CHR LEQ %O'176')) OR .REPT%CHR EQL .SEND%QUOTE%CHR OR .REPT%CHR EQL .SEND%8QUOTE%CHR
  6815. ;   4569  2        OR .REPT%CHR EQL .RCV%QUOTE%CHR) AND .REPT%CHR NEQ %C' '
  6816. ;   4570  2        THEN
  6817. ;   4571  3        BEGIN
  6818. ;   4572  3        KRM%ERROR (KER%PROTOERR);
  6819. ;   4573  3        RETURN KER%PROTOERR;
  6820. ;   4574  2        END;
  6821. ;   4575  2
  6822. ;   4576  2        IF .REPT%CHR NEQ %C' ' THEN FLAG%REPEAT = TRUE ELSE FLAG%REPEAT = FALSE;
  6823. ;   4577  2
  6824. ;   4578  2        RETURN KER%NORMAL;
  6825. ;   4579  1        END;                    ! End of PRS%SEND%INIT
  6826.  
  6827.  
  6828. ; PRS%SEND%INIT
  6829. U.21:    MOVE    AC4,SND%PKT%SIZE        ;                                        4352
  6830.     JUMPL    AC4,L.263
  6831.     CAIG    AC4,136                ;                                        4353
  6832.     JRST    L.262
  6833.     MOVEI    AC1,136
  6834.     JRST    L.265
  6835. L.262:    MOVE    AC1,AC4
  6836.     JRST    L.265                ;                                        4352
  6837. L.263:    SKIPG    U.57                ;                                        4356
  6838.     JRST    L.264
  6839.     MOVE    AC2,C.27            ;                                        4359
  6840.     MOVE    AC1,U.39
  6841.     ADJBP    AC1,AC2
  6842.     ILDB    AC1,AC1
  6843.     SUBI    AC1,40
  6844.     JRST    L.265                ;                                        4354
  6845. L.264:    MOVM    AC1,AC4                ;                                        4361
  6846. L.265:    MOVEM    AC1,U.40            ;                                        4352
  6847.     MOVE    AC1,SND%TIMEOUT            ;                                        4368
  6848.     JUMPGE    AC1,L.267
  6849.     MOVEI    AC2,1                ;                                        4371
  6850.     CAML    AC2,U.57
  6851.     JRST    L.266
  6852.     MOVE    AC1,U.39            ;                                        4374
  6853.     ADDI    AC1,1
  6854.     MOVE    AC2,C.27
  6855.     ADJBP    AC1,AC2
  6856.     ILDB    AC1,AC1
  6857.     SUBI    AC1,40
  6858.     JRST    L.267                ;                                        4369
  6859. L.266:    MOVM    AC1,AC1                ;                                        4376
  6860. L.267:    MOVEM    AC1,SEND%TIMEOUT        ;                                        4368
  6861.     MOVE    AC1,SND%NPAD            ;                                        4383
  6862.     JUMPGE    AC1,L.269
  6863.     MOVEI    AC2,2                ;                                        4386
  6864.     CAML    AC2,U.57
  6865.     JRST    L.268
  6866.     MOVE    AC1,U.39            ;                                        4389
  6867.     ADDI    AC1,2
  6868.     MOVE    AC2,C.27
  6869.     ADJBP    AC1,AC2
  6870.     ILDB    AC1,AC1
  6871.     SUBI    AC1,40
  6872.     JRST    L.269                ;                                        4384
  6873. L.268:    MOVM    AC1,AC1                ;                                        4391
  6874. L.269:    MOVEM    AC1,U.41            ;                                        4383
  6875.     MOVE    AC1,SND%PADCHAR            ;                                        4398
  6876.     JUMPGE    AC1,L.271
  6877.     MOVEI    AC2,3                ;                                        4401
  6878.     CAML    AC2,U.57
  6879.     JRST    L.270
  6880.     MOVE    AC1,U.39            ;                                        4404
  6881.     ADDI    AC1,3
  6882.     MOVE    AC2,C.27
  6883.     ADJBP    AC1,AC2
  6884.     ILDB    AC1,AC1
  6885.     TRCA    AC1,100
  6886. L.270:    MOVM    AC1,AC1                ;                                        4406
  6887. L.271:    MOVEM    AC1,U.42            ;                                        4398
  6888.     MOVE    AC1,SND%EOL            ;                                        4413
  6889.     JUMPGE    AC1,L.273
  6890.     MOVEI    AC2,4                ;                                        4416
  6891.     CAML    AC2,U.57
  6892.     JRST    L.272
  6893.     MOVE    AC1,U.39            ;                                        4419
  6894.     ADDI    AC1,4
  6895.     MOVE    AC2,C.27
  6896.     ADJBP    AC1,AC2
  6897.     ILDB    AC1,AC1
  6898.     SUBI    AC1,40
  6899.     JRST    L.273                ;                                        4414
  6900. L.272:    MOVM    AC1,AC1                ;                                        4421
  6901. L.273:    MOVEM    AC1,U.43            ;                                        4413
  6902.     MOVE    AC1,SND%QUOTE%CHR        ;                                        4428
  6903.     JUMPGE    AC1,L.275
  6904.     MOVEI    AC2,5                ;                                        4431
  6905.     CAML    AC2,U.57
  6906.     JRST    L.274
  6907.     MOVE    AC1,U.39            ;                                        4433
  6908.     ADDI    AC1,5
  6909.     MOVE    AC2,C.27
  6910.     ADJBP    AC1,AC2
  6911.     ILDB    AC1,AC1
  6912.     JRST    L.275                ;                                        4429
  6913. L.274:    MOVM    AC1,AC1                ;                                        4436
  6914. L.275:    MOVEM    AC1,U.44            ;                                        4428
  6915.     MOVE    AC3,U.57            ;                                        4446
  6916.     CAIG    AC3,6
  6917.     JRST    L.276
  6918.     MOVE    AC1,U.39            ;                                        4447
  6919.     ADDI    AC1,6
  6920.     MOVE    AC2,C.27
  6921.     ADJBP    AC1,AC2
  6922.     ILDB    AC1,AC1
  6923.     JRST    L.277                ;                                        4446
  6924. L.276:    MOVEI    AC1,116
  6925. L.277:    MOVEM    AC1,U.45
  6926.     CAIG    AC3,7                ;                                        4453
  6927.     JRST    L.280
  6928.     MOVE    AC1,U.39            ;                                        4460
  6929.     ADDI    AC1,7
  6930.     MOVE    AC2,C.27
  6931.     ADJBP    AC1,AC2
  6932.     ILDB    AC1,AC1
  6933.     MOVEI    AC2,131                ;                                        4463
  6934.     CAMN    AC2,U.58
  6935.     JRST    L.278
  6936.     CAIL    AC1,61                ;                                        4466
  6937.     CAILE    AC1,63
  6938.     JRST    L.279
  6939.     JRST    L.281
  6940. L.278:    CAMN    AC1,CHKTYPE            ;                                        4474
  6941.     JRST    L.281
  6942. L.279:    MOVEI    AC2,61                ;                                        4476
  6943.     MOVEM    AC2,U.47
  6944.     JRST    L.282                ;                                        4474
  6945. L.280:    MOVEI    AC1,61                ;                                        4482
  6946. L.281:    MOVEM    AC1,U.47
  6947. L.282:    CAIG    AC3,10                ;                                        4487
  6948.     JRST    L.283
  6949.     MOVE    AC1,U.39            ;                                        4488
  6950.     ADDI    AC1,10
  6951.     MOVE    AC2,C.27
  6952.     ADJBP    AC1,AC2
  6953.     ILDB    AC1,AC1
  6954.     JRST    L.284                ;                                        4487
  6955. L.283:    MOVEI    AC1,40
  6956. L.284:    MOVEM    AC1,U.38
  6957.     CAIG    AC3,11                ;                                        4493
  6958.     JRST    L.289
  6959.     MOVM    AC1,AC4
  6960.     CAIG    AC1,136
  6961.     JRST    L.289
  6962.     MOVE    AC1,U.39            ;                                        4500
  6963.     ADDI    AC1,11
  6964.     MOVE    AC5,C.27            ;                                        4502
  6965.     MOVE    AC2,AC1
  6966.     ADJBP    AC2,AC5
  6967.     ILDB    AC2,AC2
  6968.     SUBI    AC2,40
  6969.     TRNN    AC2,2
  6970.     JRST    L.289
  6971.     MOVEI    AC2,764                ;                                        4506
  6972.     MOVEM    AC2,U.40
  6973. L.285:    MOVE    AC2,AC1                ;                                        4508
  6974.     SUB    AC2,U.39
  6975.     CAMG    AC3,AC2
  6976.     JRST    L.286
  6977.     MOVE    AC5,C.27            ;                                        4510
  6978.     MOVE    AC2,AC1
  6979.     ADJBP    AC2,AC5
  6980.     ILDB    AC2,AC2
  6981.     SUBI    AC2,40
  6982.     TRNE    AC2,1                ;                                        4509
  6983.     AOJA    AC1,L.285            ;                                        4508
  6984. L.286:    MOVE    AC2,AC1                ;                                        4514
  6985.     SUB    AC2,U.39
  6986.     ADDI    AC2,3
  6987.     CAMG    AC3,AC2
  6988.     JRST    L.287
  6989.     MOVE    AC2,AC1                ;                                        4517
  6990.     ADDI    AC2,2
  6991.     MOVE    AC3,C.27
  6992.     ADJBP    AC2,AC3
  6993.     ILDB    AC2,AC2
  6994.     IMULI    AC2,137
  6995.     ADDI    AC1,3                ;                                        4519
  6996.     MOVE    AC3,C.27
  6997.     ADJBP    AC1,AC3
  6998.     ILDB    AC1,AC1
  6999.     ADD    AC2,AC1                ;                                        4517
  7000.     SUBI    AC2,6000
  7001.     MOVEM    AC2,U.40
  7002. L.287:    MOVEI    AC1,1750            ;                                        4520
  7003.     CAML    AC1,U.40
  7004.     JRST    L.288
  7005.     MOVEI    AC1,1750            ;                                        4522
  7006.     MOVEM    AC1,U.40
  7007. L.288:    MOVM    AC1,AC4                ;                                        4523
  7008.     CAMGE    AC1,U.40
  7009.     MOVEM    AC1,U.40            ;                                        4525
  7010. L.289:    MOVE    AC1,U.44            ;                                        4533
  7011.     CAIGE    AC1,41
  7012.     JRST    L.290
  7013.     CAIG    AC1,76
  7014.     JRST    L.291
  7015. L.290:    CAIL    AC1,140
  7016.     CAILE    AC1,176                ;                                        4534
  7017.     JRST    L.301                ;                                        4536
  7018. L.291:    MOVE    AC1,U.45            ;                                        4545
  7019.     CAIGE    AC1,41
  7020.     JRST    L.292
  7021.     CAIG    AC1,76
  7022.     JRST    L.294
  7023. L.292:    CAIGE    AC1,140                ;                                        4546
  7024.     JRST    L.293
  7025.     CAIG    AC1,176
  7026.     JRST    L.294
  7027. L.293:    CAIN    AC1,116
  7028.     JRST    L.294
  7029.     CAIE    AC1,131
  7030.     JRST    L.301
  7031. L.294:    CAME    AC1,U.44            ;                                        4547
  7032.     CAMN    AC1,RCV%QUOTE%CHR        ;                                        4548
  7033.     JRST    L.301                ;                                        4550
  7034.     MOVEI    AC1,131                ;                                        4555
  7035.     CAME    AC1,U.45
  7036.     JRST    L.295
  7037.     MOVE    AC1,U.37
  7038.     MOVEM    AC1,U.45
  7039. L.295:    MOVE    AC2,U.45            ;                                        4557
  7040.     CAIE    AC2,116
  7041.     CAIN    AC2,131
  7042.     JRST    L.296
  7043.     MOVEI    AC1,1                ;                                        4559
  7044.     MOVEM    AC1,U.49
  7045.     JRST    L.297                ;                                        4557
  7046. L.296:    SETZM    U.49                ;                                        4561
  7047. L.297:    MOVE    AC1,U.38            ;                                        4567
  7048.     CAIGE    AC1,41
  7049.     JRST    L.298
  7050.     CAIG    AC1,76
  7051.     JRST    L.299
  7052. L.298:    CAIL    AC1,140
  7053.     CAILE    AC1,176                ;                                        4568
  7054.     JRST    L.300
  7055. L.299:    CAME    AC1,U.44
  7056.     CAMN    AC1,AC2
  7057.     JRST    L.300
  7058.     CAME    AC1,RCV%QUOTE%CHR        ;                                        4569
  7059.     JRST    L.302
  7060. L.300:    CAIN    AC1,40
  7061.     JRST    L.302
  7062. L.301:    PUSH    SP,C.21                ;                                        4572
  7063.     PUSHJ    SP,KRM%ERROR
  7064.     ADJSP    SP,-1                ;                                        4573
  7065.     MOVEI    AC1,252                ;                                        4571
  7066.     POPJ    SP,
  7067. L.302:    MOVEI    AC1,40                ;                                        4576
  7068.     CAMN    AC1,U.38
  7069.     JRST    L.303
  7070.     MOVEI    AC1,1
  7071.     MOVEM    AC1,U.50
  7072.     JRST    L.304
  7073. L.303:    SETZM    U.50
  7074. L.304:    MOVEI    AC1,13                ;                                        4340
  7075.     POPJ    SP,                ;                                        4302
  7076.  
  7077. ; Routine Size:  247 words
  7078.  
  7079.  
  7080. ;   4580  1    %SBTTL 'SET%SEND%INIT'
  7081. ;   4581  1    ROUTINE SET%SEND%INIT : NOVALUE =
  7082. ;   4582  1
  7083. ;   4583  1    !++
  7084. ;   4584  1    ! FUNCTIONAL DESCRIPTION:
  7085. ;   4585  1    !
  7086. ;   4586  1    !    This routine will initialize the various parameters for the
  7087. ;   4587  1    !    MSG%SND%INIT message.
  7088. ;   4588  1    !
  7089. ;   4589  1    ! CALLING SEQUENCE:
  7090. ;   4590  1    !
  7091. ;   4591  1    !    SET%SEND%INIT();
  7092. ;   4592  1    !
  7093. ;   4593  1    ! INPUT PARAMETERS:
  7094. ;   4594  1    !
  7095. ;   4595  1    !    None.
  7096. ;   4596  1    !
  7097. ;   4597  1    ! IMPLICIT INPUTS:
  7098. ;   4598  1    !
  7099. ;   4599  1    !    None.
  7100. ;   4600  1    !
  7101. ;   4601  1    ! OUTPUT PARAMETERS:
  7102. ;   4602  1    !
  7103. ;   4603  1    !    None.
  7104. ;   4604  1    !
  7105. ;   4605  1    ! IMPLICIT OUTPUTS:
  7106. ;   4606  1    !
  7107. ;   4607  1    !    SND%MSG parameters set up.
  7108. ;   4608  1    !
  7109. ;   4609  1    ! COMPLETION CODES:
  7110. ;   4610  1    !
  7111. ;   4611  1    !    None.
  7112. ;   4612  1    !
  7113. ;   4613  1    ! SIDE EFFECTS:
  7114. ;   4614  1    !
  7115. ;   4615  1    !    None.
  7116. ;   4616  1    !
  7117. ;   4617  1    !--
  7118. ;   4618  1
  7119. ;   4619  2        BEGIN
  7120. ;   4620  2        CH$WCHAR (CHAR ((IF .RCV%PKT%SIZE LSS 94 THEN .RCV%PKT%SIZE ELSE 94)),
  7121. ;   4621  2            CH$PTR (SND%MSG, PKT%MSG + P%SI%BUFSIZ, CHR%SIZE)); ! [108]
  7122. ;   4622  2        CH$WCHAR (CHAR (.RCV%TIMEOUT), CH$PTR (SND%MSG, PKT%MSG + P%SI%TIMOUT, CHR%SIZE));
  7123. ;   4623  2        CH$WCHAR (CHAR (.RCV%NPAD), CH$PTR (SND%MSG, PKT%MSG + P%SI%NPAD, CHR%SIZE));
  7124. ;   4624  2        CH$WCHAR (CTL (.RCV%PADCHAR), CH$PTR (SND%MSG, PKT%MSG + P%SI%PAD, CHR%SIZE));
  7125. ;   4625  2        CH$WCHAR (CHAR (.RCV%EOL), CH$PTR (SND%MSG, PKT%MSG + P%SI%EOL, CHR%SIZE));
  7126. ;   4626  2        CH$WCHAR (.RCV%QUOTE%CHR, CH$PTR (SND%MSG, PKT%MSG + P%SI%QUOTE, CHR%SIZE));
  7127. ;   4627  2        CH$WCHAR (.SEND%8QUOTE%CHR, CH$PTR (SND%MSG, PKT%MSG + P%SI%8QUOTE, CHR%SIZE));
  7128. ;   4628  2        CH$WCHAR (.INI%CHK%TYPE, CH$PTR (SND%MSG, PKT%MSG + P%SI%CHKTYPE, CHR%SIZE));
  7129. ;   4629  2        CH$WCHAR (.REPT%CHR, CH$PTR (SND%MSG, PKT%MSG + P%SI%REPEAT, CHR%SIZE));
  7130. ;   4630  2        SEND%INIT%SIZE = P%SI%LENGTH;                       ! [108]
  7131. ;   4631  2        IF .RCV%PKT%SIZE GTR 94                           ! [108]
  7132. ;   4632  2        THEN                                   ! [108]
  7133. ;   4633  3        BEGIN                                   ! [108]
  7134. ;   4634  3        CH$WCHAR (CHAR (EXTLEN%CAPAS), CH$PTR (SND%MSG, PKT%MSG + P%SI%CAPAS, CHR%SIZE));
  7135. ;   4635  3        CH$WCHAR (CHAR (0), CH$PTR (SND%MSG, PKT%MSG + P%SI%WINDO, CHR%SIZE));
  7136. ;   4636  3        CH$WCHAR (CHAR (.RCV%PKT%SIZE/95), CH$PTR (SND%MSG, PKT%MSG + P%SI%MAXLX1, CHR%SIZE));
  7137. ;   4637  3        CH$WCHAR (CHAR (.RCV%PKT%SIZE MOD 95), CH$PTR (SND%MSG, PKT%MSG + P%SI%MAXLX2, CHR%SIZE));
  7138. ;   4638  3                                           ! [108]
  7139. ;   4639  3        SEND%INIT%SIZE = P%SI%XLENGTH;                       ! [108]
  7140. ;   4640  2        END;                                   ! [108]
  7141. ;   4641  2
  7142. ;   4642  1        END;                    ! End of SET%SEND%INIT
  7143.  
  7144.  
  7145. ; SET%SEND%INIT
  7146. U.20:    MOVE    AC3,RCV%PKT%SIZE        ;                                        4620
  7147.     CAIGE    AC3,136
  7148.     SKIPA    AC1,AC3
  7149.     MOVEI    AC1,136
  7150.     ADDI    AC1,40
  7151.     MOVE    AC2,C.32            ;                                        4621
  7152.     IDPB    AC1,AC2                ;                                        4620
  7153.     MOVE    AC2,RCV%TIMEOUT            ;                                        4622
  7154.     ADDI    AC2,40
  7155.     MOVE    AC1,C.64
  7156.     IDPB    AC2,AC1
  7157.     MOVE    AC2,RCV%NPAD            ;                                        4623
  7158.     ADDI    AC2,40
  7159.     MOVE    AC1,C.65
  7160.     IDPB    AC2,AC1
  7161.     MOVE    AC2,RCV%PADCHAR            ;                                        4624
  7162.     TRC    AC2,100
  7163.     MOVE    AC1,C.66
  7164.     IDPB    AC2,AC1
  7165.     MOVE    AC2,RCV%EOL            ;                                        4625
  7166.     ADDI    AC2,40
  7167.     MOVE    AC1,C.67
  7168.     IDPB    AC2,AC1
  7169.     MOVE    AC2,RCV%QUOTE%CHR        ;                                        4626
  7170.     MOVE    AC1,C.68
  7171.     IDPB    AC2,AC1
  7172.     MOVE    AC2,U.45            ;                                        4627
  7173.     MOVE    AC1,C.69
  7174.     IDPB    AC2,AC1
  7175.     MOVE    AC2,U.47            ;                                        4628
  7176.     MOVE    AC1,C.70
  7177.     IDPB    AC2,AC1
  7178.     MOVE    AC2,U.38            ;                                        4629
  7179.     MOVE    AC1,C.71
  7180.     IDPB    AC2,AC1
  7181.     MOVEI    AC1,11                ;                                        4630
  7182.     MOVEM    AC1,U.46
  7183.     CAIG    AC3,136                ;                                        4631
  7184.     POPJ    SP,
  7185.     MOVEI    AC2,42                ;                                        4634
  7186.     MOVE    AC1,C.72
  7187.     IDPB    AC2,AC1
  7188.     MOVEI    AC2,40                ;                                        4635
  7189.     MOVE    AC1,C.73
  7190.     IDPB    AC2,AC1
  7191.     MOVE    AC1,AC3                ;                                        4636
  7192.     IDIVI    AC1,137
  7193.     ADDI    AC1,40
  7194.     MOVE    AC2,C.74
  7195.     IDPB    AC1,AC2
  7196.     MOVE    AC1,AC3                ;                                        4637
  7197.     IDIVI    AC1,137
  7198.     ADDI    AC2,40
  7199.     MOVE    AC1,C.75
  7200.     IDPB    AC2,AC1
  7201.     MOVEI    AC1,15                ;                                        4639
  7202.     MOVEM    AC1,U.46
  7203.     POPJ    SP,                ;                                        4581
  7204. C.64:    POINT    8,U.60+1,7
  7205. C.65:    POINT    8,U.60+1,15
  7206. C.66:    POINT    8,U.60+1,23
  7207. C.67:    POINT    8,U.60+1,31
  7208. C.68:    POINT    8,U.60+2,7
  7209. C.69:    POINT    8,U.60+2,15
  7210. C.70:    POINT    8,U.60+2,23
  7211. C.71:    POINT    8,U.60+2,31
  7212. C.72:    POINT    8,U.60+3,7
  7213. C.73:    POINT    8,U.60+3,15
  7214. C.74:    POINT    8,U.60+3,23
  7215. C.75:    POINT    8,U.60+3,31
  7216.  
  7217. ; Routine Size:  70 words
  7218.  
  7219.  
  7220. ;   4643  1    %SBTTL 'SEND%PACKET'
  7221. ;   4644  1    ROUTINE SEND%PACKET (TYPE, LENGTH, MN) =
  7222. ;   4645  1
  7223. ;   4646  1    !++
  7224. ;   4647  1    ! FUNCTIONAL DESCRIPTION:
  7225. ;   4648  1    !
  7226. ;   4649  1    !    This routine will cause a packet to be sent over the line
  7227. ;   4650  1    !    that has been opened by OPEN%TERMINAL.
  7228. ;   4651  1    !
  7229. ;   4652  1    ! CALLING SEQUENCE:
  7230. ;   4653  1    !
  7231. ;   4654  1    !    SEND%PACKET(Type, Length);
  7232. ;   4655  1    !
  7233. ;   4656  1    ! INPUT PARAMETERS:
  7234. ;   4657  1    !
  7235. ;   4658  1    !    TYPE - Type of packet to send.
  7236. ;   4659  1    !
  7237. ;   4660  1    !    LENGTH - Length of the packet being sent.
  7238. ;   4661  1    ! [108]         Negative length means it's an extended length packet
  7239. ;   4662  1    !
  7240. ;   4663  1    ! IMPLICIT INPUTS:
  7241. ;   4664  1    !
  7242. ;   4665  1    !    None.
  7243. ;   4666  1    !
  7244. ;   4667  1    ! OUTPUT PARAMETERS:
  7245. ;   4668  1    !
  7246. ;   4669  1    !    None.
  7247. ;   4670  1    !
  7248. ;   4671  1    ! IMPLICIT OUTPUTS:
  7249. ;   4672  1    !
  7250. ;   4673  1    !    None.
  7251. ;   4674  1    !
  7252. ;   4675  1    ! COMPLETION CODES:
  7253. ;   4676  1    !
  7254. ;   4677  1    !    None.
  7255. ;   4678  1    !
  7256. ;   4679  1    ! SIDE EFFECTS:
  7257. ;   4680  1    !
  7258. ;   4681  1    !    None.
  7259. ;   4682  1    !
  7260. ;   4683  1    !--
  7261. ;   4684  1
  7262. ;   4685  2        BEGIN
  7263. ;   4686  2
  7264. ;   4687  2        LOCAL
  7265. ;   4688  2        FILLER : VECTOR [CH$ALLOCATION (MAX%MSG, CHR%SIZE)],
  7266. ;   4689  2        TOT%MSG%LEN,                ! Length of message including all characters
  7267. ;   4690  2        CHKSUM,                    ! Checksum for the message we calculate
  7268. ;   4691  2        POINTER;                ! Pointer to the information in the message
  7269. ;   4692  2
  7270. ;   4693  2    !
  7271. ;   4694  2    ! Do any filler processing that the remote KERMIT requires.
  7272. ;   4695  2    !
  7273. ;   4696  2
  7274. ;   4697  2        IF .SEND%NPAD NEQ 0
  7275. ;   4698  2        THEN
  7276. ;   4699  3        BEGIN
  7277. ;   4700  3        CH$FILL (.SEND%PADCHAR, MAX%MSG, CH$PTR (FILLER, 0, CHR%SIZE));
  7278. ;   4701  3    !
  7279. ;   4702  3    ! Update the send stats
  7280. ;   4703  3    !
  7281. ;   4704  3        SMSG%TOTAL%CHARS = .SMSG%TOTAL%CHARS + .SEND%NPAD;
  7282. ;   4705  3    !
  7283. ;   4706  3    ! Send the fill
  7284. ;   4707  3    !
  7285. ;   4708  3        DO%PARITY (FILLER, .SEND%NPAD + PKT%TOT%OVR%HEAD);
  7286. ;   4709  3        SEND (FILLER, .SEND%NPAD + PKT%TOT%OVR%HEAD);
  7287. ;   4710  2        END;
  7288. ;   4711  2
  7289. ;   4712  2    !
  7290. ;   4713  2    ! Store the header information into the message.
  7291. ;   4714  2    !
  7292. ;   4715  2        CH$WCHAR (.TYPE, CH$PTR (SND%MSG, PKT%TYPE, CHR%SIZE));
  7293. ;   4716  2        CH$WCHAR (.SND%SOH, CH$PTR (SND%MSG, PKT%MARK, CHR%SIZE));
  7294. ;   4717  2        CH$WCHAR (CHAR (IF .MN LSS 0 THEN 0 ELSE .MN), CH$PTR (SND%MSG, PKT%SEQ, CHR%SIZE));
  7295. ;   4718  2
  7296. ;   4719  2        IF .LENGTH LSS 0                               ! [108]
  7297. ;   4720  2        THEN                                   ! [108]
  7298. ;   4721  3        BEGIN                                   ! [108]
  7299. ;   4722  3        TOT%MSG%LEN = PKT%OVR%HEAD + 3 - .LENGTH;               ! [108]
  7300. ;   4723  3        CH$WCHAR (CHAR (0), CH$PTR (SND%MSG, PKT%COUNT, CHR%SIZE));    ! [108]
  7301. ; P 4724  3        CH$WCHAR (CHAR ((.TOT%MSG%LEN - PKT%HCHECK + 1 +           ! [108]
  7302. ;   4725  3                 (.BLK%CHK%TYPE - CHK%1CHAR)) / 95),           ! [108]
  7303. ;   4726  3                CH$PTR (SND%MSG, PKT%COUNTX1, CHR%SIZE));      ! [108]
  7304. ; P 4727  3        CH$WCHAR (CHAR ((.TOT%MSG%LEN - PKT%HCHECK + 1 +           ! [108]
  7305. ;   4728  3                 (.BLK%CHK%TYPE - CHK%1CHAR)) MOD 95),           ! [108]
  7306. ;   4729  3                CH$PTR (SND%MSG, PKT%COUNTX2, CHR%SIZE));      ! [108]
  7307. ;   4730  3
  7308. ;   4731  3        POINTER = CH$PTR(SND%MSG, PKT%SEQ, CHR%SIZE);               ! [108]
  7309. ;   4732  3        CHKSUM = CHAR (0) + CH$RCHAR%A (POINTER);               ! [108]
  7310. ;   4733  3        CHKSUM = .CHKSUM + CH$RCHAR%A (POINTER);               ! [108]
  7311. ;   4734  3        CHKSUM = .CHKSUM + CH$RCHAR%A (POINTER);               ! [108]
  7312. ;   4735  3        CHKSUM = .CHKSUM + CH$RCHAR%A (POINTER);               ! [108]
  7313. ;   4736  3
  7314. ;   4737  3        CH$WCHAR (CHAR ((.CHKSUM + ((.CHKSUM AND %O'300')/%O'100')) AND %O'77'),
  7315. ;   4738  3                CH$PTR (SND%MSG, PKT%HCHECK, CHR%SIZE));       ! [108]
  7316. ;   4739  3        END                                   ! [108]
  7317. ;   4740  2        ELSE                                   ! [108]
  7318. ;   4741  3        BEGIN                                   ! [108]
  7319. ;   4742  3        TOT%MSG%LEN = PKT%OVR%HEAD + .LENGTH;                   ! [108]
  7320. ;   4743  3        CH$WCHAR (CHAR (.TOT%MSG%LEN + (.BLK%CHK%TYPE - CHK%1CHAR)),   ! [108]
  7321. ;   4744  3                    CH$PTR (SND%MSG, PKT%COUNT, CHR%SIZE));
  7322. ;   4745  2        END;                                   ! [108]
  7323. ;   4746  2
  7324. ;   4747  2    !
  7325. ;   4748  2    ! Calculate the block check value
  7326. ;   4749  2    !
  7327. ;   4750  2        POINTER = CH$PTR (SND%MSG, PKT%MARK + 1, CHR%SIZE);
  7328. ;   4751  2        CHKSUM = CALC%BLOCK%CHECK (.POINTER, .TOT%MSG%LEN);               ! [108]
  7329. ;   4752  2    !
  7330. ;   4753  2    ! Store the checksum into the message
  7331. ;   4754  2    !
  7332. ;   4755  2        POINTER = CH$PTR (SND%MSG, .TOT%MSG%LEN + 1, CHR%SIZE);           ! [108]
  7333. ;   4756  2
  7334. ;   4757  2        CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF
  7335. ;   4758  2        SET
  7336. ;   4759  2
  7337. ;   4760  2        [CHK%1CHAR] :
  7338. ;   4761  2            CH$WCHAR%A (CHAR (.CHKSUM), POINTER);
  7339. ;   4762  2
  7340. ;   4763  2        [CHK%2CHAR] :
  7341. ;   4764  3            BEGIN
  7342. ;   4765  3            CH$WCHAR%A (CHAR (.CHKSUM<6, 6>), POINTER);
  7343. ;   4766  3            CH$WCHAR%A (CHAR (.CHKSUM<0, 6>), POINTER);
  7344. ;   4767  3            TOT%MSG%LEN = .TOT%MSG%LEN + 1;
  7345. ;   4768  2            END;
  7346. ;   4769  2
  7347. ;   4770  2        [CHK%CRC] :
  7348. ;   4771  3            BEGIN
  7349. ;   4772  3            CH$WCHAR%A (CHAR (.CHKSUM<12, 4>), POINTER);
  7350. ;   4773  3            CH$WCHAR%A (CHAR (.CHKSUM<6, 6>), POINTER);
  7351. ;   4774  3            CH$WCHAR%A (CHAR (.CHKSUM<0, 6>), POINTER);
  7352. ;   4775  3            TOT%MSG%LEN = .TOT%MSG%LEN + 2;
  7353. ;   4776  2            END;
  7354. ;   4777  2        TES;
  7355. ;   4778  2
  7356. ;   4779  2    !
  7357. ;   4780  2    ! Store in the end of line character
  7358. ;   4781  2    !
  7359. ;   4782  2        CH$WCHAR%A (.SEND%EOL, POINTER);
  7360. ;   4783  2    !
  7361. ;   4784  2    ! If we are debugging then type out the message we are sending.
  7362. ;   4785  2    !
  7363. ;   4786  2        DBG%SEND (SND%MSG, (.TOT%MSG%LEN + PKT%TOT%OVR%HEAD - PKT%OVR%HEAD));
  7364. ;   4787  2    !
  7365. ;   4788  2    ! Update the stats for total characters and the data characters
  7366. ;   4789  2    !
  7367. ;   4790  2        SMSG%TOTAL%CHARS = .SMSG%TOTAL%CHARS + .TOT%MSG%LEN + PKT%TOT%OVR%HEAD - PKT%OVR%HEAD;
  7368. ;   4791  2    ! Make data characters really be that, not just characters in data field
  7369. ;   4792  2    !    SMSG%DATA%CHARS = .SMSG%DATA%CHARS + .LENGTH;
  7370. ;   4793  2
  7371. ;   4794  2        IF .TYPE EQL MSG%NAK
  7372. ;   4795  2        THEN
  7373. ;   4796  3        BEGIN
  7374. ;   4797  3        SMSG%NAKS = .SMSG%NAKS + 1;
  7375. ;   4798  3        XFR%STATUS (%C'S', %C'N');
  7376. ;   4799  3        END
  7377. ;   4800  2        ELSE
  7378. ;   4801  3        BEGIN
  7379. ;   4802  3        SMSG%COUNT = .SMSG%COUNT + 1;
  7380. ;   4803  3        XFR%STATUS (%C'S', %C'P');
  7381. ;   4804  2        END;
  7382. ;   4805  2
  7383. ;   4806  2    !
  7384. ;   4807  2    ! Check if we are in IBM mode and need to wait for an XON first
  7385. ;   4808  2    ! We will not wait if this is a packet which might be going out
  7386. ;   4809  2    ! without previous traffic (generic commands, init packets).
  7387. ;   4810  2
  7388. ;   4811  3        IF (.IBM%CHAR GEQ 0)             ! If handshaking on
  7389. ;   4812  2        THEN
  7390. ;   4813  2        IF NOT IBM%WAIT () THEN RETURN KER%ABORTED;
  7391. ;   4814  2
  7392. ;   4815  2    !
  7393. ;   4816  2    ! Now call the O/S routine to send the message out to the remote KERMIT
  7394. ;   4817  2    !
  7395. ;   4818  2        DO%PARITY (SND%MSG, .TOT%MSG%LEN + PKT%TOT%OVR%HEAD - PKT%OVR%HEAD);
  7396. ;   4819  2        RETURN SEND (SND%MSG, .TOT%MSG%LEN + PKT%TOT%OVR%HEAD - PKT%OVR%HEAD);
  7397. ;   4820  1        END;                    ! End of SEND%PACKET
  7398.  
  7399.  
  7400. ; SEND%PACKET
  7401. U.24:    PUSH    SP,AC14                ;                                        4644
  7402.     PUSH    SP,AC16
  7403.     ADJSP    SP,375
  7404.     MOVE    AC3,U.41            ;                                        4697
  7405.     JUMPE    AC3,L.305
  7406.     MOVEI    AC5,-375(SP)            ;                                        4700
  7407.     HRLI    AC5,41000
  7408.     SETZB    AC1,AC2
  7409.     MOVEI    AC4,1752
  7410.     MOVEI    AC14,-2(SP)
  7411.     PUSH    AC14,C.9
  7412.     PUSH    AC14,U.42
  7413.     EXTEND    AC1,-1(SP)
  7414.     JFCL
  7415.     ADDM    AC3,SMSG%TOTAL%CHARS        ;                                        4704
  7416.     MOVEI    AC1,-374(SP)            ;                                        4708
  7417.     PUSH    SP,AC1
  7418.     ADDI    AC3,6
  7419.     PUSH    SP,AC3
  7420.     PUSHJ    SP,U.22
  7421.     MOVEI    AC1,-376(SP)            ;                                        4709
  7422.     PUSH    SP,AC1
  7423.     MOVE    AC1,U.41
  7424.     ADDI    AC1,6
  7425.     PUSH    SP,AC1
  7426.     PUSHJ    SP,SEND
  7427.     ADJSP    SP,-4                ;                                        4699
  7428. L.305:    MOVE    AC2,-402(SP)            ;                                        4715
  7429.     MOVE    AC1,C.80
  7430.     IDPB    AC2,AC1
  7431.     MOVE    AC2,SND%SOH            ;                                        4716
  7432.     MOVE    AC1,C.81
  7433.     IDPB    AC2,AC1
  7434.     SKIPGE    AC1,-400(SP)            ;                                        4717
  7435.     SETZ    AC1,
  7436.     ADDI    AC1,40
  7437.     MOVE    AC2,C.82
  7438.     IDPB    AC1,AC2
  7439.     MOVE    AC3,U.48            ;                                        4725
  7440.     SUBI    AC3,61
  7441.     MOVE    AC16,-401(SP)            ;                                        4719
  7442.     JUMPGE    AC16,L.306
  7443.     MOVEI    AC14,6                ;                                        4722
  7444.     SUB    AC14,AC16
  7445.     MOVEI    AC2,40                ;                                        4723
  7446.     MOVE    AC1,C.83
  7447.     IDPB    AC2,AC1
  7448.     MOVE    AC16,AC14            ;                                        4725
  7449.     ADD    AC16,AC3
  7450.     SUBI    AC16,5
  7451.     MOVE    AC1,AC16
  7452.     IDIVI    AC1,137
  7453.     ADDI    AC1,40
  7454.     MOVE    AC2,C.32            ;                                        4726
  7455.     IDPB    AC1,AC2                ;                                        4725
  7456.     MOVE    AC1,AC16            ;                                        4728
  7457.     IDIVI    AC1,137
  7458.     ADDI    AC2,40
  7459.     MOVE    AC1,C.64            ;                                        4729
  7460.     IDPB    AC2,AC1                ;                                        4728
  7461.     MOVE    AC16,C.82            ;                                        4731
  7462.     ILDB    AC1,AC16            ;                                        4732
  7463.     MOVE    AC3,AC1
  7464.     ADDI    AC3,40
  7465.     ILDB    AC1,AC16            ;                                        4733
  7466.     ADD    AC3,AC1
  7467.     ILDB    AC1,AC16            ;                                        4734
  7468.     ADD    AC3,AC1
  7469.     ILDB    AC1,AC16            ;                                        4735
  7470.     ADD    AC3,AC1
  7471.     MOVE    AC1,AC3                ;                                        4737
  7472.     ANDI    AC1,300
  7473.     IDIVI    AC1,100
  7474.     ADD    AC1,AC3
  7475.     LDB    AC2,C.18
  7476.     ADDI    AC2,40
  7477.     MOVE    AC1,C.65            ;                                        4738
  7478.     IDPB    AC2,AC1                ;                                        4737
  7479.     JRST    L.307                ;                                        4719
  7480. L.306:    MOVE    AC14,AC16            ;                                        4742
  7481.     ADDI    AC14,3
  7482.     MOVE    AC16,AC14            ;                                        4743
  7483.     ADD    AC16,AC3
  7484.     ADDI    AC16,40
  7485.     MOVE    AC1,C.83            ;                                        4744
  7486.     IDPB    AC16,AC1            ;                                        4743
  7487. L.307:    MOVE    AC16,C.83            ;                                        4750
  7488.     PUSH    SP,AC16                ;                                        4751
  7489.     PUSH    SP,AC14
  7490.     PUSHJ    SP,U.19
  7491.     MOVE    AC3,AC1
  7492.     MOVE    AC1,AC14            ;                                        4755
  7493.     ADDI    AC1,1
  7494.     MOVE    AC2,C.76
  7495.     ADJBP    AC1,AC2
  7496.     MOVE    AC16,AC1
  7497.     MOVE    AC1,U.48            ;                                        4757
  7498.     SUBI    AC1,61
  7499.     JRST    L.308(AC1)
  7500. L.308:    JRST    L.309
  7501.     JRST    L.310
  7502.     JRST    L.311
  7503. L.309:    MOVE    AC1,AC3                ;                                        4761
  7504.     ADDI    AC1,40
  7505.     IDPB    AC1,AC16
  7506.     JRST    L.312                ;                                        4757
  7507. L.310:    LDB    AC1,C.77            ;                                        4765
  7508.     ADDI    AC1,40
  7509.     IDPB    AC1,AC16
  7510.     LDB    AC1,C.78            ;                                        4766
  7511.     ADDI    AC1,40
  7512.     IDPB    AC1,AC16
  7513.     AOJA    AC14,L.312            ;                                        4757
  7514. L.311:    LDB    AC1,C.79            ;                                        4772
  7515.     ADDI    AC1,40
  7516.     IDPB    AC1,AC16
  7517.     LDB    AC1,C.77            ;                                        4773
  7518.     ADDI    AC1,40
  7519.     IDPB    AC1,AC16
  7520.     LDB    AC1,C.78            ;                                        4774
  7521.     ADDI    AC1,40
  7522.     IDPB    AC1,AC16
  7523.     ADDI    AC14,2                ;                                        4775
  7524. L.312:    MOVE    AC1,U.43            ;                                        4782
  7525.     IDPB    AC1,AC16
  7526.     PUSH    SP,C.84                ;                                        4786
  7527.     MOVE    AC16,AC14
  7528.     ADDI    AC16,3
  7529.     PUSH    SP,AC16
  7530.     PUSHJ    SP,U.35
  7531.     MOVE    AC1,SMSG%TOTAL%CHARS        ;                                        4790
  7532.     ADD    AC1,AC14
  7533.     ADDI    AC1,3
  7534.     MOVEM    AC1,SMSG%TOTAL%CHARS
  7535.     MOVEI    AC1,116                ;                                        4794
  7536.     CAME    AC1,-406(SP)
  7537.     JRST    L.313
  7538.     AOS    SMSG%NAKS            ;                                        4797
  7539.     PUSH    SP,C.8                ;                                        4798
  7540.     PUSH    SP,C.24
  7541.     JRST    L.314
  7542. L.313:    AOS    SMSG%COUNT            ;                                        4802
  7543.     PUSH    SP,C.8                ;                                        4803
  7544.     PUSH    SP,C.85
  7545. L.314:    PUSHJ    SP,XFR%STATUS
  7546.     SKIPGE    IBM%CHAR            ;                                        4811
  7547.     JRST    L.315
  7548.     PUSHJ    SP,IBM%WAIT            ;                                        4813
  7549.     TRNE    AC1,1
  7550.     JRST    L.315
  7551.     ADJSP    SP,-6
  7552.     MOVEI    AC1,312
  7553.     JRST    L.316
  7554. L.315:    PUSH    SP,C.84                ;                                        4818
  7555.     PUSH    SP,AC16
  7556.     PUSHJ    SP,U.22
  7557.     PUSH    SP,C.84                ;                                        4819
  7558.     PUSH    SP,AC16
  7559.     PUSHJ    SP,SEND
  7560.     ADJSP    SP,-12
  7561. L.316:    ADJSP    SP,-375                ;                                        4644
  7562.     POP    SP,AC16
  7563.     POP    SP,AC14
  7564.     POPJ    SP,
  7565. C.76:    POINT    8,U.60,-1
  7566. C.77:    POINT    6,AC3,29
  7567. C.78:    POINT    6,AC3,35
  7568. C.79:    POINT    4,AC3,23
  7569. C.80:    POINT    8,U.60,23
  7570. C.81:    POINT    8,U.60-1,31
  7571. C.82:    POINT    8,U.60,15
  7572. C.83:    POINT    8,U.60,7
  7573. C.84:    XWD    0,U.60
  7574. C.85:    EXP    120
  7575.  
  7576. ; Routine Size:  174 words
  7577.  
  7578.  
  7579. ;   4821  1    %SBTTL 'REC%MESSAGE - Receive a message'
  7580. ;   4822  1    ROUTINE REC%MESSAGE (CHK%ROUTINE) =
  7581. ;   4823  1
  7582. ;   4824  1    !++
  7583. ;   4825  1    ! FUNCTIONAL DESCRIPTION:
  7584. ;   4826  1    !
  7585. ;   4827  1    !    This routine will handle the retry processing for the various
  7586. ;   4828  1    !    messages that can be received.
  7587. ;   4829  1    !
  7588. ;   4830  1    ! CALLING SEQUENCE:
  7589. ;   4831  1    !
  7590. ;   4832  1    ! INPUT PARAMETERS:
  7591. ;   4833  1    !
  7592. ;   4834  1    !    None.
  7593. ;   4835  1    !
  7594. ;   4836  1    ! IMPLICIT INPUTS:
  7595. ;   4837  1    !
  7596. ;   4838  1    !    None.
  7597. ;   4839  1    !
  7598. ;   4840  1    ! OUTPUT PARAMETERS:
  7599. ;   4841  1    !
  7600. ;   4842  1    !    None.
  7601. ;   4843  1    !
  7602. ;   4844  1    ! IMPLICIT OUTPUTS:
  7603. ;   4845  1    !
  7604. ;   4846  1    !    None.
  7605. ;   4847  1    !
  7606. ;   4848  1    ! COMPLETION CODES:
  7607. ;   4849  1    !
  7608. ;   4850  1    !    KER%NORMAL - Normal return
  7609. ;   4851  1    !    KER%RETRIES - Too many retries
  7610. ;   4852  1    !    (What ever REC%PACKET returns).
  7611. ;   4853  1    !
  7612. ;   4854  1    ! SIDE EFFECTS:
  7613. ;   4855  1    !
  7614. ;   4856  1    !    None.
  7615. ;   4857  1    !
  7616. ;   4858  1    !--
  7617. ;   4859  1
  7618. ;   4860  2        BEGIN
  7619. ;   4861  2
  7620. ;   4862  2        LOCAL
  7621. ;   4863  2        STATUS;                    ! Status returned by various routines
  7622. ;   4864  2
  7623. ;   4865  2        RETURN
  7624. ;   4866  2
  7625. ;   4867  2        WHILE TRUE DO
  7626. ;   4868  3            BEGIN
  7627. ;   4869  3
  7628. ;   4870  3            IF .NUM%RETRIES GTR .PKT%RETRIES
  7629. ;   4871  3            THEN
  7630. ;   4872  4            BEGIN
  7631. ;   4873  4            KRM%ERROR (KER%RETRIES);    ! Report the error
  7632. ;   4874  4            RETURN KER%RETRIES;
  7633. ;   4875  3            END;
  7634. ;   4876  3
  7635. ;   4877  3            NUM%RETRIES = .NUM%RETRIES + 1;
  7636. ;   4878  3            STATUS = REC%PACKET ();
  7637. ;   4879  3    ![043] Don't abort on errors which might just be due to noise.
  7638. ;   4880  3
  7639. ;   4881  3            IF NOT .STATUS AND .STATUS NEQ KER%CHKSUMERR AND .STATUS NEQ KER%TIMEOUT AND .STATUS NEQ
  7640. ;   4882  3            KER%ZEROLENMSG
  7641. ;   4883  3            THEN
  7642. ;   4884  3            RETURN .STATUS;
  7643. ;   4885  3
  7644. ;   4886  3            IF NOT .STATUS
  7645. ;   4887  3            THEN
  7646. ;   4888  3            SEND%PACKET (MSG%NAK, 0, .MSG%NUMBER)    ![024]
  7647. ;   4889  3            ELSE
  7648. ;   4890  4            BEGIN
  7649. ;   4891  4    ![021]
  7650. ;   4892  4    ![021] If the packet type is not acceptable by our caller, nak it so the
  7651. ;   4893  4    ![021] other end tries again, and abort the current operation.  This is so
  7652. ;   4894  4    ![021] we will return to server mode (if we are running that way) quickly
  7653. ;   4895  4    ![021] when the other Kermit has been aborted and then restarted, and should
  7654. ;   4896  4    ![021] also make restarting quick, since we will not need to wait for the
  7655. ;   4897  4    ![021] other Kermit to time this message out before retransmitting.
  7656. ;   4898  4    ![021]
  7657. ;   4899  4
  7658. ;   4900  4            IF NOT (.CHK%ROUTINE) ()
  7659. ;   4901  4            THEN
  7660. ;   4902  5                BEGIN
  7661. ;   4903  5                SEND%PACKET (MSG%NAK, 0, .REC%SEQ);
  7662. ;   4904  5                RETURN FALSE;        ! Just indicate an error
  7663. ;   4905  5                END
  7664. ;   4906  4            ELSE
  7665. ;   4907  4                EXITLOOP KER%NORMAL;
  7666. ;   4908  4
  7667. ;   4909  3            END;
  7668. ;   4910  3
  7669. ;   4911  2            END;
  7670. ;   4912  2
  7671. ;   4913  1        END;                    ! End of REC%PARSE
  7672.  
  7673.  
  7674. ; REC%MESSAGE
  7675. U.25:    PUSH    SP,AC16                ;                                        4822
  7676. L.317:    MOVE    AC1,U.54            ;                                        4870
  7677.     CAMG    AC1,PKT%RETRIES
  7678.     JRST    L.318
  7679.     PUSH    SP,C.17                ;                                        4873
  7680.     PUSHJ    SP,KRM%ERROR
  7681.     ADJSP    SP,-1                ;                                        4874
  7682.     MOVEI    AC1,212                ;                                        4872
  7683.     JRST    L.322
  7684. L.318:    AOS    U.54                ;                                        4877
  7685.     PUSHJ    SP,U.26                ;                                        4878
  7686.     MOVE    AC16,AC1
  7687.     TRNN    AC16,1                ;                                        4881
  7688.     CAIN    AC16,172
  7689.     JRST    L.319
  7690.     CAIE    AC16,300
  7691.     CAIN    AC16,262
  7692.     JRST    L.319
  7693.     MOVE    AC1,AC16            ;                                        4884
  7694.     JRST    L.322
  7695. L.319:    TRNE    AC16,1                ;                                        4886
  7696.     JRST    L.320
  7697.     PUSH    SP,C.24                ;                                        4888
  7698.     PUSH    SP,C.25
  7699.     PUSH    SP,U.55
  7700.     PUSHJ    SP,U.24
  7701.     ADJSP    SP,-3
  7702.     JRST    L.317                ;                                        4886
  7703. L.320:    MOVE    AC1,-2(SP)            ;                                        4900
  7704.     PUSHJ    SP,0(AC1)
  7705.     TRNE    AC1,1
  7706.     JRST    L.321
  7707.     PUSH    SP,C.24                ;                                        4903
  7708.     PUSH    SP,C.25
  7709.     PUSH    SP,U.56
  7710.     PUSHJ    SP,U.24
  7711.     ADJSP    SP,-3                ;                                        4904
  7712.     TDZA    AC1,AC1                ;                                        4902
  7713. L.321:    MOVEI    AC1,13                ;                                        4907
  7714. L.322:    POP    SP,AC16                ;                                        4822
  7715.     POPJ    SP,
  7716.  
  7717. ; Routine Size:  41 words
  7718.  
  7719.  
  7720. ;   4914  1    %SBTTL 'REC%PACKET'
  7721. ;   4915  1    ROUTINE REC%PACKET =
  7722. ;   4916  1
  7723. ;   4917  1    !++
  7724. ;   4918  1    ! FUNCTIONAL DESCRIPTION:
  7725. ;   4919  1    !
  7726. ;   4920  1    !    This routine will do the oppoiste of SEND%PACKET.  It will wait
  7727. ;   4921  1    !    for the message to be read from the remote and then it will
  7728. ;   4922  1    !    check the message for validity.
  7729. ;   4923  1    !
  7730. ;   4924  1    ! CALLING SEQUENCE:
  7731. ;   4925  1    !
  7732. ;   4926  1    !    Flag = REC%PACKET();
  7733. ;   4927  1    !
  7734. ;   4928  1    ! INPUT PARAMETERS:
  7735. ;   4929  1    !
  7736. ;   4930  1    !    None.
  7737. ;   4931  1    !
  7738. ;   4932  1    ! IMPLICIT INPUTS:
  7739. ;   4933  1    !
  7740. ;   4934  1    !    None.
  7741. ;   4935  1    !
  7742. ;   4936  1    ! OUTPUT PARAMETERS:
  7743. ;   4937  1    !
  7744. ;   4938  1    !    None.
  7745. ;   4939  1    !
  7746. ;   4940  1    ! IMPLICIT OUTPUTS:
  7747. ;   4941  1    !
  7748. ;   4942  1    !    REC%MSG - Contains the message received.
  7749. ;   4943  1    !
  7750. ;   4944  1    ! COMPLETION CODES:
  7751. ;   4945  1    !
  7752. ;   4946  1    !    True - Packet receive ok.
  7753. ;   4947  1    !    False - Problem occured during the receiving of the packet.
  7754. ;   4948  1    !
  7755. ;   4949  1    ! SIDE EFFECTS:
  7756. ;   4950  1    !
  7757. ;   4951  1    !    None.
  7758. ;   4952  1    !
  7759. ;   4953  1    !--
  7760. ;   4954  1
  7761. ;   4955  2        BEGIN
  7762. ;   4956  2
  7763. ;   4957  2        BIND
  7764. ;   4958  2        ATTEMPT%TEXT = UPLIT (%ASCIZ'Attempting to receive');
  7765. ;   4959  2
  7766. ;   4960  2        LOCAL
  7767. ;   4961  2        STATUS,                    ! Status returned by various routines
  7768. ;   4962  2        MSG%LENGTH,
  7769. ;   4963  2        ERR%POINTER,                ! Pointer to the error buffer
  7770. ;   4964  2        POINTER,
  7771. ;   4965  2        CHKSUM;                    ! Checksum of the message
  7772. ;   4966  2
  7773. ;   4967  2    !
  7774. ;   4968  2    ! Attempt to read the message from the remote.
  7775. ;   4969  2    !
  7776. ;   4970  2    !    DO
  7777. ;   4971  2    !    BEGIN
  7778. ;   4972  2
  7779. ;   4973  2        IF .DEBUG%FLAG
  7780. ;   4974  2        THEN
  7781. ;   4975  3        BEGIN
  7782. ;   4976  3
  7783. ;   4977  3        LOCAL
  7784. ;   4978  3            OLD%RTN;
  7785. ;   4979  3
  7786. ;   4980  3        OLD%RTN = TT%SET%OUTPUT (DBG%DUMP);
  7787. ;   4981  3        TT%TEXT (ATTEMPT%TEXT);
  7788. ;   4982  3        TT%CRLF ();
  7789. ;   4983  3        TT%SET%OUTPUT (.OLD%RTN);
  7790. ;   4984  2        END;
  7791. ;   4985  2
  7792. ;   4986  2    !
  7793. ;   4987  2    ! If status type out requested, do it once
  7794. ;   4988  2    !
  7795. ;   4989  2
  7796. ;   4990  2        IF .TYP%STS%FLAG
  7797. ;   4991  2        THEN
  7798. ;   4992  3        BEGIN
  7799. ;   4993  3        STS%OUTPUT ();
  7800. ;   4994  3        TYP%STS%FLAG = FALSE;
  7801. ;   4995  2        END;
  7802. ;   4996  2
  7803. ;   4997  2    !
  7804. ;   4998  2    ! Receive the message from the remote Kermit
  7805. ;   4999  2    !
  7806. ;   5000  2        STATUS = RECEIVE (REC%MSG, MSG%LENGTH);
  7807. ;   5001  2    !
  7808. ;   5002  2    ! Check for timeouts
  7809. ;   5003  2    !
  7810. ;   5004  2
  7811. ;   5005  2        IF .STATUS EQL KER%TIMEOUT THEN XFR%STATUS (%C'R', %C'T');
  7812. ;   5006  2
  7813. ;   5007  2    !
  7814. ;   5008  2    ! If it failed return the status to the upper level
  7815. ;   5009  2    !
  7816. ;   5010  2
  7817. ;   5011  2        IF NOT .STATUS
  7818. ;   5012  2        THEN
  7819. ;   5013  3        BEGIN
  7820. ;   5014  3
  7821. ;   5015  3        IF .STATUS NEQ KER%ABORTED AND .STATUS NEQ KER%TIMEOUT THEN KRM%ERROR (.STATUS);
  7822. ;   5016  3
  7823. ;   5017  3                            ! Report error
  7824. ;   5018  3        RETURN .STATUS;
  7825. ;   5019  2        END;
  7826. ;   5020  2
  7827. ;   5021  2    !
  7828. ;   5022  2    ! Determine if we got a good message
  7829. ;   5023  2    !
  7830. ;   5024  2
  7831. ;   5025  2        IF .MSG%LENGTH LSS PKT%TOT%OVR%HEAD - 1
  7832. ;   5026  2        THEN
  7833. ;   5027  3        BEGIN
  7834. ;   5028  3        RETURN KER%ZEROLENMSG;
  7835. ;   5029  2        END;
  7836. ;   5030  2
  7837. ;   5031  2        IF UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNT, CHR%SIZE))) EQL 0 ! [108]
  7838. ;   5032  2        THEN                                   ! [108]
  7839. ;   5033  3        BEGIN                                   ! [108]
  7840. ;   5034  3        IF .MSG%LENGTH LSS PKT%TOT%OVR%HEAD - 1 + 3               ! [108]
  7841. ;   5035  3        THEN                                   ! [108]
  7842. ;   5036  4            BEGIN                               ! [108]
  7843. ;   5037  4            RETURN KER%ZEROLENMSG;                       ! [108]
  7844. ;   5038  3            END;                               ! [108]
  7845. ;   5039  2        END;                                   ! [108]
  7846. ;   5040  2    !
  7847. ;   5041  2    ! Update the stats on the total number of characters received.
  7848. ;   5042  2    !
  7849. ;   5043  2        RMSG%TOTAL%CHARS = .RMSG%TOTAL%CHARS + .MSG%LENGTH;
  7850. ;   5044  2    !
  7851. ;   5045  2    ! Initialize the checksum and others
  7852. ;   5046  2    !
  7853. ;   5047  2        REC%TYPE = CH$RCHAR (CH$PTR (REC%MSG, PKT%TYPE, CHR%SIZE));
  7854. ;   5048  2    !
  7855. ;   5049  2    ! Now break the message apart byte by byte.
  7856. ;   5050  2    !
  7857. ;   5051  2        RECV%PKT%MSG = PKT%MSG;                           ! [108]
  7858. ;   5052  2        REC%LENGTH = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNT, CHR%SIZE)));
  7859. ;   5053  2        IF .REC%LENGTH EQL 0                           ! [108]
  7860. ;   5054  2        THEN                                   ! [108]
  7861. ;   5055  3        BEGIN                                   ! [108]
  7862. ;   5056  3        REC%LENGTH = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNTX1, CHR%SIZE))) * 95 +
  7863. ;   5057  3            UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNTX2, CHR%SIZE))) +
  7864. ;   5058  3                            PKT%HCHECK - 1;           ! [108]
  7865. ;   5059  3        RECV%PKT%MSG = PKT%MSGX;                       ! [108]
  7866. ;   5060  2        END;                                   ! [108]
  7867. ;   5061  2
  7868. ;   5062  2        REC%SEQ = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%SEQ, CHR%SIZE)));
  7869. ;   5063  2    !
  7870. ;   5064  2    ! Typed the packet if we are debugging
  7871. ;   5065  2    !
  7872. ;   5066  2        DBG%RECEIVE (REC%MSG);
  7873. ;   5067  2    !
  7874. ;   5068  2    ! Now compute the final checksum and make sure that it is identical
  7875. ;   5069  2    ! to what we received from the remote KERMIT
  7876. ;   5070  2    !
  7877. ;   5071  2        POINTER = CH$PTR (REC%MSG, PKT%MARK + 1, CHR%SIZE);
  7878. ;   5072  2        REC%LENGTH = .REC%LENGTH - (.BLK%CHK%TYPE - CHK%1CHAR);           ! [108]
  7879. ;   5073  2        CHKSUM = CALC%BLOCK%CHECK (.POINTER, .REC%LENGTH);               ! [108]
  7880. ;   5074  2        POINTER = CH$PTR (REC%MSG, .REC%LENGTH + 1, CHR%SIZE);           ! [108]
  7881. ;   5075  2        REC%LENGTH = .REC%LENGTH - .RECV%PKT%MSG + 1;               ! [108]
  7882. ;   5076  2        STATUS = KER%NORMAL;            ! Assume good checksum
  7883. ;   5077  2
  7884. ;   5078  2        CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF
  7885. ;   5079  2        SET
  7886. ;   5080  2
  7887. ;   5081  2        [CHK%1CHAR] :
  7888. ;   5082  2
  7889. ;   5083  2            IF .CHKSUM NEQ UNCHAR (CH$RCHAR%A (POINTER)) THEN STATUS = KER%CHKSUMERR;
  7890. ;   5084  2
  7891. ;   5085  2        [CHK%2CHAR] :
  7892. ;   5086  2
  7893. ; P 5087  3            IF (.CHKSUM<6, 6> NEQ UNCHAR (CH$RCHAR%A (POINTER))) OR(.CHKSUM<0, 6> NEQ UNCHAR (
  7894. ;   5088  3                CH$RCHAR%A (POINTER)))
  7895. ;   5089  2            THEN
  7896. ;   5090  2            STATUS = KER%CHKSUMERR;
  7897. ;   5091  2
  7898. ;   5092  2        [CHK%CRC] :
  7899. ;   5093  2
  7900. ; P 5094  3            IF (.CHKSUM<12, 4> NEQ UNCHAR (CH$RCHAR%A (POINTER))) OR(.CHKSUM<6, 6> NEQ UNCHAR (
  7901. ;   5095  3                CH$RCHAR%A (POINTER))) OR (.CHKSUM<0, 6> NEQ UNCHAR(CH$RCHAR%A (POINTER)))
  7902. ;   5096  2            THEN
  7903. ;   5097  2            STATUS = KER%CHKSUMERR;
  7904. ;   5098  2
  7905. ;   5099  2        TES;
  7906. ;   5100  2
  7907. ;   5101  2    !
  7908. ;   5102  2    ! If we have a bad checksum, check for the special cases when we might be out
  7909. ;   5103  2    ! of sync with the sender.  This can occur if the sender is retransmitting
  7910. ;   5104  2    ! a send-init (because our ACK got lost), and we have agreed on multi-char
  7911. ;   5105  2    ! checksums, or because the sender is a server who has aborted back to being
  7912. ;   5106  2    ! idle without telling us.
  7913. ;   5107  2    ! Note that in either case, we return back to using single character checksums
  7914. ;   5108  2    !
  7915. ;   5109  2
  7916. ;   5110  2        IF .STATUS EQL KER%CHKSUMERR
  7917. ;   5111  2        THEN
  7918. ;   5112  3        BEGIN
  7919. ;   5113  3
  7920. ;   5114  5        IF (.BLK%CHK%TYPE NEQ CHK%1CHAR AND .REC%SEQ EQL 0) AND(.REC%LENGTH LSS 1 - (.BLK%CHK%TYPE
  7921. ;   5115  4            - CHK%1CHAR) AND .REC%TYPE EQL MSG%NAK) OR (.REC%TYPE EQL MSG%SND%INIT)
  7922. ;   5116  3        THEN
  7923. ;   5117  4            BEGIN
  7924. ;   5118  4
  7925. ;   5119  4            LOCAL
  7926. ;   5120  4            SAVE%BLK%CHK%TYPE;
  7927. ;   5121  4
  7928. ;   5122  4            SAVE%BLK%CHK%TYPE = .BLK%CHK%TYPE;    ! Remember what we are using
  7929. ;   5123  4            BLK%CHK%TYPE = CHK%1CHAR;
  7930. ;   5124  4            POINTER = CH$PTR (REC%MSG, PKT%MARK + 1, CHR%SIZE);
  7931. ;   5125  4            CHKSUM = CALC%BLOCK%CHECK (.POINTER, .REC%LENGTH + .RECV%PKT%MSG - 1); ! [108]
  7932. ;   5126  4            POINTER = CH$PTR (REC%MSG, .REC%LENGTH + .RECV%PKT%MSG, CHR%SIZE); ! [108]
  7933. ;   5127  4
  7934. ;   5128  5            IF .CHKSUM NEQ UNCHAR (CH$RCHAR%A (POINTER))
  7935. ;   5129  4            THEN
  7936. ;   5130  5            BEGIN
  7937. ;   5131  5            BLK%CHK%TYPE = .SAVE%BLK%CHK%TYPE;
  7938. ;   5132  5            RETURN KER%CHKSUMERR;
  7939. ;   5133  4            END;
  7940. ;   5134  4
  7941. ;   5135  4            END
  7942. ;   5136  3        ELSE
  7943. ;   5137  3            RETURN KER%CHKSUMERR;
  7944. ;   5138  3
  7945. ;   5139  2        END;
  7946. ;   5140  2
  7947. ;   5141  2    !
  7948. ;   5142  2    ! Update the stats
  7949. ;   5143  2    !
  7950. ;   5144  2    !    RMSG%DATA%CHARS = .RMSG%DATA%CHARS + .REC%LENGTH;
  7951. ;   5145  2
  7952. ;   5146  2        IF .REC%TYPE EQL MSG%NAK
  7953. ;   5147  2        THEN
  7954. ;   5148  3        BEGIN
  7955. ;   5149  3        RMSG%NAKS = .RMSG%NAKS + 1;
  7956. ;   5150  3        XFR%STATUS (%C'R', %C'N');
  7957. ;   5151  3        END
  7958. ;   5152  2        ELSE
  7959. ;   5153  3        BEGIN
  7960. ;   5154  3        RMSG%COUNT = .RMSG%COUNT + 1;
  7961. ;   5155  3        XFR%STATUS (%C'R', %C'P');
  7962. ;   5156  2        END;
  7963. ;   5157  2
  7964. ;   5158  2    !
  7965. ;   5159  2    ! Now check to see if we have an E type (Error) packet.
  7966. ;   5160  2    !
  7967. ;   5161  2
  7968. ;   5162  2        IF .REC%TYPE NEQ MSG%ERROR THEN RETURN KER%NORMAL;
  7969. ;   5163  2
  7970. ;   5164  2    !
  7971. ;   5165  2    ! Here to process an error packet.  Call the user routine to output the
  7972. ;   5166  2    ! error message to the terminal.
  7973. ;   5167  2    !
  7974. ;   5168  2    !
  7975. ;   5169  2    ![026] Use decoding routine to fetch the error text
  7976. ;   5170  2    !
  7977. ;   5171  2        CH$FILL (CHR%NUL, MAX%MSG + 1, CH$PTR (LAST%ERROR));
  7978. ;   5172  2        SET%STRING (CH$PTR (LAST%ERROR), MAX%MSG, TRUE);
  7979. ;   5173  2        BFR%EMPTY ();
  7980. ;   5174  2        SET%STRING (0, 0, FALSE);
  7981. ;   5175  2    ![026]    ERR%POINTER = CH$PTR (LAST%ERROR);
  7982. ;   5176  2    ![026]    POINTER = CH$PTR (REC%MSG, PKT%MSG, CHR%SIZE);
  7983. ;   5177  2    ![026]
  7984. ;   5178  2    ![026]    INCR I FROM 1 TO .REC%LENGTH DO
  7985. ;   5179  2    ![026]    CH$WCHAR%A (CH$RCHAR%A (POINTER), ERR%POINTER);
  7986. ;   5180  2    ![026]
  7987. ;   5181  2    ![026]    CH$WCHAR (CHR%NUL, ERR%POINTER);
  7988. ;   5182  2        TT%TEXT (LAST%ERROR);
  7989. ;   5183  2        TT%CRLF ();
  7990. ;   5184  2        RETURN KER%ERRMSG;
  7991. ;   5185  1        END;                    ! End of REC%PACKET
  7992.  
  7993.  
  7994. P.AAN:    BYTE    (7)"A","t","t","e","m"
  7995.     BYTE    (7)"p","t","i","n","g"
  7996.     BYTE    (7)" ","t","o"," ","r"
  7997.     BYTE    (7)"e","c","e","i","v"
  7998.     BYTE    (7)"e",000,000,000,000
  7999.  
  8000.  
  8001. ; ATTEMPT%TEXT
  8002. U.82=            P.AAN
  8003.  
  8004.  
  8005. ; REC%PACKET
  8006. U.26:    PUSH    SP,AC14                ;                                        4915
  8007.     PUSH    SP,AC16
  8008.     ADJSP    SP,1
  8009.     MOVEI    AC1,1                ;                                        4973
  8010.     TDNN    AC1,DEBUG%FLAG
  8011.     JRST    L.323
  8012.     PUSH    SP,C.88                ;                                        4980
  8013.     PUSHJ    SP,TT%SET%OUTPUT
  8014.     MOVE    AC14,AC1
  8015.     PUSH    SP,C.89                ;                                        4981
  8016.     PUSHJ    SP,TT%TEXT
  8017.     PUSHJ    SP,TT%CRLF            ;                                        4982
  8018.     MOVEM    AC14,0(SP)            ;                                        4983
  8019.     PUSHJ    SP,TT%SET%OUTPUT
  8020.     ADJSP    SP,-2                ;                                        4975
  8021. L.323:    MOVEI    AC1,1                ;                                        4990
  8022.     TDNN    AC1,TYP%STS%FLAG
  8023.     JRST    L.324
  8024.     PUSHJ    SP,U.33                ;                                        4993
  8025.     SETZM    TYP%STS%FLAG            ;                                        4994
  8026. L.324:    PUSH    SP,C.90                ;                                        5000
  8027.     MOVEI    AC1,-1(SP)
  8028.     PUSH    SP,AC1
  8029.     PUSHJ    SP,RECEIVE
  8030.     MOVE    AC14,AC1
  8031.     CAIE    AC14,300            ;                                        5005
  8032.     JRST    L.325
  8033.     PUSH    SP,C.12
  8034.     PUSH    SP,C.5
  8035.     PUSHJ    SP,XFR%STATUS
  8036.     ADJSP    SP,-2
  8037. L.325:    TRNE    AC14,1                ;                                        5011
  8038.     JRST    L.327
  8039.     CAIE    AC14,312            ;                                        5015
  8040.     CAIN    AC14,300
  8041.     JRST    L.326
  8042.     MOVEM    AC14,0(SP)
  8043.     PUSHJ    SP,KRM%ERROR
  8044. L.326:    ADJSP    SP,-2                ;                                        5018
  8045.     MOVE    AC1,AC14            ;                                        5013
  8046.     JRST    L.346
  8047. L.327:    MOVE    AC1,-2(SP)            ;                                        5025
  8048.     CAIGE    AC1,5
  8049.     JRST    L.328
  8050.     MOVE    AC2,C.91            ;                                        5031
  8051.     ILDB    AC2,AC2
  8052.     CAIN    AC2,40
  8053.     CAIL    AC1,10                ;                                        5034
  8054.     JRST    L.329
  8055. L.328:    ADJSP    SP,-2                ;                                        5037
  8056.     MOVEI    AC1,262                ;                                        5036
  8057.     JRST    L.346
  8058. L.329:    ADDM    AC1,RMSG%TOTAL%CHARS        ;                                        5043
  8059.     MOVE    AC1,C.92            ;                                        5047
  8060.     ILDB    AC1,AC1
  8061.     MOVEM    AC1,U.58
  8062.     MOVEI    AC1,4                ;                                        5051
  8063.     MOVEM    AC1,U.39
  8064.     MOVE    AC1,C.91            ;                                        5052
  8065.     ILDB    AC1,AC1
  8066.     SUBI    AC1,40
  8067.     MOVEM    AC1,U.57
  8068.     JUMPN    AC1,L.330            ;                                        5053
  8069.     MOVE    AC1,C.93            ;                                        5056
  8070.     ILDB    AC1,AC1
  8071.     IMULI    AC1,137
  8072.     MOVE    AC2,C.94            ;                                        5057
  8073.     ILDB    AC2,AC2
  8074.     ADD    AC1,AC2                ;                                        5056
  8075.     SUBI    AC1,5773            ;                                        5058
  8076.     MOVEM    AC1,U.57
  8077.     MOVEI    AC1,7                ;                                        5059
  8078.     MOVEM    AC1,U.39
  8079. L.330:    MOVE    AC1,C.95            ;                                        5062
  8080.     ILDB    AC1,AC1
  8081.     SUBI    AC1,40
  8082.     MOVEM    AC1,U.56
  8083.     PUSH    SP,C.90                ;                                        5066
  8084.     PUSHJ    SP,U.36
  8085.     MOVE    AC16,C.91            ;                                        5071
  8086.     MOVE    AC1,U.57            ;                                        5072
  8087.     SUB    AC1,U.48
  8088.     ADDI    AC1,61
  8089.     MOVEM    AC1,U.57
  8090.     MOVEM    AC16,0(SP)            ;                                        5073
  8091.     PUSH    SP,U.57
  8092.     PUSHJ    SP,U.19
  8093.     MOVE    AC2,U.57            ;                                        5074
  8094.     ADDI    AC2,1
  8095.     MOVE    AC3,C.27
  8096.     ADJBP    AC2,AC3
  8097.     MOVE    AC16,AC2
  8098.     MOVE    AC2,U.57            ;                                        5075
  8099.     SUB    AC2,U.39
  8100.     ADDI    AC2,1
  8101.     MOVEM    AC2,U.57
  8102.     MOVEI    AC14,13                ;                                        5076
  8103.     MOVE    AC3,U.48            ;                                        5078
  8104.     MOVE    AC2,AC3
  8105.     SUBI    AC2,61
  8106.     JRST    L.331(AC2)
  8107. L.331:    JRST    L.332
  8108.     JRST    L.334
  8109.     JRST    L.333
  8110. L.332:    ILDB    AC2,AC16            ;                                        5083
  8111.     SUBI    AC2,40
  8112.     CAMN    AC1,AC2
  8113.     JRST    L.336
  8114.     JRST    L.335
  8115. L.333:    ILDB    AC2,AC16            ;                                        5094
  8116.     SUBI    AC2,40
  8117.     LDB    AC4,C.86
  8118.     CAME    AC4,AC2
  8119.     JRST    L.335
  8120. L.334:    ILDB    AC2,AC16            ;                                        5095
  8121.     SUBI    AC2,40
  8122.     LDB    AC4,C.87            ;                                        5094
  8123.     CAME    AC4,AC2
  8124.     JRST    L.335
  8125.     ILDB    AC2,AC16            ;                                        5095
  8126.     SUBI    AC2,40
  8127.     LDB    AC4,C.18
  8128.     CAME    AC4,AC2
  8129. L.335:    MOVEI    AC14,172            ;                                        5097
  8130. L.336:    CAIE    AC14,172            ;                                        5110
  8131.     JRST    L.342
  8132.     CAIE    AC3,61                ;                                        5114
  8133.     SKIPE    U.56
  8134.     JRST    L.337
  8135.     MOVE    AC2,AC3
  8136.     SUBI    AC2,62
  8137.     MOVN    AC2,AC2
  8138.     CAMG    AC2,U.57
  8139.     JRST    L.337
  8140.     MOVEI    AC2,116                ;                                        5115
  8141.     CAMN    AC2,U.58
  8142.     JRST    L.338
  8143. L.337:    MOVEI    AC2,123
  8144.     CAME    AC2,U.58
  8145.     JRST    L.340
  8146. L.338:    MOVE    AC14,AC3            ;                                        5122
  8147.     MOVEI    AC2,61                ;                                        5123
  8148.     MOVEM    AC2,U.48
  8149.     MOVE    AC16,C.91            ;                                        5124
  8150.     MOVEM    AC16,0(SP)            ;                                        5125
  8151.     MOVE    AC2,U.57
  8152.     ADD    AC2,U.39
  8153.     SUBI    AC2,1
  8154.     PUSH    SP,AC2
  8155.     PUSHJ    SP,U.19
  8156.     MOVE    AC2,U.57            ;                                        5126
  8157.     ADD    AC2,U.39
  8158.     MOVE    AC3,C.27
  8159.     ADJBP    AC2,AC3
  8160.     MOVE    AC16,AC2
  8161.     ILDB    AC2,AC16            ;                                        5128
  8162.     SUBI    AC2,40
  8163.     CAMN    AC1,AC2
  8164.     JRST    L.339
  8165.     MOVEM    AC14,U.48            ;                                        5131
  8166.     ADJSP    SP,-5                ;                                        5132
  8167.     JRST    L.341
  8168. L.339:    ADJSP    SP,-1                ;                                        5117
  8169.     JRST    L.342                ;                                        5114
  8170. L.340:    ADJSP    SP,-4                ;                                        5137
  8171. L.341:    MOVEI    AC1,172
  8172.     JRST    L.346
  8173. L.342:    MOVEI    AC1,116                ;                                        5146
  8174.     CAME    AC1,U.58
  8175.     JRST    L.343
  8176.     AOS    RMSG%NAKS            ;                                        5149
  8177.     PUSH    SP,C.12                ;                                        5150
  8178.     PUSH    SP,C.24
  8179.     JRST    L.344
  8180. L.343:    AOS    RMSG%COUNT            ;                                        5154
  8181.     PUSH    SP,C.12                ;                                        5155
  8182.     PUSH    SP,C.85
  8183. L.344:    PUSHJ    SP,XFR%STATUS
  8184.     MOVEI    AC1,105                ;                                        5162
  8185.     CAMN    AC1,U.58
  8186.     JRST    L.345
  8187.     ADJSP    SP,-6
  8188.     MOVEI    AC1,13
  8189.     JRST    L.346
  8190. L.345:    SETZB    AC1,AC2                ;                                        5171
  8191.     MOVEI    AC4,1753
  8192.     MOVE    AC5,C.3
  8193.     EXTEND    AC1,C.1
  8194.     JFCL
  8195.     PUSH    SP,C.3                ;                                        5172
  8196.     PUSH    SP,C.55
  8197.     PUSH    SP,C.2
  8198.     PUSHJ    SP,U.30
  8199.     PUSHJ    SP,U.28                ;                                        5173
  8200.     SETZM    -2(SP)                ;                                        5174
  8201.     SETZM    -1(SP)
  8202.     SETZM    0(SP)
  8203.     PUSHJ    SP,U.30
  8204.     PUSH    SP,C.96                ;                                        5182
  8205.     PUSHJ    SP,TT%TEXT
  8206.     PUSHJ    SP,TT%CRLF            ;                                        5183
  8207.     ADJSP    SP,-12                ;                                        5184
  8208.     MOVEI    AC1,162                ;                                        4955
  8209. L.346:    ADJSP    SP,-1                ;                                        4915
  8210.     POP    SP,AC16
  8211.     POP    SP,AC14
  8212.     POPJ    SP,
  8213. C.86:    POINT    4,AC1,23
  8214. C.87:    POINT    6,AC1,29
  8215. C.88:    XWD    0,DBG%DUMP
  8216. C.89:    XWD    0,U.82
  8217. C.90:    XWD    0,U.59
  8218. C.91:    POINT    8,U.59,7
  8219. C.92:    POINT    8,U.59,23
  8220. C.93:    POINT    8,U.59,31
  8221. C.94:    POINT    8,U.59+1,7
  8222. C.95:    POINT    8,U.59,15
  8223. C.96:    XWD    0,LAST%ERROR
  8224.  
  8225. ; Routine Size:  218 words
  8226.  
  8227.  
  8228. ;   5186  1    %SBTTL 'CALC%BLOCK%CHECK'
  8229. ;   5187  1    ROUTINE CALC%BLOCK%CHECK (POINTER, LENGTH) =
  8230. ;   5188  1
  8231. ;   5189  1    !++
  8232. ;   5190  1    ! FUNCTIONAL DESCRIPTION:
  8233. ;   5191  1    !
  8234. ;   5192  1    !    This routine will calculate the proper value for the block check
  8235. ;   5193  1    !    for a given message.  The value it returns is dependant upon the
  8236. ;   5194  1    !    type of block check requested in BLK%CHK%TYPE.
  8237. ;   5195  1    !
  8238. ;   5196  1    ! CALLING SEQUENCE:
  8239. ;   5197  1    !
  8240. ;   5198  1    !    CHKSUM = CALC%BLOCK%CHECK (.POINTER, .LENGTH);
  8241. ;   5199  1    !
  8242. ;   5200  1    ! INPUT PARAMETERS:
  8243. ;   5201  1    !
  8244. ;   5202  1    !    POINTER - A character pointer to the first character to be
  8245. ;   5203  1    !        included in the block check.
  8246. ;   5204  1    !
  8247. ;   5205  1    !    LENGTH - The number of characters to be included.
  8248. ;   5206  1    !
  8249. ;   5207  1    ! IMPLICIT INPUTS:
  8250. ;   5208  1    !
  8251. ;   5209  1    !    BLK%CHK%TYPE - The type of block check to generate.
  8252. ;   5210  1    !
  8253. ;   5211  1    ! OUPTUT PARAMETERS:
  8254. ;   5212  1    !
  8255. ;   5213  1    !    The value is the block check.
  8256. ;   5214  1    !
  8257. ;   5215  1    ! IMPLICIT OUTPUTS:
  8258. ;   5216  1    !
  8259. ;   5217  1    !    None.
  8260. ;   5218  1    !
  8261. ;   5219  1    ! COMPLETION CODES:
  8262. ;   5220  1    !
  8263. ;   5221  1    !    None.
  8264. ;   5222  1    !
  8265. ;   5223  1    ! SIDE EFFECTS:
  8266. ;   5224  1    !
  8267. ;   5225  1    !    None.
  8268. ;   5226  1    !
  8269. ;   5227  1    !--
  8270. ;   5228  1
  8271. ;   5229  2        BEGIN
  8272. ;   5230  2
  8273. ;   5231  2        LOCAL
  8274. ;   5232  2        CHAR%MASK,                ! Mask for stripping bits
  8275. ;   5233  2        BLOCK%CHECK;                ! To build initial block check value
  8276. ;   5234  2
  8277. ;   5235  2        BLOCK%CHECK = 0;                ! Start out at 0
  8278. ;   5236  2    !
  8279. ;   5237  2    ! Set mask for characters so that we calculate the block check correctly
  8280. ;   5238  2    !
  8281. ;   5239  2        CHAR%MASK = (IF .PARITY%TYPE EQL PR%NONE THEN %O'377' ELSE %O'177');
  8282. ;   5240  2
  8283. ;   5241  2        CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF
  8284. ;   5242  2        SET
  8285. ;   5243  2
  8286. ;   5244  2        [CHK%1CHAR, CHK%2CHAR] :
  8287. ;   5245  2
  8288. ;   5246  2            INCR I FROM 1 TO .LENGTH DO
  8289. ;   5247  2            BLOCK%CHECK = .BLOCK%CHECK + (CH$RCHAR%A (POINTER) AND .CHAR%MASK);
  8290. ;   5248  2
  8291. ;   5249  2        [CHK%CRC] :
  8292. ;   5250  3            BEGIN
  8293. ;   5251  3    !
  8294. ;   5252  3    ! Ensure that the calculation is done with correct type of characters
  8295. ;   5253  3    !
  8296. ;   5254  3
  8297. ;   5255  3            LOCAL
  8298. ;   5256  3            TMP%PTR;            ! Temp pointer for copying chars
  8299. ;   5257  3
  8300. ;   5258  3            TMP%PTR = .POINTER;
  8301. ;   5259  3
  8302. ;   5260  3            IF .PARITY%TYPE NEQ PR%NONE
  8303. ;   5261  3            THEN
  8304. ;   5262  3
  8305. ;   5263  3            INCR I FROM 1 TO .LENGTH DO
  8306. ;   5264  3                CH$WCHAR%A ((CH$RCHAR (.TMP%PTR) AND %O'177'), TMP%PTR);
  8307. ;   5265  3
  8308. ;   5266  3            BLOCK%CHECK = CRCCLC (.POINTER, .LENGTH);
  8309. ;   5267  2            END;
  8310. ;   5268  2        TES;
  8311. ;   5269  2
  8312. ;   5270  2        IF .BLK%CHK%TYPE EQL CHK%1CHAR
  8313. ;   5271  2        THEN
  8314. ;   5272  2        BLOCK%CHECK = (.BLOCK%CHECK + ((.BLOCK%CHECK AND %O'300')/%O'100')) AND %O'77';
  8315. ;   5273  2
  8316. ;   5274  2        RETURN .BLOCK%CHECK;            ! Return the correct value
  8317. ;   5275  1        END;                    ! End of CALC%BLOCK%CHK
  8318.  
  8319.  
  8320. ; CALC%BLOCK%CHECK
  8321. U.19:    SETZ    AC5,                ;                                        5235
  8322.     MOVE    AC4,PARITY%TYPE            ;                                        5239
  8323.     JUMPN    AC4,L.347
  8324.     MOVEI    AC3,377
  8325.     JRST    L.348
  8326. L.347:    MOVEI    AC3,177
  8327. L.348:    MOVE    AC1,U.48            ;                                        5241
  8328.     SUBI    AC1,61
  8329.     JRST    L.349(AC1)
  8330. L.349:    JRST    L.350
  8331.     JRST    L.350
  8332.     JRST    L.353
  8333. L.350:    SETZ    AC2,                ;                                        5246
  8334.     JRST    L.352
  8335. L.351:    ILDB    AC1,-2(SP)            ;                                        5247
  8336.     AND    AC1,AC3
  8337.     ADD    AC5,AC1
  8338. L.352:    ADDI    AC2,1                ;                                        5246
  8339.     CAMG    AC2,-1(SP)
  8340.     JRST    L.351
  8341.     JRST    L.357                ;                                        5241
  8342. L.353:    MOVE    AC1,-2(SP)            ;                                        5258
  8343.     JUMPE    AC4,L.356            ;                                        5260
  8344.     MOVE    AC4,-1(SP)            ;                                        5263
  8345.     SETZ    AC3,
  8346.     JRST    L.355
  8347. L.354:    MOVE    AC2,AC1                ;                                        5264
  8348.     ILDB    AC2,AC2
  8349.     ANDI    AC2,177
  8350.     IDPB    AC2,AC1
  8351. L.355:    ADDI    AC3,1                ;                                        5263
  8352.     CAMG    AC3,AC4
  8353.     JRST    L.354
  8354. L.356:    PUSH    SP,-2(SP)            ;                                        5266
  8355.     PUSH    SP,-2(SP)
  8356.     PUSHJ    SP,CRCCLC
  8357.     MOVE    AC5,AC1
  8358.     ADJSP    SP,-2                ;                                        5250
  8359. L.357:    MOVEI    AC1,61                ;                                        5270
  8360.     CAME    AC1,U.48
  8361.     JRST    L.358
  8362.     MOVE    AC1,AC5                ;                                        5272
  8363.     ANDI    AC1,300
  8364.     IDIVI    AC1,100
  8365.     ADD    AC1,AC5
  8366.     LDB    AC5,C.18
  8367. L.358:    MOVE    AC1,AC5                ;                                        5229
  8368.     POPJ    SP,                ;                                        5187
  8369.  
  8370. ; Routine Size:  48 words
  8371.  
  8372.  
  8373. ;   5276  1    %SBTTL 'NORMALIZE%FILE - Put file name into normal form'
  8374. ;   5277  1    ROUTINE NORMALIZE%FILE (FILE%ADDRESS, FILE%LENGTH, NAME%LENGTH, TYPE%LENGTH) : NOVALUE =
  8375. ;   5278  1
  8376. ;   5279  1    !++
  8377. ;   5280  1    ! FUNCTIONAL DESCRIPTION:
  8378. ;   5281  1    !
  8379. ;   5282  1    !    This routine will ensure that a file specification is in normal
  8380. ;   5283  1    !    form.  It does this by replacing all non-alphanumeric characters
  8381. ;   5284  1    !    (except the first period) with "X".  It will also ensure that
  8382. ;   5285  1    !    the resulting specification (of form name.type) has only
  8383. ;   5286  1    !    a specified number of characters in the name portion and type portion.
  8384. ;   5287  1    !
  8385. ;   5288  1    ! CALLING SEQUENCE:
  8386. ;   5289  1    !
  8387. ;   5290  1    !    NORMALIZE%FILE (FILE%ADDRESS, FILE%LENGTH, NAME%LENGTH, TYPE%LENGTH);
  8388. ;   5291  1    !
  8389. ;   5292  1    ! INPUT PARAMETERS:
  8390. ;   5293  1    !
  8391. ;   5294  1    !    FILE%ADDRESS - Address of file specification string to be normalized
  8392. ;   5295  1    !
  8393. ;   5296  1    !    FILE%LENGTH - Length of file specification
  8394. ;   5297  1    !
  8395. ;   5298  1    !    NAME%LENGTH - Maximum length desired for "name" portion.
  8396. ;   5299  1    !
  8397. ;   5300  1    !    TYPE%LENGTH - Maximum length desired for "type" portion.
  8398. ;   5301  1    !
  8399. ;   5302  1    !    With both NAME%LENGTH and TYPE%LENGTH, a negative value indicates
  8400. ;   5303  1    !    unlimited lenght.
  8401. ;   5304  1    !
  8402. ;   5305  1    ! IMPLICIT INPUTS:
  8403. ;   5306  1    !
  8404. ;   5307  1    !    None.
  8405. ;   5308  1    !
  8406. ;   5309  1    ! OUPTUT PARAMETERS:
  8407. ;   5310  1    !
  8408. ;   5311  1    !    FILE%LENGTH - The length of the resulting file spec
  8409. ;   5312  1    !
  8410. ;   5313  1    !    NAME%LENGTH - The actual length of the resulting file name
  8411. ;   5314  1    !
  8412. ;   5315  1    !    TYPE%LENGTH - The actual length of the resulting file type
  8413. ;   5316  1    !
  8414. ;   5317  1    ! IMPLICIT OUTPUTS:
  8415. ;   5318  1    !
  8416. ;   5319  1    !    None.
  8417. ;   5320  1    !
  8418. ;   5321  1    ! COMPLETION CODES:
  8419. ;   5322  1    !
  8420. ;   5323  1    !    None.
  8421. ;   5324  1    !
  8422. ;   5325  1    ! SIDE EFFECTS:
  8423. ;   5326  1    !
  8424. ;   5327  1    !    None.
  8425. ;   5328  1    !
  8426. ;   5329  1    !--
  8427. ;   5330  1
  8428. ;   5331  2        BEGIN
  8429. ;   5332  2
  8430. ;   5333  2        LOCAL
  8431. ;   5334  2        CH,                    ! Character being processed
  8432. ;   5335  2        POINTER,                ! Pointer to file spec
  8433. ;   5336  2        WRT%POINTER,                ! Pointer to write file spec
  8434. ;   5337  2        WRT%SIZE,
  8435. ;   5338  2        FIRST%PERIOD,                ! Flag we have seen a period
  8436. ;   5339  2        IGNORE%BAD,                ! Flag we should ignore bad characters
  8437. ;   5340  2        BAD%CHAR,                ! Flag this character was bad
  8438. ;   5341  2        FILE%CTR,                ! Counter for overall length
  8439. ;   5342  2        NAME%CTR,                ! Counter for name characters
  8440. ;   5343  2        TYPE%CTR;                ! Counter for type characters
  8441. ;   5344  2
  8442. ;   5345  2        FILE%CTR = 0;
  8443. ;   5346  2        NAME%CTR = 0;
  8444. ;   5347  2        TYPE%CTR = 0;
  8445. ;   5348  2        WRT%SIZE = 0;
  8446. ;   5349  2        FIRST%PERIOD = FALSE;            ! No periods yet
  8447. ;   5350  2        POINTER = CH$PTR (.FILE%ADDRESS);        ! Set up pointer to file name
  8448. ;   5351  2        WRT%POINTER = .POINTER;
  8449. ;   5352  2
  8450. ;   5353  2        IF .NAME%LENGTH EQL 0 THEN FIRST%PERIOD = TRUE;    ! Pretend we did name already
  8451. ;   5354  2
  8452. ;   5355  2        IGNORE%BAD = FALSE;
  8453. ;   5356  2
  8454. ;   5357  2        IF .NAME%LENGTH GTR 0
  8455. ;   5358  2        THEN
  8456. ;   5359  3        BEGIN
  8457. ;   5360  3
  8458. ;   5361  3        DECR I FROM ..FILE%LENGTH TO 0 DO
  8459. ;   5362  3
  8460. ;   5363  3            IF CH$RCHAR%A (POINTER) EQL %C'.'
  8461. ;   5364  3            THEN
  8462. ;   5365  4            BEGIN
  8463. ;   5366  4            IGNORE%BAD = TRUE;
  8464. ;   5367  4            EXITLOOP;
  8465. ;   5368  3            END;
  8466. ;   5369  3
  8467. ;   5370  2        END;
  8468. ;   5371  2
  8469. ;   5372  2        POINTER = .WRT%POINTER;
  8470. ;   5373  2
  8471. ;   5374  2        WHILE .FILE%CTR LSS ..FILE%LENGTH DO
  8472. ;   5375  3        BEGIN
  8473. ;   5376  3        CH = CH$RCHAR%A (POINTER);        ! Get a character
  8474. ;   5377  3        FILE%CTR = .FILE%CTR + 1;
  8475. ;   5378  3
  8476. ;   5379  4        IF (.CH LSS %C'0' AND (.CH NEQ %C'.' OR .FIRST%PERIOD)) OR .CH GTR %C'z' OR (.CH GTR %C'9'
  8477. ;   5380  4            AND .CH LSS %C'A') OR (.CH GTR %C'Z' AND .CH LSS %C'a')
  8478. ;   5381  3        THEN
  8479. ;   5382  4            BEGIN
  8480. ;   5383  4            BAD%CHAR = TRUE;
  8481. ;   5384  4            CH = %C'X';
  8482. ;   5385  4            END
  8483. ;   5386  3        ELSE
  8484. ;   5387  4            BEGIN
  8485. ;   5388  4            BAD%CHAR = FALSE;
  8486. ;   5389  4
  8487. ;   5390  4            IF .CH GEQ %C'a' THEN CH = .CH - (%C'a' - %C'A');
  8488. ;   5391  4
  8489. ;   5392  3            END;
  8490. ;   5393  3
  8491. ;   5394  3        IF .CH EQL %C'.'
  8492. ;   5395  3        THEN
  8493. ;   5396  4            BEGIN
  8494. ;   5397  4            FIRST%PERIOD = TRUE;
  8495. ;   5398  4            CH$WCHAR%A (.CH, WRT%POINTER);
  8496. ;   5399  4            WRT%SIZE = .WRT%SIZE + 1;
  8497. ;   5400  4            END
  8498. ;   5401  3        ELSE
  8499. ;   5402  3
  8500. ;   5403  3            IF NOT .BAD%CHAR OR NOT .IGNORE%BAD
  8501. ;   5404  3            THEN
  8502. ;   5405  3
  8503. ;   5406  3            IF NOT .FIRST%PERIOD
  8504. ;   5407  3            THEN
  8505. ;   5408  4                BEGIN
  8506. ;   5409  4
  8507. ;   5410  4                IF .NAME%LENGTH LSS 0 OR .NAME%CTR LSS .NAME%LENGTH
  8508. ;   5411  4                THEN
  8509. ;   5412  5                BEGIN
  8510. ;   5413  5                NAME%CTR = .NAME%CTR + 1;
  8511. ;   5414  5                WRT%SIZE = .WRT%SIZE + 1;
  8512. ;   5415  5                CH$WCHAR%A (.CH, WRT%POINTER);
  8513. ;   5416  4                END;
  8514. ;   5417  4
  8515. ;   5418  4                END
  8516. ;   5419  3            ELSE
  8517. ;   5420  3
  8518. ;   5421  3                IF .TYPE%LENGTH LSS 0 OR .TYPE%CTR LSS .TYPE%LENGTH
  8519. ;   5422  3                THEN
  8520. ;   5423  4                BEGIN
  8521. ;   5424  4                TYPE%CTR = .TYPE%CTR + 1;
  8522. ;   5425  4                WRT%SIZE = .WRT%SIZE + 1;
  8523. ;   5426  4                CH$WCHAR%A (.CH, WRT%POINTER);
  8524. ;   5427  3                END;
  8525. ;   5428  3
  8526. ;   5429  2        END;
  8527. ;   5430  2
  8528. ;   5431  2        .FILE%LENGTH = .WRT%SIZE;
  8529. ;   5432  2        CH$WCHAR%A (CHR%NUL, WRT%POINTER);
  8530. ;   5433  1        END;                    ! End of NORMALIZE%FILE
  8531.  
  8532.  
  8533. ; NORMALIZE%FILE
  8534. U.27:    PUSH    SP,AC10                ;                                        5277
  8535.     PUSH    SP,AC11
  8536.     PUSH    SP,AC12
  8537.     PUSH    SP,AC13
  8538.     PUSH    SP,AC14
  8539.     PUSH    SP,AC16
  8540.     SETZB    AC16,AC11            ;                                        5345
  8541.     SETZB    AC10,AC12            ;                                        5347
  8542.     SETZ    AC13,                ;                                        5349
  8543.     MOVE    AC1,-12(SP)            ;                                        5350
  8544.     MOVEI    AC1,-1(AC1)
  8545.     HRLI    AC1,10700
  8546.     MOVE    AC4,AC1                ;                                        5351
  8547.     SKIPN    AC2,-10(SP)            ;                                        5353
  8548.     MOVEI    AC13,1
  8549.     SETZ    AC14,                ;                                        5355
  8550.     JUMPLE    AC2,L.361            ;                                        5357
  8551.     MOVE    AC2,-11(SP)            ;                                        5361
  8552.     MOVE    AC3,0(AC2)
  8553.     AOJA    AC3,L.360
  8554. L.359:    ILDB    AC2,AC1                ;                                        5363
  8555.     CAIE    AC2,56
  8556.     JRST    L.360
  8557.     MOVEI    AC14,1                ;                                        5366
  8558.     JRST    L.361                ;                                        5365
  8559. L.360:    SOJGE    AC3,L.359            ;                                        5361
  8560. L.361:    MOVE    AC1,AC4                ;                                        5372
  8561. L.362:    MOVE    AC3,-11(SP)            ;                                        5374
  8562.     CAML    AC16,0(AC3)
  8563.     JRST    L.374
  8564.     ILDB    AC2,AC1                ;                                        5376
  8565.     ADDI    AC16,1                ;                                        5377
  8566.     CAIL    AC2,60                ;                                        5379
  8567.     JRST    L.363
  8568.     CAIN    AC2,56
  8569.     TRNE    AC13,1
  8570.     JRST    L.365
  8571. L.363:    CAILE    AC2,172
  8572.     JRST    L.365
  8573.     CAIG    AC2,71
  8574.     JRST    L.364
  8575.     CAIGE    AC2,101                ;                                        5380
  8576.     JRST    L.365
  8577. L.364:    CAILE    AC2,132
  8578.     CAIL    AC2,141
  8579.     JRST    L.366
  8580. L.365:    MOVEI    AC5,1                ;                                        5383
  8581.     MOVEI    AC2,130                ;                                        5384
  8582.     JRST    L.367                ;                                        5379
  8583. L.366:    SETZ    AC5,                ;                                        5388
  8584.     CAIL    AC2,141                ;                                        5390
  8585.     SUBI    AC2,40
  8586. L.367:    CAIE    AC2,56                ;                                        5394
  8587.     JRST    L.368
  8588.     MOVEI    AC13,1                ;                                        5397
  8589.     IDPB    AC2,AC4                ;                                        5398
  8590.     AOJA    AC12,L.362            ;                                        5394
  8591. L.368:    TRNN    AC5,1                ;                                        5403
  8592.     JRST    L.369
  8593.     TRNE    AC14,1
  8594.     JRST    L.362
  8595. L.369:    TRNE    AC13,1                ;                                        5406
  8596.     JRST    L.371
  8597.     MOVE    AC3,-10(SP)            ;                                        5410
  8598.     JUMPL    AC3,L.370
  8599.     CAML    AC11,AC3
  8600.     JRST    L.362
  8601. L.370:    AOJA    AC11,L.373            ;                                        5413
  8602. L.371:    MOVE    AC3,-7(SP)            ;                                        5421
  8603.     JUMPL    AC3,L.372
  8604.     CAML    AC10,AC3
  8605.     JRST    L.362
  8606. L.372:    ADDI    AC10,1                ;                                        5424
  8607. L.373:    ADDI    AC12,1                ;                                        5425
  8608.     IDPB    AC2,AC4                ;                                        5426
  8609.     JRST    L.362                ;                                        5421
  8610. L.374:    MOVE    AC1,-11(SP)            ;                                        5431
  8611.     MOVEM    AC12,0(AC1)
  8612.     SETZ    AC1,                ;                                        5432
  8613.     IDPB    AC1,AC4
  8614.     POP    SP,AC16                ;                                        5277
  8615.     POP    SP,AC14
  8616.     POP    SP,AC13
  8617.     POP    SP,AC12
  8618.     POP    SP,AC11
  8619.     POP    SP,AC10
  8620.     POPJ    SP,
  8621.  
  8622. ; Routine Size:  87 words
  8623.  
  8624.  
  8625. ;   5434  1    %SBTTL 'Buffer filling -- Main routine'
  8626. ;   5435  1    ROUTINE BFR%FILL (FIRST%FLAG) =
  8627. ;   5436  1
  8628. ;   5437  1    !++
  8629. ;   5438  1    ! FUNCTIONAL DESCRIPTION:
  8630. ;   5439  1    !
  8631. ;   5440  1    !    This routine will fill the buffer with data from the file.  It
  8632. ;   5441  1    !    will do all the quoting that is required.
  8633. ;   5442  1    !
  8634. ;   5443  1    ! CALLING SEQUENCE:
  8635. ;   5444  1    !
  8636. ;   5445  1    !    EOF%FLAG = BFR%FILL(.FIRST%FLAG);
  8637. ;   5446  1    !
  8638. ;   5447  1    ! INPUT PARAMETERS:
  8639. ;   5448  1    !
  8640. ;   5449  1    !    FIRST%FLAG - Flag whether first call for this file
  8641. ;   5450  1    !
  8642. ;   5451  1    ! IMPLICIT INPUTS:
  8643. ;   5452  1    !
  8644. ;   5453  1    !    None.
  8645. ;   5454  1    !
  8646. ;   5455  1    ! OUTPUT PARAMETERS:
  8647. ;   5456  1    !
  8648. ;   5457  1    !    True - Buffer filled may be at end of file.
  8649. ;   5458  1    !    False - At end of file.
  8650. ;   5459  1    !
  8651. ;   5460  1    ! IMPLICIT OUTPUTS:
  8652. ;   5461  1    !
  8653. ;   5462  1    !    Number of characters stored in the buffer.
  8654. ;   5463  1    !
  8655. ;   5464  1    ! COMPLETION CODES:
  8656. ;   5465  1    !
  8657. ;   5466  1    !    None.
  8658. ;   5467  1    !
  8659. ;   5468  1    ! SIDE EFFECTS:
  8660. ;   5469  1    !
  8661. ;   5470  1    !    None.
  8662. ;   5471  1    !
  8663. ;   5472  1    !--
  8664. ;   5473  1
  8665. ;   5474  2        BEGIN
  8666. ;   5475  2
  8667. ;   5476  2        LITERAL
  8668. ;   5477  2        NO%CHAR = -1,                ! No character next
  8669. ;   5478  2        EOF%CHAR = -2;                ! EOF seen
  8670. ;   5479  2
  8671. ;   5480  2        LOCAL
  8672. ;   5481  2        I,                    ! Temp loop index
  8673. ;   5482  2        MAX%SIZE,                ! Maximum size of data
  8674. ;   5483  2        POINTER;                ! Pointer into the message buffer
  8675. ;   5484  2
  8676. ;   5485  2        OWN
  8677. ;   5486  2        NEXT%CHR,                ! Saved character
  8678. ;   5487  2        STATUS,                    ! Status value
  8679. ;   5488  2        REPEAT%COUNT,                ! Number of times character repeated
  8680. ;   5489  2        CHAR%8%BIT,                ! 8 bit character from file
  8681. ;   5490  2        CHRS : VECTOR [5],            ! String needed to represent character
  8682. ;   5491  2        CHR%IDX,                ! Index into CHRS
  8683. ;   5492  2        OLD%CHAR%8%BIT,                ! Previous 8-bit character
  8684. ;   5493  2        OLD%CHRS : VECTOR [5],            ! String for previous character
  8685. ;   5494  2        OLD%CHR%IDX;                ! Index for previous character
  8686. ;   5495  2
  8687. ;   5496  2        ROUTINE GET%QUOTED%CHAR =
  8688. ;   5497  2    !
  8689. ;   5498  2    ! This routine gets a character from the file and returns both
  8690. ;   5499  2    ! the character and the string needed to represent the character
  8691. ;   5500  2    ! if it needs quoting.
  8692. ;   5501  2    !
  8693. ;   5502  3        BEGIN
  8694. ;   5503  3
  8695. ;   5504  3        IF .NEXT%CHR GEQ 0
  8696. ;   5505  3        THEN
  8697. ;   5506  4            BEGIN
  8698. ;   5507  4            CHAR%8%BIT = .NEXT%CHR;
  8699. ;   5508  4            NEXT%CHR = NO%CHAR;
  8700. ;   5509  4            STATUS = KER%NORMAL;
  8701. ;   5510  4            END
  8702. ;   5511  3        ELSE
  8703. ;   5512  3
  8704. ;   5513  3            IF .NEXT%CHR EQL NO%CHAR
  8705. ;   5514  3            THEN
  8706. ;   5515  3            STATUS = (.GET%CHR%ROUTINE) (CHAR%8%BIT)
  8707. ;   5516  3            ELSE
  8708. ;   5517  3            STATUS = KER%EOF;
  8709. ;   5518  3
  8710. ;   5519  3        IF .STATUS EQL KER%NORMAL
  8711. ;   5520  3        THEN
  8712. ;   5521  4            BEGIN
  8713. ;   5522  4    !
  8714. ;   5523  4    ! Determine if we should just quote the character
  8715. ;   5524  4    !    Either:
  8716. ;   5525  4    !        Character is a delete (177 octal)
  8717. ;   5526  4    !    or    Character is a control character (less than 40 octal)
  8718. ;   5527  4    !    or    Character is a quote character
  8719. ;   5528  4    !    or    Character is the repeat character and doing repeat compression
  8720. ;   5529  4    !    or    Character is an eight bit quote character and doing eight bit
  8721. ;   5530  4    !          quoting.
  8722. ;   5531  4    !
  8723. ;   5532  4
  8724. ;   5533  5            IF ((.CHAR%8%BIT AND %O'177') LSS %C' ') OR ((.CHAR%8%BIT AND %O'177') EQL CHR%DEL) OR (
  8725. ;   5534  7            (.CHAR%8%BIT AND %O'177') EQL .RCV%QUOTE%CHR) OR (.FLAG%REPEAT AND ((.CHAR%8%BIT AND
  8726. ;   5535  6            %O'177') EQL .REPT%CHR)) OR (.FLAG%8QUOTE AND ((.CHAR%8%BIT AND %O'177') EQL
  8727. ;   5536  5            .SEND%8QUOTE%CHR))
  8728. ;   5537  4            THEN
  8729. ;   5538  5            BEGIN
  8730. ;   5539  5    !
  8731. ;   5540  5    ! If the character is a control character or delete we must do a CTL(Character)
  8732. ;   5541  5    ! so it is something that we can be sure we can send.
  8733. ;   5542  5    !
  8734. ;   5543  5
  8735. ;   5544  6            IF ((.CHAR%8%BIT AND %O'177') LSS %C' ') OR ((.CHAR%8%BIT AND %O'177') EQL CHR%DEL)
  8736. ;   5545  5            THEN
  8737. ;   5546  6                CHRS [0] = CTL (.CHAR%8%BIT)
  8738. ;   5547  5            ELSE
  8739. ;   5548  5                CHRS [0] = .CHAR%8%BIT;
  8740. ;   5549  5
  8741. ;   5550  5            CHR%IDX = 1;
  8742. ;   5551  5            CHRS [1] = .RCV%QUOTE%CHR;    ![035] Use character we said we would send
  8743. ;   5552  5            END
  8744. ;   5553  4            ELSE
  8745. ;   5554  5            BEGIN
  8746. ;   5555  5            CHR%IDX = 0;
  8747. ;   5556  5            CHRS [0] = .CHAR%8%BIT;
  8748. ;   5557  4            END;
  8749. ;   5558  4
  8750. ;   5559  4            END
  8751. ;   5560  3        ELSE
  8752. ;   5561  3
  8753. ;   5562  3            IF .STATUS NEQ KER%EOF THEN KRM%ERROR (.STATUS);    ! Report error
  8754. ;   5563  3
  8755. ;   5564  3        RETURN .STATUS;
  8756. ;   5565  2        END;
  8757.  
  8758.  
  8759.     RELOC    1025
  8760. ; NEXT%CHR
  8761. U.83:    BLOCK    1
  8762. ; STATUS
  8763. U.84:    BLOCK    1
  8764. ; REPEAT%COUNT
  8765. U.85:    BLOCK    1
  8766. ; CHAR%8%BIT
  8767. U.86:    BLOCK    1
  8768. ; CHRS
  8769. U.87:    BLOCK    5
  8770. ; CHR%IDX
  8771. U.88:    BLOCK    1
  8772. ; OLD%CHAR%8%BIT
  8773. U.89:    BLOCK    1
  8774. ; OLD%CHRS
  8775. U.90:    BLOCK    5
  8776. ; OLD%CHR%IDX
  8777. U.91:    BLOCK    1
  8778.  
  8779.  
  8780.     RELOC    405672
  8781. ; GET%QUOTED%CHAR
  8782. U.92:    MOVE    AC1,U.83            ;                                        5504
  8783.     JUMPL    AC1,L.375
  8784.     MOVEM    AC1,U.86            ;                                        5507
  8785.     SETOM    U.83                ;                                        5508
  8786.     MOVEI    AC1,13                ;                                        5509
  8787.     JRST    L.377
  8788. L.375:    CAME    AC1,C.36            ;                                        5513
  8789.     JRST    L.376
  8790.     MOVE    AC1,U.67            ;                                        5515
  8791.     PUSH    SP,C.98
  8792.     PUSHJ    SP,0(AC1)
  8793.     MOVEM    AC1,U.84
  8794.     ADJSP    SP,-1
  8795.     JRST    L.378                ;                                        5513
  8796. L.376:    MOVEI    AC1,113                ;                                        5517
  8797. L.377:    MOVEM    AC1,U.84
  8798. L.378:    MOVE    AC1,U.84            ;                                        5519
  8799.     CAIE    AC1,13
  8800.     JRST    L.383
  8801.     MOVE    AC2,U.86            ;                                        5533
  8802.     LDB    AC1,C.97
  8803.     SETZ    AC3,
  8804.     CAIL    AC1,40
  8805.     JRST    L.379
  8806.     MOVEI    AC3,1
  8807.     JRST    L.381
  8808. L.379:    CAIE    AC1,177
  8809.     CAMN    AC1,RCV%QUOTE%CHR
  8810.     JRST    L.381
  8811.     MOVEI    AC4,1                ;                                        5534
  8812.     TDNN    AC4,U.50
  8813.     JRST    L.380
  8814.     CAMN    AC1,U.38
  8815.     JRST    L.381
  8816. L.380:    MOVEI    AC4,1                ;                                        5535
  8817.     TDNE    AC4,U.49
  8818.     CAME    AC1,U.45
  8819.     JRST    L.382
  8820. L.381:    TRNN    AC3,1                ;                                        5544
  8821.     CAIN    AC1,177
  8822.     TRC    AC2,100                ;                                        5546
  8823.     MOVEM    AC2,U.87            ;                                        5548
  8824.     MOVEI    AC1,1                ;                                        5550
  8825.     MOVEM    AC1,U.88
  8826.     MOVE    AC1,RCV%QUOTE%CHR        ;                                        5551
  8827.     MOVEM    AC1,U.87+1
  8828.     JRST    L.384                ;                                        5533
  8829. L.382:    SETZM    U.88                ;                                        5555
  8830.     MOVEM    AC2,U.87            ;                                        5556
  8831.     JRST    L.384                ;                                        5519
  8832. L.383:    CAIN    AC1,113                ;                                        5562
  8833.     JRST    L.384
  8834.     PUSH    SP,AC1
  8835.     PUSHJ    SP,KRM%ERROR
  8836.     ADJSP    SP,-1
  8837. L.384:    MOVE    AC1,U.84            ;                                        5502
  8838.     POPJ    SP,                ;                                        5496
  8839. C.97:    POINT    7,AC2,35
  8840. C.98:    XWD    0,U.86
  8841.  
  8842. ; Routine Size:  59 words
  8843.  
  8844.  
  8845. ;   5566  2        ROUTINE GET%8%QUOTED%CHAR =
  8846. ;   5567  2    !
  8847. ;   5568  2    ! This routine will get the quoted representation of a character
  8848. ;   5569  2    ! (by calling GET%QUOTED%CHAR), and return the 8th-bit quoted
  8849. ;   5570  2    ! representation.
  8850. ;   5571  2    !
  8851. ;   5572  3        BEGIN
  8852. ;   5573  3
  8853. ;   5574  3        IF (STATUS = GET%QUOTED%CHAR ()) EQL KER%NORMAL
  8854. ;   5575  3        THEN
  8855. ;   5576  4            BEGIN
  8856. ;   5577  4    !
  8857. ;   5578  4    ! Determine if we must quote the eighth bit (parity bit on)
  8858. ;   5579  4    !
  8859. ;   5580  4
  8860. ;   5581  5            IF (((.CHRS [0] AND %O'177') NEQ .CHRS [0]) AND .FLAG%8QUOTE)
  8861. ;   5582  4            THEN
  8862. ;   5583  5            BEGIN
  8863. ;   5584  5            CHRS [0] = .CHRS [0] AND %O'177';
  8864. ;   5585  5            CHR%IDX = .CHR%IDX + 1;
  8865. ;   5586  5            CHRS [.CHR%IDX] = .SEND%8QUOTE%CHR;
  8866. ;   5587  4            END;
  8867. ;   5588  4
  8868. ;   5589  3            END;
  8869. ;   5590  3
  8870. ;   5591  3        RETURN .STATUS;
  8871. ;   5592  2        END;
  8872.  
  8873.  
  8874. ; GET%8%QUOTED%CHAR
  8875. U.93:    PUSHJ    SP,U.92                ;                                        5574
  8876.     MOVEM    AC1,U.84
  8877.     CAIE    AC1,13
  8878.     JRST    L.385
  8879.     LDB    AC1,C.99            ;                                        5581
  8880.     CAMN    AC1,U.87
  8881.     JRST    L.385
  8882.     MOVEI    AC1,1
  8883.     TDNN    AC1,U.49
  8884.     JRST    L.385
  8885.     LDB    AC1,C.99            ;                                        5584
  8886.     MOVEM    AC1,U.87
  8887.     AOS    AC1,U.88            ;                                        5586
  8888.     MOVE    AC2,U.45
  8889.     MOVEM    AC2,U.87(AC1)
  8890. L.385:    MOVE    AC1,U.84            ;                                        5572
  8891.     POPJ    SP,                ;                                        5566
  8892. C.99:    POINT    7,U.87,35
  8893.  
  8894. ; Routine Size:  18 words
  8895.  
  8896.  
  8897. ;   5593  2    !
  8898. ;   5594  2    ! Start of code for BFR%FILL
  8899. ;   5595  2    !
  8900. ;   5596  2    ! Initialize pointer and count
  8901. ;   5597  2    !
  8902. ;   5598  2        SIZE = 0;
  8903. ;   5599  2        IF .SEND%PKT%SIZE GTR 94                           ! [108]
  8904. ;   5600  2        THEN                                   ! [108]
  8905. ;   5601  3        BEGIN                                   ! [108]
  8906. ;   5602  3        POINTER = CH$PTR (SND%MSG, PKT%MSGX, CHR%SIZE);               ! [108]
  8907. ;   5603  3        MAX%SIZE = .SEND%PKT%SIZE - PKT%MSGX + 1 - (.BLK%CHK%TYPE - CHK%1CHAR);
  8908. ;   5604  3        END                                   ! [108]
  8909. ;   5605  2        ELSE                                   ! [108]
  8910. ;   5606  3        BEGIN                                   ! [108]
  8911. ;   5607  3        POINTER = CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE);               ! [108]
  8912. ;   5608  3        MAX%SIZE = .SEND%PKT%SIZE - PKT%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR);
  8913. ;   5609  2            END;                                   ! [108]
  8914. ;   5610  2    !
  8915. ;   5611  2    ! If last call got an error or eof, return it now
  8916. ;   5612  2    !
  8917. ;   5613  2
  8918. ;   5614  2        IF NOT .FIRST%FLAG AND (.STATUS NEQ KER%NORMAL) THEN RETURN .STATUS;
  8919. ;   5615  2
  8920. ;   5616  2    !
  8921. ;   5617  2    ! If first time for a file prime the pump with the first character.
  8922. ;   5618  2    !
  8923. ;   5619  2
  8924. ;   5620  2        IF .FIRST%FLAG
  8925. ;   5621  2        THEN
  8926. ;   5622  3        BEGIN
  8927. ;   5623  3        FIRST%FLAG = FALSE;
  8928. ;   5624  3        NEXT%CHR = -1;                ! No backed up character
  8929. ;   5625  3
  8930. ;   5626  3        IF .FLAG%8QUOTE THEN STATUS = GET%8%QUOTED%CHAR () ELSE STATUS = GET%QUOTED%CHAR ();
  8931. ;   5627  3
  8932. ;   5628  3        IF .STATUS NEQ KER%NORMAL THEN RETURN .STATUS;
  8933. ;   5629  3
  8934. ;   5630  3        OLD%CHAR%8%BIT = .CHAR%8%BIT;
  8935. ;   5631  3
  8936. ;   5632  3        INCR OLD%CHR%IDX FROM 0 TO .CHR%IDX DO
  8937. ;   5633  3            OLD%CHRS [.OLD%CHR%IDX] = .CHRS [.OLD%CHR%IDX];
  8938. ;   5634  3
  8939. ;   5635  3        OLD%CHR%IDX = .CHR%IDX;
  8940. ;   5636  3        REPEAT%COUNT = 0;            ! Character was not repeated yet
  8941. ;   5637  3                            ! Will always be incremented
  8942. ;   5638  2        END;
  8943. ;   5639  2
  8944. ;   5640  2    !
  8945. ;   5641  2    ! Otherwise, loop until we fill buffer
  8946. ;   5642  2    !
  8947. ;   5643  2
  8948. ;   5644  2        WHILE .SIZE LSS .MAX%SIZE DO         ! Normal exit is via an EXITLOOP
  8949. ;   5645  3        BEGIN
  8950. ;   5646  3    !
  8951. ;   5647  3    ! Check if we are doing run compression
  8952. ;   5648  3    !
  8953. ;   5649  3
  8954. ;   5650  3        IF .FLAG%REPEAT
  8955. ;   5651  3        THEN
  8956. ;   5652  4            BEGIN
  8957. ;   5653  4    !
  8958. ;   5654  4    ! Here with previous character in OLD%xxx.  As long as we
  8959. ;   5655  4    ! are getting the same character, just count the run.
  8960. ;   5656  4    !
  8961. ;   5657  4
  8962. ;   5658  4            WHILE (.CHAR%8%BIT EQL .OLD%CHAR%8%BIT) AND (.REPEAT%COUNT LSS 94) DO
  8963. ;   5659  5            BEGIN
  8964. ;   5660  5            REPEAT%COUNT = .REPEAT%COUNT + 1;
  8965. ;   5661  5
  8966. ;   5662  5            IF .FLAG%8QUOTE THEN STATUS = GET%8%QUOTED%CHAR () ELSE STATUS = GET%QUOTED%CHAR ();
  8967. ;   5663  5
  8968. ;   5664  5            IF .STATUS NEQ KER%NORMAL
  8969. ;   5665  5            THEN
  8970. ;   5666  5
  8971. ;   5667  5                IF .STATUS NEQ KER%EOF
  8972. ;   5668  5                THEN
  8973. ;   5669  5                CHAR%8%BIT = NO%CHAR
  8974. ;   5670  5                ELSE
  8975. ;   5671  6                BEGIN
  8976. ;   5672  6                CHAR%8%BIT = EOF%CHAR;
  8977. ;   5673  6                CHR%IDX = -1;
  8978. ;   5674  5                END;
  8979. ;   5675  5
  8980. ;   5676  4            END;
  8981. ;   5677  4
  8982. ;   5678  5            IF .OLD%CHR%IDX + 1 + 2 LSS ((.OLD%CHR%IDX + 1)*.REPEAT%COUNT)
  8983. ;   5679  4            THEN
  8984. ;   5680  5            BEGIN
  8985. ;   5681  5
  8986. ;   5682  5            IF .SIZE + .OLD%CHR%IDX + 1 + 2 GTR .MAX%SIZE
  8987. ;   5683  5            THEN
  8988. ;   5684  6                BEGIN
  8989. ;   5685  6
  8990. ;   5686  6                IF .CHAR%8%BIT EQL .OLD%CHAR%8%BIT
  8991. ;   5687  6                THEN
  8992. ;   5688  7                BEGIN
  8993. ;   5689  7                NEXT%CHR = .CHAR%8%BIT;
  8994. ;   5690  7                REPEAT%COUNT = .REPEAT%COUNT - 1;
  8995. ;   5691  6                END;
  8996. ;   5692  6
  8997. ;   5693  6                IF .CHAR%8%BIT EQL EOF%CHAR
  8998. ;   5694  6                THEN
  8999. ;   5695  7                BEGIN
  9000. ;   5696  7                NEXT%CHR = EOF%CHAR;    ! Remember EOF for next time
  9001. ;   5697  7                STATUS = KER%NORMAL;    ! And give good return now
  9002. ;   5698  6                END;
  9003. ;   5699  6
  9004. ;   5700  6                EXITLOOP;
  9005. ;   5701  5                END;
  9006. ;   5702  5
  9007. ;   5703  5            OLD%CHRS [.OLD%CHR%IDX + 1] = CHAR (.REPEAT%COUNT);
  9008. ;   5704  5            OLD%CHRS [.OLD%CHR%IDX + 2] = .REPT%CHR;
  9009. ;   5705  5            OLD%CHR%IDX = .OLD%CHR%IDX + 2;
  9010. ;   5706  5    !
  9011. ;   5707  5    ! Count the number of file characters this represents
  9012. ;   5708  5    !
  9013. ;   5709  5            SMSG%DATA%CHARS = .SMSG%DATA%CHARS + .REPEAT%COUNT - 1;
  9014. ;   5710  5            FILE%CHARS = .FILE%CHARS + .REPEAT%COUNT - 1;
  9015. ;   5711  5            REPEAT%COUNT = 1;        ! Only one time for this string
  9016. ;   5712  4            END;
  9017. ;   5713  4
  9018. ;   5714  4    !
  9019. ;   5715  4    ! If we don't have enough room for this character, wait till next
  9020. ;   5716  4    ! time.
  9021. ;   5717  4    !
  9022. ;   5718  4
  9023. ;   5719  4            IF .SIZE + (.OLD%CHR%IDX + 1)*.REPEAT%COUNT GTR .MAX%SIZE
  9024. ;   5720  4            THEN
  9025. ;   5721  5            BEGIN
  9026. ;   5722  5    ! If the next character is the same, the count will get incremented
  9027. ;   5723  5    ! next time we enter, so back it off now.
  9028. ;   5724  5
  9029. ;   5725  5            IF .CHAR%8%BIT EQL .OLD%CHAR%8%BIT
  9030. ;   5726  5            THEN
  9031. ;   5727  6                BEGIN
  9032. ;   5728  6                NEXT%CHR = .CHAR%8%BIT;
  9033. ;   5729  6                REPEAT%COUNT = .REPEAT%COUNT - 1;
  9034. ;   5730  5                END;
  9035. ;   5731  5    !
  9036. ;   5732  5    ! If this is the last character of the file,
  9037. ;   5733  5    ! remember that for next time, but give good return now.
  9038. ;   5734  5    !
  9039. ;   5735  5            IF .CHAR%8%BIT EQL EOF%CHAR
  9040. ;   5736  5            THEN
  9041. ;   5737  6                BEGIN
  9042. ;   5738  6                NEXT%CHR = EOF%CHAR;
  9043. ;   5739  6                STATUS = KER%NORMAL
  9044. ;   5740  5                END;
  9045. ;   5741  5
  9046. ;   5742  5            EXITLOOP;
  9047. ;   5743  4            END;
  9048. ;   5744  4
  9049. ;   5745  4            SMSG%DATA%CHARS = .SMSG%DATA%CHARS + .REPEAT%COUNT;
  9050. ;   5746  4            FILE%CHARS = .FILE%CHARS + .REPEAT%COUNT;
  9051. ;   5747  4
  9052. ;   5748  4            DECR REPEAT%COUNT FROM .REPEAT%COUNT TO 1 DO
  9053. ;   5749  4
  9054. ;   5750  4            DECR I FROM .OLD%CHR%IDX TO 0 DO
  9055. ;   5751  5                BEGIN
  9056. ;   5752  5                CH$WCHAR%A (.OLD%CHRS [.I], POINTER);
  9057. ;   5753  5                SIZE = .SIZE + 1;
  9058. ;   5754  4                END;
  9059. ;   5755  4
  9060. ;   5756  4    !
  9061. ;   5757  4    ! If we had to defer EOF condition, reactivate it now.
  9062. ;   5758  4    !
  9063. ;   5759  4            IF (.CHAR%8%BIT EQL EOF%CHAR) THEN STATUS = KER%EOF;
  9064. ;   5760  4    !
  9065. ;   5761  4    ! If we got an error (or EOF) then exit
  9066. ;   5762  4    !
  9067. ;   5763  4
  9068. ;   5764  4            IF (.STATUS NEQ KER%NORMAL) THEN EXITLOOP;
  9069. ;   5765  4
  9070. ;   5766  4    !
  9071. ;   5767  4    ! Otherwise, copy the character which broke the run
  9072. ;   5768  4    !
  9073. ;   5769  4            OLD%CHAR%8%BIT = .CHAR%8%BIT;
  9074. ;   5770  4
  9075. ;   5771  4            INCR OLD%CHR%IDX FROM 0 TO .CHR%IDX DO
  9076. ;   5772  4            OLD%CHRS [.OLD%CHR%IDX] = .CHRS [.OLD%CHR%IDX];
  9077. ;   5773  4
  9078. ;   5774  4            OLD%CHR%IDX = .CHR%IDX;
  9079. ;   5775  4            REPEAT%COUNT = 0;
  9080. ;   5776  4            END
  9081. ;   5777  3        ELSE
  9082. ;   5778  3    !
  9083. ;   5779  3    ! Here if we are not doing run compression.  We can do things much
  9084. ;   5780  3    ! easier.
  9085. ;   5781  3    !
  9086. ;   5782  4            BEGIN
  9087. ;   5783  4
  9088. ;   5784  4            IF (.SIZE + .CHR%IDX + 1) GTR .MAX%SIZE THEN EXITLOOP;
  9089. ;   5785  4
  9090. ;   5786  4            SMSG%DATA%CHARS = .SMSG%DATA%CHARS + 1;
  9091. ;   5787  4            FILE%CHARS = .FILE%CHARS + 1;
  9092. ;   5788  4
  9093. ;   5789  4            DECR CHR%IDX FROM .CHR%IDX TO 0 DO
  9094. ;   5790  5            BEGIN
  9095. ;   5791  5            CH$WCHAR%A (.CHRS [.CHR%IDX], POINTER);
  9096. ;   5792  5            SIZE = .SIZE + 1;
  9097. ;   5793  4            END;
  9098. ;   5794  4
  9099. ;   5795  4            IF .FLAG%8QUOTE THEN STATUS = GET%8%QUOTED%CHAR () ELSE STATUS = GET%QUOTED%CHAR ();
  9100. ;   5796  4
  9101. ;   5797  4            IF (.STATUS NEQ KER%NORMAL) THEN EXITLOOP;
  9102. ;   5798  4
  9103. ;   5799  3            END;
  9104. ;   5800  3
  9105. ;   5801  2        END;
  9106. ;   5802  2
  9107. ;   5803  2    ! [108] Return negative size if we use extend packet format
  9108. ;   5804  2
  9109. ;   5805  2        IF .SEND%PKT%SIZE GTR 94                           ! [108]
  9110. ;   5806  2        THEN                                   ! [108]
  9111. ;   5807  2        SIZE = -.SIZE;                               ! [108]
  9112. ;   5808  2
  9113. ;   5809  2    !
  9114. ;   5810  2    ! Determine if we really stored anything into the buffer.
  9115. ;   5811  2    !
  9116. ;   5812  2
  9117. ;   5813  2        IF .SIZE NEQ 0 THEN RETURN KER%NORMAL ELSE RETURN .STATUS;
  9118. ;   5814  2
  9119. ;   5815  1        END;                    ! End of BFR%FILL
  9120.  
  9121.  
  9122. ; BFR%FILL
  9123. U.29:    PUSH    SP,AC14                ;                                        5435
  9124.     PUSH    SP,AC16
  9125.     SETZM    U.52                ;                                        5598
  9126.     MOVE    AC2,U.48            ;                                        5603
  9127.     SUBI    AC2,61
  9128.     MOVE    AC16,U.40            ;                                        5599
  9129.     CAIG    AC16,136
  9130.     JRST    L.386
  9131.     MOVE    AC14,C.66            ;                                        5602
  9132.     MOVE    AC1,AC16            ;                                        5603
  9133.     SUB    AC1,AC2
  9134.     MOVE    AC16,AC1
  9135.     SUBI    AC16,6
  9136.     JRST    L.387                ;                                        5599
  9137. L.386:    MOVE    AC14,C.32            ;                                        5607
  9138.     SUB    AC16,AC2            ;                                        5608
  9139.     SUBI    AC16,3
  9140. L.387:    MOVE    AC1,-3(SP)            ;                                        5614
  9141.     TRNE    AC1,1
  9142.     JRST    L.388
  9143.     MOVEI    AC2,13
  9144.     CAME    AC2,U.84
  9145.     JRST    L.418
  9146. L.388:    TRNN    AC1,1                ;                                        5620
  9147.     JRST    L.394
  9148.     SETZM    -3(SP)                ;                                        5623
  9149.     SETOM    U.83                ;                                        5624
  9150.     MOVEI    AC1,1                ;                                        5626
  9151.     TDNN    AC1,U.49
  9152.     JRST    L.389
  9153.     PUSHJ    SP,U.93
  9154.     JRST    L.390
  9155. L.389:    PUSHJ    SP,U.92
  9156. L.390:    MOVEM    AC1,U.84
  9157.     CAIE    AC1,13                ;                                        5628
  9158.     JRST    L.419
  9159.     MOVE    AC1,U.86            ;                                        5630
  9160.     MOVEM    AC1,U.89
  9161.     SETO    AC1,                ;                                        5632
  9162.     JRST    L.392
  9163. L.391:    MOVE    AC2,U.87(AC1)            ;                                        5633
  9164.     MOVEM    AC2,U.90(AC1)
  9165. L.392:    ADDI    AC1,1                ;                                        5632
  9166.     CAMG    AC1,U.88
  9167.     JRST    L.391
  9168. L.393:    MOVE    AC1,U.88            ;                                        5635
  9169.     MOVEM    AC1,U.91
  9170.     SETZM    U.85                ;                                        5636
  9171. L.394:    CAMG    AC16,U.52            ;                                        5644
  9172.     JRST    L.417
  9173.     MOVEI    AC1,1                ;                                        5650
  9174.     TDNN    AC1,U.50
  9175.     JRST    L.412
  9176. L.395:    MOVE    AC1,U.86            ;                                        5658
  9177.     CAME    AC1,U.89
  9178.     JRST    L.399
  9179.     MOVEI    AC1,136
  9180.     CAMG    AC1,U.85
  9181.     JRST    L.399
  9182.     AOS    U.85                ;                                        5660
  9183.     MOVEI    AC1,1                ;                                        5662
  9184.     TDNN    AC1,U.49
  9185.     JRST    L.396
  9186.     PUSHJ    SP,U.93
  9187.     JRST    L.397
  9188. L.396:    PUSHJ    SP,U.92
  9189. L.397:    MOVEM    AC1,U.84
  9190.     CAIN    AC1,13                ;                                        5664
  9191.     JRST    L.395
  9192.     CAIN    AC1,113                ;                                        5667
  9193.     JRST    L.398
  9194.     SETOM    U.86                ;                                        5669
  9195.     JRST    L.395                ;                                        5667
  9196. L.398:    HRROI    AC1,-2                ;                                        5672
  9197.     MOVEM    AC1,U.86
  9198.     SETOM    U.88                ;                                        5673
  9199.     JRST    L.395                ;                                        5664
  9200. L.399:    MOVE    AC2,U.91            ;                                        5678
  9201.     MOVE    AC4,AC2
  9202.     ADDI    AC4,3
  9203.     MOVE    AC1,AC2
  9204.     AOS    AC3,AC1
  9205.     IMUL    AC3,U.85
  9206.     CAML    AC4,AC3
  9207.     JRST    L.402
  9208.     MOVE    AC3,U.52            ;                                        5682
  9209.     ADD    AC3,AC2
  9210.     ADDI    AC3,3
  9211.     CAMG    AC3,AC16
  9212.     JRST    L.401
  9213.     MOVE    AC3,U.86            ;                                        5686
  9214.     CAME    AC3,U.89
  9215.     JRST    L.400
  9216.     MOVE    AC3,U.86            ;                                        5689
  9217.     MOVEM    AC3,U.83
  9218.     SOS    U.85                ;                                        5690
  9219. L.400:    HRROI    AC3,-2                ;                                        5693
  9220.     CAME    AC3,U.86
  9221.     JRST    L.417
  9222.     HRROI    AC3,-2                ;                                        5696
  9223.     MOVEM    AC3,U.83
  9224.     MOVEI    AC3,13                ;                                        5697
  9225.     MOVEM    AC3,U.84
  9226.     JRST    L.417                ;                                        5693
  9227. L.401:    MOVE    AC3,U.85            ;                                        5703
  9228.     ADDI    AC3,40
  9229.     MOVEM    AC3,U.90(AC1)
  9230.     MOVE    AC1,U.38            ;                                        5704
  9231.     MOVEM    AC1,U.90+2(AC2)
  9232.     MOVEI    AC1,2                ;                                        5705
  9233.     ADDM    AC1,U.91
  9234.     MOVE    AC1,SMSG%DATA%CHARS        ;                                        5709
  9235.     ADD    AC1,U.85
  9236.     SUBI    AC1,1
  9237.     MOVEM    AC1,SMSG%DATA%CHARS
  9238.     MOVE    AC1,U.61            ;                                        5710
  9239.     ADD    AC1,U.85
  9240.     SUBI    AC1,1
  9241.     MOVEM    AC1,U.61
  9242.     MOVEI    AC1,1                ;                                        5711
  9243.     MOVEM    AC1,U.85
  9244. L.402:    MOVE    AC1,U.91            ;                                        5719
  9245.     ADDI    AC1,1
  9246.     IMUL    AC1,U.85
  9247.     ADD    AC1,U.52
  9248.     CAMG    AC1,AC16
  9249.     JRST    L.404
  9250.     MOVE    AC1,U.86            ;                                        5725
  9251.     CAME    AC1,U.89
  9252.     JRST    L.403
  9253.     MOVE    AC1,U.86            ;                                        5728
  9254.     MOVEM    AC1,U.83
  9255.     SOS    U.85                ;                                        5729
  9256. L.403:    HRROI    AC1,-2                ;                                        5735
  9257.     CAME    AC1,U.86
  9258.     JRST    L.417
  9259.     HRROI    AC1,-2                ;                                        5738
  9260.     MOVEM    AC1,U.83
  9261.     MOVEI    AC1,13                ;                                        5739
  9262.     MOVEM    AC1,U.84
  9263.     JRST    L.417                ;                                        5735
  9264. L.404:    MOVE    AC1,U.85            ;                                        5745
  9265.     ADDM    AC1,SMSG%DATA%CHARS
  9266.     MOVE    AC1,U.85            ;                                        5746
  9267.     ADDM    AC1,U.61
  9268.     MOVE    AC3,U.85            ;                                        5748
  9269.     AOJA    AC3,L.408
  9270. L.405:    MOVE    AC1,U.91            ;                                        5750
  9271.     AOJA    AC1,L.407
  9272. L.406:    MOVE    AC2,U.90(AC1)            ;                                        5752
  9273.     IDPB    AC2,AC14
  9274.     AOS    U.52                ;                                        5753
  9275. L.407:    SOJGE    AC1,L.406            ;                                        5750
  9276. L.408:    SOJG    AC3,L.405            ;                                        5748
  9277.     HRROI    AC1,-2                ;                                        5759
  9278.     CAME    AC1,U.86
  9279.     JRST    L.409
  9280.     MOVEI    AC1,113
  9281.     MOVEM    AC1,U.84
  9282. L.409:    MOVEI    AC1,13                ;                                        5764
  9283.     CAME    AC1,U.84
  9284.     JRST    L.417
  9285.     MOVE    AC1,U.86            ;                                        5769
  9286.     MOVEM    AC1,U.89
  9287.     SETO    AC1,                ;                                        5771
  9288.     JRST    L.411
  9289. L.410:    MOVE    AC2,U.87(AC1)            ;                                        5772
  9290.     MOVEM    AC2,U.90(AC1)
  9291. L.411:    ADDI    AC1,1                ;                                        5771
  9292.     CAMG    AC1,U.88
  9293.     JRST    L.410
  9294.     JRST    L.393
  9295. L.412:    MOVE    AC1,U.52            ;                                        5784
  9296.     ADD    AC1,U.88
  9297.     ADDI    AC1,1
  9298.     CAMLE    AC1,AC16
  9299.     JRST    L.417
  9300.     AOS    SMSG%DATA%CHARS            ;                                        5786
  9301.     AOS    U.61                ;                                        5787
  9302.     MOVE    AC1,U.88            ;                                        5789
  9303.     AOJA    AC1,L.414
  9304. L.413:    MOVE    AC2,U.87(AC1)            ;                                        5791
  9305.     IDPB    AC2,AC14
  9306.     AOS    U.52                ;                                        5792
  9307. L.414:    SOJGE    AC1,L.413            ;                                        5789
  9308.     MOVEI    AC1,1                ;                                        5795
  9309.     TDNN    AC1,U.49
  9310.     JRST    L.415
  9311.     PUSHJ    SP,U.93
  9312.     JRST    L.416
  9313. L.415:    PUSHJ    SP,U.92
  9314. L.416:    MOVEM    AC1,U.84
  9315.     MOVEI    AC1,13                ;                                        5797
  9316.     CAMN    AC1,U.84
  9317.     JRST    L.394                ;                                        5644
  9318. L.417:    MOVEI    AC1,136                ;                                        5805
  9319.     CAMGE    AC1,U.40
  9320.     MOVNS    U.52                ;                                        5807
  9321.     SKIPN    U.52                ;                                        5813
  9322.     JRST    L.418
  9323.     MOVEI    AC1,13
  9324.     JRST    L.419
  9325. L.418:    MOVE    AC1,U.84
  9326. L.419:    POP    SP,AC16                ;                                        5435
  9327.     POP    SP,AC14
  9328.     POPJ    SP,
  9329.  
  9330. ; Routine Size:  206 words
  9331.  
  9332.  
  9333. ;   5816  1    %SBTTL 'BFR%EMPTY'
  9334. ;   5817  1    ROUTINE BFR%EMPTY =
  9335. ;   5818  1
  9336. ;   5819  1    !++
  9337. ;   5820  1    ! FUNCTIONAL DESCRIPTION:
  9338. ;   5821  1    !
  9339. ;   5822  1    !    This routine will empty the data from the REC%MSG message buffer
  9340. ;   5823  1    !    to the file.  It will process quoting characters.
  9341. ;   5824  1    !
  9342. ;   5825  1    ! CALLING SEQUENCE:
  9343. ;   5826  1    !
  9344. ;   5827  1    !    Flag = BFR%EMPTY();
  9345. ;   5828  1    !
  9346. ;   5829  1    ! INPUT PARAMETERS:
  9347. ;   5830  1    !
  9348. ;   5831  1    !    None.
  9349. ;   5832  1    !
  9350. ;   5833  1    ! IMPLICIT INPUTS:
  9351. ;   5834  1    !
  9352. ;   5835  1    !    None.
  9353. ;   5836  1    !
  9354. ;   5837  1    ! OUTPUT PARAMETERS:
  9355. ;   5838  1    !
  9356. ;   5839  1    !    True - No problems writing the file.
  9357. ;   5840  1    !    False - I/O error writing the file.
  9358. ;   5841  1    !
  9359. ;   5842  1    ! IMPLICIT OUTPUTS:
  9360. ;   5843  1    !
  9361. ;   5844  1    !    None.
  9362. ;   5845  1    !
  9363. ;   5846  1    ! COMPLETION CODES:
  9364. ;   5847  1    !
  9365. ;   5848  1    !    None.
  9366. ;   5849  1    !
  9367. ;   5850  1    ! SIDE EFFECTS:
  9368. ;   5851  1    !
  9369. ;   5852  1    !    None.
  9370. ;   5853  1    !
  9371. ;   5854  1    !--
  9372. ;   5855  1
  9373. ;   5856  2        BEGIN
  9374. ;   5857  2
  9375. ;   5858  2        LOCAL
  9376. ;   5859  2        STATUS,                    ! Status returned by various routines
  9377. ;   5860  2        REPEAT%COUNT,                ! Count of times to repeat character
  9378. ;   5861  2        TURN%BIT%8%ON,                ! If eight bit quoting
  9379. ;   5862  2        COUNTER,                ! Count of the characters left
  9380. ;   5863  2        CHARACTER,                ! Character we are processing
  9381. ;   5864  2        POINTER;                ! Pointer to the data
  9382. ;   5865  2
  9383. ;   5866  2        POINTER = CH$PTR (REC%MSG, .RECV%PKT%MSG, CHR%SIZE);           ! [108]
  9384. ;   5867  2        COUNTER = 0;
  9385. ;   5868  2
  9386. ;   5869  2        WHILE (.COUNTER LSS .REC%LENGTH) DO
  9387. ;   5870  3        BEGIN
  9388. ;   5871  3        CHARACTER = CH$RCHAR%A (POINTER);
  9389. ;   5872  3        COUNTER = .COUNTER + 1;
  9390. ;   5873  3    !
  9391. ;   5874  3    ! If the character is the repeat character (and we are doing repeat
  9392. ;   5875  3    ! compression), then get the count.
  9393. ;   5876  3    !
  9394. ;   5877  3
  9395. ;   5878  4        IF ((.CHARACTER EQL .REPT%CHR) AND .FLAG%REPEAT)
  9396. ;   5879  3        THEN
  9397. ;   5880  4            BEGIN
  9398. ;   5881  4            REPEAT%COUNT = UNCHAR (CH$RCHAR%A (POINTER) AND %O'177');
  9399. ;   5882  4            CHARACTER = CH$RCHAR%A (POINTER);
  9400. ;   5883  4            COUNTER = .COUNTER + 2;
  9401. ;   5884  4            END
  9402. ;   5885  3        ELSE
  9403. ;   5886  3            REPEAT%COUNT = 1;
  9404. ;   5887  3
  9405. ;   5888  3    !
  9406. ;   5889  3    ! If the character is an eight bit quoting character and we are doing eight
  9407. ;   5890  3    ! bit quoting then turn on the flag so we turn the eighth bit on when we
  9408. ;   5891  3    ! get the real character.
  9409. ;   5892  3    !
  9410. ;   5893  3
  9411. ;   5894  4        IF ((.CHARACTER EQL .SEND%8QUOTE%CHR) AND .FLAG%8QUOTE)
  9412. ;   5895  3        THEN
  9413. ;   5896  4            BEGIN
  9414. ;   5897  4            TURN%BIT%8%ON = TRUE;
  9415. ;   5898  4            COUNTER = .COUNTER + 1;
  9416. ;   5899  4            CHARACTER = CH$RCHAR%A (POINTER);
  9417. ;   5900  4            END
  9418. ;   5901  3        ELSE
  9419. ;   5902  3            TURN%BIT%8%ON = FALSE;
  9420. ;   5903  3
  9421. ;   5904  3    !
  9422. ;   5905  3    ! Now determine if we are quoting the character.  If so then we must eat
  9423. ;   5906  3    ! the quoting character and get the real character.
  9424. ;   5907  3    !
  9425. ;   5908  3
  9426. ;   5909  3        IF .CHARACTER EQL .SEND%QUOTE%CHR
  9427. ;   5910  3                        ![035] Is this character other Kermit sends as quote?
  9428. ;   5911  3        THEN
  9429. ;   5912  4            BEGIN
  9430. ;   5913  4            CHARACTER = CH$RCHAR%A (POINTER);
  9431. ;   5914  4            COUNTER = .COUNTER + 1;
  9432. ;   5915  4    !
  9433. ;   5916  4    ! Determine if we must undo what someone else has done to the character
  9434. ;   5917  4    !
  9435. ;   5918  4
  9436. ; P 5919  5            IF ((.CHARACTER AND %O'177') GEQ CTL (CHR%DEL)) AND ((.CHARACTER AND %O'177') LEQ CTL (
  9437. ;   5920  5                CHR%DEL) + %O'40')
  9438. ;   5921  4            THEN
  9439. ;   5922  4            CHARACTER = CTL (.CHARACTER);
  9440. ;   5923  4
  9441. ;   5924  3            END;
  9442. ;   5925  3
  9443. ;   5926  3    !
  9444. ;   5927  3    ! Turn on the eight bit if needed and then write the character out
  9445. ;   5928  3    !
  9446. ;   5929  3
  9447. ;   5930  3        IF .TURN%BIT%8%ON THEN CHARACTER = .CHARACTER OR %O'200';
  9448. ;   5931  3
  9449. ;   5932  3        RMSG%DATA%CHARS = .RMSG%DATA%CHARS + .REPEAT%COUNT;
  9450. ;   5933  3        FILE%CHARS = .FILE%CHARS + .REPEAT%COUNT;
  9451. ;   5934  3
  9452. ;   5935  3        DECR REPEAT%COUNT FROM .REPEAT%COUNT TO 1 DO
  9453. ;   5936  4            BEGIN
  9454. ;   5937  4            STATUS = (.PUT%CHR%ROUTINE) (.CHARACTER);
  9455. ;   5938  4
  9456. ;   5939  4            IF NOT .STATUS THEN RETURN .STATUS;
  9457. ;   5940  4
  9458. ;   5941  3            END;
  9459. ;   5942  3
  9460. ;   5943  2        END;
  9461. ;   5944  2
  9462. ;   5945  2        RETURN KER%NORMAL;
  9463. ;   5946  1        END;                    ! End of BFR%EMPTY
  9464.  
  9465.  
  9466. ; BFR%EMPTY
  9467. U.28:    PUSH    SP,AC10                ;                                        5817
  9468.     PUSH    SP,AC11
  9469.     PUSH    SP,AC12
  9470.     PUSH    SP,AC13
  9471.     PUSH    SP,AC14
  9472.     PUSH    SP,AC16
  9473.     MOVE    AC1,C.27            ;                                        5866
  9474.     MOVE    AC14,U.39
  9475.     ADJBP    AC14,AC1
  9476.     SETZ    AC11,                ;                                        5867
  9477. L.420:    CAML    AC11,U.57            ;                                        5869
  9478.     JRST    L.429
  9479.     ILDB    AC12,AC14            ;                                        5871
  9480.     ADDI    AC11,1                ;                                        5872
  9481.     CAME    AC12,U.38            ;                                        5878
  9482.     JRST    L.421
  9483.     MOVEI    AC2,1
  9484.     TDNN    AC2,U.50
  9485.     JRST    L.421
  9486.     ILDB    AC2,AC14            ;                                        5881
  9487.     LDB    AC13,C.97
  9488.     SUBI    AC13,40
  9489.     ILDB    AC12,AC14            ;                                        5882
  9490.     ADDI    AC11,2                ;                                        5883
  9491.     JRST    L.422                ;                                        5878
  9492. L.421:    MOVEI    AC13,1                ;                                        5886
  9493. L.422:    CAME    AC12,U.45            ;                                        5894
  9494.     JRST    L.423
  9495.     MOVEI    AC2,1
  9496.     TDNN    AC2,U.49
  9497.     JRST    L.423
  9498.     MOVEI    AC10,1                ;                                        5897
  9499.     ADDI    AC11,1                ;                                        5898
  9500.     ILDB    AC12,AC14            ;                                        5899
  9501.     JRST    L.424                ;                                        5894
  9502. L.423:    SETZ    AC10,                ;                                        5902
  9503. L.424:    CAME    AC12,U.44            ;                                        5909
  9504.     JRST    L.425
  9505.     ILDB    AC12,AC14            ;                                        5913
  9506.     ADDI    AC11,1                ;                                        5914
  9507.     LDB    AC2,C.100            ;                                        5919
  9508.     CAIL    AC2,77
  9509.     CAILE    AC2,137
  9510.     JRST    L.425
  9511.     TRC    AC12,100            ;                                        5922
  9512. L.425:    TRNE    AC10,1                ;                                        5930
  9513.     TRO    AC12,200
  9514.     ADDM    AC13,RMSG%DATA%CHARS        ;                                        5932
  9515.     ADDM    AC13,U.61            ;                                        5933
  9516.     MOVE    AC16,AC13            ;                                        5935
  9517.     AOJA    AC16,L.428
  9518. L.426:    MOVE    AC2,U.68            ;                                        5937
  9519.     PUSH    SP,AC12
  9520.     PUSHJ    SP,0(AC2)
  9521.     TRNE    AC1,1                ;                                        5939
  9522.     JRST    L.427
  9523.     ADJSP    SP,-1
  9524.     JRST    L.430
  9525. L.427:    ADJSP    SP,-1                ;                                        5936
  9526. L.428:    SOJG    AC16,L.426            ;                                        5935
  9527.     JRST    L.420                ;                                        5869
  9528. L.429:    MOVEI    AC1,13                ;                                        5856
  9529. L.430:    POP    SP,AC16                ;                                        5817
  9530.     POP    SP,AC14
  9531.     POP    SP,AC13
  9532.     POP    SP,AC12
  9533.     POP    SP,AC11
  9534.     POP    SP,AC10
  9535.     POPJ    SP,
  9536. C.100:    POINT    7,AC12,35
  9537.  
  9538. ; Routine Size:  70 words
  9539.  
  9540.  
  9541. ;   5947  1    %SBTTL 'Buffer filling and emptying subroutines'
  9542. ;   5948  1    ROUTINE SET%STRING (POINTER, LENGTH, START) =
  9543. ;   5949  1
  9544. ;   5950  1    !++
  9545. ;   5951  1    ! FUNCTIONAL DESCRIPTION:
  9546. ;   5952  1    !
  9547. ;   5953  1    !    This routine is used to set up the buffer filling and emptying
  9548. ;   5954  1    !    routines to use a string for input (or output) rather than
  9549. ;   5955  1    !    the file I/O routines.
  9550. ;   5956  1    !
  9551. ;   5957  1    ! CALLING SEQUENCE:
  9552. ;   5958  1    !
  9553. ;   5959  1    !    SET%STRING (.POINTER, .LENGTH, .START)
  9554. ;   5960  1    !
  9555. ;   5961  1    ! INPUT PARAMETERS:
  9556. ;   5962  1    !
  9557. ;   5963  1    !    POINTER - Character pointer to string
  9558. ;   5964  1    !
  9559. ;   5965  1    !    LENGTH - Number of characters in string
  9560. ;   5966  1    !
  9561. ;   5967  1    !    START - True to start string, false to end it
  9562. ;   5968  1    !
  9563. ;   5969  1    ! IMPLICIT INPUTS:
  9564. ;   5970  1    !
  9565. ;   5971  1    !    None.
  9566. ;   5972  1    !
  9567. ;   5973  1    ! OUPTUT PARAMETERS:
  9568. ;   5974  1    !
  9569. ;   5975  1    !    Returns 0 if START = TRUE, actual number of characters used
  9570. ;   5976  1    !    by last string if START = FALSE.
  9571. ;   5977  1    !
  9572. ;   5978  1    ! IMPLICIT OUTPUTS:
  9573. ;   5979  1    !
  9574. ;   5980  1    !    GET%CHR%ROUTINE and PUT%CHR%ROUTINE modifed so that string
  9575. ;   5981  1    !    routines are called instead of file I/O.
  9576. ;   5982  1    !
  9577. ;   5983  1    ! COMPLETION CODES:
  9578. ;   5984  1    !
  9579. ;   5985  1    !    None.
  9580. ;   5986  1    !
  9581. ;   5987  1    ! SIDE EFFECTS:
  9582. ;   5988  1    !
  9583. ;   5989  1    !    None.
  9584. ;   5990  1    !
  9585. ;   5991  1    !--
  9586. ;   5992  1
  9587. ;   5993  2        BEGIN
  9588. ;   5994  2
  9589. ;   5995  2        OWN
  9590. ;   5996  2        STR%POINTER,                ! Pointer to string
  9591. ;   5997  2        STR%LENGTH,                ! Length of string
  9592. ;   5998  2        STR%ORG%LENGTH,                ! Original length of string
  9593. ;   5999  2        OLD%GET%CHR,                ! Old get-char routine
  9594. ;   6000  2        OLD%PUT%CHR;                ! Old put-char routine
  9595. ;   6001  2
  9596. ;   6002  2    !
  9597. ;   6003  2    ! Routine to get a character from the string
  9598. ;   6004  2    !
  9599. ;   6005  2        ROUTINE GET%STRING (CHAR%ADDRESS) =
  9600. ;   6006  3        BEGIN
  9601. ;   6007  3    !
  9602. ;   6008  3    ! If some characters are left, count down the length and get next character
  9603. ;   6009  3    ! Otherwise return and end of file indication.
  9604. ;   6010  3    !
  9605. ;   6011  3
  9606. ;   6012  3        IF .STR%LENGTH GTR 0
  9607. ;   6013  3        THEN
  9608. ;   6014  4            BEGIN
  9609. ;   6015  4            STR%LENGTH = .STR%LENGTH - 1;
  9610. ;   6016  4            .CHAR%ADDRESS = CH$RCHAR%A (STR%POINTER);
  9611. ;   6017  4            RETURN KER%NORMAL;
  9612. ;   6018  4            END
  9613. ;   6019  3        ELSE
  9614. ;   6020  3            RETURN KER%EOF;
  9615. ;   6021  3
  9616. ;   6022  2        END;                    ! End of GET%STRING
  9617.  
  9618.  
  9619.     RELOC    1046
  9620. ; STR%POINTER
  9621. U.94:    BLOCK    1
  9622. ; STR%LENGTH
  9623. U.95:    BLOCK    1
  9624. ; STR%ORG%LENGTH
  9625. U.96:    BLOCK    1
  9626. ; OLD%GET%CHR
  9627. U.97:    BLOCK    1
  9628. ; OLD%PUT%CHR
  9629. U.98:    BLOCK    1
  9630.  
  9631.  
  9632.     RELOC    406433
  9633. ; GET%STRING
  9634. U.99:    SKIPG    U.95                ;                                        6012
  9635.     JRST    L.431
  9636.     SOS    U.95                ;                                        6015
  9637.     MOVE    AC2,-1(SP)            ;                                        6016
  9638.     ILDB    AC1,U.94
  9639.     MOVEM    AC1,0(AC2)
  9640.     MOVEI    AC1,13                ;                                        6020
  9641.     POPJ    SP,
  9642. L.431:    MOVEI    AC1,113
  9643.     POPJ    SP,                ;                                        6005
  9644.  
  9645. ; Routine Size:  10 words
  9646.  
  9647.  
  9648. ;   6023  2        ROUTINE PUT%STRING (CHAR%VALUE) =
  9649. ;   6024  3        BEGIN
  9650. ;   6025  3    !
  9651. ;   6026  3    ! If there is enough room to store another character, store the character
  9652. ;   6027  3    ! and count it.  Otherwise return a line too long indication.
  9653. ;   6028  3    !
  9654. ;   6029  3
  9655. ;   6030  3        IF .STR%LENGTH GTR 0
  9656. ;   6031  3        THEN
  9657. ;   6032  4            BEGIN
  9658. ;   6033  4            STR%LENGTH = .STR%LENGTH - 1;
  9659. ;   6034  4            CH$WCHAR%A (.CHAR%VALUE, STR%POINTER);
  9660. ;   6035  4            RETURN KER%NORMAL;
  9661. ;   6036  4            END
  9662. ;   6037  3        ELSE
  9663. ;   6038  3            RETURN KER%LINTOOLNG;
  9664. ;   6039  3
  9665. ;   6040  2        END;                    ! End of PUT%STRING
  9666.  
  9667.  
  9668. ; PUT%STRING
  9669. U.100:    SKIPG    U.95                ;                                        6030
  9670.     JRST    L.432
  9671.     SOS    U.95                ;                                        6033
  9672.     MOVE    AC1,-1(SP)            ;                                        6034
  9673.     IDPB    AC1,U.94
  9674.     MOVEI    AC1,13                ;                                        6038
  9675.     POPJ    SP,
  9676. L.432:    MOVEI    AC1,102
  9677.     POPJ    SP,                ;                                        6023
  9678.  
  9679. ; Routine Size:  9 words
  9680.  
  9681.  
  9682. ;   6041  2    !
  9683. ;   6042  2    ! If we have a request to start a string (input or output), save the old
  9684. ;   6043  2    ! routines and set up ours.  Also save the string pointer and length for
  9685. ;   6044  2    ! use by our get/put routines.
  9686. ;   6045  2    ! Otherwise this is a request to stop using the string routines, so reset
  9687. ;   6046  2    ! the old routines and return the actual number of characters read or
  9688. ;   6047  2    ! written
  9689. ;   6048  2    !
  9690. ;   6049  2
  9691. ;   6050  2        IF .START
  9692. ;   6051  2        THEN
  9693. ;   6052  3        BEGIN
  9694. ;   6053  3        STR%POINTER = .POINTER;
  9695. ;   6054  3        STR%ORG%LENGTH = .LENGTH;
  9696. ;   6055  3        STR%LENGTH = .LENGTH;
  9697. ;   6056  3        OLD%GET%CHR = .GET%CHR%ROUTINE;
  9698. ;   6057  3        OLD%PUT%CHR = .PUT%CHR%ROUTINE;
  9699. ;   6058  3        GET%CHR%ROUTINE = GET%STRING;
  9700. ;   6059  3        PUT%CHR%ROUTINE = PUT%STRING;
  9701. ;   6060  3        RETURN 0;
  9702. ;   6061  3        END
  9703. ;   6062  2        ELSE
  9704. ;   6063  3        BEGIN
  9705. ;   6064  3        GET%CHR%ROUTINE = .OLD%GET%CHR;
  9706. ;   6065  3        PUT%CHR%ROUTINE = .OLD%PUT%CHR;
  9707. ;   6066  3        RETURN .STR%ORG%LENGTH - .STR%LENGTH;
  9708. ;   6067  2        END;
  9709. ;   6068  2
  9710. ;   6069  1        END;                    ! End of SET%STRING
  9711.  
  9712.  
  9713. ; SET%STRING
  9714. U.30:    MOVEI    AC1,1                ;                                        6050
  9715.     TDNN    AC1,-1(SP)
  9716.     JRST    L.433
  9717.     MOVE    AC1,-3(SP)            ;                                        6053
  9718.     MOVEM    AC1,U.94
  9719.     MOVE    AC1,-2(SP)            ;                                        6054
  9720.     MOVEM    AC1,U.96
  9721.     MOVE    AC1,-2(SP)            ;                                        6055
  9722.     MOVEM    AC1,U.95
  9723.     MOVE    AC1,U.67            ;                                        6056
  9724.     MOVEM    AC1,U.97
  9725.     MOVE    AC1,U.68            ;                                        6057
  9726.     MOVEM    AC1,U.98
  9727.     MOVEI    AC1,U.99            ;                                        6058
  9728.     MOVEM    AC1,U.67
  9729.     MOVEI    AC1,U.100            ;                                        6059
  9730.     MOVEM    AC1,U.68
  9731.     SETZ    AC1,                ;                                        6063
  9732.     POPJ    SP,
  9733. L.433:    MOVE    AC1,U.97            ;                                        6064
  9734.     MOVEM    AC1,U.67
  9735.     MOVE    AC1,U.98            ;                                        6065
  9736.     MOVEM    AC1,U.68
  9737.     MOVE    AC1,U.96            ;                                        6066
  9738.     SUB    AC1,U.95
  9739.     POPJ    SP,                ;                                        5948
  9740.  
  9741. ; Routine Size:  26 words
  9742.  
  9743.  
  9744. ;   6070  1    %SBTTL 'Add parity routine'
  9745. ;   6071  1    ROUTINE DO%PARITY (MESSAGE, LENGTH) : NOVALUE =
  9746. ;   6072  1
  9747. ;   6073  1    !++
  9748. ;   6074  1    ! FUNCTIONAL DESCRIPTION:
  9749. ;   6075  1    !
  9750. ;   6076  1    !    This routine will add parity for a complete message that is to be
  9751. ;   6077  1    !    sent to the remote Kermit.
  9752. ;   6078  1    !
  9753. ;   6079  1    ! CALLING SEQUENCE:
  9754. ;   6080  1    !
  9755. ;   6081  1    !    DO%PARITY (Message%address, Message%length);
  9756. ;   6082  1    !
  9757. ;   6083  1    ! INPUT PARAMETERS:
  9758. ;   6084  1    !
  9759. ;   6085  1    !    Message%address - Address of the message to put parity on.
  9760. ;   6086  1    !    Message%length  - Lengtho of the message.
  9761. ;   6087  1    !
  9762. ;   6088  1    ! IMPLICIT INPUTS:
  9763. ;   6089  1    !
  9764. ;   6090  1    !    None.
  9765. ;   6091  1    !
  9766. ;   6092  1    ! OUTPUT PARAMETERS:
  9767. ;   6093  1    !
  9768. ;   6094  1    !    None.
  9769. ;   6095  1    !
  9770. ;   6096  1    ! IMPLICIT OUTPUTS:
  9771. ;   6097  1    !
  9772. ;   6098  1    !    None.
  9773. ;   6099  1    !
  9774. ;   6100  1    ! COMPLETION CODES:
  9775. ;   6101  1    !
  9776. ;   6102  1    !    None.
  9777. ;   6103  1    !
  9778. ;   6104  1    ! SIDE EFFECTS:
  9779. ;   6105  1    !
  9780. ;   6106  1    !    None.
  9781. ;   6107  1    !
  9782. ;   6108  1    !--
  9783. ;   6109  1
  9784. ;   6110  2        BEGIN
  9785. ;   6111  2
  9786. ;   6112  2        MAP
  9787. ;   6113  2        MESSAGE : REF VECTOR [CH$ALLOCATION (MAX%MSG, CHR%SIZE)];
  9788. ;   6114  2
  9789. ;   6115  2        LOCAL
  9790. ;   6116  2        POINTER;                ! Point into the message
  9791. ;   6117  2
  9792. ;   6118  2        IF NOT .DEV%PARITY%FLAG
  9793. ;   6119  2        THEN
  9794. ;   6120  3        BEGIN
  9795. ;   6121  3        POINTER = CH$PTR (.MESSAGE,, CHR%SIZE);
  9796. ;   6122  3
  9797. ;   6123  3        INCR I FROM 1 TO .LENGTH DO
  9798. ;   6124  3            CH$WCHAR%A (GEN%PARITY (CH$RCHAR (.POINTER)), POINTER);
  9799. ;   6125  3
  9800. ;   6126  2        END;
  9801. ;   6127  2
  9802. ;   6128  1        END;                    ! End of DO%PARITY
  9803.  
  9804.  
  9805. ; DO%PARITY
  9806. U.22:    PUSH    SP,AC13                ;                                        6071
  9807.     PUSH    SP,AC14
  9808.     PUSH    SP,AC16
  9809.     MOVEI    AC1,1                ;                                        6118
  9810.     TDNE    AC1,DEV%PARITY%FLAG
  9811.     JRST    L.436
  9812.     MOVE    AC1,-5(SP)            ;                                        6121
  9813.     MOVEI    AC16,-1(AC1)
  9814.     HRLI    AC16,41000
  9815.     MOVE    AC13,-4(SP)            ;                                        6123
  9816.     SETZ    AC14,
  9817.     JRST    L.435
  9818. L.434:    MOVE    AC1,AC16            ;                                        6124
  9819.     ILDB    AC1,AC1
  9820.     PUSH    SP,AC1
  9821.     PUSHJ    SP,U.23
  9822.     IDPB    AC1,AC16
  9823.     ADJSP    SP,-1
  9824. L.435:    ADDI    AC14,1                ;                                        6123
  9825.     CAMG    AC14,AC13
  9826.     JRST    L.434
  9827. L.436:    POP    SP,AC16                ;                                        6071
  9828.     POP    SP,AC14
  9829.     POP    SP,AC13
  9830.     POPJ    SP,
  9831.  
  9832. ; Routine Size:  25 words
  9833.  
  9834.  
  9835. ;   6129  1    %SBTTL 'Parity routine'
  9836. ;   6130  1
  9837. ;   6131  1    GLOBAL ROUTINE GEN%PARITY (CHARACTER) =
  9838. ;   6132  1
  9839. ;   6133  1    !++
  9840. ;   6134  1    ! FUNCTIONAL DESCRIPTION:
  9841. ;   6135  1    !
  9842. ;   6136  1    !    This routine will add parity to the character that is supplied.
  9843. ;   6137  1    !
  9844. ;   6138  1    ! CALLING SEQUENCE:
  9845. ;   6139  1    !
  9846. ;   6140  1    !    CHARACTER = GEN%PARITY(CHARACTER)
  9847. ;   6141  1    !
  9848. ;   6142  1    ! INPUT PARAMETERS:
  9849. ;   6143  1    !
  9850. ;   6144  1    !    CHARACTER - Produce the parity for this character depending on the
  9851. ;   6145  1    !        setting of the SET PARITY switch.
  9852. ;   6146  1    !
  9853. ;   6147  1    ! IMPLICIT INPUTS:
  9854. ;   6148  1    !
  9855. ;   6149  1    !    None.
  9856. ;   6150  1    !
  9857. ;   6151  1    ! OUTPUT PARAMETERS:
  9858. ;   6152  1    !
  9859. ;   6153  1    !    None.
  9860. ;   6154  1    !
  9861. ;   6155  1    ! IMPLICIT OUTPUTS:
  9862. ;   6156  1    !
  9863. ;   6157  1    !    None.
  9864. ;   6158  1    !
  9865. ;   6159  1    ! COMPLETION CODES:
  9866. ;   6160  1    !
  9867. ;   6161  1    !    None.
  9868. ;   6162  1    !
  9869. ;   6163  1    ! SIDE EFFECTS:
  9870. ;   6164  1    !
  9871. ;   6165  1    !    None.
  9872. ;   6166  1    !
  9873. ;   6167  1    !--
  9874. ;   6168  1
  9875. ;   6169  2        BEGIN
  9876. ;   6170  2
  9877. ;   6171  2        LOCAL
  9878. ;   6172  2        TEMP%CHAR;
  9879. ;   6173  2
  9880. ;   6174  2
  9881. ;   6175  2        CASE .PARITY%TYPE FROM PR%MIN TO PR%MAX OF
  9882. ;   6176  2        SET
  9883. ;   6177  2
  9884. ;   6178  2        [PR%NONE] :
  9885. ;   6179  2            RETURN .CHARACTER;
  9886. ;   6180  2
  9887. ;   6181  2        [PR%SPACE] :
  9888. ;   6182  2            RETURN .CHARACTER AND %O'177';
  9889. ;   6183  2
  9890. ;   6184  2        [PR%MARK] :
  9891. ;   6185  2            RETURN .CHARACTER OR %O'200';
  9892. ;   6186  2
  9893. ;   6187  2        [PR%ODD] :
  9894. ;   6188  2            TEMP%CHAR = .CHARACTER AND %O'177' OR %O'200';
  9895. ;   6189  2
  9896. ;   6190  2        [PR%EVEN] :
  9897. ;   6191  2            TEMP%CHAR = .CHARACTER AND %O'177';
  9898. ;   6192  2        TES;
  9899. ;   6193  2
  9900. ;   6194  2        TEMP%CHAR = .TEMP%CHAR XOR (.TEMP%CHAR^-4);
  9901. ;   6195  2        TEMP%CHAR = .TEMP%CHAR XOR (.TEMP%CHAR^-2);
  9902. ;   6196  2
  9903. ;   6197  2        IF .TEMP%CHAR<0, 2> EQL %B'01' OR .TEMP%CHAR<0, 2> EQL %B'10'
  9904. ;   6198  2        THEN
  9905. ;   6199  2        RETURN .CHARACTER AND %O'177' OR %O'200'
  9906. ;   6200  2        ELSE
  9907. ;   6201  2        RETURN .CHARACTER AND %O'177';
  9908. ;   6202  2
  9909. ;   6203  1        END;                    ! End of GEN%PARITY
  9910.  
  9911.  
  9912. U.23:
  9913. GEN%PARITY::
  9914.     MOVE    AC3,-1(SP)            ;                                        6179
  9915.     MOVE    AC1,PARITY%TYPE            ;                                        6175
  9916.     JRST    L.437(AC1)
  9917. L.437:    JRST    L.438
  9918.     JRST    L.439
  9919.     JRST    L.441
  9920.     JRST    L.440
  9921.     JRST    L.444
  9922. L.438:    MOVE    AC1,AC3                ;                                        6179
  9923.     POPJ    SP,
  9924. L.439:    MOVE    AC1,AC3                ;                                        6185
  9925.     JRST    L.443
  9926. L.440:    LDB    AC1,C.101            ;                                        6188
  9927.     TROA    AC1,200
  9928. L.441:    LDB    AC1,C.101            ;                                        6191
  9929.     MOVE    AC2,AC1                ;                                        6194
  9930.     ASH    AC2,-4
  9931.     XOR    AC1,AC2
  9932.     MOVE    AC2,AC1                ;                                        6195
  9933.     ASH    AC2,-2
  9934.     XOR    AC1,AC2
  9935.     ANDI    AC1,3                ;                                        6197
  9936.     CAIN    AC1,1
  9937.     JRST    L.442
  9938.     CAIE    AC1,2
  9939.     JRST    L.444
  9940. L.442:    LDB    AC1,C.101            ;                                        6199
  9941. L.443:    TROA    AC1,200
  9942. L.444:    LDB    AC1,C.101            ;                                        6201
  9943.     POPJ    SP,                ;                                        6131
  9944. C.101:    POINT    7,AC3,35
  9945.  
  9946. ; Routine Size:  31 words
  9947.  
  9948.  
  9949. ;   6204  1
  9950. ;   6205  1    %SBTTL 'Per transfer -- Initialization'
  9951. ;   6206  1    ROUTINE INIT%XFR : NOVALUE =
  9952. ;   6207  1
  9953. ;   6208  1    !++
  9954. ;   6209  1    ! FUNCTIONAL DESCRIPTION:
  9955. ;   6210  1    !
  9956. ;   6211  1    !    This routine will initialize the various locations that the
  9957. ;   6212  1    !    send and receive statistics are kept.
  9958. ;   6213  1    !
  9959. ;   6214  1    ! CALLING SEQUENCE:
  9960. ;   6215  1    !
  9961. ;   6216  1    !    INIT%XFR();
  9962. ;   6217  1    !
  9963. ;   6218  1    ! INPUT PARAMETERS:
  9964. ;   6219  1    !
  9965. ;   6220  1    !    None.
  9966. ;   6221  1    !
  9967. ;   6222  1    ! IMPLICIT INPUTS:
  9968. ;   6223  1    !
  9969. ;   6224  1    !    None.
  9970. ;   6225  1    !
  9971. ;   6226  1    ! OUTPUT PARAMETERS:
  9972. ;   6227  1    !
  9973. ;   6228  1    !    None.
  9974. ;   6229  1    !
  9975. ;   6230  1    ! IMPLICIT OUTPUTS:
  9976. ;   6231  1    !
  9977. ;   6232  1    !    None.
  9978. ;   6233  1    !
  9979. ;   6234  1    ! COMPLETION CODES:
  9980. ;   6235  1    !
  9981. ;   6236  1    !    None.
  9982. ;   6237  1    !
  9983. ;   6238  1    ! SIDE EFFECTS:
  9984. ;   6239  1    !
  9985. ;   6240  1    !    None.
  9986. ;   6241  1    !
  9987. ;   6242  1    !--
  9988. ;   6243  1
  9989. ;   6244  2        BEGIN
  9990. ;   6245  2    !
  9991. ;   6246  2    ! Determine if we should do 8 bit quoting
  9992. ;   6247  2    !
  9993. ;   6248  2
  9994. ;   6249  2        IF .PARITY%TYPE NEQ PR%NONE
  9995. ;   6250  2        THEN
  9996. ;   6251  3        BEGIN
  9997. ;   6252  3        RECV%8QUOTE%CHR = .RCV%8QUOTE%CHR;
  9998. ;   6253  3        END
  9999. ;   6254  2        ELSE
  10000. ;   6255  3        BEGIN
  10001. ;   6256  3        RECV%8QUOTE%CHR = %C'Y';
  10002. ;   6257  2        END;
  10003. ;   6258  2
  10004. ;   6259  2        NUM%RETRIES = 0;
  10005. ;   6260  2        SEND%8QUOTE%CHR = .RECV%8QUOTE%CHR;
  10006. ;   6261  2    !
  10007. ;   6262  2    ! Send parameters that may not get set before we need them for the first
  10008. ;   6263  2    ! time.
  10009. ;   6264  2    !
  10010. ;   6265  2        SEND%PKT%SIZE = ABS (.SND%PKT%SIZE);
  10011. ;   6266  2        SEND%NPAD = ABS (.SND%NPAD);
  10012. ;   6267  2        SEND%PADCHAR = ABS (.SND%PADCHAR);
  10013. ;   6268  2        SEND%TIMEOUT = ABS (.SND%TIMEOUT);
  10014. ;   6269  2        SEND%EOL = ABS (.SND%EOL);
  10015. ;   6270  2        SEND%QUOTE%CHR = ABS (.SND%QUOTE%CHR);
  10016. ;   6271  2    !
  10017. ;   6272  2    ! For initialization messages, we must use single character checksum
  10018. ;   6273  2    ! When the send-init/ack sequence has been done, we will switch to the
  10019. ;   6274  2    ! desired form
  10020. ;   6275  2    !
  10021. ;   6276  2        BLK%CHK%TYPE = CHK%1CHAR;
  10022. ;   6277  2        INI%CHK%TYPE = .CHKTYPE;            ! Send desired type
  10023. ;   6278  2    !
  10024. ;   6279  2    ! Set desired repeat character for use in we are doing send-init
  10025. ;   6280  2    ! Will be overwritten by other ends desired character if it sends
  10026. ;   6281  2    ! the send-init.
  10027. ;   6282  2    !
  10028. ;   6283  2        REPT%CHR = .SET%REPT%CHR;
  10029. ;   6284  2    !
  10030. ;   6285  2    ! Assume packet assembly/disassembly uses characters from a file
  10031. ;   6286  2    !
  10032. ;   6287  2        GET%CHR%ROUTINE = GET%FILE;            ! Initialize the get-a-char routine
  10033. ;   6288  2        PUT%CHR%ROUTINE = PUT%FILE;            ! And the put-a-char
  10034. ;   6289  2        TEXT%HEAD%FLAG = FALSE;            ! And assume we will get an File header
  10035. ;   6290  2        NO%FILE%NEEDED = FALSE;            ! Assume will do file ops
  10036. ;   6291  2        INIT%PKT%SENT = FALSE;            ! And no server-init sent
  10037. ;   6292  2    !
  10038. ;   6293  2    ! Always start with packet number 0
  10039. ;   6294  2    !
  10040. ;   6295  2        MSG%NUMBER = 0;                ! Initial message number
  10041. ;   6296  2    !
  10042. ;   6297  2    ! Stats information
  10043. ;   6298  2    !
  10044. ;   6299  2        SMSG%TOTAL%CHARS = 0;
  10045. ;   6300  2        RMSG%TOTAL%CHARS = 0;
  10046. ;   6301  2        SMSG%DATA%CHARS = 0;
  10047. ;   6302  2        RMSG%DATA%CHARS = 0;
  10048. ;   6303  2        SMSG%COUNT = 0;
  10049. ;   6304  2        RMSG%COUNT = 0;
  10050. ;   6305  2        RMSG%NAKS = 0;
  10051. ;   6306  2        SMSG%NAKS = 0;
  10052. ;   6307  2        XFR%TIME = SY%TIME ();
  10053. ;   6308  1        END;                    ! End of INIT%XFR
  10054.  
  10055.  
  10056. ; INIT%XFR
  10057. U.32:    SKIPE    PARITY%TYPE            ;                                        6249
  10058.     SKIPA    AC1,RCV%8QUOTE%CHR        ;                                        6252
  10059.     MOVEI    AC1,131                ;                                        6256
  10060.     MOVEM    AC1,U.37
  10061.     SETZM    U.54                ;                                        6259
  10062.     MOVE    AC1,U.37            ;                                        6260
  10063.     MOVEM    AC1,U.45
  10064.     MOVE    AC1,SND%PKT%SIZE        ;                                        6265
  10065.     MOVMM    AC1,U.40
  10066.     MOVE    AC1,SND%NPAD            ;                                        6266
  10067.     MOVMM    AC1,U.41
  10068.     MOVE    AC1,SND%PADCHAR            ;                                        6267
  10069.     MOVMM    AC1,U.42
  10070.     MOVE    AC1,SND%TIMEOUT            ;                                        6268
  10071.     MOVMM    AC1,SEND%TIMEOUT
  10072.     MOVE    AC1,SND%EOL            ;                                        6269
  10073.     MOVMM    AC1,U.43
  10074.     MOVE    AC1,SND%QUOTE%CHR        ;                                        6270
  10075.     MOVMM    AC1,U.44
  10076.     MOVEI    AC1,61                ;                                        6276
  10077.     MOVEM    AC1,U.48
  10078.     MOVE    AC1,CHKTYPE            ;                                        6277
  10079.     MOVEM    AC1,U.47
  10080.     MOVE    AC1,SET%REPT%CHR        ;                                        6283
  10081.     MOVEM    AC1,U.38
  10082.     MOVEI    AC1,GET%FILE            ;                                        6287
  10083.     MOVEM    AC1,U.67
  10084.     MOVEI    AC1,PUT%FILE            ;                                        6288
  10085.     MOVEM    AC1,U.68
  10086.     SETZM    U.62                ;                                        6289
  10087.     SETZM    U.63                ;                                        6290
  10088.     SETZM    U.64                ;                                        6291
  10089.     SETZM    U.55                ;                                        6295
  10090.     SETZM    SMSG%TOTAL%CHARS        ;                                        6299
  10091.     SETZM    RMSG%TOTAL%CHARS        ;                                        6300
  10092.     SETZM    SMSG%DATA%CHARS            ;                                        6301
  10093.     SETZM    RMSG%DATA%CHARS            ;                                        6302
  10094.     SETZM    SMSG%COUNT            ;                                        6303
  10095.     SETZM    RMSG%COUNT            ;                                        6304
  10096.     SETZM    RMSG%NAKS            ;                                        6305
  10097.     SETZM    SMSG%NAKS            ;                                        6306
  10098.     PUSHJ    SP,SY%TIME            ;                                        6307
  10099.     MOVEM    AC1,XFR%TIME
  10100.     POPJ    SP,                ;                                        6206
  10101.  
  10102. ; Routine Size:  44 words
  10103.  
  10104.  
  10105. ;   6309  1    %SBTTL 'Statistics -- Finish message transfer'
  10106. ;   6310  1    ROUTINE END%STATS : NOVALUE =
  10107. ;   6311  1
  10108. ;   6312  1    !++
  10109. ;   6313  1    ! FUNCTIONAL DESCRIPTION:
  10110. ;   6314  1    !
  10111. ;   6315  1    !    This routine will end the collection of the statistices.  It will
  10112. ;   6316  1    !    update the various overall statistic parameters.
  10113. ;   6317  1    !
  10114. ;   6318  1    ! CALLING SEQUENCE:
  10115. ;   6319  1    !
  10116. ;   6320  1    !    END%STATS ();
  10117. ;   6321  1    !
  10118. ;   6322  1    ! INPUT PARAMETERS:
  10119. ;   6323  1    !
  10120. ;   6324  1    !    None.
  10121. ;   6325  1    !
  10122. ;   6326  1    ! IMPLICIT INPUTS:
  10123. ;   6327  1    !
  10124. ;   6328  1    !    None.
  10125. ;   6329  1    !
  10126. ;   6330  1    ! OUTPUT PARAMETERS:
  10127. ;   6331  1    !
  10128. ;   6332  1    !    None.
  10129. ;   6333  1    !
  10130. ;   6334  1    ! IMPLICIT OUTPUTS:
  10131. ;   6335  1    !
  10132. ;   6336  1    !    None.
  10133. ;   6337  1    !
  10134. ;   6338  1    ! COMPLETION CODES:
  10135. ;   6339  1    !
  10136. ;   6340  1    !    None.
  10137. ;   6341  1    !
  10138. ;   6342  1    ! SIDE EFFECTS:
  10139. ;   6343  1    !
  10140. ;   6344  1    !    None.
  10141. ;   6345  1    !
  10142. ;   6346  1    !--
  10143. ;   6347  1
  10144. ;   6348  2        BEGIN
  10145. ;   6349  2        SND%COUNT = .SND%COUNT + .SMSG%COUNT;
  10146. ;   6350  2        RCV%COUNT = .RCV%COUNT + .RMSG%COUNT;
  10147. ;   6351  2        SND%TOTAL%CHARS = .SND%TOTAL%CHARS + .SMSG%TOTAL%CHARS;
  10148. ;   6352  2        SND%DATA%CHARS = .SND%DATA%CHARS + .SMSG%DATA%CHARS;
  10149. ;   6353  2        RCV%TOTAL%CHARS = .RCV%TOTAL%CHARS + .RMSG%TOTAL%CHARS;
  10150. ;   6354  2        RCV%DATA%CHARS = .RCV%DATA%CHARS + .RMSG%DATA%CHARS;
  10151. ;   6355  2        SND%NAKS = .SND%NAKS + .SMSG%NAKS;
  10152. ;   6356  2        RCV%NAKS = .RCV%NAKS + .RMSG%NAKS;
  10153. ;   6357  2        XFR%TIME = SY%TIME () - .XFR%TIME;
  10154. ;   6358  2        TOTAL%TIME = .TOTAL%TIME + .XFR%TIME;
  10155. ;   6359  1        END;                    ! End of END%STATS
  10156.  
  10157.  
  10158. ; END%STATS
  10159. U.18:    MOVE    AC1,SMSG%COUNT            ;                                        6349
  10160.     ADDM    AC1,SND%COUNT
  10161.     MOVE    AC1,RMSG%COUNT            ;                                        6350
  10162.     ADDM    AC1,RCV%COUNT
  10163.     MOVE    AC1,SMSG%TOTAL%CHARS        ;                                        6351
  10164.     ADDM    AC1,SND%TOTAL%CHARS
  10165.     MOVE    AC1,SMSG%DATA%CHARS        ;                                        6352
  10166.     ADDM    AC1,SND%DATA%CHARS
  10167.     MOVE    AC1,RMSG%TOTAL%CHARS        ;                                        6353
  10168.     ADDM    AC1,RCV%TOTAL%CHARS
  10169.     MOVE    AC1,RMSG%DATA%CHARS        ;                                        6354
  10170.     ADDM    AC1,RCV%DATA%CHARS
  10171.     MOVE    AC1,SMSG%NAKS            ;                                        6355
  10172.     ADDM    AC1,SND%NAKS
  10173.     MOVE    AC1,RMSG%NAKS            ;                                        6356
  10174.     ADDM    AC1,RCV%NAKS
  10175.     PUSHJ    SP,SY%TIME            ;                                        6357
  10176.     SUBB    AC1,XFR%TIME
  10177.     ADDM    AC1,TOTAL%TIME            ;                                        6358
  10178.     POPJ    SP,                ;                                        6310
  10179.  
  10180. ; Routine Size:  20 words
  10181.  
  10182.  
  10183. ;   6360  1    %SBTTL 'Status type out -- STS%OUTPUT'
  10184. ;   6361  1    ROUTINE STS%OUTPUT : NOVALUE =
  10185. ;   6362  1
  10186. ;   6363  1    !++
  10187. ;   6364  1    ! FUNCTIONAL DESCRIPTION:
  10188. ;   6365  1    !
  10189. ;   6366  1    !    This routine will output the current status of a transfer.
  10190. ;   6367  1    !    This is used when the user types a ^A during a transfer.
  10191. ;   6368  1    !
  10192. ;   6369  1    ! CALLING SEQUENCE:
  10193. ;   6370  1    !
  10194. ;   6371  1    !    STS%OUTPUT ()
  10195. ;   6372  1    !
  10196. ;   6373  1    ! INPUT PARAMETERS:
  10197. ;   6374  1    !
  10198. ;   6375  1    !    None.
  10199. ;   6376  1    !
  10200. ;   6377  1    ! IMPLICIT INPUTS:
  10201. ;   6378  1    !
  10202. ;   6379  1    !    Statistics blocks, file names, etc.
  10203. ;   6380  1    !
  10204. ;   6381  1    ! OUPTUT PARAMETERS:
  10205. ;   6382  1    !
  10206. ;   6383  1    !    None.
  10207. ;   6384  1    !
  10208. ;   6385  1    ! IMPLICIT OUTPUTS:
  10209. ;   6386  1    !
  10210. ;   6387  1    !    None.
  10211. ;   6388  1    !
  10212. ;   6389  1    ! COMPLETION CODES:
  10213. ;   6390  1    !
  10214. ;   6391  1    !    None.
  10215. ;   6392  1    !
  10216. ;   6393  1    ! SIDE EFFECTS:
  10217. ;   6394  1    !
  10218. ;   6395  1    !    None.
  10219. ;   6396  1    !
  10220. ;   6397  1    !--
  10221. ;   6398  1
  10222. ;   6399  2        BEGIN
  10223. ;   6400  2        TT%CHAR (%C'[');                ! Start the message
  10224. ;   6401  2
  10225. ;   6402  2        CASE .STATE FROM STATE%MIN TO STATE%MAX OF
  10226. ;   6403  2        SET
  10227. ;   6404  2
  10228. ;   6405  2        [STATE%ID, STATE%II] :
  10229. ;   6406  2            TT%TEXT (UPLIT (%ASCIZ'Idle in server mode'));
  10230. ;   6407  2
  10231. ;   6408  2        [STATE%S, STATE%SF] :
  10232. ;   6409  3            BEGIN
  10233. ;   6410  3            TT%TEXT (UPLIT (%ASCIZ'Initializing for sending file '));
  10234. ;   6411  3            TT%TEXT (FILE%NAME);
  10235. ;   6412  2            END;
  10236. ;   6413  2
  10237. ;   6414  2        [STATE%SI] :
  10238. ;   6415  2            TT%TEXT (UPLIT (%ASCIZ'Initializing for remote command'));
  10239. ;   6416  2
  10240. ;   6417  2        [STATE%SG] :
  10241. ;   6418  2            TT%TEXT (UPLIT (%ASCIZ'Waiting for response to remote command'));
  10242. ;   6419  2
  10243. ;   6420  2        [STATE%SD] :
  10244. ;   6421  3            BEGIN
  10245. ;   6422  3            TT%NUMBER (.FILE%CHARS);
  10246. ;   6423  3            TT%TEXT (UPLIT (%ASCIZ' characters sent for file '));
  10247. ;   6424  3            TT%TEXT (FILE%NAME);
  10248. ;   6425  2            END;
  10249. ;   6426  2
  10250. ;   6427  2        [STATE%SZ] :
  10251. ;   6428  3            BEGIN
  10252. ;   6429  3            TT%TEXT (UPLIT (%ASCIZ'At end of file '));
  10253. ;   6430  3            TT%TEXT (FILE%NAME);
  10254. ;   6431  2            END;
  10255. ;   6432  2
  10256. ;   6433  2        [STATE%SB] :
  10257. ;   6434  2            TT%TEXT (UPLIT (%ASCIZ'Finishing transfer session'));
  10258. ;   6435  2
  10259. ;   6436  2        [STATE%R] :
  10260. ;   6437  2            TT%TEXT (UPLIT (%ASCIZ'Waiting for initialization'));
  10261. ;   6438  2
  10262. ;   6439  2        [STATE%RF] :
  10263. ;   6440  2            TT%TEXT (UPLIT (%ASCIZ'Waiting for next file or end of session'));
  10264. ;   6441  2
  10265. ;   6442  2        [STATE%RD] :
  10266. ;   6443  3            BEGIN
  10267. ;   6444  3            TT%NUMBER (.FILE%CHARS);
  10268. ;   6445  3            TT%TEXT (UPLIT (%ASCIZ' characters received for file '));
  10269. ;   6446  3            TT%TEXT (FILE%NAME);
  10270. ;   6447  2            END;
  10271. ;   6448  2
  10272. ;   6449  2        [STATE%C] :
  10273. ;   6450  2            TT%TEXT (UPLIT (%ASCIZ' Session complete'));
  10274. ;   6451  2
  10275. ;   6452  2        [STATE%A] :
  10276. ;   6453  2            TT%TEXT (UPLIT (%ASCIZ' Session aborted'));
  10277. ;   6454  2
  10278. ;   6455  2        [INRANGE, OUTRANGE] :
  10279. ;   6456  2            TT%TEXT (UPLIT (%ASCIZ' Unknown state'));
  10280. ;   6457  2        TES;
  10281. ;   6458  2
  10282. ;   6459  2        SELECTONE .STATE OF
  10283. ;   6460  2        SET
  10284. ;   6461  2
  10285. ;   6462  2        [STATE%S, STATE%SF, STATE%SD, STATE%SZ, STATE%SB] :
  10286. ;   6463  3            BEGIN
  10287. ;   6464  3
  10288. ;   6465  3            IF .RMSG%NAKS GTR 0
  10289. ;   6466  3            THEN
  10290. ;   6467  4            BEGIN
  10291. ;   6468  4            TT%TEXT (UPLIT (%ASCIZ', '));
  10292. ;   6469  4            TT%NUMBER (.RMSG%NAKS);
  10293. ;   6470  4            TT%TEXT (UPLIT (%ASCIZ' NAKs received'));
  10294. ;   6471  3            END;
  10295. ;   6472  3
  10296. ;   6473  2            END;
  10297. ;   6474  2
  10298. ;   6475  2        [STATE%R, STATE%RF, STATE%RD] :
  10299. ;   6476  3            BEGIN
  10300. ;   6477  3
  10301. ;   6478  3            IF .SMSG%NAKS GTR 0
  10302. ;   6479  3            THEN
  10303. ;   6480  4            BEGIN
  10304. ;   6481  4            TT%TEXT (UPLIT (%ASCIZ', '));
  10305. ;   6482  4            TT%NUMBER (.SMSG%NAKS);
  10306. ;   6483  4            TT%TEXT (UPLIT (%ASCIZ' NAKs sent'));
  10307. ;   6484  3            END;
  10308. ;   6485  3
  10309. ;   6486  2            END;
  10310. ;   6487  2        TES;
  10311. ;   6488  2
  10312. ;   6489  2        TT%CHAR (%C']');                ! End the line
  10313. ;   6490  2        TT%CRLF ();                    ! with a CRLF
  10314. ;   6491  1        END;                    ! End of STS%OUTPUT
  10315.  
  10316.  
  10317. P.AAO:    BYTE    (7)"I","d","l","e"," "
  10318.     BYTE    (7)"i","n"," ","s","e"
  10319.     BYTE    (7)"r","v","e","r"," "
  10320.     BYTE    (7)"m","o","d","e",000
  10321. P.AAP:    BYTE    (7)"I","n","i","t","i"
  10322.     BYTE    (7)"a","l","i","z","i"
  10323.     BYTE    (7)"n","g"," ","f","o"
  10324.     BYTE    (7)"r"," ","s","e","n"
  10325.     BYTE    (7)"d","i","n","g"," "
  10326.     BYTE    (7)"f","i","l","e"," "
  10327.     BYTE    (7)000,000,000,000,000
  10328. P.AAQ:    BYTE    (7)"I","n","i","t","i"
  10329.     BYTE    (7)"a","l","i","z","i"
  10330.     BYTE    (7)"n","g"," ","f","o"
  10331.     BYTE    (7)"r"," ","r","e","m"
  10332.     BYTE    (7)"o","t","e"," ","c"
  10333.     BYTE    (7)"o","m","m","a","n"
  10334.     BYTE    (7)"d",000,000,000,000
  10335. P.AAR:    BYTE    (7)"W","a","i","t","i"
  10336.     BYTE    (7)"n","g"," ","f","o"
  10337.     BYTE    (7)"r"," ","r","e","s"
  10338.     BYTE    (7)"p","o","n","s","e"
  10339.     BYTE    (7)" ","t","o"," ","r"
  10340.     BYTE    (7)"e","m","o","t","e"
  10341.     BYTE    (7)" ","c","o","m","m"
  10342.     BYTE    (7)"a","n","d",000,000
  10343. P.AAS:    BYTE    (7)" ","c","h","a","r"
  10344.     BYTE    (7)"a","c","t","e","r"
  10345.     BYTE    (7)"s"," ","s","e","n"
  10346.     BYTE    (7)"t"," ","f","o","r"
  10347.     BYTE    (7)" ","f","i","l","e"
  10348.     BYTE    (7)" ",000,000,000,000
  10349. P.AAT:    BYTE    (7)"A","t"," ","e","n"
  10350.     BYTE    (7)"d"," ","o","f"," "
  10351.     BYTE    (7)"f","i","l","e"," "
  10352.     BYTE    (7)000,000,000,000,000
  10353. P.AAU:    BYTE    (7)"F","i","n","i","s"
  10354.     BYTE    (7)"h","i","n","g"," "
  10355.     BYTE    (7)"t","r","a","n","s"
  10356.     BYTE    (7)"f","e","r"," ","s"
  10357.     BYTE    (7)"e","s","s","i","o"
  10358.     BYTE    (7)"n",000,000,000,000
  10359. P.AAV:    BYTE    (7)"W","a","i","t","i"
  10360.     BYTE    (7)"n","g"," ","f","o"
  10361.     BYTE    (7)"r"," ","i","n","i"
  10362.     BYTE    (7)"t","i","a","l","i"
  10363.     BYTE    (7)"z","a","t","i","o"
  10364.     BYTE    (7)"n",000,000,000,000
  10365. P.AAW:    BYTE    (7)"W","a","i","t","i"
  10366.     BYTE    (7)"n","g"," ","f","o"
  10367.     BYTE    (7)"r"," ","n","e","x"
  10368.     BYTE    (7)"t"," ","f","i","l"
  10369.     BYTE    (7)"e"," ","o","r"," "
  10370.     BYTE    (7)"e","n","d"," ","o"
  10371.     BYTE    (7)"f"," ","s","e","s"
  10372.     BYTE    (7)"s","i","o","n",000
  10373. P.AAX:    BYTE    (7)" ","c","h","a","r"
  10374.     BYTE    (7)"a","c","t","e","r"
  10375.     BYTE    (7)"s"," ","r","e","c"
  10376.     BYTE    (7)"e","i","v","e","d"
  10377.     BYTE    (7)" ","f","o","r"," "
  10378.     BYTE    (7)"f","i","l","e"," "
  10379.     BYTE    (7)000,000,000,000,000
  10380. P.AAY:    BYTE    (7)" ","S","e","s","s"
  10381.     BYTE    (7)"i","o","n"," ","c"
  10382.     BYTE    (7)"o","m","p","l","e"
  10383.     BYTE    (7)"t","e",000,000,000
  10384. P.AAZ:    BYTE    (7)" ","S","e","s","s"
  10385.     BYTE    (7)"i","o","n"," ","a"
  10386.     BYTE    (7)"b","o","r","t","e"
  10387.     BYTE    (7)"d",000,000,000,000
  10388. P.ABA:    BYTE    (7)" ","U","n","k","n"
  10389.     BYTE    (7)"o","w","n"," ","s"
  10390.     BYTE    (7)"t","a","t","e",000
  10391. P.ABB:    BYTE    (7)","," ",000,000,000
  10392. P.ABC:    BYTE    (7)" ","N","A","K","s"
  10393.     BYTE    (7)" ","r","e","c","e"
  10394.     BYTE    (7)"i","v","e","d",000
  10395. P.ABD:    BYTE    (7)","," ",000,000,000
  10396. P.ABE:    BYTE    (7)" ","N","A","K","s"
  10397.     BYTE    (7)" ","s","e","n","t"
  10398.     BYTE    (7)000,000,000,000,000
  10399.  
  10400.  
  10401. ; STS%OUTPUT
  10402. U.33:    PUSH    SP,C.102            ;                                        6400
  10403.     PUSHJ    SP,TT%CHAR
  10404.     MOVE    AC1,U.51            ;                                        6402
  10405.     SOJL    AC1,L.446
  10406.     CAIGE    AC1,24
  10407.     JRST    L.445(AC1)
  10408.     JRST    L.446
  10409. L.445:    JRST    L.448
  10410.     JRST    L.448
  10411.     JRST    L.451
  10412.     JRST    L.452
  10413.     JRST    L.454
  10414.     JRST    L.455
  10415.     JRST    L.456
  10416.     JRST    L.457
  10417.     JRST    L.459
  10418.     JRST    L.460
  10419.     JRST    L.446
  10420.     JRST    L.450
  10421.     JRST    L.449
  10422.     JRST    L.447
  10423.     JRST    L.447
  10424.     JRST    L.446
  10425.     JRST    L.446
  10426.     JRST    L.446
  10427.     JRST    L.446
  10428.     JRST    L.446
  10429. L.446:    PUSH    SP,C.103            ;                                        6456
  10430.     JRST    L.461
  10431. L.447:    PUSH    SP,C.104            ;                                        6406
  10432.     JRST    L.461
  10433. L.448:    PUSH    SP,C.105            ;                                        6410
  10434.     JRST    L.453
  10435. L.449:    PUSH    SP,C.106            ;                                        6415
  10436.     JRST    L.461
  10437. L.450:    PUSH    SP,C.107            ;                                        6418
  10438.     JRST    L.461
  10439. L.451:    PUSH    SP,U.61                ;                                        6422
  10440.     PUSHJ    SP,TT%NUMBER
  10441.     PUSH    SP,C.108            ;                                        6423
  10442.     JRST    L.458
  10443. L.452:    PUSH    SP,C.109            ;                                        6429
  10444. L.453:    PUSHJ    SP,TT%TEXT
  10445.     PUSH    SP,C.34                ;                                        6430
  10446.     PUSHJ    SP,TT%TEXT
  10447.     ADJSP    SP,-1                ;                                        6428
  10448.     JRST    L.462                ;                                        6402
  10449. L.454:    PUSH    SP,C.110            ;                                        6434
  10450.     JRST    L.461
  10451. L.455:    PUSH    SP,C.111            ;                                        6437
  10452.     JRST    L.461
  10453. L.456:    PUSH    SP,C.112            ;                                        6440
  10454.     JRST    L.461
  10455. L.457:    PUSH    SP,U.61                ;                                        6444
  10456.     PUSHJ    SP,TT%NUMBER
  10457.     PUSH    SP,C.113            ;                                        6445
  10458. L.458:    PUSHJ    SP,TT%TEXT
  10459.     PUSH    SP,C.34                ;                                        6446
  10460.     PUSHJ    SP,TT%TEXT
  10461.     ADJSP    SP,-2                ;                                        6443
  10462.     JRST    L.462                ;                                        6402
  10463. L.459:    PUSH    SP,C.114            ;                                        6450
  10464.     JRST    L.461
  10465. L.460:    PUSH    SP,C.115            ;                                        6453
  10466. L.461:    PUSHJ    SP,TT%TEXT
  10467. L.462:    MOVE    AC1,U.51            ;                                        6459
  10468.     JUMPLE    AC1,L.463            ;                                        6462
  10469.     CAILE    AC1,5
  10470.     JRST    L.463
  10471.     SKIPG    RMSG%NAKS            ;                                        6465
  10472.     JRST    L.465
  10473.     PUSH    SP,C.116            ;                                        6468
  10474.     PUSHJ    SP,TT%TEXT
  10475.     PUSH    SP,RMSG%NAKS            ;                                        6469
  10476.     PUSHJ    SP,TT%NUMBER
  10477.     PUSH    SP,C.117            ;                                        6470
  10478.     JRST    L.464
  10479. L.463:    CAIL    AC1,6                ;                                        6475
  10480.     CAILE    AC1,10
  10481.     JRST    L.465
  10482.     SKIPG    SMSG%NAKS            ;                                        6478
  10483.     JRST    L.465
  10484.     PUSH    SP,C.118            ;                                        6481
  10485.     PUSHJ    SP,TT%TEXT
  10486.     PUSH    SP,SMSG%NAKS            ;                                        6482
  10487.     PUSHJ    SP,TT%NUMBER
  10488.     PUSH    SP,C.119            ;                                        6483
  10489. L.464:    PUSHJ    SP,TT%TEXT
  10490.     ADJSP    SP,-3                ;                                        6480
  10491. L.465:    PUSH    SP,C.120            ;                                        6489
  10492.     PUSHJ    SP,TT%CHAR
  10493.     PUSHJ    SP,TT%CRLF            ;                                        6490
  10494.     ADJSP    SP,-3                ;                                        6399
  10495.     POPJ    SP,                ;                                        6361
  10496. C.102:    EXP    133
  10497. C.103:    XWD    0,P.ABA
  10498. C.104:    XWD    0,P.AAO
  10499. C.105:    XWD    0,P.AAP
  10500. C.106:    XWD    0,P.AAQ
  10501. C.107:    XWD    0,P.AAR
  10502. C.108:    XWD    0,P.AAS
  10503. C.109:    XWD    0,P.AAT
  10504. C.110:    XWD    0,P.AAU
  10505. C.111:    XWD    0,P.AAV
  10506. C.112:    XWD    0,P.AAW
  10507. C.113:    XWD    0,P.AAX
  10508. C.114:    XWD    0,P.AAY
  10509. C.115:    XWD    0,P.AAZ
  10510. C.116:    XWD    0,P.ABB
  10511. C.117:    XWD    0,P.ABC
  10512. C.118:    XWD    0,P.ABD
  10513. C.119:    XWD    0,P.ABE
  10514. C.120:    EXP    135
  10515.  
  10516. ; Routine Size:  113 words
  10517.  
  10518.  
  10519. ;   6492  1    %SBTTL 'TYPE%CHAR - Type out a character'
  10520. ;   6493  1    ROUTINE TYPE%CHAR (CHARACTER) =
  10521. ;   6494  1
  10522. ;   6495  1    !++
  10523. ;   6496  1    ! FUNCTIONAL DESCRIPTION:
  10524. ;   6497  1    !
  10525. ;   6498  1    ! This routine is used as an alternate output routine for BFR%EMPTY.
  10526. ;   6499  1    ! It will type the character on the terminal, and always return a
  10527. ;   6500  1    ! true status.
  10528. ;   6501  1    !
  10529. ;   6502  1    ! CALLING SEQUENCE:
  10530. ;   6503  1    !
  10531. ;   6504  1    !    STATUS = TYPE%CHAR (.CHARACTER);
  10532. ;   6505  1    !
  10533. ;   6506  1    ! INPUT PARAMETERS:
  10534. ;   6507  1    !
  10535. ;   6508  1    !    CHARACTER - The character to type
  10536. ;   6509  1    !
  10537. ;   6510  1    ! IMPLICIT INPUTS:
  10538. ;   6511  1    !
  10539. ;   6512  1    !    None.
  10540. ;   6513  1    !
  10541. ;   6514  1    ! OUPTUT PARAMETERS:
  10542. ;   6515  1    !
  10543. ;   6516  1    !    None.
  10544. ;   6517  1    !
  10545. ;   6518  1    ! IMPLICIT OUTPUTS:
  10546. ;   6519  1    !
  10547. ;   6520  1    !    None.
  10548. ;   6521  1    !
  10549. ;   6522  1    ! COMPLETION CODES:
  10550. ;   6523  1    !
  10551. ;   6524  1    !    None.
  10552. ;   6525  1    !
  10553. ;   6526  1    ! SIDE EFFECTS:
  10554. ;   6527  1    !
  10555. ;   6528  1    !    None.
  10556. ;   6529  1    !
  10557. ;   6530  1    !--
  10558. ;   6531  1
  10559. ;   6532  2        BEGIN
  10560. ;   6533  2        TT%CHAR (.CHARACTER);            ! Type the character
  10561. ;   6534  2        RETURN KER%NORMAL;                ! And return OK
  10562. ;   6535  1        END;                    ! End of TYPE%CHAR
  10563.  
  10564.  
  10565. ; TYPE%CHAR
  10566. U.31:    PUSH    SP,-1(SP)            ;                                        6533
  10567.     PUSHJ    SP,TT%CHAR
  10568.     ADJSP    SP,-1                ;                                        6534
  10569.     MOVEI    AC1,13                ;                                        6532
  10570.     POPJ    SP,                ;                                        6493
  10571.  
  10572. ; Routine Size:  5 words
  10573.  
  10574.  
  10575. ;   6536  1    %SBTTL 'Debugging -- DBG%SEND'
  10576. ;   6537  1    ROUTINE DBG%SEND (ADDRESS, LENGTH) : NOVALUE =
  10577. ;   6538  1
  10578. ;   6539  1    !++
  10579. ;   6540  1    ! FUNCTIONAL DESCRIPTION:
  10580. ;   6541  1    !
  10581. ;   6542  1    !    This routine will output the message that is going to be sent
  10582. ;   6543  1    !    as part of the debugging information that is turned on in the
  10583. ;   6544  1    !    SET DEBUG command.
  10584. ;   6545  1    !
  10585. ;   6546  1    ! CALLING SEQUENCE:
  10586. ;   6547  1    !
  10587. ;   6548  1    !    DBG%SEND(MSG%ADDRESS, MSG%LENGTH);
  10588. ;   6549  1    !
  10589. ;   6550  1    ! INPUT PARAMETERS:
  10590. ;   6551  1    !
  10591. ;   6552  1    !    MSG%ADDRESS - Address of the message that is going to be sent
  10592. ;   6553  1    !        to the remote KERMIT.  The bytes are CHR%SIZE.
  10593. ;   6554  1    !    MSG%LENGTH - Length of the message.
  10594. ;   6555  1    !
  10595. ;   6556  1    ! IMPLICIT INPUTS:
  10596. ;   6557  1    !
  10597. ;   6558  1    !    None.
  10598. ;   6559  1    !
  10599. ;   6560  1    ! OUTPUT PARAMETERS:
  10600. ;   6561  1    !
  10601. ;   6562  1    !    None.
  10602. ;   6563  1    !
  10603. ;   6564  1    ! IMPLICIT OUTPUTS:
  10604. ;   6565  1    !
  10605. ;   6566  1    !    None.
  10606. ;   6567  1    !
  10607. ;   6568  1    ! COMPLETION CODES:
  10608. ;   6569  1    !
  10609. ;   6570  1    !    None.
  10610. ;   6571  1    !
  10611. ;   6572  1    ! SIDE EFFECTS:
  10612. ;   6573  1    !
  10613. ;   6574  1    !    None.
  10614. ;   6575  1    !
  10615. ;   6576  1    !--
  10616. ;   6577  1
  10617. ;   6578  2        BEGIN
  10618. ;   6579  2
  10619. ;   6580  2        BIND
  10620. ;   6581  2        SEND%TEXT = UPLIT (%ASCIZ'Sending...');
  10621. ;   6582  2
  10622. ;   6583  2        IF .DEBUG%FLAG
  10623. ;   6584  2        THEN
  10624. ;   6585  3        BEGIN
  10625. ;   6586  3
  10626. ;   6587  3        LOCAL
  10627. ;   6588  3            OLD%RTN;
  10628. ;   6589  3
  10629. ;   6590  3        OLD%RTN = TT%SET%OUTPUT (DBG%DUMP);
  10630. ;   6591  3        TT%TEXT (SEND%TEXT);
  10631. ;   6592  3        DBG%MESSAGE (.ADDRESS, .LENGTH);
  10632. ;   6593  3        TT%SET%OUTPUT (.OLD%RTN);
  10633. ;   6594  2        END;
  10634. ;   6595  2
  10635. ;   6596  1        END;                    ! End of DBG%SEND
  10636.  
  10637.  
  10638. P.ABF:    BYTE    (7)"S","e","n","d","i"
  10639.     BYTE    (7)"n","g",".",".","."
  10640.     BYTE    (7)000,000,000,000,000
  10641.  
  10642.  
  10643. ; SEND%TEXT
  10644. U.102=            P.ABF
  10645.  
  10646.  
  10647. ; DBG%SEND
  10648. U.35:    PUSH    SP,AC16                ;                                        6537
  10649.     MOVEI    AC1,1                ;                                        6583
  10650.     TDNN    AC1,DEBUG%FLAG
  10651.     JRST    L.466
  10652.     PUSH    SP,C.88                ;                                        6590
  10653.     PUSHJ    SP,TT%SET%OUTPUT
  10654.     MOVE    AC16,AC1
  10655.     PUSH    SP,C.121            ;                                        6591
  10656.     PUSHJ    SP,TT%TEXT
  10657.     PUSH    SP,-5(SP)            ;                                        6592
  10658.     PUSH    SP,-5(SP)
  10659.     PUSHJ    SP,U.34
  10660.     MOVEM    AC16,0(SP)            ;                                        6593
  10661.     PUSHJ    SP,TT%SET%OUTPUT
  10662.     ADJSP    SP,-4                ;                                        6585
  10663. L.466:    POP    SP,AC16                ;                                        6537
  10664.     POPJ    SP,
  10665. C.121:    XWD    0,U.102
  10666.  
  10667. ; Routine Size:  18 words
  10668.  
  10669.  
  10670. ;   6597  1    %SBTTL 'Debugging -- DBG%RECEIVE'
  10671. ;   6598  1    ROUTINE DBG%RECEIVE (ADDRESS) : NOVALUE =
  10672. ;   6599  1
  10673. ;   6600  1    !++
  10674. ;   6601  1    ! FUNCTIONAL DESCRIPTION:
  10675. ;   6602  1    !
  10676. ;   6603  1    !    This routine will output the message that was received from
  10677. ;   6604  1    !    the remote KERMIT.  This routine is called only if the DEBUG%FLAG
  10678. ;   6605  1    !    is true.
  10679. ;   6606  1    !
  10680. ;   6607  1    ! CALLING SEQUENCE:
  10681. ;   6608  1    !
  10682. ;   6609  1    !    DBG%RECEIVE(MSG%ADDRESS);
  10683. ;   6610  1    !
  10684. ;   6611  1    ! INPUT PARAMETERS:
  10685. ;   6612  1    !
  10686. ;   6613  1    !    MSG%ADDRESS - Address of the message received by the remote KERMIT.
  10687. ;   6614  1    !
  10688. ;   6615  1    ! IMPLICIT INPUTS:
  10689. ;   6616  1    !
  10690. ;   6617  1    !    None.
  10691. ;   6618  1    !
  10692. ;   6619  1    ! OUTPUT PARAMETERS:
  10693. ;   6620  1    !
  10694. ;   6621  1    !    None.
  10695. ;   6622  1    !
  10696. ;   6623  1    ! IMPLICIT OUTPUTS:
  10697. ;   6624  1    !
  10698. ;   6625  1    !    None.
  10699. ;   6626  1    !
  10700. ;   6627  1    ! COMPLETION CODES:
  10701. ;   6628  1    !
  10702. ;   6629  1    !    None.
  10703. ;   6630  1    !
  10704. ;   6631  1    ! SIDE EFFECTS:
  10705. ;   6632  1    !
  10706. ;   6633  1    !    None.
  10707. ;   6634  1    !
  10708. ;   6635  1    !--
  10709. ;   6636  1
  10710. ;   6637  2        BEGIN
  10711. ;   6638  2
  10712. ;   6639  2        BIND
  10713. ;   6640  2        RECEIVE%TEXT = UPLIT (%ASCIZ'Received...');
  10714. ;   6641  2
  10715. ;   6642  2        IF .DEBUG%FLAG
  10716. ;   6643  2        THEN
  10717. ;   6644  3        BEGIN
  10718. ;   6645  3
  10719. ;   6646  3        LOCAL
  10720. ;   6647  3            OLD%RTN;
  10721. ;   6648  3
  10722. ;   6649  3        OLD%RTN = TT%SET%OUTPUT (DBG%DUMP);
  10723. ;   6650  3        TT%TEXT (RECEIVE%TEXT);
  10724. ;   6651  3        DBG%MESSAGE (.ADDRESS, .REC%LENGTH);
  10725. ;   6652  3        TT%SET%OUTPUT (.OLD%RTN);
  10726. ;   6653  2        END;
  10727. ;   6654  2
  10728. ;   6655  1        END;                    ! End of DBG%RECEIVE
  10729.  
  10730.  
  10731. P.ABG:    BYTE    (7)"R","e","c","e","i"
  10732.     BYTE    (7)"v","e","d",".","."
  10733.     BYTE    (7)".",000,000,000,000
  10734.  
  10735.  
  10736. ; RECEIVE%TEXT
  10737. U.103=            P.ABG
  10738.  
  10739.  
  10740. ; DBG%RECEIVE
  10741. U.36:    PUSH    SP,AC16                ;                                        6598
  10742.     MOVEI    AC1,1                ;                                        6642
  10743.     TDNN    AC1,DEBUG%FLAG
  10744.     JRST    L.467
  10745.     PUSH    SP,C.88                ;                                        6649
  10746.     PUSHJ    SP,TT%SET%OUTPUT
  10747.     MOVE    AC16,AC1
  10748.     PUSH    SP,C.122            ;                                        6650
  10749.     PUSHJ    SP,TT%TEXT
  10750.     PUSH    SP,-4(SP)            ;                                        6651
  10751.     PUSH    SP,U.57
  10752.     PUSHJ    SP,U.34
  10753.     MOVEM    AC16,0(SP)            ;                                        6652
  10754.     PUSHJ    SP,TT%SET%OUTPUT
  10755.     ADJSP    SP,-4                ;                                        6644
  10756. L.467:    POP    SP,AC16                ;                                        6598
  10757.     POPJ    SP,
  10758. C.122:    XWD    0,U.103
  10759.  
  10760. ; Routine Size:  18 words
  10761.  
  10762.  
  10763. ;   6656  1    %SBTTL 'Debugging -- DBG%MESSAGE'
  10764. ;   6657  1    ROUTINE DBG%MESSAGE (MSG%ADDRESS, MSG%LENGTH) : NOVALUE =
  10765. ;   6658  1
  10766. ;   6659  1    !++
  10767. ;   6660  1    ! FUNCTIONAL DESCRIPTION:
  10768. ;   6661  1    !
  10769. ;   6662  1    !    This routine will display a message that is either being sent
  10770. ;   6663  1    !    or received on the user's terminal.
  10771. ;   6664  1    !
  10772. ;   6665  1    ! CALLING SEQUENCE:
  10773. ;   6666  1    !
  10774. ;   6667  1    !    DBG%MESSAGE(MSG%ADDRESS, MSG%LENGTH);
  10775. ;   6668  1    !
  10776. ;   6669  1    ! INPUT PARAMETERS:
  10777. ;   6670  1    !
  10778. ;   6671  1    !    MSG%ADDRESS - Address of the message to be output
  10779. ;   6672  1    !    MSG%LENGTH - Length of the message to be output.
  10780. ;   6673  1    !
  10781. ;   6674  1    ! IMPLICIT INPUTS:
  10782. ;   6675  1    !
  10783. ;   6676  1    !    None.
  10784. ;   6677  1    !
  10785. ;   6678  1    ! OUTPUT PARAMETERS:
  10786. ;   6679  1    !
  10787. ;   6680  1    !    None.
  10788. ;   6681  1    !
  10789. ;   6682  1    ! IMPLICIT OUTPUTS:
  10790. ;   6683  1    !
  10791. ;   6684  1    !    None.
  10792. ;   6685  1    !
  10793. ;   6686  1    ! COMPLETION CODES:
  10794. ;   6687  1    !
  10795. ;   6688  1    !    None.
  10796. ;   6689  1    !
  10797. ;   6690  1    ! SIDE EFFECTS:
  10798. ;   6691  1    !
  10799. ;   6692  1    !    None.
  10800. ;   6693  1    !
  10801. ;   6694  1    !--
  10802. ;   6695  1
  10803. ;   6696  2        BEGIN
  10804. ;   6697  2
  10805. ;   6698  2        MAP
  10806. ;   6699  2        MSG%ADDRESS : REF VECTOR [CH$ALLOCATION (MAX%MSG, CHR%SIZE)];    ! Point to the vector
  10807. ;   6700  2
  10808. ;   6701  2        LOCAL
  10809. ;   6702  2        OLD%RTN,                ! Old type out routine
  10810. ;   6703  2        CHKSUM,                    ! Numeric value of block check
  10811. ;   6704  2        TEMP%POINTER,                ! Temporary character pointer
  10812. ;   6705  2        MSG%MSG,            ! [108]    ! Starting point for data
  10813. ;   6706  2        MSG%LEN;
  10814. ;   6707  2
  10815. ;   6708  2    !
  10816. ;   6709  2    ! Message type text
  10817. ;   6710  2    !
  10818. ;   6711  2
  10819. ;   6712  2        BIND
  10820. ;   6713  2        DATA%TEXT = UPLIT (%ASCIZ' (Data)'),
  10821. ;   6714  2        ACK%TEXT = UPLIT (%ASCIZ' (ACK)'),
  10822. ;   6715  2        NAK%TEXT = UPLIT (%ASCIZ' (NAK)'),
  10823. ;   6716  2        SND%INIT%TEXT = UPLIT (%ASCIZ' (Send init)'),
  10824. ;   6717  2        BREAK%TEXT = UPLIT (%ASCIZ' (Break)'),
  10825. ;   6718  2        TEXT%TEXT = UPLIT (%ASCIZ' (Text header)'),
  10826. ;   6719  2        FILE%TEXT = UPLIT (%ASCIZ' (File header)'),
  10827. ;   6720  2        EOF%TEXT = UPLIT (%ASCIZ' (EOF)'),
  10828. ;   6721  2        ERROR%TEXT = UPLIT (%ASCIZ' (Error)'),
  10829. ;   6722  2        RCV%INIT%TEXT = UPLIT (%ASCIZ' (Receive initiate)'),
  10830. ;   6723  2        COMMAND%TEXT = UPLIT (%ASCIZ' (Command)'),
  10831. ;   6724  2        KERMIT%TEXT = UPLIT (%ASCIZ' (Generic KERMIT command)');
  10832. ;   6725  2
  10833. ;   6726  2    !
  10834. ;   6727  2    ! Header information
  10835. ;   6728  2    !
  10836. ;   6729  2
  10837. ;   6730  2        BIND
  10838. ;   6731  2        MN%TEXT = UPLIT (%ASCIZ'Message number: '),
  10839. ;   6732  2        LENGTH%TEXT = UPLIT (%ASCIZ'    Length: '),
  10840. ;   6733  2        DEC%TEXT = UPLIT (%ASCIZ' (dec)'),
  10841. ;   6734  2        MSG%TYP%TEXT = UPLIT (%ASCIZ'Message type: '),
  10842. ;   6735  2        CHKSUM%TEXT = UPLIT (%ASCIZ'Checksum: '),
  10843. ;   6736  2        CHKSUM%NUM%TEXT = UPLIT (%ASCIZ' = '),
  10844. ;   6737  2        OPT%DATA%TEXT = UPLIT (%ASCIZ'Optional data: '),
  10845. ;   6738  2        PRE%CHAR%TEXT = UPLIT (%ASCIZ' "');
  10846. ;   6739  2
  10847. ;   6740  2    !
  10848. ;   6741  2    ! Ensure that the type out will go to the debugging location
  10849. ;   6742  2    !
  10850. ;   6743  2        OLD%RTN = TT%SET%OUTPUT (DBG%DUMP);
  10851. ;   6744  2    !
  10852. ;   6745  2    ! Preliminary calculations
  10853. ;   6746  2    !
  10854. ;   6747  2        MSG%LEN = UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%COUNT, CHR%SIZE)));
  10855. ;   6748  2        MSG%MSG = PKT%MSG;                               ! [108]
  10856. ;   6749  2        IF .MSG%LEN EQL 0                               ! [108]
  10857. ;   6750  2        THEN                                   ! [108]
  10858. ;   6751  3        BEGIN                                   ! [108]
  10859. ;   6752  3        MSG%LEN = UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%COUNTX1, CHR%SIZE))) * 95 +
  10860. ;   6753  3            UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%COUNTX2, CHR%SIZE))) +
  10861. ;   6754  3                            PKT%HCHECK - 1;           ! [108]
  10862. ;   6755  3        MSG%MSG = PKT%MSGX;                           ! [108]
  10863. ;   6756  2        END;                                   ! [108]
  10864. ;   6757  2
  10865. ;   6758  2    !
  10866. ;   6759  2    ! First output some header information for the packet.
  10867. ;   6760  2    !
  10868. ;   6761  2        TT%CRLF ();
  10869. ;   6762  2        TT%TEXT (MN%TEXT);
  10870. ;   6763  2        TT%NUMBER (UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%SEQ, CHR%SIZE))));
  10871. ;   6764  2        TT%TEXT (DEC%TEXT);
  10872. ;   6765  2        TT%TEXT (LENGTH%TEXT);
  10873. ;   6766  2        TT%NUMBER (.MSG%LEN);
  10874. ;   6767  2        TT%TEXT (DEC%TEXT);
  10875. ;   6768  2        TT%CRLF ();
  10876. ;   6769  2    !
  10877. ;   6770  2    ! Now output the message type and dependent information
  10878. ;   6771  2    !
  10879. ;   6772  2        TT%TEXT (MSG%TYP%TEXT);
  10880. ;   6773  2        TT%CHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%TYPE, CHR%SIZE)));
  10881. ;   6774  2
  10882. ;   6775  2        SELECTONE CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%TYPE, CHR%SIZE)) OF
  10883. ;   6776  2        SET
  10884. ;   6777  2
  10885. ;   6778  2        [MSG%DATA] :
  10886. ;   6779  2            TT%TEXT (DATA%TEXT);
  10887. ;   6780  2
  10888. ;   6781  2        [MSG%ACK] :
  10889. ;   6782  2            TT%TEXT (ACK%TEXT);
  10890. ;   6783  2
  10891. ;   6784  2        [MSG%NAK] :
  10892. ;   6785  2            TT%TEXT (NAK%TEXT);
  10893. ;   6786  2
  10894. ;   6787  2        [MSG%SND%INIT] :
  10895. ;   6788  2            TT%TEXT (SND%INIT%TEXT);
  10896. ;   6789  2
  10897. ;   6790  2        [MSG%BREAK] :
  10898. ;   6791  2            TT%TEXT (BREAK%TEXT);
  10899. ;   6792  2
  10900. ;   6793  2        [MSG%FILE] :
  10901. ;   6794  2            TT%TEXT (FILE%TEXT);
  10902. ;   6795  2
  10903. ;   6796  2        [MSG%TEXT] :
  10904. ;   6797  2            TT%TEXT (TEXT%TEXT);
  10905. ;   6798  2
  10906. ;   6799  2        [MSG%EOF] :
  10907. ;   6800  2            TT%TEXT (EOF%TEXT);
  10908. ;   6801  2
  10909. ;   6802  2        [MSG%ERROR] :
  10910. ;   6803  2            TT%TEXT (ERROR%TEXT);
  10911. ;   6804  2
  10912. ;   6805  2        [MSG%GENERIC] :
  10913. ;   6806  2            TT%TEXT (KERMIT%TEXT);
  10914. ;   6807  2
  10915. ;   6808  2        [MSG%COMMAND] :
  10916. ;   6809  2            TT%TEXT (COMMAND%TEXT);
  10917. ;   6810  2        TES;
  10918. ;   6811  2
  10919. ;   6812  2        TT%CRLF ();
  10920. ;   6813  2    !
  10921. ;   6814  2    ! Now output any of the optional data.
  10922. ;   6815  2    !
  10923. ;   6816  2
  10924. ;   6817  2        IF .MSG%LEN - .MSG%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR) NEQ 0   ! [108]
  10925. ;   6818  2        THEN
  10926. ;   6819  3        BEGIN
  10927. ;   6820  3        TT%TEXT (OPT%DATA%TEXT);
  10928. ;   6821  3        TT%CRLF ();
  10929. ;   6822  3        TEMP%POINTER = CH$PTR (.MSG%ADDRESS, .MSG%MSG, CHR%SIZE);      ! [108]
  10930. ;   6823  3
  10931. ;   6824  3        INCR I FROM 1 TO .MSG%LEN - .MSG%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR) DO ! [108]
  10932. ;   6825  4            BEGIN
  10933. ;   6826  4
  10934. ;   6827  4            IF (.I MOD 10) EQL 1
  10935. ;   6828  4            THEN
  10936. ;   6829  5            BEGIN
  10937. ;   6830  5            TT%CRLF ();
  10938. ;   6831  5            TT%CHAR (CHR%TAB);
  10939. ;   6832  4            END;
  10940. ;   6833  4
  10941. ;   6834  4            TT%TEXT (PRE%CHAR%TEXT);
  10942. ;   6835  4            TT%CHAR (CH$RCHAR%A (TEMP%POINTER));
  10943. ;   6836  4            TT%CHAR (%C'"');
  10944. ;   6837  3            END;
  10945. ;   6838  3
  10946. ;   6839  3        IF ((.MSG%LEN - .MSG%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR)) MOD 10) EQL 1 THEN TT%CRLF (); ! [108]
  10947. ;   6840  3
  10948. ;   6841  3        TT%CRLF ();
  10949. ;   6842  2        END;
  10950. ;   6843  2
  10951. ;   6844  2    !
  10952. ;   6845  2    ! Now output the checksum for the message that we received
  10953. ;   6846  2    !
  10954. ;   6847  2    ! This could be either 1 two or three characters.
  10955. ;   6848  2        TT%TEXT (CHKSUM%TEXT);
  10956. ;   6849  2        TEMP%POINTER = CH$PTR (.MSG%ADDRESS,
  10957. ;   6850  2        .MSG%LEN + PKT%CHKSUM + 1 - (.BLK%CHK%TYPE - CHK%1CHAR), CHR%SIZE); ! [108]
  10958. ;   6851  2
  10959. ;   6852  2        CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF
  10960. ;   6853  2        SET
  10961. ;   6854  2
  10962. ;   6855  2        [CHK%1CHAR] :
  10963. ;   6856  3            BEGIN
  10964. ;   6857  3            TT%TEXT (PRE%CHAR%TEXT);
  10965. ;   6858  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  10966. ;   6859  3            TT%CHAR (%C'"');
  10967. ;   6860  3            CHKSUM = UNCHAR (CH$RCHAR (.TEMP%POINTER));
  10968. ;   6861  2            END;
  10969. ;   6862  2
  10970. ;   6863  2        [CHK%2CHAR] :
  10971. ;   6864  3            BEGIN
  10972. ;   6865  3            CHKSUM = 0;
  10973. ;   6866  3            TT%TEXT (PRE%CHAR%TEXT);
  10974. ;   6867  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  10975. ;   6868  3            TT%CHAR (%C'"');
  10976. ;   6869  3            CHKSUM<6, 6> = UNCHAR (CH$RCHAR%A (TEMP%POINTER));
  10977. ;   6870  3            TT%TEXT (PRE%CHAR%TEXT);
  10978. ;   6871  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  10979. ;   6872  3            TT%CHAR (%C'"');
  10980. ;   6873  3            CHKSUM<0, 6> = UNCHAR (CH$RCHAR (.TEMP%POINTER));
  10981. ;   6874  2            END;
  10982. ;   6875  2
  10983. ;   6876  2        [CHK%CRC] :
  10984. ;   6877  3            BEGIN
  10985. ;   6878  3            CHKSUM = 0;
  10986. ;   6879  3            TT%TEXT (PRE%CHAR%TEXT);
  10987. ;   6880  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  10988. ;   6881  3            TT%CHAR (%C'"');
  10989. ;   6882  3            CHKSUM<12, 4> = UNCHAR (CH$RCHAR%A (TEMP%POINTER));
  10990. ;   6883  3            TT%TEXT (PRE%CHAR%TEXT);
  10991. ;   6884  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  10992. ;   6885  3            TT%CHAR (%C'"');
  10993. ;   6886  3            CHKSUM<6, 6> = UNCHAR (CH$RCHAR%A (TEMP%POINTER));
  10994. ;   6887  3            TT%TEXT (PRE%CHAR%TEXT);
  10995. ;   6888  3            TT%CHAR (CH$RCHAR (.TEMP%POINTER));
  10996. ;   6889  3            TT%CHAR (%C'"');
  10997. ;   6890  3            CHKSUM<0, 6> = UNCHAR (CH$RCHAR (.TEMP%POINTER));
  10998. ;   6891  2            END;
  10999. ;   6892  2        TES;
  11000. ;   6893  2
  11001. ;   6894  2        TT%TEXT (CHKSUM%NUM%TEXT);
  11002. ;   6895  2        TT%NUMBER (.CHKSUM);
  11003. ;   6896  2        TT%TEXT (DEC%TEXT);
  11004. ;   6897  2        TT%CRLF ();
  11005. ;   6898  2        TT%SET%OUTPUT (.OLD%RTN);            ! Reset output destination
  11006. ;   6899  1        END;                    ! End of DBG%MESSAGE
  11007.  
  11008.  
  11009. P.ABH:    BYTE    (7)" ","(","D","a","t"
  11010.     BYTE    (7)"a",")",000,000,000
  11011. P.ABI:    BYTE    (7)" ","(","A","C","K"
  11012.     BYTE    (7)")",000,000,000,000
  11013. P.ABJ:    BYTE    (7)" ","(","N","A","K"
  11014.     BYTE    (7)")",000,000,000,000
  11015. P.ABK:    BYTE    (7)" ","(","S","e","n"
  11016.     BYTE    (7)"d"," ","i","n","i"
  11017.     BYTE    (7)"t",")",000,000,000
  11018. P.ABL:    BYTE    (7)" ","(","B","r","e"
  11019.     BYTE    (7)"a","k",")",000,000
  11020. P.ABM:    BYTE    (7)" ","(","T","e","x"
  11021.     BYTE    (7)"t"," ","h","e","a"
  11022.     BYTE    (7)"d","e","r",")",000
  11023. P.ABN:    BYTE    (7)" ","(","F","i","l"
  11024.     BYTE    (7)"e"," ","h","e","a"
  11025.     BYTE    (7)"d","e","r",")",000
  11026. P.ABO:    BYTE    (7)" ","(","E","O","F"
  11027.     BYTE    (7)")",000,000,000,000
  11028. P.ABP:    BYTE    (7)" ","(","E","r","r"
  11029.     BYTE    (7)"o","r",")",000,000
  11030. P.ABQ:    BYTE    (7)" ","(","R","e","c"
  11031.     BYTE    (7)"e","i","v","e"," "
  11032.     BYTE    (7)"i","n","i","t","i"
  11033.     BYTE    (7)"a","t","e",")",000
  11034. P.ABR:    BYTE    (7)" ","(","C","o","m"
  11035.     BYTE    (7)"m","a","n","d",")"
  11036.     BYTE    (7)000,000,000,000,000
  11037. P.ABS:    BYTE    (7)" ","(","G","e","n"
  11038.     BYTE    (7)"e","r","i","c"," "
  11039.     BYTE    (7)"K","E","R","M","I"
  11040.     BYTE    (7)"T"," ","c","o","m"
  11041.     BYTE    (7)"m","a","n","d",")"
  11042.     BYTE    (7)000,000,000,000,000
  11043. P.ABT:    BYTE    (7)"M","e","s","s","a"
  11044.     BYTE    (7)"g","e"," ","n","u"
  11045.     BYTE    (7)"m","b","e","r",":"
  11046.     BYTE    (7)" ",000,000,000,000
  11047. P.ABU:    BYTE    (7)011,"L","e","n","g"
  11048.     BYTE    (7)"t","h",":"," ",000
  11049. P.ABV:    BYTE    (7)" ","(","d","e","c"
  11050.     BYTE    (7)")",000,000,000,000
  11051. P.ABW:    BYTE    (7)"M","e","s","s","a"
  11052.     BYTE    (7)"g","e"," ","t","y"
  11053.     BYTE    (7)"p","e",":"," ",000
  11054. P.ABX:    BYTE    (7)"C","h","e","c","k"
  11055.     BYTE    (7)"s","u","m",":"," "
  11056.     BYTE    (7)000,000,000,000,000
  11057. P.ABY:    BYTE    (7)" ","="," ",000,000
  11058. P.ABZ:    BYTE    (7)"O","p","t","i","o"
  11059.     BYTE    (7)"n","a","l"," ","d"
  11060.     BYTE    (7)"a","t","a",":"," "
  11061.     BYTE    (7)000,000,000,000,000
  11062. P.ACA:    BYTE    (7)" ",042,000,000,000
  11063.  
  11064.  
  11065. ; DATA%TEXT
  11066. U.105=            P.ABH
  11067. ; ACK%TEXT
  11068. U.106=            P.ABI
  11069. ; NAK%TEXT
  11070. U.107=            P.ABJ
  11071. ; SND%INIT%TEXT
  11072. U.108=            P.ABK
  11073. ; BREAK%TEXT
  11074. U.109=            P.ABL
  11075. ; TEXT%TEXT
  11076. U.110=            P.ABM
  11077. ; FILE%TEXT
  11078. U.111=            P.ABN
  11079. ; EOF%TEXT
  11080. U.112=            P.ABO
  11081. ; ERROR%TEXT
  11082. U.113=            P.ABP
  11083. ; RCV%INIT%TEXT
  11084. U.114=            P.ABQ
  11085. ; COMMAND%TEXT
  11086. U.115=            P.ABR
  11087. ; KERMIT%TEXT
  11088. U.116=            P.ABS
  11089. ; MN%TEXT
  11090. U.117=            P.ABT
  11091. ; LENGTH%TEXT
  11092. U.118=            P.ABU
  11093. ; DEC%TEXT
  11094. U.119=            P.ABV
  11095. ; MSG%TYP%TEXT
  11096. U.120=            P.ABW
  11097. ; CHKSUM%TEXT
  11098. U.121=            P.ABX
  11099. ; CHKSUM%NUM%TEXT
  11100. U.122=            P.ABY
  11101. ; OPT%DATA%TEXT
  11102. U.123=            P.ABZ
  11103. ; PRE%CHAR%TEXT
  11104. U.124=            P.ACA
  11105.  
  11106. ; DBG%MESSAGE
  11107. U.34:    PUSH    SP,AC0                ;                                        6657
  11108.     PUSH    SP,AC10
  11109.     PUSH    SP,AC11
  11110.     PUSH    SP,AC12
  11111.     PUSH    SP,AC13
  11112.     PUSH    SP,AC14
  11113.     PUSH    SP,AC16
  11114.     PUSH    SP,C.88                ;                                        6743
  11115.     PUSHJ    SP,TT%SET%OUTPUT
  11116.     MOVE    AC0,AC1
  11117.     MOVE    AC12,-12(SP)            ;                                        6747
  11118.     MOVEI    AC1,0(AC12)
  11119.     HRLI    AC1,341000
  11120.     ILDB    AC2,AC1
  11121.     MOVE    AC14,AC2
  11122.     SUBI    AC14,40
  11123.     MOVEI    AC16,4                ;                                        6748
  11124.     JUMPN    AC14,L.468            ;                                        6749
  11125.     MOVEI    AC1,0(AC12)            ;                                        6752
  11126.     HRLI    AC1,41000
  11127.     ILDB    AC2,AC1
  11128.     IMULI    AC2,137
  11129.     MOVEI    AC1,1(AC12)            ;                                        6753
  11130.     HRLI    AC1,341000
  11131.     ILDB    AC1,AC1
  11132.     ADD    AC2,AC1                ;                                        6752
  11133.     MOVE    AC14,AC2            ;                                        6754
  11134.     SUBI    AC14,5773
  11135.     MOVEI    AC16,7                ;                                        6755
  11136. L.468:    PUSHJ    SP,TT%CRLF            ;                                        6761
  11137.     PUSH    SP,C.126            ;                                        6762
  11138.     PUSHJ    SP,TT%TEXT
  11139.     MOVEI    AC1,0(AC12)            ;                                        6763
  11140.     HRLI    AC1,241000
  11141.     ILDB    AC1,AC1
  11142.     SUBI    AC1,40
  11143.     PUSH    SP,AC1
  11144.     PUSHJ    SP,TT%NUMBER
  11145.     PUSH    SP,C.127            ;                                        6764
  11146.     PUSHJ    SP,TT%TEXT
  11147.     PUSH    SP,C.128            ;                                        6765
  11148.     PUSHJ    SP,TT%TEXT
  11149.     MOVEM    AC14,0(SP)            ;                                        6766
  11150.     PUSHJ    SP,TT%NUMBER
  11151.     PUSH    SP,C.127            ;                                        6767
  11152.     PUSHJ    SP,TT%TEXT
  11153.     PUSHJ    SP,TT%CRLF            ;                                        6768
  11154.     PUSH    SP,C.129            ;                                        6772
  11155.     PUSHJ    SP,TT%TEXT
  11156.     MOVEI    AC1,0(AC12)            ;                                        6773
  11157.     HRLI    AC1,141000
  11158.     ILDB    AC1,AC1
  11159.     PUSH    SP,AC1
  11160.     PUSHJ    SP,TT%CHAR
  11161.     MOVEI    AC1,0(AC12)            ;                                        6775
  11162.     HRLI    AC1,141000
  11163.     ILDB    AC13,AC1
  11164.     CAIE    AC13,104            ;                                        6778
  11165.     JRST    L.469
  11166.     PUSH    SP,C.130            ;                                        6779
  11167.     JRST    L.479
  11168. L.469:    CAIE    AC13,131            ;                                        6781
  11169.     JRST    L.470
  11170.     PUSH    SP,C.131            ;                                        6782
  11171.     JRST    L.479
  11172. L.470:    CAIE    AC13,116            ;                                        6784
  11173.     JRST    L.471
  11174.     PUSH    SP,C.132            ;                                        6785
  11175.     JRST    L.479
  11176. L.471:    CAIE    AC13,123            ;                                        6787
  11177.     JRST    L.472
  11178.     PUSH    SP,C.133            ;                                        6788
  11179.     JRST    L.479
  11180. L.472:    CAIE    AC13,102            ;                                        6790
  11181.     JRST    L.473
  11182.     PUSH    SP,C.134            ;                                        6791
  11183.     JRST    L.479
  11184. L.473:    CAIE    AC13,106            ;                                        6793
  11185.     JRST    L.474
  11186.     PUSH    SP,C.135            ;                                        6794
  11187.     JRST    L.479
  11188. L.474:    CAIE    AC13,130            ;                                        6796
  11189.     JRST    L.475
  11190.     PUSH    SP,C.136            ;                                        6797
  11191.     JRST    L.479
  11192. L.475:    CAIE    AC13,132            ;                                        6799
  11193.     JRST    L.476
  11194.     PUSH    SP,C.137            ;                                        6800
  11195.     JRST    L.479
  11196. L.476:    CAIE    AC13,105            ;                                        6802
  11197.     JRST    L.477
  11198.     PUSH    SP,C.138            ;                                        6803
  11199.     JRST    L.479
  11200. L.477:    CAIE    AC13,107            ;                                        6805
  11201.     JRST    L.478
  11202.     PUSH    SP,C.139            ;                                        6806
  11203.     JRST    L.479
  11204. L.478:    CAIE    AC13,103            ;                                        6808
  11205.     JRST    L.480
  11206.     PUSH    SP,C.140            ;                                        6809
  11207. L.479:    PUSHJ    SP,TT%TEXT
  11208.     ADJSP    SP,-1
  11209. L.480:    PUSHJ    SP,TT%CRLF            ;                                        6812
  11210.     MOVE    AC2,AC14            ;                                        6817
  11211.     SUB    AC2,AC16
  11212.     MOVE    AC11,AC2
  11213.     ADDI    AC11,1
  11214.     MOVE    AC1,U.48
  11215.     SUBI    AC1,61
  11216.     CAMN    AC11,AC1
  11217.     JRST    L.484
  11218.     PUSH    SP,C.141            ;                                        6820
  11219.     PUSHJ    SP,TT%TEXT
  11220.     PUSHJ    SP,TT%CRLF            ;                                        6821
  11221.     MOVEI    AC1,0(AC12)            ;                                        6822
  11222.     HRLI    AC1,-337000
  11223.     ADJBP    AC16,AC1
  11224.     MOVE    AC2,AC11            ;                                        6824
  11225.     SUB    AC2,U.48
  11226.     MOVE    AC10,AC2
  11227.     ADDI    AC10,61
  11228.     SETZ    AC13,
  11229.     JRST    L.483
  11230. L.481:    MOVE    AC1,AC13            ;                                        6827
  11231.     IDIVI    AC1,12
  11232.     CAIE    AC2,1
  11233.     JRST    L.482
  11234.     PUSHJ    SP,TT%CRLF            ;                                        6830
  11235.     PUSH    SP,C.47                ;                                        6831
  11236.     PUSHJ    SP,TT%CHAR
  11237.     ADJSP    SP,-1                ;                                        6829
  11238. L.482:    PUSH    SP,C.142            ;                                        6834
  11239.     PUSHJ    SP,TT%TEXT
  11240.     ILDB    AC1,AC16            ;                                        6835
  11241.     PUSH    SP,AC1
  11242.     PUSHJ    SP,TT%CHAR
  11243.     PUSH    SP,C.143            ;                                        6836
  11244.     PUSHJ    SP,TT%CHAR
  11245.     ADJSP    SP,-3                ;                                        6825
  11246. L.483:    ADDI    AC13,1                ;                                        6824
  11247.     CAMG    AC13,AC10
  11248.     JRST    L.481
  11249.     MOVE    AC2,AC11            ;                                        6839
  11250.     SUB    AC2,U.48
  11251.     ADDI    AC2,61
  11252.     MOVE    AC1,AC2
  11253.     IDIVI    AC1,12
  11254.     CAIN    AC2,1
  11255.     PUSHJ    SP,TT%CRLF
  11256.     PUSHJ    SP,TT%CRLF            ;                                        6841
  11257.     ADJSP    SP,-1                ;                                        6819
  11258. L.484:    PUSH    SP,C.144            ;                                        6848
  11259.     PUSHJ    SP,TT%TEXT
  11260.     MOVE    AC1,U.48            ;                                        6850
  11261.     SUB    AC14,AC1
  11262.     ADDI    AC14,62
  11263.     MOVEI    AC2,0(AC12)
  11264.     HRLI    AC2,-337000
  11265.     ADJBP    AC14,AC2
  11266.     MOVE    AC16,AC14
  11267.     SUBI    AC1,61                ;                                        6852
  11268.     JRST    L.485(AC1)
  11269. L.485:    JRST    L.486
  11270.     JRST    L.487
  11271.     JRST    L.488
  11272. L.486:    PUSH    SP,C.142            ;                                        6857
  11273.     PUSHJ    SP,TT%TEXT
  11274.     MOVE    AC14,AC16            ;                                        6858
  11275.     ILDB    AC1,AC14
  11276.     PUSH    SP,AC1
  11277.     PUSHJ    SP,TT%CHAR
  11278.     PUSH    SP,C.143            ;                                        6859
  11279.     PUSHJ    SP,TT%CHAR
  11280.     MOVE    AC14,AC16            ;                                        6860
  11281.     ILDB    AC14,AC14
  11282.     SUBI    AC14,40
  11283.     JRST    L.489                ;                                        6852
  11284. L.487:    SETZ    AC14,                ;                                        6865
  11285.     PUSH    SP,C.142            ;                                        6866
  11286.     PUSHJ    SP,TT%TEXT
  11287.     MOVE    AC2,AC16            ;                                        6867
  11288.     ILDB    AC1,AC2
  11289.     PUSH    SP,AC1
  11290.     PUSHJ    SP,TT%CHAR
  11291.     PUSH    SP,C.143            ;                                        6868
  11292.     PUSHJ    SP,TT%CHAR
  11293.     ILDB    AC1,AC16            ;                                        6869
  11294.     SUBI    AC1,40
  11295.     DPB    AC1,C.123
  11296.     PUSH    SP,C.142            ;                                        6870
  11297.     PUSHJ    SP,TT%TEXT
  11298.     MOVE    AC2,AC16            ;                                        6871
  11299.     ILDB    AC1,AC2
  11300.     PUSH    SP,AC1
  11301.     PUSHJ    SP,TT%CHAR
  11302.     PUSH    SP,C.143            ;                                        6872
  11303.     PUSHJ    SP,TT%CHAR
  11304.     MOVE    AC2,AC16            ;                                        6873
  11305.     ILDB    AC1,AC2
  11306.     SUBI    AC1,40
  11307.     DPB    AC1,C.124
  11308.     ADJSP    SP,-3                ;                                        6864
  11309.     JRST    L.489                ;                                        6852
  11310. L.488:    SETZ    AC14,                ;                                        6878
  11311.     PUSH    SP,C.142            ;                                        6879
  11312.     PUSHJ    SP,TT%TEXT
  11313.     MOVE    AC2,AC16            ;                                        6880
  11314.     ILDB    AC1,AC2
  11315.     PUSH    SP,AC1
  11316.     PUSHJ    SP,TT%CHAR
  11317.     PUSH    SP,C.143            ;                                        6881
  11318.     PUSHJ    SP,TT%CHAR
  11319.     ILDB    AC1,AC16            ;                                        6882
  11320.     SUBI    AC1,40
  11321.     DPB    AC1,C.125
  11322.     PUSH    SP,C.142            ;                                        6883
  11323.     PUSHJ    SP,TT%TEXT
  11324.     MOVE    AC2,AC16            ;                                        6884
  11325.     ILDB    AC1,AC2
  11326.     PUSH    SP,AC1
  11327.     PUSHJ    SP,TT%CHAR
  11328.     PUSH    SP,C.143            ;                                        6885
  11329.     PUSHJ    SP,TT%CHAR
  11330.     ILDB    AC1,AC16            ;                                        6886
  11331.     SUBI    AC1,40
  11332.     DPB    AC1,C.123
  11333.     PUSH    SP,C.142            ;                                        6887
  11334.     PUSHJ    SP,TT%TEXT
  11335.     MOVE    AC2,AC16            ;                                        6888
  11336.     ILDB    AC1,AC2
  11337.     PUSH    SP,AC1
  11338.     PUSHJ    SP,TT%CHAR
  11339.     PUSH    SP,C.143            ;                                        6889
  11340.     PUSHJ    SP,TT%CHAR
  11341.     ILDB    AC1,AC16            ;                                        6890
  11342.     SUBI    AC1,40
  11343.     DPB    AC1,C.124
  11344.     ADJSP    SP,-6                ;                                        6877
  11345. L.489:    PUSH    SP,C.145            ;                                        6894
  11346.     PUSHJ    SP,TT%TEXT
  11347.     MOVEM    AC14,0(SP)            ;                                        6895
  11348.     PUSHJ    SP,TT%NUMBER
  11349.     PUSH    SP,C.127            ;                                        6896
  11350.     PUSHJ    SP,TT%TEXT
  11351.     PUSHJ    SP,TT%CRLF            ;                                        6897
  11352.     MOVEM    AC0,0(SP)            ;                                        6898
  11353.     PUSHJ    SP,TT%SET%OUTPUT
  11354.     ADJSP    SP,-16                ;                                        6696
  11355.     POP    SP,AC16                ;                                        6657
  11356.     POP    SP,AC14
  11357.     POP    SP,AC13
  11358.     POP    SP,AC12
  11359.     POP    SP,AC11
  11360.     POP    SP,AC10
  11361.     POP    SP,AC0
  11362.     POPJ    SP,
  11363. C.123:    POINT    6,AC14,29
  11364. C.124:    POINT    6,AC14,35
  11365. C.125:    POINT    4,AC14,23
  11366. C.126:    XWD    0,U.117
  11367. C.127:    XWD    0,U.119
  11368. C.128:    XWD    0,U.118
  11369. C.129:    XWD    0,U.120
  11370. C.130:    XWD    0,U.105
  11371. C.131:    XWD    0,U.106
  11372. C.132:    XWD    0,U.107
  11373. C.133:    XWD    0,U.108
  11374. C.134:    XWD    0,U.109
  11375. C.135:    XWD    0,U.111
  11376. C.136:    XWD    0,U.110
  11377. C.137:    XWD    0,U.112
  11378. C.138:    XWD    0,U.113
  11379. C.139:    XWD    0,U.116
  11380. C.140:    XWD    0,U.115
  11381. C.141:    XWD    0,U.123
  11382. C.142:    XWD    0,U.124
  11383. C.143:    EXP    42
  11384. C.144:    XWD    0,U.121
  11385. C.145:    XWD    0,U.122
  11386.  
  11387. ; Routine Size:  279 words
  11388.  
  11389. ;   6900  1    %SBTTL 'End of KERMSG'
  11390. ;   6901  1    END
  11391. ;   6902  1
  11392. ;   6903  0    ELUDOM
  11393.  
  11394. ; Low  segment length:     555 words
  11395. ; High segment length:    4095 words
  11396.  
  11397. ; Compilation Complete
  11398.  
  11399.     END
  11400.