第14章
インクルード・ファイル
Tataraには、MSXのための名前を集めた9つのインクルード・ファイルが付いています。MSX-DOS2のファンクションとエラー・コード、BIOSとサブROMのエントリー・ポイント、フック、システム・ワーク・エリア、I/Oポート、拡張BIOS、制御コードです。3章でこれらをA:\TATARA\INCLUDEに置き、13章でINCLUDEがそれらをどう見つけるかを説明しました。この章では、それぞれのファイルに何が入っているか、取り込む前に知っておくべきことを説明します。付録Kでは、それぞれのファイルをまとめ、その中身を説明している本を挙げます。
14.1 ファイルの中身
表14.1に9つのファイルを示します。全部で903の名前と、MSXDOS.INCにある1つのマクロsystemが入っています。
| ファイル | 内容 |
名前の数 |
| ASCII.INC | 制御コード |
37 |
| BIOS.INC | メインROMのエントリー・ポイント |
92 |
| ERRORS.INC | MSX-DOSとMSX-DOS2のエラー・コード |
76 |
| EXTBIO.INC | 拡張BIOSと、MSX-MUSICのFM BIOS |
85 |
| HOOKS.INC | フック | 117 |
| MSXDOS.INC | MSX-DOSのファンクション番号と、systemマクロ |
93 |
| PORTS.INC | I/Oポート |
56 |
| SUBROM.INC | サブROMのエントリー・ポイント |
36 |
| WORKAREA.INC | システム・ワーク・エリア |
311 |
名前は、MSXの資料で使われているもの、つまりMSX Datapackの綴りのとおりです。そのため、ソースの中の名前は、本やほかのプログラムのリストの名前と同じになります。例外は、MSXにI/Oポートの標準の名前がないためのPORTS.INCと、SUBROM.INCとEXTBIO.INCの接頭辞です(14.4節、14.6節)。
マクロを除けば、名前はすべてEQUです。EQUは名前に値を与えるだけで、プログラムには何も置きません。そのため、ファイルを取り込んでも増えるのは名前だけで、バイトは増えません。9つのファイルをすべて取り込み、retを1つだけ書いたソースは、やはり1バイトです。
A:\>tanren /o:nocost.com nocost.tro Tatara MSX Linker v1.2.0 Copyright (C) 2026 Javier Lavandeira https://tatara.tools 1 modules, 5 records, ends at EOF. Wrote NOCOST.COM, 0100-0100 (1 bytes).
それぞれのファイルの最初には、中身の使い方を説明するコメントがあり、それぞれの名前には、それが何かを示す1行のコメントがあります。BIOSのルーチンやMSX-DOS2のファンクションがレジスターに何を必要とし、何を返すかは、MSXの本に書かれています。ファイルにもこのマニュアルにも、それは繰り返していません。
14.2 取り込み方
4章と同じように、ファイルを名前で取り込みます。
include msxdos.inc
取り込んだファイルの名前は、ソースの名前になります。自分のラベルに、それらと同じ名前は付けられません。BEEPがBIOSのエントリーであるBIOS.INCを取り込んだソースにbeep:と書くと、TATARAは止まります。
CLASH.AS(4): ERROR: this name already has a value.
ソースで使うファイルだけを取り込めば、必要のない名前とぶつかることはありません。
名前だけのファイルは、1つのソースの中でも、プログラムのすべてのモジュールでも、何回でも取り込めます。それぞれの名前にもう一度同じ値が与えられるだけだからです(13章)。
名前は大文字で書かれています。TATARAは、/Cオプションを付けない限り大文字と小文字を区別しないので(7章)、ld a,(linl40)はld a,(LINL40)と同じです。/Cを付けるときは、ファイルに書かれているとおりに名前を書いてください。
CASEC.AS(4): ERROR: undefined symbol in an expression.
14.3 MSXDOS.INCとsystemマクロ
MSXDOS.INCには、MSX-DOSのファンクション番号が、MSX-DOS2の資料と同じ下線付きの名前で入っています。_STROUTや_TERM0などです。また、プログラムがファンクションを呼ぶアドレス0005hの名前BDOSも入っています。
プログラムは、ファンクション番号をCに、ファンクションが必要とするほかの値をほかのレジスターに入れて、BDOSを呼びます。systemマクロは、このうち最初と最後を1行で行います。
start: ld de,msg system _STROUT system _TERM0 msg: db 'Printed with system.',13,10,'$'
リスティングを見ると、TATARAがそれぞれのsystemの行から何を作るかがわかります。マクロの2つの命令で、それぞれに+の印が付いています。
0000' 11 0D 00 start: ld de,msg system _STROUT 0003' 0E 09 + ld c,_STROUT 0005' CD 05 00 + call BDOS system _TERM0 0008' 0E 00 + ld c,_TERM0 000A' CD 05 00 + call BDOS
systemは、Cと、ファンクション自身が変えるものを変えます。呼ぶのは必ず0005hで、これはMSX-DOSの.COMプログラムには正しいアドレスです。Disk BASICの下で動くプログラムや、カートリッジから動くプログラムは、0F37Dhでファンクションを呼ぶので、自分で呼び出しを書かなければなりません。
31hより小さいファンクションはMSX-DOS1にもあります。31h以上のファンクションにはMSX-DOS2が必要です。
14.4 BIOS.INCとSUBROM.INC
BIOS.INCには、メインROMのエントリー・ポイントがアドレス順に入っています。
警告. MSX-DOSの下では、0000hから3FFFhまでにメインROMはありません。このページはRAMです。そのため、.COMプログラムからBIOSのエントリーをふつうにcallしても、BIOSには届きません。例外は、MSX-DOSが同じアドレスに用意している5つのエントリーです。RDSLT、WRSLT、CALSLT、ENASLT、CALLFです。それ以外のエントリーには、CALSLTを使ったスロット間コール(inter-slot call)が必要です。
CALSLTは、呼ぶルーチンのスロットをIYの上位バイトに、そのアドレスをIXに受け取ります。メインROMのスロットは、ワーク・エリアにあるEXPTBLの最初のバイトなので、ld iy,(EXPTBL-1)でIYの上位バイトに入ります。次のプログラムは、ブザーを鳴らしてから、CHPUTで1文字ずつ1行を表示します。
include msxdos.inc include bios.inc include workarea.inc cseg start: ld iy,(EXPTBL-1) ; the MAIN ROM slot, into IYh ld ix,BEEP call CALSLT ld hl,msg next: ld a,(hl) or a jr z,done push hl ld iy,(EXPTBL-1) ld ix,CHPUT call CALSLT pop hl inc hl jr next done: ei system _TERM0 msg: db 'Printed by the BIOS.',13,10,0 end start
A:\>bioscall Printed by the BIOS.
最後のeiは割り込みを有効に戻します。スロット間コールのあとは、割り込みが禁止されたままになるからです。
SUBROM.INCには、MSX2で加わったサブROMのエントリー・ポイントが入っています。サブROMは、メインROMの名前のいくつかを、別のアドレスの別のルーチンに使っています。たとえばGRPPRTは、メインROMでは 008Dh、サブROMでは0089hです。そのため、SUBROM.INCの名前はすべてSUBROM_GRPPRTのようにSUBROM_で始まり、2つのファイルを一緒に取り込めるようになっています。
サブROMのルーチンは、アドレスをIXに入れて、BIOSのエントリーEXTROMを通して呼びます。
ld ix,SUBROM_REDCLK call EXTROM
これは、Disk BASICやカートリッジからの呼び方です。MSX-DOSからはもっと面倒です。EXTROM自身がBIOSのエントリーなのでCALSLTを通して呼ぶことになりますが、CALSLTは呼ぶアドレスにIXを使うため、サブROMのアドレスをIXに入れてEXTROMに渡すことができないからです。その回避方法は、BIOS.INCのEXTROMのあとのコメントに書かれています。
14.5 ERRORS.INC
ERRORS.INCには、MSX-DOSとMSX-DOS2のエラー・コードが入っています。名前は、MSX-DOS2の資料と同じようにドットで始まります。.NOFILは0D7h、「File not found」です。名前にはドットを使えます(7章)。コードは0FFhから下に向かって数えるので、このファイルだけは、ほかと違って降順に並んでいます。
40h以上のMSX-DOS2のファンクションは、エラー・コードをAに返し、成功したときは0を返します。呼び出しのすぐあとのjr nzでエラーを捕まえられます。そのあと、プログラムはファンクション_TERMでコードをMSX-DOS2に渡すことができます。_TERMはプログラムを終わらせ、そのコードのメッセージを表示します。次のプログラムは、存在しないファイルを開こうとします。
include msxdos.inc cseg start: ld de,name xor a ; open mode 0 system _OPEN jr nz,failed ; A is the error code system _TERM0 failed: ld b,a system _TERM name: db 'NOTHERE.TXT',0 end start
A:\>openerr *** File not found
特定のエラーを調べるには、cp .NOFILのように、Aをその名前と比べます。
14.6 そのほかのファイル
14.6.1 HOOKS.INC
フック(hook)は、システムが決まったときに呼ぶ、RAMの 5バイトです。たとえばH.TIMIは、タイマー割り込みのたびに、1秒に50回か60回呼ばれます。使われていないフックにはretが入っています。フックを使うプログラムは、まずその5バイトを保存し、代わりに自分のルーチンへのジャンプを書き込み、終わる前に5バイトを元に戻します。終わったプログラムを指したままのフックは、次に呼ばれたときに MSXを暴走させます。
2つのフックには、MSX-MIDIが名前を付け直したため、それぞれ2つの名前があります。H.ONKOとH.MDINはどちらも0FF75h、H.FRQIとH.MDTMはどちらも0FF93hです。これは同じ5バイトで、4つのフックではありません。
14.6.2 WORKAREA.INC
ワーク・エリア(work area)は、システムが変数を置いている、0F323hから上のRAMです。WORKAREA.INCでは、それぞれのコメントの最初の数字が変数のバイト数です。1バイトの変数はld a,(LINL40)で、2バイトの変数はld hl,(...)で読みます。サイズを取り違えて読むと、ほぼ正しい、しかし間違った答えが返ります。
14.6.3 PORTS.INC
MSXにはI/Oポートの標準の名前がないので、ポートの名前はTatara独自のものです。ポートの名前はすべてIO_で始まり(ポート099hはIO_VDPCMDなど)、先頭の0を含めて3桁の16進数で書かれています。
14.6.4 EXTBIO.INC
拡張BIOS(extended BIOS)は、MSX-DOS2自身のマッパー・ルーチンやMSX-MIDIのように、カートリッジが提供するルーチンをプログラムが見つけるためのしくみです。名前は、EXTBIO_DOS2_DEVICEのようにEXTBIO_とデバイスの名前で始まります。資料にあるINITやEOFのような名前のままでは、たいていのプログラムの名前とぶつかってしまうからです。拡張BIOSの呼び方は、ファイルの最初のコメントで説明されています。
14.6.5 ASCII.INC
CHR_NULからCHR_DELまでの制御コードと、MSXがそれぞれをどう扱うかです。ほかのファイルと違って値は10進数です。文字コードは、db 13,10のように10進数で書くことが多いからです。CHR_CRは 13、CHR_LFは10です。