アブソリュート・タイプ クロスアセンブラ for CPU-SC62015           ■■ XASM[VER 1.3x] ■■ 【1】 はじめに   「XASM」は、工学社のポケコンライブラリ2に掲載されている近成人氏制作のSC62  015クロスアセンブラです。   SC62015というCPUは、(株)シャープのポケットコンピュータPC-E500シリーズに  搭載されています。本アセンブラはPC-E500の機械語プログラム開発に用いるため  作成されました。 ちなみにSC62015というのはチップの名前で、本来このCPUは  「ESR-L」と呼ばれるものらしいです。   また、シャープのハイパー電子手帳DB-ZシリーズやPV-F1やZAURUSにも「ESR-L」  +αのCPUが搭載されております。本アセンブラを電子手帳のソフト開発にも使用  することが可能です。   今回のVer1.3の開発には、近氏がネットワーク上で公開されたVer1.26および  1.27jのソースを元にしました。これはもともとTurbo-PASCALで書かれていたの  ですが、T2CというPDSを使うことにより大体うまくC言語に変換できたので、  あとはそれを元に全般に渡ってかなり手を加えて、ハッシュによる高速化などの  改良を重ねました。 【2】 XASM Ver1.3xの特長   本アセンブラの主な特長は次の通りです。  ・内部RAMのアドレッシングの際に必要となる「プレバイト」を、アセンブラが  ソースプログラムを解釈して自動的に生成する”プレバイト自動生成機能”を装備。  もちろん他のアセンブラソースとの互換をとるためにこれを無効にすることも可能。  ・LOCAL,ENDL疑似命令を用いることにより16段までネスト可能な「ローカルラベル」  が使用できるので、"意味のある"ラベル名を付けることが容易。  ・引数付きファイル・インクルード命令「INCLUDE」を使うことにより、マクロ展開  ライクなソースの記述が可能。ファイルのインクルードは何段でも可能。  ・エラー発生時のリスティング・ファイルはMIFES等のエディタでタグ・ファイルと  して使用できる。  ・オプションの指定により5種類のオブジェクトを出力可能。  ・「ポケットリンクシステム」と併用することにより、生成されたオブジェクトを  非常に簡単に、しかも高速にポケコンに転送してテストすることが可能なシステムを  構成することができる。  ・ハッシュによるラベル管理をしているため高速にアセンブルします。  ・MACRO,ENDM疑似命令を用いることによりマクロ機能が使用可能。 【3】 ソースプログラムの記述方法   ソース・プログラムは以下の書式に従って書かれている必要があります。 【3.1】 ファイルの仕様   1行1ステートメントから成り、最終ステートメントはEND疑似命令で終了してい  る必要があります。 【3.2】 ステートメントの仕様   各ステートメントは以下の構文図を満足している必要があります。   -statement-     +--------------------->-----------------------+     |                     |    --+->- [label] ->- ":" ->-+->- [instruction] ->-+->- [comment] --+--     |            |          |         |     +->- [space] ----->-----+----------->---------+------->--------+   -instruction-              +------------->-----------+              |            |    -->-- [mnimonic] ->-+->-+->- [operand] ->-+->-+->-       |        |       +---<---","---<---+   -mnimonic-    -->--+------->-------+->- mnimonic ->-+-------->------+->-       |        |        |        |       +->- [space] ->-+        +->- [space] ->-+   -operand-    -->--+------->-------+->- operand ->-+-------->------+->-       |        |        |        |       +->- [space] ->-+        +->- [space] ->-+   -space-    -->--+->- " " or TAB ->-+->-       |         |       +---------<--------+   -comment-    -->- ";" ->-+---->----+->-          |     |     ... ? is a one-character wild card          +-<- ? -<-+ 【3.3】 ラベルの仕様   ラベルを構成する文字にはa〜z,A〜Z,0〜9,「_(アンダースコア)」が使用  できますが、大文字小文字は同一の物として処理されます。またラベル開始文字に  0〜9を使用することは出来ません。   ラベルの長さは最大16文字までです。16文字を越えるとエラーになります。   予約語と同一名のラベルも作成でき、原則として参照も可能ですが、命令によっ  ては参照できないものもあります。ですからそのようなラベルの使用は出来るだけ  避けるほうが賢明です。   ラベルの再定義はできません。 【3.4】 オペランドの仕様   オペランドには数字、文字定数、ラベル、ロケーションカウンタ、インクルード  引数を使用することができ(一部の疑似命令ではファイル名も)、それらを演算子  を用いて演算することも出来ます。数値は式の途中でも逐次20ビットの符号なし整  数に変換され、命令の要求するバイト数だけ下位から参照されます。  ●数字   0〜9,a〜f,A〜Fが使用できます。ただし数字構成文字の先頭は0〜9または「$」  (16進数値の場合のみ)でなくてはなりません。   デフォルトは10進数ですが、最後尾に特定の文字を付けることにより基数を変える  ことが出来ます。ただしn進数の場合、構成文字が(n-1)を越えてはなりません。   最後尾文字と基数の関係は以下の通りです。    B.b・・・2進    O,o・・・8進    D,d・・・10進    H,h・・・16進   また、桁が多くなった場合に見易くするため、「_(アンダースコア)」を任意の  位置に挿入することが出来ます。(例)0100_1100b・・・$4C  ●文字定数   「'(シングルクォート)」で囲まれた中の文字のうち、右の「'」に一番近い1文  字の文字コードが数値として扱われます。ヌルコードは「''」、シングルクォート  自身はシングルクォートを2つ連続して書くことにより記述できます。   (例) 'ABCD'   ・・・$44(「D」のコード)       ''''    ・・・$27(シングルクォートのコード)       ' '     ・・・$20(スペースのコード)       ''     ・・・$00(ヌルコード)  ●ロケーション・カウンタ   ロケーション・カウンタ(LD)は「*」で表され、現在アセンブル中の命令が置か  れるべきアドレスを値として持ちます。なおロケーションカウンタと乗算記号は同じ  「*」を用いていますが、式評価ルーチンは文脈判断を行なっているので、両者を混  同しても正しく評価します。   (例) -1*-*+* ・・・ 「マイナス1かけるマイナスLCたすLC」と評価  ●インクルード引数   被インクルードファイル中に限り、「@(アットマーク)」の後に0〜9の数字を付  けることによりINCLUDE疑似命令で渡された引数を参照することが出来ます。   第1引数は「@0」に対応し、以下「01」,「@2」・・・はそれぞれ第2引数,第3引数  ・・・となります。   現在アセンブル中のファイルが被インクルードファイルでなかったり、INCLUDE疑  似命令に引数が無かったり、また渡された個数以上の引数を参照するとエラーになり  ます。  ●演算子   演算子には「|(論理和)」、「&(論理積)」、「%(剰余)」、「+(加算)」、  「-(減算)」、「*(乗算)」、「/(除算)」が使用でき、優先順位は    「|」 < 「&」 < 「%」 < 「+」,「-」 < 「*」,「/」  の順です。また優先順位の変更には「(」、「)」が使用できますが、右括弧と左括弧  の対応が取れていなくてはなりません。   「+」、「-」は式の先頭または演算子の後に付いた場合、符号を意味し、最優先で  処理されます。 【3.5】 命令について   SC62015の持つ全命令をアセンブルできます。なお「mv a,x」のように純正命令表  では禁止されているが実際は使用可能な命令もアセンブルできるようになっています  ので、今後CPUの設計変更等の情報があった場合には命令関係の情報に十分注意して  ください。   PUSHS r や POPS r は、等価なmv命令で展開されます。   アセンブルを制御するために使用できる疑似命令は以下の通りです。なお、書式中  の[・・・]は・・・が省略可能であることを、[・・・]*は・・・が0回以上繰り返さ  れることを示しています。  ●ORG  書式:ORG operand   ・・・次から展開されるオブジェクトの先頭アドレスを決定します。アセンブルさ  れた時点でoperand が未定義だとエラーになるので注意が必要です。 また、一連の  ソースプログラム中で2回以上ORGが出現した場合はその値によって次のように処理さ  れます。   >過去のアドレスに設定しようとした場合・・・エラーになります。   >未来のアドレスに設定しようとした場合・・・ロケーション・カウンタを強制的   に書き替えるために警告(warning )が発生します。  ●END  書式:END   ・・・ソースプログラムの終わり、またはインクルードファイルの終わりを示しま  す。この命令がアセンブルされた時点でLOCALとENDLとの対応が取れていな  いとエラーになります。  ●EQU  書式:label: EQU operand   ・・・ラベルに値を代入します。アセンブルされた時点でoperand が未決定であっ  てもアセンブル終了までに何らかの形で決定されればエラーになりません。但し、ラ  ベル定義が循環していたり、矛盾するラベル定義はエラーになります。   (例) lable1: EQU label2  ・・・label1もlabel2も決定しないのでエラー       label2: EQU label1  ・・・label1もlabel2も決定しないのでエラー       label3: EQU label3+2 ・・・矛盾する定義はエラー   また、先頭のlabel が無い場合もエラーになります。  ●DB,DM  書式:DB(DM) operand [,operand ]*   ・・・operand のうち、下位1バイトを展開します。オペランドは「,(カンマ)」  で区切ることにより複数個記述できます。また、DB,DM.DW,DPのオペランド中におい  てのみ次の書式が有効です。   書式:'c・・・c'   機能:「'」で囲まれた間の文字列を1バイト毎の文字コードとして展開する。      「'」自身は「'」を2つ連続して書くことにより記述できます。     (例) 'I don''t know'         ・・・$49,$20,$64,$6F,$6E,$27,$74,$20,$6B,$6E,$6F,$77 と展開  ●DW  書式:DW operand [ ,operand ]*   ・・・operand のうち、下位2バイトを下位、上位の順に展開します。その他につ  いてはDB,DMに準じます。  ●DP  書式:DP operand [ ,operand ]*  ・・・operand を下位、中位、上位(4bits) の順に3バイトにわたり展開します。  上位1バイトのうち上位4bitsは常に0です。その他についてはDB,DMに準じます。  ●DS  書式:DS operand1 [ ,operand2 ]   ・・・operand1で示されたバイト数を確保します。operand2も存在するときは確保  したメモリ領域をoperand2のうちの下位1バイトで埋めます。  ●PRE  書式:PRE operand   ・・・operandで示される値をプレバイトそのものとみなして1バイト展開します。  但しoperand は$21以上$27以下または$30以上$37以下でなければエラーになります。   プレバイト自動生成機能が有効なときにこの命令を使用すると警告が発生します。  ●PRE_ON  書式:PRE_ON   ・・・以降のソースプログラムに対してプレバイト自動生成機能を有効にします。  デフォルトはPRE_OFFの状態です。  ●PRE_OFF  書式:PRE_OFF   ・・・以降のソースプログラムに対してプレバイト自動生成機能を無効にします。   また、自動生成機能をOFFにした場合にも強制プレバイトを使用した場合には、プ  レバイトが生成されます。  ●PRE_PUSH  書式:PRE_PUSH   ・・・現在、プレバイト自動生成機能が有効か無効かを保存します。インクルード  ファイルなどで一時的に現在のプレバイト自動生成をON/OFFするときに使用します。  ●PRE_POP  書式:PRE_POP   ・・保存された状態に、プレバイト自動生成機能を戻します。  ●LOCAL  書式:[label:] LOCAL   ・・・label をエントリラベルとして以降、ENDLまでをローカルブロックと宣言  します。ローカルブロック中で更にローカルブロックを宣言するなどのネスティング  も可能です。詳しくは後述の「階層化ラベルについて」を参照してください。  ●ENDL  書式:ENDL   ・・・ローカル・ブロックの終了を宣言します。先にローカルブロックが宣言され  ていないときにはエラーになります。  ●INCLUDE  書式:INCLUDE filename [ ,argument ]*   ・・・この命令がアセンブルされると、filenameで指定されたファイルをopenして  そのファイルをアセンブル対象とします。ファイルが終了すれば元のファイルの続き  からアセンブルを再開します。被インクルードファイル中から更にINCLUDE命令を使  うなどのネスティングも可能です。  また、filenameの後にargumentが存在する場合はそれらを引数として被インクルード  ファイルに渡すことができ、被インクルードファイル中でそれらを「@0」〜「@9」  として参照できます。但し、argumentは最大10個までしか許されません。  ●MACRO  書式:MACRO macroname [ ,argument ]*   ・・・macronameという名前のマクロを定義します。ENDMまでの行が登録されます。  ●ENDM  書式:ENDM   ・・・マクロ定義を終了します。  ●SCOPE_ON  書式:SCOPE_ON   ・・・ラベルの有効範囲が広くなり、外側のローカルブロックのラベルを参照でき  るようになります。詳しくは後述の「階層化ラベルについて」を参照してください。  ●SCOPE_OFF  書式:SCOPE_OFF   ・・・ラベルの有効範囲が狭くなり、自分のいるブロックの中だけ参照できます。 【4】 アセンブル方法   アセンブルを行なうには    XASM filename[.ext]  とします。filenameを省略した場合は簡単なガイダンスが表示されコマンドレベルに  戻ります。またソースファイル名のエクステンションが".asm"である場合にはエクス  テンションを省略しても構いません。   アセンブルが開始されると[ PASS1 ] 、[ PASS2 ] と現在の処理段階が表示され、  正常にアセンブルが終了した場合にはオブジェクトのスタートアドレスとエンドアド  レス、オブジェクトサイズが表示されてコマンドレベルに戻ります。なお、EQU命令  で定義されるラベルが定義される前に参照されるような場合は[ PASS1 ] と[ PASS2 ]  の間にラベル定義のためのパス([ EQU define ])が入ります。   アセンブル途中でエラーが発生した場合には、ディスプレー上にエラーの発生した  ファイル名とエラーの発生した行番号、エラーの種類が表示されます。またリスティ  ングファイルの出力指定がある場合にはリスティングファイルにも同じ情報が出力さ  れます。   ところで、XASMは単に XASM filename とするだけではアセンブルをするだけ  でファイルとしては何も出力してくれません。オブジェクトファイルを出力させたり  リスティングファイルを出力するためにはそれなりのオプションを指定する必要があ  ります。   XASMに用意されているオプションは次の通りです。  ●L  書式:L[filename]   ・・・リスティングファイルを出力するように指定します。filenameが指定されな  いときはソースファイルのプライマリにエクステンション、".LST"が付加されたもの  になります。  ●E  書式:E   ・・・リスティングファイル中のオブジェクト部を抑圧して、エラー部のみを残す  ように指定します。PASS2の段階でエラーが発生しそうであり、かつリスティングファ  イルをエディタのタグファイルとして利用したい場合はLオプションと同時にこのオプ  ションも指定すると良いでしょう。なお、Lオプションが指定されていない場合は無効  になります。  ●O  書式:O[filename]   ・・・オブジェクトファイルを出力するように指定します。filenameが指定されな  いときはソースファイルのプライマリにエクステンション、".OBJ"が付加されたもの  になります。  ●S  書式:S   ・・・リスティングファイルの最後尾に使用したラベルとその値の一覧表を付加す  るように指定します。ただしLオプションが指定されていないと無効になります。  ●C  書式:C   ・・・アセンブル途中に現在処理中の行番号をディスプレイに表示するように指定  します。長いファイルなどをアセンブル中で、どこまで処理が終わったかが気になる  場合に指定するといいかも知れません。  ●T  書式:T[object type]   オブジェクトファイルのフォーマットを指定します。object type とフォーマット  の対応は以下の通りです。   object type  フォーマット     Z     ZSH形式のオブジェクトを指定します。     F     FTX形式のオブジェクトを指定します。     B     バイナリデータ形式のオブジェクトを指定します。バイナリデータ          形式とは object_size (3bytes) + start_address (3bytes) + object_body(n bytes) からなる物を指します。     H     ヘキサデシマル形式のオブジェクトを指定します。ヘキサデシマル          形式とは、バイナリデータ形式のデータを16進2桁2バイトのキャラ          クタに変換し、64文字毎に改行コードを挿入したものです。    other    オブジェクト本体の前に、ポケコンのIOCSがマシン語ファイルとし          て扱うために必要な情報が含まれたヘッダ(16バイト)を付加した          タイプのオブジェクトを指定します。   オブジェクトタイプを指定しなかった場合には自動的にother が指定されます。  ●W  書式:W   ・・・警告を発生するように指定します。  ●H  書式:H   ・・・ハッシュによる高速化を使用しないように指定します。   オプションを使用するためには    A>XASM filename -option [-option]*   とすればOKです。オプション名は大文字小文字どちらでも同等に扱われます。    (例)A>XASM TEST -L -OTEST1.FTX -S -TF -W       ・・・TEST.LSTという名前でリスティングファイルを作成し、TEST1.FTX          という名前でオブジェクトファイルを作成し、シンボルリストを作          成し、オブジェクト形式をFTX形式に指定し、警告も発生するよ          うに指定する。 【5】 階層化ラベルについて(その1)   CP/MからMS-DOSに移ったとき何が嬉しかったかと言えば、一番は何といっても階層  化ディレクトリだったのではないでしょうか?   いままで全部rootに置くしかなくて整理がつかなかったのが、各関連項目別にディ  レクトリを作ってそこに放り込むことですっきり整理できるようになったからです。  それにディレクトリの中に更にサブ・ディレクトリを作ったりでき、ディレクトリが  違えば同一名のファイルが同じディスク上に存在できるなど、階層化ディレクトリの  提供する環境は大変便利なものです。   ところで、現在のアブソリュートアセンブラのラベル管理を考えてみてください。   アセンブラのソースを書くうえで何に一番頭を使っているかと言えば「ラベルの名  前付け」ではないでしょうか?   分岐命令にはラベルがつきものです。1つ小さなループを作るにも最低1つのラベ  ルを使わなくてはなりません。その度に「え〜、label09 はもう使ったから次はlabe  l0a か?」と、本来の目的とは全く違うところで無駄な労力を使わなくてはなりませ  ん。しかも後から見たときコメントでも書いてなくてはlabel09が何を意味するのか、  label0a が何を意味するのか、全くわかりません。   そこでこのような「ラベルの名前付け問題」から頭を開放するために今回は実験的  に、「階層化ラベル」という概念を取り入れてみました。考え方はUNIX、MS-DOSの階  層化ファイル構造とよく似ていますから容易に理解できるものと思います。  まず、サブディレクトリに当たるものですが、当アセンブラシステムではこれをロー  カルブロック(Local block )と呼んでいます。ローカル・ブロックを定義するには  「LOCAL」と「ENDL」という疑似命令をペアで使用するだけでOKです。  例えばサンプルの2行目から6行目を見てください。このようにすれば、LOCALからENDL  までの間が「ABC」という名前のローカルブロックになります。   またローカルブロックのなかに更にローカルブロックを作ることも出来ますからサ  ンプルの7行目から20行目のような書き方も可能です。   ローカルブロックの中はサブディレクトリと同じようなものですから、ブロックの  外に同一名のラベルがあっても構いません(サンプルの2行目と12行目)。そこでロー  カルブロック内のラベルをローカルラベルと呼ぶことにします。   さて、ローカルブロックやローカルラベルが出来てもオペランドでそれが指定でき  なくては何の意味もありませんね。   そこで今度はラベルの指定方法ですが、これはUNIXやNS-DOSのそれと非常に似てい  ます。書式は以下の通りです。  (1) 同一ブロック内のラベルはラベル名だけで良い(サンプルの5行目)。  (2) 自分の居るブロックの中のローカルブロックの中のラベルを指定するときは    [ ブロック名 !]* ラベル名   とする(サンプルの9行目)。  (3) 自分の居るブロックの外のラベルを指定するには    ..!ラベル名   とする(サンプルの14行目)。 なお「..」だと1つ外(=すぐ外)になるが、   「...」で2つ外、「....」で3つ外・・・という具合になる。  (4) 一番外のブロックから順にたどっていくときは    ![ ブロック名 !]* ラベル名   とする(サンプルの11行目)。  (5) 自分の居るブロックとは違うブロック内のラベルを相対的に指定するには    .[.]* ![ ブロック名 !]* ラベル名   とする(サンプルの25行目)。また、(4)のように直接指定しても良い。 ------------------------------------------------------------------------------  -SAMPLE.ASM- org $bf800         ;1 abc: local              ;2 mv a,0           ;3 l1: inc a            ;4 jrnz l1           ;5 endl              ;6 def: local              ;7 mv a,0           ;8 callf abc!l2         ;9 l3: add ($10),a         ;10 jpf !ghi!abc!abc!l4     ;11 abc: local              ;12 mv a,0           ;13 mv x,..!l3         ;14 add ($10),a         ;15 l2: retf              ;16 l5: nop               ;17 endl              ;18 nop               ;19 endl              ;20 ghi: local              ;21 abc: local              ;22 abc: local              ;23 l4: nop               ;24 mv x,....!def!abc!l5    ;25 endl              ;26 endl              ;27 endl              ;28 end               ;29  -SAMPLE.LST- 0BF800 org $bf800 0BF800 abc: local 0BF800 08 00 mv a,0 0BF802 6C 00 l1: inc a 0BF804 1B 04 jrnz l1 0BF806 endl 0BF806 def: local 0BF806 08 00 mv a,0 0BF808 05 1A F8 0B callf abc!l2 0BF80C 43 10 l3: add ($10),a 0BF80E 03 1D F8 0B jpf !ghi!abc!abc!l4 0BF812 abc: local 0BF812 08 00 mv a,0 0BF814 0C 0C F8 0B mv x,..!l3 0BF818 43 10 add ($10),a 0BF81A 07 l2: retf 0BF81B 00 l5: nop 0BF81C endl 0BF81C 00 nop 0BF81D endl 0BF81D ghi: local 0BF81D abc: local 0BF81D abc: local 0BF81D 00 l4: nop 0BF81E 0C 1B F8 0B mv x,....!def!abc!l5 0BF822 endl 0BF822 endl 0BF822 endl 0BF822 end - Symbols - 0BF800 : ABC 0BF802 : ABC ! L1 0BF806 : DEF 0BF80C : DEF ! L3 0BF812 : DEF ! ABC 0BF81A : DEF ! ABC ! L2 0BF81B : DEF ! ABC ! L5 0BF81D : GHI 0BF81D : GHI ! ABC 0BF81D : GHI ! ABC ! ABC 0BF81D : GHI ! ABC ! ABC ! L4 No fatal error. Code: 0BF800h - 0BF821h [ 34 byte(s)] ------------------------------------------------------------------------------   上記ではブロック名とラベル名を分けて書いてありますが内部では両者を区別して  いませんので、ラベルのつもりでブロック名をオペランドに使用することも全く構い  ません。   以上が階層化ラベルの概要と使い方ですが、考え付いてまだ日が浅いので多少使い  にくい点があるかも知れません。しかしソースプログラムを機能分化して書いたり、  INCLUDE疑似命令を使ったライブラリライクなプログラミングをする際にはきっと役に  立つのではないかと思いますので、有効に活用してやってください。 【6】 階層化ラベルについて(その2)   XASM Ver1.3xでは、ローカルブロック機能を大幅に拡張しました。  たとえば、 scope_on l1: nop local ;---------------------------- l2: nop ; | local ;---- | l3: nop ; |内側のブロック1 | endl ;---- | l4: nop ; |外側のブロック local ;---- | l5: nop ; |内側のブロック2 | endl ;---- | nop ; | endl ;-----------------------------  というようにローカルブロックを定義すると、  外側のブロックからは、l1,l2,l4を参照できます。  内側のブロック1からは、l1,l2,l3,l4を参照できます。  内側のブロック2からは、l1,l2,l4,l5を参照できます。   C言語のスコープみたいな感じで使います。   従来は、同じブロックの中だけしか参照できず、どうしても参照したいときには階  層をさかのぼって..!l1みたいに相対指定するか、!l1みたいに絶対指定するかしなけ  ればなりませんでした。それゆえにXASM Ver1.2xではローカルブロックに名前が必要  だったのです。ちょうど階層ディレクトリみたいな感じです。   新しいXASM Ver1.3xでは、従来の階層ラベル指定の機能もそのまま使えます。  scope_onとするとSCASMと同様の仕様のラベル指定となります。また、scope_onの状  態でも従来のソースリストはそのまま通ります。検索範囲が増えるため多少アセンブ  ルが遅くなります。 【7】 エラーと警告の一覧表   XASMはアセンブル中、ソースコードに不備な点を発見するとエラーまたは警告を  発します。以下はそのエラー&警告メッセージの一覧とその内容を示したものです。 【7.1】 ソース・コードに関するエラー  ●Prebyte error   ・・・プレバイトの指定がおかしい(mv (bp+py),0 など)  ●Division by zero   ・・・0で割ろうとした  ●Operator error   ・・・演算子として適当でない記号、または期待されていない演算子が存在する  ●Unevaluetable operand   ・・・オペランドの書式がおかしいので評価できない  ●Bad internal RAM addressing   ・・・内部RAMの表現または参照方法がおかしい  ●Bad external MEMORY addressing   ・・・外部メモリの表現または参照方法がおかしい  ●Undefined instruction   ・・・存在しない命令や存在しないオペランドの組合せを実行しようとした  ●Bad separator   ・・・区切り記号として適当でない記号を用いているか、必要な区切り記号がない  ●Branch too far   ・・・分岐先が遠すぎて相対分岐命令では分岐できない  ●Label format error   ・・・ラベルとしては書式がおかしい  ●Label not found   ・・・指定されたラベルは未定義である  ●Duplicate label   ・・・同一ブロック内で同一名のラベルを2つ以上定義しようとした  ●"LOCAL" not closed   ・・・LOCALに対応するENDLが存在しない  ●No label before EQU   ・・・同一ステートメント内でEQUの前にラベルが存在しない  ●LOCAL nesting too deep   ・・・LOCALのネストが深すぎる(最高16段まで)  ●ENDL used without LOCAL   ・・・ENDLに対応するLOCALが存在しない  ●EOF comes before END   ・・・ENDが来る前にファイルが終了してしまった  ●' unmatch   ・・・「'(シングルクォート)」の対応関係がおかしい  ●Missing operand   ・・・必要なオペランドが存在しない  ●Missing operator   ・・・必要な演算子が存在しない  ●Numeric format error   ・・・数値表現がおかしい  ●Missing numeric   ・・・必要な数値が存在しない  ●Too complex operand   ・・・オペランドの式表現が複雑すぎる  ●Location counter wandered   ・・・ロケーション・カウンタの値が不定になった  ●EQU undefinable(suspicious label is "xxxxxx")   ・・・ラベル定義が循環しているか矛盾したラベル定義を行なおうとした。原因とし  て疑わしいラベルはxxxxxxである  ●Too many arguments   ・・・LOCALにおいて引数の個数が多すぎる(最大10個)  ●Bad argument number   ・・・定義されていないINCLUDE引数を参照しようとした  ●PRE_PUSH nesting too deep   ・・・PRE_PUSH/POPのネストが深すぎる(最高16段まで)  ●PRE_POP used without PRE_PUSH   ・・・PRE_POPに対応するPRE_PUSHが存在しない  ●PRE_PUSH not closed   ・・・PRE_PUSHに対応するPRE_POPが存在しない  ●Macro name error   ・・・マクロの名前が不適当である  ●Dupulicate macro   ・・・既に同じ名前のマクロを定義している  ●Too many lines in macro   ・・・マクロの行数が長すぎる(最大32行まで)  ●ENDM without MACRO   ・・・ENDMに対応するMACROが存在しない  ●Missing macro parameter   ・・・マクロのパラメーターが不足している  ●Cannot use macro in macro   ・・・マクロ定義の中でマクロ命令を使おうとした 【7.2】 ソース・コードに関する警告  ●Warning: Location counter already set   ・・・ロケーション・カウンタを再定義することによってオブジェクトのアドレスに  矛盾を生じる危険性があるという警告  ●Warning: Used PRE while auto-prebyte is active   ・・・プレバイト自動生成機能が有効であるにも関わらず無駄なプレバイトを生成し  ようとしたことに対する警告  ●Warning: No effective code   ・・・アセンブルしてもオブジェクトに何の影響を与えない命令が存在することに対  する警告  ●Warning: LOCAL and ENDL not match in included file   ・・・ライブラリ化されたソース・コードを想定した場合、被インクルード・ファイ  ル内でローカル・ブロックが閉じていない、不完全な構造であることに対する警告  ●Warning: INCLUDE argument isn't defined yet   ・・・INCLUDEのパラメータに前方参照のラベルを使った  ●Warning: PRE_PUSH and PRE_POP not match   ・・・ライブラリ化されたソース・コードを想定した場合、被インクルード・ファイ  ル内でPRE_PUSH/POPが閉じていない、不完全な構造であることに対する警告 【8】 使用上の注意  ●再帰的なINCLUDE命令の使用はチェックしていないので、そのようなソースコード  を記述してアセンブルすると「Too many open files 」の入出力エラーが出てアセン  ブルを中止します。  ●EQU命令の前であってもラベルの後の「:(コロン)」は省略できません。これにつ  いては様々な意見があるかと思いますが、私は敢えてコロンを取る必要はないと考え  たため、このような仕様にしました。  ●ORG命令でロケーションカウンタの値を再設定すると、オブジェクトの置かれるア  ドレスとジャンプ命令等のオペランドの間に矛盾を生じる可能性があります。ロケー  ションカウンタの再設定はラベル定義の都合上、止むを得ない場合のみにしておいた  ほうが安全です。再設定した後、何らかのオブジェクトを吐く場合にはORG命令の代  わりにDS命令を使用すべきです。   (例) ORG $BF000 -> DS $BF000-*   ただしDS命令はオペランドが大きい数の場合、アセンブルに非常に時間がかかりま  すのでご注意ください。  ●相対分岐命令ではオペランドとローケションカウンタの値からアセンブラが判断し  て自動的に適切な命令を展開しますので、分岐方向を考える必要はありません。  ●オペランドを記述する際に不要な括弧を付けると、命令によってはアセンブラが内  部RAMアドレッシングと勘違いし「Undefined instruction 」を発してアセンブルを  中断してしまうことがあります。不要な括弧は付けないでください。   (例)誤:ADD ($10),($20)  ・・・エラーになる      正:ADD ($10),$20   ・・・正常にアセンブルされる  ●アセンブル中、オペランドにその時点では未定義であってかつ未来においてEQU命  令によって定義されるラベルがある場合にはラベル定義のためにパスが1つ増え、  その分アセンブル終了までに時間がかかります。したがって、出来るだけEQU命令は  そのラベルがオペランドで参照される前に使用したほうが賢明です。   もちろん定義が循環している場合や矛盾する定義はエラーになります。  ●文字定数はDW,DP命令中であっても1文字1バイトで展開されます。 【9】 その他   このプログラムはフリーウェアです。著作権は加古英児および近成人が保持しま  す。配布や転載は、改変せずに、営利を目的とせずに、作者の持つ著作上の権利を  侵害しないようにしてもらえれば、あとは自由に配布転載して結構です。   インターネットのホームページ(http://www.na.rim.or.jp/~kako)にてサポートを 行います。バグ情報や他の処理系のCコンパイラでコンパイルしてみた結果などはそち らでお知らせ下さると嬉しく思います。   最後になりましたが、原作者の近成人氏には原作のソースとドキュメントに手を加  え発表することを許可いただきました。どうもありがとうございました。