052001 indexed register, exg/tfr source register

(古い記事の書き直しで、古い記事は削除しました。)

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 に関しては注意しなくても大丈夫です。