Tatara

第7章
名前

プログラムには名前(name)がたくさん出てきます。ラベル、EQUで定義した値、マクロ、セグメントなどです。2章ではこれらをシンボルと呼びました。それぞれの種類の名前がどのように値を持つかは、12章で説明します。この章では、名前の書き方を説明します。使える文字、長さ、大文字と小文字を区別するかどうか、そして避けたほうがよい名前です。

7.1 名前に使える文字

名前は、表7.1の文字を好きな順に並べて作ります。ただし、数字で始めることはできません。

文字
A~Z、a~z 英字
0~9 数字(先頭には使えない)
? @ . _ $ そのほかの5つの文字
表 7.1: 名前に使える文字

これはM80で使える文字と同じです。次のソースの4つの名前は、どれもふつうのラベルです。

        cseg 
?tmp:           nop 
@loop:          nop 
my.name:        nop 
a_b$c:          nop
 

M80が受け付ける名前のうち、IXH、IXL、IYH、IYLの 4つは、レジスターなのでTATARAでは名前に使えません(9.5節)。

ラベルにこれ以外の文字があると、TATARAはa name may hold only letters, digits, ? @ . _ and the dollar sign.で止まります。

多くのプログラムで使われているのはアンダースコアで、長い名前の単語をつなぐのに使います。たとえばprint_stringです。ほかの文字も使えますが、my.nameやa_b$cは名前以外のものと読み違えられることがあるので、サンプルでは使っていません。

数字で始まる語は数です(8章)。TATARAは1st:をラベルとして受け付けますが、それを参照することはできません。jp 1stは1stを書き方の誤った数として読み、次のように表示して止まります。

DIGIT2.AS(3): ERROR: bad expression.
 

7.2 長さ

シンボル、つまりラベルやEQU、DEFLで定義した値の名前は255文字まで書くことができ、すべての文字が意味を持ちます。最後の 1文字だけが違う2つの名前は、別々のシンボルです。次のソースはサンプルNAMES(31章)の一部で、最後の5文字だけが違う 2つのシンボルを定義しています。

first_pass_symbol_table_high_water_mark_in_bytes        defl    1024 
first_pass_symbol_table_high_water_mark_in_words        defl    512
 

M80は名前の最初の6文字しか区別しませんでした。CP/M時代のプログラムの多くがPRTSTRのような略語で書かれているのは、そのためです。TATARAでは、略語を使う必要はありません。

シンボルの名前はオブジェクト・ファイルの中でも長さがそのまま保たれます。そのため、あるモジュールのパブリックな名前と、別のモジュールで外部として宣言した同じ名前は、TANRENがリンクするときに全体で照合されます(2章)。

注.  ソースの1行も255文字までなので(6章)、255文字の名前はそれだけで1行を使い切り、コロンを付ける余地もありません。命令のあとに書く名前は、さらに短くなります。タブ、jp、タブのあとに残るのは251文字です。どんなプログラムでも、数十文字の名前があれば十分です。

マクロ、セグメント、グループの名前はもっと短くなります。マクロの名前は 64文字まで、セグメントやグループの名前(10章)は16文字までです。それより長い名前は、切り詰められるのではなく、次のどちらかのメッセージで拒否されます。

7.3 大文字と小文字

M80と同じように、名前はふつう大文字と小文字を区別しません。Counter、counter、COUNTERは同じ名前です。/Cオプション(5章)を付けると、これらは 3つの別々の名前になります。

/Cが影響するのは、自分で付けた名前だけです。命令、レジスター、疑似命令は、/Cの有無にかかわらず、大文字でも小文字でも書けます(6章)。

サンプルNAMESで、その違いを確かめられます。このサンプルは、大文字と小文字だけが違う2つのシンボルを、名前に新しい値を与え直せるDEFLで定義しています。

; NAMES.AS - names as long as you like, in either case. 
; 
; A SYMBOL MAY BE 255 CHARACTERS AND ALL OF THEM COUNT. M80 keeps the 
; first six, which is why so much CP/M-era assembly is written in 
; abbreviations. The two names below differ only in their last five 
; characters and are two different symbols here. 255 is the limit, and 
; the test suite has a 240-character name in it; these are 48, which is 
; as long as a line can carry and still be read on an MSX screen. 
 
first_pass_symbol_table_high_water_mark_in_bytes        defl    1024 
first_pass_symbol_table_high_water_mark_in_words        defl    512 
 
; THE SAME SIX LETTERS IN TWO CASES. Without /C they are ONE symbol, 
; and the second line changes its value. With /C they are TWO, with 
; values 1 and 2. The symbol table of each run says which - and DEFL 
; is used rather than EQU because a redefinition is legal, so the 
; source assembles cleanly in both modes. 
 
Counter         defl    1 
counter         defl    2 
 
; DIRECTIVES, MNEMONICS AND REGISTER NAMES ARE CASE-INSENSITIVE IN 
; BOTH MODES. /C is about the names you choose, not the ones the Z80 
; already has. 
 
                cseg 
 
start:          LD      A,1 
                ld      b,a 
                DB      Counter 
                db      counter 
                ret 
 
                end     start   

