iP6+ が、HALT命令で止まらない?

という、指摘を受けたので、調べてみました。
実機で試すと、確かに止まってしまいますね。。(固まる)

case HALT:
ClockCount=0;
if(R.IFF&0x01) { R.PC.W--;R.IFF|=0x80; }

という、実装になっていますね。
if(R.IFF&0x01)というのは、割り込み許可状態ですか?ということです。
割り込み許可状態なら、PCアドレスから1引いて、HALT命令を実行中であるフラグを立てます。


しかし、このままだと、割り込み禁止の時は、無条件にHALTの次の命令に移行することになります。


実際に、PC-6601で試してみましょう。
まずは、割り込み許可状態です。

D000: 76 HALT
D001: FF RST 38H

EXEC&hD000 とすると、BREAK ADDR=D001で止まりました。
つまり、HALTで一旦止まった後、周辺チップから、割り込みが来たので、次の命令に移行したということです。



次に、割り込み禁止状態です。

D000: F3 DI   (割り込み禁止)
D001: 76 HALT
D002: FB EI   (割り込み許可)
D003: FF RST 38H

EXEC&HD000 とすると、固まりました。
HALTで、一旦止まった後、割り込みが来ないかなぁ。。と思っているが、割り込み禁止状態なので、どこからも割り込みが来ず、無限ループに陥っていることになります。

こうなると、リセットするしかありません。


というわけで、P6では、下記のif文は不要と言うことになりますね。。
if(R.IFF&0x01)

その後に続く、{ R.PC.W--;R.IFF|=0x80; }は、必要ですが。。


88では、どうなのかと思って、調べてみたのですが、特に止まらないですね。。(^^;
私のやり方が悪いんでしょうか?
うーん?


[追記]

iP6+ のベースになった、iP6って、もともと、fmsxというエミュレータをベースにして作られているそうです。

ということは、msxではどうなるのかが、気になるところですね。。
どうなんだろう? 止まらないのかな?