+void and_r_adr_x()
+{
+ WORD w[2];
+ w[0] = sys->memory[sys->cpu->pr];
+ w[1] = sys->memory[sys->cpu->pr + 1];
+ setfr(sys->cpu->gr[r_r1(w[0])] &= val_adrx(w[1], w[0]));
+ sys->cpu->pr += 2;
+}
+
+/**
+ * AND命令 - オペランドr1,r2。語長1
+ */
+void and_r1_r2()
+{
+ WORD w[1];
+ w[0] = sys->memory[sys->cpu->pr];
+ setfr(sys->cpu->gr[r_r1(w[0])] &= sys->cpu->gr[x_r2(w[0])]);
+ sys->cpu->pr += 1;
+}
+
+/**
+ * OR命令 - オペランドr,adr,x。語長2
+ */
+void or_r_adr_x()
+{
+ WORD w[2];
+ w[0] = sys->memory[sys->cpu->pr];
+ w[1] = sys->memory[sys->cpu->pr + 1];
+ setfr(sys->cpu->gr[r_r1(w[0])] |= val_adrx(w[1], w[0]));
+ sys->cpu->pr += 2;
+}
+
+/**
+ * OR命令 - オペランドr1,r2。語長1
+ */
+void or_r1_r2()
+{
+ WORD w[1];
+ w[0] = sys->memory[sys->cpu->pr];
+ setfr(sys->cpu->gr[r_r1(w[0])] |= sys->cpu->gr[x_r2(w[0])]);
+ sys->cpu->pr += 1;
+}
+
+/**
+ * XOR命令 - オペランドr,adr,x。語長2
+ */
+void xor_r_adr_x()
+{
+ WORD w[2];
+ w[0] = sys->memory[sys->cpu->pr];
+ w[1] = sys->memory[sys->cpu->pr + 1];
+ setfr(sys->cpu->gr[r_r1(w[0])] ^= val_adrx(w[1], w[0]));
+ sys->cpu->pr += 2;
+}
+
+/**
+ * XOR命令 - オペランドr1,r2。語長1
+ */
+void xor_r1_r2()
+{
+ WORD w[1];
+ w[0] = sys->memory[sys->cpu->pr];
+ setfr(sys->cpu->gr[r_r1(w[0])] ^= sys->cpu->gr[x_r2(w[0])]);
+ sys->cpu->pr += 1;
+}
+
+/**
+ * CPA命令のテンプレート
+ * 汎用レジスタrの内容と値valを算術比較
+ */
+void cpa(const WORD r, const WORD val)