summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commit2a9de8e4265fb62a999f001c70411cc9aff188ee (patch)
tree486eeb77614cf03ac0c61906abc5cf7292ffcb58
parent48d1f0de37fc6c429051dd1bcd1a49dbef581b1a (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.cpp32
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;
}