2024年10月16日水曜日

自作の6809SBCにOS-9を移植する試み(その2 OS-9のモジュールを構成)

 OS-9Level1のモジュールのうち必要なものを構成しましたが...

移植しようとしているのはFM-7用のOS-9Level1です。

FM-7用のLevel1とFM77AV40用のLevel2を所有しているのですが、常用しているのはもちろんLevel2で、Level1はほとんど使用していないのでこれを移植しようと考えたわけです。

これが所有しているOS-9のLevel1とLevel2です。


OS-9L1とL2のシステムディスク

以前は、OS-9をディスクから読み込んで起動するものだと思い込んでいたので、起動プロセスのイメージがなかなかつかめなかったのですが、参考にした「OS-9をROM化する」によると、8KBのROM中にOS-9のカーネル(OS9P1,OS9P2)や必要なモジュールを書き込んでおいてOS9P1を起動するだけで、メモリ(ROM)中のモジュールを検索してシステムに登録してくれるとのことです。

OS-9の一般的な構造を下に示します。

OS-9の構造

今回のプリンタ・バッファのモジュール構成を下に示します。

モジュール構成

プリンタ・バッファとして必要なモジュールは下図のようにP-ROM中に配置されています。

モジュールの配置

必要なモジュールのうち、IOMAN,SCF,OS9P2,OS9P1は動作しているOS-9から取り出します。残りのうちのOS9P1より上のINITからIODRVまでの5つは今回用意されたもので、OS-9システムとして必ず必要なものです。OS9P1の下の5つはプリンタ・バッファとして必要なもので、今回はSBCとして最小限の動作を目標としているので不要と考えています。

この配置のうち、OS9P1の位置はFM-7でのOS9P1の配置と合わせてあり、それによって割り込みベクタの値を変えずに済むように考慮されていますので、これに倣うことにしましたが、何とこの配置に従って並べていくとOS9P1の位置が$F3F3よりも後ろになってしまうのです。その原因ですが、SCFのサイズが配置図中では$0438であるのに対して、現用のFM-7から取り出したSCFでは$0504と大きいのです。

手持ちのFM-7のOS-9Level1のバージョンは1.2でして、もしかしたら1.2以前のバージョンがあったのかもしれません。仕方がないので、モジュールを並べ替えてOS9P1の位置を合わせてROMに焼いて試してみましたがうまく行きません。

FM-8版OS-9を所有している知人にお願いしてモジュールのサイズを確認してもらったところ、FM-8版のSCFは$438バイトで記事中のものと一致しました。ということで、とりあえずこのSCFを使わせてもらうことにして上記の配置通りに並べてみました。結果ですが、やはり動作しませんでした。。。

そもそもこの記事はプリンタバッファの製作記ですので、I/Oとしてはパソコンから受け取ったデータをバッファに溜めておいてプリンタに書き出すという機能しかありません。製作したSBCは基本部分だけですのでI/Oがありません。動作しているかどうかは、CLOCKモジュールに書かれている10msのインターバルタイマが機能しているかどうかで判断しています。CLOCKモジュールが正常に動作していればカーネルまで正常に動作していると判断できます。

しかし、そのインターバルタイマが動作しているようにも見えるのですが、不安定なのです。電源を何度も入り切りしたり、リセットボタンを複数回押しているとタイマやACIAのクロックが現れたりするのです。その1に書きましたように、モニタが正常に動作することは確認済みですので、ハードに不具合はないはずです。

ということで、まだ動作しない原因は掴めていません。

その3に続きます。


2024年10月10日木曜日

自作の6809SBCにOS-9を移植する試み(その1 SBCの製作)

 OS-9を移植するための2種のSBCを作ってみましたがモニターを走らせるだけで一苦労

数年前から6809用OS-9をSBCで走らせたいと思っていましたが、考えているだけではちっとも進まないので、思い切って、まずハードの製作から始めました。

実は以前、OS-9と互換性があると言われているNitros9の資料中にSBC用のモニターのソースがありましたので、そのメモリマップに合わせて6809ボードを作成してみたのですが、残念ながらそのモニターは動作しませんでした。。。(ソースを読んでも良く分からない個所もあって、それ以上は先に進めずギブアップ。)

ということで、今回参考にしたのは「マイコンピュータ21(CQ出版社)」中の「OS-9のROM化ープリンタ・バッファを例としてー」という記事です。

この回路中の6809MPU、2個の6850ACIA、8253PIC、RAM、PROMの部分のみを取り出してSBCとしました。この構成ですと私が自作しているSBCとほとんど同じ構成ですので、ほぼI/Oマップの変更のみで作成できました。ただし、8253PICを使用したことがなかったので、使い慣れている6840PTMを使用するボードも作成しました。

下の画像が製作した2種のカードです。

