(MESS) Cleanup the HD44780 device. (nw)

This commit is contained in:
Sandro Ronco 2013-01-22 23:22:41 +00:00
parent 1e68d547c3
commit 8e40dc87e0
13 changed files with 418 additions and 642 deletions

1
.gitattributes vendored
View File

@ -7858,7 +7858,6 @@ src/mess/video/pocketc.c svneol=native#text/plain
src/mess/video/poly88.c svneol=native#text/plain
src/mess/video/pp01.c svneol=native#text/plain
src/mess/video/primo.c svneol=native#text/plain
src/mess/video/psion.c svneol=native#text/plain
src/mess/video/radio86.c svneol=native#text/plain
src/mess/video/rm380z.c svneol=native#text/plain
src/mess/video/rmnimbus.c svneol=native#text/plain

View File

@ -68,10 +68,7 @@ WRITE8_MEMBER( alesis_state::p3_w )
WRITE8_MEMBER( alesis_state::sr16_lcd_w )
{
if (m_kb_matrix & 0x80)
m_lcdc->data_write(space, offset, data);
else
m_lcdc->control_write(space, offset, data);
m_lcdc->write(space, BIT(m_kb_matrix,7), data);
}
static ADDRESS_MAP_START(hr16_mem, AS_PROGRAM, 8, alesis_state)
@ -84,8 +81,7 @@ static ADDRESS_MAP_START(hr16_io, AS_IO, 8, alesis_state)
AM_RANGE(0x0000, 0x0000) AM_READ(kb_r)
AM_RANGE(0x0002, 0x0002) AM_DEVWRITE("dm3ag", alesis_dm3ag_device, write)
AM_RANGE(0x0004, 0x0004) AM_WRITE(led_w)
AM_RANGE(0x0006, 0x0006) AM_DEVREADWRITE("hd44780", hd44780_device, control_read, control_write)
AM_RANGE(0x0007, 0x0007) AM_DEVREADWRITE("hd44780", hd44780_device, data_read, data_write)
AM_RANGE(0x0006, 0x0007) AM_DEVREADWRITE("hd44780", hd44780_device, read, write)
AM_RANGE(0x0008, 0x0008) AM_WRITE(kb_matrix_w)
AM_RANGE(MCS51_PORT_P1, MCS51_PORT_P1) AM_READ_PORT("SELECT") AM_WRITENOP
AM_RANGE(MCS51_PORT_P2, MCS51_PORT_P2) AM_WRITENOP
@ -234,30 +230,17 @@ void alesis_state::machine_reset()
memset(m_lcd_digits, 0, sizeof(m_lcd_digits));
}
static HD44780_INTERFACE( hr16_display )
{
2, // number of lines
16, // chars for line
NULL // pixel update callback
};
static HD44780_PIXEL_UPDATE(sr16_pixel_update)
{
alesis_state *driv_state = device.machine().driver_data<alesis_state>();
if (line == 1 && pos >= 6) // last 2 characters of the second line are used to control the LCD symbols
if (line == 1 && pos >= 6 && pos < 8) // last 2 characters of the second line are used to control the LCD symbols
driv_state->update_lcd_symbols(bitmap, pos, y, x, state);
else
else if (pos < 8)
bitmap.pix16(line*9 + y, pos*6 + x) = state;
}
static HD44780_INTERFACE( sr16_display )
{
2, // number of lines
8, // chars for line
sr16_pixel_update // pixel update callback
};
static const cassette_interface hr16_cassette_interface =
{
cassette_default_formats,
@ -286,7 +269,8 @@ static MACHINE_CONFIG_START( hr16, alesis_state )
MCFG_CASSETTE_ADD( CASSETTE_TAG, hr16_cassette_interface )
MCFG_HD44780_ADD("hd44780", hr16_display)
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(2, 16)
/* sound hardware */
MCFG_ALESIS_DM3AG_ADD("dm3ag", XTAL_12MHz/2)
@ -308,7 +292,9 @@ static MACHINE_CONFIG_DERIVED( sr16, hr16 )
MCFG_PALETTE_INIT(black_and_white)
MCFG_HD44780_REPLACE("hd44780", sr16_display)
MCFG_DEVICE_MODIFY("hd44780")
MCFG_HD44780_LCD_SIZE(2, 8)
MCFG_HD44780_PIXEL_UPDATE_CB(sr16_pixel_update)
MACHINE_CONFIG_END
/* ROM definition */
@ -329,9 +315,6 @@ ROM_START( hr16 )
ROM_REGION( 0x100000, "dm3ag", 0 )
ROM_LOAD( "2-27-0004.u16", 0x00000, 0x80000, CRC(8e103536) SHA1(092e1cf649fbef171cfaf91e20707d89998b7a1e))
ROM_LOAD( "2-27-0003.u15", 0x80000, 0x80000, CRC(82e9b78c) SHA1(89728cb38ae172b5e347a03018617c94a087dce0))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( hr16b )
@ -344,9 +327,6 @@ ROM_START( hr16b )
ROM_REGION( 0x100000, "dm3ag", 0 )
ROM_LOAD( "2-27-0008.u16", 0x00000, 0x80000, CRC(11ca930e) SHA1(2f57fdd02f9b2146a551370a74cab1fa800145ab))
ROM_LOAD( "2-27-0007.u15", 0x80000, 0x80000, CRC(319746db) SHA1(46b32a3ab2fbad67fb4566f607f578a2e9defd63))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( sr16 )
@ -357,9 +337,6 @@ ROM_START( sr16 )
ROM_REGION( 0x100000, "dm3ag", ROMREGION_ERASEFF )
ROM_LOAD( "sr16.u6", 0x00000, 0x80000, CRC(6da96987) SHA1(3ec8627d440bc73841e1408a19def09a8b0b77f7))
ROM_LOAD( "sr16.u5", 0x80000, 0x80000, CRC(8bb25cfa) SHA1(273ad59d017b54a7e8d5e1ec61c8cd807a0e4af3))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END

View File

@ -100,19 +100,10 @@ WRITE8_MEMBER(alphasmart_state::port_a_w)
UINT8 lcdc_data = 0;
if ((m_port_a ^ data) & 0x80)
{
if ((m_matrix[1] & 0x02))
lcdc_data |= m_lcdc0->data_read(space, 0);
else
lcdc_data |= m_lcdc0->control_read(space, 0);
}
lcdc_data |= m_lcdc0->read(space, BIT(m_matrix[1], 1));
if ((m_port_a ^ data) & 0x20)
{
if ((m_matrix[1] & 0x02))
lcdc_data |= m_lcdc1->data_read(space, 0);
else
lcdc_data |= m_lcdc1->control_read(space, 0);
}
lcdc_data |= m_lcdc1->read(space, BIT(m_matrix[1], 1));
m_port_d = (m_port_d & 0xc3) | (lcdc_data>>2);
}
@ -121,19 +112,10 @@ WRITE8_MEMBER(alphasmart_state::port_a_w)
UINT8 lcdc_data = (m_port_d<<2) & 0xf0;
if ((m_port_a ^ data) & data & 0x80)
{
if ((m_matrix[1] & 0x02))
m_lcdc0->data_write(space, 0, lcdc_data);
else
m_lcdc0->control_write(space, 0, lcdc_data);
}
m_lcdc0->write(space, BIT(m_matrix[1], 1), lcdc_data);
if ((m_port_a ^ data) & data & 0x20)
{
if ((m_matrix[1] & 0x02))
m_lcdc1->data_write(space, 0, lcdc_data);
else
m_lcdc1->control_write(space, 0, lcdc_data);
}
m_lcdc1->write(space, BIT(m_matrix[1], 1), lcdc_data);
}
m_rambank->set_entry(((data>>3) & 0x01) | ((data>>4) & 0x02));
@ -334,13 +316,6 @@ static const hc11_config alphasmart_hc11_config =
0x00 //registers are at 0-0x3f
};
static HD44780_INTERFACE( alphasmart_4line_display )
{
2, // number of lines
40, // chars for line
NULL // pixel update callback
};
static MACHINE_CONFIG_START( alphasmart, alphasmart_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", MC68HC11, XTAL_8MHz/2) // MC68HC11D0, XTAL is 8 Mhz, unknown divider
@ -348,8 +323,10 @@ static MACHINE_CONFIG_START( alphasmart, alphasmart_state )
MCFG_CPU_IO_MAP(alphasmart_io)
MCFG_CPU_CONFIG(alphasmart_hc11_config)
MCFG_HD44780_ADD("ks0066_0", alphasmart_4line_display)
MCFG_HD44780_ADD("ks0066_1", alphasmart_4line_display)
MCFG_HD44780_ADD("ks0066_0")
MCFG_HD44780_LCD_SIZE(2, 40)
MCFG_HD44780_ADD("ks0066_1")
MCFG_HD44780_LCD_SIZE(2, 40)
/* video hardware */
MCFG_SCREEN_ADD("screen", LCD)
@ -368,12 +345,6 @@ ROM_START( alphasma )
ROM_LOAD( "alphasmartpro212.rom", 0x0000, 0x8000, CRC(896ddf1c) SHA1(c3c6a421c9ced92db97431d04b4a3f09a39de716) ) // Checksum 8D24 on label
ROM_REGION( 0x20000, "mainram", ROMREGION_ERASE )
ROM_REGION( 0x0860, "ks0066_0", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_REGION( 0x0860, "ks0066_1", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END

View File

@ -203,13 +203,6 @@ void lcmate2_state::machine_start()
membank("rombank")->configure_entries(0, 0x10, (UINT8*)machine().root_device().memregion("maincpu")->base(), 0x4000);
}
static HD44780_INTERFACE( lcmate2_display )
{
2, // number of lines
20, // chars for line
NULL // pixel update callback
};
static const gfx_layout lcmate2_charlayout =
{
5, 8, /* 5 x 8 characters */
@ -222,7 +215,7 @@ static const gfx_layout lcmate2_charlayout =
};
static GFXDECODE_START( lcmate2 )
GFXDECODE_ENTRY( "hd44780", 0x0000, lcmate2_charlayout, 0, 1 )
GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, lcmate2_charlayout, 0, 1 )
GFXDECODE_END
@ -249,7 +242,8 @@ static MACHINE_CONFIG_START( lcmate2, lcmate2_state )
MCFG_DEFAULT_LAYOUT(layout_lcd)
MCFG_GFXDECODE(lcmate2)
MCFG_HD44780_ADD("hd44780", lcmate2_display)
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(2, 20)
MCFG_NVRAM_ADD_0FILL("nvram")
@ -267,9 +261,6 @@ ROM_START( lcmate2 )
ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD( "u2.bin", 0x00000, 0x08000, CRC(521931b9) SHA1(743a6e2928c4365fbf5ed9a173e2c1bfe695850f) )
ROM_LOAD( "u3.bin", 0x20000, 0x20000, CRC(84fe767a) SHA1(8dd306f203e1220f0eab1a284be3095e2642c5b6) ) // spell library
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
/* Driver */

View File

@ -128,7 +128,11 @@ class polgar_state : public mboard_state
{
public:
polgar_state(const machine_config &mconfig, device_type type, const char *tag)
: mboard_state(mconfig, type, tag) { }
: mboard_state(mconfig, type, tag),
m_lcdc(*this, "hd44780")
{ }
optional_device<hd44780_device> m_lcdc;
UINT8 led_status;
UINT8 lcd_char;
@ -203,13 +207,6 @@ public:
void common_chess_start();
};
static HD44780_INTERFACE( chess_display )
{
2, // number of lines
16, // chars for line
NULL // pixel update callback
};
static UINT8 convert_imputmask(UINT8 input)
{
input^=0xff;
@ -240,12 +237,7 @@ WRITE8_MEMBER(polgar_state::write_polgar_IO)
int i;
if (BIT(data,1)) {
hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780");
if (BIT(data,0)) {
hd44780->data_write(space, 128, lcd_char);
} else {
hd44780->control_write(space, 128, lcd_char);
}
m_lcdc->write(space, BIT(data,0), lcd_char);
}
if (BIT(data,2) || BIT(data,3)) beep_set_state(machine().device("beep"),1); else beep_set_state(machine().device("beep"),0);
@ -330,15 +322,14 @@ WRITE8_MEMBER(polgar_state::write_lcd_IO_sfortea)
if (BIT(sfortea_latch,2))
{
hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780");
if(BIT(sfortea_latch,0)) {
hd44780->data_write(space, 128, data);
m_lcdc->data_write(space, 0, data);
logerror("LCD DTA = %02x\n",data);
} else {
if (BIT(data,7)) {
if ((data & 0x7f) >= 0x40) data -= 56; // adjust for 16x1 display as 2 sets of 8
}
hd44780->control_write(space, 128, data);
m_lcdc->control_write(space, 0, data);
logerror("LCD CMD = %02x\n",data);
}
}
@ -346,13 +337,7 @@ WRITE8_MEMBER(polgar_state::write_lcd_IO_sfortea)
WRITE8_MEMBER(polgar_state::write_LCD_academy)
{
hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780");
if (offset) {
hd44780->data_write(space, 128, data);
} else {
hd44780->control_write(space, 128, data);
}
m_lcdc->write(space, offset & 1, data);
}
// AM_RANGE( 0x3a0000,0x3a0000 ) AM_READ(diablo68_write_LCD)
@ -391,17 +376,16 @@ WRITE16_MEMBER(polgar_state::diablo68_reg_select)
WRITE16_MEMBER(polgar_state::diablo68_write_LCD)
{
hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780");
data >>= 8;
if (!(diablo68_3c0000 & 0x02)) {
if (BIT(data,7)) {
if ((data & 0x7f) >= 0x40) data -= 56; // adjust for 16x1 display as 2 sets of 8
}
hd44780->control_write(space, 128, data);
m_lcdc->control_write(space, 0, data);
// logerror("Control %02x\n", data);
// printf("Control %02x\n", data);
} else {
hd44780->data_write(space, 128, data);
m_lcdc->data_write(space, 0, data);
// printf("LCDdata %04x [%c]\n", data,data);
// logerror("LCDdata %04x [%c]\n", data,data);
}
@ -890,12 +874,12 @@ static void write_IOenable(unsigned char data,address_space &space) {
if (BIT(data,0)) {
logerror("Write LCD_DATA [%02x] [%c]\n",lcd32_char,lcd32_char);
// printf("Write LCD_DATA [%02x] [%c]\n",lcd32_char,lcd32_char);
hd44780->data_write(space, 128, lcd32_char);
} else {
logerror("Write LCD_CTRL [%02x] [%c]\n",lcd32_char,lcd32_char);
// printf("Write LCD_CTRL [%02x] [%c]\n",lcd32_char,lcd32_char);
hd44780->control_write(space, 128, lcd32_char);
}
hd44780->write(space, BIT(data,0), lcd32_char);
}
logerror("Write to IOENBL data: %08x\n",data);
@ -1087,7 +1071,7 @@ static const gfx_layout chess_charlayout =
};
static GFXDECODE_START( chess_lcd )
GFXDECODE_ENTRY( "hd44780", 0x0000, chess_charlayout, 0, 1 )
GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, chess_charlayout, 0, 1 )
GFXDECODE_END
static ADDRESS_MAP_START(polgar_mem , AS_PROGRAM, 8, polgar_state )
@ -1519,7 +1503,8 @@ static MACHINE_CONFIG_FRAGMENT ( chess_common )
MCFG_QUANTUM_TIME(attotime::from_hz(60))
MCFG_GFXDECODE(chess_lcd)
MCFG_HD44780_ADD("hd44780", chess_display)
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(2, 16)
MCFG_DEFAULT_LAYOUT(layout_lcd)
@ -1713,8 +1698,6 @@ MACHINE_CONFIG_END
ROM_START(polgar)
ROM_REGION(0x10000,"maincpu",0)
ROM_LOAD("polgar.bin", 0x0000, 0x10000, CRC(88d55c0f) SHA1(e86d088ec3ac68deaf90f6b3b97e3e31b1515913))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START(sfortea)
@ -1722,27 +1705,17 @@ ROM_START(sfortea)
ROM_LOAD("sfalo.bin", 0x0000, 0x8000, CRC(86e0230a) SHA1(0d6e18a17e636b8c7292c8f331349d361892d1a8))
ROM_LOAD("sfahi.bin", 0x8000, 0x8000, CRC(81c02746) SHA1(0bf68b68ade5a3263bead88da0a8965fc71483c1))
ROM_LOAD("sfabook.bin", 0x10000, 0x8000, CRC(3e42cf7c) SHA1(b2faa36a127e08e5755167a25ed4a07f12d62957))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( alm16 )
ROM_REGION16_BE( 0x20000, "maincpu", 0 )
ROM_LOAD16_BYTE("alm16eve.bin", 0x00000, 0x10000,CRC(EE5B6EC4) SHA1(30920C1B9E16FFAE576DA5AFA0B56DA59ADA3DBB))
ROM_LOAD16_BYTE("alm16odd.bin" , 0x00001, 0x10000,CRC(D0BE4EE4) SHA1(D36C074802D2C9099CD44E75F9DE3FC7D1FD9908))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( alm32 )
ROM_REGION32_BE( 0x20000, "maincpu", 0 )
ROM_LOAD("alm32.bin", 0x00000, 0x20000,CRC(38F4B305) SHA1(43459A057FF29248C74D656A036AC325202B9C15))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START(sforteb)
@ -1750,8 +1723,6 @@ ROM_START(sforteb)
ROM_LOAD("forte_b.lo", 0x0000, 0x8000, CRC(48bfe5d6) SHA1(323642686b6d2fb8db2b7d50c6cd431058078ce1))
ROM_LOAD("forte_b.hi1", 0x8000, 0x8000, CRC(9778ca2c) SHA1(d8b88b9768a1a9171c68cbb0892b817d68d78351))
ROM_LOAD("forte_b.hi0", 0x10000, 0x8000, CRC(bb07ad52) SHA1(30cf9005021ab2d7b03facdf2d3588bc94dc68a6))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START(sforteba)
@ -1759,8 +1730,6 @@ ROM_START(sforteba)
ROM_LOAD("forte b_l.bin", 0x0000, 0x8000, CRC(e3d194a1) SHA1(80457580d7c57e07895fd14bfdaf14b30952afca))
ROM_LOAD("forte b_h.bin", 0x8000, 0x8000, CRC(dd824be8) SHA1(cd8666b6b525887f9fc48a730b71ceabcf07f3b9))
ROM_LOAD("forte_b.hi0", 0x10000, 0x8000, BAD_DUMP CRC(bb07ad52) SHA1(30cf9005021ab2d7b03facdf2d3588bc94dc68a6))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START(sexpertb)
@ -1768,16 +1737,12 @@ ROM_START(sexpertb)
ROM_LOAD("seb69u3.bin", 0x0000, 0x8000, CRC(92002eb6) SHA1(ed8ca16701e00b48fa55c856fa4a8c6613079c02))
ROM_LOAD("seb69u1.bin", 0x8000, 0x8000, CRC(814b4420) SHA1(c553e6a8c048dcc1cf48d410111a86e06b99d356))
ROM_LOAD("seb605u2.bin", 0x10000, 0x8000, CRC(bb07ad52) SHA1(30cf9005021ab2d7b03facdf2d3588bc94dc68a6))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START(academy)
ROM_REGION(0x10000,"maincpu",0)
ROM_LOAD("acad8000.bin", 0x8000, 0x8000, CRC(A967922B) SHA1(1327903FF89BF96D72C930C400F367AE19E3EC68))
ROM_LOAD("acad4000.bin", 0x4000, 0x4000, CRC(EE1222B5) SHA1(98541D87755A7186B69B9723CC4ADBD07F20F0E2))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START(megaiv)
@ -1789,8 +1754,6 @@ ROM_END
ROM_START(milano)
ROM_REGION(0x10000,"maincpu",0)
ROM_LOAD("milano.bin", 0x0000, 0x10000, CRC(0e9c8fe1) SHA1(e9176f42d86fe57e382185c703c7eff7e63ca711))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
@ -1799,8 +1762,6 @@ ROM_START(sfortec)
ROM_LOAD("sfclow.bin", 0x0000, 0x8000, CRC(f040cf30) SHA1(1fc1220b8ed67cdffa3866d230ce001721cf684f))
ROM_LOAD("sfchi.bin", 0x8000, 0x8000, CRC(0f926b32) SHA1(9c7270ecb3f41dd9172a9a7928e6e04e64b2a340))
ROM_LOAD("sfcbook.bin", 0x10000, 0x8000, CRC(c6a1419a) SHA1(017a0ffa9aa59438c879624a7ddea2071d1524b8))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
@ -1809,27 +1770,17 @@ ROM_START(sexpertc)
ROM_LOAD("seclow.bin", 0x0000, 0x8000, CRC(5a29105e) SHA1(be37bb29b530dbba847a5e8d27d81b36525e47f7))
ROM_LOAD("sechi.bin", 0x8000, 0x8000, CRC(0085c2c4) SHA1(d84bf4afb022575db09dd9dc12e9b330acce35fa))
ROM_LOAD("secbook.bin", 0x10000, 0x8000, CRC(2d085064) SHA1(76162322aa7d23a5c07e8356d0bbbb33816419af))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( lyon16 )
ROM_REGION16_BE( 0x20000, "maincpu", 0 )
ROM_LOAD16_BYTE("lyon16ev.bin", 0x00000, 0x10000,CRC(497BD41A) SHA1(3FFEFEEAC694F49997C10D248EC6A7AA932898A4))
ROM_LOAD16_BYTE("lyon16od.bin" , 0x00001, 0x10000,CRC(F9DE3F54) SHA1(4060E29566D2F40122CCDE3C1F84C94A9C1ED54F))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( lyon32 )
ROM_REGION32_BE( 0x20000, "maincpu", 0 )
ROM_LOAD("lyon32.bin", 0x00000, 0x20000, CRC(5C128B06) SHA1(954C8F0D3FAE29900CB1E9C14A41A9A07A8E185F))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
@ -1844,103 +1795,59 @@ ROM_START( diablo68 )
ROM_LOAD16_BYTE("evenurom.bin", 0x00000, 0x8000,CRC(03477746) SHA1(8bffcb159a61e59bfc45411e319aea6501ebe2f9))
ROM_LOAD16_BYTE("oddlrom.bin", 0x00001, 0x8000,CRC(e182dbdd) SHA1(24dacbef2173fa737636e4729ff22ec1e6623ca5))
ROM_LOAD16_BYTE("book.bin", 0x10000, 0x8000,CRC(553a5c8c) SHA1(ccb5460ff10766a5ca8008ae2cffcff794318108))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( van16 )
ROM_REGION16_BE( 0x40000, "maincpu", 0 )
ROM_LOAD16_BYTE("va16even.bin", 0x00000, 0x20000,CRC(E87602D5) SHA1(90CB2767B4AE9E1B265951EB2569B9956B9F7F44))
ROM_LOAD16_BYTE("va16odd.bin" , 0x00001, 0x20000,CRC(585F3BDD) SHA1(90BB94A12D3153A91E3760020E1EA2A9EAA7EC0A))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( van32 )
ROM_REGION32_BE( 0x40000, "maincpu", 0 )
ROM_LOAD("vanc32.bin", 0x00000, 0x40000,CRC(F872BEB5) SHA1(9919F207264F74E2B634B723B048AE9CA2CEFBC7))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( risc )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD("s2500.bin", 0x000000, 0x20000, CRC(7a707e82) SHA1(87187fa58117a442f3abd30092cfcc2a4d7c7efc))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( gen32 )
ROM_REGION32_BE( 0x40000, "maincpu", 0 )
ROM_LOAD("gen32_4.bin", 0x00000, 0x40000,CRC(6CC4DA88) SHA1(EA72ACF9C67ED17C6AC8DE56A165784AA629C4A1))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( gen32_41 )
ROM_REGION32_BE( 0x40000, "maincpu", 0 )
ROM_LOAD("gen32_41.bin", 0x00000, 0x40000,CRC(ea9938c0) SHA1(645cf0b5b831b48104ad6cec8d78c63dbb6a588c))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( gen32_oc )
ROM_REGION32_BE( 0x40000, "maincpu", 0 )
ROM_LOAD("gen32_41.bin", 0x00000, 0x40000,CRC(ea9938c0) SHA1(645cf0b5b831b48104ad6cec8d78c63dbb6a588c))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( berlinp )
ROM_REGION32_BE( 0x40000, "maincpu", 0 )
ROM_LOAD("berlinp.bin", 0x00000, 0x40000,CRC(82FBAF6E) SHA1(729B7CEF3DFAECC4594A6178FC4BA6015AFA6202))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( bpl32 )
ROM_REGION32_BE( 0x40000, "maincpu", 0 )
ROM_LOAD("bpl32.bin", 0x00000, 0x40000,CRC(D75E170F) SHA1(AC0EBDAA114ABD4FEF87361A03DF56928768B1AE))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( lond020 )
ROM_REGION32_BE( 0x40000, "maincpu", 0 )
ROM_LOAD("lond020.bin", 0x00000, 0x40000,CRC(3225B8DA) SHA1(FD8F6F4E9C03B6CDC86D8405E856C26041BFAD12))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( lond030 )
ROM_REGION32_BE( 0x40000, "maincpu", 0 )
ROM_LOAD("lond030.bin", 0x00000, 0x40000,CRC(853BAA4E) SHA1(946951081D4E91E5BDD9E93D0769568A7FE79BAD))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
DRIVER_INIT_MEMBER(polgar_state,polgar)

View File

@ -114,8 +114,7 @@ static ADDRESS_MAP_START( pc2000_io , AS_IO, 8, pc2000_state)
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x01, 0x01) AM_WRITE(rombank1_w)
AM_RANGE(0x03, 0x03) AM_WRITE(rombank2_w)
AM_RANGE(0x0a, 0x0a) AM_DEVREADWRITE("hd44780", hd44780_device, control_read, control_write)
AM_RANGE(0x0b, 0x0b) AM_DEVREADWRITE("hd44780", hd44780_device, data_read, data_write)
AM_RANGE(0x0a, 0x0b) AM_DEVREADWRITE("hd44780", hd44780_device, read, write)
AM_RANGE(0x10, 0x11) AM_READWRITE(key_matrix_r, key_matrix_w)
AM_RANGE(0x12, 0x12) AM_READWRITE(beep_r, beep_w)
ADDRESS_MAP_END
@ -314,16 +313,9 @@ static const gfx_layout hd44780_charlayout =
};
static GFXDECODE_START( pc2000 )
GFXDECODE_ENTRY( "hd44780", 0x0000, hd44780_charlayout, 0, 1 )
GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, hd44780_charlayout, 0, 1 )
GFXDECODE_END
static HD44780_INTERFACE( pc2000_display )
{
2, // number of lines
20, // chars for line
NULL // pixel update callback
};
static MACHINE_CONFIG_START( pc2000, pc2000_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu",Z80, XTAL_4MHz) /* probably not accurate */
@ -343,7 +335,8 @@ static MACHINE_CONFIG_START( pc2000, pc2000_state )
MCFG_GFXDECODE(pc2000)
MCFG_DEFAULT_LAYOUT(layout_lcd)
MCFG_HD44780_ADD("hd44780", pc2000_display)
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(2, 20)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO( "mono" )
@ -360,9 +353,6 @@ ROM_START( pc2000 )
ROM_REGION( 0x40000, "bios", ROMREGION_ERASEFF )
ROM_LOAD( "lh532hee_9344_d.u4", 0x000000, 0x040000, CRC(0b03bf33) SHA1(cb344b94b14975c685041d3e669f386e8a21909f))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_REGION( 0x4000, "cart", ROMREGION_ERASEFF )
ROM_CART_LOAD( "cart", 0, 0x4000, 0 )
ROM_END

View File

@ -194,10 +194,7 @@ WRITE8_MEMBER( psion_state::io_w )
switch (offset & 0x0ffc0)
{
case 0x80:
if (offset & 1)
m_lcdc->data_write(space, offset, data);
else
m_lcdc->control_write(space, offset, data);
m_lcdc->write(space, offset & 0x01, data);
break;
default:
io_rw(space, offset);
@ -209,10 +206,7 @@ READ8_MEMBER( psion_state::io_r )
switch (offset & 0xffc0)
{
case 0x80:
if (offset & 1)
return m_lcdc->data_read(space, offset);
else
return m_lcdc->control_read(space, offset);
return m_lcdc->read(space, offset & 0x01);
default:
io_rw(space, offset);
}
@ -437,6 +431,24 @@ void psion_state::machine_reset()
update_banks(machine());
}
HD44780_PIXEL_UPDATE(psion_state::lz_pixel_update)
{
if (pos < 40)
{
static const UINT8 psion_display_layout[] =
{
0x00, 0x01, 0x02, 0x03, 0x28, 0x29, 0x2a, 0x2b, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30, 0x31, 0x32, 0x33, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
0x14, 0x15, 0x16, 0x17, 0x3c, 0x3d, 0x3e, 0x3f, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x40, 0x41, 0x42, 0x43,
0x44, 0x45, 0x46, 0x47, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
};
UINT8 char_pos = psion_display_layout[line*40 + pos];
bitmap.pix16((char_pos / 20) * 9 + y, (char_pos % 20) * 6 + x) = state;
}
}
void psion_state::palette_init()
{
palette_set_color(machine(), 0, MAKE_RGB(138, 146, 148));
@ -455,16 +467,9 @@ static const gfx_layout psion_charlayout =
};
static GFXDECODE_START( psion )
GFXDECODE_ENTRY( "hd44780", 0x0000, psion_charlayout, 0, 1 )
GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, psion_charlayout, 0, 1 )
GFXDECODE_END
static HD44780_INTERFACE( psion_2line_display )
{
2, // number of lines
16, // chars for line
NULL // pixel update callback
};
/* basic configuration for 2 lines display */
static MACHINE_CONFIG_START( psion_2lines, psion_state )
/* basic machine hardware */
@ -481,7 +486,8 @@ static MACHINE_CONFIG_START( psion_2lines, psion_state )
MCFG_PALETTE_LENGTH(2)
MCFG_GFXDECODE(psion)
MCFG_HD44780_ADD("hd44780", psion_2line_display)
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(2, 16)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO( "mono" )
@ -500,14 +506,6 @@ static MACHINE_CONFIG_START( psion_2lines, psion_state )
MCFG_SOFTWARE_LIST_ADD("pack_list", "psion")
MACHINE_CONFIG_END
static HD44780_INTERFACE( psion_4line_display )
{
4, // number of lines
20, // chars for line
NULL // pixel update callback
};
/* basic configuration for 4 lines display */
static MACHINE_CONFIG_DERIVED( psion_4lines, psion_2lines )
/* video hardware */
@ -515,8 +513,9 @@ static MACHINE_CONFIG_DERIVED( psion_4lines, psion_2lines )
MCFG_SCREEN_SIZE(6*20, 9*4)
MCFG_SCREEN_VISIBLE_AREA(0, 6*20-1, 0, 9*4-1)
MCFG_DEVICE_REMOVE("hd44780")
MCFG_PSION_CUSTOM_LCDC_ADD("hd44780", psion_4line_display)
MCFG_DEVICE_MODIFY("hd44780")
MCFG_HD44780_LCD_SIZE(4, 20)
MCFG_HD44780_PIXEL_UPDATE_CB(psion_state::lz_pixel_update)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( psioncm, psion_2lines )
@ -554,18 +553,12 @@ ROM_START( psioncm )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
ROM_SYSTEM_BIOS(0, "v24", "CM v2.4")
ROMX_LOAD( "24-cm.dat", 0x8000, 0x8000, CRC(f6798394) SHA1(736997f0db9a9ee50d6785636bdc3f8ff1c33c66), ROM_BIOS(1))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( psionla )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
ROM_SYSTEM_BIOS(0, "v33", "LA v3.3")
ROMX_LOAD( "33-la.dat", 0x8000, 0x8000, CRC(02668ed4) SHA1(e5d4ee6b1cde310a2970ffcc6f29a0ce09b08c46), ROM_BIOS(1))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( psionp350 )
@ -574,54 +567,36 @@ ROM_START( psionp350 )
ROMX_LOAD( "36-p350.dat", 0x8000, 0x8000, CRC(3a371a74) SHA1(9167210b2c0c3bd196afc08ca44ab23e4e62635e), ROM_BIOS(1))
ROM_SYSTEM_BIOS(1, "v38", "POS350 v3.8")
ROMX_LOAD( "38-p350.dat", 0x8000, 0x8000, CRC(1b8b082f) SHA1(a3e875a59860e344f304a831148a7980f28eaa4a), ROM_BIOS(2))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
ROM_START( psionlam )
ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF )
ROM_SYSTEM_BIOS(0, "v37", "LA v3.7")
ROMX_LOAD( "37-lam.dat", 0x8000, 0x10000, CRC(7ee3a1bc) SHA1(c7fbd6c8e47c9b7d5f636e9f56e911b363d6796b), ROM_BIOS(1))
ROM_REGION( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
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( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
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( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
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( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
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( 0x0860, "hd44780", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
/* Driver */

View File

@ -70,6 +70,7 @@
#include "emu.h"
#include "cpu/h83002/h8.h"
#include "video/hd44780.h"
#include "rendlay.h"
static INPUT_PORTS_START( mu100 )
INPUT_PORTS_END
@ -166,27 +167,22 @@ static ADDRESS_MAP_START( mu100_iomap, AS_IO, 8, mu100_state )
AM_RANGE(H8_ADC_7_H, H8_ADC_7_L) AM_READ(adc7_r)
ADDRESS_MAP_END
static HD44780_INTERFACE( lcd_config )
{
4,
20,
NULL
};
static MACHINE_CONFIG_START( mu100, mu100_state )
MCFG_CPU_ADD( "maincpu", H8S2655, XTAL_16MHz )
MCFG_CPU_PROGRAM_MAP( mu100_map )
MCFG_CPU_IO_MAP( mu100_iomap )
MCFG_HD44780_ADD("lcd", lcd_config)
MCFG_HD44780_ADD("lcd")
MCFG_HD44780_LCD_SIZE(4, 20)
MCFG_SCREEN_ADD("screen", LCD)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate, asynchronous updating anyway */
MCFG_SCREEN_UPDATE_DEVICE("lcd", hd44780_device, screen_update)
MCFG_SCREEN_SIZE(320, 200)
MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1)
MCFG_SCREEN_SIZE(20*6, 4*9)
MCFG_SCREEN_VISIBLE_AREA(0, 20*6-1, 0, 4*9-1)
MCFG_PALETTE_LENGTH(2)
MCFG_DEFAULT_LAYOUT(layout_lcd)
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MACHINE_CONFIG_END
@ -206,9 +202,6 @@ ROM_START( mu100 )
ROM_LOAD32_WORD( "sx743b0.ic35", 0x000002, 0x400000, CRC(a9109a6c) SHA1(a67bb49378a38a2d809bd717d286e18bc6496db0) )
ROM_LOAD32_WORD( "xt445a0-828.ic36", 0x800000, 0x1000000, CRC(d4483a43) SHA1(5bfd0762dea8598eda19db20251dac20e31fa02c) )
ROM_LOAD32_WORD( "xt461a0-829.ic37", 0x800002, 0x1000000, CRC(c5af4501) SHA1(1c88de197c36382311053add8b19a5740802cb78) )
ROM_REGION( 0x0860, "lcd", ROMREGION_ERASE )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
CONS( 1997, mu100, 0, 0, mu100, mu100, driver_device, 0, "Yamaha", "MU100", GAME_NOT_WORKING )

View File

@ -14,23 +14,6 @@
#include "video/hd44780.h"
#include "sound/beep.h"
#define MCFG_PSION_CUSTOM_LCDC_ADD( _tag , _config) \
MCFG_DEVICE_ADD( _tag, PSION_CUSTOM_LCDC, 0 ) \
MCFG_DEVICE_CONFIG(_config)
// ======================> psion_custom_lcdc
class psion_custom_lcdc : public hd44780_device
{
public:
// construction/destruction
psion_custom_lcdc(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// hd44780_device overrides
virtual DECLARE_WRITE8_MEMBER(control_write);
virtual UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
};
// ======================> psion_state
@ -86,9 +69,8 @@ public:
virtual void palette_init();
DECLARE_INPUT_CHANGED_MEMBER(psion_on);
TIMER_DEVICE_CALLBACK_MEMBER(nmi_timer);
static HD44780_PIXEL_UPDATE(lz_pixel_update);
};
// device type definition
extern const device_type PSION_CUSTOM_LCDC;
#endif // _PSION_H_

View File

@ -1548,7 +1548,6 @@ $(MESSOBJ)/poly88.a: \
$(MESSOBJ)/psion.a: \
$(MESS_DRIVERS)/psion.o \
$(MESS_VIDEO)/psion.o \
$(MESS_MACHINE)/psion_pack.o \
$(MESSOBJ)/radio.a: \

View File

@ -3,42 +3,30 @@
Hitachi HD44780 LCD controller
TODO:
- 5x10 chars
- dump internal CGROM
HACKS:
- A00 10 bit chars are tacked onto recreated chrrom at $700 (until internal rom is dumped)
- A00/A02 drawing selected by sizeof romfile, A02 is $800, A00 is $860
***************************************************************************/
#include "emu.h"
#include "video/hd44780.h"
// devices
#define LOG 0
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type HD44780 = &device_creator<hd44780_device>;
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
// ROM( hd44780 )
//-------------------------------------------------
void hd44780_device::device_config_complete()
{
// inherit a copy of the static data
const hd44780_interface *intf = reinterpret_cast<const hd44780_interface *>(static_config());
if (intf != NULL)
*static_cast<hd44780_interface *>(this) = *intf;
// or initialize to defaults if none provided
else
{
height = width = 0;
pixel_update_func = NULL;
}
}
ROM_START( hd44780 )
ROM_REGION( 0x0860, "cgrom", 0 )
ROM_LOAD( "44780a00.bin", 0x0000, 0x0860, BAD_DUMP CRC(3a89024c) SHA1(5a87b68422a916d1b37b5be1f7ad0b3fb3af5a8d))
ROM_END
//**************************************************************************
@ -50,13 +38,26 @@ void hd44780_device::device_config_complete()
//-------------------------------------------------
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", tag, owner, clock),
m_pixel_update_func(NULL)
{
m_shortname = "hd44780";
}
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)
device_t(mconfig, type, name, tag, owner, clock),
m_pixel_update_func(NULL)
{
m_shortname = "hd44780";
}
//-------------------------------------------------
// rom_region - device-specific ROM region
//-------------------------------------------------
const rom_entry *hd44780_device::device_rom_region() const
{
return ROM_NAME( hd44780 );
}
//-------------------------------------------------
@ -65,58 +66,61 @@ hd44780_device::hd44780_device(const machine_config &mconfig, device_type type,
void hd44780_device::device_start()
{
m_busy_timer = timer_alloc(BUSY_TIMER);
m_blink_timer = timer_alloc(BLINKING_TIMER);
if (region())
m_cgrom = (UINT8*)(*region());
else
m_cgrom = (UINT8*)(*memregion("cgrom"));
m_busy_timer = timer_alloc(TIMER_BUSY);
m_blink_timer = timer_alloc(TIMER_BLINKING);
m_blink_timer->adjust(attotime::from_msec(409), 0, attotime::from_msec(409));
save_item( NAME(m_ac));
save_item( NAME(m_ac_mode));
save_item( NAME(m_data_bus_flag));
save_item( NAME(m_cursor_pos));
save_item( NAME(m_display_on));
save_item( NAME(m_cursor_on));
save_item( NAME(m_shift_on));
save_item( NAME(m_blink_on));
save_item( NAME(m_direction));
save_item( NAME(m_data_len));
save_item( NAME(m_num_line));
save_item( NAME(m_char_size));
save_item( NAME(m_disp_shift));
save_item( NAME(m_blink));
save_item( NAME(m_ddram));
save_item( NAME(m_cgram));
save_item( NAME(m_nibble));
save_item( NAME(m_data_latch));
// state saving
save_item(NAME(m_busy_flag));
save_item(NAME(m_ac));
save_item(NAME(m_dr));
save_item(NAME(m_ir));
save_item(NAME(m_active_ram));
save_item(NAME(m_display_on));
save_item(NAME(m_cursor_on));
save_item(NAME(m_shift_on));
save_item(NAME(m_blink_on));
save_item(NAME(m_direction));
save_item(NAME(m_data_len));
save_item(NAME(m_num_line));
save_item(NAME(m_char_size));
save_item(NAME(m_disp_shift));
save_item(NAME(m_blink));
save_item(NAME(m_ddram));
save_item(NAME(m_cgram));
save_item(NAME(m_nibble));
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void hd44780_device::device_reset()
{
m_busy_flag = 0;
memset(m_ddram, 0x20, sizeof(m_ddram)); // can't use 0 here as it would show CGRAM instead of blank space on a soft reset
memset(m_cgram, 0, sizeof(m_cgram));
m_ac = 0;
m_ac_mode = 0;
m_data_bus_flag = 0;
m_cursor_pos = 0;
m_display_on = 0;
m_cursor_on = 0;
m_shift_on = 0;
m_blink_on = 0;
m_direction = 1;
m_data_len = -1; // must not be 0 or 1 on intial start to pick up first 4/8 bit mode change
m_num_line = 0;
m_char_size = 0;
m_ac = 0;
m_dr = 0;
m_ir = 0;
m_active_ram = DDRAM;
m_display_on = false;
m_cursor_on = false;
m_blink_on = false;
m_shift_on = false;
m_direction = 1;
m_data_len = 8;
m_num_line = 1;
m_char_size = 8;
m_disp_shift = 0;
m_blink = 0;
m_nibble = false;
m_data_latch = 0;
m_blink = false;
m_nibble = false;
m_first_cmd = true;
set_busy_flag(1520);
}
@ -125,54 +129,117 @@ void hd44780_device::device_reset()
//-------------------------------------------------
// device_timer - handler timer events
//-------------------------------------------------
void hd44780_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch(id)
{
case BUSY_TIMER:
m_busy_flag = 0;
case TIMER_BUSY:
m_busy_flag = false;
break;
case BLINKING_TIMER:
case TIMER_BLINKING:
m_blink = !m_blink;
break;
}
}
//**************************************************************************
// HELPERS
//**************************************************************************
void hd44780_device::set_busy_flag(UINT16 usec)
{
m_busy_flag = 1;
m_busy_flag = true;
m_busy_timer->adjust( attotime::from_usec( usec ) );
}
void hd44780_device::update_ac(int direction)
{
if (m_active_ram == DDRAM)
{
if(direction == 1)
{
if(m_num_line == 2 && m_ac == 0x27)
m_ac = 0x40;
else if((m_num_line == 2 && m_ac == 0x67) || (m_num_line == 1 && m_ac == 0x4f))
m_ac = 0x00;
else
m_ac = (m_ac + direction) & 0x7f;
}
else
{
if(m_num_line == 2 && m_ac == 0x00)
m_ac = 0x67;
else if(m_num_line == 1 && m_ac == 0x00)
m_ac = 0x4f;
else if(m_num_line == 2 && m_ac == 0x40)
m_ac = 0x27;
else
m_ac = (m_ac + direction) & 0x7f;
}
}
else
{
m_ac = (m_ac + direction) & 0x3f;
}
}
inline void hd44780_device::pixel_update(bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state)
{
if (pixel_update_func != NULL)
pixel_update_func(*this, bitmap, line, pos, y, x, state);
if (m_pixel_update_func != NULL)
{
m_pixel_update_func(*this, bitmap, line, pos, y, x, state);
}
else
bitmap.pix16(line*9 + y, pos*6 + x) = state;
{
if (m_lines <= 2)
{
if (pos < m_chars)
bitmap.pix16(line * (m_char_size+1) + y, pos * 6 + x) = state;
}
else if (m_lines <= 4)
{
if (pos < m_chars*2)
{
if (pos >= m_chars)
{
line += 2;
pos -= m_chars;
}
if (line < m_lines)
bitmap.pix16(line * (m_char_size+1) + y, pos * 6 + x) = state;
}
}
else
{
fatalerror("%s: use a custom callback for this LCD configuration (%d x %d)\n", tag(), m_lines, m_chars);
}
}
}
//**************************************************************************
// device interface
//**************************************************************************
UINT32 hd44780_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
assert(height*9 <= bitmap.height() && width*6 <= bitmap.width());
bitmap.fill(0, cliprect);
if (m_display_on)
for (int l=0; l<height; l++)
for (int i=0; i<width; i++)
{
UINT8 line_base = l * 0x40;
UINT8 line_size = (m_num_line) ? 40 : 80;
INT8 char_pos = line_base + i;
{
UINT8 line_size = 80 / m_num_line;
char_pos += m_disp_shift;
for (int line=0; line<m_num_line; line++)
{
UINT8 line_base = line * 0x40;
for (int pos=0; pos<line_size; pos++)
{
INT16 char_pos = line_base + pos + m_disp_shift;
while (char_pos < 0 || (char_pos - line_base) >= line_size)
{
@ -182,222 +249,253 @@ UINT32 hd44780_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap
char_pos -= line_size;
}
for (int y=0; y<8; y++)
int char_base = 0;
if (m_ddram[char_pos] < 0x10)
{
// draw CGRAM characters
if (m_char_size == 8)
char_base = (m_ddram[char_pos] & 0x07) * 8;
else
char_base = (m_ddram[char_pos] & 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);
}
for (int y=0; y<m_char_size; y++)
{
UINT8 * charset = (m_ddram[char_pos] < 0x10) ? m_cgram : m_cgrom;
for (int x=0; x<5; x++)
if (m_ddram[char_pos] <= 0x10)
{
//draw CGRAM characters
pixel_update(bitmap, l, i, y, x, BIT(m_cgram[(m_ddram[char_pos]&0x07)*8+y], 4-x));
}
{
if (m_ddram[char_pos] >= 0xe0 || y < 8)
pixel_update(bitmap, line, pos, y, x, BIT(charset[char_base + y], 4 - x));
else
{
//draw CGROM characters
if (region()->bytes() <= 0x800)
{
pixel_update(bitmap, l, i, y, x, BIT(region()->u8(m_ddram[char_pos]*8+y), 4-x));
}
else
{
if(m_ddram[char_pos] < 0xe0)
pixel_update(bitmap, l, i, y, x, BIT(region()->u8(m_ddram[char_pos]*8+y), 4-x));
else
pixel_update(bitmap, l, i, y, x, BIT(region()->u8(0x700+((m_ddram[char_pos]-0xe0)*11)+y), 4-x));
}
}
pixel_update(bitmap, line, pos, y, x, 0);
}
}
// if is the correct position draw cursor and blink
if (char_pos == m_cursor_pos)
if (char_pos == m_ac)
{
//draw the cursor
// draw the cursor
if (m_cursor_on)
for (int x=0; x<5; x++)
pixel_update(bitmap, l, i, 7, x, 1);
pixel_update(bitmap, line, pos, m_char_size - 1, x, 1);
if (!m_blink && m_blink_on)
for (int y=0; y<7; y++)
for (int y=0; y<(m_char_size - 1); y++)
for (int x=0; x<5; x++)
pixel_update(bitmap, l, i, y, x, 1);
pixel_update(bitmap, line, pos, y, x, 1);
}
}
}
}
return 0;
}
READ8_MEMBER(hd44780_device::read)
{
switch(offset & 0x01)
{
case 0: return control_read(space, 0);
case 1: return data_read(space, 0);
}
return 0;
}
WRITE8_MEMBER(hd44780_device::write)
{
switch(offset & 0x01)
{
case 0: control_write(space, 0, data); break;
case 1: data_write(space, 0, data); break;
}
}
WRITE8_MEMBER(hd44780_device::control_write)
{
if (m_data_len == 0)
if (m_data_len == 4)
{
m_nibble = !m_nibble;
if (m_nibble)
{
m_data_latch = data & 0xf0;
m_ir = data & 0xf0;
return;
}
else
{
m_data_latch |= ((data>>4) & 0x0f);
m_ir |= ((data>>4) & 0x0f);
}
}
else
{
m_data_latch = data;
m_ir = data;
}
if (BIT(m_data_latch, 7)) // Set DDRAM Address
if (BIT(m_ir, 7)) // set DDRAM address
{
m_ac_mode = 0;
m_ac = m_data_latch & 0x7f;
m_cursor_pos = m_ac;
m_active_ram = DDRAM;
m_ac = m_ir & 0x7f;
set_busy_flag(37);
}
else if (BIT(m_data_latch, 6)) // Set CGRAM Address
{
m_ac_mode = 1;
m_ac = m_data_latch & 0x3f;
set_busy_flag(37);
}
else if (BIT(m_data_latch, 5)) // Function Set
{
// datasheet says you can't change char size after first function set without altering 4/8 bit mode
if (BIT(m_data_latch, 4) != m_data_len)
m_char_size = BIT(m_data_latch, 2);
m_data_len = BIT(m_data_latch, 4);
m_num_line = BIT(m_data_latch, 3);
set_busy_flag(37);
if (LOG) logerror("HD44780 '%s': set DDRAM address %x\n", tag(), m_ac);
}
else if (BIT(m_data_latch, 4)) // Cursor or display shift
else if (BIT(m_ir, 6)) // set CGRAM address
{
UINT8 direct = (BIT(m_data_latch, 2)) ? +1 : -1;
m_active_ram = CGRAM;
m_ac = m_ir & 0x3f;
set_busy_flag(37);
if (BIT(m_data_latch, 3))
m_disp_shift += direct;
else
if (LOG) logerror("HD44780 '%s': set CGRAM address %x\n", tag(), m_ac);
}
else if (BIT(m_ir, 5)) // function set
{
if (!m_first_cmd && m_data_len == (BIT(m_ir, 4) ? 8 : 4) && (m_char_size != (BIT(m_ir, 2) ? 10 : 8) || m_num_line != (BIT(m_ir, 3) + 1)))
{
m_ac += direct;
m_cursor_pos += direct;
logerror("HD44780 '%s': function set cannot be executed after other instructions unless the interface data length is changed\n", tag());
return;
}
m_char_size = BIT(m_ir, 2) ? 10 : 8;
m_data_len = BIT(m_ir, 4) ? 8 : 4;
m_num_line = BIT(m_ir, 3) + 1;
set_busy_flag(37);
if (LOG) logerror("HD44780 '%s': char size 5x%d, data len %d, lines %d\n", tag(), m_char_size, m_data_len, m_num_line);
return;
}
else if (BIT(m_data_latch, 3)) // Display on/off Control
else if (BIT(m_ir, 4)) // cursor or display shift
{
m_display_on = BIT(m_data_latch, 2);
m_cursor_on = BIT(m_data_latch, 1);
m_blink_on = BIT(m_data_latch, 0);
int direct = (BIT(m_ir, 2)) ? +1 : -1;
if (LOG) logerror("HD44780 '%s': %s shift %d\n", tag(), BIT(m_ir, 3) ? "display" : "cursor", direct);
if (BIT(m_ir, 3))
m_disp_shift += direct;
else
update_ac(direct);
set_busy_flag(37);
}
else if (BIT(m_data_latch, 2)) // Entry Mode set
else if (BIT(m_ir, 3)) // display on/off control
{
m_direction = (BIT(m_data_latch, 1)) ? +1 : -1;
m_shift_on = BIT(m_data_latch, 0);
m_display_on = BIT(m_ir, 2);
m_cursor_on = BIT(m_ir, 1);
m_blink_on = BIT(m_ir, 0);
set_busy_flag(37);
if (LOG) logerror("HD44780 '%s': display %d, cursor %d, blink %d\n", tag(), m_display_on, m_cursor_on, m_blink_on);
}
else if (BIT(m_data_latch, 1)) // return home
else if (BIT(m_ir, 2)) // entry mode set
{
m_ac = 0;
m_cursor_pos = 0;
m_ac_mode = 0; // datasheet does not specifically say this but mephisto won't run without it
m_direction = 1;
m_direction = (BIT(m_ir, 1)) ? +1 : -1;
m_shift_on = BIT(m_ir, 0);
set_busy_flag(37);
if (LOG) logerror("HD44780 '%s': entry mode set: direction %d, shift %d\n", tag(), m_direction, m_shift_on);
}
else if (BIT(m_ir, 1)) // return home
{
if (LOG) logerror("HD44780 '%s': return home\n", tag());
m_ac = 0;
m_active_ram = DDRAM;
m_direction = 1;
m_disp_shift = 0;
set_busy_flag(1520);
}
else if (BIT(m_data_latch, 0)) // clear display
else if (BIT(m_ir, 0)) // clear display
{
m_ac = 0;
m_cursor_pos = 0;
m_ac_mode = 0;
m_direction = 1;
if (LOG) logerror("HD44780 '%s': clear display\n", tag());
m_ac = 0;
m_active_ram = DDRAM;
m_direction = 1;
m_disp_shift = 0;
memset(m_ddram, 0x20, sizeof(m_ddram));
set_busy_flag(1520);
}
m_first_cmd = false;
}
READ8_MEMBER(hd44780_device::control_read)
{
if (m_data_len == 0)
if (m_data_len == 4)
{
m_nibble = !m_nibble;
if (!space.debugger_access())
m_nibble = !m_nibble;
if (m_nibble)
return (m_busy_flag << 7) | (m_ac & 0x70);
return (m_busy_flag ? 0x80 : 0) | (m_ac & 0x70);
else
return (m_ac<<4) & 0xf0;
}
else
{
return (m_busy_flag << 7) | (m_ac & 0x7f);
return (m_busy_flag ? 0x80 : 0) | (m_ac & 0x7f);
}
}
void hd44780_device::update_ac(void) // m_data_bus_flag was left as global so old savestates will work
{
int new_ac = m_ac + m_direction;
m_ac = (new_ac < 0) ? 0 : ((new_ac > 0x7f) ? 0x7f : new_ac);
if (m_ac_mode == 0)
{
m_cursor_pos = m_ac;
// display is shifted only after a write
if (m_shift_on && m_data_bus_flag == 1) m_disp_shift += m_direction;
}
m_data_bus_flag = 0;
}
WRITE8_MEMBER(hd44780_device::data_write)
{
if (m_busy_flag)
{
logerror("HD44780 '%s' Ignoring data write %02x due of busy flag\n", tag(), data);
logerror("HD44780 '%s': Ignoring data write %02x due of busy flag\n", tag(), data);
return;
}
if (m_data_len == 0)
if (m_data_len == 4)
{
m_nibble = !m_nibble;
if (m_nibble)
{
m_data_latch = data & 0xf0;
m_dr = data & 0xf0;
return;
}
else
{
m_data_latch |= ((data>>4) & 0x0f);
m_dr |= ((data>>4) & 0x0f);
}
}
else
{
m_data_latch = data;
m_dr = data;
}
if (m_ac_mode == 0)
m_ddram[m_ac] = m_data_latch;
else
m_cgram[m_ac] = m_data_latch;
if (LOG) logerror("HD44780 '%s': %sRAM write %x %x '%c'\n", tag(), m_active_ram == DDRAM ? "DD" : "CG", m_ac, m_dr, isprint(m_dr) ? m_dr : '.');
m_data_bus_flag = 1;
update_ac();
if (m_active_ram == DDRAM)
m_ddram[m_ac] = m_dr;
else
m_cgram[m_ac] = m_dr;
update_ac(m_direction);
if (m_shift_on)
m_disp_shift += m_direction;
set_busy_flag(41);
}
READ8_MEMBER(hd44780_device::data_read)
{
UINT8 data;
UINT8 data = (m_active_ram == DDRAM) ? m_ddram[m_ac] : m_cgram[m_ac];
if (m_ac_mode == 0)
data = m_ddram[m_ac];
else
data = m_cgram[m_ac];
if (LOG) logerror("HD44780 '%s': %sRAM read %x %c\n", tag(), m_active_ram == DDRAM ? "DD" : "CG", m_ac, data);
if (m_data_len == 0)
if (m_data_len == 4)
{
m_nibble = !m_nibble;
if (!space.debugger_access())
m_nibble = !m_nibble;
if (m_nibble)
return data & 0xf0;
@ -405,10 +503,11 @@ READ8_MEMBER(hd44780_device::data_read)
data = (data<<4) & 0xf0;
}
m_data_bus_flag = 2;
update_ac();
set_busy_flag(41);
if (!space.debugger_access())
{
update_ac(m_direction);
set_busy_flag(41);
}
return data;
}

View File

@ -10,49 +10,43 @@
#define __HD44780_H__
#define MCFG_HD44780_ADD( _tag , _config) \
MCFG_DEVICE_ADD( _tag, HD44780, 0 ) \
MCFG_DEVICE_CONFIG(_config)
#define MCFG_HD44780_ADD( _tag ) \
MCFG_DEVICE_ADD( _tag, HD44780, 0 )
#define MCFG_HD44780_REPLACE( _tag , _config) \
MCFG_DEVICE_REPLACE( _tag, HD44780, 0 ) \
MCFG_DEVICE_CONFIG(_config)
#define MCFG_HD44780_LCD_SIZE(_lines, _chars) \
hd44780_device::static_set_lcd_size(*device, _lines, _chars);
#define MCFG_HD44780_PIXEL_UPDATE_CB(_cb) \
hd44780_device::static_set_pixel_update_cb(*device, _cb);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
#define HD44780_INTERFACE(name) \
const hd44780_interface (name) =
typedef void (*hd44780_pixel_update_func)(device_t &device, bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state);
#define HD44780_PIXEL_UPDATE(name) void name(device_t &device, bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state)
// ======================> hd44780_interface
struct hd44780_interface
{
UINT8 height; // number of lines
UINT8 width; // chars for line
hd44780_pixel_update_func pixel_update_func; // pixel update callback
};
// ======================> hd44780_device
class hd44780_device : public device_t,
public hd44780_interface
class hd44780_device : public device_t
{
public:
// construction/destruction
hd44780_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
hd44780_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
// static configuration helpers
static void static_set_lcd_size(device_t &device, int _lines, int _chars) { hd44780_device &dev=downcast<hd44780_device &>(device); dev.m_lines = _lines; dev.m_chars = _chars; }
static void static_set_pixel_update_cb(device_t &device, hd44780_pixel_update_func _cb) { downcast<hd44780_device &>(device).m_pixel_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(control_read);
virtual DECLARE_WRITE8_MEMBER(data_write);
virtual DECLARE_READ8_MEMBER(data_read);
virtual UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
protected:
@ -60,45 +54,49 @@ protected:
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
virtual void device_config_complete();
protected:
// optional information overrides
const rom_entry *device_rom_region() const;
private:
// internal helper
void set_busy_flag(UINT16 usec);
void update_ac(void);
void update_ac(int direction);
void pixel_update(bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state);
// internal state
static const device_timer_id BUSY_TIMER = 0;
static const device_timer_id BLINKING_TIMER = 1;
static const device_timer_id TIMER_BUSY = 0;
static const device_timer_id TIMER_BLINKING = 1;
emu_timer *m_blink_timer;
emu_timer *m_busy_timer;
emu_timer * m_blink_timer;
emu_timer * m_busy_timer;
UINT8 m_busy_flag;
UINT8 m_lines; // number of lines
UINT8 m_chars; // chars for line
hd44780_pixel_update_func m_pixel_update_func; // pixel update callback
UINT8 m_ddram[0x80]; //internal display data RAM
UINT8 m_cgram[0x40]; //internal chargen RAM
bool m_busy_flag; // busy flag
UINT8 m_ddram[0x80]; // internal display data RAM
UINT8 m_cgram[0x40]; // internal chargen RAM
UINT8 * m_cgrom; // internal chargen ROM
INT8 m_ac; // address counter
UINT8 m_dr; // data register
UINT8 m_ir; // instruction register
UINT8 m_active_ram; // DDRAM or CGRAM
bool m_display_on; // display on/off
bool m_cursor_on; // cursor on/off
bool m_blink_on; // blink on/off
bool m_shift_on; // shift on/off
INT8 m_disp_shift; // display shift
INT8 m_direction; // auto increment/decrement
UINT8 m_data_len; // interface data length 4 or 8 bit
UINT8 m_num_line; // number of lines
UINT8 m_char_size; // char size 5x8 or 5x10
bool m_blink;
bool m_first_cmd;
bool m_nibble;
INT8 m_ac; //address counter
UINT8 m_ac_mode; //0=DDRAM 1=CGRAM
UINT8 m_data_bus_flag; //0=none 1=write 2=read
INT8 m_cursor_pos; //cursor position
UINT8 m_display_on; //display on/off
UINT8 m_cursor_on; //cursor on/off
UINT8 m_blink_on; //blink on/off
UINT8 m_shift_on; //shift on/off
INT8 m_disp_shift; //display shift
INT8 m_direction; //auto increment/decrement
UINT8 m_data_len; //interface data length 4 or 8 bit
UINT8 m_num_line; //number of lines
UINT8 m_char_size; //char size 5x8 or 5x10
UINT8 m_blink;
bool m_nibble;
UINT8 m_data_latch;
enum { DDRAM, CGRAM };
};
// device type definition

View File

@ -1,105 +0,0 @@
/***************************************************************************
Psion Organiser II LZ series custom LCD controller
***************************************************************************/
#include "emu.h"
#include "includes/psion.h"
// devices
const device_type PSION_CUSTOM_LCDC = &device_creator<psion_custom_lcdc>;
//**************************************************************************
// live device
//**************************************************************************
//-------------------------------------------------
// psion_custom_lcdc - constructor
//-------------------------------------------------
psion_custom_lcdc::psion_custom_lcdc(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
hd44780_device(mconfig, PSION_CUSTOM_LCDC, "Psion Custom LCD Controller", tag, owner, clock)
{
}
//**************************************************************************
// device interface
//**************************************************************************
UINT32 psion_custom_lcdc::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
assert(height*9 <= bitmap.height() && width*6 <= bitmap.width());
bitmap.fill(0, cliprect);
if (m_display_on)
for (int l=0; l<height; l++)
for (int i=0; i<width; i++)
{
static const UINT8 psion_display_layout[] =
{
0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x40, 0x41, 0x42, 0x43, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x44, 0x45, 0x46, 0x47, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
};
INT8 char_pos = psion_display_layout[l*width + i];
for (int y=0; y<8; y++)
for (int x=0; x<5; x++)
if (m_ddram[char_pos] <= 0x10)
{
//draw CGRAM characters
bitmap.pix16(l*9 + y, i*6 + x) = BIT(m_cgram[(m_ddram[char_pos]&0x07)*8+y], 4-x);
}
else
{
//draw CGROM characters
if (region()->bytes() <= 0x800)
{
bitmap.pix16(l*9 + y, i*6 + x) = BIT(region()->u8(m_ddram[char_pos]*8+y), 4-x);
}
else
{
if(m_ddram[char_pos] < 0xe0)
bitmap.pix16(l*9 + y, i*6 + x) = BIT(region()->u8(m_ddram[char_pos]*8+y), 4-x);
else
bitmap.pix16(l*9 + y, i*6 + x) = BIT(region()->u8(0x700+((m_ddram[char_pos]-0xe0)*11)+y), 4-x);
}
}
// if is the correct position draw cursor and blink
if (char_pos == m_cursor_pos)
{
//draw the cursor
if (m_cursor_on)
for (int x=0; x<5; x++)
bitmap.pix16(l*9 + 7, i * 6 + x) = 1;
if (!m_blink && m_blink_on)
for (int y=0; y<7; y++)
for (int x=0; x<5; x++)
bitmap.pix16(l*9 + y, i * 6 + x) = 1;
}
}
return 0;
}
WRITE8_MEMBER(psion_custom_lcdc::control_write)
{
if (BIT(data, 7)) // Set DDRAM Address
{
m_ac_mode = 0;
m_ac = data & 0x7f;
if (data != 0x81)
m_cursor_pos = m_ac;
set_busy_flag(37);
}
else
hd44780_device::control_write(space, offset, data);
}