6802アセンブラユーザーズガイド

トピックス

  • (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
100
0以上の整数を10進数または16進数で表記する。16進数の場合は0xまたは0Xを前置する。
Directモード {0x12}
{200}
0(0x00)~255(0xFF)までの整数を大かっこで囲って表記する。大かっこ内で指定した値はメモリアドレスを表す。
Indexedモード [X+0x34]
[X+1]
[X]
インデックスレジスタXからの相対アドレスを0(0x00)~255(0xFF)の整数で表記する。相対アドレスがゼロの場合は+0を省略しても良い。
Extendedモード [0x1234]
[0x10]
[30000]
0(0x00)~65535(0xFFFF)までの整数を角かっこで囲って表記する。角かっこ内で指定した値はメモリアドレスを表す。
Relativeモード 0x12
0xFA
プログラムカウンタからの相対アドレスを-128(0x80)~127(0x7F)までの2の補数で表記する。
タイトルとURLをコピーしました