にがMSX

〜OCRとMSXを利用してオールドPCのダンプリストを入力する〜


National Personal Computer

JR-100

 自分が初めて小遣いを貯めて買ったパソコンJR-100。昔話は2010年7月 8日のblogを、ベーマガ掲載のゲームについては同年7月28日のblogを参照していただくとして、唯一の心残りが「STAR FIRE」で遊べなかったこと。

STAR FIREJR-100の時代も既に終わりを迎えていた1985年、中学のクラブ活動で知らない先輩が動作させているのを見て、衝撃を受けたゲームだ。

JR-100 基本仕様
CPU MB8861(6802相当)
クロック周波数 894.88625kHz
RAM 16kB
VRAM 1kB
ROM 16kB

JR-100は当時の入門機としては比較的多くのRAMを搭載していたが、クロックはなんと895キロヘルツ2016年現在の標準的なPCの1/2000程度しかない。BASICプログラムの動作速度は遅く、ゲームバランスに難がある作品も多かった中、STAR FIREのグラフィック、スピード感は群を抜いていた。


STAR FIRE

 クラブ活動中に見たSTAF FIREであったが、相手はPC班の知らない先輩。自分は電子工作メインの製作班。中学校は先輩後輩の上下関係が厳しかったこともあり、触らせて欲しいとお願いすることができず、そのまま30年の歳月を重ねてしまった。

2015年にメールでMikasenさんにこの話をしたところ気にかけてくれて、ヤフオクで掲載誌(月刊マイコン1983年月9月号)が出品されていると連絡があり、すかさずゲット。

この時代のPC雑誌の広告ページは実に賑やかで、SHARPのMZシリーズX1、NECのハンドヘルドコンピュータPC8201PC6001mk2、バンダイRX-78、SEGA SC-3000等々独自路線の国産機種が盛りだくさん。MSXはまだ発売直前だったらしく、参加企業の松下はJR-200、SONYはSMC-70、東芝はPASOPIA7、富士通はFM-7、日立はMB-6892 レベル3 Mark5、CASIOはFP-1100といった主力機種で広告ページを飾っている。

スペース・ウォーズの古典!

 これが目的のSTAR FIREの掲載ページ。作者はどのようなお方なのかと、名前で検索してみたが、それらしいサイトにはヒットせず…。一応問題があるかも知れないので名前にはボカシをいれてある。

「スペース・ウォーズの古典 ここによみがえる!!」との文言があるが、「STAR FIRE」と「スペース・ウォーズ」を足したらあの映画のタイトルになってしまうじゃないか。

実際ゲーム内容はまさにあの映画の一場面を再現したものだったりする。映画の公開が1977年、ゲームの掲載が1983年。6年で古典と言ってしまうのも凄いけど、それだけ流れの速い時代だったとも言えるのかも知れない。

しかし、「スペース・ウォーズの古典」の本当の意味は後に判明することとなる。

ダンプリスト

 プログラムリストはチェックサム付きの16進数ダンプリストで、アドレス$0600から$3BBFまでの13760バイト。画像右ページのような16進数ギッシリのダンプリストが合計7ページ。これをBASICプログラムで書かれたマシン語モニタ「KXMONITOR」で入力するよう指示されている。

JR-100のフリーエリアが15800バイトなので、KXMONITORを入力したらほとんどフリーエリアは残らない。作者の方は相当苦労してメモリに詰め込んだのではなかろうか。これだけのプログラムをどうやって開発したのかも気になるところ。ハンドアセンブルして実機でデバッグとか考えたら気が遠くなりそう…。


JR-100エミュレータ

 さて、7ページにわたる16進数ダンプリストであるが、写経じゃあるまいし、こんなものを実機で打ち込んでいたら精神修行にはなるかも知れないが、苦痛も大きそうである(昔の人は偉かった)JR-100のキーボードは「消しゴムキーボード」と揶揄されるように、打ち込み用途にはまったく向いてないし、実機は経年劣化でキーの接触も悪くなっている。しかも打ち込んだ後に音声信号でセーブだのロードだの考えただけで萎えてしまう(根性無し)

そこで、打ち込みはPCで行い、エミュレータでプレイすることをとりあえずの目標とした。本音は実機でプレイしたいがそれはまた後の課題とする。けむしろう氏JR-100エミュレータver2は、実機のROMデータが必要だが大変再現性がよく、ほとんどの手持ちのベーマガ掲載ゲームを当時の感触のまま再現してくれた。今回もこのエミュレータで30年前の衝撃を再現してみたい。

エミュレータの仕様では、アドレスとデータ、チェックサムを並べたテキストファイルを用意すればそれをバイナリデータとして読み込むことができるらしい。これならなんとかなりそうだ。

読取革命 Lite

 いくら良質なキーボードを使ったとしても、これだけのリストを馬鹿正直にテキストエディタで打ち込んでいたら大変な労力を要する。漠然とOCRでラクできないかなと考えてネットを探してみたが、これといった決定的な方法を記したサイトは見つからなかった。そこでMikasenさんの協力を得て、効率的なOCRでの読み取り方法を模索することとなった。

