細渕です。
> で、ライターの会社に問い合わせたところ、このコンパイラーはベースが日立純正の
> コンパイラーで、自社(秋月さん)でチェックサムの所だけ変更しているらしい??
> ?(その他も変更しているかもしれない)のでうまく転送できないとのこと。
> 対応策としては、FormatConverterで一度バイナリーに落としてからだと大丈夫と
> 言っていたのですが・・・・・さっぱり分かりません。
> その作業をするのにフリーソフトがあると聞いたのですが・・・。
> ってことです。
> 何か分かりますかね???
バイナリーに落さないでチェックサムだけを計算しなおします。
短いプログラムので添付します。
------8<-------8<-------8<-----ここから-----8<-------8<-------8<------
/* fixsum.c - c38h の S-record のサムエラーを修正する */
/* fixsum <infile> <outfile> */
#include <stdio.h>
#include <stdlib.h>
#define gethex(x) ((x) > '9' ? ((x) & 0x4f) - 'A' + 10 : (x) - '0')
#define gethex2(p) (gethex(p[0]) * 16 + gethex(p[1]))
int main(int argc, char *argv[])
{
FILE *in, *out;
char line[256], *p;
int sum, size, i;
if (argc != 3){
printf("fixsum <infile> <outfile>\n");
exit(1);
}
if ((in = fopen(argv[1], "rt")) == NULL){
printf("infile(%s) open error\n", argv[1]);
exit(1);
}
if ((out = fopen(argv[2], "wt")) == NULL){
printf("outfile(%s) open error\n", argv[2]);
exit(1);
}
while(fgets(line, sizeof(line), in)){
if (line[0] != 'S'){
fputs(line, out);
continue;
}
p = line + 2;
size = gethex2(p); p += 2;
sum = size;
for (i = 0; i < (size - 1); i++){
sum += gethex2(p);
p += 2;
}
*p = '\0';
sum = (~sum ) & 0xff;
fprintf(out, "%s%02X\n", line, sum);
}
fclose(in);
fclose(out);
exit(0);
}
------>8------->8------->8-----ここまで----->8------->8------->8------
---
細渕憲行 (hoso@xxxxxxxxxxxx)
http://www.tt.rim.or.jp/~hoso/