



ZMODEM PROTOCOL REFERENCE

The

ZMODEM

Inter Application

File Transfer Protocol








Chuck Forsberg













Please distribute as widely as possible.

Questions to Chuck Forsberg





Omen Technology Inc
17505-V Northwest Sauvie Island Road
Portland Oregon 97231
Voice: 503-621-3406
Modem (Telegodzilla): 503-621-3746 Speed 1200,300
Compuserve: 70715,131
UUCP: ...!tektronix!reed!omen!caf

CONTENTS


 1.  ACKNOWLEDGMENTS....................................   1
 2.  ROSETTA STONE......................................   1
 3.  YET ANOTHER PROTOCOL, AGAIN?.......................   2

 4.  ZMODEM Protocol Design Criteria....................   3
     4.1   Throughput...................................   3
     4.2   Integrity and Robustness.....................   4
     4.3   Ease of use..................................   4
     4.4   Ease of implementation.......................   4

 5.  PACKETIZATION......................................   5
     5.1   Link Escape Encoding.........................   5
     5.2   Header Packet Information....................   6
     5.3   Binary Header Packet.........................   7
     5.4   HEX Header Packet............................   7
     5.5   Binary Data Packets..........................   8
     5.6   HEX Data Packet..............................   8

 6.  PROTOCOL TRANSACTION OVERVIEW......................   8
 7.  STREAMING TECHNIQUE................................  11
 8.  ATTENTION SEQUENCE.................................  11
 9.  PACKET/FRAME TYPES.................................  12
     9.1   ZRQRINIT.....................................  12
     9.2   ZRINIT.......................................  12
     9.3   ZSINIT.......................................  12
     9.4   ZACK.........................................  12
     9.5   ZFILE........................................  12
     9.6   ZSKIP........................................  13
     9.7   ZNAK.........................................  13
     9.8   ZABORT.......................................  13
     9.9   ZFIN.........................................  13
     9.10  ZRPOS........................................  13
     9.11  ZDATA........................................  13
     9.12  ZEOF.........................................  13
     9.13  ZFERR........................................  13
     9.14  ZCRC.........................................  13
     9.15  ZCRYPT.......................................  13
     9.16  ZCOMPL.......................................  14

10.  Transaction........................................  14
11.  PERFORMANCE........................................  14
12.  TABLES.............................................  15
13.  ZFILE FRAME FILE INFORMATION.......................  16
14.  MORE INFORMATION...................................  18
15.  ZMODEM Programs....................................  19


LIST OF FIGURES

Figure 1.  Protocol Overhead Information................  15
Figure 2.  Transmission Time Comparision................  15
Figure 3.  Y/ZMODEM Header Information usage............  16


 1.  ACKNOWLEDGMENTS

Encouragement and suggestions by Stuart Mathison, Thomas Buck,
John Wales, Ward Christensen, and Irv Hoff are gratefully
acknowledged.


 2.  ROSETTA STONE

Here are some definitions which reflect the current vernacular in
the computer media.  The attempt here is identify the file
transfer protocol rather than specific programs.

Frame         A ZMODEM frame consists of a header packet and 0 or
more data packets.

Response Time This is the maximum expected delay between the
receiver sending a packet to the transmitter and
receiving the beginning of a response from the
transmitter.

XMODEM        refers to the original 1979 file transfer etiquette
introduced by Ward Christensen's 1979 MODEM2
program.  It's also called the MODEM or MODEM2
protocol.  Some who are unaware of MODEM7's unusual
batch file mode call it MODEM7.  Other aliases
include "CP/M Users's Group" and "TERM II FTP 3".
This protocol is supported by every serious
communications program because of its universality,
simplicity, and reasonable performance.

XMODEM/CRC    replaces XMODEM's 1 byte checksum with a two byte
Cyclical Redundancy Check (CRC-16), giving modern
error detection protection.

YMODEM        refers to the XMODEM/CRC protocol with the
throughput and/or batch transmission enhancements
described in YMODEM.DOC.

ZMODEM        Zmodem is a second generation streaming protocol
for text and binary file transmission between
applications running on microcomputers and
mainframes.


 3.  YET ANOTHER PROTOCOL, AGAIN?

