SSブログ

4th ROM 【修正済み】 [パソコン]

2010/Sep/27 修正
「『内部拡張 ROM』にも ID が付いている」と誤解を招く記述があったので訂正しました。
「内部拡張 ROM」と「ユーザー拡張 ROM」の記述が紛らわしい部分を修正しました。
2010/Sep/27 修正


ご存知のように PC-8801 シリーズは BASIC の収められた ROM をバンク切り換えする事で 32KiB に収まりきらない機能を呼び出すようになっています。

PC-8801 では、頻繁に使わないと思われる機能とグラフィック処理の部分が、俗に言う「4th ROM」に収められてます。


通常は 6000H から 7FFFH までのエリアは「メイン ROM」が選択されているので、裏のバンクにある ROM 内のルーチンを呼び出すには、I/O ポート 71H へデータを出力してバンクを切り換え、CPU から「見える」状態にする必要があります。

bit 0 が 0 ならば「メイン ROM」、1 ならば「バンク ROM」を選択する事になります。


PC-8801mkIISR 以降の機種では「4th ROM」が拡張され、PC-8801 / 8801mkII では1バンクのみだったものが4バンクになっています。
そのため、上記ポート以外にも 32H へのアクセスして bit 0..1 でバンク番号を設定する必要があります。

追加されたバンクと内容は、以下のとおりです。

バンク #1:V2 モード用の ALU を使用した高速グラフィック処理部分が収められています。
バンク #2:従来の機種では Disk BASIC のみで提供されていた CALL, WHILE … WEND, ROLL, WRITE, ATN(), SEARCH() 等の機能や EDIT 文の機能、倍精度小数点演算、フルセンテンスのエラーメッセージが収められています。
バンク #3:サウンド関係の処理部分が納められています。




起動時に 4th ROM が有効になっていると、ROM の先頭 6000H, 6001H に書かれた ID がチェックされ、PC-8801 用の ROM であると確認されれば、 6002H へジャンプして 4th ROM に収められた機能を有効にするため初期化が行われます。

mkII SR 以降の機種ではグラフィック処理が強化されたため、従来の機種との互換のための V1 モードと、高速描画が可能な V2 モードがありますが、起動時には PC-8801 / 8801mkII と mkII SR 以降の V1 モードではバンク #0 が、mkII SR 以降の V2 モードではバンク #1 が選択されているので、それぞれのモードに応じた初期化が行われる事になります。


この仕組みの便利な所は、ROM の先頭に ID と初期化ルーチンへのフックを用意しておくだけでよいことです。

BASIC プログラムが実行中にグラフィック機能を使用すると、ファンクションコールを使用して 4th ROM が呼び出されるのですが、両者の違いはファンクションコールを使用して呼び出す際のバンクの違いでしかありません。

起動時にモードスイッチの状態をチェックして、ポート 32H でグラフィック処理で使用する 4th ROM のバンクを選択しておけば、mkII SR 以降の機種でも V1 / V2 モードの状態に関係なく、また、従来のファンクションコールの仕組みに手を加えることなく、モードに応じたグラフィック機能が呼び出せるという訳です。




BASIC で予め用意されている「Bank ROM」以外にも、ユーザーが拡張できるように ROM ソケットが7個用意されています。
(ここでは混乱を避けるため、BASIC で使用される ROM を「内部拡張 ROM」、ユーザーが拡張できる ROM を「ユーザー拡張 ROM」と呼びます)

起動時に「ユーザー拡張 ROM」が有効になっていると、ROM の先頭 6000H, 6001H に書かれた ID がチェックされ、PC-8801 用の ROM であると確認されれば、 6002H へジャンプして「ユーザー拡張 ROM」に収められた機能を有効にするため初期化が行われます。

この「ユーザー拡張 ROM」の選択も「内部拡張 ROM」と同じ I/O ポート 71H へのデータ出力で行います。

bit 1 から bit 7 までが順に「ROM #1」から「ROM #7」に割り当てられています。
該当する ROM を示すビットを 0 にすると、その ROM が選択されます。

