|
|
nono 0.0.1
名称
iasm -- 超簡易 m68k アセンブラ
書式
iasm [<options>] <input.iasm> [<output.cpp>]
解説
iasm は m68k アセンブラです。
入力はアセンブラソースですが、出力はオブジェクトファイルではなく
C++ ソースです。
<input.iasm> は入力ファイル、<output.cpp> は出力ファイルを指定
します。出力ファイル名を省略した場合は標準出力に出力します。
以下のオプションがあります。
-f <fmt>
以下のいずれかの出力形式を指定します。デフォルトは c です。
c C ソースを出力します。
binary 生バイナリを出力します。
文法(全般)
iasm ソースは has.x の下位互換を目指していますが、手抜き上あるいは
目的の性質上異なるところは多々あります。
以下に文法を示します。
行中の ';'(セミコロン)以降行末まではコメントとして無視します。
通常のアセンブラ同様、行頭に1個以上の空白かタブ (以降単に空白) が
あると命令とし、行頭が空白以外から始まるとラベルとみなします。
ラベルには続けて ':'(コロン) を置くことが出来ます(なくても構いません)。
ラベル(と ':')に続けて空白をおいてから同じ行に命令を記述することも
出来ます。
命令はオペコードとオペランドを空白で区切って記述します。
オペコードは必ず1つ。オペランドは 0個以上で、オペコードにより必要な
あるいは許される個数は異なります。
オペランドは ','(カンマ) で区切ります。この処理はオペランドの解析
よりも先に行いますのでオペランド中に ',' を書くことは出来ません。
例えば moveq.l #',',d0 のような文はエラーになります。
文法(擬似命令)
iasm では、以下の擬似命令をサポートしています。
.cinclude <header>
C/C++ のヘッダファイル <header> を出力します。
出力形式が c 以外であれば何も行いません。
例: .cinclude "xm6.h"
.cinclude <stdio.h>
.start <varname>
ソースブロックを開始します。<varname> は出力の際の変数名です。
アセンブルされたオブジェクトは const BYTE <varname>[] 変数の
初期値として出力されます。また const int <varname>_size には
このオブジェクト列の大きさが入ります。
例: .start Pluto::rom
.end
ブロックを終了します。.start からここまでのオブジェクトを
アセンブルして出力します。出力サイズが奇数の場合はワード境界に
切り上げて出力します。
.org <address>
開始アドレスを指定します。
.dc.b <data>|"<string>", ...
指定のデータをバイト単位で配置します。
.dc.b の引数が '"'(ダブルクォート) で囲ってある場合は文字列
とみなして展開します。手抜き処理順の都合により、例によって
セミコロンとカンマを文字列に含めることは出来ません。
エスケープシーケンスは "\n"、"\t" を認識します。
文字列中の日本語は (UTF-8 を) Shift_JIS に変換します。
.dc.w <expr>, <expr>, ...
.dc.l <expr>, <expr>, ...
指定のデータをワード単位、ロングワード単位で配置します。
<expr> にはラベルだけでなく、ラベルを用いた式を書くことが
できます。四則演算 '+' '-' '*' '/' および括弧 '(' ')' が
使えます。
例:
.dc.l (TEXTEND - TEXTSTART) * 2
.ds.b <size>, <size>, ...
.ds.w <size>, <size>, ...
.ds.l <size>, <size>, ...
指定のサイズをゼロで埋めて領域を確保します。
.equ <value>
この行のラベルの値を <value> と定義します。
.even
出力位置をワード境界に切り上げます。
なお .end 擬似命令でも内部で自動的にワード境界に切り上げます。
.rept <expr>
.endrept
.rept から .endrept で挟まれている命令を <expr> 回繰り返します。
<expr> はこの時点で解決できる定数式でなければなりません。
IOCS #<number>
IOCS コールを発行する内蔵マクロです。
#<number> に直接数値を書く代わりに内蔵している IOCS コール名も
使用できます。ニーモニックは「ぷにぐらま〜ずまにゅある」の
iocscall.man のものです。
文法(アドレッシングモード)
以下のアドレッシングモードが使用可能です。
大文字小文字は区別しません。
Dn
An
(An)
-(An)
(An)+
abs.w
abs.l
たぶんそのまま使えます。
d16(PC)
PC 相対です。たぶん普通に使えると思います。
#imm
即値です。'$'から始まると16進数とみなします。'x' で1文字の
文字コードを表現できます。数値から始まると10進数とみなします。
0 から始まっても10進数とします。以下の例はいずれも同じ意味
になります。
例:#48
#$30
#'0'
d16(An)、d8(An,IX)、d8(PC,IX) は未実装です。特にインデックス付きは
パーサを改良するかカンマを含まない書式に変える必要があるかも。
文法(命令)
以下の命令をサポートしています。大文字小文字は区別しません。
サイズサフィックスは moveq や lea のような省略形式にも対応しています。
bra、bcc 命令については .s を .b と同様に扱います。
それ以外特に注意のない限り書式は HAS.X と同様です。
bra.b
clr
dbra
jmp
lea
move
moveq
nop
reset
rte
rtd
rts
rtr
trap
trapv
Bcc 命令はニーモニックを変えています。B<cc>.B のように分岐条件
<cc> を命令語の一部とせず第1オペランドにし、分岐先ラベルは第2
オペランドにしています。Z80 の JP 命令みたいな感じです。
bcc.b <cc>,<label>
bcc.w <cc>,<label>
例えば HAS の bcs.b <label> は iasm では bcc.b cs,<label>、
bcc.w <label> は iasm では bcc.w cc,<label> となります。
条件コード <cc> はモトローラニーモニックのものです。
手抜き
たくさん手抜きしてあります。必要に迫られたらその都度実装してね。
o オペランドの分割処理がてきとーすぎるためオペランド中に ',' を書く
ことができません。
o 命令語は新しいのに出会い次第増やしていくことになると思います。
o Bcc を正しくサポートしたい。
o オペランドのエラーチェックはほぼ行っていません。したほうがいいね。
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.