Difference between revisions of "PASMO TEST"

From Z80 Machines Wiki
Jump to: navigation, search
(REPT)
(PUBLIC)
Line 319: Line 319:
 
   
 
   
 
  end
 
  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
 
.
 
.
 
.
 
  
 
= オペレーター概要 =
 
= オペレーター概要 =

Revision as of 19:55, 12 December 2020

ディレクティブ

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

等しいラベルを前に付ける必要があります。引数は数値式である必要があり、結果はラベルに割り当てられます。使用されるラベルは再定義できません。

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.txt]

	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

オペレーター概要

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

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

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