Since its development half a decade ago, the Ward Christensen
modem protocol has enabled a wide variety of computer systems to
interchange data.  There is hardly a communications program that
doesn't at least claim to support this protocol now called
XMODEM.

Advances in computing, modems and networking have spread the
XMODEM protocol far beyond the close coupled micro to micro
environment for which it was designed.  These application have
exposed some weaknesses.

+  The short block length causes throughput to suffer when used
with timesharing systems, packet switched networks, satellite
circuits, and buffered (error correcting) modems.

+  The 8 bit arithmetic checksum and other aspects allows line
impairments to interfere with dependable, accurate transfers.

+  Only one file can be sent per command.  The file name has to
be given twice, first to the sending program and then again to
the receiving program.

+  The transmitted file accumulates as many as 127 extraneous
bytes.

+  The modification date of the file is lost.

A number of other protocols have been developed over the years,
but none have displaced XMODEM to date.

+  Lack of public domain documentation and example programs have
kept proprietary protocols such as MNP, Blast, and others
tightly bound to the fortunes of their suppliers.

+  Hardware and/or software complexity discourages the widespread
application of BISYNC, SDLC, HDLC, X.25, and X.PC protocols.

+  Link level protocols such as X.25, X.PC, and MNP modems do not
manage application to application file transfers.

+  The Kermit protocol was developed to allow file transfers in
environments hostile to XMODEM.  The performance compromises
necessary to accomodate non transparent environments limit
Kermit's efficiency.

   Even with completely transparent channels, Kermit control
character quoting limits the efficiency of binary file
transfers to about 75 per cent.


 3.  YET ANOTHER PROTOCOL, AGAIN? (cont)

   Kermit Sliding Windows ("SuperKermit") improves throughput
over networks at the cost of increased complexity.
SuperKermit state transitions are encoded in a special
language "wart" which requires a C compiler.  The SuperKermit
C code requires full duplex communications and the ability to
check for the presence of characters in the input queue,
precluding its implementation on some operating systems.

A number of extensions to the XMODEM protocol have been made
under the collective name YMODEM.

+  YMODEM-k reduces the overhead from transmission delays by 87
per cent compared to XMODEM, but network delays can still
degrade performance.

+  The handling of files that are not a multiple of 1024 or 128
bytes is awkward, especially if the file length is not known,
or changes during transmission.

+  YMODEM-g is essentially insensitive to network delays.
Because it does not support error recovery, YMODEM-g must be
used hardwired or with a link level protocol.

Another XMODEM "extension" is protocol cheating, referred to as
"Turbo Download" and OverThruster.  These improve XMODEM
throughput at the expense of error recovery.

The ZMODEM Protocol is proposed as a means of addressing the
weaknesses described above while maintaining as much of XMODEM's
simplicity and prior art as possible.


 4.  ZMODEM Protocol Design Criteria

The design of a file transfer protocol is an engineering
compromise between conflicting requirements:

4.1  Throughput

ZMODEM is designed for optimum performance with minimum
degradation caused by delays introduced by packet switched
networks and timesharing systems.

ZMODEM is optimized for best throughput where line hits
occur infrequently.  This assumption markedly reduces code
complexity and memory requirements.


 4.  ZMODEM Protocol Design Criteria (cont)

4.1  Throughput (cont)

It is assumed that many transfers will originate from a
timesharing system connected to a packet switched network.
ZMODEM provides features to allow for simple, efficient
implementation on timesharing hosts.

File transfers begin immediately regardless of which program
is started first, no 10 second delay.

4.2  Integrity and Robustness

     All packets are protected with 16 bit CRC.

4.3  Ease of use

File names need be entered only once.  Wild Card names may
be used with batch transfers.  Minimum keystrokes required
to initiate transfers.  ZMODEM steps down to X/YMODEM if the
other end does not support ZMODEM.

4.4  Ease of implementation

ZMODEM accomodates a wide variety of systems:

+  Microcomputers that cannot overlap disk and serial i/o

+  Microcomputers that cannot overlap serial send and
receive

+  Computers and/or networks requiring XON/XOFF flow control

+  Computers that cannot check the serial input queue for
the presence of data without having to wait for the data
to arrive.