OCRソフトは「読取革命Lite」。キヤノンの複合機にオマケで付属していたソフトだが、設定を煮詰めるとなかなか使えることが分かった。

OCRを16進数に最適化する

 具体的なOCRの設定だが、まず属性変更で対象の文字をABCDEF0123456789に限定する。

半角文字に限定

 さらにすべて半角文字として判読するように設定しておく。

パターン辞書登録

 雑誌掲載のリストは当時のプリンタ品質での印字なので、0は斜線のあるフォントになっているし、カスレや滲みもある。読取革命Liteでは「このパターンならこの文字」といった具合にパターン辞書への登録が可能。肉眼でも0と8とBの区別は難しく、このあたりは特に念入り登録しておくべき。実際にプログラムリストをスキャニングした画像を使ってパターン登録を気が済むまでやっておく。

取り込み

 設定を煮詰めたら実際の取り込み作業となる。アドレスとチェックサムは規則性、法則性のあるデータなので後で生成するとして、OCRではデータ部分のみの取り込みを行った。スキャニング画像は600dpiフルカラーで取り込んだものを適当なCGエディタでモノクロ化したものを用いた。ノイズがあるとそれを文字として誤認してしまうことが多いのでなるべく綺麗に、原稿が斜めにならないように気をつけるべし。

原稿を枠で囲って認識ボタンを押下すると1ページあたり1〜2秒程度でテキスト化される。これがそのまま使えるのなら、こんなにラクなことはないが、現実は甘くない

修正作業

 実際は1バイトずつ目視確認での修正作業が必要となる。正認識率は9割程度でそれほど悪くはないが、やはり0,8,Bの誤認は多い。人間の目でも判読困難なものも多いので致し方ないとは思う。時々A→F1とか妙な誤認もする。

チェックサムは後で計算するが、誤りを完全に検出できるものではない。例えば同じ行、同じ桁で8→Bの間違いとB→8の間違いが同時に発生するとチェックサムは正しい値になってしまう。そういうミスがあると、後々非常に困難な確認作業を強いられることになる。紛らわしいと感じたら、元の高解像度リストを見直すことも必要。自分はサブモニタにフルカラー画像を表示しながら確認作業を行った。

確認・修正はそれなりに面倒な作業ではあるが、右側テキスト画面の方でカーソルを動かしながら確認すると、左の取り込み画像で該当する文字が反転して表示されるので、目で追いかけるのは思ったより苦痛ではなかった。作業は右手で右カーソルキーを叩きながら目視確認し、間違ったデータがあれば両手で修正するといった具合。集中力は要するが、1ページあたり30分程度で確認作業は可能で、単純打ち込みと比べたら大幅に省力化されていると思う。ノウハウを教えてくださったMikasenさんに感謝!

MSX BASICの活用

HENKAN.BAS

