リロケータブルアセンブラ WZD

石上達也
 
 WZDは,リロケータブルフォーマットによるリロケータブルアセンブラです。使用に際してはフロッピーディスクが必要となりますので注意してください。
 

◆使用方法

●S-OSのコマンドラインから使用する
 S-OSの拡張をしている方は,
# WZD パラメータ
とすると動作を開始します。アセンブルが終わると#を表示してS-OSのコマンドラインに戻ります。
 次に,S-OSの拡張をしていない場合は,
#J3000 バラメータ
とすると動作を開始します。あとは拡張をしているときと同じです。この方法は,1本のプログラムをアセンブルしたいときに用いると便利です。
●WZDを起動してから
 まず,
#LWZD
#J300
でWZDを起動すると入力を促すプロンプト“*"を表示してWZDのコマンドラインに入ります。“*"の後ろに続けてパラメータを与えます。パラメータによって指示された動作が終了すると,再び入力を促すプロンプト“*"を表示して,WZDのコマンドラインに入ります。
 さらに別のプログラムをアセンブルしたい場合には,1回目と同じようにパラメータを与え,WZDを終了したいときには,SHIFT+BREAKキーを押してください。S-OSのモニタに戻ります。
 この方法は,アセンブルしたいプログラムが複数あるときに便利です。
 

◆使用上の注意

 EQU文のパラメータは1パス目のその時点において,値が確定している必要があります。このことによって一部,REDAのソースファイルがアセンプルできないことがあるかもしれませんが,そのときは値が確定する順にラベルを並べ替えてください。
 PHASE文とDEPHASE文のあいだにおいてセグメントのモードを切り替えてはいけません。また,PHASE文とDEPHASE文のあいだではアドレス情報がアブソリュート値で処浬されます。
 呼ばれたファイルから呼び出したファイルをインクルードしてはいけません(無限ループに陥ります)。
 リストファイル中のデータの中に,**マークが現れることがありますが,これはその値がまだ確定していないことを示します。具体的にはアブソリュート値で処理されていないラベルを用いたときなどに現れます。
 

◆セグメントについて

 プログラムにはアルゴリズムを表している部分とデータを表している部分がありますが(特にマシン語では露骨にそうなる),ときとして両者を分けたいときがあります。アブソリュートアセンブラならワークエリアを後ろに持っていけばよいのですが,複数のリロケータブルファイルからオブジェクトファイルを作る場合はそうはいきません。そこでリンカに複数のPCを持たせてアルゴリズムを表すコードがきたらコードセグメントを受け持つPCを用いて,データの部分はデータセグメントを受け持つPCを用いて処理してやる必要があります。
 WZDでは,コードセグメントとデータセグメントのほかにワークセグメントが用意されています。
 また,セグメントを使ううえでいくつか注意事項があります。
 セグメントの異なるエリアにJR命令やDJNZ命令でジャンプすることはできません(JR命命やDJNZ命令のオペランドの値は,WZD内で処理を完了する必要がある。その処理をリンカに持ち越してはいけない)。
 コードセグメントとデータセグメントは,アドレスを重ねてはいけませんが,ワークセグメントはコードセグメントおよびデータセグメントと重ねてもかまいません。
 また,ワークセグメントの内容は,リンカにアドレス情報を伝えるだけで,実体を作成することはできません。さらに例外的にこのセグメントだけPCのあと戻りができます。
いったんORG命令を処理すると同一ファイル内においては,そのセグメントのアドレス情報は,すべてアブソリュート値で処理されます。ORG命令を挟んでの相対ジャンプはできません(絶対ジャンプはできる)。
 S-OSでは,64Kバイトを超える大きさのファイルを扱うことはできません。ソースファイルの大きさが64Kバイトを超えることはまずないと思いますが,30Kバイトくらいのソースファイルからリストファイルを作成した場合,64Kバイトを超えてしまう可能性があります。そのときは,“Bad Record"とエラーメッセージを表示してすべてのアセンプル作業を中止します。
 

WZDリファレンスマニュアル

■パラメータ

 [リロケータブルファイル名],[リストファイル名]=[ソースファイル名]の書式でパラメータを与えるが,続けて以下のスイッチを併用することによってパラメータの一部またはソースファイルの一部を省略することができる。[リストファイル名],[リロケータブルファイル名],[ソースファイル名]について拡張子を省略した場合は,それぞれ“.PRN",“.REL",“.ASM"になる。
/L
 リストファイルのファイル名をソースファイルのファイル名と同じにする。
/R
 リロケータブルファイルのファイル名をソースファイルのファイル名と同じにする。
/K
 ソースファイルには,シフトJISコードで表される漢字などが含まれていることを示す。
=[ファイル名]
 ソースファイルとリロケータブルファイルを[ファイル名]にする。
