現在地

[UniMon] レジスタ命令の内側(その2)


カテゴリー:

前回は「ユーザプログラムからモニタに制御が渡ったときにレジスタ内容をメモリに退避する」でしたので、今回は「2. メモリに退避されている値を表示・変更する」についてです。

レジスタ内容をメモリに退避するのはプロセッサ固有の書き方が必要でしたが、すでにメモリ上にある値を表示・変更するだけであれば特殊なプログラミングは必要ありません。とはいえレジスタの名称や個数はプロセッサ毎に異なりますからそれなりの工夫は要ります。

まず全レジスタの一覧表示は簡単です。ループとテーブルで書いてもいいのですが、レジスタ数が少ないうちは「レジスタ名を表示・メモリから値をロード・16進表示」を必要数分並べてしまっても大したことはありません。

レジスタの変更はそうはいきませんので、以下のようなテーブルを用意しました。

    1113/    E800 :                     RNTAB:
    1114/    E800 : 41 01               	FCB	'A',1		; "A"
    1115/    E802 : 7F 30 E8 84         	FDB	REGA,RNA
    1116/    E806 : 42 01               	FCB	'B',1		; "B"
    1117/    E808 : 7F 31 E8 86         	FDB	REGB,RNB
    1118/    E80C : 43 0F               	FCB	'C',$0F		; "C?"
    1119/    E80E : E8 54 00 00         	FDB	RNTABC,0
    1120/    E812 : 44 0F               	FCB	'D',$0F		; "D?"
    1121/    E814 : E8 66 00 00         	FDB	RNTABD,0
    1122/    E818 : 45 81               	FCB	'E',$81		; "E"
    1123/    E81A : 7F 32 E8 8A         	FDB	REGE,RNE
    1124/    E81E : 46 81               	FCB	'F',$81		; "F"
    1125/    E820 : 7F 33 E8 8C         	FDB	REGF,RNF
    1126/    E824 : 57 82               	FCB	'W',$82		; "W"
    1127/    E826 : 7F 32 E8 8E         	FDB	REGE,RNW
    1128/    E82A : 58 02               	FCB	'X',2		; "X"
    1129/    E82C : 7F 34 E8 90         	FDB	REGX,RNX
    1130/    E830 : 59 02               	FCB	'Y',2		; "Y"
    1131/    E832 : 7F 36 E8 92         	FDB	REGY,RNY
    1132/    E836 : 55 02               	FCB	'U',2		; "U"
    1133/    E838 : 7F 38 E8 94         	FDB	REGU,RNU
    1134/    E83C : 53 02               	FCB	'S',2		; "S"
    1135/    E83E : 7F 3A E8 96         	FDB	REGS,RNS
    1136/    E842 : 50 0F               	FCB	'P',$0F		; "P?"
    1137/    E844 : E8 78 00 00         	FDB	RNTABP,0	
    1138/    E848 : 56 82               	FCB	'V',$82		; "V"
    1139/    E84A : 7F 3E E8 9B         	FDB	REGV,RNV
    1140/    E84E :                     	
    1141/    E84E : 00 00               	FCB	$00,0		; End mark
    1142/    E850 : 00 00 00 00         	FDB	0,0
    1143/    E854 :                     
    1144/    E854 :                     RNTABC:
    1145/    E854 : 00 01               	FCB	$00,1		; "C"
    1146/    E856 : 7F 41 E8 A0         	FDB	REGCC,RNCC
    1147/    E85A : 43 01               	FCB	'C',1		; "CC"
    1148/    E85C : 7F 41 E8 A0         	FDB	REGCC,RNCC
    1149/    E860 :                     
    1150/    E860 : 00 00               	FCB	$00,0		; End mark
    1151/    E862 : 00 00 00 00         	FDB	0,0
    1152/    E866 :                     
    1153/    E866 :                     RNTABD:
    1154/    E866 : 00 02               	FCB	$00,2		; "D"
    1155/    E868 : 7F 30 E8 88         	FDB	REGA,RND
    1156/    E86C : 50 01               	FCB	'P',1		; "DP"
    1157/    E86E : 7F 40 E8 9D         	FDB	REGDP,RNDP
    1158/    E872 :                     
    1159/    E872 : 00 00               	FCB	$00,0		; End mark
    1160/    E874 : 00 00 00 00         	FDB	0,0
    1161/    E878 :                     
    1162/    E878 :                     RNTABP:
    1163/    E878 : 43 02               	FCB	'C',2		; "PC"
    1164/    E87A : 7F 3C E8 98         	FDB	REGPC,RNPC
    1165/    E87E :                     
    1166/    E87E : 00 00               	FCB	$00,0		; End mark
    1167/    E880 : 00 00 00 00         	FDB	0,0

これは最新のMC6809用のものです。

一つのエントリは次のようになっています。

No. 長さ 内容
1 1 レジスタ名(1文字) 探索時のキー
2 1 ビット7-4:フラグ
ビット3:継続
ビット2-0:レジスタ長
3 2 レジスタ内容の保存アドレス(非継続)
続きのテーブルアドレス(継続)
4 2 レジスタ名称のアドレス(継続時は未使用)

例えばR PCと入力してPCを変更する場合を見ていきます。

まずRNTABからNo.1の項が「P」であるものを探します。すると「継続」であることがわかるので、次はRNTABPから2文字目の「C」を探します。今度は継続ではないので保存アドレスと名称アドレスがわかります。

あとは名称と現在の値を表示し、入力をもとに値を変更するだけです。

フラグはHD6309のみのレジスタを区別するために使用しています。

何で素直に文字列の比較をしないかというとポインタとして使えるレジスタが少ない場合に有利かなと思ったためです。長くなると無駄が増えますが、レジスタ名ならそう長いものは無いでしょうから。

最初のMC6800用では継続は無くすべて1文字でした。次の6502用で「継続」を導入し、MC6809用でフラグを加えました。今後MC68HC11や65C816対応などの折に統一したいと考えています。

このテーブルを元に一覧表示ができないかとも思いましたが、順番に制約ができてしまうこと、一つのレジスタに複数のエントリが存在する(例えばMC6809のA, BDの一部)こと、など一筋縄ではいきそうにありません。

次回、レジスタをセットしてユーザプログラムに制御を渡すところを取り上げてこの項は終わりにしたいと思います。


コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。