MZ-2500 を 2 台繋げてカセットテープをバックアップする

現在、パソコンの記憶媒体と言えば、ハードディスク、フロッピィディスク、MO、CD-ROM、DVD-ROM などたくさんありますが、昔のパソコンの記憶媒体と言えばカセットテープです。そして、MZ シリーズもカセットテープを採用していました。MZ-2500 は MZ-2000/2200、MZ-80B のカセットテープソフトがそのまま使用できます。また、X1 や MZ-80/700 などもボーレートが違うだけで記録方式は同じなのでプログラムさえ作成したら読み込めると思います。
私は MZ-2000 のテープ版のソフトやデータをいろいろと持っているのですが、購入してから 17 年くらい経っているものもあり、そろそろ読み込めないものも出てきました。ところがバックアップを取ろうと思っても取り方が分からないものも多く存在します。
そこで、カセットテープのバックアップ方法について考えてみました。

カセットテープにはいったいどんな方法でデータが記録されているのでしょうか?
本来ならば「シャープ PWM 方式」とか、その記録速度などに付いて説明するところなのですが、難しいし私自身理解しているのか自信がないので省略します。それよりも簡単に説明するとカセットテープにはなんらかの音が記録されそれを読み取っているわけです。その音を読み取る方法と言うのは INP( &HE1 ) を実行して右から 7 ビット目を取り出すだけです。そうすると現在読み出し中のテープのデータが取れます。記録されている音からデジタルデータへの変換はこの 1 命令で MZ が勝手にやってくれるのです。
とりあえず、以下のプログラムを見てください。このプログラムは MZ-2500 の BASIC-M25 で動作します。

10 cls
20 locate 0,0
30 DAT=inp(&HE1)
40 DAT=(DAT/64) and 1
50 print DAT
60 goto 20
' 画面消去
' 表示位置を左上に設定する
' I/O ポートよりカセット読み込みデータを取得する
' 右から 6 ビット目を取り出す
' カセット読み込みデータを画面に表示する
' ループする

このプログラムを実行して何かプログラムが SAVE されているカセットテープを PLAY ボタンを押して再生するとカセットテープからのデータが画面に表示されます。0 と 1 が交互に表示されます。それがカセットテープに記録されているデータです。このデータをそのままカセットテープに書き戻すことができればダビングできるのです。

では、このデータをどうやってカセットテープに書き戻すのかということを考えなければいけません。
MZ-2500 がダブルカセットだったら問題は無かったのですが、カセットデッキは 1 台しか内蔵されていません。そこで、MZ-2500 を 2 台接続して通信することを考えてみました。通信インターフェイスの候補には RS-232C があったのですが、実は RS-232C で通信する方法を私は知りません。そこで、ジョイスティックポートで通信してみる事にしました。データは 1 ビットしか転送しなくていいのでこれなら簡単にできそうです。まず、通信するためのケーブルを作ることにしました。それが以下のものです。

端子 1

端子 2

端子 1 GND (9 ピン) ←→ 端子 2 GND (9 ピン)
端子 1 出力 3 (8 ピン) ←→ 端子 2 上ボタン (1 ピン)
端子 1 上ボタン (1 ピン) ←→ 端子 2 出力 3 (8 ピン)

それぞれ上のように直結しただけのケーブルです。特殊な部品などは一切使っていません。
ちなみにジョイスティックの 9 ピン端子が \200 で、ケーブルは家にあったものを使いました。全部で税込み \420 です。
では、これで MZ-2500 同士を接続してどのように通信するのかというと、のOUT &HEF, (送信データ) で送信されます。送信データの右から 5 ビット目が送信用ビットです。他のビットは 1 にします。また、INP(&HEF) でデータを受信することができます。ケーブルの送信ピンは上ボタンのピンに接続したので右から 1 ビット目が受信したデータになります。

とりあえず、テスト用のプログラムを作ってみました。それが以下のプログラムです。このプログラムも MZ-2500 の BASIC-M25 で動作します。

送信プログラム
10 cls
20 DAT=0
30 locate 0,0
40 print DAT
50 I$=inkey$
60 if I$="" then 30
70 DAT=1-DAT
80 OUTDAT=&HEF+DAT*16
90 OUT &HEF, OUTDAT
100 goto 30
' 画面消去
' DAT を 0 に初期化、DAT は送信するデータ
' 表示位置を左上に設定する
' 送信するデータを画面に表示する
' キー入力、I$ は押したキーが入る
' もしキーが押されてなかったら 30 行に戻る
' キーが押された場合は送信するデータを反転する
' 送信するデータを右から 5 ビット目に設定する
' データを送信する
' ループする

受信プログラム
10 cls
20 locate 0,0
30 DAT=inp(&HEF)
40 DAT=DAT and 1
50 print DAT
60 goto 20
' 画面消去
' 表示位置を左上に設定する
' データを受信する
' 受信したデータの右から 1 ビット目を取り出す。
' 受信したデータを画面に表示する
' ループする

2 台の MZ-2500 を作成したケーブルで 1P 側のジョイスティック端子同士を接続して、このプログラムを実行すると送信側に表示されている数字が受信側の MZ-2500 にも表示されるはずです。送信プログラムが実行されている MZ-2500 のキーボードを押すと送信データが 0 と 1 が入れ代わり、受信側でもその 0 か 1 が表示されます。
このようにして 2 台の MZ-2500 を接続して通信できることが分かりました。

そこで思いついたのが 2 台の MZ-2500 を接続して、片方でカセットテープを読み込みデータを次々と送信し、そしてもう一方ではデータを次々と受信してそのままカセットテープに書き込めばカセットテープのバックアップができるのではないかということです。
そのための送信プログラムと受信プログラムが以下のものです。
tapebkup.lzh
このプログラムは BASIC では速度が足りないと思ったのでのでアセンブリ言語で書いてあります。そのソースリストが入っています。動作環境は MZ-2500 用の OS FENIX です。うちだの世界にて公開されています。アセンブラ、テキストエディタなど MZ-2500 での有用なツールがたくさんあるので MZ-2500 を持っているならば FENIX は使って損はないと思います。

ところが、これを実行してみて気がついたのです、
BASIC どころかアセンブリ言語でさえも速度が追いついていないのです。
バックアップしたカセットテープをラジカセで聞いてみると音がゆがんでいて 8KHz や 4KHz でサンプリングしたようなザビザビの音になってしまっているのです。MZ-2000 用の BASIC である MZ-1Z001 をダビングしてみたのですが、ダビングされたテープは全く読み込むことができませんでした。MZ-2000 は 2000 ボーなので、もっと遅い 1200 ボーの MZ-700 用の S-BASIC もバックアップしてみたのですがそれも失敗しました。
そうです、この実験は失敗です。
ここまで読んでくれた方には申し訳ないのですが、この実験の通りにカセットテープをバックアップしても必ず失敗します。
プログラムが完璧なわけではないのでもしかしたら間違っているかもしれません。
「ここが間違ってるよ」とか「こうするとできるよ」など情報をお待ちしています。
よろしくお願いします。

戻る