From 4c6c27ec0d2085b42dbe50fc8d205afd2c114b12 Mon Sep 17 00:00:00 2001 From: Sandro Ronco Date: Thu, 13 Feb 2014 22:06:40 +0000 Subject: [PATCH] (MESS) gl3000s: added LCD and keyboard emulation. [Sandro Ronco] --- .gitattributes | 2 + src/emu/video/sed1520.c | 164 ++++++++++++++++++++++++++ src/emu/video/sed1520.h | 72 ++++++++++++ src/emu/video/video.mak | 8 ++ src/mess/drivers/pc2000.c | 234 +++++++++++++++++++++++++++++++++++++- src/mess/mess.mak | 1 + 6 files changed, 475 insertions(+), 6 deletions(-) create mode 100644 src/emu/video/sed1520.c create mode 100644 src/emu/video/sed1520.h diff --git a/.gitattributes b/.gitattributes index 0010d16eb7d..af075ee717e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2678,6 +2678,8 @@ src/emu/video/saa5050.c svneol=native#text/plain src/emu/video/saa5050.h svneol=native#text/plain src/emu/video/sed1330.c svneol=native#text/plain src/emu/video/sed1330.h svneol=native#text/plain +src/emu/video/sed1520.c svneol=native#text/plain +src/emu/video/sed1520.h svneol=native#text/plain src/emu/video/stvvdp1.c svneol=native#text/plain src/emu/video/stvvdp2.c svneol=native#text/plain src/emu/video/tlc34076.c svneol=native#text/plain diff --git a/src/emu/video/sed1520.c b/src/emu/video/sed1520.c new file mode 100644 index 00000000000..ba5c68145cd --- /dev/null +++ b/src/emu/video/sed1520.c @@ -0,0 +1,164 @@ +// license:BSD-3-Clause +// copyright-holders:Sandro Ronco +/*************************************************************************** + + SED1520 LCD controller + + TODO: + - busy flag + +***************************************************************************/ + +#include "emu.h" +#include "video/sed1520.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type SED1520 = &device_creator; + + +//************************************************************************** +// live device +//************************************************************************** + +//------------------------------------------------- +// sed1520_device - constructor +//------------------------------------------------- + +sed1520_device::sed1520_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SED1520, "SED1520", tag, owner, clock, "sed1520", __FILE__), + m_screen_update_func(NULL) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void sed1520_device::device_start() +{ + // state saving + save_item(NAME(m_lcd_on)); + save_item(NAME(m_busy)); + save_item(NAME(m_page)); + save_item(NAME(m_column)); + save_item(NAME(m_old_column)); + save_item(NAME(m_start_line)); + save_item(NAME(m_adc)); + save_item(NAME(m_static_drive)); + save_item(NAME(m_modify_write)); + save_item(NAME(m_vram)); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void sed1520_device::device_reset() +{ + m_lcd_on = 0; + m_busy = 0; + m_page = 3; + m_column = 0; + m_old_column = 0; + m_start_line = 0; + m_adc = 1; + m_static_drive = 0; + m_modify_write = false; + memset(m_vram, 0x00, sizeof(m_vram)); +} + + +//************************************************************************** +// device interface +//************************************************************************** + +UINT32 sed1520_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + if (m_lcd_on) + { + if (m_screen_update_func) + m_screen_update_func(*this, bitmap, cliprect, m_vram, m_start_line, m_adc); + } + else if (m_static_drive) + return UPDATE_HAS_NOT_CHANGED; + else + bitmap.fill(0, cliprect); + + return 0; +} + +READ8_MEMBER(sed1520_device::read) +{ + if (offset & 0x01) + return data_read(space, 0); + else + return status_read(space, 0); +} + +WRITE8_MEMBER(sed1520_device::write) +{ + if (offset & 0x01) + data_write(space, 0, data); + else + control_write(space, 0, data); +} + +WRITE8_MEMBER(sed1520_device::control_write) +{ + if((data & 0xfe) == 0xae) // display on/off + m_lcd_on = data & 0x01; + else if((data & 0xe0) == 0xc0) // set start line + m_start_line = data & 0x1f; + else if((data & 0xfc) == 0xb8) // set page address + m_page = data & 0x03; + else if((data & 0x80) == 0x00) // set column address + m_column = data % 80; + else if((data & 0xfe) == 0xa0) // select ADC + m_adc = data & 0x01; + else if((data & 0xfe) == 0xa4) // static drive on/off + m_static_drive = data & 0x01; + else if((data & 0xfe) == 0xa8) // select duty + ; + else if(data == 0xe0) // read-modify-write on + { + m_modify_write = true; + m_old_column = m_column; + } + else if(data == 0xee) // read-modify-write off + { + m_modify_write = false; + m_column = m_old_column; + } + else if(data == 0xe2) // reset + { + m_start_line = m_column = 0; + m_page = 3; + } + else + logerror("%s: invalid SED1520 command: %x\n", tag(), data); +} + +READ8_MEMBER(sed1520_device::status_read) +{ + UINT8 data = (m_busy << 7) | (m_adc << 6) | (m_lcd_on << 5); + return data; +} + +WRITE8_MEMBER(sed1520_device::data_write) +{ + m_vram[(m_page * 80 + m_column) % sizeof(m_vram)] = data; + m_column = (m_column + 1) % 80; +} + +READ8_MEMBER(sed1520_device::data_read) +{ + UINT8 data = m_vram[(m_page * 80 + m_column) % sizeof(m_vram)]; + if (!m_modify_write) + m_column = (m_column + 1) % 80; + return data; +} diff --git a/src/emu/video/sed1520.h b/src/emu/video/sed1520.h new file mode 100644 index 00000000000..ebcc640314e --- /dev/null +++ b/src/emu/video/sed1520.h @@ -0,0 +1,72 @@ +// license:BSD-3-Clause +// copyright-holders:Sandro Ronco +/*************************************************************************** + + SED1520 LCD controller + +***************************************************************************/ + +#pragma once + +#ifndef __SED1520_H__ +#define __SED1520_H__ + + +#define MCFG_SED1520_ADD( _tag, _cb ) \ + MCFG_DEVICE_ADD( _tag, SED1520, 0 ) \ + sed1520_device::static_set_screen_update_cb(*device, _cb); + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +typedef UINT32 (*sed1520_screen_update_func)(device_t &device, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 *vram, int start_line, int adc); +#define SED1520_UPDATE_CB(name) UINT32 name(device_t &device, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 *vram, int start_line, int adc) + + +// ======================> sed1520_device + +class sed1520_device : public device_t +{ +public: + // construction/destruction + sed1520_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // static configuration helpers + static void static_set_screen_update_cb(device_t &device, sed1520_screen_update_func _cb) { downcast(device).m_screen_update_func = _cb; } + + // device interface + virtual DECLARE_WRITE8_MEMBER(write); + virtual DECLARE_READ8_MEMBER(read); + virtual DECLARE_WRITE8_MEMBER(control_write); + virtual DECLARE_READ8_MEMBER(status_read); + virtual DECLARE_WRITE8_MEMBER(data_write); + virtual DECLARE_READ8_MEMBER(data_read); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + +private: + // internal state + UINT8 m_lcd_on; + UINT8 m_busy; + UINT8 m_page; + UINT8 m_column; + UINT8 m_old_column; + UINT8 m_start_line; + UINT8 m_adc; + UINT8 m_static_drive; + bool m_modify_write; + sed1520_screen_update_func m_screen_update_func; + + UINT8 m_vram[0x140]; +}; + + +// device type definition +extern const device_type SED1520; + +#endif diff --git a/src/emu/video/video.mak b/src/emu/video/video.mak index 9997391a551..cf95ea7b813 100644 --- a/src/emu/video/video.mak +++ b/src/emu/video/video.mak @@ -399,6 +399,14 @@ ifneq ($(filter SED1330,$(VIDEOS)),) VIDEOOBJS+= $(VIDEOOBJ)/sed1330.o endif +#------------------------------------------------- +# +#@src/emu/video/sed1520.h,VIDEOS += SED1520 +#------------------------------------------------- +ifneq ($(filter SED1520,$(VIDEOS)),) +VIDEOOBJS+= $(VIDEOOBJ)/sed1520.o +endif + #------------------------------------------------- # #@src/emu/video/stvvdp1.h,VIDEOS += STVVDP diff --git a/src/mess/drivers/pc2000.c b/src/mess/drivers/pc2000.c index 6b47308bce6..a6c7c233702 100644 --- a/src/mess/drivers/pc2000.c +++ b/src/mess/drivers/pc2000.c @@ -17,6 +17,7 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "video/hd44780.h" +#include "video/sed1520.h" #include "sound/beep.h" #include "imagedev/cartslot.h" #include "rendlay.h" @@ -35,7 +36,7 @@ public: { } required_device m_maincpu; - required_device m_lcdc; + optional_device m_lcdc; required_device m_beep; required_memory_bank m_bank1; optional_memory_bank m_bank2; @@ -56,6 +57,21 @@ public: virtual void palette_init(); }; +class gl3000s_state : public pc2000_state +{ +public: + gl3000s_state(const machine_config &mconfig, device_type type, const char *tag) + : pc2000_state(mconfig, type, tag), + m_lcdc_r(*this, "sed1520_r"), + m_lcdc_l(*this, "sed1520_l") + { } + + required_device m_lcdc_r; + required_device m_lcdc_l; + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); +}; + class pc1000_state : public pc2000_state { public: @@ -106,13 +122,9 @@ WRITE8_MEMBER( pc2000_state::rombank1_w ) WRITE8_MEMBER( pc2000_state::rombank2_w ) { if (data & 0x80) - { m_bank2->set_entry(data & 0x8f); //cartridge - } else - { m_bank2->set_entry(data & 0x0f); - } } READ8_MEMBER( pc2000_state::beep_r ) @@ -144,6 +156,58 @@ static ADDRESS_MAP_START( pc2000_io , AS_IO, 8, pc2000_state) AM_RANGE(0x12, 0x12) AM_READWRITE(beep_r, beep_w) ADDRESS_MAP_END + +UINT32 gl3000s_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + m_lcdc_l->screen_update(screen, bitmap, cliprect); + m_lcdc_r->screen_update(screen, bitmap, cliprect); + return 0; +} + +int gl3000s_sed1520_screen_update(device_t &device, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 *vram, int start_line, int adc, int start_x) +{ + for (int y=0; y<2; y++) + { + int row_pos = 0; + for (int x=0; x<61; x++) + { + int addr = (y + (start_line >> 3)) * 80 + row_pos; + for (int yi=0; yi<8; yi++) + { + int px = start_x - (adc ? (80 - x) : x); + int py = y*8 + yi; + + if (cliprect.contains(px, py)) + bitmap.pix16(py, px) = (vram[addr % 0x140] >> yi) & 1; + } + + row_pos++; + } + } + return 0; +} + +SED1520_UPDATE_CB(gl3000s_screen_update_right) +{ + return gl3000s_sed1520_screen_update(device, bitmap, cliprect, vram, start_line, adc, 119); +} + +SED1520_UPDATE_CB(gl3000s_screen_update_left) +{ + return gl3000s_sed1520_screen_update(device, bitmap, cliprect, vram, start_line, adc, 58); +} + + +static ADDRESS_MAP_START( gl3000s_io , AS_IO, 8, gl3000s_state) + ADDRESS_MAP_UNMAP_HIGH + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x01, 0x01) AM_WRITE(rombank1_w) + AM_RANGE(0x03, 0x03) AM_WRITE(rombank2_w) + AM_RANGE(0x08, 0x09) AM_DEVREADWRITE("sed1520_r", sed1520_device, read, write) + AM_RANGE(0x0a, 0x0b) AM_DEVREADWRITE("sed1520_l", sed1520_device, read, write) + AM_RANGE(0x10, 0x11) AM_READWRITE(key_matrix_r, key_matrix_w) +ADDRESS_MAP_END + READ8_MEMBER( pc1000_state::kb_r ) { static const char *const bitnames[9] = @@ -458,6 +522,145 @@ static INPUT_PORTS_START( pc1000 ) PORT_BIT(0xfc, IP_ACTIVE_LOW, IPT_UNUSED) INPUT_PORTS_END +static INPUT_PORTS_START( gl3000s ) + PORT_START("IN0") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Einstellen Antwort") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) + + PORT_START("IN1") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Hilfe") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + + PORT_START("IN2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Druck Symbol") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') + + PORT_START("IN3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("\xc3\x84") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) + + PORT_START("IN4") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_INSERT) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + + PORT_START("IN5") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("\xc3\x9f") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("\xc3\x96") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') + + PORT_START("IN6") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("\xc3\x9c") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('+') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') + + PORT_START("IN7") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + + PORT_START("IN8") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Off") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BASIC") PORT_CODE(KEYCODE_DEL_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Logische Folgen") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bruch / Dezimalrechnen") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Addition") + PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("IN9") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Textverarbeitung") PORT_CODE(KEYCODE_ENTER_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Buchstabenschl" "\xc3\xbc" "ssel") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bruch / Prozentrechnen") PORT_CODE(KEYCODE_DEL) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Subtraktion") PORT_CODE(KEYCODE_HOME) + PORT_BIT(0xe1, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("INA") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Taschenrechner") PORT_CODE(KEYCODE_ASTERISK) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gleitpfeile") PORT_CODE(KEYCODE_MINUS_PAD) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Algebra") PORT_CODE(KEYCODE_SLASH_PAD) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Multiplikation") PORT_CODE(KEYCODE_9_PAD) + PORT_BIT(0xe1, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("INB") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ZusatzKassette") PORT_CODE(KEYCODE_8_PAD) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Stufe") PORT_CODE(KEYCODE_7_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Spieler") PORT_CODE(KEYCODE_6_PAD) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Zeichensuche") PORT_CODE(KEYCODE_5_PAD) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Division") PORT_CODE(KEYCODE_4_PAD) + PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("INC") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Pr" "\xc3\xa4" "teritum") PORT_CODE(KEYCODE_3_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Synonyme") PORT_CODE(KEYCODE_2_PAD) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tipp Dich Fit") PORT_CODE(KEYCODE_1_PAD) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Super Schlau-Quiz") PORT_CODE(KEYCODE_0_PAD) + PORT_BIT(0xe1, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("IND") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Silbentrennung") PORT_CODE(KEYCODE_F12) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Knifflige Grammatik") PORT_CODE(KEYCODE_F11) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Textaufgaben") PORT_CODE(KEYCODE_F10) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Geographie-Quiz") PORT_CODE(KEYCODE_F9) + PORT_BIT(0xe1, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("INE") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Wortr" "\xc3\xa4" "tsel") PORT_CODE(KEYCODE_F8) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Verdrehte S" "\xc3\xa4" "tze") PORT_CODE(KEYCODE_F7) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Blitz-S" "\xc3\xa4" "tze") PORT_CODE(KEYCODE_F6) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Geschichte-Quiz") PORT_CODE(KEYCODE_F5) + PORT_BIT(0xe1, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("INF") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Verr" "\xc3\xbc" "ckte R" "\xc3\xa4" "tsel") PORT_CODE(KEYCODE_F4) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Wortarten") PORT_CODE(KEYCODE_F3) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Wortschlange") PORT_CODE(KEYCODE_F2) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Naturwissenschaften-Quiz") PORT_CODE(KEYCODE_F1) + PORT_BIT(0xe1, IP_ACTIVE_LOW, IPT_UNUSED) +INPUT_PORTS_END DEVICE_IMAGE_LOAD_MEMBER(pc2000_state, cart_load) { @@ -536,6 +739,9 @@ static GFXDECODE_START( pc2000 ) GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, hd44780_charlayout, 0, 1 ) GFXDECODE_END +static GFXDECODE_START( gl3000s ) +GFXDECODE_END + static MACHINE_CONFIG_START( pc2000, pc2000_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu",Z80, XTAL_4MHz) /* probably not accurate */ @@ -591,6 +797,22 @@ static HD44780_PIXEL_UPDATE(gl4000_pixel_update) } } +static MACHINE_CONFIG_DERIVED_CLASS( gl3000s, pc2000, gl3000s_state ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_IO_MAP(gl3000s_io) + + MCFG_DEVICE_REMOVE("hd44780") + MCFG_SED1520_ADD("sed1520_l", gl3000s_screen_update_left) // left panel is 59 pixels (0-58) + MCFG_SED1520_ADD("sed1520_r", gl3000s_screen_update_right) // right panel is 61 pixels (59-119) + + MCFG_SCREEN_MODIFY("screen") + MCFG_SCREEN_SIZE(120, 16) + MCFG_SCREEN_VISIBLE_AREA(0, 120-1, 0, 16-1) + MCFG_SCREEN_UPDATE_DRIVER( gl3000s_state, screen_update ) + + MCFG_GFXDECODE(gl3000s) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( gl4000, pc2000 ) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_SIZE(120, 36) // 4x20 chars @@ -713,7 +935,7 @@ COMP( 1988, misterx, 0, 0, misterx, pc1000, driver_device, 0, "V COMP( 1993, pc2000, 0, 0, pc2000, pc2000, driver_device, 0, "Video Technology", "PreComputer 2000", GAME_NOT_WORKING) COMP( 1993, gl2000, 0, 0, gl2000, pc2000, driver_device, 0, "Video Technology", "Genius Leader 2000", GAME_NOT_WORKING) COMP( 1995, gl2000p, gl2000, 0, gl2000, pc2000, driver_device, 0, "Video Technology", "Genius Leader 2000 Plus", GAME_NOT_WORKING) -COMP( 1996, gl3000s, 0, 0, pc2000, pc2000, driver_device, 0, "Video Technology", "Genius Leader 3000S (Germany)", GAME_IS_SKELETON) +COMP( 1996, gl3000s, 0, 0, gl3000s, gl3000s,driver_device, 0, "Video Technology", "Genius Leader 3000S (Germany)", GAME_NOT_WORKING) COMP( 1994, gl4000, 0, 0, gl4000, pc2000, driver_device, 0, "Video Technology", "Genius Leader 4000 Quadro (Germany)", GAME_NOT_WORKING) COMP( 1996, gl4004, 0, 0, gl4000, pc2000, driver_device, 0, "Video Technology", "Genius Leader 4004 Quadro L (Germany)", GAME_NOT_WORKING) COMP( 1997, gl5000, 0, 0, pc2000, pc2000, driver_device, 0, "Video Technology", "Genius Leader 5000 (Germany)", GAME_IS_SKELETON) diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 878788c85da..905ee065b77 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -296,6 +296,7 @@ VIDEOS += RAMDAC VIDEOS += S2636 VIDEOS += SAA5050 VIDEOS += SED1330 +VIDEOS += SED1520 VIDEOS += STVVDP #VIDEOS += TLC34076 #VIDEOS += TMS34061