home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / k65src.zip / makebin.c < prev    next >
C/C++ Source or Header  |  1990-04-11  |  3KB  |  188 lines

  1. /*     
  2.     makebin.c
  3.     Make a .out file into a binary suitable for loading on
  4.     Atari
  5.  
  6.     makebin infile outfile
  7. */
  8.  
  9. #include <stdio.h>
  10.  
  11. FILE * inf, * outf;
  12.  
  13. char segment[16384];        /* current segment buffer */
  14. int seg_idx;            /* next byte pos in seg */
  15. int seg_start_pc;
  16.  
  17. char hexchar[16];        /* = "0123456789ABCDEF"; */
  18.  
  19. int hexac = 0;            /* hex accumulator */
  20. int hexp = 0;            /* if anything in accumulator */
  21.  
  22. int pc, expected_pc;        /* pc we're at, pc we expect */
  23. int in_segment = 0;        /* if currently inside segment */
  24.  
  25. hexdigit(c)
  26. char c;
  27. /*
  28.  *    returns parsed digit
  29.  */
  30. {
  31.   int i;
  32.  
  33.   for(i = 0; i < 16; i++) 
  34.     {
  35.       if (c == hexchar[i]) return(i);
  36.     }
  37.   printf("Bogus hex char %c\n", c);
  38. }
  39.  
  40. outbyte(c)
  41. char c;
  42. {
  43.   fputc(c, outf);    
  44.   /*    printf("%x\n", c);    */
  45. }
  46.  
  47. /*
  48.  * flush segment buf
  49.  */
  50. endsegment()
  51. {
  52.   int i;
  53.   int end_pc;
  54.  
  55.   if (in_segment != 0)
  56.     {
  57.       end_pc = seg_start_pc + seg_idx - 1;
  58.  
  59.       outbyte(255);        /* write atari load header */
  60.       outbyte(255);
  61.       outbyte((seg_start_pc & 255));
  62.       outbyte((seg_start_pc >> 8));
  63.       outbyte((end_pc & 255));
  64.       outbyte((end_pc >> 8));
  65.  
  66.       for(i = 0; i < seg_idx; i++)
  67.     outbyte((segment[i]) & 255);
  68.     };
  69.   in_segment = 0;
  70. }
  71.  
  72. startsegment(new_pc)
  73. int new_pc;
  74. {
  75.   endsegment();
  76.   seg_idx = 0;
  77.   seg_start_pc = new_pc;
  78.   in_segment = 1;
  79. }
  80.  
  81. checkpc(new_pc)
  82. int new_pc;
  83. {
  84.   if ((!in_segment) || (new_pc != seg_start_pc + seg_idx)) 
  85.     startsegment(new_pc);
  86. }
  87.  
  88. storebyte(ch)
  89. char ch;
  90. {
  91.   int new_pc;
  92.  
  93.   if((seg_idx >= 16384)) 
  94.     {
  95.       new_pc = seg_start_pc + 16384;
  96.       endsegment();
  97.       startsegment(new_pc);
  98.     };
  99.   segment[seg_idx] = ch;
  100.   seg_idx += 1;
  101. }
  102.  
  103. FILE * fopen_carefully(char * fn, char * mode)
  104. {
  105.   FILE * f = fopen(fn, mode);
  106.  
  107.   if (!f)
  108.     {
  109.       printf("Can't open '%s'\n", fn);
  110.       exit(1);
  111.     }
  112.   return(f);
  113. }
  114.  
  115. main(int argc, char ** argv)
  116. {
  117.   int ch;
  118.  
  119.   if (argc < 3)
  120.     {
  121.       printf("Try makebin infile outfile ...\n");
  122.       exit(1);
  123.     }
  124.   inf = fopen_carefully(argv[1], "r");
  125.   outf = fopen_carefully(argv[2], "wb");
  126.  
  127.   hexchar[0] = '0';
  128.   hexchar[1] = '1';
  129.   hexchar[2] = '2';
  130.   hexchar[3] = '3';
  131.   hexchar[4] = '4';
  132.   hexchar[5] = '5';
  133.   hexchar[6] = '6';
  134.   hexchar[7] = '7';
  135.   hexchar[8] = '8';
  136.   hexchar[9] = '9';
  137.   hexchar[10] = 'A';
  138.   hexchar[11] = 'B';
  139.   hexchar[12] = 'C';
  140.   hexchar[13] = 'D';
  141.   hexchar[14] = 'E';
  142.   hexchar[15] = 'F';
  143.  
  144.   in_segment = 0;
  145.   while((ch = fgetc(inf)) != EOF)
  146.  
  147.     switch (ch) 
  148.       {
  149.       case '0':
  150.       case '1':
  151.       case '2':
  152.       case '3':
  153.       case '4':
  154.       case '5':
  155.       case '6':
  156.       case '7':
  157.       case '8':
  158.       case '9':
  159.       case 'A':
  160.       case 'B':
  161.       case 'C':
  162.       case 'D':
  163.       case 'E':
  164.       case 'F':
  165.     hexac = (hexac * 16) + hexdigit(ch);
  166.     hexp = 1;
  167.     break;
  168.       case ':':
  169.     checkpc(hexac);
  170.     hexac = 0;
  171.     hexp = 0;
  172.     break;
  173.       case ' ':
  174.       case '\n':
  175.     if(hexp)
  176.       storebyte(hexac);
  177.     hexac = 0;
  178.     hexp = 0;
  179.     break;
  180.       default:
  181.     printf("Bogus char %c\n", ch);
  182.  
  183.       };            /* end of switch */
  184.   endsegment();            /* flush output */
  185.     
  186.   exit(0);
  187. }
  188.