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では戻ってきませんので、修正されているようです。

という、今更な話題でした。
2020.10.16 19:03 | 固定リンク | MSX | コメント (6)
THANK YOU EVERYBODY
2019.08.10
2019.08.10 23:29 | 固定リンク | ミク | コメント (0)
DIVA
2019.06.23
スクリプトから抽出したジャストCOOLタイミング
※そもそもミリ秒で判定してるのに、なぜスクリプトはマイクロ秒?
検討は後日

・エレクトロサチュレイタ(HD)
#373 171.814150s
#374 173.729040s

・メランコリック(EX)
#39(△H) 11.703070s
#40(□H) 12.131640s
#41(○H) 12.774500s

・DYE(HD)
#529(○H) 170.003170s
#530(○) 172.661400s

・Nyanyanyanyanyanyanya!(HD)
#607 156.533660s
#621 159.491400s

・FREELY TOMORROW(EX)
#233(×H)97.120830s
#249(×)102.004550s

・秘密警察(HD)
#468(4H) 132.646840s
#469(△) 134.896840s

#494(4H) 142.246840s
#495(□) 144.196840s

・ACUTE(HD)
#113(△H) 58.993910s
#121(△) 63.993910s

・スキキライ(EX)
#426(□H) 157.139990s
#438(○□) 162.139990s

・いろは唄(HD)
#228(△○H) 85.813950s
#229(○) 90.697670s

2019.06.23 21:54 | 固定リンク | ミク | コメント (0)

- CafeNote -