6809 命令表

凍結

 レジスタ 

← d →    d  16 ビット・アキュームレータ・レジスタ。a,b をくっ付けたもの。d = a << 8 | b
ab    a   8 ビット・アキュームレータ・レジスタ
b   8 ビット・アキュームレータ・レジスタ
x    x  16 ビット・インデックス・レジスタ
y    y  16 ビット・インデックス・レジスタ
u    u  16 ビット・インデックス/ユーザスタック・レジスタ
s    s  16 ビット・インデックス/システムスタック・レジスタ
pc    pc 16 ビット・プログラム・カウンタ・レジスタ
 cc    cc  8 ビット・コンディション・コード・レジスタ



 フラグ 

  7 6 5 4 3 2 1 0
CCレジスタ E F H I N Z V C
bit 0cキャリー・フラグ桁上がり,桁下がり
bit 1vオーバーフロー・フラグ符号付き演算での桁溢れ
bit 2zゼロ・フラグゼロか(1) 否か(0)
bit 3nネガティブ・フラグ負か(1) 否か(0)
bit 4iIRQマスク・フラグIRQ割込禁止をするか(1) 否か(0)
bit 5hハーフ・キャリー・フラグBCD足算用に8bitのadd,adcでbit3からのキャリー(以外の命令では不定)
bit 6fFIRQマスク・フラグFIRQ割込禁止をするか(1) 否か(0)
bit 7eエントリ・フラグ割込ですべてのレジスタを退避したか(1)、PC,CCのみか(0)





 アドレッシング 

イミディエイトアドレッシング
指定された値そのものを対象とする場合。
  例) lda  #$20       a = 0x20
      ldb  #-1        b = -1
※数値のメモリ格納順番は、ビックエンディアン。
エクステンド・アドレッシング
指定された値をアドレスとして、そのメモリの値を対照とする場合。
  例) lda  $FC00      a = *(char*)0xFC00
      lda  >$FC00     ※自動でダイレクトページ・アドレッシングに
                           ならないように強制する場合
ダイレクト・アドレッシング
dp レジスタの値をアドレスの上位 8ビットの値として 下位 8ビットのみを指定する場合。
  例) lda  <$10       a = dp[0x10] ※dpをポインタに見立てて
インデックス・アドレッシング
インデックス・レジスタやPC・レジスタと相対値とで表されるアドレス のメモリを対象とする場合。
さらいに、
非インダイレクト・モード
直接アドレスが示すメモリ
        例) lda  $10,x          a = x[0x10]
インダイレクト・モード
間接アドレッシング。
メモリの中身をポインタとしてその指しているメモリ
        例) lda  [$10,x]        a = *x[0x10]
があり、さらに、細かくみると、
ゼロ・オフセットlda ,ya = *y
n(5,8,16)ビット・オフセットlda 4,wa = w[4]
レジスタ(a,b,d)オフセットlda b,xa = x[b]
オート(ポスト)インクリメントlda ,x+a = *x++
オート(プレ)デクリメントldd ,--yd = *--y
PCオフセットlda LBL,pcra = *LBL
のようなものがある。
インハラント・アドレッシング
abx,mul等オペランドの無いもの。 ただし、命令表では レジスタ・アドレッシング (レジスタ同士の演算, pull/push) リラティブアドレッシング(ブランチ命令) など"その他"も含めている。



 命令 

  • エンディアンは、ビッグエンディアン
  • メモリは、16ビットレジスタとの演算で無い限り、8ビット幅で扱われる。 (間接アドレッシングでの、ポインタは16ビット値)
  • 略記
    OPオペコード
    クロック数。
    バイト数
  • オペランド,動作での略記
    Rレジスタ. 使えるレジスタは命令ごとによる
    I,Jイミディエイト値(即値).
    Mメモリ.
    IMメモリかイミディエイト値
    RGspush/pullできるレジスタ郡. pc,s/u,y,x,dp,b,a,cc
    OFS11バイトのPCリラティブ(相対)値. 基準はその分岐命令の次のアドレス.
    OFS22バイトのPCリラティブ(相対)値. 〃

ニーモニック オペランド インハラント イミディエイト ダイレクト インデックス エクステンド フラグ 動作
OP # OP ~ # OP ~ # OP ~ # OP ~ # EFHINZVC (C/Java言語風表現)
lda IM


86 2 2 96 4 2 A6 4+ 2+ B6 5 3 ....**0. a = IM
ldb IM


C6 2 2 D6 4 2 E6 4+ 2+ F6 5 3 ....**0. b = IM
ldd IM


CC 3 3 DC 5 2 EC 5+ 2+ FC 6 3 ....**0. d = IM
ldx IM


8E 3 3 9E 5 2 AE 5+ 2+ BE 6 3 ....**0. x = IM
ldy IM