,=[ファイル名]
 ソースファイルを[ファイル名]にする。このときリロケータブルファイルとリストファイルは作らない。
=[ファイル名J/L
 ソースファイル,リロケータフルファイル,リストファイルすべてを[ファイル名]とする。
,=[ファイル名J/L
 ソースファイルとリストファイルを[ファイル名]にする。
[ファイル名1]=[ファイル名2]
 ソースファイルを[ファイル名2],リロケータブルファイルを[ファイル名1]にする。
[ファイル名1]=[ファイル名2]/L
 ソースファイル,リストファイルを[ファイル名2],リロケータブルファイルを[ファイル名1]にする。
,[ファイル名1]=[ファイル名2]
 ソースファイルを[ファイル名2],リストファイルを[ファイル名1]にする。
,[ファイル名1]=[ファイル名2]/R
 ソースファイル,リロケータブルファイルを[ファイル名2],リストファイルを[ファイル名1]にする。
 

■疑似命令

 REDAに比べて以下の命令が鉱張されている。
END[式]
 アセンブル作業を終了する。この行の後ろになにを書いてもアセンブラには無視される。式がある場合には,その値を実行開始アドレスに指定すること([式]は省略可能)
.KANJI
 以後のプログラムはシフトJISコードで害かれていることを示す(パラメータのスイッチで/Kを指定した場合と同じ)。
.NKANJI
 以後のプログラムはASCIIコードのみで警かれていることを示す。先の.KANJI命令と組み合わせることによって,REDAにおけるKスイッチの働きをアセンブル中に切り替えられます。
CSEG
 以後のプログラムはコードセグメントに配置されることを示す。
DSEG
 以後のプログラムはデータセグメントに配置されることを示す。
WSEG
 以後のプログラムはワークセグメントに配置されることを示す。
EXIT[ラベル名]
 [ラベル名]で表されたラベルは,他のファイルで外部ラベルとして宣言されていることを示す。同じファイル中に同じ名前があった場合は,Multi Definedエラーとなる。
PUBLIC[ラベル名]
 [ラベル名]で表されたラベルを外部(参照可能)ラベルとして宣言される。同じファイル中に[ラベル名]で表されたラベルがない場合は,Undefined Labelエラーとなる。
[ラベル名]##
 [ラベル名]で表されたラベルは,外部ラベルとして処理される。なお,この表記は式中においてのみ可能。
[ラベル名]::
 [ラベル名]で表されたラベルを,現時点でのPCの値を表す内部ラベルとして宣言するとともに,外部(参照可能)ラベルとしても宣言する。この表記は,ソースプログラム中の1列目においてのみ可能。
.PHASE[式]
 以下のプログラムをPCに一時的に[式]の値にする。PCを一時的に変更するだけで,オブジェクトプログラムは以前のアドレスと連続して配置される(プログラムの転送は行われない)。
.DEPHASE
 PHASE文で一時的に変更したPCを元の値に戻す(PHASE文とDEPHASE文の間のフログラム分だけPCは進んでいる)。
INCLUDE[ファイル名]
 ソースプログラム中のこの位置に[ファイル名]で示されたファイルをそっくり読み込む。4重までネスティング可能。
PAGE[式]
 リストファイルにおいて1べージあたりの行数を指定。ページごとに区切られたくない場合は,PAGE 0FFFFHとすること(6万行以上のファイルは存在しないと仮定)。デフォルトは0FFFFH。
TITLE[文字列]
 リストファイルにおいてこのプログラムのタイトルを[文字列]にする。タイトルとはリストファイルの一番最初の行にプリントされるタイトルであって,リストファイルネームとは関係ない。
 

■エラーメッセージ

Syntax Error
 文法エラーが発生した
Undefined Error
 未定義なラベルが使用された
Redefinition Error
 同じラベルを2度以上定義しようとした
Illegal Label Error
 ラベル名がおかしい
Illegal Opecode Error
 オペコードがおかしい
Ilegal Operand Error
 オベランドがおかしい
Too Many Label Error
 使用されたラベルが多すぎる
Missing Label Error
 ラベルのあるべきところにラベルがない
Too Far Error
 JRやDJNZ命令などでオペランドで表された値が届く範囲にない
Illegal Expression Error
 式の表し方がおかしい
Missing [)] Error
 “)"の文字がない
Missing [.] Error
 “."の文字がない
Missing Quote Error
 文字列の表し方がおかしい
Illegal ORG Error
 ORG命令のオペランドがおかしい
ValueError
 1パス目で決まっていなければならない値が決まっていない
Relocation Error
 JRまたは,DJNZ命令のオペランドにおいて,値が不確定な意味のない式を書いた
InternalError
 
(C)1990 Tatsuya Ishigami(original)
(C)1997 Junji Okazaki(edited)
(C)2024 Oh!Ishi,Nibbles Lab.(formatted)