Although ZMODEM provides "hooks" for multiple "threads",
ZMODEM is not intended to replace link level protocols such
as X.25.  ZMODEM provides a near optimal general purpose
application to application file transfer protocol to be used
with link level protocols such as X.25, MNP, Fastlink, etc.


 5.  PACKETIZATION

ZMODEM uses packets somewhat different from those used in
X/YMODEM.  X/YMODEM type packets are not used for the following
reasons:

+  Block numbers are limited to 256

+  No provision for variable length blocks

+  Line hits corrupt protocol signals, causing failed file
transfers.  In particular, modem errors sometimes generate
false block numbers, false EOTs and false ACKs.  False ACKs
are the most troublesome as they cause the sender to lose
synchronization with the receiver.

   State of the art X/YMODEM programs such as Professional-YAM
overcome some of these weaknesses with clever proprietary
code, but a newer protocol is still useful.

+  It is difficult to determine the beginning and ends of
X/YMODEM blocks when they are corrupted by line hits.  This
discourages rapid error recovery.

5.1  Link Escape Encoding

ZMODEM acheives data transparency by extending the 8 bit
character set (256 codes) with escape sequences based on the
ZMODEM data link escape character ZDLE[1].

Link Escape coding permits variable length data packets.  It
allows the beginning of packets to be detected without
special timing techniques, facilitating rapid error
recovery.

Link Escape coding does add some overhead.  The worst case,
a file consisting entirely of ZDLE characters, would incur a
50% overhead.  The particular ZDLE character was chosen
after examining the character distributions of many types of
files used with personal computers.

The ZDLE character is special.  ZDLE represents a control
sequence of some sort.  If a ZDLE character appears in the
data sent within a binary packet, it is prefixed with
another ZDLE.  An escaped ZDLE is counted once in the CRC.
-------
1.  This and other constants are defined in the zmodem.h include file.
Please note that constants with a leading 0 are octal constants in
C.


 5.  PACKETIZATION (cont)

5.1  Link Escape Encoding (cont)


The current value for ZDLE is exclamation point (!).  Use of
a printing character as ZDLE allows application programs to
recognize HEX Header Packets.  This particular character was
chosen because it does not appear often in many types of
files likely to be transferred with this protocol.  In
addition, no known timesharing system uses it for editing.

5.2  Header Packet Information

All ZMODEM frames begin with a header packet which may be
sent in binary or HEX form.  ZMODEM uses a single routine to
recognize binary and hex header packets.  Either form of the
header packet contains the same raw information:

+  A type byte[1] Future extensions to ZMODEM may use the
high order bits of the type byte to indicate thread
selection.

+  Four bytes of data indicating flags and/or numeric
quantities depending on the packet type

Order of Bytes in Header Packet

T:  packet Type
F0: Flags least significant byte
P0: file Position least significant
P3: file Position most significant

        T  F3 F2 F1 F0
        --------------
        T  P0 P1 P2 P3
-------
1.  The packet types are cardinal numbers beginning with 0 to minimize
state transition table memory requirements.


 5.  PACKETIZATION (cont)

5.3  Binary Header Packet

A binary header packet is only sent by the sending program
to the receiving program.

A binary header packet begins with the sequence ZPAD, ZDLE,
ZBIN.

The frame type byte is ZDLE encoded.

The four position/flags bytes are ZDLE encoded.

A two byte CRC of the frame type and position/flag bytes is
ZDLE encoded.

0 or more binary data packets will follow depending on the
frame type.

The function zsbhdr transmits a binary header packet.  The
function zgethdr receives a binary or hex header packet.


5.4  HEX Header Packet

The receiver sends responses in hex header packets.

Hex encoding is required to support XON/XOFF flow control.
Use of Kermit style encoding for control and paritied
characters was considered and rejected because of increased
possibility of interacting with some timesharing systems's
line edit functions.  Use of HEX packets from the receiving
program allows control characters to be used to interrupt
the sender when errors are detected.  Except for header
packet types that imply data packets to follow, a HEX header
packet may be used in place of a binary header packet.

