• チェックサムプログラムとは
    「マイコンゲームの本 3」掲載の「チェック・サム プログラム」の項より引用します。

    チェック・サムとは
    ダンプリストを見ながらマシン語を打ち込む場合、打ち込みミスなどから、何度もリストとにらめっこしなくてはなりません。そのたびにリストの最初から最後まで調べるのでは、2回もやれば、よぼど根性のある人でもいやになります。
    そんなとき、プログラム(データ)をいくつかのブロックに分けて、そのブロック無いの数値を全部足した値をリストに付けておけば、そのリストを打ち込んだ人は、ブロックごとの数値を足してリストに付いている数値と比べればどのブロックが違っているか人目でわかります。後はそのブロックについてのみ、調べればよいことになります。

    すなわち、機械語プログラムを手入力する際、入力ミスを見つけやすくするための方法の一つとして、チェックサムという方法が使われていました。

  • 機械語プログラムについて dumplist
    右の写真は、ダンプリスト(機械語プログラムリスト)の例です。
    1970~80年代のマイコン雑誌には、このようなダンプリストが何ページにも渡って掲載され、プログラムによっては、全てを1文字の間違いもなく入力しないと正しく実行されませんでした。
    (実際はデータ部や変数部があるので「1文字も間違いなく」というのは正しい表現ではありませんが)
    まだインターネットはおろかパソコン通信ですら一般的ではなかったため、マイコン雑誌に掲載されたプログラム(主にゲーム)で遊ぶには、プログラムを入力するか、雑誌社の販売するカセットテープを買うしかありませんでした。
    (昨今ではコードの手入力を「写経」と呼ぶそうですが)

    現在はプログラムの投稿雑誌は姿を消し、雑誌のプログラムを手入力することはほとんど無くなりました。

  • BASICマガジンの復活で
    しかし、近年、BASICマガジンが復活したことで、雑誌に機械語リストが載ることが出てきました。
    そこで機械語プログラムの入力補助ツールとして、チェックサムプログラムを作ることにしました。

  • 仕様
    今回作ったチェックサムプログラムはIchigoJam用です。
    現在のIchigoJamの仕様では、機械語プログラムが可能なエリアが、最大で#700~#1001の約2KBになります。
    ですので、横サムのみ表示し、縦サムは省略しました。
    横サムは8バイトのサム(合計値)の下位1バイトを表示します。
    このサム値をソースリストに添付のサム値と照合して入力間違いを探します。

  • プログラムリスト
    プログラムは16進表示とBASE16のキャラクタ表示の2種類です。

    1行プログラムになっていますので、プログラムを入力(環境によっては貼り付け)後にEnterすれば、チェックサムプログラムが実行されます。
    保存しておきたい場合は、行頭に行番号を付けてSAVEしてください。

    チェックサムプログラム(16進表示)
    input"start address ",t:input"end address ",e:fora=ttoestep8:?hex$(a,3);:s=0:forx=0to7:v=peek(a+x):?" ";hex$(v,2);:s=(s+v)&#FF:next:?" :";hex$(s,2):next
    

    チェックサムプログラム(BASE16キャラクタ表示)
    input"start address ",t:input"end address ",e:fora=ttoestep8:?hex$(a,3);:s=0:forx=0to7:v=peek(a+x):?" ";chr$(64+(v>>4)&#F);chr$(64+v&#F);:s=(s+v)&#FF:next:?" :";hex$(s,2):next

  • チェック例
    下記のプログラムをチェックしてみます。
    (以前、BASE16の説明用に作ったプログラムです)

    1. プログラムの公開方法
      プログラムを公開する場合に、下記の様にチェックサムを併記します。

      サンプルプログラム
      10 poke #700,#0b,#22,#12,#02,#df,#32,#50,#18,#20,#30,#03,#78,#f0,#2b,#05,#d0,#20,#38,#03,#78,#f0,#2b,#01,#d0,#20,#30,#03,#70,#01,#3a,#10,#0a
      20 poke #720,#08,#28,#f0,#d1,#52,#18,#01,#20,#00,#23,#13,#54,#01,#30,#21,#28,#fb,#d1,#70,#47
      80 cls:x=15
      90 lc x,15:?chr$(#f0)
      100 k=inkey()
      110 if k!=0 then lcx,15:?" ":x=x+((k-1)%3-1)
      120 lc rnd(33),0:?"*"
      130 a=usr(#700,0)
      140 goto90
      
      チェックサム
      700 : BA
      708 : BB
      710 : BF
      718 : 18
      720 : 7C
      728 : 04
      730 : A1
      (チェックサム作成プログラムは後述します)

    2. プログラムのチェック方法
      プログラムを入力した後、POKE文のみ実行します。
      やり方としては、
      1. POKE文の後ろに"END"を付けて実行する。
        (上記例では「30 END」を追加する)
      2. まず、POKE文のみを入力して実行する。
      などの方法が考えられます。

      次にチェックサムプログラムを実行します。
      (BASE16エンコードされている場合は、BASE16キャラクタ表示版のプログラムを実行します)

      実行結果
      start address #700
      end address #733
      700 0B 22 12 02 DF 32 50 18 :BA
      708 20 30 03 78 F0 2B 05 D0 :BB
      710 20 38 03 78 F0 2B 01 D0 :BF
      718 20 30 03 70 01 3A 10 0A :18
      720 08 28 F0 D1 52 18 01 20 :7C
      728 00 23 13 54 01 30 21 28 :04
      730 FB D1 70 47 D6 10 38 00 :A1
      

      左端の3桁はアドレス、次に8バイトのメモリダンプ、右端がサム値になります。
      右端のサム値と、公開されているサム値を照合します。
      違いがあった場合は、該当する範囲のアドレス内容に違いがありますので、入力したプログラムリストを見直してください。

      ※注意
      最終行のサム値(上記例では#730~#737番地)は正しくない場合があります。
      1行プログラムにした仕様上の問題点ですので御了承ください。

  • 機械語プログラムにチェックサムを付けて公開する方へ
    メモリ内に機械語プログラムがある状態で、下記のプログラムを実行します。

    チェックサム作成プログラム
    input"start address ",t:input"end address ",e:fora=ttoestep8:?hex$
    orx=0to7:v=peek(a+x):s=(s+v)&#FF:next:?" : ";hex$(s,2):next

    実行するとチェックサムが作成されますので、プログラムリストに併記して公開してください。