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