/* Send ZMODEM binary header hdr of type type */ void zsbhdr(int type, char *hdr) { register int n; register unsigned short crc; if (type == ZDATA) for (n = Znulls; --n >= 0;) xsendline(0); xsendline(ZPAD); xsendline(ZDLE); Crc32t = Txfcs32; if (Crc32t) zsbh32(hdr, type); else { xsendline(ZBIN); zsendline(type); crc = updcrc(type, 0); for (n = 4; --n >= 0; ++hdr) { zsendline(*hdr); crc = updcrc((0377 & *hdr), crc); } crc = updcrc(0, updcrc(0, crc)); zsendline(crc >> 8); zsendline(crc); } if (type != ZDATA) flushmo(); }
/* Send ZMODEM binary header hdr of type type */ void zsbhdr(int type, char *hdr) { vfile(F("zsbhdr: %s %lx"), frametypes[type+FTOFFSET], rclhdr(hdr)); /* if (type == ZDATA) for (n = Znulls; --n >=0; ) xsendline(0); */ xsendline(ZPAD); xsendline(ZDLE); //Pete (El Supremo) This looks wrong but it is correct - the code fails if == is used if ((Crc32t = Txfcs32)) { int n; UNSL long crc; xsendline(ZBIN32); zsendline(type); crc = 0xFFFFFFFFL; crc = UPDC32(type, crc); for (n=4; --n >= 0; ++hdr) { crc = UPDC32((0377 & *hdr), crc); zsendline(*hdr); } crc = ~crc; for (n=4; --n >= 0;) { zsendline((int)crc); crc >>= 8; } } else {
void zsda32(const char *buf, size_t length, int frameend) { int c; unsigned long crc; int i; crc = 0xFFFFFFFFL; zsendline_s(buf, length); for (; length; length--) { c = *buf & 0377; crc = UPDC32(c, crc); buf++; } xsendline(ZDLE); xsendline(frameend); crc = UPDC32(frameend, crc); crc = ~crc; for (i = 4; --i >= 0;) { c = (int) crc; if (c & 0140) xsendline(lastsent = c); else zsendline(c); crc >>= 8; } if (frameend == ZCRCW) { xsendline(XON); flushmo(); } }
/* Send ZMODEM binary header hdr of type type */ static void zsbh32(char *hdr, int type) { register int n; register unsigned long crc; xsendline(ZBIN32); zsendline(type); crc = 0xFFFFFFFFL; crc = UPDC32(type, crc); for (n = 4; --n >= 0; ++hdr) { crc = UPDC32((0377 & *hdr), crc); zsendline(*hdr); } crc = ~crc; for (n = 4; --n >= 0;) { zsendline((int) crc); crc >>= 8; } }
/* * Send binary array buf of length length, with ending ZDLE sequence frameend */ void zsdata(const char *buf, size_t length, int frameend) { register unsigned short crc; crc = 0; do { zsendline(*buf); crc = updcrc((0377 & *buf), crc); buf++; } while (--length > 0); xsendline(ZDLE); xsendline(frameend); crc = updcrc(frameend, crc); crc = updcrc(0, updcrc(0, crc)); zsendline(crc >> 8); zsendline(crc); if (frameend == ZCRCW) { xsendline(XON); flushmo(); } }
/* * Send data subpacket RLE encoded with 32 bit FCS */ void zsdar32(char *buf, int length, int frameend) { register int c, l, n; register unsigned int crc; crc = 0xFFFFFFFFL; l = *buf++ & 0377; if (length == 1) { zsendline(l); crc = updcrc32(l, crc); if (l == ZRESC) { zsendline(1); crc = updcrc32(1, crc); } } else { for (n = 0; --length >= 0; ++buf) { if ((c = *buf & 0377) == l && n < 126 && length>0) { ++n; continue; } switch (n) { case 0: zsendline(l); crc = updcrc32(l, crc); if (l == ZRESC) { zsendline(0100); crc = updcrc32(0100, crc); } l = c; break; case 1: if (l != ZRESC) { zsendline(l); zsendline(l); crc = updcrc32(l, crc); crc = updcrc32(l, crc); n = 0; l = c; break; } /* **** FALL THRU TO **** */ default: zsendline(ZRESC); crc = updcrc32(ZRESC, crc); if (l == 040 && n < 34) { n += 036; zsendline(n); crc = updcrc32(n, crc); } else { n += 0101; zsendline(n); crc = updcrc32(n, crc); zsendline(l); crc = updcrc32(l, crc); } n = 0; l = c; break; } } } PUTCHAR(ZDLE); PUTCHAR(frameend); crc = updcrc32(frameend, crc); crc = ~crc; for (length=4; --length >= 0;) { zsendline((int)crc); crc >>= 8; } }