A hex header packet begins with the sequence ZPAD, ZPAD,
ZDLE, ZHEX.  The zgethdr routine synchronizes in the
ZPAD-ZDELE sequence.  The extra ZPAD allows other parts of
the program to detect a ZMODEM packet and then call
_#zgethdr to receive the packet.

The type byte, the four position/flag bytes, and the CRC
thereof are sent in hex using the character set
01234567890abcdef.  Upper case hex digits are not allowed;
they would false trigger X/YMODEM programs.


 5.  PACKETIZATION (cont)

5.4  HEX Header Packet (cont)

A carriage return, line feed, and XON are appended to the
HEX header packet but are not considered to be part of it.
The CR/LF aids debugging from printouts.  The XON releases
the sender from spurious XOFF flow control characters
generated by line noise, a common occurrence.

0 or more HEX data packets will follow depending on the
frame type.

The function zshhdr sends a hex header packet.

5.5  Binary Data Packets

Binary data packets immediately follow the associated binary
header packet.  A binary data packet contains 0 to 1024
bytes of data.  Recommended length values are 256 bytes
below 4800 bps, 1024 above 4800 bps or when the data link is
known to be relatively error free.

No padding is used with binary data packets.  The data bytes
are ZDLE encoded and transmitted.  A ZDLE and frameend are
then sent, followed by two ZDLE encoded CRC bytes.  The CRC
accumulates the data bytes and frameend.

The function zsbdata sends a binary data packet.  The
function zrbdata receives a binary data packet.

5.6  HEX Data Packet

The format of HEX data packets is not currently specified.
These would be used for server commands, etc.


 6.  PROTOCOL TRANSACTION OVERVIEW

As with the XMODEM recommendation, ZMODEM timing is receiver
driven.  The transmitter should not time out at all, except to
abort the program if no packets are received for an extended
period of time, say one minute.

To start a ZMODEM file transfer session, the sending program is
called with the names of the desired file(s).

The sending program sends the string "rz\r" and a single HEX
ZRQRINIT packet with data = 0.  The "rz" followed by carriage
return activates a ZMODEM receive program or command if it were
not already active.  If the receiving program receives the
ZRQRINIT packet, it totally ignores it as the sending program
will be responding to the RINIT packet sent by the receiver.  The
sending program should also ignore this packet type, which would
be an echo of its own packet.


 6.  PROTOCOL TRANSACTION OVERVIEW (cont)

Since the ZRQRINIT sequence contains no exotic control
characters, it can be accepted by the application program as a
command to begin ZMODEM receive.  The sequence prints as:

      "rz^M**!B00000000000000^M^J"

where ^M represents CR and ^J represents LF.

The sending program awaits a command from the receiving program
to start file transfers.  If a "C" or NAK is received, an XMODEM
or YMODEM file transfer is indicated, and file transfer(s) use
the X/YMODEM protocol.

Note: With ZMODEM and YMODEM Batch, the sending program provides
the file name, but not with XMODEM.

When the ZMODEM receive program starts, it immediately sends a
ZRINIT packet to initiate ZMODEM file transfers.  The receive
program resends the ZRINIT packet at repsonse time intervals for
a suitable period of time (40 seconds typical) before falling
back to X/YMODEM protocol.  If the receiving program receives a
ZRINIT packet, it is an echo indicating that the sending program
is not operational.

If the receiving program receives a ZRQRINIT packet, it ignores
it.

Eventually the sending program correctly receives the ZRINIT
packet.

The sender may respond with an optional ZCRYPT packet, which
the receiver acknowledges with a suitable frame.  (Details
to be worked out later)

The sender may respond with an optional ZSINIT frame to set the
receiving program's Attention string.  The receiver sends a ZACK
packet in response.

The sender then sends a ZFILE packet containing the file name,
file length, modification date, and other information identical
to that used by YMODEM Batch.

The receiver may respond to this with a ZGETCRC packet,
which requires the sender to permorm a CRC on the file and
transmit same with a ZCRC packet.  The receiver may use this
information to determine whether to accept the file or skip
it.

The receiver may respond with a ZSKIP packet, which causes the
file to be passed over.


 6.  PROTOCOL TRANSACTION OVERVIEW (cont)

