MZ-700/1500/MZ-800/MZ-2500のSVCファンクションを比較する

Tweet

 MZ-2500にはSVCとFNCと呼ばれるファンクションコールがあります。これはそれまでのモニタサブルーチンに取って代わるもので、多くの機能がBASICインタプリタにて処理されるようになっています(そのため、BASIC以外のシステムの多くで使用できない)。モニタサブルーチンで使っていたCALL命令に代わってZ80のRST命令を利用したスマートな呼び出し方法を採っており、

RST 18H ;SVC
DB  04H ;CRT1X

と記述するとRST命令の次に配置している機能番号にもとづくサブルーチンを呼び出します。もちろんそのサブルーチンからリターンすると機能番号の次のアドレスから実行が再開されるようになっています。キャリーラボのTSモニタや、その他多数のシステムで使われている常套手段ですね。なおFNCはRST 28Hを使います。

 MZ-2500のSVC他は工学社および電波新聞社の書籍「活用研究」に掲載されていたためなんとなく見たことがあったりする人もいるのではないかと思いますが、実はMZ-1500にも同じ方法で呼び出すファンクションコールがあります(もちろんBASICインタプリタによる機能です)。これはラジオ技術社の「MZ-1500テクニカルノート」にあまり目立たない感じで掲載されており、さすがにこっちまで知ってる人は少ないのではないかと思っています。

 MZ-2500関連でいろいろ調べ物をしている最中、ふとそのことを思い出して「テクニカルノート」を確認してみたところ、なんと呼び出し方法だけでなく機能や名称・番号までほぼ同じであることがわかりました。MZ-1500をかなり流用して設計されているMZ-800についても、一部に抜けはありますがだいたい同じと考えて良さそうです。

 さらには、MZ-700用DISK BASICであるMZ-2Z009もファイルディスクリプタ使えたよな? と思い出して調べたところ、やはりSVCコールが存在しました。

 どの程度同じなのか、表にして比較してみました。

