ASSEMBLER PASMO JP

From Z80 Machines Wiki
Jump to: navigation, search

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

概要

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オプションを使用する場合は別の方法で処理されます。以下を参照してください。

オプションは、ゼロまたはそれ以上の以下の内容を含みます。[訳注:ハイフン2文字のオプションの多くは生成するコードの”モード”を指定します。これはクロス開発時のターゲット、およびフォーマットを指定するものです。詳細は次節参照]


-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

[訳注:3項目の引数の]file.symbol名を使用して[訳注:通常のfile.symbolではなくfile.publicsとして]パブリックシンボルテーブルのみが生成されます。このオプションを使用する場合、file.symbolは指定しないでください。[訳注:引数を4項指定するとエラーになります]

--name

nameヘッダーを使用する形式でヘッダーに入れる名前。指定しない場合、オブジェクトファイル名が使用されます。

--err

エラー出力ではなく標準出力にエラーメッセージを送信します(オプションのエラーを除く)。

--nocase

識別子の大文字と小文字を区別しません。

--alocal

自動ローカルモードを使用します。このモードでは、「_」で始まるラベルはすべてローカルです。詳細については、ラベルに関する章を参照してください。

--bracket

括弧のみのモードを使用します。このモードでは、括弧は式でのみ有効です。インダイレクションには括弧を使用する必要があります。

--equ

シンボルを事前定義します。事前定義されたシンボルは、EQUで定義されたものと同様の方法で処理されます。 black.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の書式で有効な形式の数値定数でなければなりません。 =valueの部分はオプションです。指定しない場合16進数のFFFFが割り当てられます。

--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ディレクティブのリストです。そうすれば、別のソースに含めることで、複数のブロックで構成されるプログラムを作成できます。

ソースコードフォーマット概要

ソースコードファイルは、使用するプラットフォームの有効なテキストファイルである必要があります。たとえば、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
代わりに
IF 0 .... ENDIF
を使用できます(ただし、INCLUDEを参照)。

[訳注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]

数値リテラル

数値リテラルは、10進数、2進数、8進数、16進数の形式で記述できます。複数のアセンブラのソース形式との互換性を得るために、いくつかの形式が受け入れられます。

$で始まるリテラルは16進定数です。ただし、リテラルが$記号のみである場合を除きます。その場合は演算子です。以下を参照してください。

#で始まるリテラルは16進定数です。ただし、2つの接詞#がある場合を除きます。##演算子を参照してください。

&で始まるリテラルは、&に続く文字に応じて、16進数、8進数、または2進数の定数になります。Hは16進数、Oは8進数、X 16進数を意味します。 このいずれでもない場合、文字は有効な16進数である必要があり、定数は16進数です。

%で始まるリテラルは2進数の定数です。ただし、リテラルが%記号のみである場合を除きます。その場合は演算子です。以下を参照してください。

10進数で始まるリテラルは、10進数、2進数、8進数、または16進数です。数字が0で、次の文字がXの場合、数字は16進数です。そうでない場合、リテラルの接尾辞が調べられます。Dは10進数、Bは2進数、Hは16進数、OまたはQは8進数を意味し、その他の場合は10進数と見なされます。たとえば、FFFFhは16進定数ではなく、識別子です。0FFFFhとして接尾辞表記を使用して記述する必要があります。

すべての数値形式では、数字の間に$記号を使用して読みやすくすることができます。それらは無視されます。

文字列リテラル

文字列リテラルには、単一引用符または二重引用符で区切られた2つの形式があります。

単一引用符で区切られた文字列リテラルはより単純な形式で、すべての文字は特別な解釈なしに文字列に含まれますが、2つの連続した単一引用符が文字列に含まれると、1つの単一引用符文字として扱われるという唯一の例外があります。たとえば、単一引用符で区切られた文字列'That''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オプションとラベルに関する章を参照してください。

オプション--nocaseを使用しない場合、識別子は大文字と小文字が区別されます。 --nocaseを使用すると、常に大文字に変換されます。

ファイル名

ファイル名は、INCLUDEおよびINCBINディレクティブで使用されます。それらは特別なルールに従います。 二重引用符で始まるファイル名は別の二重引用符で終わる必要があり、ファイル名には特別な解釈なしにそれらの間のすべての文字が含まれます。 単一引用符で始まるファイル名は別の単一引用符で終わる必要があり、ファイル名には特別な解釈なしにそれらの間のすべての文字が含まれます。 それ以外の場合は、次の空白または行末までのすべての文字がファイル名の一部と見なされます。空白文字はスペースとタブです。

ラベル

ラベルは、任意の行の先頭、アセンブラーのニーモニックまたはディレクティブの前に配置できます。オプションで「:」を続けることができますが、他のアセンブラとの互換性のために、ディレクティブで使用することは推奨されません。ニーモニックもディレクティブもないラベルのある行も有効です。

