You are here

プログラミング

MC68000でブレーク

カテゴリー:

長らくお待たせしました、MC68000でのブレーク処理です。

MC68000でブレークに使いやすい命令は何かを考えてみます。命令を置き換えて埋め込むので1ワード長のもの、ユーザモードで実行中でもスーパバイザモードに戻ってくるためには例外を発生させるものが良さそうです。もちろん無条件で実行される必要があります。

これらの条件を満たすものとして以下が考えられます。

  1. TRAP命令
  2. 特権命令
  3. 未実装命令(Line-1010, Line-1111)
  4. 不当命令

TRAP命令はAPI的に使われることが多いのでできれば残しておきたいところです。

スーパバイザモードでブレークしたくなることも考えると特権命令も避けたいですね。

未実装命令もMC68020+MC68881などでは使われます。X68000がIOCSコールに未実装命令を使用していたのですが、X68030開発時にコプロセッサ命令との衝突がありIOCSコールの番号を変更せざるを得なかったという事例があります。

Z180の不正命令TRAPを捕まえよう

Z8S180の前にやってみたいことがあります。

Z180には未定義な命令を実行しようとした時に発生するTRAP割り込みというものがあります。これを捕まえてRST 38Hによるブレークのようにアドレスやレジスタが表示できれば便利でしょう。

ということで調べ始めたのですが、思った以上にハードルが高く簡単ではありませんでした。

まず未定義な命令を実行しようとした時に何が起こるかです。

  1. ITC(Interrupt TRAP Control)レジスタのTRAPビットが1になる
  2. PCの値がスタックに積まれる
  3. 論理アドレス0000Hにジャンプする

えっ、0000Hってリセットと同じではないですか。MMUで論理アドレス0000Hに異なる物理アドレスを設定していれば問題ありませんが、ROM, RAMともに16kBしかないSBCZ80でこのためだけにMMUを有効にするのはかなり面倒です。

Z180の判別と初期化

カテゴリー:

今回はZ80180-Z80 ADAPTER for SBCZ80のソフトウェア編です。

SBCZ80にZ80180-Z80 ADAPTER for SBCZ80を載せてもそのままでは正常に動作しません。

Z180ではZ80から追加された機能をコントロールするための内蔵レジスタがI/O空間の00H~3FHに配置されていますが、SBCZ80ではZ80 SIOがI/O空間の00H~03Hに配置されており、アドレスが重なってしまっているからです。SBCZ80を改造してZ80 SIOのアドレスを変更する手もありますが、Z180の内蔵レジスタはI/O Control Register(ICR, 3FH)で移動可能なのでこちらを移動することにします。

以上の変更で一応動作するようにはなりますが、さらにいくつかのレジスタを設定することでパフォーマンスが上がりますので設定しておきます。

MC68010の判別(補足)

今回はブレーク処理についての予定でしたが、MC68010の判別で書き足らなかったことがいくつかありますのでそちらを書くことにします。

MC68008の判別

MC68008の判別もできないか考えたのですが...

  1. ソフトウェア的にはMC68000からの命令等の追加・変更はありません
  2. 最初MC68008は8ビットバスなので奇数番地からのワードアクセスで判別できるのではないかと思ったのですが、データシートによると奇数アドレスからのワード・ロングワードアクセスはアドレスエラー例外を発生するとあるのでこれで判別はできません。
  3. プリフェッチキューあたりに相違があるかもしれませんがデータシートからはよくわかりませんでした。実機が試せるようになったら見てみたいところではあります。

MC68010の判別は例外処理に必要なのに対し、MC68008の判別はどうしても必要というわけではありません。3.を試すにしても優先度はかなり低いですね。

MC68010の判別

SH7045ボードへのUniversal Monitorの移植に着手したのですが、その前にMC68000系で動くようになっていますのでそのあたりの話を何回かに分けて書こうと思います。

MC68000自体は30年ほど前にいじっていて(だから未経験のプロセッサを優先して後回しになっていました)サクサク書いていたのですが、これまで書いたことがなかったのがプロセッサの識別です。

当時からMC68010は載せていましたがモニタは専用にアセンブルしていました。

N BASIC上で動く簡易クロスアセンブラを使用していたので条件アセンブルなどはできずソースを別個に管理していたように記憶しています。

ですからMPUを載せかえる時はROMも一緒に交換です。

今回は基本部分がすんなり動作したので識別ルーチンに挑戦することにします。

識別の原理はもちろんプロセッサによる挙動の違いを検出するわけですが、これにはいくつかのパターンがあります。

Z8000 CALR命令

カテゴリー:

前回予告したように今回はCALR命令について書いてみようと思います。

CALR命令は相対サブルーチンコール命令で、JPに対してJRがあるようにCALLに対してあるのがこれです。同様に相対番地でメモリアクセスするLDR命令や、アドレスを取得するLDAR命令もあります。

Z80の位置独立なコードを書けない(著しく困難)問題に対処しています。

SBCZ8002(ソフトウェア編)

カテゴリー:

前回ハードウェアが無事に動作するようになったのでUniversal Monitorの移植してみました。

年末から初期化部分などを細々と書いていましたが、本格的に書き始めたのは年が明けてボードが動き始めてからです。それでも3日にはI(n)/O(ut), R(egister)コマンドまで動作しましたからこれまでの最速記録ですね。確かに慣れてきたという側面はありますが、Z8000がアセンブリ言語で書きやすいプロセッサだというのは間違いないでしょう。

今回はその過程で気になった点についていくつか書いてみたいと思います。

リセットの怪

シャープのマニュアルによるとZ8002のリセット時の動作について以下のように書かれています。

Z8002では,最初のサイクルで,0002H番地からFCWを読み出し,0004HH番地からPCを読み出し,つぎの最初の命令フェッチ・サイクルからプログラムがスタートする。

F8へUniversal Monitorを移植(その2)

カテゴリー:

前回サブルーチン呼び出しの方法で終わってしまったので、今回は実際にUniversal Monitorでどうしたか書いていきたいと思います。

前回書いたようにサブルーチン呼び出しが2段を超えると一気に大変になります。

それではUniversal Monitorで呼び出しが深い箇所をどう対処したか、いくつかの例を見てみます。

F8へUniversal Monitorを移植(その1)

カテゴリー:

SBCF8が動きましたので早速Universal Monitorを移植してみます。

以前のSC/MPも癖が強かったですが、このF8もそれに劣らず癖の強いプロセッサです。

  1. コードフェッチ以外のメモリアクセスはすべてDC0レジスタ間接でなくてはならず、常にポストインクリメントされます。もう一つあるDC1(アクセスには使えない)との間で値の交換が出来るのがせめてもの救いです。
  2. サブルーチン呼び出しはスタックではなく戻り番地はスタックレジスタPC1に退避されます。

Pages