SSブログ
パソコン ブログトップ
前の5件 | -

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 の起動処理のバグには因果関係があるのでしょうかね…謎です。

幻のPC-8001用2HDドライブ [パソコン]

PC-8001 でディスクドライブが接続されているシステムで、ディスクから読み込みを行わずに ROM BASIC を起動するテクニックとして、「ESC 」キー + Reset という手法が知られています。

N-BASIC は、起動処理の途中でディスクドライブの接続状態を調べ、接続されていれば IPL を読み込むという処理をするのですが、「ESC 」キーが押下されていないとコントロールポート FFH が、押下されているとコントロールポート FBH が選択されるようになっています。
このとき選択されたポート番号はワークエリアに格納され、ディスクサブシステムとのハンドシェークルーチンはこの値を参照して出力先を決定しています。




PC-8001 / PC-8801 シリーズでは、ポート FCH - FFH は 5″2D ドライブとのハンドシェークに使用されていますが、PC-8801 シリーズでは ポート F8H - FBH は 5″2HD DMA ドライブの制御用に割り当てられています。

ただ、このことから PC-8001 に 5″2HD を接続する事を考えていたと考えるのは乱暴です。
電電公社フォーマットとして知られる 5″2HD ですが、PC-8001 が発売された 1979 年当時に、標準的な規格として存在していたのは、8″1S/2S/2D と 5″1S/1D だけでしたし、国産で 5″2HD 搭載PCが発売されたのは、PC-8001 の発売から5年後の 1984 年 2 月発売の「富士通 FM-11 BS/AD2」が最初ではないかと思います。

ちなみに NEC のパソコンでは、同じ 1984 年 11 月に発売された PC-9801 M が、PC-8801 シリーズでは 1985 年 11 月発売の PC-8801 mkII MR が、5″2HD を搭載したシリーズ初のモデルです。
また、1981 年 7 月発売のオフコン N5200 シリーズの初代機 N5200/05 (オーファイブと呼ばれてました)には 8″2D ドライブが2基搭載されていました。




このことから考えると、PC-8001 には 8″2D を 5″1D/2D と同じようにインテリジェントドライブとして接続する予定だったのだと思われます。

PC-8001 用には 8″2D ドライブは発売されませんでしたが、もしかしたら PC-100 の 5″2D ドライブを 2DD ドライブに換装したユーザーが居たように、PC-8001 に 8″2D を繋げる事に成功した方が居たかもしれませんね。

PC-8001 Disk-BASIC と起動処理 [パソコン]

PC-8001 Disk-BASIC 用のシステムディスクには複数のバージョンがあります。

一番古いものは、
DISK VERSION
と、表示されます。
これは PC-8031 用に用意された 1D のシステムディスクです。

次のバージョンは、
Disk version [14-Nov-1980]
と、表示されます。
これは旧バージョンのバグフィックス版だと思われます。

上記の2つのバージョンは同じ型番(PC-8034)が付けられているので、注意が必要です。


PC-8031-2W 用に用意されたものは、
Two surface disk version [20-Sep-1981]
と、表示されます。
型番は、PC-8034-2W で、2D のシステムディスクです。


他にも、PC-8034-1V 等のシステムディスクがありますが、当方では未確認ですm(_^_)m




PC-8034 (DISK VERSION または Disk Version [14-Nov-1980] と表示されるもの)では IPL は1セクタですが、PC-8034-2W (Two surface disk version [20-Sep-1981] と表示されるもの)では2セクタになっています。
これは、PC-8031-2W が高速転送に対応したため、IPL でもこれに対応するルーチンを用意しているのと、オートスタート処理のためのルーチンが追加されているためです。




1D ドライブが搭載されているディスクユニット(PC-8031 / PC8031-1W / PC-8031-1V)が接続されているシステムで PC-8034-2W 等の 2D 用のシステムディスクを使用して起動すると「NON DISK BASIC」というエラーメッセージが表示され ROM BASIC が起動します。
この場合、Disk-BASIC の機能は使用できません。

逆に、2D ドライブが搭載されているディスクユニット(PC-8031-2W / PC80S31)が接続されているシステムで PC-8034 等の 1D 用のシステムディスクを使用して起動すると、PC-8031-2W 以降の機種で拡張された機能にシステムディスクが対応していないため、高速転送は使用できません。
また、1D 以外のフロッピーには読み書きができません。(自分でプログラムを用意すればできますが…)




N-BASIC の、いわゆる ROM BASIC の初期化処理は IPL 起動用のフックはあるものの、Disk-BASIC での使用を前提にした構造になっていません。

拡張 ROM が装備されている場合と、「パッチ当て」のため、途中に CALL 命令によるサブルーチン呼び出しはありますが分岐は無く 、いわゆる「一本道」の処理になっています。

そのため、IPL が行う Disk-BASIC の初期化は、

DIsk-BASIC 本体の読み込み → 文字列スタックの初期化 →
ファイルバッファの初期化拡張命令用フックの再設定
文字列領域の確保 → インタラプトベクタの初期化 → タイトル表示 →
RS-232C の初期化 → (オートスタート処理) → コマンド待ち

という ROM BASIC と共通する初期化と Disk-BASIC の初期化が混在する、ややこしい手順を踏んで処理されています。 (ROM BASIC / Disk-BASIC 共にハードウェアの初期化が BASIC の初期化よりも後にあるとか、この処理順序には首を傾げてしまいますが…。)

前述の通り ROM BASIC の初期化は「一本道」の処理なので、共通する処理をサブルーチンコールで済ませる訳にはいかず、ROM 内の処理と同じものが IPL の中に現れる事になります。

