1,041
edits
Changes
→数値リテラル
[訳注:理解を深めるために原文にはないサンプルからの引用を一部追加しています。また、スマートフォン表示時の利便性のため、原文から節の構成を一部変更しています。]
=概要=
=コマンドラインからの使用=
<div id="command_line"></div>
Pasmoは、コマンドラインから次のように呼び出されます。
===--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進数です。
10進数で始まるリテラルは、10進数、2進数、8進数、または16進数です。数字が0で、次の文字がXの場合、数字は16進数です。そうでない場合、リテラルの接尾辞が調べられます。Dは10進数、Bは2進数、Hは16進数、OまたはQは8進数を意味し、その他の場合は10進数と見なされます。たとえば、FFFFhは16進定数ではなく、識別子です。0FFFFhとして接尾辞表記を使用して記述する必要があります。
すべての数値形式では、数字の間に$記号を使用して読みやすくすることができます。それらは無視されます。
=識別子=
識別子は、ラベル、EQUおよびDEFLシンボル、およびマクロ名とパラメーターに使用される名前です。 Z80ニーモニック、レジスタおよびフラグ名、およびpasmoオペランドとアセンブルディレクティブの名前は予約されており、識別子の名前として使用することはできません。大文字と小文字を区別するモードが使用されている場合でも、予約名は大文字と小文字を区別しません。 次の「文字」は、大文字または小文字の英文字を意味します。他の言語の文字に対応する文字は識別子に使用できません。 識別子は文字「_」、「?」、「 以降の「文字」は、大文字または小文字の英文字を意味します。他の言語の文字に対応する文字は識別子に使用できません。 識別子は文字、「_」、「?」、「@」または「.」で始まり、その後にゼロ個以上の文字、10進数、「_」、「?」、「@」、「.」が続きます。または「」または「$」。 」が続きます。 「$」は無視されますが、「$」が埋め込まれたまたは追加された予約語はそのように認識されません。 「_」で始まる識別子は、オートローカルモードを使用する場合に特別です。詳細については、-alocalオプションとラベルに関する章を参照してください。 alocalオプションと[[#label|ラベルに関する章]]を参照してください。 オプション--nocaseを使用しない場合、識別子は大文字と小文字が区別されます。 --nocaseを使用すると、常に大文字に変換されます。
=ファイル名=
<div id="filename"></div>
ファイル名は、INCLUDEおよびINCBINディレクティブで使用されます。それらは特別なルールに従います。 二重引用符で始まるファイル名は別の二重引用符で終わる必要があり、ファイル名には特別な解釈なしにそれらの間のすべての文字が含まれます。 単一引用符で始まるファイル名は別の単一引用符で終わる必要があり、ファイル名には特別な解釈なしにそれらの間のすべての文字が含まれます。 それ以外の場合は、次の空白または行末までのすべての文字がファイル名の一部と見なされます。空白文字はスペースとタブです。
=ラベル=
=ディレクティブ=
===.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]
===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===
===LOCAL===<div id="local_directive"></div>:引数を置換するコードのブロックを繰り返します。マクロに関する章を参照してください。現在のブロックに対してローカルとして識別子をマークします。ブロックは、MACRO、REPT、IRP、またはPROCディレクティブである場合があり、ローカル領域は対応するENDMまたはENDPディレクティブで終了します。領域はブロックの先頭ではなく、LOCALディレクティブで始まります。注意してください。 同じ識別子の複数のローカル宣言が同じブロックで使用されている場合、最初の宣言のみが有効で、他の宣言は無視されます。
===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を返します。
:NEと同じ。
===$===
<div id="operator_dollar"> </div>
:現在の文の先頭の位置カウンタの値を提供します。たとえば、DWディレクティブでは、現在のアイテムではなく、リスト内の最初のアイテムの位置を指定します。
.
.
.
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内でのみ使用できます。 MACRO引数は1つ左の場所に配置され、最初の引数は破棄されます。シフト後にパラメーターリストを埋めるのに十分な引数がない場合、残りの引数は未定義になります。
: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 現在のMACRO、REPT、またはIRPブロックを終了します。 MACROの場合、マクロ展開は終了します。他の場合、ブロックのコード生成は終了し、対応するENDMの後にアセンブリが続行されます。
IRP parameter, argument list.
:引数ごとに、IRPディレクティブと対応するENDMの間でコードのブロックを1回繰り返します
:大きい マクロを定義します。使用できる形式は2つあります。
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ディレクティブと対応するENDMの間のコードブロックを、引数で指定された回数繰り返します。引数は0にすることができます。その場合、ブロックはスキップされます。 さらに、ループ変数を指定できます。このvarはマクロパラメーターではなく、LOCAL DEFLシンボルとして使用され、その値はループの反復ごとに増分されます。初期値とincementを指定でき、デフォルトはそれぞれ0と1です。
[訳注sample:rept.asm]
.
.
.
unused rept 2
db 'Rept inside macro', 0
endm
.
.
.
=終わりに=