(古い記事の書き直しで、古い記事は削除しました。)
indexed register の bit6:4 と exg/tfr の immediate のうち source register (tfr では bit6:4, exg では bit6:4 と bit2:0 の両方)の数値の割り振りは同じです。
[indexed RRR register field, exg/tfr source register field] 3'b000:xA 3'b001:xB 3'b010:X 3'b011:Y 3'b100:DP 3'b101:U 3'b110:S 3'b111:PC * 全て 16bit register 扱い [exg/tfr dest register field] 3'b000:A 3'b001:B 3'b010:X 3'b011:Y 3'b100:DP 3'b101:U 3'b110:S 3'b111:PC * A と B は 8bit register 扱い, 他は 16 bit register
xA, xB と 8bit->16bit
リストの中で 0 と 1 の xA と xB は tfr/exg で source 8bit, dest 8bit を想定しているであろう値で、bit15:8 の値が不定です。 xA はの不定値はよくわからないですが、 xB は A が入っていることがあり、調査の初期段階では D と誤認していました。
テスト用のソースを作り、実行しました。
ldd #$1254 inca incb byt $58,$16 ;std ,xB tfr xB,x std ,x
結果は以下のようになっています。
readn> a:ff0c d:40 ;ldd #$1254 readn> a:ff0d d:12 readn> a:ff0e d:54 readn> a:ff0f d:89 ;inca idle_> 1 readn> a:ff10 d:8a ;incb idle_> 1 readn> a:ff11 d:58 ;std ,xB readn> a:ff12 d:16 idle~> 5 write> a:1255 d:13 ;address が xB の値で bit15:8 が ldd 時点の A write> a:1256 d:55 ;しかし write される値は inc された後の A と B readn> a:ff13 d:3f ;tfr xB,x readn> a:ff14 d:a1 idle_> 1 readn> a:ff15 d:58 ;std ,x readn> a:ff16 d:26 idle~> 5 write> a:1255 d:13 ;address が xB->x で そのまえの std と同じ write> a:1256 d:55
これは opcode 0x80 付近を inca; incb; sta ,D (間違い) と一度に確認すると出力が変なため気付きました。 inca や clra は古い A になっていましたが、 coma は内容が反映された A が入っていました。
この様にbit数が小さいレジスタから大きいレジスタに転送したり indexed の 2番目のレジスタとして xA とxB は使用すると動作が不安定になります。
dest の A,B (16bit->8bit)
dest の場合は 16bit register の bit7:0 の値が入り、別のレジスタを破壊することはありませんでした。dest に関しては注意しなくても大丈夫です。