mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
389 lines
20 KiB
389 lines
20 KiB
** ZMP Documentation **
|
|
|
|
1. Introduction.
|
|
|
|
ZMP is a communications/file transfer program for CP/M which
|
|
performs Xmodem, Xmodem-1k (often erroneously called Ymodem),
|
|
true Ymodem and Zmodem file transfer protocols. Although tested
|
|
with Z80DOS, ZRDOS and CP/M 2.2, there seems to be no reason why
|
|
it shouldn't work with CP/M 3 as well. The only requirements are
|
|
a Z80 processor (sorry about that!), a computer running CP/M in
|
|
one of its various guises, with at least 45k of TPA (but the more
|
|
the better!), and a modem.
|
|
When you try to pack this many features into one program,
|
|
you end up with a pretty large file. The big problem occurs when
|
|
file transfers are attempted: unless you have at least 4-8k of
|
|
buffer size, you might as well use xmodem protocol. The approach
|
|
taken in ZMP is to use overlays for various functions, accepting
|
|
the time taken to load these from disk. Thus performance will
|
|
vary depending on your disk setup: if you have a hard disk and a
|
|
fast processor you will likely not notice the difference. If, on
|
|
the other hand, you are running a Commodore 128 with CP/M on a
|
|
1571 drive, there is no physical reason why ZMP won't work, but
|
|
you might consider investing in a book to read while the overlays
|
|
load. (A suitable book to read might be a computer catalogue!).
|
|
The curious amongst you may notice that the beginning of the
|
|
ZMPX.COM file has the magic 'Z3ENV' string, but don't let this
|
|
fool you into thinking that you don't need to add terminal
|
|
characteristics into the overlay if you have a ZCPR3 system. It
|
|
has proved possible to persuade this particular C compiler to
|
|
access ZCPR3's environment descriptor, but not for ZMP. Yet.
|
|
Perhaps later. In the meantime, the startup code is there for it.
|
|
In order to produce a program which would work with most
|
|
CP/M systems, the Zmodem protocol performed by ZMP is fairly
|
|
simple. The transmit section uses 'Full Streaming with Reverse
|
|
Interrupt', as Chuck Forsberg calls it in his description of the
|
|
Zmodem protocol. The receive section uses 'Segmented Streaming'.
|
|
This means that, if your system can do serial I/O and disk I/O at
|
|
the same time, ZMP does not take advantage of the faster transfer
|
|
rate which this capability provides. Since, however, I can't
|
|
write and listen at the same time, and neither can my computer,
|
|
and neither can the vast majority of CP/M computers, it seemed
|
|
the best approach to take. Segmented Streaming means that the
|
|
receive program tells the transmit program how big its buffer is.
|
|
The transmit program then sends just that much data, then waits
|
|
for an acknowledge from the receiver. We have encountered some
|
|
Zmodem programs which send too much data in this case: errors
|
|
will appear if this happens, but the protocol should recover and
|
|
the file will be received intact (we hope!).
|
|
The string which ZMP passes to the receiving program to
|
|
interrupt in case of errors is likewise simple. Basically it
|
|
causes the receiving program to send a control-C character and
|
|
then wait for one second. The receiver will then send its ZRPOS
|
|
string, by which time ZMP, as the transmitter, should be ready to
|
|
receive it.
|
|
|
|
|
|
2. Customisation.
|
|
|
|
ZMP must be customised to suit your system. This involves
|
|
overlaying the un-installed copy of ZMP.COM (contained in this
|
|
library as ZMPX.COM) with a user-written installation overlay.
|
|
Some hints on writing this are given below; there is a blank
|
|
overlay file in this library, or you may be able to obtain one
|
|
for your computer from the same place you got this library.
|
|
This value is set at 0145 hex, and should stay there permanently.
|
|
See the notes in this document, and also the ZMP-OVL.UPD file,
|
|
for more details on how to set up your overlay.
|
|
Once the installation overlay is written, assemble it with
|
|
M80 (or SLR or whatever), use RELHEX to create a .HEX file, and
|
|
use MLOAD to overlay it over the ZMPX.COM file to produce your
|
|
very own ZMP.COM.
|
|
|
|
3. Operation.
|
|
|
|
The following files must be on the same disk and user area,
|
|
which must be specified in your customisation overlay:
|
|
|
|
ZMCONFIG.OVR -- the configuration overlay
|
|
ZMINIT.OVR -- the initialisation overlay
|
|
ZMTERM.OVR -- the terminal overlay
|
|
ZMXFER.OVR -- the file transfer overlay
|
|
ZMP.HLP -- the help file (recommended).
|
|
|
|
Start the program with ZMP. The screen should clear, then a
|
|
title message is printed, then ZMP enters terminal mode. You may
|
|
type escape-H for help at this point. When you first run the
|
|
program, the first thing you need to do is to enter the
|
|
configuration overlay (type escape-C) and set all the defaults
|
|
and others to suit your system as required. If you don't know
|
|
whether to change something or not, it's probably better to leave
|
|
it alone. When you exit the configuration program, answer 'Y' to
|
|
the 'Make changes permanent' question. ZMP.FON and ZMP.CFG will
|
|
be produced on your disk, in the same drive/user area as the
|
|
above files.
|
|
|
|
Operation of the program is controlled by escape sequences
|
|
entered in terminal mode. Escape-H gives you a list of options.
|
|
Most of these are self-explanatory, but they will be summarized
|
|
here.
|
|
|
|
B - Send Break to modem.
|
|
If your overlay has been set up to send a break command
|
|
to your UART, this command will perform this function. (Some
|
|
remote systems may require a break sent to them to interrupt
|
|
Zmodem transfers).
|
|
|
|
C - Configure system.
|
|
This function is designed to set system defaults, save
|
|
phone numbers etc. Changing baud rates etc. for a particular
|
|
call are better handled with the escape-L option. If you
|
|
answer Y or y to the 'make changes permanent?' question, the
|
|
new configuration will be saved in a ZMP.CFG file, and the
|
|
phone numbers in a ZMP.FON file for later use. The .CFG file
|
|
is read, if it exists, when ZMP is first started.
|
|
|
|
D - Get disk Directory.
|
|
Gets a directory of the current drive and user area.
|
|
Change to another with the escape-F command, described
|
|
below. The directory will be sorted and will include
|
|
filesizes unless you have so many files on the current
|
|
drive/user area that there is insufficient memory available
|
|
to sort them. In this case an unsorted directory, without
|
|
file sizes, will be printed.
|
|
|
|
F - Disk/File operations.
|
|
This command is used to change the current drive/user
|
|
area, to reset a disk in the current drive, and to view,
|
|
erase, print or rename files. There are also options to give
|
|
a directory of the current drive/user area, and to supply a
|
|
new filename for the capture file. This filename may specify
|
|
a different drive/user area than the current one. If capture
|
|
mode is on, the status line printed when terminal mode is
|
|
entered will state the capture file name.
|
|
|
|
H - Get Help.
|
|
Prints the ZMP.HLP file. You may then either type CR to
|
|
return to terminal mode, or enter the required function key.
|
|
|
|
I - Initiate phone call.
|
|
Reads the ZMP.FON file, if any, and prints it. You have
|
|
four seconds after typing ESC I, during which you may enter
|
|
the letter corresponding to the required number, in which
|
|
case ZMP will dial it without printing a list. Otherwise the
|
|
full phone list will be printed, and you will be asked which
|
|
number you want. Enter the identifying letter of the number
|
|
you wish to call. You can also enter numbers not in the
|
|
list. Multiple numbers can be called by entering them separ-
|
|
ated with commas. Dialling will then commence, and will
|
|
continue until one of the numbers answers, or until you
|
|
abort the process with the escape key. Note that the baud
|
|
rate used for the call is that in the .FON file for that
|
|
number, or the current one if a new number is entered. This
|
|
function works best if the strings in the .CFG file have
|
|
been set up for your modem, and the initialisation string
|
|
sent to the modem sets it into verbose mode for status
|
|
messages (ATV1).
|
|
|
|
K - Display Keyboard macros.
|
|
The configuration option allows up to ten macro keys to
|
|
be defined, and these are recalled by typing escape followed
|
|
by the numbers 0 to 9. This function prints the current
|
|
assignments.
|
|
|
|
L - Change Line settings.
|
|
This function allows temporary changes of baud rate,
|
|
stop bits, and data bits. There is also an option to operate
|
|
terminal mode in full duplex (locally typed characters are
|
|
sent but not displayed on the screen), half duplex (locally
|
|
typed characters are sent and also displayed on the screen),
|
|
or echo mode (as for half duplex, but received characters
|
|
are echoed to the remote system as well as being displayed).
|
|
Don't have two computers talking to each other in echo mode
|
|
unless you're bored. There are also options to allow/dis-
|
|
allow control characters above CR to be displayed in term-
|
|
inal mode, to strip the parity bit in terminal mode, and to
|
|
re-initialise the currently selected UART and modem at the
|
|
current baud rate.
|
|
Like IMP, ZMP uses location 003C hex to store a value
|
|
corresponding to the present baud rate. Then, if you leave
|
|
ZMP and later re-enter, it checks location 003C. If it
|
|
contains a legal value, then that baud rate is set for you,
|
|
otherwise it sets the default baud rate as selected in the
|
|
.CFG file.
|
|
|
|
M - Toggle capture mode in Memory.
|
|
Received characters will be saved in a buffer and saved
|
|
in a file named 'ZMP.LOG' when the buffer fills or when the
|
|
command is entered again. A control-S/control-Q sequence is
|
|
sent to the remote computer while the buffer is being saved
|
|
in an attempt to stop it sending more data.
|
|
|
|
P - Toggle Printer.
|
|
This is similar to the 'M' command, except incoming
|
|
characters are sent to the printer. This functions best if
|
|
your system performs the BIOS 'List Status' function
|
|
correctly.
|
|
|
|
Q - Quit the program.
|
|
Obvious. You will be asked if this is really what you
|
|
want. Any entry other than N or n will exit to CP/M.
|
|
|
|
R - Receive a file.
|
|
You will be asked which protocol you wish to use. The
|
|
default is ZMODEM. The <X>modem option will allow either
|
|
128-byte blocks (standard XMODEM) or 1k blocks (XMODEM-1k),
|
|
since this is decided by the transmit end. If an attempt is
|
|
made to receive a file which has the same name as a file on
|
|
the current drive/user area, the current one will be renamed
|
|
to .BAK and the new one will then be received normally.
|
|
(However, see below for the transfer resumption feature in
|
|
ZMP v1.5 and above).
|
|
Note that the byte count on the screen is not kept up-
|
|
to-date on Zmodem receive. This is because the data arrives
|
|
non-stop and there is simply no time available with non-
|
|
interrupt driven computers to update the screen. An update
|
|
is performed if errors occur, and when the computer pauses
|
|
to write to the disk.
|
|
Starting with version 1.4, Zmodem file receive will
|
|
commence automatically upon receipt of the sender's ZRQINIT
|
|
string. Thus all you need to do is have the sender initiate
|
|
the transfer, select the drive and user area you wish
|
|
the file(s) to be received on, and wait..
|
|
ZMP v1.5 adds the ability to resume an interrupted
|
|
Zmodem transfer. If a Zmodem receive attempt fails (either
|
|
because of manual cancellation or massive errors), you will
|
|
be asked if you wish to save the portion of the file already
|
|
received. If not, it will be erased. If so, and a subsequent
|
|
Zmodem receive attempt would result in a file of the same
|
|
name, you are asked if you wish to resume the transfer. If
|
|
you do, transfer will start at the end of the file.
|
|
Otherwise the old file will be renamed to .BAK as before.
|
|
Since this feature is a function of the receiver, it should
|
|
work with any Zmodem implementation which conforms
|
|
reasonably closely to Chuck Forsberg's standard. It has been
|
|
tested with ZMP and RZMP, and I would like to hear of any
|
|
programs with which it doesn't work. No attempt is made to
|
|
determine if the files are the same up to the commencement
|
|
point: the Zmodem protocol provides two ways in which this
|
|
may be determined (file date and CRC), but neither has yet
|
|
been implemented in ZMP.
|
|
|
|
S - Send a file.
|
|
Operation is similar to the receive function.
|
|
Additional options available are ASCII send and the
|
|
capability of distinguishing between normal Xmodem and
|
|
Xmodem-1k. In Ymodem and Zmodem modes, wildcard filenames
|
|
and multiple filenames are allowed. Multiple filenames
|
|
should be entered separated by spaces. In all cases, files
|
|
on different drives/user areas may be specified by supplying
|
|
a zcpr3-style du: prefix (e.g. C7:NEATPROG.WOW).
|
|
Byte count information is displayed in Zmodem mode on
|
|
transmit. This causes noticeable breaks between packets, but
|
|
it is felt that this is outweighed by the usefulness of the
|
|
information. ZMP's Zmodem mode is capable of CRC-32 opera-
|
|
tion, although CRC-16 mode is used if the receiver is incap-
|
|
able of CRC-32. Some other terminal programs, however, do
|
|
strange things when faced with a receiving program which
|
|
claims it can do CRC-32 (we have encountered one for the
|
|
Amiga which exhibits this problem). If this happens, the
|
|
esc-L menu and the configuration overlay have an option to
|
|
disable CRC-32.
|
|
|
|
X - Hangup.
|
|
This function causes the modem to disconnect from the
|
|
phone line, by momentarily dropping DTR.
|
|
|
|
Y - Print screen.
|
|
Allows the current screen to be dumped to printer. Note
|
|
that this must be supported in the overlay: most terminals
|
|
are incapable of this function. The standard overlay prints
|
|
'This function not supported.'. If you can make it work on
|
|
your system, good luck!
|
|
|
|
Z - Clear screen.
|
|
Allows the screen to be cleared. Useful if it fills
|
|
with rubbish.
|
|
|
|
|
|
4. Other information.
|
|
|
|
a) ZMP at higher baud rates.
|
|
When I first produced ZMP, I was more interested in
|
|
producing a universal Zmodem program than anything else.
|
|
Originally (several C compilers ago!) I had difficulty get-
|
|
ting it to work even at 300 baud, and so little thought was
|
|
given to accommodate higher transmission speeds. In partic-
|
|
ular, there is a "designed-in" bug/feature which would prob-
|
|
ably preclude ZMP working at much over 4800 baud. The prob-
|
|
lem is in the user overlay, in the mrd: routine. The requ-
|
|
irement here is to have a routine which returns either when
|
|
a character is available at the modem (in which case we
|
|
return TRUE), or 100 mS has elapsed (in which case we return
|
|
FALSE). The catch is that I used 100 x 1 mS waits, between
|
|
which we test for a character. A little calculation will
|
|
show that a 9600 baud character will take a little over 1 mS
|
|
to transfer, and 19200 baud characters take half this time.
|
|
Thus we are practically guaranteed to miss characters at
|
|
19200 baud, and even 9600 baud characters leave little
|
|
processing timeto spare. Two possible ways to overcome this
|
|
are:
|
|
|
|
i) Make the wait time shorter. Thus we could wait 1000 x
|
|
100 uS periods instead. This, however, makes the actual
|
|
wait time more unpredictable, since subroutine
|
|
call/return times are comparable to the wait time. It
|
|
also just puts off the evil day.
|
|
|
|
ii) Use a hardware timer to determine whether 100 mS has
|
|
elapsed. This is the preferred approach. Thus the mrd:
|
|
routine would loop continuously, exiting when either
|
|
there was a character at the modem or when the hardware
|
|
timer expired. An embryo CP/M-68K version of ZMP using
|
|
this approach has proved capable of reliable transfers
|
|
at 19,200 baud (although one must admit that it IS
|
|
running a 68010 at 10 MHz!).
|
|
|
|
I would like to hear from anyone who has had any
|
|
success with either of these two approaches.
|
|
|
|
5. Acknowledgements.
|
|
|
|
ZMP was developed from Hal Maney's Heath-specific HMODEM II.
|
|
I would like to thank Hal for writing HMODEM: CP/M users have
|
|
been without ZMODEM capability for far too long. As requested in
|
|
the source file, acknowledgement is given to him therein.
|
|
Appreciations also go to the authors of the Hi-Tech C compiler,
|
|
which proved to be capable of producing fast and compact code for
|
|
Z80 machines.
|
|
ZMP in its various incarnations is refined by suggestions
|
|
from you, the user. In particular, I would like to thank Mike
|
|
Allen, Richard Kopplin and Fred Haines for their invaluable
|
|
suggestions. I may sometimes be a little slow at implementation,
|
|
but I usually get there eventually! Fred Haines has also kindly
|
|
offered to be the U.S. collection point for bug reports,
|
|
suggestions etc. His address appears at the bottom of this
|
|
document, and he'll forward them to me via what he calls 'U.S.
|
|
Snail'. I will try and respond using what I call 'Australia
|
|
Pest'.
|
|
I would also like to thank Lindsay Allen, sysop of Z-Node
|
|
62. His name was removed from the original zmp11 title screen at
|
|
his own request, since I had done most of the work in modifying
|
|
Hmodem to work on other machines. Without Lindsay's encouragement
|
|
at difficult times, suggestions as to how to go about
|
|
recalcitrant procedures, and experience in file transfers, ZMP
|
|
would not have been produced. Thank you.
|
|
|
|
|
|
6. Finally...
|
|
The files contained in this library are placed in the public
|
|
domain. Just don't sell it, claim you wrote it, or do anything
|
|
similar that might annoy me. Above all, don't bother trying to
|
|
sue me if it doesn't work, or you tripped over the disk, or
|
|
anything similar. I haven't distributed the source files partly
|
|
due to the size of them, partly due to the fact that compilation
|
|
is messy (several modifications were needed to "standard" library
|
|
functions!), and partly due to the fact that there's still work
|
|
to do on them. Besides, I feel a certain fatherly feeling towards
|
|
ZMP, having spent most of my spare time for the last four months
|
|
working on it. So here's the deal: I will continue to support ZMP
|
|
(and RZMP) until I get sick of it. This could take an unknown
|
|
amount of time! At that point, I will release the sources into
|
|
the RCP/M community, and you may make of them what you will.
|
|
ZMP has a remote system relative, called RZMP. This allows
|
|
Zmodem transfers to and from remote systems. It should be
|
|
available from the same place from which you obtained ZMP.
|
|
I have also produced an extremely cut-down version of ZMP
|
|
which runs under CP/M-68K, currently running quite well as a
|
|
single .68K file (no overlays!) on a system with 128k bytes of
|
|
memory. If there is enough interest from CP/M-68k users (are
|
|
there any??), I could be persuaded to upgrade this version to the
|
|
point where it could be released.
|
|
Comments and suggestions are welcome. Bug reports are not so
|
|
welcome, but we'd like them anyway! Send either to:
|
|
|
|
Z-Node 62
|
|
Perth, Western Australia
|
|
(061+) 09-450-0200
|
|
(Soon to be on FidoNet)
|
|
|
|
U.S. users may send reports/comments to:
|
|
|
|
Fred Haines,
|
|
733 North King's Road, Apt. 356
|
|
Los Angeles, California 90069
|
|
|
|
-- Ron Murray
|
|
26th March, 1989
|
|
te systems. It should be
|
|
available from the same place fr
|
|
|