X1turboでフラッシュメモリを使う


はじめに

SCSIボードの空きスペースにEMMを載せる設計をしていると、まだ40ピンICが1個載るだけの隙間が残る事が分かったので、BASIC ROM相当の回路を載せるためのスペースとして再設計をしました。


概要

EMMとBASIC ROM、アドレス指定に3つのポートとデータ用のポートが1つなのは同じで、それ以外の仕様が微妙に異なります。そもそもBASIC ROMに16ビット以上のアドレス指定ができるようにした仕様が謎ですらあります。

回路としては、ROMのアドレス指定にはEMMのアドレスカウンタを流用し、データ用ポートをアクセスした後の自動インクリメントをしないようにするだけです。

流石に実行しないとは思いますが、BASIC ROMボード CZ-8RBを改造する場合は、書き込みデータがROMの方まで到達するような改造が必要です。

仕様

I/Oアドレスも仕様も同じです。もちろんIPL起動も可能。

ただちょっと違うのは、回路への小細工でEMM9:のI/Oアドレスにも配置してROMディスクとして使えるようにしました。そのため、BIOSを書き換えてEMM9:をアクセスした際にROMでもエラーにならないようにしています(X1turboのBIOSではEMMをアクセスする際に、処理開始レコードの1バイト目が書き込めるかどうかで存在の有無を判定しています)。

動作確認

いきなりフラッシュメモリを載せるのも怖いので、EPROMにIPL用のデータと"CZ8CB01.Sys"を焼いて、内容を"DEVICE DUMP.Bas"で確認し、IPL起動までを確認します。

初めてROMからBASIC起動してみると、SCSIより遅い・・・という印象でした。EMMとは違い、アドレスの自動インクリメントがの無いから、さらに遅いのかな。

ここまで確認したら、次にフラッシュメモリにEPROMと同じ内容を書き込んで、同様の確認をします。

書き込みのテスト

いきなりアセンブラで作ると動かなかったときにハマるので、まずBASICオンリーで。

ターゲットとなるフラッシュメモリはEN29F002Tで、セクタイレースで最終ブロック(3C000H~3FFFFH)を消去し、3C000Hからの256バイトに0~255を書き込みます。 たった256バイトの書き込みですが、やってしまったか・・・と不安になる遅さを堪能できます。

動作の確認は"DEVICE DUMP.Bas"か、フラッシュメモリを抜いてROMライタで読み出して行います。

フラッシュメモリへの書き込み

BASICで作ったプログラムを踏まえ、I/O操作が煩雑なので速度は期待していませんがアセンブラに書き起こします。

ターゲットとなるフラッシュメモリは、EN29F002TとAm29F040です。

EMM0:の内容を、BASIC ROMのI/Oアドレスに載せてあるフラッシュに書き込むプログラムです。

X1turbo用フラッシュ書き込みプログラムマシン語部分のアセンブラソース
最初に全領域消去(チップイレース)を実行し、EMMから4Kバイト読み出し&フラッシュに書き込みを繰り返します。エラー発生時はERRBUFに00H以外の値が格納しています。

チップイレースはトグルビットで、1バイト書き込みはポーリングで処理の完了とエラーを見ていますが、これには特に根拠はありません。コマンドを書き込んでいるアドレスのAAAAHは、フラッシュ側で最上位ビットを無視するので2AAAHと等価です。

バイト単位書き換えが同じ仕様のフラッシュメモリであれば、容量やセクタの差異を除いてそのまま流用できると思います。PCの拡張ボードのBIOS用として載っていることが多いW29C011(W29EE011)なんかは、書き込みがページ単位なので対応しません。

ベンチマーク

ベンチマークというほどのものではありませんが、一応どのくらいの時間が掛かるか調べました。

テストに使用したのは512KバイトのAm29F040です。

処理内容処理時間[秒]1バイトあたり[us]
00H書き込み62118.26
ランダム値書き込み62118.26

書き込み内容による差異はありませんでした。これがどの程度の実行速度なのかというと、ROMライタと比べると遅いのですが、我慢できる範囲でしょう。

ROMからディスクBASICを起動させる

ここで、EMM9:にフラッシュをROMディスクとして見えるようにした小細工が生きてきます。

ターゲットとなるフラッシュメモリは512Kバイトの容量を持つAm29F040です。転送するファイルの総量が、フラッシュメモリの容量を超えなければ320Kバイトより小さくても問題ありません。

下記のプログラムでは、EMM0:にROMディスクイメージを生成します。EMMが無い場合は、それなりに変更する事でFD/HD/MEMに生成する事も可能です。 システムの転送がCOPYコマンドという、雑にも程があるだろうという作りですが、初期化直後にはこれでも大丈夫なので・・・

以下に、プログラムを簡単に説明します。
130~EMMの全領域をDMAを使ってFFHで埋め(余計なお世話)
220~システムを転送し、IPLで起動できるように設定
310~起動後のカレントデバイスを強制的にEMM9:にします
470~その他に必要なものを転送します

EMMへの転送が終わったら、前出のフラッシュ書き込みプログラムを実行します。EMM0:以外にROMディスクイメージを生成した場合は、フラッシュ書き込みプログラムのFDCNOとUNITNOを、それに見合った値に変更してください。

起動後のカレントデバイスをROMディスクに書き換えているため、単純にコピーした場合と違って"Start up.Bas"の読み出しで"Device offline"でコケません。

不揮発EMMがBASIC ROMに見えるタイプも同様の方法で"Start up.Bas"の自動実行で"Device offline"の発生を回避できるはずです。