トピックス
- (2017/04/21) 逆アセンブラ形式の出力に対応しました。
前提環境
- JRE1.8以上
- 対象とするプロセッサ:MC6800, MC6802, MB8861
インストール
以下からプログラムをダウンロードして適当なフォルダに格納してください。インストーラはありません。.ini
ファイルやレジストリ等は使用せず、設定はすべてコマンドラインオプションで指定します。
“6802アセンブラ” をダウンロード asm6802.jar – 373 回のダウンロード –
アンインストール
ダウンロードした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の補数で表記する。 |