; 0001 0 %TITLE 'KERMSG - Kermit message processing' ; 0002 0 MODULE KERMSG (IDENT = '3.3.109' ; 0003 0 ) = ; 0004 1 BEGIN ; 0005 1 ; 0006 1 SWITCHES LANGUAGE (COMMON); ; 0007 1 ; 0008 1 ! ; 0009 1 ; 0010 1 !++ ; 0011 1 ! FACILITY: ; 0012 1 ! Kermit-10, VMS Kermit, Pro/Kermit ; 0013 1 ! ; 0014 1 ! ABSTRACT: ; 0015 1 ! KERMSG is the message processing routines for Kermit-10, VMS Kermit, ; 0016 1 ! and PRO/Kermit. ; 0017 1 ! This module is written in common BLISS, so that it can be ; 0018 1 ! transported for the DECsystem-10 and VAX/VMS systems. ; 0019 1 ! ; 0020 1 ! ENVIRONMENT: ; 0021 1 ! User mode ; 0022 1 ! ; 0023 1 ! AUTHOR: Robert C. McQueen, CREATION DATE: 24-January-1983 ; 0024 1 ! ; 0025 1 ! MODIFIED BY: ; 0026 1 ! ; 0027 1 !-- ; 0028 1 ; 0029 1 %SBTTL 'Table of Contents' ; 0030 1 !+ ; 0031 1 !.pag.lit ; 0032 1 ! Table of Contents for KERMSG ; 0033 1 ! ; 0034 1 ! ; 0035 1 ! Section Page ; 0036 1 ! 1. Revision History . . . . . . . . . . . . . . . . . . . 3 ; 0037 1 ! 2. Interface requirements . . . . . . . . . . . . . . . . 4 ; 0038 1 ! 3. Declarations ; 0039 1 ! 3.1. Forward definitions . . . . . . . . . . . . . 5 ; 0040 1 ! 4. Require files. . . . . . . . . . . . . . . . . . . . . 28 ; 0041 1 ! 5. Macro definitions. . . . . . . . . . . . . . . . . . . 29 ; 0042 1 ! 6. KERMIT Protocol Definitions. . . . . . . . . . . . . . 30 ; 0043 1 ! 6.1. Packet offsets. . . . . . . . . . . . . . . . 31 ; 0044 1 ! 6.2. Message dependent field . . . . . . . . . . . 32 ; 0045 1 ! 6.3. SEND initiate packet. . . . . . . . . . . . . 33 ; 0046 1 ! 7. KERMIT Protocol States . . . . . . . . . . . . . . . . 34 ; 0047 1 ! 8. Internal constants . . . . . . . . . . . . . . . . . . 35 ; 0048 1 ! 9. Storage - External . . . . . . . . . . . . . . . . . . 36 ; 0049 1 ! 10. Storage - Local. . . . . . . . . . . . . . . . . . . . 37 ; 0050 1 ! 11. External references. . . . . . . . . . . . . . . . . . 38 ; 0051 1 ! 12. MSG%INIT . . . . . . . . . . . . . . . . . . . . . . . 39 ; 0052 1 ! 13. SND%ERROR. . . . . . . . . . . . . . . . . . . . . . . 40 ; 0053 1 ! 14. SERVER - Server mode . . . . . . . . . . . . . . . . . 41 ; 0054 1 ! 15. SEND%SWITCH. . . . . . . . . . . . . . . . . . . . . . 42 ; 0055 1 ! 16. REC%SWITCH . . . . . . . . . . . . . . . . . . . . . . 43 ; 0056 1 ! 17. Server ; 0057 1 ! 17.1. DO%GENERIC - Execute a generic command. . . . 44 ; 0058 1 ! 18. DO%TRANSACTION - Main loop for FSM . . . . . . . . . . 45 ; 0059 1 ! 19. REC%SERVER%IDLE - Idle server state. . . . . . . . . . 46 ; 0060 1 ! 20. SEND%SERVER%INIT . . . . . . . . . . . . . . . . . . . 47 ; 0061 1 ! 21. SEND%DATA. . . . . . . . . . . . . . . . . . . . . . . 48 ; 0062 1 ! 22. SEND%FILE. . . . . . . . . . . . . . . . . . . . . . . 49 ; 0063 1 ! 23. SEND%EOF . . . . . . . . . . . . . . . . . . . . . . . 50 ; 0064 1 ! 24. SEND%INIT. . . . . . . . . . . . . . . . . . . . . . . 51 ; 0065 1 ! 25. SEND%OPEN%FILE - Open file for sending . . . . . . . . 52 ; 0066 1 ! 26. SEND%GENCMD. . . . . . . . . . . . . . . . . . . . . . 53 ; 0067 1 ! 27. SEND%BREAK . . . . . . . . . . . . . . . . . . . . . . 54 ; 0068 1 ! 28. REC%INIT . . . . . . . . . . . . . . . . . . . . . . . 55 ; 0069 1 ! 29. REC%FILE . . . . . . . . . . . . . . . . . . . . . . . 56 ; 0070 1 ! 30. REC%DATA . . . . . . . . . . . . . . . . . . . . . . . 57 ; 0071 1 ! 31. SERVER - Generic commands. . . . . . . . . . . . . . . 58 ; 0072 1 ! 32. HOST%COMMAND - perform a host command. . . . . . . . . 59 ; 0073 1 ! 33. CALL%SY%RTN - handle operating system dependent functions 60 ; 0074 1 ! 34. Message processing ; 0075 1 ! 34.1. PRS%SEND%INIT - Parse send init params. . . . 61 ; 0076 1 ! 35. SET%SEND%INIT. . . . . . . . . . . . . . . . . . . . . 62 ; 0077 1 ! 36. SEND%PACKET. . . . . . . . . . . . . . . . . . . . . . 63 ; 0078 1 ! 37. REC%MESSAGE - Receive a message. . . . . . . . . . . . 64 ; 0079 1 ! 38. REC%PACKET . . . . . . . . . . . . . . . . . . . . . . 65 ; 0080 1 ! 39. CALC%BLOCK%CHECK . . . . . . . . . . . . . . . . . . . 66 ; 0081 1 ! 40. NORMALIZE%FILE - Put file name into normal form. . . . 67 ; 0082 1 ! 41. Buffer filling ; 0083 1 ! 41.1. Main routine. . . . . . . . . . . . . . . . . 68 ; 0084 1 ! 42. BFR%EMPTY. . . . . . . . . . . . . . . . . . . . . . . 69 ; 0085 1 ! 43. Buffer filling and emptying subroutines. . . . . . . . 70 ; 0086 1 ! 44. Add parity routine . . . . . . . . . . . . . . . . . . 71 ; 0087 1 ! 45. Parity routine . . . . . . . . . . . . . . . . . . . . 72 ; 0088 1 ! 46. Per transfer ; 0089 1 ! 46.1. Initialization. . . . . . . . . . . . . . . . 73 ; 0090 1 ! 47. Statistics ; 0091 1 ! 47.1. Finish message transfer . . . . . . . . . . . 74 ; 0092 1 ! 48. Status type out ; 0093 1 ! 48.1. STS%OUTPUT. . . . . . . . . . . . . . . . . . 75 ; 0094 1 ! 49. TYPE%CHAR - Type out a character . . . . . . . . . . . 76 ; 0095 1 ! 50. Debugging ; 0096 1 ! 50.1. DBG%SEND. . . . . . . . . . . . . . . . . . . 77 ; 0097 1 ! 50.2. DBG%RECEIVE . . . . . . . . . . . . . . . . . 78 ; 0098 1 ! 50.3. DBG%MESSAGE . . . . . . . . . . . . . . . . . 79 ; 0099 1 ! 51. End of KERMSG. . . . . . . . . . . . . . . . . . . . . 80 ; 0100 1 !.end lit.pag ; 0101 1 !- ; 0102 1 %SBTTL 'Revision History' ; 0103 1 ; 0104 1 !++ ; 0105 1 ! Start of version 1. ; 0106 1 ! ; 0107 1 ! 1.0.000 By: Robert C. McQueen On: 4-Jan-1983 ; 0108 1 ! Create this program. ; 0109 1 ! ; 0110 1 ! 1.0.001 By: Robert C. McQueen On: 30-Apr-1983 ; 0111 1 ! Change PAR%xxx to be PR%xxx, so that they can be used for ; 0112 1 ! KERMIT-10. ; 0113 1 ! ; 0114 1 ! 1.0.002 By: Robert C. McQueen On: 1-May-1983 ; 0115 1 ! Add DO%GENERIC routine to cause a generic Kermit command to ; 0116 1 ! be executed on the remote Kermit. ; 0117 1 ! ; 0118 1 ! 1.0.003 By: Robert C. McQueen On: 3-May-1983 ; 0119 1 ! Fix message number incrementing. ; 0120 1 ! ; 0121 1 ! 1.0.004 By: Robert C. McQueen On: 4-May-1983 ; 0122 1 ! Allow RECEIVE file-specification to work correctly. ; 0123 1 ! ; 0124 1 ! 1.0.005 By: Robert C. McQueen On: 6-May-1983 ; 0125 1 ! Add more stats support. ; 0126 1 ! ; 0127 1 ! 1.0.006 By: Nick Bush On: 13-June-1983 ; 0128 1 ! Fix SEND%PACKET to copy correct characters when fixing ; 0129 1 ! parity bits. ; 0130 1 ! ; 0131 1 ! 1.1.007 By: Nick Bush On: 15-July-1983 ; 0132 1 ! Correct SEND-INIT message handling to do the right things ; 0133 1 ! with the protocol version 3 items. ; 0134 1 ! ; 0135 1 ! 1.1.010 By: Robert C. McQueen On: 20-July-1983 ; 0136 1 ! Make PARITY a global routine, so that it can be called by ; 0137 1 ! CONNECT processing. Change the name from PARITY to GEN%PARITY ; 0138 1 ! add a new routine to generate the parity, since it is not ; 0139 1 ! part of the checksum. ; 0140 1 ! ; 0141 1 ! 1.1.011 By: Robert C. McQueen On: 28-July-1983 ; 0142 1 ! KER%TIMEOUT errors in the SERVER loop would cause ; 0143 1 ! KER%UNISRV error messages to be returned to the remote. ; 0144 1 ! Check for receive failures and send NAKs instead. ; 0145 1 ! ; 0146 1 ! 1.2.012 By: Robert C. McQueen On: 23-August-1983 ; 0147 1 ! Don't abort if we get a message that is just an end of line ; 0148 1 ! character. It could be noise on the line. ; 0149 1 ! ; 0150 1 ! 1.2.013 By: Nick Bush On: 7-September-1983 ; 0151 1 ! Fix several problems with the SEND%xxx parameters ; 0152 1 ! ; 0153 1 ! 1.2.014 By: Robert C. McQueen On: 15-September-1983 ; 0154 1 ! Add routine calls to XFR%STATUS to tell the user on the ; 0155 1 ! number of packets have changed. ; 0156 1 ! ; 0157 1 ! 1.2.015 By: Nick Bush On: 5-October-1983 ; 0158 1 ! Add 2 and 3 character checksum (block check) support. ; 0159 1 ! Add support for data within acknowledgement packets ; 0160 1 ! and withing end-of-file packets to allow for file ; 0161 1 ! transmission to be aborted. Also add support for ; 0162 1 ! "I" packet to allow server parameters to be initialized. ; 0163 1 ! ; 0164 1 ! 1.2.016 By: Nick Bush On: 19-October-1983 ; 0165 1 ! Add repeat character support. ; 0166 1 ! ; 0167 1 ! 2.0.017 Release TOPS-10 Kermit-10 version 2.0 ; 0168 1 ! Release VAX/VMS Kermit-32 version 2.0 ; 0169 1 ! ; 0170 1 ! 2.0.018 By: Robert C. McQueen On: 16-November-1983 ; 0171 1 ! Fix four checks on the message number that were not ; 0172 1 ! mod 64. ; 0173 1 ! ; 0174 1 ! 2.0.019 By: Robert C. McQueen On: 16-November-1983 ; 0175 1 ! Remove the CLEAR routine. It is not really needed. ; 0176 1 ! ; 0177 1 ! 2.0.020 By: Nick Bush On: 12-Dec-1983 ; 0178 1 ! Fix SEND%DATA and BFR%FILL to handle empty files and ; 0179 1 ! files which happen to end just on a message boundary. ; 0180 1 ! This would sometimes produce extra nulls. ; 0181 1 ! ; 0182 1 ! 2.0.021 By: Nick Bush On: 15-Dec-1983 ; 0183 1 ! Fix some problems with REC%MESSAGE which would cause ; 0184 1 ! aborts when a message timed out. ; 0185 1 ! ; 0186 1 ! 2.0.022 By: Robert C. McQueen 19-Dec-1983 ; 0187 1 ! Make STATUS a local for most routines and remove FILE%DUMP ; 0188 1 ! as it is nolonger needed. ; 0189 1 ! ; 0190 1 ! 2.0.023 By: Nick Bush On: 3-Jan-1984 ; 0191 1 ! Change FIL%NORMAL%FORM to contain not just a flag, but ; 0192 1 ! a file name type instead. ; 0193 1 ! ; 0194 1 ! 2.0.024 By: Nick Bush On: 11-Jan-1984 ; 0195 1 ! Fix REC%MESSAGE to send NAK for packet we expect, not ; 0196 1 ! previous packet. ; 0197 1 ! ; 0198 1 ! 2.0.025 By: Nick Bush On: 23-Jan-1984 ; 0199 1 ! Re-enable server-init packet and complete code so that ; 0200 1 ! parameters set by it will remain set. ; 0201 1 ! Fix file name copying to use BFR%FILL or BFR%EMPTY ; 0202 1 ! so that all quoting/compression is done properly. ; 0203 1 ! ; 0204 1 ! 2.0.026 By: Nick Bush On: 15-Feb-1984 ; 0205 1 ! Add code for generic command support (both directions). ; 0206 1 ! There is now only one state dispatch loop, entered ; 0207 1 ! in various states for different functions. ; 0208 1 ! ; 0209 1 ! 2.0.027 By: Robert C. McQueen On: 16-Feb-1984 ; 0210 1 ! At some point SEND%TIMEOUT became global, but it was not moved ; 0211 1 ! to KERGLB. This edit moves it to KERGLB.BLI. ; 0212 1 ! ; 0213 1 ! 2.0.030 By: Nick Bush On: 2-March-1984 ; 0214 1 ! Fix BFR%FILL to handle case of last repeated character ; 0215 1 ! not fitting within a packet. It was forgetting to ; 0216 1 ! send the characters at all. ; 0217 1 ! ; 0218 1 ! 2.0.031 By: Nick Bush On: 6-March-1984 ; 0219 1 ! Make sure FILE%OPEN%FLAG is set properly when advancing ; 0220 1 ! to next file of a wild-card send. The file was not ; 0221 1 ! being set true, leading to problems after a couple files. ; 0222 1 ! ; 0223 1 ! 2.0.032 By: Nick Bush On: 9-March-1984 ; 0224 1 ! Fix UNPACK%DATA in SERVER%GENERIC to properly store ; 0225 1 ! new string pointer. ; 0226 1 ! ; 0227 1 ! 2.0.033 By: Robert C. McQueen On: 12-March-1984 ; 0228 1 ! If NEXT%FILE fails with anything other than a NOMORFILES ; 0229 1 ! it should change state to STATE%A not STATE%SB. This ; 0230 1 ! fixes a problem caused by Pro/Kermit and KERFIL (VMS). ; 0231 1 ! ; 0232 1 ! 2.0.034 By: Nick Bush On: 15-March-1984 ; 0233 1 ! Put file spec into X packet as well as F packet. This ; 0234 1 ! makes wild card TYPE's work nicer. ; 0235 1 ! ; 0236 1 ! 2.0.035 By: Nick Bush On: 20-March-1984 ; 0237 1 ! Fix send/receive quoting to conform to the way the ; 0238 1 ! protocol manual says it should be done, rather ; 0239 1 ! than the way we (and Kermit-20) have always done it. ; 0240 1 ! ; 0241 1 ! 2.0.036 By: Nick Bush On: 28-March-1984 ; 0242 1 ! Make SERVER%GENERIC more defensive against badly ; 0243 1 ! constructed packets. If an argument has negative ; 0244 1 ! length, punt the request. Also put angle brackets ; 0245 1 ! around data from "X" packet header, so file names will ; 0246 1 ! stick out. ; 0247 1 ! ; 0248 1 ! 3.0.037 Start of version 3. ; 0249 1 ! ; 0250 1 ! 3.0.040 By: Nick Bush On: 2-April-1984 ; 0251 1 ! Add separate server timeout. This allows stopping the ; 0252 1 ! server NAK's without affecting the normal packet timeout. ; 0253 1 ! ; 0254 1 ! 3.0.041 By: Nick Bush On: 12-April-1984 ; 0255 1 ! Fix block check calculation to account for the fact ; 0256 1 ! that the parity bits are put onto the message when ; 0257 1 ! it is sent (in place), so that if a retransmission is ; 0258 1 ! done without refilling the buffer (as is normal with ; 0259 1 ! data messages), the parity bits will be there. Make ; 0260 1 ! sure we strip them out for block check calculation. ; 0261 1 ! ; 0262 1 ! 3.1.042 By: Nick Bush On: 27-August-1984 ; 0263 1 ! If we get too many retries when sending a server init (I) ; 0264 1 ! packet, don't abort. Instead, just try sending the server ; 0265 1 ! command, since the Kermit on the other end might be coded ; 0266 1 ! wrong and is responding to packets it doesn't understand ; 0267 1 ! with a NAK. ; 0268 1 ! ; 0269 1 ! 3.1.043 By: Nick Bush On: 27-August-1984 ; 0270 1 ! Don't abort receives on zero length messages. Just treat ; 0271 1 ! it like a timeout. ; 0272 1 ! ; 0273 1 ! 3.1.044 By: Nick Bush On: 10-April-1985 ; 0274 1 ! Remove IBM mode. It will be instituted by IBM%CHAR being ; 0275 1 ! set >= 0 if handshaking is needed. ; 0276 1 ! ; 0277 1 ! 3.1.045 BY: David Stevens On: 15-July-1985 ; 0278 1 ! Fix terminal message for multiple file sendings. Type out ; 0279 1 ! "Sending: " in the system dependent NEXT%FILE routine. ; 0280 1 ! ; 0281 1 ! Start of version 3.2 ; 0282 1 ! ; 0283 1 ! 3.2.070 By: Robert McQueen On: 17-Dec-1985 ; 0284 1 ! Fix CRC calculations when sending 8 bit data and not ; 0285 1 ! using 8 bit quoting. ; 0286 1 ! ; 0287 1 ! 3.2.071 By: Robert McQueen On: 11-March-186 ; 0288 1 ! Include space in the message buffer for the line termination ; 0289 1 ! character. ; 0290 1 ! ; 0291 1 ! 3.3.100 By: Gregory P. Welsh On: 1-June-1986 ; 0292 1 ! Made FILE%OPEN%FLAG GLOBAL so it could be updated properly for ; 0293 1 ! Transmit function from module KERTRM. Also renamed it to ; 0294 1 ! FFILE%OPEN%FLAG so it could be distinguished externally from ; 0295 1 ! routine FILE%OPEN. ; 0296 1 ! ; 0297 1 ! 3.3.104 By: Robert McQueen On: 5-July-1986 ; 0298 1 ! Add changes/fixes suggested by Art Guion and David Deley for ; 0299 1 ! KERMSG.BLI. ; 0300 1 ! - Always attempt a handshake in IBM mode. Failing to handshake ; 0301 1 ! may cause 3704/5 style controller to hang a VM system. ; 0302 1 ! - Don't lose the last character in a buffer. BFR%FILL logic ; 0303 1 ! forgets to send the last cahracters of a file when it doesn't ; 0304 1 ! fit into the current packet. ; 0305 1 ! ; 0306 1 ! 3.3.107 By: Antonino N. Mione On: 8-Sep-1986 ; 0307 1 ! Do not abort on ERROR packet while in SERVER mode. Instead, ; 0308 1 ! return to SERVER IDLE mode. ; 0309 1 ! ; 0310 1 ! 3.3.108 By: Dan Norstedt On: 17-June-1989 ; 0311 1 ! Added sketchy support for Extended Length packets; ; 0312 1 ! Header parity is computed, but not used. ; 0313 1 ! Undone 3.3.107, to allow for Ctrl-Cs to work properly ; 0314 1 ! ; 0315 1 ! 3.3.109 By: Nick Bush On: 24-April-2006 ; 0316 1 ! Added comment to line fixed by Mike Freeman many ; 0317 1 ! years ago to officialize the edit history. The fix ; 0318 1 ! corrected the CRC support to handle parity settings ; 0319 1 ! properly. ; 0320 1 !-- ; 0321 1 ; 0322 1 %SBTTL 'Interface requirements' ; 0323 1 ; 0324 1 !++ ; 0325 1 ! Interface requirements ; 0326 1 ! ; 0327 1 ! The following routines and data locations are rquired for a correct ; 0328 1 ! implementation of KERMIT. ; 0329 1 ! ; 0330 1 ! File routines: ; 0331 1 ! ; 0332 1 ! FILE%OPEN (Function) ; 0333 1 ! This routine will open a file for reading or writting. It ; 0334 1 ! will assume that FILE%SIZE contains the number of bytes ; 0335 1 ! and FILE%NAME contains the file name of length FILE%SIZE. ; 0336 1 ! The function that is passed is either FNC%READ or FNC%WRITE. ; 0337 1 ! ; 0338 1 ! FILE%CLOSE () ; 0339 1 ! This routine will close the currently open file. This ; 0340 1 ! routine will return the status of the operation. ; 0341 1 ! ; 0342 1 ! GET%FILE (Character) ; 0343 1 ! This routine will get a character from the currently open file ; 0344 1 ! and store it in the location specified by "Character". There ; 0345 1 ! will be a true/false value returned by the routine to determine ; 0346 1 ! if there was an error. ; 0347 1 ! ; 0348 1 ! PUT%FILE (Character) ; 0349 1 ! This routine will output a character to the currently open ; 0350 1 ! file. It will return a true/false value to determine if the ; 0351 1 ! routine was successful. ; 0352 1 ! ; 0353 1 ! NEXT%FILE () ; 0354 1 ! This routine will advance to the next file. This routine ; 0355 1 ! will return false if there are no more files to process. ; 0356 1 ! ; 0357 1 ! Communications line routines: ; 0358 1 ! ; 0359 1 ! RECEIVE (Buffer address, Address of var to store length into) ; 0360 1 ! This routine will receive a message from the remote Kermit. ; 0361 1 ! ; 0362 1 ! SEND (Buffer address, Length in characters) ; 0363 1 ! This routine will send a message to the remote Kermit. ; 0364 1 ! ; 0365 1 ! GEN%CRC (Buffer address, length in characters) ; 0366 1 ! This routine will calculate the CRC-CCITT for the characters ; 0367 1 ! in the buffer. ; 0368 1 ! ; 0369 1 ! Operating system routines: ; 0370 1 ! ; 0371 1 ! SY%DISMISS (Seconds) ; 0372 1 ! This routine will cause Kermit to sleep for the specified ; 0373 1 ! number of seconds. It is used to handle the DELAY parameter. ; 0374 1 ! ; 0375 1 ! SY%LOGOUT () ; 0376 1 ! Log the job off of the system. (Kill the process). ; 0377 1 ! ; 0378 1 ! SY%TIME () ; 0379 1 ! This routine will return the starting time milliseconds. ; 0380 1 ! It can be the start of Kermit, the system, etc, so long ; 0381 1 ! as it always is incrementing. ; 0382 1 ! ; 0383 1 ! Status routines: ; 0384 1 ! ; 0385 1 ! XFR%STATUS (Type, Subtype); ; 0386 1 ! This routine is called to indicate the occurance of ; 0387 1 ! a significant event that the user interface may wish ; 0388 1 ! to inform the user about. The arguments indicate the ; 0389 1 ! type of event. ; 0390 1 ! Type: "S" - Send, "R" - Receive ; 0391 1 ! Subtype: "P" - Packet ; 0392 1 ! "N" - NAK ; 0393 1 ! "T" - timeout ; 0394 1 ! For type = "I" (initiate), "T" (terminate): ; 0395 1 ! Subtype: "S" - a file send ; 0396 1 ! "R" - a file receive ; 0397 1 ! "G" - a generic command ; 0398 1 ! "I" - for "T" only, returning to server idle ; 0399 1 ! For type = "F" (file operation): ; 0400 1 ! Subtype: "S" - open for sending ; 0401 1 ! "R" - open for receiving ; 0402 1 ! "C" - closing file OK ; 0403 1 ! "X" - aborting file by user request ; 0404 1 ! "Z" - aborting group by user request ; 0405 1 ! "D" - aborting file, but saving due to disposition ; 0406 1 ! "A" - aborting file due to protocol error ; 0407 1 ! ; 0408 1 ! Error processing: ; 0409 1 ! ; 0410 1 ! KRM%ERROR (Error parameter) ; 0411 1 ! This routine will cause an error message to be issued. ; 0412 1 ! The error parameter is defined by KERERR. This may cause ; 0413 1 ! SND%ERROR to be called to send an "E" message to the remote. ; 0414 1 ! ; 0415 1 ! Terminal I/O routines: ; 0416 1 ! ; 0417 1 ! TERM%DUMP (Buffer, Count) ; 0418 1 ! DBG%DUMP (Buffer, Count) ; 0419 1 ! This routine will dump the buffer onto the user's terminal. ; 0420 1 ! The routine is supplied with the count of the characters ; 0421 1 ! and the address of the buffer. ; 0422 1 ! These may be the same routine or different. DBG%DUMP ; 0423 1 ! is only called for debugging output. ; 0424 1 ! ; 0425 1 ! ; 0426 1 ! ENTRY POINTS ; 0427 1 ! ; 0428 1 ! KERMSG contains the following entry points for the KERMIT. ; 0429 1 ! ; 0430 1 ! SERVER () ; 0431 1 ! This routine will cause KERMIT go enter server mode. ; 0432 1 ! ; 0433 1 ! SEND%SWITCH () ; 0434 1 ! This routine will send a file. It expects that the user ; 0435 1 ! has stored the text of the file name into FILE%NAME and ; 0436 1 ! the length of the text into FILE%SIZE. ; 0437 1 ! ; 0438 1 ! REC%SWITCH () ; 0439 1 ! This routine will receive a file. It expects that the default ; 0440 1 ! file name is set up in FILE%NAME and the length is in ; 0441 1 ! FILE%SIZE. ; 0442 1 ! ; 0443 1 ! GEN%PARITY (Character) ; 0444 1 ! This routine will return the character with the proper parity ; 0445 1 ! on the character. ; 0446 1 ! ; 0447 1 ! SND%ERROR (COUNT, ADDRESS) ; 0448 1 ! This routine will send the text of an error to the remote ; 0449 1 ! Kermit. ; 0450 1 ! ; 0451 1 ! DO%GENERIC (TYPE) ; 0452 1 ! This routine will cause a generic function to be sent to ; 0453 1 ! the remote Kermit. This routine will then do all of the ; 0454 1 ! necessary hand shaking to handle the local end of the generic ; 0455 1 ! Kermit command. ; 0456 1 ! ; 0457 1 ! ; 0458 1 ! GLOBAL Storage ; 0459 1 ! ; 0460 1 ! The following are the global storage locations that are used to interface ; 0461 1 ! to KERMSG. These locations contains the various send and receive parameters. ; 0462 1 ! ; 0463 1 ! Receive parameters: ; 0464 1 ! ; 0465 1 ! RCV%PKT%SIZE ; 0466 1 ! Receive packet size. ; 0467 1 ! RCV%NPAD ; 0468 1 ! Padding length ; 0469 1 ! RCV%PADCHAR ; 0470 1 ! Padding character ; 0471 1 ! RCV%TIMEOUT ; 0472 1 ! Time out ; 0473 1 ! RCV%EOL ; 0474 1 ! End of line character ; 0475 1 ! RCV%QUOTE%CHR ; 0476 1 ! Quote character ; 0477 1 ! RCV%8QUOTE%CHR ; 0478 1 ! 8-bit quoting character ; 0479 1 ! RCV%SOH ; 0480 1 ! Start of header character ; 0481 1 ! ; 0482 1 ! Send parameters (Negative values denote the default, positive user supplied): ; 0483 1 ! ; 0484 1 ! SND%PKT%SIZE ; 0485 1 ! Send packet size ; 0486 1 ! SND%NPAD ; 0487 1 ! Padding length ; 0488 1 ! SND%PADCHAR ; 0489 1 ! Padding character ; 0490 1 ! SND%TIMEOUT ; 0491 1 ! Time out ; 0492 1 ! SND%EOL ; 0493 1 ! End of line character ; 0494 1 ! SND%QUOTE%CHR ; 0495 1 ! Quote character ; 0496 1 ! SND%SOH ; 0497 1 ! Start of header character (normally 001) ; 0498 1 ! ; 0499 1 ! Statistics: ; 0500 1 ! ; 0501 1 ! SND%TOTAL%CHARS ; 0502 1 ! Total characters sent for this Kermit session ; 0503 1 ! RCV%TOTAL%CHARS ; 0504 1 ! Total characters received for this Kermit session ; 0505 1 ! SND%DATA%CHARS ; 0506 1 ! Total number of data characters sent for this Kermit session ; 0507 1 ! RCV%DATA%CHARS ; 0508 1 ! Total number of data characters received for this Kermit session ; 0509 1 ! SND%COUNT ; 0510 1 ! Total number of packets that have been sent ; 0511 1 ! RCV%COUNT ; 0512 1 ! Total number of packets that have been received. ; 0513 1 ! SMSG%TOTAL%CHARS ; 0514 1 ! Total characters sent for this file transfer ; 0515 1 ! RMSG%TOTAL%CHARS ; 0516 1 ! Total characters received for this file transfer ; 0517 1 ! SMSG%DATA%CHARS ; 0518 1 ! Total data characters sent for this file transfer ; 0519 1 ! RMSG%DATA%CHARS ; 0520 1 ! Total data characters received for this file transfer ; 0521 1 ! SMSG%NAKS ; 0522 1 ! Total number of NAKs sent for this file transfer ; 0523 1 ! RMSG%NAKS ; 0524 1 ! Total number of NAKs received for this file transfer ; 0525 1 ! XFR%TIME ; 0526 1 ! Amount of time the last transfer took in milliseconds. ; 0527 1 ! TOTAL%TIME ; 0528 1 ! Total amount of time spend transfering data. ; 0529 1 ! ; 0530 1 ! Misc constants: ; 0531 1 ! ; 0532 1 ! LAST%ERROR ; 0533 1 ! ASCIZ of the last error message issued. ; 0534 1 ! FILE%NAME ; 0535 1 ! Vector containing the ASCII characters of the file name. ; 0536 1 ! FILE%SIZE ; 0537 1 ! Number of characters in the FILE%NAME vector. ; 0538 1 ! DELAY ; 0539 1 ! Amount of time to delay ; 0540 1 ! DUPLEX ; 0541 1 ! DP%HALF or DP%FULL to denote either half duplex or full duplex. ; 0542 1 ! [Currently only DP%FULL is supported] ; 0543 1 ! PKT%RETRIES ; 0544 1 ! Number of retries to attempt to read a message. ; 0545 1 ! SI%RETRIES ; 0546 1 ! Number of retries to attempt on send inits ; 0547 1 ! DEBUG%FLAG ; 0548 1 ! Debugging mode on/off ; 0549 1 ! WARN%FLAG ; 0550 1 ! File warning flag ; 0551 1 ! IBM%FLAG ; 0552 1 ! True if talking to an IBM system, else false. ; 0553 1 ! ECHO%FLAG ; 0554 1 ! Local echo flag ; 0555 1 ! CONNECT%FLAG ; 0556 1 ! Connected flag; True if terminal and SET LINE are the same ; 0557 1 ! PARITY%TYPE ; 0558 1 ! Type of parity to use on sends. ; 0559 1 ! DEV%PARITY%FLAG ; 0560 1 ! Device will add parity to message. True if device adds ; 0561 1 ! parity and false if we must do it. ; 0562 1 ! FLAG%FILE%OPEN ; 0563 1 ! File is opened. ; 0564 1 ! ; 0565 1 !-- ; 0566 1 ; 0567 1 %SBTTL 'Declarations -- Forward definitions' ; 0568 1 ! ; 0569 1 ! ; 0570 1 ! Forward definitions ; 0571 1 ! ; 0572 1 ; 0573 1 FORWARD ROUTINE ; 0574 1 ; 0575 1 ! Main loop for a complete transaction ; 0576 1 DO%TRANSACTION, ! Perform a complete transaction ; 0577 1 ; 0578 1 ! Send processing routines ; 0579 1 ; 0580 1 SEND%SERVER%INIT, ![026] Send a server init packet ; 0581 1 SEND%DATA, ! Send data to the micro ; 0582 1 SEND%FILE, ! Send file name ; 0583 1 SEND%OPEN%FILE, ! Open file for sending ; 0584 1 SEND%GENCMD, ! Send generic command ; 0585 1 SEND%EOF, ! Send EOF ; 0586 1 SEND%INIT, ! Send initialization msg ; 0587 1 SEND%BREAK, ! Send break end of transmission ; 0588 1 ; 0589 1 ! Receive processing routines ; 0590 1 ; 0591 1 REC%SERVER%IDLE, ! Wait for message while server is idle ; 0592 1 REC%INIT, ! Receive initialization ; 0593 1 REC%FILE, ! Receive file information ; 0594 1 REC%DATA, ! Receive data ; 0595 1 ! ; 0596 1 ! Server processing routines ; 0597 1 ! ; 0598 1 SERVER%GENERIC, ! Process generic KERMIT commands ; 0599 1 HOST%COMMAND, ! Process host command ; 0600 1 KERMIT%COMMAND, ! Process Kermit command ; 0601 1 CALL%SY%RTN, ! Handle calling system routine and returning result ; 0602 1 ! ; 0603 1 ! Statistic gathering routines ; 0604 1 ! ; 0605 1 END%STATS : NOVALUE, ! End of a message processing stats routine ; 0606 1 ; 0607 1 ! Low level send/receive routines ; 0608 1 ; 0609 1 CALC%BLOCK%CHECK, ! Routine to calculate the block check value ; 0610 1 SET%SEND%INIT : NOVALUE, ! Set up the MSG%SND%INIT parameters. ; 0611 1 PRS%SEND%INIT, ! Parse MSG%SND%INIT parameters. ; 0612 1 DO%PARITY : NOVALUE, ! Routine to generate parity for a message ; 0613 1 GEN%PARITY, ! Routine to add parity to a character ; 0614 1 SEND%PACKET, ! Send a packet to the remote ; 0615 1 REC%MESSAGE, ! Receive a message with retry processing ; 0616 1 REC%PACKET, ! Receive a packet from the remote ; 0617 1 ; 0618 1 ! Utility routines ; 0619 1 ; 0620 1 NORMALIZE%FILE : NOVALUE, ! Force file name into normal form ; 0621 1 BFR%EMPTY, ! Empty the data buffer ; 0622 1 BFR%FILL, ! Fill the data buffer from a file ; 0623 1 SET%STRING, ![025] Routine to set alternate get/put routines ; 0624 1 ! for use with in memory strings ; 0625 1 TYPE%CHAR, ! Type a character from a packet ; 0626 1 INIT%XFR : NOVALUE, ! Initialize the per transfer processing ; 0627 1 STS%OUTPUT : NOVALUE, ! Output current transfer status ; 0628 1 ! ; 0629 1 ! Debugging routines ; 0630 1 ! ; 0631 1 DBG%MESSAGE : NOVALUE, ! Type out a formatted message ; 0632 1 DBG%SEND : NOVALUE, ! Send message debugging routine ; 0633 1 DBG%RECEIVE : NOVALUE; ! Receive message debugging routine ; 0634 1 %SBTTL 'Require files' ; 0635 1 ; 0636 1 ! ; 0637 1 ! ; 0638 1 ! ; 0639 1 ! REQUIRE FILES: ; 0640 1 ! ; 0641 1 ; L 0642 1 %IF %BLISS (BLISS32) ; U 0643 1 %THEN ; U 0644 1 ; U 0645 1 LIBRARY 'SYS$LIBRARY:STARLET'; ; U 0646 1 ; 0647 1 %FI ; 0648 1 ; 0649 1 REQUIRE 'KERCOM'; ; 0854 1 ; 0855 1 REQUIRE 'KERERR'; ; 0878 1 ; 0879 1 %SBTTL 'Macro definitions' ; 0880 1 ! ; 0881 1 ! MACROS: ; 0882 1 ! ; 0883 1 ; 0884 1 MACRO ; M 0885 1 CTL (C) = ; 0886 1 ((C) XOR %O'100')%, ; M 0887 1 CHAR (C) = ; 0888 1 ((C) + %O'40')%, ; M 0889 1 UNCHAR (C) = ; 0890 1 ((C) - %O'40')%; ; 0891 1 ; 0892 1 %SBTTL 'KERMIT Protocol Definitions' ; 0893 1 ; 0894 1 !++ ; 0895 1 ! The following describes the various items that are found in the ; 0896 1 ! KERMIT messages. A complete and through desription of the protocol can be ; 0897 1 ! found in the KERMIT PROTOCOL MANUAL. ; 0898 1 ! ; 0899 1 ! ; 0900 1 ! All KERMIT messages have the following format: ; 0901 1 ! ; 0902 1 ! ; 0903 1 ! ; 0904 1 ! ; 0905 1 ! Normally SOH (Control-A, octal 001). ; 0906 1 ! ; 0907 1 ! ; 0908 1 ! Count of the number of characters following this position. ; 0909 1 ! Character counts of ONLY 0 to 94 are valid. ; 0910 1 ! [108] Charavcter count = 0 means extended length type packet. ; 0911 1 ! ; 0912 1 ! ; 0913 1 ! Packet sequence number, modulo 100 (octal). ; 0914 1 ! ; 0915 1 ! [108] ; 0916 1 ! [108] Packet type, usually a mnemonic ASCII character. ; 0917 1 ! [108] ; 0918 1 ! [108] For Extended Length packets only: ; 0919 1 ! [108] ; 0920 1 ! [108] Count of the number of characters / 95, from (HeaderCheck) ; 0921 1 ! [108] ; 0922 1 ! [108] ; 0923 1 ! [108] Count of the number of characters MOD 95, from (HeaderCheck) ; 0924 1 ! [108] ; 0925 1 ! [108] ; 0926 1 ! [108] Kermit type-1 checksum of the 5 preceding ASCII characters. ; 0927 1 ! ; 0928 1 ! ; 0929 1 ! This field contains the message dependent information. There can ; 0930 1 ! be multiple fields in this section. See the KERMIT Protocol document ; 0931 1 ! for a complete description of this. ; 0932 1 ! ; 0933 1 ! ; 0934 1 ! A block check on the characters in the packet between, but not ; 0935 1 ! including, the mark and the checksum itself. It may be one to three ; 0936 1 ! characters, depending upon the type agreed upon. ; 0937 1 ! ; 0938 1 ! 1. Single character arithmetic sum equal to: ; 0939 1 ! chksum = (s + ((s AND 300)/100)) AND 77 ; 0940 1 ! Character sent is CHAR(chksum). ; 0941 1 ! ; 0942 1 ! 2. Two character arithmetic sum. CHAR of bits 6-11 are the first ; 0943 1 ! character, CHAR of bits 0-5 are the second character. ; 0944 1 ! ; 0945 1 ! 3. Three character CRC-CCITT. First character is CHAR of bits 12-15, ; 0946 1 ! second is CHAR of bits 6-11, third is CHAR of bits 0-5. ; 0947 1 ! ; 0948 1 ! ; 0949 1 ! ; 0950 1 ! End of line. Any line terminator that may be required by the host. ; 0951 1 !-- ; 0952 1 ; 0953 1 %SBTTL 'KERMIT Protocol Definitions -- Packet offsets' ; 0954 1 ; 0955 1 !++ ; 0956 1 ! The following define the various offsets of the standard KERMIT ; 0957 1 ! packets. ; 0958 1 !-- ; 0959 1 ; 0960 1 LITERAL ; 0961 1 PKT%MARK = 0, ! ; 0962 1 PKT%COUNT = 1, ! ; 0963 1 PKT%SEQ = 2, ! ; 0964 1 PKT%TYPE = 3, ! ; 0965 1 PKT%MSG = 4, ! ; 0966 1 PKT%COUNTX1 = 4, ! [108] ! Ext. pkt: ; 0967 1 PKT%COUNTX2 = 5, ! [108] ! Ext. pkt: ; 0968 1 PKT%HCHECK = 6, ! [108] ! Ext. pkt: Header parity ; 0969 1 PKT%MSGX = 7, ! [108] ! ; 0970 1 PKT%MAX%MSG = 94 - 5, ! Maximum size of the message dependent ; 0971 1 ! information ; 0972 1 PKT%CHKSUM = 0, ! offset from end of ; 0973 1 ! Message dependent information ; 0974 1 PKT%EOL = 1, ! offset from end of data ; 0975 1 ! [108] PKT%OVR%HEAD%B = 2, ! Header overhead ; 0976 1 ! [108] PKT%OVR%HEAD%E = 1, ! Overhead at the end ; 0977 1 PKT%OVR%HEAD = 3, ! Overhead added to data length ; 0978 1 PKT%TOT%OVR%HEAD = 6; ! Total overhead of the message ; 0979 1 ; 0980 1 %SBTTL 'KERMIT Protocol Definitions -- Message dependent field' ; 0981 1 ; 0982 1 !++ ; 0983 1 ! The MESSAGE-DEPENDENT information field of the message contains at ; 0984 1 ! least one part. That is the type of message. The remainder of the message ; 0985 1 ! MESSAGE-DEPENDENT field is different depending on the message. ; 0986 1 ! ; 0987 1 ! ; 0988 1 ! ; 0989 1 ! ; 0990 1 ! The type defines the type of message that is being processed. ; 0991 1 ! ; 0992 1 !-- ; 0993 1 ; 0994 1 ! Protocol version 1.0 message types ; 0995 1 ; 0996 1 LITERAL ; 0997 1 MSG%DATA = %C'D', ! Data packet ; 0998 1 MSG%ACK = %C'Y', ! Acknowledgement ; 0999 1 MSG%NAK = %C'N', ! Negative acknowledgement ; 1000 1 MSG%SND%INIT = %C'S', ! Send initiate ; 1001 1 MSG%BREAK = %C'B', ! Break transmission ; 1002 1 MSG%FILE = %C'F', ! File header ; 1003 1 MSG%EOF = %C'Z', ! End of file (EOF) ; 1004 1 MSG%ERROR = %C'E'; ! Error ; 1005 1 ; 1006 1 ! Protocol version 2.0 message types ; 1007 1 ; 1008 1 LITERAL ; 1009 1 MSG%RCV%INIT = %C'R', ! Receive initiate ; 1010 1 MSG%COMMAND = %C'C', ! Host command ; 1011 1 MSG%GENERIC = %C'G', ! Generic KERMIT command. ; 1012 1 MSG%KERMIT = %C'K'; ! Perform KERMIT command (text) ; 1013 1 ; 1014 1 ! Protocol version 4.0 message types ; 1015 1 ; 1016 1 LITERAL ; 1017 1 MSG%SER%INIT = %C'I', ! Server initialization ; 1018 1 MSG%TEXT = %C'X'; ! Text header message ; 1019 1 ; 1020 1 !++ ; 1021 1 ! Generic KERMIT commands ; 1022 1 !-- ; 1023 1 ; 1024 1 LITERAL ; 1025 1 MSG%GEN%LOGIN = %C'I', ! Login ; 1026 1 MSG%GEN%EXIT = %C'F', ! Finish (exit to OS) ; 1027 1 MSG%GEN%CONNECT = %C'C', ! Connect to a directory ; 1028 1 MSG%GEN%LOGOUT = %C'L', ! Logout ; 1029 1 MSG%GEN%DIRECTORY = %C'D', ! Directory ; 1030 1 MSG%GEN%DISK%USAGE = %C'U', ! Disk usage ; 1031 1 MSG%GEN%DELETE = %C'E', ! Delete a file ; 1032 1 MSG%GEN%TYPE = %C'T', ! Type a file specification ; 1033 1 ! MSG%GEN%SUBMIT = %C'S', ! Submit ; 1034 1 ! MSG%GEN%PRINT = %C'P', ! Print ; 1035 1 MSG%GEN%WHO = %C'W', ! Who's logged in ; 1036 1 MSG%GEN%SEND = %C'M', ! Send a message to a user ; 1037 1 MSG%GEN%HELP = %C'H', ! Help ; 1038 1 MSG%GEN%QUERY = %C'Q', ! Query status ; 1039 1 MSG%GEN%RENAME = %C'R', ! Rename file ; 1040 1 MSG%GEN%COPY = %C'K', ! Copy file ; 1041 1 MSG%GEN%PROGRAM = %C'P', ! Run program and pass data ; 1042 1 MSG%GEN%JOURNAL = %C'J', ! Perform journal functions ; 1043 1 MSG%GEN%VARIABLE = %C'V'; ! Return/set variable state ; 1044 1 ; 1045 1 ! ; 1046 1 ! Acknowledgement modifiers (protocol 4.0) ; 1047 1 ! ; 1048 1 ; 1049 1 LITERAL ; 1050 1 MSG%ACK%ABT%CUR = %C'X', ! Abort current file ; 1051 1 MSG%ACK%ABT%ALL = %C'Z'; ! Abort entire stream of files ; 1052 1 ; 1053 1 ! ; 1054 1 ! End of file packet modifier ; 1055 1 ! ; 1056 1 ; 1057 1 LITERAL ; 1058 1 MSG%EOF%DISCARD = %C'D'; ! Discard data from previous file ; 1059 1 ; 1060 1 %SBTTL 'KERMIT Protocol Definitions -- SEND initiate packet' ; 1061 1 ; 1062 1 !++ ; 1063 1 ! ; 1064 1 ! The following describes the send initiate packet. All fields in the message ; 1065 1 ! data area are optional. ; 1066 1 ! ; 1067 1 ! <"S"> ; 1068 1 ! <8-bit-quote> ; 1069 1 ! ; 1070 1 ! BUFSIZ ; 1071 1 ! Sending Kermit's maximum buffer size. ; 1072 1 ! ; 1073 1 ! Timeout ; 1074 1 ! Number of seconds after which the sending Kermit wishes to be timed out ; 1075 1 ! ; 1076 1 ! Npad ; 1077 1 ! Number of padding caracters the sending Kermit needs preceding each ; 1078 1 ! packet. ; 1079 1 ! ; 1080 1 ! PAD ; 1081 1 ! Padding character. ; 1082 1 ! ; 1083 1 ! EOL ; 1084 1 ! A line terminator required on all packets set by the receiving ; 1085 1 ! Kermit. ; 1086 1 ! ; 1087 1 ! Quote ; 1088 1 ! The printable ASCII characer the sending Kermit will use when quoting ; 1089 1 ! the control cahracters. Default is "#". ; 1090 1 ! ; 1091 1 ! 8-bit-quote ; 1092 1 ! Specify quoting mecanism for 8-bit quantities. A quoting mecanism is ; 1093 1 ! mecessary when sending to hosts which prevent the use of the 8th bit ; 1094 1 ! for data. When elected, the quoting mechanism will be used by both ; 1095 1 ! hosts, and the quote character must be in the range of 41-76 or 140-176 ; 1096 1 ! octal, but different from the control-quoting character. This field is ; 1097 1 ! interpreted as follows: ; 1098 1 ! ; 1099 1 ! "Y" - I agree to 8-bit quoting if you request it. ; 1100 1 ! "N" - I will not do 8-bit quoting. ; 1101 1 ! "&" - (or any other character in the range of 41-76 or 140-176) I want ; 1102 1 ! to do 8-bit quoting using this character (it will be done if the ; 1103 1 ! other Kermit puts a "Y" in this field. ; 1104 1 ! Anything else: Quoting will not be done. ; 1105 1 ! ; 1106 1 ! Check-type ; 1107 1 ! Type of block check. The only values presently allowed in this ; 1108 1 ! field are "1", "2" or "3". Future implementations may allow other ; 1109 1 ! values. Interpretation of the values is: ; 1110 1 ! ; 1111 1 ! "1" - Single character checksum. Default value if none specified. ; 1112 1 ! "2" - Double character checksum. ; 1113 1 ! "3" - Three character CRC. ; 1114 1 ! ; 1115 1 ! Repeat-count-processing ; 1116 1 ! The prefix character to be used to indicate a repeated character. ; 1117 1 ! This can be any printable cahracter other than blank (which denotes ; 1118 1 ! no repeat count). ; 1119 1 ! ; 1120 1 ! [108] Capability byte(s) ; 1121 1 ! [108] Bit mask containing extra capabilities, currently we only use ; 1122 1 ! [108] bit 1 (extended-length packets) and bit 0 (more capability ; 1123 1 ! [108] bytes follows). ; 1124 1 ! [108] ; 1125 1 ! [108] Window length (not used) ; 1126 1 ! [108] ; 1127 1 ! [108] Extended packet length ; 1128 1 ! [108] Maximum length for extended-length packets ; 1129 1 ! ; 1130 1 !-- ; 1131 1 ; 1132 1 LITERAL ; 1133 1 P%SI%BUFSIZ = 0, ! Buffersize ; 1134 1 MY%PKT%SIZE = 80, ! My packet size ; 1135 1 P%SI%TIMOUT = 1, ! Time out ; 1136 1 MY%TIME%OUT = 60, ! [046] Increased ! My time out ; 1137 1 P%SI%NPAD = 2, ! Number of padding characters ; 1138 1 MY%NPAD = 0, ! Amount of padding I require ; 1139 1 P%SI%PAD = 3, ! Padding character ; 1140 1 MY%PAD%CHAR = 0, ! My pad character ; 1141 1 P%SI%EOL = 4, ! End of line character ; 1142 1 MY%EOL%CHAR = %O'015', ! My EOL cahracter ; 1143 1 P%SI%QUOTE = 5, ! Quote character ; 1144 1 MY%QUOTE%CHAR = %C'#', ! My quoting character ; 1145 1 P%SI%8QUOTE = 6, ! 8-bit quote ; 1146 1 MY%8BIT%QUOTE = %C'&', ! Don't do it ; 1147 1 P%SI%CHKTYPE = 7, ! Checktype used ; 1148 1 MY%CHKTYPE = CHK%1CHAR, ! Use single character checksum ; 1149 1 P%SI%REPEAT = 8, ! Repeat character ; 1150 1 MY%REPEAT = %C'~', ! My repeat character ; 1151 1 P%SI%LENGTH = 9, ! Length of the std message ; 1152 1 ! [108] ; 1153 1 P%SI%CAPAS = 9, ! [108] ! Capability field (if used) ; 1154 1 EXTLEN%CAPAS = 2, ! [108] ! Extended length packets ; 1155 1 P%SI%WINDO = 10, ! [108] ! (Send only) Not used, filler ; 1156 1 P%SI%MAXLX1 = 11, ! [108] ! (Send only) Ext. len / 95 ; 1157 1 MY%MAXLX1 = 0, ! [108] ; 1158 1 P%SI%MAXLX2 = 12, ! [108] ! (Send only) Ext. len MOD 95 ; 1159 1 MY%MAXLX2 = 80, ! [108] ; 1160 1 ! [108] ; 1161 1 P%SI%XLENGTH = 13; ! [108] ! (Send only) Len of ext. msg ; 1162 1 ; 1163 1 %SBTTL 'KERMIT Protocol States' ; 1164 1 ; 1165 1 !++ ; 1166 1 ! The following are the various states that KERMIT can be in. ; 1167 1 ! The state transitions are defined in the KERMIT Protocol manual. ; 1168 1 !-- ; 1169 1 ; 1170 1 LITERAL ; 1171 1 STATE%MIN = 1, ! Min state number ; 1172 1 STATE%S = 1, ! Send init state ; 1173 1 STATE%SF = 2, ! Send file header ; 1174 1 STATE%SD = 3, ! Send file data packet ; 1175 1 STATE%SZ = 4, ! Send EOF packet ; 1176 1 STATE%SB = 5, ! Send break ; 1177 1 STATE%R = 6, ! Receive state (wait for send-init) ; 1178 1 STATE%RF = 7, ! Receive file header packet ; 1179 1 STATE%RD = 8, ! Receive file data packet ; 1180 1 STATE%C = 9, ! Send complete ; 1181 1 STATE%A = 10, ! Abort ; 1182 1 STATE%SX = 11, ! Send text header ; 1183 1 STATE%SG = 12, ! Send generic command ; 1184 1 STATE%SI = 13, ! Send server init ; 1185 1 STATE%ID = 14, ! Server idle loop ; 1186 1 STATE%II = 15, ! Server idle after server init ; 1187 1 STATE%FI = 16, ! Server should exit ; 1188 1 STATE%LG = 17, ! Server should logout ; 1189 1 STATE%OF = 18, ! Send - open first input file ; 1190 1 STATE%EX = 19, ! Exit back to command parser ; 1191 1 STATE%ER = 20, ! Retries exceeded error ; 1192 1 STATE%MAX = 20; ! Max state number ; 1193 1 ; 1194 1 %SBTTL 'Internal constants' ; 1195 1 ; 1196 1 !++ ; 1197 1 ! The following represent various internal KERMSG constants. ; 1198 1 !-- ; 1199 1 ; 1200 1 LITERAL ; 1201 1 MAX%PKT%RETRIES = 16, ! Maximum packet retries ; 1202 1 MAX%SI%RETRIES = 5; ! Maximum send init retries ; 1203 1 ; 1204 1 %SBTTL 'Storage - External' ; 1205 1 ! ; 1206 1 ! OWN STORAGE: ; 1207 1 ! ; 1208 1 ; 1209 1 EXTERNAL ; 1210 1 ! ; 1211 1 ! Receive parameters ; 1212 1 ! ; 1213 1 RCV%PKT%SIZE, ! Receive packet size ; 1214 1 RCV%NPAD, ! Padding length ; 1215 1 RCV%PADCHAR, ! Padding character ; 1216 1 RCV%TIMEOUT, ! Time out ; 1217 1 RCV%EOL, ! EOL character ; 1218 1 RCV%QUOTE%CHR, ! Quote character ; 1219 1 RCV%SOH, ! Start of header character ; 1220 1 RCV%8QUOTE%CHR, ! 8-bit quoting character ; 1221 1 ! ; 1222 1 ! Miscellaneous parameters ; 1223 1 ! ; 1224 1 SET%REPT%CHR, ! Repeat character ; 1225 1 ! ; 1226 1 ! Send parameters ; 1227 1 ! ; 1228 1 SND%PKT%SIZE, ! Send packet size ; 1229 1 SND%NPAD, ! Padding length ; 1230 1 SND%PADCHAR, ! Padding character ; 1231 1 SND%TIMEOUT, ! Time out ; 1232 1 SND%EOL, ! EOL character ; 1233 1 SND%QUOTE%CHR, ! Quote character ; 1234 1 SND%SOH, ! Start of header character ; 1235 1 SEND%TIMEOUT, ! Time to wait for receiving message ; 1236 1 ! ; 1237 1 ! Server parameters ; 1238 1 ! ; 1239 1 SRV%TIMEOUT, ! Time between NAK's when server is idle ; 1240 1 ! ; 1241 1 ! Statistics ; 1242 1 ! ; 1243 1 SND%TOTAL%CHARS, ! Total characters sent ; 1244 1 RCV%TOTAL%CHARS, ! Total characters received ; 1245 1 SND%DATA%CHARS, ! Total number of data characters sent ; 1246 1 RCV%DATA%CHARS, ! Total number of data characters received ; 1247 1 SND%NAKS, ! Total NAKs sent ; 1248 1 RCV%NAKS, ! Total NAKs received ; 1249 1 SND%COUNT, ! Count of total number of packets ; 1250 1 RCV%COUNT, ! Count of total number packets received ; 1251 1 SMSG%COUNT, ! Total number of packets sent ; 1252 1 RMSG%COUNT, ! Total number of packets received ; 1253 1 SMSG%TOTAL%CHARS, ! Total chars sent this file xfer ; 1254 1 RMSG%TOTAL%CHARS, ! Total chars rcvd this file xfer ; 1255 1 SMSG%DATA%CHARS, ! Total data chars this file xfer ; 1256 1 RMSG%DATA%CHARS, ! Total data chars this file xfer ; 1257 1 SMSG%NAKS, ! Total number of NAKs this file xfer ; 1258 1 RMSG%NAKS, ! Total number of NAKs received ; 1259 1 XFR%TIME, ! Amount of time last xfr took ; 1260 1 TOTAL%TIME, ! Total time of all xfrs ; 1261 1 ! this file xfer ; 1262 1 LAST%ERROR : VECTOR [CH$ALLOCATION (MAX%MSG + 1)], ! Last error message ; 1263 1 ! ; 1264 1 ! Misc constants. ; 1265 1 ! ; 1266 1 FILE%NAME : VECTOR [CH$ALLOCATION (MAX%FILE%NAME)], ; 1267 1 FILE%SIZE, ; 1268 1 SI%RETRIES, ! Send init retries to attempt ; 1269 1 PKT%RETRIES, ! Number of retries to try for a message ; 1270 1 DELAY, ! Amount of time to delay ; 1271 1 DUPLEX, ! Type of connection (half or full) ; 1272 1 PARITY%TYPE, ! Type of parity to use ; 1273 1 DEV%PARITY%FLAG, ! True if output device does ; 1274 1 ! parity, false if we do it ; 1275 1 CHKTYPE, ! Type of block check desired ; 1276 1 ABT%FLAG, ! True if aborted file should be discarded ; 1277 1 DEBUG%FLAG, ! Debugging mode on/off ; 1278 1 WARN%FLAG, ! File warning flag ; 1279 1 IBM%CHAR, ! Turnaround character for IBM mode ; 1280 1 ECHO%FLAG, ! Local echo flag ; 1281 1 CONNECT%FLAG, ! Connected flag; True if ; 1282 1 ! terminal and SET LINE are ; 1283 1 ! the same ; 1284 1 ABT%CUR%FILE, ! Abort current file ; 1285 1 ABT%ALL%FILE, ! Abort all files in stream ; 1286 1 TYP%STS%FLAG, ! Type status next message ; 1287 1 TY%FIL, ! Type file specs ; 1288 1 TY%PKT, ! Type packet info ; 1289 1 FIL%NORMAL%FORM, ! If true, file names should be normalized ; 1290 1 GEN%1DATA : VECTOR [CH$ALLOCATION (MAX%MSG)], ! Data for generic command ; 1291 1 GEN%1SIZE, ! Size of data in GEN%1DATA ; 1292 1 GEN%2DATA : VECTOR [CH$ALLOCATION (MAX%MSG)], ! Second argument for generic command ; 1293 1 GEN%2SIZE, ! Size of data in GEN%2DATA ; 1294 1 GEN%3DATA : VECTOR [CH$ALLOCATION (MAX%MSG)], ! Third arg for generic command ; 1295 1 GEN%3SIZE; ! Size of data in GEN%3DATA ; 1296 1 ; 1297 1 %SBTTL 'Storage - Local' ; 1298 1 ! ; 1299 1 ! LOCAL OWN STORAGE: ; 1300 1 ! ; 1301 1 ; 1302 1 OWN ; 1303 1 ! ; 1304 1 ! Receive parameters ; 1305 1 ! ; 1306 1 RECV%8QUOTE%CHR, ! 8th-bit quoting character ; 1307 1 REPT%CHR, ! Repeat prefix character ; 1308 1 RECV%PKT%MSG, ! [108] ! Msg offset (4 std, 7 ext.) ; 1309 1 ! ; 1310 1 ! Send parameters ; 1311 1 ! ; 1312 1 SEND%PKT%SIZE, ! Send packet size ; 1313 1 SEND%NPAD, ! Padding length ; 1314 1 SEND%PADCHAR, ! Padding character ; 1315 1 SEND%EOL, ! EOL character ; 1316 1 SEND%QUOTE%CHR, ! Quote character ; 1317 1 SEND%8QUOTE%CHR, ! 8-bit quoting character ; 1318 1 SEND%INIT%SIZE, ! Size of INIT message ; 1319 1 ! ; 1320 1 ! Misc parameters ; 1321 1 ! ; 1322 1 INI%CHK%TYPE, ! Type of block checking from init message ; 1323 1 BLK%CHK%TYPE, ! Type of block check to use ; 1324 1 FLAG%8QUOTE, ! Flag to determine if doing 8bit quoting ; 1325 1 FLAG%REPEAT, ! True if doing repeated character compression ; 1326 1 STATE, ! Current state ; 1327 1 SIZE, ! Size of the current message ; 1328 1 ! [108] Negative len for ext msgs ; 1329 1 OLD%RETRIES, ! Saved number of retries done. ; 1330 1 NUM%RETRIES, ! Number of retries ; 1331 1 MSG%NUMBER, ! Current message number ; 1332 1 REC%SEQ, ! Sequence number of msg in REC%MSG ; 1333 1 REC%LENGTH, ! Length of the message recv'd ; 1334 1 REC%TYPE, ! Type of the message received. ; 1335 1 REC%MSG : VECTOR [CH$ALLOCATION (MAX%MSG + 1, CHR%SIZE)], ! Message received ; 1336 1 SND%MSG : VECTOR [CH$ALLOCATION (MAX%MSG + 1, CHR%SIZE)], ! Message sent ; 1337 1 FILE%CHARS, ! Number of characters sent or received ; 1338 1 TEXT%HEAD%FLAG, ! Text header received, not file header ; 1339 1 NO%FILE%NEEDED, ! Don't open a file ; 1340 1 INIT%PKT%SENT, ! Server-init sent and ACKed ; 1341 1 GEN%TYPE, ! Command message type ; 1342 1 GEN%SUBTYPE, ! Generic command subtype ; 1343 1 GET%CHR%ROUTINE, ! Address of routine to get a character for BFR%FILL ; 1344 1 PUT%CHR%ROUTINE; ! Address of routine to put a character for BFR%EMPTY ; 1345 1 ! ; 1346 1 ! KERMSG Global storage ; 1347 1 ! ; 1348 1 GLOBAL ; 1349 1 FLAG%FILE%OPEN; ! File is opened. ; 1350 1 ; 1351 1 %SBTTL 'External references' ; 1352 1 ! ; 1353 1 ! EXTERNAL REFERENCES: ; 1354 1 ! ; 1355 1 ! Packet I/O routines ; 1356 1 ; 1357 1 EXTERNAL ROUTINE ; 1358 1 SEND, ! Send a packet to the remote ; 1359 1 IBM%WAIT, ! Wait for IBM turnaround ; 1360 1 RECEIVE; ! Receive a packet from the remote ; 1361 1 ; 1362 1 ! ; 1363 1 ! Terminal I/O routines ; 1364 1 ! ; 1365 1 ; 1366 1 EXTERNAL ROUTINE ; 1367 1 TERM%DUMP : NOVALUE, ! Normal terminal output ; 1368 1 DBG%DUMP : NOVALUE, ! Debugging output ; 1369 1 TT%SET%OUTPUT, ! Set output routine ; 1370 1 TT%CHAR : NOVALUE, ! Output a single character ; 1371 1 TT%CRLF : NOVALUE, ! Output a CRLF ; 1372 1 TT%NUMBER : NOVALUE, ! Output a three digit number to the ; 1373 1 ! terminal ; 1374 1 TT%TEXT : NOVALUE, ! Output a string to the user's ; 1375 1 TT%OUTPUT : NOVALUE; ! Force buffered output to terminal ; 1376 1 ; 1377 1 ! Operating system routines and misc routines ; 1378 1 ; 1379 1 EXTERNAL ROUTINE ; 1380 1 CRCCLC, ! Calculate a CRC-CCITT ; 1381 1 XFR%STATUS : NOVALUE, ! Routine to tell the user the ; 1382 1 ! status of a transfer ; 1383 1 KRM%ERROR : NOVALUE, ! Issue an error message ; 1384 1 SY%LOGOUT : NOVALUE, ! Log the job off ; 1385 1 SY%GENERIC, ! Perform a generic command ; 1386 1 SY%TIME, ! Return elapsed time in milliseconds ; 1387 1 SY%DISMISS : NOVALUE; ! Routine to dismiss for n seconds. ; 1388 1 ; 1389 1 ! ; 1390 1 ! External file processing routines ; 1391 1 ! ; 1392 1 ; 1393 1 EXTERNAL ROUTINE ; 1394 1 FILE%OPEN, ! Open a file for reading/writing ; 1395 1 FILE%CLOSE, ! Close an open file ; 1396 1 NEXT%FILE, ! Determine if there is a next file ; 1397 1 ! and open it for reading. ; 1398 1 GET%FILE, ! Get a byte from the file ; 1399 1 PUT%FILE; ! Put a byte in the file. ; 1400 1 ; 1401 1 %SBTTL 'MSG%INIT' ; 1402 1 ; 1403 1 GLOBAL ROUTINE MSG%INIT : NOVALUE = ; 1404 1 ; 1405 1 !++ ; 1406 1 ! FUNCTIONAL DESCRIPTION: ; 1407 1 ! ; 1408 1 ! This routine will initialize the message processing for ; 1409 1 ! KERMIT-32/36. ; 1410 1 ! ; 1411 1 ! CALLING SEQUENCE: ; 1412 1 ! ; 1413 1 ! MSG%INIT(); ; 1414 1 ! ; 1415 1 ! INPUT PARAMETERS: ; 1416 1 ! ; 1417 1 ! None. ; 1418 1 ! ; 1419 1 ! IMPLICIT INPUTS: ; 1420 1 ! ; 1421 1 ! None. ; 1422 1 ! ; 1423 1 ! OUTPUT PARAMETERS: ; 1424 1 ! ; 1425 1 ! None. ; 1426 1 ! ; 1427 1 ! IMPLICIT OUTPUTS: ; 1428 1 ! ; 1429 1 ! None. ; 1430 1 ! ; 1431 1 ! COMPLETION CODES: ; 1432 1 ! ; 1433 1 ! None. ; 1434 1 ! ; 1435 1 ! SIDE EFFECTS: ; 1436 1 ! ; 1437 1 ! None. ; 1438 1 ! ; 1439 1 !-- ; 1440 1 ; 1441 2 BEGIN ; 1442 2 ! ; 1443 2 ! Initialize some variables ; 1444 2 ! ; 1445 2 ! Receive parameters first ; 1446 2 ! ; 1447 2 RCV%PKT%SIZE = MY%PKT%SIZE; ; 1448 2 RCV%NPAD = MY%NPAD; ; 1449 2 RCV%PADCHAR = MY%PAD%CHAR; ; 1450 2 RCV%TIMEOUT = MY%TIME%OUT; ; 1451 2 RCV%EOL = MY%EOL%CHAR; ; 1452 2 RCV%QUOTE%CHR = MY%QUOTE%CHAR; ; 1453 2 RCV%SOH = CHR%SOH; ; 1454 2 RCV%8QUOTE%CHR = MY%8BIT%QUOTE; ; 1455 2 SET%REPT%CHR = MY%REPEAT; ; 1456 2 ! ; 1457 2 ! Send parameters. ; 1458 2 ! ; 1459 2 SND%PKT%SIZE = -MY%PKT%SIZE; ; 1460 2 SND%NPAD = -MY%NPAD; ; 1461 2 SND%PADCHAR = -MY%PAD%CHAR; ; 1462 2 SND%TIMEOUT = -MY%TIME%OUT; ; 1463 2 SND%EOL = -MY%EOL%CHAR; ; 1464 2 SND%QUOTE%CHR = -MY%QUOTE%CHAR; ; 1465 2 SND%SOH = CHR%SOH; ; 1466 2 ! ; 1467 2 ! Server parameters ; 1468 2 ! ; 1469 2 SRV%TIMEOUT = 5*MY%TIME%OUT; ; 1470 2 ! ; 1471 2 ! Other random parameters ; 1472 2 ! ; 1473 2 PKT%RETRIES = MAX%PKT%RETRIES; ! Number of retries per message ; 1474 2 SI%RETRIES = MAX%SI%RETRIES; ! Number of retries on send inits ; 1475 2 DELAY = INIT%DELAY; ; 1476 2 DUPLEX = DP%FULL; ! Use full duplex ; 1477 2 DEBUG%FLAG = FALSE; ; 1478 2 WARN%FLAG = FALSE; ; 1479 2 ECHO%FLAG = FALSE; ; 1480 2 BLK%CHK%TYPE = CHK%1CHAR; ! Start using single char checksum ; 1481 2 CHKTYPE = MY%CHKTYPE; ! Desired block check type ; 1482 2 INI%CHK%TYPE = .CHKTYPE; ! Same as default for now ; 1483 2 DEV%PARITY%FLAG = FALSE; ! We generate parity ; 1484 2 PARITY%TYPE = PR%NONE; ! No parity ; 1485 2 ABT%FLAG = TRUE; ! Discard incomplete files ; 1486 2 FLAG%FILE%OPEN = FALSE; ; 1487 2 IBM%CHAR = -1; ![044] No handsake by default ; 1488 2 TY%FIL = TRUE; ! Default to typing files ; 1489 2 TY%PKT = FALSE; ! But not packet numbers ; 1490 2 FIL%NORMAL%FORM = FNM%NORMAL; ! Default to normal form names ; 1491 2 GET%CHR%ROUTINE = GET%FILE; ![025] Initialize the get-a-char routine ; 1492 2 PUT%CHR%ROUTINE = PUT%FILE; ![025] And the put-a-char ; 1493 1 END; ! End of MSG%INIT TITLE KERMSG TWOSEG .REQUEST SYS:B361LB.REL RELOC 0 ; RECV%8QUOTE%CHR U.37: BLOCK 1 ; REPT%CHR U.38: BLOCK 1 ; RECV%PKT%MSG U.39: BLOCK 1 ; SEND%PKT%SIZE U.40: BLOCK 1 ; SEND%NPAD U.41: BLOCK 1 ; SEND%PADCHAR U.42: BLOCK 1 ; SEND%EOL U.43: BLOCK 1 ; SEND%QUOTE%CHR U.44: BLOCK 1 ; SEND%8QUOTE%CHR U.45: BLOCK 1 ; SEND%INIT%SIZE U.46: BLOCK 1 ; INI%CHK%TYPE U.47: BLOCK 1 ; BLK%CHK%TYPE U.48: BLOCK 1 ; FLAG%8QUOTE U.49: BLOCK 1 ; FLAG%REPEAT U.50: BLOCK 1 ; STATE U.51: BLOCK 1 ; SIZE U.52: BLOCK 1 ; OLD%RETRIES U.53: BLOCK 1 ; NUM%RETRIES U.54: BLOCK 1 ; MSG%NUMBER U.55: BLOCK 1 ; REC%SEQ U.56: BLOCK 1 ; REC%LENGTH U.57: BLOCK 1 ; REC%TYPE U.58: BLOCK 1 ; REC%MSG U.59: BLOCK 373 ; SND%MSG U.60: BLOCK 373 ; FILE%CHARS U.61: BLOCK 1 ; TEXT%HEAD%FLAG U.62: BLOCK 1 ; NO%FILE%NEEDED U.63: BLOCK 1 ; INIT%PKT%SENT U.64: BLOCK 1 ; GEN%TYPE U.65: BLOCK 1 ; GEN%SUBTYPE U.66: BLOCK 1 ; GET%CHR%ROUTINE U.67: BLOCK 1 ; PUT%CHR%ROUTINE U.68: BLOCK 1 FLAG%FILE%OPEN:: BLOCK 1 EXTERN RCV%PKT%SIZE, RCV%NPAD, RCV%PADCHAR, RCV%TIMEOUT, RCV%EOL, RCV%QUOTE%CHR, RCV%SOH EXTERN RCV%8QUOTE%CHR, SET%REPT%CHR, SND%PKT%SIZE, SND%NPAD, SND%PADCHAR, SND%TIMEOUT, SND%EOL EXTERN SND%QUOTE%CHR, SND%SOH, SEND%TIMEOUT, SRV%TIMEOUT, SND%TOTAL%CHARS, RCV%TOTAL%CHARS EXTERN SND%DATA%CHARS, RCV%DATA%CHARS, SND%NAKS, RCV%NAKS, SND%COUNT, RCV%COUNT, SMSG%COUNT EXTERN RMSG%COUNT, SMSG%TOTAL%CHARS, RMSG%TOTAL%CHARS, SMSG%DATA%CHARS, RMSG%DATA%CHARS, SMSG%NAKS EXTERN RMSG%NAKS, XFR%TIME, TOTAL%TIME, LAST%ERROR, FILE%NAME, FILE%SIZE, SI%RETRIES, PKT%RETRIES EXTERN DELAY, DUPLEX, PARITY%TYPE, DEV%PARITY%FLAG, CHKTYPE, ABT%FLAG, DEBUG%FLAG, WARN%FLAG EXTERN IBM%CHAR, ECHO%FLAG, CONNECT%FLAG, ABT%CUR%FILE, ABT%ALL%FILE, TYP%STS%FLAG, TY%FIL EXTERN TY%PKT, FIL%NORMAL%FORM, GEN%1DATA, GEN%1SIZE, GEN%2DATA, GEN%2SIZE, GEN%3DATA, GEN%3SIZE EXTERN SEND, IBM%WAIT, RECEIVE, TERM%DUMP, DBG%DUMP, TT%SET%OUTPUT, TT%CHAR, TT%CRLF, TT%NUMBER EXTERN TT%TEXT, TT%OUTPUT, CRCCLC, XFR%STATUS, KRM%ERROR, SY%LOGOUT, SY%GENERIC, SY%TIME EXTERN SY%DISMISS, FILE%OPEN, FILE%CLOSE, NEXT%FILE, GET%FILE, PUT%FILE FNM%NORMAL==: 1 FNM%FULL==: 2 FNM%UNTRAN==: 4 PR%MIN==: 0 PR%NONE==: 0 PR%MARK==: 1 PR%EVEN==: 2 PR%ODD==: 3 PR%SPACE==: 4 PR%MAX==: 4 GC%MIN==: 1 GC%EXIT==: 1 GC%DIRECTORY==: 2 GC%DISK%USAGE==: 3 GC%DELETE==: 4 GC%TYPE==: 5 GC%HELP==: 6 GC%LOGOUT==: 7 GC%LGN==: 10 GC%CONNECT==: 11 GC%RENAME==: 12 GC%COPY==: 13 GC%WHO==: 14 GC%SEND%MSG==: 15 GC%STATUS==: 16 GC%COMMAND==: 17 GC%KERMIT==: 20 GC%JOURNAL==: 21 GC%VARIABLE==: 22 GC%PROGRAM==: 23 GC%MAX==: 23 DP%FULL==: 0 DP%HALF==: 1 CHK%1CHAR==: 61 CHK%2CHAR==: 62 CHK%CRC==: 63 MAX%MSG==: 1752 AC0= 0 AC1= 1 AC2= 2 AC3= 3 AC4= 4 AC5= 5 AC6= 6 AC7= 7 AC10= 10 AC11= 11 AC12= 12 AC13= 13 AC14= 14 FP= 15 AC16= 16 SP= 17 RELOC 400000 MSG%INIT:: MOVEI AC1,120 ; 1447 MOVEM AC1,RCV%PKT%SIZE SETZM RCV%NPAD ; 1448 SETZM RCV%PADCHAR ; 1449 MOVEI AC1,74 ; 1450 MOVEM AC1,RCV%TIMEOUT MOVEI AC1,15 ; 1451 MOVEM AC1,RCV%EOL MOVEI AC1,43 ; 1452 MOVEM AC1,RCV%QUOTE%CHR MOVEI AC1,1 ; 1453 MOVEM AC1,RCV%SOH MOVEI AC1,46 ; 1454 MOVEM AC1,RCV%8QUOTE%CHR MOVEI AC1,176 ; 1455 MOVEM AC1,SET%REPT%CHR HRROI AC1,-120 ; 1459 MOVEM AC1,SND%PKT%SIZE SETZM SND%NPAD ; 1460 SETZM SND%PADCHAR ; 1461 HRROI AC1,-74 ; 1462 MOVEM AC1,SND%TIMEOUT HRROI AC1,-15 ; 1463 MOVEM AC1,SND%EOL HRROI AC1,-43 ; 1464 MOVEM AC1,SND%QUOTE%CHR MOVEI AC1,1 ; 1465 MOVEM AC1,SND%SOH MOVEI AC1,454 ; 1469 MOVEM AC1,SRV%TIMEOUT MOVEI AC1,20 ; 1473 MOVEM AC1,PKT%RETRIES MOVEI AC1,5 ; 1474 MOVEM AC1,SI%RETRIES MOVEI AC1,5 ; 1475 MOVEM AC1,DELAY SETZM DUPLEX ; 1476 SETZM DEBUG%FLAG ; 1477 SETZM WARN%FLAG ; 1478 SETZM ECHO%FLAG ; 1479 MOVEI AC1,61 ; 1480 MOVEM AC1,U.48 MOVEI AC1,61 ; 1481 MOVEM AC1,CHKTYPE MOVEM AC1,U.47 ; 1482 SETZM DEV%PARITY%FLAG ; 1483 SETZM PARITY%TYPE ; 1484 MOVEI AC1,1 ; 1485 MOVEM AC1,ABT%FLAG SETZM FLAG%FILE%OPEN ; 1486 SETOM IBM%CHAR ; 1487 MOVEI AC1,1 ; 1488 MOVEM AC1,TY%FIL SETZM TY%PKT ; 1489 MOVEI AC1,1 ; 1490 MOVEM AC1,FIL%NORMAL%FORM MOVEI AC1,GET%FILE ; 1491 MOVEM AC1,U.67 MOVEI AC1,PUT%FILE ; 1492 MOVEM AC1,U.68 POPJ SP, ; 1403 ; Routine Size: 61 words ; 1494 1 ; 1495 1 %SBTTL 'SND%ERROR' ; 1496 1 ; 1497 1 GLOBAL ROUTINE SND%ERROR (COUNT, ADDRESS) : NOVALUE = ; 1498 1 ; 1499 1 !++ ; 1500 1 ! FUNCTIONAL DESCRIPTION: ; 1501 1 ! ; 1502 1 ! This routine will send an error packet to the remote KERMIT. It ; 1503 1 ! is called with the count of characters and the address of the text. ; 1504 1 ! ; 1505 1 ! CALLING SEQUENCE: ; 1506 1 ! ; 1507 1 ! SND%ERROR(COUNT, %ASCII 'Error text'); ; 1508 1 ! ; 1509 1 ! INPUT PARAMETERS: ; 1510 1 ! ; 1511 1 ! None. ; 1512 1 ! ; 1513 1 ! IMPLICIT INPUTS: ; 1514 1 ! ; 1515 1 ! None. ; 1516 1 ! ; 1517 1 ! OUTPUT PARAMETERS: ; 1518 1 ! ; 1519 1 ! None. ; 1520 1 ! ; 1521 1 ! IMPLICIT OUTPUTS: ; 1522 1 ! ; 1523 1 ! None. ; 1524 1 ! ; 1525 1 ! COMPLETION CODES: ; 1526 1 ! ; 1527 1 ! None. ; 1528 1 ! ; 1529 1 ! SIDE EFFECTS: ; 1530 1 ! ; 1531 1 ! ; 1532 1 !-- ; 1533 1 ; 1534 2 BEGIN ; 1535 2 ! ; 1536 2 ! Pack the message into the buffer ; 1537 2 ! ; 1538 2 SET%STRING (CH$PTR (.ADDRESS), .COUNT, TRUE); ; 1539 2 BFR%FILL (TRUE); ; 1540 2 SET%STRING (0, 0, FALSE); ; 1541 2 ! ; 1542 2 ! Save the last error message also ; 1543 2 ! ; 1544 2 ; 1545 2 IF .COUNT GTR MAX%MSG THEN COUNT = MAX%MSG; ; 1546 2 ; 1547 2 CH$COPY (.COUNT, CH$PTR (.ADDRESS), 0, MAX%MSG + 1, CH$PTR (LAST%ERROR)); ; 1548 2 ; 1549 2 IF NOT SEND%PACKET (MSG%ERROR, .SIZE, .MSG%NUMBER) THEN RETURN KER%ABORTED; ; 1550 2 ; 1551 1 END; ! End of SND%ERROR SND%ERROR:: PUSH SP,AC14 ; 1497 PUSH SP,AC16 MOVE AC16,-3(SP) ; 1538 MOVEI AC1,-1(AC16) HRLI AC1,10700 PUSH SP,AC1 MOVE AC14,-5(SP) PUSH SP,AC14 PUSH SP,C.2 PUSHJ SP,U.30 PUSH SP,C.2 ; 1539 PUSHJ SP,U.29 SETZM -2(SP) ; 1540 SETZM -1(SP) SETZM 0(SP) PUSHJ SP,U.30 CAIG AC14,1752 ; 1545 JRST L.1 MOVEI AC1,1752 MOVEM AC1,-10(SP) L.1: MOVEI AC2,-1(AC16) ; 1547 HRLI AC2,10700 MOVE AC1,-10(SP) MOVEI AC4,1753 MOVE AC5,C.3 EXTEND AC1,C.1 JFCL PUSH SP,C.4 ; 1549 PUSH SP,U.52 PUSH SP,U.55 PUSHJ SP,U.24 ADJSP SP,-7 POP SP,AC16 ; 1497 POP SP,AC14 POPJ SP, C.1: MOVSLJ EXP 0 C.2: EXP 1 C.3: POINT 7,LAST%ERROR-1,34 C.4: EXP 105 ; Routine Size: 40 words ; 1552 1 ; 1553 1 %SBTTL 'SERVER - Server mode' ; 1554 1 ; 1555 1 GLOBAL ROUTINE SERVER = ; 1556 1 ; 1557 1 !++ ; 1558 1 ! FUNCTIONAL DESCRIPTION: ; 1559 1 ! ; 1560 1 ! This routine will handle the server function in the v2.0 protocol ; 1561 1 ! for KERMIT. This routine by it's nature will call various operating ; 1562 1 ! system routines to do things like logging off the system. ; 1563 1 ! ; 1564 1 ! CALLING SEQUENCE: ; 1565 1 ! ; 1566 1 ! EXIT%FLAG = SERVER(); ; 1567 1 ! ; 1568 1 ! INPUT PARAMETERS: ; 1569 1 ! ; 1570 1 ! None. ; 1571 1 ! ; 1572 1 ! IMPLICIT INPUTS: ; 1573 1 ! ; 1574 1 ! None. ; 1575 1 ! ; 1576 1 ! OUTPUT PARAMETERS: ; 1577 1 ! ; 1578 1 ! None. ; 1579 1 ! ; 1580 1 ! IMPLICIT OUTPUTS: ; 1581 1 ! ; 1582 1 ! None. ; 1583 1 ! ; 1584 1 ! COMPLETION CODES: ; 1585 1 ! ; 1586 1 ! None. ; 1587 1 ! ; 1588 1 ! SIDE EFFECTS: ; 1589 1 ! ; 1590 1 ! None. ; 1591 1 ! ; 1592 1 !-- ; 1593 1 ; 1594 2 BEGIN ; 1595 2 ; 1596 2 LOCAL ; 1597 2 STATUS; ! Status returned by various routines ; 1598 2 ; 1599 2 DO ; 1600 3 BEGIN ; 1601 3 INIT%XFR (); ; 1602 3 XFR%STATUS (%C'T', %C'I'); ! Now idle ; 1603 3 STATUS = DO%TRANSACTION (STATE%ID); ; 1604 3 END ; 1605 2 UNTIL .STATUS EQL KER%EXIT OR .STATUS EQL KER%ABORTED; ; 1606 2 ; 1607 2 RETURN .STATUS; ; 1608 1 END; ! End of GLOBAL ROUTINE SERVER SERVER::PUSH SP,AC16 ; 1555 L.2: PUSHJ SP,U.32 ; 1601 PUSH SP,C.5 ; 1602 PUSH SP,C.6 PUSHJ SP,XFR%STATUS PUSH SP,C.7 ; 1603 PUSHJ SP,U.1 MOVE AC16,AC1 ADJSP SP,-3 ; 1600 CAIN AC16,223 ; 1605 JRST L.3 CAIE AC16,312 JRST L.2 ; 1599 L.3: MOVE AC1,AC16 ; 1594 POP SP,AC16 ; 1555 POPJ SP, C.5: EXP 124 C.6: EXP 111 C.7: EXP 16 ; Routine Size: 19 words ; 1609 1 ; 1610 1 %SBTTL 'SEND%SWITCH' ; 1611 1 ; 1612 1 GLOBAL ROUTINE SEND%SWITCH = ; 1613 1 ; 1614 1 !++ ; 1615 1 ! FUNCTIONAL DESCRIPTION: ; 1616 1 ! ; 1617 1 ! This routine is the state table switcher for sending files. It ; 1618 1 ! loops until either it is finished or an error is encountered. The ; 1619 1 ! routines called by SEND%SWITCH are responsible for changing the state. ; 1620 1 ! ; 1621 1 ! CALLING SEQUENCE: ; 1622 1 ! ; 1623 1 ! SEND%SWITCH(); ; 1624 1 ! ; 1625 1 ! INPUT PARAMETERS: ; 1626 1 ! ; 1627 1 ! None. ; 1628 1 ! ; 1629 1 ! IMPLICIT INPUTS: ; 1630 1 ! ; 1631 1 ! None. ; 1632 1 ! ; 1633 1 ! OUTPUT PARAMETERS: ; 1634 1 ! ; 1635 1 ! Returns: ; 1636 1 ! TRUE - File sent correctly. ; 1637 1 ! FALSE - Aborted sending the file. ; 1638 1 ! ; 1639 1 ! IMPLICIT OUTPUTS: ; 1640 1 ! ; 1641 1 ! None. ; 1642 1 ! ; 1643 1 ! COMPLETION CODES: ; 1644 1 ! ; 1645 1 ! None. ; 1646 1 ! ; 1647 1 ! SIDE EFFECTS: ; 1648 1 ! ; 1649 1 ! None. ; 1650 1 ! ; 1651 1 !-- ; 1652 1 ; 1653 2 BEGIN ; 1654 2 ; 1655 2 LOCAL ; 1656 2 STATUS; ! Status result ; 1657 2 ; 1658 2 IF .CONNECT%FLAG THEN SY%DISMISS (.DELAY); ! Sleep if the user wanted us to ; 1659 2 ; 1660 2 INIT%XFR (); ! Initialize for this transfer ; 1661 2 TEXT%HEAD%FLAG = FALSE; ! Set text flag correctly ; 1662 2 XFR%STATUS (%C'I', %C'S'); ! Start of file send ; 1663 2 STATUS = DO%TRANSACTION (STATE%S); ! Call routine to do real work ; 1664 2 XFR%STATUS (%C'T', %C'S'); ! Done with send ; 1665 2 RETURN .STATUS; ! Return the result ; 1666 1 END; SEND%SWITCH:: PUSH SP,AC16 ; 1612 MOVEI AC1,1 ; 1658 TDNN AC1,CONNECT%FLAG JRST L.4 PUSH SP,DELAY PUSHJ SP,SY%DISMISS ADJSP SP,-1 L.4: PUSHJ SP,U.32 ; 1660 SETZM U.62 ; 1661 PUSH SP,C.6 ; 1662 PUSH SP,C.8 PUSHJ SP,XFR%STATUS PUSH SP,C.2 ; 1663 PUSHJ SP,U.1 MOVE AC16,AC1 PUSH SP,C.5 ; 1664 PUSH SP,C.8 PUSHJ SP,XFR%STATUS ADJSP SP,-5 ; 1665 MOVE AC1,AC16 ; 1653 POP SP,AC16 ; 1612 POPJ SP, C.8: EXP 123 ; Routine Size: 23 words ; 1667 1 ; 1668 1 %SBTTL 'REC%SWITCH' ; 1669 1 ; 1670 1 GLOBAL ROUTINE REC%SWITCH = ; 1671 1 ; 1672 1 !++ ; 1673 1 ! FUNCTIONAL DESCRIPTION: ; 1674 1 ! ; 1675 1 ! This routine will cause file(s) to be received by the remote ; 1676 1 ! KERMIT. This routine contains the main loop for the sending of the ; 1677 1 ! data. ; 1678 1 ! ; 1679 1 ! CALLING SEQUENCE: ; 1680 1 ! ; 1681 1 ! REC%SWITCH(); ; 1682 1 ! ; 1683 1 ! INPUT PARAMETERS: ; 1684 1 ! ; 1685 1 ! None. ; 1686 1 ! ; 1687 1 ! IMPLICIT INPUTS: ; 1688 1 ! ; 1689 1 ! FILE%DESC - Descriptor describing the file to be received by ; 1690 1 ! the remote KERMIT. ; 1691 1 ! ; 1692 1 ! OUTPUT PARAMETERS: ; 1693 1 ! ; 1694 1 ! None. ; 1695 1 ! ; 1696 1 ! IMPLICIT OUTPUTS: ; 1697 1 ! ; 1698 1 ! None. ; 1699 1 ! ; 1700 1 ! COMPLETION CODES: ; 1701 1 ! ; 1702 1 ! True - File received correctly. ; 1703 1 ! FALSE - File transfer aborted. ; 1704 1 ! ; 1705 1 ! SIDE EFFECTS: ; 1706 1 ! ; 1707 1 ! None. ; 1708 1 ! ; 1709 1 !-- ; 1710 1 ; 1711 2 BEGIN ; 1712 2 ; 1713 2 LOCAL ; 1714 2 INIT%STATE, ! State to start up DO%TRANSACTION in ; 1715 2 STATUS; ! Status returned by various routines ; 1716 2 ; 1717 2 INIT%STATE = STATE%R; ! Initialize the state ; 1718 2 MSG%NUMBER = 0; ; 1719 2 INIT%XFR (); ! Initialize the per transfer info ; 1720 2 ! ; 1721 2 ! Determine if they said REC ; 1722 2 ! Send MSG%RCV%INIT and then receive the file ; 1723 2 ! ; 1724 2 ; 1725 2 IF .FILE%SIZE GTR 0 ; 1726 2 THEN ; 1727 3 BEGIN ; 1728 3 GEN%TYPE = MSG%RCV%INIT; ! Use receive-init message ; 1729 3 CH$MOVE (.FILE%SIZE, CH$PTR (FILE%NAME), CH$PTR (GEN%1DATA)); ; 1730 3 GEN%1SIZE = .FILE%SIZE; ! Save the length ; 1731 3 INIT%STATE = STATE%SI; ! Start out with server init ; 1732 2 END; ; 1733 2 ; 1734 2 ! ; 1735 2 ! Now receive the file normally ; 1736 2 ! ; 1737 2 XFR%STATUS (%C'I', %C'R'); ! Start of a file receive ; 1738 2 STATUS = DO%TRANSACTION (.INIT%STATE); ; 1739 2 XFR%STATUS (%C'T', %C'R'); ! End of file receive ; 1740 2 RETURN .STATUS; ! Return the result ; 1741 1 END; ! End of REC%SWITCH REC%SWITCH:: PUSH SP,AC16 ; 1670 MOVEI AC16,6 ; 1717 SETZM U.55 ; 1718 PUSHJ SP,U.32 ; 1719 MOVE AC3,FILE%SIZE ; 1725 JUMPLE AC3,L.5 MOVEI AC1,122 ; 1728 MOVEM AC1,U.65 MOVE AC1,AC3 ; 1729 MOVE AC2,C.10 MOVE AC4,AC3 MOVE AC5,C.11 EXTEND AC1,C.9 JFCL MOVEM AC3,GEN%1SIZE ; 1730 MOVEI AC16,15 ; 1731 L.5: PUSH SP,C.6 ; 1737 PUSH SP,C.12 PUSHJ SP,XFR%STATUS MOVEM AC16,0(SP) ; 1738 PUSHJ SP,U.1 MOVE AC16,AC1 PUSH SP,C.5 ; 1739 PUSH SP,C.12 PUSHJ SP,XFR%STATUS ADJSP SP,-4 ; 1740 MOVE AC1,AC16 ; 1711 POP SP,AC16 ; 1670 POPJ SP, C.9: MOVSLJ C.10: POINT 7,FILE%NAME-1,34 C.11: POINT 7,GEN%1DATA-1,34 C.12: EXP 122 ; Routine Size: 33 words ; 1742 1 ; 1743 1 %SBTTL 'Server -- DO%GENERIC - Execute a generic command' ; 1744 1 ; 1745 1 GLOBAL ROUTINE DO%GENERIC (TYPE) = ; 1746 1 ; 1747 1 !++ ; 1748 1 ! FUNCTIONAL DESCRIPTION: ; 1749 1 ! ; 1750 1 ! This routine will send a generic command to the remote Kermit. ; 1751 1 ! it will do all the processing required for the generic command ; 1752 1 ! that was executed. It will return to the caller after the ; 1753 1 ! command has be executed. ; 1754 1 ! ; 1755 1 ! CALLING SEQUENCE: ; 1756 1 ! ; 1757 1 ! STATUS = DO%GENERIC (Command-type); ; 1758 1 ! ; 1759 1 ! INPUT PARAMETERS: ; 1760 1 ! ; 1761 1 ! Command-type -- Command type to be executed. ; 1762 1 ! ; 1763 1 ! IMPLICIT INPUTS: ; 1764 1 ! ; 1765 1 ! None. ; 1766 1 ! ; 1767 1 ! OUTPUT PARAMETERS: ; 1768 1 ! ; 1769 1 ! None. ; 1770 1 ! ; 1771 1 ! IMPLICIT OUTPUTS: ; 1772 1 ! ; 1773 1 ! None. ; 1774 1 ! ; 1775 1 ! COMPLETION CODES: ; 1776 1 ! ; 1777 1 ! None. ; 1778 1 ! ; 1779 1 ! SIDE EFFECTS: ; 1780 1 ! ; 1781 1 ! None. ; 1782 1 ! ; 1783 1 !-- ; 1784 1 ; 1785 2 BEGIN ; 1786 2 ; 1787 2 LOCAL ; 1788 2 INIT%STATE; ! Initial state for FSM ; 1789 2 ; 1790 2 ! ; 1791 2 ! Set up the per transfer items ; 1792 2 ! ; 1793 2 INIT%XFR (); ; 1794 2 NUM%RETRIES = 0; ; 1795 2 MSG%NUMBER = 0; ; 1796 2 ! ; 1797 2 ! These are all generic commands ; 1798 2 ! ; 1799 2 GEN%TYPE = MSG%GENERIC; ; 1800 2 ! ; 1801 2 ! Assume we will not need server init ; 1802 2 ! ; 1803 2 INIT%STATE = STATE%SG; ; 1804 2 ; 1805 2 CASE .TYPE FROM GC%MIN TO GC%MAX OF ; 1806 2 SET ; 1807 2 ; 1808 2 [GC%EXIT] : ; 1809 2 GEN%SUBTYPE = MSG%GEN%EXIT; ; 1810 2 ; 1811 2 [GC%LOGOUT] : ; 1812 2 GEN%SUBTYPE = MSG%GEN%LOGOUT; ; 1813 2 ; 1814 2 [GC%DIRECTORY] : ; 1815 3 BEGIN ; 1816 3 INIT%STATE = STATE%SI; ! We will need server-init ; 1817 3 GEN%SUBTYPE = MSG%GEN%DIRECTORY; ; 1818 2 END; ; 1819 2 ; 1820 2 [GC%DISK%USAGE] : ; 1821 3 BEGIN ; 1822 3 INIT%STATE = STATE%SI; ! We will need server-init ; 1823 3 GEN%SUBTYPE = MSG%GEN%DISK%USAGE; ; 1824 2 END; ; 1825 2 ; 1826 2 [GC%DELETE] : ; 1827 2 GEN%SUBTYPE = MSG%GEN%DELETE; ; 1828 2 ; 1829 2 [GC%TYPE] : ; 1830 3 BEGIN ; 1831 3 INIT%STATE = STATE%SI; ! We will need server-init ; 1832 3 GEN%SUBTYPE = MSG%GEN%TYPE; ; 1833 2 END; ; 1834 2 ; 1835 2 [GC%HELP] : ; 1836 3 BEGIN ; 1837 3 INIT%STATE = STATE%SI; ! We will need server-init ; 1838 3 GEN%SUBTYPE = MSG%GEN%HELP; ; 1839 2 END; ; 1840 2 ; 1841 2 [GC%LGN] : ; 1842 2 GEN%SUBTYPE = MSG%GEN%LOGIN; ! Login just gets ACK ; 1843 2 ; 1844 2 [GC%CONNECT] : ; 1845 2 GEN%SUBTYPE = MSG%GEN%CONNECT; ! CWD just gets ACK ; 1846 2 ; 1847 2 [GC%RENAME] : ; 1848 2 GEN%SUBTYPE = MSG%GEN%RENAME; ! Rename file just needs ACK ; 1849 2 ; 1850 2 [GC%COPY] : ; 1851 2 GEN%SUBTYPE = MSG%GEN%COPY; ! Copy file just needs ACK ; 1852 2 ; 1853 2 [GC%WHO] : ; 1854 3 BEGIN ; 1855 3 INIT%STATE = STATE%SI; ! May get large response ; 1856 3 GEN%SUBTYPE = MSG%GEN%WHO; ; 1857 2 END; ; 1858 2 ; 1859 2 [GC%SEND%MSG] : ; 1860 2 GEN%SUBTYPE = MSG%GEN%SEND; ! Just need an ACK ; 1861 2 ; 1862 2 [GC%STATUS] : ; 1863 3 BEGIN ; 1864 3 INIT%STATE = STATE%SI; ! May get large response ; 1865 3 GEN%SUBTYPE = MSG%GEN%QUERY; ; 1866 2 END; ; 1867 2 ; 1868 2 [GC%COMMAND] : ; 1869 3 BEGIN ; 1870 3 INIT%STATE = STATE%SI; ! Large response likely ; 1871 3 GEN%TYPE = MSG%COMMAND; ! This is host command ; 1872 2 END; ; 1873 2 ; 1874 2 [GC%KERMIT] : ; 1875 2 GEN%TYPE = MSG%KERMIT; ! Perform Kermit command (short response) ; 1876 2 ; 1877 2 [GC%PROGRAM] : ; 1878 3 BEGIN ; 1879 3 INIT%STATE = STATE%SI; ! Assume large response ; 1880 3 GEN%SUBTYPE = MSG%GEN%PROGRAM; ! Generic program command ; 1881 2 END; ; 1882 2 ; 1883 2 [GC%JOURNAL] : ; 1884 2 GEN%SUBTYPE = MSG%GEN%JOURNAL; ! Do journal function (short reply) ; 1885 2 ; 1886 2 [GC%VARIABLE] : ; 1887 2 GEN%SUBTYPE = MSG%GEN%VARIABLE; ! Set or get a variable value ; 1888 2 ; 1889 2 [INRANGE, OUTRANGE] : ; 1890 3 BEGIN ; 1891 3 KRM%ERROR (KER%UNIMPLGEN); ; 1892 3 RETURN STATE%A; ; 1893 2 END; ; 1894 2 TES; ; 1895 2 ; 1896 2 RETURN DO%TRANSACTION (.INIT%STATE); ! Go do the command ; 1897 1 END; ! End of DO%GENERIC DO%GENERIC:: PUSH SP,AC16 ; 1745 PUSHJ SP,U.32 ; 1793 SETZM U.54 ; 1794 SETZM U.55 ; 1795 MOVEI AC1,107 ; 1799 MOVEM AC1,U.65 MOVEI AC16,14 ; 1803 MOVE AC1,-2(SP) ; 1805 SOJL AC1,L.7 CAIGE AC1,23 JRST L.6(AC1) JRST L.7 L.6: JRST L.8 JRST L.10 JRST L.11 JRST L.12 JRST L.13 JRST L.14 JRST L.9 JRST L.15 JRST L.16 JRST L.17 JRST L.18 JRST L.19 JRST L.20 JRST L.21 JRST L.22 JRST L.23 JRST L.26 JRST L.27 JRST L.25 L.7: PUSH SP,C.13 ; 1891 PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 1892 MOVEI AC1,12 ; 1890 JRST L.30 L.8: MOVEI AC1,106 ; 1809 JRST L.28 L.9: MOVEI AC1,114 ; 1812 JRST L.28 L.10: MOVEI AC16,15 ; 1816 MOVEI AC1,104 ; 1817 JRST L.28 L.11: MOVEI AC16,15 ; 1822 MOVEI AC1,125 ; 1823 JRST L.28 L.12: MOVEI AC1,105 ; 1827 JRST L.28 L.13: MOVEI AC16,15 ; 1831 MOVEI AC1,124 ; 1832 JRST L.28 L.14: MOVEI AC16,15 ; 1837 MOVEI AC1,110 ; 1838 JRST L.28 L.15: MOVEI AC1,111 ; 1842 JRST L.28 L.16: MOVEI AC1,103 ; 1845 JRST L.28 L.17: MOVEI AC1,122 ; 1848 JRST L.28 L.18: MOVEI AC1,113 ; 1851 JRST L.28 L.19: MOVEI AC16,15 ; 1855 MOVEI AC1,127 ; 1856 JRST L.28 L.20: MOVEI AC1,115 ; 1860 JRST L.28 L.21: MOVEI AC16,15 ; 1864 MOVEI AC1,121 ; 1865 JRST L.28 L.22: MOVEI AC16,15 ; 1870 MOVEI AC1,103 ; 1871 JRST L.24 L.23: MOVEI AC1,113 ; 1875 L.24: MOVEM AC1,U.65 JRST L.29 ; 1805 L.25: MOVEI AC16,15 ; 1879 MOVEI AC1,120 ; 1880 JRST L.28 L.26: MOVEI AC1,112 ; 1884 JRST L.28 L.27: MOVEI AC1,126 ; 1887 L.28: MOVEM AC1,U.66 L.29: PUSH SP,AC16 ; 1896 PUSHJ SP,U.1 ADJSP SP,-1 L.30: POP SP,AC16 ; 1745 POPJ SP, C.13: EXP 232 ; Routine Size: 89 words ; 1898 1 ; 1899 1 %SBTTL 'DO%TRANSACTION - Main loop for FSM' ; 1900 1 ROUTINE DO%TRANSACTION (INIT%STATE) = ; 1901 1 ; 1902 1 !++ ; 1903 1 ! FUNCTIONAL DESCRIPTION: ; 1904 1 ! ; 1905 1 ! This is the main routine for performing a Kermit transaction. ; 1906 1 ! It is structured as a finite state machine with each state ; 1907 1 ! determining the next based upon the packet which is received. ; 1908 1 ! It is supplied with the initial state by the caller. ; 1909 1 ! ; 1910 1 ! CALLING SEQUENCE: ; 1911 1 ! ; 1912 1 ! Status = DO%TRANSACTION(.INIT%STATE); ; 1913 1 ! ; 1914 1 ! INPUT PARAMETERS: ; 1915 1 ! ; 1916 1 ! INIT%STATE - Initial state. ; 1917 1 ! ; 1918 1 ! IMPLICIT INPUTS: ; 1919 1 ! ; 1920 1 ! None. ; 1921 1 ! ; 1922 1 ! OUTPUT PARAMETERS: ; 1923 1 ! ; 1924 1 ! None. ; 1925 1 ! ; 1926 1 ! IMPLICIT OUTPUTS: ; 1927 1 ! ; 1928 1 ! None. ; 1929 1 ! ; 1930 1 ! COMPLETION CODES: ; 1931 1 ! ; 1932 1 ! None. ; 1933 1 ! ; 1934 1 ! SIDE EFFECTS: ; 1935 1 ! ; 1936 1 ! None. ; 1937 1 ! ; 1938 1 !-- ; 1939 1 ; 1940 2 BEGIN ; 1941 2 ; 1942 2 LOCAL ; 1943 2 RETURN%VALUE; ; 1944 2 ; 1945 2 NUM%RETRIES = 0; ! Initialize the number of retries ; 1946 2 STATE = .INIT%STATE; ! Initialize the state ; 1947 2 ; 1948 2 WHILE TRUE DO ; 1949 2 ; 1950 2 CASE .STATE FROM STATE%MIN TO STATE%MAX OF ; 1951 2 SET ; 1952 2 ! ; 1953 2 ! Send states ; 1954 2 ! ; 1955 2 ; 1956 2 [STATE%ID] : ; 1957 2 ! ; 1958 2 ! Server while idle. Set the timeout to twice the normal wait ; 1959 2 ! and wait for something to show up ; 1960 2 ! ; 1961 3 BEGIN ; 1962 3 ; 1963 3 LOCAL ; 1964 3 SAVED%TIMEOUT; ; 1965 3 ; 1966 3 SAVED%TIMEOUT = .SEND%TIMEOUT; ; 1967 3 ; 1968 3 IF .SEND%TIMEOUT NEQ 0 THEN SEND%TIMEOUT = .SRV%TIMEOUT; ; 1969 3 ; 1970 3 STATE = REC%SERVER%IDLE (); ; 1971 3 SEND%TIMEOUT = .SAVED%TIMEOUT; ; 1972 2 END; ; 1973 2 ; 1974 2 [STATE%II] : ; 1975 2 ! ; 1976 2 ! Here while server idle after having received a server-init packet ; 1977 2 ! ; 1978 2 STATE = REC%SERVER%IDLE (); ; 1979 2 ; 1980 2 [STATE%FI, STATE%LG] : ; 1981 2 ! ; 1982 2 ! Here when we are supposed to exit ; 1983 2 ! ; 1984 2 RETURN KER%EXIT; ; 1985 2 ; 1986 2 [STATE%SD] : ; 1987 2 STATE = SEND%DATA (); ; 1988 2 ; 1989 2 [STATE%SF] : ; 1990 2 STATE = SEND%FILE (); ; 1991 2 ; 1992 2 [STATE%SZ] : ; 1993 2 STATE = SEND%EOF (); ; 1994 2 ; 1995 2 [STATE%S] : ; 1996 2 STATE = SEND%INIT (); ; 1997 2 ; 1998 2 [STATE%OF] : ; 1999 2 STATE = SEND%OPEN%FILE (); ; 2000 2 ; 2001 2 [STATE%SI] : ; 2002 2 STATE = SEND%SERVER%INIT (); ; 2003 2 ; 2004 2 [STATE%SG] : ; 2005 2 STATE = SEND%GENCMD (); ; 2006 2 ; 2007 2 [STATE%SB] : ; 2008 2 STATE = SEND%BREAK (); ; 2009 2 ! ; 2010 2 ! Receiving of the data and the end of file message. ; 2011 2 ! ; 2012 2 ; 2013 2 [STATE%RD] : ; 2014 2 STATE = REC%DATA (); ; 2015 2 ! ; 2016 2 ! Receiving the FILE information of the break to end the transfer of ; 2017 2 ! one or more files ; 2018 2 ! ; 2019 2 ; 2020 2 [STATE%RF] : ; 2021 2 STATE = REC%FILE (); ; 2022 2 ! ; 2023 2 ! Initialization for the receiving of a file ; 2024 2 ! ; 2025 2 ; 2026 2 [STATE%R] : ; 2027 2 STATE = REC%INIT (); ; 2028 2 ! ; 2029 2 ! Here if we have completed the receiving of the file ; 2030 2 ! ; 2031 2 ; 2032 2 [STATE%C] : ; 2033 3 BEGIN ; 2034 3 RETURN%VALUE = TRUE; ; 2035 3 EXITLOOP; ; 2036 2 END; ; 2037 2 ! ; 2038 2 ! Here if we aborted the transfer or we have gotten into some random ; 2039 2 ! state (internal KERMSG problem). ; 2040 2 ! ; 2041 2 ; 2042 2 [STATE%A, STATE%EX, STATE%ER, INRANGE, OUTRANGE] : ; 2043 3 BEGIN ; 2044 3 RETURN%VALUE = FALSE; ; 2045 3 ; 2046 3 IF .STATE EQL STATE%EX THEN RETURN%VALUE = KER%ABORTED; ; 2047 3 ; 2048 3 ! ; 2049 3 ! Determine if the file is still open and if so close it ; 2050 3 ! ; 2051 3 ; 2052 3 IF .FLAG%FILE%OPEN ; 2053 3 THEN ; 2054 4 BEGIN ; 2055 4 FLAG%FILE%OPEN = FALSE; ; 2056 4 ; 2057 4 IF ( NOT .CONNECT%FLAG) AND .TY%FIL ; 2058 4 THEN ; 2059 5 BEGIN ; 2060 5 TT%TEXT (UPLIT (%ASCIZ' [Aborted]')); ; 2061 5 TT%CRLF (); ; 2062 4 END; ; 2063 4 ; 2064 5 FILE%CLOSE (.ABT%FLAG AND (.STATE EQL STATE%A OR .STATE EQL STATE%EX OR ; 2065 5 .STATE ; 2066 4 EQL STATE%ER)); ; 2067 4 XFR%STATUS (%C'F', %C'A'); ; 2068 3 END; ; 2069 3 ; 2070 3 ! ; 2071 3 ! Give error if aborted due to too many retries ; 2072 3 ! ; 2073 3 ; 2074 3 IF .STATE EQL STATE%ER THEN KRM%ERROR (KER%RETRIES); ; 2075 3 ; 2076 3 EXITLOOP; ; 2077 2 END; ; 2078 2 TES; ; 2079 2 ; 2080 2 ! ; 2081 2 ! End the stats and return to the caller ; 2082 2 ! ; 2083 2 END%STATS (); ; 2084 2 ! ; 2085 2 RETURN .RETURN%VALUE; ; 2086 1 END; ! End of DO%TRANSACTION P.AAA: BYTE (7)" ","[","A","b","o" BYTE (7)"r","t","e","d","]" BYTE (7)000,000,000,000,000 ; DO%TRANSACTION U.1: PUSH SP,AC14 ; 1900 PUSH SP,AC16 SETZM U.54 ; 1945 MOVE AC1,-3(SP) ; 1946 L.31: MOVEM AC1,U.51 L.32: MOVE AC1,U.51 ; 1950 MOVE AC2,AC1 SOJL AC2,L.34 CAIGE AC2,24 JRST L.33(AC2) JRST L.34 L.33: JRST L.44 JRST L.42 JRST L.41 JRST L.43 JRST L.48 JRST L.51 JRST L.50 JRST L.49 JRST L.52 JRST L.34 JRST L.34 JRST L.47 JRST L.46 JRST L.37 JRST L.39 JRST L.40 JRST L.40 JRST L.45 JRST L.34 JRST L.34 L.34: SETZ AC14, ; 2044 CAIN AC1,23 ; 2046 MOVEI AC14,312 MOVEI AC1,1 ; 2052 TDNN AC1,FLAG%FILE%OPEN JRST L.36 SETZM FLAG%FILE%OPEN ; 2055 MOVEI AC1,1 ; 2057 TDNE AC1,CONNECT%FLAG JRST L.35 MOVEI AC1,1 TDNN AC1,TY%FIL JRST L.35 PUSH SP,C.14 ; 2060 PUSHJ SP,TT%TEXT ADJSP SP,-1 PUSHJ SP,TT%CRLF ; 2061 L.35: MOVE AC3,U.51 ; 2064 SETZ AC1, CAIN AC3,12 MOVEI AC1,1 SETZ AC2, CAIN AC3,23 MOVEI AC2,1 IOR AC2,AC1 SETZ AC1, ; 2066 CAIN AC3,24 MOVEI AC1,1 IOR AC1,AC2 ; 2064 AND AC1,ABT%FLAG PUSH SP,AC1 PUSHJ SP,FILE%CLOSE ADJSP SP,-1 PUSH SP,C.15 ; 2067 PUSH SP,C.16 PUSHJ SP,XFR%STATUS ADJSP SP,-2 L.36: MOVEI AC1,24 ; 2074 CAME AC1,U.51 JRST L.53 PUSH SP,C.17 PUSHJ SP,KRM%ERROR ADJSP SP,-1 JRST L.53 L.37: MOVE AC1,SEND%TIMEOUT ; 1966 MOVE AC16,AC1 JUMPE AC1,L.38 ; 1968 MOVE AC1,SRV%TIMEOUT MOVEM AC1,SEND%TIMEOUT L.38: PUSHJ SP,U.10 ; 1970 MOVEM AC1,U.51 MOVEM AC16,SEND%TIMEOUT ; 1971 JRST L.32 ; 1950 L.39: PUSHJ SP,U.10 ; 1978 JRST L.31 L.40: MOVEI AC1,223 ; 1984 JRST L.54 L.41: PUSHJ SP,U.3 ; 1987 JRST L.31 L.42: PUSHJ SP,U.4 ; 1990 JRST L.31 L.43: PUSHJ SP,U.7 ; 1993 JRST L.31 L.44: PUSHJ SP,U.8 ; 1996 JRST L.31 L.45: PUSHJ SP,U.5 ; 1999 JRST L.31 L.46: PUSHJ SP,U.2 ; 2002 JRST L.31 L.47: PUSHJ SP,U.6 ; 2005 JRST L.31 L.48: PUSHJ SP,U.9 ; 2008 JRST L.31 L.49: PUSHJ SP,U.13 ; 2014 JRST L.31 L.50: PUSHJ SP,U.12 ; 2021 JRST L.31 L.51: PUSHJ SP,U.11 ; 2027 JRST L.31 L.52: MOVEI AC14,1 ; 2034 L.53: PUSHJ SP,U.18 ; 2083 MOVE AC1,AC14 ; 1940 L.54: POP SP,AC16 ; 1900 POP SP,AC14 POPJ SP, C.14: XWD 0,P.AAA C.15: EXP 106 C.16: EXP 101 C.17: EXP 212 ; Routine Size: 120 words ; 2087 1 %SBTTL 'REC%SERVER%IDLE - Idle server state' ; 2088 1 ROUTINE REC%SERVER%IDLE = ; 2089 1 ; 2090 1 !++ ; 2091 1 ! FUNCTIONAL DESCRIPTION: ; 2092 1 ! ; 2093 1 ! This routine is called from DO%TRANSACTION when is the server idle ; 2094 1 ! state. It will receive a message and properly dispatch to the new ; 2095 1 ! state. ; 2096 1 ! ; 2097 1 ! CALLING SEQUENCE: ; 2098 1 ! ; 2099 1 ! STATE = REC%SERVER%IDLE (); ; 2100 1 ! ; 2101 1 ! INPUT PARAMETERS: ; 2102 1 ! ; 2103 1 ! None. ; 2104 1 ! ; 2105 1 ! IMPLICIT INPUTS: ; 2106 1 ! ; 2107 1 ! Almost everything. ; 2108 1 ! ; 2109 1 ! OUPTUT PARAMETERS: ; 2110 1 ! ; 2111 1 ! Routine value is new state for FSM ; 2112 1 ! ; 2113 1 ! IMPLICIT OUTPUTS: ; 2114 1 ! ; 2115 1 ! None. ; 2116 1 ! ; 2117 1 ! COMPLETION CODES: ; 2118 1 ! ; 2119 1 ! None. ; 2120 1 ! ; 2121 1 ! SIDE EFFECTS: ; 2122 1 ! ; 2123 1 ! None. ; 2124 1 ! ; 2125 1 !-- ; 2126 1 ; 2127 2 BEGIN ; 2128 2 ; 2129 2 LOCAL ; 2130 2 STATUS; ; 2131 2 ; 2132 2 STATUS = REC%PACKET (); ; 2133 2 ! ; 2134 2 ! Now determine what to do by the type of message we have receive. ; 2135 2 ! ; 2136 2 ; 2137 2 IF .STATUS EQL KER%ABORTED THEN RETURN STATE%EX; ; 2138 2 ; 2139 2 IF .STATUS ; 2140 2 THEN ; 2141 3 BEGIN ; 2142 3 ; 2143 3 SELECTONE .REC%TYPE OF ; 2144 3 SET ; 2145 3 ! ; 2146 3 ! Server initialization message received. ACK the ; 2147 3 ! message and continue. ; 2148 3 ! ; 2149 3 ; 2150 3 [MSG%SER%INIT] : ; 2151 4 BEGIN ; 2152 4 ; 2153 5 IF (STATUS = PRS%SEND%INIT ()) ; 2154 4 THEN ; 2155 5 BEGIN ; 2156 5 SET%SEND%INIT (); ; 2157 5 ; 2158 6 IF (STATUS = SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .REC%SEQ)) ! [108] ; 2159 5 THEN ; 2160 6 BEGIN ; 2161 6 SND%PKT%SIZE = -.SEND%PKT%SIZE; ; 2162 6 SND%TIMEOUT = -.SEND%TIMEOUT; ; 2163 6 SND%NPAD = -.SEND%NPAD; ; 2164 6 SND%PADCHAR = -.SEND%PADCHAR; ; 2165 6 SND%EOL = -.SEND%EOL; ; 2166 6 SND%QUOTE%CHR = -.SEND%QUOTE%CHR; ; 2167 6 RCV%8QUOTE%CHR = .SEND%8QUOTE%CHR; ; 2168 6 CHKTYPE = .INI%CHK%TYPE; ; 2169 6 SET%REPT%CHR = .REPT%CHR; ; 2170 6 RETURN STATE%II; ! Now idle after INIT ; 2171 5 END; ; 2172 5 ; 2173 4 END; ; 2174 4 ; 2175 4 KRM%ERROR (KER%PROTOERR); ; 2176 4 RETURN STATE%A; ; 2177 3 END; ; 2178 3 ! ; 2179 3 ! Send init message received. We must ACK the message and ; 2180 3 ! then attempt to receive a file from the remote. ; 2181 3 ! ; 2182 3 ; 2183 3 [MSG%SND%INIT] : ; 2184 4 BEGIN ; 2185 4 MSG%NUMBER = (.REC%SEQ + 1) AND %O'77'; ; 2186 4 ; 2187 5 IF (STATUS = PRS%SEND%INIT ()) ; 2188 4 THEN ; 2189 5 BEGIN ; 2190 5 SET%SEND%INIT (); ; 2191 5 ! ; 2192 5 ! ACK the message then receive everything. ; 2193 5 ! ; 2194 5 ; 2195 5 IF SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .REC%SEQ) ! [108] ; 2196 5 THEN ; 2197 6 BEGIN ; 2198 6 BLK%CHK%TYPE = .INI%CHK%TYPE; ! Switch to desired form of block check ; 2199 6 XFR%STATUS (%C'I', %C'R'); ! Start of file receive ; 2200 6 RETURN STATE%RF; ; 2201 5 END; ; 2202 5 ; 2203 4 END; ; 2204 4 ; 2205 4 KRM%ERROR (KER%PROTOERR); ; 2206 4 RETURN STATE%A; ; 2207 3 END; ; 2208 3 ! ; 2209 3 ! Here if we receive a receive init message. ; 2210 3 ! We will be sending a file to the other end. ; 2211 3 ! ; 2212 3 ; 2213 3 [MSG%RCV%INIT] : ; 2214 4 BEGIN ; 2215 4 ! ; 2216 4 ! Move the file specification if we received one ; 2217 4 ! ; 2218 4 SET%STRING (CH$PTR (FILE%NAME), MAX%FILE%NAME, TRUE); ; 2219 4 BFR%EMPTY (); ; 2220 4 FILE%SIZE = SET%STRING (0, 0, FALSE); ; 2221 4 CH$WCHAR (CHR%NUL, CH$PTR (FILE%NAME, .FILE%SIZE)); ; 2222 4 ; 2223 4 IF .FILE%SIZE GTR 0 ; 2224 4 THEN ; 2225 5 BEGIN ; 2226 5 XFR%STATUS (%C'I', %C'S'); ! Start of a file send ; 2227 5 RETURN STATE%S; ; 2228 4 END; ; 2229 4 ; 2230 4 KRM%ERROR (KER%PROTOERR); ; 2231 4 RETURN STATE%A; ; 2232 3 END; ; 2233 3 ! ; 2234 3 ! Generic KERMIT commands ; 2235 3 ! ; 2236 3 ; 2237 3 [MSG%GENERIC] : ; 2238 3 RETURN SERVER%GENERIC (); ; 2239 3 ! ; 2240 3 ! Host command ; 2241 3 ! ; 2242 3 ; 2243 3 [MSG%COMMAND] : ; 2244 3 RETURN HOST%COMMAND (); ; 2245 3 ! ; 2246 3 ! Kermit command ; 2247 3 ! ; 2248 3 ; 2249 3 [MSG%KERMIT] : ; 2250 3 RETURN KERMIT%COMMAND (); ; 2251 3 ! ; 2252 3 ! Unimplimented server routines ; 2253 3 ! ; 2254 3 ; 2255 3 [OTHERWISE] : ; 2256 4 BEGIN ; 2257 4 KRM%ERROR (KER%UNISRV); ; 2258 4 RETURN STATE%A; ; 2259 3 END; ; 2260 3 TES; ; 2261 3 ; 2262 2 END; ; 2263 2 ; 2264 2 ! ; 2265 2 ! If we get here, we must have gotten something random. Therefore, ; 2266 2 ! just send a NAK and remain in the current state (unless we have done this ; 2267 2 ! too many times). ; 2268 2 ! ; 2269 2 NUM%RETRIES = .NUM%RETRIES + 1; ; 2270 2 ; 2271 2 IF .NUM%RETRIES GTR .SI%RETRIES THEN RETURN STATE%A; ; 2272 2 ; 2273 2 IF SEND%PACKET (MSG%NAK, 0, 0) THEN RETURN .STATE ELSE RETURN STATE%EX; ; 2274 2 ; 2275 1 END; ! End of REC%SERVER%IDLE ; REC%SERVER%IDLE U.10: PUSH SP,AC14 ; 2088 PUSH SP,AC16 PUSHJ SP,U.26 ; 2132 MOVE AC14,AC1 CAIN AC14,312 ; 2137 JRST L.67 TRNN AC14,1 ; 2139 JRST L.64 MOVE AC16,U.58 ; 2143 CAIE AC16,111 ; 2150 JRST L.55 PUSHJ SP,U.21 ; 2153 MOVE AC14,AC1 TRNN AC14,1 JRST L.56 PUSHJ SP,U.20 ; 2156 PUSH SP,C.20 ; 2158 PUSH SP,U.46 PUSH SP,U.56 PUSHJ SP,U.24 MOVE AC14,AC1 ADJSP SP,-3 TRNN AC14,1 JRST L.56 MOVE AC1,U.40 ; 2161 MOVNM AC1,SND%PKT%SIZE MOVE AC1,SEND%TIMEOUT ; 2162 MOVNM AC1,SND%TIMEOUT MOVE AC1,U.41 ; 2163 MOVNM AC1,SND%NPAD MOVE AC1,U.42 ; 2164 MOVNM AC1,SND%PADCHAR MOVE AC1,U.43 ; 2165 MOVNM AC1,SND%EOL MOVE AC1,U.44 ; 2166 MOVNM AC1,SND%QUOTE%CHR MOVE AC1,U.45 ; 2167 MOVEM AC1,RCV%8QUOTE%CHR MOVE AC1,U.47 ; 2168 MOVEM AC1,CHKTYPE MOVE AC1,U.38 ; 2169 MOVEM AC1,SET%REPT%CHR MOVEI AC1,17 ; 2160 JRST L.68 L.55: CAIE AC16,123 ; 2183 JRST L.57 MOVE AC1,U.56 ; 2185 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 PUSHJ SP,U.21 ; 2187 MOVE AC14,AC1 TRNN AC14,1 JRST L.56 PUSHJ SP,U.20 ; 2190 PUSH SP,C.20 ; 2195 PUSH SP,U.46 PUSH SP,U.56 PUSHJ SP,U.24 ADJSP SP,-3 TRNN AC1,1 JRST L.56 MOVE AC1,U.47 ; 2198 MOVEM AC1,U.48 PUSH SP,C.6 ; 2199 PUSH SP,C.12 PUSHJ SP,XFR%STATUS ADJSP SP,-2 ; 2200 MOVEI AC1,7 ; 2197 JRST L.68 L.56: PUSH SP,C.21 ; 2205 JRST L.63 L.57: CAIE AC16,122 ; 2213 JRST L.59 PUSH SP,C.10 ; 2218 PUSH SP,C.22 PUSH SP,C.2 PUSHJ SP,U.30 PUSHJ SP,U.28 ; 2219 SETZM -2(SP) ; 2220 SETZM -1(SP) SETZM 0(SP) PUSHJ SP,U.30 MOVEM AC1,FILE%SIZE SETZ AC3, ; 2221 MOVE AC2,FILE%SIZE MOVE AC4,C.19 MOVE AC1,AC2 ADJBP AC1,AC4 IDPB AC3,AC1 JUMPLE AC2,L.58 ; 2223 PUSH SP,C.6 ; 2226 PUSH SP,C.8 PUSHJ SP,XFR%STATUS ADJSP SP,-5 ; 2227 MOVEI AC1,1 ; 2225 JRST L.68 L.58: PUSH SP,C.21 ; 2230 PUSHJ SP,KRM%ERROR ADJSP SP,-4 ; 2214 JRST L.65 L.59: CAIE AC16,107 ; 2237 JRST L.60 PUSHJ SP,U.14 ; 2238 JRST L.68 ; 2143 L.60: CAIE AC16,103 ; 2243 JRST L.61 PUSHJ SP,U.15 ; 2244 JRST L.68 ; 2143 L.61: CAIE AC16,113 ; 2249 JRST L.62 PUSHJ SP,U.16 ; 2250 JRST L.68 ; 2143 L.62: PUSH SP,C.23 ; 2257 L.63: PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 2256 JRST L.65 L.64: AOS AC1,U.54 ; 2271 CAMG AC1,SI%RETRIES JRST L.66 L.65: MOVEI AC1,12 JRST L.68 L.66: PUSH SP,C.24 ; 2273 PUSH SP,C.25 PUSH SP,C.25 PUSHJ SP,U.24 ADJSP SP,-3 TRNE AC1,1 SKIPA AC1,U.51 L.67: MOVEI AC1,23 L.68: POP SP,AC16 ; 2088 POP SP,AC14 POPJ SP, C.18: POINT 6,AC1,35 C.19: POINT 7,FILE%NAME,-1 C.20: EXP 131 C.21: EXP 252 C.22: EXP 204 C.23: EXP 242 C.24: EXP 116 C.25: EXP 0 ; Routine Size: 141 words ; 2276 1 %SBTTL 'SEND%SERVER%INIT' ; 2277 1 ROUTINE SEND%SERVER%INIT = ; 2278 1 ; 2279 1 !++ ; 2280 1 ! FUNCTIONAL DESCRIPTION: ; 2281 1 ! ; 2282 1 ! This routine will send a server initialization message to the ; 2283 1 ! remote KERMIT. ; 2284 1 ! ; 2285 1 ! CALLING SEQUENCE: ; 2286 1 ! ; 2287 1 ! STATE = SEND%SERVER%INIT(); ; 2288 1 ! ; 2289 1 ! INPUT PARAMETERS: ; 2290 1 ! ; 2291 1 ! None. ; 2292 1 ! ; 2293 1 ! IMPLICIT INPUTS: ; 2294 1 ! ; 2295 1 ! RECV%xxx - desired receive parameters ; 2296 1 ! ; 2297 1 ! OUTPUT PARAMETERS: ; 2298 1 ! ; 2299 1 ! New state to change the finite state machine to. ; 2300 1 ! ; 2301 1 ! IMPLICIT OUTPUTS: ; 2302 1 ! ; 2303 1 ! SEND%xxx - Other Kermit's desired parameters ; 2304 1 ! ; 2305 1 ! COMPLETION CODES: ; 2306 1 ! ; 2307 1 ! None. ; 2308 1 ! ; 2309 1 ! SIDE EFFECTS: ; 2310 1 ! ; 2311 1 ! None. ; 2312 1 ! ; 2313 1 !-- ; 2314 1 ; 2315 2 BEGIN ; 2316 2 ; 2317 2 LOCAL ; 2318 2 OLD%OUTPUT, ! Saved terminal output routine ; 2319 2 STATUS; ! Status returned by various routines ; 2320 2 ; 2321 2 ![026] Local routine to ignore error message output ; 2322 2 ROUTINE IGNORE%ERROR (ADDRESS, LENGTH) = ; 2323 3 BEGIN ; 2324 3 RETURN TRUE; ; 2325 2 END; ; IGNORE%ERROR U.76: MOVEI AC1,1 ; 2323 POPJ SP, ; 2322 ; Routine Size: 2 words ; 2326 2 SET%SEND%INIT (); ; 2327 2 ![026] If too many tries, just give up. Maybe the other Kermit doesn't ; 2328 2 ![026] know what to do with this packet. ; 2329 2 ; 2330 2 IF .NUM%RETRIES GTR .SI%RETRIES THEN RETURN STATE%SG; ; 2331 2 ; 2332 2 ![026] ; 2333 2 ![026] Count the number of times we try this ; 2334 2 ![026] ; 2335 2 NUM%RETRIES = .NUM%RETRIES + 1; ; 2336 2 ; 2337 2 IF NOT SEND%PACKET (MSG%SER%INIT, .SEND%INIT%SIZE, .MSG%NUMBER) THEN RETURN ; 2338 2 STATE%A; ! [108] ; 2339 2 ; 2340 2 ![026] ; 2341 2 ![026] Determine if we received a packet it good condition. If we timed out ; 2342 2 ![026] just try again. If we get an error packet back, ignore it and ; 2343 2 ![026] just continue. The other Kermit must not support this packet. ; 2344 2 ![026] ; 2345 2 OLD%OUTPUT = TT%SET%OUTPUT (IGNORE%ERROR); ; 2346 2 STATUS = REC%PACKET (); ; 2347 2 TT%OUTPUT (); ; 2348 2 TT%SET%OUTPUT (.OLD%OUTPUT); ; 2349 2 ; 2350 2 IF .STATUS EQL KER%ERRMSG THEN RETURN STATE%SG; ; 2351 2 ; 2352 2 IF NOT .STATUS ; 2353 2 THEN ; 2354 2 ; 2355 4 IF NOT ((.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS ; 2356 4 EQL ; 2357 3 KER%CHKSUMERR)) ; 2358 2 THEN ; 2359 2 RETURN STATE%EX ; 2360 2 ELSE ; 2361 2 RETURN .STATE; ; 2362 2 ; 2363 2 ! ; 2364 2 ! Determine if the packet is good. ; 2365 2 ! ; 2366 2 ; 2367 2 IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ EQL .MSG%NUMBER ; 2368 2 THEN ; 2369 3 BEGIN ; 2370 3 ! ; 2371 3 ! Here if we have an ACK for the initialization message that was just sent ; 2372 3 ! to the remote KERMIT. ; 2373 3 ! ; 2374 3 ; 2375 3 IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN STATE%A; ; 2376 3 ; 2377 3 NUM%RETRIES = 0; ; 2378 3 INIT%PKT%SENT = TRUE; ! We have exchanged init's ; 2379 3 RETURN STATE%SG; ; 2380 2 END; ; 2381 2 ; 2382 2 ! ; 2383 2 ! If we haven't returned yet, we must have gotten an invalid response. ; 2384 2 ! Just stay in the same state so we try again ; 2385 2 ! ; 2386 2 RETURN .STATE; ; 2387 1 END; ; SEND%SERVER%INIT U.2: PUSH SP,AC14 ; 2277 PUSH SP,AC16 PUSHJ SP,U.20 ; 2326 MOVE AC1,U.54 ; 2330 CAMLE AC1,SI%RETRIES JRST L.75 AOS U.54 ; 2335 PUSH SP,C.6 ; 2337 PUSH SP,U.46 PUSH SP,U.55 PUSHJ SP,U.24 ADJSP SP,-3 TRNN AC1,1 JRST L.72 PUSH SP,C.26 ; 2345 PUSHJ SP,TT%SET%OUTPUT MOVE AC14,AC1 PUSHJ SP,U.26 ; 2346 MOVE AC16,AC1 PUSHJ SP,TT%OUTPUT ; 2347 MOVEM AC14,0(SP) ; 2348 PUSHJ SP,TT%SET%OUTPUT CAIN AC16,162 ; 2350 JRST L.74 TRNE AC16,1 ; 2352 JRST L.71 CAIE AC16,262 ; 2355 CAIN AC16,300 JRST L.69 CAIN AC16,172 JRST L.69 MOVEI AC1,23 ; 2361 JRST L.70 L.69: MOVE AC1,U.51 L.70: ADJSP SP,-1 JRST L.77 ; 2355 L.71: MOVEI AC1,131 ; 2367 CAME AC1,U.58 JRST L.76 MOVE AC1,U.56 CAME AC1,U.55 JRST L.76 PUSHJ SP,U.21 ; 2375 MOVE AC16,AC1 TRNE AC16,1 JRST L.73 ADJSP SP,-1 L.72: MOVEI AC1,12 JRST L.77 L.73: SETZM U.54 ; 2377 MOVEI AC1,1 ; 2378 MOVEM AC1,U.64 L.74: ADJSP SP,-1 ; 2379 L.75: MOVEI AC1,14 ; 2369 JRST L.77 L.76: ADJSP SP,-1 ; 2386 MOVE AC1,U.51 ; 2315 L.77: POP SP,AC16 ; 2277 POP SP,AC14 POPJ SP, C.26: XWD 0,U.76 ; Routine Size: 61 words ; 2388 1 %SBTTL 'SEND%DATA' ; 2389 1 ROUTINE SEND%DATA = ; 2390 1 ; 2391 1 !++ ; 2392 1 ! FUNCTIONAL DESCRIPTION: ; 2393 1 ! ; 2394 1 ! This routine will send a data message to the remote KERMIT. ; 2395 1 ! ; 2396 1 ! CALLING SEQUENCE: ; 2397 1 ! ; 2398 1 ! STATE = SEND%DATA(); ; 2399 1 ! ; 2400 1 ! INPUT PARAMETERS: ; 2401 1 ! ; 2402 1 ! None. ; 2403 1 ! ; 2404 1 ! IMPLICIT INPUTS: ; 2405 1 ! ; 2406 1 ! None. ; 2407 1 ! ; 2408 1 ! OUTPUT PARAMETERS: ; 2409 1 ! ; 2410 1 ! New state to change the finite state machine to. ; 2411 1 ! ; 2412 1 ! IMPLICIT OUTPUTS: ; 2413 1 ! ; 2414 1 ! None. ; 2415 1 ! ; 2416 1 ! COMPLETION CODES: ; 2417 1 ! ; 2418 1 ! None. ; 2419 1 ! ; 2420 1 ! SIDE EFFECTS: ; 2421 1 ! ; 2422 1 ! None. ; 2423 1 ! ; 2424 1 !-- ; 2425 1 ; 2426 2 BEGIN ; 2427 2 ; 2428 2 LOCAL ; 2429 2 SUB%TYPE, ! Subtype for XFR%STATUS call ; 2430 2 STATUS; ! Status returned by various routines ; 2431 2 ; 2432 2 ! ; 2433 2 ! If there is nothing in the data packet, we should not bother to send it. ; 2434 2 ! Instead, we will just call BFR%FILL again to get some more data ; 2435 2 ! ; 2436 2 ; 2437 2 IF .SIZE NEQ 0 ! [108] ; 2438 2 THEN ; 2439 3 BEGIN ; 2440 3 ! ; 2441 3 ! Check to see if the number of retries have been exceeded. ; 2442 3 ! ; 2443 3 ; 2444 3 IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER; ; 2445 3 ; 2446 3 ! ; 2447 3 ! Not exceeded yet. Increment the number of retries we have attempted ; 2448 3 ! on this message. ; 2449 3 ! ; 2450 3 NUM%RETRIES = .NUM%RETRIES + 1; ; 2451 3 ! ; 2452 3 ! Attempt to send the packet and abort if the send fails. ; 2453 3 ! ; 2454 3 ; 2455 3 IF NOT SEND%PACKET (MSG%DATA, .SIZE, .MSG%NUMBER) THEN RETURN STATE%EX; ; 2456 3 ; 2457 3 ! ; 2458 3 ! Attempt to receive a message from the remote KERMIT. ; 2459 3 ! ; 2460 3 STATUS = REC%PACKET (); ; 2461 3 ; 2462 3 IF NOT .STATUS ; 2463 3 THEN ; 2464 4 BEGIN ; 2465 4 ; 2466 5 IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS ; 2467 5 EQL ; 2468 5 KER%CHKSUMERR) ; 2469 4 THEN ; 2470 4 RETURN .STATE ; 2471 4 ELSE ; 2472 4 RETURN STATE%EX; ; 2473 4 ; 2474 3 END; ; 2475 3 ; 2476 3 ! ; 2477 3 ! Determine if the message is a NAK and the NAK is for the message number ; 2478 3 ! that we are current working on. If the NAK is for the next packet then ; 2479 3 ! treat it like an ACK for this packet ; 2480 3 ! ; 2481 3 ; 2482 4 IF .REC%TYPE EQL MSG%NAK AND (.REC%SEQ NEQ ((.MSG%NUMBER + 1) AND %O'77')) ; 2483 3 THEN ; 2484 3 RETURN .STATE; ; 2485 3 ; 2486 3 ! ; 2487 3 ! Make sure we have a NAK or ACK ; 2488 3 ! ; 2489 3 ; 2490 4 IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK) ; 2491 3 THEN ; 2492 3 ! ; 2493 3 ! Not an ACK or NAK, abort. ; 2494 3 ! ; 2495 4 BEGIN ; 2496 4 KRM%ERROR (KER%PROTOERR); ; 2497 4 RETURN STATE%A; ; 2498 3 END; ; 2499 3 ; 2500 3 ! ; 2501 3 ! Is this for this message? ; 2502 3 ! ; 2503 3 ; 2504 3 IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE; ; 2505 3 ; 2506 3 ! ; 2507 3 ! It was. Set up for sending the next data message to the remote KERMIT ; 2508 3 ! and return. ; 2509 3 ! ; 2510 3 ! ; 2511 3 ! Check for data field in ACK indicating abort file or stream ; 2512 3 ! ; 2513 3 ! ; 2514 3 ; 2515 3 IF .REC%TYPE EQL MSG%ACK AND .REC%LENGTH EQL 1 ; 2516 3 THEN ; 2517 3 ; 2518 3 SELECTONE CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG, CHR%SIZE)) OF ! [108] ; 2519 3 SET ; 2520 3 ; 2521 3 [MSG%ACK%ABT%CUR] : ; 2522 3 ABT%CUR%FILE = TRUE; ; 2523 3 ; 2524 3 [MSG%ACK%ABT%ALL] : ; 2525 3 ABT%ALL%FILE = TRUE; ; 2526 3 TES; ; 2527 3 ; 2528 3 NUM%RETRIES = 0; ; 2529 3 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 2530 2 END; ! End of IF .SIZE NEQ 0 ; 2531 2 ; 2532 3 IF (BFR%FILL (FALSE) EQL KER%NORMAL) AND NOT (.ABT%CUR%FILE OR ; 2533 3 .ABT%ALL%FILE) ; 2534 2 THEN ; 2535 2 RETURN STATE%SD ; 2536 2 ELSE ; 2537 3 BEGIN ; 2538 3 ; 2539 3 IF ( NOT .CONNECT%FLAG) AND .TY%FIL ; 2540 3 THEN ; 2541 4 BEGIN ; 2542 4 ; 2543 4 IF .ABT%ALL%FILE ; 2544 4 THEN ; 2545 4 TT%TEXT (UPLIT (%ASCIZ' [Group interrupted]')) ; 2546 4 ELSE ; 2547 4 ; 2548 4 IF .ABT%CUR%FILE ; 2549 4 THEN ; 2550 4 TT%TEXT (UPLIT (%ASCIZ' [Interrupted]')) ; 2551 4 ELSE ; 2552 4 TT%TEXT (UPLIT (%ASCIZ' [OK]')); ; 2553 4 ; 2554 4 TT%CRLF (); ; 2555 3 END; ; 2556 3 ; 2557 3 IF .FLAG%FILE%OPEN THEN FILE%CLOSE (FALSE); ; 2558 3 ; 2559 3 SUB%TYPE = %C'C'; ! Assume ok ; 2560 3 ; 2561 3 IF .ABT%ALL%FILE ; 2562 3 THEN ; 2563 3 SUB%TYPE = %C'Z' ; 2564 3 ELSE ; 2565 3 ; 2566 3 IF .ABT%CUR%FILE THEN SUB%TYPE = %C'X'; ; 2567 3 ; 2568 3 XFR%STATUS (%C'F', .SUB%TYPE); ; 2569 3 FLAG%FILE%OPEN = FALSE; ; 2570 3 RETURN STATE%SZ; ; 2571 2 END; ; 2572 2 ; 2573 1 END; P.AAB: BYTE (7)" ","[","G","r","o" BYTE (7)"u","p"," ","i","n" BYTE (7)"t","e","r","r","u" BYTE (7)"p","t","e","d","]" BYTE (7)000,000,000,000,000 P.AAC: BYTE (7)" ","[","I","n","t" BYTE (7)"e","r","r","u","p" BYTE (7)"t","e","d","]",000 P.AAD: BYTE (7)" ","[","O","K","]" BYTE (7)000,000,000,000,000 ; SEND%DATA U.3: MOVE AC1,U.52 ; 2437 JUMPE AC1,L.87 MOVE AC2,U.54 ; 2444 CAMG AC2,PKT%RETRIES JRST L.78 MOVEI AC1,24 POPJ SP, L.78: AOS U.54 ; 2450 PUSH SP,C.28 ; 2455 PUSH SP,AC1 PUSH SP,U.55 PUSHJ SP,U.24 ADJSP SP,-3 TRNN AC1,1 JRST L.79 PUSHJ SP,U.26 ; 2460 TRNE AC1,1 ; 2462 JRST L.80 CAIE AC1,262 ; 2466 CAIN AC1,300 JRST L.83 CAIN AC1,172 JRST L.83 ; 2470 L.79: MOVEI AC1,23 ; 2472 POPJ SP, ; 2464 L.80: MOVE AC2,U.58 ; 2482 SETZ AC3, CAIE AC2,116 JRST L.81 MOVEI AC3,1 MOVE AC1,U.55 ADDI AC1,1 LDB AC4,C.18 CAME AC4,U.56 JRST L.83 L.81: CAIE AC2,131 ; 2490 TRNE AC3,1 JRST L.82 PUSH SP,C.21 ; 2496 PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 2497 MOVEI AC1,12 ; 2495 POPJ SP, L.82: SETZ AC1, ; 2504 MOVEI AC2,131 CAME AC2,U.58 JRST L.84 MOVEI AC1,1 MOVE AC2,U.56 CAMN AC2,U.55 JRST L.84 L.83: MOVE AC1,U.51 POPJ SP, L.84: TRNN AC1,1 ; 2515 JRST L.86 MOVEI AC1,1 CAME AC1,U.57 JRST L.86 MOVE AC2,C.27 ; 2518 MOVE AC1,U.39 ADJBP AC1,AC2 ILDB AC1,AC1 CAIE AC1,130 ; 2521 JRST L.85 MOVEI AC2,1 ; 2522 MOVEM AC2,ABT%CUR%FILE JRST L.86 ; 2518 L.85: CAIE AC1,132 ; 2524 JRST L.86 MOVEI AC1,1 ; 2525 MOVEM AC1,ABT%ALL%FILE L.86: SETZM U.54 ; 2528 MOVE AC1,U.55 ; 2529 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 L.87: PUSH SP,C.25 ; 2532 PUSHJ SP,U.29 ADJSP SP,-1 CAIE AC1,13 JRST L.88 MOVEI AC1,1 TDNE AC1,ABT%CUR%FILE JRST L.88 MOVEI AC1,1 ; 2533 TDNE AC1,ABT%ALL%FILE JRST L.88 MOVEI AC1,3 ; 2537 POPJ SP, L.88: MOVEI AC1,1 ; 2539 TDNE AC1,CONNECT%FLAG JRST L.92 MOVEI AC1,1 TDNN AC1,TY%FIL JRST L.92 MOVEI AC1,1 ; 2543 TDNN AC1,ABT%ALL%FILE JRST L.89 PUSH SP,C.29 ; 2545 JRST L.91 L.89: MOVEI AC1,1 ; 2548 TDNN AC1,ABT%CUR%FILE JRST L.90 PUSH SP,C.30 ; 2550 JRST L.91 L.90: PUSH SP,C.31 ; 2552 L.91: PUSHJ SP,TT%TEXT PUSHJ SP,TT%CRLF ; 2554 ADJSP SP,-1 ; 2541 L.92: MOVEI AC1,1 ; 2557 TDNN AC1,FLAG%FILE%OPEN JRST L.93 PUSH SP,C.25 PUSHJ SP,FILE%CLOSE ADJSP SP,-1 L.93: MOVEI AC1,103 ; 2559 MOVEI AC2,1 ; 2561 TDNN AC2,ABT%ALL%FILE JRST L.94 MOVEI AC1,132 ; 2563 JRST L.95 ; 2561 L.94: MOVEI AC2,1 ; 2566 TDNE AC2,ABT%CUR%FILE MOVEI AC1,130 L.95: PUSH SP,C.15 ; 2568 PUSH SP,AC1 PUSHJ SP,XFR%STATUS SETZM FLAG%FILE%OPEN ; 2569 ADJSP SP,-2 ; 2537 MOVEI AC1,4 POPJ SP, ; 2389 C.27: POINT 8,U.59,-1 C.28: EXP 104 C.29: XWD 0,P.AAB C.30: XWD 0,P.AAC C.31: XWD 0,P.AAD ; Routine Size: 136 words ; 2574 1 %SBTTL 'SEND%FILE' ; 2575 1 ROUTINE SEND%FILE = ; 2576 1 ; 2577 1 !++ ; 2578 1 ! FUNCTIONAL DESCRIPTION: ; 2579 1 ! ; 2580 1 ! This routine will send the file specification that is being ; 2581 1 ! transfered, or it will send a text header message. ; 2582 1 ! ; 2583 1 ! CALLING SEQUENCE: ; 2584 1 ! ; 2585 1 ! STATE = SEND%FILE(); ; 2586 1 ! ; 2587 1 ! INPUT PARAMETERS: ; 2588 1 ! ; 2589 1 ! None. ; 2590 1 ! ; 2591 1 ! IMPLICIT INPUTS: ; 2592 1 ! ; 2593 1 ! TEXT%HEAD%FLAG - If true, send text header instead of file header ; 2594 1 ! ; 2595 1 ! OUTPUT PARAMETERS: ; 2596 1 ! ; 2597 1 ! New state to change the finite state machine to. ; 2598 1 ! ; 2599 1 ! IMPLICIT OUTPUTS: ; 2600 1 ! ; 2601 1 ! None. ; 2602 1 ! ; 2603 1 ! COMPLETION CODES: ; 2604 1 ! ; 2605 1 ! None. ; 2606 1 ! ; 2607 1 ! SIDE EFFECTS: ; 2608 1 ! ; 2609 1 ! None. ; 2610 1 ! ; 2611 1 !-- ; 2612 1 ; 2613 2 BEGIN ; 2614 2 ; 2615 2 LOCAL ; 2616 2 M%TYPE, ! Message type to send ; 2617 2 STATUS; ! Status returned by various routines ; 2618 2 ; 2619 2 ! ; 2620 2 ! Flag we don't want to abort yet ; 2621 2 ! ; 2622 2 ABT%CUR%FILE = FALSE; ; 2623 2 ABT%ALL%FILE = FALSE; ; 2624 2 ! ; 2625 2 ! First determine if we have exceed the number of retries that are ; 2626 2 ! allowed to attempt to send this message. ; 2627 2 ! ; 2628 2 ; 2629 2 IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER; ; 2630 2 ; 2631 2 ! ; 2632 2 ! The number of retries are not exceeded. Increment the number and then ; 2633 2 ! attempt to send the packet again. ; 2634 2 ! ; 2635 2 NUM%RETRIES = .NUM%RETRIES + 1; ; 2636 2 SIZE = 0; ! Assume no name ; 2637 2 ; 2638 2 IF .TEXT%HEAD%FLAG THEN M%TYPE = MSG%TEXT ELSE M%TYPE = MSG%FILE; ; 2639 2 ; 2640 2 IF .FILE%SIZE NEQ 0 AND NOT .NO%FILE%NEEDED ; 2641 2 THEN ; 2642 3 BEGIN ; 2643 3 ![025] CH$MOVE (.FILE%SIZE, CH$PTR (FILE%NAME), ; 2644 3 ![025] CH$PTR (SND%MSG, PKT%MSG, ; 2645 3 ![025] CHR%SIZE)); ; 2646 3 ![025] ; 2647 3 ![025] Fill packet with file name ; 2648 3 ![025] ; 2649 3 SET%STRING (CH$PTR (FILE%NAME), .FILE%SIZE, TRUE); ; 2650 3 BFR%FILL (TRUE); ; 2651 3 SET%STRING (0, 0, FALSE); ; 2652 2 END; ; 2653 2 ; 2654 2 IF NOT SEND%PACKET (.M%TYPE, .SIZE, .MSG%NUMBER) THEN RETURN STATE%EX; ; 2655 2 ; 2656 2 ! ; 2657 2 ! Now get the responce from the remote KERMIT. ; 2658 2 ! ; 2659 2 STATUS = REC%PACKET (); ; 2660 2 ; 2661 2 IF NOT .STATUS ; 2662 2 THEN ; 2663 3 BEGIN ; 2664 3 ; 2665 4 IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL ; 2666 4 KER%CHKSUMERR) ; 2667 3 THEN ; 2668 3 RETURN .STATE ; 2669 3 ELSE ; 2670 3 RETURN STATE%EX; ; 2671 3 ; 2672 2 END; ; 2673 2 ; 2674 2 ! ; 2675 2 ! Determine if the packet is good. ; 2676 2 ! ; 2677 2 ; 2678 3 IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK) ; 2679 2 THEN ; 2680 3 BEGIN ; 2681 3 KRM%ERROR (KER%PROTOERR); ; 2682 3 RETURN STATE%A; ; 2683 2 END; ; 2684 2 ; 2685 2 ! ; 2686 2 ! If this is a NAK and the message number is not the one we just send ; 2687 2 ! treat this like an ACK, otherwise resend the last packet. ; 2688 2 ! ; 2689 2 ; 2690 3 IF .REC%TYPE EQL MSG%NAK AND (.REC%SEQ NEQ ((.MSG%NUMBER + 1) AND %O'77')) ; 2691 2 THEN RETURN .STATE; ; 2692 2 ; 2693 2 IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE; ; 2694 2 ; 2695 2 ! ; 2696 2 ! If all is ok, bump the message number and fill first buffer ; 2697 2 ! ; 2698 2 NUM%RETRIES = 0; ; 2699 2 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 2700 2 ; 2701 2 IF BFR%FILL (TRUE) THEN RETURN STATE%SD ELSE RETURN STATE%A; ; 2702 2 ; 2703 1 END; ! End of SEND%FILE ; SEND%FILE U.4: PUSH SP,AC16 ; 2575 SETZM ABT%CUR%FILE ; 2622 SETZM ABT%ALL%FILE ; 2623 MOVE AC1,U.54 ; 2629 CAMG AC1,PKT%RETRIES JRST L.96 MOVEI AC1,24 JRST L.107 L.96: AOS U.54 ; 2635 SETZM U.52 ; 2636 MOVEI AC1,1 ; 2638 TDNN AC1,U.62 JRST L.97 MOVEI AC16,130 JRST L.98 L.97: MOVEI AC16,106 L.98: MOVE AC1,FILE%SIZE ; 2640 JUMPE AC1,L.99 MOVEI AC2,1 TDNE AC2,U.63 JRST L.99 PUSH SP,C.10 ; 2649 PUSH SP,AC1 PUSH SP,C.2 PUSHJ SP,U.30 PUSH SP,C.2 ; 2650 PUSHJ SP,U.29 SETZM -2(SP) ; 2651 SETZM -1(SP) SETZM 0(SP) PUSHJ SP,U.30 ADJSP SP,-4 ; 2642 L.99: PUSH SP,AC16 ; 2654 PUSH SP,U.52 PUSH SP,U.55 PUSHJ SP,U.24 ADJSP SP,-3 TRNN AC1,1 JRST L.100 PUSHJ SP,U.26 ; 2659 TRNE AC1,1 ; 2661 JRST L.101 CAIE AC1,262 ; 2665 CAIN AC1,300 JRST L.104 CAIN AC1,172 JRST L.104 ; 2668 L.100: MOVEI AC1,23 ; 2670 JRST L.107 ; 2663 L.101: MOVE AC1,U.58 ; 2678 CAIE AC1,131 CAIN AC1,116 JRST L.102 PUSH SP,C.21 ; 2681 PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 2682 JRST L.106 L.102: MOVE AC2,U.58 ; 2690 CAIE AC2,116 JRST L.103 MOVE AC1,U.55 ADDI AC1,1 LDB AC3,C.18 CAME AC3,U.56 JRST L.104 L.103: CAIE AC2,131 ; 2693 JRST L.105 MOVE AC1,U.56 CAMN AC1,U.55 JRST L.105 L.104: MOVE AC1,U.51 JRST L.107 L.105: SETZM U.54 ; 2698 MOVE AC1,U.55 ; 2699 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 PUSH SP,C.2 ; 2701 PUSHJ SP,U.29 ADJSP SP,-1 TRNN AC1,1 JRST L.106 MOVEI AC1,3 JRST L.107 L.106: MOVEI AC1,12 L.107: POP SP,AC16 ; 2575 POPJ SP, ; Routine Size: 87 words ; 2704 1 %SBTTL 'SEND%EOF' ; 2705 1 ROUTINE SEND%EOF = ; 2706 1 ; 2707 1 !++ ; 2708 1 ! FUNCTIONAL DESCRIPTION: ; 2709 1 ! ; 2710 1 ! This routine will send the end of file message to the remote ; 2711 1 ! KERMIT. It will then determine if there are more files to ; 2712 1 ! send to the remote. ; 2713 1 ! ; 2714 1 ! CALLING SEQUENCE: ; 2715 1 ! ; 2716 1 ! STATE = SEND%EOF(); ; 2717 1 ! ; 2718 1 ! INPUT PARAMETERS: ; 2719 1 ! ; 2720 1 ! None. ; 2721 1 ! ; 2722 1 ! IMPLICIT INPUTS: ; 2723 1 ! ; 2724 1 ! None. ; 2725 1 ! ; 2726 1 ! OUTPUT PARAMETERS: ; 2727 1 ! ; 2728 1 ! New state to change the finite state machine to. ; 2729 1 ! ; 2730 1 ! IMPLICIT OUTPUTS: ; 2731 1 ! ; 2732 1 ! None. ; 2733 1 ! ; 2734 1 ! COMPLETION CODES: ; 2735 1 ! ; 2736 1 ! None. ; 2737 1 ! ; 2738 1 ! SIDE EFFECTS: ; 2739 1 ! ; 2740 1 ! Sets up for the next file to be processed if there is one. ; 2741 1 ! ; 2742 1 !-- ; 2743 1 ; 2744 2 BEGIN ; 2745 2 ; 2746 2 LOCAL ; 2747 2 STATUS, ! Status returned by various routines ; 2748 2 EOF%MSG%LEN; ! Length of EOF message to send ; 2749 2 ; 2750 2 ! ; 2751 2 ! First determine if we have exceed the number of retries that are ; 2752 2 ! allowed to attempt to send this message. ; 2753 2 ! ; 2754 2 ; 2755 2 IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER; ; 2756 2 ; 2757 2 ! ; 2758 2 ! The number of retries are not exceeded. Increment the number and then ; 2759 2 ! attempt to send the packet again. ; 2760 2 ! ; 2761 2 NUM%RETRIES = .NUM%RETRIES + 1; ; 2762 2 ! ; 2763 2 ! Store character in packet to indicate discard of file ; 2764 2 ! Character will only be sent if file should be discarded ; 2765 2 ! ; 2766 2 CH$WCHAR (MSG%EOF%DISCARD, CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE)); ; 2767 2 ; 2768 2 IF .ABT%CUR%FILE OR .ABT%ALL%FILE THEN EOF%MSG%LEN = 1 ELSE EOF%MSG%LEN = 0; ; 2769 2 ; 2770 2 IF NOT SEND%PACKET (MSG%EOF, .EOF%MSG%LEN, .MSG%NUMBER) THEN RETURN ; 2771 2 STATE%EX; ; 2772 2 ; 2773 2 ! ; 2774 2 ! Now get the responce from the remote KERMIT. ; 2775 2 ! ; 2776 2 STATUS = REC%PACKET (); ; 2777 2 ; 2778 2 IF NOT .STATUS ; 2779 2 THEN ; 2780 3 BEGIN ; 2781 3 ; 2782 4 IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL ; 2783 4 KER%CHKSUMERR) ; 2784 3 THEN ; 2785 3 RETURN .STATE ; 2786 3 ELSE ; 2787 3 RETURN STATE%EX; ; 2788 3 ; 2789 2 END; ; 2790 2 ; 2791 2 ! ; 2792 2 ! Determine if the packet is good. ; 2793 2 ! ; 2794 2 ; 2795 3 IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK) ; 2796 2 THEN ; 2797 3 BEGIN ; 2798 3 KRM%ERROR (KER%PROTOERR); ; 2799 3 RETURN STATE%A; ; 2800 2 END; ; 2801 2 ; 2802 2 ! ; 2803 2 ! If this is a NAK and the message number is not the one we just send ; 2804 2 ! treat this like an ACK, otherwise resend the last packet. ; 2805 2 ! ; 2806 2 ; 2807 3 IF .REC%TYPE EQL MSG%NAK AND (.REC%SEQ NEQ ((.MSG%NUMBER + 1) AND %O'77')) ; 2808 2 THEN RETURN .STATE; ; 2809 2 ; 2810 2 IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE; ; 2811 2 ; 2812 2 ! ; 2813 2 ! Here to determine if there is another file to send. ; 2814 2 ! ; 2815 2 NUM%RETRIES = 0; ; 2816 2 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 2817 2 ; 2818 2 IF NOT .ABT%ALL%FILE THEN STATUS = NEXT%FILE () ELSE STATUS = ; 2819 2 KER%NOMORFILES; ; 2820 2 ; 2821 3 IF ( NOT .STATUS) OR (.STATUS EQL KER%NOMORFILES) ; 2822 2 THEN ; 2823 3 BEGIN ; 2824 3 ; 2825 3 IF (.STATUS NEQ KER%NOMORFILES) THEN RETURN STATE%A ELSE RETURN STATE%SB; ; 2826 3 ; 2827 3 END ; 2828 2 ELSE ; 2829 3 BEGIN ; 2830 3 FLAG%FILE%OPEN = TRUE; ! Have a file open again ; 2831 3 ; 2832 3 IF .FIL%NORMAL%FORM THEN NORMALIZE%FILE (FILE%NAME, FILE%SIZE, -1, -1); ; 2833 3 ; 2834 3 XFR%STATUS (%C'F', %C'S'); ! Inform display routine ; 2835 3 ; 2836 3 IF ( NOT .CONNECT%FLAG) AND .TY%FIL ; 2837 3 THEN ; 2838 4 BEGIN ; 2839 4 !![045] TT%TEXT (UPLIT (%ASCIZ'Sending: ')); ; 2840 4 TT%TEXT (FILE%NAME); ; 2841 4 TT%OUTPUT (); ; 2842 3 END; ; 2843 3 ; 2844 3 FILE%CHARS = 0; ! No characters sent yet ; 2845 3 RETURN STATE%SF; ; 2846 2 END; ; 2847 2 ; 2848 1 END; ! End of SEND%EOF ; SEND%EOF U.7: PUSH SP,AC16 ; 2705 MOVE AC1,U.54 ; 2755 CAMG AC1,PKT%RETRIES JRST L.108 MOVEI AC1,24 JRST L.125 L.108: AOS U.54 ; 2761 MOVEI AC2,104 ; 2766 MOVE AC1,C.32 IDPB AC2,AC1 MOVEI AC1,1 ; 2768 TDNE AC1,ABT%CUR%FILE JRST L.109 MOVEI AC1,1 TDNN AC1,ABT%ALL%FILE JRST L.110 L.109: MOVEI AC1,1 JRST L.111 L.110: SETZ AC1, L.111: PUSH SP,C.33 ; 2770 PUSH SP,AC1 PUSH SP,U.55 PUSHJ SP,U.24 ADJSP SP,-3 TRNN AC1,1 JRST L.112 PUSHJ SP,U.26 ; 2776 MOVE AC16,AC1 TRNE AC16,1 ; 2778 JRST L.113 CAIE AC16,262 ; 2782 CAIN AC16,300 JRST L.116 CAIN AC16,172 JRST L.116 ; 2785 L.112: MOVEI AC1,23 ; 2787 JRST L.125 ; 2780 L.113: MOVE AC1,U.58 ; 2795 CAIE AC1,131 CAIN AC1,116 JRST L.114 PUSH SP,C.21 ; 2798 PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 2799 JRST L.120 L.114: MOVE AC2,U.58 ; 2807 CAIE AC2,116 JRST L.115 MOVE AC1,U.55 ADDI AC1,1 LDB AC3,C.18 CAME AC3,U.56 JRST L.116 L.115: CAIE AC2,131 ; 2810 JRST L.117 MOVE AC1,U.56 CAMN AC1,U.55 JRST L.117 L.116: MOVE AC1,U.51 JRST L.125 L.117: SETZM U.54 ; 2815 MOVE AC1,U.55 ; 2816 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 MOVEI AC1,1 ; 2818 TDNE AC1,ABT%ALL%FILE JRST L.118 PUSHJ SP,NEXT%FILE SKIPA AC16,AC1 L.118: MOVEI AC16,133 TRNN AC16,1 ; 2821 JRST L.119 CAIE AC16,133 JRST L.122 L.119: CAIN AC16,133 ; 2825 JRST L.121 L.120: MOVEI AC1,12 JRST L.125 L.121: MOVEI AC1,5 JRST L.125 ; 2829 L.122: MOVEI AC1,1 ; 2830 MOVEM AC1,FLAG%FILE%OPEN MOVEI AC1,1 ; 2832 TDNN AC1,FIL%NORMAL%FORM JRST L.123 PUSH SP,C.34 PUSH SP,C.35 PUSH SP,C.36 PUSH SP,C.36 PUSHJ SP,U.27 ADJSP SP,-4 L.123: PUSH SP,C.15 ; 2834 PUSH SP,C.8 PUSHJ SP,XFR%STATUS MOVEI AC1,1 ; 2836 TDNE AC1,CONNECT%FLAG JRST L.124 MOVEI AC1,1 TDNN AC1,TY%FIL JRST L.124 PUSH SP,C.34 ; 2840 PUSHJ SP,TT%TEXT PUSHJ SP,TT%OUTPUT ; 2841 ADJSP SP,-1 ; 2838 L.124: SETZM U.61 ; 2844 ADJSP SP,-2 ; 2829 MOVEI AC1,2 L.125: POP SP,AC16 ; 2705 POPJ SP, C.32: POINT 8,U.60,31 C.33: EXP 132 C.34: XWD 0,FILE%NAME C.35: XWD 0,FILE%SIZE C.36: EXP -1 ; Routine Size: 115 words ; 2849 1 %SBTTL 'SEND%INIT' ; 2850 1 ROUTINE SEND%INIT = ; 2851 1 ; 2852 1 !++ ; 2853 1 ! FUNCTIONAL DESCRIPTION: ; 2854 1 ! ; 2855 1 ! This routine will send the initialization packet to the remote ; 2856 1 ! KERMIT. The message type sent is S. ; 2857 1 ! ; 2858 1 ! CALLING SEQUENCE: ; 2859 1 ! ; 2860 1 ! STATE = SEND%INIT(); ; 2861 1 ! ; 2862 1 ! INPUT PARAMETERS: ; 2863 1 ! ; 2864 1 ! None. ; 2865 1 ! ; 2866 1 ! IMPLICIT INPUTS: ; 2867 1 ! ; 2868 1 ! None. ; 2869 1 ! ; 2870 1 ! OUTPUT PARAMETERS: ; 2871 1 ! ; 2872 1 ! New state to change the finite state machine to. ; 2873 1 ! ; 2874 1 ! IMPLICIT OUTPUTS: ; 2875 1 ! ; 2876 1 ! None. ; 2877 1 ! ; 2878 1 ! COMPLETION CODES: ; 2879 1 ! ; 2880 1 ! None. ; 2881 1 ! ; 2882 1 ! SIDE EFFECTS: ; 2883 1 ! ; 2884 1 ! None. ; 2885 1 ! ; 2886 1 !-- ; 2887 1 ; 2888 2 BEGIN ; 2889 2 ; 2890 2 LOCAL ; 2891 2 STATUS; ! Status returned by various routines ; 2892 2 ; 2893 2 SET%SEND%INIT (); ; 2894 2 ; 2895 2 IF .NUM%RETRIES GTR .SI%RETRIES THEN RETURN STATE%ER; ; 2896 2 ; 2897 2 ! ; 2898 2 ! Count the number of times we try this ; 2899 2 ! ; 2900 2 NUM%RETRIES = .NUM%RETRIES + 1; ; 2901 2 ; 2902 2 IF NOT SEND%PACKET (MSG%SND%INIT, .SEND%INIT%SIZE, .MSG%NUMBER) THEN RETURN ; 2903 2 STATE%EX; ! [108] ; 2904 2 ; 2905 2 ! ; 2906 2 ! Determine if we received a packet it good condition. If we timed out or ; 2907 2 ! got an illegal message, just try again. ; 2908 2 ! ; 2909 2 STATUS = REC%PACKET (); ; 2910 2 ; 2911 2 IF NOT .STATUS ; 2912 2 THEN ; 2913 3 BEGIN ; 2914 3 ; 2915 4 IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL ; 2916 4 KER%CHKSUMERR) ; 2917 3 THEN ; 2918 3 RETURN .STATE ; 2919 3 ELSE ; 2920 3 RETURN STATE%EX; ; 2921 3 ; 2922 2 END; ; 2923 2 ; 2924 2 ! ; 2925 2 ! Determine if the packet is good. ; 2926 2 ! ; 2927 2 ; 2928 2 IF .REC%TYPE NEQ MSG%ACK THEN RETURN .STATE; ; 2929 2 ; 2930 2 IF .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE; ; 2931 2 ; 2932 2 ! ; 2933 2 ! Here if we have an ACK for the initialization message that was just sent ; 2934 2 ! to the remote KERMIT. ; 2935 2 ! ; 2936 2 ; 2937 2 IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN STATE%A; ; 2938 2 ; 2939 2 BLK%CHK%TYPE = .INI%CHK%TYPE; ! We now use agreed upon block check type ; 2940 2 NUM%RETRIES = 0; ; 2941 2 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 2942 2 RETURN STATE%OF; ! Now need to open the file ; 2943 1 END; ; SEND%INIT U.8: PUSHJ SP,U.20 ; 2893 MOVE AC1,U.54 ; 2895 CAMG AC1,SI%RETRIES JRST L.126 MOVEI AC1,24 POPJ SP, L.126: AOS U.54 ; 2900 PUSH SP,C.8 ; 2902 PUSH SP,U.46 PUSH SP,U.55 PUSHJ SP,U.24 ADJSP SP,-3 TRNE AC1,1 JRST L.127 MOVEI AC1,23 POPJ SP, L.127: PUSHJ SP,U.26 ; 2909 TRNE AC1,1 ; 2911 JRST L.129 CAIE AC1,262 ; 2915 CAIN AC1,300 JRST L.128 CAIN AC1,172 L.128: SKIPA AC2,U.51 ; 2920 MOVEI AC2,23 MOVE AC1,AC2 ; 2913 POPJ SP, L.129: MOVEI AC2,131 ; 2928 CAME AC2,U.58 JRST L.130 MOVE AC2,U.56 ; 2930 CAMN AC2,U.55 JRST L.131 L.130: MOVE AC1,U.51 POPJ SP, L.131: PUSHJ SP,U.21 ; 2937 TRNE AC1,1 JRST L.132 MOVEI AC1,12 POPJ SP, L.132: MOVE AC1,U.47 ; 2939 MOVEM AC1,U.48 SETZM U.54 ; 2940 MOVE AC1,U.55 ; 2941 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 MOVEI AC1,22 ; 2888 POPJ SP, ; 2850 ; Routine Size: 49 words ; 2944 1 %SBTTL 'SEND%OPEN%FILE - Open file for sending' ; 2945 1 ROUTINE SEND%OPEN%FILE = ; 2946 1 ; 2947 1 !++ ; 2948 1 ! FUNCTIONAL DESCRIPTION: ; 2949 1 ! ; 2950 1 ! This routine is called from DO%TRANSACTION when the first input file ; 2951 1 ! needs to be opened. ; 2952 1 ! ; 2953 1 ! CALLING SEQUENCE: ; 2954 1 ! ; 2955 1 ! STATE = SEND%OPEN%FILE (); ; 2956 1 ! ; 2957 1 ! INPUT PARAMETERS: ; 2958 1 ! ; 2959 1 ! None. ; 2960 1 ! ; 2961 1 ! IMPLICIT INPUTS: ; 2962 1 ! ; 2963 1 ! FILE%NAME, FILE%SIZE, etc. ; 2964 1 ! ; 2965 1 ! OUPTUT PARAMETERS: ; 2966 1 ! ; 2967 1 ! New state for FSM. ; 2968 1 ! ; 2969 1 ! IMPLICIT OUTPUTS: ; 2970 1 ! ; 2971 1 ! None. ; 2972 1 ! ; 2973 1 ! COMPLETION CODES: ; 2974 1 ! ; 2975 1 ! None. ; 2976 1 ! ; 2977 1 ! SIDE EFFECTS: ; 2978 1 ! ; 2979 1 ! None. ; 2980 1 ! ; 2981 1 !-- ; 2982 1 ; 2983 2 BEGIN ; 2984 2 ; 2985 2 IF ( NOT .CONNECT%FLAG) AND .TY%FIL ; 2986 2 THEN ; 2987 3 BEGIN ; 2988 3 TT%TEXT (UPLIT (%ASCIZ'Sending: ')); ; 2989 3 TT%OUTPUT (); ; 2990 2 END; ; 2991 2 ; 2992 2 FILE%CHARS = 0; ! No characters sent yet ; 2993 2 ; 2994 2 IF NOT .NO%FILE%NEEDED ; 2995 2 THEN ; 2996 2 ; 2997 2 IF NOT FILE%OPEN (FNC%READ) THEN RETURN STATE%A ELSE FLAG%FILE%OPEN = TRUE; ; 2998 2 ; 2999 2 ![023] ; 3000 2 ![023] If we want normalized file names, beat up the name now ; 3001 2 ![023] ; 3002 2 ; 3003 2 IF .FIL%NORMAL%FORM THEN NORMALIZE%FILE (FILE%NAME, FILE%SIZE, -1, -1); ; 3004 2 ; 3005 2 XFR%STATUS (%C'F', %C'S'); ! Inform display routine ; 3006 2 ; 3007 2 IF ( NOT .CONNECT%FLAG) AND .TY%FIL ; 3008 2 THEN ; 3009 3 BEGIN ; 3010 3 TT%TEXT (FILE%NAME); ; 3011 3 TT%OUTPUT (); ; 3012 2 END; ; 3013 2 ; 3014 2 RETURN STATE%SF; ; 3015 1 END; ! End of FSM%OPEN%FILE P.AAE: BYTE (7)"S","e","n","d","i" BYTE (7)"n","g",":"," ",000 ; SEND%OPEN%FILE U.5: MOVEI AC1,1 ; 2985 TDNE AC1,CONNECT%FLAG JRST L.133 MOVEI AC1,1 TDNN AC1,TY%FIL JRST L.133 PUSH SP,C.37 ; 2988 PUSHJ SP,TT%TEXT PUSHJ SP,TT%OUTPUT ; 2989 ADJSP SP,-1 ; 2987 L.133: SETZM U.61 ; 2992 MOVEI AC1,1 ; 2994 TDNE AC1,U.63 JRST L.135 PUSH SP,C.25 ; 2997 PUSHJ SP,FILE%OPEN ADJSP SP,-1 TRNE AC1,1 JRST L.134 MOVEI AC1,12 POPJ SP, L.134: MOVEI AC1,1 MOVEM AC1,FLAG%FILE%OPEN L.135: MOVEI AC1,1 ; 3003 TDNN AC1,FIL%NORMAL%FORM JRST L.136 PUSH SP,C.34 PUSH SP,C.35 PUSH SP,C.36 PUSH SP,C.36 PUSHJ SP,U.27 ADJSP SP,-4 L.136: PUSH SP,C.15 ; 3005 PUSH SP,C.8 PUSHJ SP,XFR%STATUS MOVEI AC1,1 ; 3007 TDNE AC1,CONNECT%FLAG JRST L.137 MOVEI AC1,1 TDNN AC1,TY%FIL JRST L.137 PUSH SP,C.34 ; 3010 PUSHJ SP,TT%TEXT PUSHJ SP,TT%OUTPUT ; 3011 ADJSP SP,-1 ; 3009 L.137: ADJSP SP,-2 ; 3014 MOVEI AC1,2 ; 2983 POPJ SP, ; 2945 C.37: XWD 0,P.AAE ; Routine Size: 49 words ; 3016 1 %SBTTL 'SEND%GENCMD' ; 3017 1 ROUTINE SEND%GENCMD = ; 3018 1 ; 3019 1 !++ ; 3020 1 ! FUNCTIONAL DESCRIPTION: ; 3021 1 ! ; 3022 1 ! This routine will send a command packet to the server Kermit. ; 3023 1 ! The new state will depend upon the response. If a send-init ; 3024 1 ! is received, it will process it and switch to STATE%RF. ; 3025 1 ! If a text-header is received it will switch to STATE%RD. ; 3026 1 ! If an ACK is received, it will type the data portion and ; 3027 1 ! switch to STATE%C. ; 3028 1 ! ; 3029 1 ! CALLING SEQUENCE: ; 3030 1 ! ; 3031 1 ! STATE = SEND%GENCMD(); ; 3032 1 ! ; 3033 1 ! INPUT PARAMETERS: ; 3034 1 ! ; 3035 1 ! None. ; 3036 1 ! ; 3037 1 ! IMPLICIT INPUTS: ; 3038 1 ! ; 3039 1 ! GEN%TYPE - Message type to send (normally MSG%GENERIC) ; 3040 1 ! GEN%SUBTYPE - Message subtype (only if MSG%GENERIC) ; 3041 1 ! GEN%1DATA - First argument string ; 3042 1 ! GEN%1SIZE - Size of first argument ; 3043 1 ! GEN%2DATA - Second argument string ; 3044 1 ! GEN%2SIZE - Size of second argument ; 3045 1 ! GEN%3DATA - Third argument string ; 3046 1 ! GEN%3SIZE - Size of third argument ; 3047 1 ! ; 3048 1 ! OUTPUT PARAMETERS: ; 3049 1 ! ; 3050 1 ! New state for the finite state machine. ; 3051 1 ! ; 3052 1 ! IMPLICIT OUTPUTS: ; 3053 1 ! ; 3054 1 ! None. ; 3055 1 ! ; 3056 1 ! COMPLETION CODES: ; 3057 1 ! ; 3058 1 ! None. ; 3059 1 ! ; 3060 1 ! SIDE EFFECTS: ; 3061 1 ! ; 3062 1 ! None. ; 3063 1 ! ; 3064 1 !-- ; 3065 1 ; 3066 2 BEGIN ; 3067 2 ; 3068 2 LOCAL ; 3069 2 POINTER, ! Pointer at DATA%TEXT ; 3070 2 DATA%TEXT : VECTOR [CH$ALLOCATION (MAX%MSG)], ! Data buffer ; 3071 2 DATA%SIZE, ! Length of data buffer used ; 3072 2 STATUS; ! Status returned by various routines ; 3073 2 ; 3074 2 ROUTINE PACK%DATA (POINTER, LENGTH, SRC%ADDR, SRC%LEN) = ; 3075 2 ! ; 3076 2 ! Routine to pack an argument into the buffer. ; 3077 2 ! ; 3078 3 BEGIN ; 3079 3 ; 3080 3 IF .SRC%LEN GTR MAX%MSG - .LENGTH - 1 THEN SRC%LEN = MAX%MSG - .LENGTH - 1; ; 3081 3 ; 3082 3 LENGTH = .LENGTH + .SRC%LEN + 1; ; 3083 3 CH$WCHAR%A (CHAR (.SRC%LEN), .POINTER); ; 3084 3 .POINTER = CH$MOVE (.SRC%LEN, CH$PTR (.SRC%ADDR), ..POINTER); ; 3085 3 RETURN .LENGTH; ; 3086 2 END; ; PACK%DATA U.77: MOVE AC1,-3(SP) ; 3080 SUBI AC1,1751 MOVN AC2,AC1 CAMGE AC2,-1(SP) MOVNM AC1,-1(SP) MOVE AC1,-3(SP) ; 3082 ADD AC1,-1(SP) ADDI AC1,1 MOVEM AC1,-3(SP) MOVE AC2,-1(SP) ; 3083 ADDI AC2,40 MOVE AC1,-4(SP) IDPB AC2,0(AC1) MOVE AC3,-4(SP) ; 3084 MOVE AC1,-2(SP) MOVEI AC2,-1(AC1) HRLI AC2,10700 MOVE AC1,-1(SP) MOVE AC4,-1(SP) MOVE AC5,0(AC3) EXTEND AC1,C.9 JFCL MOVEM AC5,0(AC3) MOVE AC1,-3(SP) ; 3078 POPJ SP, ; 3074 ; Routine Size: 25 words ; 3087 2 ! ; 3088 2 ! First determine if we have exceed the number of retries that are ; 3089 2 ! allowed to attempt to send this message. ; 3090 2 ! ; 3091 2 ; 3092 2 IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER; ; 3093 2 ; 3094 2 ! ; 3095 2 ! The number of retries are not exceeded. Increment the number and then ; 3096 2 ! attempt to send the packet again. ; 3097 2 ! ; 3098 2 NUM%RETRIES = .NUM%RETRIES + 1; ; 3099 2 ! ; 3100 2 ! Build the packet data field ; 3101 2 ! ; 3102 2 POINTER = CH$PTR (DATA%TEXT); ; 3103 2 DATA%SIZE = 0; ; 3104 2 ; 3105 2 IF .GEN%TYPE EQL MSG%GENERIC ; 3106 2 THEN ; 3107 3 BEGIN ; 3108 3 CH$WCHAR%A (.GEN%SUBTYPE, POINTER); ; 3109 3 DATA%SIZE = 1; ; 3110 3 ; 3111 3 IF .GEN%1SIZE GTR 0 OR .GEN%2SIZE GTR 0 OR .GEN%3SIZE GTR 0 ; 3112 3 THEN ; 3113 4 BEGIN ; 3114 4 DATA%SIZE = PACK%DATA (POINTER, .DATA%SIZE, GEN%1DATA, .GEN%1SIZE); ; 3115 4 ; 3116 4 IF .GEN%2SIZE GTR 0 OR .GEN%3SIZE GTR 0 ; 3117 4 THEN ; 3118 5 BEGIN ; 3119 5 DATA%SIZE = PACK%DATA (POINTER, .DATA%SIZE, GEN%2DATA, .GEN%2SIZE); ; 3120 5 ; 3121 5 IF .GEN%3SIZE GTR 0 ; 3122 5 THEN ; 3123 6 BEGIN ; 3124 6 DATA%SIZE = PACK%DATA (POINTER, .DATA%SIZE, GEN%3DATA, .GEN%3SIZE); ; 3125 5 END; ; 3126 5 ; 3127 4 END; ; 3128 4 ; 3129 3 END; ; 3130 3 ; 3131 3 END ; 3132 2 ELSE ; 3133 3 BEGIN ; 3134 3 ; 3135 3 IF .GEN%1SIZE GTR MAX%MSG THEN GEN%1SIZE = MAX%MSG; ; 3136 3 ; 3137 3 DATA%SIZE = .GEN%1SIZE; ; 3138 3 CH$MOVE (.GEN%1SIZE, CH$PTR (GEN%1DATA), .POINTER); ; 3139 2 END; ; 3140 2 ; 3141 2 SET%STRING (CH$PTR (DATA%TEXT), .DATA%SIZE, TRUE); ; 3142 2 BFR%FILL (TRUE); ; 3143 2 SET%STRING (0, 0, FALSE); ; 3144 2 ! ; 3145 2 ! Send the packet ; 3146 2 ! ; 3147 2 ; 3148 2 IF NOT SEND%PACKET (.GEN%TYPE, .SIZE, .MSG%NUMBER) THEN RETURN STATE%EX; ; 3149 2 ; 3150 2 ! ; 3151 2 ! Now get the responce from the remote KERMIT. ; 3152 2 ! ; 3153 2 STATUS = REC%PACKET (); ; 3154 2 ; 3155 2 IF NOT .STATUS ; 3156 2 THEN ; 3157 3 BEGIN ; 3158 3 ; 3159 4 IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL ; 3160 4 KER%CHKSUMERR) ; 3161 3 THEN ; 3162 3 RETURN .STATE ; 3163 3 ELSE ; 3164 3 RETURN STATE%EX; ; 3165 3 ; 3166 2 END; ; 3167 2 ; 3168 2 ! Did we get a send-init? ; 3169 2 ; 3170 2 SELECTONE .REC%TYPE OF ; 3171 2 SET ; 3172 2 ; 3173 2 [MSG%SND%INIT] : ; 3174 3 BEGIN ; 3175 3 MSG%NUMBER = .REC%SEQ; ! Initialize sequence numbers ; 3176 3 ! Determine if the parameters are ok. If not, give up ; 3177 3 ; 3178 3 IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN .STATUS; ; 3179 3 ; 3180 3 SET%SEND%INIT (); ! Set up our acknowledgement to the send-init ; 3181 3 SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .MSG%NUMBER); ! [108] ! Send it ; 3182 3 BLK%CHK%TYPE = .INI%CHK%TYPE; ! Can now use agreed upon type ; 3183 3 OLD%RETRIES = .NUM%RETRIES; ; 3184 3 NUM%RETRIES = 0; ; 3185 3 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 3186 3 RETURN STATE%RF; ! Now expect file header ; 3187 2 END; ; 3188 2 ; 3189 2 [MSG%TEXT] : ; 3190 2 ! ; 3191 2 ! If we just got a text header, set up for typing on the terminal and ; 3192 2 ! shift to receiving data ; 3193 2 ! ; 3194 3 BEGIN ; 3195 3 TEXT%HEAD%FLAG = TRUE; ! We want terminal output ; 3196 3 PUT%CHR%ROUTINE = TYPE%CHAR; ! Set up the put a character routine ; 3197 3 ; 3198 3 IF .REC%LENGTH GTR 0 ; 3199 3 THEN ; 3200 4 BEGIN ; 3201 4 TT%TEXT (UPLIT (%ASCIZ'<<')); ! Make sure file name sticks out ; 3202 4 BFR%EMPTY (); ! Dump the packet data to the terminal ; 3203 4 TT%TEXT (UPLIT (%ASCIZ'>>')); ! So user can tell where name ends ; 3204 4 TT%CRLF (); ! And a CRLF ; 3205 3 END; ; 3206 3 ; 3207 3 SEND%PACKET (MSG%ACK, 0, .MSG%NUMBER); ! Send an ACK ; 3208 3 OLD%RETRIES = .NUM%RETRIES; ; 3209 3 NUM%RETRIES = 0; ; 3210 3 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 3211 3 RETURN STATE%RD; ! We now want data ; 3212 2 END; ; 3213 2 ; 3214 2 [MSG%ACK] : ; 3215 2 ! ; 3216 2 ! If we get an ACK, just type the data on the terminal and complete the ; 3217 2 ! transaction. ; 3218 2 ! ; 3219 3 BEGIN ; 3220 3 PUT%CHR%ROUTINE = TYPE%CHAR; ! Dump to terminal ; 3221 3 BFR%EMPTY (); ! Do it ; 3222 3 ; 3223 3 IF .REC%LENGTH GTR 0 THEN TT%CRLF (); ; 3224 3 ; 3225 3 RETURN STATE%C; ! And go idle ; 3226 2 END; ; 3227 2 ; 3228 2 [MSG%NAK] : ; 3229 2 ! ; 3230 2 ! If we get a NAK, stay in the same state. We will re-transmit the ; 3231 2 ! packet again. ; 3232 2 ! ; 3233 2 RETURN .STATE; ; 3234 2 TES; ; 3235 2 ; 3236 2 ! ; 3237 2 ! If we get here, we didn't get anything resembling an acceptable ; 3238 2 ! packet, so we will abort. ; 3239 2 ! ; 3240 2 KRM%ERROR (KER%PROTOERR); ; 3241 2 RETURN STATE%A; ; 3242 1 END; P.AAF: BYTE (7)"<","<",000,000,000 P.AAG: BYTE (7)">",">",000,000,000 ; SEND%GENCMD U.6: ADJSP SP,312 ; 3017 MOVE AC1,U.54 ; 3092 CAMG AC1,PKT%RETRIES JRST L.138 MOVEI AC1,24 JRST L.155 L.138: AOS U.54 ; 3098 MOVEI AC1,-312(SP) ; 3102 HRLI AC1,10700 MOVEM AC1,0(SP) SETZ AC3, ; 3103 MOVEI AC1,107 ; 3105 CAME AC1,U.65 JRST L.143 MOVE AC1,U.66 ; 3108 IDPB AC1,0(SP) MOVEI AC3,1 ; 3109 MOVE AC1,GEN%1SIZE ; 3111 JUMPG AC1,L.139 SKIPLE GEN%2SIZE JRST L.139 SKIPG GEN%3SIZE JRST L.145 L.139: MOVEI AC2,0(SP) ; 3114 PUSH SP,AC2 PUSH SP,AC3 PUSH SP,C.38 PUSH SP,AC1 PUSHJ SP,U.77 MOVE AC3,AC1 MOVE AC1,GEN%2SIZE ; 3116 JUMPG AC1,L.140 SKIPG GEN%3SIZE JRST L.142 L.140: MOVEI AC2,-4(SP) ; 3119 PUSH SP,AC2 PUSH SP,AC3 PUSH SP,C.39 PUSH SP,AC1 PUSHJ SP,U.77 MOVE AC3,AC1 MOVE AC1,GEN%3SIZE ; 3121 JUMPLE AC1,L.141 MOVEI AC2,-10(SP) ; 3124 PUSH SP,AC2 PUSH SP,AC3 PUSH SP,C.40 PUSH SP,AC1 PUSHJ SP,U.77 MOVE AC3,AC1 ADJSP SP,-4 ; 3123 L.141: ADJSP SP,-4 ; 3118 L.142: ADJSP SP,-4 ; 3113 JRST L.145 ; 3111 L.143: MOVEI AC1,1752 ; 3135 CAML AC1,GEN%1SIZE JRST L.144 MOVEI AC1,1752 MOVEM AC1,GEN%1SIZE L.144: MOVE AC3,GEN%1SIZE ; 3137 MOVE AC1,GEN%1SIZE ; 3138 MOVE AC2,C.11 MOVE AC4,GEN%1SIZE MOVE AC5,0(SP) EXTEND AC1,C.9 JFCL L.145: MOVEI AC1,-312(SP) ; 3141 HRLI AC1,10700 PUSH SP,AC1 PUSH SP,AC3 PUSH SP,C.2 PUSHJ SP,U.30 PUSH SP,C.2 ; 3142 PUSHJ SP,U.29 SETZM -2(SP) ; 3143 SETZM -1(SP) SETZM 0(SP) PUSHJ SP,U.30 PUSH SP,U.65 ; 3148 PUSH SP,U.52 PUSH SP,U.55 PUSHJ SP,U.24 ADJSP SP,-3 TRNE AC1,1 JRST L.146 ADJSP SP,-4 MOVEI AC1,23 JRST L.155 L.146: PUSHJ SP,U.26 ; 3153 TRNE AC1,1 ; 3155 JRST L.148 CAIE AC1,262 ; 3159 CAIN AC1,300 JRST L.147 CAIN AC1,172 L.147: SKIPA AC2,U.51 ; 3164 MOVEI AC2,23 ADJSP SP,-4 ; 3159 MOVE AC1,AC2 ; 3157 JRST L.155 L.148: MOVE AC2,U.58 ; 3170 CAIE AC2,123 ; 3173 JRST L.150 MOVE AC3,U.56 ; 3175 MOVEM AC3,U.55 PUSHJ SP,U.21 ; 3178 TRNE AC1,1 JRST L.149 ADJSP SP,-4 JRST L.155 L.149: PUSHJ SP,U.20 ; 3180 PUSH SP,C.20 ; 3181 PUSH SP,U.46 PUSH SP,U.55 PUSHJ SP,U.24 MOVE AC1,U.47 ; 3182 MOVEM AC1,U.48 MOVE AC1,U.54 ; 3183 MOVEM AC1,U.53 SETZM U.54 ; 3184 MOVE AC1,U.55 ; 3185 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 ADJSP SP,-7 ; 3186 MOVEI AC1,7 ; 3174 JRST L.155 L.150: CAIE AC2,130 ; 3189 JRST L.152 MOVEI AC1,1 ; 3195 MOVEM AC1,U.62 MOVEI AC1,U.31 ; 3196 MOVEM AC1,U.68 SKIPG U.57 ; 3198 JRST L.151 PUSH SP,C.41 ; 3201 PUSHJ SP,TT%TEXT PUSHJ SP,U.28 ; 3202 PUSH SP,C.42 ; 3203 PUSHJ SP,TT%TEXT PUSHJ SP,TT%CRLF ; 3204 ADJSP SP,-2 ; 3200 L.151: PUSH SP,C.20 ; 3207 PUSH SP,C.25 PUSH SP,U.55 PUSHJ SP,U.24 MOVE AC1,U.54 ; 3208 MOVEM AC1,U.53 SETZM U.54 ; 3209 MOVE AC1,U.55 ; 3210 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 ADJSP SP,-7 ; 3211 MOVEI AC1,10 ; 3194 JRST L.155 L.152: CAIE AC2,131 ; 3214 JRST L.153 MOVEI AC1,U.31 ; 3220 MOVEM AC1,U.68 PUSHJ SP,U.28 ; 3221 SKIPLE U.57 ; 3223 PUSHJ SP,TT%CRLF ADJSP SP,-4 ; 3225 MOVEI AC1,11 ; 3219 JRST L.155 L.153: CAIE AC2,116 ; 3228 JRST L.154 ADJSP SP,-4 ; 3233 MOVE AC1,U.51 JRST L.155 L.154: PUSH SP,C.21 ; 3240 PUSHJ SP,KRM%ERROR ADJSP SP,-5 ; 3241 MOVEI AC1,12 ; 3066 L.155: ADJSP SP,-312 ; 3017 POPJ SP, C.38: XWD 0,GEN%1DATA C.39: XWD 0,GEN%2DATA C.40: XWD 0,GEN%3DATA C.41: XWD 0,P.AAF C.42: XWD 0,P.AAG ; Routine Size: 182 words ; 3243 1 %SBTTL 'SEND%BREAK' ; 3244 1 ROUTINE SEND%BREAK = ; 3245 1 ; 3246 1 !++ ; 3247 1 ! FUNCTIONAL DESCRIPTION: ; 3248 1 ! ; 3249 1 ! This routine will send the break (end of transmission) message ; 3250 1 ! to the remote KERMIT. On an ACK the state becomes STATE%C. ; 3251 1 ! ; 3252 1 ! CALLING SEQUENCE: ; 3253 1 ! ; 3254 1 ! STATE = SEND%BREAK(); ; 3255 1 ! ; 3256 1 ! INPUT PARAMETERS: ; 3257 1 ! ; 3258 1 ! None. ; 3259 1 ! ; 3260 1 ! IMPLICIT INPUTS: ; 3261 1 ! ; 3262 1 ! None. ; 3263 1 ! ; 3264 1 ! OUTPUT PARAMETERS: ; 3265 1 ! ; 3266 1 ! New state for the finite state machine. ; 3267 1 ! ; 3268 1 ! IMPLICIT OUTPUTS: ; 3269 1 ! ; 3270 1 ! None. ; 3271 1 ! ; 3272 1 ! COMPLETION CODES: ; 3273 1 ! ; 3274 1 ! None. ; 3275 1 ! ; 3276 1 ! SIDE EFFECTS: ; 3277 1 ! ; 3278 1 ! None. ; 3279 1 ! ; 3280 1 !-- ; 3281 1 ; 3282 2 BEGIN ; 3283 2 ; 3284 2 LOCAL ; 3285 2 STATUS; ! Status returned by various routines ; 3286 2 ; 3287 2 ! ; 3288 2 ! First determine if we have exceed the number of retries that are ; 3289 2 ! allowed to attempt to send this message. ; 3290 2 ! ; 3291 2 ; 3292 2 IF .NUM%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER; ; 3293 2 ; 3294 2 ! ; 3295 2 ! The number of retries are not exceeded. Increment the number and then ; 3296 2 ! attempt to send the packet again. ; 3297 2 ! ; 3298 2 NUM%RETRIES = .NUM%RETRIES + 1; ; 3299 2 ; 3300 2 IF NOT SEND%PACKET (MSG%BREAK, 0, .MSG%NUMBER) THEN RETURN STATE%EX; ; 3301 2 ; 3302 2 ! ; 3303 2 ! Now get the responce from the remote KERMIT. ; 3304 2 ! ; 3305 2 STATUS = REC%PACKET (); ; 3306 2 ; 3307 2 IF NOT .STATUS ; 3308 2 THEN ; 3309 3 BEGIN ; 3310 3 ; 3311 4 IF (.STATUS EQL KER%ZEROLENMSG) OR (.STATUS EQL KER%TIMEOUT) OR (.STATUS EQL ; 3312 4 KER%CHKSUMERR) ; 3313 3 THEN ; 3314 3 RETURN .STATE ; 3315 3 ELSE ; 3316 3 RETURN STATE%EX; ; 3317 3 ; 3318 2 END; ; 3319 2 ; 3320 2 ! ; 3321 2 ! Determine if the packet is good. ; 3322 2 ! ; 3323 2 ; 3324 3 IF NOT (.REC%TYPE EQL MSG%ACK OR .REC%TYPE EQL MSG%NAK) ; 3325 2 THEN ; 3326 3 BEGIN ; 3327 3 KRM%ERROR (KER%PROTOERR); ; 3328 3 RETURN STATE%A; ; 3329 2 END; ; 3330 2 ; 3331 2 ! ; 3332 2 ! If this is a NAK and the message number is not the one we just send ; 3333 2 ! treat this like an ACK, otherwise resend the last packet. ; 3334 2 ! ; 3335 2 ; 3336 2 IF .REC%TYPE EQL MSG%NAK AND .REC%SEQ NEQ 0 THEN RETURN .STATE; ; 3337 2 ; 3338 2 IF .REC%TYPE EQL MSG%ACK AND .REC%SEQ NEQ .MSG%NUMBER THEN RETURN .STATE; ; 3339 2 ; 3340 2 ! ; 3341 2 ! Here to determine if there is another file to send. ; 3342 2 ! ; 3343 2 NUM%RETRIES = 0; ; 3344 2 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 3345 2 RETURN STATE%C; ; 3346 1 END; ; SEND%BREAK U.9: MOVE AC1,U.54 ; 3292 CAMG AC1,PKT%RETRIES JRST L.156 MOVEI AC1,24 POPJ SP, L.156: AOS U.54 ; 3298 PUSH SP,C.43 ; 3300 PUSH SP,C.25 PUSH SP,U.55 PUSHJ SP,U.24 ADJSP SP,-3 TRNN AC1,1 JRST L.157 PUSHJ SP,U.26 ; 3305 TRNE AC1,1 ; 3307 JRST L.158 CAIE AC1,262 ; 3311 CAIN AC1,300 JRST L.161 CAIN AC1,172 JRST L.161 ; 3314 L.157: MOVEI AC1,23 ; 3316 POPJ SP, ; 3309 L.158: MOVE AC1,U.58 ; 3324 CAIE AC1,131 CAIN AC1,116 JRST L.159 PUSH SP,C.21 ; 3327 PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 3328 MOVEI AC1,12 ; 3326 POPJ SP, L.159: MOVE AC1,U.58 ; 3336 CAIN AC1,116 SKIPN U.56 JRST L.160 JRST L.161 L.160: CAIE AC1,131 ; 3338 JRST L.162 MOVE AC1,U.56 CAMN AC1,U.55 JRST L.162 L.161: MOVE AC1,U.51 POPJ SP, L.162: SETZM U.54 ; 3343 MOVE AC1,U.55 ; 3344 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 MOVEI AC1,11 ; 3282 POPJ SP, ; 3244 C.43: EXP 102 ; Routine Size: 52 words ; 3347 1 %SBTTL 'REC%INIT' ; 3348 1 ROUTINE REC%INIT = ; 3349 1 ; 3350 1 !++ ; 3351 1 ! FUNCTIONAL DESCRIPTION: ; 3352 1 ! ; 3353 1 ! This routine will process an initialization message received from ; 3354 1 ! the remote KERMIT. ; 3355 1 ! ; 3356 1 ! CALLING SEQUENCE: ; 3357 1 ! ; 3358 1 ! STATE = REC%INIT(); ; 3359 1 ! ; 3360 1 ! INPUT PARAMETERS: ; 3361 1 ! ; 3362 1 ! None. ; 3363 1 ! ; 3364 1 ! IMPLICIT INPUTS: ; 3365 1 ! ; 3366 1 ! None. ; 3367 1 ! ; 3368 1 ! OUTPUT PARAMETERS: ; 3369 1 ! ; 3370 1 ! New machine state. ; 3371 1 ! ; 3372 1 ! IMPLICIT OUTPUTS: ; 3373 1 ! ; 3374 1 ! None. ; 3375 1 ! ; 3376 1 ! COMPLETION CODES: ; 3377 1 ! ; 3378 1 ! None. ; 3379 1 ! ; 3380 1 ! SIDE EFFECTS: ; 3381 1 ! ; 3382 1 ! None. ; 3383 1 ! ; 3384 1 !-- ; 3385 1 ; 3386 2 BEGIN ; 3387 2 ; 3388 2 LOCAL ; 3389 2 STATUS; ! Status returned by various routines ; 3390 2 ; 3391 2 ROUTINE CHECK%INIT = ; 3392 3 BEGIN ; 3393 3 ; 3394 3 IF .REC%TYPE EQL MSG%SND%INIT THEN RETURN TRUE ELSE RETURN FALSE; ; 3395 3 ; 3396 2 END; ; CHECK%INIT U.78: MOVEI AC1,123 ; 3394 CAME AC1,U.58 JRST L.163 MOVEI AC1,1 POPJ SP, L.163: SETZ AC1, POPJ SP, ; 3391 ; Routine Size: 7 words ; 3397 2 ; 3398 3 IF NOT (STATUS = REC%MESSAGE (CHECK%INIT)) ; 3399 2 THEN ; 3400 2 ; 3401 2 IF .STATUS NEQ KER%ABORTED THEN RETURN STATE%A ELSE RETURN STATE%EX; ; 3402 2 ; 3403 2 MSG%NUMBER = .REC%SEQ; ; 3404 2 ; 3405 2 IF NOT (STATUS = PRS%SEND%INIT ()) THEN RETURN STATE%A; ; 3406 2 ; 3407 2 SET%SEND%INIT (); ; 3408 2 SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .MSG%NUMBER); ! [108] ; 3409 2 BLK%CHK%TYPE = .INI%CHK%TYPE; ! Can now use agreed upon type ; 3410 2 OLD%RETRIES = .NUM%RETRIES; ; 3411 2 NUM%RETRIES = 0; ; 3412 2 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 3413 2 RETURN STATE%RF; ; 3414 1 END; ! End of REC%INIT ; REC%INIT U.11: PUSH SP,C.44 ; 3398 PUSHJ SP,U.25 ADJSP SP,-1 TRNE AC1,1 JRST L.166 CAIN AC1,312 ; 3401 JRST L.164 MOVEI AC2,12 JRST L.165 L.164: MOVEI AC2,23 L.165: MOVE AC1,AC2 POPJ SP, L.166: MOVE AC2,U.56 ; 3403 MOVEM AC2,U.55 PUSHJ SP,U.21 ; 3405 TRNE AC1,1 JRST L.167 MOVEI AC1,12 POPJ SP, L.167: PUSHJ SP,U.20 ; 3407 PUSH SP,C.20 ; 3408 PUSH SP,U.46 PUSH SP,U.55 PUSHJ SP,U.24 MOVE AC1,U.47 ; 3409 MOVEM AC1,U.48 MOVE AC1,U.54 ; 3410 MOVEM AC1,U.53 SETZM U.54 ; 3411 MOVE AC1,U.55 ; 3412 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 ADJSP SP,-3 ; 3413 MOVEI AC1,7 ; 3386 POPJ SP, ; 3348 C.44: XWD 0,U.78 ; Routine Size: 37 words ; 3415 1 %SBTTL 'REC%FILE' ; 3416 1 ROUTINE REC%FILE = ; 3417 1 ; 3418 1 !++ ; 3419 1 ! FUNCTIONAL DESCRIPTION: ; 3420 1 ! ; 3421 1 ! This routine expects to receive an MSG%FILE packet from the remote ; 3422 1 ! KERMIT. If the message is correct this routine will change the state ; 3423 1 ! to STATE%RD. ; 3424 1 ! ; 3425 1 ! This routine also expects MSG%SND%INIT, MSG%EOF, or MSG%BREAK. ; 3426 1 ! ; 3427 1 ! CALLING SEQUENCE: ; 3428 1 ! ; 3429 1 ! STATE = REC%FILE(); ; 3430 1 ! ; 3431 1 ! INPUT PARAMETERS: ; 3432 1 ! ; 3433 1 ! None. ; 3434 1 ! ; 3435 1 ! IMPLICIT INPUTS: ; 3436 1 ! ; 3437 1 ! None. ; 3438 1 ! ; 3439 1 ! OUTPUT PARAMETERS: ; 3440 1 ! ; 3441 1 ! New state. ; 3442 1 ! ; 3443 1 ! IMPLICIT OUTPUTS: ; 3444 1 ! ; 3445 1 ! None. ; 3446 1 ! ; 3447 1 ! COMPLETION CODES: ; 3448 1 ! ; 3449 1 ! None. ; 3450 1 ! ; 3451 1 ! SIDE EFFECTS: ; 3452 1 ! ; 3453 1 ! None. ; 3454 1 ! ; 3455 1 !-- ; 3456 1 ; 3457 2 BEGIN ; 3458 2 ; 3459 2 LOCAL ; 3460 2 STATUS; ; 3461 2 ; 3462 2 ROUTINE CHECK%FILE = ; 3463 3 BEGIN ; 3464 3 ; 3465 4 IF (.REC%TYPE EQL MSG%SND%INIT) OR (.REC%TYPE EQL MSG%EOF) OR (.REC%TYPE EQL ; 3466 4 MSG%FILE) OR ( ; 3467 4 .REC%TYPE EQL MSG%BREAK) OR (.REC%TYPE EQL MSG%TEXT) ; 3468 3 THEN ; 3469 3 RETURN TRUE ; 3470 3 ELSE ; 3471 3 RETURN FALSE; ; 3472 3 ; 3473 2 END; ; CHECK%FILE U.79: MOVE AC1,U.58 ; 3465 CAIE AC1,123 CAIN AC1,132 JRST L.168 CAIE AC1,106 CAIN AC1,102 ; 3466 JRST L.168 CAIE AC1,130 ; 3467 JRST L.169 L.168: MOVEI AC1,1 ; 3471 POPJ SP, L.169: SETZ AC1, POPJ SP, ; 3462 ; Routine Size: 13 words ; 3474 2 ! ; 3475 2 ! Initialize the abort flags ; 3476 2 ! ; 3477 2 ABT%CUR%FILE = FALSE; ; 3478 2 ABT%ALL%FILE = FALSE; ; 3479 2 ! ; 3480 2 ! Get a message ; 3481 2 ! ; 3482 2 ; 3483 3 IF NOT (STATUS = REC%MESSAGE (CHECK%FILE)) ; 3484 2 THEN ; 3485 2 ; 3486 2 IF .STATUS NEQ KER%ABORTED THEN RETURN STATE%A ELSE RETURN STATE%EX; ; 3487 2 ; 3488 2 SELECTONE .REC%TYPE OF ; 3489 2 SET ; 3490 2 ; 3491 2 [MSG%SND%INIT] : ; 3492 3 BEGIN ; 3493 3 ; 3494 3 IF .OLD%RETRIES GTR .SI%RETRIES THEN RETURN STATE%ER; ; 3495 3 ; 3496 3 OLD%RETRIES = .OLD%RETRIES + 1; ; 3497 3 ; 3498 3 IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ ; 3499 3 THEN ; 3500 4 BEGIN ; 3501 4 SET%SEND%INIT (); ; 3502 4 BLK%CHK%TYPE = CHK%1CHAR; ! Must use 1 character CHKSUM ; 3503 4 SEND%PACKET (MSG%ACK, .SEND%INIT%SIZE, .REC%SEQ); ! [108] ; 3504 4 BLK%CHK%TYPE = .INI%CHK%TYPE; ! Back to agreed upon type ; 3505 4 NUM%RETRIES = 0; ; 3506 4 RETURN .STATE; ; 3507 4 END ; 3508 3 ELSE ; 3509 4 BEGIN ; 3510 4 KRM%ERROR (KER%PROTOERR); ; 3511 4 RETURN STATE%A; ; 3512 3 END; ; 3513 3 ; 3514 2 END; ; 3515 2 ; 3516 2 [MSG%EOF] : ; 3517 3 BEGIN ; 3518 3 ; 3519 3 IF .OLD%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER; ; 3520 3 ; 3521 3 OLD%RETRIES = .OLD%RETRIES + 1; ; 3522 3 ; 3523 3 IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ ; 3524 3 THEN ; 3525 4 BEGIN ; 3526 4 SEND%PACKET (MSG%ACK, 0, .REC%SEQ); ; 3527 4 NUM%RETRIES = 0; ; 3528 4 RETURN .STATE; ; 3529 4 END ; 3530 3 ELSE ; 3531 4 BEGIN ; 3532 4 KRM%ERROR (KER%PROTOERR); ; 3533 4 RETURN STATE%A; ; 3534 3 END; ; 3535 3 ; 3536 2 END; ; 3537 2 ; 3538 2 [MSG%FILE] : ; 3539 3 BEGIN ; 3540 3 ; 3541 3 IF .MSG%NUMBER NEQ .REC%SEQ THEN RETURN STATE%ER; ; 3542 3 ; 3543 3 IF .REC%LENGTH EQL 0 ; 3544 3 THEN ; 3545 4 BEGIN ; 3546 4 KRM%ERROR (KER%PROTOERR); ; 3547 4 RETURN STATE%A; ; 3548 3 END; ; 3549 3 ; 3550 3 ![025] ; 3551 3 ![025] Get file name from packet with all quoting undone ; 3552 3 ![025] ; 3553 3 SET%STRING (CH$PTR (FILE%NAME), MAX%FILE%NAME, TRUE); ; 3554 3 BFR%EMPTY (); ; 3555 3 FILE%SIZE = SET%STRING (0, 0, FALSE); ; 3556 3 CH$WCHAR (CHR%NUL, CH$PTR (FILE%NAME, .FILE%SIZE)); ; 3557 3 ![025] FILE%SIZE = .REC%LENGTH; ; 3558 3 ![025] CH$COPY (.REC%LENGTH, CH$PTR (REC%MSG, PKT%MSG, CHR%SIZE), CHR%NUL, MAX%FILE%NAME, ; 3559 3 ![025] CH$PTR (FILE%NAME)); ; 3560 3 ; 3561 3 IF ( NOT .CONNECT%FLAG) AND .TY%FIL ; 3562 3 THEN ; 3563 4 BEGIN ; 3564 4 TT%TEXT (UPLIT (%ASCIZ'Receiving: ')); ; 3565 4 TT%TEXT (FILE%NAME); ; 3566 4 TT%OUTPUT (); ; 3567 3 END; ; 3568 3 ; 3569 3 ![023] ; 3570 3 ![023] Force file name into normal form if desired ; 3571 3 ![023] ; 3572 3 ; 3573 3 IF .FIL%NORMAL%FORM THEN NORMALIZE%FILE (FILE%NAME, FILE%SIZE, 9, 3); ; 3574 3 ; 3575 3 FILE%CHARS = 0; ! No characters received yet ; 3576 3 ; 3577 3 IF NOT FILE%OPEN (FNC%WRITE) THEN RETURN STATE%A; ; 3578 3 ; 3579 3 XFR%STATUS (%C'F', %C'R'); ! Tell display routine ; 3580 3 TEXT%HEAD%FLAG = FALSE; ! Got an F, not an X ; 3581 3 FLAG%FILE%OPEN = TRUE; ; 3582 3 SEND%PACKET (MSG%ACK, 0, .MSG%NUMBER); ; 3583 3 OLD%RETRIES = .NUM%RETRIES; ; 3584 3 NUM%RETRIES = 0; ; 3585 3 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 3586 3 RETURN STATE%RD; ; 3587 2 END; ; 3588 2 ; 3589 2 [MSG%TEXT] : ; 3590 2 ! ; 3591 2 ! If we get a text header, we will want to type the data on ; 3592 2 ! the terminal. Set up the put a character routine correctly. ; 3593 2 ! ; 3594 3 BEGIN ; 3595 3 ; 3596 3 IF .MSG%NUMBER NEQ .REC%SEQ ; 3597 3 THEN ; 3598 4 BEGIN ; 3599 4 KRM%ERROR (KER%PROTOERR); ; 3600 4 RETURN STATE%A; ; 3601 3 END; ; 3602 3 ; 3603 3 TEXT%HEAD%FLAG = TRUE; ! Got an X, not an F ; 3604 3 PUT%CHR%ROUTINE = TYPE%CHAR; ! Empty buffer on terminal ; 3605 3 ; 3606 3 IF .REC%LENGTH GTR 0 ; 3607 3 THEN ; 3608 4 BEGIN ; 3609 4 TT%TEXT (UPLIT (%ASCIZ'<<')); ! Make file name stick out ; 3610 4 BFR%EMPTY (); ! Do the header data ; 3611 4 TT%TEXT (UPLIT (%ASCIZ'>>')); ; 3612 4 TT%CRLF (); ! And a crlf ; 3613 3 END; ; 3614 3 ; 3615 3 SEND%PACKET (MSG%ACK, 0, .MSG%NUMBER); ; 3616 3 OLD%RETRIES = .NUM%RETRIES; ; 3617 3 NUM%RETRIES = 0; ; 3618 3 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 3619 3 RETURN STATE%RD; ; 3620 2 END; ; 3621 2 ; 3622 2 [MSG%BREAK] : ; 3623 3 BEGIN ; 3624 3 ; 3625 3 IF .MSG%NUMBER NEQ .REC%SEQ ; 3626 3 THEN ; 3627 4 BEGIN ; 3628 4 KRM%ERROR (KER%PROTOERR); ; 3629 4 RETURN STATE%A; ; 3630 3 END; ; 3631 3 ; 3632 3 SEND%PACKET (MSG%ACK, 0, .REC%SEQ); ; 3633 3 RETURN STATE%C; ; 3634 2 END; ; 3635 2 ; 3636 2 [OTHERWISE] : ; 3637 3 BEGIN ; 3638 3 KRM%ERROR (KER%PROTOERR); ; 3639 3 RETURN STATE%A; ; 3640 2 END; ; 3641 2 TES; ; 3642 2 ; 3643 1 END; ! End of REC%FILE P.AAH: BYTE (7)"R","e","c","e","i" BYTE (7)"v","i","n","g",":" BYTE (7)" ",000,000,000,000 P.AAI: BYTE (7)"<","<",000,000,000 P.AAJ: BYTE (7)">",">",000,000,000 ; REC%FILE U.12: SETZM ABT%CUR%FILE ; 3477 SETZM ABT%ALL%FILE ; 3478 PUSH SP,C.45 ; 3483 PUSHJ SP,U.25 ADJSP SP,-1 TRNE AC1,1 JRST L.170 CAIE AC1,312 ; 3486 JRST L.184 MOVEI AC1,23 POPJ SP, L.170: MOVE AC1,U.58 ; 3488 CAIE AC1,123 ; 3491 JRST L.171 MOVE AC2,U.53 ; 3494 CAMLE AC2,SI%RETRIES JRST L.174 AOS U.53 ; 3496 MOVE AC1,U.55 ; 3498 SUBI AC1,1 LDB AC2,C.18 CAME AC2,U.56 JRST L.186 PUSHJ SP,U.20 ; 3501 MOVEI AC1,61 ; 3502 MOVEM AC1,U.48 PUSH SP,C.20 ; 3503 PUSH SP,U.46 PUSH SP,U.56 PUSHJ SP,U.24 MOVE AC1,U.47 ; 3504 MOVEM AC1,U.48 JRST L.172 L.171: CAIE AC1,132 ; 3516 JRST L.173 MOVE AC2,U.53 ; 3519 CAMLE AC2,PKT%RETRIES JRST L.174 AOS U.53 ; 3521 MOVE AC1,U.55 ; 3523 SUBI AC1,1 LDB AC2,C.18 CAME AC2,U.56 JRST L.186 PUSH SP,C.20 ; 3526 PUSH SP,C.25 PUSH SP,U.56 PUSHJ SP,U.24 L.172: SETZM U.54 ; 3527 ADJSP SP,-2 ; 3525 MOVE AC1,U.51 ; 3531 JRST L.187 L.173: CAIE AC1,106 ; 3538 JRST L.179 MOVE AC2,U.55 ; 3541 CAMN AC2,U.56 JRST L.175 L.174: MOVEI AC1,24 POPJ SP, L.175: SKIPN U.57 ; 3543 JRST L.183 PUSH SP,C.10 ; 3553 PUSH SP,C.22 PUSH SP,C.2 PUSHJ SP,U.30 PUSHJ SP,U.28 ; 3554 SETZM -2(SP) ; 3555 SETZM -1(SP) SETZM 0(SP) PUSHJ SP,U.30 MOVEM AC1,FILE%SIZE SETZ AC2, ; 3556 MOVE AC3,C.19 MOVE AC1,FILE%SIZE ADJBP AC1,AC3 IDPB AC2,AC1 MOVEI AC1,1 ; 3561 TDNE AC1,CONNECT%FLAG JRST L.176 MOVEI AC1,1 TDNN AC1,TY%FIL JRST L.176 PUSH SP,C.46 ; 3564 PUSHJ SP,TT%TEXT PUSH SP,C.34 ; 3565 PUSHJ SP,TT%TEXT PUSHJ SP,TT%OUTPUT ; 3566 ADJSP SP,-2 ; 3563 L.176: MOVEI AC1,1 ; 3573 TDNN AC1,FIL%NORMAL%FORM JRST L.177 PUSH SP,C.34 PUSH SP,C.35 PUSH SP,C.47 PUSH SP,C.48 PUSHJ SP,U.27 ADJSP SP,-4 L.177: SETZM U.61 ; 3575 PUSH SP,C.2 ; 3577 PUSHJ SP,FILE%OPEN ADJSP SP,-1 TRNE AC1,1 JRST L.178 ADJSP SP,-3 JRST L.184 L.178: PUSH SP,C.15 ; 3579 PUSH SP,C.12 PUSHJ SP,XFR%STATUS SETZM U.62 ; 3580 MOVEI AC1,1 ; 3581 MOVEM AC1,FLAG%FILE%OPEN PUSH SP,C.20 ; 3582 PUSH SP,C.25 PUSH SP,U.55 PUSHJ SP,U.24 MOVE AC1,U.54 ; 3583 MOVEM AC1,U.53 SETZM U.54 ; 3584 MOVE AC1,U.55 ; 3585 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 ADJSP SP,-7 ; 3539 JRST L.181 L.179: CAIE AC1,130 ; 3589 JRST L.182 MOVE AC1,U.55 ; 3596 CAME AC1,U.56 JRST L.183 MOVEI AC1,1 ; 3603 MOVEM AC1,U.62 MOVEI AC1,U.31 ; 3604 MOVEM AC1,U.68 SKIPG U.57 ; 3606 JRST L.180 PUSH SP,C.49 ; 3609 PUSHJ SP,TT%TEXT PUSHJ SP,U.28 ; 3610 PUSH SP,C.50 ; 3611 PUSHJ SP,TT%TEXT PUSHJ SP,TT%CRLF ; 3612 ADJSP SP,-2 ; 3608 L.180: PUSH SP,C.20 ; 3615 PUSH SP,C.25 PUSH SP,U.55 PUSHJ SP,U.24 MOVE AC1,U.54 ; 3616 MOVEM AC1,U.53 SETZM U.54 ; 3617 MOVE AC1,U.55 ; 3618 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 ADJSP SP,-2 ; 3594 L.181: MOVEI AC1,10 ; 3488 JRST L.187 L.182: CAIE AC1,102 ; 3622 JRST L.186 MOVE AC1,U.55 ; 3625 CAMN AC1,U.56 JRST L.185 L.183: PUSH SP,C.21 ; 3628 PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 3629 L.184: MOVEI AC1,12 ; 3627 POPJ SP, L.185: PUSH SP,C.20 ; 3632 PUSH SP,C.25 PUSH SP,U.56 PUSHJ SP,U.24 ADJSP SP,-2 ; 3623 MOVEI AC1,11 ; 3488 JRST L.187 L.186: PUSH SP,C.21 ; 3638 PUSHJ SP,KRM%ERROR MOVEI AC1,12 ; 3488 L.187: ADJSP SP,-1 ; 3637 POPJ SP, ; 3416 C.45: XWD 0,U.79 C.46: XWD 0,P.AAH C.47: EXP 11 C.48: EXP 3 C.49: XWD 0,P.AAI C.50: XWD 0,P.AAJ ; Routine Size: 184 words ; 3644 1 %SBTTL 'REC%DATA' ; 3645 1 ROUTINE REC%DATA = ; 3646 1 ; 3647 1 !++ ; 3648 1 ! FUNCTIONAL DESCRIPTION: ; 3649 1 ! ; 3650 1 ! This routine will accept data messages and write them to disk. ; 3651 1 ! It will also accept MSG%FILE, MSG%TEXT and MSG%EOF messages. ; 3652 1 ! ; 3653 1 ! CALLING SEQUENCE: ; 3654 1 ! ; 3655 1 ! STATE = REC%DATA(); ; 3656 1 ! ; 3657 1 ! INPUT PARAMETERS: ; 3658 1 ! ; 3659 1 ! None. ; 3660 1 ! ; 3661 1 ! IMPLICIT INPUTS: ; 3662 1 ! ; 3663 1 ! None. ; 3664 1 ! ; 3665 1 ! OUTPUT PARAMETERS: ; 3666 1 ! ; 3667 1 ! New state for the finite state machine. ; 3668 1 ! ; 3669 1 ! IMPLICIT OUTPUTS: ; 3670 1 ! ; 3671 1 ! None. ; 3672 1 ! ; 3673 1 ! COMPLETION CODES: ; 3674 1 ! ; 3675 1 ! None. ; 3676 1 ! ; 3677 1 ! SIDE EFFECTS: ; 3678 1 ! ; 3679 1 ! None. ; 3680 1 ! ; 3681 1 !-- ; 3682 1 ; 3683 2 BEGIN ; 3684 2 ; 3685 2 LOCAL ; 3686 2 STATUS; ; 3687 2 ; 3688 2 ROUTINE CHECK%DATA = ; 3689 3 BEGIN ; 3690 3 ; 3691 4 IF .REC%TYPE EQL MSG%DATA OR (.REC%TYPE EQL MSG%FILE AND NOT .TEXT%HEAD%FLAG) ; 3692 3 OR .REC%TYPE ; 3693 4 EQL MSG%EOF OR (.REC%TYPE EQL MSG%TEXT AND .TEXT%HEAD%FLAG) ; 3694 3 THEN ; 3695 3 RETURN TRUE ; 3696 3 ELSE ; 3697 3 RETURN FALSE; ; 3698 3 ; 3699 2 END; ; CHECK%DATA U.80: MOVE AC1,U.58 ; 3691 CAIN AC1,104 JRST L.189 CAIE AC1,106 JRST L.188 MOVEI AC2,1 TDNN AC2,U.62 JRST L.189 L.188: CAIN AC1,132 ; 3693 JRST L.189 CAIE AC1,130 JRST L.190 MOVEI AC1,1 TDNN AC1,U.62 JRST L.190 L.189: MOVEI AC1,1 ; 3697 POPJ SP, L.190: SETZ AC1, POPJ SP, ; 3688 ; Routine Size: 19 words ; 3700 2 ; 3701 2 LOCAL ; 3702 2 SUB%TYPE, ! Subtype for XFR%STATUS ; 3703 2 DISCARD%FILE%FLAG, ! Sender requested discard ; 3704 2 ACK%MSG%LEN; ! Length of ACK to send ; 3705 2 ; 3706 2 ! ; 3707 2 ! First get a message ; 3708 2 ! ; 3709 2 ; 3710 3 IF NOT (STATUS = REC%MESSAGE (CHECK%DATA)) ; 3711 2 THEN ; 3712 2 ; 3713 2 IF .STATUS NEQ KER%ABORTED THEN RETURN STATE%A ELSE RETURN STATE%EX; ; 3714 2 ; 3715 2 SELECTONE .REC%TYPE OF ; 3716 2 SET ; 3717 2 ; 3718 2 [MSG%DATA] : ; 3719 3 BEGIN ; 3720 3 ; 3721 3 IF .MSG%NUMBER NEQ .REC%SEQ ; 3722 3 THEN ; 3723 4 BEGIN ; 3724 4 ; 3725 4 IF .OLD%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER; ; 3726 4 ; 3727 4 OLD%RETRIES = .OLD%RETRIES + 1; ; 3728 4 ; 3729 4 IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ ; 3730 4 THEN ; 3731 5 BEGIN ; 3732 5 SEND%PACKET (MSG%ACK, 0, .REC%SEQ); ; 3733 5 NUM%RETRIES = 0; ; 3734 5 RETURN .STATE; ; 3735 5 END ; 3736 4 ELSE ; 3737 5 BEGIN ; 3738 5 KRM%ERROR (KER%PROTOERR); ; 3739 5 RETURN STATE%A; ; 3740 4 END; ; 3741 4 ; 3742 3 END; ; 3743 3 ; 3744 3 ! ; 3745 3 ! Here if we have a message with a valid message number ; 3746 3 ! ; 3747 3 ; 3748 3 IF NOT BFR%EMPTY () THEN RETURN STATE%A; ; 3749 3 ; 3750 3 ! ; 3751 3 ! Check if we wish to abort for some reason ; 3752 3 ! ; 3753 3 ; 3754 3 IF .ABT%CUR%FILE ; 3755 3 THEN ; 3756 4 BEGIN ; 3757 4 CH$WCHAR (MSG%ACK%ABT%CUR, CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE)); ; 3758 4 ACK%MSG%LEN = 1; ; 3759 4 END ; 3760 3 ELSE ; 3761 3 ; 3762 3 IF .ABT%ALL%FILE ; 3763 3 THEN ; 3764 4 BEGIN ; 3765 4 CH$WCHAR (MSG%ACK%ABT%ALL, CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE)); ; 3766 4 ACK%MSG%LEN = 1; ; 3767 4 END ; 3768 3 ELSE ; 3769 3 ACK%MSG%LEN = 0; ; 3770 3 ; 3771 3 ! ; 3772 3 ! Now send the ACK ; 3773 3 ! ; 3774 3 SEND%PACKET (MSG%ACK, .ACK%MSG%LEN, .REC%SEQ); ; 3775 3 OLD%RETRIES = .NUM%RETRIES; ; 3776 3 NUM%RETRIES = 0; ; 3777 3 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 3778 3 RETURN STATE%RD; ; 3779 2 END; ; 3780 2 ; 3781 2 [MSG%FILE, MSG%TEXT] : ; 3782 3 BEGIN ; 3783 3 ; 3784 3 IF .OLD%RETRIES GTR .PKT%RETRIES THEN RETURN STATE%ER; ; 3785 3 ; 3786 3 OLD%RETRIES = .OLD%RETRIES + 1; ; 3787 3 ; 3788 3 IF ((.MSG%NUMBER - 1) AND %O'77') EQL .REC%SEQ ; 3789 3 THEN ; 3790 4 BEGIN ; 3791 4 SEND%PACKET (MSG%ACK, 0, .REC%SEQ); ; 3792 4 NUM%RETRIES = 0; ; 3793 4 RETURN .STATE; ; 3794 4 END ; 3795 3 ELSE ; 3796 4 BEGIN ; 3797 4 KRM%ERROR (KER%PROTOERR); ; 3798 4 RETURN STATE%A; ; 3799 3 END; ; 3800 3 ; 3801 2 END; ; 3802 2 ; 3803 2 [MSG%EOF] : ; 3804 3 BEGIN ; 3805 3 ; 3806 3 IF .MSG%NUMBER NEQ .REC%SEQ ; 3807 3 THEN ; 3808 4 BEGIN ; 3809 4 KRM%ERROR (KER%PROTOERR); ; 3810 4 RETURN STATE%A; ; 3811 3 END; ; 3812 3 ; 3813 3 SEND%PACKET (MSG%ACK, 0, .REC%SEQ); ; 3814 3 ; 3815 3 IF NOT .TEXT%HEAD%FLAG ; 3816 3 THEN ; 3817 4 BEGIN ; 3818 4 FLAG%FILE%OPEN = FALSE; ; 3819 4 DISCARD%FILE%FLAG = FALSE; ! Assume we want file ; 3820 4 ; 3821 4 IF .REC%LENGTH EQL 1 ; 3822 4 THEN ; 3823 4 ; 3824 4 IF CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG, CHR%SIZE)) EQL ; 3825 4 MSG%EOF%DISCARD ! [108] ; 3826 4 THEN ; 3827 4 DISCARD%FILE%FLAG = TRUE; ; 3828 4 ; 3829 4 IF ( NOT .CONNECT%FLAG) AND .TY%FIL ; 3830 4 THEN ; 3831 5 BEGIN ; 3832 5 ; 3833 5 IF .DISCARD%FILE%FLAG ; 3834 5 THEN ; 3835 5 ; 3836 5 IF .ABT%FLAG ; 3837 5 THEN ; 3838 5 TT%TEXT (UPLIT (%ASCIZ' [Interrupted]')) ; 3839 5 ELSE ; 3840 5 TT%TEXT (UPLIT (%ASCIZ' [Interrupted, partial file saved]')) ; 3841 5 ; 3842 5 ELSE ; 3843 5 TT%TEXT (UPLIT (%ASCIZ' [OK]')); ; 3844 5 ; 3845 5 TT%CRLF (); ; 3846 4 END; ; 3847 4 ; 3848 4 IF NOT FILE%CLOSE (.DISCARD%FILE%FLAG AND .ABT%FLAG) THEN RETURN STATE%A; ; 3849 4 ; 3850 4 IF .DISCARD%FILE%FLAG ; 3851 4 THEN ; 3852 4 ; 3853 4 IF .ABT%FLAG THEN SUB%TYPE = %C'X' ELSE SUB%TYPE = %C'D' ; 3854 4 ; 3855 4 ELSE ; 3856 4 SUB%TYPE = %C'C'; ; 3857 4 ; 3858 4 END ; 3859 3 ELSE ; 3860 4 BEGIN ; 3861 4 TT%CRLF (); ! Make sure we have a CRLF ; 3862 4 TT%OUTPUT (); ! And make sure all output is sent ; 3863 3 END; ; 3864 3 ; 3865 3 XFR%STATUS (%C'F', .SUB%TYPE); ; 3866 3 MSG%NUMBER = (.MSG%NUMBER + 1) AND %O'77'; ; 3867 3 RETURN STATE%RF; ; 3868 2 END; ; 3869 2 ; 3870 2 [OTHERWISE] : ; 3871 3 BEGIN ; 3872 3 KRM%ERROR (KER%PROTOERR); ; 3873 3 RETURN STATE%A; ; 3874 2 END; ; 3875 2 TES; ; 3876 2 ; 3877 1 END; ! End of REC%DATA P.AAK: BYTE (7)" ","[","I","n","t" BYTE (7)"e","r","r","u","p" BYTE (7)"t","e","d","]",000 P.AAL: BYTE (7)" ","[","I","n","t" BYTE (7)"e","r","r","u","p" BYTE (7)"t","e","d",","," " BYTE (7)"p","a","r","t","i" BYTE (7)"a","l"," ","f","i" BYTE (7)"l","e"," ","s","a" BYTE (7)"v","e","d","]",000 P.AAM: BYTE (7)" ","[","O","K","]" BYTE (7)000,000,000,000,000 ; REC%DATA U.13: PUSH SP,AC16 ; 3645 PUSH SP,C.51 ; 3710 PUSHJ SP,U.25 ADJSP SP,-1 TRNE AC1,1 JRST L.191 CAIE AC1,312 ; 3713 JRST L.208 MOVEI AC1,23 JRST L.216 L.191: MOVE AC1,U.58 ; 3715 CAIE AC1,104 ; 3718 JRST L.197 MOVE AC2,U.55 ; 3721 CAMN AC2,U.56 JRST L.192 MOVE AC1,U.53 ; 3725 CAMLE AC1,PKT%RETRIES JRST L.199 JRST L.200 ; 3645 L.192: PUSHJ SP,U.28 ; 3748 TRNN AC1,1 JRST L.208 MOVEI AC1,1 ; 3754 TDNN AC1,ABT%CUR%FILE JRST L.193 MOVEI AC2,130 ; 3757 MOVE AC1,C.32 IDPB AC2,AC1 JRST L.194 L.193: MOVEI AC1,1 ; 3762 TDNN AC1,ABT%ALL%FILE JRST L.195 MOVEI AC3,132 ; 3765 MOVE AC1,C.32 IDPB AC3,AC1 L.194: MOVEI AC2,1 ; 3766 JRST L.196 ; 3762 L.195: SETZ AC2, ; 3769 L.196: PUSH SP,C.20 ; 3774 PUSH SP,AC2 PUSH SP,U.56 PUSHJ SP,U.24 MOVE AC1,U.54 ; 3775 MOVEM AC1,U.53 SETZM U.54 ; 3776 MOVE AC1,U.55 ; 3777 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 ADJSP SP,-2 ; 3719 MOVEI AC1,10 ; 3715 JRST L.215 L.197: CAIE AC1,106 ; 3781 CAIN AC1,130 JRST L.198 JRST L.201 L.198: MOVE AC1,U.53 ; 3784 CAMG AC1,PKT%RETRIES JRST L.200 L.199: MOVEI AC1,24 JRST L.216 L.200: AOS U.53 ; 3786 MOVE AC1,U.55 ; 3788 SUBI AC1,1 LDB AC2,C.18 CAME AC2,U.56 JRST L.214 PUSH SP,C.20 ; 3791 PUSH SP,C.25 PUSH SP,U.56 PUSHJ SP,U.24 SETZM U.54 ; 3792 ADJSP SP,-2 ; 3790 MOVE AC1,U.51 ; 3796 JRST L.215 L.201: CAIE AC1,132 ; 3803 JRST L.214 MOVE AC1,U.55 ; 3806 CAMN AC1,U.56 JRST L.202 PUSH SP,C.21 ; 3809 PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 3810 JRST L.208 L.202: PUSH SP,C.20 ; 3813 PUSH SP,C.25 PUSH SP,U.56 PUSHJ SP,U.24 MOVEI AC1,1 ; 3815 TDNE AC1,U.62 JRST L.212 SETZB AC16,FLAG%FILE%OPEN ; 3818 MOVEI AC1,1 ; 3821 CAME AC1,U.57 JRST L.203 MOVE AC2,C.27 ; 3824 MOVE AC1,U.39 ADJBP AC1,AC2 ILDB AC1,AC1 CAIN AC1,104 MOVEI AC16,1 ; 3827 L.203: MOVEI AC1,1 ; 3829 TDNE AC1,CONNECT%FLAG JRST L.207 MOVEI AC1,1 TDNN AC1,TY%FIL JRST L.207 TRNN AC16,1 ; 3833 JRST L.205 MOVEI AC1,1 ; 3836 TDNN AC1,ABT%FLAG JRST L.204 PUSH SP,C.52 ; 3838 JRST L.206 L.204: PUSH SP,C.53 ; 3840 JRST L.206 L.205: PUSH SP,C.54 ; 3843 L.206: PUSHJ SP,TT%TEXT PUSHJ SP,TT%CRLF ; 3845 ADJSP SP,-1 ; 3831 L.207: MOVE AC1,AC16 ; 3848 AND AC1,ABT%FLAG PUSH SP,AC1 PUSHJ SP,FILE%CLOSE ADJSP SP,-1 TRNE AC1,1 JRST L.209 ADJSP SP,-3 L.208: MOVEI AC1,12 JRST L.216 L.209: TRNN AC16,1 ; 3850 JRST L.211 MOVEI AC1,1 ; 3853 TDNN AC1,ABT%FLAG JRST L.210 MOVEI AC1,130 JRST L.213 L.210: MOVEI AC1,104 JRST L.213 ; 3850 L.211: MOVEI AC1,103 ; 3856 JRST L.213 ; 3815 L.212: PUSHJ SP,TT%CRLF ; 3861 PUSHJ SP,TT%OUTPUT ; 3862 L.213: PUSH SP,C.15 ; 3865 PUSH SP,AC1 PUSHJ SP,XFR%STATUS MOVE AC1,U.55 ; 3866 ADDI AC1,1 LDB AC2,C.18 MOVEM AC2,U.55 ADJSP SP,-4 ; 3804 MOVEI AC1,7 ; 3715 JRST L.215 L.214: PUSH SP,C.21 ; 3872 PUSHJ SP,KRM%ERROR MOVEI AC1,12 ; 3715 L.215: ADJSP SP,-1 ; 3871 L.216: POP SP,AC16 ; 3645 POPJ SP, C.51: XWD 0,U.80 C.52: XWD 0,P.AAK C.53: XWD 0,P.AAL C.54: XWD 0,P.AAM ; Routine Size: 164 words ; 3878 1 %SBTTL 'SERVER - Generic commands' ; 3879 1 ROUTINE SERVER%GENERIC = ; 3880 1 ; 3881 1 !++ ; 3882 1 ! FUNCTIONAL DESCRIPTION: ; 3883 1 ! ; 3884 1 ! This routine will handle the generic server messages. ; 3885 1 ! The generic server messages include FINISH, LOGOUT. ; 3886 1 ! ; 3887 1 ! CALLING SEQUENCE: ; 3888 1 ! ; 3889 1 ! STATE = SERVER%GENERIC(); ; 3890 1 ! ; 3891 1 ! INPUT PARAMETERS: ; 3892 1 ! ; 3893 1 ! None. ; 3894 1 ! ; 3895 1 ! IMPLICIT INPUTS: ; 3896 1 ! ; 3897 1 ! Generic message receive in REC%MSG. ; 3898 1 ! ; 3899 1 ! OUTPUT PARAMETERS: ; 3900 1 ! ; 3901 1 ! Returns new state for FSM ; 3902 1 ! ; 3903 1 ! IMPLICIT OUTPUTS: ; 3904 1 ! ; 3905 1 ! None. ; 3906 1 ! ; 3907 1 ! COMPLETION CODES: ; 3908 1 ! ; 3909 1 ! None. ; 3910 1 ! ; 3911 1 ! SIDE EFFECTS: ; 3912 1 ! ; 3913 1 ! None. ; 3914 1 ! ; 3915 1 !-- ; 3916 1 ; 3917 2 BEGIN ; 3918 2 ; 3919 2 LOCAL ; 3920 2 STATUS, ! Returned status ; 3921 2 G%FUNC, ! Generic command function ; 3922 2 POINTER, ! Character pointer ; 3923 2 DATA%TEXT : VECTOR [CH$ALLOCATION (MAX%MSG)], ! Unpacked message ; 3924 2 DATA%SIZE; ! Actual size of data ; 3925 2 ; 3926 2 ROUTINE UNPACK%DATA (POINTER, SIZE, DST%ADDR, DST%LEN) = ; 3927 2 ! ; 3928 2 ! Routine to unpack an argument. ; 3929 2 ! This will copy the argument data to the desired buffer. ; 3930 2 ! ; 3931 3 BEGIN ; 3932 3 ; 3933 3 IF .SIZE GTR 0 ! If we have something to unpack ; 3934 3 THEN ; 3935 4 BEGIN ; 3936 4 .DST%LEN = UNCHAR (CH$RCHAR%A (.POINTER)); ; 3937 4 ; 3938 4 IF ..DST%LEN LSS 0 ; 3939 4 THEN ; 3940 5 BEGIN ; 3941 5 KRM%ERROR (KER%PROTOERR); ! Someone screwed up ; 3942 5 ..DST%LEN = 0; ; 3943 5 RETURN -1; ; 3944 4 END; ; 3945 4 ; 3946 4 IF ..DST%LEN GTR .SIZE - 1 THEN .DST%LEN = .SIZE - 1; ; 3947 4 ; 3948 4 CH$COPY (..DST%LEN, ..POINTER, CHR%NUL, MAX%MSG, CH$PTR (.DST%ADDR)); ; 3949 4 .POINTER = CH$PLUS (..POINTER, ..DST%LEN); ; 3950 4 RETURN .SIZE - ..DST%LEN - 1; ; 3951 4 END ; 3952 3 ELSE ; 3953 3 ! ; 3954 3 ! If nothing left in buffer, return the current size (0) ; 3955 3 ! ; 3956 3 RETURN .SIZE; ; 3957 3 ; 3958 2 END; ; UNPACK%DATA U.81: PUSH SP,AC12 ; 3926 PUSH SP,AC13 PUSH SP,AC14 PUSH SP,AC16 MOVE AC12,-7(SP) ; 3933 JUMPLE AC12,L.218 MOVE AC13,-5(SP) ; 3936 MOVE AC16,-10(SP) ILDB AC1,0(AC16) SUBI AC1,40 MOVEM AC1,0(AC13) MOVE AC14,0(AC13) ; 3938 JUMPGE AC14,L.217 PUSH SP,C.21 ; 3941 PUSHJ SP,KRM%ERROR SETZM 0(AC14) ; 3942 ADJSP SP,-1 ; 3943 SETO AC1, ; 3940 JRST L.219 L.217: MOVE AC1,AC12 ; 3946 SUBI AC1,1 CAMLE AC14,AC1 MOVEM AC1,0(AC13) MOVE AC1,-6(SP) ; 3948 MOVEI AC5,-1(AC1) HRLI AC5,10700 MOVE AC1,0(AC13) MOVE AC2,0(AC16) MOVEI AC4,1752 EXTEND AC1,C.1 JFCL MOVE AC1,0(AC13) ; 3949 ADJBP AC1,0(AC16) MOVEM AC1,0(AC16) MOVE AC1,AC12 ; 3950 SUB AC1,0(AC13) SOJA AC1,L.219 ; 3956 L.218: MOVE AC1,AC12 L.219: POP SP,AC16 ; 3926 POP SP,AC14 POP SP,AC13 POP SP,AC12 POPJ SP, ; Routine Size: 43 words ; 3959 2 ! ; 3960 2 ! First unpack the message data into its various pieces ; 3961 2 ! ; 3962 2 SET%STRING (CH$PTR (DATA%TEXT), MAX%MSG, TRUE); ! Initialize for unpacking ; 3963 2 BFR%EMPTY (); ! Unpack the data ; 3964 2 DATA%SIZE = SET%STRING (0, 0, FALSE); ! All done, get size ; 3965 2 ; 3966 2 IF .DATA%SIZE LEQ 0 ; 3967 2 THEN ; 3968 3 BEGIN ; 3969 3 KRM%ERROR (KER%PROTOERR); ! Someone screwed up ; 3970 3 RETURN STATE%A; ! Since no subtype ; 3971 2 END; ; 3972 2 ; 3973 2 ! ; 3974 2 ! Get the arguments from the unpacked data (if any) ; 3975 2 ! ; 3976 2 GEN%1SIZE = 0; ! Assume no args ; 3977 2 GEN%2SIZE = 0; ! none at all ; 3978 2 GEN%3SIZE = 0; ; 3979 2 CH$WCHAR (CHR%NUL, CH$PTR (GEN%1DATA)); ! Ensure all are null terminated ; 3980 2 CH$WCHAR (CHR%NUL, CH$PTR (GEN%2DATA)); ; 3981 2 CH$WCHAR (CHR%NUL, CH$PTR (GEN%3DATA)); ; 3982 2 POINTER = CH$PTR (DATA%TEXT, 1); ! Point at second character ; 3983 2 DATA%SIZE = .DATA%SIZE - 1; ! Account for subtype ; 3984 2 ; 3985 2 IF .DATA%SIZE GTR 0 ! Room for first arg? ; 3986 2 THEN ; 3987 3 BEGIN ; 3988 3 DATA%SIZE = UNPACK%DATA (POINTER, .DATA%SIZE, GEN%1DATA, GEN%1SIZE); ; 3989 3 ; 3990 3 IF .DATA%SIZE LSS 0 THEN RETURN STATE%A; ! Punt if bad arguments ; 3991 3 ; 3992 3 IF .DATA%SIZE GTR 0 ! Second argument present? ; 3993 3 THEN ; 3994 4 BEGIN ; 3995 4 DATA%SIZE = UNPACK%DATA (POINTER, .DATA%SIZE, GEN%2DATA, GEN%2SIZE); ; 3996 4 ; 3997 4 IF .DATA%SIZE LSS 0 THEN RETURN STATE%A; ! Punt if bad arguments ; 3998 4 ; 3999 4 IF .DATA%SIZE GTR 0 ! Third argument here? ; 4000 4 THEN ; 4001 5 BEGIN ; 4002 5 DATA%SIZE = UNPACK%DATA (POINTER, .DATA%SIZE, GEN%3DATA, GEN%3SIZE); ; 4003 5 ; 4004 5 IF .DATA%SIZE LSS 0 THEN RETURN STATE%A; ! Punt if bad arguments ; 4005 5 ; 4006 4 END; ; 4007 4 ; 4008 3 END; ; 4009 3 ; 4010 2 END; ; 4011 2 ; 4012 2 SELECTONE CH$RCHAR (CH$PTR (DATA%TEXT)) OF ; 4013 2 SET ; 4014 2 ! ; 4015 2 ! EXIT command, just return the status to the upper level ; 4016 2 ! ; 4017 2 ; 4018 2 [MSG%GEN%EXIT] : ; 4019 3 BEGIN ; 4020 3 SEND%PACKET (MSG%ACK, 0, .REC%SEQ); ; 4021 3 RETURN STATE%FI; ; 4022 2 END; ; 4023 2 ! ; 4024 2 ! LOGOUT command, ACK the message then call the system routine to ; 4025 2 ! kill the process (log the job out, etc.) ; 4026 2 ! ; 4027 2 ; 4028 2 [MSG%GEN%LOGOUT] : ; 4029 3 BEGIN ; 4030 3 SEND%PACKET (MSG%ACK, 0, .REC%SEQ); ; 4031 3 SY%LOGOUT (); ; 4032 3 RETURN STATE%LG; ; 4033 2 END; ; 4034 2 ! ; 4035 2 ! For a type command, just set up a transfer flagging we want a text header ; 4036 2 ! instead of a file header. ; 4037 2 ! ; 4038 2 ; 4039 2 [MSG%GEN%TYPE] : ; 4040 3 BEGIN ; 4041 3 CH$COPY (.GEN%1SIZE, CH$PTR (GEN%1DATA), CHR%NUL, MAX%FILE%NAME, CH$PTR ; 4042 3 (FILE%NAME)); ; 4043 3 FILE%SIZE = .GEN%1SIZE; ; 4044 3 TEXT%HEAD%FLAG = TRUE; ! Now want text header ; 4045 3 XFR%STATUS (%C'I', %C'G'); ! Tell display routine we are doing a command ; 4046 3 ; 4047 3 IF .STATE EQL STATE%II AND .BLK%CHK%TYPE EQL .INI%CHK%TYPE ; 4048 3 THEN ; 4049 3 RETURN STATE%OF ! Must open the file ; 4050 3 ELSE ; 4051 3 RETURN STATE%S; ! Start the transaction with a send ; 4052 3 ; 4053 2 END; ; 4054 2 ; 4055 2 [MSG%GEN%DIRECTORY] : ; 4056 2 G%FUNC = GC%DIRECTORY; ; 4057 2 ; 4058 2 [MSG%GEN%DISK%USAGE] : ; 4059 2 G%FUNC = GC%DISK%USAGE; ; 4060 2 ; 4061 2 [MSG%GEN%DELETE] : ; 4062 2 G%FUNC = GC%DELETE; ; 4063 2 ; 4064 2 [MSG%GEN%HELP] : ; 4065 2 G%FUNC = GC%HELP; ; 4066 2 ; 4067 2 [MSG%GEN%LOGIN] : ; 4068 2 G%FUNC = GC%LGN; ; 4069 2 ; 4070 2 [MSG%GEN%CONNECT] : ; 4071 2 G%FUNC = GC%CONNECT; ; 4072 2 ; 4073 2 [MSG%GEN%RENAME] : ; 4074 2 G%FUNC = GC%RENAME; ; 4075 2 ; 4076 2 [MSG%GEN%COPY] : ; 4077 2 G%FUNC = GC%COPY; ; 4078 2 ; 4079 2 [MSG%GEN%WHO] : ; 4080 2 G%FUNC = GC%WHO; ; 4081 2 ; 4082 2 [MSG%GEN%SEND] : ; 4083 2 G%FUNC = GC%SEND%MSG; ; 4084 2 ; 4085 2 [MSG%GEN%QUERY] : ; 4086 2 G%FUNC = GC%STATUS; ; 4087 2 ; 4088 2 [MSG%GEN%PROGRAM] : ; 4089 2 G%FUNC = GC%PROGRAM; ; 4090 2 ; 4091 2 [MSG%GEN%JOURNAL] : ; 4092 2 G%FUNC = GC%JOURNAL; ; 4093 2 ; 4094 2 [MSG%GEN%VARIABLE] : ; 4095 2 G%FUNC = GC%VARIABLE; ; 4096 2 ! ; 4097 2 ! Here if we have a function that is not implemented in KERMSG. ; 4098 2 ! ; 4099 2 ; 4100 2 [OTHERWISE] : ; 4101 3 BEGIN ; 4102 3 KRM%ERROR (KER%UNIMPLGEN); ; 4103 3 RETURN STATE%A; ; 4104 2 END; ; 4105 2 TES; ; 4106 2 ; 4107 2 ! ; 4108 2 ! If we get here, we have gotten a known type of generic message that ; 4109 2 ! we need to have our operating system dependent routine handle. ; 4110 2 ! ; 4111 2 RETURN CALL%SY%RTN (.G%FUNC); ; 4112 1 END; ! End of SERVER%GENERIC ; SERVER%GENERIC U.14: PUSH SP,AC14 ; 3879 PUSH SP,AC16 ADJSP SP,312 MOVEI AC1,-312(SP) ; 3962 HRLI AC1,10700 PUSH SP,AC1 PUSH SP,C.55 PUSH SP,C.2 PUSHJ SP,U.30 PUSHJ SP,U.28 ; 3963 SETZM -2(SP) ; 3964 SETZM -1(SP) SETZM 0(SP) PUSHJ SP,U.30 MOVE AC14,AC1 JUMPG AC14,L.220 ; 3966 PUSH SP,C.21 ; 3969 JRST L.246 L.220: SETZM GEN%1SIZE ; 3976 SETZM GEN%2SIZE ; 3977 SETZB AC2,GEN%3SIZE ; 3978 MOVE AC1,C.11 ; 3979 IDPB AC2,AC1 SETZ AC2, ; 3980 MOVE AC1,C.56 IDPB AC2,AC1 SETZ AC2, ; 3981 MOVE AC1,C.57 IDPB AC2,AC1 MOVEI AC1,-314(SP) ; 3982 HRLI AC1,350700 MOVEM AC1,-3(SP) SOJLE AC14,L.226 ; 3985 MOVEI AC1,-3(SP) ; 3988 PUSH SP,AC1 PUSH SP,AC14 PUSH SP,C.38 PUSH SP,C.58 PUSHJ SP,U.81 MOVE AC14,AC1 JUMPGE AC14,L.221 ; 3990 ADJSP SP,-7 JRST L.247 L.221: JUMPLE AC14,L.225 ; 3992 MOVEI AC1,-7(SP) ; 3995 PUSH SP,AC1 PUSH SP,AC14 PUSH SP,C.39 PUSH SP,C.59 PUSHJ SP,U.81 MOVE AC14,AC1 JUMPGE AC14,L.222 ; 3997 ADJSP SP,-13 JRST L.247 L.222: JUMPLE AC14,L.224 ; 3999 MOVEI AC1,-13(SP) ; 4002 PUSH SP,AC1 PUSH SP,AC14 PUSH SP,C.40 PUSH SP,C.60 PUSHJ SP,U.81 MOVE AC14,AC1 JUMPGE AC14,L.223 ; 4004 ADJSP SP,-17 JRST L.247 L.223: ADJSP SP,-4 ; 4001 L.224: ADJSP SP,-4 ; 3994 L.225: ADJSP SP,-4 ; 3987 L.226: MOVEI AC1,-315(SP) ; 4012 HRLI AC1,10700 ILDB AC16,AC1 CAIE AC16,106 ; 4018 JRST L.227 PUSH SP,C.20 ; 4020 PUSH SP,C.25 PUSH SP,U.56 PUSHJ SP,U.24 ADJSP SP,-6 ; 4021 MOVEI AC1,20 ; 4019 JRST L.249 L.227: CAIE AC16,114 ; 4028 JRST L.228 PUSH SP,C.20 ; 4030 PUSH SP,C.25 PUSH SP,U.56 PUSHJ SP,U.24 PUSHJ SP,SY%LOGOUT ; 4031 ADJSP SP,-6 ; 4032 MOVEI AC1,21 ; 4029 JRST L.249 L.228: CAIE AC16,124 ; 4039 JRST L.231 MOVE AC1,GEN%1SIZE ; 4041 MOVE AC2,C.11 MOVEI AC4,204 MOVE AC5,C.10 EXTEND AC1,C.1 JFCL MOVE AC1,GEN%1SIZE ; 4043 MOVEM AC1,FILE%SIZE MOVEI AC1,1 ; 4044 MOVEM AC1,U.62 PUSH SP,C.6 ; 4045 PUSH SP,C.61 PUSHJ SP,XFR%STATUS MOVEI AC1,17 ; 4047 CAME AC1,U.51 JRST L.229 MOVE AC1,U.48 CAME AC1,U.47 JRST L.229 MOVEI AC1,22 ; 4051 JRST L.230 L.229: MOVEI AC1,1 L.230: ADJSP SP,-5 ; 4047 JRST L.249 ; 4040 L.231: CAIE AC16,104 ; 4055 JRST L.232 MOVEI AC14,2 ; 4056 JRST L.248 ; 4012 L.232: CAIE AC16,125 ; 4058 JRST L.233 MOVEI AC14,3 ; 4059 JRST L.248 ; 4012 L.233: CAIE AC16,105 ; 4061 JRST L.234 MOVEI AC14,4 ; 4062 JRST L.248 ; 4012 L.234: CAIE AC16,110 ; 4064 JRST L.235 MOVEI AC14,6 ; 4065 JRST L.248 ; 4012 L.235: CAIE AC16,111 ; 4067 JRST L.236 MOVEI AC14,10 ; 4068 JRST L.248 ; 4012 L.236: CAIE AC16,103 ; 4070 JRST L.237 MOVEI AC14,11 ; 4071 JRST L.248 ; 4012 L.237: CAIE AC16,122 ; 4073 JRST L.238 MOVEI AC14,12 ; 4074 JRST L.248 ; 4012 L.238: CAIE AC16,113 ; 4076 JRST L.239 MOVEI AC14,13 ; 4077 JRST L.248 ; 4012 L.239: CAIE AC16,127 ; 4079 JRST L.240 MOVEI AC14,14 ; 4080 JRST L.248 ; 4012 L.240: CAIE AC16,115 ; 4082 JRST L.241 MOVEI AC14,15 ; 4083 JRST L.248 ; 4012 L.241: CAIE AC16,121 ; 4085 JRST L.242 MOVEI AC14,16 ; 4086 JRST L.248 ; 4012 L.242: CAIE AC16,120 ; 4088 JRST L.243 MOVEI AC14,23 ; 4089 JRST L.248 ; 4012 L.243: CAIE AC16,112 ; 4091 JRST L.244 MOVEI AC14,21 ; 4092 JRST L.248 ; 4012 L.244: CAIE AC16,126 ; 4094 JRST L.245 MOVEI AC14,22 ; 4095 JRST L.248 ; 4012 L.245: PUSH SP,C.13 ; 4102 L.246: PUSHJ SP,KRM%ERROR ADJSP SP,-4 ; 4103 L.247: MOVEI AC1,12 ; 4101 JRST L.249 L.248: MOVEM AC14,0(SP) ; 4111 PUSHJ SP,U.17 ADJSP SP,-3 L.249: ADJSP SP,-312 ; 3879 POP SP,AC16 POP SP,AC14 POPJ SP, C.55: EXP 1752 C.56: POINT 7,GEN%2DATA-1,34 C.57: POINT 7,GEN%3DATA-1,34 C.58: XWD 0,GEN%1SIZE C.59: XWD 0,GEN%2SIZE C.60: XWD 0,GEN%3SIZE C.61: EXP 107 ; Routine Size: 191 words ; 4113 1 %SBTTL 'HOST%COMMAND - perform a host command' ; 4114 1 ROUTINE HOST%COMMAND = ; 4115 1 ; 4116 1 !++ ; 4117 1 ! FUNCTIONAL DESCRIPTION: ; 4118 1 ! ; 4119 1 ! This routine will handle the host command packet. ; 4120 1 ! It will set up the data for the call to the system routine. ; 4121 1 ! ; 4122 1 ! CALLING SEQUENCE: ; 4123 1 ! ; 4124 1 ! STATE = HOST%COMMAND(); ; 4125 1 ! ; 4126 1 ! INPUT PARAMETERS: ; 4127 1 ! ; 4128 1 ! None. ; 4129 1 ! ; 4130 1 ! IMPLICIT INPUTS: ; 4131 1 ! ; 4132 1 ! Generic message receive in REC%MSG. ; 4133 1 ! ; 4134 1 ! OUTPUT PARAMETERS: ; 4135 1 ! ; 4136 1 ! Returns new state for FSM ; 4137 1 ! ; 4138 1 ! IMPLICIT OUTPUTS: ; 4139 1 ! ; 4140 1 ! None. ; 4141 1 ! ; 4142 1 ! COMPLETION CODES: ; 4143 1 ! ; 4144 1 ! None. ; 4145 1 ! ; 4146 1 ! SIDE EFFECTS: ; 4147 1 ! ; 4148 1 ! None. ; 4149 1 ! ; 4150 1 !-- ; 4151 1 ; 4152 2 BEGIN ; 4153 2 GEN%1SIZE = 0; ; 4154 2 GEN%2SIZE = 0; ; 4155 2 GEN%3SIZE = 0; ; 4156 2 ; 4157 2 IF .REC%LENGTH LEQ 0 ; 4158 2 THEN ; 4159 3 BEGIN ; 4160 3 KRM%ERROR (KER%PROTOERR); ! Return an error ; 4161 3 RETURN STATE%A; ! Just abort ; 4162 2 END; ; 4163 2 ; 4164 2 SET%STRING (CH$PTR (GEN%1DATA), MAX%MSG, TRUE); ! Start writing to buffer ; 4165 2 BFR%EMPTY (); ! Dump the text ; 4166 2 GEN%1SIZE = SET%STRING (0, 0, FALSE); ! Get the result ; 4167 2 RETURN CALL%SY%RTN (GC%COMMAND); ; 4168 1 END; ! End of HOST%COMMAND ; HOST%COMMAND U.15: SETZM GEN%1SIZE ; 4153 SETZM GEN%2SIZE ; 4154 SETZM GEN%3SIZE ; 4155 SKIPLE U.57 ; 4157 JRST L.250 PUSH SP,C.21 ; 4160 PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 4161 MOVEI AC1,12 ; 4159 POPJ SP, L.250: PUSH SP,C.11 ; 4164 PUSH SP,C.55 PUSH SP,C.2 PUSHJ SP,U.30 PUSHJ SP,U.28 ; 4165 SETZM -2(SP) ; 4166 SETZM -1(SP) SETZM 0(SP) PUSHJ SP,U.30 MOVEM AC1,GEN%1SIZE PUSH SP,C.62 ; 4167 PUSHJ SP,U.17 ADJSP SP,-4 POPJ SP, ; 4114 C.62: EXP 17 ; Routine Size: 25 words ; 4169 1 %SBTTL 'KERMIT%COMMAND - perform a KERMIT command' ; 4170 1 ROUTINE KERMIT%COMMAND = ; 4171 1 ; 4172 1 !++ ; 4173 1 ! FUNCTIONAL DESCRIPTION: ; 4174 1 ! ; 4175 1 ! This routine will handle the KERMIT command packet. ; 4176 1 ! It will set up the data for the call to the system routine. ; 4177 1 ! ; 4178 1 ! CALLING SEQUENCE: ; 4179 1 ! ; 4180 1 ! STATE = KERMIT%COMMAND(); ; 4181 1 ! ; 4182 1 ! INPUT PARAMETERS: ; 4183 1 ! ; 4184 1 ! None. ; 4185 1 ! ; 4186 1 ! IMPLICIT INPUTS: ; 4187 1 ! ; 4188 1 ! Generic message receive in REC%MSG. ; 4189 1 ! ; 4190 1 ! OUTPUT PARAMETERS: ; 4191 1 ! ; 4192 1 ! Returns new state for FSM ; 4193 1 ! ; 4194 1 ! IMPLICIT OUTPUTS: ; 4195 1 ! ; 4196 1 ! None. ; 4197 1 ! ; 4198 1 ! COMPLETION CODES: ; 4199 1 ! ; 4200 1 ! None. ; 4201 1 ! ; 4202 1 ! SIDE EFFECTS: ; 4203 1 ! ; 4204 1 ! None. ; 4205 1 ! ; 4206 1 !-- ; 4207 1 ; 4208 2 BEGIN ; 4209 2 GEN%1SIZE = 0; ; 4210 2 GEN%2SIZE = 0; ; 4211 2 GEN%3SIZE = 0; ; 4212 2 ; 4213 2 IF .REC%LENGTH LEQ 0 ; 4214 2 THEN ; 4215 3 BEGIN ; 4216 3 KRM%ERROR (KER%PROTOERR); ! Return an error ; 4217 3 RETURN STATE%A; ! Just abort ; 4218 2 END; ; 4219 2 ; 4220 2 SET%STRING (CH$PTR (GEN%1DATA), MAX%MSG, TRUE); ! Start writing to buffer ; 4221 2 BFR%EMPTY (); ! Dump the text ; 4222 2 GEN%1SIZE = SET%STRING (0, 0, FALSE); ! Get the result ; 4223 2 RETURN CALL%SY%RTN (GC%KERMIT); ; 4224 1 END; ! End of KERMIT%COMMAND ; KERMIT%COMMAND U.16: SETZM GEN%1SIZE ; 4209 SETZM GEN%2SIZE ; 4210 SETZM GEN%3SIZE ; 4211 SKIPLE U.57 ; 4213 JRST L.251 PUSH SP,C.21 ; 4216 PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 4217 MOVEI AC1,12 ; 4215 POPJ SP, L.251: PUSH SP,C.11 ; 4220 PUSH SP,C.55 PUSH SP,C.2 PUSHJ SP,U.30 PUSHJ SP,U.28 ; 4221 SETZM -2(SP) ; 4222 SETZM -1(SP) SETZM 0(SP) PUSHJ SP,U.30 MOVEM AC1,GEN%1SIZE PUSH SP,C.63 ; 4223 PUSHJ SP,U.17 ADJSP SP,-4 POPJ SP, ; 4170 C.63: EXP 20 ; Routine Size: 25 words ; 4225 1 %SBTTL 'CALL%SY%RTN - handle operating system dependent functions' ; 4226 1 ROUTINE CALL%SY%RTN (G%FUNC) = ; 4227 1 ; 4228 1 !++ ; 4229 1 ! FUNCTIONAL DESCRIPTION: ; 4230 1 ! ; 4231 1 ! This routine will handle calling the operating system dependent routine ; 4232 1 ! for a server function and returning the response. ; 4233 1 ! ; 4234 1 ! CALLING SEQUENCE: ; 4235 1 ! ; 4236 1 ! STATE = CALL%SY%RTN(.G%FUNC); ; 4237 1 ! ; 4238 1 ! INPUT PARAMETERS: ; 4239 1 ! ; 4240 1 ! G%FUNC - Generic function code ; 4241 1 ! ; 4242 1 ! IMPLICIT INPUTS: ; 4243 1 ! ; 4244 1 ! Generic message data in GEN%1DATA ; 4245 1 ! ; 4246 1 ! OUTPUT PARAMETERS: ; 4247 1 ! ; 4248 1 ! Returns new state for FSM ; 4249 1 ! ; 4250 1 ! IMPLICIT OUTPUTS: ; 4251 1 ! ; 4252 1 ! None. ; 4253 1 ! ; 4254 1 ! COMPLETION CODES: ; 4255 1 ! ; 4256 1 ! None. ; 4257 1 ! ; 4258 1 ! SIDE EFFECTS: ; 4259 1 ! ; 4260 1 ! None. ; 4261 1 ! ; 4262 1 !-- ; 4263 1 ; 4264 2 BEGIN ; 4265 2 ; 4266 2 LOCAL ; 4267 2 STRING%ADDRESS, ! Address of string result ; 4268 2 STRING%LENGTH, ! Length of string result ; 4269 2 GET%CHR%SUBROUTINE, ! Routine to get a response character ; 4270 2 STATUS; ! Status value ; 4271 2 ; 4272 2 ! ; 4273 2 ! Call the routine with the desired type of command. ; 4274 2 ! ; 4275 2 STRING%LENGTH = 0; ! Initialize for no string ; 4276 2 GET%CHR%SUBROUTINE = 0; ! And no subroutine ; 4277 2 ; 4278 2 IF NOT SY%GENERIC (.G%FUNC, STRING%ADDRESS, STRING%LENGTH, ; 4279 2 GET%CHR%SUBROUTINE) ; 4280 2 THEN ; 4281 2 RETURN STATE%A; ! And abort ; 4282 2 ; 4283 2 IF .STRING%LENGTH GTR 0 ; 4284 2 THEN ; 4285 3 BEGIN ; 4286 3 SET%STRING (CH$PTR (.STRING%ADDRESS), .STRING%LENGTH, TRUE); ; 4287 3 ; 4288 3 IF .STRING%LENGTH LSS .SEND%PKT%SIZE - PKT%OVR%HEAD ; 4289 3 THEN ; 4290 4 BEGIN ; 4291 4 BFR%FILL (TRUE); ! If it should fit, pack it in ; 4292 4 ; 4293 4 IF SET%STRING (0, 0, FALSE) GEQ .STRING%LENGTH ; 4294 4 THEN ! It fit, so just send the ACK ; 4295 4 ; 4296 4 IF SEND%PACKET (MSG%ACK, .SIZE, .REC%SEQ) THEN RETURN STATE%C ELSE RETURN ; 4297 4 STATE%EX; ; 4298 4 ; 4299 4 ! ; 4300 4 ! It didn't fit, reset the pointers to the beginning ; 4301 4 ! ; 4302 4 SET%STRING (CH$PTR (.STRING%ADDRESS), .STRING%LENGTH, TRUE); ; 4303 3 END; ; 4304 3 ; 4305 3 NO%FILE%NEEDED = TRUE; ! Don't need a file ; 4306 3 END ; 4307 2 ELSE ; 4308 2 ; 4309 2 IF .GET%CHR%SUBROUTINE NEQ 0 ! If we got a subroutine back ; 4310 2 THEN ; 4311 3 BEGIN ; 4312 3 GET%CHR%ROUTINE = .GET%CHR%SUBROUTINE; ; 4313 3 NO%FILE%NEEDED = TRUE; ; 4314 2 END; ; 4315 2 ; 4316 2 TEXT%HEAD%FLAG = TRUE; ! Send to be typed ; 4317 2 XFR%STATUS (%C'I', %C'G'); ! Doing a generic command ; 4318 2 ; 4319 2 IF .STATE EQL STATE%II AND .BLK%CHK%TYPE EQL .INI%CHK%TYPE ; 4320 2 THEN ; 4321 2 RETURN STATE%OF ; 4322 2 ELSE ; 4323 2 RETURN STATE%S; ! Send the response ; 4324 2 ; 4325 1 END; ! End of CALL%SY%RTN ; CALL%SY%RTN U.17: PUSH SP,AC14 ; 4226 PUSH SP,AC16 ADJSP SP,3 SETZM -1(SP) ; 4275 SETZM -2(SP) ; 4276 PUSH SP,-6(SP) ; 4278 MOVEI AC1,-1(SP) PUSH SP,AC1 MOVEI AC1,-3(SP) PUSH SP,AC1 MOVEI AC1,-5(SP) PUSH SP,AC1 PUSHJ SP,SY%GENERIC ADJSP SP,-4 TRNE AC1,1 JRST L.252 MOVEI AC1,12 ; 4281 JRST L.261 L.252: MOVE AC14,-1(SP) ; 4283 JUMPLE AC14,L.257 MOVE AC16,0(SP) ; 4286 MOVEI AC1,-1(AC16) HRLI AC1,10700 PUSH SP,AC1 PUSH SP,AC14 PUSH SP,C.2 PUSHJ SP,U.30 MOVE AC1,U.40 ; 4288 SUBI AC1,3 CAML AC14,AC1 JRST L.256 PUSH SP,C.2 ; 4291 PUSHJ SP,U.29 SETZM -2(SP) ; 4293 SETZM -1(SP) SETZM 0(SP) PUSHJ SP,U.30 CAMGE AC1,AC14 JRST L.255 PUSH SP,C.20 ; 4296 PUSH SP,U.52 PUSH SP,U.56 PUSHJ SP,U.24 ADJSP SP,-3 TRNN AC1,1 JRST L.253 MOVEI AC1,11 JRST L.254 L.253: MOVEI AC1,23 L.254: ADJSP SP,-4 JRST L.261 L.255: MOVEI AC1,-1(AC16) ; 4302 HRLI AC1,10700 PUSH SP,AC1 PUSH SP,AC14 PUSH SP,C.2 PUSHJ SP,U.30 ADJSP SP,-4 ; 4290 L.256: MOVEI AC1,1 ; 4305 MOVEM AC1,U.63 ADJSP SP,-3 ; 4285 JRST L.258 ; 4283 L.257: MOVE AC1,-2(SP) ; 4309 JUMPE AC1,L.258 MOVEM AC1,U.67 ; 4312 MOVEI AC1,1 ; 4313 MOVEM AC1,U.63 L.258: MOVEI AC1,1 ; 4316 MOVEM AC1,U.62 PUSH SP,C.6 ; 4317 PUSH SP,C.61 PUSHJ SP,XFR%STATUS MOVEI AC1,17 ; 4319 CAME AC1,U.51 JRST L.259 MOVE AC1,U.48 CAME AC1,U.47 JRST L.259 MOVEI AC1,22 ; 4323 JRST L.260 L.259: MOVEI AC1,1 L.260: ADJSP SP,-2 ; 4319 L.261: ADJSP SP,-3 ; 4226 POP SP,AC16 POP SP,AC14 POPJ SP, ; Routine Size: 86 words ; 4326 1 %SBTTL 'Message processing -- PRS%SEND%INIT - Parse send init params' ; 4327 1 ROUTINE PRS%SEND%INIT = ; 4328 1 ; 4329 1 !++ ; 4330 1 ! FUNCTIONAL DESCRIPTION: ; 4331 1 ! ; 4332 1 ! This routine will parse the SEND%INIT parameters that were sent by ; 4333 1 ! the remote Kermit. The items will be stored into the low segment. ; 4334 1 ! ; 4335 1 ! CALLING SEQUENCE: ; 4336 1 ! ; 4337 1 ! PRS%SEND%INIT (); ; 4338 1 ! ; 4339 1 ! INPUT PARAMETERS: ; 4340 1 ! ; 4341 1 ! None. ; 4342 1 ! ; 4343 1 ! IMPLICIT INPUTS: ; 4344 1 ! ; 4345 1 ! Message stored in REC%MSG. ; 4346 1 ! ; 4347 1 ! OUTPUT PARAMETERS: ; 4348 1 ! ; 4349 1 ! None. ; 4350 1 ! ; 4351 1 ! IMPLICIT OUTPUTS: ; 4352 1 ! ; 4353 1 ! None. ; 4354 1 ! ; 4355 1 ! COMPLETION CODES: ; 4356 1 ! ; 4357 1 ! None. ; 4358 1 ! ; 4359 1 ! SIDE EFFECTS: ; 4360 1 ! ; 4361 1 ! None. ; 4362 1 ! ; 4363 1 !-- ; 4364 1 ; 4365 2 BEGIN ; 4366 2 ! The following section of code will parse the various send parameters ; 4367 2 ! that are found in the send-init message. The following code will store ; 4368 2 ! the following as the value. ; 4369 2 ! ; 4370 2 ! If the user specified a value then the user supplied value will be used else ; 4371 2 ! the value in the message and if none in the message then the default value. ; 4372 2 ! ; 4373 2 ! User supplied values are denoted as positive values in SND%xxxxxxx. ; 4374 2 ! ; 4375 2 ! Parse the packet size ; 4376 2 ! ; 4377 3 SEND%PKT%SIZE = (IF .SND%PKT%SIZE GEQ 0 THEN ! [108] ; 4378 3 (IF .SND%PKT%SIZE GTR 94 THEN 94 ELSE .SND%PKT%SIZE) ELSE ! [108] ; 4379 4 BEGIN ; 4380 4 ; 4381 4 IF .REC%LENGTH GTR P%SI%BUFSIZ ; 4382 4 THEN ; P 4383 4 UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, ; 4384 5 .RECV%PKT%MSG + P%SI%BUFSIZ, CHR%SIZE))) ! [108] ; 4385 4 ELSE ; 4386 4 ABS (.SND%PKT%SIZE) ; 4387 4 ; 4388 4 END ; 4389 2 ); ; 4390 2 ! ; 4391 2 ! Parse the time out value ; 4392 2 ! ; 4393 3 SEND%TIMEOUT = (IF .SND%TIMEOUT GEQ 0 THEN .SND%TIMEOUT ELSE ; 4394 4 BEGIN ; 4395 4 ; 4396 4 IF .REC%LENGTH GTR P%SI%TIMOUT ; 4397 4 THEN ; P 4398 4 UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, ; 4399 5 .RECV%PKT%MSG + P%SI%TIMOUT, CHR%SIZE))) ! [108] ; 4400 4 ELSE ; 4401 4 ABS (.SND%TIMEOUT) ; 4402 4 ; 4403 4 END ; 4404 2 ); ; 4405 2 ! ; 4406 2 ! Parse the number of padding characters supplied ; 4407 2 ! ; 4408 3 SEND%NPAD = (IF .SND%NPAD GEQ 0 THEN .SND%NPAD ELSE ; 4409 4 BEGIN ; 4410 4 ; 4411 4 IF .REC%LENGTH GTR P%SI%NPAD ; 4412 4 THEN ; P 4413 4 UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%NPAD, ; 4414 5 CHR%SIZE))) ! [108] ; 4415 4 ELSE ; 4416 4 ABS (.SND%NPAD) ; 4417 4 ; 4418 4 END ; 4419 2 ); ; 4420 2 ! ; 4421 2 ! Parse the padding character ; 4422 2 ! ; 4423 3 SEND%PADCHAR = (IF .SND%PADCHAR GEQ 0 THEN .SND%PADCHAR ELSE ; 4424 4 BEGIN ; 4425 4 ; 4426 4 IF .REC%LENGTH GTR P%SI%PAD ; 4427 4 THEN ; P 4428 4 CTL (CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%PAD, ; 4429 5 CHR%SIZE))) ! [108] ; 4430 4 ELSE ; 4431 4 ABS (.SND%PADCHAR) ; 4432 4 ; 4433 4 END ; 4434 2 ); ; 4435 2 ! ; 4436 2 ! Parse the end of line character ; 4437 2 ! ; 4438 3 SEND%EOL = (IF .SND%EOL GEQ 0 THEN .SND%EOL ELSE ; 4439 4 BEGIN ; 4440 4 ; 4441 4 IF .REC%LENGTH GTR P%SI%EOL ; 4442 4 THEN ; P 4443 4 UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%EOL, ; 4444 5 CHR%SIZE))) ! [108] ; 4445 4 ELSE ; 4446 4 ABS (.SND%EOL) ; 4447 4 ; 4448 4 END ; 4449 2 ); ; 4450 2 ! ; 4451 2 ! Parse the quoting character ; 4452 2 ! ; 4453 3 SEND%QUOTE%CHR = (IF .SND%QUOTE%CHR GEQ 0 THEN .SND%QUOTE%CHR ELSE ; 4454 4 BEGIN ; 4455 4 ; 4456 4 IF .REC%LENGTH GTR P%SI%QUOTE ; 4457 4 THEN ; 4458 4 CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + P%SI%QUOTE, ! [108] ; 4459 4 CHR%SIZE)) ; 4460 4 ELSE ; 4461 4 ABS (.SND%QUOTE%CHR) ; 4462 4 ; 4463 4 END ; 4464 2 ); ; 4465 2 ! ; 4466 2 ! Parse the 8-bit quoting character ; 4467 2 ! ; 4468 2 ! If the character was not included in the packet, assume no eight-bit ; 4469 2 ! quoting allowed (we are probably talking to an old version of Kermit). ; 4470 2 ! ; 4471 3 SEND%8QUOTE%CHR = (IF .REC%LENGTH GTR P%SI%8QUOTE THEN CH$RCHAR (CH$PTR ; 4472 3 (REC%MSG, ; 4473 3 .RECV%PKT%MSG + P%SI%8QUOTE, CHR%SIZE)) ELSE %C'N' ! [108] ! Assume no 8-bit quoting allowed ; 4474 2 ); ; 4475 2 ! ; 4476 2 ! Parse the checksum type ; 4477 2 ! ; 4478 2 ; 4479 2 IF .REC%LENGTH GTR P%SI%CHKTYPE ; 4480 2 THEN ; 4481 3 BEGIN ; 4482 3 ; 4483 3 LOCAL ; 4484 3 REQ%CHK%TYPE; ; 4485 3 ; 4486 3 REQ%CHK%TYPE = CH$RCHAR (CH$PTR (REC%MSG, .RECV%PKT%MSG + ! [108] ; 4487 3 P%SI%CHKTYPE, CHR%SIZE)); ; 4488 3 ; 4489 3 IF .REC%TYPE NEQ MSG%ACK ; 4490 3 THEN ; 4491 3 ; 4492 3 IF .REQ%CHK%TYPE GEQ CHK%1CHAR AND .REQ%CHK%TYPE LEQ CHK%CRC ; 4493 3 THEN ; 4494 3 INI%CHK%TYPE = .REQ%CHK%TYPE ; 4495 3 ELSE ; 4496 3 INI%CHK%TYPE = CHK%1CHAR ; 4497 3 ; 4498 3 ELSE ; 4499 3 ; 4500 3 IF .REQ%CHK%TYPE NEQ .CHKTYPE ; 4501 3 THEN ; 4502 3 INI%CHK%TYPE = CHK%1CHAR ; 4503 3 ELSE ; 4504 3 INI%CHK%TYPE = .REQ%CHK%TYPE ; 4505 3 ; 4506 3 END ; 4507 2 ELSE ; 4508 2 INI%CHK%TYPE = CHK%1CHAR; ! Only single character checksum if not specified ; 4509 2 ; 4510 2 ! ; 4511 2 ! Parse the repeat character ; 4512 2 ! ; 4513 3 REPT%CHR = (IF .REC%LENGTH GTR P%SI%REPEAT THEN CH$RCHAR (CH$PTR (REC%MSG, ; 4514 2 .RECV%PKT%MSG + P%SI%REPEAT, CHR%SIZE)) ELSE %C' '); ! [108] ; 4515 2 ! ! [108] ; 4516 2 ! Parse the capas field, if present and if we enabled extended length ! [108] ; 4517 2 ! ! [108] ; 4518 2 ! [108] ; 4519 3 IF (.REC%LENGTH GTR P%SI%CAPAS) AND (ABS(.SND%PKT%SIZE) GTR 94) ! [108] ; 4520 2 THEN ! [108] ; 4521 3 BEGIN ! [108] ; 4522 3 ! [108] ; 4523 3 LOCAL ! [108] ; 4524 3 CAPAS%OFFSET; ! [108] ; 4525 3 ! [108] ; 4526 3 CAPAS%OFFSET = .RECV%PKT%MSG + P%SI%CAPAS; ! [108] ; 4527 3 ; 4528 3 IF (UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .CAPAS%OFFSET, CHR%SIZE))) AND 2) NEQ 0 ; 4529 3 THEN ! [108] ; 4530 4 BEGIN ! [108] ; 4531 4 ! [108] ; 4532 4 SEND%PKT%SIZE = 500; ! [108] ; 4533 4 ! [108] ; 4534 4 WHILE (.REC%LENGTH GTR .CAPAS%OFFSET-.RECV%PKT%MSG) AND ! [108] ; P 4535 6 ((UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, .CAPAS%OFFSET, ! [108] ; 4536 4 CHR%SIZE))) AND 1) EQL 1) DO ! [108] ; 4537 5 BEGIN ! [108] ; 4538 5 CAPAS%OFFSET = .CAPAS%OFFSET + 1; ! [108] ; 4539 4 END; ! [108] ; 4540 4 IF .REC%LENGTH GTR .CAPAS%OFFSET-.RECV%PKT%MSG+3 ! [108] ; 4541 4 THEN ! [108] ; P 4542 4 SEND%PKT%SIZE = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, ! [108] ; 4543 4 .CAPAS%OFFSET+2, CHR%SIZE))) * 95 + ; P 4544 4 UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, ! [108] ; 4545 4 .CAPAS%OFFSET+3, CHR%SIZE))); ! [108] ; 4546 4 IF .SEND%PKT%SIZE GTR MAX%MSG - 2 ! [108] ; 4547 4 THEN ! [108] ; 4548 4 SEND%PKT%SIZE = MAX%MSG - 2; ! [108] ; 4549 4 IF .SEND%PKT%SIZE GTR ABS(.SND%PKT%SIZE) ! [108] ; 4550 4 THEN ! [108] ; 4551 4 SEND%PKT%SIZE = ABS(.SND%PKT%SIZE); ! [108] ; 4552 3 END; ! [108] ; 4553 2 END; ! [108] ; 4554 2 ! ; 4555 2 ! Check for a valid quoting character. If it is not valid, then we have ; 4556 2 ! a protocol error ; 4557 2 ! ; 4558 2 ; 4559 3 IF NOT ((.SEND%QUOTE%CHR GEQ %O'41' AND .SEND%QUOTE%CHR LEQ %O'76') OR ; 4560 4 (.SEND%QUOTE%CHR GEQ %O ; 4561 3 '140' AND .SEND%QUOTE%CHR LEQ %O'176')) ; 4562 2 THEN ; 4563 3 BEGIN ; 4564 3 KRM%ERROR (KER%PROTOERR); ; 4565 3 RETURN KER%PROTOERR; ; 4566 2 END; ; 4567 2 ; 4568 2 ! ; 4569 2 ! Check for a valid 8 bit quoting and set the 8 bit quoting flag as needed ; 4570 2 ! ; 4571 2 ; 4572 4 IF ( NOT ((.SEND%8QUOTE%CHR GEQ %O'041' AND .SEND%8QUOTE%CHR LEQ %O'076') OR ; 4573 5 (.SEND%8QUOTE%CHR ; 4574 5 GEQ %O'140' AND .SEND%8QUOTE%CHR LEQ %O'176') OR (.SEND%8QUOTE%CHR EQL %C'N') ; 4575 5 OR ( ; 4576 2 .SEND%8QUOTE%CHR EQL %C'Y'))) OR .SEND%8QUOTE%CHR EQL .SEND%QUOTE%CHR OR ; 4577 2 .SEND%8QUOTE%CHR ; 4578 2 EQL .RCV%QUOTE%CHR ; 4579 2 THEN ; 4580 3 BEGIN ; 4581 3 KRM%ERROR (KER%PROTOERR); ; 4582 3 RETURN KER%PROTOERR; ; 4583 2 END; ; 4584 2 ; 4585 2 IF .SEND%8QUOTE%CHR EQL %C'Y' THEN SEND%8QUOTE%CHR = .RECV%8QUOTE%CHR; ; 4586 2 ; 4587 2 IF .SEND%8QUOTE%CHR NEQ %C'N' AND .SEND%8QUOTE%CHR NEQ %C'Y' ; 4588 2 THEN ; 4589 2 FLAG%8QUOTE = TRUE ; 4590 2 ELSE ; 4591 2 FLAG%8QUOTE = FALSE; ; 4592 2 ; 4593 2 ! ; 4594 2 ! Check the repeat character and set flags ; 4595 2 ! ; 4596 2 ; 4597 5 IF ( NOT ((.REPT%CHR GEQ %O'41' AND .REPT%CHR LEQ %O'76') OR (.REPT%CHR GEQ ; 4598 5 %O'140' AND ; 4599 3 .REPT%CHR LEQ %O'176')) OR .REPT%CHR EQL .SEND%QUOTE%CHR OR .REPT%CHR EQL ; 4600 3 .SEND%8QUOTE%CHR ; 4601 2 OR .REPT%CHR EQL .RCV%QUOTE%CHR) AND .REPT%CHR NEQ %C' ' ; 4602 2 THEN ; 4603 3 BEGIN ; 4604 3 KRM%ERROR (KER%PROTOERR); ; 4605 3 RETURN KER%PROTOERR; ; 4606 2 END; ; 4607 2 ; 4608 2 IF .REPT%CHR NEQ %C' ' THEN FLAG%REPEAT = TRUE ELSE FLAG%REPEAT = FALSE; ; 4609 2 ; 4610 2 RETURN KER%NORMAL; ; 4611 1 END; ! End of PRS%SEND%INIT ; PRS%SEND%INIT U.21: MOVE AC4,SND%PKT%SIZE ; 4377 JUMPL AC4,L.263 CAIG AC4,136 ; 4378 JRST L.262 MOVEI AC1,136 JRST L.265 L.262: MOVE AC1,AC4 JRST L.265 ; 4377 L.263: SKIPG U.57 ; 4381 JRST L.264 MOVE AC2,C.27 ; 4384 MOVE AC1,U.39 ADJBP AC1,AC2 ILDB AC1,AC1 SUBI AC1,40 JRST L.265 ; 4379 L.264: MOVM AC1,AC4 ; 4386 L.265: MOVEM AC1,U.40 ; 4377 MOVE AC1,SND%TIMEOUT ; 4393 JUMPGE AC1,L.267 MOVEI AC2,1 ; 4396 CAML AC2,U.57 JRST L.266 MOVE AC1,U.39 ; 4399 ADDI AC1,1 MOVE AC2,C.27 ADJBP AC1,AC2 ILDB AC1,AC1 SUBI AC1,40 JRST L.267 ; 4394 L.266: MOVM AC1,AC1 ; 4401 L.267: MOVEM AC1,SEND%TIMEOUT ; 4393 MOVE AC1,SND%NPAD ; 4408 JUMPGE AC1,L.269 MOVEI AC2,2 ; 4411 CAML AC2,U.57 JRST L.268 MOVE AC1,U.39 ; 4414 ADDI AC1,2 MOVE AC2,C.27 ADJBP AC1,AC2 ILDB AC1,AC1 SUBI AC1,40 JRST L.269 ; 4409 L.268: MOVM AC1,AC1 ; 4416 L.269: MOVEM AC1,U.41 ; 4408 MOVE AC1,SND%PADCHAR ; 4423 JUMPGE AC1,L.271 MOVEI AC2,3 ; 4426 CAML AC2,U.57 JRST L.270 MOVE AC1,U.39 ; 4429 ADDI AC1,3 MOVE AC2,C.27 ADJBP AC1,AC2 ILDB AC1,AC1 TRCA AC1,100 L.270: MOVM AC1,AC1 ; 4431 L.271: MOVEM AC1,U.42 ; 4423 MOVE AC1,SND%EOL ; 4438 JUMPGE AC1,L.273 MOVEI AC2,4 ; 4441 CAML AC2,U.57 JRST L.272 MOVE AC1,U.39 ; 4444 ADDI AC1,4 MOVE AC2,C.27 ADJBP AC1,AC2 ILDB AC1,AC1 SUBI AC1,40 JRST L.273 ; 4439 L.272: MOVM AC1,AC1 ; 4446 L.273: MOVEM AC1,U.43 ; 4438 MOVE AC1,SND%QUOTE%CHR ; 4453 JUMPGE AC1,L.275 MOVEI AC2,5 ; 4456 CAML AC2,U.57 JRST L.274 MOVE AC1,U.39 ; 4458 ADDI AC1,5 MOVE AC2,C.27 ADJBP AC1,AC2 ILDB AC1,AC1 JRST L.275 ; 4454 L.274: MOVM AC1,AC1 ; 4461 L.275: MOVEM AC1,U.44 ; 4453 MOVE AC3,U.57 ; 4471 CAIG AC3,6 JRST L.276 MOVE AC1,U.39 ; 4473 ADDI AC1,6 MOVE AC2,C.27 ADJBP AC1,AC2 ILDB AC1,AC1 JRST L.277 ; 4471 L.276: MOVEI AC1,116 L.277: MOVEM AC1,U.45 CAIG AC3,7 ; 4479 JRST L.280 MOVE AC1,U.39 ; 4486 ADDI AC1,7 MOVE AC2,C.27 ADJBP AC1,AC2 ILDB AC1,AC1 MOVEI AC2,131 ; 4489 CAMN AC2,U.58 JRST L.278 CAIL AC1,61 ; 4492 CAILE AC1,63 JRST L.279 JRST L.281 L.278: CAMN AC1,CHKTYPE ; 4500 JRST L.281 L.279: MOVEI AC2,61 ; 4502 MOVEM AC2,U.47 JRST L.282 ; 4500 L.280: MOVEI AC1,61 ; 4508 L.281: MOVEM AC1,U.47 L.282: CAIG AC3,10 ; 4513 JRST L.283 MOVE AC1,U.39 ; 4514 ADDI AC1,10 MOVE AC2,C.27 ADJBP AC1,AC2 ILDB AC1,AC1 JRST L.284 ; 4513 L.283: MOVEI AC1,40 L.284: MOVEM AC1,U.38 CAIG AC3,11 ; 4519 JRST L.289 MOVM AC1,AC4 CAIG AC1,136 JRST L.289 MOVE AC1,U.39 ; 4526 ADDI AC1,11 MOVE AC5,C.27 ; 4528 MOVE AC2,AC1 ADJBP AC2,AC5 ILDB AC2,AC2 SUBI AC2,40 TRNN AC2,2 JRST L.289 MOVEI AC2,764 ; 4532 MOVEM AC2,U.40 L.285: MOVE AC2,AC1 ; 4534 SUB AC2,U.39 CAMG AC3,AC2 JRST L.286 MOVE AC5,C.27 ; 4536 MOVE AC2,AC1 ADJBP AC2,AC5 ILDB AC2,AC2 SUBI AC2,40 TRNE AC2,1 ; 4535 AOJA AC1,L.285 ; 4534 L.286: MOVE AC2,AC1 ; 4540 SUB AC2,U.39 ADDI AC2,3 CAMG AC3,AC2 JRST L.287 MOVE AC2,AC1 ; 4543 ADDI AC2,2 MOVE AC3,C.27 ADJBP AC2,AC3 ILDB AC2,AC2 IMULI AC2,137 ADDI AC1,3 ; 4545 MOVE AC3,C.27 ADJBP AC1,AC3 ILDB AC1,AC1 ADD AC2,AC1 ; 4543 SUBI AC2,6000 MOVEM AC2,U.40 L.287: MOVEI AC1,1750 ; 4546 CAML AC1,U.40 JRST L.288 MOVEI AC1,1750 ; 4548 MOVEM AC1,U.40 L.288: MOVM AC1,AC4 ; 4549 CAMGE AC1,U.40 MOVEM AC1,U.40 ; 4551 L.289: MOVE AC1,U.44 ; 4559 CAIGE AC1,41 JRST L.290 CAIG AC1,76 JRST L.291 L.290: CAIL AC1,140 ; 4560 CAILE AC1,176 ; 4561 JRST L.301 ; 4563 L.291: MOVE AC1,U.45 ; 4572 CAIGE AC1,41 JRST L.292 CAIG AC1,76 JRST L.294 L.292: CAIGE AC1,140 ; 4574 JRST L.293 CAIG AC1,176 JRST L.294 L.293: CAIN AC1,116 JRST L.294 CAIE AC1,131 ; 4575 JRST L.301 L.294: CAME AC1,U.44 ; 4576 CAMN AC1,RCV%QUOTE%CHR ; 4578 JRST L.301 ; 4580 MOVEI AC1,131 ; 4585 CAME AC1,U.45 JRST L.295 MOVE AC1,U.37 MOVEM AC1,U.45 L.295: MOVE AC2,U.45 ; 4587 CAIE AC2,116 CAIN AC2,131 JRST L.296 MOVEI AC1,1 ; 4589 MOVEM AC1,U.49 JRST L.297 ; 4587 L.296: SETZM U.49 ; 4591 L.297: MOVE AC1,U.38 ; 4597 CAIGE AC1,41 JRST L.298 CAIG AC1,76 JRST L.299 L.298: CAIL AC1,140 CAILE AC1,176 ; 4599 JRST L.300 L.299: CAME AC1,U.44 CAMN AC1,AC2 JRST L.300 CAME AC1,RCV%QUOTE%CHR ; 4601 JRST L.302 L.300: CAIN AC1,40 JRST L.302 L.301: PUSH SP,C.21 ; 4604 PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 4605 MOVEI AC1,252 ; 4603 POPJ SP, L.302: MOVEI AC1,40 ; 4608 CAMN AC1,U.38 JRST L.303 MOVEI AC1,1 MOVEM AC1,U.50 JRST L.304 L.303: SETZM U.50 L.304: MOVEI AC1,13 ; 4365 POPJ SP, ; 4327 ; Routine Size: 247 words ; 4612 1 %SBTTL 'SET%SEND%INIT' ; 4613 1 ROUTINE SET%SEND%INIT : NOVALUE = ; 4614 1 ; 4615 1 !++ ; 4616 1 ! FUNCTIONAL DESCRIPTION: ; 4617 1 ! ; 4618 1 ! This routine will initialize the various parameters for the ; 4619 1 ! MSG%SND%INIT message. ; 4620 1 ! ; 4621 1 ! CALLING SEQUENCE: ; 4622 1 ! ; 4623 1 ! SET%SEND%INIT(); ; 4624 1 ! ; 4625 1 ! INPUT PARAMETERS: ; 4626 1 ! ; 4627 1 ! None. ; 4628 1 ! ; 4629 1 ! IMPLICIT INPUTS: ; 4630 1 ! ; 4631 1 ! None. ; 4632 1 ! ; 4633 1 ! OUTPUT PARAMETERS: ; 4634 1 ! ; 4635 1 ! None. ; 4636 1 ! ; 4637 1 ! IMPLICIT OUTPUTS: ; 4638 1 ! ; 4639 1 ! SND%MSG parameters set up. ; 4640 1 ! ; 4641 1 ! COMPLETION CODES: ; 4642 1 ! ; 4643 1 ! None. ; 4644 1 ! ; 4645 1 ! SIDE EFFECTS: ; 4646 1 ! ; 4647 1 ! None. ; 4648 1 ! ; 4649 1 !-- ; 4650 1 ; 4651 2 BEGIN ; 4652 2 CH$WCHAR (CHAR ((IF .RCV%PKT%SIZE LSS 94 THEN .RCV%PKT%SIZE ELSE 94)), ; 4653 2 CH$PTR (SND%MSG, PKT%MSG + P%SI%BUFSIZ, CHR%SIZE)); ! [108] ; 4654 2 CH$WCHAR (CHAR (.RCV%TIMEOUT), CH$PTR (SND%MSG, PKT%MSG + P%SI%TIMOUT, ; 4655 2 CHR%SIZE)); ; 4656 2 CH$WCHAR (CHAR (.RCV%NPAD), CH$PTR (SND%MSG, PKT%MSG + P%SI%NPAD, ; 4657 2 CHR%SIZE)); ; 4658 2 CH$WCHAR (CTL (.RCV%PADCHAR), CH$PTR (SND%MSG, PKT%MSG + P%SI%PAD, ; 4659 2 CHR%SIZE)); ; 4660 2 CH$WCHAR (CHAR (.RCV%EOL), CH$PTR (SND%MSG, PKT%MSG + P%SI%EOL, CHR%SIZE)); ; 4661 2 CH$WCHAR (.RCV%QUOTE%CHR, CH$PTR (SND%MSG, PKT%MSG + P%SI%QUOTE, CHR%SIZE)); ; 4662 2 CH$WCHAR (.SEND%8QUOTE%CHR, CH$PTR (SND%MSG, PKT%MSG + P%SI%8QUOTE, ; 4663 2 CHR%SIZE)); ; 4664 2 CH$WCHAR (.INI%CHK%TYPE, CH$PTR (SND%MSG, PKT%MSG + P%SI%CHKTYPE, ; 4665 2 CHR%SIZE)); ; 4666 2 CH$WCHAR (.REPT%CHR, CH$PTR (SND%MSG, PKT%MSG + P%SI%REPEAT, CHR%SIZE)); ; 4667 2 SEND%INIT%SIZE = P%SI%LENGTH; ! [108] ; 4668 2 IF .RCV%PKT%SIZE GTR 94 ! [108] ; 4669 2 THEN ! [108] ; 4670 3 BEGIN ! [108] ; 4671 3 CH$WCHAR (CHAR (EXTLEN%CAPAS), CH$PTR (SND%MSG, PKT%MSG + P%SI%CAPAS, ; 4672 3 CHR%SIZE)); ; 4673 3 CH$WCHAR (CHAR (0), CH$PTR (SND%MSG, PKT%MSG + P%SI%WINDO, CHR%SIZE)); ; 4674 3 CH$WCHAR (CHAR (.RCV%PKT%SIZE/95), CH$PTR (SND%MSG, PKT%MSG + P%SI%MAXLX1, ; 4675 3 CHR%SIZE)); ; 4676 3 CH$WCHAR (CHAR (.RCV%PKT%SIZE MOD 95), CH$PTR (SND%MSG, PKT%MSG + P%SI%MAXLX2, ; 4677 3 CHR%SIZE)); ; 4678 3 ! [108] ; 4679 3 SEND%INIT%SIZE = P%SI%XLENGTH; ! [108] ; 4680 2 END; ! [108] ; 4681 2 ; 4682 1 END; ! End of SET%SEND%INIT ; SET%SEND%INIT U.20: MOVE AC3,RCV%PKT%SIZE ; 4652 CAIGE AC3,136 SKIPA AC1,AC3 MOVEI AC1,136 ADDI AC1,40 MOVE AC2,C.32 ; 4653 IDPB AC1,AC2 ; 4652 MOVE AC2,RCV%TIMEOUT ; 4654 ADDI AC2,40 MOVE AC1,C.64 IDPB AC2,AC1 MOVE AC2,RCV%NPAD ; 4656 ADDI AC2,40 MOVE AC1,C.65 IDPB AC2,AC1 MOVE AC2,RCV%PADCHAR ; 4658 TRC AC2,100 MOVE AC1,C.66 IDPB AC2,AC1 MOVE AC2,RCV%EOL ; 4660 ADDI AC2,40 MOVE AC1,C.67 IDPB AC2,AC1 MOVE AC2,RCV%QUOTE%CHR ; 4661 MOVE AC1,C.68 IDPB AC2,AC1 MOVE AC2,U.45 ; 4662 MOVE AC1,C.69 IDPB AC2,AC1 MOVE AC2,U.47 ; 4664 MOVE AC1,C.70 IDPB AC2,AC1 MOVE AC2,U.38 ; 4666 MOVE AC1,C.71 IDPB AC2,AC1 MOVEI AC1,11 ; 4667 MOVEM AC1,U.46 CAIG AC3,136 ; 4668 POPJ SP, MOVEI AC2,42 ; 4671 MOVE AC1,C.72 IDPB AC2,AC1 MOVEI AC2,40 ; 4673 MOVE AC1,C.73 IDPB AC2,AC1 MOVE AC1,AC3 ; 4674 IDIVI AC1,137 ADDI AC1,40 MOVE AC2,C.74 IDPB AC1,AC2 MOVE AC1,AC3 ; 4676 IDIVI AC1,137 ADDI AC2,40 MOVE AC1,C.75 IDPB AC2,AC1 MOVEI AC1,15 ; 4679 MOVEM AC1,U.46 POPJ SP, ; 4613 C.64: POINT 8,U.60+1,7 C.65: POINT 8,U.60+1,15 C.66: POINT 8,U.60+1,23 C.67: POINT 8,U.60+1,31 C.68: POINT 8,U.60+2,7 C.69: POINT 8,U.60+2,15 C.70: POINT 8,U.60+2,23 C.71: POINT 8,U.60+2,31 C.72: POINT 8,U.60+3,7 C.73: POINT 8,U.60+3,15 C.74: POINT 8,U.60+3,23 C.75: POINT 8,U.60+3,31 ; Routine Size: 70 words ; 4683 1 %SBTTL 'SEND%PACKET' ; 4684 1 ROUTINE SEND%PACKET (TYPE, LENGTH, MN) = ; 4685 1 ; 4686 1 !++ ; 4687 1 ! FUNCTIONAL DESCRIPTION: ; 4688 1 ! ; 4689 1 ! This routine will cause a packet to be sent over the line ; 4690 1 ! that has been opened by OPEN%TERMINAL. ; 4691 1 ! ; 4692 1 ! CALLING SEQUENCE: ; 4693 1 ! ; 4694 1 ! SEND%PACKET(Type, Length); ; 4695 1 ! ; 4696 1 ! INPUT PARAMETERS: ; 4697 1 ! ; 4698 1 ! TYPE - Type of packet to send. ; 4699 1 ! ; 4700 1 ! LENGTH - Length of the packet being sent. ; 4701 1 ! [108] Negative length means it's an extended length packet ; 4702 1 ! ; 4703 1 ! IMPLICIT INPUTS: ; 4704 1 ! ; 4705 1 ! None. ; 4706 1 ! ; 4707 1 ! OUTPUT PARAMETERS: ; 4708 1 ! ; 4709 1 ! None. ; 4710 1 ! ; 4711 1 ! IMPLICIT OUTPUTS: ; 4712 1 ! ; 4713 1 ! None. ; 4714 1 ! ; 4715 1 ! COMPLETION CODES: ; 4716 1 ! ; 4717 1 ! None. ; 4718 1 ! ; 4719 1 ! SIDE EFFECTS: ; 4720 1 ! ; 4721 1 ! None. ; 4722 1 ! ; 4723 1 !-- ; 4724 1 ; 4725 2 BEGIN ; 4726 2 ; 4727 2 LOCAL ; 4728 2 FILLER : VECTOR [CH$ALLOCATION (MAX%MSG, CHR%SIZE)], ; 4729 2 TOT%MSG%LEN, ! Length of message including all characters ; 4730 2 CHKSUM, ! Checksum for the message we calculate ; 4731 2 POINTER; ! Pointer to the information in the message ; 4732 2 ; 4733 2 ! ; 4734 2 ! Do any filler processing that the remote KERMIT requires. ; 4735 2 ! ; 4736 2 ; 4737 2 IF .SEND%NPAD NEQ 0 ; 4738 2 THEN ; 4739 3 BEGIN ; 4740 3 CH$FILL (.SEND%PADCHAR, MAX%MSG, CH$PTR (FILLER, 0, CHR%SIZE)); ; 4741 3 ! ; 4742 3 ! Update the send stats ; 4743 3 ! ; 4744 3 SMSG%TOTAL%CHARS = .SMSG%TOTAL%CHARS + .SEND%NPAD; ; 4745 3 ! ; 4746 3 ! Send the fill ; 4747 3 ! ; 4748 3 DO%PARITY (FILLER, .SEND%NPAD + PKT%TOT%OVR%HEAD); ; 4749 3 SEND (FILLER, .SEND%NPAD + PKT%TOT%OVR%HEAD); ; 4750 2 END; ; 4751 2 ; 4752 2 ! ; 4753 2 ! Store the header information into the message. ; 4754 2 ! ; 4755 2 CH$WCHAR (.TYPE, CH$PTR (SND%MSG, PKT%TYPE, CHR%SIZE)); ; 4756 2 CH$WCHAR (.SND%SOH, CH$PTR (SND%MSG, PKT%MARK, CHR%SIZE)); ; 4757 2 CH$WCHAR (CHAR (IF .MN LSS 0 THEN 0 ELSE .MN), CH$PTR (SND%MSG, PKT%SEQ, ; 4758 2 CHR%SIZE)); ; 4759 2 ; 4760 2 IF .LENGTH LSS 0 ! [108] ; 4761 2 THEN ! [108] ; 4762 3 BEGIN ! [108] ; 4763 3 TOT%MSG%LEN = PKT%OVR%HEAD + 3 - .LENGTH; ! [108] ; 4764 3 CH$WCHAR (CHAR (0), CH$PTR (SND%MSG, PKT%COUNT, CHR%SIZE)); ! [108] ; P 4765 3 CH$WCHAR (CHAR ((.TOT%MSG%LEN - PKT%HCHECK + 1 + ! [108] ; 4766 3 (.BLK%CHK%TYPE - CHK%1CHAR)) / 95), ! [108] ; 4767 3 CH$PTR (SND%MSG, PKT%COUNTX1, CHR%SIZE)); ! [108] ; P 4768 3 CH$WCHAR (CHAR ((.TOT%MSG%LEN - PKT%HCHECK + 1 + ! [108] ; 4769 3 (.BLK%CHK%TYPE - CHK%1CHAR)) MOD 95), ! [108] ; 4770 3 CH$PTR (SND%MSG, PKT%COUNTX2, CHR%SIZE)); ! [108] ; 4771 3 ; 4772 3 POINTER = CH$PTR(SND%MSG, PKT%SEQ, CHR%SIZE); ! [108] ; 4773 3 CHKSUM = CHAR (0) + CH$RCHAR%A (POINTER); ! [108] ; 4774 3 CHKSUM = .CHKSUM + CH$RCHAR%A (POINTER); ! [108] ; 4775 3 CHKSUM = .CHKSUM + CH$RCHAR%A (POINTER); ! [108] ; 4776 3 CHKSUM = .CHKSUM + CH$RCHAR%A (POINTER); ! [108] ; 4777 3 ; 4778 3 CH$WCHAR (CHAR ((.CHKSUM + ((.CHKSUM AND %O'300')/%O'100')) AND %O'77'), ; 4779 3 CH$PTR (SND%MSG, PKT%HCHECK, CHR%SIZE)); ! [108] ; 4780 3 END ! [108] ; 4781 2 ELSE ! [108] ; 4782 3 BEGIN ! [108] ; 4783 3 TOT%MSG%LEN = PKT%OVR%HEAD + .LENGTH; ! [108] ; 4784 3 CH$WCHAR (CHAR (.TOT%MSG%LEN + (.BLK%CHK%TYPE - CHK%1CHAR)), ! [108] ; 4785 3 CH$PTR (SND%MSG, PKT%COUNT, CHR%SIZE)); ; 4786 2 END; ! [108] ; 4787 2 ; 4788 2 ! ; 4789 2 ! Calculate the block check value ; 4790 2 ! ; 4791 2 POINTER = CH$PTR (SND%MSG, PKT%MARK + 1, CHR%SIZE); ; 4792 2 CHKSUM = CALC%BLOCK%CHECK (.POINTER, .TOT%MSG%LEN); ! [108] ; 4793 2 ! ; 4794 2 ! Store the checksum into the message ; 4795 2 ! ; 4796 2 POINTER = CH$PTR (SND%MSG, .TOT%MSG%LEN + 1, CHR%SIZE); ! [108] ; 4797 2 ; 4798 2 CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF ; 4799 2 SET ; 4800 2 ; 4801 2 [CHK%1CHAR] : ; 4802 2 CH$WCHAR%A (CHAR (.CHKSUM), POINTER); ; 4803 2 ; 4804 2 [CHK%2CHAR] : ; 4805 3 BEGIN ; 4806 3 CH$WCHAR%A (CHAR (.CHKSUM<6, 6>), POINTER); ; 4807 3 CH$WCHAR%A (CHAR (.CHKSUM<0, 6>), POINTER); ; 4808 3 TOT%MSG%LEN = .TOT%MSG%LEN + 1; ; 4809 2 END; ; 4810 2 ; 4811 2 [CHK%CRC] : ; 4812 3 BEGIN ; 4813 3 CH$WCHAR%A (CHAR (.CHKSUM<12, 4>), POINTER); ; 4814 3 CH$WCHAR%A (CHAR (.CHKSUM<6, 6>), POINTER); ; 4815 3 CH$WCHAR%A (CHAR (.CHKSUM<0, 6>), POINTER); ; 4816 3 TOT%MSG%LEN = .TOT%MSG%LEN + 2; ; 4817 2 END; ; 4818 2 TES; ; 4819 2 ; 4820 2 ! ; 4821 2 ! Store in the end of line character ; 4822 2 ! ; 4823 2 CH$WCHAR%A (.SEND%EOL, POINTER); ; 4824 2 ! ; 4825 2 ! If we are debugging then type out the message we are sending. ; 4826 2 ! ; 4827 2 DBG%SEND (SND%MSG, (.TOT%MSG%LEN + PKT%TOT%OVR%HEAD - PKT%OVR%HEAD)); ; 4828 2 ! ; 4829 2 ! Update the stats for total characters and the data characters ; 4830 2 ! ; 4831 2 SMSG%TOTAL%CHARS = .SMSG%TOTAL%CHARS + .TOT%MSG%LEN + PKT%TOT%OVR%HEAD - ; 4832 2 PKT%OVR%HEAD; ; 4833 2 ! Make data characters really be that, not just characters in data field ; 4834 2 ! SMSG%DATA%CHARS = .SMSG%DATA%CHARS + .LENGTH; ; 4835 2 ; 4836 2 IF .TYPE EQL MSG%NAK ; 4837 2 THEN ; 4838 3 BEGIN ; 4839 3 SMSG%NAKS = .SMSG%NAKS + 1; ; 4840 3 XFR%STATUS (%C'S', %C'N'); ; 4841 3 END ; 4842 2 ELSE ; 4843 3 BEGIN ; 4844 3 SMSG%COUNT = .SMSG%COUNT + 1; ; 4845 3 XFR%STATUS (%C'S', %C'P'); ; 4846 2 END; ; 4847 2 ; 4848 2 ! ; 4849 2 ! Check if we are in IBM mode and need to wait for an XON first ; 4850 2 ! We will not wait if this is a packet which might be going out ; 4851 2 ! without previous traffic (generic commands, init packets). ; 4852 2 ; 4853 3 IF (.IBM%CHAR GEQ 0) ! If handshaking on ; 4854 2 THEN ; 4855 2 IF NOT IBM%WAIT () THEN RETURN KER%ABORTED; ; 4856 2 ; 4857 2 ! ; 4858 2 ! Now call the O/S routine to send the message out to the remote KERMIT ; 4859 2 ! ; 4860 2 DO%PARITY (SND%MSG, .TOT%MSG%LEN + PKT%TOT%OVR%HEAD - PKT%OVR%HEAD); ; 4861 2 RETURN SEND (SND%MSG, .TOT%MSG%LEN + PKT%TOT%OVR%HEAD - PKT%OVR%HEAD); ; 4862 1 END; ! End of SEND%PACKET ; SEND%PACKET U.24: PUSH SP,AC14 ; 4684 PUSH SP,AC16 ADJSP SP,375 MOVE AC3,U.41 ; 4737 JUMPE AC3,L.305 MOVEI AC5,-375(SP) ; 4740 HRLI AC5,41000 SETZB AC1,AC2 MOVEI AC4,1752 MOVEI AC14,-2(SP) PUSH AC14,C.9 PUSH AC14,U.42 EXTEND AC1,-1(SP) JFCL ADDM AC3,SMSG%TOTAL%CHARS ; 4744 MOVEI AC1,-374(SP) ; 4748 PUSH SP,AC1 ADDI AC3,6 PUSH SP,AC3 PUSHJ SP,U.22 MOVEI AC1,-376(SP) ; 4749 PUSH SP,AC1 MOVE AC1,U.41 ADDI AC1,6 PUSH SP,AC1 PUSHJ SP,SEND ADJSP SP,-4 ; 4739 L.305: MOVE AC2,-402(SP) ; 4755 MOVE AC1,C.80 IDPB AC2,AC1 MOVE AC2,SND%SOH ; 4756 MOVE AC1,C.81 IDPB AC2,AC1 SKIPGE AC1,-400(SP) ; 4757 SETZ AC1, ADDI AC1,40 MOVE AC2,C.82 IDPB AC1,AC2 MOVE AC3,U.48 ; 4766 SUBI AC3,61 MOVE AC16,-401(SP) ; 4760 JUMPGE AC16,L.306 MOVEI AC14,6 ; 4763 SUB AC14,AC16 MOVEI AC2,40 ; 4764 MOVE AC1,C.83 IDPB AC2,AC1 MOVE AC16,AC14 ; 4766 ADD AC16,AC3 SUBI AC16,5 MOVE AC1,AC16 IDIVI AC1,137 ADDI AC1,40 MOVE AC2,C.32 ; 4767 IDPB AC1,AC2 ; 4766 MOVE AC1,AC16 ; 4769 IDIVI AC1,137 ADDI AC2,40 MOVE AC1,C.64 ; 4770 IDPB AC2,AC1 ; 4769 MOVE AC16,C.82 ; 4772 ILDB AC1,AC16 ; 4773 MOVE AC3,AC1 ADDI AC3,40 ILDB AC1,AC16 ; 4774 ADD AC3,AC1 ILDB AC1,AC16 ; 4775 ADD AC3,AC1 ILDB AC1,AC16 ; 4776 ADD AC3,AC1 MOVE AC1,AC3 ; 4778 ANDI AC1,300 IDIVI AC1,100 ADD AC1,AC3 LDB AC2,C.18 ADDI AC2,40 MOVE AC1,C.65 ; 4779 IDPB AC2,AC1 ; 4778 JRST L.307 ; 4760 L.306: MOVE AC14,AC16 ; 4783 ADDI AC14,3 MOVE AC16,AC14 ; 4784 ADD AC16,AC3 ADDI AC16,40 MOVE AC1,C.83 ; 4785 IDPB AC16,AC1 ; 4784 L.307: MOVE AC16,C.83 ; 4791 PUSH SP,AC16 ; 4792 PUSH SP,AC14 PUSHJ SP,U.19 MOVE AC3,AC1 MOVE AC1,AC14 ; 4796 ADDI AC1,1 MOVE AC2,C.76 ADJBP AC1,AC2 MOVE AC16,AC1 MOVE AC1,U.48 ; 4798 SUBI AC1,61 JRST L.308(AC1) L.308: JRST L.309 JRST L.310 JRST L.311 L.309: MOVE AC1,AC3 ; 4802 ADDI AC1,40 IDPB AC1,AC16 JRST L.312 ; 4798 L.310: LDB AC1,C.77 ; 4806 ADDI AC1,40 IDPB AC1,AC16 LDB AC1,C.78 ; 4807 ADDI AC1,40 IDPB AC1,AC16 AOJA AC14,L.312 ; 4798 L.311: LDB AC1,C.79 ; 4813 ADDI AC1,40 IDPB AC1,AC16 LDB AC1,C.77 ; 4814 ADDI AC1,40 IDPB AC1,AC16 LDB AC1,C.78 ; 4815 ADDI AC1,40 IDPB AC1,AC16 ADDI AC14,2 ; 4816 L.312: MOVE AC1,U.43 ; 4823 IDPB AC1,AC16 PUSH SP,C.84 ; 4827 MOVE AC16,AC14 ADDI AC16,3 PUSH SP,AC16 PUSHJ SP,U.35 MOVE AC1,SMSG%TOTAL%CHARS ; 4831 ADD AC1,AC14 ADDI AC1,3 MOVEM AC1,SMSG%TOTAL%CHARS MOVEI AC1,116 ; 4836 CAME AC1,-406(SP) JRST L.313 AOS SMSG%NAKS ; 4839 PUSH SP,C.8 ; 4840 PUSH SP,C.24 JRST L.314 L.313: AOS SMSG%COUNT ; 4844 PUSH SP,C.8 ; 4845 PUSH SP,C.85 L.314: PUSHJ SP,XFR%STATUS SKIPGE IBM%CHAR ; 4853 JRST L.315 PUSHJ SP,IBM%WAIT ; 4855 TRNE AC1,1 JRST L.315 ADJSP SP,-6 MOVEI AC1,312 JRST L.316 L.315: PUSH SP,C.84 ; 4860 PUSH SP,AC16 PUSHJ SP,U.22 PUSH SP,C.84 ; 4861 PUSH SP,AC16 PUSHJ SP,SEND ADJSP SP,-12 L.316: ADJSP SP,-375 ; 4684 POP SP,AC16 POP SP,AC14 POPJ SP, C.76: POINT 8,U.60,-1 C.77: POINT 6,AC3,29 C.78: POINT 6,AC3,35 C.79: POINT 4,AC3,23 C.80: POINT 8,U.60,23 C.81: POINT 8,U.60-1,31 C.82: POINT 8,U.60,15 C.83: POINT 8,U.60,7 C.84: XWD 0,U.60 C.85: EXP 120 ; Routine Size: 174 words ; 4863 1 %SBTTL 'REC%MESSAGE - Receive a message' ; 4864 1 ROUTINE REC%MESSAGE (CHK%ROUTINE) = ; 4865 1 ; 4866 1 !++ ; 4867 1 ! FUNCTIONAL DESCRIPTION: ; 4868 1 ! ; 4869 1 ! This routine will handle the retry processing for the various ; 4870 1 ! messages that can be received. ; 4871 1 ! ; 4872 1 ! CALLING SEQUENCE: ; 4873 1 ! ; 4874 1 ! INPUT PARAMETERS: ; 4875 1 ! ; 4876 1 ! None. ; 4877 1 ! ; 4878 1 ! IMPLICIT INPUTS: ; 4879 1 ! ; 4880 1 ! None. ; 4881 1 ! ; 4882 1 ! OUTPUT PARAMETERS: ; 4883 1 ! ; 4884 1 ! None. ; 4885 1 ! ; 4886 1 ! IMPLICIT OUTPUTS: ; 4887 1 ! ; 4888 1 ! None. ; 4889 1 ! ; 4890 1 ! COMPLETION CODES: ; 4891 1 ! ; 4892 1 ! KER%NORMAL - Normal return ; 4893 1 ! KER%RETRIES - Too many retries ; 4894 1 ! (What ever REC%PACKET returns). ; 4895 1 ! ; 4896 1 ! SIDE EFFECTS: ; 4897 1 ! ; 4898 1 ! None. ; 4899 1 ! ; 4900 1 !-- ; 4901 1 ; 4902 2 BEGIN ; 4903 2 ; 4904 2 LOCAL ; 4905 2 STATUS; ! Status returned by various routines ; 4906 2 ; 4907 2 RETURN ; 4908 2 ; 4909 2 WHILE TRUE DO ; 4910 3 BEGIN ; 4911 3 ; 4912 3 IF .NUM%RETRIES GTR .PKT%RETRIES ; 4913 3 THEN ; 4914 4 BEGIN ; 4915 4 KRM%ERROR (KER%RETRIES); ! Report the error ; 4916 4 RETURN KER%RETRIES; ; 4917 3 END; ; 4918 3 ; 4919 3 NUM%RETRIES = .NUM%RETRIES + 1; ; 4920 3 STATUS = REC%PACKET (); ; 4921 3 ![043] Don't abort on errors which might just be due to noise. ; 4922 3 ; 4923 3 IF NOT .STATUS AND .STATUS NEQ KER%CHKSUMERR AND .STATUS NEQ KER%TIMEOUT ; 4924 3 AND .STATUS NEQ ; 4925 3 KER%ZEROLENMSG ; 4926 3 THEN ; 4927 3 RETURN .STATUS; ; 4928 3 ; 4929 3 IF NOT .STATUS ; 4930 3 THEN ; 4931 3 SEND%PACKET (MSG%NAK, 0, .MSG%NUMBER) ![024] ; 4932 3 ELSE ; 4933 4 BEGIN ; 4934 4 ![021] ; 4935 4 ![021] If the packet type is not acceptable by our caller, nak it so the ; 4936 4 ![021] other end tries again, and abort the current operation. This is so ; 4937 4 ![021] we will return to server mode (if we are running that way) quickly ; 4938 4 ![021] when the other Kermit has been aborted and then restarted, and should ; 4939 4 ![021] also make restarting quick, since we will not need to wait for the ; 4940 4 ![021] other Kermit to time this message out before retransmitting. ; 4941 4 ![021] ; 4942 4 ; 4943 4 IF NOT (.CHK%ROUTINE) () ; 4944 4 THEN ; 4945 5 BEGIN ; 4946 5 SEND%PACKET (MSG%NAK, 0, .REC%SEQ); ; 4947 5 RETURN FALSE; ! Just indicate an error ; 4948 5 END ; 4949 4 ELSE ; 4950 4 EXITLOOP KER%NORMAL; ; 4951 4 ; 4952 3 END; ; 4953 3 ; 4954 2 END; ; 4955 2 ; 4956 1 END; ! End of REC%PARSE ; REC%MESSAGE U.25: PUSH SP,AC16 ; 4864 L.317: MOVE AC1,U.54 ; 4912 CAMG AC1,PKT%RETRIES JRST L.318 PUSH SP,C.17 ; 4915 PUSHJ SP,KRM%ERROR ADJSP SP,-1 ; 4916 MOVEI AC1,212 ; 4914 JRST L.322 L.318: AOS U.54 ; 4919 PUSHJ SP,U.26 ; 4920 MOVE AC16,AC1 TRNN AC16,1 ; 4923 CAIN AC16,172 JRST L.319 CAIE AC16,300 CAIN AC16,262 ; 4924 JRST L.319 MOVE AC1,AC16 ; 4927 JRST L.322 L.319: TRNE AC16,1 ; 4929 JRST L.320 PUSH SP,C.24 ; 4931 PUSH SP,C.25 PUSH SP,U.55 PUSHJ SP,U.24 ADJSP SP,-3 JRST L.317 ; 4929 L.320: MOVE AC1,-2(SP) ; 4943 PUSHJ SP,0(AC1) TRNE AC1,1 JRST L.321 PUSH SP,C.24 ; 4946 PUSH SP,C.25 PUSH SP,U.56 PUSHJ SP,U.24 ADJSP SP,-3 ; 4947 TDZA AC1,AC1 ; 4945 L.321: MOVEI AC1,13 ; 4950 L.322: POP SP,AC16 ; 4864 POPJ SP, ; Routine Size: 41 words ; 4957 1 %SBTTL 'REC%PACKET' ; 4958 1 ROUTINE REC%PACKET = ; 4959 1 ; 4960 1 !++ ; 4961 1 ! FUNCTIONAL DESCRIPTION: ; 4962 1 ! ; 4963 1 ! This routine will do the oppoiste of SEND%PACKET. It will wait ; 4964 1 ! for the message to be read from the remote and then it will ; 4965 1 ! check the message for validity. ; 4966 1 ! ; 4967 1 ! CALLING SEQUENCE: ; 4968 1 ! ; 4969 1 ! Flag = REC%PACKET(); ; 4970 1 ! ; 4971 1 ! INPUT PARAMETERS: ; 4972 1 ! ; 4973 1 ! None. ; 4974 1 ! ; 4975 1 ! IMPLICIT INPUTS: ; 4976 1 ! ; 4977 1 ! None. ; 4978 1 ! ; 4979 1 ! OUTPUT PARAMETERS: ; 4980 1 ! ; 4981 1 ! None. ; 4982 1 ! ; 4983 1 ! IMPLICIT OUTPUTS: ; 4984 1 ! ; 4985 1 ! REC%MSG - Contains the message received. ; 4986 1 ! ; 4987 1 ! COMPLETION CODES: ; 4988 1 ! ; 4989 1 ! True - Packet receive ok. ; 4990 1 ! False - Problem occured during the receiving of the packet. ; 4991 1 ! ; 4992 1 ! SIDE EFFECTS: ; 4993 1 ! ; 4994 1 ! None. ; 4995 1 ! ; 4996 1 !-- ; 4997 1 ; 4998 2 BEGIN ; 4999 2 ; 5000 2 BIND ; 5001 2 ATTEMPT%TEXT = UPLIT (%ASCIZ'Attempting to receive'); ; 5002 2 ; 5003 2 LOCAL ; 5004 2 STATUS, ! Status returned by various routines ; 5005 2 MSG%LENGTH, ; 5006 2 ERR%POINTER, ! Pointer to the error buffer ; 5007 2 POINTER, ; 5008 2 CHKSUM; ! Checksum of the message ; 5009 2 ; 5010 2 ! ; 5011 2 ! Attempt to read the message from the remote. ; 5012 2 ! ; 5013 2 ! DO ; 5014 2 ! BEGIN ; 5015 2 ; 5016 2 IF .DEBUG%FLAG ; 5017 2 THEN ; 5018 3 BEGIN ; 5019 3 ; 5020 3 LOCAL ; 5021 3 OLD%RTN; ; 5022 3 ; 5023 3 OLD%RTN = TT%SET%OUTPUT (DBG%DUMP); ; 5024 3 TT%TEXT (ATTEMPT%TEXT); ; 5025 3 TT%CRLF (); ; 5026 3 TT%SET%OUTPUT (.OLD%RTN); ; 5027 2 END; ; 5028 2 ; 5029 2 ! ; 5030 2 ! If status type out requested, do it once ; 5031 2 ! ; 5032 2 ; 5033 2 IF .TYP%STS%FLAG ; 5034 2 THEN ; 5035 3 BEGIN ; 5036 3 STS%OUTPUT (); ; 5037 3 TYP%STS%FLAG = FALSE; ; 5038 2 END; ; 5039 2 ; 5040 2 ! ; 5041 2 ! Receive the message from the remote Kermit ; 5042 2 ! ; 5043 2 STATUS = RECEIVE (REC%MSG, MSG%LENGTH); ; 5044 2 ! ; 5045 2 ! Check for timeouts ; 5046 2 ! ; 5047 2 ; 5048 2 IF .STATUS EQL KER%TIMEOUT THEN XFR%STATUS (%C'R', %C'T'); ; 5049 2 ; 5050 2 ! ; 5051 2 ! If it failed return the status to the upper level ; 5052 2 ! ; 5053 2 ; 5054 2 IF NOT .STATUS ; 5055 2 THEN ; 5056 3 BEGIN ; 5057 3 ; 5058 3 IF .STATUS NEQ KER%ABORTED AND .STATUS NEQ KER%TIMEOUT THEN KRM%ERROR ; 5059 3 (.STATUS); ; 5060 3 ; 5061 3 ! Report error ; 5062 3 RETURN .STATUS; ; 5063 2 END; ; 5064 2 ; 5065 2 ! ; 5066 2 ! Determine if we got a good message ; 5067 2 ! ; 5068 2 ; 5069 2 IF .MSG%LENGTH LSS PKT%TOT%OVR%HEAD - 1 ; 5070 2 THEN ; 5071 3 BEGIN ; 5072 3 RETURN KER%ZEROLENMSG; ; 5073 2 END; ; 5074 2 ; 5075 2 IF UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNT, CHR%SIZE))) EQL 0 ! [108] ; 5076 2 THEN ! [108] ; 5077 3 BEGIN ! [108] ; 5078 3 IF .MSG%LENGTH LSS PKT%TOT%OVR%HEAD - 1 + 3 ! [108] ; 5079 3 THEN ! [108] ; 5080 4 BEGIN ! [108] ; 5081 4 RETURN KER%ZEROLENMSG; ! [108] ; 5082 3 END; ! [108] ; 5083 2 END; ! [108] ; 5084 2 ! ; 5085 2 ! Update the stats on the total number of characters received. ; 5086 2 ! ; 5087 2 RMSG%TOTAL%CHARS = .RMSG%TOTAL%CHARS + .MSG%LENGTH; ; 5088 2 ! ; 5089 2 ! Initialize the checksum and others ; 5090 2 ! ; 5091 2 REC%TYPE = CH$RCHAR (CH$PTR (REC%MSG, PKT%TYPE, CHR%SIZE)); ; 5092 2 ! ; 5093 2 ! Now break the message apart byte by byte. ; 5094 2 ! ; 5095 2 RECV%PKT%MSG = PKT%MSG; ! [108] ; 5096 2 REC%LENGTH = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNT, CHR%SIZE))); ; 5097 2 IF .REC%LENGTH EQL 0 ! [108] ; 5098 2 THEN ! [108] ; 5099 3 BEGIN ! [108] ; 5100 3 REC%LENGTH = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNTX1, CHR%SIZE))) * 95 + ; 5101 3 UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%COUNTX2, CHR%SIZE))) + ; 5102 3 PKT%HCHECK - 1; ! [108] ; 5103 3 RECV%PKT%MSG = PKT%MSGX; ! [108] ; 5104 2 END; ! [108] ; 5105 2 ; 5106 2 REC%SEQ = UNCHAR (CH$RCHAR (CH$PTR (REC%MSG, PKT%SEQ, CHR%SIZE))); ; 5107 2 ! ; 5108 2 ! Typed the packet if we are debugging ; 5109 2 ! ; 5110 2 DBG%RECEIVE (REC%MSG); ; 5111 2 ! ; 5112 2 ! Now compute the final checksum and make sure that it is identical ; 5113 2 ! to what we received from the remote KERMIT ; 5114 2 ! ; 5115 2 POINTER = CH$PTR (REC%MSG, PKT%MARK + 1, CHR%SIZE); ; 5116 2 REC%LENGTH = .REC%LENGTH - (.BLK%CHK%TYPE - CHK%1CHAR); ! [108] ; 5117 2 CHKSUM = CALC%BLOCK%CHECK (.POINTER, .REC%LENGTH); ! [108] ; 5118 2 POINTER = CH$PTR (REC%MSG, .REC%LENGTH + 1, CHR%SIZE); ! [108] ; 5119 2 REC%LENGTH = .REC%LENGTH - .RECV%PKT%MSG + 1; ! [108] ; 5120 2 STATUS = KER%NORMAL; ! Assume good checksum ; 5121 2 ; 5122 2 CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF ; 5123 2 SET ; 5124 2 ; 5125 2 [CHK%1CHAR] : ; 5126 2 ; 5127 2 IF .CHKSUM NEQ UNCHAR (CH$RCHAR%A (POINTER)) THEN STATUS = KER%CHKSUMERR; ; 5128 2 ; 5129 2 [CHK%2CHAR] : ; 5130 2 ; 5131 3 IF (.CHKSUM<6, 6> NEQ UNCHAR (CH$RCHAR%A (POINTER))) OR (.CHKSUM<0, 6> NEQ ; P 5132 3 UNCHAR ( ; 5133 3 CH$RCHAR%A (POINTER))) ; 5134 2 THEN ; 5135 2 STATUS = KER%CHKSUMERR; ; 5136 2 ; 5137 2 [CHK%CRC] : ; 5138 2 ; 5139 3 IF (.CHKSUM<12, 4> NEQ UNCHAR (CH$RCHAR%A (POINTER))) OR (.CHKSUM<6, 6> NEQ ; P 5140 3 UNCHAR ( ; P 5141 3 CH$RCHAR%A (POINTER))) OR (.CHKSUM<0, 6> NEQ UNCHAR (CH$RCHAR%A ; 5142 3 (POINTER))) ; 5143 2 THEN ; 5144 2 STATUS = KER%CHKSUMERR; ; 5145 2 ; 5146 2 TES; ; 5147 2 ; 5148 2 ! ; 5149 2 ! If we have a bad checksum, check for the special cases when we might be out ; 5150 2 ! of sync with the sender. This can occur if the sender is retransmitting ; 5151 2 ! a send-init (because our ACK got lost), and we have agreed on multi-char ; 5152 2 ! checksums, or because the sender is a server who has aborted back to being ; 5153 2 ! idle without telling us. ; 5154 2 ! Note that in either case, we return back to using single character checksums ; 5155 2 ! ; 5156 2 ; 5157 2 IF .STATUS EQL KER%CHKSUMERR ; 5158 2 THEN ; 5159 3 BEGIN ; 5160 3 ; 5161 4 IF (.BLK%CHK%TYPE NEQ CHK%1CHAR AND .REC%SEQ EQL 0) AND (.REC%LENGTH LSS 1 - ; 5162 5 (.BLK%CHK%TYPE ; 5163 4 - CHK%1CHAR) AND .REC%TYPE EQL MSG%NAK) OR (.REC%TYPE EQL MSG%SND%INIT) ; 5164 3 THEN ; 5165 4 BEGIN ; 5166 4 ; 5167 4 LOCAL ; 5168 4 SAVE%BLK%CHK%TYPE; ; 5169 4 ; 5170 4 SAVE%BLK%CHK%TYPE = .BLK%CHK%TYPE; ! Remember what we are using ; 5171 4 BLK%CHK%TYPE = CHK%1CHAR; ; 5172 4 POINTER = CH$PTR (REC%MSG, PKT%MARK + 1, CHR%SIZE); ; 5173 4 CHKSUM = CALC%BLOCK%CHECK (.POINTER, .REC%LENGTH + .RECV%PKT%MSG - 1); ! [108] ; 5174 4 POINTER = CH$PTR (REC%MSG, .REC%LENGTH + .RECV%PKT%MSG, CHR%SIZE); ! [108] ; 5175 4 ; 5176 5 IF .CHKSUM NEQ UNCHAR (CH$RCHAR%A (POINTER)) ; 5177 4 THEN ; 5178 5 BEGIN ; 5179 5 BLK%CHK%TYPE = .SAVE%BLK%CHK%TYPE; ; 5180 5 RETURN KER%CHKSUMERR; ; 5181 4 END; ; 5182 4 ; 5183 4 END ; 5184 3 ELSE ; 5185 3 RETURN KER%CHKSUMERR; ; 5186 3 ; 5187 2 END; ; 5188 2 ; 5189 2 ! ; 5190 2 ! Update the stats ; 5191 2 ! ; 5192 2 ! RMSG%DATA%CHARS = .RMSG%DATA%CHARS + .REC%LENGTH; ; 5193 2 ; 5194 2 IF .REC%TYPE EQL MSG%NAK ; 5195 2 THEN ; 5196 3 BEGIN ; 5197 3 RMSG%NAKS = .RMSG%NAKS + 1; ; 5198 3 XFR%STATUS (%C'R', %C'N'); ; 5199 3 END ; 5200 2 ELSE ; 5201 3 BEGIN ; 5202 3 RMSG%COUNT = .RMSG%COUNT + 1; ; 5203 3 XFR%STATUS (%C'R', %C'P'); ; 5204 2 END; ; 5205 2 ; 5206 2 ! ; 5207 2 ! Now check to see if we have an E type (Error) packet. ; 5208 2 ! ; 5209 2 ; 5210 2 IF .REC%TYPE NEQ MSG%ERROR THEN RETURN KER%NORMAL; ; 5211 2 ; 5212 2 ! ; 5213 2 ! Here to process an error packet. Call the user routine to output the ; 5214 2 ! error message to the terminal. ; 5215 2 ! ; 5216 2 ! ; 5217 2 ![026] Use decoding routine to fetch the error text ; 5218 2 ! ; 5219 2 CH$FILL (CHR%NUL, MAX%MSG + 1, CH$PTR (LAST%ERROR)); ; 5220 2 SET%STRING (CH$PTR (LAST%ERROR), MAX%MSG, TRUE); ; 5221 2 BFR%EMPTY (); ; 5222 2 SET%STRING (0, 0, FALSE); ; 5223 2 ![026] ERR%POINTER = CH$PTR (LAST%ERROR); ; 5224 2 ![026] POINTER = CH$PTR (REC%MSG, PKT%MSG, CHR%SIZE); ; 5225 2 ![026] ; 5226 2 ![026] INCR I FROM 1 TO .REC%LENGTH DO ; 5227 2 ![026] CH$WCHAR%A (CH$RCHAR%A (POINTER), ERR%POINTER); ; 5228 2 ![026] ; 5229 2 ![026] CH$WCHAR (CHR%NUL, ERR%POINTER); ; 5230 2 TT%TEXT (LAST%ERROR); ; 5231 2 TT%CRLF (); ; 5232 2 RETURN KER%ERRMSG; ; 5233 1 END; ! End of REC%PACKET P.AAN: BYTE (7)"A","t","t","e","m" BYTE (7)"p","t","i","n","g" BYTE (7)" ","t","o"," ","r" BYTE (7)"e","c","e","i","v" BYTE (7)"e",000,000,000,000 ; ATTEMPT%TEXT U.82= P.AAN ; REC%PACKET U.26: PUSH SP,AC14 ; 4958 PUSH SP,AC16 ADJSP SP,1 MOVEI AC1,1 ; 5016 TDNN AC1,DEBUG%FLAG JRST L.323 PUSH SP,C.88 ; 5023 PUSHJ SP,TT%SET%OUTPUT MOVE AC14,AC1 PUSH SP,C.89 ; 5024 PUSHJ SP,TT%TEXT PUSHJ SP,TT%CRLF ; 5025 MOVEM AC14,0(SP) ; 5026 PUSHJ SP,TT%SET%OUTPUT ADJSP SP,-2 ; 5018 L.323: MOVEI AC1,1 ; 5033 TDNN AC1,TYP%STS%FLAG JRST L.324 PUSHJ SP,U.33 ; 5036 SETZM TYP%STS%FLAG ; 5037 L.324: PUSH SP,C.90 ; 5043 MOVEI AC1,-1(SP) PUSH SP,AC1 PUSHJ SP,RECEIVE MOVE AC14,AC1 CAIE AC14,300 ; 5048 JRST L.325 PUSH SP,C.12 PUSH SP,C.5 PUSHJ SP,XFR%STATUS ADJSP SP,-2 L.325: TRNE AC14,1 ; 5054 JRST L.327 CAIE AC14,312 ; 5058 CAIN AC14,300 JRST L.326 MOVEM AC14,0(SP) ; 5059 PUSHJ SP,KRM%ERROR L.326: ADJSP SP,-2 ; 5062 MOVE AC1,AC14 ; 5056 JRST L.346 L.327: MOVE AC1,-2(SP) ; 5069 CAIGE AC1,5 JRST L.328 MOVE AC2,C.91 ; 5075 ILDB AC2,AC2 CAIN AC2,40 CAIL AC1,10 ; 5078 JRST L.329 L.328: ADJSP SP,-2 ; 5081 MOVEI AC1,262 ; 5080 JRST L.346 L.329: ADDM AC1,RMSG%TOTAL%CHARS ; 5087 MOVE AC1,C.92 ; 5091 ILDB AC1,AC1 MOVEM AC1,U.58 MOVEI AC1,4 ; 5095 MOVEM AC1,U.39 MOVE AC1,C.91 ; 5096 ILDB AC1,AC1 SUBI AC1,40 MOVEM AC1,U.57 JUMPN AC1,L.330 ; 5097 MOVE AC1,C.93 ; 5100 ILDB AC1,AC1 IMULI AC1,137 MOVE AC2,C.94 ; 5101 ILDB AC2,AC2 ADD AC1,AC2 ; 5100 SUBI AC1,5773 ; 5102 MOVEM AC1,U.57 MOVEI AC1,7 ; 5103 MOVEM AC1,U.39 L.330: MOVE AC1,C.95 ; 5106 ILDB AC1,AC1 SUBI AC1,40 MOVEM AC1,U.56 PUSH SP,C.90 ; 5110 PUSHJ SP,U.36 MOVE AC16,C.91 ; 5115 MOVE AC1,U.57 ; 5116 SUB AC1,U.48 ADDI AC1,61 MOVEM AC1,U.57 MOVEM AC16,0(SP) ; 5117 PUSH SP,U.57 PUSHJ SP,U.19 MOVE AC2,U.57 ; 5118 ADDI AC2,1 MOVE AC3,C.27 ADJBP AC2,AC3 MOVE AC16,AC2 MOVE AC2,U.57 ; 5119 SUB AC2,U.39 ADDI AC2,1 MOVEM AC2,U.57 MOVEI AC14,13 ; 5120 MOVE AC3,U.48 ; 5122 MOVE AC2,AC3 SUBI AC2,61 JRST L.331(AC2) L.331: JRST L.332 JRST L.334 JRST L.333 L.332: ILDB AC2,AC16 ; 5127 SUBI AC2,40 CAMN AC1,AC2 JRST L.336 JRST L.335 L.333: ILDB AC2,AC16 ; 5139 SUBI AC2,40 LDB AC4,C.86 CAME AC4,AC2 JRST L.335 L.334: ILDB AC2,AC16 ; 5141 SUBI AC2,40 LDB AC4,C.87 ; 5139 CAME AC4,AC2 JRST L.335 ILDB AC2,AC16 ; 5142 SUBI AC2,40 LDB AC4,C.18 ; 5141 CAME AC4,AC2 L.335: MOVEI AC14,172 ; 5144 L.336: CAIE AC14,172 ; 5157 JRST L.342 CAIE AC3,61 ; 5161 SKIPE U.56 JRST L.337 MOVE AC2,AC3 SUBI AC2,62 MOVN AC2,AC2 CAMG AC2,U.57 JRST L.337 MOVEI AC2,116 ; 5163 CAMN AC2,U.58 JRST L.338 L.337: MOVEI AC2,123 CAME AC2,U.58 JRST L.340 L.338: MOVE AC14,AC3 ; 5170 MOVEI AC2,61 ; 5171 MOVEM AC2,U.48 MOVE AC16,C.91 ; 5172 MOVEM AC16,0(SP) ; 5173 MOVE AC2,U.57 ADD AC2,U.39 SUBI AC2,1 PUSH SP,AC2 PUSHJ SP,U.19 MOVE AC2,U.57 ; 5174 ADD AC2,U.39 MOVE AC3,C.27 ADJBP AC2,AC3 MOVE AC16,AC2 ILDB AC2,AC16 ; 5176 SUBI AC2,40 CAMN AC1,AC2 JRST L.339 MOVEM AC14,U.48 ; 5179 ADJSP SP,-5 ; 5180 JRST L.341 L.339: ADJSP SP,-1 ; 5165 JRST L.342 ; 5161 L.340: ADJSP SP,-4 ; 5185 L.341: MOVEI AC1,172 JRST L.346 L.342: MOVEI AC1,116 ; 5194 CAME AC1,U.58 JRST L.343 AOS RMSG%NAKS ; 5197 PUSH SP,C.12 ; 5198 PUSH SP,C.24 JRST L.344 L.343: AOS RMSG%COUNT ; 5202 PUSH SP,C.12 ; 5203 PUSH SP,C.85 L.344: PUSHJ SP,XFR%STATUS MOVEI AC1,105 ; 5210 CAMN AC1,U.58 JRST L.345 ADJSP SP,-6 MOVEI AC1,13 JRST L.346 L.345: SETZB AC1,AC2 ; 5219 MOVEI AC4,1753 MOVE AC5,C.3 EXTEND AC1,C.1 JFCL PUSH SP,C.3 ; 5220 PUSH SP,C.55 PUSH SP,C.2 PUSHJ SP,U.30 PUSHJ SP,U.28 ; 5221 SETZM -2(SP) ; 5222 SETZM -1(SP) SETZM 0(SP) PUSHJ SP,U.30 PUSH SP,C.96 ; 5230 PUSHJ SP,TT%TEXT PUSHJ SP,TT%CRLF ; 5231 ADJSP SP,-12 ; 5232 MOVEI AC1,162 ; 4998 L.346: ADJSP SP,-1 ; 4958 POP SP,AC16 POP SP,AC14 POPJ SP, C.86: POINT 4,AC1,23 C.87: POINT 6,AC1,29 C.88: XWD 0,DBG%DUMP C.89: XWD 0,U.82 C.90: XWD 0,U.59 C.91: POINT 8,U.59,7 C.92: POINT 8,U.59,23 C.93: POINT 8,U.59,31 C.94: POINT 8,U.59+1,7 C.95: POINT 8,U.59,15 C.96: XWD 0,LAST%ERROR ; Routine Size: 218 words ; 5234 1 %SBTTL 'CALC%BLOCK%CHECK' ; 5235 1 ROUTINE CALC%BLOCK%CHECK (POINTER, LENGTH) = ; 5236 1 ; 5237 1 !++ ; 5238 1 ! FUNCTIONAL DESCRIPTION: ; 5239 1 ! ; 5240 1 ! This routine will calculate the proper value for the block check ; 5241 1 ! for a given message. The value it returns is dependant upon the ; 5242 1 ! type of block check requested in BLK%CHK%TYPE. ; 5243 1 ! ; 5244 1 ! CALLING SEQUENCE: ; 5245 1 ! ; 5246 1 ! CHKSUM = CALC%BLOCK%CHECK (.POINTER, .LENGTH); ; 5247 1 ! ; 5248 1 ! INPUT PARAMETERS: ; 5249 1 ! ; 5250 1 ! POINTER - A character pointer to the first character to be ; 5251 1 ! included in the block check. ; 5252 1 ! ; 5253 1 ! LENGTH - The number of characters to be included. ; 5254 1 ! ; 5255 1 ! IMPLICIT INPUTS: ; 5256 1 ! ; 5257 1 ! BLK%CHK%TYPE - The type of block check to generate. ; 5258 1 ! ; 5259 1 ! OUPTUT PARAMETERS: ; 5260 1 ! ; 5261 1 ! The value is the block check. ; 5262 1 ! ; 5263 1 ! IMPLICIT OUTPUTS: ; 5264 1 ! ; 5265 1 ! None. ; 5266 1 ! ; 5267 1 ! COMPLETION CODES: ; 5268 1 ! ; 5269 1 ! None. ; 5270 1 ! ; 5271 1 ! SIDE EFFECTS: ; 5272 1 ! ; 5273 1 ! None. ; 5274 1 ! ; 5275 1 !-- ; 5276 1 ; 5277 2 BEGIN ; 5278 2 ; 5279 2 LOCAL ; 5280 2 CHAR%MASK, ! Mask for stripping bits ; 5281 2 BLOCK%CHECK; ! To build initial block check value ; 5282 2 ; 5283 2 BLOCK%CHECK = 0; ! Start out at 0 ; 5284 2 ! ; 5285 2 ! Set mask for characters so that we calculate the block check correctly ; 5286 2 ! ; 5287 2 CHAR%MASK = (IF .PARITY%TYPE EQL PR%NONE THEN %O'377' ELSE %O'177'); ; 5288 2 ; 5289 2 CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF ; 5290 2 SET ; 5291 2 ; 5292 2 [CHK%1CHAR, CHK%2CHAR] : ; 5293 2 ; 5294 2 INCR I FROM 1 TO .LENGTH DO ; 5295 2 BLOCK%CHECK = .BLOCK%CHECK + (CH$RCHAR%A (POINTER) AND .CHAR%MASK); ; 5296 2 ; 5297 2 [CHK%CRC] : ; 5298 3 BEGIN ; 5299 3 ! ; 5300 3 ! Ensure that the calculation is done with correct type of characters ; 5301 3 ! ; 5302 3 ; 5303 3 LOCAL ; 5304 3 TMP%PTR; ! Temp pointer for copying chars ; 5305 3 ; 5306 3 TMP%PTR = .POINTER; ; 5307 3 ; 5308 3 IF .PARITY%TYPE NEQ PR%NONE ![136] Strip high bit if any parity applied ; 5309 3 THEN ; 5310 3 ; 5311 3 INCR I FROM 1 TO .LENGTH DO ; 5312 3 CH$WCHAR%A ((CH$RCHAR (.TMP%PTR) AND %O'177'), TMP%PTR); ; 5313 3 ; 5314 3 BLOCK%CHECK = CRCCLC (.POINTER, .LENGTH); ; 5315 2 END; ; 5316 2 TES; ; 5317 2 ; 5318 2 IF .BLK%CHK%TYPE EQL CHK%1CHAR ; 5319 2 THEN ; 5320 2 BLOCK%CHECK = (.BLOCK%CHECK + ((.BLOCK%CHECK AND %O'300')/%O'100')) AND %O'77'; ; 5321 2 ; 5322 2 RETURN .BLOCK%CHECK; ! Return the correct value ; 5323 1 END; ! End of CALC%BLOCK%CHK ; CALC%BLOCK%CHECK U.19: SETZ AC5, ; 5283 MOVE AC4,PARITY%TYPE ; 5287 JUMPN AC4,L.347 MOVEI AC3,377 JRST L.348 L.347: MOVEI AC3,177 L.348: MOVE AC1,U.48 ; 5289 SUBI AC1,61 JRST L.349(AC1) L.349: JRST L.350 JRST L.350 JRST L.353 L.350: SETZ AC2, ; 5294 JRST L.352 L.351: ILDB AC1,-2(SP) ; 5295 AND AC1,AC3 ADD AC5,AC1 L.352: ADDI AC2,1 ; 5294 CAMG AC2,-1(SP) JRST L.351 JRST L.357 ; 5289 L.353: MOVE AC1,-2(SP) ; 5306 JUMPE AC4,L.356 ; 5308 MOVE AC4,-1(SP) ; 5311 SETZ AC3, JRST L.355 L.354: MOVE AC2,AC1 ; 5312 ILDB AC2,AC2 ANDI AC2,177 IDPB AC2,AC1 L.355: ADDI AC3,1 ; 5311 CAMG AC3,AC4 JRST L.354 L.356: PUSH SP,-2(SP) ; 5314 PUSH SP,-2(SP) PUSHJ SP,CRCCLC MOVE AC5,AC1 ADJSP SP,-2 ; 5298 L.357: MOVEI AC1,61 ; 5318 CAME AC1,U.48 JRST L.358 MOVE AC1,AC5 ; 5320 ANDI AC1,300 IDIVI AC1,100 ADD AC1,AC5 LDB AC5,C.18 L.358: MOVE AC1,AC5 ; 5277 POPJ SP, ; 5235 ; Routine Size: 48 words ; 5324 1 %SBTTL 'NORMALIZE%FILE - Put file name into normal form' ; 5325 1 ROUTINE NORMALIZE%FILE (FILE%ADDRESS, FILE%LENGTH, NAME%LENGTH, TYPE%LENGTH) : ; 5326 1 NOVALUE = ; 5327 1 ; 5328 1 !++ ; 5329 1 ! FUNCTIONAL DESCRIPTION: ; 5330 1 ! ; 5331 1 ! This routine will ensure that a file specification is in normal ; 5332 1 ! form. It does this by replacing all non-alphanumeric characters ; 5333 1 ! (except the first period) with "X". It will also ensure that ; 5334 1 ! the resulting specification (of form name.type) has only ; 5335 1 ! a specified number of characters in the name portion and type portion. ; 5336 1 ! ; 5337 1 ! CALLING SEQUENCE: ; 5338 1 ! ; 5339 1 ! NORMALIZE%FILE (FILE%ADDRESS, FILE%LENGTH, NAME%LENGTH, TYPE%LENGTH); ; 5340 1 ! ; 5341 1 ! INPUT PARAMETERS: ; 5342 1 ! ; 5343 1 ! FILE%ADDRESS - Address of file specification string to be normalized ; 5344 1 ! ; 5345 1 ! FILE%LENGTH - Length of file specification ; 5346 1 ! ; 5347 1 ! NAME%LENGTH - Maximum length desired for "name" portion. ; 5348 1 ! ; 5349 1 ! TYPE%LENGTH - Maximum length desired for "type" portion. ; 5350 1 ! ; 5351 1 ! With both NAME%LENGTH and TYPE%LENGTH, a negative value indicates ; 5352 1 ! unlimited lenght. ; 5353 1 ! ; 5354 1 ! IMPLICIT INPUTS: ; 5355 1 ! ; 5356 1 ! None. ; 5357 1 ! ; 5358 1 ! OUPTUT PARAMETERS: ; 5359 1 ! ; 5360 1 ! FILE%LENGTH - The length of the resulting file spec ; 5361 1 ! ; 5362 1 ! NAME%LENGTH - The actual length of the resulting file name ; 5363 1 ! ; 5364 1 ! TYPE%LENGTH - The actual length of the resulting file type ; 5365 1 ! ; 5366 1 ! IMPLICIT OUTPUTS: ; 5367 1 ! ; 5368 1 ! None. ; 5369 1 ! ; 5370 1 ! COMPLETION CODES: ; 5371 1 ! ; 5372 1 ! None. ; 5373 1 ! ; 5374 1 ! SIDE EFFECTS: ; 5375 1 ! ; 5376 1 ! None. ; 5377 1 ! ; 5378 1 !-- ; 5379 1 ; 5380 2 BEGIN ; 5381 2 ; 5382 2 LOCAL ; 5383 2 CH, ! Character being processed ; 5384 2 POINTER, ! Pointer to file spec ; 5385 2 WRT%POINTER, ! Pointer to write file spec ; 5386 2 WRT%SIZE, ; 5387 2 FIRST%PERIOD, ! Flag we have seen a period ; 5388 2 IGNORE%BAD, ! Flag we should ignore bad characters ; 5389 2 BAD%CHAR, ! Flag this character was bad ; 5390 2 FILE%CTR, ! Counter for overall length ; 5391 2 NAME%CTR, ! Counter for name characters ; 5392 2 TYPE%CTR; ! Counter for type characters ; 5393 2 ; 5394 2 FILE%CTR = 0; ; 5395 2 NAME%CTR = 0; ; 5396 2 TYPE%CTR = 0; ; 5397 2 WRT%SIZE = 0; ; 5398 2 FIRST%PERIOD = FALSE; ! No periods yet ; 5399 2 POINTER = CH$PTR (.FILE%ADDRESS); ! Set up pointer to file name ; 5400 2 WRT%POINTER = .POINTER; ; 5401 2 ; 5402 2 IF .NAME%LENGTH EQL 0 THEN FIRST%PERIOD = TRUE; ! Pretend we did name already ; 5403 2 ; 5404 2 IGNORE%BAD = FALSE; ; 5405 2 ; 5406 2 IF .NAME%LENGTH GTR 0 ; 5407 2 THEN ; 5408 3 BEGIN ; 5409 3 ; 5410 3 DECR I FROM ..FILE%LENGTH TO 0 DO ; 5411 3 ; 5412 3 IF CH$RCHAR%A (POINTER) EQL %C'.' ; 5413 3 THEN ; 5414 4 BEGIN ; 5415 4 IGNORE%BAD = TRUE; ; 5416 4 EXITLOOP; ; 5417 3 END; ; 5418 3 ; 5419 2 END; ; 5420 2 ; 5421 2 POINTER = .WRT%POINTER; ; 5422 2 ; 5423 2 WHILE .FILE%CTR LSS ..FILE%LENGTH DO ; 5424 3 BEGIN ; 5425 3 CH = CH$RCHAR%A (POINTER); ! Get a character ; 5426 3 FILE%CTR = .FILE%CTR + 1; ; 5427 3 ; 5428 3 IF (.CH LSS %C'0' AND (.CH NEQ %C'.' OR .FIRST%PERIOD)) OR .CH GTR %C'z' OR ; 5429 4 (.CH GTR %C'9' ; 5430 4 AND .CH LSS %C'A') OR (.CH GTR %C'Z' AND .CH LSS %C'a') ; 5431 3 THEN ; 5432 4 BEGIN ; 5433 4 BAD%CHAR = TRUE; ; 5434 4 CH = %C'X'; ; 5435 4 END ; 5436 3 ELSE ; 5437 4 BEGIN ; 5438 4 BAD%CHAR = FALSE; ; 5439 4 ; 5440 4 IF .CH GEQ %C'a' THEN CH = .CH - (%C'a' - %C'A'); ; 5441 4 ; 5442 3 END; ; 5443 3 ; 5444 3 IF .CH EQL %C'.' ; 5445 3 THEN ; 5446 4 BEGIN ; 5447 4 FIRST%PERIOD = TRUE; ; 5448 4 CH$WCHAR%A (.CH, WRT%POINTER); ; 5449 4 WRT%SIZE = .WRT%SIZE + 1; ; 5450 4 END ; 5451 3 ELSE ; 5452 3 ; 5453 3 IF NOT .BAD%CHAR OR NOT .IGNORE%BAD ; 5454 3 THEN ; 5455 3 ; 5456 3 IF NOT .FIRST%PERIOD ; 5457 3 THEN ; 5458 4 BEGIN ; 5459 4 ; 5460 4 IF .NAME%LENGTH LSS 0 OR .NAME%CTR LSS .NAME%LENGTH ; 5461 4 THEN ; 5462 5 BEGIN ; 5463 5 NAME%CTR = .NAME%CTR + 1; ; 5464 5 WRT%SIZE = .WRT%SIZE + 1; ; 5465 5 CH$WCHAR%A (.CH, WRT%POINTER); ; 5466 4 END; ; 5467 4 ; 5468 4 END ; 5469 3 ELSE ; 5470 3 ; 5471 3 IF .TYPE%LENGTH LSS 0 OR .TYPE%CTR LSS .TYPE%LENGTH ; 5472 3 THEN ; 5473 4 BEGIN ; 5474 4 TYPE%CTR = .TYPE%CTR + 1; ; 5475 4 WRT%SIZE = .WRT%SIZE + 1; ; 5476 4 CH$WCHAR%A (.CH, WRT%POINTER); ; 5477 3 END; ; 5478 3 ; 5479 2 END; ; 5480 2 ; 5481 2 .FILE%LENGTH = .WRT%SIZE; ; 5482 2 CH$WCHAR%A (CHR%NUL, WRT%POINTER); ; 5483 1 END; ! End of NORMALIZE%FILE ; NORMALIZE%FILE U.27: PUSH SP,AC10 ; 5325 PUSH SP,AC11 PUSH SP,AC12 PUSH SP,AC13 PUSH SP,AC14 PUSH SP,AC16 SETZB AC16,AC11 ; 5394 SETZB AC10,AC12 ; 5396 SETZ AC13, ; 5398 MOVE AC1,-12(SP) ; 5399 MOVEI AC1,-1(AC1) HRLI AC1,10700 MOVE AC4,AC1 ; 5400 SKIPN AC2,-10(SP) ; 5402 MOVEI AC13,1 SETZ AC14, ; 5404 JUMPLE AC2,L.361 ; 5406 MOVE AC2,-11(SP) ; 5410 MOVE AC3,0(AC2) AOJA AC3,L.360 L.359: ILDB AC2,AC1 ; 5412 CAIE AC2,56 JRST L.360 MOVEI AC14,1 ; 5415 JRST L.361 ; 5414 L.360: SOJGE AC3,L.359 ; 5410 L.361: MOVE AC1,AC4 ; 5421 L.362: MOVE AC3,-11(SP) ; 5423 CAML AC16,0(AC3) JRST L.374 ILDB AC2,AC1 ; 5425 ADDI AC16,1 ; 5426 CAIL AC2,60 ; 5428 JRST L.363 CAIN AC2,56 TRNE AC13,1 JRST L.365 L.363: CAILE AC2,172 JRST L.365 CAIG AC2,71 ; 5429 JRST L.364 CAIGE AC2,101 ; 5430 JRST L.365 L.364: CAILE AC2,132 CAIL AC2,141 JRST L.366 L.365: MOVEI AC5,1 ; 5433 MOVEI AC2,130 ; 5434 JRST L.367 ; 5428 L.366: SETZ AC5, ; 5438 CAIL AC2,141 ; 5440 SUBI AC2,40 L.367: CAIE AC2,56 ; 5444 JRST L.368 MOVEI AC13,1 ; 5447 IDPB AC2,AC4 ; 5448 AOJA AC12,L.362 ; 5444 L.368: TRNN AC5,1 ; 5453 JRST L.369 TRNE AC14,1 JRST L.362 L.369: TRNE AC13,1 ; 5456 JRST L.371 MOVE AC3,-10(SP) ; 5460 JUMPL AC3,L.370 CAML AC11,AC3 JRST L.362 L.370: AOJA AC11,L.373 ; 5463 L.371: MOVE AC3,-7(SP) ; 5471 JUMPL AC3,L.372 CAML AC10,AC3 JRST L.362 L.372: ADDI AC10,1 ; 5474 L.373: ADDI AC12,1 ; 5475 IDPB AC2,AC4 ; 5476 JRST L.362 ; 5471 L.374: MOVE AC1,-11(SP) ; 5481 MOVEM AC12,0(AC1) SETZ AC1, ; 5482 IDPB AC1,AC4 POP SP,AC16 ; 5325 POP SP,AC14 POP SP,AC13 POP SP,AC12 POP SP,AC11 POP SP,AC10 POPJ SP, ; Routine Size: 87 words ; 5484 1 %SBTTL 'Buffer filling -- Main routine' ; 5485 1 ROUTINE BFR%FILL (FIRST%FLAG) = ; 5486 1 ; 5487 1 !++ ; 5488 1 ! FUNCTIONAL DESCRIPTION: ; 5489 1 ! ; 5490 1 ! This routine will fill the buffer with data from the file. It ; 5491 1 ! will do all the quoting that is required. ; 5492 1 ! ; 5493 1 ! CALLING SEQUENCE: ; 5494 1 ! ; 5495 1 ! EOF%FLAG = BFR%FILL(.FIRST%FLAG); ; 5496 1 ! ; 5497 1 ! INPUT PARAMETERS: ; 5498 1 ! ; 5499 1 ! FIRST%FLAG - Flag whether first call for this file ; 5500 1 ! ; 5501 1 ! IMPLICIT INPUTS: ; 5502 1 ! ; 5503 1 ! None. ; 5504 1 ! ; 5505 1 ! OUTPUT PARAMETERS: ; 5506 1 ! ; 5507 1 ! True - Buffer filled may be at end of file. ; 5508 1 ! False - At end of file. ; 5509 1 ! ; 5510 1 ! IMPLICIT OUTPUTS: ; 5511 1 ! ; 5512 1 ! Number of characters stored in the buffer. ; 5513 1 ! ; 5514 1 ! COMPLETION CODES: ; 5515 1 ! ; 5516 1 ! None. ; 5517 1 ! ; 5518 1 ! SIDE EFFECTS: ; 5519 1 ! ; 5520 1 ! None. ; 5521 1 ! ; 5522 1 !-- ; 5523 1 ; 5524 2 BEGIN ; 5525 2 ; 5526 2 LITERAL ; 5527 2 NO%CHAR = -1, ! No character next ; 5528 2 EOF%CHAR = -2; ! EOF seen ; 5529 2 ; 5530 2 LOCAL ; 5531 2 I, ! Temp loop index ; 5532 2 MAX%SIZE, ! Maximum size of data ; 5533 2 POINTER; ! Pointer into the message buffer ; 5534 2 ; 5535 2 OWN ; 5536 2 NEXT%CHR, ! Saved character ; 5537 2 STATUS, ! Status value ; 5538 2 REPEAT%COUNT, ! Number of times character repeated ; 5539 2 CHAR%8%BIT, ! 8 bit character from file ; 5540 2 CHRS : VECTOR [5], ! String needed to represent character ; 5541 2 CHR%IDX, ! Index into CHRS ; 5542 2 OLD%CHAR%8%BIT, ! Previous 8-bit character ; 5543 2 OLD%CHRS : VECTOR [5], ! String for previous character ; 5544 2 OLD%CHR%IDX; ! Index for previous character ; 5545 2 ; 5546 2 ROUTINE GET%QUOTED%CHAR = ; 5547 2 ! ; 5548 2 ! This routine gets a character from the file and returns both ; 5549 2 ! the character and the string needed to represent the character ; 5550 2 ! if it needs quoting. ; 5551 2 ! ; 5552 3 BEGIN ; 5553 3 ; 5554 3 IF .NEXT%CHR GEQ 0 ; 5555 3 THEN ; 5556 4 BEGIN ; 5557 4 CHAR%8%BIT = .NEXT%CHR; ; 5558 4 NEXT%CHR = NO%CHAR; ; 5559 4 STATUS = KER%NORMAL; ; 5560 4 END ; 5561 3 ELSE ; 5562 3 ; 5563 3 IF .NEXT%CHR EQL NO%CHAR ; 5564 3 THEN ; 5565 3 STATUS = (.GET%CHR%ROUTINE) (CHAR%8%BIT) ; 5566 3 ELSE ; 5567 3 STATUS = KER%EOF; ; 5568 3 ; 5569 3 IF .STATUS EQL KER%NORMAL ; 5570 3 THEN ; 5571 4 BEGIN ; 5572 4 ! ; 5573 4 ! Determine if we should just quote the character ; 5574 4 ! Either: ; 5575 4 ! Character is a delete (177 octal) ; 5576 4 ! or Character is a control character (less than 40 octal) ; 5577 4 ! or Character is a quote character ; 5578 4 ! or Character is the repeat character and doing repeat compression ; 5579 4 ! or Character is an eight bit quote character and doing eight bit ; 5580 4 ! quoting. ; 5581 4 ! ; 5582 4 ; 5583 5 IF ((.CHAR%8%BIT AND %O'177') LSS %C' ') OR ((.CHAR%8%BIT AND %O'177') EQL ; 5584 5 CHR%DEL) OR ( ; 5585 6 (.CHAR%8%BIT AND %O'177') EQL .RCV%QUOTE%CHR) OR (.FLAG%REPEAT AND ( ; 5586 7 (.CHAR%8%BIT AND ; 5587 6 %O'177') EQL .REPT%CHR)) OR (.FLAG%8QUOTE AND ((.CHAR%8%BIT AND %O'177') EQL ; 5588 5 .SEND%8QUOTE%CHR)) ; 5589 4 THEN ; 5590 5 BEGIN ; 5591 5 ! ; 5592 5 ! If the character is a control character or delete we must do a CTL(Character) ; 5593 5 ! so it is something that we can be sure we can send. ; 5594 5 ! ; 5595 5 ; 5596 6 IF ((.CHAR%8%BIT AND %O'177') LSS %C' ') OR ((.CHAR%8%BIT AND %O'177') EQL ; 5597 6 CHR%DEL) ; 5598 5 THEN ; 5599 6 CHRS [0] = CTL (.CHAR%8%BIT) ; 5600 5 ELSE ; 5601 5 CHRS [0] = .CHAR%8%BIT; ; 5602 5 ; 5603 5 CHR%IDX = 1; ; 5604 5 CHRS [1] = .RCV%QUOTE%CHR; ![035] Use character we said we would send ; 5605 5 END ; 5606 4 ELSE ; 5607 5 BEGIN ; 5608 5 CHR%IDX = 0; ; 5609 5 CHRS [0] = .CHAR%8%BIT; ; 5610 4 END; ; 5611 4 ; 5612 4 END ; 5613 3 ELSE ; 5614 3 ; 5615 3 IF .STATUS NEQ KER%EOF THEN KRM%ERROR (.STATUS); ! Report error ; 5616 3 ; 5617 3 RETURN .STATUS; ; 5618 2 END; RELOC 1025 ; NEXT%CHR U.83: BLOCK 1 ; STATUS U.84: BLOCK 1 ; REPEAT%COUNT U.85: BLOCK 1 ; CHAR%8%BIT U.86: BLOCK 1 ; CHRS U.87: BLOCK 5 ; CHR%IDX U.88: BLOCK 1 ; OLD%CHAR%8%BIT U.89: BLOCK 1 ; OLD%CHRS U.90: BLOCK 5 ; OLD%CHR%IDX U.91: BLOCK 1 RELOC 405672 ; GET%QUOTED%CHAR U.92: MOVE AC1,U.83 ; 5554 JUMPL AC1,L.375 MOVEM AC1,U.86 ; 5557 SETOM U.83 ; 5558 MOVEI AC1,13 ; 5559 JRST L.377 L.375: CAME AC1,C.36 ; 5563 JRST L.376 MOVE AC1,U.67 ; 5565 PUSH SP,C.98 PUSHJ SP,0(AC1) MOVEM AC1,U.84 ADJSP SP,-1 JRST L.378 ; 5563 L.376: MOVEI AC1,113 ; 5567 L.377: MOVEM AC1,U.84 L.378: MOVE AC1,U.84 ; 5569 CAIE AC1,13 JRST L.383 MOVE AC2,U.86 ; 5583 LDB AC1,C.97 SETZ AC3, CAIL AC1,40 JRST L.379 MOVEI AC3,1 JRST L.381 L.379: CAIE AC1,177 CAMN AC1,RCV%QUOTE%CHR ; 5584 JRST L.381 MOVEI AC4,1 ; 5585 TDNN AC4,U.50 JRST L.380 CAMN AC1,U.38 JRST L.381 L.380: MOVEI AC4,1 ; 5587 TDNE AC4,U.49 CAME AC1,U.45 JRST L.382 L.381: TRNN AC3,1 ; 5596 CAIN AC1,177 TRC AC2,100 ; 5599 MOVEM AC2,U.87 ; 5601 MOVEI AC1,1 ; 5603 MOVEM AC1,U.88 MOVE AC1,RCV%QUOTE%CHR ; 5604 MOVEM AC1,U.87+1 JRST L.384 ; 5583 L.382: SETZM U.88 ; 5608 MOVEM AC2,U.87 ; 5609 JRST L.384 ; 5569 L.383: CAIN AC1,113 ; 5615 JRST L.384 PUSH SP,AC1 PUSHJ SP,KRM%ERROR ADJSP SP,-1 L.384: MOVE AC1,U.84 ; 5552 POPJ SP, ; 5546 C.97: POINT 7,AC2,35 C.98: XWD 0,U.86 ; Routine Size: 59 words ; 5619 2 ROUTINE GET%8%QUOTED%CHAR = ; 5620 2 ! ; 5621 2 ! This routine will get the quoted representation of a character ; 5622 2 ! (by calling GET%QUOTED%CHAR), and return the 8th-bit quoted ; 5623 2 ! representation. ; 5624 2 ! ; 5625 3 BEGIN ; 5626 3 ; 5627 3 IF (STATUS = GET%QUOTED%CHAR ()) EQL KER%NORMAL ; 5628 3 THEN ; 5629 4 BEGIN ; 5630 4 ! ; 5631 4 ! Determine if we must quote the eighth bit (parity bit on) ; 5632 4 ! ; 5633 4 ; 5634 5 IF (((.CHRS [0] AND %O'177') NEQ .CHRS [0]) AND .FLAG%8QUOTE) ; 5635 4 THEN ; 5636 5 BEGIN ; 5637 5 CHRS [0] = .CHRS [0] AND %O'177'; ; 5638 5 CHR%IDX = .CHR%IDX + 1; ; 5639 5 CHRS [.CHR%IDX] = .SEND%8QUOTE%CHR; ; 5640 4 END; ; 5641 4 ; 5642 3 END; ; 5643 3 ; 5644 3 RETURN .STATUS; ; 5645 2 END; ; GET%8%QUOTED%CHAR U.93: PUSHJ SP,U.92 ; 5627 MOVEM AC1,U.84 CAIE AC1,13 JRST L.385 LDB AC1,C.99 ; 5634 CAMN AC1,U.87 JRST L.385 MOVEI AC1,1 TDNN AC1,U.49 JRST L.385 LDB AC1,C.99 ; 5637 MOVEM AC1,U.87 AOS AC1,U.88 ; 5639 MOVE AC2,U.45 MOVEM AC2,U.87(AC1) L.385: MOVE AC1,U.84 ; 5625 POPJ SP, ; 5619 C.99: POINT 7,U.87,35 ; Routine Size: 18 words ; 5646 2 ! ; 5647 2 ! Start of code for BFR%FILL ; 5648 2 ! ; 5649 2 ! Initialize pointer and count ; 5650 2 ! ; 5651 2 SIZE = 0; ; 5652 2 IF .SEND%PKT%SIZE GTR 94 ! [108] ; 5653 2 THEN ! [108] ; 5654 3 BEGIN ! [108] ; 5655 3 POINTER = CH$PTR (SND%MSG, PKT%MSGX, CHR%SIZE); ! [108] ; 5656 3 MAX%SIZE = .SEND%PKT%SIZE - PKT%MSGX + 1 - (.BLK%CHK%TYPE - CHK%1CHAR); ; 5657 3 END ! [108] ; 5658 2 ELSE ! [108] ; 5659 3 BEGIN ! [108] ; 5660 3 POINTER = CH$PTR (SND%MSG, PKT%MSG, CHR%SIZE); ! [108] ; 5661 3 MAX%SIZE = .SEND%PKT%SIZE - PKT%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR); ; 5662 2 END; ! [108] ; 5663 2 ! ; 5664 2 ! If last call got an error or eof, return it now ; 5665 2 ! ; 5666 2 ; 5667 2 IF NOT .FIRST%FLAG AND (.STATUS NEQ KER%NORMAL) THEN RETURN .STATUS; ; 5668 2 ; 5669 2 ! ; 5670 2 ! If first time for a file prime the pump with the first character. ; 5671 2 ! ; 5672 2 ; 5673 2 IF .FIRST%FLAG ; 5674 2 THEN ; 5675 3 BEGIN ; 5676 3 FIRST%FLAG = FALSE; ; 5677 3 NEXT%CHR = -1; ! No backed up character ; 5678 3 ; 5679 3 IF .FLAG%8QUOTE THEN STATUS = GET%8%QUOTED%CHAR () ELSE STATUS = ; 5680 3 GET%QUOTED%CHAR (); ; 5681 3 ; 5682 3 IF .STATUS NEQ KER%NORMAL THEN RETURN .STATUS; ; 5683 3 ; 5684 3 OLD%CHAR%8%BIT = .CHAR%8%BIT; ; 5685 3 ; 5686 3 INCR OLD%CHR%IDX FROM 0 TO .CHR%IDX DO ; 5687 3 OLD%CHRS [.OLD%CHR%IDX] = .CHRS [.OLD%CHR%IDX]; ; 5688 3 ; 5689 3 OLD%CHR%IDX = .CHR%IDX; ; 5690 3 REPEAT%COUNT = 0; ! Character was not repeated yet ; 5691 3 ! Will always be incremented ; 5692 2 END; ; 5693 2 ; 5694 2 ! ; 5695 2 ! Otherwise, loop until we fill buffer ; 5696 2 ! ; 5697 2 ; 5698 2 WHILE .SIZE LSS .MAX%SIZE DO ! Normal exit is via an EXITLOOP ; 5699 3 BEGIN ; 5700 3 ! ; 5701 3 ! Check if we are doing run compression ; 5702 3 ! ; 5703 3 ; 5704 3 IF .FLAG%REPEAT ; 5705 3 THEN ; 5706 4 BEGIN ; 5707 4 ! ; 5708 4 ! Here with previous character in OLD%xxx. As long as we ; 5709 4 ! are getting the same character, just count the run. ; 5710 4 ! ; 5711 4 ; 5712 4 WHILE (.CHAR%8%BIT EQL .OLD%CHAR%8%BIT) AND (.REPEAT%COUNT LSS 94) DO ; 5713 5 BEGIN ; 5714 5 REPEAT%COUNT = .REPEAT%COUNT + 1; ; 5715 5 ; 5716 5 IF .FLAG%8QUOTE THEN STATUS = GET%8%QUOTED%CHAR () ELSE STATUS = ; 5717 5 GET%QUOTED%CHAR (); ; 5718 5 ; 5719 5 IF .STATUS NEQ KER%NORMAL ; 5720 5 THEN ; 5721 5 ; 5722 5 IF .STATUS NEQ KER%EOF ; 5723 5 THEN ; 5724 5 CHAR%8%BIT = NO%CHAR ; 5725 5 ELSE ; 5726 6 BEGIN ; 5727 6 CHAR%8%BIT = EOF%CHAR; ; 5728 6 CHR%IDX = -1; ; 5729 5 END; ; 5730 5 ; 5731 4 END; ; 5732 4 ; 5733 5 IF .OLD%CHR%IDX + 1 + 2 LSS ((.OLD%CHR%IDX + 1)*.REPEAT%COUNT) ; 5734 4 THEN ; 5735 5 BEGIN ; 5736 5 ; 5737 5 IF .SIZE + .OLD%CHR%IDX + 1 + 2 GTR .MAX%SIZE ; 5738 5 THEN ; 5739 6 BEGIN ; 5740 6 ; 5741 6 IF .CHAR%8%BIT EQL .OLD%CHAR%8%BIT ; 5742 6 THEN ; 5743 7 BEGIN ; 5744 7 NEXT%CHR = .CHAR%8%BIT; ; 5745 7 REPEAT%COUNT = .REPEAT%COUNT - 1; ; 5746 6 END; ; 5747 6 ; 5748 6 IF .CHAR%8%BIT EQL EOF%CHAR ; 5749 6 THEN ; 5750 7 BEGIN ; 5751 7 NEXT%CHR = EOF%CHAR; ! Remember EOF for next time ; 5752 7 STATUS = KER%NORMAL; ! And give good return now ; 5753 6 END; ; 5754 6 ; 5755 6 EXITLOOP; ; 5756 5 END; ; 5757 5 ; 5758 5 OLD%CHRS [.OLD%CHR%IDX + 1] = CHAR (.REPEAT%COUNT); ; 5759 5 OLD%CHRS [.OLD%CHR%IDX + 2] = .REPT%CHR; ; 5760 5 OLD%CHR%IDX = .OLD%CHR%IDX + 2; ; 5761 5 ! ; 5762 5 ! Count the number of file characters this represents ; 5763 5 ! ; 5764 5 SMSG%DATA%CHARS = .SMSG%DATA%CHARS + .REPEAT%COUNT - 1; ; 5765 5 FILE%CHARS = .FILE%CHARS + .REPEAT%COUNT - 1; ; 5766 5 REPEAT%COUNT = 1; ! Only one time for this string ; 5767 4 END; ; 5768 4 ; 5769 4 ! ; 5770 4 ! If we don't have enough room for this character, wait till next ; 5771 4 ! time. ; 5772 4 ! ; 5773 4 ; 5774 4 IF .SIZE + (.OLD%CHR%IDX + 1)*.REPEAT%COUNT GTR .MAX%SIZE ; 5775 4 THEN ; 5776 5 BEGIN ; 5777 5 ! If the next character is the same, the count will get incremented ; 5778 5 ! next time we enter, so back it off now. ; 5779 5 ; 5780 5 IF .CHAR%8%BIT EQL .OLD%CHAR%8%BIT ; 5781 5 THEN ; 5782 6 BEGIN ; 5783 6 NEXT%CHR = .CHAR%8%BIT; ; 5784 6 REPEAT%COUNT = .REPEAT%COUNT - 1; ; 5785 5 END; ; 5786 5 ! ; 5787 5 ! If this is the last character of the file, ; 5788 5 ! remember that for next time, but give good return now. ; 5789 5 ! ; 5790 5 IF .CHAR%8%BIT EQL EOF%CHAR ; 5791 5 THEN ; 5792 6 BEGIN ; 5793 6 NEXT%CHR = EOF%CHAR; ; 5794 6 STATUS = KER%NORMAL ; 5795 5 END; ; 5796 5 ; 5797 5 EXITLOOP; ; 5798 4 END; ; 5799 4 ; 5800 4 SMSG%DATA%CHARS = .SMSG%DATA%CHARS + .REPEAT%COUNT; ; 5801 4 FILE%CHARS = .FILE%CHARS + .REPEAT%COUNT; ; 5802 4 ; 5803 4 DECR REPEAT%COUNT FROM .REPEAT%COUNT TO 1 DO ; 5804 4 ; 5805 4 DECR I FROM .OLD%CHR%IDX TO 0 DO ; 5806 5 BEGIN ; 5807 5 CH$WCHAR%A (.OLD%CHRS [.I], POINTER); ; 5808 5 SIZE = .SIZE + 1; ; 5809 4 END; ; 5810 4 ; 5811 4 ! ; 5812 4 ! If we had to defer EOF condition, reactivate it now. ; 5813 4 ! ; 5814 4 IF (.CHAR%8%BIT EQL EOF%CHAR) THEN STATUS = KER%EOF; ; 5815 4 ! ; 5816 4 ! If we got an error (or EOF) then exit ; 5817 4 ! ; 5818 4 ; 5819 4 IF (.STATUS NEQ KER%NORMAL) THEN EXITLOOP; ; 5820 4 ; 5821 4 ! ; 5822 4 ! Otherwise, copy the character which broke the run ; 5823 4 ! ; 5824 4 OLD%CHAR%8%BIT = .CHAR%8%BIT; ; 5825 4 ; 5826 4 INCR OLD%CHR%IDX FROM 0 TO .CHR%IDX DO ; 5827 4 OLD%CHRS [.OLD%CHR%IDX] = .CHRS [.OLD%CHR%IDX]; ; 5828 4 ; 5829 4 OLD%CHR%IDX = .CHR%IDX; ; 5830 4 REPEAT%COUNT = 0; ; 5831 4 END ; 5832 3 ELSE ; 5833 3 ! ; 5834 3 ! Here if we are not doing run compression. We can do things much ; 5835 3 ! easier. ; 5836 3 ! ; 5837 4 BEGIN ; 5838 4 ; 5839 4 IF (.SIZE + .CHR%IDX + 1) GTR .MAX%SIZE THEN EXITLOOP; ; 5840 4 ; 5841 4 SMSG%DATA%CHARS = .SMSG%DATA%CHARS + 1; ; 5842 4 FILE%CHARS = .FILE%CHARS + 1; ; 5843 4 ; 5844 4 DECR CHR%IDX FROM .CHR%IDX TO 0 DO ; 5845 5 BEGIN ; 5846 5 CH$WCHAR%A (.CHRS [.CHR%IDX], POINTER); ; 5847 5 SIZE = .SIZE + 1; ; 5848 4 END; ; 5849 4 ; 5850 4 IF .FLAG%8QUOTE THEN STATUS = GET%8%QUOTED%CHAR () ELSE STATUS = ; 5851 4 GET%QUOTED%CHAR (); ; 5852 4 ; 5853 4 IF (.STATUS NEQ KER%NORMAL) THEN EXITLOOP; ; 5854 4 ; 5855 3 END; ; 5856 3 ; 5857 2 END; ; 5858 2 ; 5859 2 ! [108] Return negative size if we use extend packet format ; 5860 2 ; 5861 2 IF .SEND%PKT%SIZE GTR 94 ! [108] ; 5862 2 THEN ! [108] ; 5863 2 SIZE = -.SIZE; ! [108] ; 5864 2 ; 5865 2 ! ; 5866 2 ! Determine if we really stored anything into the buffer. ; 5867 2 ! ; 5868 2 ; 5869 2 IF .SIZE NEQ 0 THEN RETURN KER%NORMAL ELSE RETURN .STATUS; ; 5870 2 ; 5871 1 END; ! End of BFR%FILL ; BFR%FILL U.29: PUSH SP,AC14 ; 5485 PUSH SP,AC16 SETZM U.52 ; 5651 MOVE AC2,U.48 ; 5656 SUBI AC2,61 MOVE AC16,U.40 ; 5652 CAIG AC16,136 JRST L.386 MOVE AC14,C.66 ; 5655 MOVE AC1,AC16 ; 5656 SUB AC1,AC2 MOVE AC16,AC1 SUBI AC16,6 JRST L.387 ; 5652 L.386: MOVE AC14,C.32 ; 5660 SUB AC16,AC2 ; 5661 SUBI AC16,3 L.387: MOVE AC1,-3(SP) ; 5667 TRNE AC1,1 JRST L.388 MOVEI AC2,13 CAME AC2,U.84 JRST L.418 L.388: TRNN AC1,1 ; 5673 JRST L.394 SETZM -3(SP) ; 5676 SETOM U.83 ; 5677 MOVEI AC1,1 ; 5679 TDNN AC1,U.49 JRST L.389 PUSHJ SP,U.93 JRST L.390 L.389: PUSHJ SP,U.92 ; 5680 L.390: MOVEM AC1,U.84 CAIE AC1,13 ; 5682 JRST L.419 MOVE AC1,U.86 ; 5684 MOVEM AC1,U.89 SETO AC1, ; 5686 JRST L.392 L.391: MOVE AC2,U.87(AC1) ; 5687 MOVEM AC2,U.90(AC1) L.392: ADDI AC1,1 ; 5686 CAMG AC1,U.88 JRST L.391 L.393: MOVE AC1,U.88 ; 5689 MOVEM AC1,U.91 SETZM U.85 ; 5690 L.394: CAMG AC16,U.52 ; 5698 JRST L.417 MOVEI AC1,1 ; 5704 TDNN AC1,U.50 JRST L.412 L.395: MOVE AC1,U.86 ; 5712 CAME AC1,U.89 JRST L.399 MOVEI AC1,136 CAMG AC1,U.85 JRST L.399 AOS U.85 ; 5714 MOVEI AC1,1 ; 5716 TDNN AC1,U.49 JRST L.396 PUSHJ SP,U.93 JRST L.397 L.396: PUSHJ SP,U.92 ; 5717 L.397: MOVEM AC1,U.84 CAIN AC1,13 ; 5719 JRST L.395 CAIN AC1,113 ; 5722 JRST L.398 SETOM U.86 ; 5724 JRST L.395 ; 5722 L.398: HRROI AC1,-2 ; 5727 MOVEM AC1,U.86 SETOM U.88 ; 5728 JRST L.395 ; 5719 L.399: MOVE AC2,U.91 ; 5733 MOVE AC4,AC2 ADDI AC4,3 MOVE AC1,AC2 AOS AC3,AC1 IMUL AC3,U.85 CAML AC4,AC3 JRST L.402 MOVE AC3,U.52 ; 5737 ADD AC3,AC2 ADDI AC3,3 CAMG AC3,AC16 JRST L.401 MOVE AC3,U.86 ; 5741 CAME AC3,U.89 JRST L.400 MOVE AC3,U.86 ; 5744 MOVEM AC3,U.83 SOS U.85 ; 5745 L.400: HRROI AC3,-2 ; 5748 CAME AC3,U.86 JRST L.417 HRROI AC3,-2 ; 5751 MOVEM AC3,U.83 MOVEI AC3,13 ; 5752 MOVEM AC3,U.84 JRST L.417 ; 5748 L.401: MOVE AC3,U.85 ; 5758 ADDI AC3,40 MOVEM AC3,U.90(AC1) MOVE AC1,U.38 ; 5759 MOVEM AC1,U.90+2(AC2) MOVEI AC1,2 ; 5760 ADDM AC1,U.91 MOVE AC1,SMSG%DATA%CHARS ; 5764 ADD AC1,U.85 SUBI AC1,1 MOVEM AC1,SMSG%DATA%CHARS MOVE AC1,U.61 ; 5765 ADD AC1,U.85 SUBI AC1,1 MOVEM AC1,U.61 MOVEI AC1,1 ; 5766 MOVEM AC1,U.85 L.402: MOVE AC1,U.91 ; 5774 ADDI AC1,1 IMUL AC1,U.85 ADD AC1,U.52 CAMG AC1,AC16 JRST L.404 MOVE AC1,U.86 ; 5780 CAME AC1,U.89 JRST L.403 MOVE AC1,U.86 ; 5783 MOVEM AC1,U.83 SOS U.85 ; 5784 L.403: HRROI AC1,-2 ; 5790 CAME AC1,U.86 JRST L.417 HRROI AC1,-2 ; 5793 MOVEM AC1,U.83 MOVEI AC1,13 ; 5794 MOVEM AC1,U.84 JRST L.417 ; 5790 L.404: MOVE AC1,U.85 ; 5800 ADDM AC1,SMSG%DATA%CHARS MOVE AC1,U.85 ; 5801 ADDM AC1,U.61 MOVE AC3,U.85 ; 5803 AOJA AC3,L.408 L.405: MOVE AC1,U.91 ; 5805 AOJA AC1,L.407 L.406: MOVE AC2,U.90(AC1) ; 5807 IDPB AC2,AC14 AOS U.52 ; 5808 L.407: SOJGE AC1,L.406 ; 5805 L.408: SOJG AC3,L.405 ; 5803 HRROI AC1,-2 ; 5814 CAME AC1,U.86 JRST L.409 MOVEI AC1,113 MOVEM AC1,U.84 L.409: MOVEI AC1,13 ; 5819 CAME AC1,U.84 JRST L.417 MOVE AC1,U.86 ; 5824 MOVEM AC1,U.89 SETO AC1, ; 5826 JRST L.411 L.410: MOVE AC2,U.87(AC1) ; 5827 MOVEM AC2,U.90(AC1) L.411: ADDI AC1,1 ; 5826 CAMG AC1,U.88 JRST L.410 JRST L.393 L.412: MOVE AC1,U.52 ; 5839 ADD AC1,U.88 ADDI AC1,1 CAMLE AC1,AC16 JRST L.417 AOS SMSG%DATA%CHARS ; 5841 AOS U.61 ; 5842 MOVE AC1,U.88 ; 5844 AOJA AC1,L.414 L.413: MOVE AC2,U.87(AC1) ; 5846 IDPB AC2,AC14 AOS U.52 ; 5847 L.414: SOJGE AC1,L.413 ; 5844 MOVEI AC1,1 ; 5850 TDNN AC1,U.49 JRST L.415 PUSHJ SP,U.93 JRST L.416 L.415: PUSHJ SP,U.92 ; 5851 L.416: MOVEM AC1,U.84 MOVEI AC1,13 ; 5853 CAMN AC1,U.84 JRST L.394 ; 5698 L.417: MOVEI AC1,136 ; 5861 CAMGE AC1,U.40 MOVNS U.52 ; 5863 SKIPN U.52 ; 5869 JRST L.418 MOVEI AC1,13 JRST L.419 L.418: MOVE AC1,U.84 L.419: POP SP,AC16 ; 5485 POP SP,AC14 POPJ SP, ; Routine Size: 206 words ; 5872 1 %SBTTL 'BFR%EMPTY' ; 5873 1 ROUTINE BFR%EMPTY = ; 5874 1 ; 5875 1 !++ ; 5876 1 ! FUNCTIONAL DESCRIPTION: ; 5877 1 ! ; 5878 1 ! This routine will empty the data from the REC%MSG message buffer ; 5879 1 ! to the file. It will process quoting characters. ; 5880 1 ! ; 5881 1 ! CALLING SEQUENCE: ; 5882 1 ! ; 5883 1 ! Flag = BFR%EMPTY(); ; 5884 1 ! ; 5885 1 ! INPUT PARAMETERS: ; 5886 1 ! ; 5887 1 ! None. ; 5888 1 ! ; 5889 1 ! IMPLICIT INPUTS: ; 5890 1 ! ; 5891 1 ! None. ; 5892 1 ! ; 5893 1 ! OUTPUT PARAMETERS: ; 5894 1 ! ; 5895 1 ! True - No problems writing the file. ; 5896 1 ! False - I/O error writing the file. ; 5897 1 ! ; 5898 1 ! IMPLICIT OUTPUTS: ; 5899 1 ! ; 5900 1 ! None. ; 5901 1 ! ; 5902 1 ! COMPLETION CODES: ; 5903 1 ! ; 5904 1 ! None. ; 5905 1 ! ; 5906 1 ! SIDE EFFECTS: ; 5907 1 ! ; 5908 1 ! None. ; 5909 1 ! ; 5910 1 !-- ; 5911 1 ; 5912 2 BEGIN ; 5913 2 ; 5914 2 LOCAL ; 5915 2 STATUS, ! Status returned by various routines ; 5916 2 REPEAT%COUNT, ! Count of times to repeat character ; 5917 2 TURN%BIT%8%ON, ! If eight bit quoting ; 5918 2 COUNTER, ! Count of the characters left ; 5919 2 CHARACTER, ! Character we are processing ; 5920 2 POINTER; ! Pointer to the data ; 5921 2 ; 5922 2 POINTER = CH$PTR (REC%MSG, .RECV%PKT%MSG, CHR%SIZE); ! [108] ; 5923 2 COUNTER = 0; ; 5924 2 ; 5925 2 WHILE (.COUNTER LSS .REC%LENGTH) DO ; 5926 3 BEGIN ; 5927 3 CHARACTER = CH$RCHAR%A (POINTER); ; 5928 3 COUNTER = .COUNTER + 1; ; 5929 3 ! ; 5930 3 ! If the character is the repeat character (and we are doing repeat ; 5931 3 ! compression), then get the count. ; 5932 3 ! ; 5933 3 ; 5934 4 IF ((.CHARACTER EQL .REPT%CHR) AND .FLAG%REPEAT) ; 5935 3 THEN ; 5936 4 BEGIN ; 5937 4 REPEAT%COUNT = UNCHAR (CH$RCHAR%A (POINTER) AND %O'177'); ; 5938 4 CHARACTER = CH$RCHAR%A (POINTER); ; 5939 4 COUNTER = .COUNTER + 2; ; 5940 4 END ; 5941 3 ELSE ; 5942 3 REPEAT%COUNT = 1; ; 5943 3 ; 5944 3 ! ; 5945 3 ! If the character is an eight bit quoting character and we are doing eight ; 5946 3 ! bit quoting then turn on the flag so we turn the eighth bit on when we ; 5947 3 ! get the real character. ; 5948 3 ! ; 5949 3 ; 5950 4 IF ((.CHARACTER EQL .SEND%8QUOTE%CHR) AND .FLAG%8QUOTE) ; 5951 3 THEN ; 5952 4 BEGIN ; 5953 4 TURN%BIT%8%ON = TRUE; ; 5954 4 COUNTER = .COUNTER + 1; ; 5955 4 CHARACTER = CH$RCHAR%A (POINTER); ; 5956 4 END ; 5957 3 ELSE ; 5958 3 TURN%BIT%8%ON = FALSE; ; 5959 3 ; 5960 3 ! ; 5961 3 ! Now determine if we are quoting the character. If so then we must eat ; 5962 3 ! the quoting character and get the real character. ; 5963 3 ! ; 5964 3 ; 5965 3 IF .CHARACTER EQL .SEND%QUOTE%CHR ; 5966 3 ![035] Is this character other Kermit sends as quote? ; 5967 3 THEN ; 5968 4 BEGIN ; 5969 4 CHARACTER = CH$RCHAR%A (POINTER); ; 5970 4 COUNTER = .COUNTER + 1; ; 5971 4 ! ; 5972 4 ! Determine if we must undo what someone else has done to the character ; 5973 4 ! ; 5974 4 ; 5975 6 IF ((.CHARACTER AND %O'177') GEQ CTL (CHR%DEL)) AND ((.CHARACTER AND ; P 5976 5 %O'177') LEQ CTL ( ; 5977 5 CHR%DEL) + %O'40') ; 5978 4 THEN ; 5979 4 CHARACTER = CTL (.CHARACTER); ; 5980 4 ; 5981 3 END; ; 5982 3 ; 5983 3 ! ; 5984 3 ! Turn on the eight bit if needed and then write the character out ; 5985 3 ! ; 5986 3 ; 5987 3 IF .TURN%BIT%8%ON THEN CHARACTER = .CHARACTER OR %O'200'; ; 5988 3 ; 5989 3 RMSG%DATA%CHARS = .RMSG%DATA%CHARS + .REPEAT%COUNT; ; 5990 3 FILE%CHARS = .FILE%CHARS + .REPEAT%COUNT; ; 5991 3 ; 5992 3 DECR REPEAT%COUNT FROM .REPEAT%COUNT TO 1 DO ; 5993 4 BEGIN ; 5994 4 STATUS = (.PUT%CHR%ROUTINE) (.CHARACTER); ; 5995 4 ; 5996 4 IF NOT .STATUS THEN RETURN .STATUS; ; 5997 4 ; 5998 3 END; ; 5999 3 ; 6000 2 END; ; 6001 2 ; 6002 2 RETURN KER%NORMAL; ; 6003 1 END; ! End of BFR%EMPTY ; BFR%EMPTY U.28: PUSH SP,AC10 ; 5873 PUSH SP,AC11 PUSH SP,AC12 PUSH SP,AC13 PUSH SP,AC14 PUSH SP,AC16 MOVE AC1,C.27 ; 5922 MOVE AC14,U.39 ADJBP AC14,AC1 SETZ AC11, ; 5923 L.420: CAML AC11,U.57 ; 5925 JRST L.429 ILDB AC12,AC14 ; 5927 ADDI AC11,1 ; 5928 CAME AC12,U.38 ; 5934 JRST L.421 MOVEI AC2,1 TDNN AC2,U.50 JRST L.421 ILDB AC2,AC14 ; 5937 LDB AC13,C.97 SUBI AC13,40 ILDB AC12,AC14 ; 5938 ADDI AC11,2 ; 5939 JRST L.422 ; 5934 L.421: MOVEI AC13,1 ; 5942 L.422: CAME AC12,U.45 ; 5950 JRST L.423 MOVEI AC2,1 TDNN AC2,U.49 JRST L.423 MOVEI AC10,1 ; 5953 ADDI AC11,1 ; 5954 ILDB AC12,AC14 ; 5955 JRST L.424 ; 5950 L.423: SETZ AC10, ; 5958 L.424: CAME AC12,U.44 ; 5965 JRST L.425 ILDB AC12,AC14 ; 5969 ADDI AC11,1 ; 5970 LDB AC2,C.100 ; 5975 CAIL AC2,77 CAILE AC2,137 JRST L.425 TRC AC12,100 ; 5979 L.425: TRNE AC10,1 ; 5987 TRO AC12,200 ADDM AC13,RMSG%DATA%CHARS ; 5989 ADDM AC13,U.61 ; 5990 MOVE AC16,AC13 ; 5992 AOJA AC16,L.428 L.426: MOVE AC2,U.68 ; 5994 PUSH SP,AC12 PUSHJ SP,0(AC2) TRNE AC1,1 ; 5996 JRST L.427 ADJSP SP,-1 JRST L.430 L.427: ADJSP SP,-1 ; 5993 L.428: SOJG AC16,L.426 ; 5992 JRST L.420 ; 5925 L.429: MOVEI AC1,13 ; 5912 L.430: POP SP,AC16 ; 5873 POP SP,AC14 POP SP,AC13 POP SP,AC12 POP SP,AC11 POP SP,AC10 POPJ SP, C.100: POINT 7,AC12,35 ; Routine Size: 70 words ; 6004 1 %SBTTL 'Buffer filling and emptying subroutines' ; 6005 1 ROUTINE SET%STRING (POINTER, LENGTH, START) = ; 6006 1 ; 6007 1 !++ ; 6008 1 ! FUNCTIONAL DESCRIPTION: ; 6009 1 ! ; 6010 1 ! This routine is used to set up the buffer filling and emptying ; 6011 1 ! routines to use a string for input (or output) rather than ; 6012 1 ! the file I/O routines. ; 6013 1 ! ; 6014 1 ! CALLING SEQUENCE: ; 6015 1 ! ; 6016 1 ! SET%STRING (.POINTER, .LENGTH, .START) ; 6017 1 ! ; 6018 1 ! INPUT PARAMETERS: ; 6019 1 ! ; 6020 1 ! POINTER - Character pointer to string ; 6021 1 ! ; 6022 1 ! LENGTH - Number of characters in string ; 6023 1 ! ; 6024 1 ! START - True to start string, false to end it ; 6025 1 ! ; 6026 1 ! IMPLICIT INPUTS: ; 6027 1 ! ; 6028 1 ! None. ; 6029 1 ! ; 6030 1 ! OUPTUT PARAMETERS: ; 6031 1 ! ; 6032 1 ! Returns 0 if START = TRUE, actual number of characters used ; 6033 1 ! by last string if START = FALSE. ; 6034 1 ! ; 6035 1 ! IMPLICIT OUTPUTS: ; 6036 1 ! ; 6037 1 ! GET%CHR%ROUTINE and PUT%CHR%ROUTINE modifed so that string ; 6038 1 ! routines are called instead of file I/O. ; 6039 1 ! ; 6040 1 ! COMPLETION CODES: ; 6041 1 ! ; 6042 1 ! None. ; 6043 1 ! ; 6044 1 ! SIDE EFFECTS: ; 6045 1 ! ; 6046 1 ! None. ; 6047 1 ! ; 6048 1 !-- ; 6049 1 ; 6050 2 BEGIN ; 6051 2 ; 6052 2 OWN ; 6053 2 STR%POINTER, ! Pointer to string ; 6054 2 STR%LENGTH, ! Length of string ; 6055 2 STR%ORG%LENGTH, ! Original length of string ; 6056 2 OLD%GET%CHR, ! Old get-char routine ; 6057 2 OLD%PUT%CHR; ! Old put-char routine ; 6058 2 ; 6059 2 ! ; 6060 2 ! Routine to get a character from the string ; 6061 2 ! ; 6062 2 ROUTINE GET%STRING (CHAR%ADDRESS) = ; 6063 3 BEGIN ; 6064 3 ! ; 6065 3 ! If some characters are left, count down the length and get next character ; 6066 3 ! Otherwise return and end of file indication. ; 6067 3 ! ; 6068 3 ; 6069 3 IF .STR%LENGTH GTR 0 ; 6070 3 THEN ; 6071 4 BEGIN ; 6072 4 STR%LENGTH = .STR%LENGTH - 1; ; 6073 4 .CHAR%ADDRESS = CH$RCHAR%A (STR%POINTER); ; 6074 4 RETURN KER%NORMAL; ; 6075 4 END ; 6076 3 ELSE ; 6077 3 RETURN KER%EOF; ; 6078 3 ; 6079 2 END; ! End of GET%STRING RELOC 1046 ; STR%POINTER U.94: BLOCK 1 ; STR%LENGTH U.95: BLOCK 1 ; STR%ORG%LENGTH U.96: BLOCK 1 ; OLD%GET%CHR U.97: BLOCK 1 ; OLD%PUT%CHR U.98: BLOCK 1 RELOC 406433 ; GET%STRING U.99: SKIPG U.95 ; 6069 JRST L.431 SOS U.95 ; 6072 MOVE AC2,-1(SP) ; 6073 ILDB AC1,U.94 MOVEM AC1,0(AC2) MOVEI AC1,13 ; 6077 POPJ SP, L.431: MOVEI AC1,113 POPJ SP, ; 6062 ; Routine Size: 10 words ; 6080 2 ROUTINE PUT%STRING (CHAR%VALUE) = ; 6081 3 BEGIN ; 6082 3 ! ; 6083 3 ! If there is enough room to store another character, store the character ; 6084 3 ! and count it. Otherwise return a line too long indication. ; 6085 3 ! ; 6086 3 ; 6087 3 IF .STR%LENGTH GTR 0 ; 6088 3 THEN ; 6089 4 BEGIN ; 6090 4 STR%LENGTH = .STR%LENGTH - 1; ; 6091 4 CH$WCHAR%A (.CHAR%VALUE, STR%POINTER); ; 6092 4 RETURN KER%NORMAL; ; 6093 4 END ; 6094 3 ELSE ; 6095 3 RETURN KER%LINTOOLNG; ; 6096 3 ; 6097 2 END; ! End of PUT%STRING ; PUT%STRING U.100: SKIPG U.95 ; 6087 JRST L.432 SOS U.95 ; 6090 MOVE AC1,-1(SP) ; 6091 IDPB AC1,U.94 MOVEI AC1,13 ; 6095 POPJ SP, L.432: MOVEI AC1,102 POPJ SP, ; 6080 ; Routine Size: 9 words ; 6098 2 ! ; 6099 2 ! If we have a request to start a string (input or output), save the old ; 6100 2 ! routines and set up ours. Also save the string pointer and length for ; 6101 2 ! use by our get/put routines. ; 6102 2 ! Otherwise this is a request to stop using the string routines, so reset ; 6103 2 ! the old routines and return the actual number of characters read or ; 6104 2 ! written ; 6105 2 ! ; 6106 2 ; 6107 2 IF .START ; 6108 2 THEN ; 6109 3 BEGIN ; 6110 3 STR%POINTER = .POINTER; ; 6111 3 STR%ORG%LENGTH = .LENGTH; ; 6112 3 STR%LENGTH = .LENGTH; ; 6113 3 OLD%GET%CHR = .GET%CHR%ROUTINE; ; 6114 3 OLD%PUT%CHR = .PUT%CHR%ROUTINE; ; 6115 3 GET%CHR%ROUTINE = GET%STRING; ; 6116 3 PUT%CHR%ROUTINE = PUT%STRING; ; 6117 3 RETURN 0; ; 6118 3 END ; 6119 2 ELSE ; 6120 3 BEGIN ; 6121 3 GET%CHR%ROUTINE = .OLD%GET%CHR; ; 6122 3 PUT%CHR%ROUTINE = .OLD%PUT%CHR; ; 6123 3 RETURN .STR%ORG%LENGTH - .STR%LENGTH; ; 6124 2 END; ; 6125 2 ; 6126 1 END; ! End of SET%STRING ; SET%STRING U.30: MOVEI AC1,1 ; 6107 TDNN AC1,-1(SP) JRST L.433 MOVE AC1,-3(SP) ; 6110 MOVEM AC1,U.94 MOVE AC1,-2(SP) ; 6111 MOVEM AC1,U.96 MOVE AC1,-2(SP) ; 6112 MOVEM AC1,U.95 MOVE AC1,U.67 ; 6113 MOVEM AC1,U.97 MOVE AC1,U.68 ; 6114 MOVEM AC1,U.98 MOVEI AC1,U.99 ; 6115 MOVEM AC1,U.67 MOVEI AC1,U.100 ; 6116 MOVEM AC1,U.68 SETZ AC1, ; 6120 POPJ SP, L.433: MOVE AC1,U.97 ; 6121 MOVEM AC1,U.67 MOVE AC1,U.98 ; 6122 MOVEM AC1,U.68 MOVE AC1,U.96 ; 6123 SUB AC1,U.95 POPJ SP, ; 6005 ; Routine Size: 26 words ; 6127 1 %SBTTL 'Add parity routine' ; 6128 1 ROUTINE DO%PARITY (MESSAGE, LENGTH) : NOVALUE = ; 6129 1 ; 6130 1 !++ ; 6131 1 ! FUNCTIONAL DESCRIPTION: ; 6132 1 ! ; 6133 1 ! This routine will add parity for a complete message that is to be ; 6134 1 ! sent to the remote Kermit. ; 6135 1 ! ; 6136 1 ! CALLING SEQUENCE: ; 6137 1 ! ; 6138 1 ! DO%PARITY (Message%address, Message%length); ; 6139 1 ! ; 6140 1 ! INPUT PARAMETERS: ; 6141 1 ! ; 6142 1 ! Message%address - Address of the message to put parity on. ; 6143 1 ! Message%length - Lengtho of the message. ; 6144 1 ! ; 6145 1 ! IMPLICIT INPUTS: ; 6146 1 ! ; 6147 1 ! None. ; 6148 1 ! ; 6149 1 ! OUTPUT PARAMETERS: ; 6150 1 ! ; 6151 1 ! None. ; 6152 1 ! ; 6153 1 ! IMPLICIT OUTPUTS: ; 6154 1 ! ; 6155 1 ! None. ; 6156 1 ! ; 6157 1 ! COMPLETION CODES: ; 6158 1 ! ; 6159 1 ! None. ; 6160 1 ! ; 6161 1 ! SIDE EFFECTS: ; 6162 1 ! ; 6163 1 ! None. ; 6164 1 ! ; 6165 1 !-- ; 6166 1 ; 6167 2 BEGIN ; 6168 2 ; 6169 2 MAP ; 6170 2 MESSAGE : REF VECTOR [CH$ALLOCATION (MAX%MSG, CHR%SIZE)]; ; 6171 2 ; 6172 2 LOCAL ; 6173 2 POINTER; ! Point into the message ; 6174 2 ; 6175 2 IF NOT .DEV%PARITY%FLAG ; 6176 2 THEN ; 6177 3 BEGIN ; 6178 3 POINTER = CH$PTR (.MESSAGE,, CHR%SIZE); ; 6179 3 ; 6180 3 INCR I FROM 1 TO .LENGTH DO ; 6181 3 CH$WCHAR%A (GEN%PARITY (CH$RCHAR (.POINTER)), POINTER); ; 6182 3 ; 6183 2 END; ; 6184 2 ; 6185 1 END; ! End of DO%PARITY ; DO%PARITY U.22: PUSH SP,AC13 ; 6128 PUSH SP,AC14 PUSH SP,AC16 MOVEI AC1,1 ; 6175 TDNE AC1,DEV%PARITY%FLAG JRST L.436 MOVE AC1,-5(SP) ; 6178 MOVEI AC16,-1(AC1) HRLI AC16,41000 MOVE AC13,-4(SP) ; 6180 SETZ AC14, JRST L.435 L.434: MOVE AC1,AC16 ; 6181 ILDB AC1,AC1 PUSH SP,AC1 PUSHJ SP,U.23 IDPB AC1,AC16 ADJSP SP,-1 L.435: ADDI AC14,1 ; 6180 CAMG AC14,AC13 JRST L.434 L.436: POP SP,AC16 ; 6128 POP SP,AC14 POP SP,AC13 POPJ SP, ; Routine Size: 25 words ; 6186 1 %SBTTL 'Parity routine' ; 6187 1 ; 6188 1 GLOBAL ROUTINE GEN%PARITY (CHARACTER) = ; 6189 1 ; 6190 1 !++ ; 6191 1 ! FUNCTIONAL DESCRIPTION: ; 6192 1 ! ; 6193 1 ! This routine will add parity to the character that is supplied. ; 6194 1 ! ; 6195 1 ! CALLING SEQUENCE: ; 6196 1 ! ; 6197 1 ! CHARACTER = GEN%PARITY(CHARACTER) ; 6198 1 ! ; 6199 1 ! INPUT PARAMETERS: ; 6200 1 ! ; 6201 1 ! CHARACTER - Produce the parity for this character depending on the ; 6202 1 ! setting of the SET PARITY switch. ; 6203 1 ! ; 6204 1 ! IMPLICIT INPUTS: ; 6205 1 ! ; 6206 1 ! None. ; 6207 1 ! ; 6208 1 ! OUTPUT PARAMETERS: ; 6209 1 ! ; 6210 1 ! None. ; 6211 1 ! ; 6212 1 ! IMPLICIT OUTPUTS: ; 6213 1 ! ; 6214 1 ! None. ; 6215 1 ! ; 6216 1 ! COMPLETION CODES: ; 6217 1 ! ; 6218 1 ! None. ; 6219 1 ! ; 6220 1 ! SIDE EFFECTS: ; 6221 1 ! ; 6222 1 ! None. ; 6223 1 ! ; 6224 1 !-- ; 6225 1 ; 6226 2 BEGIN ; 6227 2 ; 6228 2 LOCAL ; 6229 2 TEMP%CHAR; ; 6230 2 ; 6231 2 ; 6232 2 CASE .PARITY%TYPE FROM PR%MIN TO PR%MAX OF ; 6233 2 SET ; 6234 2 ; 6235 2 [PR%NONE] : ; 6236 2 RETURN .CHARACTER; ; 6237 2 ; 6238 2 [PR%SPACE] : ; 6239 2 RETURN .CHARACTER AND %O'177'; ; 6240 2 ; 6241 2 [PR%MARK] : ; 6242 2 RETURN .CHARACTER OR %O'200'; ; 6243 2 ; 6244 2 [PR%ODD] : ; 6245 2 TEMP%CHAR = .CHARACTER AND %O'177' OR %O'200'; ; 6246 2 ; 6247 2 [PR%EVEN] : ; 6248 2 TEMP%CHAR = .CHARACTER AND %O'177'; ; 6249 2 TES; ; 6250 2 ; 6251 2 TEMP%CHAR = .TEMP%CHAR XOR (.TEMP%CHAR^-4); ; 6252 2 TEMP%CHAR = .TEMP%CHAR XOR (.TEMP%CHAR^-2); ; 6253 2 ; 6254 2 IF .TEMP%CHAR<0, 2> EQL %B'01' OR .TEMP%CHAR<0, 2> EQL %B'10' ; 6255 2 THEN ; 6256 2 RETURN .CHARACTER AND %O'177' OR %O'200' ; 6257 2 ELSE ; 6258 2 RETURN .CHARACTER AND %O'177'; ; 6259 2 ; 6260 1 END; ! End of GEN%PARITY U.23: GEN%PARITY:: MOVE AC3,-1(SP) ; 6236 MOVE AC1,PARITY%TYPE ; 6232 JRST L.437(AC1) L.437: JRST L.438 JRST L.439 JRST L.441 JRST L.440 JRST L.444 L.438: MOVE AC1,AC3 ; 6236 POPJ SP, L.439: MOVE AC1,AC3 ; 6242 JRST L.443 L.440: LDB AC1,C.101 ; 6245 TROA AC1,200 L.441: LDB AC1,C.101 ; 6248 MOVE AC2,AC1 ; 6251 ASH AC2,-4 XOR AC1,AC2 MOVE AC2,AC1 ; 6252 ASH AC2,-2 XOR AC1,AC2 ANDI AC1,3 ; 6254 CAIN AC1,1 JRST L.442 CAIE AC1,2 JRST L.444 L.442: LDB AC1,C.101 ; 6256 L.443: TROA AC1,200 L.444: LDB AC1,C.101 ; 6258 POPJ SP, ; 6188 C.101: POINT 7,AC3,35 ; Routine Size: 31 words ; 6261 1 ; 6262 1 %SBTTL 'Per transfer -- Initialization' ; 6263 1 ROUTINE INIT%XFR : NOVALUE = ; 6264 1 ; 6265 1 !++ ; 6266 1 ! FUNCTIONAL DESCRIPTION: ; 6267 1 ! ; 6268 1 ! This routine will initialize the various locations that the ; 6269 1 ! send and receive statistics are kept. ; 6270 1 ! ; 6271 1 ! CALLING SEQUENCE: ; 6272 1 ! ; 6273 1 ! INIT%XFR(); ; 6274 1 ! ; 6275 1 ! INPUT PARAMETERS: ; 6276 1 ! ; 6277 1 ! None. ; 6278 1 ! ; 6279 1 ! IMPLICIT INPUTS: ; 6280 1 ! ; 6281 1 ! None. ; 6282 1 ! ; 6283 1 ! OUTPUT PARAMETERS: ; 6284 1 ! ; 6285 1 ! None. ; 6286 1 ! ; 6287 1 ! IMPLICIT OUTPUTS: ; 6288 1 ! ; 6289 1 ! None. ; 6290 1 ! ; 6291 1 ! COMPLETION CODES: ; 6292 1 ! ; 6293 1 ! None. ; 6294 1 ! ; 6295 1 ! SIDE EFFECTS: ; 6296 1 ! ; 6297 1 ! None. ; 6298 1 ! ; 6299 1 !-- ; 6300 1 ; 6301 2 BEGIN ; 6302 2 ! ; 6303 2 ! Determine if we should do 8 bit quoting ; 6304 2 ! ; 6305 2 ; 6306 2 IF .PARITY%TYPE NEQ PR%NONE ; 6307 2 THEN ; 6308 3 BEGIN ; 6309 3 RECV%8QUOTE%CHR = .RCV%8QUOTE%CHR; ; 6310 3 END ; 6311 2 ELSE ; 6312 3 BEGIN ; 6313 3 RECV%8QUOTE%CHR = %C'Y'; ; 6314 2 END; ; 6315 2 ; 6316 2 NUM%RETRIES = 0; ; 6317 2 SEND%8QUOTE%CHR = .RECV%8QUOTE%CHR; ; 6318 2 ! ; 6319 2 ! Send parameters that may not get set before we need them for the first ; 6320 2 ! time. ; 6321 2 ! ; 6322 2 SEND%PKT%SIZE = ABS (.SND%PKT%SIZE); ; 6323 2 SEND%NPAD = ABS (.SND%NPAD); ; 6324 2 SEND%PADCHAR = ABS (.SND%PADCHAR); ; 6325 2 SEND%TIMEOUT = ABS (.SND%TIMEOUT); ; 6326 2 SEND%EOL = ABS (.SND%EOL); ; 6327 2 SEND%QUOTE%CHR = ABS (.SND%QUOTE%CHR); ; 6328 2 ! ; 6329 2 ! For initialization messages, we must use single character checksum ; 6330 2 ! When the send-init/ack sequence has been done, we will switch to the ; 6331 2 ! desired form ; 6332 2 ! ; 6333 2 BLK%CHK%TYPE = CHK%1CHAR; ; 6334 2 INI%CHK%TYPE = .CHKTYPE; ! Send desired type ; 6335 2 ! ; 6336 2 ! Set desired repeat character for use in we are doing send-init ; 6337 2 ! Will be overwritten by other ends desired character if it sends ; 6338 2 ! the send-init. ; 6339 2 ! ; 6340 2 REPT%CHR = .SET%REPT%CHR; ; 6341 2 ! ; 6342 2 ! Assume packet assembly/disassembly uses characters from a file ; 6343 2 ! ; 6344 2 GET%CHR%ROUTINE = GET%FILE; ! Initialize the get-a-char routine ; 6345 2 PUT%CHR%ROUTINE = PUT%FILE; ! And the put-a-char ; 6346 2 TEXT%HEAD%FLAG = FALSE; ! And assume we will get an File header ; 6347 2 NO%FILE%NEEDED = FALSE; ! Assume will do file ops ; 6348 2 INIT%PKT%SENT = FALSE; ! And no server-init sent ; 6349 2 ! ; 6350 2 ! Always start with packet number 0 ; 6351 2 ! ; 6352 2 MSG%NUMBER = 0; ! Initial message number ; 6353 2 ! ; 6354 2 ! Stats information ; 6355 2 ! ; 6356 2 SMSG%TOTAL%CHARS = 0; ; 6357 2 RMSG%TOTAL%CHARS = 0; ; 6358 2 SMSG%DATA%CHARS = 0; ; 6359 2 RMSG%DATA%CHARS = 0; ; 6360 2 SMSG%COUNT = 0; ; 6361 2 RMSG%COUNT = 0; ; 6362 2 RMSG%NAKS = 0; ; 6363 2 SMSG%NAKS = 0; ; 6364 2 XFR%TIME = SY%TIME (); ; 6365 1 END; ! End of INIT%XFR ; INIT%XFR U.32: SKIPE PARITY%TYPE ; 6306 SKIPA AC1,RCV%8QUOTE%CHR ; 6309 MOVEI AC1,131 ; 6313 MOVEM AC1,U.37 SETZM U.54 ; 6316 MOVE AC1,U.37 ; 6317 MOVEM AC1,U.45 MOVE AC1,SND%PKT%SIZE ; 6322 MOVMM AC1,U.40 MOVE AC1,SND%NPAD ; 6323 MOVMM AC1,U.41 MOVE AC1,SND%PADCHAR ; 6324 MOVMM AC1,U.42 MOVE AC1,SND%TIMEOUT ; 6325 MOVMM AC1,SEND%TIMEOUT MOVE AC1,SND%EOL ; 6326 MOVMM AC1,U.43 MOVE AC1,SND%QUOTE%CHR ; 6327 MOVMM AC1,U.44 MOVEI AC1,61 ; 6333 MOVEM AC1,U.48 MOVE AC1,CHKTYPE ; 6334 MOVEM AC1,U.47 MOVE AC1,SET%REPT%CHR ; 6340 MOVEM AC1,U.38 MOVEI AC1,GET%FILE ; 6344 MOVEM AC1,U.67 MOVEI AC1,PUT%FILE ; 6345 MOVEM AC1,U.68 SETZM U.62 ; 6346 SETZM U.63 ; 6347 SETZM U.64 ; 6348 SETZM U.55 ; 6352 SETZM SMSG%TOTAL%CHARS ; 6356 SETZM RMSG%TOTAL%CHARS ; 6357 SETZM SMSG%DATA%CHARS ; 6358 SETZM RMSG%DATA%CHARS ; 6359 SETZM SMSG%COUNT ; 6360 SETZM RMSG%COUNT ; 6361 SETZM RMSG%NAKS ; 6362 SETZM SMSG%NAKS ; 6363 PUSHJ SP,SY%TIME ; 6364 MOVEM AC1,XFR%TIME POPJ SP, ; 6263 ; Routine Size: 44 words ; 6366 1 %SBTTL 'Statistics -- Finish message transfer' ; 6367 1 ROUTINE END%STATS : NOVALUE = ; 6368 1 ; 6369 1 !++ ; 6370 1 ! FUNCTIONAL DESCRIPTION: ; 6371 1 ! ; 6372 1 ! This routine will end the collection of the statistices. It will ; 6373 1 ! update the various overall statistic parameters. ; 6374 1 ! ; 6375 1 ! CALLING SEQUENCE: ; 6376 1 ! ; 6377 1 ! END%STATS (); ; 6378 1 ! ; 6379 1 ! INPUT PARAMETERS: ; 6380 1 ! ; 6381 1 ! None. ; 6382 1 ! ; 6383 1 ! IMPLICIT INPUTS: ; 6384 1 ! ; 6385 1 ! None. ; 6386 1 ! ; 6387 1 ! OUTPUT PARAMETERS: ; 6388 1 ! ; 6389 1 ! None. ; 6390 1 ! ; 6391 1 ! IMPLICIT OUTPUTS: ; 6392 1 ! ; 6393 1 ! None. ; 6394 1 ! ; 6395 1 ! COMPLETION CODES: ; 6396 1 ! ; 6397 1 ! None. ; 6398 1 ! ; 6399 1 ! SIDE EFFECTS: ; 6400 1 ! ; 6401 1 ! None. ; 6402 1 ! ; 6403 1 !-- ; 6404 1 ; 6405 2 BEGIN ; 6406 2 SND%COUNT = .SND%COUNT + .SMSG%COUNT; ; 6407 2 RCV%COUNT = .RCV%COUNT + .RMSG%COUNT; ; 6408 2 SND%TOTAL%CHARS = .SND%TOTAL%CHARS + .SMSG%TOTAL%CHARS; ; 6409 2 SND%DATA%CHARS = .SND%DATA%CHARS + .SMSG%DATA%CHARS; ; 6410 2 RCV%TOTAL%CHARS = .RCV%TOTAL%CHARS + .RMSG%TOTAL%CHARS; ; 6411 2 RCV%DATA%CHARS = .RCV%DATA%CHARS + .RMSG%DATA%CHARS; ; 6412 2 SND%NAKS = .SND%NAKS + .SMSG%NAKS; ; 6413 2 RCV%NAKS = .RCV%NAKS + .RMSG%NAKS; ; 6414 2 XFR%TIME = SY%TIME () - .XFR%TIME; ; 6415 2 TOTAL%TIME = .TOTAL%TIME + .XFR%TIME; ; 6416 1 END; ! End of END%STATS ; END%STATS U.18: MOVE AC1,SMSG%COUNT ; 6406 ADDM AC1,SND%COUNT MOVE AC1,RMSG%COUNT ; 6407 ADDM AC1,RCV%COUNT MOVE AC1,SMSG%TOTAL%CHARS ; 6408 ADDM AC1,SND%TOTAL%CHARS MOVE AC1,SMSG%DATA%CHARS ; 6409 ADDM AC1,SND%DATA%CHARS MOVE AC1,RMSG%TOTAL%CHARS ; 6410 ADDM AC1,RCV%TOTAL%CHARS MOVE AC1,RMSG%DATA%CHARS ; 6411 ADDM AC1,RCV%DATA%CHARS MOVE AC1,SMSG%NAKS ; 6412 ADDM AC1,SND%NAKS MOVE AC1,RMSG%NAKS ; 6413 ADDM AC1,RCV%NAKS PUSHJ SP,SY%TIME ; 6414 SUBB AC1,XFR%TIME ADDM AC1,TOTAL%TIME ; 6415 POPJ SP, ; 6367 ; Routine Size: 20 words ; 6417 1 %SBTTL 'Status type out -- STS%OUTPUT' ; 6418 1 ROUTINE STS%OUTPUT : NOVALUE = ; 6419 1 ; 6420 1 !++ ; 6421 1 ! FUNCTIONAL DESCRIPTION: ; 6422 1 ! ; 6423 1 ! This routine will output the current status of a transfer. ; 6424 1 ! This is used when the user types a ^A during a transfer. ; 6425 1 ! ; 6426 1 ! CALLING SEQUENCE: ; 6427 1 ! ; 6428 1 ! STS%OUTPUT () ; 6429 1 ! ; 6430 1 ! INPUT PARAMETERS: ; 6431 1 ! ; 6432 1 ! None. ; 6433 1 ! ; 6434 1 ! IMPLICIT INPUTS: ; 6435 1 ! ; 6436 1 ! Statistics blocks, file names, etc. ; 6437 1 ! ; 6438 1 ! OUPTUT PARAMETERS: ; 6439 1 ! ; 6440 1 ! None. ; 6441 1 ! ; 6442 1 ! IMPLICIT OUTPUTS: ; 6443 1 ! ; 6444 1 ! None. ; 6445 1 ! ; 6446 1 ! COMPLETION CODES: ; 6447 1 ! ; 6448 1 ! None. ; 6449 1 ! ; 6450 1 ! SIDE EFFECTS: ; 6451 1 ! ; 6452 1 ! None. ; 6453 1 ! ; 6454 1 !-- ; 6455 1 ; 6456 2 BEGIN ; 6457 2 TT%CHAR (%C'['); ! Start the message ; 6458 2 ; 6459 2 CASE .STATE FROM STATE%MIN TO STATE%MAX OF ; 6460 2 SET ; 6461 2 ; 6462 2 [STATE%ID, STATE%II] : ; 6463 2 TT%TEXT (UPLIT (%ASCIZ'Idle in server mode')); ; 6464 2 ; 6465 2 [STATE%S, STATE%SF] : ; 6466 3 BEGIN ; 6467 3 TT%TEXT (UPLIT (%ASCIZ'Initializing for sending file ')); ; 6468 3 TT%TEXT (FILE%NAME); ; 6469 2 END; ; 6470 2 ; 6471 2 [STATE%SI] : ; 6472 2 TT%TEXT (UPLIT (%ASCIZ'Initializing for remote command')); ; 6473 2 ; 6474 2 [STATE%SG] : ; 6475 2 TT%TEXT (UPLIT (%ASCIZ'Waiting for response to remote command')); ; 6476 2 ; 6477 2 [STATE%SD] : ; 6478 3 BEGIN ; 6479 3 TT%NUMBER (.FILE%CHARS); ; 6480 3 TT%TEXT (UPLIT (%ASCIZ' characters sent for file ')); ; 6481 3 TT%TEXT (FILE%NAME); ; 6482 2 END; ; 6483 2 ; 6484 2 [STATE%SZ] : ; 6485 3 BEGIN ; 6486 3 TT%TEXT (UPLIT (%ASCIZ'At end of file ')); ; 6487 3 TT%TEXT (FILE%NAME); ; 6488 2 END; ; 6489 2 ; 6490 2 [STATE%SB] : ; 6491 2 TT%TEXT (UPLIT (%ASCIZ'Finishing transfer session')); ; 6492 2 ; 6493 2 [STATE%R] : ; 6494 2 TT%TEXT (UPLIT (%ASCIZ'Waiting for initialization')); ; 6495 2 ; 6496 2 [STATE%RF] : ; 6497 2 TT%TEXT (UPLIT (%ASCIZ'Waiting for next file or end of session')); ; 6498 2 ; 6499 2 [STATE%RD] : ; 6500 3 BEGIN ; 6501 3 TT%NUMBER (.FILE%CHARS); ; 6502 3 TT%TEXT (UPLIT (%ASCIZ' characters received for file ')); ; 6503 3 TT%TEXT (FILE%NAME); ; 6504 2 END; ; 6505 2 ; 6506 2 [STATE%C] : ; 6507 2 TT%TEXT (UPLIT (%ASCIZ' Session complete')); ; 6508 2 ; 6509 2 [STATE%A] : ; 6510 2 TT%TEXT (UPLIT (%ASCIZ' Session aborted')); ; 6511 2 ; 6512 2 [INRANGE, OUTRANGE] : ; 6513 2 TT%TEXT (UPLIT (%ASCIZ' Unknown state')); ; 6514 2 TES; ; 6515 2 ; 6516 2 SELECTONE .STATE OF ; 6517 2 SET ; 6518 2 ; 6519 2 [STATE%S, STATE%SF, STATE%SD, STATE%SZ, STATE%SB] : ; 6520 3 BEGIN ; 6521 3 ; 6522 3 IF .RMSG%NAKS GTR 0 ; 6523 3 THEN ; 6524 4 BEGIN ; 6525 4 TT%TEXT (UPLIT (%ASCIZ', ')); ; 6526 4 TT%NUMBER (.RMSG%NAKS); ; 6527 4 TT%TEXT (UPLIT (%ASCIZ' NAKs received')); ; 6528 3 END; ; 6529 3 ; 6530 2 END; ; 6531 2 ; 6532 2 [STATE%R, STATE%RF, STATE%RD] : ; 6533 3 BEGIN ; 6534 3 ; 6535 3 IF .SMSG%NAKS GTR 0 ; 6536 3 THEN ; 6537 4 BEGIN ; 6538 4 TT%TEXT (UPLIT (%ASCIZ', ')); ; 6539 4 TT%NUMBER (.SMSG%NAKS); ; 6540 4 TT%TEXT (UPLIT (%ASCIZ' NAKs sent')); ; 6541 3 END; ; 6542 3 ; 6543 2 END; ; 6544 2 TES; ; 6545 2 ; 6546 2 TT%CHAR (%C']'); ! End the line ; 6547 2 TT%CRLF (); ! with a CRLF ; 6548 1 END; ! End of STS%OUTPUT P.AAO: BYTE (7)"I","d","l","e"," " BYTE (7)"i","n"," ","s","e" BYTE (7)"r","v","e","r"," " BYTE (7)"m","o","d","e",000 P.AAP: BYTE (7)"I","n","i","t","i" BYTE (7)"a","l","i","z","i" BYTE (7)"n","g"," ","f","o" BYTE (7)"r"," ","s","e","n" BYTE (7)"d","i","n","g"," " BYTE (7)"f","i","l","e"," " BYTE (7)000,000,000,000,000 P.AAQ: BYTE (7)"I","n","i","t","i" BYTE (7)"a","l","i","z","i" BYTE (7)"n","g"," ","f","o" BYTE (7)"r"," ","r","e","m" BYTE (7)"o","t","e"," ","c" BYTE (7)"o","m","m","a","n" BYTE (7)"d",000,000,000,000 P.AAR: BYTE (7)"W","a","i","t","i" BYTE (7)"n","g"," ","f","o" BYTE (7)"r"," ","r","e","s" BYTE (7)"p","o","n","s","e" BYTE (7)" ","t","o"," ","r" BYTE (7)"e","m","o","t","e" BYTE (7)" ","c","o","m","m" BYTE (7)"a","n","d",000,000 P.AAS: BYTE (7)" ","c","h","a","r" BYTE (7)"a","c","t","e","r" BYTE (7)"s"," ","s","e","n" BYTE (7)"t"," ","f","o","r" BYTE (7)" ","f","i","l","e" BYTE (7)" ",000,000,000,000 P.AAT: BYTE (7)"A","t"," ","e","n" BYTE (7)"d"," ","o","f"," " BYTE (7)"f","i","l","e"," " BYTE (7)000,000,000,000,000 P.AAU: BYTE (7)"F","i","n","i","s" BYTE (7)"h","i","n","g"," " BYTE (7)"t","r","a","n","s" BYTE (7)"f","e","r"," ","s" BYTE (7)"e","s","s","i","o" BYTE (7)"n",000,000,000,000 P.AAV: BYTE (7)"W","a","i","t","i" BYTE (7)"n","g"," ","f","o" BYTE (7)"r"," ","i","n","i" BYTE (7)"t","i","a","l","i" BYTE (7)"z","a","t","i","o" BYTE (7)"n",000,000,000,000 P.AAW: BYTE (7)"W","a","i","t","i" BYTE (7)"n","g"," ","f","o" BYTE (7)"r"," ","n","e","x" BYTE (7)"t"," ","f","i","l" BYTE (7)"e"," ","o","r"," " BYTE (7)"e","n","d"," ","o" BYTE (7)"f"," ","s","e","s" BYTE (7)"s","i","o","n",000 P.AAX: BYTE (7)" ","c","h","a","r" BYTE (7)"a","c","t","e","r" BYTE (7)"s"," ","r","e","c" BYTE (7)"e","i","v","e","d" BYTE (7)" ","f","o","r"," " BYTE (7)"f","i","l","e"," " BYTE (7)000,000,000,000,000 P.AAY: BYTE (7)" ","S","e","s","s" BYTE (7)"i","o","n"," ","c" BYTE (7)"o","m","p","l","e" BYTE (7)"t","e",000,000,000 P.AAZ: BYTE (7)" ","S","e","s","s" BYTE (7)"i","o","n"," ","a" BYTE (7)"b","o","r","t","e" BYTE (7)"d",000,000,000,000 P.ABA: BYTE (7)" ","U","n","k","n" BYTE (7)"o","w","n"," ","s" BYTE (7)"t","a","t","e",000 P.ABB: BYTE (7)","," ",000,000,000 P.ABC: BYTE (7)" ","N","A","K","s" BYTE (7)" ","r","e","c","e" BYTE (7)"i","v","e","d",000 P.ABD: BYTE (7)","," ",000,000,000 P.ABE: BYTE (7)" ","N","A","K","s" BYTE (7)" ","s","e","n","t" BYTE (7)000,000,000,000,000 ; STS%OUTPUT U.33: PUSH SP,C.102 ; 6457 PUSHJ SP,TT%CHAR MOVE AC1,U.51 ; 6459 SOJL AC1,L.446 CAIGE AC1,24 JRST L.445(AC1) JRST L.446 L.445: JRST L.448 JRST L.448 JRST L.451 JRST L.452 JRST L.454 JRST L.455 JRST L.456 JRST L.457 JRST L.459 JRST L.460 JRST L.446 JRST L.450 JRST L.449 JRST L.447 JRST L.447 JRST L.446 JRST L.446 JRST L.446 JRST L.446 JRST L.446 L.446: PUSH SP,C.103 ; 6513 JRST L.461 L.447: PUSH SP,C.104 ; 6463 JRST L.461 L.448: PUSH SP,C.105 ; 6467 JRST L.453 L.449: PUSH SP,C.106 ; 6472 JRST L.461 L.450: PUSH SP,C.107 ; 6475 JRST L.461 L.451: PUSH SP,U.61 ; 6479 PUSHJ SP,TT%NUMBER PUSH SP,C.108 ; 6480 JRST L.458 L.452: PUSH SP,C.109 ; 6486 L.453: PUSHJ SP,TT%TEXT PUSH SP,C.34 ; 6487 PUSHJ SP,TT%TEXT ADJSP SP,-1 ; 6485 JRST L.462 ; 6459 L.454: PUSH SP,C.110 ; 6491 JRST L.461 L.455: PUSH SP,C.111 ; 6494 JRST L.461 L.456: PUSH SP,C.112 ; 6497 JRST L.461 L.457: PUSH SP,U.61 ; 6501 PUSHJ SP,TT%NUMBER PUSH SP,C.113 ; 6502 L.458: PUSHJ SP,TT%TEXT PUSH SP,C.34 ; 6503 PUSHJ SP,TT%TEXT ADJSP SP,-2 ; 6500 JRST L.462 ; 6459 L.459: PUSH SP,C.114 ; 6507 JRST L.461 L.460: PUSH SP,C.115 ; 6510 L.461: PUSHJ SP,TT%TEXT L.462: MOVE AC1,U.51 ; 6516 JUMPLE AC1,L.463 ; 6519 CAILE AC1,5 JRST L.463 SKIPG RMSG%NAKS ; 6522 JRST L.465 PUSH SP,C.116 ; 6525 PUSHJ SP,TT%TEXT PUSH SP,RMSG%NAKS ; 6526 PUSHJ SP,TT%NUMBER PUSH SP,C.117 ; 6527 JRST L.464 L.463: CAIL AC1,6 ; 6532 CAILE AC1,10 JRST L.465 SKIPG SMSG%NAKS ; 6535 JRST L.465 PUSH SP,C.118 ; 6538 PUSHJ SP,TT%TEXT PUSH SP,SMSG%NAKS ; 6539 PUSHJ SP,TT%NUMBER PUSH SP,C.119 ; 6540 L.464: PUSHJ SP,TT%TEXT ADJSP SP,-3 ; 6537 L.465: PUSH SP,C.120 ; 6546 PUSHJ SP,TT%CHAR PUSHJ SP,TT%CRLF ; 6547 ADJSP SP,-3 ; 6456 POPJ SP, ; 6418 C.102: EXP 133 C.103: XWD 0,P.ABA C.104: XWD 0,P.AAO C.105: XWD 0,P.AAP C.106: XWD 0,P.AAQ C.107: XWD 0,P.AAR C.108: XWD 0,P.AAS C.109: XWD 0,P.AAT C.110: XWD 0,P.AAU C.111: XWD 0,P.AAV C.112: XWD 0,P.AAW C.113: XWD 0,P.AAX C.114: XWD 0,P.AAY C.115: XWD 0,P.AAZ C.116: XWD 0,P.ABB C.117: XWD 0,P.ABC C.118: XWD 0,P.ABD C.119: XWD 0,P.ABE C.120: EXP 135 ; Routine Size: 113 words ; 6549 1 %SBTTL 'TYPE%CHAR - Type out a character' ; 6550 1 ROUTINE TYPE%CHAR (CHARACTER) = ; 6551 1 ; 6552 1 !++ ; 6553 1 ! FUNCTIONAL DESCRIPTION: ; 6554 1 ! ; 6555 1 ! This routine is used as an alternate output routine for BFR%EMPTY. ; 6556 1 ! It will type the character on the terminal, and always return a ; 6557 1 ! true status. ; 6558 1 ! ; 6559 1 ! CALLING SEQUENCE: ; 6560 1 ! ; 6561 1 ! STATUS = TYPE%CHAR (.CHARACTER); ; 6562 1 ! ; 6563 1 ! INPUT PARAMETERS: ; 6564 1 ! ; 6565 1 ! CHARACTER - The character to type ; 6566 1 ! ; 6567 1 ! IMPLICIT INPUTS: ; 6568 1 ! ; 6569 1 ! None. ; 6570 1 ! ; 6571 1 ! OUPTUT PARAMETERS: ; 6572 1 ! ; 6573 1 ! None. ; 6574 1 ! ; 6575 1 ! IMPLICIT OUTPUTS: ; 6576 1 ! ; 6577 1 ! None. ; 6578 1 ! ; 6579 1 ! COMPLETION CODES: ; 6580 1 ! ; 6581 1 ! None. ; 6582 1 ! ; 6583 1 ! SIDE EFFECTS: ; 6584 1 ! ; 6585 1 ! None. ; 6586 1 ! ; 6587 1 !-- ; 6588 1 ; 6589 2 BEGIN ; 6590 2 TT%CHAR (.CHARACTER); ! Type the character ; 6591 2 RETURN KER%NORMAL; ! And return OK ; 6592 1 END; ! End of TYPE%CHAR ; TYPE%CHAR U.31: PUSH SP,-1(SP) ; 6590 PUSHJ SP,TT%CHAR ADJSP SP,-1 ; 6591 MOVEI AC1,13 ; 6589 POPJ SP, ; 6550 ; Routine Size: 5 words ; 6593 1 %SBTTL 'Debugging -- DBG%SEND' ; 6594 1 ROUTINE DBG%SEND (ADDRESS, LENGTH) : NOVALUE = ; 6595 1 ; 6596 1 !++ ; 6597 1 ! FUNCTIONAL DESCRIPTION: ; 6598 1 ! ; 6599 1 ! This routine will output the message that is going to be sent ; 6600 1 ! as part of the debugging information that is turned on in the ; 6601 1 ! SET DEBUG command. ; 6602 1 ! ; 6603 1 ! CALLING SEQUENCE: ; 6604 1 ! ; 6605 1 ! DBG%SEND(MSG%ADDRESS, MSG%LENGTH); ; 6606 1 ! ; 6607 1 ! INPUT PARAMETERS: ; 6608 1 ! ; 6609 1 ! MSG%ADDRESS - Address of the message that is going to be sent ; 6610 1 ! to the remote KERMIT. The bytes are CHR%SIZE. ; 6611 1 ! MSG%LENGTH - Length of the message. ; 6612 1 ! ; 6613 1 ! IMPLICIT INPUTS: ; 6614 1 ! ; 6615 1 ! None. ; 6616 1 ! ; 6617 1 ! OUTPUT PARAMETERS: ; 6618 1 ! ; 6619 1 ! None. ; 6620 1 ! ; 6621 1 ! IMPLICIT OUTPUTS: ; 6622 1 ! ; 6623 1 ! None. ; 6624 1 ! ; 6625 1 ! COMPLETION CODES: ; 6626 1 ! ; 6627 1 ! None. ; 6628 1 ! ; 6629 1 ! SIDE EFFECTS: ; 6630 1 ! ; 6631 1 ! None. ; 6632 1 ! ; 6633 1 !-- ; 6634 1 ; 6635 2 BEGIN ; 6636 2 ; 6637 2 BIND ; 6638 2 SEND%TEXT = UPLIT (%ASCIZ'Sending...'); ; 6639 2 ; 6640 2 IF .DEBUG%FLAG ; 6641 2 THEN ; 6642 3 BEGIN ; 6643 3 ; 6644 3 LOCAL ; 6645 3 OLD%RTN; ; 6646 3 ; 6647 3 OLD%RTN = TT%SET%OUTPUT (DBG%DUMP); ; 6648 3 TT%TEXT (SEND%TEXT); ; 6649 3 DBG%MESSAGE (.ADDRESS, .LENGTH); ; 6650 3 TT%SET%OUTPUT (.OLD%RTN); ; 6651 2 END; ; 6652 2 ; 6653 1 END; ! End of DBG%SEND P.ABF: BYTE (7)"S","e","n","d","i" BYTE (7)"n","g",".",".","." BYTE (7)000,000,000,000,000 ; SEND%TEXT U.102= P.ABF ; DBG%SEND U.35: PUSH SP,AC16 ; 6594 MOVEI AC1,1 ; 6640 TDNN AC1,DEBUG%FLAG JRST L.466 PUSH SP,C.88 ; 6647 PUSHJ SP,TT%SET%OUTPUT MOVE AC16,AC1 PUSH SP,C.121 ; 6648 PUSHJ SP,TT%TEXT PUSH SP,-5(SP) ; 6649 PUSH SP,-5(SP) PUSHJ SP,U.34 MOVEM AC16,0(SP) ; 6650 PUSHJ SP,TT%SET%OUTPUT ADJSP SP,-4 ; 6642 L.466: POP SP,AC16 ; 6594 POPJ SP, C.121: XWD 0,U.102 ; Routine Size: 18 words ; 6654 1 %SBTTL 'Debugging -- DBG%RECEIVE' ; 6655 1 ROUTINE DBG%RECEIVE (ADDRESS) : NOVALUE = ; 6656 1 ; 6657 1 !++ ; 6658 1 ! FUNCTIONAL DESCRIPTION: ; 6659 1 ! ; 6660 1 ! This routine will output the message that was received from ; 6661 1 ! the remote KERMIT. This routine is called only if the DEBUG%FLAG ; 6662 1 ! is true. ; 6663 1 ! ; 6664 1 ! CALLING SEQUENCE: ; 6665 1 ! ; 6666 1 ! DBG%RECEIVE(MSG%ADDRESS); ; 6667 1 ! ; 6668 1 ! INPUT PARAMETERS: ; 6669 1 ! ; 6670 1 ! MSG%ADDRESS - Address of the message received by the remote KERMIT. ; 6671 1 ! ; 6672 1 ! IMPLICIT INPUTS: ; 6673 1 ! ; 6674 1 ! None. ; 6675 1 ! ; 6676 1 ! OUTPUT PARAMETERS: ; 6677 1 ! ; 6678 1 ! None. ; 6679 1 ! ; 6680 1 ! IMPLICIT OUTPUTS: ; 6681 1 ! ; 6682 1 ! None. ; 6683 1 ! ; 6684 1 ! COMPLETION CODES: ; 6685 1 ! ; 6686 1 ! None. ; 6687 1 ! ; 6688 1 ! SIDE EFFECTS: ; 6689 1 ! ; 6690 1 ! None. ; 6691 1 ! ; 6692 1 !-- ; 6693 1 ; 6694 2 BEGIN ; 6695 2 ; 6696 2 BIND ; 6697 2 RECEIVE%TEXT = UPLIT (%ASCIZ'Received...'); ; 6698 2 ; 6699 2 IF .DEBUG%FLAG ; 6700 2 THEN ; 6701 3 BEGIN ; 6702 3 ; 6703 3 LOCAL ; 6704 3 OLD%RTN; ; 6705 3 ; 6706 3 OLD%RTN = TT%SET%OUTPUT (DBG%DUMP); ; 6707 3 TT%TEXT (RECEIVE%TEXT); ; 6708 3 DBG%MESSAGE (.ADDRESS, .REC%LENGTH); ; 6709 3 TT%SET%OUTPUT (.OLD%RTN); ; 6710 2 END; ; 6711 2 ; 6712 1 END; ! End of DBG%RECEIVE P.ABG: BYTE (7)"R","e","c","e","i" BYTE (7)"v","e","d",".","." BYTE (7)".",000,000,000,000 ; RECEIVE%TEXT U.103= P.ABG ; DBG%RECEIVE U.36: PUSH SP,AC16 ; 6655 MOVEI AC1,1 ; 6699 TDNN AC1,DEBUG%FLAG JRST L.467 PUSH SP,C.88 ; 6706 PUSHJ SP,TT%SET%OUTPUT MOVE AC16,AC1 PUSH SP,C.122 ; 6707 PUSHJ SP,TT%TEXT PUSH SP,-4(SP) ; 6708 PUSH SP,U.57 PUSHJ SP,U.34 MOVEM AC16,0(SP) ; 6709 PUSHJ SP,TT%SET%OUTPUT ADJSP SP,-4 ; 6701 L.467: POP SP,AC16 ; 6655 POPJ SP, C.122: XWD 0,U.103 ; Routine Size: 18 words ; 6713 1 %SBTTL 'Debugging -- DBG%MESSAGE' ; 6714 1 ROUTINE DBG%MESSAGE (MSG%ADDRESS, MSG%LENGTH) : NOVALUE = ; 6715 1 ; 6716 1 !++ ; 6717 1 ! FUNCTIONAL DESCRIPTION: ; 6718 1 ! ; 6719 1 ! This routine will display a message that is either being sent ; 6720 1 ! or received on the user's terminal. ; 6721 1 ! ; 6722 1 ! CALLING SEQUENCE: ; 6723 1 ! ; 6724 1 ! DBG%MESSAGE(MSG%ADDRESS, MSG%LENGTH); ; 6725 1 ! ; 6726 1 ! INPUT PARAMETERS: ; 6727 1 ! ; 6728 1 ! MSG%ADDRESS - Address of the message to be output ; 6729 1 ! MSG%LENGTH - Length of the message to be output. ; 6730 1 ! ; 6731 1 ! IMPLICIT INPUTS: ; 6732 1 ! ; 6733 1 ! None. ; 6734 1 ! ; 6735 1 ! OUTPUT PARAMETERS: ; 6736 1 ! ; 6737 1 ! None. ; 6738 1 ! ; 6739 1 ! IMPLICIT OUTPUTS: ; 6740 1 ! ; 6741 1 ! None. ; 6742 1 ! ; 6743 1 ! COMPLETION CODES: ; 6744 1 ! ; 6745 1 ! None. ; 6746 1 ! ; 6747 1 ! SIDE EFFECTS: ; 6748 1 ! ; 6749 1 ! None. ; 6750 1 ! ; 6751 1 !-- ; 6752 1 ; 6753 2 BEGIN ; 6754 2 ; 6755 2 MAP ; 6756 2 MSG%ADDRESS : REF VECTOR [CH$ALLOCATION (MAX%MSG, CHR%SIZE)]; ! Point to the vector ; 6757 2 ; 6758 2 LOCAL ; 6759 2 OLD%RTN, ! Old type out routine ; 6760 2 CHKSUM, ! Numeric value of block check ; 6761 2 TEMP%POINTER, ! Temporary character pointer ; 6762 2 MSG%MSG, ! [108] ! Starting point for data ; 6763 2 MSG%LEN; ; 6764 2 ; 6765 2 ! ; 6766 2 ! Message type text ; 6767 2 ! ; 6768 2 ; 6769 2 BIND ; 6770 2 DATA%TEXT = UPLIT (%ASCIZ' (Data)'), ; 6771 2 ACK%TEXT = UPLIT (%ASCIZ' (ACK)'), ; 6772 2 NAK%TEXT = UPLIT (%ASCIZ' (NAK)'), ; 6773 2 SND%INIT%TEXT = UPLIT (%ASCIZ' (Send init)'), ; 6774 2 BREAK%TEXT = UPLIT (%ASCIZ' (Break)'), ; 6775 2 TEXT%TEXT = UPLIT (%ASCIZ' (Text header)'), ; 6776 2 FILE%TEXT = UPLIT (%ASCIZ' (File header)'), ; 6777 2 EOF%TEXT = UPLIT (%ASCIZ' (EOF)'), ; 6778 2 ERROR%TEXT = UPLIT (%ASCIZ' (Error)'), ; 6779 2 RCV%INIT%TEXT = UPLIT (%ASCIZ' (Receive initiate)'), ; 6780 2 COMMAND%TEXT = UPLIT (%ASCIZ' (Command)'), ; 6781 2 KERMIT%TEXT = UPLIT (%ASCIZ' (Generic KERMIT command)'); ; 6782 2 ; 6783 2 ! ; 6784 2 ! Header information ; 6785 2 ! ; 6786 2 ; 6787 2 BIND ; 6788 2 MN%TEXT = UPLIT (%ASCIZ'Message number: '), ; 6789 2 LENGTH%TEXT = UPLIT (%ASCIZ' Length: '), ; 6790 2 DEC%TEXT = UPLIT (%ASCIZ' (dec)'), ; 6791 2 MSG%TYP%TEXT = UPLIT (%ASCIZ'Message type: '), ; 6792 2 CHKSUM%TEXT = UPLIT (%ASCIZ'Checksum: '), ; 6793 2 CHKSUM%NUM%TEXT = UPLIT (%ASCIZ' = '), ; 6794 2 OPT%DATA%TEXT = UPLIT (%ASCIZ'Optional data: '), ; 6795 2 PRE%CHAR%TEXT = UPLIT (%ASCIZ' "'); ; 6796 2 ; 6797 2 ! ; 6798 2 ! Ensure that the type out will go to the debugging location ; 6799 2 ! ; 6800 2 OLD%RTN = TT%SET%OUTPUT (DBG%DUMP); ; 6801 2 ! ; 6802 2 ! Preliminary calculations ; 6803 2 ! ; 6804 2 MSG%LEN = UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%COUNT, CHR%SIZE))); ; 6805 2 MSG%MSG = PKT%MSG; ! [108] ; 6806 2 IF .MSG%LEN EQL 0 ! [108] ; 6807 2 THEN ! [108] ; 6808 3 BEGIN ! [108] ; 6809 3 MSG%LEN = UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%COUNTX1, CHR%SIZE))) * 95 ; 6810 3 + ; 6811 3 UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%COUNTX2, CHR%SIZE))) + ; 6812 3 PKT%HCHECK - 1; ! [108] ; 6813 3 MSG%MSG = PKT%MSGX; ! [108] ; 6814 2 END; ! [108] ; 6815 2 ; 6816 2 ! ; 6817 2 ! First output some header information for the packet. ; 6818 2 ! ; 6819 2 TT%CRLF (); ; 6820 2 TT%TEXT (MN%TEXT); ; 6821 2 TT%NUMBER (UNCHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%SEQ, CHR%SIZE)))); ; 6822 2 TT%TEXT (DEC%TEXT); ; 6823 2 TT%TEXT (LENGTH%TEXT); ; 6824 2 TT%NUMBER (.MSG%LEN); ; 6825 2 TT%TEXT (DEC%TEXT); ; 6826 2 TT%CRLF (); ; 6827 2 ! ; 6828 2 ! Now output the message type and dependent information ; 6829 2 ! ; 6830 2 TT%TEXT (MSG%TYP%TEXT); ; 6831 2 TT%CHAR (CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%TYPE, CHR%SIZE))); ; 6832 2 ; 6833 2 SELECTONE CH$RCHAR (CH$PTR (.MSG%ADDRESS, PKT%TYPE, CHR%SIZE)) OF ; 6834 2 SET ; 6835 2 ; 6836 2 [MSG%DATA] : ; 6837 2 TT%TEXT (DATA%TEXT); ; 6838 2 ; 6839 2 [MSG%ACK] : ; 6840 2 TT%TEXT (ACK%TEXT); ; 6841 2 ; 6842 2 [MSG%NAK] : ; 6843 2 TT%TEXT (NAK%TEXT); ; 6844 2 ; 6845 2 [MSG%SND%INIT] : ; 6846 2 TT%TEXT (SND%INIT%TEXT); ; 6847 2 ; 6848 2 [MSG%BREAK] : ; 6849 2 TT%TEXT (BREAK%TEXT); ; 6850 2 ; 6851 2 [MSG%FILE] : ; 6852 2 TT%TEXT (FILE%TEXT); ; 6853 2 ; 6854 2 [MSG%TEXT] : ; 6855 2 TT%TEXT (TEXT%TEXT); ; 6856 2 ; 6857 2 [MSG%EOF] : ; 6858 2 TT%TEXT (EOF%TEXT); ; 6859 2 ; 6860 2 [MSG%ERROR] : ; 6861 2 TT%TEXT (ERROR%TEXT); ; 6862 2 ; 6863 2 [MSG%GENERIC] : ; 6864 2 TT%TEXT (KERMIT%TEXT); ; 6865 2 ; 6866 2 [MSG%COMMAND] : ; 6867 2 TT%TEXT (COMMAND%TEXT); ; 6868 2 TES; ; 6869 2 ; 6870 2 TT%CRLF (); ; 6871 2 ! ; 6872 2 ! Now output any of the optional data. ; 6873 2 ! ; 6874 2 ; 6875 2 IF .MSG%LEN - .MSG%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR) NEQ 0 ! [108] ; 6876 2 THEN ; 6877 3 BEGIN ; 6878 3 TT%TEXT (OPT%DATA%TEXT); ; 6879 3 TT%CRLF (); ; 6880 3 TEMP%POINTER = CH$PTR (.MSG%ADDRESS, .MSG%MSG, CHR%SIZE); ! [108] ; 6881 3 ; 6882 3 INCR I FROM 1 TO .MSG%LEN - .MSG%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR) DO ! [108] ; 6883 4 BEGIN ; 6884 4 ; 6885 4 IF (.I MOD 10) EQL 1 ; 6886 4 THEN ; 6887 5 BEGIN ; 6888 5 TT%CRLF (); ; 6889 5 TT%CHAR (CHR%TAB); ; 6890 4 END; ; 6891 4 ; 6892 4 TT%TEXT (PRE%CHAR%TEXT); ; 6893 4 TT%CHAR (CH$RCHAR%A (TEMP%POINTER)); ; 6894 4 TT%CHAR (%C'"'); ; 6895 3 END; ; 6896 3 ; 6897 3 IF ((.MSG%LEN - .MSG%MSG + 1 - (.BLK%CHK%TYPE - CHK%1CHAR)) MOD 10) EQL 1 THEN ; 6898 3 TT%CRLF (); ! [108] ; 6899 3 ; 6900 3 TT%CRLF (); ; 6901 2 END; ; 6902 2 ; 6903 2 ! ; 6904 2 ! Now output the checksum for the message that we received ; 6905 2 ! ; 6906 2 ! This could be either 1 two or three characters. ; 6907 2 TT%TEXT (CHKSUM%TEXT); ; 6908 2 TEMP%POINTER = CH$PTR (.MSG%ADDRESS, ; 6909 2 .MSG%LEN + PKT%CHKSUM + 1 - (.BLK%CHK%TYPE - CHK%1CHAR), CHR%SIZE); ! [108] ; 6910 2 ; 6911 2 CASE .BLK%CHK%TYPE FROM CHK%1CHAR TO CHK%CRC OF ; 6912 2 SET ; 6913 2 ; 6914 2 [CHK%1CHAR] : ; 6915 3 BEGIN ; 6916 3 TT%TEXT (PRE%CHAR%TEXT); ; 6917 3 TT%CHAR (CH$RCHAR (.TEMP%POINTER)); ; 6918 3 TT%CHAR (%C'"'); ; 6919 3 CHKSUM = UNCHAR (CH$RCHAR (.TEMP%POINTER)); ; 6920 2 END; ; 6921 2 ; 6922 2 [CHK%2CHAR] : ; 6923 3 BEGIN ; 6924 3 CHKSUM = 0; ; 6925 3 TT%TEXT (PRE%CHAR%TEXT); ; 6926 3 TT%CHAR (CH$RCHAR (.TEMP%POINTER)); ; 6927 3 TT%CHAR (%C'"'); ; 6928 3 CHKSUM<6, 6> = UNCHAR (CH$RCHAR%A (TEMP%POINTER)); ; 6929 3 TT%TEXT (PRE%CHAR%TEXT); ; 6930 3 TT%CHAR (CH$RCHAR (.TEMP%POINTER)); ; 6931 3 TT%CHAR (%C'"'); ; 6932 3 CHKSUM<0, 6> = UNCHAR (CH$RCHAR (.TEMP%POINTER)); ; 6933 2 END; ; 6934 2 ; 6935 2 [CHK%CRC] : ; 6936 3 BEGIN ; 6937 3 CHKSUM = 0; ; 6938 3 TT%TEXT (PRE%CHAR%TEXT); ; 6939 3 TT%CHAR (CH$RCHAR (.TEMP%POINTER)); ; 6940 3 TT%CHAR (%C'"'); ; 6941 3 CHKSUM<12, 4> = UNCHAR (CH$RCHAR%A (TEMP%POINTER)); ; 6942 3 TT%TEXT (PRE%CHAR%TEXT); ; 6943 3 TT%CHAR (CH$RCHAR (.TEMP%POINTER)); ; 6944 3 TT%CHAR (%C'"'); ; 6945 3 CHKSUM<6, 6> = UNCHAR (CH$RCHAR%A (TEMP%POINTER)); ; 6946 3 TT%TEXT (PRE%CHAR%TEXT); ; 6947 3 TT%CHAR (CH$RCHAR (.TEMP%POINTER)); ; 6948 3 TT%CHAR (%C'"'); ; 6949 3 CHKSUM<0, 6> = UNCHAR (CH$RCHAR (.TEMP%POINTER)); ; 6950 2 END; ; 6951 2 TES; ; 6952 2 ; 6953 2 TT%TEXT (CHKSUM%NUM%TEXT); ; 6954 2 TT%NUMBER (.CHKSUM); ; 6955 2 TT%TEXT (DEC%TEXT); ; 6956 2 TT%CRLF (); ; 6957 2 TT%SET%OUTPUT (.OLD%RTN); ! Reset output destination ; 6958 1 END; ! End of DBG%MESSAGE P.ABH: BYTE (7)" ","(","D","a","t" BYTE (7)"a",")",000,000,000 P.ABI: BYTE (7)" ","(","A","C","K" BYTE (7)")",000,000,000,000 P.ABJ: BYTE (7)" ","(","N","A","K" BYTE (7)")",000,000,000,000 P.ABK: BYTE (7)" ","(","S","e","n" BYTE (7)"d"," ","i","n","i" BYTE (7)"t",")",000,000,000 P.ABL: BYTE (7)" ","(","B","r","e" BYTE (7)"a","k",")",000,000 P.ABM: BYTE (7)" ","(","T","e","x" BYTE (7)"t"," ","h","e","a" BYTE (7)"d","e","r",")",000 P.ABN: BYTE (7)" ","(","F","i","l" BYTE (7)"e"," ","h","e","a" BYTE (7)"d","e","r",")",000 P.ABO: BYTE (7)" ","(","E","O","F" BYTE (7)")",000,000,000,000 P.ABP: BYTE (7)" ","(","E","r","r" BYTE (7)"o","r",")",000,000 P.ABQ: BYTE (7)" ","(","R","e","c" BYTE (7)"e","i","v","e"," " BYTE (7)"i","n","i","t","i" BYTE (7)"a","t","e",")",000 P.ABR: BYTE (7)" ","(","C","o","m" BYTE (7)"m","a","n","d",")" BYTE (7)000,000,000,000,000 P.ABS: BYTE (7)" ","(","G","e","n" BYTE (7)"e","r","i","c"," " BYTE (7)"K","E","R","M","I" BYTE (7)"T"," ","c","o","m" BYTE (7)"m","a","n","d",")" BYTE (7)000,000,000,000,000 P.ABT: BYTE (7)"M","e","s","s","a" BYTE (7)"g","e"," ","n","u" BYTE (7)"m","b","e","r",":" BYTE (7)" ",000,000,000,000 P.ABU: BYTE (7)011,"L","e","n","g" BYTE (7)"t","h",":"," ",000 P.ABV: BYTE (7)" ","(","d","e","c" BYTE (7)")",000,000,000,000 P.ABW: BYTE (7)"M","e","s","s","a" BYTE (7)"g","e"," ","t","y" BYTE (7)"p","e",":"," ",000 P.ABX: BYTE (7)"C","h","e","c","k" BYTE (7)"s","u","m",":"," " BYTE (7)000,000,000,000,000 P.ABY: BYTE (7)" ","="," ",000,000 P.ABZ: BYTE (7)"O","p","t","i","o" BYTE (7)"n","a","l"," ","d" BYTE (7)"a","t","a",":"," " BYTE (7)000,000,000,000,000 P.ACA: BYTE (7)" ",042,000,000,000 ; DATA%TEXT U.105= P.ABH ; ACK%TEXT U.106= P.ABI ; NAK%TEXT U.107= P.ABJ ; SND%INIT%TEXT U.108= P.ABK ; BREAK%TEXT U.109= P.ABL ; TEXT%TEXT U.110= P.ABM ; FILE%TEXT U.111= P.ABN ; EOF%TEXT U.112= P.ABO ; ERROR%TEXT U.113= P.ABP ; RCV%INIT%TEXT U.114= P.ABQ ; COMMAND%TEXT U.115= P.ABR ; KERMIT%TEXT U.116= P.ABS ; MN%TEXT U.117= P.ABT ; LENGTH%TEXT U.118= P.ABU ; DEC%TEXT U.119= P.ABV ; MSG%TYP%TEXT U.120= P.ABW ; CHKSUM%TEXT U.121= P.ABX ; CHKSUM%NUM%TEXT U.122= P.ABY ; OPT%DATA%TEXT U.123= P.ABZ ; PRE%CHAR%TEXT U.124= P.ACA ; DBG%MESSAGE U.34: PUSH SP,AC0 ; 6714 PUSH SP,AC10 PUSH SP,AC11 PUSH SP,AC12 PUSH SP,AC13 PUSH SP,AC14 PUSH SP,AC16 PUSH SP,C.88 ; 6800 PUSHJ SP,TT%SET%OUTPUT MOVE AC0,AC1 MOVE AC12,-12(SP) ; 6804 MOVEI AC1,0(AC12) HRLI AC1,341000 ILDB AC2,AC1 MOVE AC14,AC2 SUBI AC14,40 MOVEI AC16,4 ; 6805 JUMPN AC14,L.468 ; 6806 MOVEI AC1,0(AC12) ; 6809 HRLI AC1,41000 ILDB AC2,AC1 IMULI AC2,137 MOVEI AC1,1(AC12) ; 6811 HRLI AC1,341000 ILDB AC1,AC1 ADD AC2,AC1 ; 6810 MOVE AC14,AC2 ; 6812 SUBI AC14,5773 MOVEI AC16,7 ; 6813 L.468: PUSHJ SP,TT%CRLF ; 6819 PUSH SP,C.126 ; 6820 PUSHJ SP,TT%TEXT MOVEI AC1,0(AC12) ; 6821 HRLI AC1,241000 ILDB AC1,AC1 SUBI AC1,40 PUSH SP,AC1 PUSHJ SP,TT%NUMBER PUSH SP,C.127 ; 6822 PUSHJ SP,TT%TEXT PUSH SP,C.128 ; 6823 PUSHJ SP,TT%TEXT MOVEM AC14,0(SP) ; 6824 PUSHJ SP,TT%NUMBER PUSH SP,C.127 ; 6825 PUSHJ SP,TT%TEXT PUSHJ SP,TT%CRLF ; 6826 PUSH SP,C.129 ; 6830 PUSHJ SP,TT%TEXT MOVEI AC1,0(AC12) ; 6831 HRLI AC1,141000 ILDB AC1,AC1 PUSH SP,AC1 PUSHJ SP,TT%CHAR MOVEI AC1,0(AC12) ; 6833 HRLI AC1,141000 ILDB AC13,AC1 CAIE AC13,104 ; 6836 JRST L.469 PUSH SP,C.130 ; 6837 JRST L.479 L.469: CAIE AC13,131 ; 6839 JRST L.470 PUSH SP,C.131 ; 6840 JRST L.479 L.470: CAIE AC13,116 ; 6842 JRST L.471 PUSH SP,C.132 ; 6843 JRST L.479 L.471: CAIE AC13,123 ; 6845 JRST L.472 PUSH SP,C.133 ; 6846 JRST L.479 L.472: CAIE AC13,102 ; 6848 JRST L.473 PUSH SP,C.134 ; 6849 JRST L.479 L.473: CAIE AC13,106 ; 6851 JRST L.474 PUSH SP,C.135 ; 6852 JRST L.479 L.474: CAIE AC13,130 ; 6854 JRST L.475 PUSH SP,C.136 ; 6855 JRST L.479 L.475: CAIE AC13,132 ; 6857 JRST L.476 PUSH SP,C.137 ; 6858 JRST L.479 L.476: CAIE AC13,105 ; 6860 JRST L.477 PUSH SP,C.138 ; 6861 JRST L.479 L.477: CAIE AC13,107 ; 6863 JRST L.478 PUSH SP,C.139 ; 6864 JRST L.479 L.478: CAIE AC13,103 ; 6866 JRST L.480 PUSH SP,C.140 ; 6867 L.479: PUSHJ SP,TT%TEXT ADJSP SP,-1 L.480: PUSHJ SP,TT%CRLF ; 6870 MOVE AC2,AC14 ; 6875 SUB AC2,AC16 MOVE AC11,AC2 ADDI AC11,1 MOVE AC1,U.48 SUBI AC1,61 CAMN AC11,AC1 JRST L.484 PUSH SP,C.141 ; 6878 PUSHJ SP,TT%TEXT PUSHJ SP,TT%CRLF ; 6879 MOVEI AC1,0(AC12) ; 6880 HRLI AC1,-337000 ADJBP AC16,AC1 MOVE AC2,AC11 ; 6882 SUB AC2,U.48 MOVE AC10,AC2 ADDI AC10,61 SETZ AC13, JRST L.483 L.481: MOVE AC1,AC13 ; 6885 IDIVI AC1,12 CAIE AC2,1 JRST L.482 PUSHJ SP,TT%CRLF ; 6888 PUSH SP,C.47 ; 6889 PUSHJ SP,TT%CHAR ADJSP SP,-1 ; 6887 L.482: PUSH SP,C.142 ; 6892 PUSHJ SP,TT%TEXT ILDB AC1,AC16 ; 6893 PUSH SP,AC1 PUSHJ SP,TT%CHAR PUSH SP,C.143 ; 6894 PUSHJ SP,TT%CHAR ADJSP SP,-3 ; 6883 L.483: ADDI AC13,1 ; 6882 CAMG AC13,AC10 JRST L.481 MOVE AC2,AC11 ; 6897 SUB AC2,U.48 ADDI AC2,61 MOVE AC1,AC2 IDIVI AC1,12 CAIN AC2,1 PUSHJ SP,TT%CRLF ; 6898 PUSHJ SP,TT%CRLF ; 6900 ADJSP SP,-1 ; 6877 L.484: PUSH SP,C.144 ; 6907 PUSHJ SP,TT%TEXT MOVE AC1,U.48 ; 6909 SUB AC14,AC1 ADDI AC14,62 MOVEI AC2,0(AC12) HRLI AC2,-337000 ADJBP AC14,AC2 MOVE AC16,AC14 SUBI AC1,61 ; 6911 JRST L.485(AC1) L.485: JRST L.486 JRST L.487 JRST L.488 L.486: PUSH SP,C.142 ; 6916 PUSHJ SP,TT%TEXT MOVE AC14,AC16 ; 6917 ILDB AC1,AC14 PUSH SP,AC1 PUSHJ SP,TT%CHAR PUSH SP,C.143 ; 6918 PUSHJ SP,TT%CHAR MOVE AC14,AC16 ; 6919 ILDB AC14,AC14 SUBI AC14,40 JRST L.489 ; 6911 L.487: SETZ AC14, ; 6924 PUSH SP,C.142 ; 6925 PUSHJ SP,TT%TEXT MOVE AC2,AC16 ; 6926 ILDB AC1,AC2 PUSH SP,AC1 PUSHJ SP,TT%CHAR PUSH SP,C.143 ; 6927 PUSHJ SP,TT%CHAR ILDB AC1,AC16 ; 6928 SUBI AC1,40 DPB AC1,C.123 PUSH SP,C.142 ; 6929 PUSHJ SP,TT%TEXT MOVE AC2,AC16 ; 6930 ILDB AC1,AC2 PUSH SP,AC1 PUSHJ SP,TT%CHAR PUSH SP,C.143 ; 6931 PUSHJ SP,TT%CHAR MOVE AC2,AC16 ; 6932 ILDB AC1,AC2 SUBI AC1,40 DPB AC1,C.124 ADJSP SP,-3 ; 6923 JRST L.489 ; 6911 L.488: SETZ AC14, ; 6937 PUSH SP,C.142 ; 6938 PUSHJ SP,TT%TEXT MOVE AC2,AC16 ; 6939 ILDB AC1,AC2 PUSH SP,AC1 PUSHJ SP,TT%CHAR PUSH SP,C.143 ; 6940 PUSHJ SP,TT%CHAR ILDB AC1,AC16 ; 6941 SUBI AC1,40 DPB AC1,C.125 PUSH SP,C.142 ; 6942 PUSHJ SP,TT%TEXT MOVE AC2,AC16 ; 6943 ILDB AC1,AC2 PUSH SP,AC1 PUSHJ SP,TT%CHAR PUSH SP,C.143 ; 6944 PUSHJ SP,TT%CHAR ILDB AC1,AC16 ; 6945 SUBI AC1,40 DPB AC1,C.123 PUSH SP,C.142 ; 6946 PUSHJ SP,TT%TEXT MOVE AC2,AC16 ; 6947 ILDB AC1,AC2 PUSH SP,AC1 PUSHJ SP,TT%CHAR PUSH SP,C.143 ; 6948 PUSHJ SP,TT%CHAR ILDB AC1,AC16 ; 6949 SUBI AC1,40 DPB AC1,C.124 ADJSP SP,-6 ; 6936 L.489: PUSH SP,C.145 ; 6953 PUSHJ SP,TT%TEXT MOVEM AC14,0(SP) ; 6954 PUSHJ SP,TT%NUMBER PUSH SP,C.127 ; 6955 PUSHJ SP,TT%TEXT PUSHJ SP,TT%CRLF ; 6956 MOVEM AC0,0(SP) ; 6957 PUSHJ SP,TT%SET%OUTPUT ADJSP SP,-16 ; 6753 POP SP,AC16 ; 6714 POP SP,AC14 POP SP,AC13 POP SP,AC12 POP SP,AC11 POP SP,AC10 POP SP,AC0 POPJ SP, C.123: POINT 6,AC14,29 C.124: POINT 6,AC14,35 C.125: POINT 4,AC14,23 C.126: XWD 0,U.117 C.127: XWD 0,U.119 C.128: XWD 0,U.118 C.129: XWD 0,U.120 C.130: XWD 0,U.105 C.131: XWD 0,U.106 C.132: XWD 0,U.107 C.133: XWD 0,U.108 C.134: XWD 0,U.109 C.135: XWD 0,U.111 C.136: XWD 0,U.110 C.137: XWD 0,U.112 C.138: XWD 0,U.113 C.139: XWD 0,U.116 C.140: XWD 0,U.115 C.141: XWD 0,U.123 C.142: XWD 0,U.124 C.143: EXP 42 C.144: XWD 0,U.121 C.145: XWD 0,U.122 ; Routine Size: 279 words ; 6959 1 %SBTTL 'End of KERMSG' ; 6960 1 END ; 6961 1 ; 6962 0 ELUDOM ; Low segment length: 555 words ; High segment length: 4095 words ; Compilation Complete END