2023-02-20 21:54 — asano
H8/500にUniversal Monitorの移植をしていてIntel HEXやMotorola S-recordのコードを書いていたら、そういえば大昔のチェックサムの話を書いていないなぁと思い出しましたので今回はその辺を書きたいと思います。
チェックサムと言えばもっとも簡単な誤り検出符号の一つで実装が簡単なので昔から使われてきました。
ですが今回書こうと思うのは主に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バイト分のデータを加算します。
コメントを追加