home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / unix_c / cpm / hexify.c < prev    next >
C/C++ Source or Header  |  1989-03-21  |  2KB  |  148 lines

  1.  
  2. #include <std.h>
  3.  
  4. /* intel conversion program
  5.     converts standard input to intel format onto standard output 
  6.             example   cat bfile | intel > ifile
  7.  */
  8.  
  9. #define CBCONST 1+2+4+2+2+1
  10. #define BYTESPLIN 16
  11. #define CBUFSIZ BYTESPLIN * 2 + CBCONST
  12. #define ENDCODE 1
  13. #define DATASTART 9
  14. #define STARTADDR 0x100
  15.  
  16.  
  17. char cbuf[CBUFSIZ];
  18. int cbufi;
  19. int cnum_dbytes;    /* number of data bytes */
  20. int caddr;            /* starting load address */
  21. int caddrsav;
  22. int cchecksum;        /* checksum for record */
  23. int ctype;            /* type of record 0=data 1=end */
  24. int cbremain;        /* bytes remaining to fill record */
  25.  
  26. main()
  27. {
  28. int i;
  29. char c;
  30.  
  31. init();
  32. while (i = read(STDIN, &c, 1))
  33.         use(c);
  34. flush();
  35. }
  36.  
  37.  
  38. use(byte)
  39.     char byte;
  40. {
  41. cchecksum += byte;
  42. caddr++;
  43. cnum_dbytes++;
  44. chartohex(byte, &cbuf[cbufi]);
  45. cbufi += 2;
  46. if (!--cbremain) dorecord();
  47. }
  48.  
  49. dorecord()
  50. {
  51. int i;
  52.  
  53. docount();
  54. doaddr();
  55. dorecordtype();
  56. dochecksum();
  57. cbuf[cbufi++] = '\n';
  58. if ( ((i = write(STDOUT, cbuf, cbufi)) < 0) || (i != cbufi) )
  59.     printf("Unable to write STDOUT\n");
  60. clear();
  61. }
  62.  
  63.  
  64. init()
  65. {
  66. cbuf[0] = ':';
  67. cbufi = DATASTART;     /* third byte begins data */
  68. cbremain = BYTESPLIN;     /* byte remaining to fill record */
  69. cnum_dbytes = 0;
  70. caddr = STARTADDR;
  71. caddrsav = caddr;
  72. cchecksum = 0;
  73. ctype = 0;
  74. }
  75.  
  76. flush()
  77. {
  78. if (cnum_dbytes != 0)
  79.     dorecord();
  80. caddr = 0;
  81. caddrsav = 0;
  82. ctype = ENDCODE;
  83. dorecord();
  84. }
  85.  
  86. clear()
  87. {
  88. cbufi = DATASTART;    /* third byte begins data */
  89. cbremain = BYTESPLIN;
  90. cnum_dbytes = 0;
  91. cchecksum = 0;
  92. caddrsav = caddr;
  93. }
  94.  
  95. /* ------------------------------------- */
  96.  
  97. chartohex(c)
  98.     char c;
  99. {
  100. puthex(c, &cbuf[cbufi]);
  101. }
  102.  
  103. docount()
  104. {
  105. char c;
  106. c = cnum_dbytes;
  107. puthex(c, &cbuf[1]);
  108. }
  109.  
  110. doaddr()
  111. {
  112. char c;
  113. c = (caddrsav >> 8)  & 0xff;
  114. puthex(c, &cbuf[3]);
  115. c = caddrsav & 0xff;
  116. puthex(c, &cbuf[5]);
  117. }
  118.  
  119. dorecordtype()
  120. {
  121. char c;
  122. c = ctype;
  123. puthex(c, &cbuf[7]);
  124. }
  125.  
  126. dochecksum()
  127. {
  128. char ck;
  129. cchecksum += (cnum_dbytes + (caddrsav & 0xff) + ((caddrsav >> 8) & 0xff) ) ;
  130. ck = -cchecksum;
  131. puthex(ck, &cbuf[cbufi]);
  132. cbufi += 2;
  133. }
  134.  
  135. puthex(c, where)
  136. char c, *where;
  137. {
  138. char d;
  139. char e;
  140. #define HEXCHAR d + ( d > 9 ? 'A'-10 : '0' ) 
  141.  
  142. d = (c >> 4) & 0xf;
  143. *(where++) = HEXCHAR ;
  144. d = c & 0xf;
  145. *where = HEXCHAR ;
  146. }
  147.  
  148.