6800のCPX命令とエミュレーター(3)(ベーシックマスター開発 その28)
6800のCPX命令とエミュレーター(2)(ベーシックマスター開発 その27) | ず@沖縄の続き。
さて、MC6800のCPX命令はわかりにくいフラグ変化があるという話をしてきた。実は、いくつかのエミュレータ実装でも誤っているものがあるので、チェックしてみた。
まずは、正しく動作するエミュレーターで確認しておこう。Visual 6800 in JavaScriptは、個々のトランジスタ単位(!)で実行を行なうエミュレータだ。
Visual 6800の使い方
今回はフラグ変化だけが知りたいので、使うのは右上のパネルだけ。メモリ内容を書き換えて、リセットすると0番地から実行される。
下の例ではフラグ変化のタイミングがわかりやすいようにNOPが入っている。 NOP/LDX #0/CPX #1/NOP の順。Nフラグが立たないことがわかる。
エミュレーターの実装チェック
CPXの動作が怪しいエミュレーターがいくつかあった。もっとも、世間に出回っているプログラムはCPX命令の結果はBEQ/BNEで判断しているものばかりなので、プログラム実行には影響は出ていない。だからこそ、エラーが見逃されているのだが。
CPX命令以外でも、TPAでbit7,6が立たないエミュレーターもあり、bit7が立つことを前提としたプログラムは正しく動作しないと思われる(電大版Tiny BASICやNakamozu Tiny BASICなど)。
なお、私が普段使っているj68,bm2は正しい処理を行っていた。安心。
MC6801/HD6301やMC6809は?
MC6801/HD6301/MC68H11のCPX命令は16bit比較になっている。こちらはCが変化するので要注意。どうやって16bit処理を行っているのか、内部を見てみたいものだ。
(バイナリ互換と多くの資料に書かれているけど、CPXは厳密には非互換。実用上はたぶん問題ないけど)
MC6809のCMPX命令も16bit比較。こちらはMC6800の倍以上のトランジスタ数を使っているだけのことはある。
結局、68系のCPUの中ではMC6800/6802のCPXだけが特殊な動作である。6801/6301が6800の上位互換だと思ってプログラムすると大ハマりだ。
補足: TPAを使っているプログラム
TPAでは、AccAのbit7,bit6が立つ。これをフラグ設定に使い、BPL/BMIで分岐を行っている部分がある。
素直に書けば LDAA #$80 あるいは LDAA #$FF とするところだが、TPA の方が 1バイト短い。
Nakamozu Tiny BASICでは、AUTOやEND1など多数箇所で使われている(Nakamozu Tiny Basic /ASCIIのNTB source code part1 5ページ目など。電大TinyBASICでも使われているので、歴史は古そう。
次回に続く
ディスカッション
コメント一覧
まだ、コメントがありません