現在地

CPU判別法(80編)


68編に引き続き80編をお送りします。

8080系

8080系とZ80系の区別は『I/O』誌の記事を参考にしました。i8080/μPD8080AF, μPD8080A, i8085の判別法は一般的なものがあれば利用するつもりでしたが、見当たらなかったのでデータシートを元に独自に書いたものです。


      87/     121 :                     	MVI	A,7FH
      88/     121 :                     	INR	A
      89/     121 :                     	JPE	ID_Z80		; Z80, HD64180, Z280
      90/     121 :                     	PUSH	PSW
      91/     121 :                     	POP	BC
      92/     121 :                     	MOV	A,C
      93/     121 :                     	ANI	08H
      94/     121 :                     	JNZ	ID_NEC		; NEC uPD8080A
      95/     121 :                     	LXI	HL,0FFFFH
      96/     121 :                     	INX	HL
      97/     121 :                     	PUSH	PSW
      98/     121 :                     	POP	BC
      99/     121 :                     	MOV	A,C
     100/     121 :                     	ANI	20H
     101/     121 :                     	JNZ	ID_85		; i8085

8080系は1つの命令で区別はできないので順番に分けていきます。

まず8080→Z80でフラグレジスタFのビット2がパリティからパリティ/オーバフローに意味が変わったのを利用しています。8080ではINR Aの結果Aは80Hになり奇数パリティなのでFのビット2は0になります。一方Z80ではこのINC A命令ではオーバフローとして動作するので、7FH→80Hの結果Fのビット2は1になります。
これはデータシートに明記された動作です。
Z80と判別されたものの細分については後述のZ80系の項を参照ください。

次にFのビット3がi8080,i8085,μPD8080AFでは常に0でμPD8080Aでは常に1なのを利用します。Fのこのビットをそのまま読めないので90~92行でAに転送して判断します。
これもデータシートの図で0あるいは1と明記されたものがありますので公認の動作であると思います。

最後にi8080,μPD8080AFとi8085の区別ですが、これは残念ながら未定義の動作を使わざるを得ないようです。
8085ではINX命令で0FFFFH→0000Hの変化(DCX命令で0000H→0FFFFHも同じ)を生じたときにFのビット5が立つことを利用します。上と同様97~99行目でAに転送して判別していますが、直接このビットを判定分岐する未定義命令もあるのでそれを使ってもよいかもしれません。

すぐに8085を試せる環境が無いので8085については未確認です。

Z80系

Z80, HD64180, Z280については『プロセッサ』誌のコラムの方法を利用しています。


      92/     124 : 01 FF 00            	LD	BC,00FFH
      93/     127 : ED 4C               	DB	0EDH,4CH	; MLT BC (HD64180)
      94/     129 : 78                  	LD	A,B
      95/     12A : B1                  	OR	C
      96/     12B : 28 0D               	JR	Z,ID_180
      97/     12D : 3E 40               	LD	A,40H
      98/     12F : CB 37               	DB	0CBH,37H	; TEST A (Z280)
      99/     131 : F2 41 01            	JP	P,ID_280

まずHD64180の判別には0EDH,4CHを使います。

  • Z80では未定義命令(詳細不明ですが害は無いそうです)
    BCは変化しません。
  • HD64180ではMLT BC(B×C &rarr BC)命令
    0×255の結果、BCが0になります。
  • Z280ではNEG HL(-HL → HL)命令
    BCは変化しません。

BCが0になっていることでHD64180とわかります。

同時にHLを利用してZ280判定もできそうに思えますが...
HD64180についてもまだ試せていません。試せないなら知られた方法が安心です。

つづいて0CBH,37Hを使ってZ280を判別します。

  • Z80ではSLL A(Shift Left Logical)命令 (未定義命令)
    よく知られた未定義命令で、40Hを論理左シフト(動作は算術左シフトと同一)して80Hとなります。最上位ビットが1になるのでSフラグが1になります。
  • Z280ではTEST A命令
    Aの最上位ビットがSフラグにコピーされるので0になります。

このSフラグの違いを利用してZ280を判別します。

さらに...

6502はCMOSになって命令が増えたり、65C816なんてのもあったり面白そうです。

Z8 → Super8も命令増えています。

ただCPU判別は未定義動作を利用せざるを得ないことが多く、試せる環境が無いと難しいですね。仮に試せても、マスク変更で挙動が変わっていないか、セカンドソースでも同じ動作なのか、上位互換プロセッサではどうか、といつ動かない例が出てくるか心配し続けなくてはなりません。

ここに挙げたものも私のところで動いた(一部未確認もあり)だけですので、その点はご注意ください。

参考文献・関連図書: 
カワムラマサノリ(1987)「8080/Z80/64180テスト・ルーチン」,『I/O』1987年7月号, p.269, 工学社.
8080A/8080A-1/8080A-2 8-bit N-Channel Microprocessor データシート, Intel.
uPD8080Aデータシート, NEC.
Catalog 1977, NEC Micro Computers.
uPD8085A/AHデータシート, NEC.
Z8400/Z84C00データシート, Zilog.
Wolfgang Dehnhardt, Villy M. Sorensen, "Unspecified 8085 op codes enhance programming"
川村雅則(1988)「Z280の特徴と機能」,『プロセッサ』1988年2月号, pp.2-28, 技術評論社.
HD64180R/Zデータシート, Hitachi.
Z280 MPU Technical Manual, Zilog.

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。