現在地

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)で移動可能なのでこちらを移動することにします。

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

  1. DMA/WAIT Control Register(DCNTL, 32H)
    リセット時にはメモリアクセスに3 wait、I/Oアクセスに4 waitが自動的に挿入されています。このレジスタ設定まで正常に動作しなくてはならないことから余裕をみて最大値になっているわけですが、SBCZ80はウェイト無しで6MHz動作可能なので両方とも0 waitに変更します。
  2. Refresh Control Register(RCR, 36H)
    DRAMのリフレッシュ周期も同様に余裕をみた設定になっています。6MHz動作なら周期を最長にしてもDRAMの条件を満たしますのでこれも変更しておきます。もしDRAMを使用していないシステムならリフレッシュを行なわない設定も可能です。
  3. Operation Mode Control Register(OMCR, 3EH)
    これはZ80ファミリの周辺デバイスを使うための設定ですが、割り込みを使用しない限りそのままでも問題無さそうです。Universal Monitorは割り込みを使用しないので何もしなくても良いのですが、別な理由で設定することにしました。それはこのレジスタHD64180Z/Z180には存在しますが、HD64180Rには存在せず常に0FFHが読み出されるということです。そう、64180Rと64180Zの判別ができるのです。

これらのレジスタ設定はHD64180系であることが確認された場合にのみ行なうべきで、CPU判別ルーチン内で行なうのが良いでしょう。この設定が済むまではコンソール用のZ80 SIOの初期化を行なうことはできません。

ところがこれまでCPU判別は以下の理由で起動メッセージ表示後に行なっていました。

  1. 判別処理は未定義命令を使用するなど(特に互換CPUなどで)ハングアップのリスクがあり「起動メッセージのみ表示してハングアップしたら判別処理を疑え」というのはわかりやすい
  2. 判別と表示を同時に行なった方がプログラム上都合が良い

今回そうも言っていられないので判別タイミングを前に移動しました。

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というものもあり内蔵レジスタがさらに増えているとのことなのでそれの判別も追加したいと考えています。これは現物を持っていないので注文して到着を待っているところだったりします。

参考文献・関連図書: 
"HD64180 8-BIT HIGH INTEGRATION CMOS MICROPROCESSOR DATA BOOK", Hitachi.
"Z8018x Family MPU User Manual", UM005003-0703, Zilog.

コメントを追加

Plain text

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