summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/s2650/s2650.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/s2650/s2650.cpp')
-rw-r--r--src/devices/cpu/s2650/s2650.cpp67
1 files changed, 49 insertions, 18 deletions
diff --git a/src/devices/cpu/s2650/s2650.cpp b/src/devices/cpu/s2650/s2650.cpp
index 6f4dc66c016..702ed83906a 100644
--- a/src/devices/cpu/s2650/s2650.cpp
+++ b/src/devices/cpu/s2650/s2650.cpp
@@ -31,10 +31,12 @@ DEFINE_DEVICE_TYPE(S2650, s2650_device, "s2650", "S2650")
s2650_device::s2650_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: cpu_device(mconfig, S2650, tag, owner, clock)
, m_program_config("program", ENDIANNESS_LITTLE, 8, 15)
- , m_io_config("io", ENDIANNESS_LITTLE, 8, 9)
+ , m_io_config("io", ENDIANNESS_LITTLE, 8, 8)
+ , m_data_config("io", ENDIANNESS_LITTLE, 8, 1)
+ , m_sense_handler(*this)
, m_flag_handler(*this), m_intack_handler(*this)
, m_ppc(0), m_page(0), m_iar(0), m_ea(0), m_psl(0), m_psu(0), m_r(0)
- , m_halt(0), m_ir(0), m_irq_state(0), m_icount(0), m_program(nullptr), m_direct(nullptr), m_io(nullptr)
+ , m_halt(0), m_ir(0), m_irq_state(0), m_icount(0), m_direct(nullptr)
, m_debugger_temp(0)
{
memset(m_reg, 0x00, sizeof(m_reg));
@@ -48,6 +50,26 @@ offs_t s2650_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u
}
+const address_space_config *s2650_device::memory_space_config(address_spacenum spacenum) const
+{
+ switch (spacenum)
+ {
+ // Memory-mapped: M/~IO=1
+ case AS_PROGRAM: return &m_program_config;
+
+ // Extended I/O: M/~IO=0 ADR13(E)=1 ADR14=Don't Care
+ case AS_IO: return &m_io_config;
+
+ // Non-extended I/O: M/~IO=0 ADR13(~NE)=0 ADR14=D/~C
+ // "The D/~C line can be used as a 1-bit device address in simple systems."
+ // -- Signetics 2650 Microprocessor databook, page 41
+ case AS_DATA: return &m_data_config;
+
+ default: return nullptr;
+ }
+}
+
+
/* condition code changes for a byte */
static const uint8_t ccc[0x200] = {
0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
@@ -145,7 +167,7 @@ static const int S2650_relative[0x100] =
* RDMEM
* read memory byte from addr
***************************************************************/
-#define RDMEM(addr) m_program->read_byte(addr)
+#define RDMEM(addr) space(AS_PROGRAM).read_byte(addr)
inline void s2650_device::set_psu(uint8_t new_val)
{
@@ -156,6 +178,19 @@ inline void s2650_device::set_psu(uint8_t new_val)
m_flag_handler((new_val & FO) ? 1 : 0);
}
+inline uint8_t s2650_device::get_psu()
+{
+ if (!m_sense_handler.isnull())
+ {
+ if (m_sense_handler())
+ m_psu |= SI;
+ else
+ m_psu &= ~SI;
+ }
+
+ return m_psu;
+}
+
inline uint8_t s2650_device::get_sp()
{
return (m_psu & SP);
@@ -528,7 +563,7 @@ inline uint8_t s2650_device::ARG()
* Store source register to memory addr (CC unchanged)
***************************************************************/
#define M_STR(address,source) \
- m_program->write_byte(address, source)
+ space(AS_PROGRAM).write_byte(address, source)
/***************************************************************
* M_AND
@@ -673,7 +708,7 @@ inline uint8_t s2650_device::ARG()
***************************************************************/
#define M_SPSU() \
{ \
- R0 = ((m_psu & ~PSU34) | (m_io->read_byte(S2650_SENSE_PORT) ? SI : 0)); \
+ R0 = get_psu() & ~PSU34; \
SET_CC(R0); \
}
@@ -742,7 +777,7 @@ inline uint8_t s2650_device::ARG()
#define M_TPSU() \
{ \
uint8_t tpsu = ARG(); \
- uint8_t rpsu = (m_psu | (m_io->read_byte(S2650_SENSE_PORT) ? SI : 0)); \
+ uint8_t rpsu = get_psu(); \
m_psl &= ~CC; \
if( (rpsu & tpsu) != tpsu ) \
m_psl |= 0x80; \
@@ -787,12 +822,11 @@ static void BRA_EA(void) _BRA_EA()
void s2650_device::device_start()
{
+ m_sense_handler.resolve();
m_flag_handler.resolve_safe();
m_intack_handler.resolve_safe();
- m_program = &space(AS_PROGRAM);
- m_direct = &m_program->direct();
- m_io = &space(AS_IO);
+ m_direct = &space(AS_PROGRAM).direct();
save_item(NAME(m_ppc));
save_item(NAME(m_page));
@@ -913,9 +947,6 @@ void s2650_device::device_reset()
memset(m_reg, 0, sizeof(m_reg));
memset(m_ras, 0, sizeof(m_ras));
- m_program = &space(AS_PROGRAM);
- m_direct = &m_program->direct();
- m_io = &space(AS_IO);
m_psl = COM | WC;
/* force write */
m_psu = 0xff;
@@ -1095,7 +1126,7 @@ void s2650_device::execute_run()
case 0x32: /* REDC,2 */
case 0x33: /* REDC,3 */
m_icount -= 6;
- m_reg[m_r] = m_io->read_byte(S2650_CTRL_PORT);
+ m_reg[m_r] = space(AS_DATA).read_byte(S2650_CTRL_PORT);
SET_CC( m_reg[m_r] );
break;
@@ -1185,7 +1216,7 @@ void s2650_device::execute_run()
case 0x56: /* REDE,2 v */
case 0x57: /* REDE,3 v */
m_icount -= 9;
- m_reg[m_r] = m_io->read_byte( ARG() );
+ m_reg[m_r] = space(AS_IO).read_byte(ARG());
SET_CC(m_reg[m_r]);
break;
@@ -1244,7 +1275,7 @@ void s2650_device::execute_run()
case 0x72: /* REDD,2 */
case 0x73: /* REDD,3 */
m_icount -= 6;
- m_reg[m_r] = m_io->read_byte(S2650_DATA_PORT);
+ m_reg[m_r] = space(AS_DATA).read_byte(S2650_DATA_PORT);
SET_CC(m_reg[m_r]);
break;
@@ -1400,7 +1431,7 @@ void s2650_device::execute_run()
case 0xb2: /* WRTC,2 */
case 0xb3: /* WRTC,3 */
m_icount -= 6;
- m_io->write_byte(S2650_CTRL_PORT,m_reg[m_r]);
+ space(AS_DATA).write_byte(S2650_CTRL_PORT,m_reg[m_r]);
break;
case 0xb4: /* TPSU */
@@ -1486,7 +1517,7 @@ void s2650_device::execute_run()
case 0xd6: /* WRTE,2 v */
case 0xd7: /* WRTE,3 v */
m_icount -= 9;
- m_io->write_byte( ARG(), m_reg[m_r] );
+ space(AS_IO).write_byte( ARG(), m_reg[m_r] );
break;
case 0xd8: /* BIRR,0 (*)a */
@@ -1544,7 +1575,7 @@ void s2650_device::execute_run()
case 0xf2: /* WRTD,2 */
case 0xf3: /* WRTD,3 */
m_icount -= 6;
- m_io->write_byte(S2650_DATA_PORT, m_reg[m_r]);
+ space(AS_DATA).write_byte(S2650_DATA_PORT, m_reg[m_r]);
break;
case 0xf4: /* TMI,0 v */