diff --git a/.gitattributes b/.gitattributes index 41bb3c6b8c6..a1be0a2d288 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/src/mess/drivers/alesis.c b/src/mess/drivers/alesis.c index bccd9e0d354..7baccdde2af 100644 --- a/src/mess/drivers/alesis.c +++ b/src/mess/drivers/alesis.c @@ -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(); - 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 diff --git a/src/mess/drivers/alphasma.c b/src/mess/drivers/alphasma.c index 059b23c1b83..74eb9e13516 100644 --- a/src/mess/drivers/alphasma.c +++ b/src/mess/drivers/alphasma.c @@ -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 diff --git a/src/mess/drivers/lcmate2.c b/src/mess/drivers/lcmate2.c index 43b6c111c5e..4edfd0b096b 100644 --- a/src/mess/drivers/lcmate2.c +++ b/src/mess/drivers/lcmate2.c @@ -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 */ diff --git a/src/mess/drivers/mmodular.c b/src/mess/drivers/mmodular.c index 28ee15e02b0..e5f96883601 100644 --- a/src/mess/drivers/mmodular.c +++ b/src/mess/drivers/mmodular.c @@ -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 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"); - 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"); 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"); - - 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"); 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) diff --git a/src/mess/drivers/pc2000.c b/src/mess/drivers/pc2000.c index 78417a4b44b..71641ba9bd8 100644 --- a/src/mess/drivers/pc2000.c +++ b/src/mess/drivers/pc2000.c @@ -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 diff --git a/src/mess/drivers/psion.c b/src/mess/drivers/psion.c index 16171b1d4e4..b0005995afa 100644 --- a/src/mess/drivers/psion.c +++ b/src/mess/drivers/psion.c @@ -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 */ diff --git a/src/mess/drivers/ymmu100.c b/src/mess/drivers/ymmu100.c index 6757a185ec1..afe923243e5 100644 --- a/src/mess/drivers/ymmu100.c +++ b/src/mess/drivers/ymmu100.c @@ -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 ) diff --git a/src/mess/includes/psion.h b/src/mess/includes/psion.h index 27e747b94d1..f05f6cf23b8 100644 --- a/src/mess/includes/psion.h +++ b/src/mess/includes/psion.h @@ -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_ diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 6786f493755..2678c89f172 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -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: \ diff --git a/src/mess/video/hd44780.c b/src/mess/video/hd44780.c index e98baf55317..77736838429 100644 --- a/src/mess/video/hd44780.c +++ b/src/mess/video/hd44780.c @@ -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; + //------------------------------------------------- -// 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(static_config()); - - if (intf != NULL) - *static_cast(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= 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= 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; } diff --git a/src/mess/video/hd44780.h b/src/mess/video/hd44780.h index 3dced27a79f..08013ec6c8f 100644 --- a/src/mess/video/hd44780.h +++ b/src/mess/video/hd44780.h @@ -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(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(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 diff --git a/src/mess/video/psion.c b/src/mess/video/psion.c deleted file mode 100644 index 2ca3201515d..00000000000 --- a/src/mess/video/psion.c +++ /dev/null @@ -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; - - -//************************************************************************** -// 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; lbytes() <= 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); -}