Category : Utilities for DOS and Windows Machines
Archive   : VAMPIRE2.ZIP
Filename : BIN2HEX.C
Output of file : BIN2HEX.C contained in archive : VAMPIRE2.ZIP
Binary to HEX-ASCII utility
Makes a binary file into a HEX file, 32 bytes/block with
proper sumcheck byte at the end. The starting address for the
HEX file is settable; the input is assumed to be contiguous
locations. Some garbage may be included at the end of the
HEX file since the program does not recognize 0x1A as an
end-of-file code in the binary input.
Called with:
bin2hex [
Original version written by:
Robert Pasky
36 Wiswall Rd
Newton Centre, MA 01259
Modified by Edward I. Comer
NOTE: The file opens are modified for C86
*/
#include "stdio.h"
#define DONE 0
#define MORE 1
int i, j, fd;
char doswath = 0;
unsigned int addr,sad,offset,swath;
char fnbuf[30], *fname; /* filename buffer & ptr */
char onbuf[30], *oname; /* output filename buf & ptr */
FILE *ifp, *ofp; /* file pointers */
char hextab[16];
char kybdbuf[20];
char sumcheck;
main(argc,argv)
char **argv;
{
strcpy(hextab,"0123456789ABCDEF");
while (1)
{
doswath = 0;
oname = onbuf;
if (argc-1)
{
fname = *++argv;
argc--;
}
else
{
printf ("\nEnter binary file name: ");
if (!*(fname = gets(fnbuf))) break;
}
strcpy (oname,fname);
striptype(oname);
strcat (oname,".HEX");
if((ifp=fopen(fname,"rb")) == NULL)
{
printf("Can't open %s\n",fname);
continue;
}
else printf("\nReading %-13s",fname);
if((ofp=fopen(oname,"wb")) == NULL)
{
printf("Can't create %s\n",fname);
continue;
}
else printf ("\nWriting %-13s",oname);
printf ("\nStarting address? ");
sscanf (gets(kybdbuf),"%x",&addr);
sad = addr; /* save start address */
printf("\nOffset into %s (in hex bytes) ?",fname);
sscanf(gets(kybdbuf),"%x",&offset);
printf("\nSwath size OR 0 (in hex bytes) ?");
sscanf(gets(kybdbuf),"%x",&swath);
if(swath != 0)
doswath = 1;
/*
** offset into file by desired amount
*/
while(offset)
{
getc(ifp); /* discard byte */
offset--;
}
while(doblock())
;
putc(0xD,ofp);
putc(0xA,ofp);
fclose(ifp);
fclose(ofp);
printf ("\nConversion complete\n");
printf ("\nStart address: %4x",sad);
printf ("\nEnd address: %4x",addr);
}
}
striptype(s)
char *s;
{
while (*s) {
if (*s == '.') *s = '\0';
else s++;
}
}
/* Send a HEX block --
cr,lf,':',count,address,filler,32 bytes of code,sumcheck
return eofflag -- DONE if end of file reached
*/
doblock()
{
int eofflag,c;
putc(0xD,ofp);
putc(0xA,ofp);
putc(':',ofp);
sumcheck = 0;
putbyte(0x20,ofp);
putaddr(addr,ofp);
putbyte(0,ofp);
eofflag = MORE;
for (i=0; i<0x20; i++)
{
if ((c = getc(ifp)) == EOF || (doswath && swath == 0))
{
eofflag = DONE;
c = 0;
}
putbyte(c,ofp);
if(doswath)
swath--;
}
putbyte(-sumcheck,ofp);
addr += 0x20;
if (eofflag == DONE)
{
putc(0xD,ofp);
putc(0xA,ofp);
putc(':',ofp);
putbyte(0,ofp); /* count of 0 is eof signal */
putaddr(0,ofp);
putbyte(0,ofp);
}
return (eofflag);
}
/* Send 1 byte (2 characters);
value of h to file iofp
*/
putbyte(h,iofp)
int h;
FILE *iofp;
{
sumcheck += h;
putc( hextab[(h>>4)&0xF], iofp);
putc( hextab[h&0xF], iofp);
}
/* Send 2 bytes (4 characters)
address value of h to file iofp
*/
putaddr(h,iofp)
int h;
FILE *iofp;
{
putbyte(((h>>8) & 0xFF), iofp);
putbyte(h & 0xFF, iofp);
}
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/