という、指摘を受けたので、調べてみました。
実機で試すと、確かに止まってしまいますね。。(固まる)
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ではどうなるのかが、気になるところですね。。
どうなんだろう? 止まらないのかな?