// 直交形式 <dst> = <dreg> - <dreg>; <dst> = <dreg> - <dreg> + c -1; <dst> = <dreg> + c - 1; // 基本形式 [ IF <cond> ] <dst> = <xop> - <yop>; [ IF <cond> ] <dst> = <xop> - <yop> + c -1; [ IF <cond> ] <dst> = <xop> + c -1; // 即値形式 [ IF <cond> ] <dst> = <xop> - <imm>; [ IF <cond> ] <dst> = <xop> - <imm> + c -1;
// 直交形式 AR = MX0 - MY0; AF = MX0 - SI + C - 1; // ボロー補正 AR = MX0 + C - 1; // ボロー補正のみ // 基本形式 AR = AX0 - AY0; AR = MR1 - AY1 + C - 1; // ボロー補正 AR = AX1 + C - 1; // ボロー補正のみ IF EQ AR = AX0 - AY0; // 条件実行 // 即値形式 AR = AX0 - 128; AR = AX1 - 256 + C - 1; // ボロー補正
第一オペランドから第二オペランドを引いた結果をARまたはAFに格納します。 "+ C - 1 "を付け加えることで、下位からのボロー(Borrow : 桁下げ)を受け取ることができます。「なぜ + C - 1なんて面倒なことするの?」という声が聞こえそうです。減算のとき、キャリーフラグは「ボローの否定」を表します。したがって、C=1ならばボロー無し、C=0ならボローありなので - 1となり、結局 + C - 1 となるのです。
なんか変ですよね。ハードウェアに忠実すぎる気がします。" - B " という表記を認めてもいいような気がしますが、ハードウェアのCフラグの意味があいまいになるのを恐れたのでしょう。
<dst> ::= AR, AF <dreg> ::= AX0, AX1, AY0, AY1, MX0, MX1, MY0, MY1, SI, AR, MR2, MR1, MR0, SR2, SR1, SR0 <xop> ::= AX0, AX1, AR, MR2, MR1, MR0, SR1, SR0 <yop> ::= AY0, AY1, AF, 0 <imm> ::= <即値> <cond> ::= EQ, NE, GT, LE, LT, GE, AV, NOT AV, AC, NOT AC, SWCOND, NOT SWCOND, MV, NOT MV, NOT CE, TRUE