|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.