diff options
author | Sylvain Glaize <mokona@puupuu.org> | 2020-11-17 08:33:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-17 08:33:45 +0100 |
commit | 2a9de8e4265fb62a999f001c70411cc9aff188ee (patch) | |
tree | 486eeb77614cf03ac0c61906abc5cf7292ffcb58 | |
parent | 48d1f0de37fc6c429051dd1bcd1a49dbef581b1a (diff) |
VG5000ยต printer more accurate support. (#7489) [S. Glaize]
To emit the character, it is first latched on port ($10) then a rising edge is produced on port ($11).
-rw-r--r-- | src/mame/drivers/vg5k.cpp | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/src/mame/drivers/vg5k.cpp b/src/mame/drivers/vg5k.cpp index f4b9264aac8..3ed9d8168ac 100644 --- a/src/mame/drivers/vg5k.cpp +++ b/src/mame/drivers/vg5k.cpp @@ -92,13 +92,16 @@ private: required_device<ram_device> m_ram; offs_t m_ef9345_offset; + uint8_t m_printer_latch; + uint8_t m_printer_signal; virtual void machine_start() override; virtual void machine_reset() override; void z80_m1_w(uint8_t data); - uint8_t printer_r(); - void printer_w(uint8_t data); + uint8_t printer_state_r(); + void printer_state_w(uint8_t data); + void printer_data_w(uint8_t data); void ef9345_offset_w(uint8_t data); uint8_t ef9345_io_r(); void ef9345_io_w(uint8_t data); @@ -121,15 +124,24 @@ void vg5k_state::z80_m1_w(uint8_t data) m_maincpu->adjust_icount(-1); } -uint8_t vg5k_state::printer_r() +uint8_t vg5k_state::printer_state_r() { return (m_printer->is_ready() ? 0x00 : 0xff); } +void vg5k_state::printer_state_w(uint8_t data) +{ + // Character is emitted on a rising edge. + if (!BIT(m_printer_signal, 0) && BIT(data, 0)) { + m_printer->output(m_printer_latch); + } + m_printer_signal = data; +} + -void vg5k_state::printer_w(uint8_t data) +void vg5k_state::printer_data_w(uint8_t data) { - m_printer->output(data); + m_printer_latch = data; } @@ -194,8 +206,8 @@ void vg5k_state::vg5k_io(address_map &map) map(0x08, 0x08).portr("JOY1"); /* printer */ - map(0x10, 0x10).r(FUNC(vg5k_state::printer_r)); - map(0x11, 0x11).w(FUNC(vg5k_state::printer_w)); + map(0x10, 0x10).rw(FUNC(vg5k_state::printer_state_r), FUNC(vg5k_state::printer_state_w)); + map(0x11, 0x11).w(FUNC(vg5k_state::printer_data_w)); /* keyboard */ map(0x80, 0x80).portr("ROW1"); @@ -342,11 +354,15 @@ INPUT_CHANGED_MEMBER(vg5k_state::delta_button) void vg5k_state::machine_start() { save_item(NAME(m_ef9345_offset)); + save_item(NAME(m_printer_latch)); + save_item(NAME(m_printer_signal)); } void vg5k_state::machine_reset() { - m_ef9345_offset = 0; + m_ef9345_offset = 0; + m_printer_latch = 0; + m_printer_signal = 0; } |