summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mess/machine/sed1200.c222
-rw-r--r--src/mess/machine/sed1200.h121
-rw-r--r--src/mess/mess.mak1
3 files changed, 344 insertions, 0 deletions
diff --git a/src/mess/machine/sed1200.c b/src/mess/machine/sed1200.c
index e69de29bb2d..81c14e185ff 100644
--- a/src/mess/machine/sed1200.c
+++ b/src/mess/machine/sed1200.c
@@ -0,0 +1,222 @@
+/***************************************************************************
+
+ SED1200
+
+ A LCD controller.
+
+ The D/F variants have a packaging difference (QFP80 vs. bare chip).
+
+ The A/B variants have an internal CGROM difference (jis
+ vs. european characters)
+
+****************************************************************************
+
+ Copyright Olivier Galibert
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY OLIVIER GALIBERT ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL OLIVIER GALIBERT BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "sed1200.h"
+
+const device_type SED1200D0A = &device_creator<sed1200d0a_device>;
+const device_type SED1200F0A = &device_creator<sed1200f0a_device>;
+const device_type SED1200D0B = &device_creator<sed1200d0b_device>;
+const device_type SED1200F0B = &device_creator<sed1200f0b_device>;
+
+ROM_START( sed1200x0a )
+ ROM_REGION( 0x800, "cgrom", 0 )
+ ROM_LOAD( "sed1200-a.bin", 0x000, 0x800, CRC(e8c28054) SHA1(086406eb74e9ed97b309d2a4bdedc567626e9a98))
+ROM_END
+
+ROM_START( sed1200x0b )
+ ROM_REGION( 0x800, "cgrom", 0 )
+ ROM_LOAD( "sed1200-b.bin", 0x000, 0x800, CRC(d0741f51) SHA1(c8c856f1357286a2c8c806af81724a828345357e))
+ROM_END
+
+sed1200_device::sed1200_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, type, name, tag, owner, clock)
+{
+ m_shortname = "sed1200";
+}
+
+sed1200d0a_device::sed1200d0a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ sed1200_device(mconfig, SED1200D0A, "sed1200d-0a", tag, owner, clock)
+{
+}
+
+sed1200f0a_device::sed1200f0a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ sed1200_device(mconfig, SED1200F0A, "sed1200f-0a", tag, owner, clock)
+{
+}
+
+sed1200d0b_device::sed1200d0b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ sed1200_device(mconfig, SED1200D0B, "sed1200d-0b", tag, owner, clock)
+{
+}
+
+sed1200f0b_device::sed1200f0b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ sed1200_device(mconfig, SED1200F0B, "sed1200f-0b", tag, owner, clock)
+{
+}
+
+const rom_entry *sed1200d0a_device::device_rom_region() const
+{
+ return ROM_NAME(sed1200x0a);
+}
+
+const rom_entry *sed1200f0a_device::device_rom_region() const
+{
+ return ROM_NAME(sed1200x0a);
+}
+
+const rom_entry *sed1200d0b_device::device_rom_region() const
+{
+ return ROM_NAME(sed1200x0b);
+}
+
+const rom_entry *sed1200f0b_device::device_rom_region() const
+{
+ return ROM_NAME(sed1200x0b);
+}
+
+void sed1200_device::device_start()
+{
+ memset(cgram, 0, sizeof(cgram));
+ memset(ddram, 0, sizeof(ddram));
+ if(memregion("cgrom"))
+ cgrom = memregion("cgrom")->base();
+ else
+ cgrom = NULL;
+
+ soft_reset();
+}
+
+void sed1200_device::soft_reset()
+{
+ cursor_direction = false;
+ cursor_blinking = false;
+ cursor_full = false;
+ cursor_on = false;
+ display_on = false;
+ cursor_address = 0x00;
+ cgram_address = 0x00;
+}
+
+void sed1200_device::control_w(UINT8 data)
+{
+ switch(data) {
+ case 0x04: case 0x05:
+ cursor_direction = data & 0x01;
+ break;
+ case 0x06: case 0x07:
+ cursor_step();
+ break;
+ case 0x08: case 0x09:
+ cursor_full = data & 0x01;
+ break;
+ case 0x0a: case 0x0b:
+ cursor_blinking = data & 0x01;
+ break;
+ case 0x0c: case 0x0d:
+ display_on = data & 0x01;
+ break;
+ case 0x0e: case 0x0f:
+ cursor_on = data & 0x01;
+ break;
+ case 0x10:
+ soft_reset();
+ break;
+ case 0x12: case 0x13:
+ break; // Number of lines selection
+ default:
+ if((data & 0xf0) == 0x20)
+ cgram_address = (data & 3)*8;
+ else if((data & 0xe0) == 0x40) {
+ cgram[cgram_address++] = data;
+ if(cgram_address == 4*8)
+ cgram_address = 0;
+ } else if(data & 0x80) {
+ cursor_address = data & 0x40 ? 10 : 0;
+ cursor_address += (data & 0x3f) >= 10 ? 9 : data & 0x3f;
+ }
+ break;
+ }
+}
+
+UINT8 sed1200_device::control_r()
+{
+ return 0x00;
+}
+
+void sed1200_device::data_w(UINT8 data)
+{
+ ddram[cursor_address] = data;
+ cursor_step();
+}
+
+void sed1200_device::cursor_step()
+{
+ if(cursor_direction) {
+ if(cursor_address == 0 || cursor_address == 10)
+ cursor_address += 9;
+ else
+ cursor_address --;
+ } else {
+ if(cursor_address == 9 || cursor_address == 19)
+ cursor_address -= 9;
+ else
+ cursor_address ++;
+ }
+}
+
+const UINT8 *sed1200_device::render()
+{
+ memset(render_buf, 0, 20*8);
+ if(!display_on)
+ return render_buf;
+
+ for(int i=0; i<20; i++) {
+ UINT8 c = ddram[i];
+ if(c < 4)
+ memcpy(render_buf + 8*i, cgram + 8*c, 8);
+ else if(cgrom)
+ memcpy(render_buf + 8*i, cgrom + 8*c, 8);
+ }
+
+ if(cursor_on && (!cursor_blinking || (machine().time().as_ticks(2) & 1))) {
+ if(cursor_full)
+ for(int i=0; i<8; i++)
+ render_buf[cursor_address*8+i] ^= 0x1f;
+ else
+ render_buf[cursor_address*8+7] ^= 0x1f;
+ }
+
+ return render_buf;
+}
diff --git a/src/mess/machine/sed1200.h b/src/mess/machine/sed1200.h
index e69de29bb2d..cc5852f3865 100644
--- a/src/mess/machine/sed1200.h
+++ b/src/mess/machine/sed1200.h
@@ -0,0 +1,121 @@
+/***************************************************************************
+
+ SED1200
+
+ A LCD controller.
+
+ The D/F variants are a packaging difference (QFP80 vs. bare chip).
+ The A/B variants are an internal CGROM difference (jis
+ vs. european characters)
+
+****************************************************************************
+
+ Copyright Olivier Galibert
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY OLIVIER GALIBERT ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL OLIVIER GALIBERT BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************/
+
+#ifndef __SED1200_H__
+#define __SED1200_H__
+
+#define MCFG_SED1200D0A_ADD( _tag ) \
+ MCFG_DEVICE_ADD( _tag, SED1200D0A, 0 )
+
+#define MCFG_SED1200F0A_ADD( _tag ) \
+ MCFG_DEVICE_ADD( _tag, SED1200F0A, 0 )
+
+#define MCFG_SED1200D0B_ADD( _tag ) \
+ MCFG_DEVICE_ADD( _tag, SED1200D0B, 0 )
+
+#define MCFG_SED1200F0B_ADD( _tag ) \
+ MCFG_DEVICE_ADD( _tag, SED1200F0B, 0 )
+
+class sed1200_device : public device_t {
+public:
+ sed1200_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
+
+ void control_w(UINT8 data);
+ UINT8 control_r();
+ void data_w(UINT8 data);
+
+ const UINT8 *render();
+
+protected:
+ virtual void device_start();
+
+private:
+ UINT8 cgram[4*8];
+ UINT8 ddram[10*2];
+ UINT8 render_buf[20*8];
+ bool cursor_direction, cursor_blinking, cursor_full, cursor_on, display_on;
+ UINT8 cursor_address, cgram_address;
+ const UINT8 *cgrom;
+
+ void soft_reset();
+ void cursor_step();
+};
+
+class sed1200d0a_device : public sed1200_device {
+public:
+ sed1200d0a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+ virtual const rom_entry *device_rom_region() const;
+};
+
+class sed1200f0a_device : public sed1200_device {
+public:
+ sed1200f0a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+ virtual const rom_entry *device_rom_region() const;
+};
+
+class sed1200d0b_device : public sed1200_device {
+public:
+ sed1200d0b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+ virtual const rom_entry *device_rom_region() const;
+};
+
+class sed1200f0b_device : public sed1200_device {
+public:
+ sed1200f0b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+ virtual const rom_entry *device_rom_region() const;
+};
+
+extern const device_type SED1200D0A;
+extern const device_type SED1200F0A;
+extern const device_type SED1200D0B;
+extern const device_type SED1200F0B;
+
+#endif
diff --git a/src/mess/mess.mak b/src/mess/mess.mak
index 71e796133c7..5788a4f5c44 100644
--- a/src/mess/mess.mak
+++ b/src/mess/mess.mak
@@ -527,6 +527,7 @@ $(MESSOBJ)/shared.a: \
$(MESS_MACHINE)/mpc105.o \
$(MESS_MACHINE)/mos6530.o \
$(MESS_MACHINE)/s100.o \
+ $(MESS_MACHINE)/sed1200.o \
$(MESS_MACHINE)/serial.o \
$(MESS_MACHINE)/ncr5380.o \
$(MESS_MACHINE)/ncr5390.o \