PC-6001シリーズのBIOSデータをデータレコーダーもフロッピーも使わずにPCに移す
最新バージョンはこちら
PC-6001シリーズのROM内のBIOSデータを、フロッピーやカセットテープなどのメディアを使わずにPCへ移そう、という趣旨で、色々作ってみました。
参考動画(ちょっと古いバージョンです)
ファイルのダウンロード
実機側の準備
まず、PC-6001,PC-6001mkII,PC-6601,PC-6001mkIISR,PC-6601SRなど、BIOSを吸い出したい実機を用意します。
そして、ダウンロードしたP6_BIOSCAP.zipの中にある、それぞれの機種用のBinToMovieプログラムを、どうにか実機上で動かせるようにしてください。
各機種用BinToMovieプログラム名
PC-6001用 | b2mv.bas |
PC-6001mkII/PC-6601用 | b2mvm2.bas |
PC-6001mkIISR/PC-6601SR用 | b2mvsr.bas |
実機にプログラムをもっていくには、
1.リストを見ながら実機で手で打ち込む
2.同じzipファイルに入っている、各機種用のwavファイル(b2mv.wav等)をPCで再生し、データレコーダーケーブル経由で、実機でCLOADする
などの方法があります。
※各機種用のwavファイル(b2mv.wav等)がどうしても実機で読めない場合、位相反転したファイル(b2mv_reverse.wav等)も試してみてください。
動画の作成
各機種用の BinToMovie をRUNすると、それぞれのROMをキャプチャーするためのメニューが表示されます。
Hashiさんのサイト(http://p6ers.net/hashi/suidashi.html)などを参考に、キャプチャーしたいROMの種類を選択してください。
次に、1フレームごとのウエイトを指定します。まずはそのままRETURNを押して、デフォルトで試してみると良いでしょう。
ウエイトを設定すると、今度はマーカー画面になります。[1]~[4]と書いてあるのがマーカーで、後ほど、PCでこのマーカーの位置を指定することになります。
ここから先を、動画で保存します。
PCでキャプチャーする環境がある人は、録画を開始してください。
キャプチャー環境がない人は、デジカメでモニターを動画撮影しましょう。(ただし、カメラは最後まで絶対に動かないように、三脚等でしっかり固定してください)
準備ができたら、何かキーを押してください。
あとは自動的に、指定したROMのデータを可視化して画面に表示していきます。
このようして、動画ファイルを作成してください。
動画ファイルからバイナリーファイルへ
動画ファイルの作成が終了したら、今度はPC側の作業になります。
ダウンロードしたファイルの中に、Windowsツールの MovieToBin.exe というファイルがあるので、実行してください。
最初に、[設定]ボタンをクリックして、縦横のドット数を指定します。
ドットの数は、各機種のテキストモードの最大文字数と同じです。
プリセットボタンを押せば自動的に設定されます。
それ以外の項目については、とりあえずデフォルトで構いません。
次に、先ほど撮影した動画ファイルを、ウィンドウ上にドラッグ&ドロップしてください。
そして、その動画を、マーカー(画面の四隅に表示された「1」「2」「3」「4」の文字)が表示されているところまで早送りしてから、一時停止状態にしてください。
[マーカー位置設定]ボタンをクリックして、「1」から「4」までのマーカーの中心を、順にクリックしてください。
4箇所のマーカーをクリックすると、4点から計算されたキャプチャーポイントが表示され、確認を求められるので、ドットの位置に合っているかチェックして、[はい]を選んでください。
もし、キャプチャーポイントが大幅にずれている場合は、一度[はい]を選んだ後、[設定]で、縦横のドット数がその機種用の値になっているか確認してください。
そして、[キャプチャー開始]ボタンをクリックすると、自動的に動画の一時停止が解除され、キャプチャーが始まります。
また、このとき、マーカー画面に埋め込まれているファイル名やファイルサイズの情報がデコードされ、[バイナリー情報]が更新されます。
キャプチャーが終わると、動画が一時停止し、[バイナリー情報] の [CRC32] の値が更新されます。
正しくROMがキャプチャーできた場合のCRC(Hashiさんのページより)なども表示するようにしてみたので、実際にキャプチャーしたバイナリー情報と比較すると良いかもしれません。
また、キャプチャーしたバイナリーデータは自動的に保存はされないので、
キャプチャーが終了したら、必ず [ファイルに保存] を行なってください。
以上のことを繰り返して、必要なROMデータをPCに移していきます。
基本的な説明は、これで終わりです。
キャプチャーのコツ
動画ファイルを経由せずに直接キャプチャーする
PCに動画キャプチャー環境がある場合に、動画ファイルを作成せず、キャプチャーツールのプレビューウィンドウを直接キャプチャーしてしまうという方法です。
なんといっても、圧倒的に精度が上がります。
私の環境では、実機側のウエイトを半分(mkIIで、デフォルト8のところを4)にしても、一度も失敗したことがありません。
MovieToBin を起動し、[デスクトップを直接キャプチャー]のチェックを入れると、メディアプレイヤーの部分が透明になります。
この状態で、キャプチャーツールの上にMovieToBinを重ね、枠の中にキャプチャー画面が収まるようにします。
あとは、その状態で実機を操作してマーカー画面を表示させ、通常通りマーカーの位置を設定し、キャプチャーを開始するだけです。
キャプチャー環境がある方は、基本的にこちらの方法を使ってください。
動画ファイルのデコードを軽くする
動画再生は少しでも軽いほうが良いです。画質が綺麗で重いフォーマットよりは、多少画質は落ちても軽いフォーマットにしましょう。
デコード処理だけでなく、解像度や転送レートなども関わってくるので、一度キャプチャーした動画を、PCの環境にあった最適なフォーマットで再エンコードすると良いかもしれません。
キャプチャーした動画を普通に再生してみて、等間隔で画面が更新されないようであれば、エンコードしなおしたほうが良いでしょう。
ここで、MovieToBinの[設定]の説明をしておきます。
[キャプチャー間隔]ですが、これは動画をどれくらいのインターバルでチェックするかを表します。1msだと1000分の1秒に一回、10msだと100分の1秒に一回、動画をチェック・解析します。
小さすぎると処理負荷が上がりますし、大きすぎるとフレームをキャプチャーし損ねることがあるので、最適な値を見つけてください。
次に、[キャプチャーウエイト]について説明します。
通常は、[キャプチャー間隔]のタイミングで動画のスナップショットを撮り、その画像を解析して、解析OKのタイミングであれば、画面データをバイナリーデータにデコードします。
[キャプチャーウエイト]に0以外を指定すると、解析OKのタイミングになってから、さらに指定した時間だけ待ち、もう一度新たなスナップショットを撮って、その新しい画像で全体を解析します。
動画のエンコードによっては、フレーム遷移直後は前のフレームの情報がまだ残っていたり、ノイズを拾ってしまったりということがあるので、画像が安定してから再度スナップショットを撮ることで精度を上げようという狙いです。
動画を再生してみて、画面の模様が切り替わるタイミングで前のフレームの残像が残っていたり、明らかに一瞬でパッ、パッと切り替わっていないようでしたら、この値を上げて試してみてください。目視で残像が見えるような場合は、200(0.2秒)くらいまで上げてみると安定する場合もあります。
[キャプチャー中は動画を停止]のチェックを入れると、1フレーム解析するごとに、動画を一時停止させます。実機のウエイトが短くてPCの解析が追いつかない場合などには使えるかもしれませんが、一時停止してもその瞬間に必ず止まるわけではないので、このオプションを使うよりは実機のウエイトを増やして再キャプチャーしたほうが良いでしょう。
技術情報…的な
画面に表示される情報のフォーマット
ドット1つ(テキスト1文字)が1ビットで、下位ビットから並んでおり、横に並んだ8ビットで1バイトを表しています。
例えば、「白白黒白黒黒白白」は、「(←下位)1101 0011(上位→)」となるので、16進数に直すと「CB」となります。
1フレームあたりの情報量は以下のようになります。
初代機…32文字×16行=4バイト×16行=64バイト
mkII…40文字×20行=5バイト×20行=100バイト
SR…80文字×25行=10バイト×25行=250バイト
ただし、画面右下の最後の1バイトは画面更新フラグとなっており、PC側でキャプチャーのタイミングを取るために使用しています
(ここのビットが反転した瞬間がキャプチャーフレームになります)。
また、マーカーが表示されている最初の画面のフォーマットですが、画面の文字数に限らず、2行目から、「スタートアドレス下位、スタートアドレス上位、エンドアドレス下位、エンドアドレス上位、PCで保存するときのファイル名(最大20文字)」がバイトデータとして並んでいて、Windowsのキャプチャーツールはその情報を読みます。
自前で実機側のエンジンを作る際などに参考にしてください。
実機側のプログラム
マシン語部分は、メインルーチンと、各ROMを表に出すためのサブルーチンに分かれており、BinToMovieのメニューでROMの種類を選択した後に、そのROMに対応するサブルーチンをメモリに書いています。
メインルーチンは、メモリの内容を1ビットずつチェックして、テキストVRAMのアトリビュートエリアを書き換えているだけなので、他機種への移植は簡単だと思います(SRのVRAMは特殊なので、参考にならないと思いますが…)。
サブルーチン部分は、必要なROMを表に出すための事前処理と、元に戻すための事後処理が、16バイトずつ用意されています。
そこに収まらないようなプログラムはメイン部分の最後に付加して(行儀が悪い…)、サブルーチンからはそこをコールするようにしています。
サブルーチンさえ作れば、拡張スロットのデータなどもキャプチャーできると思います。
mkII以降のKANJIROMは、2つのROMに別れていますが、1つの連続したファイルとして転送できるように、半分をRAMにコピーしてから出力しています。
SRのSYSTEMROMについてですが、BASICプログラムが動いている以上は64KBの連続した領域を取ることは不可能なので、32KBずつにわけて、サブルーチンからメインを二度呼び出すことで64KBを連続して出力しています。
ROMの切り替えは、BIOSは使わずにすべてI/Oポートを直接操作しています。動かない場合はご報告していただけると嬉しいです。
謝辞
Hashiさん http://p6ers.net/hashi/
isioさん http://retropc.net/isio/
Windyさん http://www.eonet.ne.jp/~windy/
ゆみたろさん http://papicom.net/
みなさんのサイトを参考にさせていただきました。ありがとうございました。
お問い合わせ先
twitter で @tiny_yarou までお気軽に
2013.4 TINY野郎