ディレクティブ
ORG
書式
ORG address [,ABS|,REL]
説明
- 次の命令のベースアドレスを
addressで指定します。 - この
ORGから次のORG, ENDもしくはファイル末尾までをセグメントとして出力ファイル内での配置方法を指定します。ABS-ORGから始まるセグメントを"絶対セグメント"として出力ファイルでの配置を決定します。REL-ORGから始まるセグメントを"相対セグメント"として出力ファイルでの配置を決定します。
- 配置方法については"生成コードの配置"を参照ください。
関連
END
書式
END [address]
説明
- トップレベルにある場合、アセンブルを終了し、以降の命令、以降のファイルはアセンブル対象外とします。
addressを指定した場合、MZT 形式の実行開始アドレスとなります。- 複数の
END addressが指定された場合、最後に指定されたものが有効です。 -e --entryオプションが指定された場合、そちらが有効です。
関連
- MZT 形式
ENTRY-e --entryオプション
ENTRY
書式
ENTRY address
説明
- MZT 形式の実行開始アドレスを指定します。
- 複数指定された場合、最後に指定されたものが有効です。
-e --entryオプションが指定された場合、そちらが有効です。- アセンブルを中止しない点を除き、"
END address" と同じ機能です。
関連
- MZT 形式
END-e --entryオプション
ALIGN
書式
ALIGN size [,fill]
説明
- ローケンションカウンタを
sizeの倍数となるまで進めます。 - ローケンションカウンタを既に
sizeの倍数であれば何も行いません。 - 進める場合、
fillが指定されている場合、その値でギャップを埋めます。 - 進める場合、
fillが指定されていない場合、デフォルト(255)もしくは-f --fillオプションで指定した値で埋めます。
関連
PROC
書式
name PROC
.local_label1:
statements
label:
stataments
.local_name2:
statements
ENDP
call name
call label
call name.local_label1
call name.local_label2
説明
- 複数の文を一つにまとめ、ローカルラベルを定義可能なスコープを形成します。
- トップレベルでのみ定義できます。
nameはラベルとして参照可能labelはグローバルラベルでPROC外部からそのまま参照可能です。.local_label1を外部から参照する場合、name.local_label1とします。.local_label1は同一PROC内で一意であることが必要ですが、他のPROC内の名前と同じでもかまいません。statementsとして次のものを含むことはできません。PROCMACRO
関連
CONST/EQU
書式
CONST name = expression
name EQU expression
説明
- 名前が
name、値がexpressionの定数を定義します。 - 定数のため再定義できません。再定義しようとするとエラーになります。
CONSTとEQUは書式が異なるだけで同等です。(EQUは内部ではCONSTとして処理)expressionを評価する際、値が確定できない場合、そのパスでの評価は行わず、評価を次のパスに回します(前方参照可)。- パスの評価状況によって、値が変わる可能性があります。
関連
VAR
書式
VAR name = expression ; 定義・初期化
name = expression ; 再代入
説明
- 名前が
name、値がexpressionの変数を定義します。 - `"="=を使用して再代入可能です。
- 定義・初期化、再代入の際、
expressionの値が確定している必要があります(前方参照不可)。 - パスの評価状況によって、値が変わる可能性があります。
関連
DB/DEFB
書式
[name] DB expression [, expression...]
[name] DEFB expression [, expression...]
説明
expressionの値をバイトデータ(複数指定可)として定義します。- ラベル
nameを付加することができます。 DEFBはDBのエイリアスです。expressionの評価結果が次のものが有効です。
| 値 | 定義 |
|---|---|
| 数値 |
|
| 文字列 |
|
| 配列 |
|
1 charmap mz700,"mz700.json"
2
3 0000 01 02 03 [ ] db 1, 2, 3
4 0003 61 62 [ ] db "ab"
5 0005 82 a0 82 a2 [ ] db "あい"
6 0009 61 82 a0 [ ] db "aあ"
7 000c 04 35 06 [ ] db [4, "5", 6]
8 000f 0d 1a 2a 27 20 20 [ ] db mz700("mz-700")
関連
DW/DEFW
書式
[name] DW expression [, expression...]
[name] DEFW expression [, expression...]
説明
expressionの値をワードデータ(リトルエンディアン、複数指定可)として定義します。- ラベル
nameを付加することができます。 DEFWはDWのエイリアスです。expressionの評価結果が次のものが有効です。
| 値 | 定義 |
|---|---|
| 数値 |
|
| 文字列 |
|
| 配列 |
|
1 charmap mz700,"mz700.json"
2
3 0000 01 00 02 00 03 00 [ ] dw 1, 2, 3
4 0006 61 00 62 00 [ ] dw "ab"
5 000a a0 82 a2 82 [ ] dw "あい"
6 000e 61 00 a0 82 [ ] dw "aあ"
7 0012 04 00 35 00 06 00 [ ] dw [4, "5", 6]
8 0018 0d 00 1a 00 2a 00 27 00 [ ] dw mz700("mz-700")
0020 20 00 20 00 [ ]
関連
DD
書式
[name] DD expression [, expression...]
説明
expressionの値に従ってバイトデータ、もしくはワードデータとして定義します。- ラベル
nameを付加することができます。 expressionの評価結果が次のものを有効とします。
| 値 | 定義 |
|---|---|
| 数値 |
|
| 文字列 |
|
| 配列 |
|
1 charmap mz700,"mz700.json"
2
3 0000 01 02 03 [ ] dd 1, 2, 3
4 0003 01 02 00 03 [ ] dd 1, $W(2), 3
5 0007 61 62 [ ] dd "ab"
6 0009 82 a0 82 a2 [ ] dd "あい"
7 000d 61 82 a0 [ ] dd "aあ"
8 0010 04 35 06 [ ] dd [4, "5", 6]
9 0013 0d 1a 2a 27 20 20 [ ] dd mz700("mz-700")
関連
DS/DSB
書式
[name] DS length [, fill]
[name] DSB length [, fill]
説明
legth数のバイト領域を確保します。fillを指定した場合、その値で領域を埋めます。fillを指定しない場合デフォルトの値(255)で埋めます。-f --fillオプションを指定した場合はその値で埋めます。- ラベル
nameを付加することができます。 DSBはDSのエイリアスです。
関連
DSW
書式
[name] DSW length [, fill]
説明
legth数のバイト領域を確保します。(length * 2バイトの領域を確保)fillを指定した場合、その値をワードデータ(リトルエンディアン)とし領域を埋めます。fillを指定しない場合デフォルトの値(255)で埋めます。-f --fillオプションを指定した場合はその値で埋めます。- ラベル
nameを付加することができます。
1 0000 ff ff ff ff [ ] dsw 2
2 0004 34 12 34 12 [ ] dsw 2, $1234
関連
ENUM
書式
name ENUM
element_name [= expression]
ENDE
説明
element_name要素を持つ列挙体nameを定義します。name.element_nameとして定義した値を参照します。- 数値以外の値も利用可能です。
expressionがない場合、最初は数値 0 を、以降は前回定義した数値要素に +1 した値を定義します。expressionでは前方参照できません。expressionで定義済みのelement_nameを参照刷る場合、名前の前に"."を付けます
RGB enum
black ; 0
blue ; 1
red ; 2
magenta ; 3
green ; 4
cyan ; 5
yellow ; 6
white ; 7
ende
1 ATTR enum
2 WHITE = $70
3 YELLOW = $60
4 CYAN = $50
5 GREEN = $40
6 MAGENTA = $30
7 RED = $20
8 BLUE = $10
9 BLACK = $00
10 ende
11
12 0000 3e 10 [ 7] ld a, ATTR.BLUE
1 msgs enum
2 m0 = "0"
3 m1 = .m0 + "1"
4 m2 = .m1 + "2"
5 m3 = .m2 + "3"
6 ende
7
8 0000 30 [ ] db msgs.m0
9 0001 30 31 [ ] db msgs.m1
10 0003 30 31 32 [ ] db msgs.m2
11 0006 30 31 32 33 [ ] db msgs.m3
INCLUDE
書式
INCLUDE filename
説明
- ファイル
filenameをソースファイルとして現在の位置に読み込みます。 - 読み込むファイルは次の順で検索します。
- ソースファイルと同じディレクトリ
-Iオプションで指定されたディレクトリ
関連
-Iオプション
INCBIN
書式
INCBIN filename [, offset [, length]]
説明
- ファイル
filenameをバイトデータとして現在の位置に埋め込みます。 - 読み込むファイルは次の順で検索します。
- ソースファイルと同じディレクトリ
-Iオプションで指定されたディレクトリ
offsetが指定された場合、filenameを指定された位置から読み込みます。offset, lengthが指定された場合、filenameを指定された位置からlengthバイト分読み込みます。- 実際に読み込めるサイズが
lengthより小さい場合でもエラーにはならず、読める分だけ読み込みます。 - 読み込んだバイト数はシステム変数
$RSIZEに設定されます。(エラーの場合は -1)
; b16.bin
00000000: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 |0123456789ABCDEF
sample.asm:
1 0000 30 31 32 33 34 35 36 37 [ ] incbin "b16.bin"
0008 38 39 41 42 43 44 45 46 [ ]
2 0010 3e 10 [ 7] ld a, $rsize
3 0012 38 39 41 42 43 44 45 46 [ ] incbin "b16.bin", 8
4 001a 3e 08 [ 7] ld a, $rsize
5 001c 38 39 41 42 43 44 45 46 [ ] incbin "b16.bin", 8, 16
6 0024 3e 08 [ 7] ld a, $rsize
関連
CHARMAP
書式
CHARMAP name, json-filename|json-string [, option]
説明
- json ファイル
json-filenameもしくは json 文字列json-stringを指定して charmapnameを定義します。 - 定義した charmap は文字列を引数とし、要素数が 1 か 2 のバイト配列を出力する関数となります。
- charmap を適用した結果を数値とする場合は、組み込み関数
$CHRを使用します。 - json ファイルは次の順で検索します。
- ソースファイルと同じディレクトリ
-Iオプションで指定されたディレクトリ
optionによって定義した charmap にない文字の扱いを指定できます。- 有効な json のフォーマットは次のとおりです。
- 単1オブジェクト
{} - キーは
string(1 文字) - 値は
numberのarray
- 単1オブジェクト
mz700.json の冒頭
{" ": [0], "!": [97], "\"": [98], "#": [99], "$": [100], "%": [101], 以降省略
option |
値 | 説明 |
|---|---|---|
| 指定なし | 未定義の文字をエラーとします。 | |
| 指定あり | $CMAP_ERR (-1) |
|
$CMAP_THRU (-2) |
未定義の文字をそのまま出力します。 | |
数値 (0-65535) |
指定された数値を文字コードとし出力します。 |
1 charmap map, '{"a":[1]}'
2 charmap mapb, '{"a":[1]}', 255
3 charmap mapw, '{"a":[1]}', $1234
4 charmap mapt, '{"a":[1]}', $cmap_thru
5
6 0000 01 3f [ ] db map("ab")
* [ERR] CHARMAP に文字 'b' の定義がない
7 0002 01 ff [ ] db mapb("ab")
8 0004 01 12 34 [ ] db mapw("ab")
9 0007 01 62 [ ] db mapt("ab")
10
11 charmap vmap, '{"a":[1], "b":[1,2]}'
12 0009 3e 01 [ 7] ld a, $chr(vmap("a"))
13 000b 21 02 01 [10] ld hl, $chr(vmap("b"))
関連
SETMAP
書式
SETMAP name, char, array
説明
- 定義済みの charmap を修正します。
nameは charmap 名、charは 1 文字の文字列、arrayは要素数が 1 か 2 のバイトデータ配列です。- 定義の追加、更新は可能ですが、削除はできません。
1 charmap map, '{}' ; 空の charmap
2 "a":[1, 2] setmap map, "a", [1, 2] ; 追加
3
4 0000 01 02 [ ] db map("a")
5
6 charmap map2, '{"a": [1, 2]}'
7 "a":[1] setmap map2, "a", [1] ; 更新
8 "b":[2] setmap map2, "b", [2] ; 追加
9
10 0002 01 02 [ ] db map2("ab")
関連
ERROR/WARN/INFO
書式
ERROR expression
WARN expression
INFO expression
説明
expression(文字列)をそれぞれ、エラー/警告/情報として出力します。- 所定の書式で出力したい場合は組み込み関数
$FMT, $FORMATを使用します。
temp/sample.asm:
1 03e7(999) const num = 999
2
3 error "エラー"
* [ERR] エラー
4 warn "警告"
* [WARN] 警告
5 info $fmt("pass: %d, num: %d", $pass, num)
* [INFO] pass: 1, num: 999
関連
IF/ELIF/ELSE/ENDIF
書式
IF expression
[ELIF expression...]
[ELSE expression]
ENDIF
説明
- 条件アセンブルです。
- ネストも可能です。
ELIFは複数定義できます。ELIFは評価時にネストしたIFのシンタックスシュガーです。
IF 1 ; statment ELIF 2 ; statment ELIF 3 ; statment ELSE ; statment ENDIF
IF 1
; statment
ELSE
IF 2
; statment
ELSE
IF 3
; statment
ELSE
; statment
ENDIF
ENDIF
ENDIF
関連
FUNC/RETURN/ENDF
書式
; 定義
name FUNC [parameter [, parameter...]]
[statement...]
RETURN [expression]
[statement...]
ENDF
; 呼出し ※yas80 には式文がないため、ブランク識別子への代入としている
_ = name ( [argument [, argument...]] )
関数定義
- 関数
nameを定義します。 - 任意数(0 個以上)の仮引数を定義可能です
関数呼出し
nameの後に引数のリストを()で囲ったものです。- 引数を持たない関数でも呼出しの際に
()が必要です。 - 関数定義の仮引数の数と、関数呼出しの実引数の数が同じでない場合エラーになります。
- 可変長引数はありませんが、配列を使用することで代替できる場合があります。
戻り値
RETURN expressionのexpressionを評価した値を戻り値とし、呼出し元へ戻ります。RETURNでexpressionを省略した場合、もしくは関数内の文がENDFに到達した場合、"不定な値" を戻り値として呼出し元へ戻ります。- "不定な値" を値として使用するとエラーになります。
nameは定数、変数として定義できる"関数値"として評価します。
クロージャ
- 関数呼出し毎に新しいスコープを作成します。
- 関数呼出しから関数を返す場合、クロージャとなります。
1 ; フィボナッチ数列の n 項(0-) を返す関数
2 fib func n
3 if n == 0
4 return 0
5 elif n == 1
6 return 1
7 else
8 return fib(n - 1) + fib(n - 2) ; 再帰
9 endif
10 endf
11
12 rept 5
13 db $i, fib($i)
14 endr
14 + $COUNT = 5(0x5)
14 + $I = 0(0x0)
14 0000 00 00 [ ] + db $i, fib($i)
14 + $COUNT = 5(0x5)
14 + $I = 1(0x1)
14 0002 01 01 [ ] + db $i, fib($i)
14 + $COUNT = 5(0x5)
14 + $I = 2(0x2)
14 0004 02 01 [ ] + db $i, fib($i)
14 + $COUNT = 5(0x5)
14 + $I = 3(0x3)
14 0006 03 02 [ ] + db $i, fib($i)
14 + $COUNT = 5(0x5)
14 + $I = 4(0x4)
14 0008 04 03 [ ] + db $i, fib($i)
1 ; "n から始まる数値を返す関数"を返す関数
2 mk_counter func n
3 var value = n - 1
4 fn func
5 value = value + 1
6 return value
7 endf
8 return fn ; 戻り値は"関数"
9 endf
10
11 var counter = mk_counter(0)
12
13 0000 3e 00 [ 7] ld a, counter()
14 0002 3e 01 [ 7] ld a, counter()
15 0004 3e 02 [ 7] ld a, counter()
16 0006 3e 03 [ 7] ld a, counter()
関連
FUNCTION
書式
FUNCTION name ( [parameter [, parameter...]] ) expression
name FUNC [parameter [, parameter...]]
RETURN expression
ENDF
説明
expressionを戻り値とする関数nameを定義します。- これは書式の下側の
FUNCを使用した定義のシンタックスシュガーです。 - 引数は
()で囲みます。引数がない(0 個)場合でも()が必要です
1 ; 配列要素の合計を返す関数
2 function sum(vals) sum_iter(0, 0, vals)
3
4 sum_iter func total, index, vals
5 if index == $len(vals)
6 return total
7 else
8 return sum_iter(total + vals[index], index + 1, vals)
9 endif
10 endf
11
12 0000 3e 00 [ 7] ld a, sum([])
13 0002 3e 01 [ 7] ld a, sum([1])
14 0004 3e 06 [ 7] ld a, sum([1, 2, 3])
関連
MACRO/ENDM
書式
; 定義
name MACRO [parameter [, parameter...]]
statements
ENDM
; 呼出し
name [argument [, argument]]
マクロ定義
- マクロ
nameを定義します。 - 任意個(0 個以上)の仮引数を定義可能です。
- マクロ定義内で
"@"で始まる名前を使用した場合、MACROローカルの名前になります。 MACROローカル名は定義されているマクロ内でユニークである必要があります。- マクロ定義はネストできません(マクロ定義の中でマクロを定義することはできません)
- マクロ定義の中に
PROCを含むことはできません。 - マクロ定義の中から定義中のマクロそのものを呼び出す(再帰呼び出し)ことはできません。
マクロ呼出し
- マクロ定義の仮引数の数と、マクロ呼出しの実引数の数が同じでない場合エラーになります。
- 可変長引数はありませんが、配列を使用することで代替できる場合があります。
- マクロ呼出し中に
EXITMを評価した場合、そのマクロの評価を終了し、マクロ呼出し元へ戻ります。
1 1000(4096) const addr1 = $1000
2 2000(8192) const addr2 = $2000
3
4 check macro n, addr
5 cp n
6 jp nz, @ret
7 call addr
8 @ret: ret
9 endm
10
11 check 1, addr1
11 0000 fe 01 [ 7] + cp n
11 0002 c2 08 00 [10] + jp nz, @ret
11 0005 cd 00 10 [17] + call addr
11 0008 c9 [10] + @ret: ret
11 + endm(CHECK)
12 check 2, addr2
12 0009 fe 02 [ 7] + cp n
12 000b c2 11 00 [10] + jp nz, @ret
12 000e cd 00 20 [17] + call addr
12 0011 c9 [10] + @ret: ret
12 + endm(CHECK)
sample.asm:
1 pushreg macro reg
2 if $isary(reg)
3 rept reg ; 配列なら展開して push
4 push $v
5 endr
6 else
7 push reg ; そうでなければそのまま push
8 endif
9 endm
10
11 pushreg hl
11 0000 e5 [11] + push reg ; そうでなければそのまま push
11 + endm(PUSHREG)
12 pushreg [hl, de]
12 + $COUNT = 2(0x2)
12 + $I = 0(0x0)
12 + $V = HL
12 0001 e5 [11] + push $v
12 + $COUNT = 2(0x2)
12 + $I = 1(0x1)
12 + $V = DE
12 0002 d5 [11] + push $v
12 + endm(PUSHREG)
sample.lst
sample.asm
1 defmsg macro num, msg
2 data ## $fmt("_%02d", num) db msg
3 endm
4
5 defmsg 1, "one"
5 0000 6f 6e 65 [ ] + data ## $fmt("_%02d", num) db msg
5 + endm(DEFMSG)
6 defmsg 2, "two"
6 0003 74 77 6f [ ] + data ## $fmt("_%02d", num) db msg
6 + endm(DEFMSG)
7 defmsg 3, "three"
7 0006 74 68 72 65 65 [ ] + data ## $fmt("_%02d", num) db msg
7 + endm(DEFMSG)
sample.sym
0000 DATA_01
0003 DATA_02
0006 DATA_03
関連
REPT/ENDR
書式
REPT expression
statements
ENDR
説明
expressioinの評価結果が数値の場合、その回数だけREPT-ENDR間のstatementを展開します。expressioinの評価結果が配列の場合、その配列要素の数だけREPT-ENDR間のstatementを展開します。- 展開の際、次のシステム変数の値が設定されます。
| 変数名 | 型 | 内容 |
|---|---|---|
$COUNT |
数値 | "REPT数値" の場合はその数値(展開回数)" REPT配列" の場合は配列要素数 |
$I |
数値 | 展開毎の序数(0から$COUNT - 1まで) |
$V |
- | "REPT配列" の展開毎の値(配列要素の値) |
push_regs macro lst
rept lst
push $v
endr
endm
pop_regs macro lst
rept $rev(lst) ; 逆順にする
pop $v
endr
endm
process proc
const .regs = [hl, de] ; 保存レジスタの定義
push_regs .regs ; 保存レジスタ push
; do something
pop_regs .regs ; 保存レジスタ pop
ret
endp
関連
EXITM
書式
1) EXITM
2) EXITM IF expression
IF expression
EXITM
ENDIF
説明
EXITMを評価するとマクロ展開を中止します。- 後置
IFはIF expression\EXITM\ENDIFのシンタックスシュガーです。 - 次の例では
REPTの最後の展開時のみinc hlが評価されないようEXITMを使用しています。
1 rept 4
2 ld (hl), a
3 exitm if $i == $count - 1
4 inc hl
5 endr
5 + $COUNT = 4(0x4)
5 + $I = 0(0x0)
5 0000 77 [ 7] + ld (hl), a
5 0001 23 [ 6] + inc hl
5 + $COUNT = 4(0x4)
5 + $I = 1(0x1)
5 0002 77 [ 7] + ld (hl), a
5 0003 23 [ 6] + inc hl
5 + $COUNT = 4(0x4)
5 + $I = 2(0x2)
5 0004 77 [ 7] + ld (hl), a
5 0005 23 [ 6] + inc hl
5 + $COUNT = 4(0x4)
5 + $I = 3(0x3)
5 0006 77 [ 7] + ld (hl), a