static UINT32 READ_EA_32(m68ki_cpu_core *m68k, int ea) { int mode = (ea >> 3) & 0x7; int reg = (ea & 0x7); switch (mode) { case 0: // Dn { return REG_D[reg]; } case 2: // (An) { UINT32 ea = REG_A[reg]; return m68ki_read_32(m68k, ea); } case 3: // (An)+ { UINT32 ea = EA_AY_PI_32(m68k); return m68ki_read_32(m68k, ea); } case 5: // (d16, An) { UINT32 ea = EA_AY_DI_32(m68k); return m68ki_read_32(m68k, ea); } case 6: // (An) + (Xn) + d8 { UINT32 ea = EA_AY_IX_32(m68k); return m68ki_read_32(m68k, ea); } case 7: { switch (reg) { case 1: // (xxx).L { UINT32 d1 = OPER_I_16(m68k); UINT32 d2 = OPER_I_16(m68k); UINT32 ea = (d1 << 16) | d2; return m68ki_read_32(m68k, ea); } case 2: // (d16, PC) { UINT32 ea = EA_PCDI_32(m68k); return m68ki_read_32(m68k, ea); } case 4: // #<data> { return OPER_I_32(m68k); } default: fatalerror("MC68040: READ_EA_32: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC); } break; } default: fatalerror("MC68040: READ_EA_32: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC); } return 0; }
static UINT8 READ_EA_8(int ea) { int mode = (ea >> 3) & 0x7; int reg = (ea & 0x7); switch (mode) { case 0: // Dn { return REG_D[reg]; } case 5: // (d16, An) { UINT32 ea = EA_AY_DI_8(); return m68ki_read_8(ea); } case 6: // (An) + (Xn) + d8 { UINT32 ea = EA_AY_IX_8(); return m68ki_read_8(ea); } case 7: { switch (reg) { case 1: // (xxx).L { UINT32 d1 = OPER_I_16(); UINT32 d2 = OPER_I_16(); UINT32 ea = (d1 << 16) | d2; return m68ki_read_8(ea); } case 4: // #<data> { return OPER_I_8(); } default: fatalerror("MC68040: READ_EA_8: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC); } break; } default: fatalerror("MC68040: READ_EA_8: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC); } }
void m68040_fpu_op0(m68ki_cpu_core *m68k) { switch ((m68k->ir >> 6) & 0x3) { case 0: { UINT16 w2 = OPER_I_16(m68k); switch ((w2 >> 13) & 0x7) { case 0x0: // FPU ALU FP, FP case 0x2: // FPU ALU ea, FP { fpgen_rm_reg(m68k, w2); break; } case 0x3: // FMOVE FP, ea { fmove_reg_mem(m68k, w2); break; } case 0x4: // FMOVE ea, FPCR case 0x5: // FMOVE FPCR, ea { fmove_fpcr(m68k, w2); break; } case 0x6: // FMOVEM ea, list case 0x7: // FMOVEM list, ea { fmovem(m68k, w2); break; } default: fatalerror("m68040_fpu_op0: unimplemented subop %d at %08X\n", (w2 >> 13) & 0x7, REG_PC-4); } break; } case 2: // FBcc disp16 { fbcc16(m68k); break; } case 3: // FBcc disp32 { fbcc32(m68k); break; } default: fatalerror("m68040_fpu_op0: unimplemented main op %d\n", (m68k->ir >> 6) & 0x3); } }
static void fbcc16(m68ki_cpu_core *m68k) { INT32 offset; int condition = m68k->ir & 0x3f; offset = (INT16)(OPER_I_16(m68k)); // TODO: condition and jump!!! if (TEST_CONDITION(m68k, condition)) { m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */ m68ki_branch_16(m68k, offset-2); } m68k->remaining_cycles -= 7; }
static void fbcc(void) { INT32 disp; // int condition = REG_IR & 0x3f; int size = (REG_IR >> 6) & 0x1; if (size) // 32-bit displacement { disp = OPER_I_32(); } else { disp = (INT16)(OPER_I_16()); } // TODO: condition and jump!!! USE_CYCLES(7); }
static void WRITE_EA_32(m68ki_cpu_core *m68k, int ea, UINT32 data) { int mode = (ea >> 3) & 0x7; int reg = (ea & 0x7); switch (mode) { case 0: // Dn { REG_D[reg] = data; break; } case 2: // (An) { UINT32 ea = REG_A[reg]; m68ki_write_32(m68k, ea, data); break; } case 3: // (An)+ { UINT32 ea = EA_AY_PI_32(m68k); m68ki_write_32(m68k, ea, data); break; } case 4: // -(An) { UINT32 ea = EA_AY_PD_32(m68k); m68ki_write_32(m68k, ea, data); break; } case 5: // (d16, An) { UINT32 ea = EA_AY_DI_32(m68k); m68ki_write_32(m68k, ea, data); break; } case 6: // (An) + (Xn) + d8 { UINT32 ea = EA_AY_IX_32(m68k); m68ki_write_32(m68k, ea, data); break; } case 7: { switch (reg) { case 1: // (xxx).L { UINT32 d1 = OPER_I_16(m68k); UINT32 d2 = OPER_I_16(m68k); UINT32 ea = (d1 << 16) | d2; m68ki_write_32(m68k, ea, data); break; } case 2: // (d16, PC) { UINT32 ea = EA_PCDI_32(m68k); m68ki_write_32(m68k, ea, data); break; } default: fatalerror("MC68040: WRITE_EA_32: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC); } break; } default: fatalerror("MC68040: WRITE_EA_32: unhandled mode %d, reg %d, data %08X at %08X\n", mode, reg, data, REG_PC); } }
static void WRITE_EA_8(m68000_base_device *m68k, int ea, UINT8 data) { int mode = (ea >> 3) & 0x7; int reg = (ea & 0x7); switch (mode) { case 0: // Dn { REG_D(m68k)[reg] = data; break; } case 2: // (An) { UINT32 ea = REG_A(m68k)[reg]; m68ki_write_8(m68k, ea, data); break; } case 3: // (An)+ { UINT32 ea = EA_AY_PI_8(m68k); m68ki_write_8(m68k, ea, data); break; } case 4: // -(An) { UINT32 ea = EA_AY_PD_8(m68k); m68ki_write_8(m68k, ea, data); break; } case 5: // (d16, An) { UINT32 ea = EA_AY_DI_8(m68k); m68ki_write_8(m68k, ea, data); break; } case 6: // (An) + (Xn) + d8 { UINT32 ea = EA_AY_IX_8(m68k); m68ki_write_8(m68k, ea, data); break; } case 7: { switch (reg) { case 1: // (xxx).B { UINT32 d1 = OPER_I_16(m68k); UINT32 d2 = OPER_I_16(m68k); UINT32 ea = (d1 << 16) | d2; m68ki_write_8(m68k, ea, data); break; } case 2: // (d16, PC) { UINT32 ea = EA_PCDI_16(m68k); m68ki_write_8(m68k, ea, data); break; } default: fatalerror("M68kFPU: WRITE_EA_8: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC(m68k)); } break; } default: fatalerror("M68kFPU: WRITE_EA_8: unhandled mode %d, reg %d, data %08X at %08X\n", mode, reg, data, REG_PC(m68k)); } }
static UINT64 READ_EA_64(m68000_base_device *m68k, int ea) { int mode = (ea >> 3) & 0x7; int reg = (ea & 0x7); UINT32 h1, h2; switch (mode) { case 2: // (An) { UINT32 ea = REG_A(m68k)[reg]; h1 = m68ki_read_32(m68k, ea+0); h2 = m68ki_read_32(m68k, ea+4); return (UINT64)(h1) << 32 | (UINT64)(h2); } case 3: // (An)+ { UINT32 ea = REG_A(m68k)[reg]; REG_A(m68k)[reg] += 8; h1 = m68ki_read_32(m68k, ea+0); h2 = m68ki_read_32(m68k, ea+4); return (UINT64)(h1) << 32 | (UINT64)(h2); } case 4: // -(An) { UINT32 ea = REG_A(m68k)[reg]-8; REG_A(m68k)[reg] -= 8; h1 = m68ki_read_32(m68k, ea+0); h2 = m68ki_read_32(m68k, ea+4); return (UINT64)(h1) << 32 | (UINT64)(h2); } case 5: // (d16, An) { UINT32 ea = EA_AY_DI_32(m68k); h1 = m68ki_read_32(m68k, ea+0); h2 = m68ki_read_32(m68k, ea+4); return (UINT64)(h1) << 32 | (UINT64)(h2); } case 6: // (An) + (Xn) + d8 { UINT32 ea = EA_AY_IX_32(m68k); h1 = m68ki_read_32(m68k, ea+0); h2 = m68ki_read_32(m68k, ea+4); return (UINT64)(h1) << 32 | (UINT64)(h2); } case 7: { switch (reg) { case 1: // (xxx).L { UINT32 d1 = OPER_I_16(m68k); UINT32 d2 = OPER_I_16(m68k); UINT32 ea = (d1 << 16) | d2; return (UINT64)(m68ki_read_32(m68k, ea)) << 32 | (UINT64)(m68ki_read_32(m68k, ea+4)); } case 3: // (PC) + (Xn) + d8 { UINT32 ea = EA_PCIX_32(m68k); h1 = m68ki_read_32(m68k, ea+0); h2 = m68ki_read_32(m68k, ea+4); return (UINT64)(h1) << 32 | (UINT64)(h2); } case 4: // #<data> { h1 = OPER_I_32(m68k); h2 = OPER_I_32(m68k); return (UINT64)(h1) << 32 | (UINT64)(h2); } case 2: // (d16, PC) { UINT32 ea = EA_PCDI_32(m68k); h1 = m68ki_read_32(m68k, ea+0); h2 = m68ki_read_32(m68k, ea+4); return (UINT64)(h1) << 32 | (UINT64)(h2); } default: fatalerror("M68kFPU: READ_EA_64: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC(m68k)); } break; } default: fatalerror("M68kFPU: READ_EA_64: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC(m68k)); } return 0; }
static UINT16 READ_EA_16(m68000_base_device *m68k, int ea) { int mode = (ea >> 3) & 0x7; int reg = (ea & 0x7); switch (mode) { case 0: // Dn { return (UINT16)(REG_D(m68k)[reg]); } case 2: // (An) { UINT32 ea = REG_A(m68k)[reg]; return m68ki_read_16(m68k, ea); } case 3: // (An)+ { UINT32 ea = EA_AY_PI_16(m68k); return m68ki_read_16(m68k, ea); } case 4: // -(An) { UINT32 ea = EA_AY_PD_16(m68k); return m68ki_read_16(m68k, ea); } case 5: // (d16, An) { UINT32 ea = EA_AY_DI_16(m68k); return m68ki_read_16(m68k, ea); } case 6: // (An) + (Xn) + d8 { UINT32 ea = EA_AY_IX_16(m68k); return m68ki_read_16(m68k, ea); } case 7: { switch (reg) { case 0: // (xxx).W { UINT32 ea = (UINT32)OPER_I_16(m68k); return m68ki_read_16(m68k, ea); } case 1: // (xxx).L { UINT32 d1 = OPER_I_16(m68k); UINT32 d2 = OPER_I_16(m68k); UINT32 ea = (d1 << 16) | d2; return m68ki_read_16(m68k, ea); } case 2: // (d16, PC) { UINT32 ea = EA_PCDI_16(m68k); return m68ki_read_16(m68k, ea); } case 3: // (PC) + (Xn) + d8 { UINT32 ea = EA_PCIX_16(m68k); return m68ki_read_16(m68k, ea); } case 4: // #<data> { return OPER_I_16(m68k); } default: fatalerror("M68kFPU: READ_EA_16: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC(m68k)); } break; } default: fatalerror("M68kFPU: READ_EA_16: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC(m68k)); } return 0; }
static void WRITE_EA_64(m68000_base_device *m68k, int ea, UINT64 data) { int mode = (ea >> 3) & 0x7; int reg = (ea & 0x7); switch (mode) { case 2: // (An) { UINT32 ea = REG_A(m68k)[reg]; m68ki_write_32(m68k, ea, (UINT32)(data >> 32)); m68ki_write_32(m68k, ea+4, (UINT32)(data)); break; } case 3: // (An)+ { UINT32 ea = REG_A(m68k)[reg]; REG_A(m68k)[reg] += 8; m68ki_write_32(m68k, ea+0, (UINT32)(data >> 32)); m68ki_write_32(m68k, ea+4, (UINT32)(data)); break; } case 4: // -(An) { UINT32 ea; REG_A(m68k)[reg] -= 8; ea = REG_A(m68k)[reg]; m68ki_write_32(m68k, ea+0, (UINT32)(data >> 32)); m68ki_write_32(m68k, ea+4, (UINT32)(data)); break; } case 5: // (d16, An) { UINT32 ea = EA_AY_DI_32(m68k); m68ki_write_32(m68k, ea+0, (UINT32)(data >> 32)); m68ki_write_32(m68k, ea+4, (UINT32)(data)); break; } case 6: // (An) + (Xn) + d8 { UINT32 ea = EA_AY_IX_32(m68k); m68ki_write_32(m68k, ea+0, (UINT32)(data >> 32)); m68ki_write_32(m68k, ea+4, (UINT32)(data)); break; } case 7: { switch (reg) { case 1: // (xxx).L { UINT32 d1 = OPER_I_16(m68k); UINT32 d2 = OPER_I_16(m68k); UINT32 ea = (d1 << 16) | d2; m68ki_write_32(m68k, ea+0, (UINT32)(data >> 32)); m68ki_write_32(m68k, ea+4, (UINT32)(data)); break; } case 2: // (d16, PC) { UINT32 ea = EA_PCDI_32(m68k); m68ki_write_32(m68k, ea+0, (UINT32)(data >> 32)); m68ki_write_32(m68k, ea+4, (UINT32)(data)); break; } default: fatalerror("M68kFPU: WRITE_EA_64: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC(m68k)); } break; } default: fatalerror("M68kFPU: WRITE_EA_64: unhandled mode %d, reg %d, data %08X%08X at %08X\n", mode, reg, (UINT32)(data >> 32), (UINT32)(data), REG_PC(m68k)); } }