10 4 4 10 6 3 10 6+ 3+ 10 7 4 ....**0. y = IM





8E

9E

AE

BE



ldu IM


CE 3 3 DE 5 2 EE 5+ 2+ FE 6 3 ....**0. u = IM
lds IM


10 4 4 10 6 3 10 6+ 3+ 10 7 4 ....**0. s = IM





CE

DE

EE

FE






















sta M





97 4 2 A7 4+ 2+ B7 5 3 ....**0. M = a
stb M





D7 4 2 E7 4+ 2+ F7 5 3 ....**0. M = b
std M





DD 5 2 ED 5+ 2+ FD 6 3 ....**0. M = d
stx M





9F 5 2 AF 5+ 2+ BF 6 3 ....**0. M = x
sty M





10 6 3 10 6+ 3+ 10 7 4 ....**0. M = y








9F

AF

BF



stu M





DF 5 2 EF 5+ 2+ FF 6 3 ....**0. M = u
sts M





10 6 3 10 6+ 3+ 10 7 4 ....**0. M = s








DF

EF

FF






















adda IM


8B 2 2 9B 4 2 AB 4+ 2+ BB 5 3 ..*.**** a += IM
addb IM


CB 2 2 DB 4 2 EB 4+ 2+ FB 5 3 ..*.**** b += IM
addd IM


C3 4 3 D3 6 2 E3 6+ 2+ F3 7 3 ..*.**** d += IM



















adca IM


89 2 2 99 4 2 A9 4+ 2+ B9 5 3 ..*.**** a += IM + c
adcb IM


C9 2 2 D9 4 2 E9 4+ 2+ F9 5 3 ..*.**** b += IM + c



















suba IM


80 2 2 90 4 2 A0 4+ 2+ B0 5 3 ..?.**** a -= IM
subb IM


C0 2 2 D0 4 2 E0 4+ 2+ F0 5 3 ..?.**** b -= IM
subd IM


83 4 3 93 6 2 A3 6+ 2+ B3 7 3 ..?.**** d -= IM



















sbca IM


82 2 2 92 4 2 A2 4+ 2+ B2 5 3 ..?.**** a -= IM + c
sbcb IM


C2 2 2 D2 4 2 E2 4+ 2+ F2 5 3 ..?.**** b -= IM + c



















cmpa IM


81 2 2 91 4 2 A1 4+ 2+ B1 5 3 ..?.**** a - IM
cmpb IM


C1 2 2 D1 4 2 E1 4+ 2+ F1 5 3 ..?.**** b - IM
cmpd IM


10 5 4 10 7 3 10 7+ 3+ 10 8 4 ....**** d - IM





83

93

A3

B3



cmpx IM


8C 4 3 9C 6 2 AC 6+ 2+ BC 7 3 ....**** x - IM
cmpy IM


10 5 4 10 7 3 10 7+ 3+ 10 8 4 ....**** y - IM





8C

9C

AC

BC



cmpu IM


11 5 4 11 7 3 11 7+ 3+ 11 8 4 ....**** u - IM





83

93

A3

B3



cmps IM


11 5 4 11 7 3 11 7+ 3+ 11 8 4 ....**** s - IM





8C

9C

AC

BC






















mul
3D 11 1











.....*.* d = a * b 符号無



















anda IM


84 2 2 94 4 2 A4 4+ 2+ B4 5 3 ....**0. a &= IM
andb IM


C4 2 2 D4 4 2 E4 4+ 2+ F4 5 3 ....**0. b &= IM



















ora IM


8A 2 2 9A 4 2 AA 4+ 2+ BA 5 3 ....**0. a |= IM
orb IM


CA 2 2 DA 4 2 EA 4+ 2+ FA 5 3 ....**0. b |= IM



















eora IM


88 2 2 98 4 2 A8 4+ 2+ B8 5 3 ....**0. a ^= IM
eorb IM


C8 2 2 D8 4 2 E8 4+ 2+ F8 5 3 ....**0. b ^= IM



















bita IM


85 2 2 95 4 2 A5 4+ 2+ B5 5 3 ....**0. a & IM
bitb IM


C5 2 2 D5 4 2 E5 4+ 2+ F5 5 3 ....**0. b & IM



















clr M





0F 6 2 6F 6+ 2+ 7F 7 3 ....0100 M = 0, c=0
clra
4F 2 1











....0100 a = 0, c=0
clrb
5F 2 1











....0100 b = 0, c=0



















inc M





0C 6 2 6C 6+ 2+ 7C 7 3 ....***. ++M
inca
4C 2 1











....***. ++a
incb
5C 2 1











....***. ++b



















dec M





0A 6 2 6A 6+ 2+ 7A 7 3 ....**0. --M
deca
4A 2 1











