So-net無料ブログ作成
メッセージを送る

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」という言葉がまず最初に思い浮かぶのですが、これは私が「ソフト屋」だからなのでしょうね(笑)

起動処理のバグとディスクの枚数の関係 [パソコン]

メインPCが逝かれたのと新プロダクト開発(Dash-8X です)で忙しいので更新が滞っている Thunderbolt です。

大ネタを準備するのも大変だし、かと言って更新しないのも嫌だな…という訳で、小ネタを出していきます。




PC-8801 (初代)の N88-BASIC には、IPL 読み込みに致命的なバグが存在します。
2代目の PC-8801mk2 では修正されていましたので、もしかすると後期の ROM では修正されているかもしれません。

そのバグとは…

ディスクアクセスでは、読み込みに失敗した場合は2回リトライし、それでもエラーだった時は ”Disk I/O error” を発生させて処理を中止するのが通常の動作ですが、IPL の読み込みでエラーが発生した場合は、書き込みモードでリトライしてしまう。

…というものです。

たまたまディスクにゴミが付いていたりして読み込みに失敗すると、リトライ時は書き込みモードなのでメモリ上の C000H から256バイトの領域にある無意味なデータが IPL に書き込まれてしまい、それ以降は二度と起動できなくなってしまいます。


エラー処理のバグというのは見過ごされがちな部分ですが、当時は ICE とかを使ってデバグしていなかったのでしょうね。
まあ、PC-8801 の時代は BIOS という概念も未発達だったため、BIOS に重点を置いたデバグというものができなくて、全体を隈なくデバグするということは時間的にも工数的にもムリだったのでしょうが、ちょっと痛すぎます。


この事に気付いたマニア達やショップ等は、作業用のディスクと起動用のシステムディスクとを分けておき、起動用のディスクにはプロテクトシールを張って書き込みができないようにして対処していました。

たしか「PC ニュース」でも取り上げられていた記憶があるのですが、現物が手元に無いため未確認です。

また、NEC のユーザーズマニュアルやディスクメディアの商品取扱説明書等に「起動用ディスクには、必ずプロテクトシールを張ってください」という記述が目立つようになったのも、この頃ではないかと思われます。


普通は、システムディスクの原本は保存しておいてコピーした方を使うのでまだ救われていますが、ハイスコアを記録したり、途中経過を原本にセーブするようなゲームではどんな状況だったのか、非常に気になります。

「ハイスコアなんてデータ量が少ないんだから、わざわざユーザーディスクを作らなくてもゲームディスク本体にセーブすればいいじゃん」…なんて当時は考えてましたけど…。

ディスク2枚組みやユーザーディスクの作成が必要なゲームが増え始めたのと、PC-8801 の起動処理のバグには因果関係があるのでしょうかね…謎です。

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