余談になりますが、PC-8801 に搭載されている N88-BASIC では、ROM BASIC でもファイルシステムが機能として装備されているのと、ユーティリティルーチンのモジュール化が進んだため、N88-Disk BASIC の IPL は Disk-BASIC よりも単純な構造になっています。

せっかく用意したルーチンが汎用性がないため使用できなくなるのは、これに限った事ではありません。
PC-8801 でも 'CHAIN' コマンドに対応していないため使用されないままに終わった BASIC コードの読み込みルーチンが ROM 内に存在しますね(笑)

タグ:PC-8001 N-BASIC

Undocumented PC-8801 【追記あり】 [パソコン]

ううっ、またまた更新が滞ってまして、スミマセン。

Dash-80 version 1.0 で実装できなかったセーブ機能をゴリゴリ&ガリガリと書いております。

今回は、前回の「Undocumented PC-8001 / 8801」で書き漏らした事をちょこっと追加です。




テキストウィンドウ

PC-8801 シリーズには、BASIC ROM の裏バンクに存在する BASIC Text RAM にアクセスするための「テキストウィンドウ」が 8000H - 83FFH 番地にあります。
ポート 70H にメモリ上位アドレスを出力すると、BASIC Text RAM がテキストウィンドウに現れ、アクセスできるようになっています。
例えば、ポート 70H に 10H を出力すれば、テキストウィンドウには BASIC Text RAM の 1000H - 13FFH 番地が現れ、8000H 番地に書き込みをすれば、1000H 番地に書き込まれます。

では、ポート 70H にテキストウィンドウのアドレスである 80H を出力すればどうなるでしょう?

正解は、「Main RAM が現れる」です。

通常はテキストウィンドウがあるためアクセスできない、テキストウィンドウの裏バンクになってしまった Main RAM が現れます。
要するに、テキストウィンドウを無効にするには 80H を出力すればいいということです。




Text V-RAM

PC-8801mkIISR 以降の機種には F000H - FFFFH 番地に「Text V-RAM」が搭載されています。
通常の RAM には読み書き用のポートが一つしかないので、画面表示を行うため DMA が Main RAM 上の V-RAM エリアにアクセスしている間は CPU が停止させられてしまいます。
それ故、実行速度が遅いという PC-8801 / 8801mkII の欠点を補うために V2 モード専用として追加されました。
デュアルポート RAM を使用した専用のText V-RAM を V-RAM エリアとして使用することで、DMA がアクセス中でも CPU は停止させられることは無くなりました。

では、Text V-RAM を無効にせずに Main RAM 上の F000H - FFFFH にアクセスするにはどうすればよいでしょう?

正解は、「テキストウィンドウを使う」です。

テキストウィンドウは BASIC Text RAM と Main RAM 上にマッピングされているため、V2 モードでポート 70H に F0H を出力すれば、テキストウィンドウに Main RAM の F000H - F3FFH が現れます。
テキストウィンドウを使用すれば、Text V-RAM に隠されていて使えない Main RAM も有効に活用できます。


追記ここから



リセット動作 #1

PC-8801 シリーズの PC-8801mkII FR/MR までの機種には、ディップスイッチが搭載されており、パワーオン/リセット時に起動する BASIC を N-BASIC / N88-BASIC の2つから選択できるようになっています。

では、起動後にディップスイッチを切り換えたらどうなるでしょう?
(PC-8801 FH/MH 以降はメモリスイッチなので、この質問には該当しません)

正解は、「何も起こらない」です。

ディップスイッチは、スイッチに設定された値を読み取ることだけしかできません。
(メモリスイッチの値は起動時にセットアップ画面から変更が可能です)
パワーオン/リセット時には、まず N88-BASIC ROM が選択されて起動し、システム初期化の前段階でディップスイッチ/メモリスイッチの値を読み取っています。
ディップスイッチ/メモリスイッチで N-BASIC が選択されていると、ROM 切り換えルーチンを RAM にコピーして呼び出し、そのルーチン内で N-BASIC ROM へ切り換えて 0 番地へジャンプします。




リセット動作 #2

前項での記述どおり PC-8801 シリーズでは、パワーオン/リセット直後は必ず N88-BASIC ROM が選択されているのですが、ディップスイッチ/メモリスイッチの値を読み取る前に 'STOP ' キー押下のチェックが行われます。
'STOP' キーが押されていればホットスタートルーチンへ、押されていなければコールドスタートルーチンへ分岐し、そこで BASIC モードのチェックが行われます。

ディップスイッチで N-BASIC が選択されていた場合のホットスタート処理では、ROM の切り換えを行った後 N-BASIC ROM 内のホットスタートルーチンのエントリアドレス 006AH へジャンプしなければならないはずですが、不思議なことに 0066H へジャンプするようコーディングされています。
PC-8801mkII FR/MR までの機種では、0066H から 0069H まで NOP が並んでいるだけなので実害は全くないのですが…。

PC-8801 FH/MH 以降の機種では、0063H から 0069H まで USART のステータスチェックサブルーチンになっています。 製品仕様から N-BASIC が外れた為、メモリスイッチで N-BASIC を選択できないので、間違ってこのルーチンが呼び出されることはないのですが、なぜ 0066H なのか、まったくもって謎です。

0066H は Z80 では NMI 処理のエントリですが、PC-8801 シリーズでは NMI 使ってませんから……残念!

追記ここまで

タグ:PC-8801
前の5件 | - パソコン ブログトップ

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