mirror of
https://github.com/holub/mame
synced 2025-10-07 17:27:06 +03:00
m37710: support direct read [Alex Jackson]
This commit is contained in:
parent
c3c54a3cfb
commit
9b4eaaf6f8
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user