2021-03-15 02:56 — asano
カテゴリー:
今回は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)で移動可能なのでこちらを移動することにします。
以上の変更で一応動作するようにはなりますが、さらにいくつかのレジスタを設定することでパフォーマンスが上がりますので設定しておきます。
- DMA/WAIT Control Register(DCNTL, 32H)
リセット時にはメモリアクセスに3 wait、I/Oアクセスに4 waitが自動的に挿入されています。このレジスタ設定まで正常に動作しなくてはならないことから余裕をみて最大値になっているわけですが、SBCZ80はウェイト無しで6MHz動作可能なので両方とも0 waitに変更します。 - Refresh Control Register(RCR, 36H)
DRAMのリフレッシュ周期も同様に余裕をみた設定になっています。6MHz動作なら周期を最長にしてもDRAMの条件を満たしますのでこれも変更しておきます。もしDRAMを使用していないシステムならリフレッシュを行なわない設定も可能です。 - Operation Mode Control Register(OMCR, 3EH)
これはZ80ファミリの周辺デバイスを使うための設定ですが、割り込みを使用しない限りそのままでも問題無さそうです。Universal Monitorは割り込みを使用しないので何もしなくても良いのですが、別な理由で設定することにしました。それはこのレジスタHD64180Z/Z180には存在しますが、HD64180Rには存在せず常に0FFHが読み出されるということです。そう、64180Rと64180Zの判別ができるのです。
これらのレジスタ設定はHD64180系であることが確認された場合にのみ行なうべきで、CPU判別ルーチン内で行なうのが良いでしょう。この設定が済むまではコンソール用のZ80 SIOの初期化を行なうことはできません。
ところがこれまでCPU判別は以下の理由で起動メッセージ表示後に行なっていました。
- 判別処理は未定義命令を使用するなど(特に互換CPUなどで)ハングアップのリスクがあり「起動メッセージのみ表示してハングアップしたら判別処理を疑え」というのはわかりやすい
- 判別と表示を同時に行なった方がプログラム上都合が良い
今回そうも言っていられないので判別タイミングを前に移動しました。
CPU判別法(80編)の要領でHD64180系と判別された後の部分を抜き出すと以下のようになります。
157/ 14D : ;; HD64180
158/ 14D : SAVE ; HD64180 specific initialization
159/ 14D : CPU Z180
160/ 14D : ID_180:
161/ 14D : 3E C0 LD A,IOBASE
162/ 14F : ED 39 3F OUT0 (3FH),A
163/ 152 : 3E 00 LD A,DCNTL_V
164/ 154 : ED 39 F2 OUT0 (IOBASE+32H),A
165/ 157 : 3E 83 LD A,RMR_V
166/ 159 : ED 39 F6 OUT0 (IOBASE+36H),A
167/ 15C : 3E 7F LD A,7FH ; Try to change OMCR bit 7 to 0
168/ 15E : ED 39 FE OUT0 (IOBASE+3EH),A
169/ 161 : ED 38 FE IN0 A,(IOBASE+3EH)
170/ 164 : E6 80 AND 80H
171/ 166 : 28 07 JR Z,ID_180Z ; HD64180 detected
172/ 168 : 21 9B 09 LD HL,IM180
173/ 16B : 3E 01 LD A,01H
174/ 16D : 18 11 JR IDE
175/ 16F : ;; HD64180Z
176/ 16F : ID_180Z:
177/ 16F : 3E 40 LD A,OMCR_V
178/ 171 : ED 39 FE OUT0 (IOBASE+3EH),A
179/ 174 : 21 A6 09 LD HL,IM180Z
180/ 177 : 3E 02 LD A,02H
181/ 179 : 18 05 JR IDE
182/ 17B :
183/ 17B : ALL RESTORE
161,162行ではまず内蔵レジスタのアドレスをIOBASE
からに変更します。IOBASE
には00H,40H,80H,0C0Hが設定可能で、デフォルトでは0C0Hにしています。
OUT0
というのは見慣れぬ命令ですが、アドレスの上位8ビットが00HになるというHD64180で追加された命令です。内蔵レジスタはアドレスが16ビットフルデコードされるのでOUT (3FH),A
などと書くと正常にアクセスできません。IN0
も同様です。
163~166行では同様にDCNTL, RMRを設定します。この時すでにI/Oアドレスは移動しているのでベースアドレスを加算しています。
167,168行ではOMRに7FHを書き込みビット7を0にしようとします。
169~171行ではOMRを読んでビット7をチェックします。HD64180Rではビット7は常に1になり、HD64180/Z180では直前に書き込んだ0となります。1ならHD64180Rが確定して終了です。
0だった場合はHD64180Z/Z180確定で、177,178行で本来の値を設定して終了となります。
現在はここまでですが、Z80180の改良版でZ8S180というものもあり内蔵レジスタがさらに増えているとのことなのでそれの判別も追加したいと考えています。これは現物を持っていないので注文して到着を待っているところだったりします。
コメントを追加