簡易的なアセンブラで、ソースレベルのデバッグが可能です。
CPUのサポートするメモリ空間を超えたバイナリファイル(Z80なら64KB以上)の生成が可能です。
(ただし、ソースレベルのデバッグは未対応)。
ソースファイルの拡張子は.asm、.s、タブ幅は8文字を想定していますが、空白で揃えることも可能。
文字コードは、UTF-8/16(BOMあり・なし)、SHIFT-JIS、EUCに対応しており自動判別します。
現在は、以下の命令をサポートします。
また、以下のシステムで動作します。
vdmgrのメニュー「ファイル」‐「開く」から選択、またはソースファイルをドラッグアンドドロップすることで行われます。
上記操作を行った後(アセンブルに失敗しても)、それ以降「Ctrl+R」で再アセンブルを行えます。
アセンブル結果は、デバッガで起動した時のログに表示されます。
行毎に命令を記述し、行はシンボル列、ニーモニック列、オペランド列で構成されます。
シンボル[:] | ニーモニック | オペランド |
シンボル列は必ず行の先頭から始まり、ラベルや名前を定義します(ラベルや名前の終端にコロン(:)を使用可)。
ニーモニック列にはニーモニックを、オペランド列にはニーモニックのオペランドを記述します。
セミコロン(;)以降はコメントとして扱い、行末まで無視されます。
例)
; シンボル ニーモニック オペランド .Z80 XXXX .EQU 12H TEST: LD A, XXXX
数値は、以下の書式をサポートします。
また、数値以外に、ダブルクォーテーション("")で囲まれた文字列、シングルクォーテーション('')で囲んだ文字をサポートします。
進数 | 説明 | 記述例(10進数196の場合) |
---|---|---|
2進数 | %から始まる2進数文字列。 | %11000100 | Bで終わる2進数文字列。 | 11000100B | 0bから始まる2進数文字列。 | 0b11000100 | 0yから始まる2進数文字列。 | 0y11000100 |
8進数 | 0から始まる8進数文字列。 | 0304 |
10進数 | 10数値文字列。 | 196 |
16進数 | $から始まる16進数文字列。 | $C4 |
Hで終わる16進数文字列。 A-Fから始まる時は、先頭に0を付ける必要あり。 | 0C4H | 0xから始まる16進数文字列。 | 0xc4 |
>から始まる16進数文字列。 ※.TMS9995を指定時のみ使用可 | >C4 |
種類 | 演算子 | 説明 | 記述例 |
---|---|---|---|
算術演算子 | + | 加算 | A + B | - | 減算 | A - B | * | 乗算 | A * B | / | 除算 | A / B | % | 剰余 | A % B |
論理演算子 | = | 等しい | A = B | != | 等しくない | A != B | < | より小さい | A < B | <= | 以下 | A <= B | > | より大きい | A > B | >= | 以上 | A >= B |
ビット演算子 | & | ビットAND | A & B | | | ビットOR | A | B | ^ | ビットXOR | A ^ B | ! | ビット反転 | !A | << | 左シフト | A << 7 | >> | 右シフト | A >> 7 |
疑似命令は、CPUが扱う命令ではなく、アセンブルするために必要な命令や、データの定義、確保などを行うために指定します。
疑似命令は、シンボル列、またはニーモニック列に記述します。
定義名 | 引数 | 説明 |
---|---|---|
.Z80 |
Z80の命令を使用します。 最初に記述する必要があります。 | |
.MCS-51 |
MCS-51の命令を使用します。 最初に記述する必要があります。 | |
.TMS9995 |
TMS9995の命令を使用します。 最初に記述する必要があります。 | |
.ROM | 開始アドレス, サイズ | ROMイメージの出力開始アドレスと、サイズを指定します。 |
.RAM | 開始アドレス, サイズ |
RAMイメージの出力開始アドレスと、サイズを指定します。 ※Z80/TMS9995時のみ有効 |
.XRAM | 開始アドレス, サイズ |
外部RAMイメージの出力開始アドレスと、サイズを指定します。 ※MCS-51時のみ有効 |
.IRAM | 開始アドレス, サイズ |
内蔵RAMイメージの出力開始アドレスと、サイズを指定します。 ※MCS-51時のみ有効 |
.TEXT |
TEXTセクションを選択します。 これ以降定義した命令、.DB、.DW、をROMへ配置します。 | |
.BSS |
BSSセクションを選択します。 これ以降定義した.DSをRAM、または外部RAMへ配置します。 | |
.IBSS |
IBSSセクションを選択します。 これ以降定義した.DSと.BITを内蔵RAMへ配置します。 ※MCS-51時のみ有効 | |
.FAIL | ["文字列"] | 文字列を表示した後、アセンブルを中断します。 |
.FILE | "ファイル名" | .ROMで指定した範囲のROMイメージを、ファイルへ出力します。 |
.EQU | 値を定義します。 | |
= | .EQUと同じ。 | |
.ORG | アドレス[,配置アドレス] |
選択中のセクション(.TEXT、.BSS、.IBSS)の開始、配置アドレスを指定します。 ■アドレスのみ指定 指定したアドレスに対する命令の生成と、ROMイメージへの配置を行います。 ■アドレスと配置アドレスを指定 指定したアドレスに対する命令の生成と、ROMイメージに対し指定した配置アドレスへ配置します。 主に、バンクメモリをサポートするROMイメージを作成する時に使用します。 例)ROMイメージの0x10000に、0xc000から始まる命令を配置する場合 .ORG 0x8000,0x10000 |
.END |
アセンブルを終了します。 .END以降の行は無視されます。 | |
.ALIGN | 2~256の数値。 | アラインメントを揃えます。 |
.MACRO | マクロ定義の開始。 | |
.ENDM | マクロ定義の終了。 | |
.FUNC | 関数定義。 | |
.DB | 1バイトデータ |
.TEXTセクションのみ指定可能。 1バイトデータの定義。 カンマ区切りによる複数指定と、文字列の指定が可能です。 |
.BYTE | .DBと同じ。 | |
.DW | 2バイトデータ |
.TEXTセクションのみ指定可能。 2バイトデータの定義。 カンマ区切りによる複数指定と、文字列の指定が可能です。 |
.WORD | .DWと同じ。 | |
.DS | バイト数 |
.BSSセクション、または.IBSSセクションのみ指定可能。 指定したバイト数分のRAMを確保します。 |
.BIT | ビット数 |
.IBSSセクションのみ指定可能。 指定したビット数分のRAMを確保します。 .ORGは影響せず、先頭(0x20)から順に配置します。 ※MCS-51時のみ有効 |
.INCLUDE | "ファイル名" | 指定したソースファイルの内容を、指定した行へ読み込みます。 |
.INCBIN | "ファイル名" | 指定したバイナリファイルの内容を、指定した行へ読み込みます。 |
.IF | 条件 |
条件が真の時、以降の行をアセンブル対象とします。 条件が偽の時、.ELSE/.ELIF/.ENDIFが出現するまで無視します。 |
.IFDEF | 名前 |
名前が定義されている時、以降の行をアセンブル対象とします。 名前が定義されていない時、.ELSE/.ELIF/.ENDIFが出現するまで無視します。 |
.IFNDEF | 名前 |
名前が定義されていない時、以降の行をアセンブル対象とします。 名前が定義されている時、.ELSE/.ELIF/.ENDIFが出現するまで無視します。 |
.ELSE |
.ELSEより前に定義した.IF/.IFDEF/.IFNDEF/.ELIFの条件が全て偽の時、以降の行をアセンブル対象とします。 .ELSEより前に定義した.IF/.IFDEF/.IFNDEF/.ELIFの条件が真の時、.ENDIFが出現するまで無視します。 | |
.ELIF | 条件 |
.ELIFより前に定義した.IF/.IFDEF/.IFNDEF/.ELIFの条件が全て偽の時に、 条件が真の時、以降の行をアセンブル対象とします。 条件が偽の時、.ELSE/.ELIF/.ENDIFが出現するまで無視します。 |
.ENDIF | .IF/.IFDEF/.IFNDEF/.ELSE/.ELIFの終了を行う時に指定します。 |
※[ ]で囲まれたパラメータは無視することが可能
シンボル名 | 説明 |
---|---|
__VERSION__ | バージョン番号 |
ARG_NONE | マクロ引数の種類:なし。 |
ARG_AREG | マクロ引数の種類:バイトレジスタ。 |
ARG_BREG | マクロ引数の種類:バイトレジスタ。 |
ARG_WREG | マクロ引数の種類:ワードレジスタ。 |
ARG_IREG | マクロ引数の種類:間接アクセスレジスタ。 |
ARG_STRING | マクロ引数の種類:文字列。 |
ARG_LABEL | マクロ引数の種類:ラベル。 |
定義名 | 説明 |
---|---|
¥# | 引数の数 |
¥1 - ¥9 | 引数 |
¥?1 - ¥?9 | 引数の種類("ARG_"から始まる定義済みシンボル名) |
例)マクロ定義
TEST .MACRO .IF \? = ARG_BREG .IF \# = 1 ; 1バイト x 1 LD B, \1 .ELSE ; 1バイト x 2 LD B, \1 LD C, \2 .ENDIF .ELSE .IF \# = 1 ; 2バイト x 1 LD BC, \1 .ELSE ; 2バイト x 2 LD BC, \1 LD DE, \2 .ENDIF .ENDIF .ENDM
例)マクロ呼び出し
TEST A ; 1バイト x 1 TEST A, 0x12 ; 1バイト x 2 TEST IX ; 2バイト x 1 TEST IX, 0x1234 ; 2バイト x 2
定義名 | 説明 |
---|---|
¥1 - ¥9 | 引数 |
例)関数定義
TEST .FUNC ((\1*2)+\2)
例)関数呼び出し
LD BC, TEST(4,3) ; LD BC, ((4*2)+3) に展開される
関数 | 説明 |
---|---|
HIGH(value) | valueの上位1バイトを取得(HIGH .FUNC ((\1)>>8)) |
LOW(value) | valueの下位1バイトを取得(LOW .FUNC ((\1)&255)と同じ) |
DEFINED(name) | nameで指定したシンボル名が存在する時は1, 存在しない時は0を返す。 |
ジャンプ命令などで使用するラベルはシンボル列に記述します。
カンマ(.)から始まるラベルは、ファイル内のみ有効なローカルラベルとして処理します。
名前 | 説明 |
---|---|
@@ | ファイル内でのみ有効なローカルラベル |
@B | 1つ前のローカルラベル |
@F | 1つ先のローカルラベル |
$ | 命令のあるアドレス |
TEST1: ; 全てのファイルから参照可能なラベル(グローバル) TEST2 .EQU 1 ; .TEST3: ; 定義したファイル内のみ参照可能(ローカル) .TEST4 .EQU 2 ; JMP @F ; 下にある @@ 行へジャンプ : @@: LDA #0 : JMP @B ; 上にある @@ 行へジャンプ : JMP $ ; この命令を繰り返し
.DS 疑似命令で確保した領域の名前の最後にコロン(:)を付けない場合、デバッガのローカルウィンドウへ表示されます。
TEST1 .DS 1 ; デバッガのローカルウィンドウへ表示 TEST2: .DS 1 ; デバッガのローカルウィンドウへ表示しない
両面テープ配線式電子工作で、Z80テレビゲームのソースコードが公開されているため、
アセンブラを作成する時に、このソースコードをアセンブルできるよう参考にさせていただきました。
ただし、そのままでは動作させることが難しいことや、文字コードに対応できない(昔のパソコンで使用していた文字コード?)、疑似命令を変更したいなどありソースコードの変換をしています。
このアセンブラでアセンブルできるように変換をしたソースコードを、ダウンロードページへ置きました。
ソースコードの変換と、ソースコードの公開をすることに対して許可を取っていないため、ライセンス的な問題などありましたら削除します。
アセンブル方法ですが、
Z80のCPUをエミュレートする時も、Z80テレビゲームのバイナリを使用させていただきました。
ハード仕様、バイナリ、ソースコードを公開していただき、大変感謝いたします。