MZ-1500のデバイスドライバ
(MZ-800とMZ-700の一部を含む)

Tweet

MZ-1500にデバイスドライバ?

 MZ-2500がHDDをサポートするために利用しているデバイスドライバと、ほぼ同じ仕組みがMZ-1500にもあるのです。いや実は話の順番が逆で、元々MZ-1500で使われていたデバイスドライバの機能がMZ-2500にも引き継がれていて、それが後からの機能追加に利用されたと説明する方がより正確でしょうか。

 MZ-1500からは「ファイルディスクリプタ」が採用されました。これは現代のOSにてオープンしたデバイスを利用するための識別子としてのファイルディスクリプタ(fdとか書いたりしますね)とは違うもので、各種のデバイスをファイルのように統一的にアクセスするため、デバイスを名前で記述(discript)して取り扱っていることを示します。このファイルディスクリプタを実現するための内部的な仕組みがデバイスドライバというわけなのです。

 ファイルディスクリプタはいくつかの例外を除き以後のMZシリーズに引き継がれました。デバイスドライバの副産物としてのファイルディスクリプタですから、引き継がれた先でも同様のデバイスドライバの仕組みを持つことになります。その対象はMZ-800MZ-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は参照していないような…?
bit 0 1
7 ファイルデバイス ストリームデバイス
6 ランダムアクセス シーケンシャルアクセス
5 CMT/QDフォーマット FDフォーマット
4 デバイス名のみでオープン オープン時にファイル名/パラメータが必要
3 1文字出力 文字列出力
2 1文字入力 文字列入力
1 出力機能なし 出力可能なデバイス
0 入力機能なし 入力可能なデバイス
+7
(1051H)
1 ZFLAG2 ファイルデバイスの属性とデバイスの台数。
台数の定義は4bit(16台)のようですが、下3bitのみ参照している箇所があり、8台に制限されていると考えるべきでしょう。
bit 0 1
7 QDおよびRAMデバイス
●オープン時のファイル名は必須
●ベリファイ不要
CMTデバイス
●オープン時にファイル名を省略可
●ベリファイ実行可
6 RAMおよびFDデバイス
●ファイルを複数オープン可能
CMTおよびQDデバイス
●ファイルをオープンできるのはひとつだけ
5 FDデバイス
●複数のファイルを書き込みでオープン可能
RAMデバイス
●ファイルを書き込みオープンできるのはひとつだけ
(CMTとQDデバイスではチェックされない)
4 BSDファイル読み込みエラー発生時
エラーメッセージを出さない
BSDファイル読み込みエラー発生時
エラーメッセージ(Out of file)を出す 
3 台数
2
1
0
+8
(1052H)
1 ZDIRMX   記録できる最大のファイル数。
RAM 32
QD 32
FD 63
+9
(1053H)
2 ZINIT デバイスを初期化します。パラメータが渡される場合、その処理もここで行います。
入力 HL 初期化文字列の先頭アドレス。文字列の末尾は00H。
.FINIT
+11
(1055H)
2 ZRO     読み出しオープン。
入力 HL ELMD(1000H)
.RWOPEN
    インフォメーションブロックを読み出し、ワークエリアに転送します。
入力 HL インフォメーションブロックの読み込み先
出力 CF 1でエラー発生
.RWOPEN
.DIR
+13
(1057H)
2 ZWO     出力のためのオープン。
入力 HL ELMD(1000H)
.RWOPEN
    インフォメーションブロックを書き出します。
入力 IY ELMD(1000H)
.SAVEF
+15
(1059H)
2 ZCLOSE     オープンしていたデバイスのクローズ処理を行います。 .LOPEN
.CLKL
    メディアのアクセスポインタをリセットします。 .DIR
.RENAM
.RWOPEN
.LOPEN
.CLKL
       
+17
(105BH)
2 ZKILL     破棄を伴うクローズを実行します…のはずですが、ファイルを扱うデバイスでは呼ばれることはなく、実際にはZCLOSEと同じアドレスが定義されます。 .CLKL
ZBLK   シーケンシャルファイル(BSD)記録時の、1ブロックあたりのバイト数。
CMT 256
RAM 1024
QD 1024
FD 254
+19
(105DH)
2 ZINP     1文字入力。
出力 CF 1でエラー発生
A CY=0なら入力した文字
CY=1ならエラー表示して止めたい場合はエラーコード、0で内部通知のみ
.INMSG
    シーケンシャル読み出し。
入力 HL 読み出したデータを書き込むアドレス
BC 読み出しサイズ
IY ELMD(1000H)
.INMSG
.LOADF
       
+21
(105FH)
2 ZOUT     1文字出力。
入力 A 出力する文字
出力 CF 1でエラー発生
A エラー表示して止めたい場合はエラーコード、0で内部通知のみ
.PRSTR
    データブロックの書き出し。
入力 HL 書き込むデータの先頭アドレス
BC 書き込みサイズ
.PRSTR
.SAVEF
       
+23
(1061H)
2 ZXPOS     表示または印字位置(水平方向)の取得。
出力 A 表示または印字位置
PRINT文
ZDELET     ファイルの削除。 .DELET
+25
(1063H)
2 ZRENAM     ファイルのリネーム。ファイルデバイスにのみ有効なエントリですが、RAMファイル以外ではエラーになります。 .RENAM
+27
(1065H)
2 ZFREE     ディレクトリ表示用に残り容量を計算します。ファイルデバイスにのみ有効なエントリですが、RAMファイルとQD以外では呼び出されません。
出力 BC 残り容量(KB単位)
CF 1にしてリターンすると残り容量表示をしない
.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版というバリエーションが派生ではなく同じソースから一度に作られていたとも推測できます。

 デバイスドライバという思想は開発の効率化をもたらした、または効率化のために考案されたのがデバイスドライバなのかもしれません。

所蔵品一覧に戻る