Difference between revisions of "PASMO TEST"
(→オペレーター概要) |
|||
Line 1: | Line 1: | ||
+ | =ディレクティブ= | ||
+ | |||
+ | 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=== | ||
+ | <div id="directive_db"> </div> | ||
+ | :バイトを定義します。引数は、文字列リテラルまたは数値式のコンマ区切りリストです。文字列リテラルはオブジェクトコードに挿入され、数値式の結果は単一バイトとして挿入され、必要に応じて切り捨てられます。 | ||
+ | |||
+ | ===DEFB=== | ||
+ | |||
+ | :DEFB DEFine 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メッセージ、[[#directive_db|DB]]と同じ。 | ||
+ | |||
+ | ===DEFS=== | ||
+ | |||
+ | :[[#directive_ds|DS]]と同じスペースを定義します。 | ||
+ | |||
+ | ===DEFW=== | ||
+ | |||
+ | :DEFW [[#directive_dw|DW]]と同じ。 | ||
+ | |||
+ | ===DS=== | ||
+ | <div id="directive_ds"><div> | ||
+ | :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=== | ||
+ | <div id="directive_dw"></div> | ||
+ | :DW Wordを定義します。引数は、数値式のコンマ区切りリストです。各数値式は2バイトのワードとして評価され、結果はZ80ワード形式のコードに挿入されます。 | ||
+ | |||
+ | ===ELSE=== | ||
+ | |||
+ | :IF参照。 | ||
+ | |||
+ | ===END=== | ||
+ | |||
+ | :アセンブリを終了します。このディレクティブの後のすべての行は無視されます。引数がある場合、数値式として評価され、結果はプログラムのエントリポイントとして設定されます。エントリポイントを設定した結果は、使用するコード生成の種類によって異なりますが、この場合でもドキュメント作成に使用できます。 | ||
+ | |||
+ | ===ENDIF=== | ||
+ | |||
+ | :IF参照。 | ||
+ | |||
+ | ===ENDM=== | ||
+ | |||
+ | :マクロを終了します。[[#macro_generalities|マクロに関する章]]を参照してください。 | ||
+ | |||
+ | ===ENDP=== | ||
+ | |||
+ | :PROCブロックの終了をマークします。PROCを参照してください。 | ||
+ | |||
+ | ===EQU=== | ||
+ | |||
+ | :等しいラベルを前に付ける必要があります。引数は数値式である必要があり、結果はラベルに割り当てられます。使用されるラベルは再定義できません。 | ||
+ | |||
+ | ===EXITM=== | ||
+ | |||
+ | :マクロを終了します。[[#macro_generalities|マクロに関する章]]を参照してください。 | ||
+ | |||
+ | ===IF=== | ||
+ | |||
+ | :条件付きアセンブリ。引数は数値式である必要があります。0の結果はfalse、それ以外はtrueとみなされます。引数がtrueの場合、IFセクションの終わりまたはELSEディレクティブが検出されるまで次のコードがアセンブルされ、そうでない場合は無視されます [訳注:そのため”if 0”は[[#comment_if0|複数行コメント]]のように扱うことができます]。 | ||
+ | :ELSEディレクティブが存在する場合、引数がtrueであれば次のコードは無視され、falseであればアセンブルされます。 IFセクションは、ENDIFまたはENDMディレクティブで終了します(最後のケースでは、ENDMにも通常の効果があります)。 IFはネストできます。その場合、各ELSEおよびENDIFは対応するIFでのみ有効になりますが、ENDMは保留中のIFセクションをすべて終了します。 | ||
+ | |||
+ | ===INCLUDE=== | ||
+ | |||
+ | :ファイルをインクルードします。引数で使用される規則については、[[#filename|ファイル名]]の章を参照してください。ファイルが読み取られ、結果は、ファイルが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=== | ||
+ | |||
+ | :引数を置換するコードのブロックを繰り返します。[[#macro_generalities|マクロに関する章]]を参照してください。 | ||
+ | |||
+ | ===LOCAL=== | ||
+ | <div id="local_directive"></div> | ||
+ | :現在のブロックに対してローカルとして識別子をマークします。ブロックは、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=== | ||
+ | |||
+ | :マクロを定義します。[[#macro_generalities|マクロに関する章]]を参照してください。 | ||
+ | |||
+ | ===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=== | ||
+ | |||
+ | :ブロックを繰り返します。[[#macro_generalities|マクロに関する章]]を参照してください。 | ||
+ | |||
+ | |||
+ | |||
= オペレーター概要 = | = オペレーター概要 = | ||
Revision as of 19:48, 12 December 2020
Contents
ディレクティブ
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
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番目のオペランドに、というように。