Пример #1
0
/* 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();
}
Пример #2
0
/* 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 {
Пример #3
0
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();
    }
}
Пример #4
0
/* 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;
    }
}
Пример #5
0
/*
 * 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();
    }
}
Пример #6
0
/*
 * 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;
    }
}