左が68B40使用、右が82C54使用のもの


以前から作成してきた6802ボード、6809ボード、6802/6809デュアルボードを元にしていますので、6809と6809Eのどちらでも使用できます。OS-9Level1をROMに収めるために、ROM領域を$E100~$FFFFの8KB弱と拡げ、I/O領域を$E000~$E0FFに、RAM領域を$0000~$DFFFとなるように変更しました。
また、カウンタICとして今までは6840を使用していましたが、参考にした回路が8253を使用していましたので、8253を使用した回路も作成しました。左が6840使用の従来の回路に似た構成のもので、右が8253を使用したものですが、回路拡張のためのコネクタのスペースを確保するために128KBのRAMをSOCタイプに変更してあります。(なお、実際には6840は63B40を、6850は63B50を、8253は82C54を使用しています。)

(1)ハードの動作確認のために入れたモニターの不具合にハマる
まずハードが正常に動作するかを確認するためにROMにモニタープログラムを入れて走らせてみました。従来から使用してきている自作のモニターでは正常に動作しましたが、ASSIST09を入れてみたところ、なんとRコマンドに余計なものが表示されるという異常が生じました。
今まで普通に使用してきたASSIST09のI/Oのアドレスを変更してアセンブルし直しただけなのに不具合が生じるのは不思議で、ついにはソースを元の書籍「MC6809-MC6809Eマイクロプロセッサ プログラミング マニュアル」中のソースリストと比較することまでしてみましたが間違いはありません。
この原因を見つけるのに2週間ほど要しましたが、結局、使用している自作のクロスアセンブラのバグのために、FCB 'C,'C,0,9が$43,$43,$07,$09となってしまっていたのが原因でした。以前は正しく変換できていたのですが、'Cでも'C'でも変換できるように手直しをした際にバグが入り込んだようです。今はクロスアセンブラの修正をする時間がないので、とりあえずソースをFCB 'C,'C,00,9と変更して正しく変換されるようにしました。
結局、ハードは正常に動作していたのに、モニタの不具合で右往左往することになってしまいました...

(2)2種のカウンタICの使い方でハマる
また、2種のカウンタICの違いにも苦労させられました。
63B40を使用した今までのボードでは、通信用の63B50ACIAのクロック生成のためにシステムクロックの4倍値の8MHzを74HC161で13分周して615KHzを作り出すことで38400baudで通信していました。


74HC161による13分周回路


しかし、参考にした8253使用の回路では、ACIA用のクロックを8253で生成しているのです。同じように63B40でもクロックを生成できれば74HC161を省略できます。

ということで、82C54使用の回路では74HC161を実装せずに82C54のカウンタ0を使用してACIA用の615KHzを生成しています。(カウンタ1はOS-9用、2はASSIST09のTraceコマンド用)
ところが、63B40使用の回路では8MHzを13分周して615KHzを作り出すことができないのです。8253と比べて6840のプログラムは複雑なので、プログラムのミスかと思いあれこれと書き直してみるのですが、何をどうやってもうまく行きません。入力が2MHzだとプログラム通りの分周値が得られるのですが、8MHzだとダメです。挙句の果てには6840ユーザーマニュアル中のサンプルプログラム通りにプログラムしてみましたがやはりダメです。
どうなっているのだろうとネットで検索した結果、6840のカウンタはE入力と同期してカウントダウンしているので、Eよりも高い周波数の入力はカウントできないという書き込みを見つけました。
ということで、結局、63B40使用のボードではACIA用のクロックは従来のボードと同様74HC161で生成することになりました。

さらに、2種のカウンタICのプログラムの違いですが、8253ではコントロールワード中でカウンタ0,1,2の選択と動作モード等の設定が同時にできるので簡単に設定ができ、カウントデータのロードで下位バイトを先に、上位バイトを後に書き込むという順序を守るという注意点があるぐらいなのに対して、6840の方は2つのコントロールレジスタで3つのカウンタを制御しているために、カウンタ1と3ではまずカウンタを選択してからコントロールワードを書き込むという順序になること、そして、コントロールレジスタ1のビット0がソフトウエアリセットになっているので、0にしないと全てのカウンタが止まったままになること、さらにコントロールレジスタ2のビット0がカウンタ1と3の選択を兼ねているために、選択をする際にはカウンタ2のコントロールワードが書き換わらないようにしなければならないことなどがあるので、3つのカウンタの設定順序にも注意が必要です。
迂闊なことに、今までは3つあるカウンタの内の1つしか使用したことがなかったので、これらのことに気づくまでに何と数週間を必要としました。。。

以上のような苦労をした挙句、何とかボードが正常に動作することが確認できましたので、次はいよいよOS-9の移植ですが、実はまだ成功していません。分からないことが多すぎるためですが、現状をその2に書きます。