diff --git a/src/mame/drivers/novag6502.cpp b/src/mame/drivers/novag6502.cpp index 9c38552d1db..46608a6230c 100644 --- a/src/mame/drivers/novag6502.cpp +++ b/src/mame/drivers/novag6502.cpp @@ -57,8 +57,6 @@ instead of magnet sensors. #include "bus/rs232/rs232.h" #include "machine/mos6551.h" #include "machine/nvram.h" -#include "sound/beep.h" -#include "video/hd44780.h" // internal artwork #include "novag_sexpert.lh" // clickable @@ -70,13 +68,9 @@ class novag6502_state : public novagbase_state { public: novag6502_state(const machine_config &mconfig, device_type type, const char *tag) - : novagbase_state(mconfig, type, tag), - m_lcd(*this, "hd44780") + : novagbase_state(mconfig, type, tag) { } - // devices/pointers - optional_device m_lcd; - TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); } TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); } @@ -93,8 +87,6 @@ public: DECLARE_WRITE8_MEMBER(sexpert_lcd_data_w); DECLARE_READ8_MEMBER(sexpert_input1_r); DECLARE_READ8_MEMBER(sexpert_input2_r); - DECLARE_PALETTE_INIT(sexpert); - HD44780_PIXEL_UPDATE(sexpert_pixel_update); DECLARE_MACHINE_RESET(sexpert); DECLARE_DRIVER_INIT(sexpert); DECLARE_INPUT_CHANGED_MEMBER(sexpert_cpu_freq); @@ -247,6 +239,29 @@ void novagbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, boo } +// LCD + +PALETTE_INIT_MEMBER(novagbase_state, novag_lcd) +{ + palette.set_pen_color(0, rgb_t(138, 146, 148)); // background + palette.set_pen_color(1, rgb_t(92, 83, 88)); // lcd pixel on + palette.set_pen_color(2, rgb_t(131, 136, 139)); // lcd pixel off +} + +HD44780_PIXEL_UPDATE(novagbase_state::novag_lcd_pixel_update) +{ + // char size is 5x8 + if (x > 4 || y > 7) + return; + + if (line < 2 && pos < 8) + { + // internal: (8+8)*1, external: 1*16 + bitmap.pix16(1 + y, 1 + line*8*6 + pos*6 + x) = state ? 1 : 2; + } +} + + // generic input handlers u16 novagbase_state::read_inputs(int columns) @@ -308,34 +323,14 @@ READ8_MEMBER(novag6502_state::supercon_input2_r) Super Expert ******************************************************************************/ -// LCD - -PALETTE_INIT_MEMBER(novag6502_state, sexpert) -{ - palette.set_pen_color(0, rgb_t(138, 146, 148)); // background - palette.set_pen_color(1, rgb_t(92, 83, 88)); // lcd pixel on - palette.set_pen_color(2, rgb_t(131, 136, 139)); // lcd pixel off -} - -HD44780_PIXEL_UPDATE(novag6502_state::sexpert_pixel_update) -{ - // char size is 5x8 - if (x > 4 || y > 7) - return; - - if (line < 2 && pos < 8) - { - // internal: (8+8)*1, external: 1*16 - bitmap.pix16(1 + y, 1 + line*8*6 + pos*6 + x) = state ? 1 : 2; - } -} +// TTL/generic WRITE8_MEMBER(novag6502_state::sexpert_lcd_control_w) { // d0: HD44780 RS // d1: HD44780 R/W // d2: HD44780 E - m_lcd_control = data; + m_lcd_control = data & 7; } WRITE8_MEMBER(novag6502_state::sexpert_lcd_data_w) @@ -345,8 +340,6 @@ WRITE8_MEMBER(novag6502_state::sexpert_lcd_data_w) m_lcd->write(space, m_lcd_control & 1, data); } -// TTL/generic - WRITE8_MEMBER(novag6502_state::sexpert_leds_w) { // d0-d7: chessboard leds @@ -825,11 +818,11 @@ static MACHINE_CONFIG_START( sexpert, novag6502_state ) MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 3) - MCFG_PALETTE_INIT_OWNER(novag6502_state, sexpert) + MCFG_PALETTE_INIT_OWNER(novagbase_state, novag_lcd) MCFG_HD44780_ADD("hd44780") MCFG_HD44780_LCD_SIZE(2, 8) - MCFG_HD44780_PIXEL_UPDATE_CB(novag6502_state, sexpert_pixel_update) + MCFG_HD44780_PIXEL_UPDATE_CB(novagbase_state, novag_lcd_pixel_update) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novagbase_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_novag_sexpert) diff --git a/src/mame/drivers/novag68k.cpp b/src/mame/drivers/novag68k.cpp index e76b6e79863..7319344d262 100644 --- a/src/mame/drivers/novag68k.cpp +++ b/src/mame/drivers/novag68k.cpp @@ -10,17 +10,24 @@ such as Arena(in editmode). TODO: - - x + - verify irq/beeper timing + - RS232 port ****************************************************************************** Diablo 68000: -- x +- M68000 @ 16MHz, IRQ ~256Hz +- 2*8KB RAM TC5565 battery-backed, 2*32KB hashtable RAM TC55257 3*32KB ROM +- HD44780 LCD controller (16x1) +- R65C51P2 ACIA @ 1.8432MHz, RS232 +- magnetic sensors, 8*8 chessboard leds ******************************************************************************/ #include "includes/novagbase.h" #include "cpu/m68000/m68000.h" +#include "machine/mos6551.h" +#include "machine/nvram.h" // internal artwork #include "novag_diablo68k.lh" // clickable @@ -33,9 +40,12 @@ public: : novagbase_state(mconfig, type, tag) { } - // devices/pointers - // Diablo 68000 + DECLARE_WRITE8_MEMBER(diablo68k_control_w); + DECLARE_WRITE8_MEMBER(diablo68k_lcd_data_w); + DECLARE_WRITE8_MEMBER(diablo68k_leds_w); + DECLARE_READ8_MEMBER(diablo68k_input1_r); + DECLARE_READ8_MEMBER(diablo68k_input2_r); }; @@ -46,6 +56,49 @@ public: Diablo 68000 ******************************************************************************/ +// TTL + +WRITE8_MEMBER(novag68k_state::diablo68k_control_w) +{ + // d1: HD44780 RS + // other: ? + m_lcd_control = data & 7; + + // d7: enable beeper + m_beeper->set_state(data >> 7 & 1); + + // d4-d6: input mux, led select + m_inp_mux = 1 << (data >> 4 & 0x7) & 0xff; + display_matrix(8, 8, m_led_data, m_inp_mux); + m_led_data = 0; // ? +} + +WRITE8_MEMBER(novag68k_state::diablo68k_lcd_data_w) +{ + // d0-d7: HD44780 data + m_lcd->write(space, m_lcd_control >> 1 & 1, data); +} + +WRITE8_MEMBER(novag68k_state::diablo68k_leds_w) +{ + // d0-d7: chessboard leds + m_led_data = data; +} + +READ8_MEMBER(novag68k_state::diablo68k_input1_r) +{ + // d0-d7: multiplexed inputs (chessboard squares) + return ~read_inputs(8) & 0xff; +} + +READ8_MEMBER(novag68k_state::diablo68k_input2_r) +{ + // d0-d2: multiplexed inputs (side panel) + // other: ? + return ~read_inputs(8) >> 8 & 7; +} + + /****************************************************************************** Address Maps @@ -54,8 +107,15 @@ public: // Diablo 68000 static ADDRESS_MAP_START( diablo68k_map, AS_PROGRAM, 16, novag68k_state ) - AM_RANGE( 0x000000, 0x00ffff ) AM_ROM - AM_RANGE( 0xff8000, 0xffffff ) AM_RAM + AM_RANGE(0x000000, 0x00ffff) AM_ROM + AM_RANGE(0x200000, 0x20ffff) AM_ROM AM_REGION("maincpu", 0x10000) + AM_RANGE(0x280000, 0x28ffff) AM_RAM + AM_RANGE(0x300000, 0x300007) AM_DEVREADWRITE8("acia", mos6551_device, read, write, 0xff00) + AM_RANGE(0x380000, 0x380001) AM_WRITE8(diablo68k_leds_w, 0xff00) AM_READNOP + AM_RANGE(0x3a0000, 0x3a0001) AM_WRITE8(diablo68k_lcd_data_w, 0xff00) + AM_RANGE(0x3c0000, 0x3c0001) AM_READWRITE8(diablo68k_input2_r, diablo68k_control_w, 0xff00) + AM_RANGE(0x3e0000, 0x3e0001) AM_READ8(diablo68k_input1_r, 0xff00) + AM_RANGE(0xff8000, 0xffbfff) AM_RAM AM_SHARE("nvram") ADDRESS_MAP_END @@ -200,16 +260,36 @@ INPUT_PORTS_END static MACHINE_CONFIG_START( diablo68k, novag68k_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M68000, XTAL_8MHz/2) - MCFG_CPU_PERIODIC_INT_DRIVER(novag68k_state, irq2_line_hold, 250) // guessed + MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) + MCFG_CPU_PERIODIC_INT_DRIVER(novag68k_state, irq2_line_hold, 256) // guessed MCFG_CPU_PROGRAM_MAP(diablo68k_map) + MCFG_DEVICE_ADD("acia", MOS6551, 0) + MCFG_MOS6551_XTAL(XTAL_1_8432MHz) + + MCFG_NVRAM_ADD_0FILL("nvram") + + /* video hardware */ + MCFG_SCREEN_ADD("screen", LCD) + MCFG_SCREEN_REFRESH_RATE(60) // arbitrary + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) + MCFG_SCREEN_SIZE(6*16+1, 10) + MCFG_SCREEN_VISIBLE_AREA(0, 6*16, 0, 10-1) + MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update) + MCFG_SCREEN_PALETTE("palette") + MCFG_PALETTE_ADD("palette", 3) + MCFG_PALETTE_INIT_OWNER(novagbase_state, novag_lcd) + + MCFG_HD44780_ADD("hd44780") + MCFG_HD44780_LCD_SIZE(2, 8) + MCFG_HD44780_PIXEL_UPDATE_CB(novagbase_state, novag_lcd_pixel_update) + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novagbase_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_novag_diablo68k) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("beeper", BEEP, 1000) // guessed + MCFG_SOUND_ADD("beeper", BEEP, 1024) // guessed MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MACHINE_CONFIG_END @@ -223,7 +303,7 @@ ROM_START( diablo68 ) ROM_REGION16_BE( 0x20000, "maincpu", 0 ) 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_LOAD16_BYTE("book.bin", 0x10000, 0x8000, CRC(553a5c8c) SHA1(ccb5460ff10766a5ca8008ae2cffcff794318108) ) // no odd rom ROM_END @@ -233,4 +313,4 @@ ROM_END ******************************************************************************/ /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */ -CONS( 1991, diablo68, 0, 0, diablo68k, diablo68k, driver_device, 0, "Novag", "Diablo 68000", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1991, diablo68, 0, 0, diablo68k, diablo68k, driver_device, 0, "Novag", "Diablo 68000", MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/includes/novagbase.h b/src/mame/includes/novagbase.h index 102956fa22c..9c575c10bea 100644 --- a/src/mame/includes/novagbase.h +++ b/src/mame/includes/novagbase.h @@ -8,6 +8,7 @@ #include "emu.h" #include "sound/beep.h" +#include "video/hd44780.h" class novagbase_state : public driver_device { @@ -16,6 +17,7 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_beeper(*this, "beeper"), + m_lcd(*this, "hd44780"), m_inp_matrix(*this, "IN.%u", 0), m_display_wait(33), m_display_maxy(1), @@ -25,6 +27,7 @@ public: // devices/pointers required_device m_maincpu; optional_device m_beeper; + optional_device m_lcd; optional_ioport_array<8> m_inp_matrix; // misc common @@ -51,6 +54,9 @@ public: void set_display_segmask(u32 digits, u32 mask); void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true); + DECLARE_PALETTE_INIT(novag_lcd); + HD44780_PIXEL_UPDATE(novag_lcd_pixel_update); + protected: virtual void machine_start() override; virtual void machine_reset() override; diff --git a/src/mame/layout/novag_diablo68k.lay b/src/mame/layout/novag_diablo68k.lay index dbbd38dab55..f56d9de4757 100644 --- a/src/mame/layout/novag_diablo68k.lay +++ b/src/mame/layout/novag_diablo68k.lay @@ -329,7 +329,7 @@ - +