Machine promoted to working

------------
Novag Diablo 68000 [hap]
This commit is contained in:
hap 2017-01-18 21:51:27 +01:00
parent 446532b332
commit c69c144013
4 changed files with 127 additions and 48 deletions

View File

@ -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<hd44780_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)

View File

@ -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 )

View File

@ -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<cpu_device> m_maincpu;
optional_device<beep_device> m_beeper;
optional_device<hd44780_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;

View File

@ -329,7 +329,7 @@
<bezel element="hl" inputtag="IN.0" inputmask="0x01"><bounds x="73" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
<!-- lcd panel -->
<!--
<screen index="0">
<bounds x="86.5" y="9.5" width="24.25" height="2.5" />
</screen>
@ -338,7 +338,7 @@
<bezel element="static_lcd"><bounds x="86" y="11.9" width="25.25" height="1.1" /></bezel>
<bezel element="static_lcd"><bounds x="86" y="8.5" width="0.6" height="3.5" /></bezel>
<bezel element="static_lcd"><bounds x="110.65" y="8.5" width="0.6" height="3.5" /></bezel>
-->
<!-- right side buttons -->
<bezel element="but" inputtag="IN.7" inputmask="0x400"><bounds x="87.75" y="24.00" width="2.5" height="2.5" /></bezel>