A ZRPOS packet from the receiver initiates transmission of the
file data starting at the offset in the file specified in the
ZRPOS packet.  Normally the receiver specifies the data transfer
begin begin at offset 0 in the file.

The receiver may start the transfer further down in the
file.  This allows a file transfer interrupted by a loss or
carrier or system crash to be completed on the next
connection without requiring the entire file to be
retransmitted.  If downloading a file from a timesharing
system that becomes sluggish, the transfer can be
interrupted and resumed later with no loss of data.

The sender sends a ZDATA header packet (with file position)
followed by one or more data packets.

The receiver compares the file position in the ZDATA header with
the number of characters successfully received to the file.  If
they do not agree, a ZRPOS error response is generated to force
the sender to the right position within the file.

A data packet terminated by ZCRCGO and CRC does not elicit a
response unless an error is detected; more data packet(s) follow
immediately.

ZCRCQ data packets expect a ZACK response (with the file
offset) if no error, otherwise a ZRPOS response (with the
last good file offset).  Another data packet continues
immediately.  ZCRCQ packets are not used if the receiver
does not indicate FDX ability with the CANFDX bit.

ZCRCW data packets expect a response before the next frame is
sent.  If the receiver does not indicate overlapped I/O
capability with the CANOVIO bit, the sender uses the ZCRCW to
allow the receiver to write its buffer before sending more data.

A zero length data packet may also be used as a sending idle
packet to prevent the receiver from timing out in case data
is not immediately available to the sender.

In the absence of fatal error, the sender encounters end of file.
If the end of file is encountered within a frame, the frame is
closed with a ZCRCE data packet which does not elicit a response
except in case of error.

The sender sends a ZEOF packet with the file ending offset equal
to the number of characters in the file. The receiver compares
this number with the number of characters received.  If the
receiver has received all of the file, it closes the file and
responds with ZRINIT.  Otherwise the receiver sends ZRPOS with
the current file offset, forcing the sender to send the missing
data.


 6.  PROTOCOL TRANSACTION OVERVIEW (cont)

After all files are processed, any further protocol errors should
not prevent the sending program from returning with a success
status.

The sender closes the session with a ZEXIT header packet.  The
receiver acknowledges this with its own ZEXIT packet.

When the sender receives the acknowledging packet, it sends two
characters, "OO" (Over and Out) and exits to the operating system
or application that invoked it.  The receiver waits briefly for
the "O" characters, then exits whether they were received or not.


 7.  STREAMING TECHNIQUE

ZMODEM allows a choice of data streaming methodmethods selected
according to the limitations of the sending program operating
environment, receiving program operating environment, and the
transmission channel(s).

If the computers can overlap serial I/O with disk I/O, the sender
begins data transmission with a ZDATA header and continuous ZCRCG
data packets.  When the receiver detects an error, it sends the
Attn sequence and a ZRPOS packet to force the sender back to the
correct position within the file.

At the end of each transmitted packet, the sender checks for the
presence of a error packet from the receiver.  To do this, the
sender may sample the reverse data stream for the presence of a
ZPAD character.

If the reverse data stream cannot be sampled without entering an
I/O wait, the receiver can interrupt the sender with a control
character, break, or combinations thereof, as specified in the
ZSINIT frame sent by the sending program.

If the receiver cannot overlap serial and disk I/O, it uses the
ZRINIT frame to specify a buffer length which the sender will not
overfill before sending a ZCRCW packet.


 8.  ATTENTION SEQUENCE

The receiving program sends the Attn sequence whenever it detects
an error and needs to interrupt the sending program.

The default Attn string value is empty (no Attn sequence).  The
characters in the Attn string are terminated with a null.  Two
characters perform special functions:

+ \335 Sends a break signal

+ \336 Pauses one second


 9.  PACKET/FRAME TYPES

The numeric values for the values shown in boldface are given in
zmodem.h.

9.1   ZRQRINIT

Sent by the sending program to call up the receiving
program.

P0...P3 are zero.

9.2   ZRINIT

Sent by the receiving program.

ZF0 and ZF1 contain receiver capability flags:

