現在地
プログラミング
CPU判別法(6502編)
[UniMon] レジスタ命令の内側(その3)
カテゴリー:
最後となる今回は「3. メモリに退避されている内容をレジスタに戻しユーザプログラムに制御を渡す」です。
コマンドで値を変更したらその状態でユーザプログラムを実行できなくては意味がありません。
要はレジスタに値を設定して目的の番地にブランチすれば良いだけなのですが、すでに設定済みのレジスタを壊さないようにしなくてはいけないので進むにつれ制約が増えていきます。
比較的多くのプロセッサで使える手は、「スタックに積んでおいてPOP
,...,POP
,RET
」です。ちょうど1回目の逆です。
スタックを使った割り込みに対応しているプロセッサなら大抵これが使えます。
MC6800を例に見てみましょう。
[UniMon] レジスタ命令の内側(その2)
カテゴリー:
前回は「ユーザプログラムからモニタに制御が渡ったときにレジスタ内容をメモリに退避する」でしたので、今回は「2. メモリに退避されている値を表示・変更する」についてです。
レジスタ内容をメモリに退避するのはプロセッサ固有の書き方が必要でしたが、すでにメモリ上にある値を表示・変更するだけであれば特殊なプログラミングは必要ありません。とはいえレジスタの名称や個数はプロセッサ毎に異なりますからそれなりの工夫は要ります。
まず全レジスタの一覧表示は簡単です。ループとテーブルで書いてもいいのですが、レジスタ数が少ないうちは「レジスタ名を表示・メモリから値をロード・16進表示」を必要数分並べてしまっても大したことはありません。
レジスタの変更はそうはいきませんので、以下のようなテーブルを用意しました。
[UniMon] レジスタ命令の内側(その1)
EMILY BoardのEEPROM対応
カテゴリー:
TLCS-90ボード, SC/MPボードにはEEPROM用のソケットを用意したと書きましたが、使えるようになりました。
また未搭載だった6502ボードにも追加しました。
このEEPROMはEMILY BoardのAVRマイコンに接続されていて、設定情報とターゲット用ソフトウェアを保存できます。これで毎回ソフトウェアをPCから転送しなくてすみます。
MB8861 と MB8870
カテゴリー:
予告どおり富士通のMB8861, MB8870です。
MB8861はMotorola MC6800の相当品ですが、いくつか独自の命令が追加されています。これは1979年製のようですね。
パッケージは中央に大きな円と下側に溝のある富士通独特の特徴あるスタイルです。今回は国内調達したのであまり心配はないのですが、海外からだとこのパッケージは(ニセモノの可能性が低いということで)安心材料の一つといえそうです。
さて、追加された命令の詳細を知りたいところなのですが、富士通のデバイスはデータシートの入手が難しいことが多く、このMB8861も入手できていません。ハード的にはMC6800と差し替え可能ということで、「リンク」に挙げたサイトの情報と実験をもとに動かしていきます。
CPU判別法(80編)
CPU判別法(68編)
現在のCPUではその種類や対応する命令の範囲などを取得する命令(例えばx86系のCPUID命令)がありますが、以前は微妙な挙動の違いなどから判別していました。
自作のUniversal Monitorのソースコードを例に解説してみます。
MC6800系
まずは昨日目処が立ったと書いたMC6800系からです。
該当部分のソースは次のようになっています。
[UniMon] レジスタ命令追加
カテゴリー:
8080, Z80, 6809に続いて6800用でもCPU判別を追加しようと思っているのですが情報があまりありません。
わかった範囲ではMC6800 ⇒ MC6801/MC6803 ⇒ HD6301/HD6303と改良されるにしたがって命令は追加されていますが、既存命令の挙動は変化が無いようです。これは互換性という点では非常にありがたいのですが、判別という点では困ったことです。
追加された命令の存在が確認できれば良いのですが、そのオペコードは旧プロセッサでは未定義なので何が起こるかわかりません。データシートにも記載は無いので試してみるしかないのです。
レジスタを設定し、問題の命令を実行し、レジスタがどう変化したかを地道に見ていく必要があります。
そこでレジスタを任意に設定して実行する機能、レジスタの内容を表示する機能を追加することにしました。これはデバッグにも有効です。