2019-12-27 23:39 — asano
カテゴリー:
前回は「ユーザプログラムからモニタに制御が渡ったときにレジスタ内容をメモリに退避する」でしたので、今回は「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のみのレジスタを区別するために使用しています。
何で素直に文字列の比較をしないかというとポインタとして使えるレジスタが少ない場合に有利かなと思ったためです。長くなると無駄が増えますが、レジスタ名ならそう長いものは無いでしょうから。
このテーブルを元に一覧表示ができないかとも思いましたが、順番に制約ができてしまうこと、一つのレジスタに複数のエントリが存在する(例えばMC6809のA
, B
はD
の一部)こと、など一筋縄ではいきそうにありません。
次回、レジスタをセットしてユーザプログラムに制御を渡すところを取り上げてこの項は終わりにしたいと思います。
コメントを追加