; 0001 0 %TITLE 'KERMSG - Kermit message processing' ; 0002 0 MODULE KERMSG (IDENT = '3.3.107' ; 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 ; 0311 1 %SBTTL 'Interface requirements' ; 0312 1 ; 0313 1 !++ ; 0314 1 ! Interface requirements ; 0315 1 ! ; 0316 1 ! The following routines and data locations are rquired for a correct ; 0317 1 ! implementation of KERMIT. ; 0318 1 ! ; 0319 1 ! File routines: ; 0320 1 ! ; 0321 1 ! FILE_OPEN (Function) ; 0322 1 ! This routine will open a file for reading or writting. It ; 0323 1 ! will assume that FILE_SIZE contains the number of bytes ; 0324 1 ! and FILE_NAME contains the file name of length FILE_SIZE. ; 0325 1 ! The function that is passed is either FNC_READ or FNC_WRITE. ; 0326 1 ! ; 0327 1 ! FILE_CLOSE () ; 0328 1 ! This routine will close the currently open file. This ; 0329 1 ! routine will return the status of the operation. ; 0330 1 ! ; 0331 1 ! GET_FILE (Character) ; 0332 1 ! This routine will get a character from the currently open file ; 0333 1 ! and store it in the location specified by "Character". There ; 0334 1 ! will be a true/false value returned by the routine to determine ; 0335 1 ! if there was an error. ; 0336 1 ! ; 0337 1 ! PUT_FILE (Character) ; 0338 1 ! This routine will output a character to the currently open ; 0339 1 ! file. It will return a true/false value to determine if the ; 0340 1 ! routine was successful. ; 0341 1 ! ; 0342 1 ! NEXT_FILE () ; 0343 1 ! This routine will advance to the next file. This routine ; 0344 1 ! will return false if there are no more files to process. ; 0345 1 ! ; 0346 1 ! Communications line routines: ; 0347 1 ! ; 0348 1 ! RECEIVE (Buffer address, Address of var to store length into) ; 0349 1 ! This routine will receive a message from the remote Kermit. ; 0350 1 ! ; 0351 1 ! SEND (Buffer address, Length in characters) ; 0352 1 ! This routine will send a message to the remote Kermit. ; 0353 1 ! ; 0354 1 ! GEN_CRC (Buffer address, length in characters) ; 0355 1 ! This routine will calculate the CRC-CCITT for the characters ; 0356 1 ! in the buffer. ; 0357 1 ! ; 0358 1 ! Operating system routines: ; 0359 1 ! ; 0360 1 ! SY_DISMISS (Seconds) ; 0361 1 ! This routine will cause Kermit to sleep for the specified ; 0362 1 ! number of seconds. It is used to handle the DELAY parameter. ; 0363 1 ! ; 0364 1 ! SY_LOGOUT () ; 0365 1 ! Log the job off of the system. (Kill the process). ; 0366 1 ! ; 0367 1 ! SY_TIME () ; 0368 1 ! This routine will return the starting time milliseconds. ; 0369 1 ! It can be the start of Kermit, the system, etc, so long ; 0370 1 ! as it always is incrementing. ; 0371 1 ! ; 0372 1 ! Status routines: ; 0373 1 ! ; 0374 1 ! XFR_STATUS (Type, Subtype); ; 0375 1 ! This routine is called to indicate the occurance of ; 0376 1 ! a significant event that the user interface may wish ; 0377 1 ! to inform the user about. The arguments indicate the ; 0378 1 ! type of event. ; 0379 1 ! Type: "S" - Send, "R" - Receive ; 0380 1 ! Subtype: "P" - Packet ; 0381 1 ! "N" - NAK ; 0382 1 ! "T" - timeout ; 0383 1 ! For type = "I" (initiate), "T" (terminate): ; 0384 1 ! Subtype: "S" - a file send ; 0385 1 ! "R" - a file receive ; 0386 1 ! "G" - a generic command ; 0387 1 ! "I" - for "T" only, returning to server idle ; 0388 1 ! For type = "F" (file operation): ; 0389 1 ! Subtype: "S" - open for sending ; 0390 1 ! "R" - open for receiving ; 0391 1 ! "C" - closing file OK ; 0392 1 ! "X" - aborting file by user request ; 0393 1 ! "Z" - aborting group by user request ; 0394 1 ! "D" - aborting file, but saving due to disposition ; 0395 1 ! "A" - aborting file due to protocol error ; 0396 1 ! ; 0397 1 ! Error processing: ; 0398 1 ! ; 0399 1 ! KRM_ERROR (Error parameter) ; 0400 1 ! This routine will cause an error message to be issued. ; 0401 1 ! The error parameter is defined by KERERR. This may cause ; 0402 1 ! SND_ERROR to be called to send an "E" message to the remote. ; 0403 1 ! ; 0404 1 ! Terminal I/O routines: ; 0405 1 ! ; 0406 1 ! TERM_DUMP (Buffer, Count) ; 0407 1 ! DBG_DUMP (Buffer, Count) ; 0408 1 ! This routine will dump the buffer onto the user's terminal. ; 0409 1 ! The routine is supplied with the count of the characters ; 0410 1 ! and the address of the buffer. ; 0411 1 ! These may be the same routine or different. DBG_DUMP ; 0412 1 ! is only called for debugging output. ; 0413 1 ! ; 0414 1 ! ; 0415 1 ! ENTRY POINTS ; 0416 1 ! ; 0417 1 ! KERMSG contains the following entry points for the KERMIT. ; 0418 1 ! ; 0419 1 ! SERVER () ; 0420 1 ! This routine will cause KERMIT go enter server mode. ; 0421 1 ! ; 0422 1 ! SEND_SWITCH () ; 0423 1 ! This routine will send a file. It expects that the user ; 0424 1 ! has stored the text of the file name into FILE_NAME and ; 0425 1 ! the length of the text into FILE_SIZE. ; 0426 1 ! ; 0427 1 ! REC_SWITCH () ; 0428 1 ! This routine will receive a file. It expects that the default ; 0429 1 ! file name is set up in FILE_NAME and the length is in ; 0430 1 ! FILE_SIZE. ; 0431 1 ! ; 0432 1 ! GEN_PARITY (Character) ; 0433 1 ! This routine will return the character with the proper parity ; 0434 1 ! on the character. ; 0435 1 ! ; 0436 1 ! SND_ERROR (COUNT, ADDRESS) ; 0437 1 ! This routine will send the text of an error to the remote ; 0438 1 ! Kermit. ; 0439 1 ! ; 0440 1 ! DO_GENERIC (TYPE) ; 0441 1 ! This routine will cause a generic function to be sent to ; 0442 1 ! the remote Kermit. This routine will then do all of the ; 0443 1 ! necessary hand shaking to handle the local end of the generic ; 0444 1 ! Kermit command. ; 0445 1 ! ; 0446 1 ! ; 0447 1 ! GLOBAL Storage ; 0448 1 ! ; 0449 1 ! The following are the global storage locations that are used to interface ; 0450 1 ! to KERMSG. These locations contains the various send and receive parameters. ; 0451 1 ! ; 0452 1 ! Receive parameters: ; 0453 1 ! ; 0454 1 ! RCV_PKT_SIZE ; 0455 1 ! Receive packet size. ; 0456 1 ! RCV_NPAD ; 0457 1 ! Padding length ; 0458 1 ! RCV_PADCHAR ; 0459 1 ! Padding character ; 0460 1 ! RCV_TIMEOUT ; 0461 1 ! Time out ; 0462 1 ! RCV_EOL ; 0463 1 ! End of line character ; 0464 1 ! RCV_QUOTE_CHR ; 0465 1 ! Quote character ; 0466 1 ! RCV_8QUOTE_CHR ; 0467 1 ! 8-bit quoting character ; 0468 1 ! RCV_SOH ; 0469 1 ! Start of header character ; 0470 1 ! ; 0471 1 ! Send parameters (Negative values denote the default, positive user supplied): ; 0472 1 ! ; 0473 1 ! SND_PKT_SIZE ; 0474 1 ! Send packet size ; 0475 1 ! SND_NPAD ; 0476 1 ! Padding length ; 0477 1 ! SND_PADCHAR ; 0478 1 ! Padding character ; 0479 1 ! SND_TIMEOUT ; 0480 1 ! Time out ; 0481 1 ! SND_EOL ; 0482 1 ! End of line character ; 0483 1 ! SND_QUOTE_CHR ; 0484 1 ! Quote character ; 0485 1 ! SND_SOH ; 0486 1 ! Start of header character (normally 001) ; 0487 1 ! ; 0488 1 ! Statistics: ; 0489 1 ! ; 0490 1 ! SND_TOTAL_CHARS ; 0491 1 ! Total characters sent for this Kermit session ; 0492 1 ! RCV_TOTAL_CHARS ; 0493 1 ! Total characters received for this Kermit session ; 0494 1 ! SND_DATA_CHARS ; 0495 1 ! Total number of data characters sent for this Kermit session ; 0496 1 ! RCV_DATA_CHARS ; 0497 1 ! Total number of data characters received for this Kermit session ; 0498 1 ! SND_COUNT ; 0499 1 ! Total number of packets that have been sent ; 0500 1 ! RCV_COUNT ; 0501 1 ! Total number of packets that have been received. ; 0502 1 ! SMSG_TOTAL_CHARS ; 0503 1 ! Total characters sent for this file transfer ; 0504 1 ! RMSG_TOTAL_CHARS ; 0505 1 ! Total characters received for this file transfer ; 0506 1 ! SMSG_DATA_CHARS ; 0507 1 ! Total data characters sent for this file transfer ; 0508 1 ! RMSG_DATA_CHARS ; 0509 1 ! Total data characters received for this file transfer ; 0510 1 ! SMSG_NAKS ; 0511 1 ! Total number of NAKs sent for this file transfer ; 0512 1 ! RMSG_NAKS ; 0513 1 ! Total number of NAKs received for this file transfer ; 0514 1 ! XFR_TIME ; 0515 1 ! Amount of time the last transfer took in milliseconds. ; 0516 1 ! TOTAL_TIME ; 0517 1 ! Total amount of time spend transfering data. ; 0518 1 ! ; 0519 1 ! Misc constants: ; 0520 1 ! ; 0521 1 ! LAST_ERROR ; 0522 1 ! ASCIZ of the last error message issued. ; 0523 1 ! FILE_NAME ; 0524 1 ! Vector containing the ASCII characters of the file name. ; 0525 1 ! FILE_SIZE ; 0526 1 ! Number of characters in the FILE_NAME vector. ; 0527 1 ! DELAY ; 0528 1 ! Amount of time to delay ; 0529 1 ! DUPLEX ; 0530 1 ! DP_HALF or DP_FULL to denote either half duplex or full duplex. ; 0531 1 ! [Currently only DP_FULL is supported] ; 0532 1 ! PKT_RETRIES ; 0533 1 ! Number of retries to attempt to read a message. ; 0534 1 ! SI_RETRIES ; 0535 1 ! Number of retries to attempt on send inits ; 0536 1 ! DEBUG_FLAG ; 0537 1 ! Debugging mode on/off ; 0538 1 ! WARN_FLAG ; 0539 1 ! File warning flag ; 0540 1 ! IBM_FLAG ; 0541 1 ! True if talking to an IBM system, else false. ; 0542 1 ! ECHO_FLAG ; 0543 1 ! Local echo flag ; 0544 1 ! CONNECT_FLAG ; 0545 1 ! Connected flag; True if terminal and SET LINE are the same ; 0546 1 ! PARITY_TYPE ; 0547 1 ! Type of parity to use on sends. ; 0548 1 ! DEV_PARITY_FLAG ; 0549 1 ! Device will add parity to message. True if device adds ; 0550 1 ! parity and false if we must do it. ; 0551 1 ! FLAG_FILE_OPEN ; 0552 1 ! File is opened. ; 0553 1 ! ; 0554 1 !-- ; 0555 1 ; 0556 1 %SBTTL 'Declarations -- Forward definitions' ; 0557 1 ! ; 0558 1 ! ; 0559 1 ! Forward definitions ; 0560 1 ! ; 0561 1 ; 0562 1 FORWARD ROUTINE ; 0563 1 ; 0564 1 ! Main loop for a complete transaction ; 0565 1 DO_TRANSACTION, ! Perform a complete transaction ; 0566 1 ; 0567 1 ! Send processing routines ; 0568 1 ; 0569 1 SEND_SERVER_INIT, ![026] Send a server init packet ; 0570 1 SEND_DATA, ! Send data to the micro ; 0571 1 SEND_FILE, ! Send file name ; 0572 1 SEND_OPEN_FILE, ! Open file for sending ; 0573 1 SEND_GENCMD, ! Send generic command ; 0574 1 SEND_EOF, ! Send EOF ; 0575 1 SEND_INIT, ! Send initialization msg ; 0576 1 SEND_BREAK, ! Send break end of transmission ; 0577 1 ; 0578 1 ! Receive processing routines ; 0579 1 ; 0580 1 REC_SERVER_IDLE, ! Wait for message while server is idle ; 0581 1 REC_INIT, ! Receive initialization ; 0582 1 REC_FILE, ! Receive file information ; 0583 1 REC_DATA, ! Receive data ; 0584 1 ! ; 0585 1 ! Server processing routines ; 0586 1 ! ; 0587 1 SERVER_GENERIC, ! Process generic KERMIT commands ; 0588 1 HOST_COMMAND, ! Process host command ; 0589 1 KERMIT_COMMAND, ! Process Kermit command ; 0590 1 CALL_SY_RTN, ! Handle calling system routine and returning result ; 0591 1 ! ; 0592 1 ! Statistic gathering routines ; 0593 1 ! ; 0594 1 END_STATS : NOVALUE, ! End of a message processing stats routine ; 0595 1 ; 0596 1 ! Low level send/receive routines ; 0597 1 ; 0598 1 CALC_BLOCK_CHECK, ! Routine to calculate the block check value ; 0599 1 SET_SEND_INIT : NOVALUE, ! Set up the MSG_SND_INIT parameters. ; 0600 1 PRS_SEND_INIT, ! Parse MSG_SND_INIT parameters. ; 0601 1 DO_PARITY : NOVALUE, ! Routine to generate parity for a message ; 0602 1 GEN_PARITY, ! Routine to add parity to a character ; 0603 1 SEND_PACKET, ! Send a packet to the remote ; 0604 1 REC_MESSAGE, ! Receive a message with retry processing ; 0605 1 REC_PACKET, ! Receive a packet from the remote ; 0606 1 ; 0607 1 ! Utility routines ; 0608 1 ; 0609 1 NORMALIZE_FILE : NOVALUE, ! Force file name into normal form ; 0610 1 BFR_EMPTY, ! Empty the data buffer ; 0611 1 BFR_FILL, ! Fill the data buffer from a file ; 0612 1 SET_STRING, ![025] Routine to set alternate get/put routines ; 0613 1 ! for use with in memory strings ; 0614 1 TYPE_CHAR, ! Type a character from a packet ; 0615 1 INIT_XFR : NOVALUE, ! Initialize the per transfer processing ; 0616 1 STS_OUTPUT : NOVALUE, ! Output current transfer status ; 0617 1 ! ; 0618 1 ! Debugging routines ; 0619 1 ! ; 0620 1 DBG_MESSAGE : NOVALUE, ! Type out a formatted message ; 0621 1 DBG_SEND : NOVALUE, ! Send message debugging routine ; 0622 1 DBG_RECEIVE : NOVALUE; ! Receive message debugging routine ; 0623 1 %SBTTL 'Require files' ; 0624 1 ; 0625 1 ! ; 0626 1 ! ; 0627 1 ! ; 0628 1 ! REQUIRE FILES: ; 0629 1 ! ; 0630 1 ; L 0631 1 %IF %BLISS (BLISS32) ; 0632 1 %THEN ; 0633 1 ; 0634 1 LIBRARY 'SYS$LIBRARY:STARLET'; ; 0635 1 ; 0636 1 %FI ; 0637 1 ; 0638 1 REQUIRE 'KERCOM'; ; 0846 1 ; 0847 1 REQUIRE 'KERERR'; ; 0913 1 ; 0914 1 %SBTTL 'Macro definitions' ; 0915 1 ! ; 0916 1 ! MACROS: ; 0917 1 ! ; 0918 1 ; 0919 1 MACRO ; M 0920 1 CTL (C) = ; 0921 1 ((C) XOR %O'100')%, ; M 0922 1 CHAR (C) = ; 0923 1 ((C) + %O'40')%, ; M 0924 1 UNCHAR (C) = ; 0925 1 ((C) - %O'40')%; ; 0926 1 ; 0927 1 %SBTTL 'KERMIT Protocol Definitions' ; 0928 1 ; 0929 1 !++ ; 0930 1 ! The following describes the various items that are found in the ; 0931 1 ! KERMIT messages. A complete and through desription of the protocol can be ; 0932 1 ! found in the KERMIT PROTOCOL MANUAL. ; 0933 1 ! ; 0934 1 ! ; 0935 1 ! All KERMIT messages have the following format: ; 0936 1 ! ; 0937 1 ! ; 0938 1 ! ; 0939 1 ! ; 0940 1 ! Normally SOH (Control-A, octal 001). ; 0941 1 ! ; 0942 1 ! ; 0943 1 ! Count of the number of characters following this position. ; 0944 1 ! Character counts of ONLY 0 to 94 are valid. ; 0945 1 ! ; 0946 1 ! ; 0947 1 ! Packet sequence number, modulo 100 (octal). ; 0948 1 ! ; 0949 1 ! ; 0950 1 ! This field contains the message dependent information. There can ; 0951 1 ! be multiple fields in this section. See the KERMIT Protocol document ; 0952 1 ! for a complete description of this. ; 0953 1 ! ; 0954 1 ! ; 0955 1 ! A block check on the characters in the packet between, but not ; 0956 1 ! including, the mark and the checksum itself. It may be one to three ; 0957 1 ! characters, depending upon the type agreed upon. ; 0958 1 ! ; 0959 1 ! 1. Single character arithmetic sum equal to: ; 0960 1 ! chksum = (s + ((s AND 300)/100)) AND 77 ; 0961 1 ! Character sent is CHAR(chksum). ; 0962 1 ! ; 0963 1 ! 2. Two character arithmetic sum. CHAR of bits 6-11 are the first ; 0964 1 ! character, CHAR of bits 0-5 are the second character. ; 0965 1 ! ; 0966 1 ! 3. Three character CRC-CCITT. First character is CHAR of bits 12-15, ; 0967 1 ! second is CHAR of bits 6-11, third is CHAR of bits 0-5. ; 0968 1 ! ; 0969 1 ! ; 0970 1 ! ; 0971 1 ! End of line. Any line terminator that may be required by the host. ; 0972 1 !-- ; 0973 1 ; 0974 1 %SBTTL 'KERMIT Protocol Definitions -- Packet offsets' ; 0975 1 ; 0976 1 !++ ; 0977 1 ! The following define the various offsets of the standard KERMIT ; 0978 1 ! packets. ; 0979 1 !-- ; 0980 1 ; 0981 1 LITERAL ; 0982 1 PKT_MARK = 0, ! ; 0983 1 PKT_COUNT = 1, ! ; 0984 1 PKT_SEQ = 2, ! ; 0985 1 PKT_TYPE = 3, ! ; 0986 1 PKT_MSG = 4, ! ; 0987 1 PKT_MAX_MSG = 94 - 5, ! Maximum size of the message dependent ; 0988 1 ! information ; 0989 1 PKT_CHKSUM = 0, ! offset from end of ; 0990 1 ! Message dependent information ; 0991 1 PKT_EOL = 1, ! offset from end of data ; 0992 1 PKT_OVR_HEAD_B = 2, ! Header overhead ; 0993 1 PKT_OVR_HEAD_E = 1, ! Overhead at the end ; 0994 1 PKT_OVR_HEAD = 3, ! Overhead added to data length ; 0995 1 PKT_TOT_OVR_HEAD = 6; ! Total overhead of the message ; 0996 1 ; 0997 1 %SBTTL 'KERMIT Protocol Definitions -- Message dependent field' ; 0998 1 ; 0999 1 !++ ; 1000 1 ! The MESSAGE-DEPENDENT information field of the message contains at ; 1001 1 ! least one part. That is the type of message. The remainder of the message ; 1002 1 ! MESSAGE-DEPENDENT field is different depending on the message. ; 1003 1 ! ; 1004 1 ! ; 1005 1 ! ; 1006 1 ! ; 1007 1 ! The type defines the type of message that is being processed. ; 1008 1 ! ; 1009 1 !-- ; 1010 1 ; 1011 1 ! Protocol version 1.0 message types ; 1012 1 ; 1013 1 LITERAL ; 1014 1 MSG_DATA = %C'D', ! Data packet ; 1015 1 MSG_ACK = %C'Y', ! Acknowledgement ; 1016 1 MSG_NAK = %C'N', ! Negative acknowledgement ; 1017 1 MSG_SND_INIT = %C'S', ! Send initiate ; 1018 1 MSG_BREAK = %C'B', ! Break transmission ; 1019 1 MSG_FILE = %C'F', ! File header ; 1020 1 MSG_EOF = %C'Z', ! End of file (EOF) ; 1021 1 MSG_ERROR = %C'E'; ! Error ; 1022 1 ; 1023 1 ! Protocol version 2.0 message types ; 1024 1 ; 1025 1 LITERAL ; 1026 1 MSG_RCV_INIT = %C'R', ! Receive initiate ; 1027 1 MSG_COMMAND = %C'C', ! Host command ; 1028 1 MSG_GENERIC = %C'G', ! Generic KERMIT command. ; 1029 1 MSG_KERMIT = %C'K'; ! Perform KERMIT command (text) ; 1030 1 ; 1031 1 ! Protocol version 4.0 message types ; 1032 1 ; 1033 1 LITERAL ; 1034 1 MSG_SER_INIT = %C'I', ! Server initialization ; 1035 1 MSG_TEXT = %C'X'; ! Text header message ; 1036 1 ; 1037 1 !++ ; 1038 1 ! Generic KERMIT commands ; 1039 1 !-- ; 1040 1 ; 1041 1 LITERAL ; 1042 1 MSG_GEN_LOGIN = %C'I', ! Login ; 1043 1 MSG_GEN_EXIT = %C'F', ! Finish (exit to OS) ; 1044 1 MSG_GEN_CONNECT = %C'C', ! Connect to a directory ; 1045 1 MSG_GEN_LOGOUT = %C'L', ! Logout ; 1046 1 MSG_GEN_DIRECTORY = %C'D', ! Directory ; 1047 1 MSG_GEN_DISK_USAGE = %C'U', ! Disk usage ; 1048 1 MSG_GEN_DELETE = %C'E', ! Delete a file ; 1049 1 MSG_GEN_TYPE = %C'T', ! Type a file specification ; 1050 1 ! MSG_GEN_SUBMIT = %C'S', ! Submit ; 1051 1 ! MSG_GEN_PRINT = %C'P', ! Print ; 1052 1 MSG_GEN_WHO = %C'W', ! Who's logged in ; 1053 1 MSG_GEN_SEND = %C'M', ! Send a message to a user ; 1054 1 MSG_GEN_HELP = %C'H', ! Help ; 1055 1 MSG_GEN_QUERY = %C'Q', ! Query status ; 1056 1 MSG_GEN_RENAME = %C'R', ! Rename file ; 1057 1 MSG_GEN_COPY = %C'K', ! Copy file ; 1058 1 MSG_GEN_PROGRAM = %C'P', ! Run program and pass data ; 1059 1 MSG_GEN_JOURNAL = %C'J', ! Perform journal functions ; 1060 1 MSG_GEN_VARIABLE = %C'V'; ! Return/set variable state ; 1061 1 ; 1062 1 ! ; 1063 1 ! Acknowledgement modifiers (protocol 4.0) ; 1064 1 ! ; 1065 1 ; 1066 1 LITERAL ; 1067 1 MSG_ACK_ABT_CUR = %C'X', ! Abort current file ; 1068 1 MSG_ACK_ABT_ALL = %C'Z'; ! Abort entire stream of files ; 1069 1 ; 1070 1 ! ; 1071 1 ! End of file packet modifier ; 1072 1 ! ; 1073 1 ; 1074 1 LITERAL ; 1075 1 MSG_EOF_DISCARD = %C'D'; ! Discard data from previous file ; 1076 1 ; 1077 1 %SBTTL 'KERMIT Protocol Definitions -- SEND initiate packet' ; 1078 1 ; 1079 1 !++ ; 1080 1 ! ; 1081 1 ! The following describes the send initiate packet. All fields in the message ; 1082 1 ! data area are optional. ; 1083 1 ! ; 1084 1 ! <"S"> ; 1085 1 ! <8-bit-quote> ; 1086 1 ! ; 1087 1 ! BUFSIZ ; 1088 1 ! Sending Kermit's maximum buffer size. ; 1089 1 ! ; 1090 1 ! Timeout ; 1091 1 ! Number of seconds after which the sending Kermit wishes to be timed out ; 1092 1 ! ; 1093 1 ! Npad ; 1094 1 ! Number of padding caracters the sending Kermit needs preceding each ; 1095 1 ! packet. ; 1096 1 ! ; 1097 1 ! PAD ; 1098 1 ! Padding character. ; 1099 1 ! ; 1100 1 ! EOL ; 1101 1 ! A line terminator required on all packets set by the receiving ; 1102 1 ! Kermit. ; 1103 1 ! ; 1104 1 ! Quote ; 1105 1 ! The printable ASCII characer the sending Kermit will use when quoting ; 1106 1 ! the control cahracters. Default is "#". ; 1107 1 ! ; 1108 1 ! 8-bit-quote ; 1109 1 ! Specify quoting mecanism for 8-bit quantities. A quoting mecanism is ; 1110 1 ! mecessary when sending to hosts which prevent the use of the 8th bit ; 1111 1 ! for data. When elected, the quoting mechanism will be used by both ; 1112 1 ! hosts, and the quote character must be in the range of 41-76 or 140-176 ; 1113 1 ! octal, but different from the control-quoting character. This field is ; 1114 1 ! interpreted as follows: ; 1115 1 ! ; 1116 1 ! "Y" - I agree to 8-bit quoting if you request it. ; 1117 1 ! "N" - I will not do 8-bit quoting. ; 1118 1 ! "&" - (or any other character in the range of 41-76 or 140-176) I want ; 1119 1 ! to do 8-bit quoting using this character (it will be done if the ; 1120 1 ! other Kermit puts a "Y" in this field. ; 1121 1 ! Anything else: Quoting will not be done. ; 1122 1 ! ; 1123 1 ! Check-type ; 1124 1 ! Type of block check. The only values presently allowed in this ; 1125 1 ! field are "1", "2" or "3". Future implementations may allow other ; 1126 1 ! values. Interpretation of the values is: ; 1127 1 ! ; 1128 1 ! "1" - Single character checksum. Default value if none specified. ; 1129 1 ! "2" - Double character checksum. ; 1130 1 ! "3" - Three character CRC. ; 1131 1 ! ; 1132 1 ! Repeat-count-processing ; 1133 1 ! The prefix character to be used to indicate a repeated character. ; 1134 1 ! This can be any printable cahracter other than blank (which denotes ; 1135 1 ! no repeat count). ; 1136 1 ! ; 1137 1 ! Fields 10 to 11 reserved. ; 1138 1 !-- ; 1139 1 ; 1140 1 LITERAL ; 1141 1 P_SI_BUFSIZ = 0, ! Buffersize ; 1142 1 MY_PKT_SIZE = 80, ! My packet size ; 1143 1 P_SI_TIMOUT = 1, ! Time out ; 1144 1 MY_TIME_OUT = 15, ! My time out ; 1145 1 P_SI_NPAD = 2, ! Number of padding characters ; 1146 1 MY_NPAD = 0, ! Amount of padding I require ; 1147 1 P_SI_PAD = 3, ! Padding character ; 1148 1 MY_PAD_CHAR = 0, ! My pad character ; 1149 1 P_SI_EOL = 4, ! End of line character ; 1150 1 MY_EOL_CHAR = %O'015', ! My EOL cahracter ; 1151 1 P_SI_QUOTE = 5, ! Quote character ; 1152 1 MY_QUOTE_CHAR = %C'#', ! My quoting character ; 1153 1 P_SI_8QUOTE = 6, ! 8-bit quote ; 1154 1 MY_8BIT_QUOTE = %C'&', ! Don't do it ; 1155 1 P_SI_CHKTYPE = 7, ! Checktype used ; 1156 1 MY_CHKTYPE = CHK_1CHAR, ! Use single character checksum ; 1157 1 P_SI_REPEAT = 8, ! Repeat character ; 1158 1 MY_REPEAT = %C'~', ! My repeat character ; 1159 1 P_SI_LENGTH = 9; ! Length of the message ; 1160 1 ; 1161 1 %SBTTL 'KERMIT Protocol States' ; 1162 1 ; 1163 1 !++ ; 1164 1 ! The following are the various states that KERMIT can be in. ; 1165 1 ! The state transitions are defined in the KERMIT Protocol manual. ; 1166 1 !-- ; 1167 1 ; 1168 1 LITERAL ; 1169 1 STATE_MIN = 1, ! Min state number ; 1170 1 STATE_S = 1, ! Send init state ; 1171 1 STATE_SF = 2, ! Send file header ; 1172 1 STATE_SD = 3, ! Send file data packet ; 1173 1 STATE_SZ = 4, ! Send EOF packet ; 1174 1 STATE_SB = 5, ! Send break ; 1175 1 STATE_R = 6, ! Receive state (wait for send-init) ; 1176 1 STATE_RF = 7, ! Receive file header packet ; 1177 1 STATE_RD = 8, ! Receive file data packet ; 1178 1 STATE_C = 9, ! Send complete ; 1179 1 STATE_A = 10, ! Abort ; 1180 1 STATE_SX = 11, ! Send text header ; 1181 1 STATE_SG = 12, ! Send generic command ; 1182 1 STATE_SI = 13, ! Send server init ; 1183 1 STATE_ID = 14, ! Server idle loop ; 1184 1 STATE_II = 15, ! Server idle after server init ; 1185 1 STATE_FI = 16, ! Server should exit ; 1186 1 STATE_LG = 17, ! Server should logout ; 1187 1 STATE_OF = 18, ! Send - open first input file ; 1188 1 STATE_EX = 19, ! Exit back to command parser ; 1189 1 STATE_ER = 20, ! Retries exceeded error ; 1190 1 STATE_MAX = 20; ! Max state number ; 1191 1 ; 1192 1 %SBTTL 'Internal constants' ; 1193 1 ; 1194 1 !++ ; 1195 1 ! The following represent various internal KERMSG constants. ; 1196 1 !-- ; 1197 1 ; 1198 1 LITERAL ; 1199 1 MAX_PKT_RETRIES = 16, ! Maximum packet retries ; 1200 1 MAX_SI_RETRIES = 5; ! Maximum send init retries ; 1201 1 ; 1202 1 %SBTTL 'Storage - External' ; 1203 1 ! ; 1204 1 ! OWN STORAGE: ; 1205 1 ! ; 1206 1 ; 1207 1 EXTERNAL ; 1208 1 ! ; 1209 1 ! Receive parameters ; 1210 1 ! ; 1211 1 RCV_PKT_SIZE, ! Receive packet size ; 1212 1 RCV_NPAD, ! Padding length ; 1213 1 RCV_PADCHAR, ! Padding character ; 1214 1 RCV_TIMEOUT, ! Time out ; 1215 1 RCV_EOL, ! EOL character ; 1216 1 RCV_QUOTE_CHR, ! Quote character ; 1217 1 RCV_SOH, ! Start of header character ; 1218 1 RCV_8QUOTE_CHR, ! 8-bit quoting character ; 1219 1 ! ; 1220 1 ! Miscellaneous parameters ; 1221 1 ! ; 1222 1 SET_REPT_CHR, ! Repeat character ; 1223 1 ! ; 1224 1 ! Send parameters ; 1225 1 ! ; 1226 1 SND_PKT_SIZE, ! Send packet size ; 1227 1 SND_NPAD, ! Padding length ; 1228 1 SND_PADCHAR, ! Padding character ; 1229 1 SND_TIMEOUT, ! Time out ; 1230 1 SND_EOL, ! EOL character ; 1231 1 SND_QUOTE_CHR, ! Quote character ; 1232 1 SND_SOH, ! Start of header character ; 1233 1 SEND_TIMEOUT, ! Time to wait for receiving message ; 1234 1 ! ; 1235 1 ! Server parameters ; 1236 1 ! ; 1237 1 SRV_TIMEOUT, ! Time between NAK's when server is idle ; 1238 1 ! ; 1239 1 ! Statistics ; 1240 1 ! ; 1241 1 SND_TOTAL_CHARS, ! Total characters sent ; 1242 1 RCV_TOTAL_CHARS, ! Total characters received ; 1243 1 SND_DATA_CHARS, ! Total number of data characters sent ; 1244 1 RCV_DATA_CHARS, ! Total number of data characters received ; 1245 1 SND_NAKS, ! Total NAKs sent ; 1246 1 RCV_NAKS, ! Total NAKs received ; 1247 1 SND_COUNT, ! Count of total number of packets ; 1248 1 RCV_COUNT, ! Count of total number packets received ; 1249 1 SMSG_COUNT, ! Total number of packets sent ; 1250 1 RMSG_COUNT, ! Total number of packets received ; 1251 1 SMSG_TOTAL_CHARS, ! Total chars sent this file xfer ; 1252 1 RMSG_TOTAL_CHARS, ! Total chars rcvd this file xfer ; 1253 1 SMSG_DATA_CHARS, ! Total data chars this file xfer ; 1254 1 RMSG_DATA_CHARS, ! Total data chars this file xfer ; 1255 1 SMSG_NAKS, ! Total number of NAKs this file xfer ; 1256 1 RMSG_NAKS, ! Total number of NAKs received ; 1257 1 XFR_TIME, ! Amount of time last xfr took ; 1258 1 TOTAL_TIME, ! Total time of all xfrs ; 1259 1 ! this file xfer ; 1260 1 LAST_ERROR : VECTOR [CH$ALLOCATION (MAX_MSG + 1)], ! Last error message ; 1261 1 ! ; 1262 1 ! Misc constants. ; 1263 1 ! ; 1264 1 FILE_NAME : VECTOR [CH$ALLOCATION (MAX_FILE_NAME)], ; 1265 1 FILE_SIZE, ; 1266 1 SI_RETRIES, ! Send init retries to attempt ; 1267 1 PKT_RETRIES, ! Number of retries to try for a message ; 1268 1 DELAY, ! Amount of time to delay ; 1269 1 DUPLEX, ! Type of connection (half or full) ; 1270 1 PARITY_TYPE, ! Type of parity to use ; 1271 1 DEV_PARITY_FLAG, ! True if output device does ; 1272 1 ! parity, false if we do it ; 1273 1 CHKTYPE, ! Type of block check desired ; 1274 1 ABT_FLAG, ! True if aborted file should be discarded ; 1275 1 DEBUG_FLAG, ! Debugging mode on/off ; 1276 1 WARN_FLAG, ! File warning flag ; 1277 1 IBM_CHAR, ! Turnaround character for IBM mode ; 1278 1 ECHO_FLAG, ! Local echo flag ; 1279 1 CONNECT_FLAG, ! Connected flag; True if ; 1280 1 ! terminal and SET LINE are ; 1281 1 ! the same ; 1282 1 ABT_CUR_FILE, ! Abort current file ; 1283 1 ABT_ALL_FILE, ! Abort all files in stream ; 1284 1 TYP_STS_FLAG, ! Type status next message ; 1285 1 TY_FIL, ! Type file specs ; 1286 1 TY_PKT, ! Type packet info ; 1287 1 FIL_NORMAL_FORM, ! If true, file names should be normalized ; 1288 1 GEN_1DATA : VECTOR [CH$ALLOCATION (MAX_MSG)], ! Data for generic command ; 1289 1 GEN_1SIZE, ! Size of data in GEN_1DATA ; 1290 1 GEN_2DATA : VECTOR [CH$ALLOCATION (MAX_MSG)], ! Second argument for generic command ; 1291 1 GEN_2SIZE, ! Size of data in GEN_2DATA ; 1292 1 GEN_3DATA : VECTOR [CH$ALLOCATION (MAX_MSG)], ! Third arg for generic command ; 1293 1 GEN_3SIZE; ! Size of data in GEN_3DATA ; 1294 1 ; 1295 1 %SBTTL 'Storage - Local' ; 1296 1 ! ; 1297 1 ! LOCAL OWN STORAGE: ; 1298 1 ! ; 1299 1 ; 1300 1 OWN ; 1301 1 ! ; 1302 1 ! Receive parameters ; 1303 1 ! ; 1304 1 RECV_8QUOTE_CHR, ! 8th-bit quoting character ; 1305 1 REPT_CHR, ! Repeat prefix character ; 1306 1 ! ; 1307 1 ! Send parameters ; 1308 1 ! ; 1309 1 SEND_PKT_SIZE, ! Send packet size ; 1310 1 SEND_NPAD, ! Padding length ; 1311 1 SEND_PADCHAR, ! Padding character ; 1312 1 SEND_EOL, ! EOL character ; 1313 1 SEND_QUOTE_CHR, ! Quote character ; 1314 1 SEND_8QUOTE_CHR, ! 8-bit quoting character ; 1315 1 ! ; 1316 1 ! Misc parameters ; 1317 1 ! ; 1318 1 INI_CHK_TYPE, ! Type of block checking from init message ; 1319 1 BLK_CHK_TYPE, ! Type of block check to use ; 1320 1 FLAG_8QUOTE, ! Flag to determine if doing 8bit quoting ; 1321 1 FLAG_REPEAT, ! True if doing repeated character compression ; 1322 1 STATE, ! Current state ; 1323 1 SIZE, ! Size of the current message ; 1324 1 OLD_RETRIES, ! Saved number of retries done. ; 1325 1 NUM_RETRIES, ! Number of retries ; 1326 1 MSG_NUMBER, ! Current message number ; 1327 1 REC_SEQ, ! Sequence number of msg in REC_MSG ; 1328 1 REC_LENGTH, ! Length of the message recv'd ; 1329 1 REC_TYPE, ! Type of the message received. ; 1330 1 REC_MSG : VECTOR [CH$ALLOCATION (MAX_MSG + 1, CHR_SIZE)], ! Message received ; 1331 1 SND_MSG : VECTOR [CH$ALLOCATION (MAX_MSG + 1, CHR_SIZE)], ! Message sent ; 1332 1 FILE_CHARS, ! Number of characters sent or received ; 1333 1 TEXT_HEAD_FLAG, ! Text header received, not file header ; 1334 1 NO_FILE_NEEDED, ! Don't open a file ; 1335 1 INIT_PKT_SENT, ! Server-init sent and ACKed ; 1336 1 GEN_TYPE, ! Command message type ; 1337 1 GEN_SUBTYPE, ! Generic command subtype ; 1338 1 GET_CHR_ROUTINE, ! Address of routine to get a character for BFR_FILL ; 1339 1 PUT_CHR_ROUTINE; ! Address of routine to put a character for BFR_EMPTY ; 1340 1 ! ; 1341 1 ! KERMSG Global storage ; 1342 1 ! ; 1343 1 GLOBAL ; 1344 1 FLAG_FILE_OPEN; ! File is opened. ; 1345 1 ; 1346 1 %SBTTL 'External references' ; 1347 1 ! ; 1348 1 ! EXTERNAL REFERENCES: ; 1349 1 ! ; 1350 1 ! Packet I/O routines ; 1351 1 ; 1352 1 EXTERNAL ROUTINE ; 1353 1 SEND, ! Send a packet to the remote ; 1354 1 IBM_WAIT, ! Wait for IBM turnaround ; 1355 1 RECEIVE; ! Receive a packet from the remote ; 1356 1 ; 1357 1 ! ; 1358 1 ! Terminal I/O routines ; 1359 1 ! ; 1360 1 ; 1361 1 EXTERNAL ROUTINE ; 1362 1 TERM_DUMP : NOVALUE, ! Normal terminal output ; 1363 1 DBG_DUMP : NOVALUE, ! Debugging output ; 1364 1 TT_SET_OUTPUT, ! Set output routine ; 1365 1 TT_CHAR : NOVALUE, ! Output a single character ; 1366 1 TT_CRLF : NOVALUE, ! Output a CRLF ; 1367 1 TT_NUMBER : NOVALUE, ! Output a three digit number to the ; 1368 1 ! terminal ; 1369 1 TT_TEXT : NOVALUE, ! Output a string to the user's ; 1370 1 TT_OUTPUT : NOVALUE; ! Force buffered output to terminal ; 1371 1 ; 1372 1 ! Operating system routines and misc routines ; 1373 1 ; 1374 1 EXTERNAL ROUTINE ; 1375 1 CRCCLC, ! Calculate a CRC-CCITT ; 1376 1 XFR_STATUS : NOVALUE, ! Routine to tell the user the ; 1377 1 ! status of a transfer ; 1378 1 KRM_ERROR : NOVALUE, ! Issue an error message ; 1379 1 SY_LOGOUT : NOVALUE, ! Log the job off ; 1380 1 SY_GENERIC, ! Perform a generic command ; 1381 1 SY_TIME, ! Return elapsed time in milliseconds ; 1382 1 SY_DISMISS : NOVALUE; ! Routine to dismiss for n seconds. ; 1383 1 ; 1384 1 ! ; 1385 1 ! External file processing routines ; 1386 1 ! ; 1387 1 ; 1388 1 EXTERNAL ROUTINE ; 1389 1 FILE_OPEN, ! Open a file for reading/writing ; 1390 1 FILE_CLOSE, ! Close an open file ; 1391 1 NEXT_FILE, ! Determine if there is a next file ; 1392 1 ! and open it for reading. ; 1393 1 GET_FILE, ! Get a byte from the file ; 1394 1 PUT_FILE; ! Put a byte in the file. ; 1395 1 ; 1396 1 %SBTTL 'MSG_INIT' ; 1397 1 ; 1398 1 GLOBAL ROUTINE MSG_INIT : NOVALUE = ; 1399 1 ; 1400 1 !++ ; 1401 1 ! FUNCTIONAL DESCRIPTION: ; 1402 1 ! ; 1403 1 ! This routine will initialize the message processing for ; 1404 1 ! KERMIT-32/36. ; 1405 1 ! ; 1406 1 ! CALLING SEQUENCE: ; 1407 1 ! ; 1408 1 ! MSG_INIT(); ; 1409 1 ! ; 1410 1 ! INPUT PARAMETERS: ; 1411 1 ! ; 1412 1 ! None. ; 1413 1 ! ; 1414 1 ! IMPLICIT INPUTS: ; 1415 1 ! ; 1416 1 ! None. ; 1417 1 ! ; 1418 1 ! OUTPUT PARAMETERS: ; 1419 1 ! ; 1420 1 ! None. ; 1421 1 ! ; 1422 1 ! IMPLICIT OUTPUTS: ; 1423 1 ! ; 1424 1 ! None. ; 1425 1 ! ; 1426 1 ! COMPLETION CODES: ; 1427 1 ! ; 1428 1 ! None. ; 1429 1 ! ; 1430 1 ! SIDE EFFECTS: ; 1431 1 ! ; 1432 1 ! None. ; 1433 1 ! ; 1434 1 !-- ; 1435 1 ; 1436 2 BEGIN ; 1437 2 ! ; 1438 2 ! Initialize some variables ; 1439 2 ! ; 1440 2 ! Receive parameters first ; 1441 2 ! ; 1442 2 RCV_PKT_SIZE = MY_PKT_SIZE; ; 1443 2 RCV_NPAD = MY_NPAD; ; 1444 2 RCV_PADCHAR = MY_PAD_CHAR; ; 1445 2 RCV_TIMEOUT = MY_TIME_OUT; ; 1446 2 RCV_EOL = MY_EOL_CHAR; ; 1447 2 RCV_QUOTE_CHR = MY_QUOTE_CHAR; ; 1448 2 RCV_SOH = CHR_SOH; ; 1449 2 RCV_8QUOTE_CHR = MY_8BIT_QUOTE; ; 1450 2 SET_REPT_CHR = MY_REPEAT; ; 1451 2 ! ; 1452 2 ! Send parameters. ; 1453 2 ! ; 1454 2 SND_PKT_SIZE = -MY_PKT_SIZE; ; 1455 2 SND_NPAD = -MY_NPAD; ; 1456 2 SND_PADCHAR = -MY_PAD_CHAR; ; 1457 2 SND_TIMEOUT = -MY_TIME_OUT; ; 1458 2 SND_EOL = -MY_EOL_CHAR; ; 1459 2 SND_QUOTE_CHR = -MY_QUOTE_CHAR; ; 1460 2 SND_SOH = CHR_SOH; ; 1461 2 ! ; 1462 2 ! Server parameters ; 1463 2 ! ; 1464 2 SRV_TIMEOUT = 5*MY_TIME_OUT; ; 1465 2 ! ; 1466 2 ! Other random parameters ; 1467 2 ! ; 1468 2 PKT_RETRIES = MAX_PKT_RETRIES; ! Number of retries per message ; 1469 2 SI_RETRIES = MAX_SI_RETRIES; ! Number of retries on send inits ; 1470 2 DELAY = INIT_DELAY; ; 1471 2 DUPLEX = DP_FULL; ! Use full duplex ; 1472 2 DEBUG_FLAG = FALSE; ; 1473 2 WARN_FLAG = FALSE; ; 1474 2 ECHO_FLAG = FALSE; ; 1475 2 BLK_CHK_TYPE = CHK_1CHAR; ! Start using single char checksum ; 1476 2 CHKTYPE = MY_CHKTYPE; ! Desired block check type ; 1477 2 INI_CHK_TYPE = .CHKTYPE; ! Same as default for now ; 1478 2 DEV_PARITY_FLAG = FALSE; ! We generate parity ; 1479 2 PARITY_TYPE = PR_NONE; ! No parity ; 1480 2 ABT_FLAG = TRUE; ! Discard incomplete files ; 1481 2 FLAG_FILE_OPEN = FALSE; ; 1482 2 IBM_CHAR = -1; ![044] No handsake by default ; 1483 2 TY_FIL = TRUE; ! Default to typing files ; 1484 2 TY_PKT = FALSE; ! But not packet numbers ; 1485 2 FIL_NORMAL_FORM = FNM_NORMAL; ! Default to normal form names ; 1486 2 GET_CHR_ROUTINE = GET_FILE; ![025] Initialize the get-a-char routine ; 1487 2 PUT_CHR_ROUTINE = PUT_FILE; ![025] And the put-a-char ; 1488 1 END; ! End of MSG_INIT .TITLE KERMSG KERMSG - Kermit message processing .IDENT \3.3.107\ .PSECT $OWN$,NOEXE,2 ;RECV_8QUOTE_CHR U.37: .BLKB 4 ;REPT_CHR U.38: .BLKB 4 ;SEND_PKT_SIZE U.39: .BLKB 4 ;SEND_NPAD U.40: .BLKB 4 ;SEND_PADCHAR U.41: .BLKB 4 ;SEND_EOL U.42: .BLKB 4 ;SEND_QUOTE_CHR U.43: .BLKB 4 ;SEND_8QUOTE_CHR U.44: .BLKB 4 ;INI_CHK_TYPE U.45: .BLKB 4 ;BLK_CHK_TYPE U.46: .BLKB 4 ;FLAG_8QUOTE U.47: .BLKB 4 ;FLAG_REPEAT U.48: .BLKB 4 ;STATE U.49: .BLKB 4 ;SIZE U.50: .BLKB 4 ;OLD_RETRIES U.51: .BLKB 4 ;NUM_RETRIES U.52: .BLKB 4 ;MSG_NUMBER U.53: .BLKB 4 ;REC_SEQ U.54: .BLKB 4 ;REC_LENGTH U.55: .BLKB 4 ;REC_TYPE U.56: .BLKB 4 ;REC_MSG U.57: .BLKB 100 ;SND_MSG U.58: .BLKB 100 ;FILE_CHARS U.59: .BLKB 4 ;TEXT_HEAD_FLAG U.60: .BLKB 4 ;NO_FILE_NEEDED U.61: .BLKB 4 ;INIT_PKT_SENT U.62: .BLKB 4 ;GEN_TYPE U.63: .BLKB 4 ;GEN_SUBTYPE U.64: .BLKB 4 ;GET_CHR_ROUTINE U.65: .BLKB 4 ;PUT_CHR_ROUTINE U.66: .BLKB 4 .PSECT $GLOBAL$,NOEXE,2 FLAG_FILE_OPEN:: .BLKB 4 FNM_NORMAL== 1 FNM_FULL== 2 FNM_UNTRAN== 4 PR_MIN== 0 PR_NONE== 0 PR_MARK== 1 PR_EVEN== 2 PR_ODD== 3 PR_SPACE== 4 PR_MAX== 4 GC_MIN== 1 GC_EXIT== 1 GC_DIRECTORY== 2 GC_DISK_USAGE== 3 GC_DELETE== 4 GC_TYPE== 5 GC_HELP== 6 GC_LOGOUT== 7 GC_LGN== 8 GC_CONNECT== 9 GC_RENAME== 10 GC_COPY== 11 GC_WHO== 12 GC_SEND_MSG== 13 GC_STATUS== 14 GC_COMMAND== 15 GC_KERMIT== 16 GC_JOURNAL== 17 GC_VARIABLE== 18 GC_PROGRAM== 19 GC_MAX== 19 DP_FULL== 0 DP_HALF== 1 CHK_1CHAR== 49 CHK_2CHAR== 50 CHK_CRC== 51 MAX_MSG== 96 .EXTRN RCV_PKT_SIZE, RCV_NPAD, RCV_PADCHAR, RCV_TIMEOUT, RCV_EOL, RCV_QUOTE_CHR, RCV_SOH .EXTRN RCV_8QUOTE_CHR, SET_REPT_CHR, SND_PKT_SIZE, SND_NPAD, SND_PADCHAR, SND_TIMEOUT, SND_EOL .EXTRN SND_QUOTE_CHR, SND_SOH, SEND_TIMEOUT, SRV_TIMEOUT, SND_TOTAL_CHARS, RCV_TOTAL_CHARS .EXTRN SND_DATA_CHARS, RCV_DATA_CHARS, SND_NAKS, RCV_NAKS, SND_COUNT, RCV_COUNT, SMSG_COUNT .EXTRN RMSG_COUNT, SMSG_TOTAL_CHARS, RMSG_TOTAL_CHARS, SMSG_DATA_CHARS, RMSG_DATA_CHARS, SMSG_NAKS .EXTRN RMSG_NAKS, XFR_TIME, TOTAL_TIME, LAST_ERROR, FILE_NAME, FILE_SIZE, SI_RETRIES, PKT_RETRIES .EXTRN DELAY, DUPLEX, PARITY_TYPE, DEV_PARITY_FLAG, CHKTYPE, ABT_FLAG, DEBUG_FLAG, WARN_FLAG .EXTRN IBM_CHAR, ECHO_FLAG, CONNECT_FLAG, ABT_CUR_FILE, ABT_ALL_FILE, TYP_STS_FLAG, TY_FIL .EXTRN TY_PKT, FIL_NORMAL_FORM, GEN_1DATA, GEN_1SIZE, GEN_2DATA, GEN_2SIZE, GEN_3DATA, GEN_3SIZE .EXTRN SEND, IBM_WAIT, RECEIVE, TERM_DUMP, DBG_DUMP, TT_SET_OUTPUT, TT_CHAR, TT_CRLF, TT_NUMBER .EXTRN TT_TEXT, TT_OUTPUT, CRCCLC, XFR_STATUS, KRM_ERROR, SY_LOGOUT, SY_GENERIC, SY_TIME .EXTRN SY_DISMISS, FILE_OPEN, FILE_CLOSE, NEXT_FILE, GET_FILE, PUT_FILE .PSECT $CODE$,NOWRT,2 .ENTRY MSG_INIT, ^M<> ;MSG_INIT, Save nothing ; 1398 MOVZBL #80, W^RCV_PKT_SIZE ;#80, RCV_PKT_SIZE ; 1442 CLRL W^RCV_NPAD ;RCV_NPAD ; 1443 CLRL W^RCV_PADCHAR ;RCV_PADCHAR ; 1444 MOVL #15, W^RCV_TIMEOUT ;#15, RCV_TIMEOUT ; 1445 MOVL #13, W^RCV_EOL ;#13, RCV_EOL ; 1446 MOVL #35, W^RCV_QUOTE_CHR ;#35, RCV_QUOTE_CHR ; 1447 MOVL #1, W^RCV_SOH ;#1, RCV_SOH ; 1448 MOVL #38, W^RCV_8QUOTE_CHR ;#38, RCV_8QUOTE_CHR ; 1449 MOVZBL #126, W^SET_REPT_CHR ;#126, SET_REPT_CHR ; 1450 CVTBL #-80, W^SND_PKT_SIZE ;#-80, SND_PKT_SIZE ; 1454 CLRL W^SND_NPAD ;SND_NPAD ; 1455 CLRL W^SND_PADCHAR ;SND_PADCHAR ; 1456 MNEGL #15, W^SND_TIMEOUT ;#15, SND_TIMEOUT ; 1457 MNEGL #13, W^SND_EOL ;#13, SND_EOL ; 1458 MNEGL #35, W^SND_QUOTE_CHR ;#35, SND_QUOTE_CHR ; 1459 MOVL #1, W^SND_SOH ;#1, SND_SOH ; 1460 MOVZBL #75, W^SRV_TIMEOUT ;#75, SRV_TIMEOUT ; 1464 MOVL #16, W^PKT_RETRIES ;#16, PKT_RETRIES ; 1468 MOVL #5, W^SI_RETRIES ;#5, SI_RETRIES ; 1469 MOVL #5, W^DELAY ;#5, DELAY ; 1470 CLRL W^DUPLEX ;DUPLEX ; 1471 CLRL W^DEBUG_FLAG ;DEBUG_FLAG ; 1472 CLRL W^WARN_FLAG ;WARN_FLAG ; 1473 CLRL W^ECHO_FLAG ;ECHO_FLAG ; 1474 MOVL #49, W^U.46 ;#49, U.46 ; 1475 MOVL #49, W^CHKTYPE ;#49, CHKTYPE ; 1476 MOVL W^CHKTYPE, W^U.45 ;CHKTYPE, U.45 ; 1477 CLRL W^DEV_PARITY_FLAG ;DEV_PARITY_FLAG ; 1478 CLRL W^PARITY_TYPE ;PARITY_TYPE ; 1479 MOVL #1, W^ABT_FLAG ;#1, ABT_FLAG ; 1480 CLRL W^FLAG_FILE_OPEN ;FLAG_FILE_OPEN ; 1481 MNEGL #1, W^IBM_CHAR ;#1, IBM_CHAR ; 1482 MOVL #1, W^TY_FIL ;#1, TY_FIL ; 1483 CLRL W^TY_PKT ;TY_PKT ; 1484 MOVL #1, W^FIL_NORMAL_FORM ;#1, FIL_NORMAL_FORM ; 1485 MOVAB W^GET_FILE, W^U.65 ;GET_FILE, U.65 ; 1486 MOVAB W^PUT_FILE, W^U.66 ;PUT_FILE, U.66 ; 1487 RET ; ; 1488 ; Routine Size: 186 bytes, Routine Base: $CODE$ + 0000 ; 1489 1 ; 1490 1 %SBTTL 'SND_ERROR' ; 1491 1 ; 1492 1 GLOBAL ROUTINE SND_ERROR (COUNT, ADDRESS) : NOVALUE = ; 1493 1 ; 1494 1 !++ ; 1495 1 ! FUNCTIONAL DESCRIPTION: ; 1496 1 ! ; 1497 1 ! This routine will send an error packet to the remote KERMIT. It ; 1498 1 ! is called with the count of characters and the address of the text. ; 1499 1 ! ; 1500 1 ! CALLING SEQUENCE: ; 1501 1 ! ; 1502 1 ! SND_ERROR(COUNT, %ASCII 'Error text'); ; 1503 1 ! ; 1504 1 ! INPUT PARAMETERS: ; 1505 1 ! ; 1506 1 ! None. ; 1507 1 ! ; 1508 1 ! IMPLICIT INPUTS: ; 1509 1 ! ; 1510 1 ! None. ; 1511 1 ! ; 1512 1 ! OUTPUT PARAMETERS: ; 1513 1 ! ; 1514 1 ! None. ; 1515 1 ! ; 1516 1 ! IMPLICIT OUTPUTS: ; 1517 1 ! ; 1518 1 ! None. ; 1519 1 ! ; 1520 1 ! COMPLETION CODES: ; 1521 1 ! ; 1522 1 ! None. ; 1523 1 ! ; 1524 1 ! SIDE EFFECTS: ; 1525 1 ! ; 1526 1 ! ; 1527 1 !-- ; 1528 1 ; 1529 2 BEGIN ; 1530 2 ! ; 1531 2 ! Pack the message into the buffer ; 1532 2 ! ; 1533 2 SET_STRING (CH$PTR (.ADDRESS), .COUNT, TRUE); ; 1534 2 BFR_FILL (TRUE); ; 1535 2 SET_STRING (0, 0, FALSE); ; 1536 2 ! ; 1537 2 ! Save the last error message also ; 1538 2 ! ; 1539 2 ; 1540 2 IF .COUNT GTR MAX_MSG THEN COUNT = MAX_MSG; ; 1541 2 ; 1542 2 CH$COPY (.COUNT, CH$PTR (.ADDRESS), 0, MAX_MSG + 1, CH$PTR (LAST_ERROR)); ; 1543 2 ; 1544 2 IF NOT SEND_PACKET (MSG_ERROR, .SIZE, .MSG_NUMBER) THEN RETURN KER_ABORTED; ; 1545 2 ; 1546 1 END; ! End of SND_ERROR .ENTRY SND_ERROR, ^M ;SND_ERROR, Save R2,R3,R4,R5 ; 1492 PUSHL #1 ;#1 ; 1533 PUSHL 4(AP) ;COUNT ; PUSHL 8(AP) ;ADDRESS ; CALLS #3, W^U.30 ;#3, U.30 ; PUSHL #1 ;#1 ; 1534 CALLS #1, W^U.29 ;#1, U.29 ; CLRQ -(SP) ;-(SP) ; 1535 CLRL -(SP) ;-(SP) ; CALLS #3, W^U.30 ;#3, U.30 ; CMPL 4(AP), #96 ;COUNT, #96 ; 1540 BLEQ 1$ ;1$ ; MOVZBL #96, 4(AP) ;#96, COUNT ; 1$: MOVC5 4(AP), @8(AP), #0, #97, W^LAST_ERROR ;COUNT, @ADDRESS, #0, #97, LAST_ERROR ; 1542 PUSHL W^U.53 ;U.53 ; 1544 PUSHL W^U.50 ;U.50 ; MOVZBL #69, -(SP) ;#69, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; RET ; ; 1546 ; Routine Size: 76 bytes, Routine Base: $CODE$ + 00BA ; 1547 1 ; 1548 1 %SBTTL 'SERVER - Server mode' ; 1549 1 ; 1550 1 GLOBAL ROUTINE SERVER = ; 1551 1 ; 1552 1 !++ ; 1553 1 ! FUNCTIONAL DESCRIPTION: ; 1554 1 ! ; 1555 1 ! This routine will handle the server function in the v2.0 protocol ; 1556 1 ! for KERMIT. This routine by it's nature will call various operating ; 1557 1 ! system routines to do things like logging off the system. ; 1558 1 ! ; 1559 1 ! CALLING SEQUENCE: ; 1560 1 ! ; 1561 1 ! EXIT_FLAG = SERVER(); ; 1562 1 ! ; 1563 1 ! INPUT PARAMETERS: ; 1564 1 ! ; 1565 1 ! None. ; 1566 1 ! ; 1567 1 ! IMPLICIT INPUTS: ; 1568 1 ! ; 1569 1 ! None. ; 1570 1 ! ; 1571 1 ! OUTPUT PARAMETERS: ; 1572 1 ! ; 1573 1 ! None. ; 1574 1 ! ; 1575 1 ! IMPLICIT OUTPUTS: ; 1576 1 ! ; 1577 1 ! None. ; 1578 1 ! ; 1579 1 ! COMPLETION CODES: ; 1580 1 ! ; 1581 1 ! None. ; 1582 1 ! ; 1583 1 ! SIDE EFFECTS: ; 1584 1 ! ; 1585 1 ! None. ; 1586 1 ! ; 1587 1 !-- ; 1588 1 ; 1589 2 BEGIN ; 1590 2 ; 1591 2 LOCAL ; 1592 2 STATUS; ! Status returned by various routines ; 1593 2 ; 1594 2 DO ; 1595 3 BEGIN ; 1596 3 INIT_XFR (); ; 1597 3 XFR_STATUS (%C'T', %C'I'); ! Now idle ; 1598 3 STATUS = DO_TRANSACTION (STATE_ID); ; 1599 3 END ; 1600 2 UNTIL .STATUS EQL KER_EXIT; ![107] Leave on EXIT but not abort ; 1601 2 ; 1602 2 RETURN .STATUS; ; 1603 1 END; ! End of GLOBAL ROUTINE SERVER .ENTRY SERVER, ^M ;SERVER, Save R2 ; 1550 1$: CALLS #0, W^U.32 ;#0, U.32 ; 1596 MOVZBL #73, -(SP) ;#73, -(SP) ; 1597 MOVZBL #84, -(SP) ;#84, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; PUSHL #14 ;#14 ; 1598 CALLS #1, W^U.1 ;#1, U.1 ; MOVL R0, R2 ;R0, STATUS ; CMPL R2, #134316203 ;STATUS, #134316203 ; 1600 BNEQ 1$ ;1$ ; MOVL R2, R0 ;STATUS, R0 ; 1602 RET ; ; 1603 ; Routine Size: 43 bytes, Routine Base: $CODE$ + 0106 ; 1604 1 ; 1605 1 %SBTTL 'SEND_SWITCH' ; 1606 1 ; 1607 1 GLOBAL ROUTINE SEND_SWITCH = ; 1608 1 ; 1609 1 !++ ; 1610 1 ! FUNCTIONAL DESCRIPTION: ; 1611 1 ! ; 1612 1 ! This routine is the state table switcher for sending files. It ; 1613 1 ! loops until either it is finished or an error is encountered. The ; 1614 1 ! routines called by SEND_SWITCH are responsible for changing the state. ; 1615 1 ! ; 1616 1 ! CALLING SEQUENCE: ; 1617 1 ! ; 1618 1 ! SEND_SWITCH(); ; 1619 1 ! ; 1620 1 ! INPUT PARAMETERS: ; 1621 1 ! ; 1622 1 ! None. ; 1623 1 ! ; 1624 1 ! IMPLICIT INPUTS: ; 1625 1 ! ; 1626 1 ! None. ; 1627 1 ! ; 1628 1 ! OUTPUT PARAMETERS: ; 1629 1 ! ; 1630 1 ! Returns: ; 1631 1 ! TRUE - File sent correctly. ; 1632 1 ! FALSE - Aborted sending the file. ; 1633 1 ! ; 1634 1 ! IMPLICIT OUTPUTS: ; 1635 1 ! ; 1636 1 ! None. ; 1637 1 ! ; 1638 1 ! COMPLETION CODES: ; 1639 1 ! ; 1640 1 ! None. ; 1641 1 ! ; 1642 1 ! SIDE EFFECTS: ; 1643 1 ! ; 1644 1 ! None. ; 1645 1 ! ; 1646 1 !-- ; 1647 1 ; 1648 2 BEGIN ; 1649 2 ; 1650 2 LOCAL ; 1651 2 STATUS; ! Status result ; 1652 2 ; 1653 2 IF .CONNECT_FLAG THEN SY_DISMISS (.DELAY); ! Sleep if the user wanted us to ; 1654 2 ; 1655 2 INIT_XFR (); ! Initialize for this transfer ; 1656 2 TEXT_HEAD_FLAG = FALSE; ! Set text flag correctly ; 1657 2 XFR_STATUS (%C'I', %C'S'); ! Start of file send ; 1658 2 STATUS = DO_TRANSACTION (STATE_S); ! Call routine to do real work ; 1659 2 XFR_STATUS (%C'T', %C'S'); ! Done with send ; 1660 2 RETURN .STATUS; ! Return the result ; 1661 1 END; .ENTRY SEND_SWITCH, ^M ;SEND_SWITCH, Save R2 ; 1607 BLBC W^CONNECT_FLAG, 1$ ;CONNECT_FLAG, 1$ ; 1653 PUSHL W^DELAY ;DELAY ; CALLS #1, W^SY_DISMISS ;#1, SY_DISMISS ; 1$: CALLS #0, W^U.32 ;#0, U.32 ; 1655 CLRL W^U.60 ;U.60 ; 1656 MOVZBL #83, -(SP) ;#83, -(SP) ; 1657 MOVZBL #73, -(SP) ;#73, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; PUSHL #1 ;#1 ; 1658 CALLS #1, W^U.1 ;#1, U.1 ; MOVL R0, R2 ;R0, STATUS ; MOVZBL #83, -(SP) ;#83, -(SP) ; 1659 MOVZBL #84, -(SP) ;#84, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; MOVL R2, R0 ;STATUS, R0 ; 1660 RET ; ; 1661 ; Routine Size: 65 bytes, Routine Base: $CODE$ + 0131 ; 1662 1 ; 1663 1 %SBTTL 'REC_SWITCH' ; 1664 1 ; 1665 1 GLOBAL ROUTINE REC_SWITCH = ; 1666 1 ; 1667 1 !++ ; 1668 1 ! FUNCTIONAL DESCRIPTION: ; 1669 1 ! ; 1670 1 ! This routine will cause file(s) to be received by the remote ; 1671 1 ! KERMIT. This routine contains the main loop for the sending of the ; 1672 1 ! data. ; 1673 1 ! ; 1674 1 ! CALLING SEQUENCE: ; 1675 1 ! ; 1676 1 ! REC_SWITCH(); ; 1677 1 ! ; 1678 1 ! INPUT PARAMETERS: ; 1679 1 ! ; 1680 1 ! None. ; 1681 1 ! ; 1682 1 ! IMPLICIT INPUTS: ; 1683 1 ! ; 1684 1 ! FILE_DESC - Descriptor describing the file to be received by ; 1685 1 ! the remote KERMIT. ; 1686 1 ! ; 1687 1 ! OUTPUT PARAMETERS: ; 1688 1 ! ; 1689 1 ! None. ; 1690 1 ! ; 1691 1 ! IMPLICIT OUTPUTS: ; 1692 1 ! ; 1693 1 ! None. ; 1694 1 ! ; 1695 1 ! COMPLETION CODES: ; 1696 1 ! ; 1697 1 ! True - File received correctly. ; 1698 1 ! FALSE - File transfer aborted. ; 1699 1 ! ; 1700 1 ! SIDE EFFECTS: ; 1701 1 ! ; 1702 1 ! None. ; 1703 1 ! ; 1704 1 !-- ; 1705 1 ; 1706 2 BEGIN ; 1707 2 ; 1708 2 LOCAL ; 1709 2 INIT_STATE, ! State to start up DO_TRANSACTION in ; 1710 2 STATUS; ! Status returned by various routines ; 1711 2 ; 1712 2 INIT_STATE = STATE_R; ! Initialize the state ; 1713 2 MSG_NUMBER = 0; ; 1714 2 INIT_XFR (); ! Initialize the per transfer info ; 1715 2 ! ; 1716 2 ! Determine if they said REC ; 1717 2 ! Send MSG_RCV_INIT and then receive the file ; 1718 2 ! ; 1719 2 ; 1720 2 IF .FILE_SIZE GTR 0 ; 1721 2 THEN ; 1722 3 BEGIN ; 1723 3 GEN_TYPE = MSG_RCV_INIT; ! Use receive-init message ; 1724 3 CH$MOVE (.FILE_SIZE, CH$PTR (FILE_NAME), CH$PTR (GEN_1DATA)); ; 1725 3 GEN_1SIZE = .FILE_SIZE; ! Save the length ; 1726 3 INIT_STATE = STATE_SI; ! Start out with server init ; 1727 2 END; ; 1728 2 ; 1729 2 ! ; 1730 2 ! Now receive the file normally ; 1731 2 ! ; 1732 2 XFR_STATUS (%C'I', %C'R'); ! Start of a file receive ; 1733 2 STATUS = DO_TRANSACTION (.INIT_STATE); ; 1734 2 XFR_STATUS (%C'T', %C'R'); ! End of file receive ; 1735 2 RETURN .STATUS; ! Return the result ; 1736 1 END; ! End of REC_SWITCH .ENTRY REC_SWITCH, ^M ;REC_SWITCH, Save R2,R3,R4,R5,R6,R7 ; 1665 MOVL #6, R7 ;#6, INIT_STATE ; 1712 CLRL W^U.53 ;U.53 ; 1713 CALLS #0, W^U.32 ;#0, U.32 ; 1714 MOVL W^FILE_SIZE, R6 ;FILE_SIZE, R6 ; 1720 BLEQ 1$ ;1$ ; MOVZBL #82, W^U.63 ;#82, U.63 ; 1723 MOVC3 R6, W^FILE_NAME, W^GEN_1DATA ;R6, FILE_NAME, GEN_1DATA ; 1724 MOVL R6, W^GEN_1SIZE ;R6, GEN_1SIZE ; 1725 MOVL #13, R7 ;#13, INIT_STATE ; 1726 1$: MOVZBL #82, -(SP) ;#82, -(SP) ; 1732 MOVZBL #73, -(SP) ;#73, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; PUSHL R7 ;INIT_STATE ; 1733 CALLS #1, W^U.1 ;#1, U.1 ; MOVL R0, R2 ;R0, STATUS ; MOVZBL #82, -(SP) ;#82, -(SP) ; 1734 MOVZBL #84, -(SP) ;#84, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; MOVL R2, R0 ;STATUS, R0 ; 1735 RET ; ; 1736 ; Routine Size: 83 bytes, Routine Base: $CODE$ + 0172 ; 1737 1 ; 1738 1 %SBTTL 'Server -- DO_GENERIC - Execute a generic command' ; 1739 1 ; 1740 1 GLOBAL ROUTINE DO_GENERIC (TYPE) = ; 1741 1 ; 1742 1 !++ ; 1743 1 ! FUNCTIONAL DESCRIPTION: ; 1744 1 ! ; 1745 1 ! This routine will send a generic command to the remote Kermit. ; 1746 1 ! it will do all the processing required for the generic command ; 1747 1 ! that was executed. It will return to the caller after the ; 1748 1 ! command has be executed. ; 1749 1 ! ; 1750 1 ! CALLING SEQUENCE: ; 1751 1 ! ; 1752 1 ! STATUS = DO_GENERIC (Command-type); ; 1753 1 ! ; 1754 1 ! INPUT PARAMETERS: ; 1755 1 ! ; 1756 1 ! Command-type -- Command type to be executed. ; 1757 1 ! ; 1758 1 ! IMPLICIT INPUTS: ; 1759 1 ! ; 1760 1 ! None. ; 1761 1 ! ; 1762 1 ! OUTPUT PARAMETERS: ; 1763 1 ! ; 1764 1 ! None. ; 1765 1 ! ; 1766 1 ! IMPLICIT OUTPUTS: ; 1767 1 ! ; 1768 1 ! None. ; 1769 1 ! ; 1770 1 ! COMPLETION CODES: ; 1771 1 ! ; 1772 1 ! None. ; 1773 1 ! ; 1774 1 ! SIDE EFFECTS: ; 1775 1 ! ; 1776 1 ! None. ; 1777 1 ! ; 1778 1 !-- ; 1779 1 ; 1780 2 BEGIN ; 1781 2 ; 1782 2 LOCAL ; 1783 2 INIT_STATE; ! Initial state for FSM ; 1784 2 ; 1785 2 ! ; 1786 2 ! Set up the per transfer items ; 1787 2 ! ; 1788 2 INIT_XFR (); ; 1789 2 NUM_RETRIES = 0; ; 1790 2 MSG_NUMBER = 0; ; 1791 2 ! ; 1792 2 ! These are all generic commands ; 1793 2 ! ; 1794 2 GEN_TYPE = MSG_GENERIC; ; 1795 2 ! ; 1796 2 ! Assume we will not need server init ; 1797 2 ! ; 1798 2 INIT_STATE = STATE_SG; ; 1799 2 ; 1800 2 CASE .TYPE FROM GC_MIN TO GC_MAX OF ; 1801 2 SET ; 1802 2 ; 1803 2 [GC_EXIT] : ; 1804 2 GEN_SUBTYPE = MSG_GEN_EXIT; ; 1805 2 ; 1806 2 [GC_LOGOUT] : ; 1807 2 GEN_SUBTYPE = MSG_GEN_LOGOUT; ; 1808 2 ; 1809 2 [GC_DIRECTORY] : ; 1810 3 BEGIN ; 1811 3 INIT_STATE = STATE_SI; ! We will need server-init ; 1812 3 GEN_SUBTYPE = MSG_GEN_DIRECTORY; ; 1813 2 END; ; 1814 2 ; 1815 2 [GC_DISK_USAGE] : ; 1816 3 BEGIN ; 1817 3 INIT_STATE = STATE_SI; ! We will need server-init ; 1818 3 GEN_SUBTYPE = MSG_GEN_DISK_USAGE; ; 1819 2 END; ; 1820 2 ; 1821 2 [GC_DELETE] : ; 1822 2 GEN_SUBTYPE = MSG_GEN_DELETE; ; 1823 2 ; 1824 2 [GC_TYPE] : ; 1825 3 BEGIN ; 1826 3 INIT_STATE = STATE_SI; ! We will need server-init ; 1827 3 GEN_SUBTYPE = MSG_GEN_TYPE; ; 1828 2 END; ; 1829 2 ; 1830 2 [GC_HELP] : ; 1831 3 BEGIN ; 1832 3 INIT_STATE = STATE_SI; ! We will need server-init ; 1833 3 GEN_SUBTYPE = MSG_GEN_HELP; ; 1834 2 END; ; 1835 2 ; 1836 2 [GC_LGN] : ; 1837 2 GEN_SUBTYPE = MSG_GEN_LOGIN; ! Login just gets ACK ; 1838 2 ; 1839 2 [GC_CONNECT] : ; 1840 2 GEN_SUBTYPE = MSG_GEN_CONNECT; ! CWD just gets ACK ; 1841 2 ; 1842 2 [GC_RENAME] : ; 1843 2 GEN_SUBTYPE = MSG_GEN_RENAME; ! Rename file just needs ACK ; 1844 2 ; 1845 2 [GC_COPY] : ; 1846 2 GEN_SUBTYPE = MSG_GEN_COPY; ! Copy file just needs ACK ; 1847 2 ; 1848 2 [GC_WHO] : ; 1849 3 BEGIN ; 1850 3 INIT_STATE = STATE_SI; ! May get large response ; 1851 3 GEN_SUBTYPE = MSG_GEN_WHO; ; 1852 2 END; ; 1853 2 ; 1854 2 [GC_SEND_MSG] : ; 1855 2 GEN_SUBTYPE = MSG_GEN_SEND; ! Just need an ACK ; 1856 2 ; 1857 2 [GC_STATUS] : ; 1858 3 BEGIN ; 1859 3 INIT_STATE = STATE_SI; ! May get large response ; 1860 3 GEN_SUBTYPE = MSG_GEN_QUERY; ; 1861 2 END; ; 1862 2 ; 1863 2 [GC_COMMAND] : ; 1864 3 BEGIN ; 1865 3 INIT_STATE = STATE_SI; ! Large response likely ; 1866 3 GEN_TYPE = MSG_COMMAND; ! This is host command ; 1867 2 END; ; 1868 2 ; 1869 2 [GC_KERMIT] : ; 1870 2 GEN_TYPE = MSG_KERMIT; ! Perform Kermit command (short response) ; 1871 2 ; 1872 2 [GC_PROGRAM] : ; 1873 3 BEGIN ; 1874 3 INIT_STATE = STATE_SI; ! Assume large response ; 1875 3 GEN_SUBTYPE = MSG_GEN_PROGRAM; ! Generic program command ; 1876 2 END; ; 1877 2 ; 1878 2 [GC_JOURNAL] : ; 1879 2 GEN_SUBTYPE = MSG_GEN_JOURNAL; ! Do journal function (short reply) ; 1880 2 ; 1881 2 [GC_VARIABLE] : ; 1882 2 GEN_SUBTYPE = MSG_GEN_VARIABLE; ! Set or get a variable value ; 1883 2 ; 1884 2 [INRANGE, OUTRANGE] : ; 1885 3 BEGIN ; 1886 3 KRM_ERROR (KER_UNIMPLGEN); ; 1887 3 RETURN STATE_A; ; 1888 2 END; ; 1889 2 TES; ; 1890 2 ; 1891 2 RETURN DO_TRANSACTION (.INIT_STATE); ! Go do the command ; 1892 1 END; ! End of DO_GENERIC .ENTRY DO_GENERIC, ^M ;DO_GENERIC, Save R2,R3 ; 1740 MOVAB W^U.64, R3 ;U.64, R3 ; CALLS #0, W^U.32 ;#0, U.32 ; 1788 CLRQ -240(R3) ;NUM_RETRIES ; 1789 MOVZBL #71, -4(R3) ;#71, GEN_TYPE ; 1794 MOVL #12, R2 ;#12, INIT_STATE ; 1798 CASEL 4(AP), #1, #18 ;TYPE, #1, #18 ; 1800 1$: .WORD 2$-1$,- ;2$-1$,- ; 4$-1$,- ;4$-1$,- ; 5$-1$,- ;5$-1$,- ; 6$-1$,- ;6$-1$,- ; 7$-1$,- ;7$-1$,- ; 8$-1$,- ;8$-1$,- ; 3$-1$,- ;3$-1$,- ; 9$-1$,- ;9$-1$,- ; 10$-1$,- ;10$-1$,- ; 11$-1$,- ;11$-1$,- ; 12$-1$,- ;12$-1$,- ; 13$-1$,- ;13$-1$,- ; 14$-1$,- ;14$-1$,- ; 15$-1$,- ;15$-1$,- ; 16$-1$,- ;16$-1$,- ; 17$-1$,- ;17$-1$,- ; 19$-1$,- ;19$-1$,- ; 21$-1$,- ;21$-1$,- ; 18$-1$ ;18$-1$ ; PUSHL #134316210 ;#134316210 ; 1886 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; MOVL #10, R0 ;#10, R0 ; 1887 RET ; ; 2$: MOVZBL #70, (R3) ;#70, GEN_SUBTYPE ; 1804 BRB 20$ ;20$ ; 3$: MOVZBL #76, (R3) ;#76, GEN_SUBTYPE ; 1807 BRB 22$ ;22$ ; 4$: MOVL #13, R2 ;#13, INIT_STATE ; 1811 MOVZBL #68, (R3) ;#68, GEN_SUBTYPE ; 1812 BRB 22$ ;22$ ; 5$: MOVL #13, R2 ;#13, INIT_STATE ; 1817 MOVZBL #85, (R3) ;#85, GEN_SUBTYPE ; 1818 BRB 22$ ;22$ ; 6$: MOVZBL #69, (R3) ;#69, GEN_SUBTYPE ; 1822 BRB 22$ ;22$ ; 7$: MOVL #13, R2 ;#13, INIT_STATE ; 1826 MOVZBL #84, (R3) ;#84, GEN_SUBTYPE ; 1827 BRB 22$ ;22$ ; 8$: MOVL #13, R2 ;#13, INIT_STATE ; 1832 MOVZBL #72, (R3) ;#72, GEN_SUBTYPE ; 1833 BRB 22$ ;22$ ; 9$: MOVZBL #73, (R3) ;#73, GEN_SUBTYPE ; 1837 BRB 22$ ;22$ ; 10$: MOVZBL #67, (R3) ;#67, GEN_SUBTYPE ; 1840 BRB 22$ ;22$ ; 11$: MOVZBL #82, (R3) ;#82, GEN_SUBTYPE ; 1843 BRB 22$ ;22$ ; 12$: MOVZBL #75, (R3) ;#75, GEN_SUBTYPE ; 1846 BRB 22$ ;22$ ; 13$: MOVL #13, R2 ;#13, INIT_STATE ; 1850 MOVZBL #87, (R3) ;#87, GEN_SUBTYPE ; 1851 BRB 22$ ;22$ ; 14$: MOVZBL #77, (R3) ;#77, GEN_SUBTYPE ; 1855 BRB 22$ ;22$ ; 15$: MOVL #13, R2 ;#13, INIT_STATE ; 1859 MOVZBL #81, (R3) ;#81, GEN_SUBTYPE ; 1860 BRB 22$ ;22$ ; 16$: MOVL #13, R2 ;#13, INIT_STATE ; 1865 MOVZBL #67, -4(R3) ;#67, GEN_TYPE ; 1866 BRB 22$ ;22$ ; 17$: MOVZBL #75, -4(R3) ;#75, GEN_TYPE ; 1870 BRB 22$ ;22$ ; 18$: MOVL #13, R2 ;#13, INIT_STATE ; 1874 MOVZBL #80, (R3) ;#80, GEN_SUBTYPE ; 1875 BRB 22$ ;22$ ; 19$: MOVZBL #74, (R3) ;#74, GEN_SUBTYPE ; 1879 20$: BRB 22$ ;22$ ; 21$: MOVZBL #86, (R3) ;#86, GEN_SUBTYPE ; 1882 22$: PUSHL R2 ;INIT_STATE ; 1891 CALLS #1, W^U.1 ;#1, U.1 ; RET ; ; 1892 ; Routine Size: 228 bytes, Routine Base: $CODE$ + 01C5 ; 1893 1 ; 1894 1 %SBTTL 'DO_TRANSACTION - Main loop for FSM' ; 1895 1 ROUTINE DO_TRANSACTION (INIT_STATE) = ; 1896 1 ; 1897 1 !++ ; 1898 1 ! FUNCTIONAL DESCRIPTION: ; 1899 1 ! ; 1900 1 ! This is the main routine for performing a Kermit transaction. ; 1901 1 ! It is structured as a finite state machine with each state ; 1902 1 ! determining the next based upon the packet which is received. ; 1903 1 ! It is supplied with the initial state by the caller. ; 1904 1 ! ; 1905 1 ! CALLING SEQUENCE: ; 1906 1 ! ; 1907 1 ! Status = DO_TRANSACTION(.INIT_STATE); ; 1908 1 ! ; 1909 1 ! INPUT PARAMETERS: ; 1910 1 ! ; 1911 1 ! INIT_STATE - Initial state. ; 1912 1 ! ; 1913 1 ! IMPLICIT INPUTS: ; 1914 1 ! ; 1915 1 ! None. ; 1916 1 ! ; 1917 1 ! OUTPUT PARAMETERS: ; 1918 1 ! ; 1919 1 ! None. ; 1920 1 ! ; 1921 1 ! IMPLICIT OUTPUTS: ; 1922 1 ! ; 1923 1 ! None. ; 1924 1 ! ; 1925 1 ! COMPLETION CODES: ; 1926 1 ! ; 1927 1 ! None. ; 1928 1 ! ; 1929 1 ! SIDE EFFECTS: ; 1930 1 ! ; 1931 1 ! None. ; 1932 1 ! ; 1933 1 !-- ; 1934 1 ; 1935 2 BEGIN ; 1936 2 ; 1937 2 LOCAL ; 1938 2 RETURN_VALUE; ; 1939 2 ; 1940 2 NUM_RETRIES = 0; ! Initialize the number of retries ; 1941 2 STATE = .INIT_STATE; ! Initialize the state ; 1942 2 ; 1943 2 WHILE TRUE DO ; 1944 2 ; 1945 2 CASE .STATE FROM STATE_MIN TO STATE_MAX OF ; 1946 2 SET ; 1947 2 ! ; 1948 2 ! Send states ; 1949 2 ! ; 1950 2 ; 1951 2 [STATE_ID] : ; 1952 2 ! ; 1953 2 ! Server while idle. Set the timeout to twice the normal wait ; 1954 2 ! and wait for something to show up ; 1955 2 ! ; 1956 3 BEGIN ; 1957 3 ; 1958 3 LOCAL ; 1959 3 SAVED_TIMEOUT; ; 1960 3 ; 1961 3 SAVED_TIMEOUT = .SEND_TIMEOUT; ; 1962 3 ; 1963 3 IF .SEND_TIMEOUT NEQ 0 THEN SEND_TIMEOUT = .SRV_TIMEOUT; ; 1964 3 ; 1965 3 STATE = REC_SERVER_IDLE (); ; 1966 3 SEND_TIMEOUT = .SAVED_TIMEOUT; ; 1967 2 END; ; 1968 2 ; 1969 2 [STATE_II] : ; 1970 2 ! ; 1971 2 ! Here while server idle after having received a server-init packet ; 1972 2 ! ; 1973 2 STATE = REC_SERVER_IDLE (); ; 1974 2 ; 1975 2 [STATE_FI, STATE_LG] : ; 1976 2 ! ; 1977 2 ! Here when we are supposed to exit ; 1978 2 ! ; 1979 2 RETURN KER_EXIT; ; 1980 2 ; 1981 2 [STATE_SD] : ; 1982 2 STATE = SEND_DATA (); ; 1983 2 ; 1984 2 [STATE_SF] : ; 1985 2 STATE = SEND_FILE (); ; 1986 2 ; 1987 2 [STATE_SZ] : ; 1988 2 STATE = SEND_EOF (); ; 1989 2 ; 1990 2 [STATE_S] : ; 1991 2 STATE = SEND_INIT (); ; 1992 2 ; 1993 2 [STATE_OF] : ; 1994 2 STATE = SEND_OPEN_FILE (); ; 1995 2 ; 1996 2 [STATE_SI] : ; 1997 2 STATE = SEND_SERVER_INIT (); ; 1998 2 ; 1999 2 [STATE_SG] : ; 2000 2 STATE = SEND_GENCMD (); ; 2001 2 ; 2002 2 [STATE_SB] : ; 2003 2 STATE = SEND_BREAK (); ; 2004 2 ! ; 2005 2 ! Receiving of the data and the end of file message. ; 2006 2 ! ; 2007 2 ; 2008 2 [STATE_RD] : ; 2009 2 STATE = REC_DATA (); ; 2010 2 ! ; 2011 2 ! Receiving the FILE information of the break to end the transfer of ; 2012 2 ! one or more files ; 2013 2 ! ; 2014 2 ; 2015 2 [STATE_RF] : ; 2016 2 STATE = REC_FILE (); ; 2017 2 ! ; 2018 2 ! Initialization for the receiving of a file ; 2019 2 ! ; 2020 2 ; 2021 2 [STATE_R] : ; 2022 2 STATE = REC_INIT (); ; 2023 2 ! ; 2024 2 ! Here if we have completed the receiving of the file ; 2025 2 ! ; 2026 2 ; 2027 2 [STATE_C] : ; 2028 3 BEGIN ; 2029 3 RETURN_VALUE = TRUE; ; 2030 3 EXITLOOP; ; 2031 2 END; ; 2032 2 ! ; 2033 2 ! Here if we aborted the transfer or we have gotten into some random ; 2034 2 ! state (internal KERMSG problem). ; 2035 2 ! ; 2036 2 ; 2037 2 [STATE_A, STATE_EX, STATE_ER, INRANGE, OUTRANGE] : ; 2038 3 BEGIN ; 2039 3 RETURN_VALUE = FALSE; ; 2040 3 ; 2041 3 IF .STATE EQL STATE_EX THEN RETURN_VALUE = KER_ABORTED; ; 2042 3 ; 2043 3 ! ; 2044 3 ! Determine if the file is still open and if so close it ; 2045 3 ! ; 2046 3 ; 2047 3 IF .FLAG_FILE_OPEN ; 2048 3 THEN ; 2049 4 BEGIN ; 2050 4 FLAG_FILE_OPEN = FALSE; ; 2051 4 ; 2052 4 IF ( NOT .CONNECT_FLAG) AND .TY_FIL ; 2053 4 THEN ; 2054 5 BEGIN ; 2055 5 TT_TEXT (UPLIT (%ASCIZ' [Aborted]')); ; 2056 5 TT_CRLF (); ; 2057 4 END; ; 2058 4 ; 2059 5 FILE_CLOSE (.ABT_FLAG AND (.STATE EQL STATE_A OR .STATE EQL STATE_EX OR .STATE ; 2060 4 EQL STATE_ER)); ; 2061 4 XFR_STATUS (%C'F', %C'A'); ; 2062 3 END; ; 2063 3 ; 2064 3 ! ; 2065 3 ! Give error if aborted due to too many retries ; 2066 3 ! ; 2067 3 ; 2068 3 IF .STATE EQL STATE_ER THEN KRM_ERROR (KER_RETRIES); ; 2069 3 ; 2070 3 EXITLOOP; ; 2071 2 END; ; 2072 2 TES; ; 2073 2 ; 2074 2 ! ; 2075 2 ! End the stats and return to the caller ; 2076 2 ! ; 2077 2 END_STATS (); ; 2078 2 ! ; 2079 2 RETURN .RETURN_VALUE; ; 2080 1 END; ! End of DO_TRANSACTION .PSECT $PLIT$,NOWRT,NOEXE,2 P.AAA: .ASCII \ [Aborted]\<0><0> ; ; .PSECT $CODE$,NOWRT,2 ;DO_TRANSACTION U.1: .WORD ^M ;Save R2,R3,R4,R5,R6 ; 1895 MOVAB W^SEND_TIMEOUT, R6 ;SEND_TIMEOUT, R6 ; MOVAB W^U.49, R5 ;U.49, R5 ; CLRL 12(R5) ;NUM_RETRIES ; 1940 MOVL 4(AP), (R5) ;INIT_STATE, STATE ; 1941 1$: CASEL (R5), #1, #19 ;STATE, #1, #19 ; 1945 2$: .WORD 18$-2$,- ;18$-2$,- ; 16$-2$,- ;16$-2$,- ; 15$-2$,- ;15$-2$,- ; 17$-2$,- ;17$-2$,- ; 22$-2$,- ;22$-2$,- ; 25$-2$,- ;25$-2$,- ; 24$-2$,- ;24$-2$,- ; 23$-2$,- ;23$-2$,- ; 28$-2$,- ;28$-2$,- ; 3$-2$,- ;3$-2$,- ; 3$-2$,- ;3$-2$,- ; 21$-2$,- ;21$-2$,- ; 20$-2$,- ;20$-2$,- ; 11$-2$,- ;11$-2$,- ; 13$-2$,- ;13$-2$,- ; 14$-2$,- ;14$-2$,- ; 14$-2$,- ;14$-2$,- ; 19$-2$,- ;19$-2$,- ; 3$-2$,- ;3$-2$,- ; 3$-2$ ;3$-2$ ; 3$: CLRL R3 ;RETURN_VALUE ; 2039 CMPL (R5), #19 ;STATE, #19 ; 2041 BNEQ 4$ ;4$ ; MOVL #134316258, R3 ;#134316258, RETURN_VALUE ; 4$: BLBC W^FLAG_FILE_OPEN, 9$ ;FLAG_FILE_OPEN, 9$ ; 2047 CLRL W^FLAG_FILE_OPEN ;FLAG_FILE_OPEN ; 2050 BLBS W^CONNECT_FLAG, 5$ ;CONNECT_FLAG, 5$ ; 2052 BLBC W^TY_FIL, 5$ ;TY_FIL, 5$ ; PUSHAB W^P.AAA ;P.AAA ; 2055 CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 2056 5$: MOVL (R5), R2 ;STATE, R2 ; 2059 CLRL R0 ;R0 ; CMPL R2, #10 ;R2, #10 ; BNEQ 6$ ;6$ ; INCL R0 ;R0 ; 6$: CLRL R1 ;R1 ; CMPL R2, #19 ;R2, #19 ; BNEQ 7$ ;7$ ; INCL R1 ;R1 ; 7$: BISL2 R0, R1 ;R0, R1 ; CLRL R0 ;R0 ; 2060 CMPL R2, #20 ;R2, #20 ; BNEQ 8$ ;8$ ; INCL R0 ;R0 ; 8$: BISL2 R1, R0 ;R1, R0 ; MCOML W^ABT_FLAG, R4 ;ABT_FLAG, R4 ; 2059 BICL3 R4, R0, -(SP) ;R4, R0, -(SP) ; CALLS #1, W^FILE_CLOSE ;#1, FILE_CLOSE ; MOVZBL #65, -(SP) ;#65, -(SP) ; 2061 MOVZBL #70, -(SP) ;#70, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; 9$: CMPL (R5), #20 ;STATE, #20 ; 2068 BNEQ 10$ ;10$ ; PUSHL #134316194 ;#134316194 ; CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; 10$: BRB 29$ ;29$ ; 11$: MOVL (R6), R2 ;SEND_TIMEOUT, SAVED_TIMEOUT ; 1961 BEQL 12$ ;12$ ; 1963 MOVL W^SRV_TIMEOUT, (R6) ;SRV_TIMEOUT, SEND_TIMEOUT ; 12$: CALLS #0, W^U.10 ;#0, U.10 ; 1965 MOVL R0, (R5) ;R0, STATE ; MOVL R2, (R6) ;SAVED_TIMEOUT, SEND_TIMEOUT ; 1966 BRB 27$ ;27$ ; 13$: CALLS #0, W^U.10 ;#0, U.10 ; 1973 BRB 26$ ;26$ ; 14$: MOVL #134316203, R0 ;#134316203, R0 ; 1979 RET ; ; 15$: CALLS #0, W^U.3 ;#0, U.3 ; 1982 BRB 26$ ;26$ ; 16$: CALLS #0, W^U.4 ;#0, U.4 ; 1985 BRB 26$ ;26$ ; 17$: CALLS #0, W^U.7 ;#0, U.7 ; 1988 BRB 26$ ;26$ ; 18$: CALLS #0, W^U.8 ;#0, U.8 ; 1991 BRB 26$ ;26$ ; 19$: CALLS #0, W^U.5 ;#0, U.5 ; 1994 BRB 26$ ;26$ ; 20$: CALLS #0, W^U.2 ;#0, U.2 ; 1997 BRB 26$ ;26$ ; 21$: CALLS #0, W^U.6 ;#0, U.6 ; 2000 BRB 26$ ;26$ ; 22$: CALLS #0, W^U.9 ;#0, U.9 ; 2003 BRB 26$ ;26$ ; 23$: CALLS #0, W^U.13 ;#0, U.13 ; 2009 BRB 26$ ;26$ ; 24$: CALLS #0, W^U.12 ;#0, U.12 ; 2016 BRB 26$ ;26$ ; 25$: CALLS #0, W^U.11 ;#0, U.11 ; 2022 26$: MOVL R0, (R5) ;R0, STATE ; 27$: BRW 1$ ;1$ ; 28$: MOVL #1, R3 ;#1, RETURN_VALUE ; 2029 29$: CALLS #0, W^U.18 ;#0, U.18 ; 2077 MOVL R3, R0 ;RETURN_VALUE, R0 ; 2079 RET ; ; 2080 ; Routine Size: 322 bytes, Routine Base: $CODE$ + 02A9 ; 2081 1 %SBTTL 'REC_SERVER_IDLE - Idle server state' ; 2082 1 ROUTINE REC_SERVER_IDLE = ; 2083 1 ; 2084 1 !++ ; 2085 1 ! FUNCTIONAL DESCRIPTION: ; 2086 1 ! ; 2087 1 ! This routine is called from DO_TRANSACTION when is the server idle ; 2088 1 ! state. It will receive a message and properly dispatch to the new ; 2089 1 ! state. ; 2090 1 ! ; 2091 1 ! CALLING SEQUENCE: ; 2092 1 ! ; 2093 1 ! STATE = REC_SERVER_IDLE (); ; 2094 1 ! ; 2095 1 ! INPUT PARAMETERS: ; 2096 1 ! ; 2097 1 ! None. ; 2098 1 ! ; 2099 1 ! IMPLICIT INPUTS: ; 2100 1 ! ; 2101 1 ! Almost everything. ; 2102 1 ! ; 2103 1 ! OUPTUT PARAMETERS: ; 2104 1 ! ; 2105 1 ! Routine value is new state for FSM ; 2106 1 ! ; 2107 1 ! IMPLICIT OUTPUTS: ; 2108 1 ! ; 2109 1 ! None. ; 2110 1 ! ; 2111 1 ! COMPLETION CODES: ; 2112 1 ! ; 2113 1 ! None. ; 2114 1 ! ; 2115 1 ! SIDE EFFECTS: ; 2116 1 ! ; 2117 1 ! None. ; 2118 1 ! ; 2119 1 !-- ; 2120 1 ; 2121 2 BEGIN ; 2122 2 ; 2123 2 LOCAL ; 2124 2 STATUS; ; 2125 2 ; 2126 2 STATUS = REC_PACKET (); ; 2127 2 ! ; 2128 2 ! Now determine what to do by the type of message we have receive. ; 2129 2 ! ; 2130 2 ; 2131 2 IF .STATUS EQL KER_ABORTED THEN RETURN STATE_EX; ; 2132 2 ; 2133 2 IF .STATUS ; 2134 2 THEN ; 2135 3 BEGIN ; 2136 3 ; 2137 3 SELECTONE .REC_TYPE OF ; 2138 3 SET ; 2139 3 ! ; 2140 3 ! Server initialization message received. ACK the ; 2141 3 ! message and continue. ; 2142 3 ! ; 2143 3 ; 2144 3 [MSG_SER_INIT] : ; 2145 4 BEGIN ; 2146 4 ; 2147 5 IF (STATUS = PRS_SEND_INIT ()) ; 2148 4 THEN ; 2149 5 BEGIN ; 2150 5 SET_SEND_INIT (); ; 2151 5 ; 2152 6 IF (STATUS = SEND_PACKET (MSG_ACK, P_SI_LENGTH, .REC_SEQ)) ; 2153 5 THEN ; 2154 6 BEGIN ; 2155 6 SND_PKT_SIZE = -.SEND_PKT_SIZE; ; 2156 6 SND_TIMEOUT = -.SEND_TIMEOUT; ; 2157 6 SND_NPAD = -.SEND_NPAD; ; 2158 6 SND_PADCHAR = -.SEND_PADCHAR; ; 2159 6 SND_EOL = -.SEND_EOL; ; 2160 6 SND_QUOTE_CHR = -.SEND_QUOTE_CHR; ; 2161 6 RCV_8QUOTE_CHR = .SEND_8QUOTE_CHR; ; 2162 6 CHKTYPE = .INI_CHK_TYPE; ; 2163 6 SET_REPT_CHR = .REPT_CHR; ; 2164 6 RETURN STATE_II; ! Now idle after INIT ; 2165 5 END; ; 2166 5 ; 2167 4 END; ; 2168 4 ; 2169 4 KRM_ERROR (KER_PROTOERR); ; 2170 4 RETURN STATE_A; ; 2171 3 END; ; 2172 3 ! ; 2173 3 ! Send init message received. We must ACK the message and ; 2174 3 ! then attempt to receive a file from the remote. ; 2175 3 ! ; 2176 3 ; 2177 3 [MSG_SND_INIT] : ; 2178 4 BEGIN ; 2179 4 MSG_NUMBER = (.REC_SEQ + 1) AND %O'77'; ; 2180 4 ; 2181 5 IF (STATUS = PRS_SEND_INIT ()) ; 2182 4 THEN ; 2183 5 BEGIN ; 2184 5 SET_SEND_INIT (); ; 2185 5 ! ; 2186 5 ! ACK the message then receive everything. ; 2187 5 ! ; 2188 5 ; 2189 5 IF SEND_PACKET (MSG_ACK, P_SI_LENGTH, .REC_SEQ) ; 2190 5 THEN ; 2191 6 BEGIN ; 2192 6 BLK_CHK_TYPE = .INI_CHK_TYPE; ! Switch to desired form of block check ; 2193 6 XFR_STATUS (%C'I', %C'R'); ! Start of file receive ; 2194 6 RETURN STATE_RF; ; 2195 5 END; ; 2196 5 ; 2197 4 END; ; 2198 4 ; 2199 4 KRM_ERROR (KER_PROTOERR); ; 2200 4 RETURN STATE_A; ; 2201 3 END; ; 2202 3 ! ; 2203 3 ! Here if we receive a receive init message. ; 2204 3 ! We will be sending a file to the other end. ; 2205 3 ! ; 2206 3 ; 2207 3 [MSG_RCV_INIT] : ; 2208 4 BEGIN ; 2209 4 ! ; 2210 4 ! Move the file specification if we received one ; 2211 4 ! ; 2212 4 SET_STRING (CH$PTR (FILE_NAME), MAX_FILE_NAME, TRUE); ; 2213 4 BFR_EMPTY (); ; 2214 4 FILE_SIZE = SET_STRING (0, 0, FALSE); ; 2215 4 CH$WCHAR (CHR_NUL, CH$PTR (FILE_NAME, .FILE_SIZE)); ; 2216 4 ; 2217 4 IF .FILE_SIZE GTR 0 ; 2218 4 THEN ; 2219 5 BEGIN ; 2220 5 XFR_STATUS (%C'I', %C'S'); ! Start of a file send ; 2221 5 RETURN STATE_S; ; 2222 4 END; ; 2223 4 ; 2224 4 KRM_ERROR (KER_PROTOERR); ; 2225 4 RETURN STATE_A; ; 2226 3 END; ; 2227 3 ! ; 2228 3 ! Generic KERMIT commands ; 2229 3 ! ; 2230 3 ; 2231 3 [MSG_GENERIC] : ; 2232 3 RETURN SERVER_GENERIC (); ; 2233 3 ! ; 2234 3 ! Host command ; 2235 3 ! ; 2236 3 ; 2237 3 [MSG_COMMAND] : ; 2238 3 RETURN HOST_COMMAND (); ; 2239 3 ! ; 2240 3 ! Kermit command ; 2241 3 ! ; 2242 3 ; 2243 3 [MSG_KERMIT] : ; 2244 3 RETURN KERMIT_COMMAND (); ; 2245 3 ! ; 2246 3 ! Unimplimented server routines ; 2247 3 ! ; 2248 3 ; 2249 3 [OTHERWISE] : ; 2250 4 BEGIN ; 2251 4 KRM_ERROR (KER_UNISRV); ; 2252 4 RETURN STATE_A; ; 2253 3 END; ; 2254 3 TES; ; 2255 3 ; 2256 2 END; ; 2257 2 ; 2258 2 ! ; 2259 2 ! If we get here, we must have gotten something random. Therefore, ; 2260 2 ! just send a NAK and remain in the current state (unless we have done this ; 2261 2 ! too many times). ; 2262 2 ! ; 2263 2 NUM_RETRIES = .NUM_RETRIES + 1; ; 2264 2 ; 2265 2 IF .NUM_RETRIES GTR .SI_RETRIES THEN RETURN STATE_A; ; 2266 2 ; 2267 2 IF SEND_PACKET (MSG_NAK, 0, 0) THEN RETURN .STATE ELSE RETURN STATE_EX; ; 2268 2 ; 2269 1 END; ! End of REC_SERVER_IDLE ;REC_SERVER_IDLE U.10: .WORD ^M ;Save R2,R3,R4,R5 ; 2082 MOVAB W^U.24, R5 ;U.24, R5 ; MOVAB W^U.54, R4 ;U.54, R4 ; CALLS #0, W^U.26 ;#0, U.26 ; 2126 MOVL R0, R3 ;R0, STATUS ; CMPL R3, #134316258 ;STATUS, #134316258 ; 2131 BNEQ 1$ ;1$ ; BRW 15$ ;15$ ; 1$: BLBS R3, 2$ ;STATUS, 2$ ; 2133 BRW 12$ ;12$ ; 2$: MOVL 8(R4), R2 ;REC_TYPE, R2 ; 2137 CMPL R2, #73 ;R2, #73 ; 2144 BNEQ 3$ ;3$ ; CALLS #0, W^U.21 ;#0, U.21 ; 2147 MOVL R0, R3 ;R0, STATUS ; BLBC R3, 4$ ;STATUS, 4$ ; CALLS #0, W^U.20 ;#0, U.20 ; 2150 PUSHL (R4) ;REC_SEQ ; 2152 PUSHL #9 ;#9 ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, (R5) ;#3, SEND_PACKET ; MOVL R0, R3 ;R0, STATUS ; BLBC R3, 4$ ;STATUS, 4$ ; MNEGL -60(R4), W^SND_PKT_SIZE ;SEND_PKT_SIZE, SND_PKT_SIZE ; 2155 MNEGL W^SEND_TIMEOUT, W^SND_TIMEOUT ;SEND_TIMEOUT, SND_TIMEOUT ; 2156 MNEGL -56(R4), W^SND_NPAD ;SEND_NPAD, SND_NPAD ; 2157 MNEGL -52(R4), W^SND_PADCHAR ;SEND_PADCHAR, SND_PADCHAR ; 2158 MNEGL -48(R4), W^SND_EOL ;SEND_EOL, SND_EOL ; 2159 MNEGL -44(R4), W^SND_QUOTE_CHR ;SEND_QUOTE_CHR, SND_QUOTE_CHR ; 2160 MOVL -40(R4), W^RCV_8QUOTE_CHR ;SEND_8QUOTE_CHR, RCV_8QUOTE_CHR ; 2161 MOVL -36(R4), W^CHKTYPE ;INI_CHK_TYPE, CHKTYPE ; 2162 MOVL -64(R4), W^SET_REPT_CHR ;REPT_CHR, SET_REPT_CHR ; 2163 MOVL #15, R0 ;#15, R0 ; 2164 RET ; ; 3$: CMPL R2, #83 ;R2, #83 ; 2177 BNEQ 5$ ;5$ ; ADDL3 #1, (R4), R0 ;#1, REC_SEQ, R0 ; 2179 EXTZV #0, #6, R0, -4(R4) ;#0, #6, R0, MSG_NUMBER ; CALLS #0, W^U.21 ;#0, U.21 ; 2181 MOVL R0, R3 ;R0, STATUS ; 4$: BLBC R3, 6$ ;STATUS, 6$ ; CALLS #0, W^U.20 ;#0, U.20 ; 2184 PUSHL (R4) ;REC_SEQ ; 2189 PUSHL #9 ;#9 ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, (R5) ;#3, SEND_PACKET ; BLBC R0, 6$ ;R0, 6$ ; MOVL -36(R4), -32(R4) ;INI_CHK_TYPE, BLK_CHK_TYPE ; 2192 MOVZBL #82, -(SP) ;#82, -(SP) ; 2193 MOVZBL #73, -(SP) ;#73, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; MOVL #7, R0 ;#7, R0 ; 2194 RET ; ; 5$: CMPL R2, #82 ;R2, #82 ; 2207 BNEQ 8$ ;8$ ; PUSHL #1 ;#1 ; 2212 MOVZBL #132, -(SP) ;#132, -(SP) ; PUSHAB W^FILE_NAME ;FILE_NAME ; CALLS #3, W^U.30 ;#3, U.30 ; CALLS #0, W^U.28 ;#0, U.28 ; 2213 CLRQ -(SP) ;-(SP) ; 2214 CLRL -(SP) ;-(SP) ; CALLS #3, W^U.30 ;#3, U.30 ; MOVL R0, W^FILE_SIZE ;R0, FILE_SIZE ; MOVAB W^FILE_NAME, R0 ;FILE_NAME, R0 ; 2215 CLRB @W^FILE_SIZE[R0] ;@FILE_SIZE[R0] ; TSTL W^FILE_SIZE ;FILE_SIZE ; 2217 BLEQ 6$ ;6$ ; MOVZBL #83, -(SP) ;#83, -(SP) ; 2220 MOVZBL #73, -(SP) ;#73, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; MOVL #1, R0 ;#1, R0 ; 2221 RET ; ; 6$: PUSHL #134316226 ;#134316226 ; 2224 7$: CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; BRB 13$ ;13$ ; 2225 8$: CMPL R2, #71 ;R2, #71 ; 2231 BNEQ 9$ ;9$ ; CALLS #0, W^U.14 ;#0, U.14 ; 2232 RET ; ; 9$: CMPL R2, #67 ;R2, #67 ; 2237 BNEQ 10$ ;10$ ; CALLS #0, W^U.15 ;#0, U.15 ; 2238 RET ; ; 10$: CMPL R2, #75 ;R2, #75 ; 2243 BNEQ 11$ ;11$ ; CALLS #0, W^U.16 ;#0, U.16 ; 2244 RET ; ; 11$: PUSHL #134316218 ;#134316218 ; 2251 BRB 7$ ;7$ ; 12$: INCL -8(R4) ;NUM_RETRIES ; 2263 CMPL -8(R4), W^SI_RETRIES ;NUM_RETRIES, SI_RETRIES ; 2265 BLEQ 14$ ;14$ ; 13$: MOVL #10, R0 ;#10, R0 ; RET ; ; 14$: CLRQ -(SP) ;-(SP) ; 2267 MOVZBL #78, -(SP) ;#78, -(SP) ; CALLS #3, (R5) ;#3, SEND_PACKET ; BLBC R0, 15$ ;R0, 15$ ; MOVL -20(R4), R0 ;STATE, R0 ; RET ; ; 15$: MOVL #19, R0 ;#19, R0 ; RET ; ; 2269 ; Routine Size: 392 bytes, Routine Base: $CODE$ + 03EB ; 2270 1 %SBTTL 'SEND_SERVER_INIT' ; 2271 1 ROUTINE SEND_SERVER_INIT = ; 2272 1 ; 2273 1 !++ ; 2274 1 ! FUNCTIONAL DESCRIPTION: ; 2275 1 ! ; 2276 1 ! This routine will send a server initialization message to the ; 2277 1 ! remote KERMIT. ; 2278 1 ! ; 2279 1 ! CALLING SEQUENCE: ; 2280 1 ! ; 2281 1 ! STATE = SEND_SERVER_INIT(); ; 2282 1 ! ; 2283 1 ! INPUT PARAMETERS: ; 2284 1 ! ; 2285 1 ! None. ; 2286 1 ! ; 2287 1 ! IMPLICIT INPUTS: ; 2288 1 ! ; 2289 1 ! RECV_xxx - desired receive parameters ; 2290 1 ! ; 2291 1 ! OUTPUT PARAMETERS: ; 2292 1 ! ; 2293 1 ! New state to change the finite state machine to. ; 2294 1 ! ; 2295 1 ! IMPLICIT OUTPUTS: ; 2296 1 ! ; 2297 1 ! SEND_xxx - Other Kermit's desired parameters ; 2298 1 ! ; 2299 1 ! COMPLETION CODES: ; 2300 1 ! ; 2301 1 ! None. ; 2302 1 ! ; 2303 1 ! SIDE EFFECTS: ; 2304 1 ! ; 2305 1 ! None. ; 2306 1 ! ; 2307 1 !-- ; 2308 1 ; 2309 2 BEGIN ; 2310 2 ; 2311 2 LOCAL ; 2312 2 OLD_OUTPUT, ! Saved terminal output routine ; 2313 2 STATUS; ! Status returned by various routines ; 2314 2 ; 2315 2 ![026] Local routine to ignore error message output ; 2316 2 ROUTINE IGNORE_ERROR (ADDRESS, LENGTH) = ; 2317 3 BEGIN ; 2318 3 RETURN TRUE; ; 2319 2 END; ;IGNORE_ERROR U.74: .WORD ^M<> ;Save nothing ; 2316 MOVL #1, R0 ;#1, R0 ; 2318 RET ; ; 2319 ; Routine Size: 6 bytes, Routine Base: $CODE$ + 0573 ; 2320 2 SET_SEND_INIT (); ; 2321 2 ![026] If too many tries, just give up. Maybe the other Kermit doesn't ; 2322 2 ![026] know what to do with this packet. ; 2323 2 ; 2324 2 IF .NUM_RETRIES GTR .SI_RETRIES THEN RETURN STATE_SG; ; 2325 2 ; 2326 2 ![026] ; 2327 2 ![026] Count the number of times we try this ; 2328 2 ![026] ; 2329 2 NUM_RETRIES = .NUM_RETRIES + 1; ; 2330 2 ; 2331 2 IF NOT SEND_PACKET (MSG_SER_INIT, P_SI_LENGTH, .MSG_NUMBER) THEN RETURN STATE_A; ; 2332 2 ; 2333 2 ![026] ; 2334 2 ![026] Determine if we received a packet it good condition. If we timed out ; 2335 2 ![026] just try again. If we get an error packet back, ignore it and ; 2336 2 ![026] just continue. The other Kermit must not support this packet. ; 2337 2 ![026] ; 2338 2 OLD_OUTPUT = TT_SET_OUTPUT (IGNORE_ERROR); ; 2339 2 STATUS = REC_PACKET (); ; 2340 2 TT_OUTPUT (); ; 2341 2 TT_SET_OUTPUT (.OLD_OUTPUT); ; 2342 2 ; 2343 2 IF .STATUS EQL KER_ERRMSG THEN RETURN STATE_SG; ; 2344 2 ; 2345 2 IF NOT .STATUS ; 2346 2 THEN ; 2347 2 ; 2348 4 IF NOT ((.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL ; 2349 3 KER_CHKSUMERR)) ; 2350 2 THEN ; 2351 2 RETURN STATE_EX ; 2352 2 ELSE ; 2353 2 RETURN .STATE; ; 2354 2 ; 2355 2 ! ; 2356 2 ! Determine if the packet is good. ; 2357 2 ! ; 2358 2 ; 2359 2 IF .REC_TYPE EQL MSG_ACK AND .REC_SEQ EQL .MSG_NUMBER ; 2360 2 THEN ; 2361 3 BEGIN ; 2362 3 ! ; 2363 3 ! Here if we have an ACK for the initialization message that was just sent ; 2364 3 ! to the remote KERMIT. ; 2365 3 ! ; 2366 3 ; 2367 3 IF NOT (STATUS = PRS_SEND_INIT ()) THEN RETURN STATE_A; ; 2368 3 ; 2369 3 NUM_RETRIES = 0; ; 2370 3 INIT_PKT_SENT = TRUE; ! We have exchanged init's ; 2371 3 RETURN STATE_SG; ; 2372 2 END; ; 2373 2 ; 2374 2 ! ; 2375 2 ! If we haven't returned yet, we must have gotten an invalid response. ; 2376 2 ! Just stay in the same state so we try again ; 2377 2 ! ; 2378 2 RETURN .STATE; ; 2379 1 END; ;SEND_SERVER_INIT U.2: .WORD ^M ;Save R2,R3,R4 ; 2271 MOVAB W^U.52, R4 ;U.52, R4 ; CALLS #0, W^U.20 ;#0, U.20 ; 2320 CMPL (R4), W^SI_RETRIES ;NUM_RETRIES, SI_RETRIES ; 2324 BLEQ 1$ ;1$ ; BRW 5$ ;5$ ; 1$: INCL (R4) ;NUM_RETRIES ; 2329 PUSHL 4(R4) ;MSG_NUMBER ; 2331 PUSHL #9 ;#9 ; MOVZBL #73, -(SP) ;#73, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; BLBC R0, 3$ ;R0, 3$ ; PUSHAB B^U.74 ;U.74 ; 2338 CALLS #1, W^TT_SET_OUTPUT ;#1, TT_SET_OUTPUT ; MOVL R0, R3 ;R0, OLD_OUTPUT ; CALLS #0, W^U.26 ;#0, U.26 ; 2339 MOVL R0, R2 ;R0, STATUS ; CALLS #0, W^TT_OUTPUT ;#0, TT_OUTPUT ; 2340 PUSHL R3 ;OLD_OUTPUT ; 2341 CALLS #1, W^TT_SET_OUTPUT ;#1, TT_SET_OUTPUT ; CMPL R2, #134316170 ;STATUS, #134316170 ; 2343 BEQL 5$ ;5$ ; BLBS R2, 2$ ;STATUS, 2$ ; 2345 CMPL R2, #134316234 ;STATUS, #134316234 ; 2348 BEQL 6$ ;6$ ; CMPL R2, #134316248 ;STATUS, #134316248 ; BEQL 6$ ;6$ ; CMPL R2, #134316178 ;STATUS, #134316178 ; BEQL 6$ ;6$ ; MOVL #19, R0 ;#19, R0 ; 2353 RET ; ; 2$: CMPL 16(R4), #89 ;REC_TYPE, #89 ; 2359 BNEQ 6$ ;6$ ; CMPL 8(R4), 4(R4) ;REC_SEQ, MSG_NUMBER ; BNEQ 6$ ;6$ ; CALLS #0, W^U.21 ;#0, U.21 ; 2367 MOVL R0, R2 ;R0, STATUS ; BLBS R2, 4$ ;STATUS, 4$ ; 3$: MOVL #10, R0 ;#10, R0 ; RET ; ; 4$: CLRL (R4) ;NUM_RETRIES ; 2369 MOVL #1, 232(R4) ;#1, INIT_PKT_SENT ; 2370 5$: MOVL #12, R0 ;#12, R0 ; 2371 RET ; ; 6$: MOVL -12(R4), R0 ;STATE, R0 ; 2378 RET ; ; 2379 ; Routine Size: 163 bytes, Routine Base: $CODE$ + 0579 ; 2380 1 %SBTTL 'SEND_DATA' ; 2381 1 ROUTINE SEND_DATA = ; 2382 1 ; 2383 1 !++ ; 2384 1 ! FUNCTIONAL DESCRIPTION: ; 2385 1 ! ; 2386 1 ! This routine will send a data message to the remote KERMIT. ; 2387 1 ! ; 2388 1 ! CALLING SEQUENCE: ; 2389 1 ! ; 2390 1 ! STATE = SEND_DATA(); ; 2391 1 ! ; 2392 1 ! INPUT PARAMETERS: ; 2393 1 ! ; 2394 1 ! None. ; 2395 1 ! ; 2396 1 ! IMPLICIT INPUTS: ; 2397 1 ! ; 2398 1 ! None. ; 2399 1 ! ; 2400 1 ! OUTPUT PARAMETERS: ; 2401 1 ! ; 2402 1 ! New state to change the finite state machine to. ; 2403 1 ! ; 2404 1 ! IMPLICIT OUTPUTS: ; 2405 1 ! ; 2406 1 ! None. ; 2407 1 ! ; 2408 1 ! COMPLETION CODES: ; 2409 1 ! ; 2410 1 ! None. ; 2411 1 ! ; 2412 1 ! SIDE EFFECTS: ; 2413 1 ! ; 2414 1 ! None. ; 2415 1 ! ; 2416 1 !-- ; 2417 1 ; 2418 2 BEGIN ; 2419 2 ; 2420 2 LOCAL ; 2421 2 SUB_TYPE, ! Subtype for XFR_STATUS call ; 2422 2 STATUS; ! Status returned by various routines ; 2423 2 ; 2424 2 ! ; 2425 2 ! If there is nothing in the data packet, we should not bother to send it. ; 2426 2 ! Instead, we will just call BFR_FILL again to get some more data ; 2427 2 ! ; 2428 2 ; 2429 2 IF .SIZE GTR 0 ; 2430 2 THEN ; 2431 3 BEGIN ; 2432 3 ! ; 2433 3 ! Check to see if the number of retries have been exceeded. ; 2434 3 ! ; 2435 3 ; 2436 3 IF .NUM_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER; ; 2437 3 ; 2438 3 ! ; 2439 3 ! Not exceeded yet. Increment the number of retries we have attempted ; 2440 3 ! on this message. ; 2441 3 ! ; 2442 3 NUM_RETRIES = .NUM_RETRIES + 1; ; 2443 3 ! ; 2444 3 ! Attempt to send the packet and abort if the send fails. ; 2445 3 ! ; 2446 3 ; 2447 3 IF NOT SEND_PACKET (MSG_DATA, .SIZE, .MSG_NUMBER) THEN RETURN STATE_EX; ; 2448 3 ; 2449 3 ! ; 2450 3 ! Attempt to receive a message from the remote KERMIT. ; 2451 3 ! ; 2452 3 STATUS = REC_PACKET (); ; 2453 3 ; 2454 3 IF NOT .STATUS ; 2455 3 THEN ; 2456 4 BEGIN ; 2457 4 ; 2458 5 IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL ; 2459 5 KER_CHKSUMERR) ; 2460 4 THEN ; 2461 4 RETURN .STATE ; 2462 4 ELSE ; 2463 4 RETURN STATE_EX; ; 2464 4 ; 2465 3 END; ; 2466 3 ; 2467 3 ! ; 2468 3 ! Determine if the message is a NAK and the NAK is for the message number ; 2469 3 ! that we are current working on. If the NAK is for the next packet then ; 2470 3 ! treat it like an ACK for this packet ; 2471 3 ! ; 2472 3 ; 2473 4 IF .REC_TYPE EQL MSG_NAK AND (.REC_SEQ NEQ ((.MSG_NUMBER + 1) AND %O'77')) ; 2474 3 THEN ; 2475 3 RETURN .STATE; ; 2476 3 ; 2477 3 ! ; 2478 3 ! Make sure we have a NAK or ACK ; 2479 3 ! ; 2480 3 ; 2481 4 IF NOT (.REC_TYPE EQL MSG_ACK OR .REC_TYPE EQL MSG_NAK) ; 2482 3 THEN ; 2483 3 ! ; 2484 3 ! Not an ACK or NAK, abort. ; 2485 3 ! ; 2486 4 BEGIN ; 2487 4 KRM_ERROR (KER_PROTOERR); ; 2488 4 RETURN STATE_A; ; 2489 3 END; ; 2490 3 ; 2491 3 ! ; 2492 3 ! Is this for this message? ; 2493 3 ! ; 2494 3 ; 2495 3 IF .REC_TYPE EQL MSG_ACK AND .REC_SEQ NEQ .MSG_NUMBER THEN RETURN .STATE; ; 2496 3 ; 2497 3 ! ; 2498 3 ! It was. Set up for sending the next data message to the remote KERMIT ; 2499 3 ! and return. ; 2500 3 ! ; 2501 3 ! ; 2502 3 ! Check for data field in ACK indicating abort file or stream ; 2503 3 ! ; 2504 3 ! ; 2505 3 ; 2506 3 IF .REC_TYPE EQL MSG_ACK AND .REC_LENGTH EQL 1 ; 2507 3 THEN ; 2508 3 ; 2509 3 SELECTONE CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG, CHR_SIZE)) OF ; 2510 3 SET ; 2511 3 ; 2512 3 [MSG_ACK_ABT_CUR] : ; 2513 3 ABT_CUR_FILE = TRUE; ; 2514 3 ; 2515 3 [MSG_ACK_ABT_ALL] : ; 2516 3 ABT_ALL_FILE = TRUE; ; 2517 3 TES; ; 2518 3 ; 2519 3 NUM_RETRIES = 0; ; 2520 3 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 2521 2 END; ! End of IF .SIZE GTR 0 ; 2522 2 ; 2523 3 IF (BFR_FILL (FALSE) EQL KER_NORMAL) AND NOT (.ABT_CUR_FILE OR .ABT_ALL_FILE) ; 2524 2 THEN ; 2525 2 RETURN STATE_SD ; 2526 2 ELSE ; 2527 3 BEGIN ; 2528 3 ; 2529 3 IF ( NOT .CONNECT_FLAG) AND .TY_FIL ; 2530 3 THEN ; 2531 4 BEGIN ; 2532 4 ; 2533 4 IF .ABT_ALL_FILE ; 2534 4 THEN ; 2535 4 TT_TEXT (UPLIT (%ASCIZ' [Group interrupted]')) ; 2536 4 ELSE ; 2537 4 ; 2538 4 IF .ABT_CUR_FILE ; 2539 4 THEN ; 2540 4 TT_TEXT (UPLIT (%ASCIZ' [Interrupted]')) ; 2541 4 ELSE ; 2542 4 TT_TEXT (UPLIT (%ASCIZ' [OK]')); ; 2543 4 ; 2544 4 TT_CRLF (); ; 2545 3 END; ; 2546 3 ; 2547 3 IF .FLAG_FILE_OPEN THEN FILE_CLOSE (FALSE); ; 2548 3 ; 2549 3 SUB_TYPE = %C'C'; ! Assume ok ; 2550 3 ; 2551 3 IF .ABT_ALL_FILE ; 2552 3 THEN ; 2553 3 SUB_TYPE = %C'Z' ; 2554 3 ELSE ; 2555 3 ; 2556 3 IF .ABT_CUR_FILE THEN SUB_TYPE = %C'X'; ; 2557 3 ; 2558 3 XFR_STATUS (%C'F', .SUB_TYPE); ; 2559 3 FLAG_FILE_OPEN = FALSE; ; 2560 3 RETURN STATE_SZ; ; 2561 2 END; ; 2562 2 ; 2563 1 END; .PSECT $PLIT$,NOWRT,NOEXE,2 P.AAB: .ASCII \ [Group interrupted]\<0><0><0><0> ; ; P.AAC: .ASCII \ [Interrupted]\<0><0> ; ; P.AAD: .ASCII \ [OK]\<0><0><0> ; ; .PSECT $CODE$,NOWRT,2 ;SEND_DATA U.3: .WORD ^M ;Save R2,R3,R4 ; 2381 MOVAB W^ABT_ALL_FILE, R4 ;ABT_ALL_FILE, R4 ; MOVAB W^ABT_CUR_FILE, R3 ;ABT_CUR_FILE, R3 ; MOVAB W^U.53, R2 ;U.53, R2 ; MOVL -12(R2), R0 ;SIZE, R0 ; 2429 BGTR 1$ ;1$ ; BRW 11$ ;11$ ; 1$: CMPL -4(R2), W^PKT_RETRIES ;NUM_RETRIES, PKT_RETRIES ; 2436 BLEQ 2$ ;2$ ; MOVL #20, R0 ;#20, R0 ; RET ; ; 2$: INCL -4(R2) ;NUM_RETRIES ; 2442 PUSHL (R2) ;MSG_NUMBER ; 2447 PUSHL R0 ;R0 ; MOVZBL #68, -(SP) ;#68, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; BLBC R0, 3$ ;R0, 3$ ; CALLS #0, W^U.26 ;#0, U.26 ; 2452 BLBS R0, 4$ ;STATUS, 4$ ; 2454 CMPL R0, #134316234 ;STATUS, #134316234 ; 2458 BEQL 7$ ;7$ ; CMPL R0, #134316248 ;STATUS, #134316248 ; BEQL 7$ ;7$ ; CMPL R0, #134316178 ;STATUS, #134316178 ; BEQL 7$ ;7$ ; 3$: MOVL #19, R0 ;#19, R0 ; 2463 RET ; ; 4$: CLRL R1 ;R1 ; 2473 CMPL 12(R2), #78 ;REC_TYPE, #78 ; BNEQ 5$ ;5$ ; INCL R1 ;R1 ; ADDL3 #1, (R2), R0 ;#1, MSG_NUMBER, R0 ; CMPZV #0, #6, R0, 4(R2) ;#0, #6, R0, REC_SEQ ; BNEQ 7$ ;7$ ; 5$: CMPL 12(R2), #89 ;REC_TYPE, #89 ; 2481 BEQL 6$ ;6$ ; BLBS R1, 6$ ;R1, 6$ ; PUSHL #134316226 ;#134316226 ; 2487 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; MOVL #10, R0 ;#10, R0 ; 2488 RET ; ; 6$: CLRL R0 ;R0 ; 2495 CMPL 12(R2), #89 ;REC_TYPE, #89 ; BNEQ 8$ ;8$ ; INCL R0 ;R0 ; CMPL 4(R2), (R2) ;REC_SEQ, MSG_NUMBER ; BEQL 8$ ;8$ ; 7$: MOVL -16(R2), R0 ;STATE, R0 ; RET ; ; 8$: BLBC R0, 10$ ;R0, 10$ ; 2506 CMPL 8(R2), #1 ;REC_LENGTH, #1 ; BNEQ 10$ ;10$ ; MOVZBL 20(R2), R0 ;REC_MSG+4, R0 ; 2509 CMPB R0, #88 ;R0, #88 ; 2512 BNEQ 9$ ;9$ ; MOVL #1, (R3) ;#1, ABT_CUR_FILE ; 2513 BRB 10$ ;10$ ; 9$: CMPB R0, #90 ;R0, #90 ; 2515 BNEQ 10$ ;10$ ; MOVL #1, (R4) ;#1, ABT_ALL_FILE ; 2516 10$: CLRL -4(R2) ;NUM_RETRIES ; 2519 ADDL3 #1, (R2), R0 ;#1, MSG_NUMBER, R0 ; 2520 EXTZV #0, #6, R0, (R2) ;#0, #6, R0, MSG_NUMBER ; 11$: CLRL -(SP) ;-(SP) ; 2523 CALLS #1, W^U.29 ;#1, U.29 ; CMPL R0, #134316043 ;R0, #134316043 ; BNEQ 12$ ;12$ ; BLBS (R3), 12$ ;ABT_CUR_FILE, 12$ ; BLBS (R4), 12$ ;ABT_ALL_FILE, 12$ ; MOVL #3, R0 ;#3, R0 ; 2527 RET ; ; 12$: BLBS W^CONNECT_FLAG, 16$ ;CONNECT_FLAG, 16$ ; 2529 BLBC W^TY_FIL, 16$ ;TY_FIL, 16$ ; BLBC (R4), 13$ ;ABT_ALL_FILE, 13$ ; 2533 PUSHAB W^P.AAB ;P.AAB ; 2535 BRB 15$ ;15$ ; 13$: BLBC (R3), 14$ ;ABT_CUR_FILE, 14$ ; 2538 PUSHAB W^P.AAC ;P.AAC ; 2540 BRB 15$ ;15$ ; 14$: PUSHAB W^P.AAD ;P.AAD ; 2542 15$: CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 2544 16$: BLBC W^FLAG_FILE_OPEN, 17$ ;FLAG_FILE_OPEN, 17$ ; 2547 CLRL -(SP) ;-(SP) ; CALLS #1, W^FILE_CLOSE ;#1, FILE_CLOSE ; 17$: MOVZBL #67, R0 ;#67, SUB_TYPE ; 2549 BLBC (R4), 18$ ;ABT_ALL_FILE, 18$ ; 2551 MOVZBL #90, R0 ;#90, SUB_TYPE ; 2553 BRB 19$ ;19$ ; 18$: BLBC (R3), 19$ ;ABT_CUR_FILE, 19$ ; 2556 MOVZBL #88, R0 ;#88, SUB_TYPE ; 19$: PUSHL R0 ;SUB_TYPE ; 2558 MOVZBL #70, -(SP) ;#70, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; CLRL W^FLAG_FILE_OPEN ;FLAG_FILE_OPEN ; 2559 MOVL #4, R0 ;#4, R0 ; 2560 RET ; ; 2563 ; Routine Size: 339 bytes, Routine Base: $CODE$ + 061C ; 2564 1 %SBTTL 'SEND_FILE' ; 2565 1 ROUTINE SEND_FILE = ; 2566 1 ; 2567 1 !++ ; 2568 1 ! FUNCTIONAL DESCRIPTION: ; 2569 1 ! ; 2570 1 ! This routine will send the file specification that is being ; 2571 1 ! transfered, or it will send a text header message. ; 2572 1 ! ; 2573 1 ! CALLING SEQUENCE: ; 2574 1 ! ; 2575 1 ! STATE = SEND_FILE(); ; 2576 1 ! ; 2577 1 ! INPUT PARAMETERS: ; 2578 1 ! ; 2579 1 ! None. ; 2580 1 ! ; 2581 1 ! IMPLICIT INPUTS: ; 2582 1 ! ; 2583 1 ! TEXT_HEAD_FLAG - If true, send text header instead of file header ; 2584 1 ! ; 2585 1 ! OUTPUT PARAMETERS: ; 2586 1 ! ; 2587 1 ! New state to change the finite state machine to. ; 2588 1 ! ; 2589 1 ! IMPLICIT OUTPUTS: ; 2590 1 ! ; 2591 1 ! None. ; 2592 1 ! ; 2593 1 ! COMPLETION CODES: ; 2594 1 ! ; 2595 1 ! None. ; 2596 1 ! ; 2597 1 ! SIDE EFFECTS: ; 2598 1 ! ; 2599 1 ! None. ; 2600 1 ! ; 2601 1 !-- ; 2602 1 ; 2603 2 BEGIN ; 2604 2 ; 2605 2 LOCAL ; 2606 2 M_TYPE, ! Message type to send ; 2607 2 STATUS; ! Status returned by various routines ; 2608 2 ; 2609 2 ! ; 2610 2 ! Flag we don't want to abort yet ; 2611 2 ! ; 2612 2 ABT_CUR_FILE = FALSE; ; 2613 2 ABT_ALL_FILE = FALSE; ; 2614 2 ! ; 2615 2 ! First determine if we have exceed the number of retries that are ; 2616 2 ! allowed to attempt to send this message. ; 2617 2 ! ; 2618 2 ; 2619 2 IF .NUM_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER; ; 2620 2 ; 2621 2 ! ; 2622 2 ! The number of retries are not exceeded. Increment the number and then ; 2623 2 ! attempt to send the packet again. ; 2624 2 ! ; 2625 2 NUM_RETRIES = .NUM_RETRIES + 1; ; 2626 2 SIZE = 0; ! Assume no name ; 2627 2 ; 2628 2 IF .TEXT_HEAD_FLAG THEN M_TYPE = MSG_TEXT ELSE M_TYPE = MSG_FILE; ; 2629 2 ; 2630 2 IF .FILE_SIZE NEQ 0 AND NOT .NO_FILE_NEEDED ; 2631 2 THEN ; 2632 3 BEGIN ; 2633 3 ![025] CH$MOVE (.FILE_SIZE, CH$PTR (FILE_NAME), ; 2634 3 ![025] CH$PTR (SND_MSG, PKT_MSG, ; 2635 3 ![025] CHR_SIZE)); ; 2636 3 ![025] ; 2637 3 ![025] Fill packet with file name ; 2638 3 ![025] ; 2639 3 SET_STRING (CH$PTR (FILE_NAME), .FILE_SIZE, TRUE); ; 2640 3 BFR_FILL (TRUE); ; 2641 3 SET_STRING (0, 0, FALSE); ; 2642 2 END; ; 2643 2 ; 2644 2 IF NOT SEND_PACKET (.M_TYPE, .SIZE, .MSG_NUMBER) THEN RETURN STATE_EX; ; 2645 2 ; 2646 2 ! ; 2647 2 ! Now get the responce from the remote KERMIT. ; 2648 2 ! ; 2649 2 STATUS = REC_PACKET (); ; 2650 2 ; 2651 2 IF NOT .STATUS ; 2652 2 THEN ; 2653 3 BEGIN ; 2654 3 ; 2655 4 IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL KER_CHKSUMERR) ; 2656 3 THEN ; 2657 3 RETURN .STATE ; 2658 3 ELSE ; 2659 3 RETURN STATE_EX; ; 2660 3 ; 2661 2 END; ; 2662 2 ; 2663 2 ! ; 2664 2 ! Determine if the packet is good. ; 2665 2 ! ; 2666 2 ; 2667 3 IF NOT (.REC_TYPE EQL MSG_ACK OR .REC_TYPE EQL MSG_NAK) ; 2668 2 THEN ; 2669 3 BEGIN ; 2670 3 KRM_ERROR (KER_PROTOERR); ; 2671 3 RETURN STATE_A; ; 2672 2 END; ; 2673 2 ; 2674 2 ! ; 2675 2 ! If this is a NAK and the message number is not the one we just send ; 2676 2 ! treat this like an ACK, otherwise resend the last packet. ; 2677 2 ! ; 2678 2 ; 2679 2 IF .REC_TYPE EQL MSG_NAK AND (.REC_SEQ NEQ ((.MSG_NUMBER + 1) AND %O'77')) THEN RETURN .STATE; ; 2680 2 ; 2681 2 IF .REC_TYPE EQL MSG_ACK AND .REC_SEQ NEQ .MSG_NUMBER THEN RETURN .STATE; ; 2682 2 ; 2683 2 ! ; 2684 2 ! If all is ok, bump the message number and fill first buffer ; 2685 2 ! ; 2686 2 NUM_RETRIES = 0; ; 2687 2 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 2688 2 ; 2689 2 IF BFR_FILL (TRUE) THEN RETURN STATE_SD ELSE RETURN STATE_A; ; 2690 2 ; 2691 1 END; ! End of SEND_FILE ;SEND_FILE U.4: .WORD ^M ;Save R2,R3 ; 2565 MOVAB W^U.53, R3 ;U.53, R3 ; CLRL W^ABT_CUR_FILE ;ABT_CUR_FILE ; 2612 CLRL W^ABT_ALL_FILE ;ABT_ALL_FILE ; 2613 CMPL -4(R3), W^PKT_RETRIES ;NUM_RETRIES, PKT_RETRIES ; 2619 BLEQ 1$ ;1$ ; MOVL #20, R0 ;#20, R0 ; RET ; ; 1$: INCL -4(R3) ;NUM_RETRIES ; 2625 CLRL -12(R3) ;SIZE ; 2626 BLBC 220(R3), 2$ ;TEXT_HEAD_FLAG, 2$ ; 2628 MOVZBL #88, R2 ;#88, M_TYPE ; BRB 3$ ;3$ ; 2$: MOVZBL #70, R2 ;#70, M_TYPE ; 3$: MOVL W^FILE_SIZE, R0 ;FILE_SIZE, R0 ; 2630 BEQL 4$ ;4$ ; BLBS 224(R3), 4$ ;NO_FILE_NEEDED, 4$ ; PUSHL #1 ;#1 ; 2639 PUSHL R0 ;R0 ; PUSHAB W^FILE_NAME ;FILE_NAME ; CALLS #3, W^U.30 ;#3, U.30 ; PUSHL #1 ;#1 ; 2640 CALLS #1, W^U.29 ;#1, U.29 ; CLRQ -(SP) ;-(SP) ; 2641 CLRL -(SP) ;-(SP) ; CALLS #3, W^U.30 ;#3, U.30 ; 4$: PUSHL (R3) ;MSG_NUMBER ; 2644 PUSHL -12(R3) ;SIZE ; PUSHL R2 ;M_TYPE ; CALLS #3, W^U.24 ;#3, U.24 ; BLBC R0, 5$ ;R0, 5$ ; CALLS #0, W^U.26 ;#0, U.26 ; 2649 BLBS R0, 6$ ;STATUS, 6$ ; 2651 CMPL R0, #134316234 ;STATUS, #134316234 ; 2655 BEQL 9$ ;9$ ; CMPL R0, #134316248 ;STATUS, #134316248 ; BEQL 9$ ;9$ ; CMPL R0, #134316178 ;STATUS, #134316178 ; BEQL 9$ ;9$ ; 5$: MOVL #19, R0 ;#19, R0 ; 2659 RET ; ; 6$: CMPL 12(R3), #89 ;REC_TYPE, #89 ; 2667 BEQL 7$ ;7$ ; CMPL 12(R3), #78 ;REC_TYPE, #78 ; BEQL 7$ ;7$ ; PUSHL #134316226 ;#134316226 ; 2670 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; BRB 11$ ;11$ ; 2671 7$: CMPL 12(R3), #78 ;REC_TYPE, #78 ; 2679 BNEQ 8$ ;8$ ; ADDL3 #1, (R3), R0 ;#1, MSG_NUMBER, R0 ; CMPZV #0, #6, R0, 4(R3) ;#0, #6, R0, REC_SEQ ; BNEQ 9$ ;9$ ; 8$: CMPL 12(R3), #89 ;REC_TYPE, #89 ; 2681 BNEQ 10$ ;10$ ; CMPL 4(R3), (R3) ;REC_SEQ, MSG_NUMBER ; BEQL 10$ ;10$ ; 9$: MOVL -16(R3), R0 ;STATE, R0 ; RET ; ; 10$: CLRL -4(R3) ;NUM_RETRIES ; 2686 ADDL3 #1, (R3), R0 ;#1, MSG_NUMBER, R0 ; 2687 EXTZV #0, #6, R0, (R3) ;#0, #6, R0, MSG_NUMBER ; PUSHL #1 ;#1 ; 2689 CALLS #1, W^U.29 ;#1, U.29 ; BLBC R0, 11$ ;R0, 11$ ; MOVL #3, R0 ;#3, R0 ; RET ; ; 11$: MOVL #10, R0 ;#10, R0 ; RET ; ; 2691 ; Routine Size: 249 bytes, Routine Base: $CODE$ + 076F ; 2692 1 %SBTTL 'SEND_EOF' ; 2693 1 ROUTINE SEND_EOF = ; 2694 1 ; 2695 1 !++ ; 2696 1 ! FUNCTIONAL DESCRIPTION: ; 2697 1 ! ; 2698 1 ! This routine will send the end of file message to the remote ; 2699 1 ! KERMIT. It will then determine if there are more files to ; 2700 1 ! send to the remote. ; 2701 1 ! ; 2702 1 ! CALLING SEQUENCE: ; 2703 1 ! ; 2704 1 ! STATE = SEND_EOF(); ; 2705 1 ! ; 2706 1 ! INPUT PARAMETERS: ; 2707 1 ! ; 2708 1 ! None. ; 2709 1 ! ; 2710 1 ! IMPLICIT INPUTS: ; 2711 1 ! ; 2712 1 ! None. ; 2713 1 ! ; 2714 1 ! OUTPUT PARAMETERS: ; 2715 1 ! ; 2716 1 ! New state to change the finite state machine to. ; 2717 1 ! ; 2718 1 ! IMPLICIT OUTPUTS: ; 2719 1 ! ; 2720 1 ! None. ; 2721 1 ! ; 2722 1 ! COMPLETION CODES: ; 2723 1 ! ; 2724 1 ! None. ; 2725 1 ! ; 2726 1 ! SIDE EFFECTS: ; 2727 1 ! ; 2728 1 ! Sets up for the next file to be processed if there is one. ; 2729 1 ! ; 2730 1 !-- ; 2731 1 ; 2732 2 BEGIN ; 2733 2 ; 2734 2 LOCAL ; 2735 2 STATUS, ! Status returned by various routines ; 2736 2 EOF_MSG_LEN; ! Length of EOF message to send ; 2737 2 ; 2738 2 ! ; 2739 2 ! First determine if we have exceed the number of retries that are ; 2740 2 ! allowed to attempt to send this message. ; 2741 2 ! ; 2742 2 ; 2743 2 IF .NUM_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER; ; 2744 2 ; 2745 2 ! ; 2746 2 ! The number of retries are not exceeded. Increment the number and then ; 2747 2 ! attempt to send the packet again. ; 2748 2 ! ; 2749 2 NUM_RETRIES = .NUM_RETRIES + 1; ; 2750 2 ! ; 2751 2 ! Store character in packet to indicate discard of file ; 2752 2 ! Character will only be sent if file should be discarded ; 2753 2 ! ; 2754 2 CH$WCHAR (MSG_EOF_DISCARD, CH$PTR (SND_MSG, PKT_MSG, CHR_SIZE)); ; 2755 2 ; 2756 2 IF .ABT_CUR_FILE OR .ABT_ALL_FILE THEN EOF_MSG_LEN = 1 ELSE EOF_MSG_LEN = 0; ; 2757 2 ; 2758 2 IF NOT SEND_PACKET (MSG_EOF, .EOF_MSG_LEN, .MSG_NUMBER) THEN RETURN STATE_EX; ; 2759 2 ; 2760 2 ! ; 2761 2 ! Now get the responce from the remote KERMIT. ; 2762 2 ! ; 2763 2 STATUS = REC_PACKET (); ; 2764 2 ; 2765 2 IF NOT .STATUS ; 2766 2 THEN ; 2767 3 BEGIN ; 2768 3 ; 2769 4 IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL KER_CHKSUMERR) ; 2770 3 THEN ; 2771 3 RETURN .STATE ; 2772 3 ELSE ; 2773 3 RETURN STATE_EX; ; 2774 3 ; 2775 2 END; ; 2776 2 ; 2777 2 ! ; 2778 2 ! Determine if the packet is good. ; 2779 2 ! ; 2780 2 ; 2781 3 IF NOT (.REC_TYPE EQL MSG_ACK OR .REC_TYPE EQL MSG_NAK) ; 2782 2 THEN ; 2783 3 BEGIN ; 2784 3 KRM_ERROR (KER_PROTOERR); ; 2785 3 RETURN STATE_A; ; 2786 2 END; ; 2787 2 ; 2788 2 ! ; 2789 2 ! If this is a NAK and the message number is not the one we just send ; 2790 2 ! treat this like an ACK, otherwise resend the last packet. ; 2791 2 ! ; 2792 2 ; 2793 2 IF .REC_TYPE EQL MSG_NAK AND (.REC_SEQ NEQ ((.MSG_NUMBER + 1) AND %O'77')) THEN RETURN .STATE; ; 2794 2 ; 2795 2 IF .REC_TYPE EQL MSG_ACK AND .REC_SEQ NEQ .MSG_NUMBER THEN RETURN .STATE; ; 2796 2 ; 2797 2 ! ; 2798 2 ! Here to determine if there is another file to send. ; 2799 2 ! ; 2800 2 NUM_RETRIES = 0; ; 2801 2 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 2802 2 ; 2803 2 IF NOT .ABT_ALL_FILE THEN STATUS = NEXT_FILE () ELSE STATUS = KER_NOMORFILES; ; 2804 2 ; 2805 3 IF ( NOT .STATUS) OR (.STATUS EQL KER_NOMORFILES) ; 2806 2 THEN ; 2807 3 BEGIN ; 2808 3 ; 2809 3 IF (.STATUS NEQ KER_NOMORFILES) THEN RETURN STATE_A ELSE RETURN STATE_SB; ; 2810 3 ; 2811 3 END ; 2812 2 ELSE ; 2813 3 BEGIN ; 2814 3 FLAG_FILE_OPEN = TRUE; ! Have a file open again ; 2815 3 ; 2816 3 IF .FIL_NORMAL_FORM THEN NORMALIZE_FILE (FILE_NAME, FILE_SIZE, -1, -1); ; 2817 3 ; 2818 3 XFR_STATUS (%C'F', %C'S'); ! Inform display routine ; 2819 3 ; 2820 3 IF ( NOT .CONNECT_FLAG) AND .TY_FIL ; 2821 3 THEN ; 2822 4 BEGIN ; 2823 4 !![045] TT_TEXT (UPLIT (%ASCIZ'Sending: ')); ; 2824 4 TT_TEXT (FILE_NAME); ; 2825 4 TT_OUTPUT (); ; 2826 3 END; ; 2827 3 ; 2828 3 FILE_CHARS = 0; ! No characters sent yet ; 2829 3 RETURN STATE_SF; ; 2830 2 END; ; 2831 2 ; 2832 1 END; ! End of SEND_EOF ;SEND_EOF U.7: .WORD ^M ;Save R2,R3 ; 2693 MOVAB W^U.53, R3 ;U.53, R3 ; CMPL -4(R3), W^PKT_RETRIES ;NUM_RETRIES, PKT_RETRIES ; 2743 BLEQ 1$ ;1$ ; MOVL #20, R0 ;#20, R0 ; RET ; ; 1$: INCL -4(R3) ;NUM_RETRIES ; 2749 MOVB #68, 120(R3) ;#68, SND_MSG+4 ; 2754 BLBS W^ABT_CUR_FILE, 2$ ;ABT_CUR_FILE, 2$ ; 2756 BLBC W^ABT_ALL_FILE, 3$ ;ABT_ALL_FILE, 3$ ; 2$: MOVL #1, R0 ;#1, EOF_MSG_LEN ; BRB 4$ ;4$ ; 3$: CLRL R0 ;EOF_MSG_LEN ; 4$: PUSHL (R3) ;MSG_NUMBER ; 2758 PUSHL R0 ;EOF_MSG_LEN ; MOVZBL #90, -(SP) ;#90, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; BLBC R0, 5$ ;R0, 5$ ; CALLS #0, W^U.26 ;#0, U.26 ; 2763 MOVL R0, R2 ;R0, STATUS ; BLBS R2, 6$ ;STATUS, 6$ ; 2765 CMPL R2, #134316234 ;STATUS, #134316234 ; 2769 BEQL 9$ ;9$ ; CMPL R2, #134316248 ;STATUS, #134316248 ; BEQL 9$ ;9$ ; CMPL R2, #134316178 ;STATUS, #134316178 ; BEQL 9$ ;9$ ; 5$: MOVL #19, R0 ;#19, R0 ; 2773 RET ; ; 6$: CMPL 12(R3), #89 ;REC_TYPE, #89 ; 2781 BEQL 7$ ;7$ ; CMPL 12(R3), #78 ;REC_TYPE, #78 ; BEQL 7$ ;7$ ; PUSHL #134316226 ;#134316226 ; 2784 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; BRB 14$ ;14$ ; 2785 7$: CMPL 12(R3), #78 ;REC_TYPE, #78 ; 2793 BNEQ 8$ ;8$ ; ADDL3 #1, (R3), R0 ;#1, MSG_NUMBER, R0 ; CMPZV #0, #6, R0, 4(R3) ;#0, #6, R0, REC_SEQ ; BNEQ 9$ ;9$ ; 8$: CMPL 12(R3), #89 ;REC_TYPE, #89 ; 2795 BNEQ 10$ ;10$ ; CMPL 4(R3), (R3) ;REC_SEQ, MSG_NUMBER ; BEQL 10$ ;10$ ; 9$: MOVL -16(R3), R0 ;STATE, R0 ; RET ; ; 10$: CLRL -4(R3) ;NUM_RETRIES ; 2800 ADDL3 #1, (R3), R0 ;#1, MSG_NUMBER, R0 ; 2801 EXTZV #0, #6, R0, (R3) ;#0, #6, R0, MSG_NUMBER ; BLBS W^ABT_ALL_FILE, 11$ ;ABT_ALL_FILE, 11$ ; 2803 CALLS #0, W^NEXT_FILE ;#0, NEXT_FILE ; MOVL R0, R2 ;R0, STATUS ; BRB 12$ ;12$ ; 11$: MOVL #134316147, R2 ;#134316147, STATUS ; 12$: BLBC R2, 13$ ;STATUS, 13$ ; 2805 CMPL R2, #134316147 ;STATUS, #134316147 ; BNEQ 16$ ;16$ ; 13$: CMPL R2, #134316147 ;STATUS, #134316147 ; 2809 BEQL 15$ ;15$ ; 14$: MOVL #10, R0 ;#10, R0 ; RET ; ; 15$: MOVL #5, R0 ;#5, R0 ; RET ; ; 2813 16$: MOVL #1, W^FLAG_FILE_OPEN ;#1, FLAG_FILE_OPEN ; 2814 BLBC W^FIL_NORMAL_FORM, 17$ ;FIL_NORMAL_FORM, 17$ ; 2816 MNEGL #1, -(SP) ;#1, -(SP) ; MNEGL #1, -(SP) ;#1, -(SP) ; PUSHAB W^FILE_SIZE ;FILE_SIZE ; PUSHAB W^FILE_NAME ;FILE_NAME ; CALLS #4, W^U.27 ;#4, U.27 ; 17$: MOVZBL #83, -(SP) ;#83, -(SP) ; 2818 MOVZBL #70, -(SP) ;#70, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; BLBS W^CONNECT_FLAG, 18$ ;CONNECT_FLAG, 18$ ; 2820 BLBC W^TY_FIL, 18$ ;TY_FIL, 18$ ; PUSHAB W^FILE_NAME ;FILE_NAME ; 2824 CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; CALLS #0, W^TT_OUTPUT ;#0, TT_OUTPUT ; 2825 18$: CLRL 216(R3) ;FILE_CHARS ; 2828 MOVL #2, R0 ;#2, R0 ; 2829 RET ; ; 2832 ; Routine Size: 315 bytes, Routine Base: $CODE$ + 0868 ; 2833 1 %SBTTL 'SEND_INIT' ; 2834 1 ROUTINE SEND_INIT = ; 2835 1 ; 2836 1 !++ ; 2837 1 ! FUNCTIONAL DESCRIPTION: ; 2838 1 ! ; 2839 1 ! This routine will send the initialization packet to the remote ; 2840 1 ! KERMIT. The message type sent is S. ; 2841 1 ! ; 2842 1 ! CALLING SEQUENCE: ; 2843 1 ! ; 2844 1 ! STATE = SEND_INIT(); ; 2845 1 ! ; 2846 1 ! INPUT PARAMETERS: ; 2847 1 ! ; 2848 1 ! None. ; 2849 1 ! ; 2850 1 ! IMPLICIT INPUTS: ; 2851 1 ! ; 2852 1 ! None. ; 2853 1 ! ; 2854 1 ! OUTPUT PARAMETERS: ; 2855 1 ! ; 2856 1 ! New state to change the finite state machine to. ; 2857 1 ! ; 2858 1 ! IMPLICIT OUTPUTS: ; 2859 1 ! ; 2860 1 ! None. ; 2861 1 ! ; 2862 1 ! COMPLETION CODES: ; 2863 1 ! ; 2864 1 ! None. ; 2865 1 ! ; 2866 1 ! SIDE EFFECTS: ; 2867 1 ! ; 2868 1 ! None. ; 2869 1 ! ; 2870 1 !-- ; 2871 1 ; 2872 2 BEGIN ; 2873 2 ; 2874 2 LOCAL ; 2875 2 STATUS; ! Status returned by various routines ; 2876 2 ; 2877 2 SET_SEND_INIT (); ; 2878 2 ; 2879 2 IF .NUM_RETRIES GTR .SI_RETRIES THEN RETURN STATE_ER; ; 2880 2 ; 2881 2 ! ; 2882 2 ! Count the number of times we try this ; 2883 2 ! ; 2884 2 NUM_RETRIES = .NUM_RETRIES + 1; ; 2885 2 ; 2886 2 IF NOT SEND_PACKET (MSG_SND_INIT, P_SI_LENGTH, .MSG_NUMBER) THEN RETURN STATE_EX; ; 2887 2 ; 2888 2 ! ; 2889 2 ! Determine if we received a packet it good condition. If we timed out or ; 2890 2 ! got an illegal message, just try again. ; 2891 2 ! ; 2892 2 STATUS = REC_PACKET (); ; 2893 2 ; 2894 2 IF NOT .STATUS ; 2895 2 THEN ; 2896 3 BEGIN ; 2897 3 ; 2898 4 IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL KER_CHKSUMERR) ; 2899 3 THEN ; 2900 3 RETURN .STATE ; 2901 3 ELSE ; 2902 3 RETURN STATE_EX; ; 2903 3 ; 2904 2 END; ; 2905 2 ; 2906 2 ! ; 2907 2 ! Determine if the packet is good. ; 2908 2 ! ; 2909 2 ; 2910 2 IF .REC_TYPE NEQ MSG_ACK THEN RETURN .STATE; ; 2911 2 ; 2912 2 IF .REC_SEQ NEQ .MSG_NUMBER THEN RETURN .STATE; ; 2913 2 ; 2914 2 ! ; 2915 2 ! Here if we have an ACK for the initialization message that was just sent ; 2916 2 ! to the remote KERMIT. ; 2917 2 ! ; 2918 2 ; 2919 2 IF NOT (STATUS = PRS_SEND_INIT ()) THEN RETURN STATE_A; ; 2920 2 ; 2921 2 BLK_CHK_TYPE = .INI_CHK_TYPE; ! We now use agreed upon block check type ; 2922 2 NUM_RETRIES = 0; ; 2923 2 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 2924 2 RETURN STATE_OF; ! Now need to open the file ; 2925 1 END; ;SEND_INIT U.8: .WORD ^M ;Save R2 ; 2834 MOVAB W^U.53, R2 ;U.53, R2 ; CALLS #0, W^U.20 ;#0, U.20 ; 2877 CMPL -4(R2), W^SI_RETRIES ;NUM_RETRIES, SI_RETRIES ; 2879 BLEQ 1$ ;1$ ; MOVL #20, R0 ;#20, R0 ; RET ; ; 1$: INCL -4(R2) ;NUM_RETRIES ; 2884 PUSHL (R2) ;MSG_NUMBER ; 2886 PUSHL #9 ;#9 ; MOVZBL #83, -(SP) ;#83, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; BLBS R0, 2$ ;R0, 2$ ; MOVL #19, R0 ;#19, R0 ; RET ; ; 2$: CALLS #0, W^U.26 ;#0, U.26 ; 2892 BLBS R0, 6$ ;STATUS, 6$ ; 2894 CMPL R0, #134316234 ;STATUS, #134316234 ; 2898 BEQL 3$ ;3$ ; CMPL R0, #134316248 ;STATUS, #134316248 ; BEQL 3$ ;3$ ; CMPL R0, #134316178 ;STATUS, #134316178 ; BNEQ 4$ ;4$ ; 3$: MOVL -16(R2), R1 ;STATE, R1 ; 2902 BRB 5$ ;5$ ; 4$: MOVL #19, R1 ;#19, R1 ; 5$: MOVL R1, R0 ;R1, R0 ; RET ; ; 6$: CMPL 12(R2), #89 ;REC_TYPE, #89 ; 2910 BNEQ 7$ ;7$ ; CMPL 4(R2), (R2) ;REC_SEQ, MSG_NUMBER ; 2912 BEQL 8$ ;8$ ; 7$: MOVL -16(R2), R0 ;STATE, R0 ; RET ; ; 8$: CALLS #0, W^U.21 ;#0, U.21 ; 2919 BLBS R0, 9$ ;STATUS, 9$ ; MOVL #10, R0 ;#10, R0 ; RET ; ; 9$: MOVL -32(R2), -28(R2) ;INI_CHK_TYPE, BLK_CHK_TYPE ; 2921 CLRL -4(R2) ;NUM_RETRIES ; 2922 ADDL3 #1, (R2), R0 ;#1, MSG_NUMBER, R0 ; 2923 EXTZV #0, #6, R0, (R2) ;#0, #6, R0, MSG_NUMBER ; MOVL #18, R0 ;#18, R0 ; 2924 RET ; ; 2925 ; Routine Size: 149 bytes, Routine Base: $CODE$ + 09A3 ; 2926 1 %SBTTL 'SEND_OPEN_FILE - Open file for sending' ; 2927 1 ROUTINE SEND_OPEN_FILE = ; 2928 1 ; 2929 1 !++ ; 2930 1 ! FUNCTIONAL DESCRIPTION: ; 2931 1 ! ; 2932 1 ! This routine is called from DO_TRANSACTION when the first input file ; 2933 1 ! needs to be opened. ; 2934 1 ! ; 2935 1 ! CALLING SEQUENCE: ; 2936 1 ! ; 2937 1 ! STATE = SEND_OPEN_FILE (); ; 2938 1 ! ; 2939 1 ! INPUT PARAMETERS: ; 2940 1 ! ; 2941 1 ! None. ; 2942 1 ! ; 2943 1 ! IMPLICIT INPUTS: ; 2944 1 ! ; 2945 1 ! FILE_NAME, FILE_SIZE, etc. ; 2946 1 ! ; 2947 1 ! OUPTUT PARAMETERS: ; 2948 1 ! ; 2949 1 ! New state for FSM. ; 2950 1 ! ; 2951 1 ! IMPLICIT OUTPUTS: ; 2952 1 ! ; 2953 1 ! None. ; 2954 1 ! ; 2955 1 ! COMPLETION CODES: ; 2956 1 ! ; 2957 1 ! None. ; 2958 1 ! ; 2959 1 ! SIDE EFFECTS: ; 2960 1 ! ; 2961 1 ! None. ; 2962 1 ! ; 2963 1 !-- ; 2964 1 ; 2965 2 BEGIN ; 2966 2 ; 2967 2 IF ( NOT .CONNECT_FLAG) AND .TY_FIL ; 2968 2 THEN ; 2969 3 BEGIN ; 2970 3 TT_TEXT (UPLIT (%ASCIZ'Sending: ')); ; 2971 3 TT_OUTPUT (); ; 2972 2 END; ; 2973 2 ; 2974 2 FILE_CHARS = 0; ! No characters sent yet ; 2975 2 ; 2976 2 IF NOT .NO_FILE_NEEDED ; 2977 2 THEN ; 2978 2 ; 2979 2 IF NOT FILE_OPEN (FNC_READ) THEN RETURN STATE_A ELSE FLAG_FILE_OPEN = TRUE; ; 2980 2 ; 2981 2 ![023] ; 2982 2 ![023] If we want normalized file names, beat up the name now ; 2983 2 ![023] ; 2984 2 ; 2985 2 IF .FIL_NORMAL_FORM THEN NORMALIZE_FILE (FILE_NAME, FILE_SIZE, -1, -1); ; 2986 2 ; 2987 2 XFR_STATUS (%C'F', %C'S'); ! Inform display routine ; 2988 2 ; 2989 2 IF ( NOT .CONNECT_FLAG) AND .TY_FIL ; 2990 2 THEN ; 2991 3 BEGIN ; 2992 3 TT_TEXT (FILE_NAME); ; 2993 3 TT_OUTPUT (); ; 2994 2 END; ; 2995 2 ; 2996 2 RETURN STATE_SF; ; 2997 1 END; ! End of FSM_OPEN_FILE .PSECT $PLIT$,NOWRT,NOEXE,2 P.AAE: .ASCII \Sending: \<0><0><0> ; ; .PSECT $CODE$,NOWRT,2 ;SEND_OPEN_FILE U.5: .WORD ^M<> ;Save nothing ; 2927 BLBS W^CONNECT_FLAG, 1$ ;CONNECT_FLAG, 1$ ; 2967 BLBC W^TY_FIL, 1$ ;TY_FIL, 1$ ; PUSHAB W^P.AAE ;P.AAE ; 2970 CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; CALLS #0, W^TT_OUTPUT ;#0, TT_OUTPUT ; 2971 1$: CLRL W^U.59 ;U.59 ; 2974 BLBS W^U.61, 3$ ;U.61, 3$ ; 2976 CLRL -(SP) ;-(SP) ; 2979 CALLS #1, W^FILE_OPEN ;#1, FILE_OPEN ; BLBS R0, 2$ ;R0, 2$ ; MOVL #10, R0 ;#10, R0 ; RET ; ; 2$: MOVL #1, W^FLAG_FILE_OPEN ;#1, FLAG_FILE_OPEN ; 3$: BLBC W^FIL_NORMAL_FORM, 4$ ;FIL_NORMAL_FORM, 4$ ; 2985 MNEGL #1, -(SP) ;#1, -(SP) ; MNEGL #1, -(SP) ;#1, -(SP) ; PUSHAB W^FILE_SIZE ;FILE_SIZE ; PUSHAB W^FILE_NAME ;FILE_NAME ; CALLS #4, W^U.27 ;#4, U.27 ; 4$: MOVZBL #83, -(SP) ;#83, -(SP) ; 2987 MOVZBL #70, -(SP) ;#70, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; BLBS W^CONNECT_FLAG, 5$ ;CONNECT_FLAG, 5$ ; 2989 BLBC W^TY_FIL, 5$ ;TY_FIL, 5$ ; PUSHAB W^FILE_NAME ;FILE_NAME ; 2992 CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; CALLS #0, W^TT_OUTPUT ;#0, TT_OUTPUT ; 2993 5$: MOVL #2, R0 ;#2, R0 ; 2996 RET ; ; 2997 ; Routine Size: 119 bytes, Routine Base: $CODE$ + 0A38 ; 2998 1 %SBTTL 'SEND_GENCMD' ; 2999 1 ROUTINE SEND_GENCMD = ; 3000 1 ; 3001 1 !++ ; 3002 1 ! FUNCTIONAL DESCRIPTION: ; 3003 1 ! ; 3004 1 ! This routine will send a command packet to the server Kermit. ; 3005 1 ! The new state will depend upon the response. If a send-init ; 3006 1 ! is received, it will process it and switch to STATE_RF. ; 3007 1 ! If a text-header is received it will switch to STATE_RD. ; 3008 1 ! If an ACK is received, it will type the data portion and ; 3009 1 ! switch to STATE_C. ; 3010 1 ! ; 3011 1 ! CALLING SEQUENCE: ; 3012 1 ! ; 3013 1 ! STATE = SEND_GENCMD(); ; 3014 1 ! ; 3015 1 ! INPUT PARAMETERS: ; 3016 1 ! ; 3017 1 ! None. ; 3018 1 ! ; 3019 1 ! IMPLICIT INPUTS: ; 3020 1 ! ; 3021 1 ! GEN_TYPE - Message type to send (normally MSG_GENERIC) ; 3022 1 ! GEN_SUBTYPE - Message subtype (only if MSG_GENERIC) ; 3023 1 ! GEN_1DATA - First argument string ; 3024 1 ! GEN_1SIZE - Size of first argument ; 3025 1 ! GEN_2DATA - Second argument string ; 3026 1 ! GEN_2SIZE - Size of second argument ; 3027 1 ! GEN_3DATA - Third argument string ; 3028 1 ! GEN_3SIZE - Size of third argument ; 3029 1 ! ; 3030 1 ! OUTPUT PARAMETERS: ; 3031 1 ! ; 3032 1 ! New state for the finite state machine. ; 3033 1 ! ; 3034 1 ! IMPLICIT OUTPUTS: ; 3035 1 ! ; 3036 1 ! None. ; 3037 1 ! ; 3038 1 ! COMPLETION CODES: ; 3039 1 ! ; 3040 1 ! None. ; 3041 1 ! ; 3042 1 ! SIDE EFFECTS: ; 3043 1 ! ; 3044 1 ! None. ; 3045 1 ! ; 3046 1 !-- ; 3047 1 ; 3048 2 BEGIN ; 3049 2 ; 3050 2 LOCAL ; 3051 2 POINTER, ! Pointer at DATA_TEXT ; 3052 2 DATA_TEXT : VECTOR [CH$ALLOCATION (MAX_MSG)], ! Data buffer ; 3053 2 DATA_SIZE, ! Length of data buffer used ; 3054 2 STATUS; ! Status returned by various routines ; 3055 2 ; 3056 2 ROUTINE PACK_DATA (POINTER, LENGTH, SRC_ADDR, SRC_LEN) = ; 3057 2 ! ; 3058 2 ! Routine to pack an argument into the buffer. ; 3059 2 ! ; 3060 3 BEGIN ; 3061 3 ; 3062 3 IF .SRC_LEN GTR MAX_MSG - .LENGTH - 1 THEN SRC_LEN = MAX_MSG - .LENGTH - 1; ; 3063 3 ; 3064 3 LENGTH = .LENGTH + .SRC_LEN + 1; ; 3065 3 CH$WCHAR_A (CHAR (.SRC_LEN), .POINTER); ; 3066 3 .POINTER = CH$MOVE (.SRC_LEN, CH$PTR (.SRC_ADDR), ..POINTER); ; 3067 3 RETURN .LENGTH; ; 3068 2 END; ;PACK_DATA U.75: .WORD ^M ;Save R2,R3,R4,R5 ; 3056 SUBL3 #95, 8(AP), R1 ;#95, LENGTH, R1 ; 3062 MNEGL R1, R0 ;R1, R0 ; CMPL 16(AP), R0 ;SRC_LEN, R0 ; BLEQ 1$ ;1$ ; MNEGL R1, 16(AP) ;R1, SRC_LEN ; 1$: ADDL3 16(AP), 8(AP), R0 ;SRC_LEN, LENGTH, R0 ; 3064 MOVAB 1(R0), 8(AP) ;1(R0), LENGTH ; MOVL 4(AP), R0 ;POINTER, R0 ; 3065 ADDB3 #32, 16(AP), @0(R0) ;#32, SRC_LEN, @0(R0) ; INCL (R0) ;(R0) ; MOVL @4(AP), R0 ;@POINTER, R0 ; 3066 MOVC3 16(AP), @12(AP), (R0) ;SRC_LEN, @SRC_ADDR, (R0) ; MOVL R3, @4(AP) ;R3, @POINTER ; MOVL 8(AP), R0 ;LENGTH, R0 ; 3067 RET ; ; 3068 ; Routine Size: 66 bytes, Routine Base: $CODE$ + 0AAF ; 3069 2 ! ; 3070 2 ! First determine if we have exceed the number of retries that are ; 3071 2 ! allowed to attempt to send this message. ; 3072 2 ! ; 3073 2 ; 3074 2 IF .NUM_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER; ; 3075 2 ; 3076 2 ! ; 3077 2 ! The number of retries are not exceeded. Increment the number and then ; 3078 2 ! attempt to send the packet again. ; 3079 2 ! ; 3080 2 NUM_RETRIES = .NUM_RETRIES + 1; ; 3081 2 ! ; 3082 2 ! Build the packet data field ; 3083 2 ! ; 3084 2 POINTER = CH$PTR (DATA_TEXT); ; 3085 2 DATA_SIZE = 0; ; 3086 2 ; 3087 2 IF .GEN_TYPE EQL MSG_GENERIC ; 3088 2 THEN ; 3089 3 BEGIN ; 3090 3 CH$WCHAR_A (.GEN_SUBTYPE, POINTER); ; 3091 3 DATA_SIZE = 1; ; 3092 3 ; 3093 3 IF .GEN_1SIZE GTR 0 OR .GEN_2SIZE GTR 0 OR .GEN_3SIZE GTR 0 ; 3094 3 THEN ; 3095 4 BEGIN ; 3096 4 DATA_SIZE = PACK_DATA (POINTER, .DATA_SIZE, GEN_1DATA, .GEN_1SIZE); ; 3097 4 ; 3098 4 IF .GEN_2SIZE GTR 0 OR .GEN_3SIZE GTR 0 ; 3099 4 THEN ; 3100 5 BEGIN ; 3101 5 DATA_SIZE = PACK_DATA (POINTER, .DATA_SIZE, GEN_2DATA, .GEN_2SIZE); ; 3102 5 ; 3103 5 IF .GEN_3SIZE GTR 0 ; 3104 5 THEN ; 3105 6 BEGIN ; 3106 6 DATA_SIZE = PACK_DATA (POINTER, .DATA_SIZE, GEN_3DATA, .GEN_3SIZE); ; 3107 5 END; ; 3108 5 ; 3109 4 END; ; 3110 4 ; 3111 3 END; ; 3112 3 ; 3113 3 END ; 3114 2 ELSE ; 3115 3 BEGIN ; 3116 3 ; 3117 3 IF .GEN_1SIZE GTR MAX_MSG THEN GEN_1SIZE = MAX_MSG; ; 3118 3 ; 3119 3 DATA_SIZE = .GEN_1SIZE; ; 3120 3 CH$MOVE (.GEN_1SIZE, CH$PTR (GEN_1DATA), .POINTER); ; 3121 2 END; ; 3122 2 ; 3123 2 SET_STRING (CH$PTR (DATA_TEXT), .DATA_SIZE, TRUE); ; 3124 2 BFR_FILL (TRUE); ; 3125 2 SET_STRING (0, 0, FALSE); ; 3126 2 ! ; 3127 2 ! Send the packet ; 3128 2 ! ; 3129 2 ; 3130 2 IF NOT SEND_PACKET (.GEN_TYPE, .SIZE, .MSG_NUMBER) THEN RETURN STATE_EX; ; 3131 2 ; 3132 2 ! ; 3133 2 ! Now get the responce from the remote KERMIT. ; 3134 2 ! ; 3135 2 STATUS = REC_PACKET (); ; 3136 2 ; 3137 2 IF NOT .STATUS ; 3138 2 THEN ; 3139 3 BEGIN ; 3140 3 ; 3141 4 IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL KER_CHKSUMERR) ; 3142 3 THEN ; 3143 3 RETURN .STATE ; 3144 3 ELSE ; 3145 3 RETURN STATE_EX; ; 3146 3 ; 3147 2 END; ; 3148 2 ; 3149 2 ! Did we get a send-init? ; 3150 2 ; 3151 2 SELECTONE .REC_TYPE OF ; 3152 2 SET ; 3153 2 ; 3154 2 [MSG_SND_INIT] : ; 3155 3 BEGIN ; 3156 3 MSG_NUMBER = .REC_SEQ; ! Initialize sequence numbers ; 3157 3 ! Determine if the parameters are ok. If not, give up ; 3158 3 ; 3159 3 IF NOT (STATUS = PRS_SEND_INIT ()) THEN RETURN .STATUS; ; 3160 3 ; 3161 3 SET_SEND_INIT (); ! Set up our acknowledgement to the send-init ; 3162 3 SEND_PACKET (MSG_ACK, P_SI_LENGTH, .MSG_NUMBER); ! Send it ; 3163 3 BLK_CHK_TYPE = .INI_CHK_TYPE; ! Can now use agreed upon type ; 3164 3 OLD_RETRIES = .NUM_RETRIES; ; 3165 3 NUM_RETRIES = 0; ; 3166 3 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 3167 3 RETURN STATE_RF; ! Now expect file header ; 3168 2 END; ; 3169 2 ; 3170 2 [MSG_TEXT] : ; 3171 2 ! ; 3172 2 ! If we just got a text header, set up for typing on the terminal and ; 3173 2 ! shift to receiving data ; 3174 2 ! ; 3175 3 BEGIN ; 3176 3 TEXT_HEAD_FLAG = TRUE; ! We want terminal output ; 3177 3 PUT_CHR_ROUTINE = TYPE_CHAR; ! Set up the put a character routine ; 3178 3 ; 3179 3 IF .REC_LENGTH GTR 0 ; 3180 3 THEN ; 3181 4 BEGIN ; 3182 4 TT_TEXT (UPLIT (%ASCIZ'<<')); ! Make sure file name sticks out ; 3183 4 BFR_EMPTY (); ! Dump the packet data to the terminal ; 3184 4 TT_TEXT (UPLIT (%ASCIZ'>>')); ! So user can tell where name ends ; 3185 4 TT_CRLF (); ! And a CRLF ; 3186 3 END; ; 3187 3 ; 3188 3 SEND_PACKET (MSG_ACK, 0, .MSG_NUMBER); ! Send an ACK ; 3189 3 OLD_RETRIES = .NUM_RETRIES; ; 3190 3 NUM_RETRIES = 0; ; 3191 3 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 3192 3 RETURN STATE_RD; ! We now want data ; 3193 2 END; ; 3194 2 ; 3195 2 [MSG_ACK] : ; 3196 2 ! ; 3197 2 ! If we get an ACK, just type the data on the terminal and complete the ; 3198 2 ! transaction. ; 3199 2 ! ; 3200 3 BEGIN ; 3201 3 PUT_CHR_ROUTINE = TYPE_CHAR; ! Dump to terminal ; 3202 3 BFR_EMPTY (); ! Do it ; 3203 3 ; 3204 3 IF .REC_LENGTH GTR 0 THEN TT_CRLF (); ; 3205 3 ; 3206 3 RETURN STATE_C; ! And go idle ; 3207 2 END; ; 3208 2 ; 3209 2 [MSG_NAK] : ; 3210 2 ! ; 3211 2 ! If we get a NAK, stay in the same state. We will re-transmit the ; 3212 2 ! packet again. ; 3213 2 ! ; 3214 2 RETURN .STATE; ; 3215 2 TES; ; 3216 2 ; 3217 2 ! ; 3218 2 ! If we get here, we didn't get anything resembling an acceptable ; 3219 2 ! packet, so we will abort. ; 3220 2 ! ; 3221 2 KRM_ERROR (KER_PROTOERR); ; 3222 2 RETURN STATE_A; ; 3223 1 END; .PSECT $PLIT$,NOWRT,NOEXE,2 P.AAF: .ASCII \<<\<0><0> ; ; P.AAG: .ASCII \>>\<0><0> ; ; .PSECT $CODE$,NOWRT,2 ;SEND_GENCMD U.6: .WORD ^M ;Save R2,R3,R4,R5,R6,R7,R8,R9,R10,R11 ; 2999 MOVAB W^U.24, R11 ;U.24, R11 ; MOVAB B^U.75, R10 ;U.75, R10 ; MOVAB W^GEN_3SIZE, R9 ;GEN_3SIZE, R9 ; MOVAB W^GEN_1SIZE, R8 ;GEN_1SIZE, R8 ; MOVAB W^U.53, R7 ;U.53, R7 ; MOVAB -100(SP), SP ;-100(SP), SP ; CMPL -4(R7), W^PKT_RETRIES ;NUM_RETRIES, PKT_RETRIES ; 3074 BLEQ 1$ ;1$ ; MOVL #20, R0 ;#20, R0 ; RET ; ; 1$: INCL -4(R7) ;NUM_RETRIES ; 3080 MOVAB 4(SP), (SP) ;DATA_TEXT, POINTER ; 3084 CLRL R6 ;DATA_SIZE ; 3085 MOVL (R8), R0 ;GEN_1SIZE, R0 ; 3093 CMPL 232(R7), #71 ;GEN_TYPE, #71 ; 3087 BNEQ 4$ ;4$ ; MOVB 236(R7), @0(SP) ;GEN_SUBTYPE, @POINTER ; 3090 INCL (SP) ;POINTER ; MOVL #1, R6 ;#1, DATA_SIZE ; 3091 TSTL R0 ;R0 ; 3093 BGTR 2$ ;2$ ; TSTL W^GEN_2SIZE ;GEN_2SIZE ; BGTR 2$ ;2$ ; TSTL (R9) ;GEN_3SIZE ; BLEQ 6$ ;6$ ; 2$: PUSHL R0 ;R0 ; 3096 PUSHAB W^GEN_1DATA ;GEN_1DATA ; PUSHL R6 ;DATA_SIZE ; PUSHAB 12(SP) ;POINTER ; CALLS #4, (R10) ;#4, PACK_DATA ; MOVL R0, R6 ;R0, DATA_SIZE ; MOVL W^GEN_2SIZE, R0 ;GEN_2SIZE, R0 ; 3098 BGTR 3$ ;3$ ; TSTL (R9) ;GEN_3SIZE ; BLEQ 6$ ;6$ ; 3$: PUSHL R0 ;R0 ; 3101 PUSHAB W^GEN_2DATA ;GEN_2DATA ; PUSHL R6 ;DATA_SIZE ; PUSHAB 12(SP) ;POINTER ; CALLS #4, (R10) ;#4, PACK_DATA ; MOVL R0, R6 ;R0, DATA_SIZE ; MOVL (R9), R0 ;GEN_3SIZE, R0 ; 3103 BLEQ 6$ ;6$ ; PUSHL R0 ;R0 ; 3106 PUSHAB W^GEN_3DATA ;GEN_3DATA ; PUSHL R6 ;DATA_SIZE ; PUSHAB 12(SP) ;POINTER ; CALLS #4, (R10) ;#4, PACK_DATA ; MOVL R0, R6 ;R0, DATA_SIZE ; BRB 6$ ;6$ ; 4$: CMPL R0, #96 ;R0, #96 ; 3117 BLEQ 5$ ;5$ ; MOVZBL #96, (R8) ;#96, GEN_1SIZE ; 5$: MOVL (R8), R6 ;GEN_1SIZE, DATA_SIZE ; 3119 MOVC3 (R8), W^GEN_1DATA, @0(SP) ;GEN_1SIZE, GEN_1DATA, @POINTER ; 3120 6$: PUSHL #1 ;#1 ; 3123 PUSHL R6 ;DATA_SIZE ; PUSHAB 12(SP) ;DATA_TEXT ; CALLS #3, W^U.30 ;#3, U.30 ; PUSHL #1 ;#1 ; 3124 CALLS #1, W^U.29 ;#1, U.29 ; CLRQ -(SP) ;-(SP) ; 3125 CLRL -(SP) ;-(SP) ; CALLS #3, W^U.30 ;#3, U.30 ; PUSHL (R7) ;MSG_NUMBER ; 3130 PUSHL -12(R7) ;SIZE ; PUSHL 232(R7) ;GEN_TYPE ; CALLS #3, (R11) ;#3, SEND_PACKET ; BLBS R0, 7$ ;R0, 7$ ; MOVL #19, R0 ;#19, R0 ; RET ; ; 7$: CALLS #0, W^U.26 ;#0, U.26 ; 3135 BLBS R0, 11$ ;STATUS, 11$ ; 3137 CMPL R0, #134316234 ;STATUS, #134316234 ; 3141 BEQL 8$ ;8$ ; CMPL R0, #134316248 ;STATUS, #134316248 ; BEQL 8$ ;8$ ; CMPL R0, #134316178 ;STATUS, #134316178 ; BNEQ 9$ ;9$ ; 8$: MOVL -16(R7), R1 ;STATE, R1 ; 3145 BRB 10$ ;10$ ; 9$: MOVL #19, R1 ;#19, R1 ; 10$: MOVL R1, R0 ;R1, R0 ; RET ; ; 11$: MOVL 12(R7), R1 ;REC_TYPE, R1 ; 3151 CMPL R1, #83 ;R1, #83 ; 3154 BNEQ 13$ ;13$ ; MOVL 4(R7), (R7) ;REC_SEQ, MSG_NUMBER ; 3156 CALLS #0, W^U.21 ;#0, U.21 ; 3159 BLBS R0, 12$ ;STATUS, 12$ ; RET ; ; 12$: CALLS #0, W^U.20 ;#0, U.20 ; 3161 PUSHL (R7) ;MSG_NUMBER ; 3162 PUSHL #9 ;#9 ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, (R11) ;#3, SEND_PACKET ; MOVL -32(R7), -28(R7) ;INI_CHK_TYPE, BLK_CHK_TYPE ; 3163 MOVL -4(R7), -8(R7) ;NUM_RETRIES, OLD_RETRIES ; 3164 CLRL -4(R7) ;NUM_RETRIES ; 3165 ADDL3 #1, (R7), R0 ;#1, MSG_NUMBER, R0 ; 3166 EXTZV #0, #6, R0, (R7) ;#0, #6, R0, MSG_NUMBER ; MOVL #7, R0 ;#7, R0 ; 3167 RET ; ; 13$: CMPL R1, #88 ;R1, #88 ; 3170 BNEQ 15$ ;15$ ; MOVL #1, 220(R7) ;#1, TEXT_HEAD_FLAG ; 3176 MOVAB W^U.31, 244(R7) ;U.31, PUT_CHR_ROUTINE ; 3177 TSTL 8(R7) ;REC_LENGTH ; 3179 BLEQ 14$ ;14$ ; PUSHAB W^P.AAF ;P.AAF ; 3182 CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; CALLS #0, W^U.28 ;#0, U.28 ; 3183 PUSHAB W^P.AAG ;P.AAG ; 3184 CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 3185 14$: PUSHL (R7) ;MSG_NUMBER ; 3188 CLRL -(SP) ;-(SP) ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, (R11) ;#3, SEND_PACKET ; MOVL -4(R7), -8(R7) ;NUM_RETRIES, OLD_RETRIES ; 3189 CLRL -4(R7) ;NUM_RETRIES ; 3190 ADDL3 #1, (R7), R0 ;#1, MSG_NUMBER, R0 ; 3191 EXTZV #0, #6, R0, (R7) ;#0, #6, R0, MSG_NUMBER ; MOVL #8, R0 ;#8, R0 ; 3192 RET ; ; 15$: CMPL R1, #89 ;R1, #89 ; 3195 BNEQ 17$ ;17$ ; MOVAB W^U.31, 244(R7) ;U.31, PUT_CHR_ROUTINE ; 3201 CALLS #0, W^U.28 ;#0, U.28 ; 3202 TSTL 8(R7) ;REC_LENGTH ; 3204 BLEQ 16$ ;16$ ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 16$: MOVL #9, R0 ;#9, R0 ; 3206 RET ; ; 17$: CMPL R1, #78 ;R1, #78 ; 3209 BNEQ 18$ ;18$ ; MOVL -16(R7), R0 ;STATE, R0 ; 3214 RET ; ; 18$: PUSHL #134316226 ;#134316226 ; 3221 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; MOVL #10, R0 ;#10, R0 ; 3222 RET ; ; 3223 ; Routine Size: 495 bytes, Routine Base: $CODE$ + 0AF1 ; 3224 1 %SBTTL 'SEND_BREAK' ; 3225 1 ROUTINE SEND_BREAK = ; 3226 1 ; 3227 1 !++ ; 3228 1 ! FUNCTIONAL DESCRIPTION: ; 3229 1 ! ; 3230 1 ! This routine will send the break (end of transmission) message ; 3231 1 ! to the remote KERMIT. On an ACK the state becomes STATE_C. ; 3232 1 ! ; 3233 1 ! CALLING SEQUENCE: ; 3234 1 ! ; 3235 1 ! STATE = SEND_BREAK(); ; 3236 1 ! ; 3237 1 ! INPUT PARAMETERS: ; 3238 1 ! ; 3239 1 ! None. ; 3240 1 ! ; 3241 1 ! IMPLICIT INPUTS: ; 3242 1 ! ; 3243 1 ! None. ; 3244 1 ! ; 3245 1 ! OUTPUT PARAMETERS: ; 3246 1 ! ; 3247 1 ! New state for the finite state machine. ; 3248 1 ! ; 3249 1 ! IMPLICIT OUTPUTS: ; 3250 1 ! ; 3251 1 ! None. ; 3252 1 ! ; 3253 1 ! COMPLETION CODES: ; 3254 1 ! ; 3255 1 ! None. ; 3256 1 ! ; 3257 1 ! SIDE EFFECTS: ; 3258 1 ! ; 3259 1 ! None. ; 3260 1 ! ; 3261 1 !-- ; 3262 1 ; 3263 2 BEGIN ; 3264 2 ; 3265 2 LOCAL ; 3266 2 STATUS; ! Status returned by various routines ; 3267 2 ; 3268 2 ! ; 3269 2 ! First determine if we have exceed the number of retries that are ; 3270 2 ! allowed to attempt to send this message. ; 3271 2 ! ; 3272 2 ; 3273 2 IF .NUM_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER; ; 3274 2 ; 3275 2 ! ; 3276 2 ! The number of retries are not exceeded. Increment the number and then ; 3277 2 ! attempt to send the packet again. ; 3278 2 ! ; 3279 2 NUM_RETRIES = .NUM_RETRIES + 1; ; 3280 2 ; 3281 2 IF NOT SEND_PACKET (MSG_BREAK, 0, .MSG_NUMBER) THEN RETURN STATE_EX; ; 3282 2 ; 3283 2 ! ; 3284 2 ! Now get the responce from the remote KERMIT. ; 3285 2 ! ; 3286 2 STATUS = REC_PACKET (); ; 3287 2 ; 3288 2 IF NOT .STATUS ; 3289 2 THEN ; 3290 3 BEGIN ; 3291 3 ; 3292 4 IF (.STATUS EQL KER_ZEROLENMSG) OR (.STATUS EQL KER_TIMEOUT) OR (.STATUS EQL KER_CHKSUMERR) ; 3293 3 THEN ; 3294 3 RETURN .STATE ; 3295 3 ELSE ; 3296 3 RETURN STATE_EX; ; 3297 3 ; 3298 2 END; ; 3299 2 ; 3300 2 ! ; 3301 2 ! Determine if the packet is good. ; 3302 2 ! ; 3303 2 ; 3304 3 IF NOT (.REC_TYPE EQL MSG_ACK OR .REC_TYPE EQL MSG_NAK) ; 3305 2 THEN ; 3306 3 BEGIN ; 3307 3 KRM_ERROR (KER_PROTOERR); ; 3308 3 RETURN STATE_A; ; 3309 2 END; ; 3310 2 ; 3311 2 ! ; 3312 2 ! If this is a NAK and the message number is not the one we just send ; 3313 2 ! treat this like an ACK, otherwise resend the last packet. ; 3314 2 ! ; 3315 2 ; 3316 2 IF .REC_TYPE EQL MSG_NAK AND .REC_SEQ NEQ 0 THEN RETURN .STATE; ; 3317 2 ; 3318 2 IF .REC_TYPE EQL MSG_ACK AND .REC_SEQ NEQ .MSG_NUMBER THEN RETURN .STATE; ; 3319 2 ; 3320 2 ! ; 3321 2 ! Here to determine if there is another file to send. ; 3322 2 ! ; 3323 2 NUM_RETRIES = 0; ; 3324 2 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 3325 2 RETURN STATE_C; ; 3326 1 END; ;SEND_BREAK U.9: .WORD ^M ;Save R2 ; 3225 MOVAB W^U.53, R2 ;U.53, R2 ; CMPL -4(R2), W^PKT_RETRIES ;NUM_RETRIES, PKT_RETRIES ; 3273 BLEQ 1$ ;1$ ; MOVL #20, R0 ;#20, R0 ; RET ; ; 1$: INCL -4(R2) ;NUM_RETRIES ; 3279 PUSHL (R2) ;MSG_NUMBER ; 3281 CLRL -(SP) ;-(SP) ; MOVZBL #66, -(SP) ;#66, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; BLBC R0, 2$ ;R0, 2$ ; CALLS #0, W^U.26 ;#0, U.26 ; 3286 BLBS R0, 3$ ;STATUS, 3$ ; 3288 CMPL R0, #134316234 ;STATUS, #134316234 ; 3292 BEQL 6$ ;6$ ; CMPL R0, #134316248 ;STATUS, #134316248 ; BEQL 6$ ;6$ ; CMPL R0, #134316178 ;STATUS, #134316178 ; BEQL 6$ ;6$ ; 2$: MOVL #19, R0 ;#19, R0 ; 3296 RET ; ; 3$: CMPL 12(R2), #89 ;REC_TYPE, #89 ; 3304 BEQL 4$ ;4$ ; CMPL 12(R2), #78 ;REC_TYPE, #78 ; BEQL 4$ ;4$ ; PUSHL #134316226 ;#134316226 ; 3307 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; MOVL #10, R0 ;#10, R0 ; 3308 RET ; ; 4$: CMPL 12(R2), #78 ;REC_TYPE, #78 ; 3316 BNEQ 5$ ;5$ ; TSTL 4(R2) ;REC_SEQ ; BNEQ 6$ ;6$ ; 5$: CMPL 12(R2), #89 ;REC_TYPE, #89 ; 3318 BNEQ 7$ ;7$ ; CMPL 4(R2), (R2) ;REC_SEQ, MSG_NUMBER ; BEQL 7$ ;7$ ; 6$: MOVL -16(R2), R0 ;STATE, R0 ; RET ; ; 7$: CLRL -4(R2) ;NUM_RETRIES ; 3323 ADDL3 #1, (R2), R0 ;#1, MSG_NUMBER, R0 ; 3324 EXTZV #0, #6, R0, (R2) ;#0, #6, R0, MSG_NUMBER ; MOVL #9, R0 ;#9, R0 ; 3325 RET ; ; 3326 ; Routine Size: 164 bytes, Routine Base: $CODE$ + 0CE0 ; 3327 1 %SBTTL 'REC_INIT' ; 3328 1 ROUTINE REC_INIT = ; 3329 1 ; 3330 1 !++ ; 3331 1 ! FUNCTIONAL DESCRIPTION: ; 3332 1 ! ; 3333 1 ! This routine will process an initialization message received from ; 3334 1 ! the remote KERMIT. ; 3335 1 ! ; 3336 1 ! CALLING SEQUENCE: ; 3337 1 ! ; 3338 1 ! STATE = REC_INIT(); ; 3339 1 ! ; 3340 1 ! INPUT PARAMETERS: ; 3341 1 ! ; 3342 1 ! None. ; 3343 1 ! ; 3344 1 ! IMPLICIT INPUTS: ; 3345 1 ! ; 3346 1 ! None. ; 3347 1 ! ; 3348 1 ! OUTPUT PARAMETERS: ; 3349 1 ! ; 3350 1 ! New machine state. ; 3351 1 ! ; 3352 1 ! IMPLICIT OUTPUTS: ; 3353 1 ! ; 3354 1 ! None. ; 3355 1 ! ; 3356 1 ! COMPLETION CODES: ; 3357 1 ! ; 3358 1 ! None. ; 3359 1 ! ; 3360 1 ! SIDE EFFECTS: ; 3361 1 ! ; 3362 1 ! None. ; 3363 1 ! ; 3364 1 !-- ; 3365 1 ; 3366 2 BEGIN ; 3367 2 ; 3368 2 LOCAL ; 3369 2 STATUS; ! Status returned by various routines ; 3370 2 ; 3371 2 ROUTINE CHECK_INIT = ; 3372 3 BEGIN ; 3373 3 ; 3374 3 IF .REC_TYPE EQL MSG_SND_INIT THEN RETURN TRUE ELSE RETURN FALSE; ; 3375 3 ; 3376 2 END; ;CHECK_INIT U.76: .WORD ^M<> ;Save nothing ; 3371 CMPL W^U.56, #83 ;U.56, #83 ; 3374 BNEQ 1$ ;1$ ; MOVL #1, R0 ;#1, R0 ; RET ; ; 1$: CLRL R0 ;R0 ; RET ; ; 3376 ; Routine Size: 20 bytes, Routine Base: $CODE$ + 0D84 ; 3377 2 ; 3378 3 IF NOT (STATUS = REC_MESSAGE (CHECK_INIT)) ; 3379 2 THEN ; 3380 2 ; 3381 2 IF .STATUS NEQ KER_ABORTED THEN RETURN STATE_A ELSE RETURN STATE_EX; ; 3382 2 ; 3383 2 MSG_NUMBER = .REC_SEQ; ; 3384 2 ; 3385 2 IF NOT (STATUS = PRS_SEND_INIT ()) THEN RETURN STATE_A; ; 3386 2 ; 3387 2 SET_SEND_INIT (); ; 3388 2 SEND_PACKET (MSG_ACK, P_SI_LENGTH, .MSG_NUMBER); ; 3389 2 BLK_CHK_TYPE = .INI_CHK_TYPE; ! Can now use agreed upon type ; 3390 2 OLD_RETRIES = .NUM_RETRIES; ; 3391 2 NUM_RETRIES = 0; ; 3392 2 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 3393 2 RETURN STATE_RF; ; 3394 1 END; ! End of REC_INIT ;REC_INIT U.11: .WORD ^M ;Save R2 ; 3328 MOVAB W^U.53, R2 ;U.53, R2 ; PUSHAB B^U.76 ;U.76 ; 3378 CALLS #1, W^U.25 ;#1, U.25 ; BLBS R0, 3$ ;STATUS, 3$ ; CMPL R0, #134316258 ;STATUS, #134316258 ; 3381 BEQL 1$ ;1$ ; MOVL #10, R1 ;#10, R1 ; BRB 2$ ;2$ ; 1$: MOVL #19, R1 ;#19, R1 ; 2$: MOVL R1, R0 ;R1, R0 ; RET ; ; 3$: MOVL 4(R2), (R2) ;REC_SEQ, MSG_NUMBER ; 3383 CALLS #0, W^U.21 ;#0, U.21 ; 3385 BLBS R0, 4$ ;STATUS, 4$ ; MOVL #10, R0 ;#10, R0 ; RET ; ; 4$: CALLS #0, W^U.20 ;#0, U.20 ; 3387 PUSHL (R2) ;MSG_NUMBER ; 3388 PUSHL #9 ;#9 ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; MOVL -32(R2), -28(R2) ;INI_CHK_TYPE, BLK_CHK_TYPE ; 3389 MOVL -4(R2), -8(R2) ;NUM_RETRIES, OLD_RETRIES ; 3390 CLRL -4(R2) ;NUM_RETRIES ; 3391 ADDL3 #1, (R2), R0 ;#1, MSG_NUMBER, R0 ; 3392 EXTZV #0, #6, R0, (R2) ;#0, #6, R0, MSG_NUMBER ; MOVL #7, R0 ;#7, R0 ; 3393 RET ; ; 3394 ; Routine Size: 99 bytes, Routine Base: $CODE$ + 0D98 ; 3395 1 %SBTTL 'REC_FILE' ; 3396 1 ROUTINE REC_FILE = ; 3397 1 ; 3398 1 !++ ; 3399 1 ! FUNCTIONAL DESCRIPTION: ; 3400 1 ! ; 3401 1 ! This routine expects to receive an MSG_FILE packet from the remote ; 3402 1 ! KERMIT. If the message is correct this routine will change the state ; 3403 1 ! to STATE_RD. ; 3404 1 ! ; 3405 1 ! This routine also expects MSG_SND_INIT, MSG_EOF, or MSG_BREAK. ; 3406 1 ! ; 3407 1 ! CALLING SEQUENCE: ; 3408 1 ! ; 3409 1 ! STATE = REC_FILE(); ; 3410 1 ! ; 3411 1 ! INPUT PARAMETERS: ; 3412 1 ! ; 3413 1 ! None. ; 3414 1 ! ; 3415 1 ! IMPLICIT INPUTS: ; 3416 1 ! ; 3417 1 ! None. ; 3418 1 ! ; 3419 1 ! OUTPUT PARAMETERS: ; 3420 1 ! ; 3421 1 ! New state. ; 3422 1 ! ; 3423 1 ! IMPLICIT OUTPUTS: ; 3424 1 ! ; 3425 1 ! None. ; 3426 1 ! ; 3427 1 ! COMPLETION CODES: ; 3428 1 ! ; 3429 1 ! None. ; 3430 1 ! ; 3431 1 ! SIDE EFFECTS: ; 3432 1 ! ; 3433 1 ! None. ; 3434 1 ! ; 3435 1 !-- ; 3436 1 ; 3437 2 BEGIN ; 3438 2 ; 3439 2 LOCAL ; 3440 2 STATUS; ; 3441 2 ; 3442 2 ROUTINE CHECK_FILE = ; 3443 3 BEGIN ; 3444 3 ; 3445 4 IF (.REC_TYPE EQL MSG_SND_INIT) OR (.REC_TYPE EQL MSG_EOF) OR (.REC_TYPE EQL MSG_FILE) OR ( ; 3446 4 .REC_TYPE EQL MSG_BREAK) OR (.REC_TYPE EQL MSG_TEXT) ; 3447 3 THEN ; 3448 3 RETURN TRUE ; 3449 3 ELSE ; 3450 3 RETURN FALSE; ; 3451 3 ; 3452 2 END; ;CHECK_FILE U.77: .WORD ^M<> ;Save nothing ; 3442 MOVL W^U.56, R0 ;U.56, R0 ; 3445 CMPL R0, #83 ;R0, #83 ; BEQL 1$ ;1$ ; CMPL R0, #90 ;R0, #90 ; BEQL 1$ ;1$ ; CMPL R0, #70 ;R0, #70 ; BEQL 1$ ;1$ ; CMPL R0, #66 ;R0, #66 ; 3446 BEQL 1$ ;1$ ; CMPL R0, #88 ;R0, #88 ; BNEQ 2$ ;2$ ; 1$: MOVL #1, R0 ;#1, R0 ; 3450 RET ; ; 2$: CLRL R0 ;R0 ; RET ; ; 3452 ; Routine Size: 59 bytes, Routine Base: $CODE$ + 0DFB ; 3453 2 ! ; 3454 2 ! Initialize the abort flags ; 3455 2 ! ; 3456 2 ABT_CUR_FILE = FALSE; ; 3457 2 ABT_ALL_FILE = FALSE; ; 3458 2 ! ; 3459 2 ! Get a message ; 3460 2 ! ; 3461 2 ; 3462 3 IF NOT (STATUS = REC_MESSAGE (CHECK_FILE)) ; 3463 2 THEN ; 3464 2 ; 3465 2 IF .STATUS NEQ KER_ABORTED THEN RETURN STATE_A ELSE RETURN STATE_EX; ; 3466 2 ; 3467 2 SELECTONE .REC_TYPE OF ; 3468 2 SET ; 3469 2 ; 3470 2 [MSG_SND_INIT] : ; 3471 3 BEGIN ; 3472 3 ; 3473 3 IF .OLD_RETRIES GTR .SI_RETRIES THEN RETURN STATE_ER; ; 3474 3 ; 3475 3 OLD_RETRIES = .OLD_RETRIES + 1; ; 3476 3 ; 3477 3 IF ((.MSG_NUMBER - 1) AND %O'77') EQL .REC_SEQ ; 3478 3 THEN ; 3479 4 BEGIN ; 3480 4 SET_SEND_INIT (); ; 3481 4 BLK_CHK_TYPE = CHK_1CHAR; ! Must use 1 character CHKSUM ; 3482 4 SEND_PACKET (MSG_ACK, P_SI_LENGTH, .REC_SEQ); ; 3483 4 BLK_CHK_TYPE = .INI_CHK_TYPE; ! Back to agreed upon type ; 3484 4 NUM_RETRIES = 0; ; 3485 4 RETURN .STATE; ; 3486 4 END ; 3487 3 ELSE ; 3488 4 BEGIN ; 3489 4 KRM_ERROR (KER_PROTOERR); ; 3490 4 RETURN STATE_A; ; 3491 3 END; ; 3492 3 ; 3493 2 END; ; 3494 2 ; 3495 2 [MSG_EOF] : ; 3496 3 BEGIN ; 3497 3 ; 3498 3 IF .OLD_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER; ; 3499 3 ; 3500 3 OLD_RETRIES = .OLD_RETRIES + 1; ; 3501 3 ; 3502 3 IF ((.MSG_NUMBER - 1) AND %O'77') EQL .REC_SEQ ; 3503 3 THEN ; 3504 4 BEGIN ; 3505 4 SEND_PACKET (MSG_ACK, 0, .REC_SEQ); ; 3506 4 NUM_RETRIES = 0; ; 3507 4 RETURN .STATE; ; 3508 4 END ; 3509 3 ELSE ; 3510 4 BEGIN ; 3511 4 KRM_ERROR (KER_PROTOERR); ; 3512 4 RETURN STATE_A; ; 3513 3 END; ; 3514 3 ; 3515 2 END; ; 3516 2 ; 3517 2 [MSG_FILE] : ; 3518 3 BEGIN ; 3519 3 ; 3520 3 IF .MSG_NUMBER NEQ .REC_SEQ THEN RETURN STATE_ER; ; 3521 3 ; 3522 3 IF .REC_LENGTH EQL 0 ; 3523 3 THEN ; 3524 4 BEGIN ; 3525 4 KRM_ERROR (KER_PROTOERR); ; 3526 4 RETURN STATE_A; ; 3527 3 END; ; 3528 3 ; 3529 3 ![025] ; 3530 3 ![025] Get file name from packet with all quoting undone ; 3531 3 ![025] ; 3532 3 SET_STRING (CH$PTR (FILE_NAME), MAX_FILE_NAME, TRUE); ; 3533 3 BFR_EMPTY (); ; 3534 3 FILE_SIZE = SET_STRING (0, 0, FALSE); ; 3535 3 CH$WCHAR (CHR_NUL, CH$PTR (FILE_NAME, .FILE_SIZE)); ; 3536 3 ![025] FILE_SIZE = .REC_LENGTH; ; 3537 3 ![025] CH$COPY (.REC_LENGTH, CH$PTR (REC_MSG, PKT_MSG, CHR_SIZE), CHR_NUL, MAX_FILE_NAME, ; 3538 3 ![025] CH$PTR (FILE_NAME)); ; 3539 3 ; 3540 3 IF ( NOT .CONNECT_FLAG) AND .TY_FIL ; 3541 3 THEN ; 3542 4 BEGIN ; 3543 4 TT_TEXT (UPLIT (%ASCIZ'Receiving: ')); ; 3544 4 TT_TEXT (FILE_NAME); ; 3545 4 TT_OUTPUT (); ; 3546 3 END; ; 3547 3 ; 3548 3 ![023] ; 3549 3 ![023] Force file name into normal form if desired ; 3550 3 ![023] ; 3551 3 ; 3552 3 IF .FIL_NORMAL_FORM THEN NORMALIZE_FILE (FILE_NAME, FILE_SIZE, 9, 3); ; 3553 3 ; 3554 3 FILE_CHARS = 0; ! No characters received yet ; 3555 3 ; 3556 3 IF NOT FILE_OPEN (FNC_WRITE) THEN RETURN STATE_A; ; 3557 3 ; 3558 3 XFR_STATUS (%C'F', %C'R'); ! Tell display routine ; 3559 3 TEXT_HEAD_FLAG = FALSE; ! Got an F, not an X ; 3560 3 FLAG_FILE_OPEN = TRUE; ; 3561 3 SEND_PACKET (MSG_ACK, 0, .MSG_NUMBER); ; 3562 3 OLD_RETRIES = .NUM_RETRIES; ; 3563 3 NUM_RETRIES = 0; ; 3564 3 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 3565 3 RETURN STATE_RD; ; 3566 2 END; ; 3567 2 ; 3568 2 [MSG_TEXT] : ; 3569 2 ! ; 3570 2 ! If we get a text header, we will want to type the data on ; 3571 2 ! the terminal. Set up the put a character routine correctly. ; 3572 2 ! ; 3573 3 BEGIN ; 3574 3 ; 3575 3 IF .MSG_NUMBER NEQ .REC_SEQ ; 3576 3 THEN ; 3577 4 BEGIN ; 3578 4 KRM_ERROR (KER_PROTOERR); ; 3579 4 RETURN STATE_A; ; 3580 3 END; ; 3581 3 ; 3582 3 TEXT_HEAD_FLAG = TRUE; ! Got an X, not an F ; 3583 3 PUT_CHR_ROUTINE = TYPE_CHAR; ! Empty buffer on terminal ; 3584 3 ; 3585 3 IF .REC_LENGTH GTR 0 ; 3586 3 THEN ; 3587 4 BEGIN ; 3588 4 TT_TEXT (UPLIT (%ASCIZ'<<')); ! Make file name stick out ; 3589 4 BFR_EMPTY (); ! Do the header data ; 3590 4 TT_TEXT (UPLIT (%ASCIZ'>>')); ; 3591 4 TT_CRLF (); ! And a crlf ; 3592 3 END; ; 3593 3 ; 3594 3 SEND_PACKET (MSG_ACK, 0, .MSG_NUMBER); ; 3595 3 OLD_RETRIES = .NUM_RETRIES; ; 3596 3 NUM_RETRIES = 0; ; 3597 3 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 3598 3 RETURN STATE_RD; ; 3599 2 END; ; 3600 2 ; 3601 2 [MSG_BREAK] : ; 3602 3 BEGIN ; 3603 3 ; 3604 3 IF .MSG_NUMBER NEQ .REC_SEQ ; 3605 3 THEN ; 3606 4 BEGIN ; 3607 4 KRM_ERROR (KER_PROTOERR); ; 3608 4 RETURN STATE_A; ; 3609 3 END; ; 3610 3 ; 3611 3 SEND_PACKET (MSG_ACK, 0, .REC_SEQ); ; 3612 3 RETURN STATE_C; ; 3613 2 END; ; 3614 2 ; 3615 2 [OTHERWISE] : ; 3616 3 BEGIN ; 3617 3 KRM_ERROR (KER_PROTOERR); ; 3618 3 RETURN STATE_A; ; 3619 2 END; ; 3620 2 TES; ; 3621 2 ; 3622 1 END; ! End of REC_FILE .PSECT $PLIT$,NOWRT,NOEXE,2 P.AAH: .ASCII \Receiving: \<0> ; ; P.AAI: .ASCII \<<\<0><0> ; ; P.AAJ: .ASCII \>>\<0><0> ; ; .PSECT $CODE$,NOWRT,2 ;REC_FILE U.12: .WORD ^M ;Save R2,R3,R4,R5 ; 3396 MOVAB W^TT_TEXT, R5 ;TT_TEXT, R5 ; MOVAB W^FILE_NAME, R4 ;FILE_NAME, R4 ; MOVAB W^U.24, R3 ;U.24, R3 ; MOVAB W^U.53, R2 ;U.53, R2 ; CLRL W^ABT_CUR_FILE ;ABT_CUR_FILE ; 3456 CLRL W^ABT_ALL_FILE ;ABT_ALL_FILE ; 3457 PUSHAB B^U.77 ;U.77 ; 3462 CALLS #1, W^U.25 ;#1, U.25 ; BLBS R0, 2$ ;STATUS, 2$ ; CMPL R0, #134316258 ;STATUS, #134316258 ; 3465 BEQL 1$ ;1$ ; BRW 18$ ;18$ ; 1$: MOVL #19, R0 ;#19, R0 ; RET ; ; 2$: MOVL 12(R2), R0 ;REC_TYPE, R0 ; 3467 CMPL R0, #83 ;R0, #83 ; 3470 BNEQ 3$ ;3$ ; CMPL -8(R2), W^SI_RETRIES ;OLD_RETRIES, SI_RETRIES ; 3473 BGTR 7$ ;7$ ; INCL -8(R2) ;OLD_RETRIES ; 3475 SUBL3 #1, (R2), R0 ;#1, MSG_NUMBER, R0 ; 3477 CMPZV #0, #6, R0, 4(R2) ;#0, #6, R0, REC_SEQ ; BNEQ 9$ ;9$ ; CALLS #0, W^U.20 ;#0, U.20 ; 3480 MOVL #49, -28(R2) ;#49, BLK_CHK_TYPE ; 3481 PUSHL 4(R2) ;REC_SEQ ; 3482 PUSHL #9 ;#9 ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, (R3) ;#3, SEND_PACKET ; MOVL -32(R2), -28(R2) ;INI_CHK_TYPE, BLK_CHK_TYPE ; 3483 BRB 4$ ;4$ ; 3484 3$: CMPL R0, #90 ;R0, #90 ; 3495 BNEQ 5$ ;5$ ; CMPL -8(R2), W^PKT_RETRIES ;OLD_RETRIES, PKT_RETRIES ; 3498 BGTR 7$ ;7$ ; INCL -8(R2) ;OLD_RETRIES ; 3500 SUBL3 #1, (R2), R0 ;#1, MSG_NUMBER, R0 ; 3502 CMPZV #0, #6, R0, 4(R2) ;#0, #6, R0, REC_SEQ ; BNEQ 9$ ;9$ ; PUSHL 4(R2) ;REC_SEQ ; 3505 CLRL -(SP) ;-(SP) ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, (R3) ;#3, SEND_PACKET ; 4$: CLRL -4(R2) ;NUM_RETRIES ; 3506 MOVL -16(R2), R0 ;STATE, R0 ; 3510 RET ; ; 5$: CMPL R0, #70 ;R0, #70 ; 3517 BEQL 6$ ;6$ ; BRW 14$ ;14$ ; 6$: CMPL (R2), 4(R2) ;MSG_NUMBER, REC_SEQ ; 3520 BEQL 8$ ;8$ ; 7$: MOVL #20, R0 ;#20, R0 ; RET ; ; 8$: TSTL 8(R2) ;REC_LENGTH ; 3522 BNEQ 10$ ;10$ ; 9$: BRW 17$ ;17$ ; 10$: PUSHL #1 ;#1 ; 3532 MOVZBL #132, -(SP) ;#132, -(SP) ; PUSHL R4 ;R4 ; CALLS #3, W^U.30 ;#3, U.30 ; CALLS #0, W^U.28 ;#0, U.28 ; 3533 CLRQ -(SP) ;-(SP) ; 3534 CLRL -(SP) ;-(SP) ; CALLS #3, W^U.30 ;#3, U.30 ; MOVL R0, W^FILE_SIZE ;R0, FILE_SIZE ; MOVAB (R4), R0 ;FILE_NAME, R0 ; 3535 CLRB @W^FILE_SIZE[R0] ;@FILE_SIZE[R0] ; BLBS W^CONNECT_FLAG, 11$ ;CONNECT_FLAG, 11$ ; 3540 BLBC W^TY_FIL, 11$ ;TY_FIL, 11$ ; PUSHAB W^P.AAH ;P.AAH ; 3543 CALLS #1, (R5) ;#1, TT_TEXT ; PUSHL R4 ;R4 ; 3544 CALLS #1, (R5) ;#1, TT_TEXT ; CALLS #0, W^TT_OUTPUT ;#0, TT_OUTPUT ; 3545 11$: BLBC W^FIL_NORMAL_FORM, 12$ ;FIL_NORMAL_FORM, 12$ ; 3552 PUSHL #3 ;#3 ; PUSHL #9 ;#9 ; PUSHAB W^FILE_SIZE ;FILE_SIZE ; PUSHL R4 ;R4 ; CALLS #4, W^U.27 ;#4, U.27 ; 12$: CLRL 216(R2) ;FILE_CHARS ; 3554 PUSHL #1 ;#1 ; 3556 CALLS #1, W^FILE_OPEN ;#1, FILE_OPEN ; BLBS R0, 13$ ;R0, 13$ ; BRW 18$ ;18$ ; 13$: MOVZBL #82, -(SP) ;#82, -(SP) ; 3558 MOVZBL #70, -(SP) ;#70, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; CLRL 220(R2) ;TEXT_HEAD_FLAG ; 3559 MOVL #1, W^FLAG_FILE_OPEN ;#1, FLAG_FILE_OPEN ; 3560 BRB 15$ ;15$ ; 3561 14$: CMPL R0, #88 ;R0, #88 ; 3568 BNEQ 16$ ;16$ ; CMPL (R2), 4(R2) ;MSG_NUMBER, REC_SEQ ; 3575 BNEQ 17$ ;17$ ; MOVL #1, 220(R2) ;#1, TEXT_HEAD_FLAG ; 3582 MOVAB W^U.31, 244(R2) ;U.31, PUT_CHR_ROUTINE ; 3583 TSTL 8(R2) ;REC_LENGTH ; 3585 BLEQ 15$ ;15$ ; PUSHAB W^P.AAI ;P.AAI ; 3588 CALLS #1, (R5) ;#1, TT_TEXT ; CALLS #0, W^U.28 ;#0, U.28 ; 3589 PUSHAB W^P.AAJ ;P.AAJ ; 3590 CALLS #1, (R5) ;#1, TT_TEXT ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 3591 15$: PUSHL (R2) ;MSG_NUMBER ; 3594 CLRL -(SP) ;-(SP) ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, (R3) ;#3, SEND_PACKET ; MOVL -4(R2), -8(R2) ;NUM_RETRIES, OLD_RETRIES ; 3595 CLRL -4(R2) ;NUM_RETRIES ; 3596 ADDL3 #1, (R2), R0 ;#1, MSG_NUMBER, R0 ; 3597 EXTZV #0, #6, R0, (R2) ;#0, #6, R0, MSG_NUMBER ; MOVL #8, R0 ;#8, R0 ; 3598 RET ; ; 16$: CMPL R0, #66 ;R0, #66 ; 3601 BNEQ 17$ ;17$ ; CMPL (R2), 4(R2) ;MSG_NUMBER, REC_SEQ ; 3604 BNEQ 17$ ;17$ ; PUSHL 4(R2) ;REC_SEQ ; 3611 CLRL -(SP) ;-(SP) ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, (R3) ;#3, SEND_PACKET ; MOVL #9, R0 ;#9, R0 ; 3612 RET ; ; 17$: PUSHL #134316226 ;#134316226 ; 3617 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; 18$: MOVL #10, R0 ;#10, R0 ; 3618 RET ; ; 3622 ; Routine Size: 465 bytes, Routine Base: $CODE$ + 0E36 ; 3623 1 %SBTTL 'REC_DATA' ; 3624 1 ROUTINE REC_DATA = ; 3625 1 ; 3626 1 !++ ; 3627 1 ! FUNCTIONAL DESCRIPTION: ; 3628 1 ! ; 3629 1 ! This routine will accept data messages and write them to disk. ; 3630 1 ! It will also accept MSG_FILE, MSG_TEXT and MSG_EOF messages. ; 3631 1 ! ; 3632 1 ! CALLING SEQUENCE: ; 3633 1 ! ; 3634 1 ! STATE = REC_DATA(); ; 3635 1 ! ; 3636 1 ! INPUT PARAMETERS: ; 3637 1 ! ; 3638 1 ! None. ; 3639 1 ! ; 3640 1 ! IMPLICIT INPUTS: ; 3641 1 ! ; 3642 1 ! None. ; 3643 1 ! ; 3644 1 ! OUTPUT PARAMETERS: ; 3645 1 ! ; 3646 1 ! New state for the finite state machine. ; 3647 1 ! ; 3648 1 ! IMPLICIT OUTPUTS: ; 3649 1 ! ; 3650 1 ! None. ; 3651 1 ! ; 3652 1 ! COMPLETION CODES: ; 3653 1 ! ; 3654 1 ! None. ; 3655 1 ! ; 3656 1 ! SIDE EFFECTS: ; 3657 1 ! ; 3658 1 ! None. ; 3659 1 ! ; 3660 1 !-- ; 3661 1 ; 3662 2 BEGIN ; 3663 2 ; 3664 2 LOCAL ; 3665 2 STATUS; ; 3666 2 ; 3667 2 ROUTINE CHECK_DATA = ; 3668 3 BEGIN ; 3669 3 ; 3670 3 IF .REC_TYPE EQL MSG_DATA OR (.REC_TYPE EQL MSG_FILE AND NOT .TEXT_HEAD_FLAG) OR .REC_TYPE ; 3671 4 EQL MSG_EOF OR (.REC_TYPE EQL MSG_TEXT AND .TEXT_HEAD_FLAG) ; 3672 3 THEN ; 3673 3 RETURN TRUE ; 3674 3 ELSE ; 3675 3 RETURN FALSE; ; 3676 3 ; 3677 2 END; ;CHECK_DATA U.78: .WORD ^M<> ;Save nothing ; 3667 MOVL W^U.56, R0 ;U.56, R0 ; 3670 CMPL R0, #68 ;R0, #68 ; BEQL 2$ ;2$ ; CMPL R0, #70 ;R0, #70 ; BNEQ 1$ ;1$ ; BLBC W^U.60, 2$ ;U.60, 2$ ; 1$: CMPL R0, #90 ;R0, #90 ; 3671 BEQL 2$ ;2$ ; CMPL R0, #88 ;R0, #88 ; BNEQ 3$ ;3$ ; BLBC W^U.60, 3$ ;U.60, 3$ ; 2$: MOVL #1, R0 ;#1, R0 ; 3675 RET ; ; 3$: CLRL R0 ;R0 ; RET ; ; 3677 ; Routine Size: 60 bytes, Routine Base: $CODE$ + 1007 ; 3678 2 ; 3679 2 LOCAL ; 3680 2 SUB_TYPE, ! Subtype for XFR_STATUS ; 3681 2 DISCARD_FILE_FLAG, ! Sender requested discard ; 3682 2 ACK_MSG_LEN; ! Length of ACK to send ; 3683 2 ; 3684 2 ! ; 3685 2 ! First get a message ; 3686 2 ! ; 3687 2 ; 3688 3 IF NOT (STATUS = REC_MESSAGE (CHECK_DATA)) ; 3689 2 THEN ; 3690 2 ; 3691 2 IF .STATUS NEQ KER_ABORTED THEN RETURN STATE_A ELSE RETURN STATE_EX; ; 3692 2 ; 3693 2 SELECTONE .REC_TYPE OF ; 3694 2 SET ; 3695 2 ; 3696 2 [MSG_DATA] : ; 3697 3 BEGIN ; 3698 3 ; 3699 3 IF .MSG_NUMBER NEQ .REC_SEQ ; 3700 3 THEN ; 3701 4 BEGIN ; 3702 4 ; 3703 4 IF .OLD_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER; ; 3704 4 ; 3705 4 OLD_RETRIES = .OLD_RETRIES + 1; ; 3706 4 ; 3707 4 IF ((.MSG_NUMBER - 1) AND %O'77') EQL .REC_SEQ ; 3708 4 THEN ; 3709 5 BEGIN ; 3710 5 SEND_PACKET (MSG_ACK, 0, .REC_SEQ); ; 3711 5 NUM_RETRIES = 0; ; 3712 5 RETURN .STATE; ; 3713 5 END ; 3714 4 ELSE ; 3715 5 BEGIN ; 3716 5 KRM_ERROR (KER_PROTOERR); ; 3717 5 RETURN STATE_A; ; 3718 4 END; ; 3719 4 ; 3720 3 END; ; 3721 3 ; 3722 3 ! ; 3723 3 ! Here if we have a message with a valid message number ; 3724 3 ! ; 3725 3 ; 3726 3 IF NOT BFR_EMPTY () THEN RETURN STATE_A; ; 3727 3 ; 3728 3 ! ; 3729 3 ! Check if we wish to abort for some reason ; 3730 3 ! ; 3731 3 ; 3732 3 IF .ABT_CUR_FILE ; 3733 3 THEN ; 3734 4 BEGIN ; 3735 4 CH$WCHAR (MSG_ACK_ABT_CUR, CH$PTR (SND_MSG, PKT_MSG, CHR_SIZE)); ; 3736 4 ACK_MSG_LEN = 1; ; 3737 4 END ; 3738 3 ELSE ; 3739 3 ; 3740 3 IF .ABT_ALL_FILE ; 3741 3 THEN ; 3742 4 BEGIN ; 3743 4 CH$WCHAR (MSG_ACK_ABT_ALL, CH$PTR (SND_MSG, PKT_MSG, CHR_SIZE)); ; 3744 4 ACK_MSG_LEN = 1; ; 3745 4 END ; 3746 3 ELSE ; 3747 3 ACK_MSG_LEN = 0; ; 3748 3 ; 3749 3 ! ; 3750 3 ! Now send the ACK ; 3751 3 ! ; 3752 3 SEND_PACKET (MSG_ACK, .ACK_MSG_LEN, .REC_SEQ); ; 3753 3 OLD_RETRIES = .NUM_RETRIES; ; 3754 3 NUM_RETRIES = 0; ; 3755 3 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 3756 3 RETURN STATE_RD; ; 3757 2 END; ; 3758 2 ; 3759 2 [MSG_FILE, MSG_TEXT] : ; 3760 3 BEGIN ; 3761 3 ; 3762 3 IF .OLD_RETRIES GTR .PKT_RETRIES THEN RETURN STATE_ER; ; 3763 3 ; 3764 3 OLD_RETRIES = .OLD_RETRIES + 1; ; 3765 3 ; 3766 3 IF ((.MSG_NUMBER - 1) AND %O'77') EQL .REC_SEQ ; 3767 3 THEN ; 3768 4 BEGIN ; 3769 4 SEND_PACKET (MSG_ACK, 0, .REC_SEQ); ; 3770 4 NUM_RETRIES = 0; ; 3771 4 RETURN .STATE; ; 3772 4 END ; 3773 3 ELSE ; 3774 4 BEGIN ; 3775 4 KRM_ERROR (KER_PROTOERR); ; 3776 4 RETURN STATE_A; ; 3777 3 END; ; 3778 3 ; 3779 2 END; ; 3780 2 ; 3781 2 [MSG_EOF] : ; 3782 3 BEGIN ; 3783 3 ; 3784 3 IF .MSG_NUMBER NEQ .REC_SEQ ; 3785 3 THEN ; 3786 4 BEGIN ; 3787 4 KRM_ERROR (KER_PROTOERR); ; 3788 4 RETURN STATE_A; ; 3789 3 END; ; 3790 3 ; 3791 3 SEND_PACKET (MSG_ACK, 0, .REC_SEQ); ; 3792 3 ; 3793 3 IF NOT .TEXT_HEAD_FLAG ; 3794 3 THEN ; 3795 4 BEGIN ; 3796 4 FLAG_FILE_OPEN = FALSE; ; 3797 4 DISCARD_FILE_FLAG = FALSE; ! Assume we want file ; 3798 4 ; 3799 4 IF .REC_LENGTH EQL 1 ; 3800 4 THEN ; 3801 4 ; 3802 4 IF CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG, CHR_SIZE)) EQL MSG_EOF_DISCARD ; 3803 4 THEN ; 3804 4 DISCARD_FILE_FLAG = TRUE; ; 3805 4 ; 3806 4 IF ( NOT .CONNECT_FLAG) AND .TY_FIL ; 3807 4 THEN ; 3808 5 BEGIN ; 3809 5 ; 3810 5 IF .DISCARD_FILE_FLAG ; 3811 5 THEN ; 3812 5 ; 3813 5 IF .ABT_FLAG ; 3814 5 THEN ; 3815 5 TT_TEXT (UPLIT (%ASCIZ' [Interrupted]')) ; 3816 5 ELSE ; 3817 5 TT_TEXT (UPLIT (%ASCIZ' [Interrupted, partial file saved]')) ; 3818 5 ; 3819 5 ELSE ; 3820 5 TT_TEXT (UPLIT (%ASCIZ' [OK]')); ; 3821 5 ; 3822 5 TT_CRLF (); ; 3823 4 END; ; 3824 4 ; 3825 4 IF NOT FILE_CLOSE (.DISCARD_FILE_FLAG AND .ABT_FLAG) THEN RETURN STATE_A; ; 3826 4 ; 3827 4 IF .DISCARD_FILE_FLAG ; 3828 4 THEN ; 3829 4 ; 3830 4 IF .ABT_FLAG THEN SUB_TYPE = %C'X' ELSE SUB_TYPE = %C'D' ; 3831 4 ; 3832 4 ELSE ; 3833 4 SUB_TYPE = %C'C'; ; 3834 4 ; 3835 4 END ; 3836 3 ELSE ; 3837 4 BEGIN ; 3838 4 TT_CRLF (); ! Make sure we have a CRLF ; 3839 4 TT_OUTPUT (); ! And make sure all output is sent ; 3840 3 END; ; 3841 3 ; 3842 3 XFR_STATUS (%C'F', .SUB_TYPE); ; 3843 3 MSG_NUMBER = (.MSG_NUMBER + 1) AND %O'77'; ; 3844 3 RETURN STATE_RF; ; 3845 2 END; ; 3846 2 ; 3847 2 [OTHERWISE] : ; 3848 3 BEGIN ; 3849 3 KRM_ERROR (KER_PROTOERR); ; 3850 3 RETURN STATE_A; ; 3851 2 END; ; 3852 2 TES; ; 3853 2 ; 3854 1 END; ! End of REC_DATA .PSECT $PLIT$,NOWRT,NOEXE,2 P.AAK: .ASCII \ [Interrupted]\<0><0> ; ; P.AAL: .ASCII \ [Interrupted, partial file saved]\<0><0> ; ; P.AAM: .ASCII \ [OK]\<0><0><0> ; ; .PSECT $CODE$,NOWRT,2 ;REC_DATA U.13: .WORD ^M ;Save R2,R3,R4,R5 ; 3624 MOVAB W^ABT_FLAG, R5 ;ABT_FLAG, R5 ; MOVAB W^U.24, R4 ;U.24, R4 ; MOVAB W^U.53, R3 ;U.53, R3 ; PUSHAB B^U.78 ;U.78 ; 3688 CALLS #1, W^U.25 ;#1, U.25 ; BLBS R0, 3$ ;STATUS, 3$ ; CMPL R0, #134316258 ;STATUS, #134316258 ; 3691 BEQL 2$ ;2$ ; 1$: BRW 28$ ;28$ ; 2$: MOVL #19, R0 ;#19, R0 ; RET ; ; 3$: MOVL 12(R3), R0 ;REC_TYPE, R0 ; 3693 CMPL R0, #68 ;R0, #68 ; 3696 BNEQ 9$ ;9$ ; MOVL 4(R3), R1 ;REC_SEQ, R1 ; 3699 CMPL (R3), R1 ;MSG_NUMBER, R1 ; BEQL 4$ ;4$ ; CMPL -8(R3), W^PKT_RETRIES ;OLD_RETRIES, PKT_RETRIES ; 3703 BGTR 11$ ;11$ ; INCL -8(R3) ;OLD_RETRIES ; 3705 SUBL3 #1, (R3), R0 ;#1, MSG_NUMBER, R0 ; 3707 CMPZV #0, #6, R0, R1 ;#0, #6, R0, R1 ; BNEQ 13$ ;13$ ; PUSHL R1 ;R1 ; 3710 BRB 14$ ;14$ ; 4$: CALLS #0, W^U.28 ;#0, U.28 ; 3726 BLBC R0, 1$ ;R0, 1$ ; BLBC W^ABT_CUR_FILE, 5$ ;ABT_CUR_FILE, 5$ ; 3732 MOVB #88, 120(R3) ;#88, SND_MSG+4 ; 3735 BRB 6$ ;6$ ; 3736 5$: BLBC W^ABT_ALL_FILE, 7$ ;ABT_ALL_FILE, 7$ ; 3740 MOVB #90, 120(R3) ;#90, SND_MSG+4 ; 3743 6$: MOVL #1, R0 ;#1, ACK_MSG_LEN ; 3744 BRB 8$ ;8$ ; 7$: CLRL R0 ;ACK_MSG_LEN ; 3747 8$: PUSHL 4(R3) ;REC_SEQ ; 3752 PUSHL R0 ;ACK_MSG_LEN ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, (R4) ;#3, SEND_PACKET ; MOVL -4(R3), -8(R3) ;NUM_RETRIES, OLD_RETRIES ; 3753 CLRL -4(R3) ;NUM_RETRIES ; 3754 ADDL3 #1, (R3), R0 ;#1, MSG_NUMBER, R0 ; 3755 EXTZV #0, #6, R0, (R3) ;#0, #6, R0, MSG_NUMBER ; MOVL #8, R0 ;#8, R0 ; 3756 RET ; ; 9$: CMPL R0, #70 ;R0, #70 ; 3759 BEQL 10$ ;10$ ; CMPL R0, #88 ;R0, #88 ; BNEQ 15$ ;15$ ; 10$: CMPL -8(R3), W^PKT_RETRIES ;OLD_RETRIES, PKT_RETRIES ; 3762 BLEQ 12$ ;12$ ; 11$: MOVL #20, R0 ;#20, R0 ; RET ; ; 12$: INCL -8(R3) ;OLD_RETRIES ; 3764 SUBL3 #1, (R3), R0 ;#1, MSG_NUMBER, R0 ; 3766 CMPZV #0, #6, R0, 4(R3) ;#0, #6, R0, REC_SEQ ; 13$: BNEQ 16$ ;16$ ; PUSHL 4(R3) ;REC_SEQ ; 3769 14$: CLRL -(SP) ;-(SP) ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, (R4) ;#3, SEND_PACKET ; CLRL -4(R3) ;NUM_RETRIES ; 3770 MOVL -16(R3), R0 ;STATE, R0 ; 3774 RET ; ; 15$: CMPL R0, #90 ;R0, #90 ; 3781 BNEQ 16$ ;16$ ; CMPL (R3), 4(R3) ;MSG_NUMBER, REC_SEQ ; 3784 16$: BEQL 17$ ;17$ ; BRW 27$ ;27$ ; 17$: PUSHL 4(R3) ;REC_SEQ ; 3791 CLRL -(SP) ;-(SP) ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, (R4) ;#3, SEND_PACKET ; BLBS 220(R3), 25$ ;TEXT_HEAD_FLAG, 25$ ; 3793 CLRL W^FLAG_FILE_OPEN ;FLAG_FILE_OPEN ; 3796 CLRL R2 ;DISCARD_FILE_FLAG ; 3797 CMPL 8(R3), #1 ;REC_LENGTH, #1 ; 3799 BNEQ 18$ ;18$ ; CMPB 20(R3), #68 ;REC_MSG+4, #68 ; 3802 BNEQ 18$ ;18$ ; MOVL #1, R2 ;#1, DISCARD_FILE_FLAG ; 3804 18$: BLBS W^CONNECT_FLAG, 22$ ;CONNECT_FLAG, 22$ ; 3806 BLBC W^TY_FIL, 22$ ;TY_FIL, 22$ ; BLBC R2, 20$ ;DISCARD_FILE_FLAG, 20$ ; 3810 BLBC (R5), 19$ ;ABT_FLAG, 19$ ; 3813 PUSHAB W^P.AAK ;P.AAK ; 3815 BRB 21$ ;21$ ; 19$: PUSHAB W^P.AAL ;P.AAL ; 3817 BRB 21$ ;21$ ; 20$: PUSHAB W^P.AAM ;P.AAM ; 3820 21$: CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 3822 22$: MCOML (R5), R0 ;ABT_FLAG, R0 ; 3825 BICL3 R0, R2, -(SP) ;R0, DISCARD_FILE_FLAG, -(SP) ; CALLS #1, W^FILE_CLOSE ;#1, FILE_CLOSE ; BLBC R0, 28$ ;R0, 28$ ; BLBC R2, 24$ ;DISCARD_FILE_FLAG, 24$ ; 3827 BLBC (R5), 23$ ;ABT_FLAG, 23$ ; 3830 MOVZBL #88, R0 ;#88, SUB_TYPE ; BRB 26$ ;26$ ; 23$: MOVZBL #68, R0 ;#68, SUB_TYPE ; BRB 26$ ;26$ ; 24$: MOVZBL #67, R0 ;#67, SUB_TYPE ; 3833 BRB 26$ ;26$ ; 3827 25$: CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 3838 CALLS #0, W^TT_OUTPUT ;#0, TT_OUTPUT ; 3839 26$: PUSHL R0 ;SUB_TYPE ; 3842 MOVZBL #70, -(SP) ;#70, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; ADDL3 #1, (R3), R0 ;#1, MSG_NUMBER, R0 ; 3843 EXTZV #0, #6, R0, (R3) ;#0, #6, R0, MSG_NUMBER ; MOVL #7, R0 ;#7, R0 ; 3844 RET ; ; 27$: PUSHL #134316226 ;#134316226 ; 3849 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; 28$: MOVL #10, R0 ;#10, R0 ; 3850 RET ; ; 3854 ; Routine Size: 414 bytes, Routine Base: $CODE$ + 1043 ; 3855 1 %SBTTL 'SERVER - Generic commands' ; 3856 1 ROUTINE SERVER_GENERIC = ; 3857 1 ; 3858 1 !++ ; 3859 1 ! FUNCTIONAL DESCRIPTION: ; 3860 1 ! ; 3861 1 ! This routine will handle the generic server messages. ; 3862 1 ! The generic server messages include FINISH, LOGOUT. ; 3863 1 ! ; 3864 1 ! CALLING SEQUENCE: ; 3865 1 ! ; 3866 1 ! STATE = SERVER_GENERIC(); ; 3867 1 ! ; 3868 1 ! INPUT PARAMETERS: ; 3869 1 ! ; 3870 1 ! None. ; 3871 1 ! ; 3872 1 ! IMPLICIT INPUTS: ; 3873 1 ! ; 3874 1 ! Generic message receive in REC_MSG. ; 3875 1 ! ; 3876 1 ! OUTPUT PARAMETERS: ; 3877 1 ! ; 3878 1 ! Returns new state for FSM ; 3879 1 ! ; 3880 1 ! IMPLICIT OUTPUTS: ; 3881 1 ! ; 3882 1 ! None. ; 3883 1 ! ; 3884 1 ! COMPLETION CODES: ; 3885 1 ! ; 3886 1 ! None. ; 3887 1 ! ; 3888 1 ! SIDE EFFECTS: ; 3889 1 ! ; 3890 1 ! None. ; 3891 1 ! ; 3892 1 !-- ; 3893 1 ; 3894 2 BEGIN ; 3895 2 ; 3896 2 LOCAL ; 3897 2 STATUS, ! Returned status ; 3898 2 G_FUNC, ! Generic command function ; 3899 2 POINTER, ! Character pointer ; 3900 2 DATA_TEXT : VECTOR [CH$ALLOCATION (MAX_MSG)], ! Unpacked message ; 3901 2 DATA_SIZE; ! Actual size of data ; 3902 2 ; 3903 2 ROUTINE UNPACK_DATA (POINTER, SIZE, DST_ADDR, DST_LEN) = ; 3904 2 ! ; 3905 2 ! Routine to unpack an argument. ; 3906 2 ! This will copy the argument data to the desired buffer. ; 3907 2 ! ; 3908 3 BEGIN ; 3909 3 ; 3910 3 IF .SIZE GTR 0 ! If we have something to unpack ; 3911 3 THEN ; 3912 4 BEGIN ; 3913 4 .DST_LEN = UNCHAR (CH$RCHAR_A (.POINTER)); ; 3914 4 ; 3915 4 IF ..DST_LEN LSS 0 ; 3916 4 THEN ; 3917 5 BEGIN ; 3918 5 KRM_ERROR (KER_PROTOERR); ! Someone screwed up ; 3919 5 ..DST_LEN = 0; ; 3920 5 RETURN -1; ; 3921 4 END; ; 3922 4 ; 3923 4 IF ..DST_LEN GTR .SIZE - 1 THEN .DST_LEN = .SIZE - 1; ; 3924 4 ; 3925 4 CH$COPY (..DST_LEN, ..POINTER, CHR_NUL, MAX_MSG, CH$PTR (.DST_ADDR)); ; 3926 4 .POINTER = CH$PLUS (..POINTER, ..DST_LEN); ; 3927 4 RETURN .SIZE - ..DST_LEN - 1; ; 3928 4 END ; 3929 3 ELSE ; 3930 3 ! ; 3931 3 ! If nothing left in buffer, return the current size (0) ; 3932 3 ! ; 3933 3 RETURN .SIZE; ; 3934 3 ; 3935 2 END; ;UNPACK_DATA U.79: .WORD ^M ;Save R2,R3,R4,R5,R6 ; 3903 MOVL 8(AP), R6 ;SIZE, R6 ; 3910 BLEQ 3$ ;3$ ; MOVL @4(AP), R1 ;@POINTER, R1 ; 3913 MOVZBL (R1), R0 ;(R1), R0 ; INCL @4(AP) ;@POINTER ; MOVAB -32(R0), @16(AP) ;-32(R0), @DST_LEN ; MOVL @16(AP), R2 ;@DST_LEN, R2 ; 3915 BGEQ 1$ ;1$ ; PUSHL #134316226 ;#134316226 ; 3918 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; CLRL (R2) ;(R2) ; 3919 MNEGL #1, R0 ;#1, R0 ; 3920 RET ; ; 1$: MOVAB -1(R6), R0 ;-1(R6), R0 ; 3923 CMPL R2, R0 ;R2, R0 ; BLEQ 2$ ;2$ ; MOVL R0, @16(AP) ;R0, @DST_LEN ; 2$: MOVL @4(AP), R0 ;@POINTER, R0 ; 3925 MOVC5 @16(AP), (R0), #0, #96, @12(AP) ;@DST_LEN, (R0), #0, #96, @DST_ADDR ; ADDL2 @16(AP), @4(AP) ;@DST_LEN, @POINTER ; 3926 SUBL3 @16(AP), R6, R0 ;@DST_LEN, R6, R0 ; 3927 DECL R0 ;R0 ; RET ; ; 3933 3$: MOVL R6, R0 ;R6, R0 ; RET ; ; 3935 ; Routine Size: 90 bytes, Routine Base: $CODE$ + 11E1 ; 3936 2 ! ; 3937 2 ! First unpack the message data into its various pieces ; 3938 2 ! ; 3939 2 SET_STRING (CH$PTR (DATA_TEXT), MAX_MSG, TRUE); ! Initialize for unpacking ; 3940 2 BFR_EMPTY (); ! Unpack the data ; 3941 2 DATA_SIZE = SET_STRING (0, 0, FALSE); ! All done, get size ; 3942 2 ; 3943 2 IF .DATA_SIZE LEQ 0 ; 3944 2 THEN ; 3945 3 BEGIN ; 3946 3 KRM_ERROR (KER_PROTOERR); ! Someone screwed up ; 3947 3 RETURN STATE_A; ! Since no subtype ; 3948 2 END; ; 3949 2 ; 3950 2 ! ; 3951 2 ! Get the arguments from the unpacked data (if any) ; 3952 2 ! ; 3953 2 GEN_1SIZE = 0; ! Assume no args ; 3954 2 GEN_2SIZE = 0; ! none at all ; 3955 2 GEN_3SIZE = 0; ; 3956 2 CH$WCHAR (CHR_NUL, CH$PTR (GEN_1DATA)); ! Ensure all are null terminated ; 3957 2 CH$WCHAR (CHR_NUL, CH$PTR (GEN_2DATA)); ; 3958 2 CH$WCHAR (CHR_NUL, CH$PTR (GEN_3DATA)); ; 3959 2 POINTER = CH$PTR (DATA_TEXT, 1); ! Point at second character ; 3960 2 DATA_SIZE = .DATA_SIZE - 1; ! Account for subtype ; 3961 2 ; 3962 2 IF .DATA_SIZE GTR 0 ! Room for first arg? ; 3963 2 THEN ; 3964 3 BEGIN ; 3965 3 DATA_SIZE = UNPACK_DATA (POINTER, .DATA_SIZE, GEN_1DATA, GEN_1SIZE); ; 3966 3 ; 3967 3 IF .DATA_SIZE LSS 0 THEN RETURN STATE_A; ! Punt if bad arguments ; 3968 3 ; 3969 3 IF .DATA_SIZE GTR 0 ! Second argument present? ; 3970 3 THEN ; 3971 4 BEGIN ; 3972 4 DATA_SIZE = UNPACK_DATA (POINTER, .DATA_SIZE, GEN_2DATA, GEN_2SIZE); ; 3973 4 ; 3974 4 IF .DATA_SIZE LSS 0 THEN RETURN STATE_A; ! Punt if bad arguments ; 3975 4 ; 3976 4 IF .DATA_SIZE GTR 0 ! Third argument here? ; 3977 4 THEN ; 3978 5 BEGIN ; 3979 5 DATA_SIZE = UNPACK_DATA (POINTER, .DATA_SIZE, GEN_3DATA, GEN_3SIZE); ; 3980 5 ; 3981 5 IF .DATA_SIZE LSS 0 THEN RETURN STATE_A; ! Punt if bad arguments ; 3982 5 ; 3983 4 END; ; 3984 4 ; 3985 3 END; ; 3986 3 ; 3987 2 END; ; 3988 2 ; 3989 2 SELECTONE CH$RCHAR (CH$PTR (DATA_TEXT)) OF ; 3990 2 SET ; 3991 2 ! ; 3992 2 ! EXIT command, just return the status to the upper level ; 3993 2 ! ; 3994 2 ; 3995 2 [MSG_GEN_EXIT] : ; 3996 3 BEGIN ; 3997 3 SEND_PACKET (MSG_ACK, 0, .REC_SEQ); ; 3998 3 RETURN STATE_FI; ; 3999 2 END; ; 4000 2 ! ; 4001 2 ! LOGOUT command, ACK the message then call the system routine to ; 4002 2 ! kill the process (log the job out, etc.) ; 4003 2 ! ; 4004 2 ; 4005 2 [MSG_GEN_LOGOUT] : ; 4006 3 BEGIN ; 4007 3 SEND_PACKET (MSG_ACK, 0, .REC_SEQ); ; 4008 3 SY_LOGOUT (); ; 4009 3 RETURN STATE_LG; ; 4010 2 END; ; 4011 2 ! ; 4012 2 ! For a type command, just set up a transfer flagging we want a text header ; 4013 2 ! instead of a file header. ; 4014 2 ! ; 4015 2 ; 4016 2 [MSG_GEN_TYPE] : ; 4017 3 BEGIN ; 4018 3 CH$COPY (.GEN_1SIZE, CH$PTR (GEN_1DATA), CHR_NUL, MAX_FILE_NAME, CH$PTR (FILE_NAME)); ; 4019 3 FILE_SIZE = .GEN_1SIZE; ; 4020 3 TEXT_HEAD_FLAG = TRUE; ! Now want text header ; 4021 3 XFR_STATUS (%C'I', %C'G'); ! Tell display routine we are doing a command ; 4022 3 ; 4023 3 IF .STATE EQL STATE_II AND .BLK_CHK_TYPE EQL .INI_CHK_TYPE ; 4024 3 THEN ; 4025 3 RETURN STATE_OF ! Must open the file ; 4026 3 ELSE ; 4027 3 RETURN STATE_S; ! Start the transaction with a send ; 4028 3 ; 4029 2 END; ; 4030 2 ; 4031 2 [MSG_GEN_DIRECTORY] : ; 4032 2 G_FUNC = GC_DIRECTORY; ; 4033 2 ; 4034 2 [MSG_GEN_DISK_USAGE] : ; 4035 2 G_FUNC = GC_DISK_USAGE; ; 4036 2 ; 4037 2 [MSG_GEN_DELETE] : ; 4038 2 G_FUNC = GC_DELETE; ; 4039 2 ; 4040 2 [MSG_GEN_HELP] : ; 4041 2 G_FUNC = GC_HELP; ; 4042 2 ; 4043 2 [MSG_GEN_LOGIN] : ; 4044 2 G_FUNC = GC_LGN; ; 4045 2 ; 4046 2 [MSG_GEN_CONNECT] : ; 4047 2 G_FUNC = GC_CONNECT; ; 4048 2 ; 4049 2 [MSG_GEN_RENAME] : ; 4050 2 G_FUNC = GC_RENAME; ; 4051 2 ; 4052 2 [MSG_GEN_COPY] : ; 4053 2 G_FUNC = GC_COPY; ; 4054 2 ; 4055 2 [MSG_GEN_WHO] : ; 4056 2 G_FUNC = GC_WHO; ; 4057 2 ; 4058 2 [MSG_GEN_SEND] : ; 4059 2 G_FUNC = GC_SEND_MSG; ; 4060 2 ; 4061 2 [MSG_GEN_QUERY] : ; 4062 2 G_FUNC = GC_STATUS; ; 4063 2 ; 4064 2 [MSG_GEN_PROGRAM] : ; 4065 2 G_FUNC = GC_PROGRAM; ; 4066 2 ; 4067 2 [MSG_GEN_JOURNAL] : ; 4068 2 G_FUNC = GC_JOURNAL; ; 4069 2 ; 4070 2 [MSG_GEN_VARIABLE] : ; 4071 2 G_FUNC = GC_VARIABLE; ; 4072 2 ! ; 4073 2 ! Here if we have a function that is not implemented in KERMSG. ; 4074 2 ! ; 4075 2 ; 4076 2 [OTHERWISE] : ; 4077 3 BEGIN ; 4078 3 KRM_ERROR (KER_UNIMPLGEN); ; 4079 3 RETURN STATE_A; ; 4080 2 END; ; 4081 2 TES; ; 4082 2 ; 4083 2 ! ; 4084 2 ! If we get here, we have gotten a known type of generic message that ; 4085 2 ! we need to have our operating system dependent routine handle. ; 4086 2 ! ; 4087 2 RETURN CALL_SY_RTN (.G_FUNC); ; 4088 1 END; ! End of SERVER_GENERIC ;SERVER_GENERIC U.14: .WORD ^M ;Save R2,R3,R4,R5,R6,R7,R8,R9,R10 ; 3856 MOVAB B^U.79, R10 ;U.79, R10 ; MOVAB W^GEN_1DATA, R9 ;GEN_1DATA, R9 ; MOVAB W^GEN_1SIZE, R8 ;GEN_1SIZE, R8 ; MOVAB W^U.54, R7 ;U.54, R7 ; MOVAB -100(SP), SP ;-100(SP), SP ; PUSHL #1 ;#1 ; 3939 MOVZBL #96, -(SP) ;#96, -(SP) ; PUSHAB 12(SP) ;DATA_TEXT ; CALLS #3, W^U.30 ;#3, U.30 ; CALLS #0, W^U.28 ;#0, U.28 ; 3940 CLRQ -(SP) ;-(SP) ; 3941 CLRL -(SP) ;-(SP) ; CALLS #3, W^U.30 ;#3, U.30 ; MOVL R0, R2 ;R0, DATA_SIZE ; BGTR 1$ ;1$ ; 3943 PUSHL #134316226 ;#134316226 ; 3946 BRW 25$ ;25$ ; 1$: CLRL (R8) ;GEN_1SIZE ; 3953 CLRL W^GEN_2SIZE ;GEN_2SIZE ; 3954 CLRL W^GEN_3SIZE ;GEN_3SIZE ; 3955 CLRB (R9) ;GEN_1DATA ; 3956 CLRB W^GEN_2DATA ;GEN_2DATA ; 3957 CLRB W^GEN_3DATA ;GEN_3DATA ; 3958 MOVAB 5(SP), (SP) ;DATA_TEXT+1, POINTER ; 3959 DECL R2 ;DATA_SIZE ; 3960 BLEQ 3$ ;3$ ; 3962 PUSHL R8 ;R8 ; 3965 PUSHR #^M ;#^M ; PUSHAB 12(SP) ;POINTER ; CALLS #4, (R10) ;#4, UNPACK_DATA ; MOVL R0, R2 ;R0, DATA_SIZE ; BLSS 2$ ;2$ ; 3967 BLEQ 3$ ;3$ ; 3969 PUSHAB W^GEN_2SIZE ;GEN_2SIZE ; 3972 PUSHAB W^GEN_2DATA ;GEN_2DATA ; PUSHL R2 ;DATA_SIZE ; PUSHAB 12(SP) ;POINTER ; CALLS #4, (R10) ;#4, UNPACK_DATA ; MOVL R0, R2 ;R0, DATA_SIZE ; BLSS 2$ ;2$ ; 3974 BLEQ 3$ ;3$ ; 3976 PUSHAB W^GEN_3SIZE ;GEN_3SIZE ; 3979 PUSHAB W^GEN_3DATA ;GEN_3DATA ; PUSHL R2 ;DATA_SIZE ; PUSHAB 12(SP) ;POINTER ; CALLS #4, (R10) ;#4, UNPACK_DATA ; MOVL R0, R2 ;R0, DATA_SIZE ; 2$: BGEQ 3$ ;3$ ; 3981 BRW 26$ ;26$ ; 3$: MOVZBL 4(SP), R6 ;DATA_TEXT, R6 ; 3989 CMPB R6, #70 ;R6, #70 ; 3995 BNEQ 4$ ;4$ ; PUSHL (R7) ;REC_SEQ ; 3997 CLRL -(SP) ;-(SP) ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; MOVL #16, R0 ;#16, R0 ; 3998 RET ; ; 4$: CMPB R6, #76 ;R6, #76 ; 4005 BNEQ 5$ ;5$ ; PUSHL (R7) ;REC_SEQ ; 4007 CLRL -(SP) ;-(SP) ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; CALLS #0, W^SY_LOGOUT ;#0, SY_LOGOUT ; 4008 MOVL #17, R0 ;#17, R0 ; 4009 RET ; ; 5$: CMPB R6, #84 ;R6, #84 ; 4016 BNEQ 7$ ;7$ ; MOVC5 (R8), (R9), #0, #132, W^FILE_NAME ;GEN_1SIZE, GEN_1DATA, #0, #132, FILE_NAME ; 4018 MOVL (R8), W^FILE_SIZE ;GEN_1SIZE, FILE_SIZE ; 4019 MOVL #1, 216(R7) ;#1, TEXT_HEAD_FLAG ; 4020 MOVZBL #71, -(SP) ;#71, -(SP) ; 4021 MOVZBL #73, -(SP) ;#73, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; CMPL -20(R7), #15 ;STATE, #15 ; 4023 BNEQ 6$ ;6$ ; CMPL -32(R7), -36(R7) ;BLK_CHK_TYPE, INI_CHK_TYPE ; BNEQ 6$ ;6$ ; MOVL #18, R0 ;#18, R0 ; 4027 RET ; ; 6$: MOVL #1, R0 ;#1, R0 ; RET ; ; 7$: CMPB R6, #68 ;R6, #68 ; 4031 BNEQ 8$ ;8$ ; MOVL #2, R2 ;#2, G_FUNC ; 4032 BRW 21$ ;21$ ; 8$: CMPB R6, #85 ;R6, #85 ; 4034 BNEQ 9$ ;9$ ; MOVL #3, R2 ;#3, G_FUNC ; 4035 BRB 10$ ;10$ ; 9$: CMPB R6, #69 ;R6, #69 ; 4037 BNEQ 11$ ;11$ ; MOVL #4, R2 ;#4, G_FUNC ; 4038 10$: BRB 23$ ;23$ ; 11$: CMPB R6, #72 ;R6, #72 ; 4040 BNEQ 12$ ;12$ ; MOVL #6, R2 ;#6, G_FUNC ; 4041 BRB 27$ ;27$ ; 12$: CMPB R6, #73 ;R6, #73 ; 4043 BNEQ 13$ ;13$ ; MOVL #8, R2 ;#8, G_FUNC ; 4044 BRB 27$ ;27$ ; 13$: CMPB R6, #67 ;R6, #67 ; 4046 BNEQ 14$ ;14$ ; MOVL #9, R2 ;#9, G_FUNC ; 4047 BRB 27$ ;27$ ; 14$: CMPB R6, #82 ;R6, #82 ; 4049 BNEQ 15$ ;15$ ; MOVL #10, R2 ;#10, G_FUNC ; 4050 BRB 27$ ;27$ ; 15$: CMPB R6, #75 ;R6, #75 ; 4052 BNEQ 16$ ;16$ ; MOVL #11, R2 ;#11, G_FUNC ; 4053 BRB 27$ ;27$ ; 16$: CMPB R6, #87 ;R6, #87 ; 4055 BNEQ 17$ ;17$ ; MOVL #12, R2 ;#12, G_FUNC ; 4056 BRB 27$ ;27$ ; 17$: CMPB R6, #77 ;R6, #77 ; 4058 BNEQ 18$ ;18$ ; MOVL #13, R2 ;#13, G_FUNC ; 4059 BRB 27$ ;27$ ; 18$: CMPB R6, #81 ;R6, #81 ; 4061 BNEQ 19$ ;19$ ; MOVL #14, R2 ;#14, G_FUNC ; 4062 BRB 27$ ;27$ ; 19$: CMPB R6, #80 ;R6, #80 ; 4064 BNEQ 20$ ;20$ ; MOVL #19, R2 ;#19, G_FUNC ; 4065 BRB 27$ ;27$ ; 20$: CMPB R6, #74 ;R6, #74 ; 4067 BNEQ 22$ ;22$ ; MOVL #17, R2 ;#17, G_FUNC ; 4068 21$: BRB 27$ ;27$ ; 22$: CMPB R6, #86 ;R6, #86 ; 4070 BNEQ 24$ ;24$ ; MOVL #18, R2 ;#18, G_FUNC ; 4071 23$: BRB 27$ ;27$ ; 24$: PUSHL #134316210 ;#134316210 ; 4078 25$: CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; 26$: MOVL #10, R0 ;#10, R0 ; 4079 RET ; ; 27$: PUSHL R2 ;G_FUNC ; 4087 CALLS #1, W^U.17 ;#1, U.17 ; RET ; ; 4088 ; Routine Size: 454 bytes, Routine Base: $CODE$ + 123B ; 4089 1 %SBTTL 'HOST_COMMAND - perform a host command' ; 4090 1 ROUTINE HOST_COMMAND = ; 4091 1 ; 4092 1 !++ ; 4093 1 ! FUNCTIONAL DESCRIPTION: ; 4094 1 ! ; 4095 1 ! This routine will handle the host command packet. ; 4096 1 ! It will set up the data for the call to the system routine. ; 4097 1 ! ; 4098 1 ! CALLING SEQUENCE: ; 4099 1 ! ; 4100 1 ! STATE = HOST_COMMAND(); ; 4101 1 ! ; 4102 1 ! INPUT PARAMETERS: ; 4103 1 ! ; 4104 1 ! None. ; 4105 1 ! ; 4106 1 ! IMPLICIT INPUTS: ; 4107 1 ! ; 4108 1 ! Generic message receive in REC_MSG. ; 4109 1 ! ; 4110 1 ! OUTPUT PARAMETERS: ; 4111 1 ! ; 4112 1 ! Returns new state for FSM ; 4113 1 ! ; 4114 1 ! IMPLICIT OUTPUTS: ; 4115 1 ! ; 4116 1 ! None. ; 4117 1 ! ; 4118 1 ! COMPLETION CODES: ; 4119 1 ! ; 4120 1 ! None. ; 4121 1 ! ; 4122 1 ! SIDE EFFECTS: ; 4123 1 ! ; 4124 1 ! None. ; 4125 1 ! ; 4126 1 !-- ; 4127 1 ; 4128 2 BEGIN ; 4129 2 GEN_1SIZE = 0; ; 4130 2 GEN_2SIZE = 0; ; 4131 2 GEN_3SIZE = 0; ; 4132 2 ; 4133 2 IF .REC_LENGTH LEQ 0 ; 4134 2 THEN ; 4135 3 BEGIN ; 4136 3 KRM_ERROR (KER_PROTOERR); ! Return an error ; 4137 3 RETURN STATE_A; ! Just abort ; 4138 2 END; ; 4139 2 ; 4140 2 SET_STRING (CH$PTR (GEN_1DATA), MAX_MSG, TRUE); ! Start writing to buffer ; 4141 2 BFR_EMPTY (); ! Dump the text ; 4142 2 GEN_1SIZE = SET_STRING (0, 0, FALSE); ! Get the result ; 4143 2 RETURN CALL_SY_RTN (GC_COMMAND); ; 4144 1 END; ! End of HOST_COMMAND ;HOST_COMMAND U.15: .WORD ^M<> ;Save nothing ; 4090 CLRL W^GEN_1SIZE ;GEN_1SIZE ; 4129 CLRL W^GEN_2SIZE ;GEN_2SIZE ; 4130 CLRL W^GEN_3SIZE ;GEN_3SIZE ; 4131 TSTL W^U.55 ;U.55 ; 4133 BGTR 1$ ;1$ ; PUSHL #134316226 ;#134316226 ; 4136 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; MOVL #10, R0 ;#10, R0 ; 4137 RET ; ; 1$: PUSHL #1 ;#1 ; 4140 MOVZBL #96, -(SP) ;#96, -(SP) ; PUSHAB W^GEN_1DATA ;GEN_1DATA ; CALLS #3, W^U.30 ;#3, U.30 ; CALLS #0, W^U.28 ;#0, U.28 ; 4141 CLRQ -(SP) ;-(SP) ; 4142 CLRL -(SP) ;-(SP) ; CALLS #3, W^U.30 ;#3, U.30 ; MOVL R0, W^GEN_1SIZE ;R0, GEN_1SIZE ; PUSHL #15 ;#15 ; 4143 CALLS #1, W^U.17 ;#1, U.17 ; RET ; ; 4144 ; Routine Size: 77 bytes, Routine Base: $CODE$ + 1401 ; 4145 1 %SBTTL 'KERMIT_COMMAND - perform a KERMIT command' ; 4146 1 ROUTINE KERMIT_COMMAND = ; 4147 1 ; 4148 1 !++ ; 4149 1 ! FUNCTIONAL DESCRIPTION: ; 4150 1 ! ; 4151 1 ! This routine will handle the KERMIT command packet. ; 4152 1 ! It will set up the data for the call to the system routine. ; 4153 1 ! ; 4154 1 ! CALLING SEQUENCE: ; 4155 1 ! ; 4156 1 ! STATE = KERMIT_COMMAND(); ; 4157 1 ! ; 4158 1 ! INPUT PARAMETERS: ; 4159 1 ! ; 4160 1 ! None. ; 4161 1 ! ; 4162 1 ! IMPLICIT INPUTS: ; 4163 1 ! ; 4164 1 ! Generic message receive in REC_MSG. ; 4165 1 ! ; 4166 1 ! OUTPUT PARAMETERS: ; 4167 1 ! ; 4168 1 ! Returns new state for FSM ; 4169 1 ! ; 4170 1 ! IMPLICIT OUTPUTS: ; 4171 1 ! ; 4172 1 ! None. ; 4173 1 ! ; 4174 1 ! COMPLETION CODES: ; 4175 1 ! ; 4176 1 ! None. ; 4177 1 ! ; 4178 1 ! SIDE EFFECTS: ; 4179 1 ! ; 4180 1 ! None. ; 4181 1 ! ; 4182 1 !-- ; 4183 1 ; 4184 2 BEGIN ; 4185 2 GEN_1SIZE = 0; ; 4186 2 GEN_2SIZE = 0; ; 4187 2 GEN_3SIZE = 0; ; 4188 2 ; 4189 2 IF .REC_LENGTH LEQ 0 ; 4190 2 THEN ; 4191 3 BEGIN ; 4192 3 KRM_ERROR (KER_PROTOERR); ! Return an error ; 4193 3 RETURN STATE_A; ! Just abort ; 4194 2 END; ; 4195 2 ; 4196 2 SET_STRING (CH$PTR (GEN_1DATA), MAX_MSG, TRUE); ! Start writing to buffer ; 4197 2 BFR_EMPTY (); ! Dump the text ; 4198 2 GEN_1SIZE = SET_STRING (0, 0, FALSE); ! Get the result ; 4199 2 RETURN CALL_SY_RTN (GC_KERMIT); ; 4200 1 END; ! End of KERMIT_COMMAND ;KERMIT_COMMAND U.16: .WORD ^M<> ;Save nothing ; 4146 CLRL W^GEN_1SIZE ;GEN_1SIZE ; 4185 CLRL W^GEN_2SIZE ;GEN_2SIZE ; 4186 CLRL W^GEN_3SIZE ;GEN_3SIZE ; 4187 TSTL W^U.55 ;U.55 ; 4189 BGTR 1$ ;1$ ; PUSHL #134316226 ;#134316226 ; 4192 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; MOVL #10, R0 ;#10, R0 ; 4193 RET ; ; 1$: PUSHL #1 ;#1 ; 4196 MOVZBL #96, -(SP) ;#96, -(SP) ; PUSHAB W^GEN_1DATA ;GEN_1DATA ; CALLS #3, W^U.30 ;#3, U.30 ; CALLS #0, W^U.28 ;#0, U.28 ; 4197 CLRQ -(SP) ;-(SP) ; 4198 CLRL -(SP) ;-(SP) ; CALLS #3, W^U.30 ;#3, U.30 ; MOVL R0, W^GEN_1SIZE ;R0, GEN_1SIZE ; PUSHL #16 ;#16 ; 4199 CALLS #1, W^U.17 ;#1, U.17 ; RET ; ; 4200 ; Routine Size: 77 bytes, Routine Base: $CODE$ + 144E ; 4201 1 %SBTTL 'CALL_SY_RTN - handle operating system dependent functions' ; 4202 1 ROUTINE CALL_SY_RTN (G_FUNC) = ; 4203 1 ; 4204 1 !++ ; 4205 1 ! FUNCTIONAL DESCRIPTION: ; 4206 1 ! ; 4207 1 ! This routine will handle calling the operating system dependent routine ; 4208 1 ! for a server function and returning the response. ; 4209 1 ! ; 4210 1 ! CALLING SEQUENCE: ; 4211 1 ! ; 4212 1 ! STATE = CALL_SY_RTN(.G_FUNC); ; 4213 1 ! ; 4214 1 ! INPUT PARAMETERS: ; 4215 1 ! ; 4216 1 ! G_FUNC - Generic function code ; 4217 1 ! ; 4218 1 ! IMPLICIT INPUTS: ; 4219 1 ! ; 4220 1 ! Generic message data in GEN_1DATA ; 4221 1 ! ; 4222 1 ! OUTPUT PARAMETERS: ; 4223 1 ! ; 4224 1 ! Returns new state for FSM ; 4225 1 ! ; 4226 1 ! IMPLICIT OUTPUTS: ; 4227 1 ! ; 4228 1 ! None. ; 4229 1 ! ; 4230 1 ! COMPLETION CODES: ; 4231 1 ! ; 4232 1 ! None. ; 4233 1 ! ; 4234 1 ! SIDE EFFECTS: ; 4235 1 ! ; 4236 1 ! None. ; 4237 1 ! ; 4238 1 !-- ; 4239 1 ; 4240 2 BEGIN ; 4241 2 ; 4242 2 LOCAL ; 4243 2 STRING_ADDRESS, ! Address of string result ; 4244 2 STRING_LENGTH, ! Length of string result ; 4245 2 GET_CHR_SUBROUTINE, ! Routine to get a response character ; 4246 2 STATUS; ! Status value ; 4247 2 ; 4248 2 ! ; 4249 2 ! Call the routine with the desired type of command. ; 4250 2 ! ; 4251 2 STRING_LENGTH = 0; ! Initialize for no string ; 4252 2 GET_CHR_SUBROUTINE = 0; ! And no subroutine ; 4253 2 ; 4254 2 IF NOT SY_GENERIC (.G_FUNC, STRING_ADDRESS, STRING_LENGTH, GET_CHR_SUBROUTINE) ; 4255 2 THEN ; 4256 2 RETURN STATE_A; ! And abort ; 4257 2 ; 4258 2 IF .STRING_LENGTH GTR 0 ; 4259 2 THEN ; 4260 3 BEGIN ; 4261 3 SET_STRING (CH$PTR (.STRING_ADDRESS), .STRING_LENGTH, TRUE); ; 4262 3 ; 4263 3 IF .STRING_LENGTH LSS .SEND_PKT_SIZE - PKT_OVR_HEAD ; 4264 3 THEN ; 4265 4 BEGIN ; 4266 4 BFR_FILL (TRUE); ! If it should fit, pack it in ; 4267 4 ; 4268 4 IF SET_STRING (0, 0, FALSE) GEQ .STRING_LENGTH ; 4269 4 THEN ! It fit, so just send the ACK ; 4270 4 ; 4271 4 IF SEND_PACKET (MSG_ACK, .SIZE, .REC_SEQ) THEN RETURN STATE_C ELSE RETURN STATE_EX; ; 4272 4 ; 4273 4 ! ; 4274 4 ! It didn't fit, reset the pointers to the beginning ; 4275 4 ! ; 4276 4 SET_STRING (CH$PTR (.STRING_ADDRESS), .STRING_LENGTH, TRUE); ; 4277 3 END; ; 4278 3 ; 4279 3 NO_FILE_NEEDED = TRUE; ! Don't need a file ; 4280 3 END ; 4281 2 ELSE ; 4282 2 ; 4283 2 IF .GET_CHR_SUBROUTINE NEQ 0 ! If we got a subroutine back ; 4284 2 THEN ; 4285 3 BEGIN ; 4286 3 GET_CHR_ROUTINE = .GET_CHR_SUBROUTINE; ; 4287 3 NO_FILE_NEEDED = TRUE; ; 4288 2 END; ; 4289 2 ; 4290 2 TEXT_HEAD_FLAG = TRUE; ! Send to be typed ; 4291 2 XFR_STATUS (%C'I', %C'G'); ! Doing a generic command ; 4292 2 ; 4293 2 IF .STATE EQL STATE_II AND .BLK_CHK_TYPE EQL .INI_CHK_TYPE ; 4294 2 THEN ; 4295 2 RETURN STATE_OF ; 4296 2 ELSE ; 4297 2 RETURN STATE_S; ! Send the response ; 4298 2 ; 4299 1 END; ! End of CALL_SY_RTN ;CALL_SY_RTN U.17: .WORD ^M ;Save R2,R3,R4 ; 4202 MOVAB W^U.30, R4 ;U.30, R4 ; MOVAB W^U.39, R3 ;U.39, R3 ; SUBL2 #4, SP ;#4, SP ; CLRQ -(SP) ;GET_CHR_SUBROUTINE ; 4252 PUSHL SP ;SP ; 4254 PUSHAB 8(SP) ;STRING_LENGTH ; PUSHAB 16(SP) ;STRING_ADDRESS ; PUSHL 4(AP) ;G_FUNC ; CALLS #4, W^SY_GENERIC ;#4, SY_GENERIC ; BLBS R0, 1$ ;R0, 1$ ; MOVL #10, R0 ;#10, R0 ; 4256 RET ; ; 1$: MOVL 4(SP), R2 ;STRING_LENGTH, R2 ; 4258 BLEQ 4$ ;4$ ; PUSHL #1 ;#1 ; 4261 PUSHL R2 ;R2 ; PUSHL 16(SP) ;STRING_ADDRESS ; CALLS #3, (R4) ;#3, SET_STRING ; SUBL3 #3, (R3), R0 ;#3, SEND_PKT_SIZE, R0 ; 4263 CMPL R2, R0 ;R2, R0 ; BGEQ 5$ ;5$ ; PUSHL #1 ;#1 ; 4266 CALLS #1, W^U.29 ;#1, U.29 ; CLRQ -(SP) ;-(SP) ; 4268 CLRL -(SP) ;-(SP) ; CALLS #3, (R4) ;#3, SET_STRING ; CMPL R0, R2 ;R0, R2 ; BLSS 3$ ;3$ ; PUSHL 60(R3) ;REC_SEQ ; 4271 PUSHL 44(R3) ;SIZE ; MOVZBL #89, -(SP) ;#89, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; BLBC R0, 2$ ;R0, 2$ ; MOVL #9, R0 ;#9, R0 ; RET ; ; 2$: MOVL #19, R0 ;#19, R0 ; RET ; ; 3$: PUSHL #1 ;#1 ; 4276 PUSHL R2 ;R2 ; PUSHL 16(SP) ;STRING_ADDRESS ; CALLS #3, (R4) ;#3, SET_STRING ; BRB 5$ ;5$ ; 4279 4$: TSTL (SP) ;GET_CHR_SUBROUTINE ; 4283 BEQL 6$ ;6$ ; MOVL (SP), 296(R3) ;GET_CHR_SUBROUTINE, GET_CHR_ROUTINE ; 4286 5$: MOVL #1, 280(R3) ;#1, NO_FILE_NEEDED ; 4287 6$: MOVL #1, 276(R3) ;#1, TEXT_HEAD_FLAG ; 4290 MOVZBL #71, -(SP) ;#71, -(SP) ; 4291 MOVZBL #73, -(SP) ;#73, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; CMPL 40(R3), #15 ;STATE, #15 ; 4293 BNEQ 7$ ;7$ ; CMPL 28(R3), 24(R3) ;BLK_CHK_TYPE, INI_CHK_TYPE ; BNEQ 7$ ;7$ ; MOVL #18, R0 ;#18, R0 ; 4297 RET ; ; 7$: MOVL #1, R0 ;#1, R0 ; RET ; ; 4299 ; Routine Size: 175 bytes, Routine Base: $CODE$ + 149B ; 4300 1 %SBTTL 'Message processing -- PRS_SEND_INIT - Parse send init params' ; 4301 1 ROUTINE PRS_SEND_INIT = ; 4302 1 ; 4303 1 !++ ; 4304 1 ! FUNCTIONAL DESCRIPTION: ; 4305 1 ! ; 4306 1 ! This routine will parse the SEND_INIT parameters that were sent by ; 4307 1 ! the remote Kermit. The items will be stored into the low segment. ; 4308 1 ! ; 4309 1 ! CALLING SEQUENCE: ; 4310 1 ! ; 4311 1 ! PRS_SEND_INIT (); ; 4312 1 ! ; 4313 1 ! INPUT PARAMETERS: ; 4314 1 ! ; 4315 1 ! None. ; 4316 1 ! ; 4317 1 ! IMPLICIT INPUTS: ; 4318 1 ! ; 4319 1 ! Message stored in REC_MSG. ; 4320 1 ! ; 4321 1 ! OUTPUT PARAMETERS: ; 4322 1 ! ; 4323 1 ! None. ; 4324 1 ! ; 4325 1 ! IMPLICIT OUTPUTS: ; 4326 1 ! ; 4327 1 ! None. ; 4328 1 ! ; 4329 1 ! COMPLETION CODES: ; 4330 1 ! ; 4331 1 ! None. ; 4332 1 ! ; 4333 1 ! SIDE EFFECTS: ; 4334 1 ! ; 4335 1 ! None. ; 4336 1 ! ; 4337 1 !-- ; 4338 1 ; 4339 2 BEGIN ; 4340 2 ! The following section of code will parse the various send parameters ; 4341 2 ! that are found in the send-init message. The following code will store ; 4342 2 ! the following as the value. ; 4343 2 ! ; 4344 2 ! If the user specified a value then the user supplied value will be used else ; 4345 2 ! the value in the message and if none in the message then the default value. ; 4346 2 ! ; 4347 2 ! User supplied values are denoted as positive values in SND_xxxxxxx. ; 4348 2 ! ; 4349 2 ! Parse the packet size ; 4350 2 ! ; 4351 3 SEND_PKT_SIZE = (IF .SND_PKT_SIZE GEQ 0 THEN .SND_PKT_SIZE ELSE ; 4352 4 BEGIN ; 4353 4 ; 4354 4 IF .REC_LENGTH GTR P_SI_BUFSIZ ; 4355 4 THEN ; P 4356 4 UNCHAR (CH$RCHAR (CH$PTR (REC_MSG, ; 4357 5 PKT_MSG + P_SI_BUFSIZ, CHR_SIZE))) ; 4358 4 ELSE ; 4359 4 ABS (.SND_PKT_SIZE) ; 4360 4 ; 4361 4 END ; 4362 2 ); ; 4363 2 ! ; 4364 2 ! Parse the time out value ; 4365 2 ! ; 4366 3 SEND_TIMEOUT = (IF .SND_TIMEOUT GEQ 0 THEN .SND_TIMEOUT ELSE ; 4367 4 BEGIN ; 4368 4 ; 4369 4 IF .REC_LENGTH GTR P_SI_TIMOUT ; 4370 4 THEN ; P 4371 4 UNCHAR (CH$RCHAR (CH$PTR (REC_MSG, ; 4372 5 PKT_MSG + P_SI_TIMOUT, CHR_SIZE))) ; 4373 4 ELSE ; 4374 4 ABS (.SND_TIMEOUT) ; 4375 4 ; 4376 4 END ; 4377 2 ); ; 4378 2 ! ; 4379 2 ! Parse the number of padding characters supplied ; 4380 2 ! ; 4381 3 SEND_NPAD = (IF .SND_NPAD GEQ 0 THEN .SND_NPAD ELSE ; 4382 4 BEGIN ; 4383 4 ; 4384 4 IF .REC_LENGTH GTR P_SI_NPAD ; 4385 4 THEN ; P 4386 4 UNCHAR (CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG + P_SI_NPAD, ; 4387 5 CHR_SIZE))) ; 4388 4 ELSE ; 4389 4 ABS (.SND_NPAD) ; 4390 4 ; 4391 4 END ; 4392 2 ); ; 4393 2 ! ; 4394 2 ! Parse the padding character ; 4395 2 ! ; 4396 3 SEND_PADCHAR = (IF .SND_PADCHAR GEQ 0 THEN .SND_PADCHAR ELSE ; 4397 4 BEGIN ; 4398 4 ; 4399 4 IF .REC_LENGTH GTR P_SI_PAD ; 4400 4 THEN ; P 4401 4 CTL (CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG + P_SI_PAD, ; 4402 5 CHR_SIZE))) ; 4403 4 ELSE ; 4404 4 ABS (.SND_PADCHAR) ; 4405 4 ; 4406 4 END ; 4407 2 ); ; 4408 2 ! ; 4409 2 ! Parse the end of line character ; 4410 2 ! ; 4411 3 SEND_EOL = (IF .SND_EOL GEQ 0 THEN .SND_EOL ELSE ; 4412 4 BEGIN ; 4413 4 ; 4414 4 IF .REC_LENGTH GTR P_SI_EOL ; 4415 4 THEN ; P 4416 4 UNCHAR (CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG + P_SI_EOL, ; 4417 5 CHR_SIZE))) ; 4418 4 ELSE ; 4419 4 ABS (.SND_EOL) ; 4420 4 ; 4421 4 END ; 4422 2 ); ; 4423 2 ! ; 4424 2 ! Parse the quoting character ; 4425 2 ! ; 4426 3 SEND_QUOTE_CHR = (IF .SND_QUOTE_CHR GEQ 0 THEN .SND_QUOTE_CHR ELSE ; 4427 4 BEGIN ; 4428 4 ; 4429 4 IF .REC_LENGTH GTR P_SI_QUOTE ; 4430 4 THEN ; 4431 4 CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG + P_SI_QUOTE, ; 4432 4 CHR_SIZE)) ; 4433 4 ELSE ; 4434 4 ABS (.SND_QUOTE_CHR) ; 4435 4 ; 4436 4 END ; 4437 2 ); ; 4438 2 ! ; 4439 2 ! Parse the 8-bit quoting character ; 4440 2 ! ; 4441 2 ! If the character was not included in the packet, assume no eight-bit ; 4442 2 ! quoting allowed (we are probably talking to an old version of Kermit). ; 4443 2 ! ; 4444 3 SEND_8QUOTE_CHR = (IF .REC_LENGTH GTR P_SI_8QUOTE THEN CH$RCHAR (CH$PTR (REC_MSG, ; 4445 3 PKT_MSG + P_SI_8QUOTE, CHR_SIZE)) ELSE %C'N' ! Assume no 8-bit quoting allowed ; 4446 2 ); ; 4447 2 ! ; 4448 2 ! Parse the checksum type ; 4449 2 ! ; 4450 2 ; 4451 2 IF .REC_LENGTH GTR P_SI_CHKTYPE ; 4452 2 THEN ; 4453 3 BEGIN ; 4454 3 ; 4455 3 LOCAL ; 4456 3 REQ_CHK_TYPE; ; 4457 3 ; 4458 3 REQ_CHK_TYPE = CH$RCHAR (CH$PTR (REC_MSG, PKT_MSG + P_SI_CHKTYPE, CHR_SIZE)); ; 4459 3 ; 4460 3 IF .REC_TYPE NEQ MSG_ACK ; 4461 3 THEN ; 4462 3 ; 4463 3 IF .REQ_CHK_TYPE GEQ CHK_1CHAR AND .REQ_CHK_TYPE LEQ CHK_CRC ; 4464 3 THEN ; 4465 3 INI_CHK_TYPE = .REQ_CHK_TYPE ; 4466 3 ELSE ; 4467 3 INI_CHK_TYPE = CHK_1CHAR ; 4468 3 ; 4469 3 ELSE ; 4470 3 ; 4471 3 IF .REQ_CHK_TYPE NEQ .CHKTYPE ; 4472 3 THEN ; 4473 3 INI_CHK_TYPE = CHK_1CHAR ; 4474 3 ELSE ; 4475 3 INI_CHK_TYPE = .REQ_CHK_TYPE ; 4476 3 ; 4477 3 END ; 4478 2 ELSE ; 4479 2 INI_CHK_TYPE = CHK_1CHAR; ! Only single character checksum if not specified ; 4480 2 ; 4481 2 ! ; 4482 2 ! Parse the repeat character ; 4483 2 ! ; 4484 3 REPT_CHR = (IF .REC_LENGTH GTR P_SI_REPEAT THEN CH$RCHAR (CH$PTR (REC_MSG, ; 4485 2 PKT_MSG + P_SI_REPEAT, CHR_SIZE)) ELSE %C' '); ; 4486 2 ! ; 4487 2 ! Check for a valid quoting character. If it is not valid, then we have ; 4488 2 ! a protocol error ; 4489 2 ! ; 4490 2 ; 4491 4 IF NOT ((.SEND_QUOTE_CHR GEQ %O'41' AND .SEND_QUOTE_CHR LEQ %O'76') OR (.SEND_QUOTE_CHR GEQ %O ; 4492 3 '140' AND .SEND_QUOTE_CHR LEQ %O'176')) ; 4493 2 THEN ; 4494 3 BEGIN ; 4495 3 KRM_ERROR (KER_PROTOERR); ; 4496 3 RETURN KER_PROTOERR; ; 4497 2 END; ; 4498 2 ; 4499 2 ! ; 4500 2 ! Check for a valid 8 bit quoting and set the 8 bit quoting flag as needed ; 4501 2 ! ; 4502 2 ; 4503 5 IF ( NOT ((.SEND_8QUOTE_CHR GEQ %O'041' AND .SEND_8QUOTE_CHR LEQ %O'076') OR (.SEND_8QUOTE_CHR ; 4504 5 GEQ %O'140' AND .SEND_8QUOTE_CHR LEQ %O'176') OR (.SEND_8QUOTE_CHR EQL %C'N') OR ( ; 4505 2 .SEND_8QUOTE_CHR EQL %C'Y'))) OR .SEND_8QUOTE_CHR EQL .SEND_QUOTE_CHR OR .SEND_8QUOTE_CHR ; 4506 2 EQL .RCV_QUOTE_CHR ; 4507 2 THEN ; 4508 3 BEGIN ; 4509 3 KRM_ERROR (KER_PROTOERR); ; 4510 3 RETURN KER_PROTOERR; ; 4511 2 END; ; 4512 2 ; 4513 2 IF .SEND_8QUOTE_CHR EQL %C'Y' THEN SEND_8QUOTE_CHR = .RECV_8QUOTE_CHR; ; 4514 2 ; 4515 2 IF .SEND_8QUOTE_CHR NEQ %C'N' AND .SEND_8QUOTE_CHR NEQ %C'Y' ; 4516 2 THEN ; 4517 2 FLAG_8QUOTE = TRUE ; 4518 2 ELSE ; 4519 2 FLAG_8QUOTE = FALSE; ; 4520 2 ; 4521 2 ! ; 4522 2 ! Check the repeat character and set flags ; 4523 2 ! ; 4524 2 ; 4525 5 IF ( NOT ((.REPT_CHR GEQ %O'41' AND .REPT_CHR LEQ %O'76') OR (.REPT_CHR GEQ %O'140' AND ; 4526 3 .REPT_CHR LEQ %O'176')) OR .REPT_CHR EQL .SEND_QUOTE_CHR OR .REPT_CHR EQL .SEND_8QUOTE_CHR ; 4527 2 OR .REPT_CHR EQL .RCV_QUOTE_CHR) AND .REPT_CHR NEQ %C' ' ; 4528 2 THEN ; 4529 3 BEGIN ; 4530 3 KRM_ERROR (KER_PROTOERR); ; 4531 3 RETURN KER_PROTOERR; ; 4532 2 END; ; 4533 2 ; 4534 2 IF .REPT_CHR NEQ %C' ' THEN FLAG_REPEAT = TRUE ELSE FLAG_REPEAT = FALSE; ; 4535 2 ; 4536 2 RETURN KER_NORMAL; ; 4537 1 END; ! End of PRS_SEND_INIT ;PRS_SEND_INIT U.21: .WORD ^M ;Save R2 ; 4301 MOVAB W^U.55, R2 ;U.55, R2 ; MOVL W^SND_PKT_SIZE, R0 ;SND_PKT_SIZE, R0 ; 4351 BGEQ 2$ ;2$ ; TSTL (R2) ;REC_LENGTH ; 4354 BLEQ 1$ ;1$ ; MOVZBL 12(R2), R0 ;REC_MSG+4, R0 ; 4357 SUBL2 #32, R0 ;#32, R0 ; BRB 2$ ;2$ ; 1$: TSTL R0 ;R0 ; 4359 BGEQ 2$ ;2$ ; MNEGL R0, R0 ;R0, R0 ; 2$: MOVL R0, -64(R2) ;R0, SEND_PKT_SIZE ; 4351 MOVL W^SND_TIMEOUT, R0 ;SND_TIMEOUT, R0 ; 4366 BGEQ 4$ ;4$ ; CMPL (R2), #1 ;REC_LENGTH, #1 ; 4369 BLEQ 3$ ;3$ ; MOVZBL 13(R2), R0 ;REC_MSG+5, R0 ; 4372 SUBL2 #32, R0 ;#32, R0 ; BRB 4$ ;4$ ; 3$: TSTL R0 ;R0 ; 4374 BGEQ 4$ ;4$ ; MNEGL R0, R0 ;R0, R0 ; 4$: MOVL R0, W^SEND_TIMEOUT ;R0, SEND_TIMEOUT ; 4366 MOVL W^SND_NPAD, R0 ;SND_NPAD, R0 ; 4381 BGEQ 6$ ;6$ ; CMPL (R2), #2 ;REC_LENGTH, #2 ; 4384 BLEQ 5$ ;5$ ; MOVZBL 14(R2), R0 ;REC_MSG+6, R0 ; 4387 SUBL2 #32, R0 ;#32, R0 ; BRB 6$ ;6$ ; 5$: TSTL R0 ;R0 ; 4389 BGEQ 6$ ;6$ ; MNEGL R0, R0 ;R0, R0 ; 6$: MOVL R0, -60(R2) ;R0, SEND_NPAD ; 4381 MOVL W^SND_PADCHAR, R0 ;SND_PADCHAR, R0 ; 4396 BGEQ 8$ ;8$ ; CMPL (R2), #3 ;REC_LENGTH, #3 ; 4399 BLEQ 7$ ;7$ ; MOVZBL 15(R2), R0 ;REC_MSG+7, R0 ; 4402 XORL2 #64, R0 ;#64, R0 ; BRB 8$ ;8$ ; 7$: TSTL R0 ;R0 ; 4404 BGEQ 8$ ;8$ ; MNEGL R0, R0 ;R0, R0 ; 8$: MOVL R0, -56(R2) ;R0, SEND_PADCHAR ; 4396 MOVL W^SND_EOL, R0 ;SND_EOL, R0 ; 4411 BGEQ 10$ ;10$ ; CMPL (R2), #4 ;REC_LENGTH, #4 ; 4414 BLEQ 9$ ;9$ ; MOVZBL 16(R2), R0 ;REC_MSG+8, R0 ; 4417 SUBL2 #32, R0 ;#32, R0 ; BRB 10$ ;10$ ; 9$: TSTL R0 ;R0 ; 4419 BGEQ 10$ ;10$ ; MNEGL R0, R0 ;R0, R0 ; 10$: MOVL R0, -52(R2) ;R0, SEND_EOL ; 4411 MOVL W^SND_QUOTE_CHR, R0 ;SND_QUOTE_CHR, R0 ; 4426 BGEQ 12$ ;12$ ; CMPL (R2), #5 ;REC_LENGTH, #5 ; 4429 BLEQ 11$ ;11$ ; MOVZBL 17(R2), R0 ;REC_MSG+9, R0 ; 4432 BRB 12$ ;12$ ; 11$: TSTL R0 ;R0 ; 4434 BGEQ 12$ ;12$ ; MNEGL R0, R0 ;R0, R0 ; 12$: MOVL R0, -48(R2) ;R0, SEND_QUOTE_CHR ; 4426 MOVL (R2), R1 ;REC_LENGTH, R1 ; 4444 CMPL R1, #6 ;R1, #6 ; BLEQ 13$ ;13$ ; MOVZBL 18(R2), R0 ;REC_MSG+10, R0 ; 4445 BRB 14$ ;14$ ; 13$: MOVZBL #78, R0 ;#78, R0 ; 14$: MOVL R0, -44(R2) ;R0, SEND_8QUOTE_CHR ; 4444 CMPL R1, #7 ;R1, #7 ; 4451 BLEQ 17$ ;17$ ; MOVZBL 19(R2), R0 ;REC_MSG+11, REQ_CHK_TYPE ; 4458 CMPL 4(R2), #89 ;REC_TYPE, #89 ; 4460 BEQL 15$ ;15$ ; CMPL R0, #49 ;REQ_CHK_TYPE, #49 ; 4463 BLSS 17$ ;17$ ; CMPL R0, #51 ;REQ_CHK_TYPE, #51 ; BGTR 17$ ;17$ ; BRB 16$ ;16$ ; 4465 15$: CMPL R0, W^CHKTYPE ;REQ_CHK_TYPE, CHKTYPE ; 4471 BNEQ 17$ ;17$ ; 16$: MOVL R0, -40(R2) ;REQ_CHK_TYPE, INI_CHK_TYPE ; 4475 BRB 18$ ;18$ ; 4460 17$: MOVL #49, -40(R2) ;#49, INI_CHK_TYPE ; 4479 18$: CMPL R1, #8 ;R1, #8 ; 4484 BLEQ 19$ ;19$ ; MOVZBL 20(R2), R0 ;REC_MSG+12, R0 ; 4485 BRB 20$ ;20$ ; 19$: MOVL #32, R0 ;#32, R0 ; 20$: MOVL R0, -68(R2) ;R0, REPT_CHR ; 4484 MOVL -48(R2), R0 ;SEND_QUOTE_CHR, R0 ; 4491 CMPL R0, #33 ;R0, #33 ; BLSS 21$ ;21$ ; CMPL R0, #62 ;R0, #62 ; BLEQ 24$ ;24$ ; 21$: CMPL R0, #96 ;R0, #96 ; BGEQ 23$ ;23$ ; 22$: BRW 34$ ;34$ ; 23$: CMPL R0, #126 ;R0, #126 ; 4492 BGTR 22$ ;22$ ; 24$: MOVL -44(R2), R0 ;SEND_8QUOTE_CHR, R0 ; 4503 CMPL R0, #33 ;R0, #33 ; BLSS 25$ ;25$ ; CMPL R0, #62 ;R0, #62 ; BLEQ 27$ ;27$ ; 25$: CMPL R0, #96 ;R0, #96 ; 4504 BLSS 26$ ;26$ ; CMPL R0, #126 ;R0, #126 ; BLEQ 27$ ;27$ ; 26$: CMPL R0, #78 ;R0, #78 ; BEQL 27$ ;27$ ; CMPL R0, #89 ;R0, #89 ; 4505 BNEQ 34$ ;34$ ; 27$: CMPL R0, -48(R2) ;R0, SEND_QUOTE_CHR ; BEQL 34$ ;34$ ; CMPL R0, W^RCV_QUOTE_CHR ;R0, RCV_QUOTE_CHR ; 4506 BEQL 34$ ;34$ ; CMPL -44(R2), #89 ;SEND_8QUOTE_CHR, #89 ; 4513 BNEQ 28$ ;28$ ; MOVL -72(R2), -44(R2) ;RECV_8QUOTE_CHR, SEND_8QUOTE_CHR ; 28$: MOVL -44(R2), R1 ;SEND_8QUOTE_CHR, R1 ; 4515 CMPL R1, #78 ;R1, #78 ; BEQL 29$ ;29$ ; CMPL R1, #89 ;R1, #89 ; BEQL 29$ ;29$ ; MOVL #1, -32(R2) ;#1, FLAG_8QUOTE ; 4517 BRB 30$ ;30$ ; 29$: CLRL -32(R2) ;FLAG_8QUOTE ; 4519 30$: MOVL -68(R2), R0 ;REPT_CHR, R0 ; 4525 CMPL R0, #33 ;R0, #33 ; BLSS 31$ ;31$ ; CMPL R0, #62 ;R0, #62 ; BLEQ 32$ ;32$ ; 31$: CMPL R0, #96 ;R0, #96 ; BLSS 33$ ;33$ ; CMPL R0, #126 ;R0, #126 ; 4526 BGTR 33$ ;33$ ; 32$: CMPL R0, -48(R2) ;R0, SEND_QUOTE_CHR ; BEQL 33$ ;33$ ; CMPL R0, R1 ;R0, R1 ; BEQL 33$ ;33$ ; CMPL R0, W^RCV_QUOTE_CHR ;R0, RCV_QUOTE_CHR ; 4527 BNEQ 35$ ;35$ ; 33$: CMPL R0, #32 ;R0, #32 ; BEQL 35$ ;35$ ; 34$: PUSHL #134316226 ;#134316226 ; 4530 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; MOVL #134316226, R0 ;#134316226, R0 ; 4531 RET ; ; 35$: CMPL -68(R2), #32 ;REPT_CHR, #32 ; 4534 BEQL 36$ ;36$ ; MOVL #1, -28(R2) ;#1, FLAG_REPEAT ; BRB 37$ ;37$ ; 36$: CLRL -28(R2) ;FLAG_REPEAT ; 37$: MOVL #134316043, R0 ;#134316043, R0 ; 4536 RET ; ; 4537 ; Routine Size: 529 bytes, Routine Base: $CODE$ + 154A ; 4538 1 %SBTTL 'SET_SEND_INIT' ; 4539 1 ROUTINE SET_SEND_INIT : NOVALUE = ; 4540 1 ; 4541 1 !++ ; 4542 1 ! FUNCTIONAL DESCRIPTION: ; 4543 1 ! ; 4544 1 ! This routine will initialize the various parameters for the ; 4545 1 ! MSG_SND_INIT message. ; 4546 1 ! ; 4547 1 ! CALLING SEQUENCE: ; 4548 1 ! ; 4549 1 ! SET_SEND_INIT(); ; 4550 1 ! ; 4551 1 ! INPUT PARAMETERS: ; 4552 1 ! ; 4553 1 ! None. ; 4554 1 ! ; 4555 1 ! IMPLICIT INPUTS: ; 4556 1 ! ; 4557 1 ! None. ; 4558 1 ! ; 4559 1 ! OUTPUT PARAMETERS: ; 4560 1 ! ; 4561 1 ! None. ; 4562 1 ! ; 4563 1 ! IMPLICIT OUTPUTS: ; 4564 1 ! ; 4565 1 ! SND_MSG parameters set up. ; 4566 1 ! ; 4567 1 ! COMPLETION CODES: ; 4568 1 ! ; 4569 1 ! None. ; 4570 1 ! ; 4571 1 ! SIDE EFFECTS: ; 4572 1 ! ; 4573 1 ! None. ; 4574 1 ! ; 4575 1 !-- ; 4576 1 ; 4577 2 BEGIN ; 4578 2 CH$WCHAR (CHAR (.RCV_PKT_SIZE), CH$PTR (SND_MSG, PKT_MSG + P_SI_BUFSIZ, CHR_SIZE)); ; 4579 2 CH$WCHAR (CHAR (.RCV_TIMEOUT), CH$PTR (SND_MSG, PKT_MSG + P_SI_TIMOUT, CHR_SIZE)); ; 4580 2 CH$WCHAR (CHAR (.RCV_NPAD), CH$PTR (SND_MSG, PKT_MSG + P_SI_NPAD, CHR_SIZE)); ; 4581 2 CH$WCHAR (CTL (.RCV_PADCHAR), CH$PTR (SND_MSG, PKT_MSG + P_SI_PAD, CHR_SIZE)); ; 4582 2 CH$WCHAR (CHAR (.RCV_EOL), CH$PTR (SND_MSG, PKT_MSG + P_SI_EOL, CHR_SIZE)); ; 4583 2 CH$WCHAR (.RCV_QUOTE_CHR, CH$PTR (SND_MSG, PKT_MSG + P_SI_QUOTE, CHR_SIZE)); ; 4584 2 CH$WCHAR (.SEND_8QUOTE_CHR, CH$PTR (SND_MSG, PKT_MSG + P_SI_8QUOTE, CHR_SIZE)); ; 4585 2 CH$WCHAR (.INI_CHK_TYPE, CH$PTR (SND_MSG, PKT_MSG + P_SI_CHKTYPE, CHR_SIZE)); ; 4586 2 CH$WCHAR (.REPT_CHR, CH$PTR (SND_MSG, PKT_MSG + P_SI_REPEAT, CHR_SIZE)); ; 4587 1 END; ! End of SET_SEND_INIT ;SET_SEND_INIT U.20: .WORD ^M ;Save R2 ; 4539 MOVAB W^U.58+4, R2 ;U.58+4, R2 ; ADDB3 #32, W^RCV_PKT_SIZE, (R2) ;#32, RCV_PKT_SIZE, SND_MSG+4 ; 4578 ADDB3 #32, W^RCV_TIMEOUT, 1(R2) ;#32, RCV_TIMEOUT, SND_MSG+5 ; 4579 ADDB3 #32, W^RCV_NPAD, 2(R2) ;#32, RCV_NPAD, SND_MSG+6 ; 4580 XORB3 #64, W^RCV_PADCHAR, 3(R2) ;#64, RCV_PADCHAR, SND_MSG+7 ; 4581 ADDB3 #32, W^RCV_EOL, 4(R2) ;#32, RCV_EOL, SND_MSG+8 ; 4582 MOVB W^RCV_QUOTE_CHR, 5(R2) ;RCV_QUOTE_CHR, SND_MSG+9 ; 4583 MOVB -156(R2), 6(R2) ;SEND_8QUOTE_CHR, SND_MSG+10 ; 4584 MOVB -152(R2), 7(R2) ;INI_CHK_TYPE, SND_MSG+11 ; 4585 MOVB -180(R2), 8(R2) ;REPT_CHR, SND_MSG+12 ; 4586 RET ; ; 4587 ; Routine Size: 67 bytes, Routine Base: $CODE$ + 175B ; 4588 1 %SBTTL 'SEND_PACKET' ; 4589 1 ROUTINE SEND_PACKET (TYPE, LENGTH, MN) = ; 4590 1 ; 4591 1 !++ ; 4592 1 ! FUNCTIONAL DESCRIPTION: ; 4593 1 ! ; 4594 1 ! This routine will cause a packet to be sent over the line ; 4595 1 ! that has been opened by OPEN_TERMINAL. ; 4596 1 ! ; 4597 1 ! CALLING SEQUENCE: ; 4598 1 ! ; 4599 1 ! SEND_PACKET(Type, Length); ; 4600 1 ! ; 4601 1 ! INPUT PARAMETERS: ; 4602 1 ! ; 4603 1 ! TYPE - Type of packet to send. ; 4604 1 ! ; 4605 1 ! LENGTH - Length of the packet being sent. ; 4606 1 ! ; 4607 1 ! IMPLICIT INPUTS: ; 4608 1 ! ; 4609 1 ! None. ; 4610 1 ! ; 4611 1 ! OUTPUT PARAMETERS: ; 4612 1 ! ; 4613 1 ! None. ; 4614 1 ! ; 4615 1 ! IMPLICIT OUTPUTS: ; 4616 1 ! ; 4617 1 ! None. ; 4618 1 ! ; 4619 1 ! COMPLETION CODES: ; 4620 1 ! ; 4621 1 ! None. ; 4622 1 ! ; 4623 1 ! SIDE EFFECTS: ; 4624 1 ! ; 4625 1 ! None. ; 4626 1 ! ; 4627 1 !-- ; 4628 1 ; 4629 2 BEGIN ; 4630 2 ; 4631 2 LOCAL ; 4632 2 FILLER : VECTOR [CH$ALLOCATION (MAX_MSG, CHR_SIZE)], ; 4633 2 TOT_MSG_LEN, ! Length of message including all characters ; 4634 2 CHKSUM, ! Checksum for the message we calculate ; 4635 2 POINTER; ! Pointer to the information in the message ; 4636 2 ; 4637 2 ! ; 4638 2 ! Do any filler processing that the remote KERMIT requires. ; 4639 2 ! ; 4640 2 ; 4641 2 IF .SEND_NPAD NEQ 0 ; 4642 2 THEN ; 4643 3 BEGIN ; 4644 3 CH$FILL (.SEND_PADCHAR, MAX_MSG, CH$PTR (FILLER, 0, CHR_SIZE)); ; 4645 3 ! ; 4646 3 ! Update the send stats ; 4647 3 ! ; 4648 3 SMSG_TOTAL_CHARS = .SMSG_TOTAL_CHARS + .SEND_NPAD; ; 4649 3 ! ; 4650 3 ! Send the fill ; 4651 3 ! ; 4652 3 DO_PARITY (FILLER, .SEND_NPAD + PKT_TOT_OVR_HEAD); ; 4653 3 SEND (FILLER, .SEND_NPAD + PKT_TOT_OVR_HEAD); ; 4654 2 END; ; 4655 2 ; 4656 2 ! ; 4657 2 ! Store the header information into the message. ; 4658 2 ! ; 4659 2 CH$WCHAR (.TYPE, CH$PTR (SND_MSG, PKT_TYPE, CHR_SIZE)); ; 4660 2 CH$WCHAR (.SND_SOH, CH$PTR (SND_MSG, PKT_MARK, CHR_SIZE)); ; 4661 2 CH$WCHAR (CHAR (.LENGTH + PKT_OVR_HEAD + (.BLK_CHK_TYPE - CHK_1CHAR)), ; 4662 2 CH$PTR (SND_MSG, ; 4663 2 PKT_COUNT, CHR_SIZE)); ; 4664 2 CH$WCHAR (CHAR ((IF .MN LSS 0 THEN 0 ELSE .MN)), CH$PTR (SND_MSG, PKT_SEQ, CHR_SIZE)); ; 4665 2 ! ; 4666 2 ! Calculate the block check value ; 4667 2 ! ; 4668 2 POINTER = CH$PTR (SND_MSG, PKT_MARK + 1, CHR_SIZE); ; 4669 2 CHKSUM = CALC_BLOCK_CHECK (.POINTER, .LENGTH + PKT_OVR_HEAD); ; 4670 2 TOT_MSG_LEN = .LENGTH + PKT_TOT_OVR_HEAD; ; 4671 2 ! ; 4672 2 ! Store the checksum into the message ; 4673 2 ! ; 4674 2 POINTER = CH$PTR (SND_MSG, .LENGTH + PKT_OVR_HEAD + 1, CHR_SIZE); ; 4675 2 ; 4676 2 CASE .BLK_CHK_TYPE FROM CHK_1CHAR TO CHK_CRC OF ; 4677 2 SET ; 4678 2 ; 4679 2 [CHK_1CHAR] : ; 4680 2 CH$WCHAR_A (CHAR (.CHKSUM), POINTER); ; 4681 2 ; 4682 2 [CHK_2CHAR] : ; 4683 3 BEGIN ; 4684 3 CH$WCHAR_A (CHAR (.CHKSUM<6, 6>), POINTER); ; 4685 3 CH$WCHAR_A (CHAR (.CHKSUM<0, 6>), POINTER); ; 4686 3 TOT_MSG_LEN = .TOT_MSG_LEN + 1; ; 4687 2 END; ; 4688 2 ; 4689 2 [CHK_CRC] : ; 4690 3 BEGIN ; 4691 3 CH$WCHAR_A (CHAR (.CHKSUM<12, 4>), POINTER); ; 4692 3 CH$WCHAR_A (CHAR (.CHKSUM<6, 6>), POINTER); ; 4693 3 CH$WCHAR_A (CHAR (.CHKSUM<0, 6>), POINTER); ; 4694 3 TOT_MSG_LEN = .TOT_MSG_LEN + 2; ; 4695 2 END; ; 4696 2 TES; ; 4697 2 ; 4698 2 ! ; 4699 2 ! Store in the end of line character ; 4700 2 ! ; 4701 2 CH$WCHAR_A (.SEND_EOL, POINTER); ; 4702 2 ! ; 4703 2 ! If we are debugging then type out the message we are sending. ; 4704 2 ! ; 4705 2 DBG_SEND (SND_MSG, (.TOT_MSG_LEN)); ; 4706 2 ! ; 4707 2 ! Update the stats for total characters and the data characters ; 4708 2 ! ; 4709 2 SMSG_TOTAL_CHARS = .SMSG_TOTAL_CHARS + .TOT_MSG_LEN; ; 4710 2 ! Make data characters really be that, not just characters in data field ; 4711 2 ! SMSG_DATA_CHARS = .SMSG_DATA_CHARS + .LENGTH; ; 4712 2 ; 4713 2 IF .TYPE EQL MSG_NAK ; 4714 2 THEN ; 4715 3 BEGIN ; 4716 3 SMSG_NAKS = .SMSG_NAKS + 1; ; 4717 3 XFR_STATUS (%C'S', %C'N'); ; 4718 3 END ; 4719 2 ELSE ; 4720 3 BEGIN ; 4721 3 SMSG_COUNT = .SMSG_COUNT + 1; ; 4722 3 XFR_STATUS (%C'S', %C'P'); ; 4723 2 END; ; 4724 2 ; 4725 2 ! ; 4726 2 ! Check if we are in IBM mode and need to wait for an XON first ; 4727 2 ! We will not wait if this is a packet which might be going out ; 4728 2 ! without previous traffic (generic commands, init packets). ; 4729 2 ; 4730 3 IF (.IBM_CHAR GEQ 0) ! If handshaking on ; 4731 2 THEN ; 4732 2 IF NOT IBM_WAIT () THEN RETURN KER_ABORTED; ; 4733 2 ; 4734 2 ! ; 4735 2 ! Now call the O/S routine to send the message out to the remote KERMIT ; 4736 2 ! ; 4737 2 DO_PARITY (SND_MSG, .TOT_MSG_LEN); ; 4738 2 RETURN SEND (SND_MSG, .TOT_MSG_LEN); ; 4739 1 END; ! End of SEND_PACKET ;SEND_PACKET U.24: .WORD ^M ;Save R2,R3,R4,R5,R6,R7 ; 4589 MOVAB W^U.58, R7 ;U.58, R7 ; MOVAB -96(SP), SP ;-96(SP), SP ; MOVL -168(R7), R6 ;SEND_NPAD, R6 ; 4641 BEQL 1$ ;1$ ; MOVC5 #0, (SP), -164(R7), #96, (SP) ;#0, (SP), SEND_PADCHAR, #96, FILLER ; 4644 ADDL2 R6, W^SMSG_TOTAL_CHARS ;R6, SMSG_TOTAL_CHARS ; 4648 PUSHAB 6(R6) ;6(R6) ; 4652 PUSHAB 4(SP) ;FILLER ; CALLS #2, W^U.22 ;#2, U.22 ; ADDL3 #6, -168(R7), -(SP) ;#6, SEND_NPAD, -(SP) ; 4653 PUSHAB 4(SP) ;FILLER ; CALLS #2, W^SEND ;#2, SEND ; 1$: MOVB 4(AP), 3(R7) ;TYPE, SND_MSG+3 ; 4659 MOVB W^SND_SOH, (R7) ;SND_SOH, SND_MSG ; 4660 ADDL3 -144(R7), 8(AP), R0 ;BLK_CHK_TYPE, LENGTH, R0 ; 4661 SUBB3 #14, R0, 1(R7) ;#14, R0, SND_MSG+1 ; TSTL 12(AP) ;MN ; 4664 BGEQ 2$ ;2$ ; CLRL R0 ;R0 ; BRB 3$ ;3$ ; 2$: MOVL 12(AP), R0 ;MN, R0 ; 3$: ADDB3 #32, R0, 2(R7) ;#32, R0, SND_MSG+2 ; MOVAB 1(R7), R2 ;SND_MSG+1, POINTER ; 4668 ADDL3 #3, 8(AP), -(SP) ;#3, LENGTH, -(SP) ; 4669 PUSHL R2 ;POINTER ; CALLS #2, W^U.19 ;#2, U.19 ; ADDL3 #6, 8(AP), R3 ;#6, LENGTH, TOT_MSG_LEN ; 4670 MOVAB (R7), R1 ;SND_MSG, R1 ; 4674 ADDL2 8(AP), R1 ;LENGTH, R1 ; MOVAB 4(R1), R2 ;4(R1), POINTER ; CASEL -144(R7), #49, #2 ;BLK_CHK_TYPE, #49, #2 ; 4680 4$: .WORD 5$-4$,- ;5$-4$,- ; 6$-4$,- ;6$-4$,- ; 7$-4$ ;7$-4$ ; 5$: ADDB3 #32, R0, (R2) ;#32, CHKSUM, (POINTER) ; BRB 8$ ;8$ ; 6$: EXTZV #6, #6, R0, R1 ;#6, #6, CHKSUM, R1 ; 4684 ADDB3 #32, R1, (R2)+ ;#32, R1, (POINTER)+ ; EXTZV #0, #6, R0, R1 ;#0, #6, CHKSUM, R1 ; 4685 ADDB3 #32, R1, (R2) ;#32, R1, (POINTER) ; INCL R3 ;TOT_MSG_LEN ; 4686 BRB 8$ ;8$ ; 7$: EXTZV #12, #4, R0, R1 ;#12, #4, CHKSUM, R1 ; 4691 ADDB3 #32, R1, (R2)+ ;#32, R1, (POINTER)+ ; EXTZV #6, #6, R0, R1 ;#6, #6, CHKSUM, R1 ; 4692 ADDB3 #32, R1, (R2)+ ;#32, R1, (POINTER)+ ; EXTZV #0, #6, R0, R1 ;#0, #6, CHKSUM, R1 ; 4693 ADDB3 #32, R1, (R2) ;#32, R1, (POINTER) ; ADDL2 #2, R3 ;#2, TOT_MSG_LEN ; 4694 8$: INCL R2 ;POINTER ; 4680 MOVB -160(R7), (R2)+ ;SEND_EOL, (POINTER)+ ; 4701 PUSHL R3 ;TOT_MSG_LEN ; 4705 PUSHL R7 ;R7 ; CALLS #2, W^U.35 ;#2, U.35 ; ADDL2 R3, W^SMSG_TOTAL_CHARS ;TOT_MSG_LEN, SMSG_TOTAL_CHARS ; 4709 CMPL 4(AP), #78 ;TYPE, #78 ; 4713 BNEQ 9$ ;9$ ; INCL W^SMSG_NAKS ;SMSG_NAKS ; 4716 MOVZBL #78, -(SP) ;#78, -(SP) ; 4717 BRB 10$ ;10$ ; 9$: INCL W^SMSG_COUNT ;SMSG_COUNT ; 4721 MOVZBL #80, -(SP) ;#80, -(SP) ; 4722 10$: MOVZBL #83, -(SP) ;#83, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; TSTL W^IBM_CHAR ;IBM_CHAR ; 4730 BLSS 11$ ;11$ ; CALLS #0, W^IBM_WAIT ;#0, IBM_WAIT ; 4732 BLBS R0, 11$ ;R0, 11$ ; MOVL #134316258, R0 ;#134316258, R0 ; RET ; ; 11$: PUSHL R3 ;TOT_MSG_LEN ; 4737 PUSHL R7 ;R7 ; CALLS #2, W^U.22 ;#2, U.22 ; PUSHL R3 ;TOT_MSG_LEN ; 4738 PUSHL R7 ;R7 ; CALLS #2, W^SEND ;#2, SEND ; RET ; ; 4739 ; Routine Size: 299 bytes, Routine Base: $CODE$ + 179E ; 4740 1 %SBTTL 'REC_MESSAGE - Receive a message' ; 4741 1 ROUTINE REC_MESSAGE (CHK_ROUTINE) = ; 4742 1 ; 4743 1 !++ ; 4744 1 ! FUNCTIONAL DESCRIPTION: ; 4745 1 ! ; 4746 1 ! This routine will handle the retry processing for the various ; 4747 1 ! messages that can be received. ; 4748 1 ! ; 4749 1 ! CALLING SEQUENCE: ; 4750 1 ! ; 4751 1 ! INPUT PARAMETERS: ; 4752 1 ! ; 4753 1 ! None. ; 4754 1 ! ; 4755 1 ! IMPLICIT INPUTS: ; 4756 1 ! ; 4757 1 ! None. ; 4758 1 ! ; 4759 1 ! OUTPUT PARAMETERS: ; 4760 1 ! ; 4761 1 ! None. ; 4762 1 ! ; 4763 1 ! IMPLICIT OUTPUTS: ; 4764 1 ! ; 4765 1 ! None. ; 4766 1 ! ; 4767 1 ! COMPLETION CODES: ; 4768 1 ! ; 4769 1 ! KER_NORMAL - Normal return ; 4770 1 ! KER_RETRIES - Too many retries ; 4771 1 ! (What ever REC_PACKET returns). ; 4772 1 ! ; 4773 1 ! SIDE EFFECTS: ; 4774 1 ! ; 4775 1 ! None. ; 4776 1 ! ; 4777 1 !-- ; 4778 1 ; 4779 2 BEGIN ; 4780 2 ; 4781 2 LOCAL ; 4782 2 STATUS; ! Status returned by various routines ; 4783 2 ; 4784 2 RETURN ; 4785 2 ; 4786 2 WHILE TRUE DO ; 4787 3 BEGIN ; 4788 3 ; 4789 3 IF .NUM_RETRIES GTR .PKT_RETRIES ; 4790 3 THEN ; 4791 4 BEGIN ; 4792 4 KRM_ERROR (KER_RETRIES); ! Report the error ; 4793 4 RETURN KER_RETRIES; ; 4794 3 END; ; 4795 3 ; 4796 3 NUM_RETRIES = .NUM_RETRIES + 1; ; 4797 3 STATUS = REC_PACKET (); ; 4798 3 ![043] Don't abort on errors which might just be due to noise. ; 4799 3 ; 4800 3 IF NOT .STATUS AND .STATUS NEQ KER_CHKSUMERR AND .STATUS NEQ KER_TIMEOUT AND .STATUS NEQ ; 4801 3 KER_ZEROLENMSG ; 4802 3 THEN ; 4803 3 RETURN .STATUS; ; 4804 3 ; 4805 3 IF NOT .STATUS ; 4806 3 THEN ; 4807 3 SEND_PACKET (MSG_NAK, 0, .MSG_NUMBER) ![024] ; 4808 3 ELSE ; 4809 4 BEGIN ; 4810 4 ![021] ; 4811 4 ![021] If the packet type is not acceptable by our caller, nak it so the ; 4812 4 ![021] other end tries again, and abort the current operation. This is so ; 4813 4 ![021] we will return to server mode (if we are running that way) quickly ; 4814 4 ![021] when the other Kermit has been aborted and then restarted, and should ; 4815 4 ![021] also make restarting quick, since we will not need to wait for the ; 4816 4 ![021] other Kermit to time this message out before retransmitting. ; 4817 4 ![021] ; 4818 4 ; 4819 4 IF NOT (.CHK_ROUTINE) () ; 4820 4 THEN ; 4821 5 BEGIN ; 4822 5 SEND_PACKET (MSG_NAK, 0, .REC_SEQ); ; 4823 5 RETURN FALSE; ! Just indicate an error ; 4824 5 END ; 4825 4 ELSE ; 4826 4 EXITLOOP KER_NORMAL; ; 4827 4 ; 4828 3 END; ; 4829 3 ; 4830 2 END; ; 4831 2 ; 4832 1 END; ! End of REC_PARSE ;REC_MESSAGE U.25: .WORD ^M ;Save R2,R3 ; 4741 MOVAB W^U.52, R3 ;U.52, R3 ; 1$: CMPL (R3), W^PKT_RETRIES ;NUM_RETRIES, PKT_RETRIES ; 4789 BLEQ 2$ ;2$ ; PUSHL #134316194 ;#134316194 ; 4792 CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; MOVL #134316194, R0 ;#134316194, R0 ; 4793 RET ; ; 2$: INCL (R3) ;NUM_RETRIES ; 4796 CALLS #0, W^U.26 ;#0, U.26 ; 4797 MOVL R0, R2 ;R0, STATUS ; BLBS R2, 4$ ;STATUS, 4$ ; 4800 CMPL R2, #134316178 ;STATUS, #134316178 ; BEQL 3$ ;3$ ; CMPL R2, #134316248 ;STATUS, #134316248 ; BEQL 3$ ;3$ ; CMPL R2, #134316234 ;STATUS, #134316234 ; BEQL 3$ ;3$ ; MOVL R2, R0 ;STATUS, R0 ; 4803 RET ; ; 3$: BLBS R2, 4$ ;STATUS, 4$ ; 4805 PUSHL 4(R3) ;MSG_NUMBER ; 4807 CLRL -(SP) ;-(SP) ; MOVZBL #78, -(SP) ;#78, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; BRB 1$ ;1$ ; 4$: CALLS #0, @4(AP) ;#0, @CHK_ROUTINE ; 4819 BLBS R0, 5$ ;R0, 5$ ; PUSHL 8(R3) ;REC_SEQ ; 4822 CLRL -(SP) ;-(SP) ; MOVZBL #78, -(SP) ;#78, -(SP) ; CALLS #3, W^U.24 ;#3, U.24 ; BRB 6$ ;6$ ; 4823 5$: MOVL #134316043, R0 ;#134316043, R0 ; 4826 RET ; ; 6$: CLRL R0 ;R0 ; 4832 RET ; ; ; Routine Size: 130 bytes, Routine Base: $CODE$ + 18C9 ; 4833 1 %SBTTL 'REC_PACKET' ; 4834 1 ROUTINE REC_PACKET = ; 4835 1 ; 4836 1 !++ ; 4837 1 ! FUNCTIONAL DESCRIPTION: ; 4838 1 ! ; 4839 1 ! This routine will do the oppoiste of SEND_PACKET. It will wait ; 4840 1 ! for the message to be read from the remote and then it will ; 4841 1 ! check the message for validity. ; 4842 1 ! ; 4843 1 ! CALLING SEQUENCE: ; 4844 1 ! ; 4845 1 ! Flag = REC_PACKET(); ; 4846 1 ! ; 4847 1 ! INPUT PARAMETERS: ; 4848 1 ! ; 4849 1 ! None. ; 4850 1 ! ; 4851 1 ! IMPLICIT INPUTS: ; 4852 1 ! ; 4853 1 ! None. ; 4854 1 ! ; 4855 1 ! OUTPUT PARAMETERS: ; 4856 1 ! ; 4857 1 ! None. ; 4858 1 ! ; 4859 1 ! IMPLICIT OUTPUTS: ; 4860 1 ! ; 4861 1 ! REC_MSG - Contains the message received. ; 4862 1 ! ; 4863 1 ! COMPLETION CODES: ; 4864 1 ! ; 4865 1 ! True - Packet receive ok. ; 4866 1 ! False - Problem occured during the receiving of the packet. ; 4867 1 ! ; 4868 1 ! SIDE EFFECTS: ; 4869 1 ! ; 4870 1 ! None. ; 4871 1 ! ; 4872 1 !-- ; 4873 1 ; 4874 2 BEGIN ; 4875 2 ; 4876 2 BIND ; 4877 2 ATTEMPT_TEXT = UPLIT (%ASCIZ'Attempting to receive'); ; 4878 2 ; 4879 2 LOCAL ; 4880 2 STATUS, ! Status returned by various routines ; 4881 2 MSG_LENGTH, ; 4882 2 ERR_POINTER, ! Pointer to the error buffer ; 4883 2 POINTER, ; 4884 2 CHKSUM; ! Checksum of the message ; 4885 2 ; 4886 2 ! ; 4887 2 ! Attempt to read the message from the remote. ; 4888 2 ! ; 4889 2 ! DO ; 4890 2 ! BEGIN ; 4891 2 ; 4892 2 IF .DEBUG_FLAG ; 4893 2 THEN ; 4894 3 BEGIN ; 4895 3 ; 4896 3 LOCAL ; 4897 3 OLD_RTN; ; 4898 3 ; 4899 3 OLD_RTN = TT_SET_OUTPUT (DBG_DUMP); ; 4900 3 TT_TEXT (ATTEMPT_TEXT); ; 4901 3 TT_CRLF (); ; 4902 3 TT_SET_OUTPUT (.OLD_RTN); ; 4903 2 END; ; 4904 2 ; 4905 2 ! ; 4906 2 ! If status type out requested, do it once ; 4907 2 ! ; 4908 2 ; 4909 2 IF .TYP_STS_FLAG ; 4910 2 THEN ; 4911 3 BEGIN ; 4912 3 STS_OUTPUT (); ; 4913 3 TYP_STS_FLAG = FALSE; ; 4914 2 END; ; 4915 2 ; 4916 2 ! ; 4917 2 ! Receive the message from the remote Kermit ; 4918 2 ! ; 4919 2 STATUS = RECEIVE (REC_MSG, MSG_LENGTH); ; 4920 2 ! ; 4921 2 ! Check for timeouts ; 4922 2 ! ; 4923 2 ; 4924 2 IF .STATUS EQL KER_TIMEOUT THEN XFR_STATUS (%C'R', %C'T'); ; 4925 2 ; 4926 2 ! ; 4927 2 ! If it failed return the status to the upper level ; 4928 2 ! ; 4929 2 ; 4930 2 IF NOT .STATUS ; 4931 2 THEN ; 4932 3 BEGIN ; 4933 3 ; 4934 3 IF .STATUS NEQ KER_ABORTED AND .STATUS NEQ KER_TIMEOUT THEN KRM_ERROR (.STATUS); ; 4935 3 ; 4936 3 ! Report error ; 4937 3 RETURN .STATUS; ; 4938 2 END; ; 4939 2 ; 4940 2 ! ; 4941 2 ! Determine if we got a good message ; 4942 2 ! ; 4943 2 ; 4944 2 IF .MSG_LENGTH LSS PKT_TOT_OVR_HEAD - 1 ; 4945 2 THEN ; 4946 3 BEGIN ; 4947 3 RETURN KER_ZEROLENMSG; ; 4948 2 END; ; 4949 2 ; 4950 2 ! ; 4951 2 ! Update the stats on the total number of characters received. ; 4952 2 ! ; 4953 2 RMSG_TOTAL_CHARS = .RMSG_TOTAL_CHARS + .MSG_LENGTH; ; 4954 2 ! ; 4955 2 ! Initialize the checksum and others ; 4956 2 ! ; 4957 2 REC_TYPE = CH$RCHAR (CH$PTR (REC_MSG, PKT_TYPE, CHR_SIZE)); ; 4958 2 ! ; 4959 2 ! Now break the message apart byte by byte. ; 4960 2 ! ; 4961 3 REC_LENGTH = UNCHAR (CH$RCHAR (CH$PTR (REC_MSG, PKT_COUNT, CHR_SIZE))) - PKT_OVR_HEAD - ( ; 4962 2 .BLK_CHK_TYPE - CHK_1CHAR); ; 4963 2 REC_SEQ = UNCHAR (CH$RCHAR (CH$PTR (REC_MSG, PKT_SEQ, CHR_SIZE))); ; 4964 2 ! ; 4965 2 ! Typed the packet if we are debugging ; 4966 2 ! ; 4967 2 DBG_RECEIVE (REC_MSG); ; 4968 2 ! ; 4969 2 ! Now compute the final checksum and make sure that it is identical ; 4970 2 ! to what we received from the remote KERMIT ; 4971 2 ! ; 4972 2 POINTER = CH$PTR (REC_MSG, PKT_MARK + 1, CHR_SIZE); ; 4973 2 CHKSUM = CALC_BLOCK_CHECK (.POINTER, .REC_LENGTH + PKT_OVR_HEAD); ; 4974 2 POINTER = CH$PTR (REC_MSG, .REC_LENGTH + PKT_OVR_HEAD + 1, CHR_SIZE); ; 4975 2 STATUS = KER_NORMAL; ! Assume good checksum ; 4976 2 ; 4977 2 CASE .BLK_CHK_TYPE FROM CHK_1CHAR TO CHK_CRC OF ; 4978 2 SET ; 4979 2 ; 4980 2 [CHK_1CHAR] : ; 4981 2 ; 4982 2 IF .CHKSUM NEQ UNCHAR (CH$RCHAR_A (POINTER)) THEN STATUS = KER_CHKSUMERR; ; 4983 2 ; 4984 2 [CHK_2CHAR] : ; 4985 2 ; P 4986 3 IF (.CHKSUM<6, 6> NEQ UNCHAR (CH$RCHAR_A (POINTER))) OR (.CHKSUM<0, 6> NEQ UNCHAR ( ; 4987 3 CH$RCHAR_A (POINTER))) ; 4988 2 THEN ; 4989 2 STATUS = KER_CHKSUMERR; ; 4990 2 ; 4991 2 [CHK_CRC] : ; 4992 2 ; P 4993 3 IF (.CHKSUM<12, 4> NEQ UNCHAR (CH$RCHAR_A (POINTER))) OR (.CHKSUM<6, 6> NEQ UNCHAR ( ; 4994 3 CH$RCHAR_A (POINTER))) OR (.CHKSUM<0, 6> NEQ UNCHAR (CH$RCHAR_A (POINTER))) ; 4995 2 THEN ; 4996 2 STATUS = KER_CHKSUMERR; ; 4997 2 ; 4998 2 TES; ; 4999 2 ; 5000 2 ! ; 5001 2 ! If we have a bad checksum, check for the special cases when we might be out ; 5002 2 ! of sync with the sender. This can occur if the sender is retransmitting ; 5003 2 ! a send-init (because our ACK got lost), and we have agreed on multi-char ; 5004 2 ! checksums, or because the sender is a server who has aborted back to being ; 5005 2 ! idle without telling us. ; 5006 2 ! Note that in either case, we return back to using single character checksums ; 5007 2 ! ; 5008 2 ; 5009 2 IF .STATUS EQL KER_CHKSUMERR ; 5010 2 THEN ; 5011 3 BEGIN ; 5012 3 ; 5013 5 IF (.BLK_CHK_TYPE NEQ CHK_1CHAR AND .REC_SEQ EQL 0) AND (.REC_LENGTH LSS 1 - (.BLK_CHK_TYPE ; 5014 4 - CHK_1CHAR) AND .REC_TYPE EQL MSG_NAK) OR (.REC_TYPE EQL MSG_SND_INIT) ; 5015 3 THEN ; 5016 4 BEGIN ; 5017 4 ; 5018 4 LOCAL ; 5019 4 SAVE_BLK_CHK_TYPE; ; 5020 4 ; 5021 4 SAVE_BLK_CHK_TYPE = .BLK_CHK_TYPE; ! Remember what we are using ; 5022 4 BLK_CHK_TYPE = CHK_1CHAR; ; 5023 4 POINTER = CH$PTR (REC_MSG, PKT_MARK + 1, CHR_SIZE); ; 5024 4 CHKSUM = CALC_BLOCK_CHECK (.POINTER, .REC_LENGTH + PKT_OVR_HEAD); ; 5025 4 POINTER = CH$PTR (REC_MSG, .REC_LENGTH + PKT_OVR_HEAD + 1, CHR_SIZE); ; 5026 4 ; 5027 5 IF .CHKSUM NEQ UNCHAR (CH$RCHAR_A (POINTER)) ; 5028 4 THEN ; 5029 5 BEGIN ; 5030 5 BLK_CHK_TYPE = .SAVE_BLK_CHK_TYPE; ; 5031 5 RETURN KER_CHKSUMERR; ; 5032 4 END; ; 5033 4 ; 5034 4 END ; 5035 3 ELSE ; 5036 3 RETURN KER_CHKSUMERR; ; 5037 3 ; 5038 2 END; ; 5039 2 ; 5040 2 ! ; 5041 2 ! Update the stats ; 5042 2 ! ; 5043 2 ! RMSG_DATA_CHARS = .RMSG_DATA_CHARS + .REC_LENGTH; ; 5044 2 ; 5045 2 IF .REC_TYPE EQL MSG_NAK ; 5046 2 THEN ; 5047 3 BEGIN ; 5048 3 RMSG_NAKS = .RMSG_NAKS + 1; ; 5049 3 XFR_STATUS (%C'R', %C'N'); ; 5050 3 END ; 5051 2 ELSE ; 5052 3 BEGIN ; 5053 3 RMSG_COUNT = .RMSG_COUNT + 1; ; 5054 3 XFR_STATUS (%C'R', %C'P'); ; 5055 2 END; ; 5056 2 ; 5057 2 ! ; 5058 2 ! Now check to see if we have an E type (Error) packet. ; 5059 2 ! ; 5060 2 ; 5061 2 IF .REC_TYPE NEQ MSG_ERROR THEN RETURN KER_NORMAL; ; 5062 2 ; 5063 2 ! ; 5064 2 ! Here to process an error packet. Call the user routine to output the ; 5065 2 ! error message to the terminal. ; 5066 2 ! ; 5067 2 ! ; 5068 2 ![026] Use decoding routine to fetch the error text ; 5069 2 ! ; 5070 2 CH$FILL (CHR_NUL, MAX_MSG + 1, CH$PTR (LAST_ERROR)); ; 5071 2 SET_STRING (CH$PTR (LAST_ERROR), MAX_MSG, TRUE); ; 5072 2 BFR_EMPTY (); ; 5073 2 SET_STRING (0, 0, FALSE); ; 5074 2 ![026] ERR_POINTER = CH$PTR (LAST_ERROR); ; 5075 2 ![026] POINTER = CH$PTR (REC_MSG, PKT_MSG, CHR_SIZE); ; 5076 2 ![026] ; 5077 2 ![026] INCR I FROM 1 TO .REC_LENGTH DO ; 5078 2 ![026] CH$WCHAR_A (CH$RCHAR_A (POINTER), ERR_POINTER); ; 5079 2 ![026] ; 5080 2 ![026] CH$WCHAR (CHR_NUL, ERR_POINTER); ; 5081 2 TT_TEXT (LAST_ERROR); ; 5082 2 TT_CRLF (); ; 5083 2 RETURN KER_ERRMSG; ; 5084 1 END; ! End of REC_PACKET .PSECT $PLIT$,NOWRT,NOEXE,2 P.AAN: .ASCII \Attempting to receive\<0><0><0> ; ; U.80= P.AAN .PSECT $CODE$,NOWRT,2 ;REC_PACKET U.26: .WORD ^M ;Save R2,R3,R4,R5,R6,R7 ; 4834 MOVAB W^LAST_ERROR, R7 ;LAST_ERROR, R7 ; MOVAB W^U.56, R6 ;U.56, R6 ; SUBL2 #4, SP ;#4, SP ; BLBC W^DEBUG_FLAG, 1$ ;DEBUG_FLAG, 1$ ; 4892 PUSHAB W^DBG_DUMP ;DBG_DUMP ; 4899 CALLS #1, W^TT_SET_OUTPUT ;#1, TT_SET_OUTPUT ; MOVL R0, R2 ;R0, OLD_RTN ; PUSHAB W^U.80 ;U.80 ; 4900 CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 4901 PUSHL R2 ;OLD_RTN ; 4902 CALLS #1, W^TT_SET_OUTPUT ;#1, TT_SET_OUTPUT ; 1$: BLBC W^TYP_STS_FLAG, 2$ ;TYP_STS_FLAG, 2$ ; 4909 CALLS #0, W^U.33 ;#0, U.33 ; 4912 CLRL W^TYP_STS_FLAG ;TYP_STS_FLAG ; 4913 2$: PUSHL SP ;SP ; 4919 PUSHAB 4(R6) ;REC_MSG ; CALLS #2, W^RECEIVE ;#2, RECEIVE ; MOVL R0, R5 ;R0, STATUS ; CMPL R5, #134316248 ;STATUS, #134316248 ; 4924 BNEQ 3$ ;3$ ; MOVZBL #84, -(SP) ;#84, -(SP) ; MOVZBL #82, -(SP) ;#82, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; 3$: BLBS R5, 5$ ;STATUS, 5$ ; 4930 CMPL R5, #134316258 ;STATUS, #134316258 ; 4934 BEQL 4$ ;4$ ; CMPL R5, #134316248 ;STATUS, #134316248 ; BEQL 4$ ;4$ ; PUSHL R5 ;STATUS ; CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; 4$: MOVL R5, R0 ;STATUS, R0 ; 4937 RET ; ; 5$: CMPL (SP), #5 ;MSG_LENGTH, #5 ; 4944 BGEQ 6$ ;6$ ; MOVL #134316234, R0 ;#134316234, R0 ; 4947 RET ; ; 6$: ADDL2 (SP), W^RMSG_TOTAL_CHARS ;MSG_LENGTH, RMSG_TOTAL_CHARS ; 4953 MOVZBL 7(R6), (R6) ;REC_MSG+3, REC_TYPE ; 4957 MOVZBL 5(R6), R0 ;REC_MSG+1, R0 ; 4961 SUBL2 -40(R6), R0 ;BLK_CHK_TYPE, R0 ; MOVAB 14(R0), -4(R6) ;14(R0), REC_LENGTH ; MOVZBL 6(R6), -8(R6) ;REC_MSG+2, REC_SEQ ; 4963 SUBL2 #32, -8(R6) ;#32, REC_SEQ ; PUSHAB 4(R6) ;REC_MSG ; 4967 CALLS #1, W^U.36 ;#1, U.36 ; MOVAB 5(R6), R2 ;REC_MSG+1, POINTER ; 4972 ADDL3 #3, -4(R6), -(SP) ;#3, REC_LENGTH, -(SP) ; 4973 PUSHL R2 ;POINTER ; CALLS #2, W^U.19 ;#2, U.19 ; MOVL -4(R6), R1 ;REC_LENGTH, R1 ; 4974 MOVAB 8(R6)[R1], R2 ;REC_MSG+4[R1], POINTER ; MOVL #134316043, R5 ;#134316043, STATUS ; 4975 MOVL -40(R6), R4 ;BLK_CHK_TYPE, R4 ; 4977 CASEL R4, #49, #2 ;R4, #49, #2 ; 7$: .WORD 8$-7$,- ;8$-7$,- ; 10$-7$,- ;10$-7$,- ; 9$-7$ ;9$-7$ ; 8$: MOVZBL (R2)+, R3 ;(POINTER)+, R3 ; 4982 SUBL2 #32, R3 ;#32, R3 ; CMPL R0, R3 ;CHKSUM, R3 ; BRB 11$ ;11$ ; 9$: MOVZBL (R2)+, R3 ;(POINTER)+, R3 ; 4993 SUBL2 #32, R3 ;#32, R3 ; CMPZV #12, #4, R0, R3 ;#12, #4, CHKSUM, R3 ; BNEQ 12$ ;12$ ; 10$: MOVZBL (R2)+, R3 ;(POINTER)+, R3 ; 4994 SUBL2 #32, R3 ;#32, R3 ; CMPZV #6, #6, R0, R3 ;#6, #6, CHKSUM, R3 ; BNEQ 12$ ;12$ ; MOVZBL (R2)+, R3 ;(POINTER)+, R3 ; SUBL2 #32, R3 ;#32, R3 ; CMPZV #0, #6, R0, R3 ;#0, #6, CHKSUM, R3 ; 11$: BEQL 13$ ;13$ ; 12$: MOVL #134316178, R5 ;#134316178, STATUS ; 4996 13$: CMPL R5, #134316178 ;STATUS, #134316178 ; 5009 BNEQ 17$ ;17$ ; CMPL R4, #49 ;R4, #49 ; 5013 BEQL 14$ ;14$ ; TSTL -8(R6) ;REC_SEQ ; BNEQ 14$ ;14$ ; MOVAB -50(R4), R3 ;-50(R4), R3 ; MNEGL R3, R3 ;R3, R3 ; CMPL R1, R3 ;R1, R3 ; BGEQ 14$ ;14$ ; CMPL (R6), #78 ;REC_TYPE, #78 ; 5014 BEQL 15$ ;15$ ; 14$: CMPL (R6), #83 ;REC_TYPE, #83 ; BNEQ 16$ ;16$ ; 15$: MOVL R4, R3 ;R4, SAVE_BLK_CHK_TYPE ; 5021 MOVL #49, -40(R6) ;#49, BLK_CHK_TYPE ; 5022 MOVAB 5(R6), R2 ;REC_MSG+1, POINTER ; 5023 PUSHAB 3(R1) ;3(R1) ; 5024 PUSHL R2 ;POINTER ; CALLS #2, W^U.19 ;#2, U.19 ; MOVAB 4(R6), R1 ;REC_MSG, R1 ; 5025 ADDL2 -4(R6), R1 ;REC_LENGTH, R1 ; MOVAB 4(R1), R2 ;4(R1), POINTER ; MOVZBL (R2)+, R1 ;(POINTER)+, R1 ; 5027 SUBL2 #32, R1 ;#32, R1 ; CMPL R0, R1 ;CHKSUM, R1 ; BEQL 17$ ;17$ ; MOVL R3, -40(R6) ;SAVE_BLK_CHK_TYPE, BLK_CHK_TYPE ; 5030 16$: MOVL #134316178, R0 ;#134316178, R0 ; 5036 RET ; ; 17$: CMPL (R6), #78 ;REC_TYPE, #78 ; 5045 BNEQ 18$ ;18$ ; INCL W^RMSG_NAKS ;RMSG_NAKS ; 5048 MOVZBL #78, -(SP) ;#78, -(SP) ; 5049 BRB 19$ ;19$ ; 18$: INCL W^RMSG_COUNT ;RMSG_COUNT ; 5053 MOVZBL #80, -(SP) ;#80, -(SP) ; 5054 19$: MOVZBL #82, -(SP) ;#82, -(SP) ; CALLS #2, W^XFR_STATUS ;#2, XFR_STATUS ; CMPL (R6), #69 ;REC_TYPE, #69 ; 5061 BEQL 20$ ;20$ ; MOVL #134316043, R0 ;#134316043, R0 ; RET ; ; 20$: MOVC5 #0, (SP), #0, #97, (R7) ;#0, (SP), #0, #97, LAST_ERROR ; 5070 PUSHL #1 ;#1 ; 5071 MOVZBL #96, -(SP) ;#96, -(SP) ; PUSHL R7 ;R7 ; CALLS #3, W^U.30 ;#3, U.30 ; CALLS #0, W^U.28 ;#0, U.28 ; 5072 CLRQ -(SP) ;-(SP) ; 5073 CLRL -(SP) ;-(SP) ; CALLS #3, W^U.30 ;#3, U.30 ; PUSHL R7 ;R7 ; 5081 CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 5082 MOVL #134316170, R0 ;#134316170, R0 ; 5083 RET ; ; 5084 ; Routine Size: 502 bytes, Routine Base: $CODE$ + 194B ; 5085 1 %SBTTL 'CALC_BLOCK_CHECK' ; 5086 1 ROUTINE CALC_BLOCK_CHECK (POINTER, LENGTH) = ; 5087 1 ; 5088 1 !++ ; 5089 1 ! FUNCTIONAL DESCRIPTION: ; 5090 1 ! ; 5091 1 ! This routine will calculate the proper value for the block check ; 5092 1 ! for a given message. The value it returns is dependant upon the ; 5093 1 ! type of block check requested in BLK_CHK_TYPE. ; 5094 1 ! ; 5095 1 ! CALLING SEQUENCE: ; 5096 1 ! ; 5097 1 ! CHKSUM = CALC_BLOCK_CHECK (.POINTER, .LENGTH); ; 5098 1 ! ; 5099 1 ! INPUT PARAMETERS: ; 5100 1 ! ; 5101 1 ! POINTER - A character pointer to the first character to be ; 5102 1 ! included in the block check. ; 5103 1 ! ; 5104 1 ! LENGTH - The number of characters to be included. ; 5105 1 ! ; 5106 1 ! IMPLICIT INPUTS: ; 5107 1 ! ; 5108 1 ! BLK_CHK_TYPE - The type of block check to generate. ; 5109 1 ! ; 5110 1 ! OUPTUT PARAMETERS: ; 5111 1 ! ; 5112 1 ! The value is the block check. ; 5113 1 ! ; 5114 1 ! IMPLICIT OUTPUTS: ; 5115 1 ! ; 5116 1 ! None. ; 5117 1 ! ; 5118 1 ! COMPLETION CODES: ; 5119 1 ! ; 5120 1 ! None. ; 5121 1 ! ; 5122 1 ! SIDE EFFECTS: ; 5123 1 ! ; 5124 1 ! None. ; 5125 1 ! ; 5126 1 !-- ; 5127 1 ; 5128 2 BEGIN ; 5129 2 ; 5130 2 LOCAL ; 5131 2 CHAR_MASK, ! Mask for stripping bits ; 5132 2 BLOCK_CHECK; ! To build initial block check value ; 5133 2 ; 5134 2 BLOCK_CHECK = 0; ! Start out at 0 ; 5135 2 ! ; 5136 2 ! Set mask for characters so that we calculate the block check correctly ; 5137 2 ! ; 5138 2 CHAR_MASK = (IF .PARITY_TYPE EQL PR_NONE THEN %O'377' ELSE %O'177'); ; 5139 2 ; 5140 2 CASE .BLK_CHK_TYPE FROM CHK_1CHAR TO CHK_CRC OF ; 5141 2 SET ; 5142 2 ; 5143 2 [CHK_1CHAR, CHK_2CHAR] : ; 5144 2 ; 5145 2 INCR I FROM 1 TO .LENGTH DO ; 5146 2 BLOCK_CHECK = .BLOCK_CHECK + (CH$RCHAR_A (POINTER) AND .CHAR_MASK); ; 5147 2 ; 5148 2 [CHK_CRC] : ; 5149 3 BEGIN ; 5150 3 ! ; 5151 3 ! Ensure that the calculation is done with correct type of characters ; 5152 3 ! ; 5153 3 ; 5154 3 LOCAL ; 5155 3 TMP_PTR; ! Temp pointer for copying chars ; 5156 3 ; 5157 3 TMP_PTR = .POINTER; ; 5158 3 ; 5159 3 IF .PARITY_TYPE NEQ PR_NONE ; 5160 3 THEN ; 5161 3 ; 5162 3 INCR I FROM 1 TO .LENGTH DO ; 5163 3 CH$WCHAR_A ((CH$RCHAR (.TMP_PTR) AND %O'177'), TMP_PTR); ; 5164 3 ; 5165 3 BLOCK_CHECK = CRCCLC (.POINTER, .LENGTH); ; 5166 2 END; ; 5167 2 TES; ; 5168 2 ; 5169 2 IF .BLK_CHK_TYPE EQL CHK_1CHAR ; 5170 2 THEN ; 5171 2 BLOCK_CHECK = (.BLOCK_CHECK + ((.BLOCK_CHECK AND %O'300')/%O'100')) AND %O'77'; ; 5172 2 ; 5173 2 RETURN .BLOCK_CHECK; ! Return the correct value ; 5174 1 END; ! End of CALC_BLOCK_CHK ;CALC_BLOCK_CHECK U.19: .WORD ^M ;Save R2,R3,R4 ; 5086 CLRL R3 ;BLOCK_CHECK ; 5134 MOVL W^PARITY_TYPE, R1 ;PARITY_TYPE, R1 ; 5138 BNEQ 1$ ;1$ ; MOVZBL #255, R2 ;#255, CHAR_MASK ; BRB 2$ ;2$ ; 1$: MOVZBL #127, R2 ;#127, CHAR_MASK ; 2$: CASEL W^U.46, #49, #2 ;U.46, #49, #2 ; 5140 3$: .WORD 4$-3$,- ;4$-3$,- ; 4$-3$,- ;4$-3$,- ; 7$-3$ ;7$-3$ ; 4$: CLRL R0 ;I ; 5145 BRB 6$ ;6$ ; 5$: MOVZBL @4(AP), R1 ;@POINTER, R1 ; 5146 INCL 4(AP) ;POINTER ; MCOML R2, R4 ;CHAR_MASK, R4 ; BICL2 R4, R1 ;R4, R1 ; ADDL2 R1, R3 ;R1, BLOCK_CHECK ; 6$: AOBLEQ 8(AP), R0, 5$ ;LENGTH, I, 5$ ; BRB 11$ ;11$ ; 5145 7$: MOVL 4(AP), R2 ;POINTER, TMP_PTR ; 5157 TSTL R1 ;R1 ; 5159 BEQL 10$ ;10$ ; CLRL R0 ;I ; 5163 BRB 9$ ;9$ ; 8$: EXTZV #0, #7, (R2), R1 ;#0, #7, (TMP_PTR), R1 ; MOVB R1, (R2)+ ;R1, (TMP_PTR)+ ; 9$: AOBLEQ 8(AP), R0, 8$ ;LENGTH, I, 8$ ; 10$: MOVQ 4(AP), -(SP) ;POINTER, -(SP) ; 5165 CALLS #2, W^CRCCLC ;#2, CRCCLC ; MOVL R0, R3 ;R0, BLOCK_CHECK ; 11$: CMPL W^U.46, #49 ;U.46, #49 ; 5169 BNEQ 12$ ;12$ ; BICL3 #-193, R3, R0 ;#-193, BLOCK_CHECK, R0 ; 5171 DIVL2 #64, R0 ;#64, R0 ; ADDL2 R3, R0 ;BLOCK_CHECK, R0 ; EXTZV #0, #6, R0, R3 ;#0, #6, R0, BLOCK_CHECK ; 12$: MOVL R3, R0 ;BLOCK_CHECK, R0 ; 5173 RET ; ; 5174 ; Routine Size: 131 bytes, Routine Base: $CODE$ + 1B41 ; 5175 1 %SBTTL 'NORMALIZE_FILE - Put file name into normal form' ; 5176 1 ROUTINE NORMALIZE_FILE (FILE_ADDRESS, FILE_LENGTH, NAME_LENGTH, TYPE_LENGTH) : NOVALUE = ; 5177 1 ; 5178 1 !++ ; 5179 1 ! FUNCTIONAL DESCRIPTION: ; 5180 1 ! ; 5181 1 ! This routine will ensure that a file specification is in normal ; 5182 1 ! form. It does this by replacing all non-alphanumeric characters ; 5183 1 ! (except the first period) with "X". It will also ensure that ; 5184 1 ! the resulting specification (of form name.type) has only ; 5185 1 ! a specified number of characters in the name portion and type portion. ; 5186 1 ! ; 5187 1 ! CALLING SEQUENCE: ; 5188 1 ! ; 5189 1 ! NORMALIZE_FILE (FILE_ADDRESS, FILE_LENGTH, NAME_LENGTH, TYPE_LENGTH); ; 5190 1 ! ; 5191 1 ! INPUT PARAMETERS: ; 5192 1 ! ; 5193 1 ! FILE_ADDRESS - Address of file specification string to be normalized ; 5194 1 ! ; 5195 1 ! FILE_LENGTH - Length of file specification ; 5196 1 ! ; 5197 1 ! NAME_LENGTH - Maximum length desired for "name" portion. ; 5198 1 ! ; 5199 1 ! TYPE_LENGTH - Maximum length desired for "type" portion. ; 5200 1 ! ; 5201 1 ! With both NAME_LENGTH and TYPE_LENGTH, a negative value indicates ; 5202 1 ! unlimited lenght. ; 5203 1 ! ; 5204 1 ! IMPLICIT INPUTS: ; 5205 1 ! ; 5206 1 ! None. ; 5207 1 ! ; 5208 1 ! OUPTUT PARAMETERS: ; 5209 1 ! ; 5210 1 ! FILE_LENGTH - The length of the resulting file spec ; 5211 1 ! ; 5212 1 ! NAME_LENGTH - The actual length of the resulting file name ; 5213 1 ! ; 5214 1 ! TYPE_LENGTH - The actual length of the resulting file type ; 5215 1 ! ; 5216 1 ! IMPLICIT OUTPUTS: ; 5217 1 ! ; 5218 1 ! None. ; 5219 1 ! ; 5220 1 ! COMPLETION CODES: ; 5221 1 ! ; 5222 1 ! None. ; 5223 1 ! ; 5224 1 ! SIDE EFFECTS: ; 5225 1 ! ; 5226 1 ! None. ; 5227 1 ! ; 5228 1 !-- ; 5229 1 ; 5230 2 BEGIN ; 5231 2 ; 5232 2 LOCAL ; 5233 2 CH, ! Character being processed ; 5234 2 POINTER, ! Pointer to file spec ; 5235 2 WRT_POINTER, ! Pointer to write file spec ; 5236 2 WRT_SIZE, ; 5237 2 FIRST_PERIOD, ! Flag we have seen a period ; 5238 2 IGNORE_BAD, ! Flag we should ignore bad characters ; 5239 2 BAD_CHAR, ! Flag this character was bad ; 5240 2 FILE_CTR, ! Counter for overall length ; 5241 2 NAME_CTR, ! Counter for name characters ; 5242 2 TYPE_CTR; ! Counter for type characters ; 5243 2 ; 5244 2 FILE_CTR = 0; ; 5245 2 NAME_CTR = 0; ; 5246 2 TYPE_CTR = 0; ; 5247 2 WRT_SIZE = 0; ; 5248 2 FIRST_PERIOD = FALSE; ! No periods yet ; 5249 2 POINTER = CH$PTR (.FILE_ADDRESS); ! Set up pointer to file name ; 5250 2 WRT_POINTER = .POINTER; ; 5251 2 ; 5252 2 IF .NAME_LENGTH EQL 0 THEN FIRST_PERIOD = TRUE; ! Pretend we did name already ; 5253 2 ; 5254 2 IGNORE_BAD = FALSE; ; 5255 2 ; 5256 2 IF .NAME_LENGTH GTR 0 ; 5257 2 THEN ; 5258 3 BEGIN ; 5259 3 ; 5260 3 DECR I FROM ..FILE_LENGTH TO 0 DO ; 5261 3 ; 5262 3 IF CH$RCHAR_A (POINTER) EQL %C'.' ; 5263 3 THEN ; 5264 4 BEGIN ; 5265 4 IGNORE_BAD = TRUE; ; 5266 4 EXITLOOP; ; 5267 3 END; ; 5268 3 ; 5269 2 END; ; 5270 2 ; 5271 2 POINTER = .WRT_POINTER; ; 5272 2 ; 5273 2 WHILE .FILE_CTR LSS ..FILE_LENGTH DO ; 5274 3 BEGIN ; 5275 3 CH = CH$RCHAR_A (POINTER); ! Get a character ; 5276 3 FILE_CTR = .FILE_CTR + 1; ; 5277 3 ; 5278 4 IF (.CH LSS %C'0' AND (.CH NEQ %C'.' OR .FIRST_PERIOD)) OR .CH GTR %C'z' OR (.CH GTR %C'9' ; 5279 4 AND .CH LSS %C'A') OR (.CH GTR %C'Z' AND .CH LSS %C'a') ; 5280 3 THEN ; 5281 4 BEGIN ; 5282 4 BAD_CHAR = TRUE; ; 5283 4 CH = %C'X'; ; 5284 4 END ; 5285 3 ELSE ; 5286 4 BEGIN ; 5287 4 BAD_CHAR = FALSE; ; 5288 4 ; 5289 4 IF .CH GEQ %C'a' THEN CH = .CH - (%C'a' - %C'A'); ; 5290 4 ; 5291 3 END; ; 5292 3 ; 5293 3 IF .CH EQL %C'.' ; 5294 3 THEN ; 5295 4 BEGIN ; 5296 4 FIRST_PERIOD = TRUE; ; 5297 4 CH$WCHAR_A (.CH, WRT_POINTER); ; 5298 4 WRT_SIZE = .WRT_SIZE + 1; ; 5299 4 END ; 5300 3 ELSE ; 5301 3 ; 5302 3 IF NOT .BAD_CHAR OR NOT .IGNORE_BAD ; 5303 3 THEN ; 5304 3 ; 5305 3 IF NOT .FIRST_PERIOD ; 5306 3 THEN ; 5307 4 BEGIN ; 5308 4 ; 5309 4 IF .NAME_LENGTH LSS 0 OR .NAME_CTR LSS .NAME_LENGTH ; 5310 4 THEN ; 5311 5 BEGIN ; 5312 5 NAME_CTR = .NAME_CTR + 1; ; 5313 5 WRT_SIZE = .WRT_SIZE + 1; ; 5314 5 CH$WCHAR_A (.CH, WRT_POINTER); ; 5315 4 END; ; 5316 4 ; 5317 4 END ; 5318 3 ELSE ; 5319 3 ; 5320 3 IF .TYPE_LENGTH LSS 0 OR .TYPE_CTR LSS .TYPE_LENGTH ; 5321 3 THEN ; 5322 4 BEGIN ; 5323 4 TYPE_CTR = .TYPE_CTR + 1; ; 5324 4 WRT_SIZE = .WRT_SIZE + 1; ; 5325 4 CH$WCHAR_A (.CH, WRT_POINTER); ; 5326 3 END; ; 5327 3 ; 5328 2 END; ; 5329 2 ; 5330 2 .FILE_LENGTH = .WRT_SIZE; ; 5331 2 CH$WCHAR_A (CHR_NUL, WRT_POINTER); ; 5332 1 END; ! End of NORMALIZE_FILE ;NORMALIZE_FILE U.27: .WORD ^M ;Save R2,R3,R4,R5,R6,R7,R8,R9,R10 ; 5176 CLRQ R8 ;NAME_CTR ; 5245 CLRL R7 ;TYPE_CTR ; 5246 CLRQ R4 ;FIRST_PERIOD ; 5248 MOVL 4(AP), R6 ;FILE_ADDRESS, POINTER ; 5249 MOVL R6, R1 ;POINTER, WRT_POINTER ; 5250 MOVL 12(AP), R3 ;NAME_LENGTH, R3 ; 5252 BNEQ 1$ ;1$ ; MOVL #1, R4 ;#1, FIRST_PERIOD ; 1$: CLRL R10 ;IGNORE_BAD ; 5254 TSTL R3 ;R3 ; 5256 BLEQ 4$ ;4$ ; ADDL3 #1, @8(AP), R0 ;#1, @FILE_LENGTH, I ; 5260 BRB 3$ ;3$ ; 2$: MOVZBL (R6)+, R2 ;(POINTER)+, R2 ; 5262 CMPB R2, #46 ;R2, #46 ; BNEQ 3$ ;3$ ; MOVL #1, R10 ;#1, IGNORE_BAD ; 5265 BRB 4$ ;4$ ; 3$: SOBGEQ R0, 2$ ;I, 2$ ; 5264 4$: MOVL R1, R6 ;WRT_POINTER, POINTER ; 5271 5$: CMPL R9, @8(AP) ;FILE_CTR, @FILE_LENGTH ; 5273 BLSS 6$ ;6$ ; BRW 19$ ;19$ ; 6$: MOVZBL (R6)+, R0 ;(POINTER)+, CH ; 5275 INCL R9 ;FILE_CTR ; 5276 CMPL R0, #48 ;CH, #48 ; 5278 BGEQ 7$ ;7$ ; CMPL R0, #46 ;CH, #46 ; BNEQ 9$ ;9$ ; BLBS R4, 9$ ;FIRST_PERIOD, 9$ ; 7$: CMPL R0, #122 ;CH, #122 ; BGTR 9$ ;9$ ; CMPL R0, #57 ;CH, #57 ; BLEQ 8$ ;8$ ; CMPL R0, #65 ;CH, #65 ; 5279 BLSS 9$ ;9$ ; 8$: CMPL R0, #90 ;CH, #90 ; BLEQ 10$ ;10$ ; CMPL R0, #97 ;CH, #97 ; BGEQ 10$ ;10$ ; 9$: MOVL #1, R2 ;#1, BAD_CHAR ; 5282 MOVZBL #88, R0 ;#88, CH ; 5283 BRB 11$ ;11$ ; 10$: CLRL R2 ;BAD_CHAR ; 5287 CMPL R0, #97 ;CH, #97 ; 5289 BLSS 11$ ;11$ ; SUBL2 #32, R0 ;#32, CH ; 11$: CMPL R0, #46 ;CH, #46 ; 5293 BNEQ 13$ ;13$ ; MOVL #1, R4 ;#1, FIRST_PERIOD ; 5296 MOVB R0, (R1)+ ;CH, (WRT_POINTER)+ ; 5297 INCL R5 ;WRT_SIZE ; 5298 12$: BRB 5$ ;5$ ; 13$: BLBC R2, 14$ ;BAD_CHAR, 14$ ; 5302 BLBS R10, 5$ ;IGNORE_BAD, 5$ ; 14$: BLBS R4, 16$ ;FIRST_PERIOD, 16$ ; 5305 TSTL R3 ;R3 ; 5309 BLSS 15$ ;15$ ; CMPL R8, R3 ;NAME_CTR, R3 ; BGEQ 5$ ;5$ ; 15$: INCL R8 ;NAME_CTR ; 5312 BRB 18$ ;18$ ; 5313 16$: TSTL 16(AP) ;TYPE_LENGTH ; 5320 BLSS 17$ ;17$ ; CMPL R7, 16(AP) ;TYPE_CTR, TYPE_LENGTH ; BGEQ 12$ ;12$ ; 17$: INCL R7 ;TYPE_CTR ; 5323 18$: INCL R5 ;WRT_SIZE ; 5324 MOVB R0, (R1)+ ;CH, (WRT_POINTER)+ ; 5325 BRB 12$ ;12$ ; 19$: MOVL R5, @8(AP) ;WRT_SIZE, @FILE_LENGTH ; 5330 CLRB (R1)+ ;(WRT_POINTER)+ ; 5331 RET ; ; 5332 ; Routine Size: 211 bytes, Routine Base: $CODE$ + 1BC4 ; 5333 1 %SBTTL 'Buffer filling -- Main routine' ; 5334 1 ROUTINE BFR_FILL (FIRST_FLAG) = ; 5335 1 ; 5336 1 !++ ; 5337 1 ! FUNCTIONAL DESCRIPTION: ; 5338 1 ! ; 5339 1 ! This routine will fill the buffer with data from the file. It ; 5340 1 ! will do all the quoting that is required. ; 5341 1 ! ; 5342 1 ! CALLING SEQUENCE: ; 5343 1 ! ; 5344 1 ! EOF_FLAG = BFR_FILL(.FIRST_FLAG); ; 5345 1 ! ; 5346 1 ! INPUT PARAMETERS: ; 5347 1 ! ; 5348 1 ! FIRST_FLAG - Flag whether first call for this file ; 5349 1 ! ; 5350 1 ! IMPLICIT INPUTS: ; 5351 1 ! ; 5352 1 ! None. ; 5353 1 ! ; 5354 1 ! OUTPUT PARAMETERS: ; 5355 1 ! ; 5356 1 ! True - Buffer filled may be at end of file. ; 5357 1 ! False - At end of file. ; 5358 1 ! ; 5359 1 ! IMPLICIT OUTPUTS: ; 5360 1 ! ; 5361 1 ! Number of characters stored in the buffer. ; 5362 1 ! ; 5363 1 ! COMPLETION CODES: ; 5364 1 ! ; 5365 1 ! None. ; 5366 1 ! ; 5367 1 ! SIDE EFFECTS: ; 5368 1 ! ; 5369 1 ! None. ; 5370 1 ! ; 5371 1 !-- ; 5372 1 ; 5373 2 BEGIN ; 5374 2 ; 5375 2 LITERAL ; 5376 2 NO_CHAR = -1, ! No character next ; 5377 2 EOF_CHAR = -2; ! EOF seen ; 5378 2 ; 5379 2 LOCAL ; 5380 2 I, ! Temp loop index ; 5381 2 MAX_SIZE, ! Maximum size of data ; 5382 2 POINTER; ! Pointer into the message buffer ; 5383 2 ; 5384 2 OWN ; 5385 2 NEXT_CHR, ! Saved character ; 5386 2 STATUS, ! Status value ; 5387 2 REPEAT_COUNT, ! Number of times character repeated ; 5388 2 CHAR_8_BIT, ! 8 bit character from file ; 5389 2 CHRS : VECTOR [5], ! String needed to represent character ; 5390 2 CHR_IDX, ! Index into CHRS ; 5391 2 OLD_CHAR_8_BIT, ! Previous 8-bit character ; 5392 2 OLD_CHRS : VECTOR [5], ! String for previous character ; 5393 2 OLD_CHR_IDX; ! Index for previous character ; 5394 2 ; 5395 2 ROUTINE GET_QUOTED_CHAR = ; 5396 2 ! ; 5397 2 ! This routine gets a character from the file and returns both ; 5398 2 ! the character and the string needed to represent the character ; 5399 2 ! if it needs quoting. ; 5400 2 ! ; 5401 3 BEGIN ; 5402 3 ; 5403 3 IF .NEXT_CHR GEQ 0 ; 5404 3 THEN ; 5405 4 BEGIN ; 5406 4 CHAR_8_BIT = .NEXT_CHR; ; 5407 4 NEXT_CHR = NO_CHAR; ; 5408 4 STATUS = KER_NORMAL; ; 5409 4 END ; 5410 3 ELSE ; 5411 3 ; 5412 3 IF .NEXT_CHR EQL NO_CHAR ; 5413 3 THEN ; 5414 3 STATUS = (.GET_CHR_ROUTINE) (CHAR_8_BIT) ; 5415 3 ELSE ; 5416 3 STATUS = KER_EOF; ; 5417 3 ; 5418 3 IF .STATUS EQL KER_NORMAL ; 5419 3 THEN ; 5420 4 BEGIN ; 5421 4 ! ; 5422 4 ! Determine if we should just quote the character ; 5423 4 ! Either: ; 5424 4 ! Character is a delete (177 octal) ; 5425 4 ! or Character is a control character (less than 40 octal) ; 5426 4 ! or Character is a quote character ; 5427 4 ! or Character is the repeat character and doing repeat compression ; 5428 4 ! or Character is an eight bit quote character and doing eight bit ; 5429 4 ! quoting. ; 5430 4 ! ; 5431 4 ; 5432 5 IF ((.CHAR_8_BIT AND %O'177') LSS %C' ') OR ((.CHAR_8_BIT AND %O'177') EQL CHR_DEL) OR ( ; 5433 7 (.CHAR_8_BIT AND %O'177') EQL .RCV_QUOTE_CHR) OR (.FLAG_REPEAT AND ((.CHAR_8_BIT AND ; 5434 6 %O'177') EQL .REPT_CHR)) OR (.FLAG_8QUOTE AND ((.CHAR_8_BIT AND %O'177') EQL ; 5435 5 .SEND_8QUOTE_CHR)) ; 5436 4 THEN ; 5437 5 BEGIN ; 5438 5 ! ; 5439 5 ! If the character is a control character or delete we must do a CTL(Character) ; 5440 5 ! so it is something that we can be sure we can send. ; 5441 5 ! ; 5442 5 ; 5443 6 IF ((.CHAR_8_BIT AND %O'177') LSS %C' ') OR ((.CHAR_8_BIT AND %O'177') EQL CHR_DEL) ; 5444 5 THEN ; 5445 6 CHRS [0] = CTL (.CHAR_8_BIT) ; 5446 5 ELSE ; 5447 5 CHRS [0] = .CHAR_8_BIT; ; 5448 5 ; 5449 5 CHR_IDX = 1; ; 5450 5 CHRS [1] = .RCV_QUOTE_CHR; ![035] Use character we said we would send ; 5451 5 END ; 5452 4 ELSE ; 5453 5 BEGIN ; 5454 5 CHR_IDX = 0; ; 5455 5 CHRS [0] = .CHAR_8_BIT; ; 5456 4 END; ; 5457 4 ; 5458 4 END ; 5459 3 ELSE ; 5460 3 ; 5461 3 IF .STATUS NEQ KER_EOF THEN KRM_ERROR (.STATUS); ! Report error ; 5462 3 ; 5463 3 RETURN .STATUS; ; 5464 2 END; .PSECT $OWN$,NOEXE,2 ;NEXT_CHR U.81: .BLKB 4 ;STATUS U.82: .BLKB 4 ;REPEAT_COUNT U.83: .BLKB 4 ;CHAR_8_BIT U.84: .BLKB 4 ;CHRS U.85: .BLKB 20 ;CHR_IDX U.86: .BLKB 4 ;OLD_CHAR_8_BIT U.87: .BLKB 4 ;OLD_CHRS U.88: .BLKB 20 ;OLD_CHR_IDX U.89: .BLKB 4 .PSECT $CODE$,NOWRT,2 ;GET_QUOTED_CHAR U.90: .WORD ^M ;Save R2 ; 5395 MOVAB W^U.82, R2 ;U.82, R2 ; MOVL -4(R2), R0 ;NEXT_CHR, R0 ; 5403 BLSS 1$ ;1$ ; MOVL R0, 8(R2) ;R0, CHAR_8_BIT ; 5406 MNEGL #1, -4(R2) ;#1, NEXT_CHR ; 5407 MOVL #134316043, (R2) ;#134316043, STATUS ; 5408 BRB 3$ ;3$ ; 1$: CMPL R0, #-1 ;R0, #-1 ; 5412 BNEQ 2$ ;2$ ; PUSHAB 8(R2) ;CHAR_8_BIT ; 5414 CALLS #1, @-12(R2) ;#1, @GET_CHR_ROUTINE ; MOVL R0, (R2) ;R0, STATUS ; BRB 3$ ;3$ ; 2$: MOVL #134316131, (R2) ;#134316131, STATUS ; 5416 3$: MOVL (R2), R0 ;STATUS, R0 ; 5418 CMPL R0, #134316043 ;R0, #134316043 ; BNEQ 11$ ;11$ ; MOVL 8(R2), R1 ;CHAR_8_BIT, R1 ; 5432 CLRL R0 ;R0 ; CMPZV #0, #7, R1, #32 ;#0, #7, R1, #32 ; BGEQ 4$ ;4$ ; INCL R0 ;R0 ; BRB 6$ ;6$ ; 4$: CMPZV #0, #7, R1, #127 ;#0, #7, R1, #127 ; BEQL 6$ ;6$ ; CMPZV #0, #7, R1, W^RCV_QUOTE_CHR ;#0, #7, R1, RCV_QUOTE_CHR ; 5433 BEQL 6$ ;6$ ; BLBC -272(R2), 5$ ;FLAG_REPEAT, 5$ ; CMPZV #0, #7, R1, -312(R2) ;#0, #7, R1, REPT_CHR ; 5434 BEQL 6$ ;6$ ; 5$: BLBC -276(R2), 10$ ;FLAG_8QUOTE, 10$ ; CMPZV #0, #7, R1, -288(R2) ;#0, #7, R1, SEND_8QUOTE_CHR ; 5435 BNEQ 10$ ;10$ ; 6$: BLBS R0, 7$ ;R0, 7$ ; 5443 CMPZV #0, #7, R1, #127 ;#0, #7, R1, #127 ; BNEQ 8$ ;8$ ; 7$: XORL3 #64, R1, 12(R2) ;#64, R1, CHRS ; 5445 BRB 9$ ;9$ ; 8$: MOVL R1, 12(R2) ;R1, CHRS ; 5447 9$: MOVL #1, 32(R2) ;#1, CHR_IDX ; 5449 MOVL W^RCV_QUOTE_CHR, 16(R2) ;RCV_QUOTE_CHR, CHRS+4 ; 5450 BRB 12$ ;12$ ; 10$: CLRL 32(R2) ;CHR_IDX ; 5454 MOVL R1, 12(R2) ;R1, CHRS ; 5455 BRB 12$ ;12$ ; 11$: CMPL R0, #134316131 ;R0, #134316131 ; 5461 BEQL 12$ ;12$ ; PUSHL R0 ;R0 ; CALLS #1, W^KRM_ERROR ;#1, KRM_ERROR ; 12$: MOVL (R2), R0 ;STATUS, R0 ; 5463 RET ; ; 5464 ; Routine Size: 205 bytes, Routine Base: $CODE$ + 1C97 ; 5465 2 ROUTINE GET_8_QUOTED_CHAR = ; 5466 2 ! ; 5467 2 ! This routine will get the quoted representation of a character ; 5468 2 ! (by calling GET_QUOTED_CHAR), and return the 8th-bit quoted ; 5469 2 ! representation. ; 5470 2 ! ; 5471 3 BEGIN ; 5472 3 ; 5473 3 IF (STATUS = GET_QUOTED_CHAR ()) EQL KER_NORMAL ; 5474 3 THEN ; 5475 4 BEGIN ; 5476 4 ! ; 5477 4 ! Determine if we must quote the eighth bit (parity bit on) ; 5478 4 ! ; 5479 4 ; 5480 5 IF (((.CHRS [0] AND %O'177') NEQ .CHRS [0]) AND .FLAG_8QUOTE) ; 5481 4 THEN ; 5482 5 BEGIN ; 5483 5 CHRS [0] = .CHRS [0] AND %O'177'; ; 5484 5 CHR_IDX = .CHR_IDX + 1; ; 5485 5 CHRS [.CHR_IDX] = .SEND_8QUOTE_CHR; ; 5486 4 END; ; 5487 4 ; 5488 3 END; ; 5489 3 ; 5490 3 RETURN .STATUS; ; 5491 2 END; ;GET_8_QUOTED_CHAR U.91: .WORD ^M ;Save R2 ; 5465 MOVAB W^U.85, R2 ;U.85, R2 ; CALLS #0, W^U.90 ;#0, U.90 ; 5473 MOVL R0, -12(R2) ;R0, STATUS ; CMPL R0, #134316043 ;R0, #134316043 ; BNEQ 1$ ;1$ ; CMPZV #0, #7, (R2), (R2) ;#0, #7, CHRS, CHRS ; 5480 BEQL 1$ ;1$ ; BLBC -288(R2), 1$ ;FLAG_8QUOTE, 1$ ; EXTZV #0, #7, (R2), (R2) ;#0, #7, CHRS, CHRS ; 5483 INCL 20(R2) ;CHR_IDX ; 5484 MOVL 20(R2), R0 ;CHR_IDX, R0 ; 5485 MOVL -300(R2), (R2)[R0] ;SEND_8QUOTE_CHR, CHRS[R0] ; 1$: MOVL -12(R2), R0 ;STATUS, R0 ; 5490 RET ; ; 5491 ; Routine Size: 60 bytes, Routine Base: $CODE$ + 1D64 ; 5492 2 ! ; 5493 2 ! Start of code for BFR_FILL ; 5494 2 ! ; 5495 2 ! Initialize pointer and count ; 5496 2 ! ; 5497 2 SIZE = 0; ; 5498 2 POINTER = CH$PTR (SND_MSG, PKT_MSG, CHR_SIZE); ; 5499 2 MAX_SIZE = .SEND_PKT_SIZE - PKT_OVR_HEAD - (.BLK_CHK_TYPE - CHK_1CHAR); ; 5500 2 ! ; 5501 2 ! If last call got an error or eof, return it now ; 5502 2 ! ; 5503 2 ; 5504 2 IF NOT .FIRST_FLAG AND (.STATUS NEQ KER_NORMAL) THEN RETURN .STATUS; ; 5505 2 ; 5506 2 ! ; 5507 2 ! If first time for a file prime the pump with the first character. ; 5508 2 ! ; 5509 2 ; 5510 2 IF .FIRST_FLAG ; 5511 2 THEN ; 5512 3 BEGIN ; 5513 3 FIRST_FLAG = FALSE; ; 5514 3 NEXT_CHR = -1; ! No backed up character ; 5515 3 ; 5516 3 IF .FLAG_8QUOTE THEN STATUS = GET_8_QUOTED_CHAR () ELSE STATUS = GET_QUOTED_CHAR (); ; 5517 3 ; 5518 3 IF .STATUS NEQ KER_NORMAL THEN RETURN .STATUS; ; 5519 3 ; 5520 3 OLD_CHAR_8_BIT = .CHAR_8_BIT; ; 5521 3 ; 5522 3 INCR OLD_CHR_IDX FROM 0 TO .CHR_IDX DO ; 5523 3 OLD_CHRS [.OLD_CHR_IDX] = .CHRS [.OLD_CHR_IDX]; ; 5524 3 ; 5525 3 OLD_CHR_IDX = .CHR_IDX; ; 5526 3 REPEAT_COUNT = 0; ! Character was not repeated yet ; 5527 3 ! Will always be incremented ; 5528 2 END; ; 5529 2 ; 5530 2 ! ; 5531 2 ! Otherwise, loop until we fill buffer ; 5532 2 ! ; 5533 2 ; 5534 2 WHILE .SIZE LSS .MAX_SIZE DO ! Normal exit is via an EXITLOOP ; 5535 3 BEGIN ; 5536 3 ! ; 5537 3 ! Check if we are doing run compression ; 5538 3 ! ; 5539 3 ; 5540 3 IF .FLAG_REPEAT ; 5541 3 THEN ; 5542 4 BEGIN ; 5543 4 ! ; 5544 4 ! Here with previous character in OLD_xxx. As long as we ; 5545 4 ! are getting the same character, just count the run. ; 5546 4 ! ; 5547 4 ; 5548 4 WHILE (.CHAR_8_BIT EQL .OLD_CHAR_8_BIT) AND (.REPEAT_COUNT LSS 94) DO ; 5549 5 BEGIN ; 5550 5 REPEAT_COUNT = .REPEAT_COUNT + 1; ; 5551 5 ; 5552 5 IF .FLAG_8QUOTE THEN STATUS = GET_8_QUOTED_CHAR () ELSE STATUS = GET_QUOTED_CHAR (); ; 5553 5 ; 5554 5 IF .STATUS NEQ KER_NORMAL ; 5555 5 THEN ; 5556 5 ; 5557 5 IF .STATUS NEQ KER_EOF ; 5558 5 THEN ; 5559 5 CHAR_8_BIT = NO_CHAR ; 5560 5 ELSE ; 5561 6 BEGIN ; 5562 6 CHAR_8_BIT = EOF_CHAR; ; 5563 6 CHR_IDX = -1; ; 5564 5 END; ; 5565 5 ; 5566 4 END; ; 5567 4 ; 5568 5 IF .OLD_CHR_IDX + 1 + 2 LSS ((.OLD_CHR_IDX + 1)*.REPEAT_COUNT) ; 5569 4 THEN ; 5570 5 BEGIN ; 5571 5 ; 5572 5 IF .SIZE + .OLD_CHR_IDX + 1 + 2 GTR .MAX_SIZE ; 5573 5 THEN ; 5574 6 BEGIN ; 5575 6 ; 5576 6 IF .CHAR_8_BIT EQL .OLD_CHAR_8_BIT ; 5577 6 THEN ; 5578 7 BEGIN ; 5579 7 NEXT_CHR = .CHAR_8_BIT; ; 5580 7 REPEAT_COUNT = .REPEAT_COUNT - 1; ; 5581 6 END; ; 5582 6 ; 5583 6 IF .CHAR_8_BIT EQL EOF_CHAR ; 5584 6 THEN ; 5585 7 BEGIN ; 5586 7 NEXT_CHR = EOF_CHAR; ! Remember EOF for next time ; 5587 7 STATUS = KER_NORMAL; ! And give good return now ; 5588 6 END; ; 5589 6 ; 5590 6 EXITLOOP; ; 5591 5 END; ; 5592 5 ; 5593 5 OLD_CHRS [.OLD_CHR_IDX + 1] = CHAR (.REPEAT_COUNT); ; 5594 5 OLD_CHRS [.OLD_CHR_IDX + 2] = .REPT_CHR; ; 5595 5 OLD_CHR_IDX = .OLD_CHR_IDX + 2; ; 5596 5 ! ; 5597 5 ! Count the number of file characters this represents ; 5598 5 ! ; 5599 5 SMSG_DATA_CHARS = .SMSG_DATA_CHARS + .REPEAT_COUNT - 1; ; 5600 5 FILE_CHARS = .FILE_CHARS + .REPEAT_COUNT - 1; ; 5601 5 REPEAT_COUNT = 1; ! Only one time for this string ; 5602 4 END; ; 5603 4 ; 5604 4 ! ; 5605 4 ! If we don't have enough room for this character, wait till next ; 5606 4 ! time. ; 5607 4 ! ; 5608 4 ; 5609 4 IF .SIZE + (.OLD_CHR_IDX + 1)*.REPEAT_COUNT GTR .MAX_SIZE ; 5610 4 THEN ; 5611 5 BEGIN ; 5612 5 ! If the next character is the same, the count will get incremented ; 5613 5 ! next time we enter, so back it off now. ; 5614 5 ; 5615 5 IF .CHAR_8_BIT EQL .OLD_CHAR_8_BIT ; 5616 5 THEN ; 5617 6 BEGIN ; 5618 6 NEXT_CHR = .CHAR_8_BIT; ; 5619 6 REPEAT_COUNT = .REPEAT_COUNT - 1; ; 5620 5 END; ; 5621 5 ! ; 5622 5 ! If this is the last character of the file, ; 5623 5 ! remember that for next time, but give good return now. ; 5624 5 ! ; 5625 5 IF .CHAR_8_BIT EQL EOF_CHAR ; 5626 5 THEN ; 5627 6 BEGIN ; 5628 6 NEXT_CHR = EOF_CHAR; ; 5629 6 STATUS = KER_NORMAL ; 5630 5 END; ; 5631 5 ; 5632 5 EXITLOOP; ; 5633 4 END; ; 5634 4 ; 5635 4 SMSG_DATA_CHARS = .SMSG_DATA_CHARS + .REPEAT_COUNT; ; 5636 4 FILE_CHARS = .FILE_CHARS + .REPEAT_COUNT; ; 5637 4 ; 5638 4 DECR REPEAT_COUNT FROM .REPEAT_COUNT TO 1 DO ; 5639 4 ; 5640 4 DECR I FROM .OLD_CHR_IDX TO 0 DO ; 5641 5 BEGIN ; 5642 5 CH$WCHAR_A (.OLD_CHRS [.I], POINTER); ; 5643 5 SIZE = .SIZE + 1; ; 5644 4 END; ; 5645 4 ; 5646 4 ! ; 5647 4 ! If we had to defer EOF condition, reactivate it now. ; 5648 4 ! ; 5649 4 IF (.CHAR_8_BIT EQL EOF_CHAR) THEN STATUS = KER_EOF; ; 5650 4 ! ; 5651 4 ! If we got an error (or EOF) then exit ; 5652 4 ! ; 5653 4 ; 5654 4 IF (.STATUS NEQ KER_NORMAL) THEN EXITLOOP; ; 5655 4 ; 5656 4 ! ; 5657 4 ! Otherwise, copy the character which broke the run ; 5658 4 ! ; 5659 4 OLD_CHAR_8_BIT = .CHAR_8_BIT; ; 5660 4 ; 5661 4 INCR OLD_CHR_IDX FROM 0 TO .CHR_IDX DO ; 5662 4 OLD_CHRS [.OLD_CHR_IDX] = .CHRS [.OLD_CHR_IDX]; ; 5663 4 ; 5664 4 OLD_CHR_IDX = .CHR_IDX; ; 5665 4 REPEAT_COUNT = 0; ; 5666 4 END ; 5667 3 ELSE ; 5668 3 ! ; 5669 3 ! Here if we are not doing run compression. We can do things much ; 5670 3 ! easier. ; 5671 3 ! ; 5672 4 BEGIN ; 5673 4 ; 5674 4 IF (.SIZE + .CHR_IDX + 1) GTR .MAX_SIZE THEN EXITLOOP; ; 5675 4 ; 5676 4 SMSG_DATA_CHARS = .SMSG_DATA_CHARS + 1; ; 5677 4 FILE_CHARS = .FILE_CHARS + 1; ; 5678 4 ; 5679 4 DECR CHR_IDX FROM .CHR_IDX TO 0 DO ; 5680 5 BEGIN ; 5681 5 CH$WCHAR_A (.CHRS [.CHR_IDX], POINTER); ; 5682 5 SIZE = .SIZE + 1; ; 5683 4 END; ; 5684 4 ; 5685 4 IF .FLAG_8QUOTE THEN STATUS = GET_8_QUOTED_CHAR () ELSE STATUS = GET_QUOTED_CHAR (); ; 5686 4 ; 5687 4 IF (.STATUS NEQ KER_NORMAL) THEN EXITLOOP; ; 5688 4 ; 5689 3 END; ; 5690 3 ; 5691 2 END; ; 5692 2 ; 5693 2 ! ; 5694 2 ! Determine if we really stored anything into the buffer. ; 5695 2 ! ; 5696 2 ; 5697 2 IF .SIZE NEQ 0 THEN RETURN KER_NORMAL ELSE RETURN .STATUS; ; 5698 2 ; 5699 1 END; ! End of BFR_FILL ;BFR_FILL U.29: .WORD ^M ;Save R2,R3,R4,R5,R6,R7,R8 ; 5334 MOVAB W^SMSG_DATA_CHARS, R8 ;SMSG_DATA_CHARS, R8 ; MOVAB B^U.91, R7 ;U.91, R7 ; MOVAB W^U.82, R6 ;U.82, R6 ; CLRL -264(R6) ;SIZE ; 5497 MOVAB -132(R6), R5 ;SND_MSG+4, POINTER ; 5498 SUBL3 -280(R6), -308(R6), R2 ;BLK_CHK_TYPE, SEND_PKT_SIZE, R2 ; 5499 ADDL2 #46, R2 ;#46, MAX_SIZE ; BLBS 4(AP), 1$ ;FIRST_FLAG, 1$ ; 5504 CMPL (R6), #134316043 ;STATUS, #134316043 ; BNEQ 4$ ;4$ ; BLBC 4(AP), 9$ ;FIRST_FLAG, 9$ ; 5510 1$: CLRL 4(AP) ;FIRST_FLAG ; 5513 MNEGL #1, -4(R6) ;#1, NEXT_CHR ; 5514 BLBC -276(R6), 2$ ;FLAG_8QUOTE, 2$ ; 5516 CALLS #0, (R7) ;#0, GET_8_QUOTED_CHAR ; BRB 3$ ;3$ ; 2$: CALLS #0, -205(R7) ;#0, GET_QUOTED_CHAR ; 3$: MOVL R0, (R6) ;R0, STATUS ; CMPL (R6), #134316043 ;STATUS, #134316043 ; 5518 4$: BEQL 5$ ;5$ ; BRW 36$ ;36$ ; 5$: MOVL 8(R6), 36(R6) ;CHAR_8_BIT, OLD_CHAR_8_BIT ; 5520 MNEGL #1, R0 ;#1, OLD_CHR_IDX ; 5522 BRB 7$ ;7$ ; 6$: MOVL 12(R6)[R0], 40(R6)[R0] ;CHRS[OLD_CHR_IDX], OLD_CHRS[OLD_CHR_IDX] ; 5523 7$: AOBLEQ 32(R6), R0, 6$ ;CHR_IDX, OLD_CHR_IDX, 6$ ; 8$: MOVL 32(R6), 60(R6) ;CHR_IDX, OLD_CHR_IDX ; 5525 CLRL 4(R6) ;REPEAT_COUNT ; 5526 9$: CMPL -264(R6), R2 ;SIZE, MAX_SIZE ; 5534 BLSS 10$ ;10$ ; BRW 35$ ;35$ ; 10$: BLBS -272(R6), 11$ ;FLAG_REPEAT, 11$ ; 5540 BRW 30$ ;30$ ; 11$: CMPL 8(R6), 36(R6) ;CHAR_8_BIT, OLD_CHAR_8_BIT ; 5548 BNEQ 15$ ;15$ ; CMPL 4(R6), #94 ;REPEAT_COUNT, #94 ; BGEQ 15$ ;15$ ; INCL 4(R6) ;REPEAT_COUNT ; 5550 BLBC -276(R6), 12$ ;FLAG_8QUOTE, 12$ ; 5552 CALLS #0, (R7) ;#0, GET_8_QUOTED_CHAR ; BRB 13$ ;13$ ; 12$: CALLS #0, -205(R7) ;#0, GET_QUOTED_CHAR ; 13$: MOVL R0, (R6) ;R0, STATUS ; CMPL (R6), #134316043 ;STATUS, #134316043 ; 5554 BEQL 11$ ;11$ ; CMPL (R6), #134316131 ;STATUS, #134316131 ; 5557 BEQL 14$ ;14$ ; MNEGL #1, 8(R6) ;#1, CHAR_8_BIT ; 5559 BRB 11$ ;11$ ; 14$: MNEGL #2, 8(R6) ;#2, CHAR_8_BIT ; 5562 MNEGL #1, 32(R6) ;#1, CHR_IDX ; 5563 BRB 11$ ;11$ ; 15$: MOVL 60(R6), R1 ;OLD_CHR_IDX, R1 ; 5568 MOVAB 3(R1), R4 ;3(R1), R4 ; MOVAB 1(R1), R0 ;1(R1), R0 ; MULL3 4(R6), R0, R3 ;REPEAT_COUNT, R0, R3 ; CMPL R4, R3 ;R4, R3 ; BGEQ 18$ ;18$ ; ADDL3 -264(R6), R1, R3 ;SIZE, R1, R3 ; 5572 ADDL2 #3, R3 ;#3, R3 ; CMPL R3, R2 ;R3, MAX_SIZE ; BLEQ 17$ ;17$ ; MOVL 8(R6), R3 ;CHAR_8_BIT, R3 ; 5576 CMPL R3, 36(R6) ;R3, OLD_CHAR_8_BIT ; BNEQ 16$ ;16$ ; MOVL R3, -4(R6) ;R3, NEXT_CHR ; 5579 DECL 4(R6) ;REPEAT_COUNT ; 5580 16$: CMPL R3, #-2 ;R3, #-2 ; 5583 BRB 20$ ;20$ ; 17$: MOVL 4(R6), R3 ;REPEAT_COUNT, R3 ; 5593 MOVAB 32(R3), 40(R6)[R0] ;32(R3), OLD_CHRS[R0] ; MOVL -312(R6), 48(R6)[R1] ;REPT_CHR, OLD_CHRS+8[R1] ; 5594 ADDL2 #2, 60(R6) ;#2, OLD_CHR_IDX ; 5595 ADDL3 R3, (R8), R0 ;R3, SMSG_DATA_CHARS, R0 ; 5599 MOVAB -1(R0), (R8) ;-1(R0), SMSG_DATA_CHARS ; ADDL3 -36(R6), R3, R0 ;FILE_CHARS, R3, R0 ; 5600 MOVAB -1(R0), -36(R6) ;-1(R0), FILE_CHARS ; MOVL #1, 4(R6) ;#1, REPEAT_COUNT ; 5601 18$: ADDL3 #1, 60(R6), R0 ;#1, OLD_CHR_IDX, R0 ; 5609 MULL2 4(R6), R0 ;REPEAT_COUNT, R0 ; ADDL2 -264(R6), R0 ;SIZE, R0 ; CMPL R0, R2 ;R0, MAX_SIZE ; BLEQ 22$ ;22$ ; MOVL 8(R6), R0 ;CHAR_8_BIT, R0 ; 5615 CMPL R0, 36(R6) ;R0, OLD_CHAR_8_BIT ; BNEQ 19$ ;19$ ; MOVL R0, -4(R6) ;R0, NEXT_CHR ; 5618 DECL 4(R6) ;REPEAT_COUNT ; 5619 19$: CMPL R0, #-2 ;R0, #-2 ; 5625 20$: BNEQ 21$ ;21$ ; MNEGL #2, -4(R6) ;#2, NEXT_CHR ; 5628 MOVL #134316043, (R6) ;#134316043, STATUS ; 5629 21$: BRW 35$ ;35$ ; 22$: MOVL 4(R6), R0 ;REPEAT_COUNT, R0 ; 5635 ADDL2 R0, (R8) ;R0, SMSG_DATA_CHARS ; ADDL2 R0, -36(R6) ;R0, FILE_CHARS ; 5636 INCL R0 ;REPEAT_COUNT ; 5638 BRB 26$ ;26$ ; 23$: ADDL3 #1, 60(R6), R1 ;#1, OLD_CHR_IDX, I ; 5640 BRB 25$ ;25$ ; 24$: CVTLB 40(R6)[R1], (R5)+ ;OLD_CHRS[I], (POINTER)+ ; 5642 INCL -264(R6) ;SIZE ; 5643 25$: SOBGEQ R1, 24$ ;I, 24$ ; 26$: SOBGTR R0, 23$ ;REPEAT_COUNT, 23$ ; 5640 CMPL 8(R6), #-2 ;CHAR_8_BIT, #-2 ; 5649 BNEQ 27$ ;27$ ; MOVL #134316131, (R6) ;#134316131, STATUS ; 27$: CMPL (R6), #134316043 ;STATUS, #134316043 ; 5654 BNEQ 35$ ;35$ ; MOVL 8(R6), 36(R6) ;CHAR_8_BIT, OLD_CHAR_8_BIT ; 5659 MNEGL #1, R0 ;#1, OLD_CHR_IDX ; 5661 BRB 29$ ;29$ ; 28$: MOVL 12(R6)[R0], 40(R6)[R0] ;CHRS[OLD_CHR_IDX], OLD_CHRS[OLD_CHR_IDX] ; 5662 29$: AOBLEQ 32(R6), R0, 28$ ;CHR_IDX, OLD_CHR_IDX, 28$ ; BRW 8$ ;8$ ; 5664 30$: ADDL3 32(R6), -264(R6), R0 ;CHR_IDX, SIZE, R0 ; 5674 INCL R0 ;R0 ; CMPL R0, R2 ;R0, MAX_SIZE ; BGTR 35$ ;35$ ; INCL (R8) ;SMSG_DATA_CHARS ; 5676 INCL -36(R6) ;FILE_CHARS ; 5677 ADDL3 #1, 32(R6), R0 ;#1, CHR_IDX, CHR_IDX ; 5679 BRB 32$ ;32$ ; 31$: CVTLB 12(R6)[R0], (R5)+ ;CHRS[CHR_IDX], (POINTER)+ ; 5681 INCL -264(R6) ;SIZE ; 5682 32$: SOBGEQ R0, 31$ ;CHR_IDX, 31$ ; BLBC -276(R6), 33$ ;FLAG_8QUOTE, 33$ ; 5685 CALLS #0, (R7) ;#0, GET_8_QUOTED_CHAR ; BRB 34$ ;34$ ; 33$: CALLS #0, -205(R7) ;#0, GET_QUOTED_CHAR ; 34$: MOVL R0, (R6) ;R0, STATUS ; CMPL (R6), #134316043 ;STATUS, #134316043 ; 5687 BNEQ 35$ ;35$ ; BRW 9$ ;9$ ; 35$: TSTL -264(R6) ;SIZE ; 5697 BEQL 36$ ;36$ ; MOVL #134316043, R0 ;#134316043, R0 ; RET ; ; 36$: MOVL (R6), R0 ;STATUS, R0 ; RET ; ; 5699 ; Routine Size: 548 bytes, Routine Base: $CODE$ + 1DA0 ; 5700 1 %SBTTL 'BFR_EMPTY' ; 5701 1 ROUTINE BFR_EMPTY = ; 5702 1 ; 5703 1 !++ ; 5704 1 ! FUNCTIONAL DESCRIPTION: ; 5705 1 ! ; 5706 1 ! This routine will empty the data from the REC_MSG message buffer ; 5707 1 ! to the file. It will process quoting characters. ; 5708 1 ! ; 5709 1 ! CALLING SEQUENCE: ; 5710 1 ! ; 5711 1 ! Flag = BFR_EMPTY(); ; 5712 1 ! ; 5713 1 ! INPUT PARAMETERS: ; 5714 1 ! ; 5715 1 ! None. ; 5716 1 ! ; 5717 1 ! IMPLICIT INPUTS: ; 5718 1 ! ; 5719 1 ! None. ; 5720 1 ! ; 5721 1 ! OUTPUT PARAMETERS: ; 5722 1 ! ; 5723 1 ! True - No problems writing the file. ; 5724 1 ! False - I/O error writing the file. ; 5725 1 ! ; 5726 1 ! IMPLICIT OUTPUTS: ; 5727 1 ! ; 5728 1 ! None. ; 5729 1 ! ; 5730 1 ! COMPLETION CODES: ; 5731 1 ! ; 5732 1 ! None. ; 5733 1 ! ; 5734 1 ! SIDE EFFECTS: ; 5735 1 ! ; 5736 1 ! None. ; 5737 1 ! ; 5738 1 !-- ; 5739 1 ; 5740 2 BEGIN ; 5741 2 ; 5742 2 LOCAL ; 5743 2 STATUS, ! Status returned by various routines ; 5744 2 REPEAT_COUNT, ! Count of times to repeat character ; 5745 2 TURN_BIT_8_ON, ! If eight bit quoting ; 5746 2 COUNTER, ! Count of the characters left ; 5747 2 CHARACTER, ! Character we are processing ; 5748 2 POINTER; ! Pointer to the data ; 5749 2 ; 5750 2 POINTER = CH$PTR (REC_MSG, PKT_MSG, CHR_SIZE); ; 5751 2 COUNTER = 0; ; 5752 2 ; 5753 2 WHILE (.COUNTER LSS .REC_LENGTH) DO ; 5754 3 BEGIN ; 5755 3 CHARACTER = CH$RCHAR_A (POINTER); ; 5756 3 COUNTER = .COUNTER + 1; ; 5757 3 ! ; 5758 3 ! If the character is the repeat character (and we are doing repeat ; 5759 3 ! compression), then get the count. ; 5760 3 ! ; 5761 3 ; 5762 4 IF ((.CHARACTER EQL .REPT_CHR) AND .FLAG_REPEAT) ; 5763 3 THEN ; 5764 4 BEGIN ; 5765 4 REPEAT_COUNT = UNCHAR (CH$RCHAR_A (POINTER) AND %O'177'); ; 5766 4 CHARACTER = CH$RCHAR_A (POINTER); ; 5767 4 COUNTER = .COUNTER + 2; ; 5768 4 END ; 5769 3 ELSE ; 5770 3 REPEAT_COUNT = 1; ; 5771 3 ; 5772 3 ! ; 5773 3 ! If the character is an eight bit quoting character and we are doing eight ; 5774 3 ! bit quoting then turn on the flag so we turn the eighth bit on when we ; 5775 3 ! get the real character. ; 5776 3 ! ; 5777 3 ; 5778 4 IF ((.CHARACTER EQL .SEND_8QUOTE_CHR) AND .FLAG_8QUOTE) ; 5779 3 THEN ; 5780 4 BEGIN ; 5781 4 TURN_BIT_8_ON = TRUE; ; 5782 4 COUNTER = .COUNTER + 1; ; 5783 4 CHARACTER = CH$RCHAR_A (POINTER); ; 5784 4 END ; 5785 3 ELSE ; 5786 3 TURN_BIT_8_ON = FALSE; ; 5787 3 ; 5788 3 ! ; 5789 3 ! Now determine if we are quoting the character. If so then we must eat ; 5790 3 ! the quoting character and get the real character. ; 5791 3 ! ; 5792 3 ; 5793 3 IF .CHARACTER EQL .SEND_QUOTE_CHR ; 5794 3 ![035] Is this character other Kermit sends as quote? ; 5795 3 THEN ; 5796 4 BEGIN ; 5797 4 CHARACTER = CH$RCHAR_A (POINTER); ; 5798 4 COUNTER = .COUNTER + 1; ; 5799 4 ! ; 5800 4 ! Determine if we must undo what someone else has done to the character ; 5801 4 ! ; 5802 4 ; P 5803 5 IF ((.CHARACTER AND %O'177') GEQ CTL (CHR_DEL)) AND ((.CHARACTER AND %O'177') LEQ CTL ( ; 5804 5 CHR_DEL) + %O'40') ; 5805 4 THEN ; 5806 4 CHARACTER = CTL (.CHARACTER); ; 5807 4 ; 5808 3 END; ; 5809 3 ; 5810 3 ! ; 5811 3 ! Turn on the eight bit if needed and then write the character out ; 5812 3 ! ; 5813 3 ; 5814 3 IF .TURN_BIT_8_ON THEN CHARACTER = .CHARACTER OR %O'200'; ; 5815 3 ; 5816 3 RMSG_DATA_CHARS = .RMSG_DATA_CHARS + .REPEAT_COUNT; ; 5817 3 FILE_CHARS = .FILE_CHARS + .REPEAT_COUNT; ; 5818 3 ; 5819 3 DECR REPEAT_COUNT FROM .REPEAT_COUNT TO 1 DO ; 5820 4 BEGIN ; 5821 4 STATUS = (.PUT_CHR_ROUTINE) (.CHARACTER); ; 5822 4 ; 5823 4 IF NOT .STATUS THEN RETURN .STATUS; ; 5824 4 ; 5825 3 END; ; 5826 3 ; 5827 2 END; ; 5828 2 ; 5829 2 RETURN KER_NORMAL; ; 5830 1 END; ! End of BFR_EMPTY ;BFR_EMPTY U.28: .WORD ^M ;Save R2,R3,R4,R5,R6,R7,R8 ; 5701 MOVAB W^U.57+4, R8 ;U.57+4, R8 ; MOVAB (R8), R5 ;REC_MSG+4, POINTER ; 5750 CLRL R6 ;COUNTER ; 5751 1$: CMPL R6, -12(R8) ;COUNTER, REC_LENGTH ; 5753 BLSS 2$ ;2$ ; BRW 11$ ;11$ ; 2$: MOVZBL (R5)+, R4 ;(POINTER)+, CHARACTER ; 5755 INCL R6 ;COUNTER ; 5756 CMPL R4, -80(R8) ;CHARACTER, REPT_CHR ; 5762 BNEQ 3$ ;3$ ; BLBC -40(R8), 3$ ;FLAG_REPEAT, 3$ ; MOVZBL (R5)+, R1 ;(POINTER)+, R1 ; 5765 EXTZV #0, #7, R1, R3 ;#0, #7, R1, REPEAT_COUNT ; SUBL2 #32, R3 ;#32, REPEAT_COUNT ; MOVZBL (R5)+, R4 ;(POINTER)+, CHARACTER ; 5766 ADDL2 #2, R6 ;#2, COUNTER ; 5767 BRB 4$ ;4$ ; 3$: MOVL #1, R3 ;#1, REPEAT_COUNT ; 5770 4$: CMPL R4, -56(R8) ;CHARACTER, SEND_8QUOTE_CHR ; 5778 BNEQ 5$ ;5$ ; BLBC -44(R8), 5$ ;FLAG_8QUOTE, 5$ ; MOVL #1, R7 ;#1, TURN_BIT_8_ON ; 5781 INCL R6 ;COUNTER ; 5782 MOVZBL (R5)+, R4 ;(POINTER)+, CHARACTER ; 5783 BRB 6$ ;6$ ; 5$: CLRL R7 ;TURN_BIT_8_ON ; 5786 6$: CMPL R4, -60(R8) ;CHARACTER, SEND_QUOTE_CHR ; 5793 BNEQ 7$ ;7$ ; MOVZBL (R5)+, R4 ;(POINTER)+, CHARACTER ; 5797 INCL R6 ;COUNTER ; 5798 CMPZV #0, #7, R4, #63 ;#0, #7, CHARACTER, #63 ; 5803 BLSS 7$ ;7$ ; CMPZV #0, #7, R4, #95 ;#0, #7, CHARACTER, #95 ; 5804 BGTR 7$ ;7$ ; XORB2 #64, R4 ;#64, CHARACTER ; 5806 7$: BLBC R7, 8$ ;TURN_BIT_8_ON, 8$ ; 5814 BISB2 #128, R4 ;#128, CHARACTER ; 8$: ADDL2 R3, W^RMSG_DATA_CHARS ;REPEAT_COUNT, RMSG_DATA_CHARS ; 5816 ADDL2 R3, 196(R8) ;REPEAT_COUNT, FILE_CHARS ; 5817 MOVAB 1(R3), R2 ;1(R3), REPEAT_COUNT ; 5821 BRB 10$ ;10$ ; 9$: PUSHL R4 ;CHARACTER ; CALLS #1, @224(R8) ;#1, @PUT_CHR_ROUTINE ; BLBC R0, 12$ ;STATUS, 12$ ; 5823 10$: SOBGTR R2, 9$ ;REPEAT_COUNT, 9$ ; BRW 1$ ;1$ ; 5819 11$: MOVL #134316043, R0 ;#134316043, R0 ; 5829 12$: RET ; ; 5830 ; Routine Size: 160 bytes, Routine Base: $CODE$ + 1FC4 ; 5831 1 %SBTTL 'Buffer filling and emptying subroutines' ; 5832 1 ROUTINE SET_STRING (POINTER, LENGTH, START) = ; 5833 1 ; 5834 1 !++ ; 5835 1 ! FUNCTIONAL DESCRIPTION: ; 5836 1 ! ; 5837 1 ! This routine is used to set up the buffer filling and emptying ; 5838 1 ! routines to use a string for input (or output) rather than ; 5839 1 ! the file I/O routines. ; 5840 1 ! ; 5841 1 ! CALLING SEQUENCE: ; 5842 1 ! ; 5843 1 ! SET_STRING (.POINTER, .LENGTH, .START) ; 5844 1 ! ; 5845 1 ! INPUT PARAMETERS: ; 5846 1 ! ; 5847 1 ! POINTER - Character pointer to string ; 5848 1 ! ; 5849 1 ! LENGTH - Number of characters in string ; 5850 1 ! ; 5851 1 ! START - True to start string, false to end it ; 5852 1 ! ; 5853 1 ! IMPLICIT INPUTS: ; 5854 1 ! ; 5855 1 ! None. ; 5856 1 ! ; 5857 1 ! OUPTUT PARAMETERS: ; 5858 1 ! ; 5859 1 ! Returns 0 if START = TRUE, actual number of characters used ; 5860 1 ! by last string if START = FALSE. ; 5861 1 ! ; 5862 1 ! IMPLICIT OUTPUTS: ; 5863 1 ! ; 5864 1 ! GET_CHR_ROUTINE and PUT_CHR_ROUTINE modifed so that string ; 5865 1 ! routines are called instead of file I/O. ; 5866 1 ! ; 5867 1 ! COMPLETION CODES: ; 5868 1 ! ; 5869 1 ! None. ; 5870 1 ! ; 5871 1 ! SIDE EFFECTS: ; 5872 1 ! ; 5873 1 ! None. ; 5874 1 ! ; 5875 1 !-- ; 5876 1 ; 5877 2 BEGIN ; 5878 2 ; 5879 2 OWN ; 5880 2 STR_POINTER, ! Pointer to string ; 5881 2 STR_LENGTH, ! Length of string ; 5882 2 STR_ORG_LENGTH, ! Original length of string ; 5883 2 OLD_GET_CHR, ! Old get-char routine ; 5884 2 OLD_PUT_CHR; ! Old put-char routine ; 5885 2 ; 5886 2 ! ; 5887 2 ! Routine to get a character from the string ; 5888 2 ! ; 5889 2 ROUTINE GET_STRING (CHAR_ADDRESS) = ; 5890 3 BEGIN ; 5891 3 ! ; 5892 3 ! If some characters are left, count down the length and get next character ; 5893 3 ! Otherwise return and end of file indication. ; 5894 3 ! ; 5895 3 ; 5896 3 IF .STR_LENGTH GTR 0 ; 5897 3 THEN ; 5898 4 BEGIN ; 5899 4 STR_LENGTH = .STR_LENGTH - 1; ; 5900 4 .CHAR_ADDRESS = CH$RCHAR_A (STR_POINTER); ; 5901 4 RETURN KER_NORMAL; ; 5902 4 END ; 5903 3 ELSE ; 5904 3 RETURN KER_EOF; ; 5905 3 ; 5906 2 END; ! End of GET_STRING .PSECT $OWN$,NOEXE,2 ;STR_POINTER U.92: .BLKB 4 ;STR_LENGTH U.93: .BLKB 4 ;STR_ORG_LENGTH U.94: .BLKB 4 ;OLD_GET_CHR U.95: .BLKB 4 ;OLD_PUT_CHR U.96: .BLKB 4 .PSECT $CODE$,NOWRT,2 ;GET_STRING U.97: .WORD ^M ;Save R2 ; 5889 MOVAB W^U.93, R2 ;U.93, R2 ; TSTL (R2) ;STR_LENGTH ; 5896 BLEQ 1$ ;1$ ; DECL (R2) ;STR_LENGTH ; 5899 MOVZBL @-4(R2), @4(AP) ;@STR_POINTER, @CHAR_ADDRESS ; 5900 INCL -4(R2) ;STR_POINTER ; MOVL #134316043, R0 ;#134316043, R0 ; 5904 RET ; ; 1$: MOVL #134316131, R0 ;#134316131, R0 ; RET ; ; 5906 ; Routine Size: 37 bytes, Routine Base: $CODE$ + 2064 ; 5907 2 ROUTINE PUT_STRING (CHAR_VALUE) = ; 5908 3 BEGIN ; 5909 3 ! ; 5910 3 ! If there is enough room to store another character, store the character ; 5911 3 ! and count it. Otherwise return a line too long indication. ; 5912 3 ! ; 5913 3 ; 5914 3 IF .STR_LENGTH GTR 0 ; 5915 3 THEN ; 5916 4 BEGIN ; 5917 4 STR_LENGTH = .STR_LENGTH - 1; ; 5918 4 CH$WCHAR_A (.CHAR_VALUE, STR_POINTER); ; 5919 4 RETURN KER_NORMAL; ; 5920 4 END ; 5921 3 ELSE ; 5922 3 RETURN KER_LINTOOLNG; ; 5923 3 ; 5924 2 END; ! End of PUT_STRING ;PUT_STRING U.98: .WORD ^M ;Save R2 ; 5907 MOVAB W^U.93, R2 ;U.93, R2 ; TSTL (R2) ;STR_LENGTH ; 5914 BLEQ 1$ ;1$ ; DECL (R2) ;STR_LENGTH ; 5917 MOVB 4(AP), @-4(R2) ;CHAR_VALUE, @STR_POINTER ; 5918 INCL -4(R2) ;STR_POINTER ; MOVL #134316043, R0 ;#134316043, R0 ; 5922 RET ; ; 1$: MOVL #134316098, R0 ;#134316098, R0 ; RET ; ; 5924 ; Routine Size: 37 bytes, Routine Base: $CODE$ + 2089 ; 5925 2 ! ; 5926 2 ! If we have a request to start a string (input or output), save the old ; 5927 2 ! routines and set up ours. Also save the string pointer and length for ; 5928 2 ! use by our get/put routines. ; 5929 2 ! Otherwise this is a request to stop using the string routines, so reset ; 5930 2 ! the old routines and return the actual number of characters read or ; 5931 2 ! written ; 5932 2 ! ; 5933 2 ; 5934 2 IF .START ; 5935 2 THEN ; 5936 3 BEGIN ; 5937 3 STR_POINTER = .POINTER; ; 5938 3 STR_ORG_LENGTH = .LENGTH; ; 5939 3 STR_LENGTH = .LENGTH; ; 5940 3 OLD_GET_CHR = .GET_CHR_ROUTINE; ; 5941 3 OLD_PUT_CHR = .PUT_CHR_ROUTINE; ; 5942 3 GET_CHR_ROUTINE = GET_STRING; ; 5943 3 PUT_CHR_ROUTINE = PUT_STRING; ; 5944 3 RETURN 0; ; 5945 3 END ; 5946 2 ELSE ; 5947 3 BEGIN ; 5948 3 GET_CHR_ROUTINE = .OLD_GET_CHR; ; 5949 3 PUT_CHR_ROUTINE = .OLD_PUT_CHR; ; 5950 3 RETURN .STR_ORG_LENGTH - .STR_LENGTH; ; 5951 2 END; ; 5952 2 ; 5953 1 END; ! End of SET_STRING ;SET_STRING U.30: .WORD ^M ;Save R2 ; 5832 MOVAB W^U.65, R2 ;U.65, R2 ; BLBC 12(AP), 1$ ;START, 1$ ; 5934 MOVL 8(AP), 84(R2) ;LENGTH, STR_ORG_LENGTH ; 5938 MOVQ 4(AP), 76(R2) ;POINTER, STR_POINTER ; 5937 MOVQ (R2), 88(R2) ;GET_CHR_ROUTINE, OLD_GET_CHR ; 5940 MOVAB B^U.97, (R2) ;U.97, GET_CHR_ROUTINE ; 5942 MOVAB B^U.98, 4(R2) ;U.98, PUT_CHR_ROUTINE ; 5943 CLRL R0 ;R0 ; 5947 RET ; ; 1$: MOVQ 88(R2), (R2) ;OLD_GET_CHR, GET_CHR_ROUTINE ; 5948 SUBL3 80(R2), 84(R2), R0 ;STR_LENGTH, STR_ORG_LENGTH, R0 ; 5950 RET ; ; 5953 ; Routine Size: 48 bytes, Routine Base: $CODE$ + 20AE ; 5954 1 %SBTTL 'Add parity routine' ; 5955 1 ROUTINE DO_PARITY (MESSAGE, LENGTH) : NOVALUE = ; 5956 1 ; 5957 1 !++ ; 5958 1 ! FUNCTIONAL DESCRIPTION: ; 5959 1 ! ; 5960 1 ! This routine will add parity for a complete message that is to be ; 5961 1 ! sent to the remote Kermit. ; 5962 1 ! ; 5963 1 ! CALLING SEQUENCE: ; 5964 1 ! ; 5965 1 ! DO_PARITY (Message_address, Message_length); ; 5966 1 ! ; 5967 1 ! INPUT PARAMETERS: ; 5968 1 ! ; 5969 1 ! Message_address - Address of the message to put parity on. ; 5970 1 ! Message_length - Lengtho of the message. ; 5971 1 ! ; 5972 1 ! IMPLICIT INPUTS: ; 5973 1 ! ; 5974 1 ! None. ; 5975 1 ! ; 5976 1 ! OUTPUT PARAMETERS: ; 5977 1 ! ; 5978 1 ! None. ; 5979 1 ! ; 5980 1 ! IMPLICIT OUTPUTS: ; 5981 1 ! ; 5982 1 ! None. ; 5983 1 ! ; 5984 1 ! COMPLETION CODES: ; 5985 1 ! ; 5986 1 ! None. ; 5987 1 ! ; 5988 1 ! SIDE EFFECTS: ; 5989 1 ! ; 5990 1 ! None. ; 5991 1 ! ; 5992 1 !-- ; 5993 1 ; 5994 2 BEGIN ; 5995 2 ; 5996 2 MAP ; 5997 2 MESSAGE : REF VECTOR [CH$ALLOCATION (MAX_MSG, CHR_SIZE)]; ; 5998 2 ; 5999 2 LOCAL ; 6000 2 POINTER; ! Point into the message ; 6001 2 ; 6002 2 IF NOT .DEV_PARITY_FLAG ; 6003 2 THEN ; 6004 3 BEGIN ; 6005 3 POINTER = CH$PTR (.MESSAGE,, CHR_SIZE); ; 6006 3 ; 6007 3 INCR I FROM 1 TO .LENGTH DO ; 6008 3 CH$WCHAR_A (GEN_PARITY (CH$RCHAR (.POINTER)), POINTER); ; 6009 3 ; 6010 2 END; ; 6011 2 ; 6012 1 END; ! End of DO_PARITY ;DO_PARITY U.22: .WORD ^M ;Save R2,R3 ; 5955 BLBS W^DEV_PARITY_FLAG, 3$ ;DEV_PARITY_FLAG, 3$ ; 6002 MOVL 4(AP), R2 ;MESSAGE, POINTER ; 6005 CLRL R3 ;I ; 6008 BRB 2$ ;2$ ; 1$: MOVZBL (R2), -(SP) ;(POINTER), -(SP) ; CALLS #1, W^U.23 ;#1, U.23 ; MOVB R0, (R2)+ ;R0, (POINTER)+ ; 2$: AOBLEQ 8(AP), R3, 1$ ;LENGTH, I, 1$ ; 3$: RET ; ; 6012 ; Routine Size: 32 bytes, Routine Base: $CODE$ + 20DE ; 6013 1 %SBTTL 'Parity routine' ; 6014 1 ; 6015 1 GLOBAL ROUTINE GEN_PARITY (CHARACTER) = ; 6016 1 ; 6017 1 !++ ; 6018 1 ! FUNCTIONAL DESCRIPTION: ; 6019 1 ! ; 6020 1 ! This routine will add parity to the character that is supplied. ; 6021 1 ! ; 6022 1 ! CALLING SEQUENCE: ; 6023 1 ! ; 6024 1 ! CHARACTER = GEN_PARITY(CHARACTER) ; 6025 1 ! ; 6026 1 ! INPUT PARAMETERS: ; 6027 1 ! ; 6028 1 ! CHARACTER - Produce the parity for this character depending on the ; 6029 1 ! setting of the SET PARITY switch. ; 6030 1 ! ; 6031 1 ! IMPLICIT INPUTS: ; 6032 1 ! ; 6033 1 ! None. ; 6034 1 ! ; 6035 1 ! OUTPUT PARAMETERS: ; 6036 1 ! ; 6037 1 ! None. ; 6038 1 ! ; 6039 1 ! IMPLICIT OUTPUTS: ; 6040 1 ! ; 6041 1 ! None. ; 6042 1 ! ; 6043 1 ! COMPLETION CODES: ; 6044 1 ! ; 6045 1 ! None. ; 6046 1 ! ; 6047 1 ! SIDE EFFECTS: ; 6048 1 ! ; 6049 1 ! None. ; 6050 1 ! ; 6051 1 !-- ; 6052 1 ; 6053 2 BEGIN ; 6054 2 ; 6055 2 LOCAL ; 6056 2 TEMP_CHAR; ; 6057 2 ; 6058 2 ; 6059 2 CASE .PARITY_TYPE FROM PR_MIN TO PR_MAX OF ; 6060 2 SET ; 6061 2 ; 6062 2 [PR_NONE] : ; 6063 2 RETURN .CHARACTER; ; 6064 2 ; 6065 2 [PR_SPACE] : ; 6066 2 RETURN .CHARACTER AND %O'177'; ; 6067 2 ; 6068 2 [PR_MARK] : ; 6069 2 RETURN .CHARACTER OR %O'200'; ; 6070 2 ; 6071 2 [PR_ODD] : ; 6072 2 TEMP_CHAR = .CHARACTER AND %O'177' OR %O'200'; ; 6073 2 ; 6074 2 [PR_EVEN] : ; 6075 2 TEMP_CHAR = .CHARACTER AND %O'177'; ; 6076 2 TES; ; 6077 2 ; 6078 2 TEMP_CHAR = .TEMP_CHAR XOR (.TEMP_CHAR^-4); ; 6079 2 TEMP_CHAR = .TEMP_CHAR XOR (.TEMP_CHAR^-2); ; 6080 2 ; 6081 2 IF .TEMP_CHAR<0, 2> EQL %B'01' OR .TEMP_CHAR<0, 2> EQL %B'10' ; 6082 2 THEN ; 6083 2 RETURN .CHARACTER AND %O'177' OR %O'200' ; 6084 2 ELSE ; 6085 2 RETURN .CHARACTER AND %O'177'; ; 6086 2 ; 6087 1 END; ! End of GEN_PARITY U.23: .ENTRY GEN_PARITY, ^M ;GEN_PARITY, Save R2 ; 6015 MOVL 4(AP), R2 ;CHARACTER, R2 ; 6063 CASEL W^PARITY_TYPE, #0, #4 ;PARITY_TYPE, #0, #4 ; 6059 1$: .WORD 2$-1$,- ;2$-1$,- ; 3$-1$,- ;3$-1$,- ; 5$-1$,- ;5$-1$,- ; 4$-1$,- ;4$-1$,- ; 8$-1$ ;8$-1$ ; 2$: MOVL R2, R0 ;R2, R0 ; 6063 RET ; ; 3$: BISL3 #128, R2, R0 ;#128, R2, R0 ; 6069 RET ; ; 4$: EXTZV #0, #7, R2, R0 ;#0, #7, R2, TEMP_CHAR ; 6072 INSV #1, #7, #1, R0 ;#1, #7, #1, TEMP_CHAR ; BRB 6$ ;6$ ; 5$: EXTZV #0, #7, R2, R0 ;#0, #7, R2, TEMP_CHAR ; 6075 6$: ASHL #-4, R0, R1 ;#-4, TEMP_CHAR, R1 ; 6078 XORL2 R1, R0 ;R1, TEMP_CHAR ; ASHL #-2, R0, R1 ;#-2, TEMP_CHAR, R1 ; 6079 XORL2 R1, R0 ;R1, TEMP_CHAR ; CMPZV #0, #2, R0, #1 ;#0, #2, TEMP_CHAR, #1 ; 6081 BEQL 7$ ;7$ ; CMPZV #0, #2, R0, #2 ;#0, #2, TEMP_CHAR, #2 ; BNEQ 8$ ;8$ ; 7$: EXTZV #0, #7, R2, R0 ;#0, #7, R2, R0 ; 6083 INSV #1, #7, #1, R0 ;#1, #7, #1, R0 ; RET ; ; 6085 8$: EXTZV #0, #7, R2, R0 ;#0, #7, R2, R0 ; RET ; ; 6087 ; Routine Size: 99 bytes, Routine Base: $CODE$ + 20FE ; 6088 1 ; 6089 1 %SBTTL 'Per transfer -- Initialization' ; 6090 1 ROUTINE INIT_XFR : NOVALUE = ; 6091 1 ; 6092 1 !++ ; 6093 1 ! FUNCTIONAL DESCRIPTION: ; 6094 1 ! ; 6095 1 ! This routine will initialize the various locations that the ; 6096 1 ! send and receive statistics are kept. ; 6097 1 ! ; 6098 1 ! CALLING SEQUENCE: ; 6099 1 ! ; 6100 1 ! INIT_XFR(); ; 6101 1 ! ; 6102 1 ! INPUT PARAMETERS: ; 6103 1 ! ; 6104 1 ! None. ; 6105 1 ! ; 6106 1 ! IMPLICIT INPUTS: ; 6107 1 ! ; 6108 1 ! None. ; 6109 1 ! ; 6110 1 ! OUTPUT PARAMETERS: ; 6111 1 ! ; 6112 1 ! None. ; 6113 1 ! ; 6114 1 ! IMPLICIT OUTPUTS: ; 6115 1 ! ; 6116 1 ! None. ; 6117 1 ! ; 6118 1 ! COMPLETION CODES: ; 6119 1 ! ; 6120 1 ! None. ; 6121 1 ! ; 6122 1 ! SIDE EFFECTS: ; 6123 1 ! ; 6124 1 ! None. ; 6125 1 ! ; 6126 1 !-- ; 6127 1 ; 6128 2 BEGIN ; 6129 2 ! ; 6130 2 ! Determine if we should do 8 bit quoting ; 6131 2 ! ; 6132 2 ; 6133 2 IF .PARITY_TYPE NEQ PR_NONE ; 6134 2 THEN ; 6135 3 BEGIN ; 6136 3 RECV_8QUOTE_CHR = .RCV_8QUOTE_CHR; ; 6137 3 END ; 6138 2 ELSE ; 6139 3 BEGIN ; 6140 3 RECV_8QUOTE_CHR = %C'Y'; ; 6141 2 END; ; 6142 2 ; 6143 2 NUM_RETRIES = 0; ; 6144 2 SEND_8QUOTE_CHR = .RECV_8QUOTE_CHR; ; 6145 2 ! ; 6146 2 ! Send parameters that may not get set before we need them for the first ; 6147 2 ! time. ; 6148 2 ! ; 6149 2 SEND_PKT_SIZE = ABS (.SND_PKT_SIZE); ; 6150 2 SEND_NPAD = ABS (.SND_NPAD); ; 6151 2 SEND_PADCHAR = ABS (.SND_PADCHAR); ; 6152 2 SEND_TIMEOUT = ABS (.SND_TIMEOUT); ; 6153 2 SEND_EOL = ABS (.SND_EOL); ; 6154 2 SEND_QUOTE_CHR = ABS (.SND_QUOTE_CHR); ; 6155 2 ! ; 6156 2 ! For initialization messages, we must use single character checksum ; 6157 2 ! When the send-init/ack sequence has been done, we will switch to the ; 6158 2 ! desired form ; 6159 2 ! ; 6160 2 BLK_CHK_TYPE = CHK_1CHAR; ; 6161 2 INI_CHK_TYPE = .CHKTYPE; ! Send desired type ; 6162 2 ! ; 6163 2 ! Set desired repeat character for use in we are doing send-init ; 6164 2 ! Will be overwritten by other ends desired character if it sends ; 6165 2 ! the send-init. ; 6166 2 ! ; 6167 2 REPT_CHR = .SET_REPT_CHR; ; 6168 2 ! ; 6169 2 ! Assume packet assembly/disassembly uses characters from a file ; 6170 2 ! ; 6171 2 GET_CHR_ROUTINE = GET_FILE; ! Initialize the get-a-char routine ; 6172 2 PUT_CHR_ROUTINE = PUT_FILE; ! And the put-a-char ; 6173 2 TEXT_HEAD_FLAG = FALSE; ! And assume we will get an File header ; 6174 2 NO_FILE_NEEDED = FALSE; ! Assume will do file ops ; 6175 2 INIT_PKT_SENT = FALSE; ! And no server-init sent ; 6176 2 ! ; 6177 2 ! Always start with packet number 0 ; 6178 2 ! ; 6179 2 MSG_NUMBER = 0; ! Initial message number ; 6180 2 ! ; 6181 2 ! Stats information ; 6182 2 ! ; 6183 2 SMSG_TOTAL_CHARS = 0; ; 6184 2 RMSG_TOTAL_CHARS = 0; ; 6185 2 SMSG_DATA_CHARS = 0; ; 6186 2 RMSG_DATA_CHARS = 0; ; 6187 2 SMSG_COUNT = 0; ; 6188 2 RMSG_COUNT = 0; ; 6189 2 RMSG_NAKS = 0; ; 6190 2 SMSG_NAKS = 0; ; 6191 2 XFR_TIME = SY_TIME (); ; 6192 1 END; ! End of INIT_XFR ;INIT_XFR U.32: .WORD ^M ;Save R2 ; 6090 MOVAB W^U.37, R2 ;U.37, R2 ; TSTL W^PARITY_TYPE ;PARITY_TYPE ; 6133 BEQL 1$ ;1$ ; MOVL W^RCV_8QUOTE_CHR, (R2) ;RCV_8QUOTE_CHR, RECV_8QUOTE_CHR ; 6136 BRB 2$ ;2$ ; 1$: MOVZBL #89, (R2) ;#89, RECV_8QUOTE_CHR ; 6140 2$: CLRL 60(R2) ;NUM_RETRIES ; 6143 MOVL (R2), 28(R2) ;RECV_8QUOTE_CHR, SEND_8QUOTE_CHR ; 6144 MOVL W^SND_PKT_SIZE, R0 ;SND_PKT_SIZE, R0 ; 6149 BGEQ 3$ ;3$ ; MNEGL R0, R0 ;R0, R0 ; 3$: MOVL R0, 8(R2) ;R0, SEND_PKT_SIZE ; MOVL W^SND_NPAD, R0 ;SND_NPAD, R0 ; 6150 BGEQ 4$ ;4$ ; MNEGL R0, R0 ;R0, R0 ; 4$: MOVL R0, 12(R2) ;R0, SEND_NPAD ; MOVL W^SND_PADCHAR, R0 ;SND_PADCHAR, R0 ; 6151 BGEQ 5$ ;5$ ; MNEGL R0, R0 ;R0, R0 ; 5$: MOVL R0, 16(R2) ;R0, SEND_PADCHAR ; MOVL W^SND_TIMEOUT, R0 ;SND_TIMEOUT, R0 ; 6152 BGEQ 6$ ;6$ ; MNEGL R0, R0 ;R0, R0 ; 6$: MOVL R0, W^SEND_TIMEOUT ;R0, SEND_TIMEOUT ; MOVL W^SND_EOL, R0 ;SND_EOL, R0 ; 6153 BGEQ 7$ ;7$ ; MNEGL R0, R0 ;R0, R0 ; 7$: MOVL R0, 20(R2) ;R0, SEND_EOL ; MOVL W^SND_QUOTE_CHR, R0 ;SND_QUOTE_CHR, R0 ; 6154 BGEQ 8$ ;8$ ; MNEGL R0, R0 ;R0, R0 ; 8$: MOVL R0, 24(R2) ;R0, SEND_QUOTE_CHR ; MOVL #49, 36(R2) ;#49, BLK_CHK_TYPE ; 6160 MOVL W^CHKTYPE, 32(R2) ;CHKTYPE, INI_CHK_TYPE ; 6161 MOVL W^SET_REPT_CHR, 4(R2) ;SET_REPT_CHR, REPT_CHR ; 6167 MOVAB W^GET_FILE, 304(R2) ;GET_FILE, GET_CHR_ROUTINE ; 6171 MOVAB W^PUT_FILE, 308(R2) ;PUT_FILE, PUT_CHR_ROUTINE ; 6172 CLRQ 284(R2) ;TEXT_HEAD_FLAG ; 6173 CLRL 292(R2) ;INIT_PKT_SENT ; 6175 CLRL 64(R2) ;MSG_NUMBER ; 6179 CLRL W^SMSG_TOTAL_CHARS ;SMSG_TOTAL_CHARS ; 6183 CLRL W^RMSG_TOTAL_CHARS ;RMSG_TOTAL_CHARS ; 6184 CLRL W^SMSG_DATA_CHARS ;SMSG_DATA_CHARS ; 6185 CLRL W^RMSG_DATA_CHARS ;RMSG_DATA_CHARS ; 6186 CLRL W^SMSG_COUNT ;SMSG_COUNT ; 6187 CLRL W^RMSG_COUNT ;RMSG_COUNT ; 6188 CLRL W^RMSG_NAKS ;RMSG_NAKS ; 6189 CLRL W^SMSG_NAKS ;SMSG_NAKS ; 6190 CALLS #0, W^SY_TIME ;#0, SY_TIME ; 6191 MOVL R0, W^XFR_TIME ;R0, XFR_TIME ; RET ; ; 6192 ; Routine Size: 200 bytes, Routine Base: $CODE$ + 2161 ; 6193 1 %SBTTL 'Statistics -- Finish message transfer' ; 6194 1 ROUTINE END_STATS : NOVALUE = ; 6195 1 ; 6196 1 !++ ; 6197 1 ! FUNCTIONAL DESCRIPTION: ; 6198 1 ! ; 6199 1 ! This routine will end the collection of the statistices. It will ; 6200 1 ! update the various overall statistic parameters. ; 6201 1 ! ; 6202 1 ! CALLING SEQUENCE: ; 6203 1 ! ; 6204 1 ! END_STATS (); ; 6205 1 ! ; 6206 1 ! INPUT PARAMETERS: ; 6207 1 ! ; 6208 1 ! None. ; 6209 1 ! ; 6210 1 ! IMPLICIT INPUTS: ; 6211 1 ! ; 6212 1 ! None. ; 6213 1 ! ; 6214 1 ! OUTPUT PARAMETERS: ; 6215 1 ! ; 6216 1 ! None. ; 6217 1 ! ; 6218 1 ! IMPLICIT OUTPUTS: ; 6219 1 ! ; 6220 1 ! None. ; 6221 1 ! ; 6222 1 ! COMPLETION CODES: ; 6223 1 ! ; 6224 1 ! None. ; 6225 1 ! ; 6226 1 ! SIDE EFFECTS: ; 6227 1 ! ; 6228 1 ! None. ; 6229 1 ! ; 6230 1 !-- ; 6231 1 ; 6232 2 BEGIN ; 6233 2 SND_COUNT = .SND_COUNT + .SMSG_COUNT; ; 6234 2 RCV_COUNT = .RCV_COUNT + .RMSG_COUNT; ; 6235 2 SND_TOTAL_CHARS = .SND_TOTAL_CHARS + .SMSG_TOTAL_CHARS; ; 6236 2 SND_DATA_CHARS = .SND_DATA_CHARS + .SMSG_DATA_CHARS; ; 6237 2 RCV_TOTAL_CHARS = .RCV_TOTAL_CHARS + .RMSG_TOTAL_CHARS; ; 6238 2 RCV_DATA_CHARS = .RCV_DATA_CHARS + .RMSG_DATA_CHARS; ; 6239 2 SND_NAKS = .SND_NAKS + .SMSG_NAKS; ; 6240 2 RCV_NAKS = .RCV_NAKS + .RMSG_NAKS; ; 6241 2 XFR_TIME = SY_TIME () - .XFR_TIME; ; 6242 2 TOTAL_TIME = .TOTAL_TIME + .XFR_TIME; ; 6243 1 END; ! End of END_STATS ;END_STATS U.18: .WORD ^M ;Save R2 ; 6194 MOVAB W^XFR_TIME, R2 ;XFR_TIME, R2 ; ADDL2 W^SMSG_COUNT, W^SND_COUNT ;SMSG_COUNT, SND_COUNT ; 6233 ADDL2 W^RMSG_COUNT, W^RCV_COUNT ;RMSG_COUNT, RCV_COUNT ; 6234 ADDL2 W^SMSG_TOTAL_CHARS, - ;SMSG_TOTAL_CHARS, SND_TOTAL_CHARS ; 6235 W^SND_TOTAL_CHARS ; ; ADDL2 W^SMSG_DATA_CHARS, W^SND_DATA_CHARS ;SMSG_DATA_CHARS, SND_DATA_CHARS ; 6236 ADDL2 W^RMSG_TOTAL_CHARS, - ;RMSG_TOTAL_CHARS, RCV_TOTAL_CHARS ; 6237 W^RCV_TOTAL_CHARS ; ; ADDL2 W^RMSG_DATA_CHARS, W^RCV_DATA_CHARS ;RMSG_DATA_CHARS, RCV_DATA_CHARS ; 6238 ADDL2 W^SMSG_NAKS, W^SND_NAKS ;SMSG_NAKS, SND_NAKS ; 6239 ADDL2 W^RMSG_NAKS, W^RCV_NAKS ;RMSG_NAKS, RCV_NAKS ; 6240 CALLS #0, W^SY_TIME ;#0, SY_TIME ; 6241 SUBL3 (R2), R0, (R2) ;XFR_TIME, R0, XFR_TIME ; ADDL2 (R2), W^TOTAL_TIME ;XFR_TIME, TOTAL_TIME ; 6242 RET ; ; 6243 ; Routine Size: 78 bytes, Routine Base: $CODE$ + 2229 ; 6244 1 %SBTTL 'Status type out -- STS_OUTPUT' ; 6245 1 ROUTINE STS_OUTPUT : NOVALUE = ; 6246 1 ; 6247 1 !++ ; 6248 1 ! FUNCTIONAL DESCRIPTION: ; 6249 1 ! ; 6250 1 ! This routine will output the current status of a transfer. ; 6251 1 ! This is used when the user types a ^A during a transfer. ; 6252 1 ! ; 6253 1 ! CALLING SEQUENCE: ; 6254 1 ! ; 6255 1 ! STS_OUTPUT () ; 6256 1 ! ; 6257 1 ! INPUT PARAMETERS: ; 6258 1 ! ; 6259 1 ! None. ; 6260 1 ! ; 6261 1 ! IMPLICIT INPUTS: ; 6262 1 ! ; 6263 1 ! Statistics blocks, file names, etc. ; 6264 1 ! ; 6265 1 ! OUPTUT PARAMETERS: ; 6266 1 ! ; 6267 1 ! None. ; 6268 1 ! ; 6269 1 ! IMPLICIT OUTPUTS: ; 6270 1 ! ; 6271 1 ! None. ; 6272 1 ! ; 6273 1 ! COMPLETION CODES: ; 6274 1 ! ; 6275 1 ! None. ; 6276 1 ! ; 6277 1 ! SIDE EFFECTS: ; 6278 1 ! ; 6279 1 ! None. ; 6280 1 ! ; 6281 1 !-- ; 6282 1 ; 6283 2 BEGIN ; 6284 2 TT_CHAR (%C'['); ! Start the message ; 6285 2 ; 6286 2 CASE .STATE FROM STATE_MIN TO STATE_MAX OF ; 6287 2 SET ; 6288 2 ; 6289 2 [STATE_ID, STATE_II] : ; 6290 2 TT_TEXT (UPLIT (%ASCIZ'Idle in server mode')); ; 6291 2 ; 6292 2 [STATE_S, STATE_SF] : ; 6293 3 BEGIN ; 6294 3 TT_TEXT (UPLIT (%ASCIZ'Initializing for sending file ')); ; 6295 3 TT_TEXT (FILE_NAME); ; 6296 2 END; ; 6297 2 ; 6298 2 [STATE_SI] : ; 6299 2 TT_TEXT (UPLIT (%ASCIZ'Initializing for remote command')); ; 6300 2 ; 6301 2 [STATE_SG] : ; 6302 2 TT_TEXT (UPLIT (%ASCIZ'Waiting for response to remote command')); ; 6303 2 ; 6304 2 [STATE_SD] : ; 6305 3 BEGIN ; 6306 3 TT_NUMBER (.FILE_CHARS); ; 6307 3 TT_TEXT (UPLIT (%ASCIZ' characters sent for file ')); ; 6308 3 TT_TEXT (FILE_NAME); ; 6309 2 END; ; 6310 2 ; 6311 2 [STATE_SZ] : ; 6312 3 BEGIN ; 6313 3 TT_TEXT (UPLIT (%ASCIZ'At end of file ')); ; 6314 3 TT_TEXT (FILE_NAME); ; 6315 2 END; ; 6316 2 ; 6317 2 [STATE_SB] : ; 6318 2 TT_TEXT (UPLIT (%ASCIZ'Finishing transfer session')); ; 6319 2 ; 6320 2 [STATE_R] : ; 6321 2 TT_TEXT (UPLIT (%ASCIZ'Waiting for initialization')); ; 6322 2 ; 6323 2 [STATE_RF] : ; 6324 2 TT_TEXT (UPLIT (%ASCIZ'Waiting for next file or end of session')); ; 6325 2 ; 6326 2 [STATE_RD] : ; 6327 3 BEGIN ; 6328 3 TT_NUMBER (.FILE_CHARS); ; 6329 3 TT_TEXT (UPLIT (%ASCIZ' characters received for file ')); ; 6330 3 TT_TEXT (FILE_NAME); ; 6331 2 END; ; 6332 2 ; 6333 2 [STATE_C] : ; 6334 2 TT_TEXT (UPLIT (%ASCIZ' Session complete')); ; 6335 2 ; 6336 2 [STATE_A] : ; 6337 2 TT_TEXT (UPLIT (%ASCIZ' Session aborted')); ; 6338 2 ; 6339 2 [INRANGE, OUTRANGE] : ; 6340 2 TT_TEXT (UPLIT (%ASCIZ' Unknown state')); ; 6341 2 TES; ; 6342 2 ; 6343 2 SELECTONE .STATE OF ; 6344 2 SET ; 6345 2 ; 6346 2 [STATE_S, STATE_SF, STATE_SD, STATE_SZ, STATE_SB] : ; 6347 3 BEGIN ; 6348 3 ; 6349 3 IF .RMSG_NAKS GTR 0 ; 6350 3 THEN ; 6351 4 BEGIN ; 6352 4 TT_TEXT (UPLIT (%ASCIZ', ')); ; 6353 4 TT_NUMBER (.RMSG_NAKS); ; 6354 4 TT_TEXT (UPLIT (%ASCIZ' NAKs received')); ; 6355 3 END; ; 6356 3 ; 6357 2 END; ; 6358 2 ; 6359 2 [STATE_R, STATE_RF, STATE_RD] : ; 6360 3 BEGIN ; 6361 3 ; 6362 3 IF .SMSG_NAKS GTR 0 ; 6363 3 THEN ; 6364 4 BEGIN ; 6365 4 TT_TEXT (UPLIT (%ASCIZ', ')); ; 6366 4 TT_NUMBER (.SMSG_NAKS); ; 6367 4 TT_TEXT (UPLIT (%ASCIZ' NAKs sent')); ; 6368 3 END; ; 6369 3 ; 6370 2 END; ; 6371 2 TES; ; 6372 2 ; 6373 2 TT_CHAR (%C']'); ! End the line ; 6374 2 TT_CRLF (); ! with a CRLF ; 6375 1 END; ! End of STS_OUTPUT .PSECT $PLIT$,NOWRT,NOEXE,2 P.AAO: .ASCII \Idle in server mode\<0> ; ; P.AAP: .ASCII \Initializing for sending file \<0><0> ; ; P.AAQ: .ASCII \Initializing for remote command\<0> ; ; P.AAR: .ASCII \Waiting for response to remote command\<0><0> ; ; P.AAS: .ASCII \ characters sent for file \<0><0> ; ; P.AAT: .ASCII \At end of file \<0> ; ; P.AAU: .ASCII \Finishing transfer session\<0><0> ; ; P.AAV: .ASCII \Waiting for initialization\<0><0> ; ; P.AAW: .ASCII \Waiting for next file or end of session\<0> ; ; P.AAX: .ASCII \ characters received for file \<0><0> ; ; P.AAY: .ASCII \ Session complete\<0><0><0> ; ; P.AAZ: .ASCII \ Session aborted\<0><0><0><0> ; ; P.ABA: .ASCII \ Unknown state\<0><0> ; ; P.ABB: .ASCII \, \<0><0> ; ; P.ABC: .ASCII \ NAKs received\<0><0> ; ; P.ABD: .ASCII \, \<0><0> ; ; P.ABE: .ASCII \ NAKs sent\<0><0> ; ; .PSECT $CODE$,NOWRT,2 ;STS_OUTPUT U.33: .WORD ^M ;Save R2,R3,R4 ; 6245 MOVAB W^TT_NUMBER, R4 ;TT_NUMBER, R4 ; MOVAB W^TT_TEXT, R3 ;TT_TEXT, R3 ; MOVAB W^P.ABA, R2 ;P.ABA, R2 ; MOVZBL #91, -(SP) ;#91, -(SP) ; 6284 CALLS #1, W^TT_CHAR ;#1, TT_CHAR ; CASEL W^U.49, #1, #19 ;U.49, #1, #19 ; 6286 1$: .WORD 4$-1$,- ;4$-1$,- ; 4$-1$,- ;4$-1$,- ; 7$-1$,- ;7$-1$,- ; 8$-1$,- ;8$-1$,- ; 10$-1$,- ;10$-1$,- ; 11$-1$,- ;11$-1$,- ; 12$-1$,- ;12$-1$,- ; 13$-1$,- ;13$-1$,- ; 14$-1$,- ;14$-1$,- ; 15$-1$,- ;15$-1$,- ; 2$-1$,- ;2$-1$,- ; 6$-1$,- ;6$-1$,- ; 5$-1$,- ;5$-1$,- ; 3$-1$,- ;3$-1$,- ; 3$-1$,- ;3$-1$,- ; 2$-1$,- ;2$-1$,- ; 2$-1$,- ;2$-1$,- ; 2$-1$,- ;2$-1$,- ; 2$-1$,- ;2$-1$,- ; 2$-1$ ;2$-1$ ; 2$: PUSHL R2 ;R2 ; 6340 BRB 16$ ;16$ ; 3$: PUSHAB -336(R2) ;P.AAO ; 6290 BRB 16$ ;16$ ; 4$: PUSHAB -316(R2) ;P.AAP ; 6294 BRB 9$ ;9$ ; 5$: PUSHAB -284(R2) ;P.AAQ ; 6299 BRB 16$ ;16$ ; 6$: PUSHAB -252(R2) ;P.AAR ; 6302 BRB 16$ ;16$ ; 7$: PUSHL W^U.59 ;U.59 ; 6306 CALLS #1, (R4) ;#1, TT_NUMBER ; PUSHAB -212(R2) ;P.AAS ; 6307 BRB 9$ ;9$ ; 8$: PUSHAB -184(R2) ;P.AAT ; 6313 9$: CALLS #1, (R3) ;#1, TT_TEXT ; PUSHAB W^FILE_NAME ;FILE_NAME ; 6314 BRB 16$ ;16$ ; 10$: PUSHAB -168(R2) ;P.AAU ; 6318 BRB 16$ ;16$ ; 11$: PUSHAB -140(R2) ;P.AAV ; 6321 BRB 16$ ;16$ ; 12$: PUSHAB -112(R2) ;P.AAW ; 6324 BRB 16$ ;16$ ; 13$: PUSHL W^U.59 ;U.59 ; 6328 CALLS #1, (R4) ;#1, TT_NUMBER ; PUSHAB -72(R2) ;P.AAX ; 6329 BRB 9$ ;9$ ; 14$: PUSHAB -40(R2) ;P.AAY ; 6334 BRB 16$ ;16$ ; 15$: PUSHAB -20(R2) ;P.AAZ ; 6337 16$: CALLS #1, (R3) ;#1, TT_TEXT ; MOVL W^U.49, R0 ;U.49, R0 ; 6343 BLEQ 17$ ;17$ ; 6346 CMPL R0, #5 ;R0, #5 ; BGTR 17$ ;17$ ; TSTL W^RMSG_NAKS ;RMSG_NAKS ; 6349 BLEQ 19$ ;19$ ; PUSHAB 16(R2) ;P.ABB ; 6352 CALLS #1, (R3) ;#1, TT_TEXT ; PUSHL W^RMSG_NAKS ;RMSG_NAKS ; 6353 CALLS #1, (R4) ;#1, TT_NUMBER ; PUSHAB 20(R2) ;P.ABC ; 6354 BRB 18$ ;18$ ; 17$: CMPL R0, #6 ;R0, #6 ; 6359 BLSS 19$ ;19$ ; CMPL R0, #8 ;R0, #8 ; BGTR 19$ ;19$ ; TSTL W^SMSG_NAKS ;SMSG_NAKS ; 6362 BLEQ 19$ ;19$ ; PUSHAB 36(R2) ;P.ABD ; 6365 CALLS #1, (R3) ;#1, TT_TEXT ; PUSHL W^SMSG_NAKS ;SMSG_NAKS ; 6366 CALLS #1, (R4) ;#1, TT_NUMBER ; PUSHAB 40(R2) ;P.ABE ; 6367 18$: CALLS #1, (R3) ;#1, TT_TEXT ; 19$: MOVZBL #93, -(SP) ;#93, -(SP) ; 6373 CALLS #1, W^TT_CHAR ;#1, TT_CHAR ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 6374 RET ; ; 6375 ; Routine Size: 252 bytes, Routine Base: $CODE$ + 2277 ; 6376 1 %SBTTL 'TYPE_CHAR - Type out a character' ; 6377 1 ROUTINE TYPE_CHAR (CHARACTER) = ; 6378 1 ; 6379 1 !++ ; 6380 1 ! FUNCTIONAL DESCRIPTION: ; 6381 1 ! ; 6382 1 ! This routine is used as an alternate output routine for BFR_EMPTY. ; 6383 1 ! It will type the character on the terminal, and always return a ; 6384 1 ! true status. ; 6385 1 ! ; 6386 1 ! CALLING SEQUENCE: ; 6387 1 ! ; 6388 1 ! STATUS = TYPE_CHAR (.CHARACTER); ; 6389 1 ! ; 6390 1 ! INPUT PARAMETERS: ; 6391 1 ! ; 6392 1 ! CHARACTER - The character to type ; 6393 1 ! ; 6394 1 ! IMPLICIT INPUTS: ; 6395 1 ! ; 6396 1 ! None. ; 6397 1 ! ; 6398 1 ! OUPTUT PARAMETERS: ; 6399 1 ! ; 6400 1 ! None. ; 6401 1 ! ; 6402 1 ! IMPLICIT OUTPUTS: ; 6403 1 ! ; 6404 1 ! None. ; 6405 1 ! ; 6406 1 ! COMPLETION CODES: ; 6407 1 ! ; 6408 1 ! None. ; 6409 1 ! ; 6410 1 ! SIDE EFFECTS: ; 6411 1 ! ; 6412 1 ! None. ; 6413 1 ! ; 6414 1 !-- ; 6415 1 ; 6416 2 BEGIN ; 6417 2 TT_CHAR (.CHARACTER); ! Type the character ; 6418 2 RETURN KER_NORMAL; ! And return OK ; 6419 1 END; ! End of TYPE_CHAR ;TYPE_CHAR U.31: .WORD ^M<> ;Save nothing ; 6377 PUSHL 4(AP) ;CHARACTER ; 6417 CALLS #1, W^TT_CHAR ;#1, TT_CHAR ; MOVL #134316043, R0 ;#134316043, R0 ; 6418 RET ; ; 6419 ; Routine Size: 18 bytes, Routine Base: $CODE$ + 2373 ; 6420 1 %SBTTL 'Debugging -- DBG_SEND' ; 6421 1 ROUTINE DBG_SEND (ADDRESS, LENGTH) : NOVALUE = ; 6422 1 ; 6423 1 !++ ; 6424 1 ! FUNCTIONAL DESCRIPTION: ; 6425 1 ! ; 6426 1 ! This routine will output the message that is going to be sent ; 6427 1 ! as part of the debugging information that is turned on in the ; 6428 1 ! SET DEBUG command. ; 6429 1 ! ; 6430 1 ! CALLING SEQUENCE: ; 6431 1 ! ; 6432 1 ! DBG_SEND(MSG_ADDRESS, MSG_LENGTH); ; 6433 1 ! ; 6434 1 ! INPUT PARAMETERS: ; 6435 1 ! ; 6436 1 ! MSG_ADDRESS - Address of the message that is going to be sent ; 6437 1 ! to the remote KERMIT. The bytes are CHR_SIZE. ; 6438 1 ! MSG_LENGTH - Length of the message. ; 6439 1 ! ; 6440 1 ! IMPLICIT INPUTS: ; 6441 1 ! ; 6442 1 ! None. ; 6443 1 ! ; 6444 1 ! OUTPUT PARAMETERS: ; 6445 1 ! ; 6446 1 ! None. ; 6447 1 ! ; 6448 1 ! IMPLICIT OUTPUTS: ; 6449 1 ! ; 6450 1 ! None. ; 6451 1 ! ; 6452 1 ! COMPLETION CODES: ; 6453 1 ! ; 6454 1 ! None. ; 6455 1 ! ; 6456 1 ! SIDE EFFECTS: ; 6457 1 ! ; 6458 1 ! None. ; 6459 1 ! ; 6460 1 !-- ; 6461 1 ; 6462 2 BEGIN ; 6463 2 ; 6464 2 BIND ; 6465 2 SEND_TEXT = UPLIT (%ASCIZ'Sending...'); ; 6466 2 ; 6467 2 IF .DEBUG_FLAG ; 6468 2 THEN ; 6469 3 BEGIN ; 6470 3 ; 6471 3 LOCAL ; 6472 3 OLD_RTN; ; 6473 3 ; 6474 3 OLD_RTN = TT_SET_OUTPUT (DBG_DUMP); ; 6475 3 TT_TEXT (SEND_TEXT); ; 6476 3 DBG_MESSAGE (.ADDRESS, .LENGTH); ; 6477 3 TT_SET_OUTPUT (.OLD_RTN); ; 6478 2 END; ; 6479 2 ; 6480 1 END; ! End of DBG_SEND .PSECT $PLIT$,NOWRT,NOEXE,2 P.ABF: .ASCII \Sending...\<0><0> ; ; U.100= P.ABF .PSECT $CODE$,NOWRT,2 ;DBG_SEND U.35: .WORD ^M ;Save R2 ; 6421 BLBC W^DEBUG_FLAG, 1$ ;DEBUG_FLAG, 1$ ; 6467 PUSHAB W^DBG_DUMP ;DBG_DUMP ; 6474 CALLS #1, W^TT_SET_OUTPUT ;#1, TT_SET_OUTPUT ; MOVL R0, R2 ;R0, OLD_RTN ; PUSHAB W^U.100 ;U.100 ; 6475 CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; MOVQ 4(AP), -(SP) ;ADDRESS, -(SP) ; 6476 CALLS #2, W^U.34 ;#2, U.34 ; PUSHL R2 ;OLD_RTN ; 6477 CALLS #1, W^TT_SET_OUTPUT ;#1, TT_SET_OUTPUT ; 1$: RET ; ; 6480 ; Routine Size: 45 bytes, Routine Base: $CODE$ + 2385 ; 6481 1 %SBTTL 'Debugging -- DBG_RECEIVE' ; 6482 1 ROUTINE DBG_RECEIVE (ADDRESS) : NOVALUE = ; 6483 1 ; 6484 1 !++ ; 6485 1 ! FUNCTIONAL DESCRIPTION: ; 6486 1 ! ; 6487 1 ! This routine will output the message that was received from ; 6488 1 ! the remote KERMIT. This routine is called only if the DEBUG_FLAG ; 6489 1 ! is true. ; 6490 1 ! ; 6491 1 ! CALLING SEQUENCE: ; 6492 1 ! ; 6493 1 ! DBG_RECEIVE(MSG_ADDRESS); ; 6494 1 ! ; 6495 1 ! INPUT PARAMETERS: ; 6496 1 ! ; 6497 1 ! MSG_ADDRESS - Address of the message received by the remote KERMIT. ; 6498 1 ! ; 6499 1 ! IMPLICIT INPUTS: ; 6500 1 ! ; 6501 1 ! None. ; 6502 1 ! ; 6503 1 ! OUTPUT PARAMETERS: ; 6504 1 ! ; 6505 1 ! None. ; 6506 1 ! ; 6507 1 ! IMPLICIT OUTPUTS: ; 6508 1 ! ; 6509 1 ! None. ; 6510 1 ! ; 6511 1 ! COMPLETION CODES: ; 6512 1 ! ; 6513 1 ! None. ; 6514 1 ! ; 6515 1 ! SIDE EFFECTS: ; 6516 1 ! ; 6517 1 ! None. ; 6518 1 ! ; 6519 1 !-- ; 6520 1 ; 6521 2 BEGIN ; 6522 2 ; 6523 2 BIND ; 6524 2 RECEIVE_TEXT = UPLIT (%ASCIZ'Received...'); ; 6525 2 ; 6526 2 IF .DEBUG_FLAG ; 6527 2 THEN ; 6528 3 BEGIN ; 6529 3 ; 6530 3 LOCAL ; 6531 3 OLD_RTN; ; 6532 3 ; 6533 3 OLD_RTN = TT_SET_OUTPUT (DBG_DUMP); ; 6534 3 TT_TEXT (RECEIVE_TEXT); ; 6535 3 DBG_MESSAGE (.ADDRESS, .REC_LENGTH); ; 6536 3 TT_SET_OUTPUT (.OLD_RTN); ; 6537 2 END; ; 6538 2 ; 6539 1 END; ! End of DBG_RECEIVE .PSECT $PLIT$,NOWRT,NOEXE,2 P.ABG: .ASCII \Received...\<0> ; ; U.101= P.ABG .PSECT $CODE$,NOWRT,2 ;DBG_RECEIVE U.36: .WORD ^M ;Save R2 ; 6482 BLBC W^DEBUG_FLAG, 1$ ;DEBUG_FLAG, 1$ ; 6526 PUSHAB W^DBG_DUMP ;DBG_DUMP ; 6533 CALLS #1, W^TT_SET_OUTPUT ;#1, TT_SET_OUTPUT ; MOVL R0, R2 ;R0, OLD_RTN ; PUSHAB W^U.101 ;U.101 ; 6534 CALLS #1, W^TT_TEXT ;#1, TT_TEXT ; PUSHL W^U.55 ;U.55 ; 6535 PUSHL 4(AP) ;ADDRESS ; CALLS #2, W^U.34 ;#2, U.34 ; PUSHL R2 ;OLD_RTN ; 6536 CALLS #1, W^TT_SET_OUTPUT ;#1, TT_SET_OUTPUT ; 1$: RET ; ; 6539 ; Routine Size: 48 bytes, Routine Base: $CODE$ + 23B2 ; 6540 1 %SBTTL 'Debugging -- DBG_MESSAGE' ; 6541 1 ROUTINE DBG_MESSAGE (MSG_ADDRESS, MSG_LENGTH) : NOVALUE = ; 6542 1 ; 6543 1 !++ ; 6544 1 ! FUNCTIONAL DESCRIPTION: ; 6545 1 ! ; 6546 1 ! This routine will display a message that is either being sent ; 6547 1 ! or received on the user's terminal. ; 6548 1 ! ; 6549 1 ! CALLING SEQUENCE: ; 6550 1 ! ; 6551 1 ! DBG_MESSAGE(MSG_ADDRESS, MSG_LENGTH); ; 6552 1 ! ; 6553 1 ! INPUT PARAMETERS: ; 6554 1 ! ; 6555 1 ! MSG_ADDRESS - Address of the message to be output ; 6556 1 ! MSG_LENGTH - Length of the message to be output. ; 6557 1 ! ; 6558 1 ! IMPLICIT INPUTS: ; 6559 1 ! ; 6560 1 ! None. ; 6561 1 ! ; 6562 1 ! OUTPUT PARAMETERS: ; 6563 1 ! ; 6564 1 ! None. ; 6565 1 ! ; 6566 1 ! IMPLICIT OUTPUTS: ; 6567 1 ! ; 6568 1 ! None. ; 6569 1 ! ; 6570 1 ! COMPLETION CODES: ; 6571 1 ! ; 6572 1 ! None. ; 6573 1 ! ; 6574 1 ! SIDE EFFECTS: ; 6575 1 ! ; 6576 1 ! None. ; 6577 1 ! ; 6578 1 !-- ; 6579 1 ; 6580 2 BEGIN ; 6581 2 ; 6582 2 MAP ; 6583 2 MSG_ADDRESS : REF VECTOR [CH$ALLOCATION (MAX_MSG, CHR_SIZE)]; ! Point to the vector ; 6584 2 ; 6585 2 LOCAL ; 6586 2 OLD_RTN, ! Old type out routine ; 6587 2 CHKSUM, ! Numeric value of block check ; 6588 2 TEMP_POINTER, ! Temporary character pointer ; 6589 2 MSG_LEN; ; 6590 2 ; 6591 2 ! ; 6592 2 ! Message type text ; 6593 2 ! ; 6594 2 ; 6595 2 BIND ; 6596 2 DATA_TEXT = UPLIT (%ASCIZ' (Data)'), ; 6597 2 ACK_TEXT = UPLIT (%ASCIZ' (ACK)'), ; 6598 2 NAK_TEXT = UPLIT (%ASCIZ' (NAK)'), ; 6599 2 SND_INIT_TEXT = UPLIT (%ASCIZ' (Send init)'), ; 6600 2 BREAK_TEXT = UPLIT (%ASCIZ' (Break)'), ; 6601 2 TEXT_TEXT = UPLIT (%ASCIZ' (Text header)'), ; 6602 2 FILE_TEXT = UPLIT (%ASCIZ' (File header)'), ; 6603 2 EOF_TEXT = UPLIT (%ASCIZ' (EOF)'), ; 6604 2 ERROR_TEXT = UPLIT (%ASCIZ' (Error)'), ; 6605 2 RCV_INIT_TEXT = UPLIT (%ASCIZ' (Receive initiate)'), ; 6606 2 COMMAND_TEXT = UPLIT (%ASCIZ' (Command)'), ; 6607 2 KERMIT_TEXT = UPLIT (%ASCIZ' (Generic KERMIT command)'); ; 6608 2 ; 6609 2 ! ; 6610 2 ! Header information ; 6611 2 ! ; 6612 2 ; 6613 2 BIND ; 6614 2 MN_TEXT = UPLIT (%ASCIZ'Message number: '), ; 6615 2 LENGTH_TEXT = UPLIT (%ASCIZ' Length: '), ; 6616 2 DEC_TEXT = UPLIT (%ASCIZ' (dec)'), ; 6617 2 MSG_TYP_TEXT = UPLIT (%ASCIZ'Message type: '), ; 6618 2 CHKSUM_TEXT = UPLIT (%ASCIZ'Checksum: '), ; 6619 2 CHKSUM_NUM_TEXT = UPLIT (%ASCIZ' = '), ; 6620 2 OPT_DATA_TEXT = UPLIT (%ASCIZ'Optional data: '), ; 6621 2 PRE_CHAR_TEXT = UPLIT (%ASCIZ' "'); ; 6622 2 ; 6623 2 ! ; 6624 2 ! Ensure that the type out will go to the debugging location ; 6625 2 ! ; 6626 2 OLD_RTN = TT_SET_OUTPUT (DBG_DUMP); ; 6627 2 ! ; 6628 2 ! Preliminary calculations ; 6629 2 ! ; 6630 2 MSG_LEN = UNCHAR (CH$RCHAR (CH$PTR (.MSG_ADDRESS, PKT_COUNT, CHR_SIZE))); ; 6631 2 ! ; 6632 2 ! First output some header information for the packet. ; 6633 2 ! ; 6634 2 TT_CRLF (); ; 6635 2 TT_TEXT (MN_TEXT); ; 6636 2 TT_NUMBER (UNCHAR (CH$RCHAR (CH$PTR (.MSG_ADDRESS, PKT_SEQ, CHR_SIZE)))); ; 6637 2 TT_TEXT (DEC_TEXT); ; 6638 2 TT_TEXT (LENGTH_TEXT); ; 6639 2 TT_NUMBER (.MSG_LEN); ; 6640 2 TT_TEXT (DEC_TEXT); ; 6641 2 TT_CRLF (); ; 6642 2 ! ; 6643 2 ! Now output the message type and dependent information ; 6644 2 ! ; 6645 2 TT_TEXT (MSG_TYP_TEXT); ; 6646 2 TT_CHAR (CH$RCHAR (CH$PTR (.MSG_ADDRESS, PKT_TYPE, CHR_SIZE))); ; 6647 2 ; 6648 2 SELECTONE CH$RCHAR (CH$PTR (.MSG_ADDRESS, PKT_TYPE, CHR_SIZE)) OF ; 6649 2 SET ; 6650 2 ; 6651 2 [MSG_DATA] : ; 6652 2 TT_TEXT (DATA_TEXT); ; 6653 2 ; 6654 2 [MSG_ACK] : ; 6655 2 TT_TEXT (ACK_TEXT); ; 6656 2 ; 6657 2 [MSG_NAK] : ; 6658 2 TT_TEXT (NAK_TEXT); ; 6659 2 ; 6660 2 [MSG_SND_INIT] : ; 6661 2 TT_TEXT (SND_INIT_TEXT); ; 6662 2 ; 6663 2 [MSG_BREAK] : ; 6664 2 TT_TEXT (BREAK_TEXT); ; 6665 2 ; 6666 2 [MSG_FILE] : ; 6667 2 TT_TEXT (FILE_TEXT); ; 6668 2 ; 6669 2 [MSG_TEXT] : ; 6670 2 TT_TEXT (TEXT_TEXT); ; 6671 2 ; 6672 2 [MSG_EOF] : ; 6673 2 TT_TEXT (EOF_TEXT); ; 6674 2 ; 6675 2 [MSG_ERROR] : ; 6676 2 TT_TEXT (ERROR_TEXT); ; 6677 2 ; 6678 2 [MSG_GENERIC] : ; 6679 2 TT_TEXT (KERMIT_TEXT); ; 6680 2 ; 6681 2 [MSG_COMMAND] : ; 6682 2 TT_TEXT (COMMAND_TEXT); ; 6683 2 TES; ; 6684 2 ; 6685 2 TT_CRLF (); ; 6686 2 ! ; 6687 2 ! Now output any of the optional data. ; 6688 2 ! ; 6689 2 ; 6690 2 IF .MSG_LEN - PKT_OVR_HEAD - (.BLK_CHK_TYPE - CHK_1CHAR) NEQ 0 ; 6691 2 THEN ; 6692 3 BEGIN ; 6693 3 TT_TEXT (OPT_DATA_TEXT); ; 6694 3 TT_CRLF (); ; 6695 3 TEMP_POINTER = CH$PTR (.MSG_ADDRESS, PKT_MSG, CHR_SIZE); ; 6696 3 ; 6697 3 INCR I FROM 1 TO .MSG_LEN - PKT_OVR_HEAD - (.BLK_CHK_TYPE - CHK_1CHAR) DO ; 6698 4 BEGIN ; 6699 4 ; 6700 4 IF (.I MOD 10) EQL 1 ; 6701 4 THEN ; 6702 5 BEGIN ; 6703 5 TT_CRLF (); ; 6704 5 TT_CHAR (CHR_TAB); ; 6705 4 END; ; 6706 4 ; 6707 4 TT_TEXT (PRE_CHAR_TEXT); ; 6708 4 TT_CHAR (CH$RCHAR_A (TEMP_POINTER)); ; 6709 4 TT_CHAR (%C'"'); ; 6710 3 END; ; 6711 3 ; 6712 3 IF ((.MSG_LEN - PKT_OVR_HEAD - (.BLK_CHK_TYPE - CHK_1CHAR)) MOD 10) EQL 1 THEN TT_CRLF (); ; 6713 3 ; 6714 3 TT_CRLF (); ; 6715 2 END; ; 6716 2 ; 6717 2 ! ; 6718 2 ! Now output the checksum for the message that we received ; 6719 2 ! ; 6720 2 ! This could be either 1 two or three characters. ; 6721 2 TT_TEXT (CHKSUM_TEXT); ; 6722 2 TEMP_POINTER = CH$PTR (.MSG_ADDRESS, ; 6723 2 PKT_MSG + .MSG_LEN + PKT_CHKSUM - PKT_OVR_HEAD - (.BLK_CHK_TYPE - CHK_1CHAR), CHR_SIZE); ; 6724 2 ; 6725 2 CASE .BLK_CHK_TYPE FROM CHK_1CHAR TO CHK_CRC OF ; 6726 2 SET ; 6727 2 ; 6728 2 [CHK_1CHAR] : ; 6729 3 BEGIN ; 6730 3 TT_TEXT (PRE_CHAR_TEXT); ; 6731 3 TT_CHAR (CH$RCHAR (.TEMP_POINTER)); ; 6732 3 TT_CHAR (%C'"'); ; 6733 3 CHKSUM = UNCHAR (CH$RCHAR (.TEMP_POINTER)); ; 6734 2 END; ; 6735 2 ; 6736 2 [CHK_2CHAR] : ; 6737 3 BEGIN ; 6738 3 CHKSUM = 0; ; 6739 3 TT_TEXT (PRE_CHAR_TEXT); ; 6740 3 TT_CHAR (CH$RCHAR (.TEMP_POINTER)); ; 6741 3 TT_CHAR (%C'"'); ; 6742 3 CHKSUM<6, 6> = UNCHAR (CH$RCHAR_A (TEMP_POINTER)); ; 6743 3 TT_TEXT (PRE_CHAR_TEXT); ; 6744 3 TT_CHAR (CH$RCHAR (.TEMP_POINTER)); ; 6745 3 TT_CHAR (%C'"'); ; 6746 3 CHKSUM<0, 6> = UNCHAR (CH$RCHAR (.TEMP_POINTER)); ; 6747 2 END; ; 6748 2 ; 6749 2 [CHK_CRC] : ; 6750 3 BEGIN ; 6751 3 CHKSUM = 0; ; 6752 3 TT_TEXT (PRE_CHAR_TEXT); ; 6753 3 TT_CHAR (CH$RCHAR (.TEMP_POINTER)); ; 6754 3 TT_CHAR (%C'"'); ; 6755 3 CHKSUM<12, 4> = UNCHAR (CH$RCHAR_A (TEMP_POINTER)); ; 6756 3 TT_TEXT (PRE_CHAR_TEXT); ; 6757 3 TT_CHAR (CH$RCHAR (.TEMP_POINTER)); ; 6758 3 TT_CHAR (%C'"'); ; 6759 3 CHKSUM<6, 6> = UNCHAR (CH$RCHAR_A (TEMP_POINTER)); ; 6760 3 TT_TEXT (PRE_CHAR_TEXT); ; 6761 3 TT_CHAR (CH$RCHAR (.TEMP_POINTER)); ; 6762 3 TT_CHAR (%C'"'); ; 6763 3 CHKSUM<0, 6> = UNCHAR (CH$RCHAR (.TEMP_POINTER)); ; 6764 2 END; ; 6765 2 TES; ; 6766 2 ; 6767 2 TT_TEXT (CHKSUM_NUM_TEXT); ; 6768 2 TT_NUMBER (.CHKSUM); ; 6769 2 TT_TEXT (DEC_TEXT); ; 6770 2 TT_CRLF (); ; 6771 2 TT_SET_OUTPUT (.OLD_RTN); ! Reset output destination ; 6772 1 END; ! End of DBG_MESSAGE .PSECT $PLIT$,NOWRT,NOEXE,2 P.ABH: .ASCII \ (Data)\<0> ; ; P.ABI: .ASCII \ (ACK)\<0><0> ; ; P.ABJ: .ASCII \ (NAK)\<0><0> ; ; P.ABK: .ASCII \ (Send init)\<0><0><0><0> ; ; P.ABL: .ASCII \ (Break)\<0><0><0><0> ; ; P.ABM: .ASCII \ (Text header)\<0><0> ; ; P.ABN: .ASCII \ (File header)\<0><0> ; ; P.ABO: .ASCII \ (EOF)\<0><0> ; ; P.ABP: .ASCII \ (Error)\<0><0><0><0> ; ; P.ABQ: .ASCII \ (Receive initiate)\<0> ; ; P.ABR: .ASCII \ (Command)\<0><0> ; ; P.ABS: .ASCII \ (Generic KERMIT command)\<0><0><0> ; ; P.ABT: .ASCII \Message number: \<0><0><0><0> ; ; P.ABU: .ASCII <9>\Length: \<0><0><0> ; ; P.ABV: .ASCII \ (dec)\<0><0> ; ; P.ABW: .ASCII \Message type: \<0><0> ; ; P.ABX: .ASCII \Checksum: \<0><0> ; ; P.ABY: .ASCII \ = \<0> ; ; P.ABZ: .ASCII \Optional data: \<0> ; ; P.ACA: .ASCII \ "\<0><0> ; ; U.103= P.ABH U.104= P.ABI U.105= P.ABJ U.106= P.ABK U.107= P.ABL U.108= P.ABM U.109= P.ABN U.110= P.ABO U.111= P.ABP U.112= P.ABQ U.113= P.ABR U.114= P.ABS U.115= P.ABT U.116= P.ABU U.117= P.ABV U.118= P.ABW U.119= P.ABX U.120= P.ABY U.121= P.ABZ U.122= P.ACA .PSECT $CODE$,NOWRT,2 ;DBG_MESSAGE U.34: .WORD ^M ;Save R2,R3,R4,R5,R6,R7,R8,R9,R10,R11 ; 6541 MOVAB W^TT_CHAR, R11 ;TT_CHAR, R11 ; MOVAB W^TT_TEXT, R10 ;TT_TEXT, R10 ; MOVAB W^U.122, R9 ;U.122, R9 ; PUSHAB W^DBG_DUMP ;DBG_DUMP ; 6626 CALLS #1, W^TT_SET_OUTPUT ;#1, TT_SET_OUTPUT ; MOVL R0, R8 ;R0, OLD_RTN ; MOVL 4(AP), R4 ;MSG_ADDRESS, R4 ; 6630 MOVZBL 1(R4), R3 ;1(R4), MSG_LEN ; SUBL2 #32, R3 ;#32, MSG_LEN ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 6634 PUSHAB -88(R9) ;MN_TEXT ; 6635 CALLS #1, (R10) ;#1, TT_TEXT ; MOVZBL 2(R4), -(SP) ;2(R4), -(SP) ; 6636 SUBL2 #32, (SP) ;#32, (SP) ; CALLS #1, W^TT_NUMBER ;#1, TT_NUMBER ; PUSHAB -56(R9) ;DEC_TEXT ; 6637 CALLS #1, (R10) ;#1, TT_TEXT ; PUSHAB -68(R9) ;LENGTH_TEXT ; 6638 CALLS #1, (R10) ;#1, TT_TEXT ; PUSHL R3 ;MSG_LEN ; 6639 CALLS #1, W^TT_NUMBER ;#1, TT_NUMBER ; PUSHAB -56(R9) ;DEC_TEXT ; 6640 CALLS #1, (R10) ;#1, TT_TEXT ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 6641 PUSHAB -48(R9) ;MSG_TYP_TEXT ; 6645 CALLS #1, (R10) ;#1, TT_TEXT ; MOVZBL 3(R4), R2 ;3(R4), R2 ; 6646 PUSHL R2 ;R2 ; CALLS #1, (R11) ;#1, TT_CHAR ; CMPB R2, #68 ;R2, #68 ; 6651 BNEQ 1$ ;1$ ; PUSHAB -252(R9) ;DATA_TEXT ; 6652 BRB 11$ ;11$ ; 1$: CMPB R2, #89 ;R2, #89 ; 6654 BNEQ 2$ ;2$ ; PUSHAB -244(R9) ;ACK_TEXT ; 6655 BRB 11$ ;11$ ; 2$: CMPB R2, #78 ;R2, #78 ; 6657 BNEQ 3$ ;3$ ; PUSHAB -236(R9) ;NAK_TEXT ; 6658 BRB 11$ ;11$ ; 3$: CMPB R2, #83 ;R2, #83 ; 6660 BNEQ 4$ ;4$ ; PUSHAB -228(R9) ;SND_INIT_TEXT ; 6661 BRB 11$ ;11$ ; 4$: CMPB R2, #66 ;R2, #66 ; 6663 BNEQ 5$ ;5$ ; PUSHAB -212(R9) ;BREAK_TEXT ; 6664 BRB 11$ ;11$ ; 5$: CMPB R2, #70 ;R2, #70 ; 6666 BNEQ 6$ ;6$ ; PUSHAB -184(R9) ;FILE_TEXT ; 6667 BRB 11$ ;11$ ; 6$: CMPB R2, #88 ;R2, #88 ; 6669 BNEQ 7$ ;7$ ; PUSHAB -200(R9) ;TEXT_TEXT ; 6670 BRB 11$ ;11$ ; 7$: CMPB R2, #90 ;R2, #90 ; 6672 BNEQ 8$ ;8$ ; PUSHAB -168(R9) ;EOF_TEXT ; 6673 BRB 11$ ;11$ ; 8$: CMPB R2, #69 ;R2, #69 ; 6675 BNEQ 9$ ;9$ ; PUSHAB -160(R9) ;ERROR_TEXT ; 6676 BRB 11$ ;11$ ; 9$: CMPB R2, #71 ;R2, #71 ; 6678 BNEQ 10$ ;10$ ; PUSHAB -116(R9) ;KERMIT_TEXT ; 6679 BRB 11$ ;11$ ; 10$: CMPB R2, #67 ;R2, #67 ; 6681 BNEQ 12$ ;12$ ; PUSHAB -128(R9) ;COMMAND_TEXT ; 6682 11$: CALLS #1, (R10) ;#1, TT_TEXT ; 12$: CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 6685 MOVAB -3(R3), R6 ;-3(R3), R6 ; 6690 SUBL3 #49, W^U.46, R0 ;#49, U.46, R0 ; CMPL R6, R0 ;R6, R0 ; BEQL 17$ ;17$ ; PUSHAB -16(R9) ;OPT_DATA_TEXT ; 6693 CALLS #1, (R10) ;#1, TT_TEXT ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 6694 MOVAB 4(R4), R2 ;4(R4), TEMP_POINTER ; 6695 SUBL3 W^U.46, R6, R0 ;U.46, R6, R0 ; 6697 MOVAB 49(R0), R7 ;49(R0), R7 ; CLRL R5 ;I ; BRB 15$ ;15$ ; 13$: EMUL #1, R5, #0, -(SP) ;#1, I, #0, -(SP) ; 6700 EDIV #10, (SP)+, R0, R0 ;#10, (SP)+, R0, R0 ; CMPL R0, #1 ;R0, #1 ; BNEQ 14$ ;14$ ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 6703 PUSHL #9 ;#9 ; 6704 CALLS #1, (R11) ;#1, TT_CHAR ; 14$: PUSHL R9 ;R9 ; 6707 CALLS #1, (R10) ;#1, TT_TEXT ; MOVZBL (R2)+, -(SP) ;(TEMP_POINTER)+, -(SP) ; 6708 CALLS #1, (R11) ;#1, TT_CHAR ; PUSHL #34 ;#34 ; 6709 CALLS #1, (R11) ;#1, TT_CHAR ; 15$: AOBLEQ R7, R5, 13$ ;R7, I, 13$ ; SUBL3 W^U.46, R6, R0 ;U.46, R6, R0 ; 6712 EMUL #1, R0, #49, -(SP) ;#1, R0, #49, -(SP) ; EDIV #10, (SP)+, R0, R0 ;#10, (SP)+, R0, R0 ; CMPL R0, #1 ;R0, #1 ; BNEQ 16$ ;16$ ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 16$: CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 6714 17$: PUSHAB -32(R9) ;CHKSUM_TEXT ; 6721 CALLS #1, (R10) ;#1, TT_TEXT ; SUBL2 W^U.46, R3 ;U.46, R3 ; 6723 MOVAB 50(R3)[R4], R2 ;50(R3)[R4], TEMP_POINTER ; CASEL W^U.46, #49, #2 ;U.46, #49, #2 ; 6725 18$: .WORD 19$-18$,- ;19$-18$,- ; 20$-18$,- ;20$-18$,- ; 21$-18$ ;21$-18$ ; 19$: PUSHL R9 ;R9 ; 6730 CALLS #1, (R10) ;#1, TT_TEXT ; MOVZBL (R2), -(SP) ;(TEMP_POINTER), -(SP) ; 6731 CALLS #1, (R11) ;#1, TT_CHAR ; PUSHL #34 ;#34 ; 6732 CALLS #1, (R11) ;#1, TT_CHAR ; MOVZBL (R2), R3 ;(TEMP_POINTER), CHKSUM ; 6733 SUBL2 #32, R3 ;#32, CHKSUM ; BRB 23$ ;23$ ; 20$: CLRL R3 ;CHKSUM ; 6738 BRB 22$ ;22$ ; 6739 21$: CLRL R3 ;CHKSUM ; 6751 PUSHL R9 ;R9 ; 6752 CALLS #1, (R10) ;#1, TT_TEXT ; MOVZBL (R2), -(SP) ;(TEMP_POINTER), -(SP) ; 6753 CALLS #1, (R11) ;#1, TT_CHAR ; PUSHL #34 ;#34 ; 6754 CALLS #1, (R11) ;#1, TT_CHAR ; MOVZBL (R2)+, R0 ;(TEMP_POINTER)+, R0 ; 6755 MOVAB -32(R0), R1 ;-32(R0), R1 ; INSV R1, #12, #4, R3 ;R1, #12, #4, CHKSUM ; 22$: PUSHL R9 ;R9 ; 6756 CALLS #1, (R10) ;#1, TT_TEXT ; MOVZBL (R2), -(SP) ;(TEMP_POINTER), -(SP) ; 6757 CALLS #1, (R11) ;#1, TT_CHAR ; PUSHL #34 ;#34 ; 6758 CALLS #1, (R11) ;#1, TT_CHAR ; MOVZBL (R2)+, R0 ;(TEMP_POINTER)+, R0 ; 6759 MOVAB -32(R0), R1 ;-32(R0), R1 ; INSV R1, #6, #6, R3 ;R1, #6, #6, CHKSUM ; PUSHL R9 ;R9 ; 6760 CALLS #1, (R10) ;#1, TT_TEXT ; MOVZBL (R2), -(SP) ;(TEMP_POINTER), -(SP) ; 6761 CALLS #1, (R11) ;#1, TT_CHAR ; PUSHL #34 ;#34 ; 6762 CALLS #1, (R11) ;#1, TT_CHAR ; MOVZBL (R2), R0 ;(TEMP_POINTER), R0 ; 6763 SUBL2 #32, R0 ;#32, R0 ; INSV R0, #0, #6, R3 ;R0, #0, #6, CHKSUM ; 23$: PUSHAB -20(R9) ;CHKSUM_NUM_TEXT ; 6767 CALLS #1, (R10) ;#1, TT_TEXT ; PUSHL R3 ;CHKSUM ; 6768 CALLS #1, W^TT_NUMBER ;#1, TT_NUMBER ; PUSHAB -56(R9) ;DEC_TEXT ; 6769 CALLS #1, (R10) ;#1, TT_TEXT ; CALLS #0, W^TT_CRLF ;#0, TT_CRLF ; 6770 PUSHL R8 ;OLD_RTN ; 6771 CALLS #1, W^TT_SET_OUTPUT ;#1, TT_SET_OUTPUT ; RET ; ; 6772 ; Routine Size: 537 bytes, Routine Base: $CODE$ + 23E2 ; 6773 1 %SBTTL 'End of KERMSG' ; 6774 1 END ; 6775 1 ; 6776 0 ELUDOM ; PSECT SUMMARY ; ; Name Bytes Attributes ; ; $OWN$ 400 NOVEC, WRT, RD ,NOEXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2) ; $GLOBAL$ 4 NOVEC, WRT, RD ,NOEXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2) ; $CODE$ 9723 NOVEC,NOWRT, RD , EXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2) ; . ABS . 0 NOVEC,NOWRT,NORD ,NOEXE,NOSHR, LCL, ABS, CON,NOPIC,ALIGN(0) ; $PLIT$ 852 NOVEC,NOWRT, RD ,NOEXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2) ; Library Statistics ; ; -------- Symbols -------- Pages Processing ; File Total Loaded Percent Mapped Time ; ; SYS$COMMON:[SYSLIB]STARLET.L32;2 10093 4 0 598 00:00.8 ; COMMAND QUALIFIERS ; BLISS KERMSG/LIST=KERMSG.MAR/MACHINE_CODE=(ASSEM,NOBINARY,UNIQUE)/NOOBJECT/SOURCE=NOHEADER ; Compilation Complete .END