Tatara

第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
表 14.1: インクルード・ファイル

名前は、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です。