Z80のバグ
2020.10.16
超放置してましたが最近MSXをまたいじり始めました。
近々なんか公開するかもね。
それはそれとして、既知情報ですが本家ZilogのZ80には割り込み関連のバグ(エラッタ)があります。
というのは、
LD A,I
LD A,R
という命令は
Iレジスタ、Rレジスタの内容をAレジスタに入れるという見たまんまの機能の他に、
割り込みフリップフロップ(EI/DI状態)をPフラグに入れる
という機能がひっそりとあります。普通にZilogの資料に書かれていますが。
割り込み状態を取得するのに(MSXだと)1/60秒待って割り込みがかかればEIというような実装をしているソフトをわりと見たことあるので、あんまり有名では無い機能かもしれません。
Z80は割り込みがかかるとDIになって割り込みベクタに飛び、
通常のソフトであれば割り込み処理をしたあと、EI状態にしたあとRETIでメイン処理に戻ります。
で、ここで、この、割り込みフリップフロップをPフラグに入れる、という機能にバグがあって、
LD A,I(もしくはLD A,R)実行中に割り込みがかかると割り込み禁止になり、その状態がPフラグに取り込まれる、というバグがあります。
NMOS品はバグがあって、CMOS品は修正されているようです(詳しくはwikipedia参照)
で、これはMSX-ENGINE(T9769)とR800ではどうなっているのかという話。
検証方法自体は実に単純で、
D000 LD HL,0000H
D003 LD A,I
JP PE,0D00CH
LD (0F7F8H),HL
RET
D00C INC HL
JP 0D003H
とかで、
LD A,IでEI状態ならループした回数を数えて、DIであれば戻ってきます。
EI状態で開始した場合、ループから抜ける条件はないので、バグがあればループから抜けますね。
というわけで、試したところ、A1GT(T9769C)ではループを抜けて戻ってきます。つまり、バグ持ちです。
R800では戻ってきませんので、修正されているようです。
という、今更な話題でした。
近々なんか公開するかもね。
それはそれとして、既知情報ですが本家ZilogのZ80には割り込み関連のバグ(エラッタ)があります。
というのは、
LD A,I
LD A,R
という命令は
Iレジスタ、Rレジスタの内容をAレジスタに入れるという見たまんまの機能の他に、
割り込みフリップフロップ(EI/DI状態)をPフラグに入れる
という機能がひっそりとあります。普通にZilogの資料に書かれていますが。
割り込み状態を取得するのに(MSXだと)1/60秒待って割り込みがかかればEIというような実装をしているソフトをわりと見たことあるので、あんまり有名では無い機能かもしれません。
Z80は割り込みがかかるとDIになって割り込みベクタに飛び、
通常のソフトであれば割り込み処理をしたあと、EI状態にしたあとRETIでメイン処理に戻ります。
で、ここで、この、割り込みフリップフロップをPフラグに入れる、という機能にバグがあって、
LD A,I(もしくはLD A,R)実行中に割り込みがかかると割り込み禁止になり、その状態がPフラグに取り込まれる、というバグがあります。
NMOS品はバグがあって、CMOS品は修正されているようです(詳しくはwikipedia参照)
で、これはMSX-ENGINE(T9769)とR800ではどうなっているのかという話。
検証方法自体は実に単純で、
D000 LD HL,0000H
D003 LD A,I
JP PE,0D00CH
LD (0F7F8H),HL
RET
D00C INC HL
JP 0D003H
とかで、
LD A,IでEI状態ならループした回数を数えて、DIであれば戻ってきます。
EI状態で開始した場合、ループから抜ける条件はないので、バグがあればループから抜けますね。
というわけで、試したところ、A1GT(T9769C)ではループを抜けて戻ってきます。つまり、バグ持ちです。
R800では戻ってきませんので、修正されているようです。
という、今更な話題でした。
パナ機のフレキパターン
2018.05.03
A1-GT起動したら「(」が入力できないっていうまあ接触不良とかだろうけど微妙に謎な現象が起きて、
「8」は単体で入力できるんだよね。
「SHIFT」も単体では入力できるんだよね。
でも「8」+「SHIFT」を押すと「8」が認識されないんだよね。
いやー、そんな故障(接触不良は故障ではない!)起きるような構造でもないし、
IO直接叩いても同じ挙動するしなんだろうなー。
というわけでなんかフレキのどっかがタッチしてて、こういう挙動してるんだろうなーと。
「8」と「SHIFT」ってどっちもX0列にあるのも怪しい。
ところでA1-GTのキーボードのフレキ(A1-WSXとかA1-STも同じね)って、
単純にMSXの規格通りじゃないんだよね。実行取消があるとかそういう話じゃなく、
フレキパターン作成の都合だろうけど、CN11にX0とかX4が複数あったりとか、
CN12にY6が複数あったりとか。
というわけで実際のところどういうパターンになってるのよ、と。
で、実際のパターンです。どっかで拾ったサービスマニュアルから転用。
うーん、重なってるところよくわからんなあ。
これ本物スキャンしたほうがいい気がするなあ。でもA4スキャナじゃ無理なんだよな。
このフレキって、自作(というか外注)で小ロットで作れないものかね。
作ったら数十枚程度は売れそうな気がするなあ。
「8」は単体で入力できるんだよね。
「SHIFT」も単体では入力できるんだよね。
でも「8」+「SHIFT」を押すと「8」が認識されないんだよね。
いやー、そんな故障(接触不良は故障ではない!)起きるような構造でもないし、
IO直接叩いても同じ挙動するしなんだろうなー。
というわけでなんかフレキのどっかがタッチしてて、こういう挙動してるんだろうなーと。
「8」と「SHIFT」ってどっちもX0列にあるのも怪しい。
ところでA1-GTのキーボードのフレキ(A1-WSXとかA1-STも同じね)って、
単純にMSXの規格通りじゃないんだよね。実行取消があるとかそういう話じゃなく、
フレキパターン作成の都合だろうけど、CN11にX0とかX4が複数あったりとか、
CN12にY6が複数あったりとか。
というわけで実際のところどういうパターンになってるのよ、と。
で、実際のパターンです。どっかで拾ったサービスマニュアルから転用。
うーん、重なってるところよくわからんなあ。
これ本物スキャンしたほうがいい気がするなあ。でもA4スキャナじゃ無理なんだよな。
このフレキって、自作(というか外注)で小ロットで作れないものかね。
作ったら数十枚程度は売れそうな気がするなあ。