summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/z8/z8.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/z8/z8.cpp')
-rw-r--r--src/devices/cpu/z8/z8.cpp84
1 files changed, 51 insertions, 33 deletions
diff --git a/src/devices/cpu/z8/z8.cpp b/src/devices/cpu/z8/z8.cpp
index cef5a96e0ab..0926923de2c 100644
--- a/src/devices/cpu/z8/z8.cpp
+++ b/src/devices/cpu/z8/z8.cpp
@@ -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
{
- return space_config_vector {
- std::make_pair(AS_PROGRAM, &m_program_config),
- std::make_pair(AS_DATA, &m_data_config)
- };
+ // Separate data space is optional
+ if (has_configured_map(AS_DATA))
+ {
+ 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)
{
- /* SP <- SP - 1 */
+ // SP <- SP - 1 (predecrement)
uint8_t sp = register_read(Z8_REGISTER_SPL) - 1;
register_write(Z8_REGISTER_SPL, sp);
- /* @SP <- src */
+ // @SP <- src
register_write(sp, src);
}
else
{
- /* SP <- SP - 1 */
+ // SP <- SP - 1 (predecrement)
uint16_t sp = register_pair_read(Z8_REGISTER_SPH) - 1;
register_pair_write(Z8_REGISTER_SPH, sp);
- /* @SP <- src */
+ // @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)
{
- /* SP <- SP - 2 */
+ // SP <- SP - 2 (predecrement)
uint8_t sp = register_read(Z8_REGISTER_SPL) - 2;
register_write(Z8_REGISTER_SPL, sp);
- /* @SP <- src */
+ // @SP <- src
register_pair_write(sp, src);
}
else
{
- /* SP <- SP - 2 */
+ // SP <- SP - 2 (predecrement)
uint16_t sp = register_pair_read(Z8_REGISTER_SPH) - 2;
register_pair_write(Z8_REGISTER_SPH, sp);
- /* @SP <- src */
+ // @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)
{
- /* SP <- SP + 1 */
- uint8_t sp = register_read(Z8_REGISTER_SPL) + 1;
- register_write(Z8_REGISTER_SPL, sp);
+ // @SP <- src
+ uint8_t sp = register_read(Z8_REGISTER_SPL);
+ uint8_t byte = register_read(sp);
+
+ // SP <- SP + 1 (postincrement)
+ register_write(Z8_REGISTER_SPL, sp + 1);
- /* @SP <- src */
- return register_read(sp);
+ return byte;
}
else
{
- /* SP <- SP + 1 */
- uint16_t sp = register_pair_read(Z8_REGISTER_SPH) + 1;
- register_pair_write(Z8_REGISTER_SPH, sp);
+ // @SP <- src
+ uint16_t sp = register_pair_read(Z8_REGISTER_SPH);
+ uint8_t byte = m_data->read_byte(sp);
+
+ // SP <- SP + 1 (postincrement)
+ register_pair_write(Z8_REGISTER_SPH, sp + 1);
- /* @SP <- src */
- return m_data->read_byte(sp);
+ return byte;
}
}
@@ -513,21 +527,25 @@ uint16_t z8_device::stack_pop_word()
{
if (register_read(Z8_REGISTER_P01M) & Z8_P01M_INTERNAL_STACK)
{
- /* SP <- SP + 2 */
- uint8_t sp = register_read(Z8_REGISTER_SPL) + 2;
- register_write(Z8_REGISTER_SPL, sp);
+ // @SP <- src
+ uint8_t sp = register_read(Z8_REGISTER_SPL);
+ uint16_t word = register_pair_read(sp);
- /* @SP <- src */
- return register_read(sp);
+ // SP <- SP + 2 (postincrement)
+ register_write(Z8_REGISTER_SPL, sp + 2);
+
+ return word;
}
else
{
- /* SP <- SP + 2 */
- uint16_t sp = register_pair_read(Z8_REGISTER_SPH) + 2;
- register_pair_write(Z8_REGISTER_SPH, sp);
+ // @SP <- src
+ uint16_t sp = register_pair_read(Z8_REGISTER_SPH);
+ uint16_t word = m_data->read_word(sp);
+
+ // SP <- SP + 2 (postincrement)
+ register_pair_write(Z8_REGISTER_SPH, sp + 2);
- /* @SP <- src */
- return m_data->read_word(sp);
+ return word;
}
}
@@ -715,7 +733,7 @@ void z8_device::device_start()
/* find address spaces */
m_program = &space(AS_PROGRAM);
m_direct = &m_program->direct();
- m_data = &space(AS_DATA);
+ m_data = has_space(AS_DATA) ? &space(AS_DATA) : m_program;
/* allocate timers */
m_t0_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(z8_device::t0_tick), this));