ASSEMBLER PASMO JP
Pasmo documentation. (C) 2004-2005 Julián Albo.
Use and distribution allowed under the terms of the GPL license.
Last revision date: 19-apr-2005
Current Pasmo version: 0.5.2
Index.
[訳注:理解を深めるために原文にはないサンプルからの引用を一部追加しています。また、スマートフォン表示時の利便性のため、原文から節の構成を一部変更しています。]
Contents
- 1 概要
- 2 インストール
- 3 コマンドラインからの使用
- 3.1 -d
- 3.2 -1(数字の「1」)
- 3.3 -8
- 3.4 -v
- 3.5 -I(大文字のi)
- 3.6 -B
- 3.7 -E
- 3.8 --86
- 3.9 --bin
- 3.10 --hex
- 3.11 --prl
- 3.12 --cmd
- 3.13 --tap
- 3.14 --tzx
- 3.15 --cdt
- 3.16 --tapbas
- 3.17 --tzxbas
- 3.18 --cdtbas
- 3.19 --plus3dos
- 3.20 --amsdos
- 3.21 --msx
- 3.22 --public
- 3.23 --name
- 3.24 --err
- 3.25 --mocase
- 3.26 --alocal
- 3.27 --bracket
- 3.28 --equ
- 3.29 --w8080
- 4 コード生成モード
- 5 シンボルテーブル
- 6 Source code format.
- 6.1 Generalities.
- 6.2 Directives.
- 6.2.1 .ERROR
- 6.2.2 .SHIFT
- 6.2.3 .WARNING
- 6.2.4 DEFB
- 6.2.5 DEFL
- 6.2.6 DEFM
- 6.2.7 DEFS
- 6.2.8 DEFW
- 6.2.9 DS
- 6.2.10 DW
- 6.2.11 ELSE
- 6.2.12 END
- 6.2.13 ENDIF
- 6.2.14 ENDM
- 6.2.15 ENDP
- 6.2.16 EQU
- 6.2.17 EXITM
- 6.2.18 IF
- 6.2.19 INCLUDE
- 6.2.20 INCBIN
- 6.2.21 IRP
- 6.2.22 LOCAL
- 6.2.23 MACRO
- 6.2.24 ORG
- 6.2.25 PROC
- 6.2.26 PUBLIC
- 6.2.27 REPT
- 6.3 Operators.
- 6.4 Macros.
- 6.5 About suggestions and possible improvements.
- 6.6 Why Pasmo can not generate linkable code?
- 6.7 Game Boy
- 6.8 Thanks
- 6.9 Tricks.
- 6.10 Bugs.
- 6.11 Epilogue.
概要
Pasmoは、マルチプラットフォームのZ80クロスアセンブラーであり、コンパイルと使用が簡単です。多くのZ80マシンとエミュレーターに適したいくつかの形式でオブジェクトコードを生成できます。 Pasmoは固定位置コードを生成します。リンカーで使用する再配置可能なオブジェクトファイルの作成には使用できません。
Pasmoは、いくつかのスタイルの数値および文字列リテラルをサポートし、最も使用されているディレクティブのいくつかの名前を提供することにより、いくつかの古いアセンブラで使用されている構文と互換性があります。 ただし、Pasmoでは、Z80ニーモニック、レジスタおよびフラグの名前とディレクティブは予約語であるため、一部のプログラムで競合するシンボル名の変更が必要になる場合があります。
Pasmoは、z80アセンブリコードに相当する8086を生成することもできます。バイナリ生成モードを使用してms-dosのCOMファイル、または--cmd生成モードを使用してCP / M 86のCMDファイルを作成できます。この機能は実験的なものであり、注意して使用してください。
インストール
http://www.arrakis.es/~ninsesabe/pasmo/ からPasmoをダウンロードします [訳注:このリンクは現在無効なため、次のリンクを参照してくださいhttp://pasmo.speccy.org/]いくつかのバイナリ実行可能ファイルがWebで提供されます。プラットフォームがこれらの間にない場合、または最新バージョンが必要な場合は、ソースパッケージをダウンロードしてコンパイルする必要があります。 Windowsでコンパイルする場合は、提供されるMakefileでcygwinまたはmingwを使用できます。他のコンパイラでは、プロジェクト、ワークスペース、またはコンパイラやIDEが使用するものを作成する必要があります。 コンパイルするには、c++言語(通常はg++〜と呼ばれるパッケージ)を含むgccバージョン2.95以降が必要です。
他のコンパイラも使用できます。C++コンパイラは、修正がほとんどないかまったくない状態でコンパイルする必要があります。 バージョン0.5.2から、configureスクリプトが提供されます。通常の手順である './configure; make; make install'が使用できます。また、テスト版および非安定版リリース用の公式Debianパッケージもあります。
コマンドラインからの使用
Pasmoは、コマンドラインから次のように呼び出されます。
pasmo [options] file.asm file.bin [file.symbol [file.publics] ]
file.asmはソースファイル、file.binは作成されるオブジェクトファイル、file.symbolはオプションでシンボルテーブルが書き込まれるファイル、file.publicsはパブリックシンボルテーブルのファイルです。両方のシンボルファイル名は、生成しない場合は空の文字列にするか、標準出力に書き込むことができます。 --publicオプションを使用すると、これは別の方法で処理されます。以下を参照してください。 オプションは、ゼロまたはそれ以上の以下の内容を含みます。
-d
- アセンブリの2回目のパスでデバッグ情報を表示します。
-1(数字の「1」)
- アセンブリの両方のパス中にデバッグ情報を表示します。
-8
- --w8080と同じ
-v
- 詳細モード。ファイルの読み込み、アセンブリの進行状況などに関する進行情報を表示します。
-I(大文字のi)
- INCLUDEおよびINCBINでファイルを検索するためのリストにディレクトリを追加します。
-B
- --bracketと同じ
-E
- --equと同じ
--86
- Z80の代わりに8086コードを生成します。この機能は実験的です。
--bin
- ヘッダーのない生のバイナリ形式でオブジェクトファイルを生成します。
--hex
- Intel HEX形式のオブジェクトファイルを生成します。
--prl
- CP/M PRL形式のオブジェクトファイルを生成します。
--cmd
- CP/M 86 CMD形式のオブジェクトファイルを生成します。
--tap
- .tap形式のオブジェクトファイルを生成します。
--tzx
- オブジェクトファイルを.tzx形式で生成します。
--cdt
- .cdt形式のオブジェクトファイルを生成します。
--tapbas
- --tapと同じですが、コードの前にBasicローダーを追加します。
--tzxbas
- --txzと同じですが、コードの前にBasicローダーを追加します。
--cdtbas
- --cdtと同じですが、コードの前にBasicローダーを追加します。
--plus3dos
- PLUS3DOS形式のオブジェクトファイルを生成します。
--amsdos
- Amsdos形式のオブジェクトファイルを生成します。
--msx
- MSX形式のオブジェクトファイルを生成します。
--public
- file.symbol名を使用して、パブリックシンボルテーブルのみが生成されます。このオプションを使用する場合、file.symbolは指定しないでください。
--name
- nameヘッダーを使用する形式でヘッダーに入れる名前。指定しない場合、オブジェクトファイル名が使用されます。
--err
- エラー出力ではなく標準出力にエラーメッセージを送信します(オプションのエラーを除く)。
--mocase
- 識別子の大文字と小文字を区別しません。
--alocal
- 自動ローカルモードを使用します。このモードでは、「_」で始まるラベルはすべてローカルです。詳細については、ラベルに関する章を参照してください。
--bracket
- ブラケットのみのモードを使用します。このモードでは、括弧は式でのみ有効です。インダイレクションには括弧を使用する必要があります。
--equ
- シンボルを事前定義します。事前定義されたシンボルは、EQUで定義されたものと同様の方法で処理されます。 black.asmのサンプルファイルには、いくつかの可能な用途が例示されています。構文は次のとおりです。 '--equ label = value' labelは有効なラベル名で、pasmo構文で有効な形式の数値定数でなければなりません。 part = valueはオプションです。指定しない場合、割り当てられる値はFFFF 16進数です。
--w8080
- 8080に相当するものがないZ80命令が使用されたときに警告を表示します。 Z80アセンブラー構文を使用して、8080プロセッサー用のプログラムを簡単に作成できます。
コード生成のオプションが指定されていない場合、デフォルトで--binが使用されます。
-dオプションはpasmo自体をデバッグすることを目的としていますが、asmコードでエラーを見つけるのにも役立ちます。使用すると、情報は標準出力に表示されます。 --errオプションを使用しない限り、エラーメッセージはエラーouptutに送られます。
コード生成モード
デフォルト
もし、生成モードが指定されない場合は--binモードがデフォルトとして使用されます。
--bin mode.
- --binモードは、ヘッダーなしで使用される最初の位置から生成されたコードをダンプするだけです。このモードは、コードの先頭でORG 100Hディレクティブを使用することを想定したCP/MまたはMSXのCOMファイルの直接生成、または他のプログラムでINCBINされるコードブロックの生成に使用できます。
--hex mode.
- --hexモードは、Intel HEX形式のコードを生成します。この形式は、LOADまたはHEXCOM CP / Mユーティリティで使用でき、バイナリ形式よりも簡単に送信でき、一部のPROMプログラミングツールでも使用できます。
--prl mode.
- prl形式は、Digital Research CP/Mオペレーティングシステムのいくつかのバリアントで使用されます。 pasmoでは、CP/M Plusで使用するRSXファイルの作成のみがサポートされています。MP/Mシステムは、実際にテストされているかエミュレートされていないため、MP/MでのPRLファイルの使用はサポートされていません。
--cmd mode.
- --cmdオプションは、CP/M 86の8080メモリモデルを使用してCP/M 86 CMDモードを生成します。--86オプションと組み合わせて使用すると、最小限の変更でCP/M 80ソースからCP/M 86実行可能ファイルを簡単に生成できます。
--tap mode.
- --tapオプションは、コードブロックを含むタップファイルを生成します。ロード位置はコードの先頭に設定されているため、「LOAD "" CODE」命令でBasicからロードできます。
--tzx mode.
- --tapと同じですが、tapの代わりにtzx形式を使用します。
--cdt mode.
- --cdtオプションは、コードブロックを含むcdtファイルを生成します。ロード位置はコードの先頭に設定され、開始アドレスはソースで指定された開始点(存在する場合)であるため、「RUN ""」を使用して実行、または「LOAD ""」を使用してロードします。
--tapbas mode.
- --tapbasオプションを使用すると、Basicローダーとオブジェクトコードを含むコードブロックの2つの部分で.tapファイルが生成されます。Basicローダーは、コードの初期アドレスの前にCLEARを実行し、コードをロードして、エントリポイントが定義されている場合に実行します(ENDディレクティブを参照)。そうすれば、エミュレータでコードを直接起動したり、実際のSpectrumで使用するためにテープに転送したりできます。
--tzxbas mode.
- --tzxbasモード --tapbasと同じですが、tapではなくtzx形式を使用します。
--cdtbas mode.
--tapbasと同じですが、tapの代わりにcdt形式を使用し、Spectrum Basicの代わりにLocomotive Basicローダーを使用します。
--plus3dos mode.
Spectrum +3ディスクで使用されるplus3dos形式のオブジェクトファイルを生成します。このファイルは、LOAD "filename" CODE命令を使用してBasicからロードできます。
--amsdos mode.
- ディスクファイル上のAmstrad CPCが使用するAmsdosヘッダーを含むオブジェクトファイルを生成します。生成されたファイルは、ソースでエントリポイントが指定されている場合、LOAD "filename"、addressでBasicからロードするか、RUN "filename"で実行できます(ENDディレクティブを参照)。
--msx mode.
- MSX BasicのBLOADで使用するヘッダー付きのオブジェクトファイルを生成します。
シンボルテーブル
生成されるシンボルテーブルには、プログラムで使用されるすべての識別子が含まれます。ローカルは、-publicオプションを使用しない限り、使用順に8桁の16進数として表されます。その場合、PUBLICディレクティブで指定されたシンボルのみがリストされます。 シンボルテーブル形式は、EQUディレクティブのリストです。そうすれば、別のソースに含めることで、複数のブロックで構成されるプログラムを作成できます。
Source code format.
Generalities.
ソースコードファイルは、使用するプラットフォームの有効なテキストファイルである必要があります。たとえば、windowsのpasmoでのUNIXテキストファイルの使用はサポートされておらず、結果は未定義です(たとえば、pasmoのビルドに使用されるコンパイラによって異なる場合があります)。垂直タブまたはフォームフィード文字を含むファイルを使用した結果も未定義です。
すべての後;行内はコメントです(もちろん、;は文字列リテラルの一部です)。複数行のコメントはありません。
[訳注sample:undoc.asm 複数行コメントは各行で”;”を使用する]
; undoc.asm ; Test of assembling of undocumented z80 instructions. org 100h ; For tests with cp/m ld a,ixh ld a,ixl ld a,iyh ld a,iyl代わりに
[訳注sample:fill8k.asm “if 0”から”else”までの記述はコメントと同様に処理されないということか]
; fill8k.asm ; ; Generate a file of some size, useful for testing. ; Shows the use of some operators and directives. ; if 0 ; This is for pasmo testing. else fill256 macro local n n defl 0 rept 256 db n n defl n + 1 endm endm endif
文字列リテラルは、文字セット変換なしでオブジェクトファイルに書き込まれます。その後、プラットフォームでpasmoが実行されていた異なる意味を持つ任意のキャラクターの使用は、宛先マシンを回避する必要があり、キャラクターのコードが代わりに使用される場合があります。また、非ASCII互換文字セットを使用するマシンでPasmoを使用することは困難であり、utf-8で記述されたソースは望ましくない結果をもたらす可能性があることも意味します。これは、Pasmoの将来のバージョンで変更される可能性があります。
行は10進数で始まり、その後にブランクが続く場合があります。この番号はアセンブラによって無視され、古いアセンブラとの互換性のために許可されています。エラーで報告される行番号は、これではなくファイル内の行の連続番号です。
[訳注sample]
空白は、文字列リテラルおよび語彙要素を分離する場合にのみ意味があります。任意の数のブランクは、1と同じ意味を持ちます。演算子とオペランドの間に空白を入れることはできますが、同じ文字に接頭辞として他の意味がある場合(たとえば、「$」と「%」)を除いて、必須ではありません。
[訳注sample]
Literals.
Numeric literals.
数値リテラルは、10進数、2進数、8進数、16進数の形式で記述できます。複数のアセンブラのソース形式との互換性を得るために、いくつかの形式が受け入れられます。
$で始まるリテラルは16進定数です。ただし、リテラルが$記号のみである場合を除きます。その場合は演算子です。以下を参照してください。
#で始まるリテラルは16進定数です。ただし、2つの接詞#がある場合を除きます。##演算子を参照してください。
&で始まるリテラルは、&に続く文字に応じて、16進数、8進数、または2進数の定数になります。Hは16進数、Oは8進数、X 16進数を意味します。 16進数。
%で始まるリテラルはバイナリ定数です。ただし、リテラルが%記号のみである場合を除きます。その場合は演算子です。以下を参照してください。
10進数で始まるリテラルは、10進数、2進数、8進数、または16進数です。数字が0で、次の文字がXの場合、数字は16進数です。そうでない場合、リテラルの接尾辞が調べられます。Dは10進数、Bは2進数、Hは16進数、OまたはQは8進数を意味し、その他の場合は10進数と見なされます。たとえば、FFFFhは16進定数ではなく、識別子です。0FFFFhとして接尾辞表記を使用して記述する必要があります。
すべての数値形式では、数字の間に$記号を使用して読みやすくすることができます。それらは無視されます。
[訳注sample:echovars.asm]
. . . begin: ld hl, 0 add hl, sp ld (ret$stack), hl ld sp, loc$stack ld c, pstring ld de, test$msg call next ld hl, (ret$stack) ld sp, hl ld hl, 0031h ld c, 12 call next ret test$msg: db cr, lf, '***** ECHOVERS *****$' ret$stack: dw 0 ds 32 loc$stack:
String literals.
文字列リテラルには、単一引用符または二重引用符で区切られた2つの形式があります。 単一引用符で区切られた文字列リテラルはより単純な形式で、すべての文字は特別な解釈なしに文字列に含まれますが、2つの連続した単一引用符が文字列に含まれる1つの単一引用符文字として扱われるという唯一の例外があります。たとえば、単一引用符で区切られた文字列'That''s all folks'は、二重引用符で区切られた"That's all folks"と同じ文字列を生成します。 二重引用符で区切られた文字列リテラルは、CおよびC++言語と同様の方法で解釈されます。 \文字はエスケープ文字として解釈され、次の解釈が行われます。nは改行文字(16進0A)、rは復帰(16進0D)、tはタブレータ(16進09)、aはベル(16進07)、xは、次の2つの文字がcharの16進コードと見なされ、そのコードを持つcharが挿入され、8進数のプレフィックスが最大3桁の8進数で始まり、対応する文字が挿入されることを示す文字列、文字\および "は、文字列に自分自身を挿入することを意味し、その他の文字は将来の使用のために予約されています。 長さ1の文字列リテラルは、含まれる文字の数値と共に数値定数として使用できます。これにより、 'A' + 80hなどの式を期待どおりに評価できます。
Identifiers.
識別子は、ラベル、EQUおよびDEFLシンボル、およびマクロ名とパラメーターに使用される名前です。 Z80ニーモニック、レジスタおよびフラグ名、およびpasmoオペランドとアセンブルディレクティブの名前は予約されており、識別子の名前として使用することはできません。大文字と小文字を区別するモードが使用されている場合でも、予約名は大文字と小文字を区別しません。 次の「文字」は、大文字または小文字の英文字を意味します。他の言語の文字に対応する文字は識別子に使用できません。 識別子は文字「_」、「?」、「@」または「.」で始まり、その後にゼロ個以上の文字、10進数、「_」、「?」、「@」、「.」が続きます。または「$」。 「$」は無視されますが、「$」が埋め込まれたまたは追加された予約語はそのように認識されません。 「_」で始まる識別子は、オートローカルモードを使用する場合に特別です。詳細については、-alocalオプションとラベルに関する章を参照してください。 オプション--nocaseを使用しない場合、識別子は大文字と小文字が区別されます。 --nocaseを使用すると、常に大文字に変換されます。
File names.
ファイル名は、INCLUDEおよびINCBINディレクティブで使用されます。それらは特別なルールに従います。 二重引用符で始まるファイル名は別の二重引用符で終わる必要があり、ファイル名には特別な解釈なしにそれらの間のすべての文字が含まれます。 単一引用符で始まるファイル名は別の単一引用符で終わる必要があり、ファイル名には特別な解釈なしにそれらの間のすべての文字が含まれます。 それ以外の場合は、次の空白または行末までのすべての文字がファイル名の一部と見なされます。空白文字はスペースとタブです。
Labels.
ラベルは、任意の行の先頭、アセンブラーのニーモニックまたはディレクティブの前に配置できます。オプションで「:」を続けることができますが、他のアセンブラとの互換性のために、ディレクティブで使用することは推奨されません。ニーモニックもディレクティブもないラベルのある行も有効です。 ラベルは、MACRO、EQU、およびDEFLディレクティブで特別な意味を持ちます。それ以外の場合、現在のコード生成位置の値がラベルに割り当てられます。 ラベルは定義の前に使用できますが、DEFLで割り当てられたラベルでこれを行った結果は未定義です。 ラベルのすべての割り当てでDEFLを使用しない限り、ラベルの値を変更することはできません。ラベルに割り当てられた値がアセンブリの2つのパスで異なる場合、プログラムは違法ですが、エラーが生成されることは保証されません。ただし、最初のパスで未定義の値を割り当てることは有効です(たとえば、まだ定義されていないラベルを含む式を使用して)。 デフォルトモードでは、MACRO、REPT、またはIRPブロックにLOCALとして宣言されていない限り、ラベルはグローバルです。詳細については、LOCALディレクティブを参照してください。 --alocalコマンドラインオプションを使用して導入された自動ローカルモードでは、「_」で始まるラベルはすべてローカルです。その領域は、次の非ローカルラベル、または次のPROC、LOCAL、MACRO、ENDP、ENDMディレクティブで終了します。 自動および明示的なローカルラベルは両方とも、ソースでのラベルの最初の使用に対応する8桁の16進数としてシンボルテーブルリストに表されます。
Directives.
Pasmoでサポートされているディレクティブのリスト(アルファベット順)。
.ERROR
行がアクティブに使用されている場合、つまり、マクロが展開されている場合はマクロで、現在の分岐が取得されている場合はIFで、アセンブリ中にエラーを生成します。ディレクティブに続くすべてのテキストは、エラーメッセージとして使用されます。
.SHIFT
MACRO引数をシフトします。マクロに関する章を参照してください。
.WARNING
.ERRORと同じですが、エラーを生成する代わりに警告メッセージを出力します。 DB バイトを定義します。引数は、文字列リテラルまたは数値式のコンマ区切りリストです。文字列リテラルはオブジェクトコードに挿入され、数値式の結果は単一バイトとして挿入され、必要に応じて切り捨てられます。
DEFB
DEFB DEFine Byte、DBと同じ。
DEFL
DEFL ラベルを定義します。ラベルを前に付ける必要があります。引数は数値式である必要があり、結果はラベルに割り当てられます。使用されるラベルは、他のDEFLディレクティブで再定義できます。
DEFM
DEFineメッセージ、DBと同じ。
DEFS
DSと同じスペースを定義します。
DEFW
DEFW DWと同じ。
DS
DS スペースを定義します。 1つまたは2つのコンマ区切りの引数を取ります。最初または唯一の引数は、定義するスペースの量(バイト単位)です。 2番目は、0が使用される場合にスペースを埋めるために使用される値です。
DW
DW Wordを定義します。引数は、数値式のコンマ区切りリストです。各数値式は2バイトのワードとして評価され、結果はZ80ワード形式のコードに挿入されます。
ELSE
IF参照。
END
アセンブリを終了します。このディレクティブの後のすべての行は無視されます。引数がある場合、数値式として評価され、結果はプログラムのエントリポイントとして設定されます。エントリポイントを設定した結果は、使用するコード生成の種類によって異なりますが、この場合でもドキュメント作成に使用できます。
ENDIF
IF参照。
ENDM
マクロを終了します。マクロに関する章を参照してください。
ENDP
PROCブロックの終了をマークします。PROCを参照してください。
EQU
等しいラベルを前に付ける必要があります。引数は数値式である必要があり、結果はラベルに割り当てられます。使用されるラベルは再定義できません。
EXITM
マクロを終了します。マクロに関する章を参照してください。
IF
条件付きアセンブリ。引数は数値式である必要があります。0の結果はfalse、それ以外はtrueとみなされます。引数がtrueの場合、IFセクションの終わりまたはELSEディレクティブが検出されるまで次のコードがアセンブルされ、そうでない場合は無視されます [訳注:そのため”if 0”は複数行コメントのように扱うことができます]。 ELSEディレクトリが存在する場合、引数がtrueであれば次のコードは無視され、falseであればアセンブルされます。 IFセクションは、ENDIFまたはENDMディレクティブで終了します(最後のケースでは、ENDMにも通常の効果があります)。 IFはネストできます。その場合、各ELSEおよびENDIFは対応するIFでのみ有効になりますが、ENDMは保留中のIFセクションをすべて終了します。
INCLUDE
ファイルを含めます。引数で使用される規則については、ファイル名の章を参照してください。ファイルが読み取られ、結果は、ファイルがINCLUDE行ではなく現在のファイルにコピーされた場合と同じです。 含まれるファイルには、INCLUDEディレクティブなどが含まれる場合があります。 INCLUDEディレクティブはアセンブリフェーズの前に処理されるため、IFディレクティブを使用して条件付きで異なるファイルを含めることはできません。
INCBIN
バイナリを含む。バイナリファイルを含めます。バイナリファイルを読み取り、生成されたコードの現在の位置にコンテンツを挿入します。引数で使用される規則については、ファイル名の章を参照してください。
IRP
IRP parameter, argument list.
引数を置換するコードのブロックを繰り返します。マクロに関する章を参照してください。
LOCAL
現在のブロックに対してローカルとして識別子をマークします。ブロックは、MACRO、REPT、IRP、またはPROCディレクティブである場合があり、ローカルambitは対応するENDMまたはENDPディレクティブで終了します。アンビットは、ブロックの先頭ではなく、LOCALディレクティブで始まります。注意してください。 同じ識別子の複数のローカル宣言が同じブロックで使用されている場合、最初の宣言のみが有効で、他の宣言は無視されます。
MACRO
マクロを定義します。マクロに関する章を参照してください。
ORG
生成されたコードを配置する原点位置を確立します。同じプログラムで複数のORGディレクティブを使用できますが、生成されたコードが以前のコードを上書きする結果になる場合、結果は未定義です。
PROC
PROCブロックの開始をマークします。唯一の効果は、LOCALディレクティブの領域を定義することです。ブロックは、対応するENDPディレクティブで終了します。 PROCブロックでサブルーチンを囲むことをお勧めしますが、他の状況でも使用できます。
PUBLIC
引数は、コンマで区切られた識別子のリストです。各識別子はパブリックとしてマークされます。 --publicコマンドラインオプションを使用すると、パブリックとしてマークされた識別子のみがシンボルテーブルリストに含まれます。
REPT
ブロックを繰り返します。マクロに関する章を参照してください。
Operators.
Generalities.
すべての数値は、必要に応じて2の補数またはトラクティングを使用して、符号なしの16ビットとして取得されます。論理演算子は、trueの場合はFFFF hexを返し、falseの場合は0を返します。引数の0はfalseで、その他の値はtrueです。 括弧を使用して、式の一部をグループ化できます。また、許可または要求するz80命令でインダイレクションを表現するためにも使用されます。これにより、インダイレクションが許可されている場所で括弧で囲まれた式を使用すると、いくつかのエラーが発生する可能性があります。 Pasmoは、いくつかのヒューリスティックを使用して、式を正しく解釈できるようにしますが、完全にはほど遠い状態です。
括弧のみのモードを使用すると、括弧は式をグループ化するという独自の意味を持ち、間接指定には括弧が必要であるため、あいまいさが解消されます。 短絡評価:&&および||演算子と条件式は短絡されています。これは、演算子の1つを評価する必要がない場合、エラーを生成せずに未定義のシンボルまたは0による除算を含めることができることを意味します(ただし、正しい構文が必要です)。条件式では、これは成立しない分岐に適用されます。&&演算子では、最初のオペランドがfalseの場合は2番目のオペランドに、||では最初のオペランドが真の場合、2番目のオペランドに、というように。
Table of precedence.
優先順位による演算子の表、同じ行の演算子は同じ優先順位を持ちます。
## (see note) $, NUL, DEFINED *, /, MOD, %, SHL, SHR, <<, >> +, - (binary) EQ, NE, LT, LE, GT, GE, =, !=, <, >, <=, >= NOT, ~, !, +, - (unary) AND, & OR, |, XOR && || HIGH, LOW ?
##演算子は特別な場合で、マクロ展開中に処理されます。マクロに関する章を参照してください。
List of operators.
!
- 論理否定。引数が0の場合はtrue、それ以外の場合はfalseを返します。
!=
- NEと同じ。
- 識別子貼り付け演算子。マクロに関する章を参照してください。
- 現在の文の先頭の位置カウンタの値を提供します。たとえば、DWディレクティブでは、現在のアイテムではなく、リスト内の最初のアイテムの位置を指定します。
- MODと同じ。
&
- ANDと同じです。
&&
- 論理的両方のオペランドが真の場合、真。
*
- 乗算。
+
- 加算または単項+。
-
- 減算または単項-。
/
- 切り捨てられた整数の除算。
<
- LTと同じ
<<
- SHLと同じ
<=
- LEと同じ
=
- EQと同じ
>
- GTと同じ
>=
- GEと同じ
>>
- SHRと同じ
?
- 条件式。 ?の右側の式の場合、:で区切られた2つの式が続く必要があります。 trueの場合、最初の式が評価され、falseの場合、2番目の式が評価されます。
|
- ORと同じ。
||
- 論理的または。彼のオペランドの1つがtrueの場合、true。
〜
- NOTと同じ
AND
- ビット単位のAND演算子。
DEFINED
- 引数は識別子でなければなりません。結果は、識別子が定義されている場合はtrue、定義されていない場合はfalseです。
EQ
- 等しい。両方のオペランドが等しい場合はtrue、そうでない場合はfalse。
GE
- より大きいか等しい。左のオペランドが右より大きいか等しい場合は真。
GT
- より大きい。左のオペランドが右より大きい場合は真。
HIGH
- 引数の上位バイトを返します。
LE
- 以下。左のオペランドが右よりも小さいか等しい場合は真。
LOW
- 引数の下位バイトを返します。
LT
- 未満。 lefthオペランドが右より小さい場合はtrue。
MOD
- 係数。整数除算の残り。
NE
- 等しくない。両方のオペランドが等しい場合はfalse、そうでない場合はtrue。
NOT
- ビット単位ではありません。このオペランドの1の補数を返します。
NUL
- 右に何かがある場合はtrueを返し、それ以外の場合はfalseを返します。引数がマクロのパラメーターである場合に役立ちます。
OR
- ビット単位のOR演算子。
SHL
- シフト左。ゼロで埋めて、右オペランドで指定されたビット数だけ左にシフトした左オペランドを返します。
SHR
- シフト右。右側のオペランドで指定されたビット数だけ右側にシフトされ、ゼロで埋められた左側のオペランドを返します。
XOR
- ビット単位のxor(排他的OR)演算子。
Macros.
Generalities.
マクロディレクティブには、適切なMACROディレクティブと、繰り返しディレクティブREPTおよびIRPの2種類があります。さらに、ENDMおよびEXITMディレクティブは、マクロ展開の終了を制御します。 マクロパラメーターは、マクロが展開されたときに適用される引数の値に置き換えられる識別子です。引数は空にすることも、1つ以上のトークンで構成することもできます。 MACROが別のマクロディレクティブ内で定義されている場合、外部パラメーターは置換されません。他のマクロディレクティブでは、パラメーターの置換は最も外部のディレクティブによって開始されます。 NUL演算子を使用して、引数が空でないかどうかを確認できます。 .SHIFTディレクティブを使用して、不特定の数の引数を処理できます。 識別子の貼り付け:MACRO内で演算子##を使用して2つの識別子を結合し、別の識別子を作成できます。これは、マクロ引数に依存する識別子を作成できるようにすることを目的としています。
Directives.
.SHIFT
MACRO内でのみ使用できます。 MACRO引数は1つ左の場所に配置され、最初の引数は破棄されます。シフト後にパラメーターリストを埋めるのに十分な引数がない場合、残りの引数は未定義になります。
ENDM
ENDM 現在のMACRO定義、または現在のREPTまたはIRPブロックの終了をマークします。マクロブロックに含まれるすべてのIFブロックも閉じられます。
EXITM
EXITM 現在のMACRO、REPT、またはIRPブロックを終了します。 MACROの場合、マクロ展開は終了します。他の場合、ブロックのコード生成は終了し、対応するENDMの後にアセンブリが続行されます。
IRP
IRP parameter, argument list.
引数ごとに、IRPディレクティブと対応するENDMの間でコードのブロックを1回繰り返します
MACRO
大きい マクロを定義します。使用できる形式は2つあります。
名前MACRO [パラメーターのリスト]
name MACRO [ list of parameters]
または:
MACRO name [ , list of parameters]
すべての場合において、パラメーターのリストは識別子のコンマ区切りリストであり、名前は作成されたマクロに割り当てられた名前です。 マクロを使用するには、単に名前を指定し、オプションで引数のリストを指定します。引数リストは、マクロのパラメーターリストと同じ長さである必要はありません。長い場合、余分な引数は使用されませんが、MACRO内で.SHIFTを使用して取得できます。短い場合、一部のパラメーターが未定義になります。これは、NUL演算子を使用してMACRO内でテストできます。
REPT
REPTディレクティブと対応するENDMの間のコードブロックを、引数で指定された回数繰り返します。引数は0にすることができます。その場合、ブロックはスキップされます。 さらに、ループ変数を指定できます。このvarはマクロパラメーターではなく、LOCAL DEFLシンボルとして使用され、その値はループの反復ごとに増分されます。初期値とincementを指定でき、デフォルトはそれぞれ0と1です。
About suggestions and possible improvements.
Pasmoの前提は、クロスアセンブラーであり、多くの利用可能なリソースがあるマシンで使用される場合です。それから私は、Pasmoにそれを含める方がはるかに便利だと思う(または他の人が私に納得させる)ことをしない限り、他のユーティリティで簡単にできることをする手段を提供する努力をしません。 たとえば、sinテーブルを作成する場合は、テーブルにファイルを書き込み、そのファイルをINCLUDEするお気に入りの言語でプログラムを作成できます。また、そのタイプのことを自動化する場合は、makeを使用できます。 それを考慮に入れて、私はPasmoを改善するための提案とそれを実装するパッチを受け入れています。後者の場合は、オペレーティングシステムやコンパイラに依存せずに、ポータブルな方法で物事を書くように注意してください。
Why Pasmo can not generate linkable code?
Pasmoには、メモリの絶対アドレスを使用する単純なコードジェネレーターがあります。そのため、リンカで使用するための再配置可能なコードを生成するように適合させることが難しくなります。私は今のところそれをする予定はありません、誰かが貢献したいのでしょうか?
Game Boy
ゲームボーイ。 一部の人々は、Game Boyプログラミングのサポートを追加するよう提案しました。 2つの問題があります。Pasmoでコードを生成するために使用される単純化された方法と、Game Boyについての私の存在しない知識です。
Thanks
提案を行い、バグを通知または修正したすべての人々に感謝します。そして、彼らがPasmoで行う美しいことを私に見せてくれます。
Tricks.
Pasmoを使用して、任意のバイナリファイルを.tapに変換できます。たとえば、convert.asmと呼ばれる小さなプログラムを作成します。
ORG address_to_load_the_file INCBIN file.bin
次のようにアセンブルします:--tap convert.asm file.tap。サポートされている他の形式でも同じことが行われます。
Bugs.
Pasmoは、 'ld b、(nn)'など、存在しないz80命令の行に見える式を使用すると警告を発しますが、 'ld b、(i1 + i2)のような場合にも警告を検出する簡単な方法*(i3 + i4) '。 その場合の警告を回避する方法は、式の前に括弧「+」または「0 +」を付けることです。 ブラケットのみのモードを使用すると、問題は存在しません。その場合、括弧は常に表現として扱われ(そしてプログラマーはそれを知っているはずです)、したがって警告は発せられません。 それについてのさらなる提案は歓迎です。 名前にブランク、シングル、ダブルクォートが含まれるファイルを含める方法はありません。誰かがそのようなファイル名を使用していますか?
Epilogue.
それはすべての人々です! コメントや批判を送信してください: julian.notfound[訳注:atをエスケープして表示します]gmail.com 有効なHTML 4.0!