diff options
Diffstat (limited to 'src/emu/cpu/asap/asap.c')
-rw-r--r-- | src/emu/cpu/asap/asap.c | 166 |
1 files changed, 83 insertions, 83 deletions
diff --git a/src/emu/cpu/asap/asap.c b/src/emu/cpu/asap/asap.c index 2487321cb01..ee133856630 100644 --- a/src/emu/cpu/asap/asap.c +++ b/src/emu/cpu/asap/asap.c @@ -49,19 +49,19 @@ // CONSTANTS //************************************************************************** -const UINT32 PS_CFLAG = 0x00000001; -const UINT32 PS_VFLAG = 0x00000002; -const UINT32 PS_ZFLAG = 0x00000004; -const UINT32 PS_NFLAG = 0x00000008; -const UINT32 PS_IFLAG = 0x00000010; -const UINT32 PS_PFLAG = 0x00000020; +const UINT32 PS_CFLAG = 0x00000001; +const UINT32 PS_VFLAG = 0x00000002; +const UINT32 PS_ZFLAG = 0x00000004; +const UINT32 PS_NFLAG = 0x00000008; +const UINT32 PS_IFLAG = 0x00000010; +const UINT32 PS_PFLAG = 0x00000020; -const int EXCEPTION_RESET = 0; -const int EXCEPTION_TRAP0 = 1; -const int EXCEPTION_TRAPF = 2; -const int EXCEPTION_INTERRUPT = 3; +const int EXCEPTION_RESET = 0; +const int EXCEPTION_TRAP0 = 1; +const int EXCEPTION_TRAPF = 2; +const int EXCEPTION_INTERRUPT = 3; -const int REGBASE = 0xffe0; +const int REGBASE = 0xffe0; @@ -69,25 +69,25 @@ const int REGBASE = 0xffe0; // MACROS //************************************************************************** -#define SET_C_ADD(a,b) (m_cflag = (UINT32)(b) > (UINT32)(~(a))) -#define SET_C_SUB(a,b) (m_cflag = (UINT32)(b) <= (UINT32)(a)) -#define SET_V_ADD(r,a,b) (m_vflag = ~((a) ^ (b)) & ((a) ^ (r))) -#define SET_V_SUB(r,a,b) (m_vflag = ((a) ^ (b)) & ((a) ^ (r))) -#define SET_ZN(r) (m_znflag = (r)) -#define SET_ZNCV_ADD(r,a,b) SET_ZN(r); SET_C_ADD(a,b); SET_V_ADD(r,a,b) -#define SET_ZNCV_SUB(r,a,b) SET_ZN(r); SET_C_SUB(a,b); SET_V_SUB(r,a,b) - -#define SET_VFLAG(val) (m_vflag = (val) << 31) -#define SET_CFLAG(val) (m_cflag = (val)) - -#define GET_FLAGS() (m_cflag | \ - ((m_vflag >> 30) & PS_VFLAG) | \ - ((m_znflag == 0) << 2) | \ - ((m_znflag >> 28) & PS_NFLAG) | \ - (m_iflag << 4) | \ - (m_pflag << 5)) - -#define SET_FLAGS(v) do { \ +#define SET_C_ADD(a,b) (m_cflag = (UINT32)(b) > (UINT32)(~(a))) +#define SET_C_SUB(a,b) (m_cflag = (UINT32)(b) <= (UINT32)(a)) +#define SET_V_ADD(r,a,b) (m_vflag = ~((a) ^ (b)) & ((a) ^ (r))) +#define SET_V_SUB(r,a,b) (m_vflag = ((a) ^ (b)) & ((a) ^ (r))) +#define SET_ZN(r) (m_znflag = (r)) +#define SET_ZNCV_ADD(r,a,b) SET_ZN(r); SET_C_ADD(a,b); SET_V_ADD(r,a,b) +#define SET_ZNCV_SUB(r,a,b) SET_ZN(r); SET_C_SUB(a,b); SET_V_SUB(r,a,b) + +#define SET_VFLAG(val) (m_vflag = (val) << 31) +#define SET_CFLAG(val) (m_cflag = (val)) + +#define GET_FLAGS() (m_cflag | \ + ((m_vflag >> 30) & PS_VFLAG) | \ + ((m_znflag == 0) << 2) | \ + ((m_znflag >> 28) & PS_NFLAG) | \ + (m_iflag << 4) | \ + (m_pflag << 5)) + +#define SET_FLAGS(v) do { \ m_cflag = (v) & PS_CFLAG; \ m_vflag = ((v) & PS_VFLAG) << 30; \ m_znflag = ((v) & PS_ZFLAG) ? 0 : ((v) & PS_NFLAG) ? -1 : 1; \ @@ -95,12 +95,12 @@ const int REGBASE = 0xffe0; m_pflag = ((v) & PS_PFLAG) >> 5; \ } while (0); -#define OPCODE (m_op >> 27) -#define DSTREG ((m_op >> 22) & 31) -#define DSTVAL m_src2val[REGBASE + DSTREG] -#define SRC1REG ((m_op >> 16) & 31) -#define SRC1VAL m_src2val[REGBASE + SRC1REG] -#define SRC2VAL m_src2val[m_op & 0xffff] +#define OPCODE (m_op >> 27) +#define DSTREG ((m_op >> 22) & 31) +#define DSTVAL m_src2val[REGBASE + DSTREG] +#define SRC1REG ((m_op >> 16) & 31) +#define SRC1VAL m_src2val[REGBASE + SRC1REG] +#define SRC2VAL m_src2val[m_op & 0xffff] @@ -110,38 +110,38 @@ const int REGBASE = 0xffe0; const asap_device::ophandler asap_device::s_opcodetable[32][4] = { - { &asap_device::trap0, &asap_device::trap0, &asap_device::trap0, &asap_device::trap0 }, - { &asap_device::noop, &asap_device::noop, &asap_device::noop, &asap_device::noop }, - { &asap_device::bsr, &asap_device::bsr_0, &asap_device::bsr, &asap_device::bsr_0 }, - { &asap_device::lea, &asap_device::noop, &asap_device::lea_c, &asap_device::lea_c0 }, - { &asap_device::leah, &asap_device::noop, &asap_device::leah_c, &asap_device::leah_c0 }, - { &asap_device::subr, &asap_device::noop, &asap_device::subr_c, &asap_device::subr_c0 }, - { &asap_device::xor_, &asap_device::noop, &asap_device::xor_c, &asap_device::xor_c0 }, - { &asap_device::xorn, &asap_device::noop, &asap_device::xorn_c, &asap_device::xorn_c0 }, - { &asap_device::add, &asap_device::noop, &asap_device::add_c, &asap_device::add_c0 }, - { &asap_device::sub, &asap_device::noop, &asap_device::sub_c, &asap_device::sub_c0 }, - { &asap_device::addc, &asap_device::noop, &asap_device::addc_c, &asap_device::addc_c0 }, - { &asap_device::subc, &asap_device::noop, &asap_device::subc_c, &asap_device::subc_c0 }, - { &asap_device::and_, &asap_device::noop, &asap_device::and_c, &asap_device::and_c0 }, - { &asap_device::andn, &asap_device::noop, &asap_device::andn_c, &asap_device::andn_c0 }, - { &asap_device::or_, &asap_device::noop, &asap_device::or_c, &asap_device::or_c0 }, - { &asap_device::orn, &asap_device::noop, &asap_device::orn_c, &asap_device::orn_c0 }, - { &asap_device::ld, &asap_device::ld_0, &asap_device::ld_c, &asap_device::ld_c0 }, - { &asap_device::ldh, &asap_device::ldh_0, &asap_device::ldh_c, &asap_device::ldh_c0 }, - { &asap_device::lduh, &asap_device::lduh_0, &asap_device::lduh_c, &asap_device::lduh_c0 }, - { &asap_device::sth, &asap_device::sth_0, &asap_device::sth_c, &asap_device::sth_c0 }, - { &asap_device::st, &asap_device::st_0, &asap_device::st_c, &asap_device::st_c0 }, - { &asap_device::ldb, &asap_device::ldb_0, &asap_device::ldb_c, &asap_device::ldb_c0 }, - { &asap_device::ldub, &asap_device::ldub_0, &asap_device::ldub_c, &asap_device::ldub_c0 }, - { &asap_device::stb, &asap_device::stb_0, &asap_device::stb_c, &asap_device::stb_c0 }, - { &asap_device::ashr, &asap_device::noop, &asap_device::ashr_c, &asap_device::ashr_c0 }, - { &asap_device::lshr, &asap_device::noop, &asap_device::lshr_c, &asap_device::lshr_c0 }, - { &asap_device::ashl, &asap_device::noop, &asap_device::ashl_c, &asap_device::ashl_c0 }, - { &asap_device::rotl, &asap_device::noop, &asap_device::rotl_c, &asap_device::rotl_c0 }, - { &asap_device::getps, &asap_device::noop, &asap_device::getps, &asap_device::noop }, - { &asap_device::putps, &asap_device::putps, &asap_device::putps, &asap_device::putps }, - { &asap_device::jsr, &asap_device::jsr_0, &asap_device::jsr_c, &asap_device::jsr_c0 }, - { &asap_device::trapf, &asap_device::trapf, &asap_device::trapf, &asap_device::trapf } + { &asap_device::trap0, &asap_device::trap0, &asap_device::trap0, &asap_device::trap0 }, + { &asap_device::noop, &asap_device::noop, &asap_device::noop, &asap_device::noop }, + { &asap_device::bsr, &asap_device::bsr_0, &asap_device::bsr, &asap_device::bsr_0 }, + { &asap_device::lea, &asap_device::noop, &asap_device::lea_c, &asap_device::lea_c0 }, + { &asap_device::leah, &asap_device::noop, &asap_device::leah_c, &asap_device::leah_c0 }, + { &asap_device::subr, &asap_device::noop, &asap_device::subr_c, &asap_device::subr_c0 }, + { &asap_device::xor_, &asap_device::noop, &asap_device::xor_c, &asap_device::xor_c0 }, + { &asap_device::xorn, &asap_device::noop, &asap_device::xorn_c, &asap_device::xorn_c0 }, + { &asap_device::add, &asap_device::noop, &asap_device::add_c, &asap_device::add_c0 }, + { &asap_device::sub, &asap_device::noop, &asap_device::sub_c, &asap_device::sub_c0 }, + { &asap_device::addc, &asap_device::noop, &asap_device::addc_c, &asap_device::addc_c0 }, + { &asap_device::subc, &asap_device::noop, &asap_device::subc_c, &asap_device::subc_c0 }, + { &asap_device::and_, &asap_device::noop, &asap_device::and_c, &asap_device::and_c0 }, + { &asap_device::andn, &asap_device::noop, &asap_device::andn_c, &asap_device::andn_c0 }, + { &asap_device::or_, &asap_device::noop, &asap_device::or_c, &asap_device::or_c0 }, + { &asap_device::orn, &asap_device::noop, &asap_device::orn_c, &asap_device::orn_c0 }, + { &asap_device::ld, &asap_device::ld_0, &asap_device::ld_c, &asap_device::ld_c0 }, + { &asap_device::ldh, &asap_device::ldh_0, &asap_device::ldh_c, &asap_device::ldh_c0 }, + { &asap_device::lduh, &asap_device::lduh_0, &asap_device::lduh_c, &asap_device::lduh_c0 }, + { &asap_device::sth, &asap_device::sth_0, &asap_device::sth_c, &asap_device::sth_c0 }, + { &asap_device::st, &asap_device::st_0, &asap_device::st_c, &asap_device::st_c0 }, + { &asap_device::ldb, &asap_device::ldb_0, &asap_device::ldb_c, &asap_device::ldb_c0 }, + { &asap_device::ldub, &asap_device::ldub_0, &asap_device::ldub_c, &asap_device::ldub_c0 }, + { &asap_device::stb, &asap_device::stb_0, &asap_device::stb_c, &asap_device::stb_c0 }, + { &asap_device::ashr, &asap_device::noop, &asap_device::ashr_c, &asap_device::ashr_c0 }, + { &asap_device::lshr, &asap_device::noop, &asap_device::lshr_c, &asap_device::lshr_c0 }, + { &asap_device::ashl, &asap_device::noop, &asap_device::ashl_c, &asap_device::ashl_c0 }, + { &asap_device::rotl, &asap_device::noop, &asap_device::rotl_c, &asap_device::rotl_c0 }, + { &asap_device::getps, &asap_device::noop, &asap_device::getps, &asap_device::noop }, + { &asap_device::putps, &asap_device::putps, &asap_device::putps, &asap_device::putps }, + { &asap_device::jsr, &asap_device::jsr_0, &asap_device::jsr_c, &asap_device::jsr_c0 }, + { &asap_device::trapf, &asap_device::trapf, &asap_device::trapf, &asap_device::trapf } }; const asap_device::ophandler asap_device::s_conditiontable[16] = @@ -167,21 +167,21 @@ const device_type ASAP = &device_creator<asap_device>; asap_device::asap_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : cpu_device(mconfig, ASAP, "ASAP", tag, owner, clock), - m_program_config("program", ENDIANNESS_LITTLE, 32, 32), - m_pc(0), - m_pflag(0), - m_iflag(0), - m_cflag(0), - m_vflag(0), - m_znflag(0), - m_flagsio(0), - m_op(0), - m_ppc(0), - m_nextpc(0), - m_irq_state(0), - m_icount(0), - m_program(NULL), - m_direct(NULL) + m_program_config("program", ENDIANNESS_LITTLE, 32, 32), + m_pc(0), + m_pflag(0), + m_iflag(0), + m_cflag(0), + m_vflag(0), + m_znflag(0), + m_flagsio(0), + m_op(0), + m_ppc(0), + m_nextpc(0), + m_irq_state(0), + m_icount(0), + m_program(NULL), + m_direct(NULL) { // initialize the src2val table to contain immediates for low values for (int i = 0; i < REGBASE; i++) |