void m58846_device::execute_one() { // handle one opcode switch (m_op & 0x1f0) { case 0x30: op_sey(); break; case 0x70: op_sp(); break; case 0xa0: op_a(); break; case 0xb0: op_la(); break; case 0xc0: case 0xd0: case 0xe0: case 0xf0: op_lxy(); break; default: switch (m_op & 0x1fc) { case 0x20: op_szb(); break; case 0x4c: op_sb(); break; case 0x58: op_szk(); break; case 0x5c: op_rb(); break; case 0x60: op_xam(); break; case 0x64: op_tam(); break; case 0x68: op_xamd(); break; case 0x6c: op_xami(); break; default: switch (m_op) { case 0x06: case 0x07: op_su(); break; case 0x40: case 0x41: op_lcps(); break; case 0x4a: case 0x4b: op_lz(); break; case 0x54: case 0x55: op_ias(); break; case 0x00: op_nop(); break; case 0x01: op_ba(); break; case 0x02: op_iny(); break; case 0x03: op_dey(); break; case 0x04: op_di(); break; case 0x05: op_ei(); break; case 0x09: op_tabe(); break; // undocumented case 0x0a: op_am(); break; case 0x0b: op_ose(); break; case 0x0c: op_tya(); break; case 0x0f: op_cma(); break; case 0x10: op_cls(); break; case 0x11: op_clds(); break; case 0x13: op_cld(); break; case 0x14: op_rd(); break; case 0x15: op_sd(); break; case 0x16: op_tepa(); break; case 0x17: op_ospa(); break; case 0x18: op_rl(); break; // undocumented case 0x19: op_rr(); break; // undocumented case 0x1a: op_teab(); break; case 0x1b: op_osab(); break; case 0x1c: op_tba(); break; case 0x1d: op_tay(); break; case 0x1e: op_tab(); break; case 0x26: op_seam(); break; case 0x2b: op_szd(); break; case 0x2f: op_szc(); break; case 0x43: op_amc(); break; case 0x44: op_rt(); break; case 0x45: op_rts(); break; case 0x46: op_rti(); break; case 0x48: op_rc(); break; case 0x49: op_sc(); break; case 0x53: op_amcs(); break; case 0x57: op_iak(); break; case 0x81: op_ofa(); break; case 0x82: op_snz1(); break; case 0x83: op_snz2(); break; case 0x84: op_oga(); break; case 0x85: op_t2ab(); break; case 0x86: op_tva(); break; case 0x8a: op_tab2(); break; case 0x8c: op_iaf(); break; default: melps4_cpu_device::execute_one(); break; } break; // 0x1ff } break; // 0x1fc } // big switch }
void amis2000_base_device::execute_run() { while (m_icount > 0) { m_icount--; // remember previous opcode m_prev_op = m_op; debugger_instruction_hook(this, m_pc); m_op = m_program->read_byte(m_pc); m_pc = (m_pc + 1) & 0x1fff; if (m_skip) { // always skip over PP prefix m_skip = ((m_op & 0xf0) == 0x60); m_op = 0; // nop } switch (m_op & 0xf0) { case 0x50: op_adis(); break; case 0x60: op_pp(); break; case 0x70: op_lai(); break; case 0x80: case 0x90: case 0xa0: case 0xb0: op_jms(); break; case 0xc0: case 0xd0: case 0xe0: case 0xf0: op_jmp(); break; default: switch (m_op) { case 0x00: op_nop(); break; case 0x01: op_halt(); break; case 0x02: op_rt(); break; case 0x03: op_rts(); break; case 0x04: op_psh(); break; case 0x05: op_psl(); break; case 0x06: op_and(); break; case 0x07: op_sos(); break; case 0x08: op_sbe(); break; case 0x09: op_szc(); break; case 0x0a: op_stc(); break; case 0x0b: op_rsc(); break; case 0x0c: op_lae(); break; case 0x0d: op_xae(); break; case 0x0e: op_inp(); break; case 0x0f: op_eur(); break; case 0x10: op_cma(); break; case 0x11: op_xabu(); break; case 0x12: op_lab(); break; case 0x13: op_xab(); break; case 0x14: op_adcs(); break; case 0x15: op_xor(); break; case 0x16: op_add(); break; case 0x17: op_sam(); break; case 0x18: op_disb(); break; case 0x19: op_mvs(); break; case 0x1a: op_out(); break; case 0x1b: op_disn(); break; case 0x28: op_szk(); break; case 0x29: op_szi(); break; case 0x2a: op_rf1(); break; case 0x2b: op_sf1(); break; case 0x2c: op_rf2(); break; case 0x2d: op_sf2(); break; case 0x2e: op_tf1(); break; case 0x2f: op_tf2(); break; default: switch (m_op & 0xfc) { case 0x1c: op_szm(); break; case 0x20: op_stm(); break; case 0x24: op_rsm(); break; case 0x30: op_xci(); break; case 0x34: op_xcd(); break; case 0x38: op_xc(); break; case 0x3c: op_lam(); break; case 0x40: op_lbz(); break; case 0x44: op_lbf(); break; case 0x48: op_lbe(); break; case 0x4c: op_lbep(); break; } break; // 0xfc } break; // 0xff } // big switch } }
void CPU::op_exec() { uint8 opcode = op_readpci(); switch(opcode) { case 0x00: return op_brk(); case 0x01: return opi_read_indirect_zero_page_x<&CPU::opf_ora>(); I case 0x04: return opill_nop_zero_page(); case 0x05: return opi_read_zero_page<&CPU::opf_ora>(); case 0x06: return opi_rmw_zero_page<&CPU::opf_asl>(); case 0x08: return op_php(); case 0x09: return opi_read_immediate<&CPU::opf_ora>(); case 0x0a: return opi_shift<&CPU::opf_sla>(); I case 0x0c: return opill_nop_absolute(); case 0x0d: return opi_read_absolute<&CPU::opf_ora>(); case 0x0e: return opi_rmw_absolute<&CPU::opf_asl>(); case 0x10: return opi_branch(regs.p.n == 0); case 0x11: return opi_read_indirect_zero_page_y<&CPU::opf_ora>(); I case 0x14: return opill_nop_zero_page_x(); case 0x15: return opi_read_zero_page_x<&CPU::opf_ora>(); case 0x16: return opi_rmw_zero_page_x<&CPU::opf_asl>(); case 0x18: return opi_clear_flag(regs.p.c); case 0x19: return opi_read_absolute_y<&CPU::opf_ora>(); I case 0x1a: return opill_nop_implied(); I case 0x1c: return opill_nop_absolute_x(); case 0x1d: return opi_read_absolute_x<&CPU::opf_ora>(); case 0x1e: return opi_rmw_absolute_x<&CPU::opf_asl>(); case 0x20: return op_jsr_absolute(); case 0x21: return opi_read_indirect_zero_page_x<&CPU::opf_and>(); case 0x24: return opi_read_zero_page<&CPU::opf_bit>(); case 0x25: return opi_read_zero_page<&CPU::opf_and>(); case 0x26: return opi_rmw_zero_page<&CPU::opf_rol>(); case 0x28: return op_plp(); case 0x29: return opi_read_immediate<&CPU::opf_and>(); case 0x2a: return opi_shift<&CPU::opf_rla>(); case 0x2c: return opi_read_absolute<&CPU::opf_bit>(); case 0x2d: return opi_read_absolute<&CPU::opf_and>(); case 0x2e: return opi_rmw_absolute<&CPU::opf_rol>(); case 0x30: return opi_branch(regs.p.n == 1); case 0x31: return opi_read_indirect_zero_page_y<&CPU::opf_and>(); I case 0x34: return opill_nop_zero_page_x(); case 0x35: return opi_read_zero_page_x<&CPU::opf_and>(); case 0x36: return opi_rmw_zero_page_x<&CPU::opf_rol>(); case 0x38: return opi_set_flag(regs.p.c); case 0x39: return opi_read_absolute_y<&CPU::opf_and>(); I case 0x3a: return opill_nop_implied(); I case 0x3c: return opill_nop_absolute_x(); case 0x3d: return opi_read_absolute_x<&CPU::opf_and>(); case 0x3e: return opi_rmw_absolute_x<&CPU::opf_rol>(); case 0x40: return op_rti(); case 0x41: return opi_read_indirect_zero_page_x<&CPU::opf_eor>(); I case 0x44: return opill_nop_zero_page(); case 0x45: return opi_read_zero_page<&CPU::opf_eor>(); case 0x46: return opi_rmw_zero_page<&CPU::opf_lsr>(); case 0x48: return opi_push(regs.a); case 0x49: return opi_read_immediate<&CPU::opf_eor>(); case 0x4a: return opi_shift<&CPU::opf_sra>(); case 0x4c: return op_jmp_absolute(); case 0x4d: return opi_read_absolute<&CPU::opf_eor>(); case 0x4e: return opi_rmw_absolute<&CPU::opf_lsr>(); case 0x50: return opi_branch(regs.p.v == 0); case 0x51: return opi_read_indirect_zero_page_y<&CPU::opf_eor>(); I case 0x54: return opill_nop_zero_page_x(); case 0x55: return opi_read_zero_page_x<&CPU::opf_eor>(); case 0x56: return opi_rmw_zero_page_x<&CPU::opf_lsr>(); case 0x58: return opi_clear_flag(regs.p.i); case 0x59: return opi_read_absolute_y<&CPU::opf_eor>(); I case 0x5a: return opill_nop_implied(); I case 0x5c: return opill_nop_absolute_x(); case 0x5d: return opi_read_absolute_x<&CPU::opf_eor>(); case 0x5e: return opi_rmw_absolute_x<&CPU::opf_lsr>(); case 0x60: return op_rts(); case 0x61: return opi_read_indirect_zero_page_x<&CPU::opf_adc>(); I case 0x64: return opill_nop_zero_page(); case 0x65: return opi_read_zero_page<&CPU::opf_adc>(); case 0x66: return opi_rmw_zero_page<&CPU::opf_ror>(); case 0x68: return opi_pull(regs.a); case 0x69: return opi_read_immediate<&CPU::opf_adc>(); case 0x6a: return opi_shift<&CPU::opf_rra>(); I case 0x6b: return opill_arr_immediate(); case 0x6c: return op_jmp_indirect_absolute(); case 0x6d: return opi_read_absolute<&CPU::opf_adc>(); case 0x6e: return opi_rmw_absolute<&CPU::opf_ror>(); case 0x70: return opi_branch(regs.p.v == 1); I case 0x74: return opill_nop_zero_page_x(); case 0x71: return opi_read_indirect_zero_page_y<&CPU::opf_adc>(); case 0x75: return opi_read_zero_page_x<&CPU::opf_adc>(); case 0x76: return opi_rmw_zero_page_x<&CPU::opf_ror>(); case 0x78: return opi_set_flag(regs.p.i); case 0x79: return opi_read_absolute_y<&CPU::opf_adc>(); I case 0x7a: return opill_nop_implied(); I case 0x7c: return opill_nop_absolute_x(); case 0x7d: return opi_read_absolute_x<&CPU::opf_adc>(); case 0x7e: return opi_rmw_absolute_x<&CPU::opf_ror>(); I case 0x80: return opill_nop_absolute(); case 0x81: return opi_store_indirect_zero_page_x(regs.a); I case 0x82: return opill_nop_immediate(); case 0x84: return opi_store_zero_page(regs.y); case 0x85: return opi_store_zero_page(regs.a); case 0x86: return opi_store_zero_page(regs.x); case 0x88: return opi_decrement(regs.y); I case 0x89: return opill_nop_immediate(); case 0x8a: return opi_transfer(regs.x, regs.a, 1); case 0x8c: return opi_store_absolute(regs.y); case 0x8d: return opi_store_absolute(regs.a); case 0x8e: return opi_store_absolute(regs.x); case 0x90: return opi_branch(regs.p.c == 0); case 0x91: return opi_store_indirect_zero_page_y(regs.a); case 0x94: return opi_store_zero_page_x(regs.y); case 0x95: return opi_store_zero_page_x(regs.a); case 0x96: return opi_store_zero_page_y(regs.x); case 0x98: return opi_transfer(regs.y, regs.a, 1); case 0x99: return opi_store_absolute_y(regs.a); case 0x9a: return opi_transfer(regs.x, regs.s, 0); case 0x9d: return opi_store_absolute_x(regs.a); case 0xa0: return opi_read_immediate<&CPU::opf_ldy>(); case 0xa1: return opi_read_indirect_zero_page_x<&CPU::opf_lda>(); case 0xa2: return opi_read_immediate<&CPU::opf_ldx>(); case 0xa4: return opi_read_zero_page<&CPU::opf_ldy>(); case 0xa5: return opi_read_zero_page<&CPU::opf_lda>(); case 0xa6: return opi_read_zero_page<&CPU::opf_ldx>(); case 0xa8: return opi_transfer(regs.a, regs.y, 1); case 0xa9: return opi_read_immediate<&CPU::opf_lda>(); case 0xaa: return opi_transfer(regs.a, regs.x, 1); case 0xac: return opi_read_absolute<&CPU::opf_ldy>(); case 0xad: return opi_read_absolute<&CPU::opf_lda>(); case 0xae: return opi_read_absolute<&CPU::opf_ldx>(); case 0xb0: return opi_branch(regs.p.c == 1); case 0xb1: return opi_read_indirect_zero_page_y<&CPU::opf_lda>(); case 0xb4: return opi_read_zero_page_x<&CPU::opf_ldy>(); case 0xb5: return opi_read_zero_page_x<&CPU::opf_lda>(); case 0xb6: return opi_read_zero_page_y<&CPU::opf_ldx>(); case 0xb8: return opi_clear_flag(regs.p.v); case 0xb9: return opi_read_absolute_y<&CPU::opf_lda>(); case 0xba: return opi_transfer(regs.s, regs.x, 1); case 0xbc: return opi_read_absolute_x<&CPU::opf_ldy>(); case 0xbd: return opi_read_absolute_x<&CPU::opf_lda>(); case 0xbe: return opi_read_absolute_y<&CPU::opf_ldx>(); case 0xc0: return opi_read_immediate<&CPU::opf_cpy>(); case 0xc1: return opi_read_indirect_zero_page_x<&CPU::opf_cmp>(); I case 0xc2: return opill_nop_immediate(); case 0xc4: return opi_read_zero_page<&CPU::opf_cpy>(); case 0xc5: return opi_read_zero_page<&CPU::opf_cmp>(); case 0xc6: return opi_rmw_zero_page<&CPU::opf_dec>(); case 0xc8: return opi_increment(regs.y); case 0xc9: return opi_read_immediate<&CPU::opf_cmp>(); case 0xca: return opi_decrement(regs.x); case 0xcc: return opi_read_absolute<&CPU::opf_cpy>(); case 0xcd: return opi_read_absolute<&CPU::opf_cmp>(); case 0xce: return opi_rmw_absolute<&CPU::opf_dec>(); case 0xd0: return opi_branch(regs.p.z == 0); case 0xd1: return opi_read_indirect_zero_page_y<&CPU::opf_cmp>(); I case 0xd4: return opill_nop_zero_page_x(); case 0xd5: return opi_read_zero_page_x<&CPU::opf_cmp>(); case 0xd6: return opi_rmw_zero_page_x<&CPU::opf_dec>(); case 0xd8: return opi_clear_flag(regs.p.d); case 0xd9: return opi_read_absolute_y<&CPU::opf_cmp>(); I case 0xda: return opill_nop_implied(); I case 0xdc: return opill_nop_absolute_x(); case 0xdd: return opi_read_absolute_x<&CPU::opf_cmp>(); case 0xde: return opi_rmw_absolute_x<&CPU::opf_dec>(); case 0xe0: return opi_read_immediate<&CPU::opf_cpx>(); case 0xe1: return opi_read_indirect_zero_page_x<&CPU::opf_sbc>(); I case 0xe2: return opill_nop_immediate(); case 0xe4: return opi_read_zero_page<&CPU::opf_cpx>(); case 0xe5: return opi_read_zero_page<&CPU::opf_sbc>(); case 0xe6: return opi_rmw_zero_page<&CPU::opf_inc>(); case 0xe8: return opi_increment(regs.x); case 0xe9: return opi_read_immediate<&CPU::opf_sbc>(); case 0xea: return op_nop(); I case 0xeb: return opi_read_immediate<&CPU::opf_sbc>(); case 0xec: return opi_read_absolute<&CPU::opf_cpx>(); case 0xed: return opi_read_absolute<&CPU::opf_sbc>(); case 0xee: return opi_rmw_absolute<&CPU::opf_inc>(); case 0xf0: return opi_branch(regs.p.z == 1); case 0xf1: return opi_read_indirect_zero_page_y<&CPU::opf_sbc>(); I case 0xf4: return opill_nop_zero_page_x(); case 0xf5: return opi_read_zero_page_x<&CPU::opf_sbc>(); case 0xf6: return opi_rmw_zero_page_x<&CPU::opf_inc>(); case 0xf8: return opi_set_flag(regs.p.d); case 0xf9: return opi_read_absolute_y<&CPU::opf_sbc>(); I case 0xfa: return opill_nop_implied(); I case 0xfc: return opill_nop_absolute_x(); case 0xfd: return opi_read_absolute_x<&CPU::opf_sbc>(); case 0xfe: return opi_rmw_absolute_x<&CPU::opf_inc>(); } //return op_nop(); regs.pc--; print("Unimplemented opcode: ", hex<4>(regs.pc), " = ", hex<2>(bus.read(regs.pc)), "\n"); while(true) scheduler.exit(Scheduler::ExitReason::UnknownEvent); }
void ucom4_cpu_device::execute_run() { while (m_icount > 0) { m_icount--; // remember previous opcode m_prev_op = m_op; // handle interrupt - it not accepted during LI($9x) or EI($31), or while skipping if (m_int_f && m_inte_f && (m_prev_op & 0xf0) != 0x90 && m_prev_op != 0x31 && !m_skip) { m_icount--; push_stack(); m_pc = 0xf << 2; m_int_f = 0; m_inte_f = (m_family == NEC_UCOM43) ? 0 : 1; standard_irq_callback(0); } // fetch next opcode debugger_instruction_hook(this, m_pc); m_op = m_program->read_byte(m_pc); m_bitmask = 1 << (m_op & 0x03); increment_pc(); fetch_arg(); if (m_skip) { m_skip = false; m_op = 0; // nop } // handle opcode switch (m_op & 0xf0) { case 0x80: op_ldz(); break; case 0x90: op_li(); break; case 0xa0: op_jmpcal(); break; case 0xb0: op_czp(); break; case 0xc0: case 0xd0: case 0xe0: case 0xf0: op_jcp(); break; default: switch (m_op) { case 0x00: op_nop(); break; case 0x01: op_di(); break; case 0x02: op_s(); break; case 0x03: op_tit(); break; case 0x04: op_tc(); break; case 0x05: op_ttm(); break; case 0x06: op_daa(); break; case 0x07: op_tal(); break; case 0x08: op_ad(); break; case 0x09: op_ads(); break; case 0x0a: op_das(); break; case 0x0b: op_clc(); break; case 0x0c: op_cm(); break; case 0x0d: op_inc(); break; case 0x0e: op_op(); break; case 0x0f: op_dec(); break; case 0x10: op_cma(); break; case 0x11: op_cia(); break; case 0x12: op_tla(); break; case 0x13: op_ded(); break; case 0x14: op_stm(); break; case 0x15: op_ldi(); break; case 0x16: op_cli(); break; case 0x17: op_ci(); break; case 0x18: op_exl(); break; case 0x19: op_adc(); break; case 0x1a: op_xc(); break; case 0x1b: op_stc(); break; case 0x1c: op_illegal(); break; case 0x1d: op_inm(); break; case 0x1e: op_ocd(); break; case 0x1f: op_dem(); break; case 0x30: op_rar(); break; case 0x31: op_ei(); break; case 0x32: op_ip(); break; case 0x33: op_ind(); break; case 0x40: op_ia(); break; case 0x41: op_jpa(); break; case 0x42: op_taz(); break; case 0x43: op_taw(); break; case 0x44: op_oe(); break; case 0x45: op_illegal(); break; case 0x46: op_tly(); break; case 0x47: op_thx(); break; case 0x48: op_rt(); break; case 0x49: op_rts(); break; case 0x4a: op_xaz(); break; case 0x4b: op_xaw(); break; case 0x4c: op_xls(); break; case 0x4d: op_xhr(); break; case 0x4e: op_xly(); break; case 0x4f: op_xhx(); break; default: switch (m_op & 0xfc) { case 0x20: op_fbf(); break; case 0x24: op_tab(); break; case 0x28: op_xm(); break; case 0x2c: op_xmd(); break; case 0x34: op_cmb(); break; case 0x38: op_lm(); break; case 0x3c: op_xmi(); break; case 0x50: op_tpb(); break; case 0x54: op_tpa(); break; case 0x58: op_tmb(); break; case 0x5c: op_fbt(); break; case 0x60: op_rpb(); break; case 0x64: op_reb(); break; case 0x68: op_rmb(); break; case 0x6c: op_rfb(); break; case 0x70: op_spb(); break; case 0x74: op_seb(); break; case 0x78: op_smb(); break; case 0x7c: op_sfb(); break; } break; // 0xfc } break; // 0xff } // big switch } }