summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/mulcd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/mulcd.cpp')
-rw-r--r--src/mame/machine/mulcd.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/mame/machine/mulcd.cpp b/src/mame/machine/mulcd.cpp
new file mode 100644
index 00000000000..597d381a7a7
--- /dev/null
+++ b/src/mame/machine/mulcd.cpp
@@ -0,0 +1,99 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont, Olivier Galibert
+
+// HD44780/LCD image combo used in the yamaha mus, vl70m, fs1r and
+// probably others
+
+#include "emu.h"
+#include "mulcd.h"
+
+#include "../machine/mulcd.hxx"
+
+DEFINE_DEVICE_TYPE(MULCD, mulcd_device, "mulcd", "Yamaha MU/VL70/FS1R common LCD")
+
+ROM_START( mulcd )
+ ROM_REGION( 0x1000, "hd44780", 0)
+ // Hand made, 3 characters unused
+ ROM_LOAD( "mu100-font.bin", 0x0000, 0x1000, BAD_DUMP CRC(a7d6c1d6) SHA1(9f0398d678bdf607cb34d83ee535f3b7fcc97c41) )
+ROM_END
+
+const tiny_rom_entry *mulcd_device::device_rom_region() const
+{
+ return ROM_NAME(mulcd);
+}
+
+mulcd_device::mulcd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, MULCD, tag, owner, clock),
+ m_lcd(*this, "hd44780")
+{
+}
+
+void mulcd_device::device_start()
+{
+}
+
+void mulcd_device::device_reset()
+{
+ m_contrast = 1.0;
+ m_leds = 0;
+}
+
+float mulcd_device::lightlevel(const u8 *src, const u8 *render)
+{
+ u8 l = *src;
+ if(l == 0)
+ return 1.0;
+ int slot = (src[1] << 8) | src[2];
+ if(slot >= 0xff00)
+ return (255-l)/255.0;
+
+ int bit = slot & 7;
+ int adr = (slot >> 3);
+ if(render[adr] & (1 << bit))
+ return 1-(1-(255-l)/255.0f)*m_contrast;
+ return 0.95f;
+}
+
+u32 mulcd_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ const u8 *render = m_lcd->render();
+ const u8 *src = mulcd_bkg + 15;
+
+ for(int y=0; y<241; y++) {
+ u32 *pix = reinterpret_cast<u32 *>(bitmap.raw_pixptr(y));
+ for(int x=0; x<800; x++) {
+ float light = lightlevel(src, render);
+ u32 col = (int(0xef*light) << 16) | (int(0xf5*light) << 8);
+ *pix++ = col;
+ src += 3;
+ }
+ for(int x=800; x<900; x++)
+ *pix++ = 0;
+ }
+
+ for(int i=0; i<6; i++)
+ if(m_leds & (1 << i)) {
+ int x = 830 + 40*(i & 1);
+ int y = 55 + 65*(i >> 1);
+ for(int yy=-9; yy <= 9; yy++) {
+ int dx = int(sqrt((float)(99-yy*yy)));
+ u32 *pix = reinterpret_cast<u32 *>(bitmap.raw_pixptr(y+yy)) + (x-dx);
+ for(int xx=0; xx<2*dx+1; xx++)
+ *pix++ = 0x00ff00;
+ }
+ }
+ return 0;
+}
+
+void mulcd_device::device_add_mconfig(machine_config &config)
+{
+ HD44780(config, m_lcd);
+ m_lcd->set_lcd_size(4, 20);
+
+ auto &screen = SCREEN(config, "screen", SCREEN_TYPE_LCD);
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate, asynchronous updating anyway */
+ screen.set_screen_update(FUNC(mulcd_device::screen_update));
+ screen.set_size(900, 241);
+ screen.set_visarea(0, 899, 0, 240);
+}