[H8-ML(622)] Re: .Sへの変換
From: Hosobuchi Noriyuki <hoso@xxxxxxxxxxxx>
Date: 2000年05月19日(金)00時16分41秒
細渕です。

> で、ライターの会社に問い合わせたところ、このコンパイラーはベースが日立純正の
> コンパイラーで、自社(秋月さん)でチェックサムの所だけ変更しているらしい??
> ?(その他も変更しているかもしれない)のでうまく転送できないとのこと。
> 対応策としては、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/
スレッド概略
[611(R)](起点)
 └[614(U)]
   └[表示中]
     └[625(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]