diff --git a/src/mame/drivers/informer_207_376.cpp b/src/mame/drivers/informer_207_376.cpp index 011cbb1987e..490a4b72069 100644 --- a/src/mame/drivers/informer_207_376.cpp +++ b/src/mame/drivers/informer_207_376.cpp @@ -8,15 +8,16 @@ Hardware: - M6809 + - 8253 PIT - Z80SCC 8530 - - 6850 ACIA (up to 4) - - X2212P NVRAM + - 2x 6850 ACIA (up to 4) + - 2x X2212P NOVRAM TODO: - Dump keyboard controller and emulate it (currently HLE'd) - Problably needs improvements to at least the Z80SCC to properly support synchrous modes - - Figure out unknown reads/writes to the memory + - Figure out the unknown bits at 0x8400 - Verify NMI hookup - Verify clock speeds @@ -32,7 +33,7 @@ #include "machine/pit8253.h" #include "machine/clock.h" #include "machine/input_merger.h" -#include "machine/nvram.h" +#include "machine/x2212.h" #include "machine/z80scc.h" #include "video/mc6845.h" #include "sound/beep.h" @@ -54,6 +55,7 @@ public: informer_207_376_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_novram(*this, "novram%u", 0U), m_crtc(*this, "crtc"), m_screen(*this, "screen"), m_palette(*this, "palette"), @@ -62,8 +64,7 @@ public: m_acia(*this, "acia%u", 0U), m_beep(*this, "beep"), m_ram(*this, "ram"), - m_chargen(*this, "chargen"), - m_nmi_enabled(false) + m_chargen(*this, "chargen") { } void informer_207_376(machine_config &config); @@ -74,6 +75,7 @@ protected: private: required_device m_maincpu; + required_device_array m_novram; required_device m_crtc; required_device m_screen; required_device m_palette; @@ -86,15 +88,14 @@ private: void mem_map(address_map &map); - MC6845_UPDATE_ROW(crtc_update_row); - uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - - void vsync_w(int state); - void nmi_control_w(uint8_t data); void unk_8400_w(uint8_t data); + void crt_brightness_w(uint8_t data); + uint8_t novram_r(address_space &space, offs_t offset); + void novram_w(offs_t offset, uint8_t data); + uint8_t novram_recall_r(); - bool m_display_enabled; - bool m_nmi_enabled; + MC6845_UPDATE_ROW(crtc_update_row); + void vsync_w(int state); }; @@ -110,10 +111,11 @@ void informer_207_376_state::mem_map(address_map &map) map(0x8400, 0x8400).lr8(NAME([] () { return 0xff; })).w(FUNC(informer_207_376_state::unk_8400_w)); // ? map(0x8802, 0x8803).rw(m_acia[0], FUNC(acia6850_device::read), FUNC(acia6850_device::write)); map(0x8804, 0x8805).rw(m_acia[1], FUNC(acia6850_device::read), FUNC(acia6850_device::write)); - map(0x8c00, 0x8c00).w(FUNC(informer_207_376_state::nmi_control_w)); + map(0x8c00, 0x8c00).w(FUNC(informer_207_376_state::crt_brightness_w)); map(0x9000, 0x9003).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0x9400, 0x9403).rw(m_scc, FUNC(scc85c30_device::ab_dc_r), FUNC(scc85c30_device::ab_dc_w)); - map(0x9c00, 0x9cff).ram().share("nvram"); + map(0x9800, 0x9800).r(FUNC(informer_207_376_state::novram_recall_r)); + map(0x9c00, 0x9cff).rw(FUNC(informer_207_376_state::novram_r), FUNC(informer_207_376_state::novram_w)); map(0xa000, 0xffff).rom().region("maincpu", 0); } @@ -130,9 +132,16 @@ INPUT_PORTS_END // VIDEO EMULATION //************************************************************************** +void informer_207_376_state::crt_brightness_w(uint8_t data) +{ + // unknown algorithm for the brightness + // default value is 4, range is 0 (off) to 15 (brightest) + m_screen->set_brightness(256 - (256 / ((data & 0x0f) + 1))); +} + void informer_207_376_state::vsync_w(int state) { - if (m_nmi_enabled && state == 1) + if (state) { m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); @@ -167,16 +176,6 @@ MC6845_UPDATE_ROW( informer_207_376_state::crtc_update_row ) } } -uint32_t informer_207_376_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - if (m_display_enabled) - m_crtc->screen_update(screen, bitmap, cliprect); - else - bitmap.fill(rgb_t::black(), cliprect); - - return 0; -} - static const gfx_layout char_layout = { 8,11, @@ -197,39 +196,45 @@ GFXDECODE_END // MACHINE EMULATION //************************************************************************** -void informer_207_376_state::nmi_control_w(uint8_t data) -{ - // 76543--- unused? - // -----21- nmi enable? - // -------0 unused? - - m_nmi_enabled = bool(data & 0x06); -} - void informer_207_376_state::unk_8400_w(uint8_t data) { // 7------- beeper // -6------ unknown // --5----- 1=internal modem, 0=host rs232 // ---43--- unknown - // -----2-- display enabled? + // -----2-- unknown // ------10 unknown m_beep->set_state(BIT(data, 7)); - m_display_enabled = bool(BIT(data, 2)); +} + +uint8_t informer_207_376_state::novram_r(address_space &space, offs_t offset) +{ + return (m_novram[0]->read(space, offset) << 4) | (m_novram[1]->read(space, offset) & 0x0f); +} + +void informer_207_376_state::novram_w(offs_t offset, uint8_t data) +{ + m_novram[0]->write(offset, data >> 4); + m_novram[1]->write(offset, data & 0x0f); +} + +uint8_t informer_207_376_state::novram_recall_r() +{ + m_novram[0]->recall(1); + m_novram[1]->recall(1); + m_novram[0]->recall(0); + m_novram[1]->recall(0); + + return 0xff; } void informer_207_376_state::machine_start() { - // register for save states - save_item(NAME(m_display_enabled)); - save_item(NAME(m_nmi_enabled)); } void informer_207_376_state::machine_reset() { - m_display_enabled = false; - m_nmi_enabled = false; } @@ -250,7 +255,8 @@ void informer_207_376_state::informer_207_376(machine_config &config) input_merger_device &cpu_irq(INPUT_MERGER_ANY_HIGH(config, "cpu_irq")); cpu_irq.output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE); - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 2x X2212P + X2212(config, "novram0"); + X2212(config, "novram1"); PIT8253(config, m_pit); m_pit->set_clk<0>(2.457600_MHz_XTAL); @@ -272,6 +278,8 @@ void informer_207_376_state::informer_207_376(machine_config &config) ACIA6850(config, m_acia[0]); m_acia[0]->txd_handler().set("kbd", FUNC(informer_207_376_kbd_hle_device::rx_w)); m_acia[0]->irq_handler().set("cpu_irq", FUNC(input_merger_device::in_w<1>)); + m_acia[0]->rts_handler().set(m_novram[0], FUNC(x2212_device::store)).invert(); + m_acia[0]->rts_handler().append(m_novram[1], FUNC(x2212_device::store)).invert(); ACIA6850(config, m_acia[1]); m_acia[1]->txd_handler().set("printer", FUNC(rs232_port_device::write_txd)); @@ -295,7 +303,7 @@ void informer_207_376_state::informer_207_376(machine_config &config) SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_color(rgb_t::green()); m_screen->set_raw(36_MHz_XTAL / 2.5, 800, 0, 640, 300, 0, 286); - m_screen->set_screen_update(FUNC(informer_207_376_state::screen_update)); + m_screen->set_screen_update(m_crtc, FUNC(mc6845_device::screen_update)); PALETTE(config, m_palette, palette_device::MONOCHROME);