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

View File

@ -159,6 +159,7 @@ private:
UINT32 m_source; /* temp register */ UINT32 m_source; /* temp register */
UINT32 m_destination; /* temp register */ UINT32 m_destination; /* temp register */
address_space *m_program; address_space *m_program;
direct_read_data *m_direct;
address_space *m_io; address_space *m_io;
UINT32 m_stopped; /* Sets how the CPU is stopped */ 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_CALL_DEBUGGER(x) debugger_instruction_hook(this, x)
#define m37710_read_8(addr) m_program->read_byte(addr) #define m37710_read_8(addr) m_program->read_byte(addr)
#define m37710_write_8(addr,data) m_program->write_byte(addr,data) #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_read_16(addr) m_program->read_word(addr)
#define m37710_write_16(addr,data) m_program->write_word(addr,data) #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_jumping(A)
#define m37710_branching(A) #define m37710_branching(A)
@ -64,11 +65,6 @@ INLINE int MAKE_INT_8(int A) {return (A & 0x80) ? A | ~0xff : A & 0xff;}
/* ================================== CPU ================================= */ /* ================================== CPU ================================= */
/* ======================================================================== */ /* ======================================================================== */
extern UINT32 m37710i_adc_tbl[];
extern UINT32 m37710i_sbc_tbl[];
#define REG_A m_a /* Accumulator */ #define REG_A m_a /* Accumulator */
#define REG_B m_b /* Accumulator hi byte */ #define REG_B m_b /* Accumulator hi byte */
#define REG_BA m_ba /* Secondary Accumulator */ #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) \ #define OP_LDM(MODE) \
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
REG_IM2 = EA_##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++; \ REG_PC++; \
write_8_##MODE(REG_IM2, REG_IM) write_8_##MODE(REG_IM2, REG_IM)
#else #else
#define OP_LDM(MODE) \ #define OP_LDM(MODE) \
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
REG_IM2 = EA_##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; \ REG_PC+=2; \
write_16_##MODE(REG_IM2, REG_IM) write_16_##MODE(REG_IM2, REG_IM)
#endif #endif
@ -785,7 +785,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
#define OP_BBS(MODE) \ #define OP_BBS(MODE) \
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
REG_IM2 = read_8_NORM(EA_##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++; \ REG_PC++; \
DST = OPER_8_IMM(); \ DST = OPER_8_IMM(); \
if ((REG_IM2 & REG_IM) == REG_IM) \ 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) \ #define OP_BBS(MODE) \
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
REG_IM2 = read_16_NORM(EA_##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++; \
REG_PC++; \ REG_PC++; \
DST = OPER_8_IMM(); \ DST = OPER_8_IMM(); \
@ -816,7 +816,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
#define OP_BBC(MODE) \ #define OP_BBC(MODE) \
CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ CLK(CLK_OP + CLK_R8 + CLK_##MODE); \
REG_IM2 = read_8_NORM(EA_##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++; \ REG_PC++; \
DST = OPER_8_IMM(); \ DST = OPER_8_IMM(); \
if ((REG_IM2 & REG_IM) == 0) \ if ((REG_IM2 & REG_IM) == 0) \
@ -829,7 +829,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
#define OP_BBC(MODE) \ #define OP_BBC(MODE) \
CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ CLK(CLK_OP + CLK_R16 + CLK_##MODE); \
REG_IM2 = read_16_NORM(EA_##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++; \
REG_PC++; \ REG_PC++; \
DST = OPER_8_IMM(); \ 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); \ CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
DST = EA_##MODE(); \ DST = EA_##MODE(); \
REG_IM = read_8_##MODE(DST); \ 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++; \ REG_PC++; \
write_8_##MODE(DST, REG_IM & ~REG_IM2); write_8_##MODE(DST, REG_IM & ~REG_IM2);
#else #else
@ -1828,7 +1828,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
DST = EA_##MODE(); \ DST = EA_##MODE(); \
REG_IM = read_16_##MODE(DST); \ 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; \ REG_PC+=2; \
write_16_##MODE(DST, REG_IM & ~REG_IM2); write_16_##MODE(DST, REG_IM & ~REG_IM2);
#endif #endif
@ -1840,7 +1840,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \
DST = EA_##MODE(); \ DST = EA_##MODE(); \
REG_IM = read_8_##MODE(DST); \ 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++; \ REG_PC++; \
write_8_##MODE(DST, REG_IM | REG_IM2); write_8_##MODE(DST, REG_IM | REG_IM2);
#else #else
@ -1848,7 +1848,7 @@ void m37710_cpu_device::m37710i_set_reg_p(UINT32 value)
CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \
DST = EA_##MODE(); \ DST = EA_##MODE(); \
REG_IM = read_16_##MODE(DST); \ 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; \ REG_PC+=2; \
write_16_##MODE(DST, REG_IM | REG_IM2); write_16_##MODE(DST, REG_IM | REG_IM2);
#endif #endif