static ALWAYS_INLINE void cpu_6800_adc(struct cpu_6800 *self, int lvalue, int rvalue) {
int data = cpu_6800_read_byte(self, lvalue);
- int result0 = self->regs.bit.cf + (data & 0x7f) + (rvalue & 0x7f);
- int result1 = result0 + (data & 0x80) + (rvalue & 0x80);
+ int result0 = (data & 0xf) + (rvalue & 0xf) + self->regs.bit.cf;
+ int result1 = result0 + (data & 0x70) + (rvalue & 0x70);
+ int result2 = result1 + (data & 0x80) + (rvalue & 0x80);
- cpu_6800_write_byte(self, lvalue, result1 & 0xff);
- self->regs.bit.cf = result1 >> 8;
- self->regs.bit.zf = (result1 & 0xff) == 0;
- self->regs.bit.vf = ((result0 >> 7) ^ (result1 >> 8)) & 1;
- self->regs.bit.nf = (result1 >> 7) & 1;
+ cpu_6800_write_byte(self, lvalue, result2 & 0xff);
+ self->regs.bit.hf = result0 >> 4;
+ self->regs.bit.nf = (result2 >> 7) & 1;
+ self->regs.bit.zf = (result2 & 0xff) == 0;
+ self->regs.bit.vf = ((result1 >> 7) ^ (result2 >> 8)) & 1;
+ self->regs.bit.cf = result2 >> 8;
}
static ALWAYS_INLINE void cpu_6800_add(struct cpu_6800 *self, int lvalue, int rvalue) {
int data = cpu_6800_read_byte(self, lvalue);
- int result0 = (data & 0x7f) + (rvalue & 0x7f);
- int result1 = result0 + (data & 0x80) + (rvalue & 0x80);
+ int result0 = (data & 0xf) + (rvalue & 0xf);
+ int result1 = result0 + (data & 0x70) + (rvalue & 0x70);
+ int result2 = result1 + (data & 0x80) + (rvalue & 0x80);
- cpu_6800_write_byte(self, lvalue, result1 & 0xff);
- self->regs.bit.cf = result1 >> 8;
- self->regs.bit.zf = (result1 & 0xff) == 0;
- self->regs.bit.vf = ((result0 >> 7) ^ (result1 >> 8)) & 1;
- self->regs.bit.nf = (result1 >> 7) & 1;
+ cpu_6800_write_byte(self, lvalue, result2 & 0xff);
+ self->regs.bit.hf = result0 >> 4;
+ self->regs.bit.nf = (result2 >> 7) & 1;
+ self->regs.bit.zf = (result2 & 0xff) == 0;
+ self->regs.bit.vf = ((result1 >> 7) ^ (result2 >> 8)) & 1;
+ self->regs.bit.cf = result2 >> 8;
}
static ALWAYS_INLINE void cpu_6800_and(struct cpu_6800 *self, int lvalue, int rvalue) {
++self->cycles;
cpu_6800_write_byte(self, lvalue, result >> 1);
- self->regs.bit.nf = false;
+ self->regs.bit.nf = result >> 8;
self->regs.bit.zf = (result & 0xfe) == 0;
self->regs.bit.vf = (result ^ (result >> 8)) & 1;
self->regs.bit.cf = result & 1;
}
static ALWAYS_INLINE void cpu_6800_com(struct cpu_6800 *self, int lvalue) {
- int result = ~cpu_6800_read_byte(self, lvalue);
+ int result = cpu_6800_read_byte(self, lvalue) ^ 0xff;
cpu_6800_write_byte(self, lvalue, result);
- self->regs.bit.nf = true;
- self->regs.bit.hf = true;
+ self->regs.bit.nf = result >> 7;
+ self->regs.bit.zf = result == 0;
+ self->regs.bit.vf = false;
+ self->regs.bit.cf = true;
}
static ALWAYS_INLINE void cpu_6800_cp(struct cpu_6800 *self, int rvalue0, int rvalue1) {
abort();
}
-static ALWAYS_INLINE void cpu_6800_de(struct cpu_6800 *self, int lvalue) {
- int result = (cpu_6800_read_word(self, lvalue) - 1) & 0xffff;
+static ALWAYS_INLINE void cpu_6800_des(struct cpu_6800 *self) {
+ --self->regs.word.s;
+ ++self->cycles;
+}
+
+static ALWAYS_INLINE void cpu_6800_dex(struct cpu_6800 *self) {
+ int result = (self->regs.word.x - 1) & 0xffff;
++self->cycles;
- cpu_6800_write_word(self, lvalue, result);
+
+ self->regs.word.x = result;
self->regs.bit.zf = result == 0;
- self->regs.bit.nf = result >> 15;
}
static ALWAYS_INLINE void cpu_6800_dec(struct cpu_6800 *self, int lvalue) {
- int result = (cpu_6800_read_byte(self, lvalue) - 1) & 0xff;
+ int data = cpu_6800_read_byte(self, lvalue);
+
+ int result0 = (data & 0x7f) - 1;
+ int result1 = result0 + (data & 0x80);
++self->cycles;
- cpu_6800_write_byte(self, lvalue, result);
- self->regs.bit.zf = result == 0;
- self->regs.bit.nf = result >> 7;
+
+ cpu_6800_write_byte(self, lvalue, result1 & 0xff);
+ self->regs.bit.nf = (result1 >> 7) & 1;
+ self->regs.bit.zf = (result1 & 0xff) == 0;
+ self->regs.bit.vf = ((result0 >> 7) ^ (result1 >> 8)) & 1;
}
static ALWAYS_INLINE void cpu_6800_eor(struct cpu_6800 *self, int lvalue, int rvalue) {
abort();
}
-static ALWAYS_INLINE void cpu_6800_in(struct cpu_6800 *self, int lvalue) {
- int result = (cpu_6800_read_word(self, lvalue) + 1) & 0xffff;
+static ALWAYS_INLINE void cpu_6800_ins(struct cpu_6800 *self) {
+ ++self->regs.word.s;
++self->cycles;
- cpu_6800_write_word(self, lvalue, result);
+}
+
+static ALWAYS_INLINE void cpu_6800_inx(struct cpu_6800 *self) {
+ int result = (self->regs.word.x + 1) & 0xffff;
+ ++self->cycles;
+
+ self->regs.word.x = result;
self->regs.bit.zf = result == 0;
- self->regs.bit.nf = result >> 15;
}
static ALWAYS_INLINE void cpu_6800_inc(struct cpu_6800 *self, int lvalue) {
- int result = (cpu_6800_read_byte(self, lvalue) + 1) & 0xff;
+ int data = cpu_6800_read_byte(self, lvalue);
+
+ int result0 = (data & 0x7f) + 1;
+ int result1 = result0 + (data & 0x80);
++self->cycles;
- cpu_6800_write_byte(self, lvalue, result);
- self->regs.bit.zf = result == 0;
- self->regs.bit.nf = result >> 7;
+
+ cpu_6800_write_byte(self, lvalue, result1 & 0xff);
+ self->regs.bit.nf = (result1 >> 7) & 1;
+ self->regs.bit.zf = (result1 & 0xff) == 0;
+ self->regs.bit.vf = ((result0 >> 7) ^ (result1 >> 8)) & 1;
}
static ALWAYS_INLINE void cpu_6800_swi(struct cpu_6800 *self, int lvalue) {
static ALWAYS_INLINE void cpu_6800_lsl(struct cpu_6800 *self, int lvalue) {
int result = cpu_6800_read_byte(self, lvalue) << 1;
++self->cycles;
+
cpu_6800_write_byte(self, lvalue, result & 0xff);
- self->regs.bit.cf = result >> 8;
- self->regs.bit.zf = (result & 0xff) == 0;
self->regs.bit.nf = (result >> 7) & 1;
+ self->regs.bit.zf = (result & 0xff) == 0;
+ self->regs.bit.vf = ((result >> 7) ^ (result >> 8)) & 1;
+ self->regs.bit.cf = result >> 8;
}
static ALWAYS_INLINE void cpu_6800_lsr(struct cpu_6800 *self, int lvalue) {
- int result = cpu_6800_read_byte(self, lvalue);
+ int data = cpu_6800_read_byte(self, lvalue);
+
+ int result = data;
++self->cycles;
+
cpu_6800_write_byte(self, lvalue, result >> 1);
- self->regs.bit.cf = result & 1;
+ self->regs.bit.nf = result >> 8;
self->regs.bit.zf = (result & 0xfe) == 0;
- self->regs.bit.nf = false;
+ self->regs.bit.vf = (result ^ (result >> 8)) & 1;
+ self->regs.bit.cf = result & 1;
}
static ALWAYS_INLINE void cpu_6800_neg(struct cpu_6800 *self, int lvalue) {
int data = cpu_6800_read_byte(self, lvalue);
- int result0 = -(data & 0xf);
- int result1 = result0 - (data & 0x70);
- int result2 = result1 - (data & 0x80);
+ int result0 = -(data & 0x7f);
+ int result1 = result0 - (data & 0x80);
- cpu_6800_write_byte(self, lvalue, result2 & 0xff);
- self->regs.bit.cf = (result2 >> 8) & 1;
- self->regs.bit.nf = true;
- self->regs.bit.vf = ((result1 >> 7) ^ (result2 >> 8)) & 1;
- self->regs.bit.hf = (result0 >> 4) & 1;
- self->regs.bit.zf = (result2 & 0xff) == 0;
- self->regs.bit.nf = (result2 >> 7) & 1;
+ cpu_6800_write_byte(self, lvalue, result1 & 0xff);
+ self->regs.bit.nf = (result1 >> 7) & 1;
+ self->regs.bit.zf = (result1 & 0xff) == 0;
+ self->regs.bit.vf = ((result0 >> 7) ^ (result1 >> 8)) & 1;
+ self->regs.bit.cf = (result1 >> 8) & 1;
}
-
static ALWAYS_INLINE void cpu_6800_nop(struct cpu_6800 *self) {
}
self->regs.bit.vf = false;
}
-//static ALWAYS_INLINE void cpu_6800_plp(struct cpu_6800 *self) {
-// self->regs.byte.p = cpu_6800_pop_byte(self) | 0xc0;
-//}
-
static ALWAYS_INLINE void cpu_6800_psh(struct cpu_6800 *self, int rvalue) {
cpu_6800_push_byte(self, rvalue);
}
cpu_6800_write_byte(self, lvalue, cpu_6800_pop_byte(self));
}
-//static ALWAYS_INLINE void cpu_6800_rmb(struct cpu_6800 *self, int n, int lvalue) {
-// int result = cpu_6800_read_byte(self, lvalue) & ~(1 << n);
-// ++self->cycles;
-// cpu_6800_write_byte(self, lvalue, result);
-//}
-
static ALWAYS_INLINE void cpu_6800_rol(struct cpu_6800 *self, int lvalue) {
int result = self->regs.bit.cf | (cpu_6800_read_byte(self, lvalue) << 1);
++self->cycles;
+
cpu_6800_write_byte(self, lvalue, result & 0xff);
- self->regs.bit.cf = result >> 8;
- self->regs.bit.zf = (result & 0xff) == 0;
self->regs.bit.nf = (result >> 7) & 1;
+ self->regs.bit.zf = (result & 0xff) == 0;
+ self->regs.bit.vf = ((result >> 7) ^ (result >> 8)) & 1;
+ self->regs.bit.cf = result >> 8;
}
static ALWAYS_INLINE void cpu_6800_ror(struct cpu_6800 *self, int lvalue) {
int result = cpu_6800_read_byte(self, lvalue) | (self->regs.bit.cf << 8);
++self->cycles;
cpu_6800_write_byte(self, lvalue, result >> 1);
- self->regs.bit.cf = result & 1;
+
+ self->regs.bit.nf = result >> 8;
self->regs.bit.zf = (result & 0x1fe) == 0;
- self->regs.bit.nf = (result >> 8) & 1;
+ self->regs.bit.vf = (result ^ (result >> 8)) & 1;
+ self->regs.bit.cf = result & 1;
}
static ALWAYS_INLINE void cpu_6800_rti(struct cpu_6800 *self) {
static ALWAYS_INLINE void cpu_6800_sbc(struct cpu_6800 *self, int lvalue, int rvalue) {
int data = cpu_6800_read_byte(self, lvalue);
- rvalue ^= 0xff;
- int result0 = self->regs.bit.cf + (data & 0x7f) + (rvalue & 0x7f);
- int result1 = result0 + (data & 0x80) + (rvalue & 0x80);
+ int result0 = (data & 0x7f) - (rvalue & 0x7f) - self->regs.bit.cf;
+ int result1 = result0 + (data & 0x80) - (rvalue & 0x80);
cpu_6800_write_byte(self, lvalue, result1 & 0xff);
- self->regs.bit.cf = result1 >> 8;
+ self->regs.bit.nf = (result1 >> 7) & 1;
self->regs.bit.zf = (result1 & 0xff) == 0;
self->regs.bit.vf = ((result0 >> 7) ^ (result1 >> 8)) & 1;
- self->regs.bit.nf = (result1 >> 7) & 1;
+ self->regs.bit.cf = (result1 >> 8) & 1;
}
static ALWAYS_INLINE void cpu_6800_se(struct cpu_6800 *self, int n) {
self->regs.byte.p |= 1 << n;
}
-//static ALWAYS_INLINE void cpu_6800_smb(struct cpu_6800 *self, int n, int lvalue) {
-// int result = cpu_6800_read_byte(self, lvalue) | (1 << n);
-// ++self->cycles;
-// cpu_6800_write_byte(self, lvalue, result);
-//}
-
static ALWAYS_INLINE void cpu_6800_st(struct cpu_6800 *self, int rvalue, int lvalue) {
cpu_6800_write_word(self, lvalue, rvalue);
self->regs.byte.a = self->regs.byte.p;
}
-//static ALWAYS_INLINE void cpu_6800_trb(struct cpu_6800 *self, int lvalue) {
-// int result = cpu_6800_read_byte(self, lvalue);
-// ++self->cycles;
-// cpu_6800_write_byte(self, lvalue, result & ~self->regs.byte.a);
-// result &= self->regs.byte.a;
-// self->regs.bit.zf = result == 0;
-//}
-//
-//static ALWAYS_INLINE void cpu_6800_tsb(struct cpu_6800 *self, int lvalue) {
-// int result = cpu_6800_read_byte(self, lvalue);
-// ++self->cycles;
-// cpu_6800_write_byte(self, lvalue, result | self->regs.byte.a);
-// result &= self->regs.byte.a;
-// self->regs.bit.zf = result == 0;
-//}
-
static ALWAYS_INLINE void cpu_6800_tst(struct cpu_6800 *self, int rvalue) {
self->regs.bit.zf = rvalue == 0;
self->regs.bit.nf = rvalue >> 7;
}
+static ALWAYS_INLINE void cpu_6800_tsx(struct cpu_6800 *self) {
+ self->regs.word.x = (self->regs.word.s + 1) & 0xffff;
+}
+
+static ALWAYS_INLINE void cpu_6800_txs(struct cpu_6800 *self) {
+ self->regs.word.s = (self->regs.word.x - 1) & 0xffff;
+}
+
static ALWAYS_INLINE void cpu_6800_wai(struct cpu_6800 *self) {
self->regs.bit.wai_flag = true;
}