summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/novag68k.cpp
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2017-01-18 21:51:27 +0100
committer hap <happppp@users.noreply.github.com>2017-01-18 21:51:46 +0100
commitc69c1440133e5bcfbe8d9aed3ec1ce23ed8a5a44 (patch)
tree42bd45d2dc36a24069d2cf43f34864784bd3ee7c /src/mame/drivers/novag68k.cpp
parent446532b332e7c41d9c8d51d77041e82302b7eb0e (diff)
Machine promoted to working
------------ Novag Diablo 68000 [hap]
Diffstat (limited to 'src/mame/drivers/novag68k.cpp')
-rw-r--r--src/mame/drivers/novag68k.cpp102
1 files changed, 91 insertions, 11 deletions
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 )