現在地

SBCZ8002(ソフトウェア編)


カテゴリー:

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

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

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

リセットの怪

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

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

一方、割り込みやトラップの際には、PSAP+4n(nは割り込みやトラップの種類によって決まる整数)番地からFCWを、PSAP+4n+2番地からPCを読み出します。

ちょうど n=0 は「予約」になっているので、0000H番地からFCWを0002HH番地からPCをだと整合するし、PSAP=0000Hとすればきれいに収まるのでマニュアルの間違いではないかと疑ったのですが...

マニュアルはあっていました。

PSAP=0000Hとするとリセット時のPCと拡張命令トラップのFCWが重なってしまうのでうまくありません。

PSAPは256バイト境界にしか設定できないので0100Hとしていて、0006H~00FFHまでが無駄になっています。

まぁ、リセットはROMに割り込みやトラップはRAMにとするのならそれほど困らないわけですが。PSAPを変更できる点でハード的な小細工を要したMC68000, MC68008よりありがたいとも言えます。

ワードアクセスのアライメント

移植途中でちょっと文字列を変更しただけなのに突然動作しなくなったことがありまして、調べてみたらワードデータが奇数番地に配置されてしまっていました。

こういう時、8086系はアクセスが2度に分かれて遅くはなりますが正しくアクセスできます。MC68000系ではアドレスエラー例外が発生(ダイナミックバスサイジングのあるMC68020などでは8086同様遅くはなりますがアクセス可能)します。

ではZ8000はどうなるのでしょう?

8000H~800FHには00H,11H,22H,...,0FFHというデータが書かれています。

8100H番地からは以下のようなテストプログラムを書いておきます。

8100 : 5400 8007       LDL     RR0,8007H
8104 : 7FFF            SC      #255

奇数番地(8007H)からロングワードを読んでRR0に入れます。2行目はUniversal Monitorのブレークです。

期待する結果は R0=7788H, R1=99AAH ですが、実際は R0=6677H, R1=8899H となりました。どうも8006Hから読んだような値です。

トラップも発生せず、意図したアクセスもされないというかなり嫌な結果です。

Zilog社の見解はどうでしょう?

ちょっとわかりにくいところに書かれていました。"Z8000 Data Manual"の 1.6.4 Interrupts and Traps の最後のところに次のようにあります。

(Segmentation traps occur only with the segmented Z8000.) All other operation exceptions, such as specifying an odd address for a word data value, are considered programmer errors and the results are undefined.

結果は「未定義」ということです。

ハード的にどうなっているのかも見てみたのでそのうち気が向いたら書くかもしれません。

相対分岐のディスプレースメント

上とも関連しますがZ8000の命令はワード単位なので必ず偶数番地におかなくてはなりません。当然のことながら相対分岐のディスプレースメントも偶数になります。LSBは"0"に決まっているのでこれを省略して1ビット稼いで飛べる範囲を拡大しています。

さらにDJNZ命令(Decrement and Jump if Not Zero)はループ命令なので先へ分岐することは無いだろうと戻る方向専用にしてより遠くへ戻れるようになっています。

確か日立のSuperHもこういうビットの節約やっていたような...

相対分岐にはもう一つCALR命令の件があるのですが、それはまた次回ということで。

参考文献・関連図書: 
『Z8000ユーザーズ・マニュアル 1 CPU/MMU編』, シャープ.
"Z8000 Data Manual First Edition", Zilog.

コメントを追加

Plain text

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