....**0. --a
decb
5A 2 1











....**0. --b



















tst M





0D 6 2 6D 6+ 2+ 7D 7 3 ....**0. M - 0
tsta
4D 2 1











....**0. a - 0
tstb
5D 2 1











....**0. b - 0



















com M





03 6 2 63 6+ 2+ 73 7 3 ....**01 M = ~M, c=1
coma
43 2 1











....**01 a = ~a, c=1
comb
53 2 1











....**01 b = ~b, c=1



















neg M





00 6 2 60 6+ 2+ 70 7 3 ..?.**** M = -M
nega
40 2 1











..?.**** a = -a
negb
50 2 1











..?.**** b = -b



















asl/lsl M





08 6 2 68 6+ 2+ 78 7 3 ..?.**** M <<= 1
asla
48 2 1











..?.**** a <<= 1
aslb
58 2 1











..?.**** b <<= 1



















asr M





07 6 2 67 6+ 2+ 77 7 3 ..?.**.* M >>= 1 符号付
asra
47 2 1











..?.**.* a >>= 1 符号付
asrb
57 2 1











..?.**.* b >>= 1 符号付



















lsr M





04 6 2 64 6+ 2+ 74 7 3 ....0*.* M >>>= 1 符号無
lsra
44 2 1











....0*.* a >>>= 1 符号無
lsrb
54 2 1











....0*.* b >>>= 1 符号無



















rol M





09 6 2 69 6+ 2+ 79 7 3 ....**** M = M << 1 | c はみ出した最上位ビット
rola
49 2 1











....**** a = a << 1 | c が新たなcフラグになる
rolb
59 2 1











....**** b = b << 1 | c



















ror M





06 6 2 66 6+ 2+ 76 7 3 ....**.* M = (M>>>1) | (c<<7) はみだした最下位
rora
46 2 1











....**.* a = (a>>>1) | (c<<7) ビットが新たな
rorb
56 2 1











....**.* b = (b>>>1) | (c<<7) cフラグになる



















leax M








30 4+ 2+


.....*.. x = &M  leax ,u x = u
leay M








31 4+ 2+


.....*.. y = &M  leay -5,u y = u-5
leau M








32 4+ 2+


........ u = &M  leau b,u u = u+(sint8_t)b
leas M








33 4+ 2+


........ s = &M  leas d,u s = u+d



















exg R0,R1 1E 8 2











........ R1とR0を交換
tfr R0,R1 1F 6 2











........ R1 = R0 R:d,x,y,u,s,pc,w,v



















abx
3A 3 1











........ x += (uint8_t)b 符号無加算



















daa
19 2 1











....**** BCD加算時のa補正



















sex
1D 2 1











....**.. d = (sint8_t)b 符号拡張



















pshs RGs 34 5 2











........ *--s = RG をレジスタ分(順固定)
puls RGs 35 5 2











........ RG = *s++ をレジスタ分(順固定)
pshu RGs 36 5 2











........ *--u = RG をレジスタ分(順固定)
pulu RGs 37 5 2











........ RG = *u++ をレジスタ分(順固定)



















andcc I


1C 3 2








-------- cc &= I
orcc I


1A 3 2








-------- cc |= I



















sync
13 2 1











........ 割込待ち
cwai I


3C 20 2








1------- cc & I して割込待ち



















swi
3F 19 1











11.1.... ソフト割込発生
swi2
10 19 1











1....... ソフト割込発生1


3F















swi3
11 19 1











1....... ソフト割込発生3


3F















rti
3B 6/15 1











???????? ccをpullして割込からreturn



















rts
39 5 1











........ return



















nop
12 2 1











........ なにもしない



















jsr M





9D 7 2 AD 7+ 2+ BD 8 3 ........ 絶対アドレス&Mでルーチン呼出



















jmp M





0E 3 2 6E 3+ 2+ 7E 4 3 ........ 絶対アドレス&Mで goto



















bsr OFS1 8D 7 2











........ 1バイト相対アドレスで呼出
lbsr OFS2 17 9 3











........ 2バイト相対アドレスで呼出



















bra OFS1 20 3 2











........ 1バイト相対アドレスでgoto
lbra OFS2 16 5 3











........ 2バイト相対アドレスでgoto



















brn OFS1 21 3 2











........ 2バイトnop, (1バイトskip)
lbrn OFS2 10 5/6 4











........ 4バイトnop


21















bhi OFS1 22 3 2











........ 符号無 > 分岐. (c|z) == 0
lbhi OFS2 10 5/6 4











........


22















bls OFS1 23 3 2











........ 符号無 <= 分岐. (c|z) == 1
lbls OFS2 10 5/6 4











........


23















bcc/bhs OFS1 24 3 2











