052001 の indexed

情報整理できました。

7654 3210|d==0   # ~ _|d==1     # ~ _|operation(d=0)
---------+------------+--------------+------------
0000_d111|n16    2 1 0|[n16]    4 0 0|ea = {mem0,mem1}
1xxx_d100|DP,n8  1 3 0|[DP,n8]  3 2 0|ea = {dp[15:8], mem}
0RRR_d000|,R+    0 4 0|[,R+]    2 3 0|ea = R; R += 1
0RRR_d001|,R++   0 5 0|[,R++]   2 4 0|ea = R; R += 2
0RRR_d010|,-R    0 4 0|[,-R]    2 2 0|R -= 1; ea = R
0RRR_d011|,--R   0 5 0|[,--R]   2 3 0|R -= 2; ea = R
0RRR_d100|n8,R   1 5 0|[n8,R]   3 4 0|ea = R + signed(mem)
0RRR_d101|n16,R  2 2 0|[n16,R]  5 1 0|ea = R + {mem0,mem1}
0RRR_d110|,R     0 4 0|[,R]     2 3 0|ea = R
1RRR_d000|sA,R   0 6 0|[sA,R]   2 5 0|ea = R + signed(A)
1RRR_d001|sB,R   0 6 0|[sA,R]   2 5 0|ea = R + signed(B)
1RRR_d010|X,R    0 4 0|[X,R]    2 3 0|ea = X + R
1RRR_d011|Y,R    0 4 0|[Y,R]    2 3 0|ea = Y + R
1RRR_d101|U,R    1 2 0|[U,R]    3 1 0|ea = U + R
1RRR_d110|S,R    0 4 0|[S,R]    2 3 0|ea = S + R
1RRR_d111|D,R    1 4 0|[D,R]    3 3 0|ea = D + R

RRR register field (TFR, EXG の SRC も同じ)
3'b000:xA 3'b001:xB 3'b010:X 3'b011:Y
3'b100:DP 3'b101:U  3'b110:S 3'b111:PC
  • n16 と DP,n8 の bit の並びは特殊で優先度が高い
  • DP,n8: DP bit15:8 と offset bit7:0 を連接したもの
    • 結果的に 6809 の DPと同じ
  • x: don't care
  • RRR: 0: xA, 1:xB, 2:X, 3:Y, 4:DP(16bit), 5:U, 6:S, 7:PC
    • xA は bit15:8 に不定値が入る
    • xB は bit15:8 にAが入ることが多いが更新前の古い A の値が入っている場合もあるので、 まともな D として使えないことがある。
    • DP は 16 bit register と見なし、 16bit 全てで加算する
    • PC を加減算することもできるが、ソフト制御が困難になる
  • ~: post byte を読んでから memory access までの待ち clock 数 (AS=H)
  • _: post byte を読んでから memory access までの待ち clock 数 (AS=L, 全部 0 です)
  • #: indexed 処理として追加で読み込む byte 数
    • U,R と D,R はマイクロコードの不備なのか余計な read 処理がかかる
  • sA, sB: A か B の bit7 を bit15:8 まで符号拡張したもの
  • X,R Y,R U,R S,R は当時のROMには使用されていないもので unofficial code かもしれない

U,R の読み込み

read>  a:ff25 d:3a ;sta
read>  a:ff26 d:85 ;U,uA
read>  a:ff27 d:60 ;先行 opcode fetch (2 clock)
idle~> 3           ;sta なので 1 clock 多い
write> a:bb10 d:bb ;
read>  a:ff27 d:60 ;破棄される opcode fetch??
read>  a:ff28 d:fe

U,R の addressing はおそらく microcode のバグで、待ちは 2 clock ありますが、無駄な memory read があるので、経過クロック数は 4, 追加読み込み byte 数は 1 です。

D,R の読み込み

U,R に似た microcode のバグで、待ちが 4 clock に加え無駄な memory read が1度あるので 経過クロック数は 6, 追加読み込み byte 数は 1 です。

sA,R と sB,R の読み込み

これは符号拡張の関係なのか 16bit レジスタの加算より 2 clock 遅いです。

nonwait log

lda 命令で R = X として全通り動かした log です。(R の中身によって待ち時間は変わりません)
lea 命令でも動かしたのですが indexed addressing が起因の待ち時間の差はありませんでした。

