コマンドライン書式

	nnasm [<options>] <infile>|-

	入力ファイルは <infile> で指定します。"-" なら標準出力です。
	オプションは次の通りです。

	  -d <class>
		デバッグモードです。<class> は以下のいずれかで複数指定可です。
			t ... 字句解析付近
			p ... パーサ付近
			e ... 式展開

	  -f <format>
		出力形式を指定します。以下のいずれかです。デフォルトは hex です。
			bin		... 生バイナリを出力する
			c       ... C ソースを出力する
			hex		... hexdump 形式で出力する (デフォルト)
			inc		... C ソース用の配列部分だけ出力

	  -m <cputype>
		対象 CPU の初期値を指定します。デフォルトは "z80" です。
		<cputype> には以下が指定可能です。大文字小文字は区別しません。

			cputype		CPU アーキテクチャ
			-------		-----------------
			z80			z80
			64180		z80
			88100		88000

		cputype は入力ファイル中の .CPU 疑似命令でも随時変更可能ですが
		一度確定させた後は別の CPU アーキテクチャには変更できません。

	  -o <outfile>
		出力ファイル名を指定します。"-" なら標準出力です。
		デフォルトは "-" です。

	  -w <warning>=<level>
		警告・エラーレベルを指定します。
		詳細は「警告・エラー」の項を参照してください。

	  -P
		入力をプリプロセッサ (cpp(1)) に通します。
	  -D <name>
		プリプロセッサにそのまま渡します。

戻り値
	正常終了なら 0、ファイルが読めないなどのシステムエラーは 1 を返します。
	アセンブラソースの解釈や文法エラーなどは 2 を返します。

ファイル書式
	文字・文字列中を除き、基本的に大文字と小文字の区別はありません。
	';' 以降行末までをコメントとして無視します。
	各行は基本的には以下の構造です。

		[<label>:]	[<cmd>	[<operands...>]]

定数と(グローバル)ラベル
	定数と(ローカルラベルでない)ラベルは、英字か '_'(アンダースコア) で始まり
	2文字目以降は英字 と '_' に加えて数字が書けます。先頭を数字には出来ません。
	大文字小文字の区別はありません。文字数制限はありません。

ローカルラベル
	ローカルラベルは 32ビットの正数で表します。
	ローカルラベルの参照は後方(手前)なら '@' + ローカルラベル + 'b'、
	前方なら '@' + ローカルラベル + 'f' で指定します。
	大文字小文字は区別しません。

	例:
		JR	Z,@2f	; ゼロなら無限ループを飛ばして次へ
	  1:
		JR	@1b		; 無限ループ
	  2:

数値
	数値は以下の書式をサポートしています。慣習とは異なりますが、CPU 種別に
	関わらず常にいずれも使用可能です。サフィックスの H, B とプレフィックス
	の 0x, 0b の部分も大文字小文字を区別しません。
	内部では 32 ビットで演算します。

	  123 (10進数、先頭に 0 があってもよく8進数にはならない)

	  123H, 0A0H (16進数、Z80 式)

	  0011B (2進数、Z80 式)

	  0x123 (16進数、C 言語式)

	  0b0011 (2進数、C 言語式)

	  'A' (文字定数)

	文字定数中ではエスケープにより '\t', '\r', '\n' が使えます。
	それ以外の文字の場合はその文字を出力します。


式と演算子
	以下の演算子が使えます。

	  + - * /	加減乗除
	  -			単項マイナス演算子
	  +			単項プラス演算子
	  & | ~		ビット AND OR NOT 演算子
	  .hi16.	32ビット数の上位16ビットを返す単項演算子です。
	  .lo16.	32ビット数の下位16ビットを返す単項演算子です。

	括弧 '(', ')' も使えますが、Z80 ではメモリ間接の書式との混同に注意して
	ください。

	  LD	A,(0100H + 2)

	はメモリ間接ですが、

	  ADD	A,(0100H + 2)

	は ADD A,n の n を表す式の外側の括弧として書けてしまいます。
	これについては -w extra-paren で警告レベルを制御できます。

	式にはラベル(定数)が書けます。凡例中特に明示されなかったり <expr> と
	書いてあるところは前方ラベルも解決できますが、<constant> と書いてある
	ところは前方ラベルの解決は出来ません。すでに出てきたラベル(定数)は
	使用可能です。

	例:
	  BASEADDR	.EQU	0x4000
	  DATAPORT	.EQU	BASEADDR + 1	; BASEADDR は既出のため可能

	  FOO		.EQU	LABEL + 1		; .EQU は <constant> なのでこれは不可
				JR		LABEL			; ジャンプ先は <expr> なのでこれは可
	  LABEL:


疑似命令
	以下の疑似命令をサポートしています。
	疑似命令はすべて '.' で始まりますが、'.' なしでも受け付けます。

	  .CPU <cputype>
		対象 CPU を変更します。-m コマンドラインオプションと同じです。
		-m オプションも .CPU 疑似命令もない状態、つまり対象 CPU が一度も
		指定されていない状態で、 それ以外の疑似命令、通常命令、ラベルが
		来ると自動的に .CPU Z80 が確定します。

	  .ORG <constant>
		アドレスを指定します。
		<constant> に式も書けますが、ラベル等はこの時点で解決できる必要が
		あります。
		直前まで出力したアドレスから順方向に飛ぶ場合、空いたところは
		0x00 で埋められます。逆方向に戻ることは出来ません。

	  .PHASE <constant>
	  .DEPHASE
		...

	  .EQU <constant>
		定数を定義します。
		他アセンブラとの互換性のためラベル直後のコロンの有無は吸収しますので
		以下はどちらも同じです。

		  <label>	.EQU	<constant>
		  <label>:	.EQU	<constant>

		<constant> に式も書けますが、ラベル等はこの時点で解決できる必要が
		あります。

	  .MACRO [<varname1> [, <varname2> ... ]]
		マクロ定義を開始します。
		他アセンブラとの互換性のためマクロ名直後のコロンの有無は吸収します
		ので以下はどちらも同じです。

		  <name>	.MACRO
		  <name>:	.MACRO

		マクロは

		  MOV	.MACRO	REG, VALUE
				or.u	REG, r0,  .hi16.VALUE
				or		REG, REG, .lo16.VALUE
				.ENDM

		のように定義すると

				MOV		r2, 0x12345678
		が
				or.u	r2, r0, .hi16.0x12345678
				or		r2, r2, .lo16.0x12345678

		と展開されます。(これは m88100 で32ビット数をロードするやつです)

		マクロの中にローカルラベルは書けますが、ローカルラベルはスコープを
		持っていないことに注意してください。
		以下のようなコードを書いた場合は JR Z,@1f は CHECK_FOO をスキップ
		したい意図のように見えますが、実際にはマクロ CHECK_FOO の先頭の
		1: にジャンプすることになります。

		  CHECK_FOO	.MACRO
		  1:
				CALL	FOO
				JR		NZ,@1b	; FOO が Z になるまで繰り返す
				.ENDM

				...

				JR		Z,@1f	; Z ならチェックを飛ばしたかった
				CHECK_FOO
		  1:

	  .ENDM
	  .ENDMACRO
		マクロ定義の終了を表します。
		他アセンブラとの互換性のためどちらの表記もサポートしています。

	  .DEFB <expr> [, <expr>... ]
	  .DB   <expr> [, <expr>... ]
	  .DEFM <expr> [, <expr>... ]
	  .DM   <expr> [, <expr>... ]
		バイトデータを出力します。
		本来 DEFB がバイトデータ、DEFM が文字列を想定していますが
		ここではどちらも扱えるので

		  .DB	"Hello\t\tworld", 0x0d, 0x0a, '$'

		などと書くことが出来ます。

		文字列中ではエスケープにより '\t', '\r', '\n' が使えます。
		'"'(ダブルクォート) 自体は '\"' で出力できます。

	  .DEFW <expr> [, <expr>... ]
	  .DW   <expr> [, <expr>... ]
	  .DEFL <expr> [, <expr>... ]
	  .DL   <expr> [, <expr>... ]
		ワードデータ、ロングワードデータを出力します。
		こちらは文字列形式は受け付けません。

	  .DEFS	<expr1> [, <expr2> ]
	  .DS   <expr1> [, <expr2> ]
		<expr1> で指定したバイト数だけ <expr2> を出力します。
		<expr2> 省略時は 0x00 です。

	  .END
		他アセンブラとの互換性のために解釈だけしますが、何もしません。
		ここで終わるということもしません。

	  .WARN "<warning1>=<lv>" [, "<warning2>=<lv>" ... ]
		警告・エラーレベルを指定(変更)します。
		引数は文字列形式です。複数指定する時はカンマで区切って並べます。
		警告・エラーレベルの指定方法は -w オプションと同じなので
		そちらを参照してください。


アセンブラ書式 (Z80)

	Z80 アセンブラ書式は概ねいつものやつです。

	IXH, IXL レジスタはサポートしていません。

	IM 0, 1, 2 命令のオペランド部と RST 00H..38H 各命令のオペランド部は
	リテラルです。任意の数値表現 (IM 0x00 など) は文法エラーになります。

	IN F,(C) (フラグレジスタへの反映) 書式をサポートしています。

	BIT/SET/RES 命令のビット数は現状 <constant> 扱いで前方解決はしません。


警告とエラー
	-w <warning>=<level> オプション、および .WARN 疑似命令で警告・エラーを
	制御できます。
	<level> は次の通りです。
		0 ... 無視する
		1 ... 警告を表示するが処理は継続する
		2 ... 警告を表示し、処理を停止する

	<warning> に指定できるのは次の通りです。

	  compat
		Z80 で厳密には正しくない書式を警告します。他アセンブラとの互換性
		のために -wcompat=0 にすれば通るようになっています。
		o EX AF, AF (最後のダッシュがない)
		o LD (IX),A のように (IX+0) の +0 を省略したもの。

	  extra-paren
		Z80 でメモリ間接ではない即値オペランドの外側の括弧を警告します。
		LD A,(0100H) の括弧はメモリ間接を表す括弧ですが、
		ADD A,(0100H) の括弧はただの式の外側の括弧でメモリ間接ではない
		(が合法な式である) ということになってしまうためです。
