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

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

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

アセンブラは AS だけど***x系じゃあないよ [雑記]

2010/Sep/03 訂正

開発用の『言語』ってのは、プログラマにとっては「命」と「OS」の次に大切だ!
…なんて、誰が言ったか知りませんが…(すいません、今考えました^^;

プログラミング言語は、何かをプログラミングしようと決定した段階で、まず最初に選択する必要があるモノです。
8ビットパソコンの全盛期には、TL/1、GAME、WACS、FORM…様々な言語が開発されていました。
上に挙げたような言語は雑誌でも紹介され注目を浴びてましたし、出版社がメディアサービスを行っていたので、使ったことがある方もおられるでしょう。

そのほかにも、今で言う「統合環境」の走りのようなモノもありました。
「エディタアセンブラ」や「Zeas88」、ASCII 出版から発売された「DUAD シリーズ」等が有名どころでしょうか。




当時の開発ツールは、オブジェクトのアドレスやサイズに制約があったり、貧弱なエディタしか使えなかったりと、いまどきの便利で制約の少ない環境に慣れてしまった身にはストレス以外の何物でもありません。
「現代的なOS上で動作するエディタでソースを書き、現代的なOS上で動作するアセンブラ/コンパイラでオブジェクトを生成したい」と考えるのが普通でしょう。

エディタは使い慣れたモノを使用するとしても、困るのが開発用のツール類…特にアセンブラを工面することです。
しかし、CP/M、OS-9 といった当時8ビット機で使われていた OS で標準的に使用されていた MACRO80 や ASM09 などが今時の OS で動作するはずもありませんので、「今時の OS 上で動作する、当時使われてた CPU(Z80/6809等) 用のアセンブラ」を探す羽目になります。

最初は色々なネット上のライブラリを探してはみたのですが、なかなか「コレ!」といったよいモノが見つかりません。
それで、同類の友人に聞いたところ「複数の CPU に対応したフリーのアセンブラがある」との事で、紹介されたのが「The Macroassembler AS」。

このアセンブラの特長は、何といっても対応している CPU が豊富なこと!
PowerPC、SH7000/7600/7700、F2MC16L 等の近代的な物から、Z80、6502、6809、H8/300、8086、680x0、TMS320C2x、TMS9900、75K0、4004、果ては XA、ST6、COP8 と、聞いたことのない代物まで、よくもこれだけ集めたなあ(笑)…と言うのが正直なところです。
(ここで挙げたのはごく一部です。まだまだ山盛りあります。)

元々はドイツ人学生が PASCAL で MS-DOS 上で動作するモノとして作り始めたのが最初らしく、DPMI 版やOS/2 版まで揃っていたのですが、今は C で書き直され Win32 のコマンドシェル上で動作するモノが最新版となっていて、他の OS 用は更新が停止しています。

2010/Sep/03 訂正ここから

ちょい補足と訂正^^;

Version 1.41 の頃は何かと動作に怪しいところが在ったのですが、Version 1.42 Bld 77 ではコマンドラインオプション '-D' のバグも修正されたため、やっとソースの変更なしに複数ターゲット用のコードが生成できるようになりました\(^o^)丿 これでやっと Dash-8X が本格始動できるぞ(笑)

いつのバージョンからかは分かりませんが、’-D’ オプションの'-D XXX=ABC,YYY=DEF' 形式の値を指定したシンボル定義は出来なくなったようです。 クイックリファレンスからも、この構文は消えています。
ただ、'-D XXX,YYY' 形式のシンボル定義だけは可能です。

2010/Sep/03 訂正ここまで




別に AS を宣伝するためにこれを書いている訳ではありませんし、これまで使ったことのない機能にバグが潜んでいる可能性も十分にあります。

それでも使ってみたい方、興味のある方はこちらからどうぞ。

The Macroassembler AS Main Page

念の為に書き添えておきますと、マニュアルは英語版とドイツ語版が用意されてますが、非常に分かり辛いです。

最後にもう二つ。
Win32 用の最新版は、ファイル名が aswcurr.zip となっていてバージョン表記がありません。
そのため、ダウンロードして中身を見ないとバージョン/ビルド番号が確認できません(T_T)
また、過去のバージョンをダウンロードする手段は用意されていません。
古いバージョンに上書きしてしまうと、最新版に致命的な不具合があった場合、戻せなくなる可能性がありますので お気を付けください。

緩い繋がりと早いレスポンスについての考察 [雑記]

最近、更新が少なくてスミマセンm(_~_)m

Twitter を始めてから、緩~い繋がりの中での「井戸端会議」的な雰囲気が心地良過ぎて、こちらへの記事投稿が散漫になってしまってます。

Twitter をされている方ならお分かりかと思いますが、何気ない一言から話題が広がったり、過去に謎として放置していた問題が緩い繋がりの中で解決したり、自分の知識や経験が他の人の役に立ったり、古い知り合いの消息が分かったり…と、まあ、書き出したらキリがないのですが…^^;

blog だと、記事の本題を逸脱するようなコメントは避ける傾向にあるので、ちょっと飛躍した話は余程関連性の濃い話題でない限りは、スルーされるか萎縮しちゃいますね。
そんな、コメントに書かない(書けない)ようなどうでもいいつぶやきから結果が生み出された時は、他では味わえない喜びがあります。

blog が滞っている言い訳をつらつらと書いています(汗)が、Twitter 未経験の方で「濃~い井戸端会議」を体験してみたい方は、Twitter で RetroComPeople をフォローしてみてください。
PC-8001/8801 や美少女グラフィック、古~いゲーム等のネタには良く食いつきます^^

気が多すぎるのも問題です [近況報告]

近頃、作業がうまく進まないのは、どうやら手をつけている案件が多すぎるせいらしい…。

  • PC-6001/6601/8001/8801/9801シリーズの型番リスト
  • 上記以外のPCシリーズの型番リスト
  • PCSシリーズのソフトウェアリスト
  • PC-6001/6601/8001/8801シリーズのBASIC ROM解析
  • N/N80/N80SR/N88シリーズのBASIC コマンドリファレンス
  • Dash-80 (BASICファイル互換のプログラムローダ[N-BASIC専用])
  • Dash-8X (BASICファイル互換のプログラムローダ[多機種対応版])
  • Dash-EX (BASICファイル互換のプログラムローダ[PC-8001SR用拡張RAM版])
  • PC-DOS/88 (PC-DOSのPC-8801版)
  • Maxima-88 (N88-BASIC用ファイラ)
  • Jigsaw-88 (N88-BASIC用ディスクエディタ)
  • パソコン黎明期のゲームリスト


構想中と計画中のモノも入れると12もあるのか(苦笑)
いや、最近手をつけてなくて忘れているのまで含めたら、もっとあるだろうな(大笑)

これ以外にもブログのネタ作りとかもしてるし…OTL




最近、ブログに画像を殆どアップしていないので、ちょいとマイブームのネタをうpですw

Maxima.n88 on HidemaruEditor

作成中の N88-BASIC 用ファイラなんですが、PC-8001/8801で使われているフォントを組み込んで「秀丸」エディタで表示しています。
分かりやすいように「色分け」してますが、見た目は BASIC のスクリーンエディタにそっくりです(笑)

行番号は編集の邪魔なんで無くしてあります。
編集が終わったらマクロで行番号を振りなおして M88 で読み込めば、BASIC での開発も少しは楽になりますね。

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