富士通MB8861の追加命令 (1)NIM/OIM/XIM

BASICMASTER, 昔のパソコン

富士通MB8861はMC6800上位互換のCPUであり、5種6命令が追加されている。

そのうちNIM/OIM/XIM/TMMは、メモリ上のデータをbit単位で(レジスタを介さずに)直接操作できる。制御用途で直接I/Oを叩くような場合に有効な命令だ。

ADXはIXレジスタに8bitの即値あるいはメモリ上の16bitデータを加算する。こちらは実に使い出がある。

命令codebytecyc機能概略
NIM7138BP ∩ (M) → M:ビットリセット
OIM7238BP U (M) → M:ビットセット
XIM7538BP ⊕ (M) → M
TMM7B37BP ∩ (M), BP ∩ (M) の結果と BP の EX-OR をとり
各々の結果に応じ CCR をセット
ADX
(imm)
EC24IXL ← (IXL) +(命令の 2 バイト目)
IXH ← (IXH) + C
ADX
(ext)
FC37IXL ← (IXL) + (M + 1)
IXH ← (IXH) + (M) + C

TMM命令の機能概略が込み入ってるが、これは次回解説する。


なお、NIM/OIM/XIM/TMM命令はフラグの変化が通常とは異なる。

内容
NIM
OIM
演算結果が00ならばZビットをセットしNビットをリセットする。00でなければZビットをリセットしNビットをセットする。Vはリセットされる。
XIM演算結果が00ならばZビットをセットしNビットをリセットする。00でなければZビットをリセットしNビットをセットする。
TMM(a) (Bp)=00ならばZビットをセットし、N、Vビットをリセットする。
(b) Bpのマスクビット(セットビット)に対応するオペランドデータのビットがすべて0であればZビットをセットしN、Vビットをリセットする。
(c) Bpのマスクビットに対応するオペランドデータのビットがすべて1であればVビットをセットし、Z、Nビットをリセットする。
(d) (a)(b)(c)以外のときNビットをセットし、Z、Vビットをリセットする。


NIM/OIM/XIM命令

先にメモリデータ操作命令を見ておこう。

全て3バイト命令である。メモリ上では 命令コード・即値・オフセット の順に並ぶ。

命令コードは 71,72,75 である。命令サイクルは 8,8,8。

NIM/OIM/XIMは、IXアドレッシングで指定したメモリ上のデータと、即値を演算し、結果をメモリに書き込む。実行には8サイクルかかる。

フラグ変化は、結果が0ならZ=1,N=0、結果が0以外ならZ=0,N=1。Zだけセットすれば良さそうに思えるが、TMM命令との絡みでNも変化しているのだろう(推測)。

NIM/OIMではVフラグはリセットされるが、XIMでは変化しない。

MC6800の通常の論理演算命令(AND/ORA/EOR)ではVはリセットされていたので、XIM命令だけ挙動が違う。


これらの命令は C言語で *M &= 1; のような命令をコンパイルしたいときに使えそうである。Pascalの集合型(set)に使うのも良いかも。

HD6301のAIM/OIM/EIMとは命令コードが異なる

日立のHD6301はMC6801にさらに命令が追加されていて、MB8861のNIM/OIM/XIM相当の命令もある。

機能は同等だが、HD6301の方はダイレクトモードが追加されている。命令コードはダイレクトモードの方が71,72,75であり、インデックスモードは61,62,65である。微妙に違う。惜しい。

HD6301のTIMは MB6881のTMMとは動作がことなる。TIMはメモリ書き込みを行わないNIMになる(AND命令とBIT命令の関係に同じ)。命令コードは7B,6B。

ダイレクトモードが追加されたのは、組み込み向けではゼロページにI/Oを置きたいので、そこのテストを容易に行うためだろう。

資料