2021-03-30 23:51 — asano
カテゴリー:
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を出現させたいアドレスをリードする
- キャッシュからメモリに切り替える
これでキャッシュのタグを目的のアドレスに設定するので、この間は他のアドレスに対してリードを行なってはいけません。割り込みも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クロック無駄になるだけです。
コメントを追加