とりあえずですがSBCでOS-9が動作しました
その2で報告しましたように、いくつかのモジュールを書き換えてみたり、並び順を変えたりしましたが、何をどうやっても動作しませんでした。
そこで、実際にFM-7上でOS-9Level1が動作している時のメモリ上のモジュールの状態を調べてみようと考えました。そのためにはメモリ内容をダンプするmdumpというコマンドが必要ですが、もちろん、標準コマンドにはありません。自作してもよいのですが、時間がかかりそうですので、既成のものがないかとネットも含めて探しましたが見つかりませんでした。
唯一見つけたのは、末尾に載せた参考文献1に掲載されているmdumpのソースリストです。しかし、これはかなり以前にソースを入力してアセンブルしてみたが、正常に動作しなかったというものです。今回はどうしてもこれが必要ということで、本気で取り組んでみました。本体の他に4つのルーチンが必要なのですが、その中のahexdだけが参考文献1には載っておらず、参考文献2の方に載っているのでそれを取り込んでアセンブルしました。結果、アセンブルはできたのですが、やはり正常に動作しません。ソースを調べたところ、一行抜けがあって2バイト分飛んでいます。参考文献にはmdumpの他にfdumpのソースもあるのですが、それも同様なルーチン中で同じ個所が飛んでいます。。。
参考文献の2冊 |
どんな処理を補うべきかを判断するのに丸3日(!)かかりましたが(当たり前ですが他の方の書かれたアセンブルリストを理解するのは本当に大変です...)、見つけました。それを補って無事に動作するmdump(とついでにfdumpも)を作成することができました。
作成したmdumpを使ってFM-7上のOS-9Level1のモジュールOS9p1の位置を確認したところ、何と元にしているROM化の記事中のアドレスと5バイトずれているではありませんか。記事ではOS9p1は$F3F3からとなっているのですが、実際には$F3EEから始まっているのです。(OS9p1は$87,$CDから始まり、サイズは$07F2バイト)
OS9p1の位置を確認 |
ということで、OS9p1を$F3EEからに配置し、OS9p1の直後に置くセカンドベクタと$FFF2からのベクタアドレスをすべて5バイト小さい値に変更して配置してみました。
なお、動作テストのために、前回までは10msのインターバルタイマとACIA用のクロックが生成されているかをオシロで確認していましたが、今回は、RWモジュール中にACIAの入出力ルーチンを書き込んでおいて、Windows機のTeraTermからのキー入力がそのままエコーバックするかどうかで確認できるようにしました。(ACIAの初期化ルーチンはSYSGO中に追加しました。)
結果ですが、希望通りキー入力がそのままエコーバックされてきましたので、とりあえずですが、ROM中に書き込んだOS-9のモジュールが正常に動作していることが確認できました。(三か月近くの苦労が報われました、、、)
なお、前回のその2でSCFをFM-8のものに差し替えたと書きましたが、FM-7のものに戻しても正常に動作しましたので、以降、FM-7のものを使うことにします。
これからすべきことなど
とりあえず、ACIAによる入出力ルーチンを直接書き込んで動作を確認したわけですが、OS-9の作法としては、SCFの下に来るべきACIAドライバルーチンを作成し、その下にACIA-1用とACIA-2用のデバイスディスクリプタを用意するという形になります。また、ディスクが無ければファイルの読み込み・書き出しもできないのでそのドライバも用意しなければなりません。
構想としては、以前、FM77AV40SXで常用しているLevel2でWindows機上に仮想ドライブを構築してそれをACIAを通して読み書きするというドライバを書いて使用していましたので、そのような形を考えています。そのためにACIAを2個用意してあるのでした。
ドライバ作成には時間がかかりそうですが、出来上がりましたら公開する予定です。とりあえず、ハードの方は完成ということで回路図を載せておきます。
動作確認ができたのは下記の8253を使用した回路です。
82C54バージョンの回路図 |
6809Pと6809EPの両方が使えるようにするためにクロック周りが複雑になっていますが、他には特に変わった部分はありません。8253ではなく8MHzをカウント可能な82C54を使用しています。そのカウンタ0をACIAのクロック生成に、カウンタ1をOS-9のインターバルタイマとして、カウンタ2をASSIST09モニタを使用する際のNMI割り込みに使用しています。
63B40バージョンの回路図 |