static void move_from_sr(struct cpu *cpu, WORD op) { ENTER; ADD_CYCLE(8); /* really 6 for EA==reg, but that will be 8 anyway */ ea_set_prefetch_before_write(); ea_write_word(cpu, op&0x3f, cpu->sr); }
static void not_b(struct cpu *cpu, WORD op) { BYTE r; ADD_CYCLE(4); if(op&0x38) { ADD_CYCLE(4); } r = ~ea_read_byte(cpu, op&0x3f, 1); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, r); cpu_set_flags_move(cpu, r&0x80, r); }
static void not_l(struct cpu *cpu, WORD op) { LONG r; ADD_CYCLE(6); if(op&0x38) { ADD_CYCLE(6); } r = ~ea_read_long(cpu, op&0x3f, 1); ea_set_prefetch_before_write(); ea_write_long(cpu, op&0x3f, r); cpu_set_flags_move(cpu, r&0x80000000, r); }
static void negx_b(struct cpu *cpu, WORD op) { BYTE d,r; d = ea_read_byte(cpu, op&0x3f, 1); r = 0-d; if(CHKX) r -= 1; ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, r); ADD_CYCLE(4); if(op&0x38) { ADD_CYCLE(4); } cpu_set_flags_negx(cpu, d&0x80, r&0x80, r); }
static void negx_l(struct cpu *cpu, WORD op) { LONG d,r; d = ea_read_long(cpu, op&0x3f, 1); r = 0-d; if(CHKX) r -= 1; ea_set_prefetch_before_write(); ea_write_long(cpu, op&0x3f, r); ADD_CYCLE(6); if(op&0x38) { ADD_CYCLE(6); } cpu_set_flags_negx(cpu, d&0x80000000, r&0x80000000, r); }
static void subi_b(struct cpu *cpu, WORD op) { BYTE s,d,r; s = bus_read_word(cpu->pc)&0xff; cpu->pc += 2; if(op&0x38) { ADD_CYCLE(12); } else { ADD_CYCLE(8); } d = ea_read_byte(cpu, op&0x3f, 1); r = d-s; ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, r); cpu_set_flags_sub(cpu, s&0x80, d&0x80, r&0x80, r); }
static void subi_l(struct cpu *cpu, WORD op) { LONG s,d,r; s = bus_read_long(cpu->pc); cpu->pc += 4; if(op&0x38) { ADD_CYCLE(20); } else { ADD_CYCLE(16); } d = ea_read_long(cpu, op&0x3f, 1); r = d-s; ea_set_prefetch_before_write(); ea_write_long(cpu, op&0x3f, r); cpu_set_flags_sub(cpu, s&0x80000000, d&0x80000000, r&0x80000000, r); }
static void addi_w(struct cpu *cpu, WORD op) { WORD s,d,r; s = bus_read_word(cpu->pc); cpu->pc += 2; if(op&0x38) { ADD_CYCLE(12); } else { ADD_CYCLE(8); } d = ea_read_word(cpu, op&0x3f, 1); r = d+s; ea_set_prefetch_before_write(); ea_write_word(cpu, op&0x3f, r); cpu_set_flags_add(cpu, s&0x8000, d&0x8000, r&0x8000, r); }
static void bset_r(struct cpu *cpu, int reg, int mode) { BYTE b,d; b = cpu->d[reg]&31; if(mode&0x38) { ADD_CYCLE(4); d = ea_read_byte(cpu, mode, 1); if(d & (1<<(b&7))) CLRZ; else SETZ; d |= (1<<(b&7)); ea_set_prefetch_before_write(); ea_write_byte(cpu, mode, d); } else { ADD_CYCLE(6); if(cpu->d[mode&7] & (1<<b)) CLRZ; else SETZ; cpu->d[mode&7] |= (1<<b); } }
static void bset_i(struct cpu *cpu, int mode) { BYTE b,d; b = (BYTE)bus_read_word(cpu->pc)&0xff; b &= 31; cpu->pc += 2; if(mode&0x38) { ADD_CYCLE(8); d = ea_read_byte(cpu, mode, 1); if(d & (1<<(b&7))) CLRZ; else SETZ; d |= (1<<(b&7)); ea_set_prefetch_before_write(); ea_write_byte(cpu, mode, d); } else { ADD_CYCLE(10); if(cpu->d[mode&7] & (1<<b)) CLRZ; else SETZ; cpu->d[mode&7] |= (1<<b); } }
void scc1(struct cpu *cpu, WORD op) { int r; ENTER; if(op&0x38) { r = 1; ADD_CYCLE(4); } else { r = 0; ADD_CYCLE(6); } switch((op&0xf00)>>8) { case 0: /* ST */ ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; case 1: /* SF */ break; case 2: /* SHI */ if(!CHKC && !CHKZ) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 3: /* SLS */ if(CHKC || CHKZ) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 4: /* SCC */ if(!CHKC) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 5: /* SCS */ if(CHKC) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 6: /* SNE */ if(!CHKZ) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 7: /* SEQ */ if(CHKZ) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 8: /* SVC */ if(!CHKV) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 9: /* SVS */ if(CHKV) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 10: /* SPL */ if(!CHKN) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 11: /* SMI */ if(CHKN) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 12: /* SGE */ if((CHKN && CHKV) || (!CHKN && !CHKV)) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 13: /* SLT */ if((CHKN & !CHKV) | ((!CHKN) & CHKV)) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 14: /* SGT */ if((CHKN && CHKV && !CHKZ) || (!CHKN && !CHKV && !CHKZ)) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; case 15: /* SLE */ if(CHKZ || (CHKN && !CHKV) || (!CHKN && CHKV)) { ADD_CYCLE(2); ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0xff); return; } break; } if(!r) { ADD_CYCLE(2); } ea_set_prefetch_before_write(); ea_write_byte(cpu, op&0x3f, 0x00); }