cpu_6800_ill(self);
break;
case 0x16:
- cpu_6800_lda(self, CPU_6800_EA_A, self->regs.byte.a);
+ cpu_6800_lda(self, CPU_6800_EA_B, self->regs.byte.a);
break;
case 0x17:
cpu_6800_lda(self, CPU_6800_EA_A, self->regs.byte.b);
cpu_6800_inc(self, CPU_6800_EA_A);
break;
case 0x4d:
- cpu_6800_tst(self, self->regs.byte.a);
+ cpu_6800_cmp(self, self->regs.byte.a, 0);
break;
case 0x4e:
cpu_6800_ill(self);
cpu_6800_inc(self, CPU_6800_EA_B);
break;
case 0x5d:
- cpu_6800_tst(self, self->regs.byte.b);
+ cpu_6800_cmp(self, self->regs.byte.b, 0);
break;
case 0x5e:
cpu_6800_ill(self);
cpu_6800_inc(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
break;
case 0x6d:
- cpu_6800_tst(self, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
+ cpu_6800_cmp(self, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)), 0);
break;
case 0x6e:
cpu_6800_jmp(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
cpu_6800_inc(self, cpu_6800_ea_extended(self));
break;
case 0x7d:
- cpu_6800_tst(self, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
+ cpu_6800_cmp(self, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)), 0);
break;
case 0x7e:
cpu_6800_jmp(self, cpu_6800_ea_extended(self));
cpu_6800_ill(self);
break;
case 0xd4:
- cpu_6800_and(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
+ cpu_6800_and(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
break;
case 0xd5:
- cpu_6800_bit(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
+ cpu_6800_bit(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
break;
case 0xd6:
cpu_6800_lda(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
cpu_6800_ill(self);
break;
case 0xe4:
- cpu_6800_and(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
+ cpu_6800_and(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
break;
case 0xe5:
- cpu_6800_bit(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
+ cpu_6800_bit(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
break;
case 0xe6:
cpu_6800_lda(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
cpu_6800_ill(self);
break;
case 0xf4:
- cpu_6800_and(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
+ cpu_6800_and(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
break;
case 0xf5:
- cpu_6800_bit(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
+ cpu_6800_bit(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
break;
case 0xf6:
cpu_6800_lda(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
}
static ALWAYS_INLINE int cpu_6800_ea_direct_indexed(struct cpu_6800 *self, int rvalue) {
- return (cpu_6800_ea_direct(self) + rvalue) & 0xff;
+ int addr = cpu_6800_ea_direct(self);
+ self->cycles += ((addr & 0xff) + (rvalue & 0xff)) >> 8;
+ return addr + rvalue;
}
// instruction execute
int result = cpu_6800_read_byte(self, lvalue) & rvalue;
cpu_6800_write_byte(self, lvalue, result);
- self->regs.bit.zf = result == 0;
self->regs.bit.nf = result >> 7;
+ self->regs.bit.zf = result == 0;
+ self->regs.bit.vf = false;
}
static ALWAYS_INLINE void cpu_6800_asr(struct cpu_6800 *self, int lvalue) {
static ALWAYS_INLINE void cpu_6800_clr(struct cpu_6800 *self, int lvalue) {
cpu_6800_write_byte(self, lvalue, 0);
+
+ self->regs.bit.nf = false;
+ self->regs.bit.zf = true;
+ self->regs.bit.vf = false;
+ self->regs.bit.cf = false;
}
static ALWAYS_INLINE void cpu_6800_cmp(struct cpu_6800 *self, int rvalue0, int rvalue1) {
int result = cpu_6800_read_byte(self, lvalue) ^ rvalue;
cpu_6800_write_byte(self, lvalue, result);
- self->regs.bit.zf = result == 0;
self->regs.bit.nf = result >> 7;
+ self->regs.bit.zf = result == 0;
+ self->regs.bit.vf = false;
}
static ALWAYS_INLINE void cpu_6800_ill(struct cpu_6800 *self) {
int result = cpu_6800_read_byte(self, lvalue) | rvalue;
cpu_6800_write_byte(self, lvalue, result);
- self->regs.bit.zf = result == 0;
self->regs.bit.nf = result >> 7;
+ self->regs.bit.zf = result == 0;
+ self->regs.bit.vf = false;
}
//static ALWAYS_INLINE void cpu_6800_plp(struct cpu_6800 *self) {