10 MAXFILES=2
20 OPEN"06000687.TXT" FOR INPUT AS #1
30 OPEN"06000687.HEX" FOR OUTPUT AS #2
40 FOR I=&H600 TO &H680 STEP 8:C=0
50 PRINT #2,RIGHT$("0"+HEX$(I),4);" ";
60 FOR J=0 TO 7
70 A$=INPUT$(1,#1):IF A$=" "THEN 70
80 B$=INPUT$(1,#1):IF B$=" "THEN 80
90 D=VAL("&H"+A$+B$):C=C+D
100 PRINT #2,RIGHT$("0"+HEX$(D),2);" ";
110 NEXT J
120 PRINT #2,": ";RIGHT$("0"+HEX$(C),2);CHR$(13);CHR$(10);
130 A$=INPUT$(1,#1):IF A$<>CHR$(10) THEN 130
140 NEXT I
150 CLOSE #1:CLOSE #2
160 PRINT "Last address : ";HEX$(I-1)
170 PRINT "Complete!"

 データ部分を打ち込んだらアドレスとチェックサムを追加しなければならない。ここでようやくMSXが登場。テキストファイルを読み取り、アドレス自動生成、16進数でチェックサムを計算して、エミュレータが要求するフォーマットに整形して別ファイルにセーブするBASICプログラムを書いてみた。

変換前のテキストはスペースの数は適当でもよいが、余分な改行が入らないように注意。また、最後の行も改行されている必要あり。ここに掲載しているリストは$0600〜$0687までの変換用に書かれているが、実際の作業では1ページ入力の度にプログラム内容を書き換えて変換した。

blueMSXで処理

 変換プログラムはMSX実機で実行しても良いが、同じPC上のエミュレータで作業したほうが効率的。2DDディスクイメージをDiskExplorerで編集してblueMSXにプログラムとテキストファイルを流し込み、アドレスとチェックサム付きのファイルを生成した。

BASICプログラムなのでそれなりに重い処理だが、blueMSXの加速装置(10倍速)で処理するとあっという間に終わる。

チェックサム照合

 OCRソフトで1バイトずつ目視確認したとはいえ、それでも間違うのが人間。元のフルカラーリストの画像と、MSXで計算したチェックサムを並べて目視確認で照合する。上画像では8とBの誤認発見。気をつけながら修正作業をしていたが、実際の作業では1ページあたり平均3箇所の誤りがあった。

ここでデータとチェックサムを修正したらファイルを上書き更新しておく。

念のため再計算

SUMCHK.BAS

10 MAXFILES=2
20 OPEN"06000687.HEX" FOR INPUT AS #1
30 OPEN"06000687.DMP" FOR OUTPUT AS #2
40 FOR I=&H600 TO &H680 STEP 8:C=0
45 A$=INPUT$(4,#1):IF A$<>RIGHT$("0"+HEX$(I),4) THEN 170
50 PRINT #2,A$;" ";
60 FOR J=0 TO 7
70 A$=INPUT$(1,#1):IF A$=" "THEN 70
80 B$=INPUT$(1,#1):IF B$=" "THEN 80
90 D=VAL("&H"+A$+B$):C=C+D
100 PRINT #2,RIGHT$("0"+HEX$(D),2);" ";
110 NEXT J
120 PRINT #2,": ";RIGHT$("0"+HEX$(C),2);CHR$(13);CHR$(10);
130 A$=INPUT$(1,#1):IF A$<>CHR$(10) THEN 130
140 NEXT I
150 CLOSE #1:PRINT"Last address : ";HEX$(I-1)
160 CLOSE #2:PRINT"Complete!":END
170 PRINT "Adress mismatch!":CLOSE #1:CLOSE #2

 修正したファイルをもう一度MSXを通してチェックサム計算させた。前後のファイルで内容に相違がなければデータは適切に修正されたと判断できる。

ダンプリスト完成

 再びチェックサムを元のフルカラーリストと照合し、誤りが無いことを確認。実際の作業ではこの段階で1箇所のミスを発見。これでダブルチェックされたことになり、正しいリストになっているはず。

この作業を7ページ分のリストに対して行い、テキストを結合してダンプリストの入力作業は完了した。


起動!

 リスト入力には1週間を要したが、エミュレータでテキストファイルを読み込ませるのは一瞬で終わり、そのギャップが凄い。本当に読み込んだか心配になるが、本誌の説明どおりA=USR($D00)でゲームは起動。30年振りにあの画面が目の前に!まさに、スペース・ウォーズの古典 ここによみがえる!!

プレイ画面

 ゲームを起動すると、最初のタイトルと、高速でHファイターが飛び交うデモと、この画面の繰り返しになる。スタートのZキー入力はこの画面でしか認識しない。

縦横斜めにキーがアサインされているが、JR-100消しゴムキーボードでなおかつ配列が斜めっているので、相当な慣れが必要になりそう。エミュレータだと実機とキー配列が異なるので更に辛い。

エミュレータにキーアサインの変更機能があると助かるのだが…。

 ゲーム画面

 遠くから「Hファイタ」ーが近づいてくるので、ハン・ソ○になった気分で巧みにキーを操作し、照準の中央に敵を誘導する。丸い敵弾も飛んでくるので避ける必要あり。

 敵が近づくにつれグラフィックも大きくなるが、この切り替えがJR-100とは思えないほど高速。
 荒さは目立つものの、ここまでグラフィックが書き込まれていることに驚き。しかも複数の敵が重なっても絵が破綻しない。独自にスプライトルーチンを開発したそうだが、JR-100でここまでやるなんて凄すぎる。

 黙っていると、敵弾にやられてダメージ(FUEL減)を食らう。

敵の動きを読み、狙いを定めてレーザー発射!

 撃破!


つづく

 とりあえずエミュレータでの動作は成功し、第一段階クリアといったところ。エミュレータではサウンドが正しく発音されず、音が鳴りっぱなしになるがこれはエミュレータ側の不具合と思われる(実機プレイで実証済み)。

 肝心のゲームのプレイであるが、正直キーボードでの操作はかなり辛い。すばらしいポテンシャルを持っているゲームなだけに操作性に難があるのが非常に残念に思ったが、Mikasenさんが教えてくださった、JoyAdptrというソフトを使うと、PCのゲームデバイス入力をキー入力に振り替え可能となるのでそれなりにプレイすることができた。JoyAdptrの動作OSはWinXPまでということになっているが、少なくとも32bit版のWn7では動作した。ただ、このゲームは斜め入力に対して独立したキーがアサインされているので、PCジョイスティックでは上下左右4方向移動での戦いを強いられる。

 なお、STAR FIREJR-100仕様のジョイスティック入力にも対応しているらしい。JR-100は標準でジョイスティックポートを持たず、資料もないので実態が分からないが、背面の「外部バス」を経由して使えるジョイスティックが存在していたらしい。エミュレータでジョイスティックに対応して頂けると有り難いのだが…。

 次回はSTAR FIREのプログラムデータをJR-100実機へ流し込む手段について模索する。

この記事の内容につきまして全面的に協力をしてくださったMikasenさんに感謝いたします。

JR-100エミュレータの作者、けむしろうさんにも感謝いたします。密かにバージョンアップに期待しています。

実機でプレイ編つづく!


ご意見、ご感想、ご質問はにがBBSまで!

Top pageへ戻る

copyright (C) 2016 Niga