MZ-1500のデバイスドライバ
(MZ-800とMZ-700の一部を含む)
MZ-1500にデバイスドライバ?
MZ-2500がHDDをサポートするために利用しているデバイスドライバと、ほぼ同じ仕組みがMZ-1500にもあるのです。いや実は話の順番が逆で、元々MZ-1500で使われていたデバイスドライバの機能がMZ-2500にも引き継がれていて、それが後からの機能追加に利用されたと説明する方がより正確でしょうか。
MZ-1500からは「ファイルディスクリプタ」が採用されました。これは現代のOSにてオープンしたデバイスを利用するための識別子としてのファイルディスクリプタ(fdとか書いたりしますね)とは違うもので、各種のデバイスをファイルのように統一的にアクセスするため、デバイスを名前で記述(discript)して取り扱っていることを示します。このファイルディスクリプタを実現するための内部的な仕組みがデバイスドライバというわけなのです。
ファイルディスクリプタはいくつかの例外を除き以後のMZシリーズに引き継がれました。デバイスドライバの副産物としてのファイルディスクリプタですから、引き継がれた先でも同様のデバイスドライバの仕組みを持つことになります。その対象はMZ-800やMZ-700にも及んでいます。
なお「デバイスドライバ」などと呼んでいますが、MS-DOS以降耳馴染んだが故に勝手にそうしているだけで当時はそんな用語などなく、「SYSTEM PROGRAM」や「MACHINE LANGUAGE」のマニュアルを見たところ「IOハンドラ」というのが正しい用語のようです。
ここはMZ-1500におけるデバイスドライバを解説する予定のページです。まだわかってないことの方が多いので暫定的な内容になっています。
標準ドライバ
シャープが標準でシステムに組み込んでいるドライバは次のとおりです。
もちろん、テープ版BASICならFDがないとかRAMファイルが装着できない機種ではRAMがないとかなど、多少の増減はあります。
ファイルディスクリプタが使用できる命令と、対応するデバイスの対照表を示します。これはMZ-1500のBASIC LANGUAGE MANUALとMZ-700のDISK BASIC マニュアルの「ファイルの入出力装置一覧表」を合体して編集したものです。
CRT KB LPT CMT RS RAM FD QD USR INIT ● ● ● ● ● DIR ● ● ● DEFAULT ● ● ● ● ● ● ● DELETE/RENAME ● ● LOAD/SAVE ● ● ● ● CHAIN ● ● ● MERGE ● ● ● WOPEN# ● ● ● ● ● ROPEN# ● ● ● ● ● XOPEN# ● SWAP ● LIST ● ● RUN ● ● ● INPUT# ● ● ● ● ● ● PRINT# ● ● ● ● ● LOCK/UNLOCK ●
原則的には、これらの命令はどのデバイスでもファイルディスクリプタを受け付けます。ただし有効な機能を持つか・実行可能かはそれぞれのデバイスの実装に依存します。
デバイステーブル
デバイスドライバは各種パラメータやサブルーチンの呼び出しアドレスを所定のフォーマットにて記述する「デバイステーブル」を持つことになっています。これはMS-DOSのデバイスドライバでいうところのデバイスヘッダに相当するものです。システムからこれがアクセス可能になっていることでそのデバイスが使用できるようになるわけです。
オフセット | サイズ | ラベル | STRM | SQR | RND | 機能 | 呼び出し元 | |||||||||||||||||||||||||||
+0 (104AH) |
2 | ZNXT | ● | ● | ● | 次のテーブルの番地。 BASICインタープリタはこのアドレスをたどってデバイスを探します。 リンクの最後のデバイスでは0000Hとします。 |
─ | |||||||||||||||||||||||||||
+2 (104CH) |
4 | ZDEVNM | ● | ● | ● | デバイス名。末端に00Hが必要です。 FDなど複数台が接続されているデバイスでは、幹の部分の名前だけを記述します。 |
─ | |||||||||||||||||||||||||||
+6 (1050H) |
1 | ZFLAG1 | ● | ● | ● | デバイスの属性。 BASIC内部はこの属性情報を見て適切な処理を選択します。 ただbit1とbit0は参照していないような…?
|
─ | |||||||||||||||||||||||||||
+7 (1051H) |
1 | ZFLAG2 | ● | ● | ● | ファイルデバイスの属性とデバイスの台数。 台数の定義は4bit(16台)のようですが、下3bitのみ参照している箇所があり、8台に制限されていると考えるべきでしょう。
|
─ | |||||||||||||||||||||||||||
+8 (1052H) |
1 | ZDIRMX | ● | ● | 記録できる最大のファイル数。
|
─ | ||||||||||||||||||||||||||||
+9 (1053H) |
2 | ZINIT | ● | ● | ● | デバイスを初期化します。パラメータが渡される場合、その処理もここで行います。
|
.FINIT | |||||||||||||||||||||||||||
+11 (1055H) |
2 | ZRO | ● | 読み出しオープン。
|
.RWOPEN | |||||||||||||||||||||||||||||
● | インフォメーションブロックを読み出し、ワークエリアに転送します。
|
.RWOPEN .DIR |
||||||||||||||||||||||||||||||||
+13 (1057H) |
2 | ZWO | ● | 出力のためのオープン。
|
.RWOPEN | |||||||||||||||||||||||||||||
● | インフォメーションブロックを書き出します。
|
.SAVEF | ||||||||||||||||||||||||||||||||
+15 (1059H) |
2 | ZCLOSE | ● | オープンしていたデバイスのクローズ処理を行います。 | .LOPEN .CLKL |
|||||||||||||||||||||||||||||
● | メディアのアクセスポインタをリセットします。 | .DIR .RENAM .RWOPEN .LOPEN .CLKL |
||||||||||||||||||||||||||||||||
● | ||||||||||||||||||||||||||||||||||
+17 (105BH) |
2 | ZKILL | ● | 破棄を伴うクローズを実行します…のはずですが、ファイルを扱うデバイスでは呼ばれることはなく、実際にはZCLOSEと同じアドレスが定義されます。 | .CLKL | |||||||||||||||||||||||||||||
ZBLK | ● | ● | シーケンシャルファイル(BSD)記録時の、1ブロックあたりのバイト数。
|
─ | ||||||||||||||||||||||||||||||
+19 (105DH) |
2 | ZINP | ● | 1文字入力。
|
.INMSG | |||||||||||||||||||||||||||||
● | シーケンシャル読み出し。
|
.INMSG .LOADF |
||||||||||||||||||||||||||||||||
● | ||||||||||||||||||||||||||||||||||
+21 (105FH) |
2 | ZOUT | ● | 1文字出力。
|
.PRSTR | |||||||||||||||||||||||||||||
● | データブロックの書き出し。
|
.PRSTR .SAVEF |
||||||||||||||||||||||||||||||||
● | ||||||||||||||||||||||||||||||||||
+23 (1061H) |
2 | ZXPOS | ● | 表示または印字位置(水平方向)の取得。
|
PRINT文 | |||||||||||||||||||||||||||||
ZDELET | ● | ファイルの削除。 | .DELET | |||||||||||||||||||||||||||||||
+25 (1063H) |
2 | ZRENAM | ● | ファイルのリネーム。ファイルデバイスにのみ有効なエントリですが、RAMファイル以外ではエラーになります。 | .RENAM | |||||||||||||||||||||||||||||
+27 (1065H) |
2 | ZFREE | ● | ディレクトリ表示用に残り容量を計算します。ファイルデバイスにのみ有効なエントリですが、RAMファイルとQD以外では呼び出されません。
|
.DIR |
表中のいくつかの項目について、注釈しておきます。
オフセットのところにある括弧書きの16進数値はワークエリアの番地です。デバイステーブルはインタープリタ内のあちこちに散在しており、デバイスの使用に先立ってZNXTに記述されたリンクを辿って適切なテーブルを探すのですが、見つかった後はこのテーブルを104AH番地に転送してフラグを確認したり飛び先アドレスを取り出したりします。
デバイスドライバ(IOハンドラ)に関するMZ-1500の情報が極端に少ない(ゼロに等しいがゼロでもない、というのは今回の調査で驚いたところ)ため、このテーブルは工学社発行の「BASIC-M25 ソースリスト」の該当部分から抜粋したものをベースにして作っています。ラベルもほとんど明らかになっていないため、かなり推測が混じっています。
STRM/SQR/RNDとある項目もBASIC-M25ソースリストからの引用です。これらはデバイスの種類を表しており、
となっています。
「呼び出し元」は各エントリがどの処理から呼ばれているか、そのSVCコール名(ひとつだけ例外でステートメント処理)を書いたものです。これの意味するところは、多くのSVCコールにおいてあらかじめ前準備として.DEVNMや.DEVFNを実行しておく必要があるということであり、その前準備の結果いくつかのワークエリアに値がセットされることになるわけです。全ての情報がレジスタ経由で渡されているわけではないので、必要であればドライバはファイル名やその他ワークエリアを参照して処理を進めることになります。
それぞれのSVCコールで設定されるワークエリアは以下の通りです。
ラベル
(アドレス)サイズ 説明 ZEQT
(1044H)2 デバイステーブルの番地 ZCH
(1046H)1 機器番号(FDなど2台以上の機器で構成されるデバイスのみ有効) ZNXT
(104AH~)27 デバイステーブル
ラベル
(アドレス)サイズ 説明 ZEQT
(1044H)2 デバイステーブルの番地 ZCH
(1046H)1 機器番号(FDなど2台以上の機器で構成されるデバイスのみ有効) ZNXT
(104AH~)27 デバイステーブル ELMD1
(1001H)17 ファイル名
.DEVNMで設定される内容がそのまま.DEVFNにあるのは、.DEVFNの処理の冒頭で.DEVNMが呼ばれているからです。
MZ-5Z001系BASICのデバイス組込み状況
ここで、MZ-5Z001に始まるMZ-700/1500/800用BASICに組み込まれているデバイスがどうなっているか、デバイステーブルとそのリンクを表にして比較してみましょう。
MZ-5Z001(MZ-1500, V1.0A)
+0 ZNXT 0A96 0C00 2841 3320 35AC 2800 2BA3 0FBF 0000 +2 ZDEVNM CRT KB LPT CMT RS RAM QD USR +6 ZFLAG1 8A 81 8A 5F 8F 5F 5F 9F +7 ZFLAG2 00 00 00 C0 03 20 40 00 +8 ZDIRMX 00 00 00 00 00 20 20 00 +9 ZINIT 3F15 00E5 0C25 285E 3339 35FA 2BC3 00E5 +11 ZRO 00E5 00E5 1FAC 28A7 336A 368F 2C02 0FD8 +13 ZWO 00E5 00E5 00E5 286C 336A 36D0 2C20 0FD8 +15 ZCLOSE 00E5 00E5 00E5 00E5 337B 3681 2BDB 00E5 +17 ZBLK/ZKILL 00E5 00E5 00E5 0100 337B 0400 0400 00E5 +19 ZINP 0AAF 0AAF 0000 28F4 338C 36BB 2C13 0FE7 +21 ZOUT 0AB7 00E5 0D66 28A0 33B7 36F7 2C2A 0FE7 +23 ZXPOS/ZDELET 0AC6 00E5 0C19 0000 00E5 3743 0000 00E5 +25 ZRENAM 0000 3770 0000 +27 ZFREE 1FAC 35C9 2BC0
QD BASICなので、サポートしないFD以外の全てのデバイスが並んでいます。RAMとQDの間に空欄がありますが、それが何だったのかは次のMZ-2Z032を見るとわかります。
00E5という値が目立ちますが、その番地にはRET命令があり、機能として無効(しかもエラー処理すらしない)の場合に使われています。事実上のダミーだと思われます。
ZRENAMとZFREEはCMTとRAMとQDにしか値が記述されていませんが、他のデバイスではその場所からプログラムが始まっており、テーブルが可変長になっているかのように実装されています。デバイス使用時にテーブルがコピーされる対象にはもちろんZFREEまで含まれていますから、この項目を持たないデバイスではプログラム部分までコピーされています。機能的に使われない項目なので問題ないのですけど、ちょっと気持ち悪いですね。
MZ-2Z032(MZ-1500, V1.0A)
+0 ZNXT 0A96 0C00 3307 3320 35AC 2FF2 330A 0FC3 0000 +2 ZDEVNM CRT KB LPT RS RAM FD USR +6 ZFLAG1 8A 81 8A 8F 5F 3F 9F +7 ZFLAG2 00 00 00 03 20 03 00 +8 ZDIRMX 00 00 00 00 20 3F 00 +9 ZINIT 3F15 00E5 0C25 3339 35FA 30F2 00E5 +11 ZRO 00E5 00E5 1FAC 336A 368F 000F 0FDC +13 ZWO 00E5 00E5 00E5 336A 36D0 0100 0FDC +15 ZCLOSE 00E5 00E5 00E5 337B 3681 0030 00E5 +17 ZBLK/ZKILL 00E5 00E5 00E5 337B 0400 00FE 00E5 +19 ZINP 0AAF 0AAF 0000 338C 36BB 316A 0FEB +21 ZOUT 0AB7 00E5 0D66 33B7 36F7 316D 0FEB +23 ZXPOS/ZDELET 0AC6 00E5 0C19 00E5 3743 1FAC 00E5 +25 ZRENAM 3770 1FAC +27 ZFREE 35C9 1FAC
リンクの並びはMZ-5Z001とそっくりですね。ただLPTの次にあったCMTが消え、RAMの次の空欄にFDが入り、USRの前のQDがなくなっています。なるほど、だからDISK BASICではQDがアクセスできないのか…。
サポートしないデバイスがなぜリンクに残っているのか不思議に思うところなのですが、おそらく起動時にデフォルトデバイスを設定する箇所を変えたくなかったから…ではないでしょうか。だとしたらかなりつまらない理由ですけど…デバイスのサポートの有無は極力「デバイスドライバ」の抜き差しで実現したいと思ったとしたなら、こういう対応も考えられると思います。
MZ-2Z009(MZ-700, V1.0A)
+0 ZNXT 0BA1 0F00 2FF7 3359 358D 38A2 0D59 0000 +2 ZDEVNM CRT KB LPT CMT RS FD QD USR +6 ZFLAG1 8A 81 8A 5F 8F 3F 5F 9F +7 ZFLAG2 00 00 00 C0 01 03 40 00 +8 ZDIRMX 00 00 00 00 00 3F 20 00 +9 ZINIT 00E5 00E5 00E5 3014 3372 368D 38C4 00E5 +11 ZRO 00E5 00E5 00E5 3064 33A4 000F 38FB 0D72 +13 ZWO 00E5 00E5 00E5 3022 33A4 0100 392A 0D72 +15 ZCLOSE 00E5 00E5 00E5 00E5 33B5 0030 38DA 00E5 +17 ZBLK/ZKILL 00E5 00E5 00E5 0100 33B5 00FE 0400 00E5 +19 ZINP 0BBA 0BBA 0000 30AA 33C6 3705 3918 0D81 +21 ZOUT 0BC5 00E5 0F27 305D 33DB 3708 3939 0D81 +23 ZXPOS/ZDELET 0BD4 00E5 0F19 1F97 00E5 1F97 1F97 00E5 +25 ZRENAM 1F97 1F97 1F97 +27 ZFREE 1F97 1F97 38C1
MZ-2Z009の発表はMZ-1500のひと月ほど前なので時系列として逆になってしまうのですが、並行して開発されていたであろうことを考えれば、こちらがMZ-5Z001の派生品と考えるのが妥当なのではないかと思います。
そういうこともあるのか、リンクの並びがRAMを除いてMZ-5Z001やMZ-2Z032と同じですね。ただこちらの場合、サポートしないRAMは空欄で残さずに詰めてあります。まぁ起動メディアにはなりませんからね…。
そして驚くべき事に、QDの欄に有効っぽい値が並んでいますよ。もちろん予想に違わず、ちゃんとQDにアクセスできてしまいます…MZ-1500用であるMZ-2Z032ではQDサポートが外されているというのに…。
MZ-5Z006(MZ-700, V1.0B)
+0 ZNXT 0BA1 0F00 2FF7 3359 358D 38A2 0D59 0000 +2 ZDEVNM CRT KB LPT CMT RS FD QD USR +6 ZFLAG1 8A 81 8A 5F 8F 3F 5F 9F +7 ZFLAG2 00 00 00 C0 01 03 40 00 +8 ZDIRMX 00 00 00 00 00 3F 20 00 +9 ZINIT 00E5 00E5 00E5 3014 3372 368D 38C2 00E5 +11 ZRO 00E5 00E5 00E5 3064 33A4 000F 3901 0D72 +13 ZWO 00E5 00E5 00E5 3022 33A4 0100 391F 0D72 +15 ZCLOSE 00E5 00E5 00E5 00E5 33B5 0030 38DA 00E5 +17 ZBLK/ZKILL 00E5 00E5 00E5 0100 33B5 00FE 0400 00E5 +19 ZINP 0BBA 0BBA 0000 30AA 33C6 3705 3912 0D81 +21 ZOUT 0BC5 00E5 0F27 305D 33DB 3708 3929 0D81 +23 ZXPOS/ZDELET 0BD4 00E5 0F19 1F97 00E5 1F97 0000 00E5 +25 ZRENAM 1F97 1F97 0000 +27 ZFREE 1F97 1F97 38BF
これは国内向けQD BASICです。FDありますね…というか、QD以外は並んでいる値が同じです。違う値でも近いものになっています。BASICのリビジョンの違いですかね…? どうもほぼ同じものがDISK版・QD版それぞれに分けて発売されていたようです。
MZ-5Z008(MZ-700, V1.0C)
+0 ZNXT 0B91 0F00 2FF7 3359 358D 38A2 0D5E 0000 +2 ZDEVNM CRT KB LPT CMT RS FD QD USR +6 ZFLAG1 8A 81 8A 5F 8F 3F 5F 9F +7 ZFLAG2 00 00 00 C0 01 03 40 00 +8 ZDIRMX 00 00 00 00 00 3F 20 00 +9 ZINIT 00E5 00E5 00E5 3014 3372 368D 38C2 00E5 +11 ZRO 00E5 00E5 00E5 3064 33A4 000F 3901 0D77 +13 ZWO 00E5 00E5 00E5 3022 33A4 0100 391F 0D77 +15 ZCLOSE 00E5 00E5 00E5 00E5 33B5 0030 38DA 00E5 +17 ZBLK/ZKILL 00E5 00E5 00E5 0100 33B5 00FE 0400 00E5 +19 ZINP 0BAA 0BAA 0000 30AA 33C6 3705 3912 0D86 +21 ZOUT 0BB5 00E5 0F27 305D 33DB 3708 3929 0D86 +23 ZXPOS/ZDELET 0BC4 00E5 0F19 1F97 00E5 1F97 0000 00E5 +25 ZRENAM 1F97 1F97 0000 +27 ZFREE 1F97 1F97 38BF
こちらは輸出用QD BASICです。MZ-800用QD BASICにMZ-700モード用として同梱されているものです。まぁ国内版とほぼ同じですね…。
1Z-016(MZ-800, V1.0A)
+0 ZNXT 0DF6 1479 375A 3C64 3EC6 3B9E 2FD0 0F7F 0000 +2 ZDEVNM CRT KB LPT CMT RS RAM QD USR +6 ZFLAG1 8A 81 8A 5F 8F 5F 5F 9F +7 ZFLAG2 00 00 00 C0 01 20 40 00 +8 ZDIRMX 00 00 00 00 00 20 20 00 +9 ZINIT 453A 00B2 14EC 3777 3C7D 3F14 2FF0 00B2 +11 ZRO 00B2 00B2 1FAC 37C0 3CAE 3FA9 302F 0F98 +13 ZWO 00B2 00B2 00B2 3785 3CAE 3FEA 304D 0F98 +15 ZCLOSE 00B2 00B2 00B2 00B2 3CBF 3F9B 3008 00B2 +17 ZBLK/ZKILL 00B2 00B2 00B2 0100 3CBF 0400 0400 00B2 +19 ZINP 0E0F 0E0F 0000 380D 3CD0 3FD5 3040 0FA7 +21 ZOUT 0E17 00B2 14B2 37B9 3CFB 4011 3057 0FA7 +23 ZXPOS/ZDELET 0E26 00B2 1492 0000 00B2 4056 0000 00B2 +25 ZRENAM 0000 4083 0000 +27 ZFREE 1FAC 3EE3 2FED
MZ-800に標準添付されるテープ版BASIC。デバイスの構成がMZ-5Z001とそっくりですね。MZ-1500もテープ版があったら似た感じになったのでしょうか。
MZ-5Z009(MZ-800, V1.0B)
+0 ZNXT 0DF6 1479 375A 3C64 3EC6 3B9E 2FD0 0F7F 0000 +2 ZDEVNM CRT KB LPT CMT RS RAM QD USR +6 ZFLAG1 8A 81 8A 5F 8F 5F 5F 9F +7 ZFLAG2 00 00 00 C0 01 20 40 00 +8 ZDIRMX 00 00 00 00 00 20 20 00 +9 ZINIT 453A 00B2 14EC 3777 3C7D 3F14 2FF0 00B2 +11 ZRO 00B2 00B2 1FAC 37C0 3CAE 3FA9 302F 0F98 +13 ZWO 00B2 00B2 00B2 3785 3CAE 3FEA 304D 0F98 +15 ZCLOSE 00B2 00B2 00B2 00B2 3CBF 3F9B 3008 00B2 +17 ZBLK/ZKILL 00B2 00B2 00B2 0100 3CBF 0400 0400 00B2 +19 ZINP 0E0F 0E0F 0000 380D 3CD0 3FD5 3040 0FA7 +21 ZOUT 0E17 00B2 14B2 37B9 3CFB 4011 3057 0FA7 +23 ZXPOS/ZDELET 0E26 00B2 1492 0000 00B2 4056 0000 00B2 +25 ZRENAM 0000 4083 0000 +27 ZFREE 1FAC 3EE3 2FED
テープ版BASICと同一かと思うほど、全く同じ値が並びます。バイナリ比較してみると同じではないんですが、リビジョンが違いますし、差異はその辺りにありそうです。同じリビジョンならほぼ完全に一致するのかも…。
MZ-2Z046(MZ-800, V1.0A)
+0 ZNXT 0DF6 1479 3AD7 3C64 3EC6 37C2 3ADA 0F7F 0000 +2 ZDEVNM CRT KB LPT RS RAM FD USR +6 ZFLAG1 8A 81 8A 8F 5F 3F 9F +7 ZFLAG2 00 00 00 01 20 03 00 +8 ZDIRMX 00 00 00 00 20 3F 00 +9 ZINIT 453A 00B2 14EC 3C7D 3F14 38C2 00B2 +11 ZRO 00B2 00B2 1FAC 3CAE 3FA9 000F 0F98 +13 ZWO 00B2 00B2 00B2 3CAE 3FEA 0100 0F98 +15 ZCLOSE 00B2 00B2 00B2 3CBF 3F9B 0030 00B2 +17 ZBLK/ZKILL 00B2 00B2 00B2 3CBF 0400 00FE 00B2 +19 ZINP 0E0F 0E0F 0000 3CD0 3FD5 393A 0FA7 +21 ZOUT 0E17 00B2 14B2 3CFB 4011 393D 0FA7 +23 ZXPOS/ZDELET 0E26 00B2 1492 00B2 4056 1FAC 00B2 +25 ZRENAM 4083 1FAC +27 ZFREE 3EE3 1FAC
DISK BASICも、MZ-2Z032と比較すると空欄になっている箇所が同じ位置になっています。同様の設計方針で作られていることが伺えます。
MZ-5Z002A/MZ-5Z002B(Text editor/Z80 assembler, MZ-700/1500, V1.0A)
MZ-5Z002D(MACHINE LANGUAGE, MZ-700/1500, V1.0A)
+0 ZNXT 0A96 0C00 3A80 3320 35AC 2FF2 3DE2 0FBF 0000 +2 ZDEVNM CRT KB LPT CMT RS RAM FD QD USR +6 ZFLAG1 8A 81 8A 5F 8F 5F 3F 5F 9F +7 ZFLAG2 00 00 00 C0 03 20 03 40 00 +8 ZDIRMX 00 00 00 00 00 20 3F 20 00 +9 ZINIT 37E7 00E5 0C25 3A9D 3339 35FA 30F2 3E02 00E5 +11 ZRO 00E5 00E5 1FAC 3AE6 336A 368F 000F 3E41 0FD8 +13 ZWO 00E5 00E5 00E5 3AAB 336A 36D0 0100 3E5F 0FD8 +15 ZCLOSE 00E5 00E5 00E5 00E5 337B 3681 0030 3E1A 00E5 +17 ZBLK/ZKILL 00E5 00E5 00E5 0100 337B 0400 00FE 0400 00E5 +19 ZINP 0AAF 0AAF 0000 3B33 338C 36BB 316A 3E52 0FE7 +21 ZOUT 0AB7 00E5 0D66 3ADF 33B7 36F7 316D 3E69 0FE7 +23 ZXPOS/ZDELET 0AC6 00E5 0C19 0000 00E5 3743 1FAC 0000 00E5 +25 ZRENAM 0000 3770 1FAC 0000 +27 ZFREE 1FAC 35C9 1FAC 3DFF
「システムプログラムでもFDにアクセスできた!」との報告を見て調べてみたら…BASICと同じデバイスのリンクが!
まぁシステムプログラムのマニュアルを見るとそれを示唆する記述があったりしますし、なによりファイルアクセスが必要なシステムソフトなら同じ仕組みの上で動いていて当然ですよね。
テーブルの内容はMZ-5Z001とほぼ同じで、そしてなんとRAMもCMTもQDもFDもあるフルコース仕様ですよ。BASICでこうなって欲しかった…(フリーエリアがますます減りそうですが)。
MZ-5Z002C(Symbolic Debugger, MZ-700/1500, V1.0B)
+0 ZNXT 0A96 0C00 3A9A 3320 35AC 2FF2 3DE2 0FBF 0000 +2 ZDEVNM CRT KB LPT CMT RS RAM FD QD USR +6 ZFLAG1 8A 81 8A 5F 8F 5F 3F 5F 9F +7 ZFLAG2 00 00 00 C0 03 20 03 40 00 +8 ZDIRMX 00 00 00 00 00 20 3F 20 00 +9 ZINIT 37E7 00E5 0C25 3AB7 3339 35FA 30F2 3E1C 00E5 +11 ZRO 00E5 00E5 1FAC 3B00 336A 368F 000F 3E5B 0FD8 +13 ZWO 00E5 00E5 00E5 3AC5 336A 36D0 0100 3E79 0FD8 +15 ZCLOSE 00E5 00E5 00E5 00E5 337B 3681 0030 3E34 00E5 +17 ZBLK/ZKILL 00E5 00E5 00E5 0100 337B 0400 00FE 0400 00E5 +19 ZINP 0AAF 0AAF 0000 3B4D 338C 36BB 316A 3E6C 0FE7 +21 ZOUT 0AB7 00E5 0D66 3AF9 33B7 36F7 316D 3E83 0FE7 +23 ZXPOS/ZDELET 0AC6 00E5 0C19 0000 00E5 3743 1FAC 0000 00E5 +25 ZRENAM 0000 3770 1FAC 0000 +27 ZFREE 1FAC 35C9 1FAC 3E19
システムプログラムのうち、デバッガだけちょっとテーブルの値が違います。3800Hあたりに何か追加されてるんでしょうか、後の方のアドレスがずれてます。
以上のように比べてみるとデバイスの構成、特に並びであるとか、サポートしないのに場所だけ確保されたりとかいう特徴も含めて全て一つのソースを祖先に持つプログラムになっているように思います。しかも、テープ版・QD版・DISK版というバリエーションが派生ではなく同じソースから一度に作られていたとも推測できます。
デバイスドライバという思想は開発の効率化をもたらした、または効率化のために考案されたのがデバイスドライバなのかもしれません。