論理演算

DeMは10進マシンなので普通のCPUにあるような桁ごとの論理演算(論理積、論理和、排他的論理和)は持っていません。もっぱら桁を動かしたり取り出したりすることが論理演算になります。

演算対象は原則アキュムレータ(A)です。パラメータの一部を汎用レジスタに依存する命令もあります。いずれの命令も演算結果によりステータスレジスタ(SR)内のCyおよびCdが変化します。

シフト(桁ずらし)とローテート(回転)

Aの内容を左に1桁あるいは右に1桁ずらします。ずらして空いた桁に何を入れるのかでバリエーションがあります。

Operation Mnemonic inCode Opr2 Opr3 Opr4 Opr5 #bytes Opcode Ie Cy Cd
A <- A * 10 SHL 1 80 Y Y
A <- A / 10 SHR 1 81 Y Y
rotate A left with carry ROL 1 82 Y Y
rotate A right with carry ROR 1 83 Y Y
A <- A / 10 (Signed) ASHR 1 84 Y Y

SHL(Shift Left)は左シフトです。Aを左に1桁ずらして最下位の桁に0が入ります(これはAに10をかけることと同じです)。最上位桁からあふれた1桁はCyに入ります。

SHR(Shift Right)は右シフトです。Aを右に1桁ずらして最上位の桁に0が入ります(これはAを10で割ること同じです)。最下位桁からあふれた1桁はCyに入ります。

ROL(Rotate Left)は左「回転(ローテート)」です。左シフトと似ていますが、最下位桁はCyから供給されます。最上位桁からあふれた桁はCyに入るので回転と呼びます。

ROR(Rotate Right)は右回転です。右シフトと似ていますが、最上位桁はCyから供給されます。最下位桁からあふれた桁はCyに入るので回転と呼びます。

ASHR(Arithmetic Shift Right)は「算術右シフト」。その名の通り算術演算です。算術演算のページで補数の説明をしました。その補数がAに入っているーつまり負の数が入っている可能性があるー場合にも正しく10で割ることができるように工夫されている右シフトなのです。たとえば「−200」を右シフトによって10で割ったときに正しく「−20」という結果が得られます。普通の右シフトSHRを使うと「09999980」になってしまいます。なぜなら「−200」の補数表現は「99999800」だからです。これを以下のように解決しています。

Aに正の数が入っていた場合は頭に0を入れる Aに負の数が入っていた場合は頭に9を入れる

これら5つの命令ではCdが結果のAの値で変わります。

桁単位での操作

シフトや回転が桁全体を動かすのに対して単独の桁を扱う演算も用意しています。

Operation Mnemonic inCode Opr2 Opr3 Opr4 Opr5 #bytes Opcode Ie Cy Cd
A <- digit at position K{0..7} of Rs EXTR RsK 2 85 RK 0 Y
A <- A set to value in Rs at position K{0..7} INS RsK 2 86 RK 0 Y
A <- A set to Val at position K{0..7} MASK ValK 2 87 VK 0 Y

EXTR(Extract、エクストラクト)は「抽出」です。オペランドで指定された汎用レジスタの内容からもう一つのオペランドで指定された桁を抜き出して、その1桁の数値をAに入れます。右の図はA=0のときの実行例です。

INS(Insert、インサート)は「挿入」です。オペランド指定の汎用レジスタの内容を、Aのオペランド指定の桁位置にコピーします。右図では前の実行結果に重ねて実行した例を示します。

MASK(Mask、マスク)はまさに「マスクする」です。オペランド指定されたAの桁にもう一つのオペランドを上書きします。右図は前の実行結果に重ねての実行例を示します。

これら3つの命令はCyが必ずクリアされ、Cdは結果のAの値で変わります。