diff options
Diffstat (limited to 'src/devices/video/scn2674.cpp')
-rw-r--r-- | src/devices/video/scn2674.cpp | 97 |
1 files changed, 68 insertions, 29 deletions
diff --git a/src/devices/video/scn2674.cpp b/src/devices/video/scn2674.cpp index 7cf9c9367f9..78bc2afe5af 100644 --- a/src/devices/video/scn2674.cpp +++ b/src/devices/video/scn2674.cpp @@ -79,16 +79,22 @@ scn2674_device::scn2674_device(const machine_config &mconfig, device_type type, , m_double{0, 0} , m_spl{false, false} , m_dbl1(0) - , m_buffer(0), m_linecounter(0), m_address(0), m_start1change(0) + , m_char_buffer(0), m_attr_buffer(0) + , m_linecounter(0), m_address(0), m_start1change(0) , m_scanline_timer(nullptr) - , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(), address_map_constructor(FUNC(scn2674_device::scn2674_vram), this)) + , m_char_space(nullptr), m_attr_space(nullptr) + , m_char_space_config("charram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(), address_map_constructor(FUNC(scn2674_device::scn2674_vram), this)) + , m_attr_space_config("attrram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(), address_map_constructor(FUNC(scn2674_device::scn2674_vram), this)) { } device_memory_interface::space_config_vector scn2674_device::memory_space_config() const { - return space_config_vector { - std::make_pair(0, &m_space_config) + return has_configured_map(1) ? space_config_vector { + std::make_pair(0, &m_char_space_config), + std::make_pair(1, &m_attr_space_config) + } : space_config_vector { + std::make_pair(0, &m_char_space_config) }; } @@ -100,6 +106,10 @@ void scn2674_device::device_start() m_scanline_timer = timer_alloc(TIMER_SCANLINE); screen().register_screen_bitmap(m_bitmap); + m_char_space = &space(0); + if (m_attr_space != nullptr) + m_attr_space = &space(1); + save_item(NAME(m_address)); save_item(NAME(m_linecounter)); save_item(NAME(m_screen1_address)); @@ -146,7 +156,9 @@ void scn2674_device::device_start() save_item(NAME(m_double)); save_item(NAME(m_spl)); save_item(NAME(m_dbl1)); - save_item(NAME(m_buffer)); + save_item(NAME(m_char_buffer)); + if (m_attr_space != nullptr) + save_item(NAME(m_attr_buffer)); save_item(NAME(m_start1change)); } @@ -195,7 +207,7 @@ void scn2674_device::device_reset() m_double[0] = m_double[1] = 0; m_spl[0] = m_spl[1] = false; m_dbl1 = 0; - m_buffer = 0; + m_char_buffer = m_attr_buffer = 0; m_linecounter = 0; m_IR_pointer = 0; m_address = 0; @@ -580,16 +592,16 @@ void scn2674_device::write_interrupt_mask(bool enabled, uint8_t bits) LOGMASKED(LOG_INTR, "%s: %s interrupts %02x by mask\n", machine().describe_context(), enabled ? "Enable" : "Disable", bits); - if (BIT(bits, 0)) - LOGMASKED(LOG_INTR, "Split 2 IRQ %s%s\n", BIT(changed_bits, 0) ? "" : "already ", enabled ? "enabled" : "disabled"); - if (BIT(bits, 1)) - LOGMASKED(LOG_INTR, "Ready IRQ %s%s\n", BIT(changed_bits, 1) ? "" : "already ", enabled ? "enabled" : "disabled"); - if (BIT(bits, 2)) - LOGMASKED(LOG_INTR, "Split 1 IRQ %s%s\n", BIT(changed_bits, 2) ? "" : "already ", enabled ? "enabled" : "disabled"); - if (BIT(bits, 3)) - LOGMASKED(LOG_INTR, "Line Zero IRQ %s%s\n", BIT(changed_bits, 3) ? "" : "already ", enabled ? "enabled" : "disabled"); - if (BIT(bits, 4)) - LOGMASKED(LOG_INTR, "V-Blank IRQ %s%s\n", BIT(changed_bits, 4) ? "" : "already ", enabled ? "enabled" : "disabled"); + if (BIT(changed_bits, 0)) + LOGMASKED(LOG_INTR, "Split 2 IRQ %s\n", enabled ? "enabled" : "disabled"); + if (BIT(changed_bits, 1)) + LOGMASKED(LOG_INTR, "Ready IRQ %s\n", enabled ? "enabled" : "disabled"); + if (BIT(changed_bits, 2)) + LOGMASKED(LOG_INTR, "Split 1 IRQ %s\n", enabled ? "enabled" : "disabled"); + if (BIT(changed_bits, 3)) + LOGMASKED(LOG_INTR, "Line Zero IRQ %s\n", enabled ? "enabled" : "disabled"); + if (BIT(changed_bits, 4)) + LOGMASKED(LOG_INTR, "V-Blank IRQ %s\n", enabled ? "enabled" : "disabled"); } void scn2674_device::write_delayed_command(uint8_t data) @@ -603,19 +615,25 @@ void scn2674_device::write_delayed_command(uint8_t data) { case 0xa4: // read at pointer address - m_buffer = space().read_byte(m_screen2_address); + m_char_buffer = m_char_space->read_byte(m_screen2_address); + if (m_attr_space != nullptr) + m_attr_buffer = m_attr_space->read_byte(m_screen2_address); LOGMASKED(LOG_COMMAND, "%s: DELAYED read at pointer address %02x\n", machine().describe_context(), data); break; case 0xa2: // write at pointer address - space().write_byte(m_screen2_address, m_buffer); + m_char_space->write_byte(m_screen2_address, m_char_buffer); + if (m_attr_space != nullptr) + m_attr_space->write_byte(m_screen2_address, m_attr_buffer); LOGMASKED(LOG_COMMAND, "%s: DELAYED write at pointer address %02x\n", machine().describe_context(), data); break; case 0xa6: // used by the Octopus // write at pointer address - space().write_byte(m_display_pointer_address, m_buffer); + m_char_space->write_byte(m_display_pointer_address, m_char_buffer); + if (m_attr_space != nullptr) + m_attr_space->write_byte(m_display_pointer_address, m_char_buffer); LOGMASKED(LOG_COMMAND, "%s: DELAYED write at display pointer address %02x\n", machine().describe_context(), data); break; @@ -627,19 +645,25 @@ void scn2674_device::write_delayed_command(uint8_t data) case 0xac: // read at cursor address - m_buffer = space().read_byte(m_cursor_address); + m_char_buffer = m_char_space->read_byte(m_cursor_address); + if (m_attr_space != nullptr) + m_attr_buffer = m_attr_space->read_byte(m_cursor_address); LOGMASKED(LOG_COMMAND, "%s: DELAYED read at cursor address %02x\n", machine().describe_context(), data); break; case 0xaa: // write at cursor address - space().write_byte(m_cursor_address, m_buffer); + m_char_space->write_byte(m_cursor_address, m_char_buffer); + if (m_attr_space != nullptr) + m_attr_space->write_byte(m_cursor_address, m_attr_buffer); LOGMASKED(LOG_COMMAND, "%s: DELAYED write at cursor address %02x\n", machine().describe_context(), data); break; case 0xad: // read at cursor address + increment - m_buffer = space().read_byte(m_cursor_address); + m_char_buffer = m_char_space->read_byte(m_cursor_address); + if (m_attr_space != nullptr) + m_attr_buffer = m_attr_space->read_byte(m_cursor_address); m_cursor_address++; LOGMASKED(LOG_COMMAND, "%s: DELAYED read at cursor address+increment %02x\n", machine().describe_context(), data); break; @@ -647,7 +671,9 @@ void scn2674_device::write_delayed_command(uint8_t data) case 0xab: case 0xaf: // LSI Octopus sends command 0xAF // write at cursor address + increment - space().write_byte(m_cursor_address, m_buffer); + m_char_space->write_byte(m_cursor_address, m_char_buffer); + if (m_attr_space != nullptr) + m_attr_space->write_byte(m_cursor_address, m_attr_buffer); m_cursor_address++; LOGMASKED(LOG_COMMAND, "%s: DELAYED write at cursor address+increment %02x\n", machine().describe_context(), data); break; @@ -656,8 +682,14 @@ void scn2674_device::write_delayed_command(uint8_t data) // write from cursor address to pointer address // TODO: transfer only during blank for (i = m_cursor_address; i != m_screen2_address; i = ((i + 1) & 0xffff)) - space().write_byte(i, m_buffer); - space().write_byte(i, m_buffer); // get the last + { + m_char_space->write_byte(i, m_char_buffer); + if (m_attr_space != nullptr) + m_attr_space->write_byte(i, m_attr_buffer); + } + m_char_space->write_byte(i, m_char_buffer); // get the last + if (m_attr_space != nullptr) + m_attr_space->write_byte(i, m_attr_buffer); m_cursor_address = m_screen2_address; LOGMASKED(LOG_COMMAND, "%s: DELAYED write from cursor address to pointer address %02x\n", machine().describe_context(), data); break; @@ -671,8 +703,14 @@ void scn2674_device::write_delayed_command(uint8_t data) // write from cursor address to pointer address // TODO: transfer only during blank for (i = m_cursor_address; i != m_display_pointer_address; i = (i + 1) & 0xffff) - space().write_byte(i, m_buffer); - space().write_byte(i, m_buffer); // get the last + { + m_char_space->write_byte(i, m_char_buffer); + if (m_attr_space != nullptr) + m_attr_space->write_byte(i, m_attr_buffer); + } + m_char_space->write_byte(i, m_char_buffer); // get the last + if (m_attr_space != nullptr) + m_attr_space->write_byte(i, m_attr_buffer); m_cursor_address = m_display_pointer_address; LOGMASKED(LOG_COMMAND, "%s: DELAYED write from cursor address to pointer address %02x\n", machine().describe_context(), data); break; @@ -983,7 +1021,7 @@ void scn2674_device::device_timer(emu_timer &timer, device_timer_id id, int para if (!charrow) { uint16_t addr = m_screen2_address; - uint16_t line = space().read_word(addr); + uint16_t line = m_char_space->read_word(addr); m_screen1_address = line; if (m_double_ht_wd) { @@ -1017,7 +1055,8 @@ void scn2674_device::device_timer(emu_timer &timer, device_timer_id id, int para i * m_hpixels_per_column, m_linecounter, tilerow, - space().read_byte(address), + m_char_space->read_byte(address), + m_attr_space != nullptr ? m_attr_space->read_byte(address) : 0, address, (charrow >= m_cursor_first_scanline) && (charrow <= m_cursor_last_scanline) && cursor_on, dw != 0, |