Skip to content
Checksum validator for OCR'ed ancient machine language.
Python
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore
LICENSE
README.adoc
README.html
dummyhex.py
login_checksum.py
ohpc_checksum.py
pcmagazine_checksum.py
pio_checksum.py
pio_checksum16.py
txt2bin.py

README.adoc

checksums マニュアル

1. はじめに

これらは、1980年台のマイコン雑誌に掲載されたダンプリストを入力するための補助ツール群です。
現在、8ビットコンピューターへのプログラムの入力はWindowsなど現代の環境でテキストファイルとして入力されたものをエミュレーター用のイメージファイルに変換する方法で行われるのが一般的です。
近年では拙作の Program List OCRなど、ダンプリストもOCRを使って読み取る環境が整ってきています。OCRを利用するとダンプリストの入力が高速に行える上、通常入力されないチェックサムも含めて読み取ります。
このツールはOCRを使って読み取られたマシン語本体とチェックサムを検証し、誤認識がないか検証するツールです。
これにより、マシン語の入力と訂正がスピーディに行なえます。作者の主観では手入力に比べ10倍以上の生産性を実現しています。
また、ここではその他にダンプリスト打ち込み用の補助ツールをいくつか収録しています。

2. 環境設定

Python3環境で動作します。
Linuxの場合はディストリビューションに含まれるPython3をインストールすればOKです。
Windowsの場合は Anaconda などを使ってインストールすると良いでしょう。(ただし動作未確認)
標準以外のライブラリは使っていないのでpipなども必要ありません。

3. 使い方

このツールはコマンドラインから使用します。

python3 xxx_checksum.py ダンプリストファイル

と入力すると、ダンプリストファイル中のエラーを検出して出力します。
ダンプリストファイルは所定のフォーマットに沿っている必要があります。これについては「対応チェックサム方式」の項で解説します。
Linuxの場合はwatchコマンドと組み合わせて

watch python3 xxx_checksum.py ダンプリストファイル

とすると2秒毎にチェックを繰り返します。ターミナルでwatch結果を表示し続けて、テキストエディタでダンプリストの修正、保存を続けるとほぼリアルタイムでエラー表示が減っていきます。
エラーがなくなるまで修正を続ければOKです。

4. 対応フォーマット、チェックサム方式

マシン語のチェックサムは掲載誌によって計算方法が異なるため、雑誌ごとに異なるチェックプログラムを用意しています。
また、掲載プログラムの作者が独自のアルゴリズムによるチェックサムプログラムを添付している場合もあり、ここですべてを網羅することはできません。
ここで提供されているプログラムでカバーされていないチェックサムのアルゴリズムについては、 ユーザー自身の手でプログラムを修正して対応することを前提としており 、そのために修正しやすいPython言語を採用しています。

ここでは4種類のチェックサム方式をサポートしており、最も汎用性の高いPiO方式で大半のケースは対応可能と思われますが、必要に応じてプログラムを修正して運用してください。
書式例を見ていただけると分かりますが、チェックサムの計算方法以外にアドレス、チェックサム前後のデリミタ(スペースや:など)の入り方が掲載誌によって微妙に違います。

Warning

ここで「xx方式」と言っているのは作者の使用機種であったPC-6000シリーズ向けプログラムにおける各誌のチェックサム方式を基準にしているので、他機種だとアルゴリズムが異なる可能性があります。

4.1. PiO方式

pio_checksum.py(または pio_checksum16.py)

  • PiOモニタ(I/Oモニタ)形式のダンプ、チェックサム出力

  • 8バイトx16行で1ブロック(pio_checksum16.py では16バイトx16行で1ブロック)

  • 1行毎に単純サム、1ブロックごとに単純縦サムが付加される。

  • 縦サム行手前の ------ やブロック先頭の ADDR +0 +1…​ などの行は事前に除去しておくこと。

PiO方式の書式例
B800:DD 22 91 C3 AF 32 1D ED:3E
B808:06 24 21 58 C3 77 23 10:10
B810:FC 21 00 C4 22 83 C3 21:6A
B818:00 00 22 00 ED 18 04 00:2B
B820:C3 E1 B8 31 00 F0 3E 06:C1
B828:D3 F6 3E 11 CD 98 26 21:C4
B830:29 C1 D7 CD 9B 6B 23 D7:8E
B838:CD 4A 6B 21 42 C1 D7 CD:4A
B840:F6 1C CD FB 1D 21 14 1B:47
B848:CD 6D 11 3E 0A 32 93 FD:55
B850:3E 08 32 94 FD CD B9 42:D1
B858:28 17 21 E2 BF 22 8F C2:74
B860:21 02 C0 22 92 C2 21 D4:4E
B868:BF 22 98 C2 21 6A C1 18:9F
B870:15 21 47 C0 22 8F C2 21:D1
B878:84 C0 22 92 C2 21 89 BC:20
Sum :0D F6 FE F4 A5 16 81 CE:FF
B880:22 98 C2 21 76 C1 AF 32:B5
B888:58 FA 32 8B C3 CD CF 30:9E
    :
    :

4.2. LOGiN方式

