From 1b6a762bd3c4d4adf547d133320a9bc51784f38c Mon Sep 17 00:00:00 2001 From: Sandro Ronco Date: Mon, 28 Jan 2013 18:37:28 +0000 Subject: [PATCH] (MESS) Added KC0066 charset and replace hd44780/Psion charset. (nw) --- src/mess/drivers/alphasma.c | 4 +-- src/mess/drivers/psion.c | 12 +++++++ src/mess/video/hd44780.c | 63 ++++++++++++++++++++++++------------- src/mess/video/hd44780.h | 32 +++++++++++++++++++ 4 files changed, 87 insertions(+), 24 deletions(-) diff --git a/src/mess/drivers/alphasma.c b/src/mess/drivers/alphasma.c index fa4dbab44b7..3e87dd4f6e1 100644 --- a/src/mess/drivers/alphasma.c +++ b/src/mess/drivers/alphasma.c @@ -382,9 +382,9 @@ static MACHINE_CONFIG_START( alphasmart, alphasmart_state ) MCFG_CPU_IO_MAP(alphasmart_io) MCFG_CPU_CONFIG(alphasmart_hc11_config) - MCFG_HD44780_ADD("ks0066_0") + MCFG_KS0066_F05_ADD("ks0066_0") MCFG_HD44780_LCD_SIZE(2, 40) - MCFG_HD44780_ADD("ks0066_1") + MCFG_KS0066_F05_ADD("ks0066_1") MCFG_HD44780_LCD_SIZE(2, 40) /* video hardware */ diff --git a/src/mess/drivers/psion.c b/src/mess/drivers/psion.c index b0005995afa..b93900265a7 100644 --- a/src/mess/drivers/psion.c +++ b/src/mess/drivers/psion.c @@ -579,24 +579,36 @@ ROM_START( psionlz64 ) ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) ROM_SYSTEM_BIOS(0, "v44", "LZ64 v4.4") ROMX_LOAD( "44-lz64.dat", 0x8000, 0x10000, CRC(aa487913) SHA1(5a44390f63fc8c1bc94299ab2eb291bc3a5b989a), ROM_BIOS(1)) + + ROM_REGION( 0x1000, "hd44780", 0 ) + ROM_LOAD( "psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) ROM_END ROM_START( psionlz64s ) ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) ROM_SYSTEM_BIOS(0, "v46", "LZ64 v4.6") ROMX_LOAD( "46-lz64s.dat", 0x8000, 0x10000, CRC(328d9772) SHA1(7f9e2d591d59ecfb0822d7067c2fe59542ea16dd), ROM_BIOS(1)) + + ROM_REGION( 0x1000, "hd44780", 0 ) + ROM_LOAD( "psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) ROM_END ROM_START( psionlz ) ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) ROM_SYSTEM_BIOS(0, "v46", "LZ v4.6") ROMX_LOAD( "46-lz.dat", 0x8000, 0x10000, CRC(22715f48) SHA1(cf460c81cadb53eddb7afd8dadecbe8c38ea3fc2), ROM_BIOS(1)) + + ROM_REGION( 0x1000, "hd44780", 0 ) + ROM_LOAD( "psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) ROM_END ROM_START( psionp464 ) ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) ROM_SYSTEM_BIOS(0, "v46", "POS464 v4.6") ROMX_LOAD( "46-p464.dat", 0x8000, 0x10000, CRC(672a0945) SHA1(d2a6e3fe1019d1bd7ae4725e33a0b9973f8cd7d8), ROM_BIOS(1)) + + ROM_REGION( 0x1000, "hd44780", 0 ) + ROM_LOAD( "psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) ROM_END /* Driver */ diff --git a/src/mess/video/hd44780.c b/src/mess/video/hd44780.c index 77736838429..8115576028b 100644 --- a/src/mess/video/hd44780.c +++ b/src/mess/video/hd44780.c @@ -17,17 +17,22 @@ //************************************************************************** const device_type HD44780 = &device_creator; +const device_type KS0066_F05 = &device_creator; //------------------------------------------------- // ROM( hd44780 ) //------------------------------------------------- -ROM_START( hd44780 ) - ROM_REGION( 0x0860, "cgrom", 0 ) - ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d)) +ROM_START( hd44780_a00 ) + ROM_REGION( 0x1000, "cgrom", 0 ) + ROM_LOAD( "hd44780_a00.bin", 0x0000, 0x1000, BAD_DUMP CRC(01d108e2) SHA1(bc0cdf0c9ba895f22e183c7bd35a3f655f2ca96f)) // from page 17 of the HD44780 datasheet ROM_END +ROM_START( ks0066_f05 ) + ROM_REGION( 0x1000, "cgrom", 0 ) + ROM_LOAD( "ks0066_f05.bin", 0x0000, 0x1000, BAD_DUMP CRC(af9e7bd6) SHA1(0196e871584ee5d370856e7307c0f9d1466e3e51)) // from page 51 of the KS0066 datasheet +ROM_END //************************************************************************** // live device @@ -38,26 +43,40 @@ ROM_END //------------------------------------------------- hd44780_device::hd44780_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - device_t(mconfig, HD44780, "HD44780", tag, owner, clock), + device_t(mconfig, HD44780, "HD44780 A00", tag, owner, clock), m_pixel_update_func(NULL) { - m_shortname = "hd44780"; + m_shortname = "hd44780_a00"; + set_charset_type(CHARSET_HD44780_A00); } hd44780_device::hd44780_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_pixel_update_func(NULL) { - m_shortname = "hd44780"; } +ks0066_f05_device::ks0066_f05_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + hd44780_device(mconfig, KS0066_F05, "KS0066 F05", tag, owner, clock) +{ + m_shortname = "ks0066_f05"; + set_charset_type(CHARSET_KS0066_F05); +} + + //------------------------------------------------- // rom_region - device-specific ROM region //------------------------------------------------- const rom_entry *hd44780_device::device_rom_region() const { - return ROM_NAME( hd44780 ); + switch (m_charset_type) + { + case CHARSET_HD44780_A00: return ROM_NAME( hd44780_a00 ); + case CHARSET_KS0066_F05: return ROM_NAME( ks0066_f05 ); + } + + return NULL; } //------------------------------------------------- @@ -149,6 +168,11 @@ void hd44780_device::device_timer(emu_timer &timer, device_timer_id id, int para // HELPERS //************************************************************************** +void hd44780_device::set_charset_type(int type) +{ + m_charset_type = type; +} + void hd44780_device::set_busy_flag(UINT16 usec) { m_busy_flag = true; @@ -194,10 +218,12 @@ inline void hd44780_device::pixel_update(bitmap_ind16 &bitmap, UINT8 line, UINT8 } else { + UINT8 line_heigh = (m_char_size == 8) ? m_char_size : m_char_size + 1; + if (m_lines <= 2) { if (pos < m_chars) - bitmap.pix16(line * (m_char_size+1) + y, pos * 6 + x) = state; + bitmap.pix16(line * (line_heigh+1) + y, pos * 6 + x) = state; } else if (m_lines <= 4) { @@ -210,7 +236,7 @@ inline void hd44780_device::pixel_update(bitmap_ind16 &bitmap, UINT8 line, UINT8 } if (line < m_lines) - bitmap.pix16(line * (m_char_size+1) + y, pos * 6 + x) = state; + bitmap.pix16(line * (line_heigh+1) + y, pos * 6 + x) = state; } } else @@ -256,15 +282,12 @@ UINT32 hd44780_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap if (m_char_size == 8) char_base = (m_ddram[char_pos] & 0x07) * 8; else - char_base = (m_ddram[char_pos] & 0x03) * 16; + char_base = ((m_ddram[char_pos]>>1) & 0x03) * 16; } else { // draw CGROM characters - if (m_ddram[char_pos] < 0xe0) - char_base = m_ddram[char_pos] * 8; - else - char_base = 0x700 + ((m_ddram[char_pos] - 0xe0) * 11); + char_base = m_ddram[char_pos] * 0x10; } for (int y=0; y= 0xe0 || y < 8) - pixel_update(bitmap, line, pos, y, x, BIT(charset[char_base + y], 4 - x)); - else - pixel_update(bitmap, line, pos, y, x, 0); - } + pixel_update(bitmap, line, pos, y, x, BIT(charset[char_base + y], 4 - x)); } // if is the correct position draw cursor and blink if (char_pos == m_ac) { // draw the cursor + UINT8 cursor_pos = (m_char_size == 8) ? m_char_size : m_char_size + 1; if (m_cursor_on) for (int x=0; x<5; x++) - pixel_update(bitmap, line, pos, m_char_size - 1, x, 1); + pixel_update(bitmap, line, pos, cursor_pos - 1, x, 1); if (!m_blink && m_blink_on) - for (int y=0; y<(m_char_size - 1); y++) + for (int y=0; y<(cursor_pos - 1); y++) for (int x=0; x<5; x++) pixel_update(bitmap, line, pos, y, x, 1); } diff --git a/src/mess/video/hd44780.h b/src/mess/video/hd44780.h index 08013ec6c8f..5af553b2621 100644 --- a/src/mess/video/hd44780.h +++ b/src/mess/video/hd44780.h @@ -13,6 +13,9 @@ #define MCFG_HD44780_ADD( _tag ) \ MCFG_DEVICE_ADD( _tag, HD44780, 0 ) +#define MCFG_KS0066_F05_ADD( _tag ) \ + MCFG_DEVICE_ADD( _tag, KS0066_F05, 0 ) + #define MCFG_HD44780_LCD_SIZE(_lines, _chars) \ hd44780_device::static_set_lcd_size(*device, _lines, _chars); @@ -58,6 +61,24 @@ protected: // optional information overrides const rom_entry *device_rom_region() const; + // charset + enum + { + CHARSET_HD44780_A00, + CHARSET_KS0066_F05, + /* + CHARSET_HD44780_A01, + CHARSET_HD44780_A02, + CHARSET_KS0066_F00, + CHARSET_KS0066_F03, + CHARSET_KS0066_F04, + CHARSET_KS0066_F06, + CHARSET_KS0066_F59, + */ + }; + + void set_charset_type(int type); + private: // internal helper void set_busy_flag(UINT16 usec); @@ -95,11 +116,22 @@ private: bool m_blink; bool m_first_cmd; bool m_nibble; + int m_charset_type; enum { DDRAM, CGRAM }; }; +// ======================> ks0066_f05_device + +class ks0066_f05_device : public hd44780_device +{ +public: + // construction/destruction + ks0066_f05_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + // device type definition extern const device_type HD44780; +extern const device_type KS0066_F05; #endif