#define CANFDX  1 /* Rx can send and receive FDX */
#define CANOVIO 2 /* Rx can receive during disk I/O */
#define CANBRK  4 /* Rx can send a break signal */
#define CANCRY  8 /* Receiver can decrypt */

ZP0 and ZP1 contain the size of the receiver's buffer in
bytes, or 0 if overlapped I/O is allowed.

9.3   ZSINIT

Sender sends capability flags (none currently defined)
followed by a binary data packet terminated with ZCRCW.
Data contains the Attn string, maximum length 32 bytes. The
ZSINIT is only sent to programs that indicate the ability
to overlap serial data and disk I/O (CANOVIO).

9.4   ZACK

Acknowedgement to ZSINIT header packet or ZCRCW data
packet.

ZP0 to ZP3 contain file offset.

9.5   ZFILE

This packet indicates the beginning of a file transmission
attempt.

ZF0 and ZF1 contain special file processing flags:

+  ZBIN This is a binary file

   A ZCRCW data packet follows with file name, file length,
modification date, and other information described in a
later chapter.


 9.  PACKET/FRAME TYPES (cont)

9.6   ZSKIP

Sent by the receiver in response to ZFILE, makes the sender
skip to the next file.

9.7   ZNAK

Indicates last packet header was garbled.  (See also
ZRPOS).

9.8   ZABORT

Sent by receiver to terminate batch file transfers when
requested by the user.

Sender initiates a ZFIN sequence[1].

9.9   ZFIN

Sent by sending program to terminate ZMODEM.  Receiver
responds with ZFIN.

9.10  ZRPOS

Sent by receiver to force file transfer to resume at file
offset given in ZP0...ZP3.

9.11  ZDATA

ZP0...ZP3 contain file offset.  One or more data packets
follow.

9.12  ZEOF

ZP0...ZP3 contain file offset.  Sender reports End of File.

9.13  ZFERR

Error in reading or writing file, equivalent to ZABORT.

9.14  ZCRC

Request (receiver) and response (sender) for file CRC.

ZP0 and ZP1 contain 16 bit file CRC.

9.15  ZCRYPT

Negotiation for encryption.
-------
1.  Or ZCOMPL in case of server mode.


 9.  PACKET/FRAME TYPES (cont)

9.16  ZCOMPL

Server request now completed.


10.  Transaction

A simple transaction, one file, no errors, overlapped I/O:

Sender          Receiver

                ZRINIT
ZFILE
                ZRPOS
ZDATA data ...
ZEOF
                ZRINIT
ZFIN
                ZFIN
OO


11.  PERFORMANCE

Some tests of ZMODEM protocol performance have been made.  A
PC-AT with SCO SYS V Xenix or DOS 3.1 was connected to a PC with
DOS 2.1 either directly at 9600 bps or with dial-up 1200 bps
modems.  The ZMODEM software was configured to use 1024 byte
packet lengths above 2400 bps, 256 otherwise.

Because no time delays are necessary in normal file transfers,
per file negotiations are much faster than with YMODEM, the only
observed impidiment being the time required by the program(s) to
update logging files.

During a file transfer, a short line hit seen by the receiver
usually induces a CRC error.  The interrupt packet is usually
seen by the sender before the next packet is sent, and the
resultant loss of data throughput averages about half a packet.
At 1200 bps this is would be about .75 second lost per hit.  At
10-5 error rate, this would degrade throughput by about 9 per
cent.  The throughput degradation increases with the channel
delay, as the packets in transit through the channel are
discarded on error.

A longer noise burst that affects both the receiver and the
sender's reception of the interrupt packet usually causes the
sender to remain silent until the receiver times out in 10
seconds.  If the round trip channel delay exceeds the receiver's
10 second timeout, recovery from this type of error may become
difficult.


11.  PERFORMANCE (cont)

Noise affecting only the sender is usually ignored, with one
common exception.  Spurious XOFF characters generated by noise
stop the sender until the receiver times out and sends an
interrupt packet which concludes with an XON.

In summation, ZMODEM performance in the presence of errors
resembles that of X.PC and SuperKermit.  Short bursts cause
minimuml data loss.  Long bursts (such as pulse dialing noises)
often require a timeout error to restore the flow of data.


12.  TABLES