login_checksum.py

  • LOGiN関連のダンプリスト用チェックサム

  • 8バイトごとにチェックサム、32行ごとにブロックチェックサム(縦サムはなし)

  • チェックサムは単純サムに加え、アドレスの上位バイトと下位バイトを加算する

LOGiN方式の書式例
B1A0 31 FF AF 3E 01 CD 0C 14:5C
B1A8 3E 02 CD 90 13 3E 01 CD:15
B1B0 ED 13 3E 01 32 93 FD 32:94
B1B8 94 FD CD FB 1D AF 32 2D:ED
B1C0 FA CD C0 B4 CD D1 BE CD:D5
B1C8 58 10 C3 D0 B6 00 00 00:2A
B1D0 3A FF B1 3C FE 20 20 02:E7
B1D8 3E 01 32 FF B1 FE 0F 30:E7
B1E0 3A FF B1 3C FE 30 20 01:06
B1E8 AF 32 FF B1 FE 20 D2 9F:B9
B1F0 B7 FE 01 CA B2 B3 FE 1E:A2
B1F8 CA B2 B3 C9 00 00 00 00:A1 E5
B200 27 5D 55 7F 5D 5D 77 77:B2
    :
    :

4.3. Oh!PC方式

ohpc_checksum.py

  • Oh!PC関連のダンプリスト用チェックサム

  • 8バイトごとにチェックサム

  • チェックサムは単純サムに加え、アドレスの上位バイトと下位バイトを加算する

Oh!PC方式の書式例
C500 AF 32 2D FA 3E 02 32 8C:CB
C508 FD 3E 01 CD ED 13 3E 01:15
C510 CD 0C 14 3E 02 CD 90 13:72
C518 31 FF DF 3E 03 32 93 FD:EF
C520 21 01 01 CD 6D 11 3E 53:E4
C528 CD 75 10 3E 43 CD 75 10:12
C530 3E 4F CD 75 10 3E 52 CD:31
C538 75 10 3E 45 CD 75 10 21:78
C540 01 0E CD 6D 11 3E 52 CD:BC
C548 75 10 21 02 01 CD 6D 11:01
    :
    :

4.4. PCマガジン方式

pcmagazine_checksum.py

  • PCマガジン掲載のダンプリスト用チェックサム

  • 8バイトごとにチェックサム3桁

  • チェックサムは行頭のアドレスの下3桁+各バイトの値×列インデックス(1オリジン)の下3桁

Oh!PC方式の書式例
8000 00 00 00 01 04 FF FF FF :503
8008 FF FF FF FF FF BB E9 2C :B1A
8010 E9 78 EA 54 EB DB EB 07 :655
8018 0A 06 05 04 01 01 00 00 :058
8020 0A 00 0A 00 00 00 0A 00 :08E
8028 0A 00 69 80 00 00 00 00 :36D
8030 00 00 00 07 07 00 00 00 :06F
8038 00 00 00 00 00 22 53 31 :4D1
8040 32 4D 31 39 4C 33 32 4F :907
8048 31 47 52 33 32 4F 37 46 :94E
8050 22 00 22 22 2C 22 53 31 :6D5
8058 35 4D 32 35 30 4C 36 34 :863
    :
    :

5. エラーメッセージ

Address parse error in line xxx

アドレスを16進数としてパースできなかった

Address not in order in line xxx

アドレスが前の行+8(16)バイトになっていない→アドレス誤認識または行ごと抜けている可能性がある

Value parse error in line xxx

データを16進数としてパースできなかった

Sum parse error in line xxx

チェックサムを16進数としてパースできなかった

Checksum error in line xxx

チェックサムが不一致

Vertical checksum error in line xxx

縦チェックサムが不一致

Block checksum error in line xxx

ブロックチェックサムが不一致

Parse error in line xxx

通常のデータ行、チェックサム行どちらとしても認識できなかった

6. その他のツール

6.1. txt2bin.py

16進数の羅列が記述されたテキストファイルからベタのバイナリファイルに変換するツールです。
テキストファイル中のアドレス、チェックサムは事前に除去してから使用してください。

入力書式例
31 FF AF 3E 01 CD 0C 14
3E 02 CD 90 13 3E 01 CD
ED 13 3E 01 32 93 FD 32
94 FD CD FB 1D AF 32 2D
FA CD C0 B4 CD D1 BE CD
58 10 C3 D0 B6 00 00 00
3A FF B1 3C FE 20 20 02
3E 01 32 FF B1 FE 0F 30
3A FF B1 3C FE 30 20 01
AF 32 FF B1 FE 20 D2 9F
    :
    :

6.2. dummyhex.py

雑誌掲載のダンプリストには、データがない箇所に対してしばしば「CE00からCFFFまでは00Hです」などと言った省略のされ方をしますが、こういった箇所に対応するダミーのダンプリストを生成するツールです。
実装の手抜きのため開始アドレス(start_addr)、終了アドレス(end_addr)がハードコードされているのでその部分を書き換えて使用してください。
また、ダンプリストのフォーマットや縦サムの出力なども打ち込むプログラムに合わせて修正してください。

You can’t perform that action at this time.