アセンブラ仕様

簡易的なアセンブラで、ソースレベルのデバッグが可能です。
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テレビゲームのソースコードが公開されているため、 アセンブラを作成する時に、このソースコードをアセンブルできるよう参考にさせていただきました。

ただし、そのままでは動作させることが難しいことや、文字コードに対応できない(昔のパソコンで使用していた文字コード?)、疑似命令を変更したいなどありソースコードの変換をしています。
このアセンブラでアセンブルできるように変換をしたソースコードを、ダウンロードページへ置きました。
ソースコードの変換と、ソースコードの公開をすることに対して許可を取っていないため、ライセンス的な問題などありましたら削除します。

アセンブル方法ですが、

  1. vdmgrを起動
  2. メニューから「設定」‐「詳細設定」を選択
  3. システムに「Z80テレビゲーム」を選択、「デバッガ」からデバッガ起動をチェック後、「OK」を押下
  4. TVGAME.zipを適当な場所へ展開後、以下ファイルをドラッグアンドドロップ
    • GALA.ASM
    • INV.ASM
    • OTHE.ASM
    • PAC.ASM
    • SPACE.ASM
    • TV.ASM

Z80のCPUをエミュレートする時も、Z80テレビゲームのバイナリを使用させていただきました。
ハード仕様、バイナリ、ソースコードを公開していただき、大変感謝いたします。