Figures are calculated for round trip delay times of 40
milliseconds and 5 seconds.  A 102400 byte randomly distributed
binary file is sent at 1200 bps 8 data bits, 1 stop bit.  The
calculations assume no transmission errors.  For each of the
protocols, only the per file functions are considered.  Processor
and I/O overhead are not included.  YM-k refers to YMODEM with
1024 byte packets.  YM-g refers to the YMODEM "g" option.  ZMODEM
uses 256 byte packets for this example.  SuperKermit uses amximum
packet size, 8 bit transparent transmission, no run length
compression.

Figure 1.  Protocol Overhead Information

 Protocol    dump XMODEM YM-k  YM-G ZMODEM S-Kermit
------------ ---- ------ ----- ---- ------ --------
Round-Trips    -    803   103    5      5        5?
Time@40ms      -     32s    4s   -      -        -
Time@5s        -   4015s  515s  25s    25s      25
Chars-Ovhd     -   4803   603  503   2000     7460
Time@0s      853s   893s  858s 857s   870s    1135s
Time@40ms    853s   925s  862s 857s   870s    1135s
Time@5s      853s  5761s 1373s 882s   905s    1160s

Figure 2.  Transmission Time Comparision
           (5 second delay)

**********************************************************
XMODEM
**************
YMODEM-K
************
Kermit Sliding Windows
*********
YMODEM-G
*********
ZMODEM


12.  TABLES (cont)

Figure 3.  Y/ZMODEM Header Information usage

 Program   Batch  Length Date  Mode  S/N  YMODEM-g  ZMODEM
---------- ----- ------- ---- ------ ---- -------- -------
Unix rb/sb  yes   yes    yes    yes   no   sb only      no
Unix rz/sz  yes   yes    yes    yes   no   sb only     yes
VMS rb/sb   yes   yes     no     no   no        no      no
Pro-YAM     yes   yes    yes     no  yes       yes     yes
CP/M YAM    yes    no     no     no   no        no      no
KMD/IMP     yes    no|#-  no     no   no        no      no
MEX          no    no     no     no   no        no      no


13.  ZFILE FRAME FILE INFORMATION

Only the pathname (file name) part is required for batch
transfers.

Pathname The pathname (conventionally, the file name) is sent as
a null terminated ASCII string.  This is the filename
format used by the handle oriented MSDOS(TM) functions
and C library fopen functions.  An assembly language
example follows:

                   DB        'foo.bar',0

         No spaces are included in the pathname.  Normally only
the file name stem (no directory prefix) is transmitted
unless the sender has selected YAM's f option to send
the full pathname.  The source drive (A:, B:, etc.) is
never sent.

Filename Considerations:

+  File names should be translated to lower case unless the
sending system supports upper/lower case file names.  This is
a convenience for users of systems (such as Unix) which store
filenames in upper and lower case.

+  The receiver should accommodate file names in lower and upper
case.

+  The rb(1) program on Unix systems normally translates the
filename to lower case unless one or more letters in the
filename are already in lower case.

+  When transmitting files between different operating systems,
file names must be acceptable to both the sender and receiving
operating systems.

   If directories are included, they are delimited by /; i.e.,
"subdir/foo" is acceptable, "subdir\foo" is not.


13.  ZFILE FRAME FILE INFORMATION (cont)

Length The file length and each of the succeeding fields are
optional[1]. The length field is stored as a decimal
string counting the number of data bytes in the file.

       With ZMODEM, the receiver uses the file length only for
display (progress reporting) purposes; the actual length
is determined by the data transfer.

Modification Date - A single space separates the modification
date from the file length.

                    The mod date is optional, and the filename
and length may be sent without requiring the
mod date to be sent.

                    The mod date is sent as an octal number
giving the time the contents of the file were
last changed measured in seconds from Jan 1
1970 Universal Coordinated Time (GMT).  A
date of 0 implies the modification date is
unknown and should be left as the date the
file is received.

                    This standard format was chosen to eliminate
ambiguities arising from transfers between
different time zones.

                    Two Microsoft blunders complicate the use of