ラベルは、MACRO、EQU、およびDEFLディレクティブで特別な意味を持ちます。それ以外の場合、現在のコード生成位置の値がラベルに割り当てられます。

ラベルは定義の前に使用できますが、DEFLで割り当てられたラベルでこれを行った結果は未定義です。

ラベルのすべての割り当てでDEFLを使用しない限り、ラベルの値を変更することはできません。ラベルに割り当てられた値がアセンブリの2つのパスで異なる場合、プログラムは不正ですが、エラーが生成されることは保証されません。ただし、最初のパスで未定義の値を割り当てることは有効です(たとえば、まだ定義されていないラベルを含む式を使用して)。

デフォルトモードでは、MACRO、REPT、またはIRPブロックにLOCALとして宣言されていない限り、ラベルはグローバルです。詳細については、LOCALディレクティブを参照してください。

--alocalコマンドラインオプションを使用して導入された自動ローカルモードでは、「_」で始まるラベルはすべてローカルです。その領域は、次の非ローカルラベル、または次のPROC、LOCAL、MACRO、ENDP、ENDMディレクティブで終了します。

[訳注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進数としてシンボルテーブルリストに表示されます。

ディレクティブ

Pasmoでサポートされているディレクティブのリスト(アルファベット順)。

.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

バイトを定義します。引数は、文字列リテラルまたは数値式のコンマ区切りリストです。文字列リテラルはオブジェクトコードに挿入され、数値式の結果は単一バイトとして挿入され、必要に応じて切り捨てられます。

DEFB

DEFB DEFine Byte、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と同じ。

DEFS

DSと同じスペースを定義します。

DEFW

DEFW DWと同じ。

DS

DS スペースを定義します。
1つまたは2つのコンマ区切りの引数を取ります。最初または唯一の引数は、定義するスペースの量(バイト単位)です。 2番目は、0が使用される場合にスペースを埋めるために使用される値です。

[訳注sample:protector.asm]

.
.
.
; 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

DW Wordを定義します。引数は、数値式のコンマ区切りリストです。各数値式は2バイトのワードとして評価され、結果はZ80ワード形式のコードに挿入されます。

ELSE

IF参照。

END

アセンブリを終了します。このディレクティブの後のすべての行は無視されます。引数がある場合、数値式として評価され、結果はプログラムのエントリポイントとして設定されます。エントリポイントを設定した結果は、使用するコード生成の種類によって異なりますが、この場合でもドキュメント作成に使用できます。

ENDIF

IF参照。

ENDM

マクロを終了します。マクロに関する章を参照してください。

ENDP

PROCブロックの終了をマークします。PROCを参照してください。

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

マクロを終了します。マクロに関する章を参照してください。

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ディレクティブを使用して条件付きで異なるファイルを含めることはできません。

[訳注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

現在のブロックに対してローカルとして識別子をマークします。ブロックは、MACRO、REPT、IRP、またはPROCディレクティブである場合があり、ローカル領域は対応するENDMまたはENDPディレクティブで終了します。領域はブロックの先頭ではなく、LOCALディレクティブで始まります。注意してください。 同じ識別子の複数のローカル宣言が同じブロックで使用されている場合、最初の宣言のみが有効で、他の宣言は無視されます。

[訳注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

MACRO

マクロを定義します。マクロに関する章を参照してください。

ORG

生成されたコードを配置する原点位置を確立します。同じプログラムで複数のORGディレクティブを使用できますが、生成されたコードが以前のコードを上書きする結果になる場合、結果は未定義です。

PROC

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

ブロックを繰り返します。マクロに関する章を参照してください。

オペレーター概要

すべての数値は、必要に応じて2の補数またはトラクティングを使用して、符号なしの16ビットとして取得されます。論理演算子は、trueの場合はFFFF hexを返し、falseの場合は0を返します。引数の0はfalseで、その他の値はtrueです。 括弧を使用して、式の一部をグループ化できます。また、許可または要求するz80命令でインダイレクションを表現するためにも使用されます。これにより、インダイレクションが許可されている場所で括弧で囲まれた式を使用すると、いくつかのエラーが発生する可能性があります。 Pasmoは、いくつかのヒューリスティックを使用して、式を正しく解釈できるようにしますが、完全にはほど遠い状態です。

括弧のみのモード[訳注:—bracketオプション]を使用すると、括弧は式をグループ化するという独自の意味を持ち、間接指定には括弧が必要であるため、あいまいさが解消されます。

短絡評価:&&および||演算子と条件式は短絡されています。これは、演算子の1つを評価する必要がない場合、エラーを生成せずに未定義のシンボルまたは0による除算を含めることができることを意味します(ただし、正しい構文が必要です)。条件式では、これは成立しない分岐に適用されます。&&演算子では、最初のオペランドがfalseの場合は2番目のオペランドに、||では最初のオペランドが真の場合、2番目のオペランドに、というように。

優先順位テーブル

優先順位による演算子の表、同じ行の演算子は同じ優先順位を持ちます。

	## (see note)
	$, NUL, DEFINED
	*, /, MOD, %, SHL, SHR, <<, >>
	+, - (binary[訳注:2項演算子])
	EQ, NE, LT, LE, GT, GE, =, !=, <, >, <=, >=
	NOT, ~, !, +, - (unary[訳注:単項演算子])
	AND, &
	OR, |, XOR
	&&
	||
	HIGH, LOW
	?

##演算子は特別な場合で、マクロ展開中に処理されます。マクロに関する章を参照してください。

オペレーターのリスト

!

論理否定。引数が0の場合はtrue、それ以外の場合はfalseを返します。

!=

NEと同じ。

##

識別子貼り付け演算子。マクロに関する章を参照してください。

$

現在の文の先頭の位置カウンタの値を提供します。たとえば、DWディレクティブでは、現在のアイテムではなく、リスト内の最初のアイテムの位置を指定します。

[訳注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
.
.
.

%

MODと同じです。

&

ANDと同じです。

&&

論理的両方のオペランドが真の場合、真。

*

乗算。

+

加算または単項+。

-

減算または単項-。

/

切り捨てられた整数の除算。

<

LTと同じ

<<

SHLと同じ

<=

LEと同じ

=

EQと同じ

>

GTと同じ

>=

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)演算子。

マクロ概要

マクロディレクティブには、適切な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つあります。


	name	MACRO [ list of parameters]

または:

	MACRO name [ , list of parameters]
すべての場合において、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
.
.
.

終わりに

[訳注:表示を簡略化するため、アセンブラー仕様以外の作者からの連絡などを「終わりに」としてまとめました]

提案と発展の可能性

Pasmoの前提は、クロスアセンブラーであり、多くの利用可能なリソースがあるマシンで使用される場合です。それから私は、Pasmoにそれを含める方がはるかに便利だと思う(または他の人が私に納得させる)ことをしない限り、他のユーティリティで簡単にできることをする手段を提供する努力をしません。 たとえば、sinテーブルを作成する場合は、テーブルにファイルを書き込み、そのファイルをINCLUDEするお気に入りの言語でプログラムを作成できます。また、そのタイプのことを自動化する場合は、makeを使用できます。 それを考慮に入れて、私はPasmoを改善するための提案とそれを実装するパッチを受け入れています。後者の場合は、オペレーティングシステムやコンパイラに依存せずに、ポータブルな方法で物事を書くように注意してください。

なぜPasmoはリンク可能なオブジェクトを生成できないか

Pasmoには、メモリの絶対アドレスを使用する単純なコードジェネレーターがあります。そのため、リンカで使用するための再配置可能なコードを生成するように適合させることが難しくなります。私は今のところそれをする予定はありません、誰かが貢献したいのでしょうか?

Game Boy

ゲームボーイ。 一部の人々は、Game Boyプログラミングのサポートを追加するよう提案しました。 2つの問題があります。Pasmoでコードを生成するために使用される単純化された方法と、Game Boyについて私の知識がないことです。

謝辞

提案を行い、バグを通知または修正したすべての人々に感謝します。そして、彼らがPasmoで行う美しいことを私に見せてくれます。

小技集

Pasmoを使用して、任意のバイナリファイルを.tapに変換できます。たとえば、convert.asmと呼ばれる小さなプログラムを作成します。

	ORG address_to_load_the_file
	INCBIN file.bin

次のようにアセンブルします:--tap convert.asm file.tap。サポートされている他の形式でも同じことが行われます。

既知のバグ

Pasmoは、 'ld b、(nn)'など、存在しないz80命令の行に見える式を使用すると警告を発しますが、 'ld b、(i1 + i2)のような場合にも警告を検出する簡単な方法*(i3 + i4) '。 その場合の警告を回避する方法は、式の前に括弧「+」または「0 +」を付けることです。 ブラケットのみのモードを使用すると、問題は存在しません。その場合、括弧は常に表現として扱われ(そしてプログラマーはそれを知っているはずです)、したがって警告は発せられません。 それについてのさらなる提案は歓迎です。 名前にブランク、シングル、ダブルクォートが含まれるファイルを含める方法はありません。そのようなファイル名を使用している人がいますか?

最後に

すべての人々へ! コメントや批判を送信してください: julian.notfound[訳注:atをエスケープして表示します]gmail.com