z8: Make data space optional; fix stack pop semantics

This commit is contained in:
AJR 2017-09-03 14:12:16 -04:00
parent 5864b8f5c0
commit 74f26ff88f

View File

@ -214,10 +214,20 @@ offs_t z8_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint
device_memory_interface::space_config_vector z8_device::memory_space_config() const device_memory_interface::space_config_vector z8_device::memory_space_config() const
{ {
return space_config_vector { // Separate data space is optional
std::make_pair(AS_PROGRAM, &m_program_config), if (has_configured_map(AS_DATA))
std::make_pair(AS_DATA, &m_data_config) {
}; return space_config_vector {
std::make_pair(AS_PROGRAM, &m_program_config),
std::make_pair(AS_DATA, &m_data_config)
};
}
else
{
return space_config_vector {
std::make_pair(AS_PROGRAM, &m_program_config)
};
}
} }
/*************************************************************************** /***************************************************************************
@ -447,20 +457,20 @@ void z8_device::stack_push_byte(uint8_t src)
{ {
if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK) if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK)
{ {
/* SP <- SP - 1 */ // SP <- SP - 1 (predecrement)
uint8_t sp = register_read(Z8_REGISTER_SPL) - 1; uint8_t sp = register_read(Z8_REGISTER_SPL) - 1;
register_write(Z8_REGISTER_SPL, sp); register_write(Z8_REGISTER_SPL, sp);
/* @SP <- src */ // @SP <- src
register_write(sp, src); register_write(sp, src);
} }
else else
{ {
/* SP <- SP - 1 */ // SP <- SP - 1 (predecrement)
uint16_t sp = register_pair_read(Z8_REGISTER_SPH) - 1; uint16_t sp = register_pair_read(Z8_REGISTER_SPH) - 1;
register_pair_write(Z8_REGISTER_SPH, sp); register_pair_write(Z8_REGISTER_SPH, sp);
/* @SP <- src */ // @SP <- src
m_data->write_byte(sp, src); m_data->write_byte(sp, src);
} }
} }
@ -469,20 +479,20 @@ void z8_device::stack_push_word(uint16_t src)
{ {
if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK) if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK)
{ {
/* SP <- SP - 2 */ // SP <- SP - 2 (predecrement)
uint8_t sp = register_read(Z8_REGISTER_SPL) - 2; uint8_t sp = register_read(Z8_REGISTER_SPL) - 2;
register_write(Z8_REGISTER_SPL, sp); register_write(Z8_REGISTER_SPL, sp);
/* @SP <- src */ // @SP <- src
register_pair_write(sp, src); register_pair_write(sp, src);
} }
else else
{ {
/* SP <- SP - 2 */ // SP <- SP - 2 (predecrement)
uint16_t sp = register_pair_read(Z8_REGISTER_SPH) - 2; uint16_t sp = register_pair_read(Z8_REGISTER_SPH) - 2;
register_pair_write(Z8_REGISTER_SPH, sp); register_pair_write(Z8_REGISTER_SPH, sp);
/* @SP <- src */ // @SP <- src
m_data->write_word(sp, src); m_data->write_word(sp, src);
} }
} }
@ -491,21 +501,25 @@ uint8_t z8_device::stack_pop_byte()
{ {
if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK) if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK)
{ {
/* SP <- SP + 1 */ // @SP <- src
uint8_t sp = register_read(Z8_REGISTER_SPL) + 1; uint8_t sp = register_read(Z8_REGISTER_SPL);
register_write(Z8_REGISTER_SPL, sp); uint8_t byte = register_read(sp);
/* @SP <- src */ // SP <- SP + 1 (postincrement)
return register_read(sp); register_write(Z8_REGISTER_SPL, sp + 1);
return byte;
} }
else else
{ {
/* SP <- SP + 1 */ // @SP <- src
uint16_t sp = register_pair_read(Z8_REGISTER_SPH) + 1; uint16_t sp = register_pair_read(Z8_REGISTER_SPH);
register_pair_write(Z8_REGISTER_SPH, sp); uint8_t byte = m_data->read_byte(sp);
/* @SP <- src */ // SP <- SP + 1 (postincrement)
return m_data->read_byte(sp); register_pair_write(Z8_REGISTER_SPH, sp + 1);
return byte;
} }
} }
@ -513,21 +527,25 @@ uint16_t z8_device::stack_pop_word()
{ {
if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK) if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK)
{ {
/* SP <- SP + 2 */ // @SP <- src
uint8_t sp = register_read(Z8_REGISTER_SPL) + 2; uint8_t sp = register_read(Z8_REGISTER_SPL);
register_write(Z8_REGISTER_SPL, sp); uint16_t word = register_pair_read(sp);
/* @SP <- src */ // SP <- SP + 2 (postincrement)
return register_read(sp); register_write(Z8_REGISTER_SPL, sp + 2);
return word;
} }
else else
{ {
/* SP <- SP + 2 */ // @SP <- src
uint16_t sp = register_pair_read(Z8_REGISTER_SPH) + 2; uint16_t sp = register_pair_read(Z8_REGISTER_SPH);
register_pair_write(Z8_REGISTER_SPH, sp); uint16_t word = m_data->read_word(sp);
/* @SP <- src */ // SP <- SP + 2 (postincrement)
return m_data->read_word(sp); register_pair_write(Z8_REGISTER_SPH, sp + 2);
return word;
} }
} }
@ -715,7 +733,7 @@ void z8_device::device_start()
/* find address spaces */ /* find address spaces */
m_program = &space(AS_PROGRAM); m_program = &space(AS_PROGRAM);
m_direct = &m_program->direct(); m_direct = &m_program->direct();
m_data = &space(AS_DATA); m_data = has_space(AS_DATA) ? &space(AS_DATA) : m_program;
/* allocate timers */ /* allocate timers */
m_t0_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(z8_device::t0_tick), this)); m_t0_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(z8_device::t0_tick), this));