home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpmhelp / xmodem11.hlp < prev    next >
Text File  |  1994-07-27  |  19KB  |  386 lines

  1.  
  2.                               XMODEM PROTOCOL
  3.                             (How DOES it work?)
  4.                                      by
  5.                                 Dave Larsen
  6.  
  7.                             Update 1.1 ~ 22Jan87
  8.  
  9.                   Copyright (C) 1986, All rights reserved.
  10.  
  11.  
  12.  
  13. On  more than one occasion,  I've been asked to reveal the secrets of Xmodem
  14. protocol.   Xmodem is probably the most widely used communications  protocol
  15. in  the personal computer world.   Everyone knows what it is and yet no  one
  16. seems  to know how it works.   This text will help to relieve that  problem.
  17. Or just add to it...
  18.  
  19. Xmodem  was  originally  described by Ward Christensen  and has  been  known
  20. variously as Christensen  protocol,  KMD  and so on.  In the years since its
  21. first development,  Xmodem has gone through many modifications.  Xmodem with
  22. CRC,  1k packet transfers and batch transfers are all improvements upon  the
  23. original  Xmodem protocol which relies on the generation of checksum  values
  24. for  error detection in file transfers.   This is the flavor I will describe
  25. here.
  26.  
  27. NOTE:  This text is designed to help you write your own Xmodem protocol file
  28.        transfer  routine regardless  of the language you happen to be  using
  29.        and  thus  is necessarily explained in  generic  terms.   Programming
  30.        details are entirely your problem.
  31.  
  32.  
  33. DEFINITIONS:
  34.  
  35. A.  "Flag  Byte"  and  "Status Byte"  Arbitrary names I've  given  to  bytes
  36.     transferred during an Xmodem protocol data transfer.
  37.  
  38. B.  "Block  Number"   Xmodem sends its data in  128 Byte  "Blocks."   "Block
  39.     Number"  refers to the number of the block being transferred.
  40.  
  41. C.  "Local  Block  Number"   The  Block  Number  that  you  keep  track   of
  42.     internally when receiving a file.
  43.  
  44. D.  "Remote  Block Number"  The Block Number that the sending computer sends
  45.     to you when you're receiving a file.
  46.  
  47. E.  "Checksum  #1"  and "Checksum #2"  One byte values that Xmodem  uses  in
  48.     order to detect errors in data transfer.
  49.  
  50. F.  "Prompt  the  keyboard."   By  this  I mean  that  you  should  send  an
  51.     appropriate message to the monitor and wait for a reply.
  52.  
  53. G.  "Check the keyboard."  In this instance,  you should check the  keyboard
  54.     to see if a key has been pressed.  Do not wait for a reply.
  55.  
  56. H.  "Get  the  __________."  When I say to "get" something,  that means  you
  57.     should  check  your  status port and wait until it tells  you  there  is
  58.     something in your data port.  Then, get the data from the data port.
  59.  
  60. I.  "Send  the __________."  When I say to "send" something,  that means you
  61.     should send the indicated data out the data port. If you are receiving a
  62.     file,  as  a precautionary measure you should check the status port  and
  63.     make sure that the line is clear.
  64.  
  65.  
  66. OVERVIEW:
  67.  
  68. Xmodem  could  be  described as "receiver  driven."   In  other  words,  the
  69. receiving  computer is in control of the file transfer.  It dictates to  the
  70. sending  computer when it is ready to receive data,  whether or not there is
  71. an error, and so on.
  72.  
  73. Below is a simplified example of an Xmodem transfer session.   Data sent  by
  74. the  receiving computer is in parenthesis "()" and data sent by the  sending
  75. computer is in square brackets "[]".
  76.  
  77.     1. (Flag Byte)
  78.     2. [Status Byte]
  79.     3. [Block Number]
  80.     4. [Checksum Byte #1]
  81.     5. [128 Byte "Block" of Data]
  82.     6. [Checksum Byte #2]...............go back to #1
  83.  
  84. First,  the  receiving  computer sends a Flag Byte to the sending  computer.
  85. Depending  on  this value,  the sending computer will  resend   the  current
  86. block,  send  the  next block,  or abort the transfer.   Then,  the  sending
  87. computer sends a Status Byte.  This byte informs the receiving computer that
  88. the  transfer  has  been canceled,  is complete,  or that  it  is  ready  to
  89. continue.  Next, the sending computer sends the Block Number, then the first
  90. Checksum  Byte,  then  the 128 Byte Block of Data and  finally,  the  second
  91. Checksum Byte.  The receiving computer evaluates the checksum data and sends
  92. the appropriate Flag Byte and so on.
  93.  
  94.  
  95. RECEIVING A FILE:
  96.  
  97. 1.  Prompt the keyboard for a file name and open it for input.
  98.  
  99. 2.  You should use this step to set aside whatever buffers,  arrays,  and/or
  100.     variables you may need.
  101.  
  102. 3.  Check  the  keyboard for a cancel command.   This is done  primarily  to
  103.     allow  you to gracefully escape from an unwanted transfer  session.   If
  104.     you've canceled the transfer, go to #4c below.
  105.  
  106. 4.  Send a Flag Byte to the sending computer.   The Flag Byte will be one of
  107.     the following:
  108.  
  109.     a. ACK  (Acknowledge   06 HEX,  crtl-F) - Indicates that there  were  no
  110.        errors  in the last block sent.   The sending computer will send  the
  111.        next block.
  112.  
  113.     b. NAK  (Not Acknowledge  15 HEX,  crtl-U) - Indicates that there was an
  114.        error in the last block sent.  The sending computer will  resend that
  115.        block.  NOTE: WHEN A FILE TRANSFER IS STARTED UP, THE VERY FIRST FLAG
  116.        BYTE  THAT  YOU SEND OUT MUST BE A NAK.   In this  way,  the  sending
  117.        computer  is  prompted  to send you the  first  block.   Essentially,
  118.        you've tricked it in to thinking that there was an error in the first
  119.        block so it resends it.  Tricky huh?
  120.  
  121.     c. CAN (Cancel  18 HEX,  crtl-X) - Indicates that the transfer has  been
  122.        canceled by the receiving computer.  Generally, you will have to send
  123.        more  than one CAN.   Five to ten CAN's in as many seconds should  do
  124.        the trick.  This is done in order to prevent aborting a file transfer
  125.        accidentally.   It  should be noted however that a CAN is  generally,
  126.        but not universally, recognized by Xmodem protocols.  You may have to
  127.        wait until the sending computer gets tired and abandons the send.  In
  128.        any event, you should close the file that you opened in #1 and end.
  129.  
  130. 5.  Get the Status Byte.  The Status Byte will be one of the following:
  131.  
  132.     a. SOH  (Start of Heading  01 HEX,  ctrl-A) - Indicates that the sending
  133.        computer is ready to send a block.
  134.  
  135.     b. EOT (End of Transmission  04 HEX,  ctrl-D) - Indicates that the  file
  136.        transfer  is  complete.   To  prevent accidentally  ending  the  file
  137.        transfer  session,  it  would  be advisable to wait for five  to  ten
  138.        seconds to see if a byte other than EOT comes.   If different data is
  139.        received,  go back to #4b.  If not, close the file that you opened in
  140.        #1, send out a final ACK, and end.
  141.  
  142.     c. CAN (Cancel  18 HEX,  crtl-X) - Indicates that the transfer has  been
  143.        canceled  by the sending computer.   Again,  to prevent  accidentally
  144.        ending  the file transfer session,  it would be advisable to wait for
  145.        five  to  ten  seconds to see if a byte  other  than  CAN  comes.  If
  146.        different data is received,  go back to #4b.   If not, close the file
  147.        that you opened in #1, and end.
  148.  
  149. NOTE:  If  the Status Byte is not one of the above,  or if no Status Byte is
  150.        received within 10 seconds, go back to #4b.  If you do not receive an
  151.        appropriate Status Byte after 10 tries,  you might as well forget it.
  152.        Close the file that you opened in #1, and end.
  153.  
  154. 6.  Get the Block Number.   Put this value into a variable, you will need it
  155.     to calculate the checksum.   If no Block Number is received within about
  156.     2 seconds, go back to #4b.
  157.  
  158. NOTE:  This  value  is  the nth block according  to  the  sending  computer.
  159.        Referred to hereafter as Remote Block Number.   You should keep track
  160.        of  the  Block  Number  internally  as  well  (Local  Block  Number).
  161.        Additionally,  you  should  know  that at the beginning of  the  file
  162.        transfer,  the Block Number will be 1 and will go up to  255.   After
  163.        the 255th block has been received, the Block Number will reset to 0.
  164.  
  165. 7.  Get Checksum Byte #1.   Put this value into a variable, you will need it
  166.     later.   Again,  if  no checksum is received within about 2 seconds,  go
  167.     back to #4b.
  168.  
  169. 8.  Get a Block (128 Bytes) of Data.   As this data comes in,  store it in a
  170.     buffer  or array of some sort.   If you have to wait more than a  second
  171.     for  any single data byte chances are good that something  is  seriously
  172.     wrong.  Go to #4b.
  173.  
  174. 9.  Get Checksum Byte #2.   Put this value into a variable as well.   Again,
  175.     if no checksum is received within about 2 seconds, go back to #4b.
  176.  
  177. ****************************************************************************
  178. * The sending computer is now waiting for you to send it a NAK or an  ACK. *
  179. * Before  you can do that,  you must decide if you've received  everything *
  180. * without error.  The sending computer will wait for several seconds while *
  181. * you do this, so don't panic.                                             *
  182. ****************************************************************************
  183.  
  184. 10. Compare the Local Block Number and the Remote Block Number.  If they are
  185.     equal fine, go to #14.
  186.  
  187. 11. If  they are unequal,  you'll want to keep track of how many times  this
  188.     happens.   Then go back to #4b.   If the Block Numbers are unequal three
  189.     times  in  a row then that probably means that the sending  computer  is
  190.     either a block ahead of you or a block behind you.
  191.  
  192. 12. If the sending computer is a block ahead of you there is nothing you can
  193.     do about it.  Go to #4c.
  194.  
  195. 13. If the sending computer is 1 block behind you all you have to do is tell
  196.     it to send the next block.   Go to #4a.  If the sending computer is more
  197.     than one block behind, you should give it up and try again.  Go to #4c.
  198.  
  199. 14. Evaluate the checksum data.  Perform the following calculations:
  200.  
  201. (1)  + (Remote Block Number) + (Checksum Byte #1) + (The ASCII value of each
  202. character in the 128 Byte Block of Data).   Let's call this value X.  Plug X
  203. into one of the following formulas:
  204.  
  205. In Hexadecimal form: Let Y = (X-(X/100h)*100h)   (ie. If X = 213D, Y = 3D)
  206.  
  207. In Decimal form: Let Y = (X-INT(X/256)*256)   (ie. X = 8509, Y=61)
  208.  
  209. Where INT returns the largest integer less than or equal to (X/256).
  210.  
  211. 15. If Y = Checksum #2 then there are no errors.  Save the 128 Byte Block to
  212.     disk  or whatever.   Increment the counter you are using for Local Block
  213.     Number and go to #3.
  214.  
  215. 16. If Y is unequal to Checksum #2 then you've got an error.  Go to #4b.
  216.  
  217. NOTE:  Any time that you "go to" someplace,  you will probably want to reset
  218.        some  of  the  variables you are  using.   In  particular,  you  will
  219.        probably want to clear out the buffer or array you are using to  hold
  220.        the block of data.  Again, exact program details are left up to you.
  221.  
  222.  
  223. SENDING A FILE:
  224.  
  225. Since  sending  a file is pretty much the same as receiving a file, only  in
  226. reverse,  this  section is a little shorter.   But not to fear,  all will be
  227. made clear.
  228.  
  229. 1.  Prompt the keyboard for a file name and open it for output.
  230.  
  231. 2.  You should use this step to set aside whatever buffers,  arrays,  and/or
  232.     variables you may need.
  233.  
  234. 3.  Check  the  keyboard  for a cancel  command.   If  you've  canceled  the
  235.     transfer, then go to #9c.
  236.  
  237. 4.  Get a Flag Byte.
  238.  
  239.     a. If it's an ACK, send the next block.
  240.  
  241.     b. If it's a NAK, resend the current block.  Go to #9a.
  242.  
  243.     c. If it's a CAN,  close the file that you opened in #1, and end.  Note,
  244.        you  should  check to make sure this is correct.   (See  RECEIVING  A
  245.        FILE, #5c.)
  246.  
  247. NOTE:  Many  implementations of Xmodem protocol that I've seen will assume a
  248.        NAK and resend the block if an appropriate Flag Byte is not  received
  249.        within  10  seconds.   I  do not recommend  this.   Rather,  let  the
  250.        protocol be completely receiver driven.   In other words, simply wait
  251.        for  an  appropriate Flag Byte.   If you do not receive it  within  1
  252.        minute close the file that you opened in #1, and end.
  253.  
  254. ****************************************************************************
  255. * As  you should know by now,  the receiving computer is currently waiting *
  256. * for you to send the Status Byte.   In this time, you'll prepare the data *
  257. * you need to send.                                                        *
  258. ****************************************************************************
  259.  
  260. 5.  Check to see if there are still 128 bytes left in the file.  If yes,  go
  261.     to #7.
  262.  
  263. 6.  Since Xmodem can only send data in 128 Byte Blocks,  if there are  fewer
  264.     than 128 bytes left in the file you will need to pad the end of the file
  265.     with  control-Z's (1AH) so that you'll have a complete block.  There are
  266.     no "short" blocks.
  267.  
  268. 7.  Calculate  Checksum  #1.   Checksum #1 is calculated as FF (Hex) or  255
  269.     (Decimal) minus the Block Number.
  270.  
  271. 8.  Calculate Checksum #2.  This is done the same as before.  (See RECEIVING
  272.     A FILE, #14.)
  273.  
  274. 9.  Send a Status Byte.
  275.  
  276.     a. Send a SOH if you're ready to send a block.
  277.  
  278.     b. Send an EOT if you're finished with the transfer.
  279.  
  280.     c. Send  a CAN if you've canceled the transfer in #3 above.   Close  the
  281.        file that you opened in #1, and end.  Note, you may have to send more
  282.        than one CAN.  (See RECEIVING A FILE, #4c.)
  283.  
  284. 10. Send the Block Number.  Again, remember that the first Block Number will
  285.     be 1 and go to 255.  After the 255th block, reset to zero.
  286.  
  287. 11. Send Checksum Byte #1.
  288.  
  289. 12. Send a Block (128 Bytes) of Data.
  290.  
  291. 13. Send Checksum Byte #2.
  292.  
  293. 14. Go to #3.
  294.  
  295.  
  296. HEX DUMP:
  297.  
  298. I've included here a hex dump of an example file transfer session so you can
  299. see exactly what happens.  Only the data received is shown.
  300.  
  301.  
  302.     01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
  303.     -----------------------------------------------
  304.  A  01 01 FE 20 20 20 20 20 20 20 20 20 20 20 20 20   Receiving computer
  305.  B  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20   sends out a NAK.  The
  306.  C  20 20 20 20 20 20 20 20 0D 0A 20 20 43 4C 45 41   sending computer sends
  307.  D  52 49 4E 47 48 4F 55 53 45 20 4C 4F 43 41 4C 20   Status Byte: A01 (01H)
  308.  E  53 59 53 54 45 4D 53 20 44 49 52 45 43 54 4F 52   Block #: A02     (01H)
  309.  F  59 0D 0A 20 20 20 20 20 20 20 20 20 20 20 55 70   Checksum #1: A03 (FEH)
  310.  G  64 61 74 65 64 20 28 30 36 2F 31 36 2F 38 36 29   Data: A04-I03     [OK]
  311.  H  0D 0A 20 20 20 20 20 20 20 20 54 68 61 6E 6B 73   Checksum #2: I04 (43H)
  312.  I  20 74 6F 43 01 02 FD 20 42 72 69 61 63 20 48 65   Receiving computer
  313.  J  72 73 74 69 67 0D 0A 20 20 20 20 20 20 20 20 20   sends out an ACK.  The
  314.  K  20 20 61 6E 64 20 4A 6F 65 20 57 68 69 70 70 6C   sending computer sends
  315.  L  65 20 21 21 0D 0A 0D 0A 0D 0A 20 34 2D 42 20 43   Status Byte: I05 (01H)
  316.  M  4F 4D 57 68 79 20 64 69 64 20 79 6F 75 20 64 65   Block #: I06     (02H)
  317.  N  63 6F 64 65 20 74 68 69 73 3F 20 20 2D 38 39 36   Checksum #1: I07 (FDH)
  318.  O  36 0D 0A 0D 0A 20 37 54 48 20 46 4F 52 43 45 2E   Data I08-Q07   [ERROR]
  319.  P  2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E   Checksum #2: Q08 (77H)
  320.  Q  2E 2E 2E 2E 38 38 35 77 01 02 FD 20 42 72 69 61   Receiving computer
  321.  R  6E 20 48 65 72 73 74 69 67 0D 0A 20 20 20 20 20   sends out a NAK.  The
  322.  S  20 20 20 20 20 20 61 6E 64 20 4A 6F 65 20 57 68   sending computer sends
  323.  T  69 70 70 6C 65 20 21 21 0D 0A 0D 0A 0D 0A 20 34   Status Byte: Q09 (01H)
  324.  U  2D 42 20 43 4F 4D 50 55 54 45 52 20 53 54 4F 52   Block #: Q10     (02H)
  325.  V  45 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 38 39 30   Checksum #1: Q11 (FDH)
  326.  W  2D 38 39 36 36 0D 0A 0D 0A 20 37 54 48 20 46 4F   Data Q12-Y11      [OK]
  327.  X  52 43 45 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E   Checksum #2: Y12 (77H)
  328.  Y  2E 2E 2E 2E 2E 2E 2E 2E 38 38 35 77 01 03 FC 2D   Receiving computer
  329.  Z  34 31 31 33 0D 0A 0D 0A 20 41 52 4D 41 44 41 2E   sends out an ACK.  The
  330. AA  2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E   sending computer sends
  331. BB  2E 2E 2E 2E 2E 2E 2E 38 35 35 2D 37 32 33 30 0D   Status Byte: Y13 (01H)
  332. CC  0A 0D 0A 20 41 52 4D 41 44 41 20 2F 2F 2E 2E 2E   Block #: Y14     (03H)
  333. DD  2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E   Checksum #1: Y15 (FCH)
  334. EE  2E 2E 38 35 35 2D 32 37 30 36 0D 0A 0D 0A 20 41   Data: Y16-GG15    [OK]
  335. FF  54 41 52 49 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E   Checksum #2: GG16(50H)
  336. GG  2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 32 36 50   Receiving computer
  337. HH  04                                                sends out an ACK.  The
  338.                                                       sending computer sends
  339.                                                       Status Byte: HH01(04H)
  340.                                                       Receiving computer
  341.                                                       recognizes EOT, sends
  342.                                                       ACK and quits.  [DONE]
  343.  
  344.  
  345. A FEW FINAL NOTES:
  346.  
  347. As  far as I know,  there is no set "standard" for  Xmodem  protocol.   Ward
  348. Christensen developed it,  placed it in the public domain,  and from then on
  349. it  was subject to change and modification by many people.   The basic frame
  350. work is the same but there are many different methods for achieving the same
  351. end.  I have presented but one of them.
  352.  
  353. Experienced programmers will probably notice that putting 128 Bytes of  Data
  354. into  a  buffer,  then pulling the data out of the buffer to  calculate  the
  355. ASCII value of each character is somewhat redundant.   The justification for
  356. this is simple.   Since part of the idea behind this document is to describe
  357. Xmodem  protocol for implementation on many different computers and in  many
  358. different  languages,  I had to take into account the simple fact that  some
  359. computers  and  programming  languages are faster than  others.   I  had  to
  360. describe  Xmodem so that it would work if you were programming in slow BASIC
  361. or  the fast Assembler.   By calculating the ASCII value of  each  character
  362. outside  of  the sending/receiving loop,  no processing time is  used  which
  363. could  cause  data loss in slower languages like BASIC.   (Or at  high  baud
  364. rates.)   Once you understand the ins and outs of Xmodem and the limitations
  365. of  your  hardware  and software,  streamlining your program  should  be  no
  366. trouble and is recommended.
  367.  
  368. I sincerely hope that this information has been of benefit to you.  I know I
  369. could have used something like this when I started out!   Donations will  be
  370. gladly  accepted (College students are always broke!) but are not  expected.
  371. In any case,  please send suggestions, corrections, complaints, and the like
  372. to:
  373.  
  374. Out To Lunch Software
  375. c/o Dave Larsen
  376. 101 E. 14th ave.  Suite S
  377. Columbus, OH  43201-1855
  378.  
  379. Permission  to reprint this text,  in part or in whole,  is freely given for
  380. non-commercial  uses only as long as proper credit is given to  the  author.
  381. Any  other  uses of this text are strictly forbidden without  the  expressed
  382. written consent of the author.
  383.  
  384. - eof -uthor.
  385. Any  other  uses of this text are strictly forbidden without  the  expressed
  386. written consent of