idle~> 2
readn> a:fffe d:ff 
readn> a:ffff d:00 
readn> a:ff00 d:40 
readn> a:ff01 d:00 
readn> a:ff02 d:00 
readn> a:ff03 d:42 
readn> a:ff04 d:ee 
readn> a:ff05 d:45 
readn> a:ff06 d:12 
readn> a:ff07 d:20 
idle~> 4
readn> a:ee45 d:00 
readn> a:ff08 d:12 
readn> a:ff09 d:28 
idle~> 3
readn> a:ee46 d:00 
readn> a:ee47 d:00 
readn> a:0303 d:42 
readn> a:ff0a d:12 
readn> a:ff0b d:21 
idle~> 5
readn> a:ee47 d:00 
readn> a:ff0c d:12 
readn> a:ff0d d:29 
idle~> 4
readn> a:ee49 d:00 
readn> a:ee4a d:00 
readn> a:0303 d:42 
readn> a:ff0e d:12 
readn> a:ff0f d:22 
idle~> 4
readn> a:ee4a d:00 
readn> a:ff10 d:12 
readn> a:ff11 d:2a 
idle~> 3
readn> a:ee49 d:00 
readn> a:ee4a d:00 
readn> a:0303 d:42 
readn> a:ff12 d:12 
readn> a:ff13 d:23 
idle~> 5
readn> a:ee47 d:00 
readn> a:ff14 d:12 
readn> a:ff15 d:2b 
idle~> 4
readn> a:ee45 d:00 
readn> a:ee46 d:00 
readn> a:0303 d:42 
readn> a:ff16 d:12 
readn> a:ff17 d:24 
readn> a:ff18 d:01 
idle~> 5
readn> a:ee46 d:00 
readn> a:ff19 d:12 
readn> a:ff1a d:2c 
readn> a:ff1b d:01 
idle~> 4
readn> a:ee46 d:00 
readn> a:ee47 d:00 
readn> a:0303 d:42 
readn> a:ff1c d:12 
readn> a:ff1d d:25 
readn> a:ff1e d:01 
readn> a:ff1f d:02 
idle~> 2
readn> a:ef47 d:a5 
readn> a:ff20 d:12 
readn> a:ff21 d:2d 
readn> a:ff22 d:01 
readn> a:ff23 d:02 
idle~> 1
readn> a:ef47 d:a5 
readn> a:ef48 d:12 
readn> a:0303 d:42 
readn> a:ff24 d:12 
readn> a:ff25 d:26 
idle~> 4
readn> a:ee45 d:00 
readn> a:ff26 d:12 
readn> a:ff27 d:2e 
idle~> 3
readn> a:ee45 d:00 
readn> a:ee46 d:00 
readn> a:0303 d:42 
readn> a:ff28 d:12 
readn> a:ff29 d:27 
readn> a:ff2a d:01 
readn> a:ff2b d:02 
idle~> 1
readn> a:0102 d:00 
readn> a:ff2c d:12 
readn> a:ff2d d:2f 
readn> a:ff2e d:01 
readn> a:ff2f d:02 
readn> a:0102 d:00 
readn> a:0103 d:42 
readn> a:0303 d:42 
readn> a:ff30 d:12 
readn> a:ff31 d:a0 
idle~> 6
readn> a:ee48 d:00 
readn> a:ff32 d:12 
readn> a:ff33 d:a8 
idle~> 5
readn> a:ee48 d:00 
readn> a:ee49 d:00 
readn> a:0303 d:42 
readn> a:ff34 d:12 
readn> a:ff35 d:a1 
idle~> 6
readn> a:ee45 d:00 
readn> a:ff36 d:12 
readn> a:ff37 d:a9 
idle~> 5
readn> a:ee45 d:00 
readn> a:ee46 d:00 
readn> a:0303 d:42 
readn> a:ff38 d:12 
readn> a:ff39 d:a2 
idle~> 4
readn> a:dc8a d:00 
readn> a:ff3a d:12 
readn> a:ff3b d:aa 
idle~> 3
readn> a:dc8a d:00 
readn> a:dc8b d:00 
readn> a:0303 d:42 
readn> a:ff3c d:12 
readn> a:ff3d d:a3 
idle~> 4
readn> a:ee45 d:00 
readn> a:ff3e d:12 
readn> a:ff3f d:ab 
idle~> 3
readn> a:ee45 d:00 
readn> a:ee46 d:00 
readn> a:0303 d:42 
readn> a:ff40 d:12 
readn> a:ff41 d:a4 
readn> a:ff42 d:01 
idle~> 3
readn> a:0001 d:00 
readn> a:ff43 d:12 
readn> a:ff44 d:ac 
readn> a:ff45 d:01 
idle~> 2
readn> a:0001 d:00 
readn> a:0002 d:00 
readn> a:0000 d:00 
readn> a:ff46 d:12 
readn> a:ff47 d:a5 
readn> a:ff48 d:12 
idle~> 2
readn> a:ee45 d:00 
readn> a:ff48 d:12 
readn> a:ff49 d:ad 
readn> a:ff4a d:12 
idle~> 1
readn> a:ee45 d:00 
readn> a:ee46 d:00 
readn> a:0303 d:42 
readn> a:ff4a d:12 
readn> a:ff4b d:a6 
idle~> 4
readn> a:ee3f d:00 
readn> a:ff4c d:12 
readn> a:ff4d d:ae 
idle~> 3
readn> a:ee3f d:00 
readn> a:ee40 d:00 
readn> a:0303 d:42 
readn> a:ff4e d:12 
readn> a:ff4f d:a7 
readn> a:ff50 d:12 
idle~> 4
readn> a:f145 d:01 
readn> a:ff50 d:12 
readn> a:ff51 d:af 
readn> a:ff52 d:ae 
idle~> 3
readn> a:f145 d:01 
readn> a:f146 d:12 
readn> a:0303 d:42 
readn> a:ff52 d:ae 
readn> a:ff53 d:ae 
readn> a:ff54 d:03