home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / TERMS / RZMP-SRC.LZH / RZMP2.C < prev    next >
Text File  |  2000-06-30  |  12KB  |  411 lines

  1. /************************************************************************/
  2. /*                                    */
  3. /*            RZMP Source File #2                */
  4. /*                                    */
  5. /************************************************************************/
  6.  
  7. #define RZMP
  8.  
  9. #include "zmp.h"
  10. #include <stdio.h>
  11.  
  12. char *alloc();
  13.  
  14. /*
  15.  * Copyright (C) 1986 Gary S. Brown.  You may use this program, or
  16.  * code or tables extracted from it, as desired without restriction.
  17.  */
  18.  
  19. /* First, the polynomial itself and its table of feedback terms.  The  */
  20. /* polynomial is                                                       */
  21. /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */
  22. /* Note that we take it "backwards" and put the highest-order term in  */
  23. /* the lowest-order bit.  The X^32 term is "implied"; the LSB is the   */
  24. /* X^31 term, etc.  The X^0 term (usually shown as "+1") results in    */
  25. /* the MSB being 1.                                                    */
  26.  
  27. /* Note that the usual hardware shift register implementation, which   */
  28. /* is what we're using (we're merely optimizing it by doing eight-bit  */
  29. /* chunks at a time) shifts bits into the lowest-order term.  In our   */
  30. /* implementation, that means shifting towards the right.  Why do we   */
  31. /* do it this way?  Because the calculated CRC must be transmitted in  */
  32. /* order from highest-order term to lowest-order term.  UARTs transmit */
  33. /* characters in order from LSB to MSB.  By storing the CRC this way,  */
  34. /* we hand it to the UART in the order low-byte to high-byte; the UART */
  35. /* sends each low-bit to hight-bit; and the result is transmission bit */
  36. /* by bit from highest- to lowest-order term without requiring any bit */
  37. /* shuffling on our part.  Reception works similarly.                  */
  38.  
  39. /* The feedback terms table consists of 256, 32-bit entries.  Notes:   */
  40. /*                                                                     */
  41. /*     The table can be generated at runtime if desired; code to do so */
  42. /*     is shown later.  It might not be obvious, but the feedback      */
  43. /*     terms simply represent the results of eight shift/xor opera-    */
  44. /*     tions for all combinations of data and CRC register values.     */
  45. /*                                                                     */
  46. /*     The values must be right-shifted by eight bits by the "updcrc"  */
  47. /*     logic; the shift must be unsigned (bring in zeroes).  On some   */
  48. /*     hardware you could probably optimize the shift in assembler by  */
  49. /*     using byte-swap instructions.                                   */
  50.  
  51. static long cr3tab[] = { /* CRC polynomial 0xedb88320 */
  52.  
  53.     0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
  54.     0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
  55.     0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
  56.     0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
  57.     0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
  58.     0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
  59.     0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
  60.     0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
  61.     0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
  62.     0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
  63.     0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
  64.     0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
  65.     0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
  66.     0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
  67.     0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
  68.     0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
  69.     0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
  70.     0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
  71.     0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
  72.     0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
  73.     0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
  74.     0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
  75.     0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
  76.     0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
  77.     0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
  78.     0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
  79.     0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
  80.     0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
  81.     0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
  82.     0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
  83.     0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
  84.     0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
  85. };
  86.  
  87. long
  88. updc32(b,c)
  89. int b;
  90. long c;
  91. {
  92.     return (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF));
  93. }
  94.  
  95. checkpath(name)  /* eliminate bad paths in receive */
  96. char *name;
  97. {
  98.     char *p, *q, c, *index(), *checkname();
  99.     short i;
  100.     static char badchar[] = ",;:_[]=<>/";    /* disallowed f/n characters */
  101.  
  102.     for (p=name; *p; p++) {             /* dump strange characters */
  103.  
  104. #ifdef AZTEC_C
  105.         if (!isalpha(*p) && !isdigit(*p) && (*p != '.')) {
  106. #else
  107.         if (!(((c = *p) > '!') && (c < 0x7f)
  108.             && !((int) (q = index(badchar,c))))) {
  109. #endif
  110.  
  111.             *p = '\0';
  112.             strcat(name,p+1);
  113.         }
  114.         else
  115.             *p = tolower(*p);
  116.     }
  117.     if ((i = (int) (index(name,'.') - name)) > 8) {
  118.         p = name + i;
  119.         name[8] = '.';
  120.         name[9] = '\0';
  121.         p[3] = '\0';
  122.         strcat(name,p);
  123.     }
  124.     name[12] = '\0';
  125.     if (q = checkname(name)) {    /* eliminate bad filetypes */
  126.         *q = '\0';
  127.         strcat(name,"obj");
  128.     }
  129.     if (!(*Wheel) && (p = index(name,':')))    /* non-wheels can't say du: */
  130.         strcpy(name,p+1);
  131.     report(PATHNAME,name);
  132. }
  133.  
  134. /* Test filetype of filename pointed to by name */
  135. /*   Returns NULL if Wheel set or filetype ok, else pointer to bad type */
  136. /*   Tests filetype against prohibited list in overlay */
  137.  
  138. char *checkname(name)
  139. char *name;
  140. {
  141.     int i;
  142.     char c, *p, *q, *r, *index();
  143.  
  144.     if (*Wheel)        /* Wheels can do anything */
  145.         return NULL;
  146.     if (p = index(name,'.')) {
  147.         p += 1;
  148.         r = Badtypes;    /* Point to list */
  149.         while (*r) {
  150.             q = p;    /* start at this filetype again */
  151.             for (i = 0; i < 3; i++, q++, r++) {
  152.                 if (*q != (isupper(c = *r) ? tolower(c) : c))
  153.                     goto nocomp;
  154.             }
  155.             return p;    /* found one: return address */
  156. nocomp:
  157.             while ( i++ < 3)
  158.                 r++;    /* position for next */
  159.         }
  160.     }
  161.     return NULL;    /* If we got this far, it's OK */
  162. }
  163.  
  164. char *
  165. grabmem(sizep)         /* grab all available memory */
  166. unsigned *sizep;       /* place to store how much we got */
  167. {
  168.     static char *p,*q;
  169.     static unsigned size;
  170.  
  171. #ifdef HI_TECH_C
  172.     q = alloc(BUFSIZ + 10);    /* Make sure we have enough for disk i/o */
  173. #endif
  174.  
  175. #ifdef AZTEC_C
  176.     q = alloc(BUFSIZ);        /* Ditto */
  177. #endif
  178.  
  179.     size = BUFSTART + 10;        /* allow some overrun */
  180.     while ((p = alloc(size)) == (char *) MEMORY_FULL) {
  181.         size -= 1024;
  182.         if ((size - 10) < 2048) {
  183.             size = 0;
  184.             break;
  185.         }
  186.     }
  187.  
  188. #ifdef DEBUG
  189.     printf("\ngrabmem = %x %d\n",p,size);
  190. #endif
  191.  
  192.     *sizep = size - 10;        /* don't mention the overrun */
  193.     free(q);            /* Free disk i/o space */
  194.     return p;
  195. }
  196.  
  197. linetolist(names)   /* expand and put Pathnames in Pathlist, return count */
  198. char *names;
  199. {
  200.     static char *p;
  201.     static int count;
  202.     static char **tempalloc;
  203.  
  204. #ifdef DEBUG
  205.     static int i;
  206. #endif
  207.  
  208.     tempalloc = Pathlist = (char **) alloc(510);
  209.  
  210.     if (allocerror(tempalloc))
  211.         return 0;
  212.  
  213. #ifdef   DEBUG
  214.     printf("Pathlist = %x\n",Pathlist);
  215. #endif
  216.     count = 0;
  217.     Pathlist[count++] = names;
  218.     for (p = names; *p; p++) {         /* break up into substrings */
  219.         if (*p == ' ') {
  220.             *p = '\0';
  221.             while (*++p == ' ');         /* dump extra spaces */
  222.                 Pathlist[count++] = p;
  223.         }
  224.     }
  225.  
  226. #ifdef   DEBUG
  227.     printf("\nbefore command\n");
  228.     for (i=0; i < count; i++)
  229.         printf("%d %s\n",i,Pathlist[i]);
  230. #endif
  231.  
  232.     command(&count,&Pathlist);
  233.  
  234. #ifdef   DEBUG
  235.     printf("\nafter command\n");
  236.     for (i=0; i < count; i++)
  237.         printf("%d %s\n",i,Pathlist[i]);
  238. #endif
  239.  
  240.     free(tempalloc);
  241.     return count;
  242. }
  243.  
  244. freepath(n)
  245. int n;
  246. {
  247.     if (n) {
  248.         while (n)
  249.             free(Pathlist[--n]);
  250.         free(Pathlist);
  251.     }
  252. }
  253.  
  254. addu(filename,drive,user)
  255. char *filename;
  256. int drive,user;
  257. {
  258.     if (!isin(filename,":") && user >= 0 && user <= 15) {
  259.         strcpy(Buf,filename);
  260.         filename[0] = (char)drive;
  261.         sprintf(filename+1,"%d",user);
  262.         sprintf((user < 10) ? filename+2 : filename+3,":%s",Buf);
  263.     }
  264. }
  265.  
  266. deldrive(filename)
  267. char *filename;
  268. {
  269.     char *i, *index();
  270.  
  271.     if ((i = index(filename,':')) != (char *) NULL)
  272.         strcpy(filename,i+1);
  273. }
  274.  
  275. chrin()        /* Direct console input which repeats character */
  276. {
  277.     return bdos(CONIN);
  278. }
  279.  
  280. getch()
  281. {
  282.     return bdos(DIRCTIO,INPUT);
  283. }
  284.  
  285. flush()
  286. {
  287.     while(bdos(GCS,NULL))          /*clear type-ahead buffer*/
  288.         bdos(CONIN,NULL);
  289.     getch();           /*and anything else*/
  290. }
  291.  
  292. purgeline()
  293. {
  294.     while (minprdy())              /*while there are characters...*/
  295.         mcharinp();             /*gobble them*/
  296. }
  297.  
  298. openerror(chan,fname,test)
  299. int chan,test;
  300. char *fname;
  301. {
  302.     int result;
  303.  
  304.     if (result = (chan == test)) {
  305.         printf("\n\nERROR - Cannot open %s\n\n",fname);
  306.         wait(3);
  307.     }
  308.     return result;
  309. }
  310.  
  311. #ifdef HI_TECH_C
  312.  
  313. char *alloc(cnt)
  314. int cnt;
  315. {
  316.     char *malloc();
  317.  
  318.     return malloc(cnt);
  319. }
  320. #endif
  321.  
  322. allocerror(p)
  323. char *p;
  324. {
  325.     static int status;
  326.  
  327.     if (status = (p == (char *) MEMORY_FULL))
  328.         perror("Memory allocation failure");
  329.     return status;   
  330. }
  331.  
  332. perror(string)
  333. char *string;
  334. {
  335.     printf("\007\nERROR - %s\n\n",string);
  336.     wait(3);
  337. }
  338.  
  339. readstr(p,t)
  340. char *p;
  341. int t;
  342. {
  343.     static int c;
  344.  
  345.     t *= 10;                /* convert to tenths */
  346.     flush();
  347.     while (((c=readline(t)) != CR) && (c != TIMEOUT)) {
  348.         if (c != LF)
  349.             *p++ = c;
  350.     }
  351.     *p = 0;
  352.     return c;
  353. }
  354.  
  355. isin(received,expected)
  356. char *received, *expected;
  357. {  
  358.     return (stindex(received,expected) != -1);
  359. }
  360.  
  361. report(row,string)
  362. int row;
  363. char *string;
  364. {
  365.     LOCATE(row,RPTPOS);
  366.     lprint(string);
  367. }
  368.  
  369. /* Output a character to the local console only */
  370. lputch(c)
  371. char c;
  372. {
  373.     bdos(68,c);    /* Function 68 goes to local only */
  374. }
  375.  
  376. /* Output a string to the local console only */
  377. lprint(string)
  378. char *string;
  379. {
  380.     char c, *p;
  381.  
  382.     p = string;
  383.     while (c = *p++)
  384.         lputch(c);
  385. }
  386.  
  387. mstrout(string,echo)
  388. char *string;
  389. int echo;             /* echo flag means send to screen also */
  390. {
  391.     static char c;
  392.  
  393.     while (c = *string++) {
  394.         if ((c == RET) || (c == '\n')) {      /* RET is a ! */
  395.             mcharout(CR);
  396.             mcharout(LF);
  397.             c = '\n';
  398.         }
  399.         else if (c == WAITASEC)
  400.             wait(1);
  401.         else
  402.             mcharout(c);
  403.         if (echo)
  404.             lputch(c);
  405.     }
  406.     MSWAIT(100);      /* wait 100 ms */
  407.     purgeline();
  408. }
  409.  
  410. /*            End of RZMP source file #2            */
  411.