NEC PC-6001 カセットテープをROM化して読み込む


いつかやろう、やろうと思っていたネタです。

昔はカセットテープからプログラムをロードしたりセーブしていましたが、脆弱なメディアのためいずれ破損して読めなくなってしまいます。
そこで、カセットテープをROM化して外部から読み込みできるようにすれば、カセットテープを使わずに済むのではないかと考えました。

まずはカセットテープの仕様です。
これはカンサスシティスタンダードと呼ばれる形式が使われています。
詳細は割愛しますが、要は1を2400Hz、0を1200Hzのパルスで表し、調歩同期のように1バイトごとにスタートビットとストップビットを付けてテープに保存しています。
実際にSoundEngineでwavファイルの波形を見てみましょう。
すると、確かにカンサスシティスタンダードの通り2400Hzと1200Hzの波形でデータが保存していることがわかります。
ただ、このままでは分かりにくいので16進バイナリ表記にしてみます。

通常はエミュレータなどで使われているP6T形式に変換するツールでバイナリデータにしますが、それでは勉強にならないの16進バイナリ表記するツールをPowerShellで作ってみました。
このバイナリデータをマイコンなどからカンサスシティスタンダードフォーマットで出力すれば、データレコーダーの再生として機能するはずです。

それでは実験してみましょう。
マイコンはSTM32F401を使いました。
ただ私はオーディオの知識があまりなく、どのような信号を出力すればいいのか分からなかったので、オシロで波形を見つつwavファイルとして録音しつつ、オリジナルの波形と比較しながら試行錯誤の末、なんとか読み込むことに成功しました。

読み込みが成功したので、本格的に製作を始めます。
今回は所有しているASCII AX-5、6、7をROM化して読み込めるようにしてみます。
筐体は手ごろなものがなかったので、100円ショップで売られていた小さなキャリーボックスを使いました。
LCDはお馴染み1602Aです。
タクトスイッチでゲームを選択できるようにし、リモート信号を検知してロードを行います。
タイトルはAX-5、6、7を入れているので「AX-567」としました。
567...コロナ。

ビルド後のサイズは130kB程度。
STM32F401CDUはフラッシュサイズ384kBなので、全AXシリーズは入りそうです、持ってませんが。
フラッシュ1MBぐらいあれば、手持ちのPC-6001のゲームは全て収録できるかもしれません。

それでは動作確認です。
ザ・アストロディアン、パワードナイト、オリオン、クエスト、動作しました。
読み込み時間はどうすることも出来ませんが、早送り、巻き戻しする必要がないので楽ですね。

ポリス&ギャングだけテープ読み込み後に固まる、PC-6001mkIIだと読み込みできない問題が発生しましたが、オシロで波形を見たら0.2Vp-pしか出ていなかったため、ボリュームで1.0Vp-pに調整したらうまく動作するようになりました。
これで完成です。

以下メモ。
・当初カップリングコンデンサで直流成分を除去していたがうまく読み込めず、PC-6001の回路図を見ると交流成分を除去していたので単に1.0Vに分圧するだけで良いことが分かった
・録音対応は逆を行えばいいが、PC-6001の回路図を見ると35mVイヤホンレベルに分圧しているのでLM386などでアンプする必要がある
・低周波数なのでインピーダンス整合は考慮しなくても良い
・当時「データレコーダーは音響用とは異なるのでラジカセは使えない」と言われていたが、確かに回路図を見ると74LSの出力にローパスフィルタを付けて分圧して出力しているので、波形は鈍っているものの正弦波を出している(といっても、実際には問題なく使えるけどね)
・月刊I/O形式のマシン語に対応するためには、ファイルリストをリンク構造にして複数ROM読み込みに対応しなければならない
・PC-8001/PC8801は「ピーーーー」の部分が1200Hzと2400Hzのハイブリッドになっているため、PC-6001用ROM対応をそのまま使うことができない
・コントローラーの連射の時に気付いたが、STM32のタイマ精度がかなり悪い
・PC-6001はページ指定が必要なので、タイトルと一緒にページ番号も表記することでかなり楽になる

P.S.
PC-6001mkIIの画面の色がおかしい。
ビデオモジュールのコンデンサを替えないといけないかも。






















戻る