From aa8e0fe2cfab9f55044adf65e0f7dc94e1a43dd8 Mon Sep 17 00:00:00 2001 From: arbee Date: Sat, 20 Feb 2016 16:38:50 -0500 Subject: [PATCH] sq1: much improved LCD and front panel button support. [Parduz, R. Belmont] --- scripts/target/mame/mess.lua | 2 + src/mame/drivers/esq5505.cpp | 79 ++- src/mame/layout/esq2by16.lay | 980 ++++++++++++++++++++++++++++++++++ src/mame/machine/esqlcd.cpp | 403 ++++++++++++++ src/mame/machine/esqlcd.h | 45 ++ src/mame/machine/esqpanel.cpp | 23 +- src/mame/machine/esqpanel.h | 28 +- 7 files changed, 1530 insertions(+), 30 deletions(-) create mode 100644 src/mame/layout/esq2by16.lay create mode 100644 src/mame/machine/esqlcd.cpp create mode 100644 src/mame/machine/esqlcd.h diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 80be3e7c76c..281601e4d5f 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -1636,6 +1636,8 @@ files { MAME_DIR .. "src/mame/machine/esqpanel.h", MAME_DIR .. "src/mame/machine/esqvfd.cpp", MAME_DIR .. "src/mame/machine/esqvfd.h", + MAME_DIR .. "src/mame/machine/esqlcd.cpp", + MAME_DIR .. "src/mame/machine/esqlcd.h", } createMESSProjects(_target, _subtarget, "enterprise") diff --git a/src/mame/drivers/esq5505.cpp b/src/mame/drivers/esq5505.cpp index 9b3e2493894..928ccee913c 100644 --- a/src/mame/drivers/esq5505.cpp +++ b/src/mame/drivers/esq5505.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:R. Belmont +// copyright-holders:R. Belmont, Parduz /*************************************************************************** esq5505.c - Ensoniq ES5505 + ES5510 based synthesizers and samplers @@ -10,7 +10,7 @@ The Taito sound system in taito_en.c is directly derived from the 32-voice version of the SD-1. - Driver by R. Belmont with thanks to Parduz, Christian Brunschen, and Phil Bennett + Driver by R. Belmont and Parduz with thanks to Christian Brunschen, and Phil Bennett Memory map: @@ -138,6 +138,7 @@ #include "machine/hd63450.h" // compatible with MC68450, which is what these really have #include "formats/esq16_dsk.h" #include "machine/esqvfd.h" +#include "machine/esqlcd.h" #include "machine/esqpanel.h" #define GENERIC (0) @@ -259,7 +260,7 @@ IRQ_CALLBACK_MEMBER(esq5505_state::maincpu_irq_acknowledge_callback) vector = duart_irq_vector; break; default: - printf("\nUnexpected IRQ ACK Callback: IRQ %d\n", irqline); + logerror("\nUnexpected IRQ ACK Callback: IRQ %d\n", irqline); return 0; } update_irq_to_maincpu(); @@ -516,7 +517,7 @@ WRITE8_MEMBER(esq5505_state::dma_end) { if (data != 0) { - printf("DMAC IRQ, vector = %x\n", m_dmac->get_vector(offset)); + //printf("DMAC IRQ, vector = %x\n", m_dmac->get_vector(offset)); dmac_irq_state = 1; dmac_irq_vector = m_dmac->get_vector(offset); } @@ -532,7 +533,7 @@ WRITE8_MEMBER(esq5505_state::dma_error) { if(data != 0) { - printf("DMAC error, vector = %x\n", m_dmac->get_error_vector(offset)); + logerror("DMAC error, vector = %x\n", m_dmac->get_error_vector(offset)); dmac_irq_state = 1; dmac_irq_vector = m_dmac->get_vector(offset); } @@ -558,8 +559,14 @@ WRITE8_MEMBER(esq5505_state::fdc_write_byte) INPUT_CHANGED_MEMBER(esq5505_state::key_stroke) { int val = (UINT8)(FPTR)param; + int cmp = 0x60; - if (val < 0x60) + if (m_system_type == SQ1) + { + cmp = 10; + } + + if (val < cmp) { if (oldval == 0 && newval == 1) { @@ -575,7 +582,7 @@ INPUT_CHANGED_MEMBER(esq5505_state::key_stroke) } else if (val == 0x02) { - printf("Analog tests!\n"); +// printf("Analog tests!\n"); m_panel->xmit_char(54 | 0x80); m_panel->xmit_char(0); // Preset down m_panel->xmit_char(8 | 0x80); m_panel->xmit_char(0); // Compare down m_panel->xmit_char(8); m_panel->xmit_char(0); // Compare up @@ -585,10 +592,10 @@ INPUT_CHANGED_MEMBER(esq5505_state::key_stroke) } else { - val += shift; + if (val < 20) val += shift; if (oldval == 0 && newval == 1) { - printf("key pressed %d\n", val&0x7f); + // printf("key pressed %d\n", val); m_panel->xmit_char(val); m_panel->xmit_char(0x00); } @@ -733,7 +740,7 @@ static MACHINE_CONFIG_DERIVED(sq1, vfx) MCFG_CPU_PROGRAM_MAP(sq1_map) MCFG_ESQPANEL_2x40_REMOVE("panel") - MCFG_ESQPANEL2x40_SQ1_ADD("panel") + MCFG_ESQPANEL2x16_SQ1_ADD("panel") MCFG_ESQPANEL_TX_CALLBACK(DEVWRITELINE("duart", mc68681_device, rx_b_w)) MCFG_ESQPANEL_ANALOG_CALLBACK(WRITE16(esq5505_state, analog_w)) MACHINE_CONFIG_END @@ -784,6 +791,53 @@ static INPUT_PORTS_START( vfx ) #endif INPUT_PORTS_END +static INPUT_PORTS_START( sq1 ) +#if KEYBOARD_HACK + PORT_START("KEY0") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 148) PORT_NAME("PITCH") // 148=PITCH (lo 1) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 149) PORT_NAME("CONTROL") // 149=CONTROL (hi 1) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 132) PORT_NAME("ENV1") // 132=ENV1 (lo 2) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 133) PORT_NAME("CLICK") // 133=CLICK (hi 2) + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 182) PORT_NAME("LFO") // 182=LFO (lo 3) + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 183) PORT_NAME("SONG") // 183=SONG (hi 3) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 134) PORT_NAME("FILTER") // 134=FILTER (lo 4) + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 135) PORT_NAME("SEQ") // 135=SEQ (hi 4) + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 142) PORT_NAME("ENV2") // 142=ENV2 (lo 5) + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 143) PORT_NAME("EVENT") // 143=EVENT (hi 5) + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 150) PORT_NAME("AMP") // 150=AMP (lo 6) + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 151) PORT_NAME("PARAM") // 151=PARAM (hi 6) + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 166) PORT_NAME("OUTPUT") // 166=OUTPUT (lo 7) + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 167) PORT_NAME("MIX") // 167=MIX (hi 7) + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 158) PORT_NAME("P. EFFECT") // 158=P.EFFECT (lo 8) + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 159) PORT_NAME("S. EFFECT") // 159=S.EFFECT (hi 8) + PORT_START("KEY1") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 174) PORT_NAME("MIDI") // 174=MIDI (lo 9) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 175) PORT_NAME("SYSTEM") // 175=SYSTEM (hi 9) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 164) PORT_NAME("WAVE") // 164=WAVE (lo 0) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 165) PORT_NAME("LOCATE") // 165=LOCATE (hi 0) + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 144) PORT_NAME("TRACK 1") // 144=Track 1 + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 160) PORT_NAME("TRACK 2") // 160=Track 2 + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 152) PORT_NAME("TRACK 3") // 152=Track 3 + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 168) PORT_NAME("TRACK 4") // 168=Track 4 + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 145) PORT_NAME("TRACK 5") // 145=Track 5 + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 161) PORT_NAME("TRACK 6") // 161=Track 6 + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 136) PORT_NAME("TRACK 7") // 136=Track 7 + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 176) PORT_NAME("TRACK 8") // 176=Track 8 + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 172) PORT_NAME("ENTER") // 172=ENTER + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 173) PORT_NAME("COMPARE") // 173=COMPARE + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 140) PORT_NAME("PROG DN") // 140=ProgDn + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 141) PORT_NAME("PROG UP") // 141=ProgUp + PORT_START("KEY2") + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 156) PORT_NAME("ROM/INT SELECT +") // 156=ROM/INT Select 189=track + + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 157) PORT_NAME("ROM/INT SELECT -") // 157=ROM/INT Select 190=track - + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 180) PORT_NAME("SOUND SELECT") // 180=SOUND Select + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 181) PORT_NAME("SOUND EDIT") // 181=SOUND Edit + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 184) PORT_NAME("SEQ EDIT") // 184=SEQ Edit + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 153) PORT_NAME("SEQ SELECT") // 153=SEQ Select + PORT_START("KEY3") +#endif +INPUT_PORTS_END + #define ROM_LOAD16_BYTE_BIOS(bios,name,offset,length,hash) \ ROMX_LOAD(name, offset, length, hash, ROM_SKIP(1) | ROM_BIOS(bios+1)) /* Note '+1' */ @@ -923,6 +977,7 @@ DRIVER_INIT_MEMBER(esq5505_state,sq1) { DRIVER_INIT_CALL(common); m_system_type = SQ1; + shift = 60; } DRIVER_INIT_MEMBER(esq5505_state,denib) @@ -950,6 +1005,6 @@ CONS( 1989, vfx, 0, 0, vfx, vfx, esq5505_state, denib, "Ensoniq", "VFX", CONS( 1989, vfxsd, 0, 0, vfxsd, vfx, esq5505_state, denib, "Ensoniq", "VFX-SD", MACHINE_NOT_WORKING ) // 2x40 VFD CONS( 1990, eps16p,eps, 0, eps, vfx, esq5505_state, eps, "Ensoniq", "EPS-16 Plus", MACHINE_NOT_WORKING ) // custom VFD: one alphanumeric 22-char row, one graphics-capable row (alpha row can also do bar graphs) CONS( 1990, sd1, 0, 0, vfxsd, vfx, esq5505_state, denib, "Ensoniq", "SD-1 (21 voice)", MACHINE_NOT_WORKING ) // 2x40 VFD -CONS( 1990, sq1, 0, 0, sq1, vfx, esq5505_state, sq1, "Ensoniq", "SQ-1", MACHINE_NOT_WORKING ) // 2x16 LCD -CONS( 1990, sqrack,sq1, 0, sq1, vfx, esq5505_state, sq1, "Ensoniq", "SQ-Rack", MACHINE_NOT_WORKING ) // 2x16 LCD +CONS( 1990, sq1, 0, 0, sq1, sq1, esq5505_state, sq1, "Ensoniq", "SQ-1", MACHINE_NOT_WORKING ) // 2x16 LCD +CONS( 1990, sqrack,sq1, 0, sq1, sq1, esq5505_state, sq1, "Ensoniq", "SQ-Rack", MACHINE_NOT_WORKING ) // 2x16 LCD CONS( 1991, sd132, sd1,0, vfx32, vfx, esq5505_state, denib, "Ensoniq", "SD-1 (32 voice)", MACHINE_NOT_WORKING ) // 2x40 VFD diff --git a/src/mame/layout/esq2by16.lay b/src/mame/layout/esq2by16.lay new file mode 100644 index 00000000000..1861b335476 --- /dev/null +++ b/src/mame/layout/esq2by16.lay @@ -0,0 +1,980 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/machine/esqlcd.cpp b/src/mame/machine/esqlcd.cpp new file mode 100644 index 00000000000..e9b23fa2685 --- /dev/null +++ b/src/mame/machine/esqlcd.cpp @@ -0,0 +1,403 @@ +// license:BSD-3-Clause +// copyright-holders:Parduz +/* + Ensoniq LCD dotmatrix Displays + derived by Parduz from the VFD Emulation by R. Belmont +*/ +#include "esqlcd.h" +#include "esq2by16.lh" + +//#define VERBOSE + +const device_type ESQ2x16_SQ1 = &device_creator; + +// --- SQ1 - Parduz -------------------------------------------------------------------------------------------------------------------------- +static MACHINE_CONFIG_FRAGMENT(esq2x16) + MCFG_DEFAULT_LAYOUT(layout_esq2by16) +MACHINE_CONFIG_END + +/*! \file font5x7.h \brief Graphic LCD Font (Ascii Characters). */ +//***************************************************************************** +// +// File Name : 'font5x7.h' +// Title : Graphic LCD Font (Ascii Charaters) +// Author : Pascal Stang +// Date : 10/19/2001 +// Revised : 10/19/2001 +// Version : 0.1 +// Target MCU : Atmel AVR +// Editor Tabs : 4 +// +//***************************************************************************** +// standard ascii 5x7 font +// defines ascii characters 0x20-0x7F (32-127) +static unsigned char Font5x7[][5] = { + {0x00, 0x00, 0x08, 0x00, 0x00}, // _Undef_ 0x00 - dots for debug purposes + {0x01, 0x00, 0x00, 0x00, 0x40}, // _Undef_ 0x01 - dots for debug purposes + {0x02, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x02 + {0x03, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x03 + {0x04, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x04 + {0x05, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x05 + {0x06, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x06 + {0x07, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x07 + {0x20, 0x70, 0x3F, 0x00, 0x00}, // Croma 0x08 + {0x20, 0x70, 0x3F, 0x02, 0x0C}, // Croma 0x09 + {0x20, 0x70, 0x3F, 0x05, 0x0A}, // Croma 0x0A + {0x20, 0x70, 0x3F, 0x15, 0x2A}, // Croma 0x0B + {0x20, 0x50, 0x50, 0x3F, 0x00}, // Croma 0x0C + {0x0D, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x0D + {0x0E, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x0E + {0x0F, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x0F + {0x10, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x10 + {0x11, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x11 + {0x12, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x12 + {0x13, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x13 + {0x14, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x14 + {0x15, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x15 + {0x16, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x16 + {0x17, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x17 + {0x18, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x18 + {0x19, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x19 + {0x1A, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x1A + {0x1B, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x1B + {0x1C, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x1C + {0x1D, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x1D + {0x1E, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x1E + {0x1F, 0x00, 0x00, 0x00, 0x00}, // _Undef_ 0x1F + {0x00, 0x00, 0x00, 0x00, 0x00}, // (space) 0x20 + {0x00, 0x00, 0x5F, 0x00, 0x00}, // ! 0x21 + {0x00, 0x07, 0x00, 0x07, 0x00}, // " 0x22 + {0x14, 0x7F, 0x14, 0x7F, 0x14}, // # 0x23 + {0x24, 0x2A, 0x7F, 0x2A, 0x12}, // $ 0x24 + {0x23, 0x13, 0x08, 0x64, 0x62}, // % 0x25 + {0x36, 0x49, 0x55, 0x22, 0x50}, // & 0x26 + {0x00, 0x05, 0x03, 0x00, 0x00}, // ' 0x27 + {0x00, 0x1C, 0x22, 0x41, 0x00}, // ( 0x28 + {0x00, 0x41, 0x22, 0x1C, 0x00}, // ) 0x29 + {0x08, 0x2A, 0x1C, 0x2A, 0x08}, // * 0x2A + {0x08, 0x08, 0x3E, 0x08, 0x08}, // + 0x2B + {0x00, 0x50, 0x30, 0x00, 0x00}, // , 0x2C + {0x08, 0x08, 0x08, 0x08, 0x08}, // - 0x2D + {0x00, 0x60, 0x60, 0x00, 0x00}, // . 0x2E + {0x20, 0x10, 0x08, 0x04, 0x02}, // / 0x2F + {0x3E, 0x51, 0x49, 0x45, 0x3E}, // 0 0x30 + {0x00, 0x42, 0x7F, 0x40, 0x00}, // 1 0x31 + {0x42, 0x61, 0x51, 0x49, 0x46}, // 2 0x32 + {0x21, 0x41, 0x45, 0x4B, 0x31}, // 3 0x33 + {0x18, 0x14, 0x12, 0x7F, 0x10}, // 4 0x34 + {0x27, 0x45, 0x45, 0x45, 0x39}, // 5 0x35 + {0x3C, 0x4A, 0x49, 0x49, 0x30}, // 6 0x36 + {0x01, 0x71, 0x09, 0x05, 0x03}, // 7 0x37 + {0x36, 0x49, 0x49, 0x49, 0x36}, // 8 0x38 + {0x06, 0x49, 0x49, 0x29, 0x1E}, // 9 0x39 + {0x00, 0x36, 0x36, 0x00, 0x00}, // : 0x3A + {0x00, 0x56, 0x36, 0x00, 0x00}, // ; 0x3B + {0x00, 0x08, 0x14, 0x22, 0x41}, // < 0x3C + {0x14, 0x14, 0x14, 0x14, 0x14}, // = 0x3D + {0x41, 0x22, 0x14, 0x08, 0x00}, // > 0x3E + {0x02, 0x01, 0x51, 0x09, 0x06}, // ? 0x3F + {0x32, 0x49, 0x79, 0x41, 0x3E}, // @ 0x40 + {0x7E, 0x11, 0x11, 0x11, 0x7E}, // A 0x41 + {0x7F, 0x49, 0x49, 0x49, 0x36}, // B 0x42 + {0x3E, 0x41, 0x41, 0x41, 0x22}, // C 0x43 + {0x7F, 0x41, 0x41, 0x22, 0x1C}, // D 0x44 + {0x7F, 0x49, 0x49, 0x49, 0x41}, // E 0x45 + {0x7F, 0x09, 0x09, 0x01, 0x01}, // F 0x46 + {0x3E, 0x41, 0x41, 0x51, 0x32}, // G 0x47 + {0x7F, 0x08, 0x08, 0x08, 0x7F}, // H 0x48 + {0x00, 0x41, 0x7F, 0x41, 0x00}, // I 0x49 + {0x20, 0x40, 0x41, 0x3F, 0x01}, // J 0x4A + {0x7F, 0x08, 0x14, 0x22, 0x41}, // K 0x4B + {0x7F, 0x40, 0x40, 0x40, 0x40}, // L 0x4C + {0x7F, 0x02, 0x04, 0x02, 0x7F}, // M 0x4D + {0x7F, 0x04, 0x08, 0x10, 0x7F}, // N 0x4E + {0x3E, 0x41, 0x41, 0x41, 0x3E}, // O 0x4F + {0x7F, 0x09, 0x09, 0x09, 0x06}, // P 0x50 + {0x3E, 0x41, 0x51, 0x21, 0x5E}, // Q 0x51 + {0x7F, 0x09, 0x19, 0x29, 0x46}, // R 0x52 + {0x46, 0x49, 0x49, 0x49, 0x31}, // S 0x53 + {0x01, 0x01, 0x7F, 0x01, 0x01}, // T 0x54 + {0x3F, 0x40, 0x40, 0x40, 0x3F}, // U 0x55 + {0x1F, 0x20, 0x40, 0x20, 0x1F}, // V 0x56 + {0x7F, 0x20, 0x18, 0x20, 0x7F}, // W 0x57 + {0x63, 0x14, 0x08, 0x14, 0x63}, // X 0x58 + {0x03, 0x04, 0x78, 0x04, 0x03}, // Y 0x59 + {0x61, 0x51, 0x49, 0x45, 0x43}, // Z 0x5A + {0x00, 0x00, 0x7F, 0x41, 0x41}, // [ 0x5B + {0x02, 0x04, 0x08, 0x10, 0x20}, // \ 0x5C + {0x41, 0x41, 0x7F, 0x00, 0x00}, // ] 0x5D + {0x04, 0x02, 0x01, 0x02, 0x04}, // ^ 0x5E + {0x40, 0x40, 0x40, 0x40, 0x40}, // _ 0x5F + {0x00, 0x01, 0x02, 0x04, 0x00}, // ` 0x60 + {0x20, 0x54, 0x54, 0x54, 0x78}, // a 0x61 + {0x7F, 0x48, 0x44, 0x44, 0x38}, // b 0x62 + {0x38, 0x44, 0x44, 0x44, 0x20}, // c 0x63 + {0x38, 0x44, 0x44, 0x48, 0x7F}, // d 0x64 + {0x38, 0x54, 0x54, 0x54, 0x18}, // e 0x65 + {0x08, 0x7E, 0x09, 0x01, 0x02}, // f 0x66 + {0x08, 0x14, 0x54, 0x54, 0x3C}, // g 0x67 + {0x7F, 0x08, 0x04, 0x04, 0x78}, // h 0x68 + {0x00, 0x44, 0x7D, 0x40, 0x00}, // i 0x69 + {0x20, 0x40, 0x44, 0x3D, 0x00}, // j 0x6A + {0x00, 0x7F, 0x10, 0x28, 0x44}, // k 0x6B + {0x00, 0x41, 0x7F, 0x40, 0x00}, // l 0x6C + {0x7C, 0x04, 0x18, 0x04, 0x78}, // m 0x6D + {0x7C, 0x08, 0x04, 0x04, 0x78}, // n 0x6E + {0x38, 0x44, 0x44, 0x44, 0x38}, // o 0x6F + {0x7C, 0x14, 0x14, 0x14, 0x08}, // p 0x70 + {0x08, 0x14, 0x14, 0x18, 0x7C}, // q 0x71 + {0x7C, 0x08, 0x04, 0x04, 0x08}, // r 0x72 + {0x48, 0x54, 0x54, 0x54, 0x20}, // s 0x73 + {0x04, 0x3F, 0x44, 0x40, 0x20}, // t 0x74 + {0x3C, 0x40, 0x40, 0x20, 0x7C}, // u 0x75 + {0x1C, 0x20, 0x40, 0x20, 0x1C}, // v 0x76 + {0x3C, 0x40, 0x30, 0x40, 0x3C}, // w 0x77 + {0x44, 0x28, 0x10, 0x28, 0x44}, // x 0x78 + {0x0C, 0x50, 0x50, 0x50, 0x3C}, // y 0x79 + {0x44, 0x64, 0x54, 0x4C, 0x44}, // z 0x7A + {0x00, 0x08, 0x36, 0x41, 0x00}, // { 0x7B + {0x00, 0x00, 0x7F, 0x00, 0x00}, // | 0x7C + {0x00, 0x41, 0x36, 0x08, 0x00}, // } 0x7D + {0x08, 0x08, 0x2A, 0x1C, 0x08}, // -> 0x7E + {0x08, 0x1C, 0x2A, 0x08, 0x08} // <- 0x7F +}; +//-------------------------------------------------------------------------------------------------------------------------------------------- +machine_config_constructor esq2x16_sq1_t::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( esq2x16 ); +} +//-------------------------------------------------------------------------------------------------------------------------------------------- +void esq2x16_sq1_t::write_char(int data) +{ + int DisplayCode = data; + int LedState; + + // Non-ASCII codes that needs to be treated as ASCII characters + if ( + data == 0x08 || + data == 0x09 || + data == 0x0A || + data == 0x0B || + data == 0x0C + ) data = '^'; // musical notes + + // Resolve here 2-Bytes commands: the command was saved previously + switch (m_LcdCommand) { + case 0: + // No current command. + break; + + case 0x87: + // Go To + #ifdef VERBOSE + printf("LCD %02X: Go To %02X - pos=%02X (%d)\n", m_LcdCommand, DisplayCode, m_lcdPos, m_lcdPage); + #endif + m_lcdPos = DisplayCode; + m_LcdCommand = 0; + return; + break; + + case 0x88: + // Save Cursor position - What the second byte (00 or 01) means? + #ifdef VERBOSE + printf("LCD %02X: Save Pos. (%02X) - pos=%02X (%d)\n", m_LcdCommand, DisplayCode, m_lcdPos, m_lcdPage); + #endif + m_lcdSavedPos = m_lcdPos; + m_LcdCommand = 0; + return; + break; + + case 0x89: + // Restore Cursor position - What the second byte (00 or 01) means? + #ifdef VERBOSE + printf("LCD %02X: Restore Pos. (%02X) - pos=%02X (%d)\n", m_LcdCommand, DisplayCode, m_lcdPos, m_lcdPage); + #endif + m_lcdPos = m_lcdSavedPos; + m_LcdCommand = 0; + return; + break; + + case 0x8D: + case 0x8E: + case 0x8F: + // LED OFF, ON, BLINK + LedState = m_LcdCommand & 0x03; + if ( + DisplayCode >= 16 || // Out of bounds + DisplayCode == 6 || // non-existent + DisplayCode == 7 || // non-existent + DisplayCode == 14 || // non-existent + DisplayCode == 15 // non-existent + ) + { + #ifdef VERBOSE + printf("LCD %02X: Led %02d does'nt exist - pos=%02X (%d)\n", m_LcdCommand, DisplayCode, m_lcdPos, m_lcdPage); + #endif + } + else + { + if (m_leds[DisplayCode] != LedState) + { + m_leds[DisplayCode] = LedState; + m_ledsDirty[DisplayCode] = 1; + } + update_display(); + } + m_LcdCommand = 0; + return; + break; + + default: + #ifdef VERBOSE + printf("LCD: Unknown 2-Bytes Command:%02X-%02X - pos=%02X (%d)\n", m_LcdCommand, DisplayCode, m_lcdPos, m_lcdPage); + #endif + m_LcdCommand = 0; + return; + break; + } + + if ((data >= 0x20) && (data <= 0x7f)) + { + #ifdef VERBOSE + printf("LCD %02X: \"%c\" - pos=%02X (%d)\n", DisplayCode, data, m_lcdPos, m_lcdPage); + #endif + m_lcdpg[m_lcdPage][m_lcdPos++] = DisplayCode; + if (m_lcdPos > 31) m_lcdPos = 31; + + update_display(); + return; + } + + if (DisplayCode >= 0x80) + { + switch (DisplayCode) { + // Known 2-bytes command + case 0x87: // Go To + case 0x88: // Save Cursor Position + case 0x89: // Restore Cursor Position + // Save the command for the next byte + m_LcdCommand = DisplayCode; + return; + break; + + // Unknown 2-bytes command + case 0x85: + case 0x86: + case 0x95: + // ??? - related to blinking chars? - 2 bytes command + m_LcdCommand = DisplayCode; + return; + break; + + case 0x8D: + case 0x8E: + case 0x8F: + // LEDs OFF,ON and BLINK - 2 bytes command + m_LcdCommand = DisplayCode; + return; + break; + + // "Page" selectors (?) + case 0x90: // Blink + case 0x91: // ?? + case 0x92: // Normal + m_lcdPage = DisplayCode & 0x03; + #ifdef VERBOSE + printf("LCD %02X: Page Change ? - pos=%02X (%d)\n", DisplayCode, m_lcdPos, m_lcdPage); + #endif + m_LcdCommand = 0; + return; + break; + + case 0x8C: + #ifdef VERBOSE + printf("LCD %02X: Lcd Clear - pos=%02X (%d)\n", DisplayCode, m_lcdPos, m_lcdPage); + #endif + lcd_reset(); + return; + break; + case 0x98: + #ifdef VERBOSE + printf("LCD %02X: Page Clear ? - pos=%02X (%d)\n", DisplayCode, m_lcdPos, m_lcdPage); + #endif + page_reset(); + return; + break; + + default: + #ifdef VERBOSE + printf("LCD %02X: Unknown Command - pos=%02X (%d)\n", DisplayCode, m_lcdPos, m_lcdPage); + #endif + m_LcdCommand = 0; + return; + break; + } + } + #ifdef VERBOSE + else + { + printf("LCD: Unknown LCD Code: %04X - pos=%02X (%d)\n", data, m_lcdPos, m_lcdPage); + } + #endif +} +//-------------------------------------------------------------------------------------------------------------------------------------------- +esq2x16_sq1_t::esq2x16_sq1_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : esqvfd_t(mconfig, ESQ2x16_SQ1, "Ensoniq 2x16 VFD (SQ-1 variant)", tag, owner, clock, "esq2x16_sq1", __FILE__) +{ + m_rows = 2; + m_cols = 16; +} +//-------------------------------------------------------------------------------------------------------------------------------------------- +void esq2x16_sq1_t::update_display() +{ + char lcdCharRow; + + for (int led = 0; led < 16; led++) + { + if (m_ledsDirty[led]) { + machine().output().set_indexed_value("rLed_", led, m_leds[led]); + m_ledsDirty[led] = 0; + } + } + + for (int page = 0; page < 4; page++) + { + for (int pos = 0; pos < 32; pos++) + { + // stealed from tecnbras.cpp and modified + for (int rr=0; rr<7; rr++) { + lcdCharRow = RotateLcdChar(m_lcdpg[page][pos],rr); + machine().output().set_indexed_value("pg_", (page+1)*1000 + pos*7 + rr, 0x1F & lcdCharRow); + } + } + } +} +//-------------------------------------------------------------------------------------------------------------------------------------------- +void esq2x16_sq1_t::device_reset() +{ + //lcd_reset(); + m_lcdPage = m_lcdSavedPos = m_lcdPos = m_LcdCommand = 0; + memset(m_leds, 0, sizeof(m_leds)); + memset(m_lcdpg, 1, sizeof(m_lcdpg)); // Set to 1 for debug: to see what "pages" are set to 0 from the firmware +} +//-------------------------------------------------------------------------------------------------------------------------------------------- +void esq2x16_sq1_t::lcd_reset() +{ + m_lcdPage = m_lcdSavedPos = m_lcdPos = m_LcdCommand = 0; + memset(m_leds, 0, sizeof(m_leds)); + memset(m_lcdpg, 0, sizeof(m_lcdpg)); +} +//-------------------------------------------------------------------------------------------------------------------------------------------- +void esq2x16_sq1_t::page_reset() +{ + memset(m_lcdpg[m_lcdPage], 0, 32); + m_lcdPos = m_LcdCommand = 0; +} +//-------------------------------------------------------------------------------------------------------------------------------------------- +char esq2x16_sq1_t::RotateLcdChar(UINT8 lcdChar, int charRow) +{ + char lcdCharRow = 0; + for (int cc=0; cc<5; cc++){ + lcdCharRow |= BIT(Font5x7[lcdChar][cc], charRow) ? (1 << (cc)) : 0; + } + return lcdCharRow; +} diff --git a/src/mame/machine/esqlcd.h b/src/mame/machine/esqlcd.h new file mode 100644 index 00000000000..ab33115d4a3 --- /dev/null +++ b/src/mame/machine/esqlcd.h @@ -0,0 +1,45 @@ +// license:BSD-3-Clause +// copyright-holders:R. Belmont, Parduz +#ifndef ESQLCD_H +#define ESQLCD_H + +#include "emu.h" +#include "esqvfd.h" + + +// --- SQ1 - Parduz -------------------------------------------------------------------------------------------------------------------------- + +#define MCFG_ESQ2x16_SQ1_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, ESQ2x16_SQ1, 60) + +#define MCFG_ESQ2x16_SQ1_REMOVE(_tag) \ + MCFG_DEVICE_REMOVE(_tag) + +class esq2x16_sq1_t : public esqvfd_t { +public: + esq2x16_sq1_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + virtual void write_char(int data) override; + virtual void update_display(); + virtual void device_reset() override; + + + void lcd_reset(); + void page_reset(); + char RotateLcdChar(UINT8 lcdChar, int charRow); +protected: + virtual machine_config_constructor device_mconfig_additions() const override; + UINT8 m_lcdpg[4][32]; + int m_lcdPage; + int m_lcdPos,m_lcdSavedPos; + + UINT8 m_leds[16]; + UINT8 m_ledsDirty[16]; + +private: + int m_LcdCommand; +}; + +extern const device_type ESQ2x16_SQ1; + +#endif diff --git a/src/mame/machine/esqpanel.cpp b/src/mame/machine/esqpanel.cpp index 1c4dee54248..4c084a6d5c5 100644 --- a/src/mame/machine/esqpanel.cpp +++ b/src/mame/machine/esqpanel.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:R. Belmont +// copyright-holders:R. Belmont, Parduz /* Ensoniq panel/display device */ @@ -16,7 +16,7 @@ const device_type ESQPANEL1x22 = &device_creator; const device_type ESQPANEL2x40 = &device_creator; -const device_type ESQPANEL2x40_SQ1 = &device_creator; +const device_type ESQPANEL2x16_SQ1 = &device_creator; //************************************************************************** // LIVE DEVICE @@ -234,19 +234,18 @@ esqpanel2x40_device::esqpanel2x40_device(const machine_config &mconfig, const ch m_eps_mode = false; } -/* panel with 2x16? LCD display used in the SQ and MR series, plus probably more */ - -static MACHINE_CONFIG_FRAGMENT(esqpanel2x40_sq1) - MCFG_ESQ2x40_SQ1_ADD("vfd") +// --- SQ1 - Parduz -------------------------------------------------------------------------------------------------------------------------- +static MACHINE_CONFIG_FRAGMENT(esqpanel2x16_sq1) + MCFG_ESQ2x16_SQ1_ADD("vfd") MACHINE_CONFIG_END - -machine_config_constructor esqpanel2x40_sq1_device::device_mconfig_additions() const +// --- SQ1 - Parduz -------------------------------------------------------------------------------------------------------------------------- +machine_config_constructor esqpanel2x16_sq1_device::device_mconfig_additions() const { - return MACHINE_CONFIG_NAME( esqpanel2x40_sq1 ); + return MACHINE_CONFIG_NAME( esqpanel2x16_sq1 ); } - -esqpanel2x40_sq1_device::esqpanel2x40_sq1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - esqpanel_device(mconfig, ESQPANEL2x40, "Ensoniq front panel with 2x16 LCD", tag, owner, clock, "esqpanel240_sq1", __FILE__), +// --- SQ1 - Parduz -------------------------------------------------------------------------------------------------------------------------- +esqpanel2x16_sq1_device::esqpanel2x16_sq1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + esqpanel_device(mconfig, ESQPANEL2x16_SQ1, "Ensoniq front panel with 2x16 LCD", tag, owner, clock, "esqpanel216_sq1", __FILE__), m_vfd(*this, "vfd") { m_eps_mode = false; diff --git a/src/mame/machine/esqpanel.h b/src/mame/machine/esqpanel.h index 5de704f1375..46f9f07ec03 100644 --- a/src/mame/machine/esqpanel.h +++ b/src/mame/machine/esqpanel.h @@ -7,6 +7,7 @@ #include "emu.h" #include "machine/esqvfd.h" +#include "machine/esqlcd.h" //************************************************************************** // INTERFACE CONFIGURATION MACROS @@ -30,13 +31,13 @@ #define MCFG_ESQPANEL_2x40_REMOVE(_tag) \ MCFG_DEVICE_REMOVE(_tag) -#define MCFG_ESQPANEL2x40_SQ1_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, ESQPANEL2x40_SQ1, 0) +#define MCFG_ESQPANEL2x16_SQ1_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, ESQPANEL2x16_SQ1, 0) -#define MCFG_ESQPANEL2x40_SQ1_REPLACE(_tag) \ - MCFG_DEVICE_REPLACE(_tag, ESQPANEL2x40_SQ1, 0) +#define MCFG_ESQPANEL2x16_SQ1_REPLACE(_tag) \ + MCFG_DEVICE_REPLACE(_tag, ESQPANEL2x16_SQ1, 0) -#define MCFG_ESQPANEL2x40_SQ1_REMOVE(_tag) \ +#define MCFG_ESQPANEL2x16_SQ1_REMOVE(_tag) \ MCFG_DEVICE_REMOVE(_tag) #define MCFG_ESQPANEL_TX_CALLBACK(_write) \ @@ -133,8 +134,23 @@ protected: private: }; +// --- SQ1 - Parduz -------------------------------------------------------------------------------------------------------------------------- +class esqpanel2x16_sq1_device : public esqpanel_device { +public: + esqpanel2x16_sq1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + required_device m_vfd; + + virtual void send_to_display(UINT8 data) override { m_vfd->write_char(data); } + +protected: + virtual machine_config_constructor device_mconfig_additions() const override; + +private: +}; + extern const device_type ESQPANEL1x22; extern const device_type ESQPANEL2x40; -extern const device_type ESQPANEL2x40_SQ1; +extern const device_type ESQPANEL2x16_SQ1; #endif