現在地

Z280固有の初期化(その1)


Z280は特別な初期化をしなくても高速なZ80として動作するので何もしていませんでしたが、Z180の初期化を加えたのでZ280でもやってみました。ゆくゆくはトラップの対応などもやってみたいと考えています。

以下はCPU判別でZ280であると判定されたところです。

     225/     18E :                     	;; Z280
     226/     18E :                     ID_280:
     227/     18E : 2E 30               	LD	L,BTCR_V	; Z280 specific initialization
     228/     190 : 0E 02               	LD	C,02H		; BTCR
     229/     192 : ED 6E               	DB	0EDH,6EH	; LDCTL (C),HL
     230/     194 : 2E 40               	LD	L,BTIR_V
     231/     196 : 0E FF               	LD	C,0FFH		; BTIR
     232/     198 : ED 6E               	DB	0EDH,6EH	; LDCTL (C),HL
     233/     19A : 2E 00               	LD	L,CCR_V
     234/     19C : 0E 12               	LD	C,12H		; CCR
     235/     19E : ED 6E               	DB	0EDH,6EH	; LDCTL (C),HL
     236/     1A0 :                     
     237/     1A0 : 2E FF               	LD	L,0FFH
     238/     1A2 : 0E 08               	LD	C,08H		; IOBR
     239/     1A4 : ED 6E               	DB	0EDH,6EH	; LDCTL (C),HL
     240/     1A6 : 3E 38               	LD	A,RRR_V
     241/     1A8 : D3 E8               	OUT	(0E8H),A	; RRR
     242/     1AA : 2E 00               	LD	L,00H
     243/     1AC : 0E 08               	LD	C,08H
     244/     1AE : ED 6E               	DB	0EDH,6EH	; LDCTL (C),HL
     245/     1B0 :                     
     246/     1B0 : 21 42 0A            	LD	HL,IM280
     247/     1B3 : 3E 04               	LD	A,04H

227~229行ではBTCR(Bus Timing and Control Register)に30Hを書き込みます。これは初期値なので省略しても構いませんが念のために書いています。

229行でDB擬似命令を使っているのは使用しているアセンブラがZ280の命令に非対応だからです。

  • I/O Wait Insertion(bit 1,0)=00
    I/Oアクセス時の追加WAIT無し。
  • High Memory Wait Insertion(bit 3,2)=00
    これはMMUを有効にしない限り意味がありません。
  • (bit 5,4)=11
    未使用ビットですが、読むと11になっていました。マニュアルに何を書くべきか見当たらなかったのでそのまま11としています。
  • Daisy Chain Timing(bit 7,6)=00
    割り込み応答サイクルでの追加WAITですが、割り込みは使用していないので追加WAIT無しの00にしています。

初期値が追加WAIT無しになっていることに不安を感じるかもしれませんが、MMUを有効化したりI/Oアクセスをする前にこのレジスタを設定すれば良いだけなので要注意ではありますが特に問題は無いはずです。

続いて230~232行ではBICR(Bus Timing and Initialization Register)を設定します。このレジスタはリセット時にWAITをアサートすればデータバスから任意の値を設定できますが、私のボードでは何もしていないので00Hで初期化されています。

  • Clock Scaling(bit 1,0)=00
    外部バスサイクルを内部の1/2にする指定ですが、このビットはソフトウェアから変更はできません。
  • Low Memory Wait Insertion(bit 3,2)=00
    MMU無効時と有効にした場合はアドレスの最上位ビットが0のときにメモリアクセスに追加されるWAITです。00は追加WAIT無しです。
  • (bit 4)=0
    未使用ビットです。
  • Multiprocessor Configuration Enable(bit 5)=0
    マルチプロセッサは使用しません。
  • Bootstrap Mode(bit 6)=1
    シリアルポートから初期プログラムを送り込んでROM無しで起動させる機能ですが、このビットもソフトウェアから変更はできません。常に1が読み出されるようです。
  • Direct Input Clock Option(bit 7)=0
    クロック回路の設定ですが、これもソフトウェアからの変更はできません。

233~235行ではCCR(Cache Control Register)の設定を行います。

  • (bit 2-0)=000
    未使用ビット。
  • High Memory Burst Capability(bit 3)=0, Low Memory Burst Capability(bit 4)=0
    バースト転送は行ないません。
  • Cache Data Disable(bit 4)=0
    初期値では1でデータキャッシュは無効ですが有効にします。
  • Cache Instruction Disable(bit 5)=0
    命令キャッシュはもともと有効です。
  • Memory/Cache(bit 7)=0
    キャッシュの代わりに256バイトのRAMとしても使用可能です。その切り替えなのですが...、単純にこれを1にしてもだめです。
余談ですが、キャッシュをRAMとして使うのはちょっとトリッキーです。どうもキャッシュのライン入れ替えを停止することでRAMに見せかけているようで、配置アドレスの設定レジスタなどがありません。マニュアルをざっと読んだところ次のように設定するようです。
  1. データキャッシュのみを有効にする
  2. RAMを出現させたいアドレスをリードする
  3. キャッシュからメモリに切り替える

これでキャッシュのタグを目的のアドレスに設定するので、この間は他のアドレスに対してリードを行なってはいけません。割り込みもNGです。命令キャッシュを無効にするのはフェッチでキャッシュが変更されてしまうからですね。

237~244行ではRRR(Refresh Rate Register)の設定なのですが、実はこれが曲者でした。

このレジスタは次のような構成になっています。

  • Refresh Rate(bit 5-0)
    この値×4クロックごとにリフレッシュサイクルが挿入されます。0の場合は256クロックごとになります。
  • (bit 6)
    未使用
  • Refresh Enable(bit 7)
    これが1のときリフレッシュが有効になります。

SRAM使用なのでリフレッシュは不要ということで00Hにしたところ、立ち上がらなくなってしまったのです。いろいろな値を試してみたところ、00H, 01H, 81Hが駄目なようです。

このとき何が起きているのだろうとRFRSH, RDを見てみたところ、リフレッシュサイクルが連続実行されていました。リフレッシュの頻度が高すぎてメモリアクセスができなくなってしまったようです。

これで81HがNGな理由はわかりました。

では00H, 01HはなぜNGなのでしょう? リフレッシュはとめているはずなのに。

これまで主に"Product Specification"を読んでいたのですが"Preliminary Technical Manual"の方にも目を通してみると、Refresh Enable = 0としてもバスのアクセスが一定期間無い状態が続くとリフレッシュサイクル挿入されるようです。リフレッシュ不要でもRefresh Rateは適切な値を設定しておかないといけないようですね。

あまりギリギリにするとWAIT挿入などの条件によってはNGの可能性も。

というわけで3FHの境界付近を避けて大きめな値ということで38Hを設定しています。キャッシュに収まるサイズで外部アクセスをまったくせずにループするとかしない限りはリフレッシュは発生しないでしょう。発生しても3クロック無駄になるだけです。

参考文献・関連図書: 
"Z280 MPU Microprocessor Unit Product Specification", Zilog.
"Z280 MPU Microprocessor Unit Preliminary Technical Manual", Zilog.
川村雅則(1988)「Z280の特徴と機能」『プロセッサ』1988年2月号,技術評論社.

コメントを追加

Plain text

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