mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
tms32051.c: Modernized cpu core. [Wilbert Pol]
This commit is contained in:
parent
a8a62c3212
commit
aecdd2151d
File diff suppressed because it is too large
Load Diff
@ -1,251 +1,251 @@
|
||||
static void (*const tms32051_opcode_table[256])(tms32051_state *cpustate) =
|
||||
const tms32051_device::opcode_func tms32051_device::s_opcode_table[256] =
|
||||
{
|
||||
/* 0x00 - 0x0f */
|
||||
op_lar_mem, op_lar_mem, op_lar_mem, op_lar_mem,
|
||||
op_lar_mem, op_lar_mem, op_lar_mem, op_lar_mem,
|
||||
op_lamm, op_smmr, op_subc, op_rpt_mem,
|
||||
op_out, op_ldp_mem, op_lst_st0, op_lst_st1,
|
||||
&tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem,
|
||||
&tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem,
|
||||
&tms32051_device::op_lamm, &tms32051_device::op_smmr, &tms32051_device::op_subc, &tms32051_device::op_rpt_mem,
|
||||
&tms32051_device::op_out, &tms32051_device::op_ldp_mem, &tms32051_device::op_lst_st0, &tms32051_device::op_lst_st1,
|
||||
/* 0x10 - 0x1f */
|
||||
op_lacc_mem, op_lacc_mem, op_lacc_mem, op_lacc_mem,
|
||||
op_lacc_mem, op_lacc_mem, op_lacc_mem, op_lacc_mem,
|
||||
op_lacc_mem, op_lacc_mem, op_lacc_mem, op_lacc_mem,
|
||||
op_lacc_mem, op_lacc_mem, op_lacc_mem, op_lacc_mem,
|
||||
&tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem,
|
||||
&tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem,
|
||||
&tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem,
|
||||
&tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem,
|
||||
/* 0x20 - 0x2f */
|
||||
op_add_mem, op_add_mem, op_add_mem, op_add_mem,
|
||||
op_add_mem, op_add_mem, op_add_mem, op_add_mem,
|
||||
op_add_mem, op_add_mem, op_add_mem, op_add_mem,
|
||||
op_add_mem, op_add_mem, op_add_mem, op_add_mem,
|
||||
&tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem,
|
||||
&tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem,
|
||||
&tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem,
|
||||
&tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem,
|
||||
/* 0x30 - 0x3f */
|
||||
op_sub_mem, op_sub_mem, op_sub_mem, op_sub_mem,
|
||||
op_sub_mem, op_sub_mem, op_sub_mem, op_sub_mem,
|
||||
op_sub_mem, op_sub_mem, op_sub_mem, op_sub_mem,
|
||||
op_sub_mem, op_sub_mem, op_sub_mem, op_sub_mem,
|
||||
&tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem,
|
||||
&tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem,
|
||||
&tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem,
|
||||
&tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem,
|
||||
/* 0x40 - 0x4f */
|
||||
op_bit, op_bit, op_bit, op_bit,
|
||||
op_bit, op_bit, op_bit, op_bit,
|
||||
op_bit, op_bit, op_bit, op_bit,
|
||||
op_bit, op_bit, op_bit, op_bit,
|
||||
&tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit,
|
||||
&tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit,
|
||||
&tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit,
|
||||
&tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit,
|
||||
/* 0x50 - 0x5f */
|
||||
op_mpya, op_mpys, op_sqra, op_sqrs,
|
||||
op_mpy_mem, op_mpyu, op_invalid, op_bldp,
|
||||
op_xpl_dbmr, op_opl_dbmr, op_apl_dbmr, op_cpl_dbmr,
|
||||
op_xpl_imm, op_opl_imm, op_apl_imm, op_cpl_imm,
|
||||
&tms32051_device::op_mpya, &tms32051_device::op_mpys, &tms32051_device::op_sqra, &tms32051_device::op_sqrs,
|
||||
&tms32051_device::op_mpy_mem, &tms32051_device::op_mpyu, &tms32051_device::op_invalid, &tms32051_device::op_bldp,
|
||||
&tms32051_device::op_xpl_dbmr, &tms32051_device::op_opl_dbmr, &tms32051_device::op_apl_dbmr, &tms32051_device::op_cpl_dbmr,
|
||||
&tms32051_device::op_xpl_imm, &tms32051_device::op_opl_imm, &tms32051_device::op_apl_imm, &tms32051_device::op_cpl_imm,
|
||||
/* 0x60 - 0x6f */
|
||||
op_addc, op_add_s16_mem, op_adds, op_addt,
|
||||
op_subb, op_sub_s16_mem, op_subs, op_subt,
|
||||
op_zalr, op_lacl_mem, op_lacc_s16_mem,op_lact,
|
||||
op_xor_mem, op_or_mem, op_and_mem, op_bitt,
|
||||
&tms32051_device::op_addc, &tms32051_device::op_add_s16_mem, &tms32051_device::op_adds, &tms32051_device::op_addt,
|
||||
&tms32051_device::op_subb, &tms32051_device::op_sub_s16_mem, &tms32051_device::op_subs, &tms32051_device::op_subt,
|
||||
&tms32051_device::op_zalr, &tms32051_device::op_lacl_mem, &tms32051_device::op_lacc_s16_mem,&tms32051_device::op_lact,
|
||||
&tms32051_device::op_xor_mem, &tms32051_device::op_or_mem, &tms32051_device::op_and_mem, &tms32051_device::op_bitt,
|
||||
/* 0x70 - 0x7f */
|
||||
op_lta, op_ltp, op_ltd, op_lt,
|
||||
op_lts, op_lph, op_pshd, op_dmov,
|
||||
op_adrk, op_b, op_call, op_banz,
|
||||
op_sbrk, op_bd, op_calld, op_banzd,
|
||||
&tms32051_device::op_lta, &tms32051_device::op_ltp, &tms32051_device::op_ltd, &tms32051_device::op_lt,
|
||||
&tms32051_device::op_lts, &tms32051_device::op_lph, &tms32051_device::op_pshd, &tms32051_device::op_dmov,
|
||||
&tms32051_device::op_adrk, &tms32051_device::op_b, &tms32051_device::op_call, &tms32051_device::op_banz,
|
||||
&tms32051_device::op_sbrk, &tms32051_device::op_bd, &tms32051_device::op_calld, &tms32051_device::op_banzd,
|
||||
/* 0x80 - 0x8f */
|
||||
op_sar, op_sar, op_sar, op_sar,
|
||||
op_sar, op_sar, op_sar, op_sar,
|
||||
op_samm, op_lmmr, op_popd, op_mar,
|
||||
op_spl, op_sph, op_sst_st0, op_sst_st1,
|
||||
&tms32051_device::op_sar, &tms32051_device::op_sar, &tms32051_device::op_sar, &tms32051_device::op_sar,
|
||||
&tms32051_device::op_sar, &tms32051_device::op_sar, &tms32051_device::op_sar, &tms32051_device::op_sar,
|
||||
&tms32051_device::op_samm, &tms32051_device::op_lmmr, &tms32051_device::op_popd, &tms32051_device::op_mar,
|
||||
&tms32051_device::op_spl, &tms32051_device::op_sph, &tms32051_device::op_sst_st0, &tms32051_device::op_sst_st1,
|
||||
/* 0x90 - 0x9f */
|
||||
op_sacl, op_sacl, op_sacl, op_sacl,
|
||||
op_sacl, op_sacl, op_sacl, op_sacl,
|
||||
op_sach, op_sach, op_sach, op_sach,
|
||||
op_sach, op_sach, op_sach, op_sach,
|
||||
&tms32051_device::op_sacl, &tms32051_device::op_sacl, &tms32051_device::op_sacl, &tms32051_device::op_sacl,
|
||||
&tms32051_device::op_sacl, &tms32051_device::op_sacl, &tms32051_device::op_sacl, &tms32051_device::op_sacl,
|
||||
&tms32051_device::op_sach, &tms32051_device::op_sach, &tms32051_device::op_sach, &tms32051_device::op_sach,
|
||||
&tms32051_device::op_sach, &tms32051_device::op_sach, &tms32051_device::op_sach, &tms32051_device::op_sach,
|
||||
/* 0xa0 - 0xaf */
|
||||
op_norm, op_invalid, op_mac, op_macd,
|
||||
op_blpd_bmar, op_blpd_imm, op_tblr, op_tblw,
|
||||
op_bldd_slimm, op_bldd_dlimm, op_mads, op_madd,
|
||||
op_bldd_sbmar, op_bldd_dbmar, op_splk, op_in,
|
||||
&tms32051_device::op_norm, &tms32051_device::op_invalid, &tms32051_device::op_mac, &tms32051_device::op_macd,
|
||||
&tms32051_device::op_blpd_bmar, &tms32051_device::op_blpd_imm, &tms32051_device::op_tblr, &tms32051_device::op_tblw,
|
||||
&tms32051_device::op_bldd_slimm, &tms32051_device::op_bldd_dlimm, &tms32051_device::op_mads, &tms32051_device::op_madd,
|
||||
&tms32051_device::op_bldd_sbmar, &tms32051_device::op_bldd_dbmar, &tms32051_device::op_splk, &tms32051_device::op_in,
|
||||
/* 0xb0 - 0xbf */
|
||||
op_lar_simm, op_lar_simm, op_lar_simm, op_lar_simm,
|
||||
op_lar_simm, op_lar_simm, op_lar_simm, op_lar_simm,
|
||||
op_add_simm, op_lacl_simm, op_sub_simm, op_rpt_simm,
|
||||
op_ldp_imm, op_ldp_imm, op_group_be, op_group_bf,
|
||||
&tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm,
|
||||
&tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm,
|
||||
&tms32051_device::op_add_simm, &tms32051_device::op_lacl_simm, &tms32051_device::op_sub_simm, &tms32051_device::op_rpt_simm,
|
||||
&tms32051_device::op_ldp_imm, &tms32051_device::op_ldp_imm, &tms32051_device::op_group_be, &tms32051_device::op_group_bf,
|
||||
/* 0xc0 - 0xcf */
|
||||
op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm,
|
||||
op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm,
|
||||
op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm,
|
||||
op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm,
|
||||
&tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm,
|
||||
&tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm,
|
||||
&tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm,
|
||||
&tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm,
|
||||
/* 0xd0 - 0xdf */
|
||||
op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm,
|
||||
op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm,
|
||||
op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm,
|
||||
op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm,
|
||||
&tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm,
|
||||
&tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm,
|
||||
&tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm,
|
||||
&tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm,
|
||||
/* 0xe0 - 0xef */
|
||||
op_bcnd, op_bcnd, op_bcnd, op_bcnd,
|
||||
op_xc, op_xc, op_xc, op_xc,
|
||||
op_cc, op_cc, op_cc, op_cc,
|
||||
op_retc, op_retc, op_retc, op_retc,
|
||||
&tms32051_device::op_bcnd, &tms32051_device::op_bcnd, &tms32051_device::op_bcnd, &tms32051_device::op_bcnd,
|
||||
&tms32051_device::op_xc, &tms32051_device::op_xc, &tms32051_device::op_xc, &tms32051_device::op_xc,
|
||||
&tms32051_device::op_cc, &tms32051_device::op_cc, &tms32051_device::op_cc, &tms32051_device::op_cc,
|
||||
&tms32051_device::op_retc, &tms32051_device::op_retc, &tms32051_device::op_retc, &tms32051_device::op_retc,
|
||||
/* 0xf0 - 0xff */
|
||||
op_bcndd, op_bcndd, op_bcndd, op_bcndd,
|
||||
op_xc, op_xc, op_xc, op_xc,
|
||||
op_ccd, op_ccd, op_ccd, op_ccd,
|
||||
op_retcd, op_retcd, op_retcd, op_retcd
|
||||
&tms32051_device::op_bcndd, &tms32051_device::op_bcndd, &tms32051_device::op_bcndd, &tms32051_device::op_bcndd,
|
||||
&tms32051_device::op_xc, &tms32051_device::op_xc, &tms32051_device::op_xc, &tms32051_device::op_xc,
|
||||
&tms32051_device::op_ccd, &tms32051_device::op_ccd, &tms32051_device::op_ccd, &tms32051_device::op_ccd,
|
||||
&tms32051_device::op_retcd, &tms32051_device::op_retcd, &tms32051_device::op_retcd, &tms32051_device::op_retcd
|
||||
};
|
||||
|
||||
static void (*const tms32051_opcode_table_be[256])(tms32051_state *cpustate) =
|
||||
const tms32051_device::opcode_func tms32051_device::s_opcode_table_be[256] =
|
||||
{
|
||||
/* 0x00 - 0x0f */
|
||||
op_abs, op_cmpl, op_neg, op_pac,
|
||||
op_apac, op_spac, op_invalid, op_invalid,
|
||||
op_invalid, op_sfl, op_sfr, op_invalid,
|
||||
op_rol, op_ror, op_invalid, op_invalid,
|
||||
&tms32051_device::op_abs, &tms32051_device::op_cmpl, &tms32051_device::op_neg, &tms32051_device::op_pac,
|
||||
&tms32051_device::op_apac, &tms32051_device::op_spac, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_sfl, &tms32051_device::op_sfr, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_rol, &tms32051_device::op_ror, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x10 - 0x1f */
|
||||
op_addb, op_adcb, op_andb, op_orb,
|
||||
op_rolb, op_rorb, op_sflb, op_sfrb,
|
||||
op_sbb, op_sbbb, op_xorb, op_crgt,
|
||||
op_crlt, op_exar, op_sacb, op_lacb,
|
||||
&tms32051_device::op_addb, &tms32051_device::op_adcb, &tms32051_device::op_andb, &tms32051_device::op_orb,
|
||||
&tms32051_device::op_rolb, &tms32051_device::op_rorb, &tms32051_device::op_sflb, &tms32051_device::op_sfrb,
|
||||
&tms32051_device::op_sbb, &tms32051_device::op_sbbb, &tms32051_device::op_xorb, &tms32051_device::op_crgt,
|
||||
&tms32051_device::op_crlt, &tms32051_device::op_exar, &tms32051_device::op_sacb, &tms32051_device::op_lacb,
|
||||
/* 0x20 - 0x2f */
|
||||
op_bacc, op_baccd, op_idle, op_idle2,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_bacc, &tms32051_device::op_baccd, &tms32051_device::op_idle, &tms32051_device::op_idle2,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x30 - 0x3f */
|
||||
op_cala, op_invalid, op_pop, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_reti, op_invalid, op_rete, op_invalid,
|
||||
op_push, op_calad, op_invalid, op_invalid,
|
||||
&tms32051_device::op_cala, &tms32051_device::op_invalid, &tms32051_device::op_pop, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_reti, &tms32051_device::op_invalid, &tms32051_device::op_rete, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_push, &tms32051_device::op_calad, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x40 - 0x4f */
|
||||
op_clrc_intm, op_setc_intm, op_clrc_ov, op_setc_ov,
|
||||
op_clrc_cnf, op_setc_cnf, op_clrc_ext, op_setc_ext,
|
||||
op_clrc_hold, op_setc_hold, op_clrc_tc, op_setc_tc,
|
||||
op_clrc_xf, op_setc_xf, op_clrc_carry, op_setc_carry,
|
||||
&tms32051_device::op_clrc_intm, &tms32051_device::op_setc_intm, &tms32051_device::op_clrc_ov, &tms32051_device::op_setc_ov,
|
||||
&tms32051_device::op_clrc_cnf, &tms32051_device::op_setc_cnf, &tms32051_device::op_clrc_ext, &tms32051_device::op_setc_ext,
|
||||
&tms32051_device::op_clrc_hold, &tms32051_device::op_setc_hold, &tms32051_device::op_clrc_tc, &tms32051_device::op_setc_tc,
|
||||
&tms32051_device::op_clrc_xf, &tms32051_device::op_setc_xf, &tms32051_device::op_clrc_carry, &tms32051_device::op_setc_carry,
|
||||
/* 0x50 - 0x5f */
|
||||
op_invalid, op_trap, op_nmi, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_zpr, op_zap, op_sath, op_satl,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_trap, &tms32051_device::op_nmi, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_zpr, &tms32051_device::op_zap, &tms32051_device::op_sath, &tms32051_device::op_satl,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x60 - 0x6f */
|
||||
op_intr, op_intr, op_intr, op_intr,
|
||||
op_intr, op_intr, op_intr, op_intr,
|
||||
op_intr, op_intr, op_intr, op_intr,
|
||||
op_intr, op_intr, op_intr, op_intr,
|
||||
&tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr,
|
||||
&tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr,
|
||||
&tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr,
|
||||
&tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr,
|
||||
/* 0x70 - 0x7f */
|
||||
op_intr, op_intr, op_intr, op_intr,
|
||||
op_intr, op_intr, op_intr, op_intr,
|
||||
op_intr, op_intr, op_intr, op_intr,
|
||||
op_intr, op_intr, op_intr, op_intr,
|
||||
&tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr,
|
||||
&tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr,
|
||||
&tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr,
|
||||
&tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr,
|
||||
/* 0x80 - 0x8f */
|
||||
op_mpy_limm, op_and_s16_limm,op_or_s16_limm, op_xor_s16_limm,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_mpy_limm, &tms32051_device::op_and_s16_limm,&tms32051_device::op_or_s16_limm, &tms32051_device::op_xor_s16_limm,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x90 - 0x9f */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0xa0 - 0xaf */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0xb0 - 0xbf */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0xc0 - 0xcf */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_rpt_limm, op_rptz, op_rptb, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_rpt_limm, &tms32051_device::op_rptz, &tms32051_device::op_rptb, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0xd0 - 0xdf */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0xe0 - 0xef */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0xf0 - 0xff */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
};
|
||||
|
||||
static void (*const tms32051_opcode_table_bf[256])(tms32051_state *cpustate) =
|
||||
const tms32051_device::opcode_func tms32051_device::s_opcode_table_bf[256] =
|
||||
{
|
||||
/* 0x00 - 0x0f */
|
||||
op_spm, op_spm, op_spm, op_spm,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_lar_limm, op_lar_limm, op_lar_limm, op_lar_limm,
|
||||
op_lar_limm, op_lar_limm, op_lar_limm, op_lar_limm,
|
||||
&tms32051_device::op_spm, &tms32051_device::op_spm, &tms32051_device::op_spm, &tms32051_device::op_spm,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm,
|
||||
&tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm,
|
||||
/* 0x10 - 0x1f */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x20 - 0x2f */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x30 - 0x3f */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x40 - 0x4f */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_cmpr, op_cmpr, op_cmpr, op_cmpr,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_cmpr, &tms32051_device::op_cmpr, &tms32051_device::op_cmpr, &tms32051_device::op_cmpr,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x50 - 0x5f */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x60 - 0x6f */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x70 - 0x7f */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
/* 0x80 - 0x8f */
|
||||
op_lacc_limm, op_lacc_limm, op_lacc_limm, op_lacc_limm,
|
||||
op_lacc_limm, op_lacc_limm, op_lacc_limm, op_lacc_limm,
|
||||
op_lacc_limm, op_lacc_limm, op_lacc_limm, op_lacc_limm,
|
||||
op_lacc_limm, op_lacc_limm, op_lacc_limm, op_lacc_limm,
|
||||
&tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm,
|
||||
&tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm,
|
||||
&tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm,
|
||||
&tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm,
|
||||
/* 0x90 - 0x9f */
|
||||
op_add_limm, op_add_limm, op_add_limm, op_add_limm,
|
||||
op_add_limm, op_add_limm, op_add_limm, op_add_limm,
|
||||
op_add_limm, op_add_limm, op_add_limm, op_add_limm,
|
||||
op_add_limm, op_add_limm, op_add_limm, op_add_limm,
|
||||
&tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm,
|
||||
&tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm,
|
||||
&tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm,
|
||||
&tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm,
|
||||
/* 0xa0 - 0xaf */
|
||||
op_sub_limm, op_sub_limm, op_sub_limm, op_sub_limm,
|
||||
op_sub_limm, op_sub_limm, op_sub_limm, op_sub_limm,
|
||||
op_sub_limm, op_sub_limm, op_sub_limm, op_sub_limm,
|
||||
op_sub_limm, op_sub_limm, op_sub_limm, op_sub_limm,
|
||||
&tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm,
|
||||
&tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm,
|
||||
&tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm,
|
||||
&tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm,
|
||||
/* 0xb0 - 0xbf */
|
||||
op_and_limm, op_and_limm, op_and_limm, op_and_limm,
|
||||
op_and_limm, op_and_limm, op_and_limm, op_and_limm,
|
||||
op_and_limm, op_and_limm, op_and_limm, op_and_limm,
|
||||
op_and_limm, op_and_limm, op_and_limm, op_and_limm,
|
||||
&tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm,
|
||||
&tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm,
|
||||
&tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm,
|
||||
&tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm,
|
||||
/* 0xc0 - 0xcf */
|
||||
op_or_limm, op_or_limm, op_or_limm, op_or_limm,
|
||||
op_or_limm, op_or_limm, op_or_limm, op_or_limm,
|
||||
op_or_limm, op_or_limm, op_or_limm, op_or_limm,
|
||||
op_or_limm, op_or_limm, op_or_limm, op_or_limm,
|
||||
&tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm,
|
||||
&tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm,
|
||||
&tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm,
|
||||
&tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm,
|
||||
/* 0xd0 - 0xdf */
|
||||
op_xor_limm, op_xor_limm, op_xor_limm, op_xor_limm,
|
||||
op_xor_limm, op_xor_limm, op_xor_limm, op_xor_limm,
|
||||
op_xor_limm, op_xor_limm, op_xor_limm, op_xor_limm,
|
||||
op_xor_limm, op_xor_limm, op_xor_limm, op_xor_limm,
|
||||
&tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm,
|
||||
&tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm,
|
||||
&tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm,
|
||||
&tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm,
|
||||
/* 0xe0 - 0xef */
|
||||
op_bsar, op_bsar, op_bsar, op_bsar,
|
||||
op_bsar, op_bsar, op_bsar, op_bsar,
|
||||
op_bsar, op_bsar, op_bsar, op_bsar,
|
||||
op_bsar, op_bsar, op_bsar, op_bsar,
|
||||
&tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar,
|
||||
&tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar,
|
||||
&tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar,
|
||||
&tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar,
|
||||
/* 0xf0 - 0xff */
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
op_invalid, op_invalid, op_invalid, op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
&tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid,
|
||||
};
|
||||
|
@ -46,362 +46,331 @@ enum
|
||||
TMS32051_AR7,
|
||||
};
|
||||
|
||||
struct PMST
|
||||
|
||||
const device_type TMS32051 = &device_creator<tms32051_device>;
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Internal memory map
|
||||
**************************************************************************/
|
||||
|
||||
static ADDRESS_MAP_START( internal_pgm, AS_PROGRAM, 16, tms32051_device )
|
||||
AM_RANGE(0x0000, 0x1fff) AM_ROM // ROM TODO: is off-chip if MP/_MC = 0
|
||||
AM_RANGE(0x2000, 0x23ff) AM_RAM AM_SHARE("saram") // SARAM TODO: is off-chip if RAM bit = 0
|
||||
AM_RANGE(0xfe00, 0xffff) AM_RAM AM_SHARE("daram_b0") // DARAM B0 TODO: is off-chip if CNF = 0
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( internal_data, AS_DATA, 16, tms32051_device )
|
||||
AM_RANGE(0x0000, 0x005f) AM_READWRITE(cpuregs_r, cpuregs_w)
|
||||
AM_RANGE(0x0060, 0x007f) AM_RAM // DARAM B2
|
||||
AM_RANGE(0x0100, 0x02ff) AM_RAM AM_SHARE("daram_b0") // DARAM B0 TODO: is unconnected if CNF = 1
|
||||
AM_RANGE(0x0300, 0x04ff) AM_RAM // DARAM B1
|
||||
AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("saram") // SARAM TODO: is off-chip if OVLY = 0
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
tms32051_device::tms32051_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: cpu_device(mconfig, TMS32051, "TMS32051", tag, owner, clock, "tms32051", __FILE__)
|
||||
, m_program_config("program", ENDIANNESS_LITTLE, 16, 16, -1, ADDRESS_MAP_NAME(internal_pgm))
|
||||
, m_data_config("data", ENDIANNESS_LITTLE, 16, 16, -1, ADDRESS_MAP_NAME(internal_data))
|
||||
{
|
||||
UINT16 iptr;
|
||||
UINT16 avis;
|
||||
UINT16 ovly;
|
||||
UINT16 ram;
|
||||
UINT16 mpmc;
|
||||
UINT16 ndx;
|
||||
UINT16 trm;
|
||||
UINT16 braf;
|
||||
};
|
||||
|
||||
struct ST0
|
||||
{
|
||||
UINT16 dp;
|
||||
UINT16 intm;
|
||||
UINT16 ovm;
|
||||
UINT16 ov;
|
||||
UINT16 arp;
|
||||
};
|
||||
|
||||
struct ST1
|
||||
{
|
||||
UINT16 arb;
|
||||
UINT16 cnf;
|
||||
UINT16 tc;
|
||||
UINT16 sxm;
|
||||
UINT16 c;
|
||||
UINT16 hm;
|
||||
UINT16 xf;
|
||||
UINT16 pm;
|
||||
};
|
||||
|
||||
struct tms32051_state
|
||||
{
|
||||
UINT16 pc;
|
||||
UINT16 op;
|
||||
INT32 acc;
|
||||
INT32 accb;
|
||||
INT32 preg;
|
||||
UINT16 treg0;
|
||||
UINT16 treg1;
|
||||
UINT16 treg2;
|
||||
UINT16 ar[8];
|
||||
INT32 rptc;
|
||||
|
||||
UINT16 bmar;
|
||||
INT32 brcr;
|
||||
UINT16 paer;
|
||||
UINT16 pasr;
|
||||
UINT16 indx;
|
||||
UINT16 dbmr;
|
||||
UINT16 arcr;
|
||||
|
||||
ST0 st0;
|
||||
ST1 st1;
|
||||
PMST pmst;
|
||||
|
||||
UINT16 ifr;
|
||||
UINT16 imr;
|
||||
|
||||
UINT16 pcstack[8];
|
||||
int pcstack_ptr;
|
||||
|
||||
UINT16 rpt_start, rpt_end;
|
||||
|
||||
UINT16 cbcr;
|
||||
UINT16 cbsr1;
|
||||
UINT16 cber1;
|
||||
UINT16 cbsr2;
|
||||
UINT16 cber2;
|
||||
|
||||
struct
|
||||
{
|
||||
int tddr;
|
||||
int psc;
|
||||
UINT16 tim;
|
||||
UINT16 prd;
|
||||
} timer;
|
||||
|
||||
struct
|
||||
{
|
||||
INT32 acc;
|
||||
INT32 accb;
|
||||
UINT16 arcr;
|
||||
UINT16 indx;
|
||||
PMST pmst;
|
||||
INT32 preg;
|
||||
ST0 st0;
|
||||
ST1 st1;
|
||||
INT32 treg0;
|
||||
INT32 treg1;
|
||||
INT32 treg2;
|
||||
} shadow;
|
||||
|
||||
legacy_cpu_device *device;
|
||||
address_space *program;
|
||||
direct_read_data *direct;
|
||||
address_space *data;
|
||||
int icount;
|
||||
};
|
||||
|
||||
INLINE tms32051_state *get_safe_token(device_t *device)
|
||||
{
|
||||
assert(device != NULL);
|
||||
assert(device->type() == TMS32051);
|
||||
return (tms32051_state *)downcast<legacy_cpu_device *>(device)->token();
|
||||
}
|
||||
|
||||
static void delay_slot(tms32051_state *cpustate, UINT16 startpc);
|
||||
static void save_interrupt_context(tms32051_state *cpustate);
|
||||
static void restore_interrupt_context(tms32051_state *cpustate);
|
||||
static void check_interrupts(tms32051_state *cpustate);
|
||||
|
||||
|
||||
#define CYCLES(x) (cpustate->icount -= x)
|
||||
|
||||
#define ROPCODE(cpustate) cpustate->direct->read_decrypted_word((cpustate->pc++) << 1)
|
||||
|
||||
INLINE void CHANGE_PC(tms32051_state *cpustate, UINT16 new_pc)
|
||||
offs_t tms32051_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
|
||||
{
|
||||
cpustate->pc = new_pc;
|
||||
extern CPU_DISASSEMBLE( tms32051 );
|
||||
return CPU_DISASSEMBLE_NAME(tms32051)(this, buffer, pc, oprom, opram, options);
|
||||
}
|
||||
|
||||
INLINE UINT16 PM_READ16(tms32051_state *cpustate, UINT16 address)
|
||||
|
||||
#define CYCLES(x) (m_icount -= x)
|
||||
|
||||
#define ROPCODE() m_direct->read_decrypted_word((m_pc++) << 1)
|
||||
|
||||
void tms32051_device::CHANGE_PC(UINT16 new_pc)
|
||||
{
|
||||
return cpustate->program->read_word(address << 1);
|
||||
m_pc = new_pc;
|
||||
}
|
||||
|
||||
INLINE void PM_WRITE16(tms32051_state *cpustate, UINT16 address, UINT16 data)
|
||||
UINT16 tms32051_device::PM_READ16(UINT16 address)
|
||||
{
|
||||
cpustate->program->write_word(address << 1, data);
|
||||
return m_program->read_word(address << 1);
|
||||
}
|
||||
|
||||
INLINE UINT16 DM_READ16(tms32051_state *cpustate, UINT16 address)
|
||||
void tms32051_device::PM_WRITE16(UINT16 address, UINT16 data)
|
||||
{
|
||||
return cpustate->data->read_word(address << 1);
|
||||
m_program->write_word(address << 1, data);
|
||||
}
|
||||
|
||||
INLINE void DM_WRITE16(tms32051_state *cpustate, UINT16 address, UINT16 data)
|
||||
UINT16 tms32051_device::DM_READ16(UINT16 address)
|
||||
{
|
||||
cpustate->data->write_word(address << 1, data);
|
||||
return m_data->read_word(address << 1);
|
||||
}
|
||||
|
||||
void tms32051_device::DM_WRITE16(UINT16 address, UINT16 data)
|
||||
{
|
||||
m_data->write_word(address << 1, data);
|
||||
}
|
||||
|
||||
#include "32051ops.c"
|
||||
#include "32051ops.h"
|
||||
|
||||
static void op_group_be(tms32051_state *cpustate)
|
||||
void tms32051_device::op_group_be()
|
||||
{
|
||||
tms32051_opcode_table_be[cpustate->op & 0xff](cpustate);
|
||||
(this->*s_opcode_table_be[m_op & 0xff])();
|
||||
}
|
||||
|
||||
static void op_group_bf(tms32051_state *cpustate)
|
||||
void tms32051_device::op_group_bf()
|
||||
{
|
||||
tms32051_opcode_table_bf[cpustate->op & 0xff](cpustate);
|
||||
(this->*s_opcode_table_bf[m_op & 0xff])();
|
||||
}
|
||||
|
||||
static void delay_slot(tms32051_state *cpustate, UINT16 startpc)
|
||||
void tms32051_device::delay_slot(UINT16 startpc)
|
||||
{
|
||||
cpustate->op = ROPCODE(cpustate);
|
||||
tms32051_opcode_table[cpustate->op >> 8](cpustate);
|
||||
m_op = ROPCODE();
|
||||
(this->*s_opcode_table[m_op >> 8])();
|
||||
|
||||
while (cpustate->pc - startpc < 2)
|
||||
while (m_pc - startpc < 2)
|
||||
{
|
||||
cpustate->op = ROPCODE(cpustate);
|
||||
tms32051_opcode_table[cpustate->op >> 8](cpustate);
|
||||
m_op = ROPCODE();
|
||||
(this->*s_opcode_table[m_op >> 8])();
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static CPU_INIT( tms )
|
||||
void tms32051_device::device_start()
|
||||
{
|
||||
tms32051_state *cpustate = get_safe_token(device);
|
||||
m_program = &space(AS_PROGRAM);
|
||||
m_direct = &m_program->direct();
|
||||
m_data = &space(AS_DATA);
|
||||
|
||||
cpustate->device = device;
|
||||
cpustate->program = &device->space(AS_PROGRAM);
|
||||
cpustate->direct = &cpustate->program->direct();
|
||||
cpustate->data = &device->space(AS_DATA);
|
||||
m_pcstack_ptr = 0;
|
||||
m_op = 0;
|
||||
m_acc = 0;
|
||||
m_accb = 0;
|
||||
m_preg = 0;
|
||||
m_treg0 = 0;
|
||||
m_treg1 = 0;
|
||||
m_treg2 = 0;
|
||||
memset(m_ar, 0, sizeof(m_ar));
|
||||
m_bmar = 0;
|
||||
m_brcr = 0;
|
||||
m_paer = 0;
|
||||
m_pasr = 0;
|
||||
m_indx = 0;
|
||||
m_dbmr = 0;
|
||||
m_arcr = 0;
|
||||
memset(&m_st0, 0, sizeof(m_st0));
|
||||
memset(&m_st1, 0, sizeof(m_st1));
|
||||
memset(&m_pmst, 0, sizeof(m_pmst));
|
||||
memset(m_pcstack, 0, sizeof(m_pcstack));
|
||||
m_imr = 0;
|
||||
m_cbsr1 = 0;
|
||||
m_cber1 = 0;
|
||||
m_cbsr2 = 0;
|
||||
m_cber2 = 0;
|
||||
memset(&m_timer, 0, sizeof(m_timer));
|
||||
|
||||
cpustate->pcstack_ptr = 0;
|
||||
state_add( TMS32051_PC, "PC", m_pc).formatstr("%04X");
|
||||
state_add( TMS32051_ACC, "ACC", m_acc).formatstr("%08X");
|
||||
state_add( TMS32051_ACCB, "ACCB", m_accb).formatstr("%08X");
|
||||
state_add( TMS32051_PREG, "PREG", m_preg).formatstr("%08X");
|
||||
state_add( TMS32051_TREG0, "TREG0", m_treg0).formatstr("%04X");
|
||||
state_add( TMS32051_TREG1, "TREG1", m_treg1).formatstr("%04X");
|
||||
state_add( TMS32051_TREG2, "TREG2", m_treg2).formatstr("%04X");
|
||||
state_add( TMS32051_BMAR, "BMAR", m_bmar).formatstr("%08X");
|
||||
state_add( TMS32051_RPTC, "RPTC", m_rptc).formatstr("%08X");
|
||||
state_add( TMS32051_BRCR, "BRCR", m_brcr).formatstr("%08X");
|
||||
state_add( TMS32051_INDX, "INDX", m_indx).formatstr("%04X");
|
||||
state_add( TMS32051_DBMR, "DBMR", m_dbmr).formatstr("%04X");
|
||||
state_add( TMS32051_ARCR, "ARCR", m_arcr).formatstr("%04X");
|
||||
state_add( TMS32051_DP, "DP", m_st0.dp).formatstr("%04X");
|
||||
state_add( TMS32051_ARP, "ARP", m_st0.arp).formatstr("%04X");
|
||||
state_add( TMS32051_ARB, "ARB", m_st1.arb).formatstr("%04X");
|
||||
state_add( TMS32051_AR0, "AR0", m_ar[0]).formatstr("%04X");
|
||||
state_add( TMS32051_AR1, "AR1", m_ar[1]).formatstr("%04X");
|
||||
state_add( TMS32051_AR2, "AR2", m_ar[2]).formatstr("%04X");
|
||||
state_add( TMS32051_AR3, "AR3", m_ar[3]).formatstr("%04X");
|
||||
state_add( TMS32051_AR4, "AR4", m_ar[4]).formatstr("%04X");
|
||||
state_add( TMS32051_AR5, "AR5", m_ar[5]).formatstr("%04X");
|
||||
state_add( TMS32051_AR6, "AR6", m_ar[6]).formatstr("%04X");
|
||||
state_add( TMS32051_AR7, "AR7", m_ar[7]).formatstr("%04X");
|
||||
|
||||
state_add(STATE_GENPC, "GENPC", m_pc).formatstr("%04X").noshow();
|
||||
|
||||
m_icountptr = &m_icount;
|
||||
}
|
||||
|
||||
static CPU_RESET( tms )
|
||||
void tms32051_device::device_reset()
|
||||
{
|
||||
tms32051_state *cpustate = get_safe_token(device);
|
||||
|
||||
// reset registers
|
||||
cpustate->st0.intm = 1;
|
||||
cpustate->st0.ov = 0;
|
||||
cpustate->st1.c = 1;
|
||||
cpustate->st1.cnf = 0;
|
||||
cpustate->st1.hm = 1;
|
||||
cpustate->st1.pm = 0;
|
||||
cpustate->st1.sxm = 1;
|
||||
cpustate->st1.xf = 1;
|
||||
cpustate->pmst.avis = 0;
|
||||
cpustate->pmst.braf = 0;
|
||||
cpustate->pmst.iptr = 0;
|
||||
cpustate->pmst.ndx = 0;
|
||||
cpustate->pmst.ovly = 0;
|
||||
cpustate->pmst.ram = 0;
|
||||
cpustate->pmst.mpmc = 0; // TODO: this is set to logical pin state at reset
|
||||
cpustate->pmst.trm = 0;
|
||||
cpustate->ifr = 0;
|
||||
cpustate->cbcr = 0;
|
||||
cpustate->rptc = -1;
|
||||
m_st0.intm = 1;
|
||||
m_st0.ov = 0;
|
||||
m_st1.c = 1;
|
||||
m_st1.cnf = 0;
|
||||
m_st1.hm = 1;
|
||||
m_st1.pm = 0;
|
||||
m_st1.sxm = 1;
|
||||
m_st1.xf = 1;
|
||||
m_pmst.avis = 0;
|
||||
m_pmst.braf = 0;
|
||||
m_pmst.iptr = 0;
|
||||
m_pmst.ndx = 0;
|
||||
m_pmst.ovly = 0;
|
||||
m_pmst.ram = 0;
|
||||
m_pmst.mpmc = 0; // TODO: this is set to logical pin state at reset
|
||||
m_pmst.trm = 0;
|
||||
m_ifr = 0;
|
||||
m_cbcr = 0;
|
||||
m_rptc = -1;
|
||||
|
||||
// simulate internal rom boot loader (can be removed when the dsp rom(s) is dumped)
|
||||
cpustate->st0.intm = 1;
|
||||
cpustate->st1.cnf = 1;
|
||||
cpustate->pmst.ram = 1;
|
||||
cpustate->pmst.ovly = 0;
|
||||
m_st0.intm = 1;
|
||||
m_st1.cnf = 1;
|
||||
m_pmst.ram = 1;
|
||||
m_pmst.ovly = 0;
|
||||
|
||||
int i;
|
||||
UINT16 src, dst, length;
|
||||
|
||||
src = 0x7800;
|
||||
dst = DM_READ16(cpustate, src++);
|
||||
length = DM_READ16(cpustate, src++);
|
||||
dst = DM_READ16(src++);
|
||||
length = DM_READ16(src++);
|
||||
|
||||
CHANGE_PC(cpustate, dst);
|
||||
CHANGE_PC(dst);
|
||||
|
||||
/* TODO: if you soft reset on Taito JC it tries to do a 0x7802->0x9007 (0xff00) transfer. */
|
||||
for (i=0; i < (length & 0x7ff); i++)
|
||||
{
|
||||
UINT16 data = DM_READ16(cpustate, src++);
|
||||
PM_WRITE16(cpustate, dst++, data);
|
||||
UINT16 data = DM_READ16(src++);
|
||||
PM_WRITE16(dst++, data);
|
||||
}
|
||||
}
|
||||
|
||||
static void check_interrupts(tms32051_state *cpustate)
|
||||
void tms32051_device::check_interrupts()
|
||||
{
|
||||
int i;
|
||||
|
||||
if (cpustate->st0.intm == 0 && cpustate->ifr != 0)
|
||||
if (m_st0.intm == 0 && m_ifr != 0)
|
||||
{
|
||||
for (i=0; i < 16; i++)
|
||||
{
|
||||
if (cpustate->ifr & (1 << i))
|
||||
if (m_ifr & (1 << i))
|
||||
{
|
||||
cpustate->st0.intm = 1;
|
||||
PUSH_STACK(cpustate, cpustate->pc);
|
||||
m_st0.intm = 1;
|
||||
PUSH_STACK(m_pc);
|
||||
|
||||
cpustate->pc = (cpustate->pmst.iptr << 11) | ((i+1) << 1);
|
||||
cpustate->ifr &= ~(1 << i);
|
||||
m_pc = (m_pmst.iptr << 11) | ((i+1) << 1);
|
||||
m_ifr &= ~(1 << i);
|
||||
|
||||
save_interrupt_context(cpustate);
|
||||
save_interrupt_context();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void save_interrupt_context(tms32051_state *cpustate)
|
||||
void tms32051_device::save_interrupt_context()
|
||||
{
|
||||
cpustate->shadow.acc = cpustate->acc;
|
||||
cpustate->shadow.accb = cpustate->accb;
|
||||
cpustate->shadow.arcr = cpustate->arcr;
|
||||
cpustate->shadow.indx = cpustate->indx;
|
||||
cpustate->shadow.preg = cpustate->preg;
|
||||
cpustate->shadow.treg0 = cpustate->treg0;
|
||||
cpustate->shadow.treg1 = cpustate->treg1;
|
||||
cpustate->shadow.treg2 = cpustate->treg2;
|
||||
memcpy(&cpustate->shadow.pmst, &cpustate->pmst, sizeof(PMST));
|
||||
memcpy(&cpustate->shadow.st0, &cpustate->st0, sizeof(ST0));
|
||||
memcpy(&cpustate->shadow.st1, &cpustate->st1, sizeof(ST1));
|
||||
m_shadow.acc = m_acc;
|
||||
m_shadow.accb = m_accb;
|
||||
m_shadow.arcr = m_arcr;
|
||||
m_shadow.indx = m_indx;
|
||||
m_shadow.preg = m_preg;
|
||||
m_shadow.treg0 = m_treg0;
|
||||
m_shadow.treg1 = m_treg1;
|
||||
m_shadow.treg2 = m_treg2;
|
||||
memcpy(&m_shadow.pmst, &m_pmst, sizeof(TMS32051_PMST));
|
||||
memcpy(&m_shadow.st0, &m_st0, sizeof(TMS32051_ST0));
|
||||
memcpy(&m_shadow.st1, &m_st1, sizeof(TMS32051_ST1));
|
||||
}
|
||||
|
||||
static void restore_interrupt_context(tms32051_state *cpustate)
|
||||
void tms32051_device::restore_interrupt_context()
|
||||
{
|
||||
cpustate->acc = cpustate->shadow.acc;
|
||||
cpustate->accb = cpustate->shadow.accb;
|
||||
cpustate->arcr = cpustate->shadow.arcr;
|
||||
cpustate->indx = cpustate->shadow.indx;
|
||||
cpustate->preg = cpustate->shadow.preg;
|
||||
cpustate->treg0 = cpustate->shadow.treg0;
|
||||
cpustate->treg1 = cpustate->shadow.treg1;
|
||||
cpustate->treg2 = cpustate->shadow.treg2;
|
||||
memcpy(&cpustate->pmst, &cpustate->shadow.pmst, sizeof(PMST));
|
||||
memcpy(&cpustate->st0, &cpustate->shadow.st0, sizeof(ST0));
|
||||
memcpy(&cpustate->st1, &cpustate->shadow.st1, sizeof(ST1));
|
||||
m_acc = m_shadow.acc;
|
||||
m_accb = m_shadow.accb;
|
||||
m_arcr = m_shadow.arcr;
|
||||
m_indx = m_shadow.indx;
|
||||
m_preg = m_shadow.preg;
|
||||
m_treg0 = m_shadow.treg0;
|
||||
m_treg1 = m_shadow.treg1;
|
||||
m_treg2 = m_shadow.treg2;
|
||||
memcpy(&m_pmst, &m_shadow.pmst, sizeof(TMS32051_PMST));
|
||||
memcpy(&m_st0, &m_shadow.st0, sizeof(TMS32051_ST0));
|
||||
memcpy(&m_st1, &m_shadow.st1, sizeof(TMS32051_ST1));
|
||||
}
|
||||
|
||||
static void tms_interrupt(tms32051_state *cpustate, int irq)
|
||||
void tms32051_device::execute_set_input(int irq, int state)
|
||||
{
|
||||
if ((cpustate->imr & (1 << irq)) != 0)
|
||||
if ( state == ASSERT_LINE )
|
||||
{
|
||||
cpustate->ifr |= 1 << irq;
|
||||
if ((m_imr & (1 << irq)) != 0)
|
||||
{
|
||||
m_ifr |= 1 << irq;
|
||||
}
|
||||
|
||||
check_interrupts();
|
||||
}
|
||||
|
||||
check_interrupts(cpustate);
|
||||
}
|
||||
|
||||
static CPU_EXIT( tms )
|
||||
{
|
||||
/* TODO */
|
||||
}
|
||||
|
||||
static CPU_EXECUTE( tms )
|
||||
void tms32051_device::execute_run()
|
||||
{
|
||||
tms32051_state *cpustate = get_safe_token(device);
|
||||
|
||||
while(cpustate->icount > 0)
|
||||
while(m_icount > 0)
|
||||
{
|
||||
UINT16 ppc;
|
||||
|
||||
// handle block repeat
|
||||
if (cpustate->pmst.braf)
|
||||
if (m_pmst.braf)
|
||||
{
|
||||
if (cpustate->pc == cpustate->paer)
|
||||
if (m_pc == m_paer)
|
||||
{
|
||||
if (cpustate->brcr > 0)
|
||||
if (m_brcr > 0)
|
||||
{
|
||||
CHANGE_PC(cpustate, cpustate->pasr);
|
||||
CHANGE_PC(m_pasr);
|
||||
}
|
||||
|
||||
cpustate->brcr--;
|
||||
if (cpustate->brcr <= 0)
|
||||
m_brcr--;
|
||||
if (m_brcr <= 0)
|
||||
{
|
||||
cpustate->pmst.braf = 0;
|
||||
m_pmst.braf = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ppc = cpustate->pc;
|
||||
debugger_instruction_hook(device, cpustate->pc);
|
||||
ppc = m_pc;
|
||||
debugger_instruction_hook(this, m_pc);
|
||||
|
||||
cpustate->op = ROPCODE(cpustate);
|
||||
tms32051_opcode_table[cpustate->op >> 8](cpustate);
|
||||
m_op = ROPCODE();
|
||||
(this->*s_opcode_table[m_op >> 8])();
|
||||
|
||||
// handle single repeat
|
||||
if (cpustate->rptc > 0)
|
||||
if (m_rptc > 0)
|
||||
{
|
||||
if (ppc == cpustate->rpt_end)
|
||||
if (ppc == m_rpt_end)
|
||||
{
|
||||
CHANGE_PC(cpustate, cpustate->rpt_start);
|
||||
cpustate->rptc--;
|
||||
CHANGE_PC(m_rpt_start);
|
||||
m_rptc--;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cpustate->rptc = 0;
|
||||
m_rptc = 0;
|
||||
}
|
||||
|
||||
cpustate->timer.psc--;
|
||||
if (cpustate->timer.psc <= 0)
|
||||
m_timer.psc--;
|
||||
if (m_timer.psc <= 0)
|
||||
{
|
||||
cpustate->timer.psc = cpustate->timer.tddr;
|
||||
cpustate->timer.tim--;
|
||||
if (cpustate->timer.tim <= 0)
|
||||
m_timer.psc = m_timer.tddr;
|
||||
m_timer.tim--;
|
||||
if (m_timer.tim <= 0)
|
||||
{
|
||||
// reset timer
|
||||
cpustate->timer.tim = cpustate->timer.prd;
|
||||
m_timer.tim = m_timer.prd;
|
||||
|
||||
tms_interrupt(cpustate, INTERRUPT_TINT);
|
||||
execute_set_input(INTERRUPT_TINT, ASSERT_LINE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -410,68 +379,64 @@ static CPU_EXECUTE( tms )
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static READ16_HANDLER( cpuregs_r )
|
||||
READ16_MEMBER( tms32051_device::cpuregs_r )
|
||||
{
|
||||
tms32051_state *cpustate = get_safe_token(&space.device());
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0x04: return cpustate->imr;
|
||||
case 0x06: return cpustate->ifr;
|
||||
case 0x04: return m_imr;
|
||||
case 0x06: return m_ifr;
|
||||
|
||||
case 0x07: // PMST
|
||||
{
|
||||
UINT16 r = 0;
|
||||
r |= cpustate->pmst.iptr << 11;
|
||||
r |= cpustate->pmst.avis << 7;
|
||||
r |= cpustate->pmst.ovly << 5;
|
||||
r |= cpustate->pmst.ram << 4;
|
||||
r |= cpustate->pmst.mpmc << 3;
|
||||
r |= cpustate->pmst.ndx << 2;
|
||||
r |= cpustate->pmst.trm << 1;
|
||||
r |= cpustate->pmst.braf << 0;
|
||||
r |= m_pmst.iptr << 11;
|
||||
r |= m_pmst.avis << 7;
|
||||
r |= m_pmst.ovly << 5;
|
||||
r |= m_pmst.ram << 4;
|
||||
r |= m_pmst.mpmc << 3;
|
||||
r |= m_pmst.ndx << 2;
|
||||
r |= m_pmst.trm << 1;
|
||||
r |= m_pmst.braf << 0;
|
||||
return r;
|
||||
}
|
||||
|
||||
case 0x09: return cpustate->brcr;
|
||||
case 0x10: return cpustate->ar[0];
|
||||
case 0x11: return cpustate->ar[1];
|
||||
case 0x12: return cpustate->ar[2];
|
||||
case 0x13: return cpustate->ar[3];
|
||||
case 0x14: return cpustate->ar[4];
|
||||
case 0x15: return cpustate->ar[5];
|
||||
case 0x16: return cpustate->ar[6];
|
||||
case 0x17: return cpustate->ar[7];
|
||||
case 0x1e: return cpustate->cbcr;
|
||||
case 0x1f: return cpustate->bmar;
|
||||
case 0x24: return cpustate->timer.tim;
|
||||
case 0x25: return cpustate->timer.prd;
|
||||
case 0x09: return m_brcr;
|
||||
case 0x10: return m_ar[0];
|
||||
case 0x11: return m_ar[1];
|
||||
case 0x12: return m_ar[2];
|
||||
case 0x13: return m_ar[3];
|
||||
case 0x14: return m_ar[4];
|
||||
case 0x15: return m_ar[5];
|
||||
case 0x16: return m_ar[6];
|
||||
case 0x17: return m_ar[7];
|
||||
case 0x1e: return m_cbcr;
|
||||
case 0x1f: return m_bmar;
|
||||
case 0x24: return m_timer.tim;
|
||||
case 0x25: return m_timer.prd;
|
||||
|
||||
case 0x26: // TCR
|
||||
{
|
||||
UINT16 r = 0;
|
||||
r |= (cpustate->timer.psc & 0xf) << 6;
|
||||
r |= (cpustate->timer.tddr & 0xf);
|
||||
r |= (m_timer.psc & 0xf) << 6;
|
||||
r |= (m_timer.tddr & 0xf);
|
||||
return r;
|
||||
}
|
||||
|
||||
case 0x28: return 0; // PDWSR
|
||||
default:
|
||||
if(!space.debugger_access())
|
||||
fatalerror("32051: cpuregs_r: unimplemented memory-mapped register %02X at %04X\n", offset, cpustate->pc-1);
|
||||
fatalerror("32051: cpuregs_r: unimplemented memory-mapped register %02X at %04X\n", offset, m_pc-1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static WRITE16_HANDLER( cpuregs_w )
|
||||
WRITE16_MEMBER( tms32051_device::cpuregs_w )
|
||||
{
|
||||
tms32051_state *cpustate = get_safe_token(&space.device());
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0x00: break;
|
||||
case 0x04: cpustate->imr = data; break;
|
||||
case 0x04: m_imr = data; break;
|
||||
case 0x06: // IFR
|
||||
{
|
||||
int i;
|
||||
@ -479,7 +444,7 @@ static WRITE16_HANDLER( cpuregs_w )
|
||||
{
|
||||
if (data & (1 << i))
|
||||
{
|
||||
cpustate->ifr &= ~(1 << i);
|
||||
m_ifr &= ~(1 << i);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -487,48 +452,48 @@ static WRITE16_HANDLER( cpuregs_w )
|
||||
|
||||
case 0x07: // PMST
|
||||
{
|
||||
cpustate->pmst.iptr = (data >> 11) & 0x1f;
|
||||
cpustate->pmst.avis = (data & 0x80) ? 1 : 0;
|
||||
cpustate->pmst.ovly = (data & 0x20) ? 1 : 0;
|
||||
cpustate->pmst.ram = (data & 0x10) ? 1 : 0;
|
||||
cpustate->pmst.mpmc = (data & 0x08) ? 1 : 0;
|
||||
cpustate->pmst.ndx = (data & 0x04) ? 1 : 0;
|
||||
cpustate->pmst.trm = (data & 0x02) ? 1 : 0;
|
||||
cpustate->pmst.braf = (data & 0x01) ? 1 : 0;
|
||||
m_pmst.iptr = (data >> 11) & 0x1f;
|
||||
m_pmst.avis = (data & 0x80) ? 1 : 0;
|
||||
m_pmst.ovly = (data & 0x20) ? 1 : 0;
|
||||
m_pmst.ram = (data & 0x10) ? 1 : 0;
|
||||
m_pmst.mpmc = (data & 0x08) ? 1 : 0;
|
||||
m_pmst.ndx = (data & 0x04) ? 1 : 0;
|
||||
m_pmst.trm = (data & 0x02) ? 1 : 0;
|
||||
m_pmst.braf = (data & 0x01) ? 1 : 0;
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x09: cpustate->brcr = data; break;
|
||||
case 0x0e: cpustate->treg2 = data; break;
|
||||
case 0x0f: cpustate->dbmr = data; break;
|
||||
case 0x10: cpustate->ar[0] = data; break;
|
||||
case 0x11: cpustate->ar[1] = data; break;
|
||||
case 0x12: cpustate->ar[2] = data; break;
|
||||
case 0x13: cpustate->ar[3] = data; break;
|
||||
case 0x14: cpustate->ar[4] = data; break;
|
||||
case 0x15: cpustate->ar[5] = data; break;
|
||||
case 0x16: cpustate->ar[6] = data; break;
|
||||
case 0x17: cpustate->ar[7] = data; break;
|
||||
case 0x18: cpustate->indx = data; break;
|
||||
case 0x19: cpustate->arcr = data; break;
|
||||
case 0x1a: cpustate->cbsr1 = data; break;
|
||||
case 0x1b: cpustate->cber1 = data; break;
|
||||
case 0x1c: cpustate->cbsr2 = data; break;
|
||||
case 0x1d: cpustate->cber2 = data; break;
|
||||
case 0x1e: cpustate->cbcr = data; break;
|
||||
case 0x1f: cpustate->bmar = data; break;
|
||||
case 0x24: cpustate->timer.tim = data; break;
|
||||
case 0x25: cpustate->timer.prd = data; break;
|
||||
case 0x09: m_brcr = data; break;
|
||||
case 0x0e: m_treg2 = data; break;
|
||||
case 0x0f: m_dbmr = data; break;
|
||||
case 0x10: m_ar[0] = data; break;
|
||||
case 0x11: m_ar[1] = data; break;
|
||||
case 0x12: m_ar[2] = data; break;
|
||||
case 0x13: m_ar[3] = data; break;
|
||||
case 0x14: m_ar[4] = data; break;
|
||||
case 0x15: m_ar[5] = data; break;
|
||||
case 0x16: m_ar[6] = data; break;
|
||||
case 0x17: m_ar[7] = data; break;
|
||||
case 0x18: m_indx = data; break;
|
||||
case 0x19: m_arcr = data; break;
|
||||
case 0x1a: m_cbsr1 = data; break;
|
||||
case 0x1b: m_cber1 = data; break;
|
||||
case 0x1c: m_cbsr2 = data; break;
|
||||
case 0x1d: m_cber2 = data; break;
|
||||
case 0x1e: m_cbcr = data; break;
|
||||
case 0x1f: m_bmar = data; break;
|
||||
case 0x24: m_timer.tim = data; break;
|
||||
case 0x25: m_timer.prd = data; break;
|
||||
|
||||
case 0x26: // TCR
|
||||
{
|
||||
cpustate->timer.tddr = data & 0xf;
|
||||
cpustate->timer.psc = (data >> 6) & 0xf;
|
||||
m_timer.tddr = data & 0xf;
|
||||
m_timer.psc = (data >> 6) & 0xf;
|
||||
|
||||
if (data & 0x20)
|
||||
{
|
||||
cpustate->timer.tim = cpustate->timer.prd;
|
||||
cpustate->timer.psc = cpustate->timer.tddr;
|
||||
m_timer.tim = m_timer.prd;
|
||||
m_timer.psc = m_timer.tddr;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -536,215 +501,23 @@ static WRITE16_HANDLER( cpuregs_w )
|
||||
case 0x28: break; // PDWSR
|
||||
default:
|
||||
if(!space.debugger_access())
|
||||
fatalerror("32051: cpuregs_w: unimplemented memory-mapped register %02X, data %04X at %04X\n", offset, data, cpustate->pc-1);
|
||||
fatalerror("32051: cpuregs_w: unimplemented memory-mapped register %02X, data %04X at %04X\n", offset, data, m_pc-1);
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* Internal memory map
|
||||
**************************************************************************/
|
||||
|
||||
static ADDRESS_MAP_START( internal_pgm, AS_PROGRAM, 16, legacy_cpu_device )
|
||||
AM_RANGE(0x0000, 0x1fff) AM_ROM // ROM TODO: is off-chip if MP/_MC = 0
|
||||
AM_RANGE(0x2000, 0x23ff) AM_RAM AM_SHARE("saram") // SARAM TODO: is off-chip if RAM bit = 0
|
||||
AM_RANGE(0xfe00, 0xffff) AM_RAM AM_SHARE("daram_b0") // DARAM B0 TODO: is off-chip if CNF = 0
|
||||
ADDRESS_MAP_END
|
||||
bool tms32051_device::memory_read(address_spacenum spacenum, offs_t offset, int size, UINT64 &value)
|
||||
|
||||
static ADDRESS_MAP_START( internal_data, AS_DATA, 16, legacy_cpu_device )
|
||||
AM_RANGE(0x0000, 0x005f) AM_READWRITE_LEGACY(cpuregs_r, cpuregs_w)
|
||||
AM_RANGE(0x0060, 0x007f) AM_RAM // DARAM B2
|
||||
AM_RANGE(0x0100, 0x02ff) AM_RAM AM_SHARE("daram_b0") // DARAM B0 TODO: is unconnected if CNF = 1
|
||||
AM_RANGE(0x0300, 0x04ff) AM_RAM // DARAM B1
|
||||
AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("saram") // SARAM TODO: is off-chip if OVLY = 0
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/**************************************************************************
|
||||
* Generic set_info
|
||||
**************************************************************************/
|
||||
|
||||
static CPU_SET_INFO( tms )
|
||||
{
|
||||
tms32051_state *cpustate = get_safe_token(device);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case CPUINFO_INT_PC:
|
||||
case CPUINFO_INT_REGISTER + TMS32051_PC: cpustate->pc = info->i; break;
|
||||
}
|
||||
}
|
||||
|
||||
static CPU_READ( tms )
|
||||
{
|
||||
tms32051_state *cpustate = get_safe_token(device);
|
||||
/* TODO: alignment if offset is odd */
|
||||
if (space == AS_PROGRAM)
|
||||
if (spacenum == AS_PROGRAM)
|
||||
{
|
||||
*value = (PM_READ16(cpustate, offset>>1));
|
||||
value = (PM_READ16(offset>>1));
|
||||
}
|
||||
else if (space == AS_DATA)
|
||||
else if (spacenum == AS_DATA)
|
||||
{
|
||||
*value = (DM_READ16(cpustate, offset>>1));
|
||||
value = (DM_READ16(offset>>1));
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static CPU_GET_INFO( tms )
|
||||
{
|
||||
tms32051_state *cpustate = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL;
|
||||
|
||||
switch(state)
|
||||
{
|
||||
/* --- the following bits of info are returned as 64-bit signed integers --- */
|
||||
case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(tms32051_state); break;
|
||||
case CPUINFO_INT_INPUT_LINES: info->i = 6; break;
|
||||
case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break;
|
||||
case CPUINFO_INT_ENDIANNESS: info->i = ENDIANNESS_LITTLE; break;
|
||||
case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break;
|
||||
case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break;
|
||||
case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 2; break;
|
||||
case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 4; break;
|
||||
case CPUINFO_INT_MIN_CYCLES: info->i = 1; break;
|
||||
case CPUINFO_INT_MAX_CYCLES: info->i = 5; break;
|
||||
|
||||
case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM: info->i = 16; break;
|
||||
case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 16; break;
|
||||
case CPUINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = -1; break;
|
||||
case CPUINFO_INT_DATABUS_WIDTH + AS_DATA: info->i = 16; break;
|
||||
case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA: info->i = 16; break;
|
||||
case CPUINFO_INT_ADDRBUS_SHIFT + AS_DATA: info->i = -1; break;
|
||||
case CPUINFO_INT_DATABUS_WIDTH + AS_IO: info->i = 0; break;
|
||||
case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO: info->i = 0; break;
|
||||
case CPUINFO_INT_ADDRBUS_SHIFT + AS_IO: info->i = 0; break;
|
||||
|
||||
case CPUINFO_INT_INPUT_STATE: info->i = CLEAR_LINE; break;
|
||||
|
||||
case CPUINFO_INT_PREVIOUSPC: /* not implemented */ break;
|
||||
|
||||
case CPUINFO_INT_PC:
|
||||
case CPUINFO_INT_REGISTER + TMS32051_PC: info->i = cpustate->pc; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_ACC: info->i = cpustate->acc; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_ACCB: info->i = cpustate->accb; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_PREG: info->i = cpustate->preg; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_TREG0: info->i = cpustate->treg0; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_TREG1: info->i = cpustate->treg1; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_TREG2: info->i = cpustate->treg2; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_BMAR: info->i = cpustate->bmar; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_RPTC: info->i = cpustate->rptc; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_BRCR: info->i = cpustate->brcr; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_INDX: info->i = cpustate->indx; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_DBMR: info->i = cpustate->dbmr; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_ARCR: info->i = cpustate->arcr; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_DP: info->i = cpustate->st0.dp; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_ARP: info->i = cpustate->st0.arp; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_ARB: info->i = cpustate->st1.arb; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR0: info->i = cpustate->ar[0]; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR1: info->i = cpustate->ar[1]; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR2: info->i = cpustate->ar[2]; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR3: info->i = cpustate->ar[3]; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR4: info->i = cpustate->ar[4]; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR5: info->i = cpustate->ar[5]; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR6: info->i = cpustate->ar[6]; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR7: info->i = cpustate->ar[7]; break;
|
||||
|
||||
/* --- the following bits of info are returned as pointers to data or functions --- */
|
||||
case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(tms); break;
|
||||
case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(tms); break;
|
||||
case CPUINFO_FCT_EXIT: info->exit = CPU_EXIT_NAME(tms); break;
|
||||
case CPUINFO_FCT_EXECUTE: info->execute = CPU_EXECUTE_NAME(tms); break;
|
||||
case CPUINFO_FCT_BURN: info->burn = NULL; break;
|
||||
case CPUINFO_FCT_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(tms32051); break;
|
||||
case CPUINFO_FCT_READ: info->read = CPU_READ_NAME(tms); break;
|
||||
case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &cpustate->icount; break;
|
||||
case CPUINFO_PTR_INTERNAL_MEMORY_MAP + AS_PROGRAM: info->internal_map16 = ADDRESS_MAP_NAME(internal_pgm); break;
|
||||
case CPUINFO_PTR_INTERNAL_MEMORY_MAP + AS_DATA: info->internal_map16 = ADDRESS_MAP_NAME(internal_data); break;
|
||||
|
||||
/* --- the following bits of info are returned as NULL-terminated strings --- */
|
||||
case CPUINFO_STR_FAMILY: strcpy(info->s, "TMS3205x"); break;
|
||||
case CPUINFO_STR_VERSION: strcpy(info->s, "1.0"); break;
|
||||
case CPUINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break;
|
||||
case CPUINFO_STR_CREDITS: strcpy(info->s, "Copyright Ville Linde"); break;
|
||||
|
||||
case CPUINFO_STR_FLAGS: strcpy(info->s, " "); break;
|
||||
|
||||
case CPUINFO_STR_REGISTER + TMS32051_PC: sprintf(info->s, "PC: %04X", cpustate->pc); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_ACC: sprintf(info->s, "ACC: %08X", cpustate->acc); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_ACCB: sprintf(info->s, "ACCB: %08X", cpustate->accb); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_PREG: sprintf(info->s, "PREG: %08X", cpustate->preg); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_TREG0: sprintf(info->s, "TREG0: %04X", cpustate->treg0); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_TREG1: sprintf(info->s, "TREG1: %04X", cpustate->treg1); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_TREG2: sprintf(info->s, "TREG2: %04X", cpustate->treg2); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_BMAR: sprintf(info->s, "BMAR: %08X", cpustate->bmar); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_RPTC: sprintf(info->s, "RPTC: %08X", cpustate->rptc); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_BRCR: sprintf(info->s, "BRCR: %08X", cpustate->brcr); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_INDX: sprintf(info->s, "INDX: %04X", cpustate->indx); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_DBMR: sprintf(info->s, "DBMR: %04X", cpustate->dbmr); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_ARCR: sprintf(info->s, "ARCR: %04X", cpustate->arcr); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_DP: sprintf(info->s, "DP: %04X", cpustate->st0.dp); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_ARP: sprintf(info->s, "ARP: %04X", cpustate->st0.arp); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_ARB: sprintf(info->s, "ARB: %04X", cpustate->st1.arb); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_AR0: sprintf(info->s, "AR0: %04X", cpustate->ar[0]); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_AR1: sprintf(info->s, "AR1: %04X", cpustate->ar[1]); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_AR2: sprintf(info->s, "AR2: %04X", cpustate->ar[2]); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_AR3: sprintf(info->s, "AR3: %04X", cpustate->ar[3]); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_AR4: sprintf(info->s, "AR4: %04X", cpustate->ar[4]); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_AR5: sprintf(info->s, "AR5: %04X", cpustate->ar[5]); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_AR6: sprintf(info->s, "AR6: %04X", cpustate->ar[6]); break;
|
||||
case CPUINFO_STR_REGISTER + TMS32051_AR7: sprintf(info->s, "AR7: %04X", cpustate->ar[7]); break;
|
||||
}
|
||||
}
|
||||
|
||||
static CPU_SET_INFO( tms32051 )
|
||||
{
|
||||
tms32051_state *cpustate = get_safe_token(device);
|
||||
|
||||
if (state >= CPUINFO_INT_INPUT_STATE && state <= CPUINFO_INT_INPUT_STATE + 5)
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch(state)
|
||||
{
|
||||
case CPUINFO_INT_PC:
|
||||
case CPUINFO_INT_REGISTER + TMS32051_PC: cpustate->pc = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_ACC: cpustate->acc = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_ACCB: cpustate->accb = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_PREG: cpustate->preg = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_TREG0: cpustate->treg0 = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_TREG1: cpustate->treg1 = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_TREG2: cpustate->treg2 = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_BMAR: cpustate->bmar = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_BRCR: cpustate->brcr = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_INDX: cpustate->indx = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_DBMR: cpustate->dbmr = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_ARCR: cpustate->arcr = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_DP: cpustate->st0.dp = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_ARP: cpustate->st0.arp = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_ARB: cpustate->st1.arb = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR0: cpustate->ar[0] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR1: cpustate->ar[1] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR2: cpustate->ar[2] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR3: cpustate->ar[3] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR4: cpustate->ar[4] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR5: cpustate->ar[5] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR6: cpustate->ar[6] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + TMS32051_AR7: cpustate->ar[7] = info->i; break;
|
||||
|
||||
default: CPU_SET_INFO_CALL(tms); break;
|
||||
}
|
||||
}
|
||||
|
||||
CPU_GET_INFO( tms32051 )
|
||||
{
|
||||
switch(state)
|
||||
{
|
||||
/* --- the following bits of info are returned as pointers to data or functions --- */
|
||||
case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(tms32051); break;
|
||||
|
||||
/* --- the following bits of info are returned as NULL-terminated strings --- */
|
||||
case CPUINFO_STR_NAME: strcpy(info->s, "TMS32051"); break;
|
||||
case CPUINFO_STR_SHORTNAME: strcpy(info->s, "tms32051"); break;
|
||||
|
||||
default: CPU_GET_INFO_CALL(tms); break;
|
||||
}
|
||||
}
|
||||
|
||||
DEFINE_LEGACY_CPU_DEVICE(TMS32051, tms32051);
|
||||
|
@ -3,8 +3,347 @@
|
||||
#ifndef __TMS32051_H__
|
||||
#define __TMS32051_H__
|
||||
|
||||
DECLARE_LEGACY_CPU_DEVICE(TMS32051, tms32051);
|
||||
|
||||
CPU_DISASSEMBLE( tms32051 );
|
||||
struct TMS32051_PMST
|
||||
{
|
||||
UINT16 iptr;
|
||||
UINT16 avis;
|
||||
UINT16 ovly;
|
||||
UINT16 ram;
|
||||
UINT16 mpmc;
|
||||
UINT16 ndx;
|
||||
UINT16 trm;
|
||||
UINT16 braf;
|
||||
};
|
||||
|
||||
struct TMS32051_ST0
|
||||
{
|
||||
UINT16 dp;
|
||||
UINT16 intm;
|
||||
UINT16 ovm;
|
||||
UINT16 ov;
|
||||
UINT16 arp;
|
||||
};
|
||||
|
||||
struct TMS32051_ST1
|
||||
{
|
||||
UINT16 arb;
|
||||
UINT16 cnf;
|
||||
UINT16 tc;
|
||||
UINT16 sxm;
|
||||
UINT16 c;
|
||||
UINT16 hm;
|
||||
UINT16 xf;
|
||||
UINT16 pm;
|
||||
};
|
||||
|
||||
|
||||
class tms32051_device : public cpu_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
tms32051_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
DECLARE_READ16_MEMBER( cpuregs_r );
|
||||
DECLARE_WRITE16_MEMBER( cpuregs_w );
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
// device_execute_interface overrides
|
||||
virtual UINT32 execute_min_cycles() const { return 1; }
|
||||
virtual UINT32 execute_max_cycles() const { return 5; }
|
||||
virtual UINT32 execute_input_lines() const { return 6; }
|
||||
virtual void execute_run();
|
||||
virtual void execute_set_input(int inputnum, int state);
|
||||
|
||||
// device_memory_interface overrides
|
||||
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_DATA) ? &m_data_config : NULL ); }
|
||||
virtual bool memory_read(address_spacenum spacenum, offs_t offset, int size, UINT64 &value);
|
||||
|
||||
// device_disasm_interface overrides
|
||||
virtual UINT32 disasm_min_opcode_bytes() const { return 2; }
|
||||
virtual UINT32 disasm_max_opcode_bytes() const { return 4; }
|
||||
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
|
||||
|
||||
private:
|
||||
address_space_config m_program_config;
|
||||
address_space_config m_data_config;
|
||||
|
||||
typedef void ( tms32051_device::*opcode_func )();
|
||||
static const opcode_func s_opcode_table[256];
|
||||
static const opcode_func s_opcode_table_be[256];
|
||||
static const opcode_func s_opcode_table_bf[256];
|
||||
|
||||
UINT16 m_pc;
|
||||
UINT16 m_op;
|
||||
INT32 m_acc;
|
||||
INT32 m_accb;
|
||||
INT32 m_preg;
|
||||
UINT16 m_treg0;
|
||||
UINT16 m_treg1;
|
||||
UINT16 m_treg2;
|
||||
UINT16 m_ar[8];
|
||||
INT32 m_rptc;
|
||||
|
||||
UINT16 m_bmar;
|
||||
INT32 m_brcr;
|
||||
UINT16 m_paer;
|
||||
UINT16 m_pasr;
|
||||
UINT16 m_indx;
|
||||
UINT16 m_dbmr;
|
||||
UINT16 m_arcr;
|
||||
|
||||
TMS32051_ST0 m_st0;
|
||||
TMS32051_ST1 m_st1;
|
||||
TMS32051_PMST m_pmst;
|
||||
|
||||
UINT16 m_ifr;
|
||||
UINT16 m_imr;
|
||||
|
||||
UINT16 m_pcstack[8];
|
||||
int m_pcstack_ptr;
|
||||
|
||||
UINT16 m_rpt_start, m_rpt_end;
|
||||
|
||||
UINT16 m_cbcr;
|
||||
UINT16 m_cbsr1;
|
||||
UINT16 m_cber1;
|
||||
UINT16 m_cbsr2;
|
||||
UINT16 m_cber2;
|
||||
|
||||
struct
|
||||
{
|
||||
int tddr;
|
||||
int psc;
|
||||
UINT16 tim;
|
||||
UINT16 prd;
|
||||
} m_timer;
|
||||
|
||||
struct
|
||||
{
|
||||
INT32 acc;
|
||||
INT32 accb;
|
||||
UINT16 arcr;
|
||||
UINT16 indx;
|
||||
TMS32051_PMST pmst;
|
||||
INT32 preg;
|
||||
TMS32051_ST0 st0;
|
||||
TMS32051_ST1 st1;
|
||||
INT32 treg0;
|
||||
INT32 treg1;
|
||||
INT32 treg2;
|
||||
} m_shadow;
|
||||
|
||||
address_space *m_program;
|
||||
direct_read_data *m_direct;
|
||||
address_space *m_data;
|
||||
int m_icount;
|
||||
|
||||
inline void CHANGE_PC(UINT16 new_pc);
|
||||
inline UINT16 PM_READ16(UINT16 address);
|
||||
inline void PM_WRITE16(UINT16 address, UINT16 data);
|
||||
inline UINT16 DM_READ16(UINT16 address);
|
||||
inline void DM_WRITE16(UINT16 address, UINT16 data);
|
||||
inline void PUSH_STACK(UINT16 pc);
|
||||
inline UINT16 POP_STACK();
|
||||
inline INT32 SUB(UINT32 a, UINT32 b);
|
||||
inline INT32 ADD(UINT32 a, UINT32 b);
|
||||
inline void UPDATE_AR(int ar, int step);
|
||||
inline void UPDATE_ARP(int nar);
|
||||
UINT16 GET_ADDRESS();
|
||||
inline int GET_ZLVC_CONDITION(int zlvc, int zlvc_mask);
|
||||
inline int GET_TP_CONDITION(int tp);
|
||||
inline INT32 PREG_PSCALER(INT32 preg);
|
||||
void op_invalid();
|
||||
void op_abs();
|
||||
void op_adcb();
|
||||
void op_add_mem();
|
||||
void op_add_simm();
|
||||
void op_add_limm();
|
||||
void op_add_s16_mem();
|
||||
void op_addb();
|
||||
void op_addc();
|
||||
void op_adds();
|
||||
void op_addt();
|
||||
void op_and_mem();
|
||||
void op_and_limm();
|
||||
void op_and_s16_limm();
|
||||
void op_andb();
|
||||
void op_bsar();
|
||||
void op_cmpl();
|
||||
void op_crgt();
|
||||
void op_crlt();
|
||||
void op_exar();
|
||||
void op_lacb();
|
||||
void op_lacc_mem();
|
||||
void op_lacc_limm();
|
||||
void op_lacc_s16_mem();
|
||||
void op_lacl_simm();
|
||||
void op_lacl_mem();
|
||||
void op_lact();
|
||||
void op_lamm();
|
||||
void op_neg();
|
||||
void op_norm();
|
||||
void op_or_mem();
|
||||
void op_or_limm();
|
||||
void op_or_s16_limm();
|
||||
void op_orb();
|
||||
void op_rol();
|
||||
void op_rolb();
|
||||
void op_ror();
|
||||
void op_rorb();
|
||||
void op_sacb();
|
||||
void op_sach();
|
||||
void op_sacl();
|
||||
void op_samm();
|
||||
void op_sath();
|
||||
void op_satl();
|
||||
void op_sbb();
|
||||
void op_sbbb();
|
||||
void op_sfl();
|
||||
void op_sflb();
|
||||
void op_sfr();
|
||||
void op_sfrb();
|
||||
void op_sub_mem();
|
||||
void op_sub_s16_mem();
|
||||
void op_sub_simm();
|
||||
void op_sub_limm();
|
||||
void op_subb();
|
||||
void op_subc();
|
||||
void op_subs();
|
||||
void op_subt();
|
||||
void op_xor_mem();
|
||||
void op_xor_limm();
|
||||
void op_xor_s16_limm();
|
||||
void op_xorb();
|
||||
void op_zalr();
|
||||
void op_zap();
|
||||
void op_adrk();
|
||||
void op_cmpr();
|
||||
void op_lar_mem();
|
||||
void op_lar_simm();
|
||||
void op_lar_limm();
|
||||
void op_ldp_mem();
|
||||
void op_ldp_imm();
|
||||
void op_mar();
|
||||
void op_sar();
|
||||
void op_sbrk();
|
||||
void op_b();
|
||||
void op_bacc();
|
||||
void op_baccd();
|
||||
void op_banz();
|
||||
void op_banzd();
|
||||
void op_bcnd();
|
||||
void op_bcndd();
|
||||
void op_bd();
|
||||
void op_cala();
|
||||
void op_calad();
|
||||
void op_call();
|
||||
void op_calld();
|
||||
void op_cc();
|
||||
void op_ccd();
|
||||
void op_intr();
|
||||
void op_nmi();
|
||||
void op_retc();
|
||||
void op_retcd();
|
||||
void op_rete();
|
||||
void op_reti();
|
||||
void op_trap();
|
||||
void op_xc();
|
||||
void op_bldd_slimm();
|
||||
void op_bldd_dlimm();
|
||||
void op_bldd_sbmar();
|
||||
void op_bldd_dbmar();
|
||||
void op_bldp();
|
||||
void op_blpd_bmar();
|
||||
void op_blpd_imm();
|
||||
void op_dmov();
|
||||
void op_in();
|
||||
void op_lmmr();
|
||||
void op_out();
|
||||
void op_smmr();
|
||||
void op_tblr();
|
||||
void op_tblw();
|
||||
void op_apl_dbmr();
|
||||
void op_apl_imm();
|
||||
void op_cpl_dbmr();
|
||||
void op_cpl_imm();
|
||||
void op_opl_dbmr();
|
||||
void op_opl_imm();
|
||||
void op_splk();
|
||||
void op_xpl_dbmr();
|
||||
void op_xpl_imm();
|
||||
void op_apac();
|
||||
void op_lph();
|
||||
void op_lt();
|
||||
void op_lta();
|
||||
void op_ltd();
|
||||
void op_ltp();
|
||||
void op_lts();
|
||||
void op_mac();
|
||||
void op_macd();
|
||||
void op_madd();
|
||||
void op_mads();
|
||||
void op_mpy_mem();
|
||||
void op_mpy_simm();
|
||||
void op_mpy_limm();
|
||||
void op_mpya();
|
||||
void op_mpys();
|
||||
void op_mpyu();
|
||||
void op_pac();
|
||||
void op_spac();
|
||||
void op_sph();
|
||||
void op_spl();
|
||||
void op_spm();
|
||||
void op_sqra();
|
||||
void op_sqrs();
|
||||
void op_zpr();
|
||||
void op_bit();
|
||||
void op_bitt();
|
||||
void op_clrc_ov();
|
||||
void op_clrc_ext();
|
||||
void op_clrc_hold();
|
||||
void op_clrc_tc();
|
||||
void op_clrc_carry();
|
||||
void op_clrc_cnf();
|
||||
void op_clrc_intm();
|
||||
void op_clrc_xf();
|
||||
void op_idle();
|
||||
void op_idle2();
|
||||
void op_lst_st0();
|
||||
void op_lst_st1();
|
||||
void op_pop();
|
||||
void op_popd();
|
||||
void op_pshd();
|
||||
void op_push();
|
||||
void op_rpt_mem();
|
||||
void op_rpt_limm();
|
||||
void op_rpt_simm();
|
||||
void op_rptb();
|
||||
void op_rptz();
|
||||
void op_setc_ov();
|
||||
void op_setc_ext();
|
||||
void op_setc_hold();
|
||||
void op_setc_tc();
|
||||
void op_setc_carry();
|
||||
void op_setc_xf();
|
||||
void op_setc_cnf();
|
||||
void op_setc_intm();
|
||||
void op_sst_st0();
|
||||
void op_sst_st1();
|
||||
void op_group_be();
|
||||
void op_group_bf();
|
||||
void delay_slot(UINT16 startpc);
|
||||
void check_interrupts();
|
||||
void save_interrupt_context();
|
||||
void restore_interrupt_context();
|
||||
};
|
||||
|
||||
|
||||
extern const device_type TMS32051;
|
||||
|
||||
|
||||
#endif /* __TMS32051_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user