2021-05-01 23:04 — asano
カテゴリー:
Z8S180 SL1960の最後で判別する方法を探すと書きましたが、とても簡単でした。
1992年の"Volume I Databook"にはZ80180とZ8S180の違いの記載があり、まだ新版が出るはるか前なので、Z80180(HD64180Z)とZ8S180 SL1960の相違点がわかります。
一方テクニカルノートTN005301-0506にはSL1960と新Z8S180の相違点が載っています。
この2つを参考にSL1960の判定を追加してみました。以下のコードはOMCRによってZ80180以降と判定されたところからです。
207/ 1A2 : ;; HD64180Z
208/ 1A2 : ID_180Z:
209/ 1A2 : 3E 40 LD A,OMCR_V
210/ 1A4 : ED 39 FE OUT0 (IOBASE+3EH),A
211/ 1A7 : AF XOR A
212/ 1A8 : ED 39 D2 OUT0 (IOBASE+12H),A
213/ 1AB : ED 38 D2 IN0 A,(IOBASE+12H)
214/ 1AE : E6 40 AND 40H
215/ 1B0 : 28 1D JR Z,ID_Z8S ; Z8S180 (SL1919) detected
216/ 1B2 :
217/ 1B2 : AF XOR A
218/ 1B3 : ED 39 DF OUT0 (IOBASE+1FH),A
219/ 1B6 : ED 38 DF IN0 A,(IOBASE+1FH)
220/ 1B9 : B7 OR A
221/ 1BA : 28 07 JR Z,ID_1960 ; Z8S180 (SL1960) detected
222/ 1BC :
223/ 1BC : 21 90 0A LD HL,IM180Z
224/ 1BF : 3E 02 LD A,02H
225/ 1C1 : 18 3F JR IDE
211,212行では念のためASCI Extension Control Register(ASEXT0)を初期状態に戻しておきます。
ASEXT0は新版Z8S180から追加されたレジスタで、Z80180とSL1960では常に0FFHが読み出されます。新版Z8S180ではビット6~2は書き込んだ値がそのまま読み出されるので、213~215行でビット6をチェックして0なら新版Z8S180と判定します。ここまではこれまでと一緒です。
217,218行ではCPU Control Register(CCR)を初期値00Hに戻しておきます。
CCRはZ80180にはありませんが、旧版Z8S180(=SL1960)で追加されたレジスタです。これはZ80180では常に0FFHが読み出され、Z8S180では書き込んだ値が読み出されます。219~221行では00Hが読み出されたらZ8S180 SL1960と判定します。
CCRは新版でも00Hになるので、ASEXT0とCCRの順番は重要です。
どちらの条件にも当てはまらなければ(223行以下)Z80180です。
ちなみにASEXT0もCCRも未対応プロセッサで読んだ場合に0FFHが読み出されるというのは手持ちの実物で確認したのみで、マニュアルなどでは明確に規定されている箇所は見つけられませんでした。0の確認だけでなく1にできることをチェックしたほうがより確実だと思いますが、ASEXT0はともかくCCRのビットには1にすること自体にリスクがあります。
CCRのビット7はクロックの分周で、1にするとクロックが倍になりますが、私の環境ではこれを1にするとハングアップしてしまいます。
ビット6,5,3はSLP
命令実行しなければ害はなさそうです。
ビット4,2,1,0は1にすると外部ピンのドライブを下げるのでハードウェア構成によっては正常な動作をしなくなるかもしれません。
誤判定の実例が見つかれば別ですが、当面は初期値の00Hを書いておくのが無難かなと考えています。
コメントを追加