X1turboIIIにバンクメモリを
- 2022/11/09 14:14
- カテゴリー:マニアックなおはなし, make:
X1turboIIIですが,なかなか手強いです。
破損したディスクを修復するのも手間取っていて,LOADするときちんと読めるのにturboBASICでCOPYコマンドを使うとファイルが壊れるという謎の問題に手を焼いています。
COPYコマンドが信用出来ないわけではないし,書き込み先のディスクの破損もありませんから,やはり読み込み元のディスクの破損が問題なのでしょう。私はフロッピーディスクのフォーマットに詳しいわけではないですし,昔のようにディスクエディタで中身を覗き込むことに,あまり興味を持てなくなっています。
最初,COPYコマンドでコピーを取ったBASICのリストがかなりの確率で壊れているので,打ち込み直しまで考えたところ,普通にLOADすればあっさり読み込めることを発見し,安心した一方でこれまでに処理したファイルの破損を調べ直さないといけなくなったことにがっかりした記憶があります。
ところで以前PC-6001やPC-386でも活躍したGOTEKのFDDエミュレータですが,X1でも動作しています。私の場合,まずは外付けFDDのコネクタに繋ぐケーブルを自作し,GOTEKと繋ぎました。
ちゃんと2HDも2Dも認識しているので問題なのですが,悲しいのはX1のコピーツールのほとんどは,ドライブ0からドライブ1へのコピーに設定されているので,外部FDDに切り替える事ができないのです。
だから手元のディスクのバックアップを取りたいなあと思った時は本体を開けてFDDを引きずり出し,ドライブ番号のジャンパを差し替えて動かすという離れ業をやらないといけません。
といいつつ,turboのマニュアルにはそのやり方が詳しく書いてあるので,X1ユーザーならこれくらい出来ないといけないのでしょうね。なんとユーザーに厳しいマシンである事よ。
で,ここだけの話ですが,CZ-8FB03のイメージを手に入れました。そう,turboZ-BASICです。うちのマシンはturboIIIですのでturboZではありませんが,Z特有の機能を除いてCZ-8FB03が動作します。
私はturboユーザー向けに外販されたCZ-8FB03を買わずにいました。turboで使う限りCZ-8FB03を使う理由が見当たらなかったからです。バンクメモリも付属していましたが,ここにはコードを置く事が出来ず,変数エリアとしてしか使えなかったことも買わなかった理由です。
逆にturboZを買っていたら,予約してでもCZ-8FB03を買っただろうと思います。
そんなわけで見送ったCZ-8FB03ですが,turboでもCZ-8FB03の起動する画面を拝めるかも知れないと内緒でワクワクしながら起動したのです。
しかし残念ながら起動せず。バンクメモリがないから起動できないと,怒られてしまったのでした。いやいや,起動くらいはしないといかんよと思ったのですが,聞けばMMLの実装などでバンクメモリをほとんど使い切っているくらいだそうで,アクセスに時間のかかるバンクメモリを活用するBASICってのも,あまりうれしくないものです。
しかし,ないものは作ってしまえばいいと,手持ちの部品棚を探し回ってみると,1MbitのSRAMもTTLもゴロゴロ出てきました。基板さえ手に入れればあっという間に作れるでしょう。
X1turboのバンクメモリは,前半32kBを切り替えて使うようになっています。このアドレスは32kBのBIOSのROMと切り替えるエリアですが,turboではここをバンクとして割り当てており,最大16バンクで512kBまで扱えるようになっています。
バンク制御はI/Oアドレス0x00B0にあるレジスタで行い,下位4ビットで16個のバンクを指定,5ビット目でバンクメモリ有効/無効,6ビット目でBASICがバンクアクセスしているかどうかを知るフラグとして使われています。
これくらいの仕様がわかっていると回路図を起こすのは簡単で,さっと設計した時は3チップ+SRAMで出来ました(これでは動かないことをのちに思い知るわけですが)。これで4バンク128kBです。
つくづく悔しいのは,サンハヤトのX1用ユニバーサルボードを予備で1枚買ってあったものを,昨年の実家の整理で捨ててしまったことです。作ったMIDIボードも捨ててしまいましたので,せめてそれだけでも残しておけばと悔やまれてなりません。
50ピンの基板をなんとか手に入れて,X1用に44ピンに削って基板を用意します。重い腰を上げて製作に入ってしまえば2時間ほどで製作できたので早速試してみたところ,CZ-8FB03は拡張メモリがないとだだをこねて起動してくれませんでした。
やっぱそんなに甘くはないか・・・
いくつかの配線ミスを発見して修正しますが状況は変わらず。ただ,念のためと確認したFM音源ボードも動作しなくなっていたので,もしやと確認するとやはり拡張スロットと本体基板を繋ぐコネクタが外れていました。あちゃー。
組み立ての時に接続し忘れたんでしょうね。戻して組み立てなおし,FM音源ボードの動作は確認出来たところで,拡張メモリを差し込みます。
しかしやっぱりCZ-8FB03は起動しません。そこで真面目にオシロスコープを引っ張り出して動作の確認を順番にやることにしました。
まずアドレスデコード。これは0x0B00でデコード出来ていますし,WRもRDもこれに従って作られています。
次にレジスタ。ここはD-FFの入力にデータバス,クロックに先程のWRをいれて書き込みますが,読み出しは74HC125の入力にD-FFの出力を繋ぎ,出力はD-FFの入力(つまりデータバス)に繋ぎます。
これ,74HC374を使えば簡単なのですが,D-FFの出力を引っ張り出してSRAMもアドレスにしないといけないので,使えないのです。面倒くさいです。
そこで4バンク分のアドレス指定2ビットと5ビット目と6ビット目の4つのために74HC175を使い,このうち読み出しが必要な6ビット目だけワンゲートのNC7S126を使いました。
波形を見ると一応期待した動きをしているのですが,CZ-8FB03は起動しません。もう一度I/Oマップを見直してみると,なんとすべてのレジスタが読み出し可能に指定されています。うーん,これはさらに面倒。
しかし,レジスタが読み書き出来ないといけないなら仕方がありません。ワンゲートのNC7S125を普通の74HC125に交換して,4つのD-FFすべてを読み出せるようにします。
これで動くかなと思って試してみると,CZ-8FB03が一応起動しました。
うまくいったと喜びましたが,ミュージックサンプルを動かして見るとエラーが出ます。もしやとVDIM命令でバンクメモリに配列を取りA$(0)="AA"と書き込みを行うと,見事に暴走しました。(起動途中で暴走することもしばしばです)
L-os angelesというOSでバンクメモリを確かめてみようと,BRADコマンドとBWORコマンドを入力しますが,4バンクを認識するもBWORKのイニシャライズでコケてしまいました。
ということは,未使用のレジスタも含めて,すべて読み書き出来ないといけないのかも知れないです。バンク指定の4ビットのうち使わない2ビットは未実装でしたが,一大決心をしてすべて読み書き出来るようにしましょう。
4個入りの74HC175は6個入りの74HC174に交換,74HC125との配線を全面的にやり直してすべて読み書き出来るように改造しました。
これで試して見ましたが,CZ-8FB03でミュージックサンプルが動かない状況には変化なし,L-os Angelesでは8バンクと認識してしまいさらに状況が悪化しました。
ここで疲れた私は昼寝をしながら,なぜそんなことが起こるかを考えていました。冷静に考えて見ると,実装は0から3の4バンクですが,今の回路はSRAMのアドレスのA15とA16をそのまま繋いでいるだけなので,4から5バンクを指定すると0から3バンクを指定するのと同じになってしまってました。
これまではレジスタもなく,書き込んだ値が読み出せないので未実装と判定されていたのに,レジスタが用意されたことで実装済みと解釈された結果,上位バンクに書き込むと下位バンクが書き換わってしまい,データを壊していたんだろうと思います。
まあ,全部で16バンクあるはずなのになんで8バンクしか認識しないのかは謎ですが,とにかくSRAMのアドレスをフルデコードしないとまずいのは確かです。
そこでバンク指定レジスタの上位2ビットが共に0でないとCSが出ないように修正しました。
これで試すと,ミュージックサンプルも動作し,VDIMでも暴走しなくなりました。しかしL-os angelesのBWORKコマンドで暴走する状況が残っています。
もう一度よく考えてみると,バンクメモリを使用することを示すレジスタの5ビット目をそのままSRAMのCSに入れている回路が問題と気が付きました。これだとバンク切り替えの対象ではない0x8000以降のメモリにアクセスしてもCSがイネーブルですから,SRAMへのアクセスが発生してしまいます。
当たり前の事ですが,0x0B00の5ビット目とA15が同時にLowになっている時だけ,CSがLowになっているようにしないといけないわけで,あわててHC32を1つ追加しました。
いやー,甘いなあ・・・回路の修正が終わって確認です。CZ-8FB03は問題なし,L-os angekesも大丈夫になりました。よかったー。
ということで,初期に比べて回路規模が随分大きくなってしまいました。
今回はレジスタの仕様とソフトでの叩き方から回路をゼロから設計して動かして見たわけですが,どんな手抜きコードが書かれていてもきちんと動作するハードウェアが必要であることを思い知りましたし,それだけソフト屋さんはハードウェアを信じてくれているのだなあとも思いました。
それからちょっと手こずったのは,SRAMはあくまでメモリであり,メモリ空間に配置されるものであるということをうっかり忘れていたということです。SRAMのアドレスを生成するのはI/O空間にあるバンクレジスタだと思い込んでいて,バンクレジスタのアドレスデコードをやったときに安心しきって,メモリ空間のアドレスデコードを忘れたというのは,情けない話だと思います。
さて,実際に4バンク128kバイトのバンクメモリが手に入ったわけですが,出来る事はほとんどなくて,CZ-8FB03ではカラープリンタもなく,FM音源をMMLで使うこともしない私にはあまり御利益はありませんし,文字配列変数が10000個確保出来てもうれしくありません。
L-os angelesはまだ本気で使っていませんので,やっぱりバンクメモリはうれしくないです。
これがですね,ディスクコピーのバッファにするとかしてくれれば,時間のかかる2HDのコピーが便利になると思うのですが,そういう機能もありません。
思いついた回路を最終的にねじ伏せて,このプロジェクトは終了です。