TANAKAさん、こんにちは。 > >ご指摘のとおりISRを「空読み」してみたらうまくいきました。ありがとうございます。 > >確かにマニュアルに読んでから0を書き込むとなっているんですね。 > >マニュアルの言葉の重さを思い知らされました。 > >でも、一体どういうロジックになっているんだろう?... > > このケースのように単一のビットを操作する場合は > ビット操作命令を使うのが便利です。 > ビット操作命令は、対象とするバイトを読み出し、ビット操作を施し、 > 必要ならバイト毎書き込む、という流れになります。 > これはバイト単位で読み出してビット操作をして…という > ビット操作命令に拠らない方法でも同じことです。 > で、このときbit0をクリアしようとしているときに > bit1が立ったらどうなるかを考えてみてください。 > [byte読出] -> (bit1が立つ) -> [bit0を0に] -> [byte書込] > となると読み出したbyteはbit1が立つ前のものですので0になってます > これを書き込んだ時にもしbit1が0になってしまったら、 > プログラムはbit1が立ったという事実を知ることができませんが、 > H8の仕様ならbit1の1をまだ読み出していませんから0は書き込まれません。 > また > (bit1が立つ) -> [byte読出] -> [bit0を0に] -> [byte書込] > だとしたら、bit1は読み出されていますが1が書き込まれますから1のままです。 > とまぁこのように、安全にビット単位の処理ができるようにこのような仕様に > なっている、というわけですね。 なるほど、安全にビット単位の処理を行うための仕掛けだったんですね。 私はだたクリアすることしか頭になかったので、フラグを調べるということを 全く考えておりませんでした。このような仕様なら、フラグが1になったのを 読みそこなうことがないわけですね。また、フラグのクリアを転送命令で フラグを読み出し、ただ0を書き込んでいただけなので、ビット操作命令 で書いてみます。(プログラムも短くなりますね) ありがとうございました。 ----------------------------- 恩田紀雄 n.onda@xxxxxxxxxxxxxxxxxxx