1 /* makebin--convert .s19 file to Color Computer binary format */
2 /* 1997 Bryan Clingman */
3 /* bac@realtimeweb.com */
4 /* This code is in the public domain. */
9 unsigned char dehex(char *p)
12 a = (*p < 'A' ? *p - '0' : *p - 'A' + 10) << 4;
13 a |= *(p+1) < 'A' ? *(p+1) - '0' : *(p+1) - 'A' + 10;
21 unsigned short sOffset;
22 struct stChunk *pNext;
25 void insert(struct stChunk *pNew, struct stChunk **pList)
28 struct stChunk *pLast = 0;
33 if (pCur->sOffset > pNew->sOffset)
58 int main(int argc, char **argv)
61 unsigned char caLine[100];
65 struct stChunk *pList = 0;
70 fprintf (stderr, "No input file\n");
74 fpi = fopen(argv[1], "r");
77 fprintf (stderr, "No input file %s\n", argv[1]);
83 fpo = fopen(argv[2], "w");
86 fprintf (stderr, "No unable to create output file %s\n", argv[2]);
93 while(fgets(caLine, 100, fpi))
101 pCur = (struct stChunk *)malloc(sizeof (struct stChunk));
102 pCur->sLen = dehex(&caLine[2]) - 3;
103 pCur->sOffset = dehex(&caLine[4]) << 8 | dehex(&caLine[6]);
104 pCur->pData = (unsigned char *)malloc(pCur->sLen);
105 for (sII = 0; sII < pCur->sLen; sII++)
106 pCur->pData[sII] = dehex(&caLine[(sII << 1) + 8]);
108 insert(pCur, &pList);
119 if (pCur->sOffset + pCur->sLen != pCur->pNext->sOffset)
120 fprintf(stderr, "discontinuous at %x\n", pCur->sOffset);
124 iLen = pCur->sOffset + pCur->sLen - pList->sOffset;
125 fprintf(stderr, "Total Length: %d\n", iLen);
128 caLine[1] = (unsigned char)((iLen & 0xff00) >> 8);
129 caLine[2] = (unsigned char)(iLen & 0xff);
130 caLine[3] = (unsigned char)((pList->sOffset & 0xff00) >> 8);
131 caLine[4] = (unsigned char)(pList->sOffset & 0xff);
132 fwrite(caLine , 1, 5, fpo);
136 fwrite(pCur->pData, 1, pCur->sLen, fpo);
137 for (sII = pCur->sOffset + pCur->sLen; sII < pCur->pNext->sOffset; sII++)
138 fwrite(caLine, 1, 1, fpo);
141 fwrite(pCur->pData, 1, pCur->sLen, fpo);
146 caLine[3] = (unsigned char)((pList->sOffset & 0xff00) >> 8);
147 caLine[4] = (unsigned char)(pList->sOffset & 0xff);
148 fwrite(caLine , 1, 5, fpo);
153 printf("Error in line %d\n", sLineCount);