modification dates in file transfers with
MSDOS(TM) systems.  The first is the lack of
timezone standardization in MS-DOS.  A file's
creation time can not be known unless the
timezone of the system that wrote the file[2]
is known.  Unix solved this problem (for
planet Earth, anyway) by stamping files with
Universal Time (GMT).  Microsoft would have
to include the timezone of origin in the
directory entries, but does not.
Professional-YAM gets around this problem by
using the z parameter which is set to the
number of minutes local time lags GMT.  For
files known to originate from a different
timezone, the -zT option may be used to
specify T as the timezone for an individual
file transfer.
-------
 1. Fields may not be skipped.
 2. Not necessarily that of the transmitting system!


13.  ZFILE FRAME FILE INFORMATION (cont)

                    The second problem is the lack of a separate
file creation date in DOS.  Since some backup
schemes used with DOS rely on the file
creation date to select files to be copied to
the archive, back-dating the file
modification date could interfere with the
safety of the transferred files.  For this
reason, Professional-YAM does not modify the
date of received files with the header
information unless the d parameter is non
zero.

Mode - A single space separates the file mode from the
modification date.  The file mode is stored as an octal
string.  Unless the file originated from a Unix system,
the file mode is set to 0.  rb(1) checks the file mode for
the 0x8000 bit which indicates a Unix type regular file.
Files with the 0x8000 bit set are assumed to have been
sent from another Unix (or similar) system which uses the
same file conventions.  Such files are not translated in
any way.

Serial Number - A single space separates the serial number from
the file mode.  The serial number of the
transmitting program is stored as an octal
string.  Programs which do not have a serial
number should omit this field, or set it to 0.
The receiver's use of this field is optional.

The file information is terminated by a null.  If only the
pathname is sent, the pathname will be terminated by two nulls.
The length of the file information packet, including the trailing
null, must not exceed 1024 bytes; a typical length is less than
64 bytes.


14.  MORE INFORMATION

More information may be obtained by calling Telegodzilla at
503-621-3746.

UUCP sites can obtain the nroff/troff source to this file with

       uucp omen!/usr/caf/public/zmodem.mm /tmp

A continually updated list of available files is stored in
/usr/spool/uucppublic/FILES.

The following L.sys line calls Telegodzilla (Pro-YAM in host
operation).  Telegodzilla waits for carriage returns to determine
the incoming speed.  If none is detected, 1200 bps is assumed and
a greeting is displayed.


14.  MORE INFORMATION (cont)

In response to "Name Please:" uucico gives the Pro-YAM "link"
command as a user name.  The password (Giznoid) controls access
to the Xenix system connected to the IBM PC's other serial port.
Communications between Pro-YAM and Xenix use 9600 bps; YAM
converts this to the caller's speed.

Finally, the calling uucico logs in as uucp.

omen Any ACU 1200 1-503-621-3746 se:--se: link ord: Giznoid
in:--in: uucp


15.  ZMODEM Programs

A demonstration version of Professional-YAM is available as
YAMDEMO.LQR (A SQueezed Novosielski library).  This may be used
to test ZMODEM and YMODEM implementations.

Unix programs supporting the YMODEM protocol are available on
Telegodzilla in the "upgrade" subdirectory as RBSB.SHQ (a
SQueezed shell archive).  Most Unix like systems are supported,
including V7, Sys III, 4.2 BSD, SYS V, Idris, Coherent, and
Regulus.

A version for VAX-VMS is available in VRBSB.SHQ, in the same
directory.

A CP/M assembly version is available as MODEM76.AQM and
MODEM7.LIB.

Irv Hoff has added YMODEM 1k packets and basic YMODEM batch
transfers to the KMD and IMP series programs, which replace the
XMODEM and MODEM7/MDM7xx series respectively.  Overlays are
available for a wide variety of CP/M systems.

MEX and MEX-PC also support some of the YMODEM extensions.

Questions about YMODEM, the Professional-YAM communications
program, and requests for evaluation copies may be directed to:

Chuck Forsberg
Omen Technology Inc
17505-V Sauvie Island Road
Portland Oregon 97231
Voice: 503-621-3406
Modem: 503-621-3746 Speed: 1200,300
Usenet: ...!tektronix!reed!omen!caf
Compuserve: 70715,131
Source: TCE022
