トピックス
- (2017/04/21) 逆アセンブラ形式の出力に対応しました。
前提環境
- JRE1.8以上
- 対象とするプロセッサ:MC6800, MC6802, MB8861
インストール
以下からプログラムをダウンロードして適当なフォルダに格納してください。インストーラはありません。.ini
ファイルやレジストリ等は使用せず、設定はすべてコマンドラインオプションで指定します。
“6802アセンブラ” をダウンロード asm6802.jar – 383 回のダウンロード –
アンインストール
ダウンロードしたjarファイルを削除してください。その他のファイルやレジストリ等は使用していません。
実行方法
java -jar asm6802.jar -r 入力ファイル [-w 出力ファイル] [-mb8861] [-g] [-a] [-h]
指定できるオプションは以下の通り。
- -r 入力ファイル
- アセンブリ言語のソースファイルを指定する。省略はできない。
- -w 出力ファイル
- マシン語に変換した結果を出力するファイルを指定する。省略した場合は標準出力に書き出す。
- -g
- ソースファイル中で複数の
.ORG
命令が指定され、それらのアドレスの出力範囲が連続でないとき、その間を0x00で埋めることを指示する。 - -a
- 出力結果にアドレスを追加します。
- -h
- 出力結果の先頭行にヘッダ部を出力する。
- -d
- 逆アセンブラ形式で出力する。
- -mb8861
- MB8861の命令セットを有効にします。
- --help
- ヘルプを表示する。
実行例
サンプルのソースプログラムです(作成途中のものです…)。
VIA: .EQU 0xc800
T1CL: .EQU 0x04
T1CH: .EQU 0x05
T1LL: .EQU 0x06
T1LH: .EQU 0x07
ACR: .EQU 0x0b
.ORG 0x3000
START:
LDX VIA
LDAA [X+ACR]
ORAA 0xd0 ; T1 free-run mode
STAA [X+ACR]
LDX SCORE
STX [CUR]
LOOP: LDAA [X] ; A: 音程
CMPA 0xFF
BEQ END
LDX [TEMP]
ASLA
ADDA [TEMP+1]
ANDA 0x00 ; Aにゼロをセット(Cフラグ変化無し)
ADCB [TEMP]
LDX VIA
STAA [X+T1CL]
STAB [X+T1CH] ; この時点から新しい音程の音を発生する。
BSR WAIT
BSR WAIT
LDX CUR
INX
STX [CUR]
BRA LOOP
END: LDX VIA
LDAA [X+ACR]
ANDA 0x3F
STAA [X+ACR]
RTS
; 約0.4秒待つ
WAIT: PSHA
CLRA
CLRB
LOOP: DECB
BNE LOOP
DECA
BNE LOOP
PULA
RTS
.ORG 0x3080 ;
TABLE: .DW 0x0473, 0x0433, 0x03F6, 0x03BD, 0x0387, 0x0355, 0x0325, 0x02F7
.DW 0x02CD, 0x02A4, 0x027E, 0x025A, 0x0238, 0x0218, 0x01FA, 0x01DD
.DW 0x01C2, 0x01A9, 0x0191, 0x017A, 0x0165, 0x0151, 0x013E, 0x012D
.DW 0x011B, 0x010B, 0x00FC
.ORG 0x30C0
SCORE: .DB 0, 8, 10, 12, 10, 8, 7, 8, 10, 12, 10, 0, 99
.ORG 0x30F0
TEMP: .DW 0x3080 ; 音程データのアドレス計算用
CUR: .DW 0x0000 ; 現在の音符位置退避用
オプション未指定の場合の出力は以下です。.ORG
で始まるセクション毎に空行が入ります。
E:\tmp>java -jar asm6802.jar -r test6522.asm
CE C8 00 A6 0B 8A D0 A7 0B CE 31 00 FF 31 82 A6
00 81 FF 27 20 FE 31 80 48 BB 31 81 84 00 F9 31
80 CE C8 00 A7 04 E7 05 8D 15 8D 13 CE 31 82 08
FF 31 82 20 DA CE C8 00 A6 0B 84 3F A7 0B 39 36
4F 5F 5A 26 FD 4A 26 FA 32 39
04 73 04 33 03 F6 03 BD 03 87 03 55 03 25 02 F7
02 CD 02 A4 02 7E 02 5A 02 38 02 18 01 FA 01 DD
01 C2 01 A9 01 91 01 7A 01 65 01 51 01 3E 01 2D
01 1B 01 0B 00 FC
00 02 08 02 0A 02 0C 02 0A 02 08 02 07 02 08 01
0A 07 0C 01 0A 07 00 02 63 63
30 80 00 00<br>
-g -a -hをすべて指定した場合の出力は以下です。
E:\tmp>java -jar asm6802.jar -r sample.asm -g -a -h
addr: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ★ -h指定でこの行が付加される。
----:------------------------------------------------
3000: CE C8 00 A6 0B 8A D0 A7 0B CE 30 C0 FF 30 F2 A6 ★ -a指定で行の先頭にアドレスが付加される。
3010: 00 81 FF 27 20 FE 30 F0 48 BB 30 F1 84 00 F9 30
3020: F0 CE C8 00 A7 04 E7 05 8D 15 8D 13 CE 30 F2 08
3030: FF 30 F2 20 DA CE C8 00 A6 0B 84 3F A7 0B 39 36
3040: 4F 5F 5A 26 FD 4A 26 FA 32 39 00 00 00 00 00 00 ★ -g指定で次の.ORGまで0x00で埋められる。
3050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3080: 04 73 04 33 03 F6 03 BD 03 87 03 55 03 25 02 F7
3090: 02 CD 02 A4 02 7E 02 5A 02 38 02 18 01 FA 01 DD
30A0: 01 C2 01 A9 01 91 01 7A 01 65 01 51 01 3E 01 2D
30B0: 01 1B 01 0B 00 FC 00 00 00 00 00 00 00 00 00 00
30C0: 00 08 0A 0C 0A 08 07 08 0A 0C 0A 00 63 00 00 00
30D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
30E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
30F0: 30 80 00 00
-dを指定した場合の出力は以下です。
START:
3000 CE C8 00 LDX 0xC800
3003 A6 0B LDAA [X+0x0B]
3005 8A D0 ORAA 0xD0
3007 A7 0B STAA [X+0x0B]
3009 CE 31 00 LDX 0x3100
300C FF 31 82 STX [0x3182]
LOOP:
300F A6 00 LDAA [X+0x00]
3011 81 FF CMPA 0xFF
3013 27 20 BEQ END
3015 FE 31 80 LDX [0x3180]
3018 48 ASLA
3019 BB 31 81 ADDA [0x3181]
301C 84 00 ANDA 0x00
301E F9 31 80 ADCB [0x3180]
3021 CE C8 00 LDX 0xC800
3024 A7 04 STAA [X+0x04]
3026 E7 05 STAB [X+0x05]
3028 8D 15 BSR WAIT
302A 8D 13 BSR WAIT
302C CE 31 82 LDX 0x3182
302F 08 INX
3030 FF 31 82 STX [0x3182]
3033 20 DA BRA LOOP
END:
3035 CE C8 00 LDX 0xC800
3038 A6 0B LDAA [X+0x0B]
303A 84 3F ANDA 0x3F
303C A7 0B STAA [X+0x0B]
303E 39 RTS
WAIT:
303F 36 PSHA
3040 4F CLRA
3041 5F CLRB
LOOP2:
3042 5A DECB
3043 26 FD BNE LOOP2
3045 4A DECA
3046 26 FA BNE LOOP2
3048 32 PULA
3049 39 RTS
TABLE:
3080 04 73
3082 04 33
3084 03 F6
3086 03 BD
3088 03 87
308A 03 55
308C 03 25
308E 02 F7
3090 02 CD
3092 02 A4
3094 02 7E
3096 02 5A
3098 02 38
309A 02 18
309C 01 FA
309E 01 DD
30A0 01 C2
30A2 01 A9
30A4 01 91
30A6 01 7A
30A8 01 65
30AA 01 51
30AC 01 3E
30AE 01 2D
30B0 01 1B
30B2 01 0B
30B4 00 FC
SCORE:
3100 00 02
3102 08 02
3104 0A 02
3106 0C 02
3108 0A 02
310A 08 02
310C 07 02
310E 08 01
3110 0A 07
3112 0C 01
3114 0A 07
3116 00 02
3118 63 63
TEMP:
3180 30 80
CUR:
3182 00 00
文法
プログラムは1行に1命令を記述する。各行の形式は以下の通り。各行は必ず改行で終了しなくてはならない。またアセンブラが読み込むことができる最小のファイルは、1個の改行のみがあるファイルである。
[ラベル名:] [命令] [オペランド] [; コメント]
コメント
行中でセミコロン(;)が現れた場合、セミコロンから行末まではコメントとして扱う。コメントはアセンブラの実行結果には影響を及ぼさない。
ラベル
ラベルはその行のアドレスを参照するために用いる名前で、省略可能である。ラベル名は英文字で始まり英数字が0文字以上続く文字列であり、ラベル名の直後にコロン(:)をつける。大文字・小文字は区別する。ラベル名とコロンの間に空白文字が0文字以上あっても構わない。
ラベルは2種類ある。
ラベル種 | 意味 |
---|---|
定数ラベル | ソースプログラム中で不変の定数を表し、.EQU命令で定義する。定数ラベルは1段の前方参照を許容する。2段以上の前方参照及び循環参照をした場合は、その値は不定になる。
CYCLIC1: .EQU CYCLIC2 ; 循環参照:NG (不定)
CYCLIC2: .EQU CYCLIC1
FORWARD1: .EQU FORWARD2 + 0x100 ; 2段の前方参照:NG (不定)
FORWARD2: .EQU FORWARD3 + 0x100 ; 1段の前方参照:OK
FORWARD3: .EQU 0xC100
.ORG 0x1000
LDX CYCLIC1 ; 不定 (0になっている)
LDX CYCLIC2 ; 不定 (0になっている)
LDX FORWARD1 ; 不定 (0xC200になっている)
LDX FORWARD2 ; OK: 0xC200
LDX FORWARD3 ; OK; 0xC100
|
アドレスラベル | ソースプログラム中でのアドレス値を表し、.ORG・.EQU命令以外の命令のラベル部で定義する。アドレスラベルは前方参照を許容する。
LOOP: CMPA 0xFF ; LOOPがアドレスラベル
BRA END: ; 前方参照: OK
DECA
BNE LOOP ; 広報参照: OK
END: RTS ; ENDがアドレスラベル
|
命令
6800/6802のニモニックまたは後述する疑似命令のニモニックを記述する。大文字・小文字は区別しない。MB8861の命令を有効にする場合は、実行時に-mb8861
オプションを指定する。疑似命令を下表に示す。
命令 | 意味 |
---|---|
.ORG |
オペランドに記述する1バイトまたは2バイト値を、この命令以降のアドレスの初期値とする。ソースプログラム中に複数指定できる。ただしアドレスが昇順になるようにし、また直前の命令のアドレスよりも小さい値を.ORGのオペランドで指定してはならない。 記述例:0x3000から命令を開始したい場合 .ORG 0x3000
START: LDX 0xc100
|
.EQU |
定数を定義する。この命令のラベル部分が定数名、オペランドが定数値となる。 記述例:"ORIGIN"という名前で0xC100という値を示す場合 ORIGIN: .EQU 0xc100
|
.DB |
オペランドで指定した1個以上の1バイト値をメモリに格納する。各値はカンマ(,)で区切る。 記述例:10進数または16進数のバイト列をメモリに格納する場合 DATA1: .DB 0, 1, 2, 3
DATA2: .DB 0x04, 0x05, 0x06, 0x07
|
.DW |
オペランドで指定した1個以上の2バイト値をメモリにビッグエンディアン形式で格納する。各値はカンマ(,)で区切る。 記述例:10進数または16進数の2バイト数値列をメモリに格納する場合 DATA1: .DW 0, 1, 2, 3
DATA2: .DW 0x1000, 0x2000
|
アドレシングモード
命令のオペランドに指定するアドレシングモードの記法は下表に示す。
アドレシングモード | 記法 | 意味 |
---|---|---|
Immediateモード | 0x12 0xFFFF |
0以上の整数を10進数または16進数で表記する。16進数の場合は0xまたは0Xを前置する。 |
Directモード | {0x12} |
0(0x00)~255(0xFF)までの整数を大かっこで囲って表記する。大かっこ内で指定した値はメモリアドレスを表す。 |
Indexedモード | [X+0x34] |
インデックスレジスタXからの相対アドレスを0(0x00)~255(0xFF)の整数で表記する。相対アドレスがゼロの場合は+0 を省略しても良い。 |
Extendedモード | [0x1234] |
0(0x00)~65535(0xFFFF)までの整数を角かっこで囲って表記する。角かっこ内で指定した値はメモリアドレスを表す。 |
Relativeモード | 0x12 |
プログラムカウンタからの相対アドレスを-128(0x80)~127(0x7F)までの2の補数で表記する。 |