付録J
M80とのソースの互換性
この付録は、M80向けに書いたソースをTATARAでアセンブルしたい読者のためのものです。ここでは、TATARAをMSX-M80、つまりアスキーのMSX-DOS2 TOOLSに入っているM80と比べます。そのリスティングにはMSX.M-80 2.00と表示されます。
M80向けに書かれたZ80のソースのほとんどは、そのままTATARAでアセンブルできます。変更が必要な疑似命令や書き方はわずかで、以下に、代わりに何を書けばよいかとともに示します。オブジェクト・ファイルには互換性がありません。TATARAが書き出すのは独自のオブジェクト・ファイル(付録F)で、M80の.RELファイルではありません。
J.1 そのまま使えるもの
次のものは、TATARAでもM80と同じように使えます。
- 文の形。ラベル、オペレーション、オペランド、コメントの順で、ラベルは1桁目に書くかコロンを付けます。name::はPUBLICでもあるラベルです(6章)。
- 接尾辞B、D、O、Q、Hの付いた数、2文字までの文字定数(”は0)、どちらの引用符でも囲める文字列、ロケーション・カウンターを表す$。16ビットを超える数は、M80と同じように下位16ビットが残ります。
- 演算子とその優先順位(付録C)。
- ASEG、CSEG、DSEG、ORG(10章)。
- DB、DW、DS、DC、そしてEQUとDEFL。
- PUBLIC、EXTRN、END。
- IFからIFDIFまでの条件付きアセンブルと、ELSE、ENDIF(15章)。
- MACRO、REPT、IRP、IRPC、LOCAL、EXITM、ENDM、そしてマクロの特別な書き方。&、;;、!、山かっこ、値で渡す引数の%です(16章、17章)。
- TITLE、SUBTTL、PAGEと、.LISTから.TFCONDまでのリスティングの制御(18章)。
M80の疑似命令の別名も受け付けます。IFの別名のCONDとIFT、IFEの別名のIFF、DBの別名のDEFBとDEFM、DSの別名のDEFS、DWの別名のDEFW、PUBLICの別名のENTRY、EXTRNの別名のEXT、そして 1桁目に書いたPAGEの別名の*EJECTと$EJECTです(A.4節)。
J.2 TATARAが受け付けないM80の疑似命令
表J.1の疑似命令では、TATARAはnot a directive, a macro or an instruction.で止まります。2つの制御行では、only *EJECT and its dollar spelling are control lines.で止まります。
|
表 J.1: TATARAが受け付けないM80の疑似命令と、代わりに書くもの
|
|
|
M80 |
TATARAでは |
|
|
|
|
SET |
同じ働きをするDEFL(12.4節)。 |
|
GLOBAL |
|
|
EXTERNAL |
|
|
ENDC |
|
|
MACLIB、$INCLUDE、*INCLUDE |
|
|
*TITLE、$TITLE |
|
|
.Z80 |
削除します。TATARAはいつもZ80の命令をアセンブルします。 |
|
.8080 |
TATARAには8080モードがありません。ソースをZ80の ニーモニックで書き直す必要があります。 |
|
.RADIX |
それぞれの数に接尾辞を付けて書きます。.radix 16のあとの0FFではなく、0FFhです。 |
|
COMMON |
変数を1つのモジュールで定義し、PUBLICとEXTRNで共有します(12.5節)。同じメモリを 交代で使うブロックには、トランジェント・セグメントを使います (29章)。 |
|
NAME |
削除します。モジュールの名前はソース・ファイルの名前です (F.1節)。 |
|
.COMMENT |
|
|
.PRINTX |
相当するものはありません。削除します。 |
|
.REQUEST |
ファイルをTANRENのコマンド・ラインかリンク・ファイルで 指定します(21章)。 |
|
.PHASE、.DEPHASE |
相当するものはありません。 |
|
.CREF、.XCREF |
削除します。TATARAはクロス・リファレンスの ファイルを作りません。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
J.3 そのほかの書き方
表J.2に、ソースのそのほかの部分のうち、違いのあるものや、M80を知っている読者が気にしそうなものを比べます。
|
表 J.2: M80のソースのそのほかの書き方と、TATARAでの扱い
|
|
|
M80の書き方 |
TATARAでは |
|
|
|
|
foo:: |
|
|
far## |
受け付けません(undefined symbol in an expression.)。 名前をEXTRNで宣言し、##を付けずに書きます。 |
|
X’41’ |
受け付けません(undefined symbol in an expression.)。41hと書きます。 |
|
NUL |
受け付けません。引数はIFBやIFNBで 調べます(16.6節)。 |
|
TYPE |
|
|
マクロの引数の%lb |
同じ。lbの値が10進数で渡されます。 |
|
a!;bと<a;b> |
同じ。どちらもセミコロンを含むa;bを 渡します。 |
|
マクロの中の;; |
同じ。そのコメントは展開に残りません。 |
|
1行に式だけ |
|
|
8080のニーモニック |
受け付けません。mvi a,1はld a,1です。 |
|
1桁目の*か$で始まる語 |
M80と同じく制御行です。受け付ける のは*EJECTと$EJECTだけで、それ以外ではTATARAは止まります。 そのため、$loop:はラベルにできません。 |
|
ほかの文字を含むラベル |
拒否されます(a name may hold only letters, digits, ? @ . _ and the dollar sign.)。 |
|
名前の長さ |
M80は名前の最初の6文字しか使いませんが、TATARAは255文字まで すべてを使います(7.2節)。buffer1とbuffer2のように、M80が1つの名前とみなした2つの名前は、TATARAでは 別の名前です。 |
|
大文字と小文字 |
デフォルトでは同じで、名前では区別されません。/Cで区別されるようになります(7.3節)。 |
|
行の長さ |
M80は132文字、TATARAは255文字まで読みます。 |
|
IXH、IXL、IYH、IYLという名前のラベル |
M80では使えますが、TATARAではこの4つはレジスターなので拒否されます(IXH, IXL, IYH and IYL are registers, not names.)。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
J.4 TATARAが加えるもの
TATARAは、次の点でMSX-M80より多くのことができます。
- 未公開命令。SLL、インデックス・ハーフのIXHからIYL、IN F,(C)、OUT (C),0です(9.5節)。MSX-M80にはどれもありません。
- 長いシンボル名。すべての文字が意味を持ちます(7.2節、31章)。
- 名前付きセグメントとGROUP、そして変数でメモリを共有するトランジェント・セグメント (10.5節、29章)。
- インクルード・ファイルの広い検索。インクルードする側のファイルのディレクトリ、カレント・ディレクトリ、そしてTATARAのそれぞれのディレクトリを探します(13章、付録I)。MSX-M80が探すのは1か所だけで、MSX-Cも使う環境変数INCLUDEが設定されていればそのディレクトリ、設定されていなければカレント・ディレクトリです。
- すべてのファイル名で使えるMSX-DOS2のディレクトリ (34章)。
- 大きなプログラム。表を、Z80から見える64 KBではなく、メモリ・マッパーに置きます(付録G)。
- それぞれの名前のセグメントと種類を示すシンボル表。/Sで表示します(19章)。
- 何が悪いのかを示すメッセージ。ファイルと行、そしてそこに至ったインクルード・ファイルとマクロのつながりを示します(20章)。
J.5 そのほかの違い
- コマンド・ライン
-
MSX-M80はm80 =hello/lのように、出力ファイルを=の前に書くコマンドを受け付けます。TATARAではソースを先に書きます。tatara /l hello.asです(5章)。
- オブジェクト・ファイル
-
TATARAは、TANRENがリンクする.TROファイルを書き出します(付録F)。.RELファイルは書き出せず、TANRENも読めないので、プログラムのすべてのモジュールをTATARAでアセンブルします。
- リスティング
-
レイアウトはM80のものに近く、違いは18章で説明しています。
- メッセージ
-
M80はUやVのような文字で行に印を付け、ソースの最後まで続けます。TATARAは文でメッセージを表示し、最初のエラーで止まります(20.2節、付録D)。
J.6 ソースの変換
MSX-M80向けに書かれたソースをTATARAでアセンブルするには、次のようにします。
- .Z80、NAME、.PRINTX、.CREF、.XCREFを削除します。
- SETをDEFLに、GLOBALをPUBLICに、EXTERNALをEXTRNに、ENDCをENDIFに、MACLIB、$INCLUDE、*INCLUDEをINCLUDEに、$TITLEや*TITLEをSUBTTLに変えます。
- name##をEXTRNの宣言に、X’nn’をnnHに、.RADIXのあとに書いた数を接尾辞の付いた数に置き換えます。
- .COMMENTのブロック、COMMONのブロック、1行に式だけの行を、表J.1と表J.2のように書き直します。
- インクルード・ファイルがソースと同じディレクトリにもカレント・ディレクトリにもなければ、TATARAにそのディレクトリを設定します。TATARAはINCLUDEを読みません。
- IXH、IXL、IYH、IYLという名前のラベルを付け直します。
- 7文字目以降だけが違う名前を探します。M80はそれらを1つの名前とみなしましたが、TATARAはそうしません。
- アセンブルします。TATARAは受け付けられない最初の行で止まり、メッセージがそのファイルと行を示すので、残りも1つずつ見つけられます。
- プログラムのすべてのモジュールをTATARAでアセンブルし、TANRENでリンクします。