現在地

ダンプ入力とチェックサム


H8/500にUniversal Monitorの移植をしていてIntel HEXやMotorola S-recordのコードを書いていたら、そういえば大昔のチェックサムの話を書いていないなぁと思い出しましたので今回はその辺を書きたいと思います。

チェックサムと言えばもっとも簡単な誤り検出符号の一つで実装が簡単なので昔から使われてきました。

最近はCRCとかが用いられることが多くなりましたが......

ですが今回書こうと思うのは主に1980年代頃のパソコン文化としてのチェックサムのお話です。

今パソコン用のソフトウェアを配布するとしたらオンライン配布が当たり前、少し前ならフロッピーディスクやCD-ROMといった物理媒体も多かったですが、パソコンの黎明期から1980年代末くらいにかけては紙に印刷したものを書籍や雑誌の形で流通させユーザが手入力するという形態も広く用いられていました。

そんな面倒なことはやってられないという人のためにカセットテープやフロッピーディスクの販売も行われていましたが、暇はあっても金は無い学生は雑誌を買って打ち込むというのはよくあるソフトウェアの入手手段でした。

当時主流だったBASIC言語などのインタプリタ言語はソースリストがそのまま掲載されましたが、それ以外の場合は実行バイナリのダンプリスト掲載が一般的でした。

勉強したり改良したりのためにはソースコードの方がありがたいのですが......
読者がアセンブラ・コンパイラを持っていることは期待できないし、誌面の都合もあったと思います。場合によってはそもそもソースが存在しないこともあります。

それを目で見ながら手入力するわけですが、当然ながら入力間違いは避けられません。ソースならまだ一般的なデバッグ手法が使えますが、ダンプリストの間違い探しは地獄です。そこで一定のブロックごとにチェックサムを計算して一緒に掲載されています。

入力が終わったらチェックサムの計算プログラム(BASICで書かれていることが多い)を実行します。これを掲載された値と比較すればどのブロックに誤りがあるかわかるので、そこを確認するというわけです。

この計算方法は出版社などによっていくつかの種類に分けられます。代表的なものを2種類ほど紹介しておきましょう。

I/O形式

Add  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F :Sum
0800 CC 06 00 00 4C 8B 23 FF 53 10 49 89 04 24 48 83 :F3
0810 C3 18 4C 39 EB 72 E3 48 83 C4 08 5B 41 5C 41 5D :CD
0820 5D C3 48 63 D2 48 63 F6 48 8D 44 32 02 48 8D 14 :74
0830 C7 8B 02 85 C0 0F 84 32 01 00 00 BE FF FF FF FF :19
0840 31 C9 EB 13 83 F8 03 0F 84 17 01 00 00 48 83 C2 :AE
0850 10 8B 02 85 C0 74 20 83 F8 05 74 0D 83 F8 07 75 :6E
0860 E3 48 83 7A 08 00 74 E5 C3 0F B7 72 08 48 83 C2 :19
0870 10 8B 02 85 C0 75 E0 48 85 C9 0F 84 ED 00 00 00 :4D
0880 66 83 FE FF 0F 84 E3 00 00 00 0F B7 C6 48 6B C0 :5B
0890 38 48 01 C8 48 39 C8 0F 86 D0 00 00 00 BE FF FF :B3
08A0 FF FF 31 FF EB 15 83 FA 06 75 07 48 89 CE 48 2B :3F
08B0 71 10 48 83 C1 38 48 39 C8 76 13 8B 11 83 FA 02 :32
08C0 75 E4 48 89 CF 48 83 C1 38 48 39 C8 77 ED 48 85 :37
08D0 FF 0F 84 96 00 00 00 B8 FF FF FF FF 48 39 C6 0F :32
08E0 84 88 00 00 00 48 8B 4F 10 48 01 F1 48 8B 11 48 :A4
08F0 85 D2 74 79 31 FF 31 C0 EB 16 48 83 FA 08 75 04 :AC
--------------------------------------------------------
Sum  72 BA C0 99 D7 CE 19 F8 69 B5 7A 9C 1F 5F 62 B8 :01

『I/O』や『Oh!PC』などで使われた形式です。

256バイト単位で16×16に並べ、縦横16バイト分を加算します。

アスキー形式

0800  CC 06 00 00 4C 8B 23 FF  D3
0808  53 10 49 89 04 24 48 83  38
0810  C3 18 4C 39 EB 72 E3 48  00
0818  83 C4 08 5B 41 5C 41 5D  05
0820  5D C3 48 63 D2 48 63 F6  66
0828  48 8D 44 32 02 48 8D 14  66
0830  C7 8B 02 85 C0 0F 84 32  96
0838  01 00 00 BE FF FF FF FF  FB
0840  31 C9 EB 13 83 F8 03 0F  CD
0848  84 17 01 00 00 48 83 C2  79
0850  10 8B 02 85 C0 74 20 83  51
0858  F8 05 74 0D 83 F8 07 75  D5
0860  E3 48 83 7A 08 00 74 E5  F1
0868  C3 0F B7 72 08 48 83 C2  00
0870  10 8B 02 85 C0 75 E0 48  F7
0878  85 C9 0F 84 ED 00 00 00  4E

『月刊アスキー』で使われた形式です。

1行が8バイトで、アドレスの上位バイトと下位バイトと8バイト分のデータを加算します。


コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。