Annotation of 43BSDTahoe/cci/pt/recnv.c, revision 1.1.1.1

1.1       root        1: /************************************************************************
                      2: *                                                                       *
                      3: *      reccnv.c converts a standard PT hexfile to a larger record for  *
                      4: *      format.  Options allows input filename to be defined output     *
                      5: *      fle is always hexout.  Checksums are set to "00" instead of     *
                      6: *      trying to calculate them.                                       *
                      7: *      This program assumes that each record is 44 chars long it then  *
                      8: *      combines two records affectively into one.                      *
                      9: * 88 is the standard 152 the second pass and   is the third pass       *
                     10: *                                                                       *
                     11: ************************************************************************/
                     12: 
                     13: #include       <stdio.h>
                     14: #define         mode 0777
                     15: #define  TRUE 1;
                     16: #define  FALSE 0;
                     17: static int    lastflg; /* says working on last records */
                     18: 
                     19: main(argc, argv)
                     20: int argc;
                     21: char **argv;
                     22: 
                     23: {
                     24: static  char   record[1024];   /* actual data */
                     25: static  char   srecord[1024];  /* actual data */
                     26: register int   fs, ss, rs;             /* record size */
                     27: static  char   *ttrp, *ttrp2;
                     28: FILE   *in;
                     29: int    outf;
                     30: int    cs, i, pr;
                     31: char   *name = "hexout"; /* default filename for output */
                     32: char   *name1 = "DEFAULT_LD_FL"; /* default filename */
                     33: char    *rp;   /* record pointer */
                     34: int    l=88;   /*length of record to fix */
                     35: int    dl;     /* length of data segment */
                     36: int    fl=9;   /* header length always the same */
                     37: char   *dlc;   /* data length character */
                     38: int    aoff;   /* address offset for checking */
                     39: 
                     40: if(argc < 2)
                     41:        printf("\n using default read file and record size 88\n");
                     42: else if(argc == 2)
                     43:        {
                     44:        name1 = *(++argv);
                     45:        }
                     46: else if(argc == 3)
                     47:        {
                     48:        name1 = *(++argv);
                     49:        l = atoi(*(++argv));
                     50:        }       
                     51: 
                     52: /* fix the record parameters */
                     53: switch(l)
                     54:        {
                     55:        case 3:
                     56:                l = 280; /* length of two records to be combined */
                     57:                dlc = "8";      /* new data length character */
                     58:                dl = 256;       /* new data field length */
                     59:                aoff = 0x40;    /* address offset of two sequ. rec's. */
                     60:                break;
                     61:        case 2:
                     62:                l = 152;
                     63:                dlc = "4";
                     64:                dl = 128;
                     65:                aoff = 0x20;
                     66:                break;
                     67:        default :               /* 88 two normal rows */
                     68:                l = 88;
                     69:                dlc = "2";
                     70:                dl = 64;
                     71:                aoff = 0x10;
                     72:                break;
                     73:        }
                     74: 
                     75: rp = record;   /* setup pointer to array to dump info */
                     76: ttrp2 = srecord;       /* setup pointer to array to dump info */
                     77: if((in = fopen(name1, "r")) == (FILE *)NULL )
                     78:        printf("can't fopen input file\n");
                     79: if((outf = creat(name, mode)) < 0)
                     80:        printf("can't create hexout\n");
                     81: if((open(name, 2)) < 0)
                     82:        printf("can't open hexout\n");
                     83: 
                     84: /* read and convert the records */
                     85: while (((fs = getrec(in, srecord )) + (ss = getrec(in, record))) > 0)
                     86:        {
                     87:        rs = fs + ss;
                     88:        if(rs == l)
                     89:                {
                     90:                ttrp = rp;
                     91:                /* check to see if the two records have sequential addresses */
                     92:                if (pr = acnv(record, srecord, aoff)) /* addreses sequential ?? */
                     93:                        {
                     94:                        *(ttrp + 1) = *dlc;     /* double the data amount */
                     95:                        ttrp = rp + ((dl/2)+fl);   /* where to add new data */
                     96: 
                     97:                        /* copy from data field */
                     98:                        for(i=1, ttrp2 = srecord+fl ; i<((dl/2) +1);i++)
                     99:                                *ttrp++ = *ttrp2++; /* copy data */
                    100:                        *ttrp++ = '\0';
                    101:                        *ttrp++ = '\0';
                    102:                        *ttrp++ = '\n';
                    103:                        write(outf, record, (dl+fl+3));
                    104:                        }
                    105:                else if(pr == 0) /* not sequential */
                    106: /* they don't ave sequential addresses so just write the record as is */
                    107:                        {
                    108:                if(ss >0)
                    109:                        write(outf, record, ss);
                    110:                if(fs >0)
                    111:                        write(outf, srecord, fs);
                    112:                        continue;
                    113:                        }
                    114:        }       /*end of large file if */
                    115:        else if(rs < l) /* if less than expected read dump as is */
                    116:                {
                    117:                /*  printf("< if\n");
                    118:                */
                    119:                if(ss >0)
                    120:                        write(outf, record, ss);
                    121:                if(fs >0)
                    122:                        write(outf, srecord, fs);
                    123:                continue;
                    124:                }
                    125:        } /* end of while loop */
                    126: exit(0);
                    127: }
                    128: 
                    129: /************************************************************************
                    130: *                                                                       *
                    131: *  converts address field and compares to see if they're sequential    *
                    132: *                                                                       *
                    133: *                                                                       *
                    134: ************************************************************************/
                    135: 
                    136: int
                    137: acnv(a,b,aoff)
                    138: char *a, *b;   /* pointers to the two records */
                    139: int    aoff;   /* address offset */
                    140: 
                    141: {
                    142:        char g[5], h[5];
                    143:        int i, ch, cg;
                    144: 
                    145:        a=a+3; b=b+3;
                    146:        for(i=0; i<4; i++,a++,b++)
                    147:                {
                    148:                g[i] = *a;
                    149:                h[i] = *b;
                    150:                }
                    151:        g[4] = '\0';
                    152:        h[4] = '\0';
                    153:        cg = cnv(g);
                    154:        ch = cnv(h) - aoff;
                    155:        if( ch == cg)
                    156:                {
                    157:                /* printf("out of order \n");
                    158:                */
                    159:                return 1;
                    160:                }
                    161:        else if(ch != cg) 
                    162:                return 0;
                    163: 
                    164: }
                    165: 
                    166: /************************************************************************
                    167: *      cnv - converts four ascii digits to an integer                  *
                    168: *         returns - the integer value                                  *
                    169: *                                                                       *
                    170: ************************************************************************/
                    171: int
                    172: cnv(sp)
                    173: char *sp;
                    174: 
                    175: {
                    176: register int c, d, i, b;
                    177: 
                    178: b = c = 0;
                    179: 
                    180: for(i=0 ; i<4; i++, sp++)
                    181:        {
                    182:        if (*sp >= '0' && *sp <= '9')
                    183:                b = *sp - '0';
                    184:        else if (*sp >= 'A' && *sp <= 'F')
                    185:                b = *sp - 'A' + 10;
                    186:        else if (*sp >= 'a' && *sp <= 'f')
                    187:                b = *sp - 'a' + 10;
                    188:        switch (i)
                    189:                {
                    190:                case 3:
                    191:                        c = b + c;
                    192:                case 2:
                    193:                        c = (b * 16) + c;
                    194:                        break;
                    195:                case 1:
                    196:                        c = (b * 256) + c;
                    197:                        break;
                    198:                case 0:
                    199:                        c = (b * 4096) + c;
                    200:                        break;
                    201:                }
                    202:        }
                    203: return c;
                    204: }
                    205: 
                    206: /************************************************************************
                    207:  *                                                                     *
                    208:  *     getrec  - Get a record to transmit.                             *
                    209:  *                                                                     *
                    210:  *     Returns:                                                        *
                    211:  *             -1      Error in file format.                           *
                    212:  *             0       End of file reached.                            *
                    213:  *             > 0     Size of record to transmit.                     *
                    214:  *                                                                     *
                    215:  ************************************************************************/
                    216: 
                    217: int
                    218: getrec (fd, rp)
                    219: 
                    220: FILE *         fd;
                    221: char *         rp;
                    222: 
                    223: {
                    224: 
                    225:        int             c;
                    226:        int             nc;             /* number of characters         */
                    227:        int             l;              /* length of record bytes       */
                    228:        int             cc;             /* checksum                     */
                    229:        int             i;              /* counter                      */
                    230:        int             a;              /* address piece                */
                    231: 
                    232:        while ((c = getc (fd)) != ':')  /* Look for start of record     */
                    233:                if (c == EOF)
                    234:                        return 0;       /* End of file                  */
                    235: 
                    236:        /*****  Start record off.                                       */
                    237: 
                    238: /*     printf("At record start\n"); */
                    239:        *rp++ = ':';
                    240:        nc = 1;
                    241: 
                    242:        /*****  Get number of hex bytes in record.                      */
                    243: 
                    244:        if ((l = getxb (fd, rp)) < 0)
                    245:                return -1;
                    246: 
                    247:        if(l == 1)
                    248:                {
                    249:                /* printf("01 record \n");
                    250:                */
                    251:                rp += 2;
                    252:                for(i=1; i < 11; i += 2, rp +=2)
                    253:                        {
                    254:                        /* printf(" %u\n", i);
                    255:                        */
                    256:                        getxb(fd,rp);
                    257:                        }
                    258:                *(rp) = '\n';
                    259:                return 14;
                    260:                }       
                    261: 
                    262:        else if(l == 0)
                    263:                {
                    264:                printf("00 record \n");
                    265:                rp += 2;
                    266:                for(i=1; i < 8; i += 2, rp += 2)
                    267:                        {
                    268:                        printf(" %u\n",i);
                    269:                        getxb(fd,rp);
                    270:                        }
                    271:                *++rp = '\n';
                    272:                return 10;
                    273:                }       
                    274: 
                    275:        else
                    276:                {
                    277:                /* printf("normal record \n");
                    278:                printf("%d data bytes\n", l);
                    279:                */
                    280:                cc = l;                 /* Start checksum               */
                    281:                rp += 2;                /* Past two characters          */
                    282:                nc += 2;                /* Two more characters          */
                    283: 
                    284:                /*****  Get address portion of data record.             */
                    285:        
                    286:                for (i = 2 ; i > 0 ; i--)       /* Two hex bytes        */
                    287:                        {
                    288:                        if ((a = getxb (fd, rp)) < 0)
                    289:                        return -1;
                    290: 
                    291:                        cc += a;        /* Figure address into checksum */
                    292:                        rp += 2;        /* Past two characters          */
                    293:                        nc += 2;        /* Two more characters          */
                    294:                        }
                    295: 
                    296:                /*****  Read type byte, which should be zero.           */
                    297: 
                    298:                if ((i = getxb (fd, rp)) != 0)
                    299:                        return -1;
                    300: 
                    301:                cc += i;                /* Figure type into checksum    */
                    302:                rp += 2;                /* Past two characters          */
                    303:                nc += 2;                /* Two more characters          */
                    304: 
                    305:                /*****  Read in the data record.                        */
                    306: 
                    307:                while (l-- > 0)         /* Count down                   */
                    308:                        {
                    309:                        if ((i = getxb (fd, rp)) < 0)
                    310:                                return -1;
                    311: 
                    312:                /*      printf ("Read %d\n", i);        */
                    313:                        cc += i;        /* Checksum                     */
                    314:                        rp += 2;        /* Pointer                      */
                    315:                        nc += 2;        /* Number of characters         */
                    316:                        }
                    317: 
                    318:                cc = (-cc) & 0377;      /* Two's complement byte        */
                    319: 
                    320:                /*      printf ("Checksum = %x\n", cc); */
                    321:                *rp = cc >> 4;
                    322:                *rp += *rp < 10 ? '0' : 'A' - 10;
                    323:                *++rp = cc & 0xF;
                    324:                *rp += *rp < 10 ? '0' : 'A' - 10;
                    325: 
                    326:                /*      printf ("record size = %d\n", nc + 2);  */
                    327:                *++rp = '\n';
                    328:                return nc + 3;
                    329: 
                    330:                } /* normal records */
                    331: }
                    332: 
                    333: /************************************************************************
                    334:  *                                                                     *
                    335:  *     getxb   - Get a hex byte.                                       *
                    336:  *                                                                     *
                    337:  *     Returns:                                                        *
                    338:  *             -1      Error in file format or end of file reached.    *
                    339:  *             >= 0    Integer value of byte.                          *
                    340:  *                                                                     *
                    341:  ************************************************************************/
                    342: 
                    343: int
                    344: getxb (fd, sp)
                    345: 
                    346: FILE *         fd;
                    347: char *         sp;
                    348: 
                    349: {
                    350: 
                    351:        register int    i, j;
                    352: 
                    353:        if ((i = getxn (fd, sp++)) < 0 || (j = getxn (fd, sp)) < 0)
                    354:                return -1;
                    355: 
                    356:        return (i << 4) | j;
                    357: 
                    358: }
                    359: 
                    360: /************************************************************************
                    361:  *                                                                     *
                    362:  *     getxn   - Get a hex nibble.                                     *
                    363:  *                                                                     *
                    364:  *     Returns:                                                        *
                    365:  *             -1      Error in file format or end of file reached.    *
                    366:  *             >= 0    Integer value of nibble.                        *
                    367:  *                                                                     *
                    368:  ************************************************************************/
                    369: 
                    370: int
                    371: getxn (fd, sp)
                    372: 
                    373: FILE *         fd;
                    374: char *         sp;
                    375: 
                    376: {
                    377: 
                    378:        register int    c;
                    379: 
                    380:        *sp = c = getc (fd);
                    381: 
                    382:        if (c >= '0' && c <= '9')
                    383:                return c - '0';
                    384:        else if (c >= 'A' && c <= 'F')
                    385:                return c - 'A' + 10;
                    386:        else if (c >= 'a' && c <= 'f')
                    387:                return c - 'a' + 10;
                    388: 
                    389:        return -1;
                    390: 
                    391: }
                    392: 
                    393: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.