Changes

ASSEMBLER PASMO JP

7,372 bytes added, 17:24, 20 December 2020
数値リテラル
[訳注:理解を深めるために原文にはないサンプルからの引用を一部追加しています。また、スマートフォン表示時の利便性のため、原文から節の構成を一部変更しています。]
 
=概要=
=コマンドラインからの使用=
<div id="command_line"></div>
Pasmoは、コマンドラインから次のように呼び出されます。
Pasmoは、コマンドラインから次のように呼び出されます。 pasmo [options] file.asm file.bin [file.symbol [ file.publics ]]
pasmo [options] file.asm fileasmはソースファイル、file.binは作成されるオブジェクトファイル、file.symbolはオプションでシンボルテーブルが書き込まれるファイル、file.bin publicsはパブリックシンボルテーブルのファイルです。シンボルファイル名は、ファイルを生成しない場合は空の文字列に、標準出力に書き出す場合は”-“を指定します。 --publicオプションを使用する場合は別の方法で処理されます。[file.symbol [file.publics#public_mode|以下を参照] ]してください。
file.asmはソースファイル、file.binは作成されるオブジェクトファイル、file.symbolはオプションでシンボルテーブルが書き込まれるファイル、file.publicsはパブリックシンボルテーブルのファイルです。両方のシンボルファイル名は、生成しない場合は空の文字列にするか、標準出力に書き込むことができます。 オプションは、ゼロまたはそれ以上の以下の内容を含みます。[訳注:ハイフン2文字のオプションの多くは生成するコードの”モード”を指定します。これはクロス開発時のターゲット、およびフォーマットを指定するものです。詳細は[[#public_modecode_generation_mode|--publicオプション次節]]を使用すると、これは別の方法で処理されます。以下を参照してください。 オプションは、ゼロまたはそれ以上の以下の内容を含みます。 [訳注:ハイフン2文字のオプションの多くは生成するコードの”モード”を指定します。これはクロス開発時のターゲット、およびフォーマットを指定するものです。詳細は次節参照参照]
===--bin===
:ヘッダーのない生のバイナリ形式でオブジェクトファイルを生成します。 [[#bin_mode|ヘッダーのない生のバイナリ形式]]でオブジェクトファイルを生成します。
===--hex===
===--msx===
:MSX形式のオブジェクトファイルを生成します。[[#msx_mode|MSX形式のオブジェクトファイル]]を生成します。
===--public===
<div id="public_mode"></div>:[訳注:3項目の引数の]file.symbol名を使用して、パブリックシンボルテーブルのみが生成されます。このオプションを使用する場合、filesymbol名を使用して[訳注:通常のfile.symbolではなくfile.publicsとして]パブリックシンボルテーブルのみが生成されます。このオプションを使用する場合、file.symbolは指定しないでください。[訳注:引数を4項指定するとエラーになります]
===--name===
:エラー出力ではなく標準出力にエラーメッセージを送信します(オプションのエラーを除く)。
===--mocasenocase===
:識別子の大文字と小文字を区別しません。
===--alocal===
 :自動ローカルモードを使用します。このモードでは、「_」で始まるラベルはすべてローカルです。詳細については、ラベルに関する章を参照してください。自動ローカルモードを使用します。このモードでは、「_」で始まるラベルはすべてローカルです。詳細については、[[#label|ラベルに関する章]]を参照してください。
===--bracket===
===--equ===
:シンボルを事前定義します。事前定義されたシンボルは、EQUで定義されたものと同様の方法で処理されます。 black.asmのサンプルファイルには、いくつかの可能な用途が例示されています。構文は次のとおりです。 asmのサンプルファイルには、いくつかの可能な用途が例示されています。 [訳注sample:black.asm]  ; black.asm ; Fills slowly the spectrum screen. ; This program test some capabilities of Pasmo. ; Try for example: ; pasmo --tapbas black.asm black.tap ; pasmo --tapbas --equ NODELAY black.asm black.tap ; pasmo --tapbas --equ DELAYVALUE=0F000h black.asm black.tap ; To run it in fuse, for example: ; fuse black.tap ; Testing ? short-circuit operator org defined LOADPOS ? LOADPOS : 30000 if defined FILLVALUE value equ FILLVALUE else value equ 0FFh endif . . . 構文は次のとおりです。 '--equ label = value' labelは有効なラベル名で、pasmo構文で有効な形式の数値定数でなければなりません。 part labelは有効なラベル名で、pasmoの書式で有効な形式の数値定数でなければなりません。 = valueはオプションです。指定しない場合、割り当てられる値はFFFF 16進数です。valueの部分はオプションです。指定しない場合16進数のFFFFが割り当てられます。
===--w8080===
=コード生成モード=
<div id= "code_generation_mode" ></div>
=== デフォルト===
もし、生成モードが指定されない場合は--binモードがデフォルトとして使用されます。
=== --bin mode. ===
<div id="bin_mode" ></div>
:--binモードは、ヘッダーなしで使用される最初の位置から生成されたコードをダンプするだけです。このモードは、コードの先頭でORG 100Hディレクティブを使用することを想定したCP/MまたはMSXのCOMファイルの直接生成、または他のプログラムでINCBINされるコードブロックの生成に使用できます。
=== --hex mode. ===
:--hexモードは、Intel HEX形式のコードを生成します。この形式は、LOADまたはHEXCOM CP / Mユーティリティで使用でき、バイナリ形式よりも簡単に送信でき、一部のPROMプログラミングツールでも使用できます。
=== --prl mode. ===
=== --msx mode.===
<div id="msx_mode"></div>
:MSX BasicのBLOADで使用するヘッダー付きのオブジェクトファイルを生成します。
ld a,iyl
代わりに<div id=“comment_if0”"comment_if0">IF 0 .... ENDIF</div>を使用できます(ただし、INCLUDEを参照)。
[訳注sample:fill8k.asm “if 0”から”else”までの記述は処理されないのでコメントと同様に使用できる]
#で始まるリテラルは16進定数です。ただし、2つの接詞#がある場合を除きます。[[#operator_doublesharp|##演算子を参照]]してください。
&で始まるリテラルは、&に続く文字に応じて、16進数、8進数、または2進数の定数になります。Hは16進数、Oは8進数、X 16進数を意味します。 16進数。 このいずれでもない場合、文字は有効な16進数である必要があり、定数は16進数です。
%で始まるリテラルはバイナリ定数です。ただし、リテラルが%記号のみである場合を除きます。その場合は演算子です。%で始まるリテラルは2進数の定数です。ただし、リテラルが%記号のみである場合を除きます。その場合は演算子です。[[#operator_percent|以下を参照]]してください。
10進数で始まるリテラルは、10進数、2進数、8進数、または16進数です。数字が0で、次の文字がXの場合、数字は16進数です。そうでない場合、リテラルの接尾辞が調べられます。Dは10進数、Bは2進数、Hは16進数、OまたはQは8進数を意味し、その他の場合は10進数と見なされます。たとえば、FFFFhは16進定数ではなく、識別子です。0FFFFhとして接尾辞表記を使用して記述する必要があります。
すべての数値形式では、数字の間に$記号を使用して読みやすくすることができます。それらは無視されます。
[訳注sample:echovars.asm]=文字列リテラル=
.文字列リテラルには、単一引用符または二重引用符で区切られた2つの形式があります。 . . 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, 単一引用符で区切られた文字列リテラルはより単純な形式で、すべての文字は特別な解釈なしに文字列に含まれますが、2つの連続した単一引用符が文字列に含まれると、1つの単一引用符文字として扱われるという唯一の例外があります。たとえば、単一引用符で区切られた文字列'That<nowiki>''</nowiki>s all folks'***** ECHOVERS *****$は、二重引用符で区切られた"That' ret$stack: dw 0 ds 32 loc$stack:s all folks"と同じ文字列を生成します。
=文字列リテラル=二重引用符で区切られた文字列リテラルは、CおよびC++言語と同様の方法で解釈されます。 \文字はエスケープ文字として解釈され、次の解釈が行われます。nは改行文字(16進0A)[訳注:CR]、rは復帰(16進0D)[訳注:LF]、tはタブレータ(16進09)、aはベル(16進07)、xは、次の2つの文字がcharの16進コードと見なされ、そのコードを持つcharが挿入されます。8進数のプレフィックスは最大3桁の8進数で始まり、対応する文字が挿入されます。文字\および "は、文字列に自分自身を挿入することを意味し、その他の文字は将来の使用のために予約されています。
文字列リテラルには、単一引用符または二重引用符で区切られた2つの形式があります。 単一引用符で区切られた文字列リテラルはより単純な形式で、すべての文字は特別な解釈なしに文字列に含まれますが、2つの連続した単一引用符が文字列に含まれる1つの単一引用符文字として扱われるという唯一の例外があります。たとえば、単一引用符で区切られた文字列'That<nowiki>''</nowiki>s all folks'は、二重引用符で区切られた"That's all folks"と同じ文字列を生成します。 二重引用符で区切られた文字列リテラルは、CおよびC++言語と同様の方法で解釈されます。 \文字はエスケープ文字として解釈され、次の解釈が行われます。nは改行文字(16進0A)[訳注:CR]、rは復帰(16進0D)[訳注:LF]、tはタブレータ(16進09)、aはベル(16進07)、xは、次の2つの文字がcharの16進コードと見なされ、そのコードを持つcharが挿入され、8進数のプレフィックスが最大3桁の8進数で始まり、対応する文字が挿入されることを示す文字列、文字\および "は、文字列に自分自身を挿入することを意味し、その他の文字は将来の使用のために予約されています。 長さ1の文字列リテラルは、含まれる文字の数値と共に数値定数として使用できます。これにより、 'A' + 80hなどの式を期待どおりに評価できます。
=識別子=
 識別子は、ラベル、EQUおよびDEFLシンボル、およびマクロ名とパラメーターに使用される名前です。 Z80ニーモニック、レジスタおよびフラグ名、およびpasmoオペランドとアセンブルディレクティブの名前は予約されており、識別子の名前として使用することはできません。大文字と小文字を区別するモードが使用されている場合でも、予約名は大文字と小文字を区別しません。 次の「文字」は、大文字または小文字の英文字を意味します。他の言語の文字に対応する文字は識別子に使用できません。 識別子は文字「_」、「?」、「 以降の「文字」は、大文字または小文字の英文字を意味します。他の言語の文字に対応する文字は識別子に使用できません。  識別子は文字、「_」、「?」、「@」または「.」で始まり、その後にゼロ個以上の文字、10進数、「_」、「?」、「@」、「.」が続きます。または「」または「$」。 」が続きます。 「$」は無視されますが、「$」が埋め込まれたまたは追加された予約語はそのように認識されません。  「_」で始まる識別子は、オートローカルモードを使用する場合に特別です。詳細については、-alocalオプションとラベルに関する章を参照してください。 alocalオプションと[[#label|ラベルに関する章]]を参照してください。  オプション--nocaseを使用しない場合、識別子は大文字と小文字が区別されます。 --nocaseを使用すると、常に大文字に変換されます。
=ファイル名=
<div id="filename"></div>
ファイル名は、INCLUDEおよびINCBINディレクティブで使用されます。それらは特別なルールに従います。 二重引用符で始まるファイル名は別の二重引用符で終わる必要があり、ファイル名には特別な解釈なしにそれらの間のすべての文字が含まれます。 単一引用符で始まるファイル名は別の単一引用符で終わる必要があり、ファイル名には特別な解釈なしにそれらの間のすべての文字が含まれます。 それ以外の場合は、次の空白または行末までのすべての文字がファイル名の一部と見なされます。空白文字はスペースとタブです。
=ラベル=
ラベルは、任意の行の先頭、アセンブラーのニーモニックまたはディレクティブの前に配置できます。オプションで「:」を続けることができますが、他のアセンブラとの互換性のために、ディレクティブで使用することは推奨されません。ニーモニックもディレクティブもないラベルのある行も有効です。 ラベルは、任意の行の先頭、アセンブラーのニーモニックまたはディレクティブの前に配置できます。オプションで「:」を続けることができますが、他のアセンブラとの互換性のために、ディレクティブで使用することは推奨されません。ニーモニックもディレクティブもないラベルのある行も有効です。 ラベルは、MACRO、EQU、およびDEFLディレクティブで特別な意味を持ちます。それ以外の場合、現在のコード生成位置の値がラベルに割り当てられます。  ラベルは定義の前に使用できますが、DEFLで割り当てられたラベルでこれを行った結果は未定義です。 ラベルのすべての割り当てでDEFLを使用しない限り、ラベルの値を変更することはできません。ラベルに割り当てられた値がアセンブリの2つのパスで異なる場合、プログラムは違法ですが、エラーが生成されることは保証されません。ただし、最初のパスで未定義の値を割り当てることは有効です(たとえば、まだ定義されていないラベルを含む式を使用して)。 デフォルトモードでは、MACRO、REPT、またはIRPブロックにLOCALとして宣言されていない限り、ラベルはグローバルです。詳細については、LOCALディレクティブを参照してください。  ラベルのすべての割り当てでDEFLを使用しない限り、ラベルの値を変更することはできません。ラベルに割り当てられた値がアセンブリの2つのパスで異なる場合、プログラムは不正ですが、エラーが生成されることは保証されません。ただし、最初のパスで未定義の値を割り当てることは有効です(たとえば、まだ定義されていないラベルを含む式を使用して)。 デフォルトモードでは、MACRO、REPT、またはIRPブロックにLOCALとして宣言されていない限り、ラベルはグローバルです。詳細については、[[#local_directive|LOCALディレクティブ]]を参照してください。<div id="label"></div>--alocalコマンドラインオプションを使用して導入された自動ローカルモードでは、「_」で始まるラベルはすべてローカルです。その領域は、次の非ローカルラベル、または次のPROC、LOCAL、MACRO、ENDP、ENDMディレクティブで終了します。 自動および明示的なローカルラベルは両方とも、ソースでのラベルの最初の使用に対応する8桁の16進数としてシンボルテーブルリストに表されます。 [訳注sample:alocal.asm]  ; alocal.asm ; Test of autolocal mode in CP/M. bdos equ 5 conout equ 2 start org 100h jp _hola _exit db "Good morning.\r\n", 0 _hola ld hl, _exit call showtext jp hola showtext _hola ld a, (hl) cp 0 jp z, _exit push hl ld e, a ld c, conout call bdos pop hl inc hl jp _hola _exit ret hola ld hl, _exit call showtext jp 0 _exit db "Hello, autolocal world\r\n", 0 end start  自動的、及び明示的なローカルラベルは両方とも、ソースでのラベルの最初の使用に対応する8桁の16進数としてシンボルテーブルリストに表示されます。
=ディレクティブ=
===.ERROR===
行がアクティブに使用されている場合、つまり、マクロが展開されている場合はマクロで、現在の分岐が取得されている場合はIFで、アセンブリ中にエラーを生成します。ディレクティブに続くすべてのテキストは、エラーメッセージとして使用されます。  [訳注sample:align.asm]  ; (C) 2004 Julian Albo ; This code may be freely used. ;-------------------------------------------------------------------- ; Sample of macro that can be used to align the current position to ; a multiple of some number, like the align and aligndata directives ; of some oher assemblers. ;-------------------------------------------------------------------- align macro n local newpos, oldpos oldpos equ $ newpos equ (oldpos + n - 1) / n * n if newpos < oldpos .error Align out of memory endif . . .
===.SHIFT===
:MACRO引数をシフトします。マクロに関する章を参照してください。
 
[訳注sample:tmacro.asm]
 
.
.
.
pushmany macro reg
rept -1
if nul reg
exitm
endif
push reg
.shift
endm
endm
.
.
.
===.WARNING===
:.ERRORと同じですが、エラーを生成する代わりに警告メッセージを出力します。  ===DB ===<div id="directive_db"> </div>:バイトを定義します。引数は、文字列リテラルまたは数値式のコンマ区切りリストです。文字列リテラルはオブジェクトコードに挿入され、数値式の結果は単一バイトとして挿入され、必要に応じて切り捨てられます。
===DEFB===
:DEFB DEFine Byte、DBと同じ。 Byte、[[#directive_db|DB]]と同じ。 [訳注sample:hellocpm.asm]  ; hellocpm.asm ; (C) 2004 Julian Albo. ; This code may be freely used. ; Simple hello world for cp/m, showing the use of some ; pasmo options to adapt cp/m programs for cp/m 86 or ; ms-dos. ; Assembly with: ; - For cp/m: ; pasmo hellocpm.asm HELLOCPM.COM ; - For cp/m 86: ; pasmo --86 --cmd --equ CPM86 hellocpm.asm HELLOCPM.CMD ; - For ms-dos: ; pasmo --86 --equ MSDOS hellocpm.asm HELLOCPM.COM ; This macro allows to easily adapt the program to run ; in ms-dos or cp/m 86, using the --86 option and, in ; the case of cp/m 86, the --cmd option. ; The MSDOS is really not needed, ms-dos can handle ; call 5 use, but under dosemu this does not work, ; I still don't know why. Defining MSDOS it runs in any ; dos clone. BDOS_CALL macro if defined CPM86 db 0CDh, 0E0h ; int 0E0h, bdos call in cp/m 86 else if defined MSDOS db 088h, 0CCh ; mov ah, cl db 0CDH, 021h ; int 0CDh, ms-dos call. else call 5 ; endif ; endif endm ; BDOS_CALL . . .
===DEFL===
:DEFL ラベルを定義します。ラベルを前に付ける必要があります。引数は数値式である必要があり、結果はラベルに割り当てられます。使用されるラベルは、他のDEFLディレクティブで再定義できます。
[訳注sample:defb.adm]
 
.
.
.
proc
local n
n defl 0
rept 20
ds n
n defl n + 1
endm
endp
===DEFM===
:DEFineメッセージ、DBと同じ。 DEFineメッセージ、[[#directive_db|DB]]と同じ。
===DEFS===
:DSと同じスペースを定義します。 [[#directive_ds|DS]]と同じスペースを定義します。
===DEFW===
:DEFW DWと同じ。[[#directive_dw|DW]]と同じ。
===DS===
<div id="directive_ds"></div>
:DS スペースを定義します。
:1つまたは2つのコンマ区切りの引数を取ります。最初または唯一の引数は、定義するスペースの量(バイト単位)です。 2番目は、0が使用される場合にスペースを埋めるために使用される値です。
 
[訳注sample:protector.asm]
:DS スペースを定義します。 .1つまたは2つのコンマ区切りの引数を取ります。最初または唯一の引数は、定義するスペースの量(バイト単位)です。 2番目は、0が使用される場合にスペースを埋めるために使用される値です。 . . ; Cambiado esto para que coincida con las DATA de la revista ; y asi poder comprobar el checksum. ;kernal defs 4 kernal defb #FC, #A6, #09, #A0 . . .
===DW===
<div id="directive_dw"></div>
:DW Wordを定義します。引数は、数値式のコンマ区切りリストです。各数値式は2バイトのワードとして評価され、結果はZ80ワード形式のコードに挿入されます。
===ENDM===
:マクロを終了します。マクロに関する章を参照してください。マクロを終了します。[[#macro_generalities|マクロに関する章]]を参照してください。
===ENDP===
===EQU===
:等しいラベルを前に付ける必要があります。引数は数値式である必要があり、結果はラベルに割り当てられます。使用されるラベルは再定義できません。ラベルを前に付ける必要があります。引数は数値式である必要があり、結果はラベルに割り当てられます。使用されるラベルは再定義できません。 [訳注sample:callvers.asm]  ; callvers.asm ; Show the effect of attach the sample RSX echovers ; Adapted from The CP/M Plus programmers guide. bdos equ 5 prtstr equ 9 vers equ 12 cr equ 0dh lf equ 0ah . . .
===EXITM===
:マクロを終了します。マクロに関する章を参照してください。マクロを終了します。[[#macro_generalities|マクロに関する章]]を参照してください。
===IF===
===INCLUDE===
:ファイルをインクルードします。引数で使用される規則については、ファイル名の章を参照してください。ファイルが読み取られ、結果は、ファイルがINCLUDE行ではなく現在のファイルにコピーされた場合と同じです。 ファイルをインクルードします。引数で使用される規則については、[[#filename|ファイル名]]の章を参照してください。ファイルが読み取られ、結果は、ファイルがINCLUDE行ではなく現在のファイルにコピーされた場合と同じです。 含まれるファイルには、INCLUDEディレクティブなどが含まれる場合があります。 INCLUDEディレクティブはアセンブリフェーズの前に処理されるため、IFディレクティブを使用して条件付きで異なるファイルを含めることはできません。 [訳注sample:include.asm]  org 100h ; include.asm nop include if.asm halt include if.asm ex de,hl exx ex af, af' end
===INCBIN===
===IRP===
IRP parameter, argument list.:引数を置換するコードのブロックを繰り返します。[[#macro_generalities|マクロに関する章]]を参照してください。
===LOCAL===<div id="local_directive"></div>:引数を置換するコードのブロックを繰り返します。マクロに関する章を参照してください。現在のブロックに対してローカルとして識別子をマークします。ブロックは、MACRO、REPT、IRP、またはPROCディレクティブである場合があり、ローカル領域は対応するENDMまたはENDPディレクティブで終了します。領域はブロックの先頭ではなく、LOCALディレクティブで始まります。注意してください。 同じ識別子の複数のローカル宣言が同じブロックで使用されている場合、最初の宣言のみが有効で、他の宣言は無視されます。
===LOCAL===[訳注sample:local.asm]
:現在のブロックに対してローカルとして識別子をマークします。ブロックは、MACRO、REPT、IRP、またはPROCディレクティブである場合があり、ローカルambitは対応するENDMまたはENDPディレクティブで終了します。アンビットは、ブロックの先頭ではなく、LOCALディレクティブで始まります。注意してください。 同じ識別子の複数のローカル宣言が同じブロックで使用されている場合、最初の宣言のみが有効で、他の宣言は無視されます。 ; local.asm ; Test of LOCAL, PROC and ENDP under CP/M. bdos equ 5 conout equ 2 org 100h jp hola exit db "Hello, local world\r\n", 0 showtext proc local hola, exit hola ld a, (hl) cp 0 jp z, exit push hl ld e, a ld c, conout call bdos pop hl inc hl jp hola exit ret endp hola ld hl, exit call showtext jp 0 end
===MACRO===
:マクロを定義します。マクロに関する章を参照してください。マクロを定義します。[[#macro_generalities|マクロに関する章]]を参照してください。
===ORG===
:PROCブロックの開始をマークします。唯一の効果は、LOCALディレクティブの領域を定義することです。ブロックは、対応するENDPディレクティブで終了します。 PROCブロックでサブルーチンを囲むことをお勧めしますが、他の状況でも使用できます。
 
[訳注sample:local.asm]
 
; local.asm
; Test of LOCAL, PROC and ENDP under CP/M.
bdos equ 5
conout equ 2
org 100h
jp hola
exit db "Hello, local world\r\n", 0
showtext proc
local hola, exit
hola ld a, (hl)
cp 0
jp z, exit
push hl
ld e, a
ld c, conout
call bdos
pop hl
inc hl
jp hola
exit ret
endp
hola ld hl, exit
call showtext
jp 0
end
===PUBLIC===
:引数は、コンマで区切られた識別子のリストです。各識別子はパブリックとしてマークされます。 --publicコマンドラインオプションを使用すると、パブリックとしてマークされた識別子のみがシンボルテーブルリストに含まれます。
 
[訳注sample:showfcb.asm]
 
; showfcb.asm
bdos equ 5
conout equ 2
printstring equ 9
public fcb1, fcb2
fcb1 equ 005Ch
fcb2 equ 006Ch
org 100h
.
.
.
===REPT===
:ブロックを繰り返します。マクロに関する章を参照してください。ブロックを繰り返します。[[#macro_generalities|マクロに関する章]]を参照してください。
=オペレーター概要=
すべての数値は、必要に応じて2の補数またはトラクティングを使用して、符号なしの16ビットとして取得されます。論理演算子は、trueの場合はFFFF hexを返し、falseの場合は0を返します。引数の0はfalseで、その他の値はtrueです。 括弧を使用して、式の一部をグループ化できます。また、許可または要求するz80命令でインダイレクションを表現するためにも使用されます。これにより、インダイレクションが許可されている場所で括弧で囲まれた式を使用すると、いくつかのエラーが発生する可能性があります。 Pasmoは、いくつかのヒューリスティックを使用して、式を正しく解釈できるようにしますが、完全にはほど遠い状態です。
?
<nowiki>##</nowiki>演算子は特別な場合で、マクロ展開中に処理されます。マクロに関する章を参照してください。演算子は特別な場合で、マクロ展開中に処理されます。[[#macro_generalities|マクロに関する章]]を参照してください。
===オペレーターのリスト===
===! ===
:論理否定。引数が0の場合はtrue、それ以外の場合はfalseを返します。
===<nowiki>!= </nowiki>===
:NEと同じ。
<div id="operator_doublesharp">==<nowiki>##</nowiki> </div>:識別子貼り付け演算子。マクロに関する章を参照してください。 ===<div id="operator_dollaroperator_doublesharp">$ </div>:識別子貼り付け演算子。[[#macro_generalities|マクロに関する章]]を参照してください。
===$===
<div id="operator_dollar"> </div>
:現在の文の先頭の位置カウンタの値を提供します。たとえば、DWディレクティブでは、現在のアイテムではなく、リスト内の最初のアイテムの位置を指定します。
<div id="operator_percent">% </div>[訳注sample:align.asm]
.
.
.
align macro n
local newpos, oldpos
oldpos equ $
newpos equ (oldpos + n - 1) / n * n
if newpos < oldpos
.error Align out of memory
endif
.
.
.
 
===%===
<div id="operator_percent"> </div>
:MODと同じです。
===&===
:ANDと同じです。
===&& ===
:論理的両方のオペランドが真の場合、真。
===<nowiki>*</nowiki>===
:乗算。
===+ ===
:加算または単項+。
===- ===
:減算または単項-。
===/ ===
:切り捨てられた整数の除算。
===< ===
:LTと同じ
===<< ===
:SHLと同じ
===<nowiki><= </nowiki>===
:LEと同じ
===<nowiki>= </nowiki>===
:EQと同じ
===> ===
:GTと同じ
===<nowiki>>=</nowiki>===
:GEと同じ
===>> ===
:SHRと同じ
===? ===
:条件式。 ?の右側の式の場合、:で区切られた2つの式が続く必要があります。 trueの場合、最初の式が評価され、falseの場合、2番目の式が評価されます。
===| ===
:ORと同じ。
===|| ===
:論理OR。オペランドの1つがtrueの場合、true。
===~ ===
:NOTと同じ
===AND===
:ビット単位のAND演算子。
===DEFINED===
:引数は識別子でなければなりません。結果は、識別子が定義されている場合はtrue、定義されていない場合はfalseです。
===EQ===
:等しい。両方のオペランドが等しい場合はtrue、そうでない場合はfalse。
===GE===
:より大きいか等しい。左のオペランドが右より大きいか等しい場合は真。
===GT===
:より大きい。左のオペランドが右より大きい場合は真。
===HIGH===
:引数の上位バイトを返します。
===LE===
:以下。左のオペランドが右よりも小さいか等しい場合は真。
===LOW===
:引数の下位バイトを返します。
===LT===
:未満。 左オペランドが右より小さい場合はtrue。
===MOD===
:係数。整数除算の残り。
===NE===
:等しくない。両方のオペランドが等しい場合はfalse、そうでない場合はtrue。
===NOT===
:ビット単位ではありません。このオペランドの1の補数を返します。
===NUL===
:右に何かがある場合はtrueを返し、それ以外の場合はfalseを返します。引数がマクロのパラメーターである場合に役立ちます。
===OR===
:ビット単位のOR演算子。
===SHL===
:シフト左。ゼロで埋めて、右オペランドで指定されたビット数だけ左にシフトした左オペランドを返します。
===SHR===
:シフト右。右側のオペランドで指定されたビット数だけ右側にシフトされ、ゼロで埋められた左側のオペランドを返します。
===XOR===
:ビット単位のxor(排他的OR)演算子。
=マクロ概要=
<div id="macro_generalities"></div>
マクロディレクティブには、適切なMACROディレクティブと、繰り返しディレクティブREPTおよびIRPの2種類があります。さらに、ENDMおよびEXITMディレクティブは、マクロ展開の終了を制御します。
マクロディレクティブには、適切なMACROディレクティブと、繰り返しディレクティブREPTおよびIRPの2種類があります。さらに、ENDMおよびEXITMディレクティブは、マクロ展開の終了を制御します。 マクロパラメーターは、マクロが展開されたときに適用される引数の値に置き換えられる識別子です。引数は空にすることも、1つ以上のトークンで構成することもできます。 MACROが別のマクロディレクティブ内で定義されている場合、外部パラメーターは置換されません。他のマクロディレクティブでは、パラメーターの置換は最も外部のディレクティブによって開始されます。 NUL演算子を使用して、引数が空でないかどうかを確認できます。 .SHIFTディレクティブを使用して、不特定の数の引数を処理できます。  [訳注sample:tmacro.asm]   ; tmacro.asm ; Some tests of macro usage. org 100h ; To run in cp/m start: macro bdos, function ld c, function call 5 endm lineend macro ld e, 0Dh bdos 2 ld e, 0Ah bdos 2 endm macro pushall push af push bc push de push hl endm popall macro pop hl pop de pop bc pop af endm ; Another way. pall macro operation irp reg, af, bc, de, hl local i1 operation reg endm endm pushall2 macro pall push endm popall2 macro irp reg, af, bc, de, hl pop reg endm endm ; Yet another way pushmany macro reg rept -1 if nul reg exitm endif push reg .shift endm endm pushall3 macro pushmany af, bc, de, hl endm ; Main program ; pushall ; pushall2 pushall3 ld de, hello i1 bdos 9 i2: lineend ;popall popall2 bdos 0 hello db 'Hello, world.$' end start ; End of tmacro.asm  識別子の貼り付け:MACRO内で演算子##を使用して2つの識別子を結合し、別の識別子を作成できます。これは、マクロ引数に依存する識別子を作成できるようにすることを目的としています。 [訳注sample:jumptable.asm]  ; jumptable.asm ; Test of ## operator. org 100h bdos equ 5 conin equ 1 pstring equ 9 start jp init jpfunc macro nfunc jp function_ ## nfunc endm . . .
=マクロディレクティブ=
====.SHIFT====
:MACRO内でのみ使用できます。 MACRO引数は1つ左の場所に配置され、最初の引数は破棄されます。シフト後にパラメーターリストを埋めるのに十分な引数がない場合、残りの引数は未定義になります。
====ENDM====
:ENDM 現在のMACRO定義、または現在のREPTまたはIRPブロックの終了をマークします。マクロブロックに含まれるすべてのIFブロックも閉じられます。  [訳注sample:rept.asm]  ; rept.asm ; Test of rept and irp directives. ; Macro with rept and irp inside. hola macro local unused, unused2 unused rept 2 db 'Rept inside macro', 0 endm unused2 irp ?reg, af,bc, de, hl push ?reg endm endm ; hola ;------------------------------------- rept 10 db 'Hello, reptworld' endm . . .
====EXITM====
:EXITM 現在のMACRO、REPT、またはIRPブロックを終了します。 MACROの場合、マクロ展開は終了します。他の場合、ブロックのコード生成は終了し、対応するENDMの後にアセンブリが続行されます。
=[訳注sample:rept.asm]  . . . ; Rept with calculated end condition. n defl 1 rept 0FFFFh n defl n + 2 if n gt 10 exitm endif . . . ===IRP====
IRP parameter, argument list.
:引数ごとに、IRPディレクティブと対応するENDMの間でコードのブロックを1回繰り返します
=[訳注sample:rept.asm]  . . . unused2 irp ?reg, af,bc, de, hl push ?reg endm . . . ===MACRO====
:大きい マクロを定義します。使用できる形式は2つあります。
名前MACRO [パラメーターのリスト]
name MACRO [ list of parameters]
MACRO name [ , list of parameters]
:すべての場合において、パラメーターのリストは識別子のコンマ区切りリストであり、名前は作成されたマクロに割り当てられた名前です。 マクロを使用するには、単に名前を指定し、オプションで引数のリストを指定します。引数リストは、マクロのパラメーターリストと同じ長さである必要はありません。長い場合、余分な引数は使用されませんが、MACRO内ですべての場合において、list of parametersは識別子のコンマ区切りリストであり、nameは作成されたマクロに割り当てられた名前です。 マクロを使用するには、単にnameを指定し、オプションで引数のリストを指定します。引数リストは、マクロのパラメーターリストと同じ長さである必要はありません。長い場合、余分な引数は使用されませんが、MACRO内で.SHIFTを使用して取得できます。短い場合、一部のパラメーターが未定義になります。これは、NUL演算子を使用してMACRO内でテストできます。 [訳注sample:tmacro.asm]  . . . pushmany macro reg rept -1 if nul reg exitm endif push reg .shift endm . . . endm
====REPT====
:REPTディレクティブと対応するENDMの間のコードブロックを、引数で指定された回数繰り返します。引数は0にすることができます。その場合、ブロックはスキップされます。 さらに、ループ変数を指定できます。このvarはマクロパラメーターではなく、LOCAL DEFLシンボルとして使用され、その値はループの反復ごとに増分されます。初期値とincementを指定でき、デフォルトはそれぞれ0と1です。
 
[訳注sample:rept.asm]
 
.
.
.
unused rept 2
db 'Rept inside macro', 0
endm
.
.
.
=終わりに=