diff options
author | 2024-07-26 13:09:30 +0100 | |
---|---|---|
committer | 2024-07-26 08:09:30 -0400 | |
commit | a1b2974ec91402e5e55d2f179abc850da8b49178 (patch) | |
tree | 88a199fff625e6b471d375566afd60ed4c25c298 /src/devices/cpu/xa/xa.h | |
parent | 5b75406475dff5cb4a1133abecc610de8788476e (diff) |
cpu/xa: CPU core work for fearless/superkds - adds sound, promotes to working (#12617)
* This adds basic execution to XA core. It emulates enough of the XA to give fearless and superkds working sound.
* only the exact forms of the opcodes used so far have been implemented
* no optimizations have been done, use of const, inline use, templates etc. are planned for a future update; code is still primed for debugging and development
* overall structure, code style are not 100% final (see above) and will be adjusted as the CPU is better understood
* peripherals, interrupts etc. are not yet fully implemented, nor is anything outside of the page zero mode used here due to lack of test cases
Machines Promoted to WORKING
----------------------------------
Super Kids (S019CN) [David Haywood, XingXing]
Fearless Pinocchio (V101US) [David Haywood, XingXing, Peter Wilhelmsen, rtw]
---------
Co-authored-by: David Haywood <hazemamewip@hotmail.com>
Diffstat (limited to 'src/devices/cpu/xa/xa.h')
-rw-r--r-- | src/devices/cpu/xa/xa.h | 926 |
1 files changed, 921 insertions, 5 deletions
diff --git a/src/devices/cpu/xa/xa.h b/src/devices/cpu/xa/xa.h index 983fff36724..3fbf7a3cb92 100644 --- a/src/devices/cpu/xa/xa.h +++ b/src/devices/cpu/xa/xa.h @@ -6,13 +6,54 @@ #pragma once -class xa_cpu_device : public cpu_device +enum { + XA_EXT_IRQ0, + XA_EXT_IRQ1, + XA_EXT_IRQ2, + XA_EXT_IRQ3, +}; + +enum { + XA_BANK0_R0, + XA_BANK0_R1, + XA_BANK0_R2, + XA_BANK0_R3, + + XA_BANK1_R0, + XA_BANK1_R1, + XA_BANK1_R2, + XA_BANK1_R3, + + XA_BANK2_R0, + XA_BANK2_R1, + XA_BANK2_R2, + XA_BANK2_R3, + + XA_BANK3_R0, + XA_BANK3_R1, + XA_BANK3_R2, + XA_BANK3_R3, + + XA_R4, + XA_R5, + XA_R6, + XA_R7, + + XA_USP, + XA_SSP, +}; + + +class xa_cpu : public cpu_device { public: - xa_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + xa_cpu(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + template <unsigned N> auto port_in_cb() { return m_port_in_cb[N].bind(); } + template <unsigned N> auto port_out_cb() { return m_port_out_cb[N].bind(); } protected: - xa_cpu_device(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock, address_map_constructor prg_map); + xa_cpu(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock, address_map_constructor prg_map, address_map_constructor dat_map); virtual void device_start() override; virtual void device_reset() override; @@ -21,6 +62,7 @@ protected: virtual uint32_t execute_max_cycles() const noexcept override { return 5; } virtual uint32_t execute_input_lines() const noexcept override { return 0; } virtual void execute_run() override; + virtual void execute_set_input(int inputnum, int state) override; virtual space_config_vector memory_space_config() const override; @@ -28,26 +70,900 @@ protected: private: void internal_map(address_map &map); + void internal_data_map(address_map &map); + void data_map(address_map &map); + void sfr_map(address_map &map); address_space_config m_program_config; + address_space_config m_data_config; + address_space_config m_sfr_config; + + struct mem_info { + int addr; + const char *name; + }; + + + static const mem_info default_names[]; + void add_names(const mem_info *info); + + std::string get_data_address(u16 arg) const; + + typedef void (xa_cpu::*op_func) (u8 op); + static const op_func s_instruction[256]; + + const char* m_regnames16[16] = { "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", "illegal", "illegal", "illegal", "illegal", "illegal", "illegal", "illegal", "illegal" }; + const char* m_regnames8[16] = { "R0L", "R0H", "R1L", "R1H", "R2L", "R2H", "R3L", "R3H", "R4L", "R4H", "R5L", "R5H", "R6L", "R6H", "R7L", "R7H"}; + + std::string get_bittext(int bit); + std::string get_directtext(int bit); + std::string show_expanded_data4(u16 data4, int size); + std::string get_word_reglist(u8 op2); + std::string get_byte_reglist(u8 op2, int h); + + void check_external_irq_level(int level); + void check_interrupts(); + + u16 expand_rel16(u16 rel16); + u16 expand_rel8(u8 rel8); + + void cy(u8 cycles) + { + m_icount -= cycles; + } + + void do_nz_flags_16(u16 data); + void do_nz_flags_8(u8 data); + + u8 get_n_flag() { return m_nflag; } + void set_n_flag() { m_nflag = 1; } + void clear_n_flag() { m_nflag = 0; } + + u8 get_z_flag() { return m_zflag; } + void set_z_flag() { m_zflag = 1; } + void clear_z_flag() { m_zflag = 0; } + + u8 get_c_flag() { return m_cflag; } + void set_c_flag() { m_cflag = 1; } + void clear_c_flag() { m_cflag = 0; } + + u8 get_v_flag() { return m_vflag; } + void set_v_flag() { m_vflag = 1; } + void clear_v_flag() { m_vflag = 0; } + + u8 get_ac_flag() { return m_acflag; } + void set_ac_flag() { m_acflag = 1; } + void clear_ac_flag() { m_acflag = 0; } + + + u8 gr8(int reg); + void sr8(int reg, u8 data); + + u16 gr16(int reg); + void sr16(int reg, u16 data); + + u32 gr32(int reg); + void sr32(int reg, u32 data); + + void set_pc_in_current_page(u16 addr); + + void push_word_reglist(u8 op2, int h, bool force_user); + void pull_word_reglist(u8 op2, int h, bool force_user); + void push_byte_reglist(u8 op2, int h, bool force_user); + void pull_byte_reglist(u8 op2, int h, bool force_user); + + void push_word_to_user_stack(u16 data); + void push_word_to_system_stack(u16 data); + void push_word_to_stack(u16 data); + + u16 pull_word_from_user_stack(); + u16 pull_word_from_system_stack(); + u16 pull_word_from_stack(); + + void push_byte_to_user_stack(u8 data); + void push_byte_to_system_stack(u8 data); + void push_byte_to_stack(u16 data); + + u8 pull_byte_from_user_stack(); + u8 pull_byte_from_system_stack(); + u8 pull_byte_from_stack(); + + void wdat8(int address, u8 data); + void wdat16(int address, u16 data); + + u8 rdat8(int address); + u16 rdat16(int address); + + u8 sfr_WDCON_r(); + + u8 sfr_PSWL_r(); + void sfr_PSWL_w(u8 data); + + u8 sfr_PSWH_r(); + void sfr_PSWH_w(u8 data); + void sfr_PSW51_w(u8 data); + + void sfr_SCR_w(u8 data); + void sfr_WFEED1_w(u8 data); + void sfr_WFEED2_w(u8 data); + + u8 sfr_IEL_r(); + void sfr_IEL_w(u8 data); + + u8 sfr_port_r(offs_t offset); + void sfr_port_w(offs_t offset, u8 data); + + u8 sfr_PxCFGA_r(offs_t offset); + void sfr_PxCFGA_w(offs_t offset, u8 data); + + u8 sfr_PxCFGB_r(offs_t offset); + void sfr_PxCFGB_w(offs_t offset, u8 data); + + void set_bit_8_helper(u16 bit, u8 val); + + u32 asl32_helper(u32 fullreg, u8 amount); + u32 lsr32_helper(u32 fullreg, u8 amount); + u16 lsr16_helper(u16 fullreg, u8 amount); + + u8 read_direct8(u16 addr); + u16 read_direct16(u16 addr); + + void write_direct8(u16 addr, u8 data); + void write_direct16(u16 addr, u16 data); + + u16 do_subb_16(u16 val1, u16 val2); + u16 do_sub_16(u16 val1, u16 val2); + u16 do_sub_16_helper(u16 val1, u16 val2, u8 c); + + u16 do_addc_16(u16 val1, u16 val2); + u16 do_add_16(u16 val1, u16 val2); + u16 do_add_16_helper(u16 val1, u16 val2, u8 c); + + u16 do_xor_16(u16 val1, u16 val2); + u16 do_or_16(u16 val1, u16 val2); + u16 do_and_16(u16 val1, u16 val2); + + u8 do_sub_8(u8 val1, u8 val2); + u8 do_subb_8(u8 val1, u8 val2); + u8 do_sub_8_helper(u8 val1, u8 val2, u8 c); + + u8 do_add_8(u8 val1, u8 val2); + u8 do_addc_8(u8 val1, u8 val2); + u8 do_add_8_helper(u8 val1, u8 val2, u8 c); + + u8 do_xor_8(u8 val1, u8 val2); + u8 do_or_8(u8 val1, u8 val2); + u8 do_and_8(u8 val1, u8 val2); + + u8 do_cjne_8_helper(u8 val1, u8 val2); + + void handle_alu_type0(u8 op, int alu_op); + void handle_alu_type1(u8 op, u8 op2); + void handle_push_rlist(u8 op); + void handle_pushu_rlist(u8 op); + void handle_pop_rlist(u8 op); + void handle_popu_rlist(u8 op); + void handle_adds_movs(u8 op, int which); + void handle_shift(u8 op, int shift_type); + + void e_illegal(u8 op); + + void e_nop(u8 op); + void e_bitgroup(u8 op); + void e_add(u8 op); + void e_push_rlist(u8 op); + void e_addc(u8 op); + void e_pushu_rlist(u8 op); + void e_sub(u8 op); + void e_pop_rlist(u8 op); + void e_subb(u8 op); + void e_popu_rlist(u8 op); + void e_lea_offset8(u8 op); + void e_lea_offset16(u8 op); + void e_cmp(u8 op); + void e_xch_type1(u8 op); + void e_and(u8 op); + void e_xch_type2(u8 op); + void e_or(u8 op); + void e_xor(u8 op); + void e_movc_rd_rsinc(u8 op); + void e_mov(u8 op); + void e_pushpop_djnz_subgroup(u8 op); + void e_g9_subgroup(u8 op); + void e_alu(u8 op); + void e_jb_mov_subgroup(u8 op); + void e_movdir(u8 op); + void e_adds(u8 op); + void e_movx_subgroup(u8 op); + void e_rr(u8 op); + void e_movs(u8 op); + void e_rrc(u8 op); + void e_lsr_fc(u8 op); + void e_asl_c(u8 op); + void e_asr_c(u8 op); + void e_norm(u8 op); + void e_lsr_fj(u8 op); + void e_asl_j(u8 op); + void e_asr_j(u8 op); + void e_rl(u8 op); + void e_rlc(u8 op); + void e_djnz_cjne(u8 op); + void e_mulu_b(u8 op); + void e_divu_b(u8 op); + void e_mulu_w(u8 op); + void e_divu_w(u8 op); + void e_mul_w(u8 op); + void e_div_w(u8 op); + void e_div_data8(u8 op); + void e_div_d16(u8 op); + void e_divu_d(u8 op); + void e_div_d(u8 op); + void e_cjne_d8(u8 op); + void e_cjne_d16(u8 op); + void e_jz_rel8(u8 op); + void e_jnz_rel8(u8 op); + void e_branch(u8 op); + void e_bkpt(u8 op); + + void do_nop(); + + void add_byte_rd_data8(u8 rd, u8 data8); + void addc_byte_rd_data8(u8 rd, u8 data8); + void sub_byte_rd_data8(u8 rd, u8 data8); + void subb_byte_rd_data8(u8 rd, u8 data8); + void cmp_byte_rd_data8(u8 rd, u8 data8); + void and_byte_rd_data8(u8 rd, u8 data8); + void or_byte_rd_data8(u8 rd, u8 data8); + void xor_byte_rd_data8(u8 rd, u8 data8); + void mov_byte_rd_data8(u8 rd, u8 data8); + + void add_byte_indrd_data8(u8 rd, u8 data8); + void addc_byte_indrd_data8(u8 rd, u8 data8); + void sub_byte_indrd_data8(u8 rd, u8 data8); + void subb_byte_indrd_data8(u8 rd, u8 data8); + void cmp_byte_indrd_data8(u8 rd, u8 data8); + void and_byte_indrd_data8(u8 rd, u8 data8); + void or_byte_indrd_data8(u8 rd, u8 data8); + void xor_byte_indrd_data8(u8 rd, u8 data8); + void mov_byte_indrd_data8(u8 rd, u8 data8); + + void add_byte_indrdinc_data8(u8 rd, u8 data8); + void addc_byte_indrdinc_data8(u8 rd, u8 data8); + void sub_byte_indrdinc_data8(u8 rd, u8 data8); + void subb_byte_indrdinc_data8(u8 rd, u8 data8); + void cmp_byte_indrdinc_data8(u8 rd, u8 data8); + void and_byte_indrdinc_data8(u8 rd, u8 data8); + void or_byte_indrdinc_data8(u8 rd, u8 data8); + void xor_byte_indrdinc_data8(u8 rd, u8 data8); + void mov_byte_indrdinc_data8(u8 rd, u8 data8); + + void add_byte_indrdoff8_data8(u8 rd, u8 offset8, u8 data8); + void addc_byte_indrdoff8_data8(u8 rd, u8 offset8, u8 data8); + void sub_byte_indrdoff8_data8(u8 rd, u8 offset8, u8 data8); + void subb_byte_indrdoff8_data8(u8 rd, u8 offset8, u8 data8); + void cmp_byte_indrdoff8_data8(u8 rd, u8 offset8, u8 data8); + void and_byte_indrdoff8_data8(u8 rd, u8 offset8, u8 data8); + void or_byte_indrdoff8_data8(u8 rd, u8 offset8, u8 data8); + void xor_byte_indrdoff8_data8(u8 rd, u8 offset8, u8 data8); + void mov_byte_indrdoff8_data8(u8 rd, u8 offset8, u8 data8); + + void add_byte_indrdoff16_data8(u8 rd, u16 offset16, u8 data8); + void addc_byte_indrdoff16_data8(u8 rd, u16 offset16, u8 data8); + void sub_byte_indrdoff16_data8(u8 rd, u16 offset16, u8 data8); + void subb_byte_indrdoff16_data8(u8 rd, u16 offset16, u8 data8); + void cmp_byte_indrdoff16_data8(u8 rd, u16 offset16, u8 data8); + void and_byte_indrdoff16_data8(u8 rd, u16 offset16, u8 data8); + void or_byte_indrdoff16_data8(u8 rd, u16 offset16, u8 data8); + void xor_byte_indrdoff16_data8(u8 rd, u16 offset16, u8 data8); + void mov_byte_indrdoff16_data8(u8 rd, u16 offset16, u8 data8); + + void add_byte_direct_data8(u16 direct, u8 data8); + void addc_byte_direct_data8(u16 direct, u8 data8); + void sub_byte_direct_data8(u16 direct, u8 data8); + void subb_byte_direct_data8(u16 direct, u8 data8); + void cmp_byte_direct_data8(u16 direct, u8 data8); + void and_byte_direct_data8(u16 direct, u8 data8); + void or_byte_direct_data8(u16 direct, u8 data8); + void xor_byte_direct_data8(u16 direct, u8 data8); + void mov_byte_direct_data8(u16 direct, u8 data8); + + void add_word_rd_data16(u8 rd, u16 data16); + void addc_word_rd_data16(u8 rd, u16 data16); + void sub_word_rd_data16(u8 rd, u16 data16); + void subb_word_rd_data16(u8 rd, u16 data16); + void cmp_word_rd_data16(u8 rd, u16 data16); + void and_word_rd_data16(u8 rd, u16 data16); + void or_word_rd_data16(u8 rd, u16 data16); + void xor_word_rd_data16(u8 rd, u16 data16); + void mov_word_rd_data16(u8 rd, u16 data16); + + void add_word_indrd_data16(u8 rd, u16 data16); + void addc_word_indrd_data16(u8 rd, u16 data16); + void sub_word_indrd_data16(u8 rd, u16 data16); + void subb_word_indrd_data16(u8 rd, u16 data16); + void cmp_word_indrd_data16(u8 rd, u16 data16); + void and_word_indrd_data16(u8 rd, u16 data16); + void or_word_indrd_data16(u8 rd, u16 data16); + void xor_word_indrd_data16(u8 rd, u16 data16); + void mov_word_indrd_data16(u8 rd, u16 data16); + + void add_word_indrdinc_data16(u8 rd, u16 data16); + void addc_word_indrdinc_data16(u8 rd, u16 data16); + void sub_word_indrdinc_data16(u8 rd, u16 data16); + void subb_word_indrdinc_data16(u8 rd, u16 data16); + void cmp_word_indrdinc_data16(u8 rd, u16 data16); + void and_word_indrdinc_data16(u8 rd, u16 data16); + void or_word_indrdinc_data16(u8 rd, u16 data16); + void xor_word_indrdinc_data16(u8 rd, u16 data16); + void mov_word_indrdinc_data16(u8 rd, u16 data16); + + void add_word_indrdoff8_data16(u8 rd, u8 offset8, u16 data16); + void addc_word_indrdoff8_data16(u8 rd, u8 offset8, u16 data16); + void sub_word_indrdoff8_data16(u8 rd, u8 offset8, u16 data16); + void subb_word_indrdoff8_data16(u8 rd, u8 offset8, u16 data16); + void cmp_word_indrdoff8_data16(u8 rd, u8 offset8, u16 data16); + void and_word_indrdoff8_data16(u8 rd, u8 offset8, u16 data16); + void or_word_indrdoff8_data16(u8 rd, u8 offset8, u16 data16); + void xor_word_indrdoff8_data16(u8 rd, u8 offset8, u16 data16); + void mov_word_indrdoff8_data16(u8 rd, u8 offset8, u16 data16); + + void add_word_indrdoff16_data16(u8 rd, u16 offset16, u16 data16); + void addc_word_indrdoff16_data16(u8 rd, u16 offset16, u16 data16); + void sub_word_indrdoff16_data16(u8 rd, u16 offset16, u16 data16); + void subb_word_indrdoff16_data16(u8 rd, u16 offset16, u16 data16); + void cmp_word_indrdoff16_data16(u8 rd, u16 offset16, u16 data16); + void and_word_indrdoff16_data16(u8 rd, u16 offset16, u16 data16); + void or_word_indrdoff16_data16(u8 rd, u16 offset16, u16 data16); + void xor_word_indrdoff16_data16(u8 rd, u16 offset16, u16 data16); + void mov_word_indrdoff16_data16(u8 rd, u16 offset16, u16 data16); + + void add_word_direct_data16(u16 direct, u16 data16); + void addc_word_direct_data16(u16 direct, u16 data16); + void sub_word_direct_data16(u16 direct, u16 data16); + void subb_word_direct_data16(u16 direct, u16 data16); + void cmp_word_direct_data16(u16 direct, u16 data16); + void and_word_direct_data16(u16 direct, u16 data16); + void or_word_direct_data16(u16 direct, u16 data16); + void xor_word_direct_data16(u16 direct, u16 data16); + void mov_word_direct_data16(u16 direct, u16 data16); + + void aluop_word_rd_rs(int alu_op, u8 rd, u8 rs); + void aluop_byte_rd_rs(int alu_op, u8 rd, u8 rs); + void aluop_word_rd_indrs(int alu_op, u8 rd, u8 rs); + void aluop_byte_rd_indrs(int alu_op, u8 rd, u8 rs); + void aluop_word_indrd_rs(int alu_op, u8 rd, u8 rs); + void aluop_byte_indrd_rs(int alu_op, u8 rd, u8 rs); + void aluop_word_rd_indrsinc(int alu_op, u8 rd, u8 rs); + void aluop_byte_rd_indrsinc(int alu_op, u8 rd, u8 rs); + void aluop_word_indrdinc_rs(int alu_op, u8 rd, u8 rs); + void aluop_byte_indrdinc_rs(int alu_op, u8 rd, u8 rs); + void aluop_word_rd_rsoff8(int alu_op, u8 rd, u8 rs, u8 offset8); + void aluop_byte_rd_rsoff8(int alu_op, u8 rd, u8 rs, u8 offset8); + void aluop_word_rdoff8_rs(int alu_op, u8 rd, u8 offset8, u8 rs); + void aluop_byte_rdoff8_rs(int alu_op, u8 rd, u8 offset8, u8 rs); + void aluop_word_rsoff16(int alu_op, u8 rd, u8 rs, u16 offset16); + void aluop_byte_rsoff16(int alu_op, u8 rd, u8 rs, u16 offset16); + void aluop_word_rdoff16_rs(int alu_op, u8 rd, u16 offset16, u8 rs); + void aluop_byte_rdoff16_rs(int alu_op, u8 rd, u16 offset16, u8 rs); + void aluop_word_rd_direct(int alu_op, u8 rd, u16 direct); + void aluop_byte_rd_direct(int alu_op, u8 rd, u16 direct); + void aluop_word_direct_rs(int alu_op, u16 direct, u8 rs); + void aluop_byte_direct_rs(int alu_op, u16 direct, u8 rs); + + void aluop_byte_rd_data8(int alu_op, u8 rd, u8 data8); + void aluop_byte_indrd_data8(int alu_op, u8 rd, u8 data8); + void aluop_byte_indrdinc_data8(int alu_op, u8 rd, u8 data8); + void aluop_byte_rdoff8_data8(int alu_op, u8 rd, u8 offset8, u8 data8); + void aluop_byte_rdoff16_data8(int alu_op, u8 rd, u16 offset16, u8 data8); + void aluop_byte_direct_data8(int alu_op, u16 direct, u8 data8); + void aluop_byte_rd_data16(int alu_op, u8 rd, u16 data16); + void aluop_byte_indrd_data16(int alu_op, u8 rd, u16 data16); + void aluop_byte_indrdinc_data16(int alu_op, u8 rd, u16 data16); + void aluop_byte_rdoff8_data16(int alu_op, u8 rd, u8 offset8, u16 data16); + void aluop_byte_rdoff16_data16(int alu_op, u8 rd, u16 offset16, u16 data16); + void aluop_byte_direct_data16(int alu_op, u16 direct, u16 data16); + + void add_word_rd_rs(u8 rd, u8 rs); + void addc_word_rd_rs(u8 rd, u8 rs); + void sub_word_rd_rs(u8 rd, u8 rs); + void subb_word_rd_rs(u8 rd, u8 rs); + void cmp_word_rd_rs(u8 rd, u8 rs); + void and_word_rd_rs(u8 rd, u8 rs); + void or_word_rd_rs(u8 rd, u8 rs); + void xor_word_rd_rs(u8 rd, u8 rs); + void mov_word_rd_rs(u8 rd, u8 rs); + + void add_byte_rd_rs(u8 rd, u8 rs); + void addc_byte_rd_rs(u8 rd, u8 rs); + void sub_byte_rd_rs(u8 rd, u8 rs); + void subb_byte_rd_rs(u8 rd, u8 rs); + void cmp_byte_rd_rs(u8 rd, u8 rs); + void and_byte_rd_rs(u8 rd, u8 rs); + void or_byte_rd_rs(u8 rd, u8 rs); + void xor_byte_rd_rs(u8 rd, u8 rs); + void mov_byte_rd_rs(u8 rd, u8 rs); + + void add_word_rd_indrs(u8 rd, u8 rs); + void addc_word_rd_indrs(u8 rd, u8 rs); + void sub_word_rd_indrs(u8 rd, u8 rs); + void subb_word_rd_indrs(u8 rd, u8 rs); + void cmp_word_rd_indrs(u8 rd, u8 rs); + void and_word_rd_indrs(u8 rd, u8 rs); + void or_word_rd_indrs(u8 rd, u8 rs); + void xor_word_rd_indrs(u8 rd, u8 rs); + void mov_word_rd_indrs(u8 rd, u8 rs); + + void add_byte_rd_indrs(u8 rd, u8 rs); + void addc_byte_rd_indrs(u8 rd, u8 rs); + void sub_byte_rd_indrs(u8 rd, u8 rs); + void subb_byte_rd_indrs(u8 rd, u8 rs); + void cmp_byte_rd_indrs(u8 rd, u8 rs); + void and_byte_rd_indrs(u8 rd, u8 rs); + void or_byte_rd_indrs(u8 rd, u8 rs); + void xor_byte_rd_indrs(u8 rd, u8 rs); + void mov_byte_rd_indrs(u8 rd, u8 rs); + + void add_word_indrd_rs(u8 rd, u8 rs); + void addc_word_indrd_rs(u8 rd, u8 rs); + void sub_word_indrd_rs(u8 rd, u8 rs); + void subb_word_indrd_rs(u8 rd, u8 rs); + void cmp_word_indrd_rs(u8 rd, u8 rs); + void and_word_indrd_rs(u8 rd, u8 rs); + void or_word_indrd_rs(u8 rd, u8 rs); + void xor_word_indrd_rs(u8 rd, u8 rs); + void mov_word_indrd_rs(u8 rd, u8 rs); + + void add_byte_indrd_rs(u8 rd, u8 rs); + void addc_byte_indrd_rs(u8 rd, u8 rs); + void sub_byte_indrd_rs(u8 rd, u8 rs); + void subb_byte_indrd_rs(u8 rd, u8 rs); + void cmp_byte_indrd_rs(u8 rd, u8 rs); + void and_byte_indrd_rs(u8 rd, u8 rs); + void or_byte_indrd_rs(u8 rd, u8 rs); + void xor_byte_indrd_rs(u8 rd, u8 rs); + void mov_byte_indrd_rs(u8 rd, u8 rs); + + void add_word_rd_indrsinc(u8 rd, u8 rs); + void addc_word_rd_indrsinc(u8 rd, u8 rs); + void sub_word_rd_indrsinc(u8 rd, u8 rs); + void subb_word_rd_indrsinc(u8 rd, u8 rs); + void cmp_word_rd_indrsinc(u8 rd, u8 rs); + void and_word_rd_indrsinc(u8 rd, u8 rs); + void or_word_rd_indrsinc(u8 rd, u8 rs); + void xor_word_rd_indrsinc(u8 rd, u8 rs); + void mov_word_rd_indrsinc(u8 rd, u8 rs); + + void add_byte_rd_indrsinc(u8 rd, u8 rs); + void addc_byte_rd_indrsinc(u8 rd, u8 rs); + void sub_byte_rd_indrsinc(u8 rd, u8 rs); + void subb_byte_rd_indrsinc(u8 rd, u8 rs); + void cmp_byte_rd_indrsinc(u8 rd, u8 rs); + void and_byte_rd_indrsinc(u8 rd, u8 rs); + void or_byte_rd_indrsinc(u8 rd, u8 rs); + void xor_byte_rd_indrsinc(u8 rd, u8 rs); + void mov_byte_rd_indrsinc(u8 rd, u8 rs); + + void add_word_indrdinc_rs(u8 rd, u8 rs); + void addc_word_indrdinc_rs(u8 rd, u8 rs); + void sub_word_indrdinc_rs(u8 rd, u8 rs); + void subb_word_indrdinc_rs(u8 rd, u8 rs); + void cmp_word_indrdinc_rs(u8 rd, u8 rs); + void and_word_indrdinc_rs(u8 rd, u8 rs); + void or_word_indrdinc_rs(u8 rd, u8 rs); + void xor_word_indrdinc_rs(u8 rd, u8 rs); + void mov_word_indrdinc_rs(u8 rd, u8 rs); + + void add_byte_indrdinc_rs(u8 rd, u8 rs); + void addc_byte_indrdinc_rs(u8 rd, u8 rs); + void sub_byte_indrdinc_rs(u8 rd, u8 rs); + void subb_byte_indrdinc_rs(u8 rd, u8 rs); + void cmp_byte_indrdinc_rs(u8 rd, u8 rs); + void and_byte_indrdinc_rs(u8 rd, u8 rs); + void or_byte_indrdinc_rs(u8 rd, u8 rs); + void xor_byte_indrdinc_rs(u8 rd, u8 rs); + void mov_byte_indrdinc_rs(u8 rd, u8 rs); + + void add_word_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void addc_word_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void sub_word_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void subb_word_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void cmp_word_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void and_word_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void or_word_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void xor_word_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void mov_word_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + + void add_byte_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void addc_byte_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void sub_byte_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void subb_byte_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void cmp_byte_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void and_byte_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void or_byte_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void xor_byte_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + void mov_byte_rd_rsoff8(u8 rd, u8 rs, u8 offset8); + + void add_word_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void addc_word_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void sub_word_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void subb_word_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void cmp_word_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void and_word_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void or_word_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void xor_word_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void mov_word_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + + void add_byte_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void addc_byte_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void sub_byte_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void subb_byte_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void cmp_byte_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void and_byte_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void or_byte_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void xor_byte_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + void mov_byte_rdoff8_rs(u8 rd, u8 offset8, u8 rs); + + void add_word_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void addc_word_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void sub_word_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void subb_word_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void cmp_word_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void and_word_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void or_word_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void xor_word_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void mov_word_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + + void add_byte_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void addc_byte_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void sub_byte_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void subb_byte_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void cmp_byte_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void and_byte_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void or_byte_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void xor_byte_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + void mov_byte_rd_rsoff16(u8 rd, u8 rs, u16 offset16); + + void add_word_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void addc_word_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void sub_word_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void subb_word_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void cmp_word_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void and_word_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void or_word_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void xor_word_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void mov_word_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + + void add_byte_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void addc_byte_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void sub_byte_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void subb_byte_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void cmp_byte_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void and_byte_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void or_byte_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void xor_byte_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + void mov_byte_rdoff16_rs(u8 rd, u16 offset16, u8 rs); + + void add_word_rd_direct(u8 rd, u16 direct); + void addc_word_rd_direct(u8 rd, u16 direct); + void sub_word_rd_direct(u8 rd, u16 direct); + void subb_word_rd_direct(u8 rd, u16 direct); + void cmp_word_rd_direct(u8 rd, u16 direct); + void and_word_rd_direct(u8 rd, u16 direct); + void or_word_rd_direct(u8 rd, u16 direct); + void xor_word_rd_direct(u8 rd, u16 direct); + void mov_word_rd_direct(u8 rd, u16 direct); + + void add_byte_rd_direct(u8 rd, u16 direct); + void addc_byte_rd_direct(u8 rd, u16 direct); + void sub_byte_rd_direct(u8 rd, u16 direct); + void subb_byte_rd_direct(u8 rd, u16 direct); + void cmp_byte_rd_direct(u8 rd, u16 direct); + void and_byte_rd_direct(u8 rd, u16 direct); + void or_byte_rd_direct(u8 rd, u16 direct); + void xor_byte_rd_direct(u8 rd, u16 direct); + void mov_byte_rd_direct(u8 rd, u16 direct); + + void add_word_direct_rs(u16 direct, u8 rs); + void addc_word_direct_rs(u16 direct, u8 rs); + void sub_word_direct_rs(u16 direct, u8 rs); + void subb_word_direct_rs(u16 direct, u8 rs); + void cmp_word_direct_rs(u16 direct, u8 rs); + void and_word_direct_rs(u16 direct, u8 rs); + void or_word_direct_rs(u16 direct, u8 rs); + void xor_word_direct_rs(u16 direct, u8 rs); + void mov_word_direct_rs(u16 direct, u8 rs); + + void add_byte_direct_rs(u16 direct, u8 rs); + void addc_byte_direct_rs(u16 direct, u8 rs); + void sub_byte_direct_rs(u16 direct, u8 rs); + void subb_byte_direct_rs(u16 direct, u8 rs); + void cmp_byte_direct_rs(u16 direct, u8 rs); + void and_byte_direct_rs(u16 direct, u8 rs); + void or_byte_direct_rs(u16 direct, u8 rs); + void xor_byte_direct_rs(u16 direct, u8 rs); + void mov_byte_direct_rs(u16 direct, u8 rs); + + void movs_word_rd_data4(u8 rd, u8 data4); + void movs_byte_rd_data4(u8 rd, u8 data4); + void adds_word_rd_data4(u8 rd, u8 data4); + void adds_byte_rd_data4(u8 rd, u8 data4); + + void movs_word_indrd_data4(u8 rd, u8 data4); + void movs_byte_indrd_data4(u8 rd, u8 data4); + void adds_word_indrd_data4(u8 rd, u8 data4); + void adds_byte_indrd_data4(u8 rd, u8 data4); + + void movs_word_indrdinc_data4(u8 rd, u8 data4); + void movs_byte_indrdinc_data4(u8 rd, u8 data4); + void adds_word_indrdinc_data4(u8 rd, u8 data4); + void adds_byte_indrdinc_data4(u8 rd, u8 data4); + + void movs_word_indrdoff8_data4(u8 rd, u8 off8, u8 data4); + void movs_byte_indrdoff8_data4(u8 rd, u8 off8, u8 data4); + void adds_word_indrdoff8_data4(u8 rd, u8 off8, u8 data4); + void adds_byte_indrdoff8_data4(u8 rd, u8 off8, u8 data4); + + void movs_word_indrdoff16_data4(u8 rd, u16 off16, u8 data4); + void movs_byte_indrdoff16_data4(u8 rd, u16 off16, u8 data4); + void adds_word_indrdoff16_data4(u8 rd, u16 off16, u8 data4); + void adds_byte_indrdoff16_data4(u8 rd, u16 off16, u8 data4); + + void movs_word_direct_data4(u16 direct, u8 data4); + void movs_byte_direct_data4(u16 direct, u8 data4); + void adds_word_direct_data4(u16 direct, u8 data4); + void adds_byte_direct_data4(u16 direct, u8 data4); + + void call_rel16(u16 rel16); + + void bcc_rel8(u8 rel8); + void bcs_rel8(u8 rel8); + void bne_rel8(u8 rel8); + void beq_rel8(u8 rel8); + void bnv_rel8(u8 rel8); + void bov_rel8(u8 rel8); + void bpl_rel8(u8 rel8); + void bmi_rel8(u8 rel8); + void bg_rel8(u8 rel8); + void bl_rel8(u8 rel8); + void bge_rel8(u8 rel8); + void blt_rel8(u8 rel8); + void bgt_rel8(u8 rel8); + void ble_rel8(u8 rel8); + void br_rel8(u8 rel8); + + void asl_byte_rd_imm4(u8 rd, u8 amount); + void asl_word_rd_imm4(u8 rd, u8 amount); + void asl_dword_rd_imm5(u8 rd, u8 amount); + + void asr_byte_rd_imm4(u8 rd, u8 amount); + void asr_word_rd_imm4(u8 rd, u8 amount); + void asr_dword_rd_imm5(u8 rd, u8 amount); + + void lsr_byte_rd_imm4(u8 rd, u8 amount); + void lsr_word_rd_imm4(u8 rd, u8 amount); + void lsr_dword_rd_imm5(u8 rd, u8 amount); + + void asl_byte_rd_rs(u8 rd, u8 rs); + void asl_word_rd_rs(u8 rd, u8 rs); + void asl_dword_rd_rs(u8 rd, u8 rs); + + void asr_byte_rd_rs(u8 rd, u8 rs); + void asr_word_rd_rs(u8 rd, u8 rs); + void asr_dword_rd_rs(u8 rd, u8 rs); + + void lsr_byte_rd_rs(u8 rd, u8 rs); + void lsr_word_rd_rs(u8 rd, u8 rs); + void lsr_dword_rd_rs(u8 rd, u8 rs); + + void norm_byte_rd_rs(u8 rd, u8 rs); + void norm_word_rd_rs(u8 rd, u8 rs); + void norm_dword_rd_rs(u8 rd, u8 rs); + + void mulu_byte_rd_rs(u8 rd, u8 rs); + void divu_byte_rd_rs(u8 rd, u8 rs); + void mulu_word_rd_rs(u8 rd, u8 rs); + void divu_word_rd_rs(u8 rd, u8 rs); + void mul_word_rd_rs(u8 rd, u8 rs); + void div_word_rd_rs(u8 rd, u8 rs); + void div_word_rd_data8(u8 rd, u8 data8); + void divu_byte_rd_data8(u8 rd, u8 data8); + void divu_word_rd_data8(u8 rd, u8 data8); + void mulu_byte_rd_data8(u8 rd, u8 data8); + void mulu_word_rd_data16(u8 rd, u16 data16); + void mul_word_rd_data16(u8 rd, u16 data16); + void divu_dword_rd_data16(u8 rd, u16 data16); + void div_dword_rd_data16(u8 rd, u16 data16); + void divu_dword_rd_rs(u8 rd, u8 rs); + void div_dword_rd_rs(u8 rd, u8 rs); + + void clr_bit(u16 bit); + void setb_bit(u16 bit); + void mov_c_bit(u16 bit); + void mov_bit_c(u16 bit); + void anl_c_bit(u16 bit); + void anl_c_notbit(u16 bit); + void orl_c_bit(u16 bit); + void orl_c_notbit(u16 bit); + + void lea_word_rd_rs_off8(u8 rd, u8 rs, u8 offs8); + void lea_word_rd_rs_off16(u8 rd, u8 rs, u16 offs16); + + void xch_word_rd_indrs(u8 rd, u8 rs); + void xch_byte_rd_indrs(u8 rd, u8 rs); + void xch_word_rd_rs(u8 rd, u8 rs); + void xch_byte_rd_rs(u8 rd, u8 rs); + + void movc_word_rd_indrsinc(u8 rd, u8 rs); + void movc_byte_rd_indrsinc(u8 rd, u8 rs); + + void djnz_word_rd_rel8(u8 rd, u8 rel8); + void djnz_byte_rd_rel8(u8 rd, u8 rel8); + + void popu_word_direct(u16 direct); + void popu_byte_direct(u16 direct); + void pop_word_direct(u16 direct); + void pop_byte_direct(u16 direct); + void pushu_word_direct(u16 direct); + void pushu_byte_direct(u16 direct); + void push_word_direct(u16 direct); + void push_byte_direct(u16 direct); + + void mov_word_indrdinc_indrsinc(u8 rd, u8 rs); + void mov_byte_indrdinc_indrsinc(u8 rd, u8 rs); + + void da_rd(u8 rd); + void sext_word_rd(u8 rd); + void sext_byte_rd(u8 rd); + void cpl_word_rd(u8 rd); + void cpl_byte_rd(u8 rd); + void neg_word_rd(u8 rd); + void neg_byte_rd(u8 rd); + void movc_a_apc(); + void movc_a_adptr(); + void mov_rd_usp(u8 rd); + void mov_usp_rs(u8 rs); + + void jb_bit_rel8(u16 bit, u8 rel8); + void jnb_bit_rel8(u16 bit, u8 rel8); + void jbc_bit_rel8(u16 bit, u8 rel8); + + void mov_word_direct_direct(u16 direct1, u16 direct2); + void mov_byte_direct_direct(u16 direct1, u16 direct2); + + void xch_word_rd_direct(u8 rd, u16 direct); + void xch_byte_rd_direct(u8 rd, u16 direct); + + void mov_word_direct_indrs(u16 direct, u8 rs); + void mov_byte_direct_indrs(u16 direct, u8 rs); + + void mov_word_indrd_direct(u8 rd, u16 direct); + void mov_byte_indrd_direct(u8 rd, u16 direct); + + void movx_word_indrd_rs(u8 rd, u8 rs); + void movx_byte_indrd_rs(u8 rd, u8 rs); + + void movx_word_rd_indrs(u8 rd, u8 rs); + void movx_byte_rd_indrs(u8 rd, u8 rs); + + void rr_word_rd_data4(u8 rd, u8 data4); + void rr_byte_rd_data4(u8 rd, u8 data4); + + void rrc_word_rd_data4(u8 rd, u8 data4); + void rrc_byte_rd_data4(u8 rd, u8 data4); + + void rl_word_rd_data4(u8 rd, u8 data4); + void rl_byte_rd_data4(u8 rd, u8 data4); + + void rlc_word_rd_data4(u8 rd, u8 data4); + void rlc_byte_rd_data4(u8 rd, u8 data4); + + void fcall_addr24(u32 addr24); + void call_indrs(u8 rs); + void fjmp_addr24(u32 addr24); + void jmp_rel16(u16 rel16); + + void djnz_word_direct_rel8(u16 direct, u8 rel8); + void djnz_byte_direct_rel8(u16 direct, u8 rel8); + + void cjne_word_rd_direct_rel8(u8 rd, u16 direct, u8 rel8); + void cjne_byte_rd_direct_rel8(u8 rd, u16 direct, u8 rel8); + + void cjne_indrd_data8_rel8(u8 rd, u8 data8, u8 rel8); + void cjne_rd_data8_rel8(u8 rd, u8 data8, u8 rel8); + + void cjne_indrd_data16_rel8(u8 rd, u16 data16, u8 rel8); + void cjne_rd_data16_rel8(u8 rd, u16 data16, u8 rel8); + + void reset(); + void trap_data4(u8 data4); + void jmp_ind_adptr(); + void jmp_dblindrs(u8 rs); + void jmp_indrs(u8 rs); + void ret(); + void reti(); + + void jz_rel8(u8 rel8); + void jnz_rel8(u8 rel8); + + void push_word_rlist(u8 bitfield, int h); + void push_byte_rlist(u8 bitfield, int h); + + void pushu_word_rlist(u8 bitfield, int h); + void pushu_byte_rlist(u8 bitfield, int h); + + void pop_word_rlist(u8 bitfield, int h); + void pop_byte_rlist(u8 bitfield, int h); + + void popu_word_rlist(u8 bitfield, int h); + void popu_byte_rlist(u8 bitfield, int h); + + std::unordered_map<offs_t, const char *> m_names; + + u8 m_im; + u8 m_rs; + u8 m_zflag; + u8 m_nflag; + u8 m_vflag; + u8 m_cflag; + u8 m_acflag; + u8 m_sm_flag; + u8 m_tm_flag; + u8 m_p_flag; + u8 m_f0_flag; + u8 m_f1_flag; uint32_t m_pc; + bool m_usermode; + u8 m_pagezeromode; + + u16 m_USP; // user stack pointer + u16 m_SSP; // system stack pointer + + u8 m_WDCON; + u8 m_SCR; + u8 m_IEL; + u8 m_PSWL; + u8 m_PSWH; + + u8 m_regbank; + + u8 m_PxCFGA[4]; + u8 m_PxCFGB[4]; + + // hacks for IRQ testing + u8 m_in_interrupt; + u8 m_irq_pending; + + + // 16-bit regs R0-R3 can have 4 selectable banks, R4-R7 are global + // for 8-bit use each register can be seen as High and Low parts + // R4 when split is R4H and R4L, R4L acts as ACC from i8051 for compatibility, R4H acts as B + // R6H is DPH, R6L is DPL + u16 m_regs[(4 * 4) + 4]; + address_space *m_program; + address_space *m_data; + address_space *m_sfr; int m_icount; + + devcb_read8::array<4> m_port_in_cb; + devcb_write8::array<4> m_port_out_cb; }; -class mx10exa_cpu_device : public xa_cpu_device +class mx10exa_cpu_device : public xa_cpu { public: mx10exa_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); private: void mx10exa_internal_map(address_map &map); + void mx10exa_internal_data_map(address_map &map); + }; -DECLARE_DEVICE_TYPE(XA, xa_cpu_device) +DECLARE_DEVICE_TYPE(XA, xa_cpu) DECLARE_DEVICE_TYPE(MX10EXA, mx10exa_cpu_device) #endif // MAME_CPU_XA_XA_H |