情報整理できました。
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