home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / develop / adev11 / utils / mhex.c
C/C++ Source or Header  |  1995-02-27  |  5KB  |  173 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <math.h>
  6.  
  7. #define ULONG unsigned long
  8. #define UBYTE unsigned char
  9. #define BOOL char
  10. #define TRUE 1
  11. #define FALSE 0
  12.  
  13. #define STRING_SIZE 100
  14.  
  15. UBYTE far data_blk[65536];
  16.  
  17. #define HEX(c) ((c>'9')?c-'A'+10:c-'0')
  18.  
  19. /* for non SAS compilers
  20. void stch_l(char *chr_ptr, ULONG *u_ptr) {
  21.   *u_ptr=0;
  22.   while (isxdigit(*chr_ptr)) {
  23.     *u_ptr=*u_ptr*16+HEX(*chr_ptr);
  24.     chr_ptr++;
  25.   }
  26. }
  27. */
  28.  
  29. BOOL load(char *dest, char *src, ULONG *addr, ULONG *next_addr) {
  30.   UBYTE chksum, temp1, temp2, byte_count, i;
  31.  
  32.   chksum=byte_count=(HEX(src[0]))*16 + HEX(src[1]); src+=2;
  33.   temp1=(HEX(src[0]))*16 + HEX(src[1]);
  34.   temp2=(HEX(src[2]))*16 + HEX(src[3]); src+=4;
  35.   *addr=(long)temp1*256 + (long)temp2;
  36.   *next_addr=*addr+(long)byte_count-3;
  37.   chksum+=temp1+temp2;
  38.   for (i=0;i<byte_count-3;i++) {
  39.     temp1=(HEX(src[0]))*16 + HEX(src[1]); src+=2;
  40.     chksum+=temp1;
  41.     *(dest+(long)*addr+i)=temp1;
  42.   }
  43.   temp1=(HEX(src[0]))*16 + HEX(src[1]); src+=2;
  44.   chksum+=temp1;
  45.   if (chksum == 255) return(TRUE);
  46.   return(FALSE);
  47. }
  48.  
  49. void main(int argc, char **argv) {
  50.   FILE *file_ptr;
  51.   char string[STRING_SIZE];
  52.   ULONG addr,next_addr;
  53.   ULONG min_addr=65535,max_addr=0;
  54.   ULONG line_num=0;
  55.   ULONG i, j;
  56.   int s_addr, e_addr;
  57.   BOOL s_flag = FALSE, e_flag = FALSE;
  58.  
  59.   if (argc<3 || argc==2 && argv[1][0]=='?') {
  60.     printf("USAGE: %s <options> <source> <destination>\n",argv[0]);
  61.     printf("  options:  -s<hex number>  EPROM start address\n");
  62.     printf("            -e<hex number>  EPROM end address\n");
  63.   } else {
  64.     for (j = 1; j < argc; j++) {
  65.       if (argv[j][0] != '-') {
  66.         break;
  67.       } else {
  68.         if (argv[j][1] == 's') {
  69.           strcpy(string,&argv[j][2]);
  70.           stch_i(string,&s_addr);
  71.           s_flag = TRUE;
  72.         }
  73.         else if (argv[j][1] == 'e') {
  74.           strcpy(string,&argv[j][2]);
  75.           stch_i(string,&e_addr);
  76.           e_flag = TRUE;
  77.         } else {
  78.           printf("Unknown option \'%s\'\n",argv[j]);
  79.         }
  80.       }
  81.     }
  82.     if (j+2 != argc) {
  83.       printf("Missing source or destination filename\n");
  84.     } else {
  85.       if (!(file_ptr=fopen(argv[j],"r")))
  86.         printf("Unable to open %s for input\n",argv[1]);
  87.       else {
  88.         for (i=0;i<65536;i++) {
  89.           data_blk[i]=0xff;
  90.         }
  91.         while (fgets(string,STRING_SIZE,file_ptr)) {
  92.           line_num++;
  93.           if (string[0]!='S')
  94.             printf("Not a Motorola Hex format file\n");
  95.           else {
  96.             switch (string[1]) {
  97.               case '0':
  98.                 if (!load(string,&string[2],&addr,&next_addr))
  99.                   printf("format or checksum error in line %ld\n",line_num);
  100.                 else {
  101.                   string[next_addr]='\0';
  102.                   printf("  Loading program %s\n",string);
  103.                 }
  104.                 break;
  105.               case '1':
  106.                 if (!load(data_blk,&string[2],&addr,&next_addr))
  107.                   printf("format or checksum error in line %ld\n",line_num);
  108.                 else {
  109.                   max_addr=max((long)max_addr,next_addr);
  110.                   min_addr=min((long)min_addr,addr);
  111.                 }
  112.                 break;
  113.               case '2':
  114.                 printf("This program does not support 24 bit addresses\n");
  115.                 break;
  116.               case '8':
  117.                 printf("This program does not support 24 bit addresses\n");
  118.                 break;
  119.               case '9':
  120.                 if (!load(data_blk,&string[2],&addr,&next_addr))
  121.                   printf("format or checksum error in line %ld",line_num);
  122.                 else {
  123.                   printf("  Start address = %lX\n",addr);
  124.                 }
  125.                 break;
  126.             }
  127.           }
  128.         }
  129.         fclose(file_ptr);
  130.         printf("\n  Address range = %lX - %lX\n",min_addr,max_addr-1);
  131.         if (!s_flag) {
  132.           while (TRUE) {
  133.             printf("What is the starting address of the EPROM (Hex) ? ");
  134.             gets(string);
  135.             stch_l(string,&addr);
  136.             if (addr>65535 || addr<0)
  137.               printf("Invalid address\n");
  138.             else break;
  139.           }
  140.         } else {
  141.           addr = s_addr;
  142.         }
  143.         if (!e_flag) {
  144.           while (TRUE) {
  145.             printf("What is the ending address of the EPROM (Hex) [%X]? ",max_addr-1);
  146.             gets(string);
  147.             if (string[0] == '\0') break;
  148.             stch_l(string,&max_addr);
  149.             if (max_addr>65535 || max_addr<0)
  150.               printf("Invalid address\n");
  151.             else {
  152.               max_addr++;
  153.               break;
  154.             }
  155.           }
  156.         } else {
  157.           max_addr = e_addr+1;
  158.         }
  159.         if (!(file_ptr=fopen(argv[j+1],"wb")))
  160.           printf("Unable to open %s for output\n",argv[2]);
  161.         else {
  162.           while (max_addr-addr>=16384) {
  163.             fwrite(&data_blk[addr],16384,1,file_ptr);
  164.             addr+=16384;
  165.           }
  166.           fwrite(&data_blk[addr],max_addr-addr,1,file_ptr);
  167.         }
  168.         fclose(file_ptr);
  169.       }
  170.     }
  171.   }
  172. }
  173.