for Embedded Applications
Now with Crash Recovery and Windows CE Bindings

NEW!!     15 Minutes of Fame for Industrial ZMODEMTM
(Showcase Embedded Application)


The Industrial Zmodem code is fast and efficient.  Most importantly,
we found it easy to integrate into our application.  It's been a
real life saver and is worth every penny.  -- Tom Dexter


With Industrial ZMODEM you pay for what you DON'T get:

Interesting Learning Experiences

Unix-isms

System Dependencies

Irrelevant features
Confusing options
Bloated code
Protocol debugging

DEVELOPMENT DELAYS

The power and complexity of embedded computers has created a need for an efficient, reliable, and cost effective way to transfer information between PCs and embedded computers.

Omen Technology's Industrial ZMODEMTM fills this need. Industrial ZMODEM customers can use standard Windows utilities to transfer data to and from their products without incurring extra software costs.

ZMODEM inventor Chuck Forsberg has distilled ZMODEM's proven efficiency and reliability into a carefully crafted product optimized for embedded applications. Industrial ZMODEM's memory efficient send and receive modules use as little as 8k memory. Industrial ZMODEM uses 32 bit error detection to safeguard your data.

In the industrial environment user supplied routines may replace traditional file operations. The uses of the "filenames" and data are limited only by your imagination. One customer uses the incoming file name to indicate the load address for data; when ZMODEM sends the end-of-file data is flashed into readonly memory.

Industrial ZMODEM is provided in separate receive and send modules since many customers only need one. Both can be used if desired.

From the beginning, ZMODEM was designed to run on a wide variety of systems. ZMODEM has been used on 8, 16, 32, 36, and 64 bit computers since 1986. The Industrial ZMODEM C source code is compatible with processors of different word lengths and byte ordering. These programs can be compiled and run on a Unix system (Linux, Unix, BSD, etc.) to gain familiarity with the code and its operation.

The simple interface for Industrial ZMODEM is given below. Only a few user supplied routines are required by Industrial ZMODEM. Below that are memory footprints obtained for an 80186 family processor.

Some applications require interrupt driven serial i/o. High performance interrupt driven source code from the famous DSZ program is included for reference.

SUPER QUICK LICENSING

In today's competitive environment, project delays can be fatal.

Most customers choose to use our expedited licensing procedure which can get the source code to them in hours. Industrial ZMODEMTM can be licensed for $2000 for the send or receive module, $3800 for both. This is a one time licensing fee that covers a product line.

The source code is sent upon payment. There is no license agreement to sign.

The modest licensing fee compares favorably with the cost of developing an in house alternative cobbled together from old internet files, with the resultant risk of Copyright violation. Industrial ZMODEM is a bargain when time to market savings are considered.

We can accept checks or Visa/MC/Amex credit card orders for Industrial ZMODEM. For credit card orders, please fax the credit card information (including signature, cardholder address, phone number, and expiry date) to 503-629-0665. Please indicate you wish to obtain
ONE TIME TECHNOLOGY TRANSFER - Industrial ZMODEM SOURCE CODE
We can email you the source code as soon as the bank confirms the credit card transaction.
(Send an email to caf@omen.com so we will have a good address to use.)

Please contact Omen Technology at 503-614-0430 if you have questions.

Receive Module Interface

/*
 *
 * irz.c By Chuck Forsberg
 *  Copyright 1999 Omen Technology INC All Rights Reserved
 *
 *  Entry:
 *	rz();  this function does not return
 *
 *  External functions called:
 *
 * rzok()	called on normal conclusion
 *	NOTE: caller should check that files have been received
 * rzfail()	called on failure
 *  
 *  Note: The calls to rzok() and rzfail() can be eliminated in
 *  favor of rz() returning a completion code by changing the calls
 *  to rzok() and rzfail() to return statements.  This is a trivial
 *  change.
 *  
 *
 * sendline(c)  sends a character to host
 *
 * purgeline()	empty receive queue
 * int readline(tenths) read char from host, timeout in seconds/10
	return received byte 0 to 0377
	negative return values indicate error:
		return -1 on recoverable error
		return -2 on timeout
	trap fatal errors (loss of carrier, etc.)
 *
 * sendbrk() send a break signal (not likely to be needed)
 *
 * long crprocheader(s) parse filename, decide what to do with
 * incoming file:
 *	if (zconv==ZCRESUM) means sender requests crash recovery
 *	return ERROR to skip
 *	opens it for writing
 *	Returns restart address if crash recovery desired, else 0
 *
 * putsec(s, n) write n bytes, trap errors
 *
 * closeit() finish writing, close file
 *	trap on error
 *
 * When trapping on errors, call canit() unless line dropped
 */

Send Module Interface

/*
 *
 * isz.c By Chuck Forsberg,  Omen Technology INC
 *  Copyright 1999 Omen Technology INC All Rights Reserved
 *  Entry: see sample main() in code below
 *
 *  External functions called:
 *
 * sendline(c)  sends a character to host
 *
 * mputs(s) sends null terminated string to host
 *
 * purgeline()	empty receive queue
 *
 * int readline(tenths) read char from host, timeout in seconds/10
	return received byte 0 to 0377
	negative return values indicate error:
		return -1 on recoverable error
		return -2 on timeout
	trap fatal errors (loss of carrier, etc.)
 *
 * checkline() return non 0 if readline has 1 or more bytes ready
 *
 * zfilbuf() fill buffer with blklen bytes, set Eofseen if EOT, return count
 *
 * zseek(long whence) clear EOF, errors, seek
 *
 * zclose() close the input dataset associated with zfilbuf() et al.
 *
 * When trapping on errors, call canit() unless line dropped
 *
 */

main(argc, argv)		/* Sample calling sequence for send module */
char **argv;
{
	startz();		/* Initialize receiver */

	/*
	 *  To ask receiver for crash rocovery, set
	 *		Lzconv = ZCRESUM;
	 * call wcs() once for each file.
	 *  Initialize zfilbuf before calling wcs()
	 *  The string is the file name, null terminated
	 *    file length is not sent
	 */
	if (wcs("file.ext"))
		exit(1);

	saybibi();		/* Orderly conclusion of ZMODEM session */

	exit(0);
	
}

Memory Footprint



# this compiles irz and isz for 80186 target to get
# an idea of the memory footprint
# fields are left to right:
#	text (code)
#	initialized data (strings, tables, etc.)
#	uninitialized data (buffers, etc.)
#	total of the above
#	total in hex

/usr/ods30/bin/cc -M1 -Os -c irz.c
size irz.o
	irz.c
	4133 + 1613 + 1094 = 6840 = 0x1ab8


/usr/ods30/bin/cc -M1 -Os -c isz.c
size isz.o
	isz.c
	4747 + 1635 + 1118 = 7500 = 0x1d4c

The total line count of both send and receive modules counting lines with semicolons comes to 1180 (lines output by C preprocessor). Not counting declarations and definitions results in 458 lines of "executable statements".

Omen Technology was incorporated in 1984 to develop communications and file transfer software for a variety of computer systems. Chuck Forsberg, Omen Technology president, has developed a number of protocols and protocol implementations, including YMODEM and ZMODEM.