m37710: support direct read [Alex Jackson]

This commit is contained in:
Alex W. Jackson 2014-05-21 08:01:56 +00:00
parent c3c54a3cfb
commit 9b4eaaf6f8
4 changed files with 24 additions and 38 deletions

View File

@ -990,6 +990,7 @@ void m37710_cpu_device::device_start()
memset(m_m37710_regs, 0, sizeof(m_m37710_regs));
m_program = &space(AS_PROGRAM);
m_direct = &m_program->direct();
m_io = &space(AS_IO);
m_ICount = 0;
@ -1192,59 +1193,49 @@ void m37710_cpu_device::m37710i_set_execution_mode(UINT32 mode)
/* ================================= MEMORY =============================== */
/* ======================================================================== */
#define ADDRESS_37710(A) ((A)&0xffffff)
UINT32 m37710_cpu_device::m37710i_read_8_normal(UINT32 address)
{
address = ADDRESS_37710(address);
return m37710_read_8(address);
}
UINT32 m37710_cpu_device::m37710i_read_8_immediate(UINT32 address)
{
address = ADDRESS_37710(address);
return m37710_read_8_immediate(address);
}
UINT32 m37710_cpu_device::m37710i_read_8_direct(UINT32 address)
{
address = ADDRESS_37710(address);
return m37710_read_8(address);
}
void m37710_cpu_device::m37710i_write_8_normal(UINT32 address, UINT32 value)
{
address = ADDRESS_37710(address);
m37710_write_8(address, MAKE_UINT_8(value));
m37710_write_8(address, value);
}
void m37710_cpu_device::m37710i_write_8_direct(UINT32 address, UINT32 value)
{
address = ADDRESS_37710(address);
m37710_write_8(address, MAKE_UINT_8(value));
m37710_write_8(address, value);
}
UINT32 m37710_cpu_device::m37710i_read_16_normal(UINT32 address)
{
address = ADDRESS_37710(address);
if (address & 1)
return m37710i_read_8_normal(address) | m37710i_read_8_normal(address+1)<<8;
return m37710_read_8(address) | m37710_read_8(address+1)<<8;
else
return m37710_read_16(address);
}
UINT32 m37710_cpu_device::m37710i_read_16_immediate(UINT32 address)
{
address = ADDRESS_37710(address);
if (address & 1)
return m37710_read_8_immediate(address) | m37710_read_8_immediate(address+1)<<8;
else
return m37710_read_16(address);
return m37710_read_16_immediate(address);
}
UINT32 m37710_cpu_device::m37710i_read_16_direct(UINT32 address)
{
address = ADDRESS_37710(address);
if (address & 1)
return m37710_read_8(address) | m37710_read_8((address)+1)<<8;
else
@ -1253,7 +1244,6 @@ UINT32 m37710_cpu_device::m37710i_read_16_direct(UINT32 address)
void m37710_cpu_device::m37710i_write_16_normal(UINT32 address, UINT32 value)
{
address = ADDRESS_37710(address);
if (address & 1)
{
m37710_write_8(address, value);
@ -1265,7 +1255,6 @@ void m37710_cpu_device::m37710i_write_16_normal(UINT32 address, UINT32 value)
void m37710_cpu_device::m37710i_write_16_direct(UINT32 address, UINT32 value)
{
address = ADDRESS_37710(address);
if (address & 1)
{
m37710_write_8(address, value);
@ -1277,20 +1266,20 @@ void m37710_cpu_device::m37710i_write_16_direct(UINT32 address, UINT32 value)
UINT32 m37710_cpu_device::m37710i_read_24_normal(UINT32 address)
{
return m37710i_read_16_normal(address) |
(m37710i_read_8_normal(address+2)<<16);
return m37710_read_16(address) |
(m37710_read_8(address+2)<<16);
}
UINT32 m37710_cpu_device::m37710i_read_24_immediate(UINT32 address)
{
return m37710i_read_16_immediate(address) |
(m37710i_read_8_immediate(address+2)<<16);
return m37710_read_16_immediate(address) |
(m37710_read_8_immediate(address+2)<<16);
}
UINT32 m37710_cpu_device::m37710i_read_24_direct(UINT32 address)
{
return m37710i_read_16_direct(address) |
(m37710i_read_8_direct(address+2)<<16);
return m37710_read_16(address) |
(m37710_read_8(address+2)<<16);
}

View File

@ -159,6 +159,7 @@ private:
UINT32 m_source; /* temp register */
UINT32 m_destination; /* temp register */
address_space *m_program;
direct_read_data *m_direct;
address_space *m_io;
UINT32 m_stopped; /* Sets how the CPU is stopped */

View File

@ -24,9 +24,10 @@
#define M37710_CALL_DEBUGGER(x) debugger_instruction_hook(this, x)
#define m37710_read_8(addr) m_program->read_byte(addr)
#define m37710_write_8(addr,data) m_program->write_byte(addr,data)
#define m37710_read_8_immediate(A) m_program->read_byte(A)
#define m37710_read_8_immediate(A) m_direct->read_decrypted_byte(A, BYTE_XOR_LE(0))
#define m37710_read_16(addr) m_program->read_word(addr)
#define m37710_write_16(addr,data) m_program->write_word(addr,data)
#define m37710_read_16_immediate(A) m_direct->read_decrypted_word(A)
#define m37710_jumping(A)
#define m37710_branching(A)
@ -64,11 +65,6 @@ INLINE int MAKE_INT_8(int A) {return (A & 0x80) ? A | ~0xff : A & 0xff;}
/* ================================== CPU ================================= */
/* ======================================================================== */
extern UINT32 m37710i_adc_tbl[];
extern UINT32 m37710i_sbc_tbl[];
#define REG_A m_a /* Accumulator */
#define REG_B m_b /* Accumulator hi byte */
#define REG_BA m_ba /* Secondary Accumulator */

View File

@ -767,14 +767,14 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
#define OP_LDM(MODE) \
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
REG_IM2 = EA_##MODE(); \
REG_IM = read_8_NORM(REG_PB|REG_PC); \
REG_IM = read_8_IMM(REG_PB | REG_PC); \
REG_PC++; \
write_8_##MODE(REG_IM2, REG_IM)
#else
#define OP_LDM(MODE) \
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
REG_IM2 = EA_##MODE(); \
REG_IM = read_16_NORM(REG_PB|REG_PC); \
REG_IM = read_16_IMM(REG_PB | REG_PC); \
REG_PC+=2; \
write_16_##MODE(REG_IM2, REG_IM)
#endif
@ -785,7 +785,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
#define OP_BBS(MODE) \
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
REG_IM2 = read_8_NORM(EA_##MODE()); \
REG_IM = read_8_NORM(REG_PB | REG_PC); \
REG_IM = read_8_IMM(REG_PB | REG_PC); \
REG_PC++; \
DST = OPER_8_IMM(); \
if ((REG_IM2 & REG_IM) == REG_IM) \
@ -798,7 +798,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
#define OP_BBS(MODE) \
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
REG_IM2 = read_16_NORM(EA_##MODE()); \
REG_IM = read_16_NORM(REG_PB | REG_PC); \
REG_IM = read_16_IMM(REG_PB | REG_PC); \
REG_PC++; \
REG_PC++; \
DST = OPER_8_IMM(); \
@ -816,7 +816,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
#define OP_BBC(MODE) \
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
REG_IM2 = read_8_NORM(EA_##MODE()); \
REG_IM = read_8_NORM(REG_PB | REG_PC); \
REG_IM = read_8_IMM(REG_PB | REG_PC); \
REG_PC++; \
DST = OPER_8_IMM(); \
if ((REG_IM2 & REG_IM) == 0) \
@ -829,7 +829,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
#define OP_BBC(MODE) \
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
REG_IM2 = read_16_NORM(EA_##MODE()); \
REG_IM = read_16_NORM(REG_PB | REG_PC); \
REG_IM = read_16_IMM(REG_PB | REG_PC); \
REG_PC++; \
REG_PC++; \
DST = OPER_8_IMM(); \
@ -1820,7 +1820,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
DST = EA_##MODE(); \
REG_IM = read_8_##MODE(DST); \
REG_IM2 = read_8_NORM(REG_PB | REG_PC); \
REG_IM2 = read_8_IMM(REG_PB | REG_PC); \
REG_PC++; \
write_8_##MODE(DST, REG_IM & ~REG_IM2);
#else
@ -1828,7 +1828,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
DST = EA_##MODE(); \
REG_IM = read_16_##MODE(DST); \
REG_IM2 = read_16_NORM(REG_PB | REG_PC); \
REG_IM2 = read_16_IMM(REG_PB | REG_PC); \
REG_PC+=2; \
write_16_##MODE(DST, REG_IM & ~REG_IM2);
#endif
@ -1840,7 +1840,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
DST = EA_##MODE(); \
REG_IM = read_8_##MODE(DST); \
REG_IM2 = read_8_NORM(REG_PB | REG_PC); \
REG_IM2 = read_8_IMM(REG_PB | REG_PC); \
REG_PC++; \
write_8_##MODE(DST, REG_IM | REG_IM2);
#else
@ -1848,7 +1848,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
DST = EA_##MODE(); \
REG_IM = read_16_##MODE(DST); \
REG_IM2 = read_16_NORM(REG_PB | REG_PC); \
REG_IM2 = read_16_IMM(REG_PB | REG_PC); \
REG_PC+=2; \
write_16_##MODE(DST, REG_IM | REG_IM2);
#endif