2019-07-10 12:55 — asano
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に転送して判別していますが、直接このビットを判定分岐する未定義命令もあるのでそれを使ってもよいかもしれません。
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 → BC)命令
0×255の結果、BCが0になります。 - Z280では
NEG HL
(-HL → HL)命令
BCは変化しません。
BCが0になっていることでHD64180とわかります。
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判別は未定義動作を利用せざるを得ないことが多く、試せる環境が無いと難しいですね。仮に試せても、マスク変更で挙動が変わっていないか、セカンドソースでも同じ動作なのか、上位互換プロセッサではどうか、といつ動かない例が出てくるか心配し続けなくてはなりません。
ここに挙げたものも私のところで動いた(一部未確認もあり)だけですので、その点はご注意ください。
コメントを追加