/Cを付けずにアセンブルすると、Counterとcounterは 1つのシンボルになり、2行目でそれに新しい値2が与えられます。次は、/Sが表示するシンボル表(19章)の最後の部分です。

A:\TATARA\EXAMPLES\NAMES>tatara /q /p /s names.as 
... 
ASEG - absolute 
 
0002h  var        Counter 
0200h  var        first_pass_symbol_table_high_water_mark_in_words 
0400h  var        first_pass_symbol_table_high_water_mark_in_bytes
 

表には、最初に定義したときに書いたとおりの名前が表示されます。/Cを付けると、値が1と2の2つのシンボルになります。

A:\TATARA\EXAMPLES\NAMES>tatara /q /p /c /s names.as 
... 
ASEG - absolute 
 
0001h  var        Counter 
0002h  var        counter 
0200h  var        first_pass_symbol_table_high_water_mark_in_words 
0400h  var        first_pass_symbol_table_high_water_mark_in_bytes
 

/Cは、大文字と小文字だけが違う名前がプログラムに必要なときにだけ使ってください。たとえば、大文字と小文字を区別するツールのために書かれたプログラムや、そのようなツールが作ったプログラムです。そうでなければ、区別しないほうが安全です。大文字と小文字を間違えて入力しても、正しいシンボルを指すからです。

警告.  1つのプログラムのモジュールは、すべて同じ方法でアセンブルしなければなりません。すべて/C付きか、すべて/Cなしです。オブジェクト・ファイルにはどちらだったかが記録され、TANRENは混ざったものをリンクしません。混ざっていると、ある名前があるモジュールでは見つかり、別のモジュールでは見つからないことが起こるからです。次の例では、TWOMODのMAIN.ASを/C付きで、PUTSTR.ASを/Cなしでアセンブルしてあります。

A:\TATARA\EXAMPLES\TWOMOD>tanren @twomod 
Tatara MSX Linker v1.2.0 
Copyright (C) 2026 Javier Lavandeira 
https://tatara.tools 
 
ERROR: one module was assembled /C and another was not.
 

7.4 届きにくい名前

TATARAには予約語がありません。どんな名前でも定義します。しかし、ある場所では、名前を探す前に語を決まった一覧で調べるので、そこでは一覧の語と同じつづりの名前には届きません。そのような場所は4つあります。

オペレーション・フィールド

TATARAは、まず疑似命令、次にマクロ、最後に命令を探します。疑似命令と同じ名前のマクロは呼び出すことができず、命令と同じ名前のマクロは、その命令の代わりに使われます(16章)。

命令のオペランド

オペランドの最初の語がレジスターの名前と完全に一致すると、その語はレジスターになります。語は、スペース、タブ、コンマ、かっこ、+、-で終わります。そのため、cとc+0はどちらもレジスターCで始まりますが、badはそれ自体で 1つの語なので、ふつうの名前です。レジスターは、A、B、C、D、E、H、L、BC、DE、HL、SP、AF、AF’、IX、IY、I、Rです。

条件

JP、JR、CALL、RETのあとでは、条件NZ、Z、NC、C、PO、PE、P、Mが先に調べられます。

式

NOT、HIGH、LOWは常に演算子です。また、MOD、SHR、SHL、EQ、NE、LT、LE、GT、GE、AND、OR、XORは、演算子を置ける場所ではどこでも演算子です(8章)。highという名前のシンボルは定義できますが、db highはbad expression.と表示して止まります。

名前cは、レジスターであり、条件であり、正しい名前でもあるので、このほとんどを一度に示してくれます。次のソースはcを定義し、4回使っています。

c               equ     5 
                cseg 
                ld      a,c 
                ld      a,0+c 
                jp      c,c 
                db      c
 

それぞれの行でTATARAが書き出すバイトを、リスティングから取って表7.2に示します。

行 バイト cの意味
ld a,c 79 レジスター
ld a,0+c 3E 05 シンボル(5)
jp c,c DA 05 00 条件、次にシンボル
db c 05 シンボル
表 7.2: cという名前のシンボルの4つの使い方

2行目をld a,c+0と書くと、オペランドがレジスターの名前で始まるので、エラーになります。

REGNAME.AS(4): ERROR: not a form this instruction has.
 

安全な決まりは簡単です。レジスター、条件、演算子、疑似命令、命令と同じつづりの名前を付けないことです。疑似命令は付録A、命令は付録Bに一覧があります。

7.4.1 疑問符2つで始まる名前

疑似命令LOCAL(16章)は、マクロの中のラベルに名前を作ります。こうすると、マクロを使うたびにラベルが別のものになります。作られる名前は??0000、??0001のようなもので、ほかの名前と同じようにシンボル表に表示されます。

CSEG - default code segment, 0009h bytes 
 
0000h             start 
0002h             ??0000 
0006h             ??0001
 

この形の名前を自分で定義しないでください。LOCALが作る名前とぶつかるおそれがあります。

7.4.2 ドル記号だけの場合

$だけのときは名前ではなく、ロケーション・カウンター、つまりいまの行のアドレスです(8章と10章)。a_b$cのように名前の中にあるときは、ふつうの文字です。