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