........ 符号無 >= 分岐. c == 0
lbcc OFS2 10 5/6 4











........


24















bcs/blo OFS1 25 3 2











........ 符号無 < 分岐. c == 1
lbcs OFS2 10 5/6 4











........


25















bne OFS1 26 3 2











........ != 分岐. z == 0
lbne OFS2 10 5/6 4











........


26















beq OFS1 27 3 2











........ == 分岐. z == 1
lbeq OFS2 10 5/6 4











........


27















bvc OFS1 28 3 2











........ v == 0 分岐.
lbvc OFS2 10 5/6 4











........


28















bvs OFS1 29 3 2











........ v == 1 分岐.
lbls OFS2 10 5/6 4











........


29















bpl OFS1 2A 3 2











........ 正か零で分岐. n == 0
lbpl OFS2 10 5/6 4











........


2A















bmi OFS1 2B 3 2











........ 負で分岐. n == 1
lbmi OFS2 10 5/6 4











........


2B















bge OFS1 2C 3 2











........ 符号付 >= 分岐. (n ^ v) == 0
lbge OFS2 10 5/6 4











........


2C















blt OFS1 2D 3 2











........ 符号付 < 分岐. (n ^ v) == 1
lblt OFS2 10 5/6 4











........


2D















bgt OFS1 2E 3 2











........ 符号付 > 分岐. (z|(n^v)) == 0
lbgt OFS2 10 5/6 4











........


2E















ble OFS1 2F 3 2











........ 符号付 >= 分岐. (z|(n^v)) == 1
lble OFS2 10 5/6 4











........


2F


















 インデックス・アドレッシングのポストバイト 


アドレッシング 非インダイレクトモード インダイレクトモード
形式 ポストバイト 形式 ポストバイト
コンスタント オフセット ゼロ・オフセット ,R 1RR00100 0 0 [,R] 1RR10100 3 0
5ビット・オフセット N,R 0RRnnnnn 1 0 ----- -------- - -
8ビット・オフセット N,R 1RR01000 1 1 [N,R] 1RR11000 4 1
16ビット・オフセット N,R 1RR01001 4 2 [N,R] 1RR11001 7 2
アキューム レータ オフセット aレジスタ・オフセット a,R 1RR00110 1 0 [a,R] 1RR10110 4 0
bレジスタ・オフセット b,R 1RR00101 1 0 [b,R] 1RR10101 4 0
dレジスタ・オフセット d,R 1RR01011 4 0 [d,R] 1RR11011 7 0
オート インクリメント デクリメント ポスト・インクリメント+1 ,R+ 1RR00000 2 0 ----- -------- - -
ポスト・インクリメント+2 ,R++ 1RR00001 3 0 [,R++] 1RR10001 6 0
プレ・デクリメント-1 ,-R 1RR00010 2 0 ----- -------- - -
プレ・デクリメント-2 ,--R 1RR00011 3 0 [,--R] 1RR10011 6 0
PCオフセット 8ビット・オフセット n,pcr 1xx01100 1 1 [N,pcr] 1xx11100 4 1
16ビット・オフセット n,pcr 1xx01101 5 2 [N,pcr] 1xx11101 8 2
エクステンド 16ビット・アドレス --- -------- - - [NN] 10011111 5 2

  • R : x y u s
    RR: 00=x, 01=y, 10=u, 11=s

  • 1RR10010 または 1RR11111 で RR=00 でないとき、未定義トラップがかかる。

  • クロック数(〜)やバイト数(#) は、命令のモノに追加される増分値。

  • オフセット値は、すべて符号付で計算される。
    5ビットのときは -16〜15
    8ビットのときは -128〜127
    16ビットのときは -32768〜32767
    当然 a,b,d などのレジスタも同様。

  • PCオフセットの指定方法としては
     ADR,pcr  結果はADR. ADRまでの相対値をアセンブラが自動で計算する.
     OFS,pc   結果は pc+OFS. ユーザに任せる。
    の2種類がある。
    ただし、アセンブラによっては、
    ADR,pc
    として pc を指定しても pcr と同じ動作をするものもあるので注意。



 割り込みベクタ 

$FFF2 SW3 pc,u,y,x,dp,b,a,cc 順に退避
$FFF4 SW2 pc,u,y,x,dp,b,a,cc 順に退避
$FFF6 FIRQ pc,cc 順に退避
$FFF8 IRQ pc,u,y,x,dp,b,a,cc 順に退避
$FFFA SW1 pc,u,y,x,dp,b,a,cc 順に退避
$FFFC NMI pc,u,y,x,dp,b,a,cc 順に退避
$FFFE RESTART dp=$00 cc=%x1x1xxxx



 参考文献 

 6809ハンドブック,  Nifty OS9フォーラム,  雑誌 Oh!FM, I/O など。