I/O ポート 71H に関してまとめると、
FFH を出力すると「メイン ROM」が、ひとつのビットだけを 0 にしたデータを出力するとそのビットに該当する「内部拡張 ROM」または「ユーザー拡張 ROM」が選択される。
…ということになります。

(I/O ポート 71H は、同時に複数のビットが 0 になる事が想定してないので、使用する際は注意が必要です)


システム初期化時には、「ユーザー拡張 ROM」のバンクを順番にチェックし、ROM が装着されていれば ROM 内の初期化ルーチンを呼び出すようにシステムが組まれているのですが、PC-8801(無印)にはチェックルーチンにバグがあり、ユーザー用バンクのうちの最初のひとつだけを調べるとチェックが終了してしまいます。

一般のユーザーには全く影響のない部分ですが、初代 PC-8801 の ROM にはフラグ関係のバグが多いですね。




4th ROM と言うと PC-8801 シリーズの方が有名ですが PC-8001 シリーズにも 4th ROM は存在します。

PC-8001 にもユーザーが RS-232C を拡張できるように ROM ソケットが用意されています。
また、PC-8011 / 8012 / 8013 等の拡張ユニットを接続する事で(PC-8012 / 8013 では PC-8097 が必要ですが) IEEE-488(GP-IB) も使用できます。
この IEEE-488 の制御機能は拡張ボード上の 4th ROM が役割を担っています。


PC-8001mkII には N-BASIC を拡張した N80-BASIC が搭載されていて、この拡張された部分は 4th ROM に格納されています。
ディップスイッチで起動する BASIC を選択できるようになっていますが、実は 4th ROM を有効にしているかどうかだけの違いです。
起動処理の中でディップスイッチの状態をチェックし、N80-BASIC が選択されていれば 4th ROM を有効に、N-BASIC が選択されていれば 4th ROM を無効にしている「だけ」なのです。

PC-8001 / 8001mkII の 4th ROM も上述したように PC-8801 シリーズと同じ手順で初期化されるので、4th ROM を有効にするだけで N80-BASIC での拡張部分が初期化されることになります。

N80-BASIC で拡張された命令は全て N-BASIC では使用されていなかった命令なので、初期化ルーチン内でワークエリアにあるフックを書き換えるだけで拡張命令が使えるようになります。




ところで、「4th ROM」という俗称はどこからきたのでしょうね?

電子工学的には、番号を振るときは 0 からというのが慣例なんですが、16 KiB の ROM を使う場合は 0000H から 1FFFH までが #0、2000H から 3FFFH までが #1 … となり、 6000H から 7FFFH までは #3 となるはずなのですが…。

これは、どうやら PC-8801 シリーズに搭載されている「Bank ROM」の ID が原因のようです。
これは、どうやら PC-8801 シリーズ用に用意されている「ユーザー拡張 ROM」の ID が原因のようです。
PC-8001 シリーズ用の拡張 ROM の ID は「AB」となっていて番号は付けられていませんが、PC-8801 シリーズ用のユーザー拡張 ROM の ID は「R4」となっています。
「ROM #4」という意味なのでしょうが、どうやらここから「4th ROM」という言葉が生まれたのではないかと思われます。

「R4」といわれると「~ Revision 4」という言葉がまず最初に思い浮かぶのですが、これは私が「ソフト屋」だからなのでしょうね(笑)

nice!(0)  コメント(1)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 1

jh

こんにちは、

ROM先頭アドレスから2番地にCOLD START LOADER
を置いてFDCイニシャライズパラメーターを必用な物を
定義しておけばIPLは簡単にできそうです、BIOSは純正
の物を作り変えて必要な物を作れば5インチ2Dから
8インチ1Sに置き換えが可能になりそうです2Dにする
にはBIOSを2d用に作り変える必要が有ります。
COLD START LOADERに定義されているアドレスを
書いておくとできます。


by jh (2012-01-10 13:13) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。