SVC no. MZ-700 MZ-1500 MZ-800 MZ-2500 
00 MONOP MONOP MONOP MONOP  
01 CR1 CR1 CR1 CR1  
02 CR2 CR2 CR2 CR2  
03 CRT1C CRT1C CRT1C CRT1C  
04 CRT1X CRT1X CRT1X CRT1X  
05 CRTMS CRTMS CRTMS CRTMS  
06 LPTOT LPTOT LPTOT LPTOT  
07 LPT1C LPT1C LPT1C LPT1C  
08 &CR &CR &CR DISP
09 &1C &1C &1C TERM
0A &1CX &1CX &1CX    
0B &MSG &MSG &MSG    
0C GETL GETL GETL GETL
OD INKEY INKEY INKEY INKEY
0E BREAK BREAK BREAK BREAK  
0F HALT HALT HALT HALT
10 DI DI DI DI
11 EI EI EI EI  
12       NEWON  
13 DEASC DEASC   DEASC
14 DEHEX DEHEX   DEHEX
15 CKHEX CKHEX   CKHEX  
16 ASCHL ASCHL   ASCHL  
17 COUNT COUNT COUNT COUNT
18 ADDP0 ADDP0   KKAN
19 ADDP1 ADDP1   JISHO
1A ADDP2 ADDP2   DIOCS
1B ERRX ERRX ERRX ERRX  
1C ?ADCN ?ADCN   KCONV
1D ?DACN ?DACN   LPTRA
1E ?PNT1 ?PNT1   ?PONT
1F   KCALL  
20 BELL BELL   BELL  
21 PLAY PLAY   PLAY  
22 SOUND   SOUND
23 MCTRL   MCTRL
24    
25 TIMRD TIMRD   ??
26 TIMST TIMST   PRT1C
27   INP1C  
28 CLRIO CLRIO   CLRIO  
29 SEGAD SEGAD    
2A OPSEG OPSEG   PWD$
2B DLSEG DLSEG   MKDIR
2C DEVNM DEVNM DEVNM DEVNM  
2D DEVFN DEVFN DEVFN DEVFN  
2E LUCHK LUCHK LUCHK LUCHK  
2F LOPEN LOPEN LOPEN LOPEN  
30 LOADF LOADF LOADF LOADF  
31 SAVEF SAVEF SAVEF SAVEF
32 VRFYF VRFYF VRFYF  
33 RWOPEN RWOPEN RWOPEN RWOPEN
34 INSTT INSTT   BGETL
35 INMSG INMSG INMSG INMSG
36 INDAT INDAT   UNPUT
37 PRSTR PRSTR PRSTR PRSTR  
38 CLKL CLKL CLKL CLKL  
39 DIR DIR DIR DIR  
3A SETDF SETDF SETDF CHDIR
3B LSALL    
3C FINIT FINIT FINIT FINIT  
3D DELET DELET   DELET
3E RENAM RENAM   RENAM  
3F LOCK LOCK   LOCK
SVC no. MZ-700 MZ-1500 MZ-800 MZ-2500 
40 RECST RECST   BRD
41 INREC INREC   FFUNC
42 PRREC PRREC   DFUNC
43 ERCVR ERCVR ERCVR ERCVR  
44 SWAP SWAP   SWAP
45 CLS CLS   CLS
46 POSCK   POSCK
47 POSSV   POSSV
48 PSET   PSET
49 LINE   LINE
4A PATTR   PATTR
4B BOX   BOX
4C PAINT   PAINT
4D CIRCLE   CIRCLE
4E POINT   POINT
4F HCPY   HCPY
50       DFKEY  
51       GINIT  
52       VIEW  
53       SCREN  
54       COLOR  
55       SVMBL  
56       HVIEW  
57       CREP  
58       GPUT  
59       GGET  
5A       PENSE  
5B       MOVE  
5C       PRI  
5D       CBLCC  
5E       CRTI  
5F       COCNV  
60       HROLL  
61        
62        
63       GRINT  
64       TINIT  
65       MSGX  
66       TMOD  
67       GPCG  
68       SPCG  
69       TGET  
6A       TSCRN  
6B       TATR  
6C       TWID  
6D       TWARE  
6E       TDARE  
6F       CMOV  
70       TCLR  
71       TSCRL  
72       CRPUT  
73       CRGET  
74       SETCG  
75       ?TEXT  
76       CURBL  
77       TSUB  
78       RS232  
79       RTC  
7A       MOUSE  
7B       IOSUB  
7C       DVCAL  
7D       FDRES  
7E       CMT  
7F       VOICE  
★ … 機能変更
△ … レジスタの使われ方(値、種類)が変更・追加されている
◎ … 名前が変わっているが機能は同じ
☆ … 機能の意味としてはあまり違わないが向上・改良されている

 MZ-1500とMZ-800は、さすがに流用の元・先の関係にあるのでレジスタの使い方などはほぼ同じですが、MZ-2500はアーキテクチャに違いがありますから、どうしてもレジスタの使い方にも差異が発生します。記号はその差異の内容を簡単に示したもので、機能自体が追加・削除されたものについての記号は省いています。

 MZ-800ではMZ-1500に比べてやたらと空欄が目立ちますが、BASIC(1Z-016)内のジャンプテーブルを見てみると何かのアドレスがあるようですので、単に参考にした資料で割愛されているだけだと思われます(BELLを試してみたら、ちゃんと鳴った)。また、MZ-800はジャンプテーブルが少しだけ大きくしてありますので、MZ-1500に対しても何か機能追加されているかもしれません。

 MZ-700はドキュメントがないので内容はほとんどが推測です。横棒の書かれた項目は実際にジャンプテーブルでも機能が割り当てられていないもので、グラフィックとサウンド関係がないことがわかります。

 なおテープBASIC(1Z-007B)にはSVCコールが存在しませんでした。これはMZ-2Z009がMZ-1500の5Z-001から派生して作られた可能性を示唆していると考えます(リリースはMZ-2Z009の方が先だが、時期的に同時に開発していたと思われるため)。

 そういった違いもあるので、アーキテクチャを超えて共通のプログラムを動かすことができるのでは? という淡い期待はしない方が良さそうなんですが、では何のためにこのページを作ったのかと言えば、それは「MZ-2500までのパソコン開発における技術的・思想的な系譜をたどれる資料になる」と考えたからなのですよね。

 MZ-2500は互換モードがスイッチで選べるということもあって、一般にはMZ-80B/2000系列の製品だと考えられています。キャラクタセットも、I/OマップもMZ-2000のものを引き継いでいますよね。しかし、スムーススクロールやグラフィックの複数プレーン同時書き込みなどのCRTCの機能はMZ-800に先行的な実装を見ることができますし、MZ-1500の第2ROM(9Z-502M)はMZ-800でより拡張された後MZ-2500のIOCSに発展したと見ることもできます。

 そしてMZ-1500/800から始まった、ファイルディスクリプタによる統一的なデバイスのアクセスに、このSVCファンクションコール…まさかMZ-1500の5Z-001をひょいっと持ってきて移植したみたいなノリではないと思いますが、詳細に見るとMZ-1500のコードそのままだったりする箇所があるのかもしれませんね。なんだかソフト的にはMZ-2500はMZ-1500の流れの先にあるかのような…。

 そうして見てみると、MZの開発が系列ごとに行われてきたみたいな、単純なものではないように思えてきます。各機種を開発するたび、直前に開発した機種に盛り込んだトピックをさらにブラッシュアップして実装する…MZ事業移管後の開発の一端を垣間見ている気分になってきませんか…?

所蔵品一覧に戻る