summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/odyssey2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/drivers/odyssey2.c')
-rw-r--r--src/mess/drivers/odyssey2.c67
1 files changed, 43 insertions, 24 deletions
diff --git a/src/mess/drivers/odyssey2.c b/src/mess/drivers/odyssey2.c
index 6adecd9e16d..b7fcf708f2a 100644
--- a/src/mess/drivers/odyssey2.c
+++ b/src/mess/drivers/odyssey2.c
@@ -7,6 +7,13 @@
Minor update to "the voice" rom names, and add comment about
the older revision of "the voice" - LN, 10/03/08
+ TODO:
+ - Reimplement the cartridge slot, and thus also the voice, as a slot device
+ - In case any more machines turn up using the i8245, reimplemnt it as a
+ real device.
+ - In case any more machines (TVs?) turn up using the EF9340 and/or EF9341,
+ reimplement as a real device.
+
***************************************************************************/
#include "emu.h"
@@ -15,31 +22,35 @@
#include "imagedev/cartslot.h"
#include "sound/sp0256.h"
+
static ADDRESS_MAP_START( odyssey2_mem , AS_PROGRAM, 8, odyssey2_state )
- AM_RANGE( 0x0000, 0x03FF) AM_ROM
- AM_RANGE( 0x0400, 0x0BFF) AM_RAMBANK("bank1")
- AM_RANGE( 0x0C00, 0x0FFF) AM_RAMBANK("bank2")
+ AM_RANGE(0x0000, 0x03FF) AM_ROM
+ AM_RANGE(0x0400, 0x0BFF) AM_RAMBANK("bank1")
+ AM_RANGE(0x0C00, 0x0FFF) AM_RAMBANK("bank2")
ADDRESS_MAP_END
+
static ADDRESS_MAP_START( odyssey2_io , AS_IO, 8, odyssey2_state )
- AM_RANGE( 0x00, 0xff) AM_READWRITE(odyssey2_bus_r, odyssey2_bus_w)
- AM_RANGE( MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(odyssey2_getp1, odyssey2_putp1 )
- AM_RANGE( MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(odyssey2_getp2, odyssey2_putp2 )
- AM_RANGE( MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READWRITE(odyssey2_getbus, odyssey2_putbus )
- AM_RANGE( MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(odyssey2_t0_r )
- AM_RANGE( MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(odyssey2_t1_r )
+ AM_RANGE(0x00, 0xff) AM_READWRITE(io_read, io_write)
+ AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(p1_read, p1_write)
+ AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(p2_read, p2_write)
+ AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READWRITE(bus_read, bus_write)
+ AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(t0_read)
+ AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(t1_read)
ADDRESS_MAP_END
+
static ADDRESS_MAP_START( g7400_io , AS_IO, 8, odyssey2_state )
- AM_RANGE( 0x00, 0xff) AM_READWRITE(g7400_bus_r, g7400_bus_w)
- AM_RANGE( MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(odyssey2_getp1, odyssey2_putp1 )
- AM_RANGE( MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(odyssey2_getp2, odyssey2_putp2 )
- AM_RANGE( MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READWRITE(odyssey2_getbus, odyssey2_putbus )
- AM_RANGE( MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(odyssey2_t0_r )
- AM_RANGE( MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(odyssey2_t1_r )
- //AM_RANGE( MCS_MCS48_PORT_PROG, MCS48_PORT_PROG ) //write to 8243 with low four bits from P2
+ AM_RANGE(0x00, 0xff) AM_READWRITE(g7400_io_read, g7400_io_write)
+ AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(p1_read, p1_write)
+ AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(p2_read, p2_write)
+ AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READWRITE(bus_read, bus_write)
+ AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(t0_read)
+ AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(t1_read)
+ //AM_RANGE(MCS48_PORT_PROG, MCS48_PORT_PROG) //write to 8243 with low four bits from P2
ADDRESS_MAP_END
+
static INPUT_PORTS_START( odyssey2 )
PORT_START("KEY0") /* IN0 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
@@ -118,6 +129,7 @@ static INPUT_PORTS_START( odyssey2 )
PORT_BIT( 0xe0, 0xe0, IPT_UNUSED )
INPUT_PORTS_END
+
static const gfx_layout odyssey2_graphicslayout =
{
8,1,
@@ -156,23 +168,27 @@ static const gfx_layout odyssey2_spritelayout =
1*8
};
+
static GFXDECODE_START( odyssey2 )
GFXDECODE_ENTRY( "gfx1", 0x0000, odyssey2_graphicslayout, 0, 2 )
GFXDECODE_ENTRY( "gfx1", 0x0000, odyssey2_spritelayout, 0, 2 )
GFXDECODE_END
+
static const sp0256_interface the_voice_sp0256 =
{
- DEVCB_LINE(odyssey2_the_voice_lrq_callback),
+ DEVCB_DRIVER_LINE_MEMBER(odyssey2_state,the_voice_lrq_callback),
DEVCB_NULL
};
+
static MACHINE_CONFIG_FRAGMENT( odyssey2_cartslot )
MCFG_CARTSLOT_ADD("cart")
MCFG_CARTSLOT_EXTENSION_LIST("bin,rom")
MCFG_CARTSLOT_NOT_MANDATORY
MACHINE_CONFIG_END
+
static MACHINE_CONFIG_START( odyssey2, odyssey2_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8048, ( ( XTAL_7_15909MHz * 3 ) / 4 ) )
@@ -180,7 +196,6 @@ static MACHINE_CONFIG_START( odyssey2, odyssey2_state )
MCFG_CPU_IO_MAP(odyssey2_io)
MCFG_QUANTUM_TIME(attotime::from_hz(60))
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS( XTAL_7_15909MHz/2, I824X_LINE_CLOCKS, I824X_START_ACTIVE_SCAN, I824X_END_ACTIVE_SCAN, 262, I824X_START_Y, I824X_START_Y + I824X_SCREEN_HEIGHT )
@@ -189,7 +204,6 @@ static MACHINE_CONFIG_START( odyssey2, odyssey2_state )
MCFG_GFXDECODE( odyssey2 )
MCFG_PALETTE_LENGTH(24)
-
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("custom", ODYSSEY2, XTAL_7_15909MHz/2)
@@ -203,6 +217,7 @@ static MACHINE_CONFIG_START( odyssey2, odyssey2_state )
MCFG_FRAGMENT_ADD(odyssey2_cartslot)
MACHINE_CONFIG_END
+
static MACHINE_CONFIG_START( videopac, odyssey2_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8048, ( XTAL_17_73447MHz / 3 ) )
@@ -210,7 +225,6 @@ static MACHINE_CONFIG_START( videopac, odyssey2_state )
MCFG_CPU_IO_MAP(odyssey2_io)
MCFG_QUANTUM_TIME(attotime::from_hz(60))
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS( XTAL_17_73447MHz/5, I824X_LINE_CLOCKS, I824X_START_ACTIVE_SCAN, I824X_END_ACTIVE_SCAN, 312, I824X_START_Y, I824X_START_Y + I824X_SCREEN_HEIGHT )
@@ -219,7 +233,6 @@ static MACHINE_CONFIG_START( videopac, odyssey2_state )
MCFG_GFXDECODE( odyssey2 )
MCFG_PALETTE_LENGTH(24)
-
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("custom", ODYSSEY2, XTAL_17_73447MHz/5)
@@ -232,6 +245,7 @@ static MACHINE_CONFIG_START( videopac, odyssey2_state )
MCFG_FRAGMENT_ADD(odyssey2_cartslot)
MACHINE_CONFIG_END
+
static MACHINE_CONFIG_START( g7400, odyssey2_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8048, XTAL_5_911MHz )
@@ -239,16 +253,16 @@ static MACHINE_CONFIG_START( g7400, odyssey2_state )
MCFG_CPU_IO_MAP(g7400_io)
MCFG_QUANTUM_TIME(attotime::from_hz(60))
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS( 3547000*2, 448, 96, 416, 312, 39, 289 ) /* EF9340 doubles the input clock into dot clocks internally */
+ MCFG_SCREEN_RAW_PARAMS( 3547000*2, 2*I824X_LINE_CLOCKS, 2*I824X_START_ACTIVE_SCAN, 2*I824X_END_ACTIVE_SCAN, 312, I824X_START_Y, I824X_START_Y + I824X_SCREEN_HEIGHT )
MCFG_SCREEN_UPDATE_DRIVER(odyssey2_state, screen_update_odyssey2)
+ MCFG_VIDEO_START_OVERRIDE(odyssey2_state,g7400)
+
MCFG_GFXDECODE( odyssey2 )
MCFG_PALETTE_LENGTH(24)
-
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("custom", ODYSSEY2, 3547000)
@@ -257,6 +271,7 @@ static MACHINE_CONFIG_START( g7400, odyssey2_state )
MCFG_FRAGMENT_ADD(odyssey2_cartslot)
MACHINE_CONFIG_END
+
ROM_START (odyssey2)
ROM_REGION(0x10000,"maincpu",0) /* safer for the memory handler/bankswitching??? */
ROM_LOAD ("o2bios.rom", 0x0000, 0x0400, CRC(8016a315) SHA1(b2e1955d957a475de2411770452eff4ea19f4cee))
@@ -283,6 +298,7 @@ ROM_START (odyssey2)
ROM_LOAD( "spr128-004.bin", 0x8000, 0x4000, CRC(e79dfb75) SHA1(37f33d79ffd1739d7c2f226b010a1eac28d74ca0) )
ROM_END
+
ROM_START (videopac)
ROM_REGION(0x10000,"maincpu",0) /* safer for the memory handler/bankswitching??? */
ROM_SYSTEM_BIOS( 0, "g7000", "g7000" )
@@ -303,6 +319,7 @@ ROM_START (videopac)
ROM_LOAD( "spr128-004.bin", 0x8000, 0x4000, CRC(e79dfb75) SHA1(37f33d79ffd1739d7c2f226b010a1eac28d74ca0) )
ROM_END
+
ROM_START (g7400)
ROM_REGION(0x10000,"maincpu",0) /* safer for the memory handler/bankswitching??? */
ROM_LOAD ("g7400.bin", 0x0000, 0x0400, CRC(e20a9f41) SHA1(5130243429b40b01a14e1304d0394b8459a6fbae))
@@ -312,6 +329,7 @@ ROM_START (g7400)
ROM_CART_LOAD("cart", 0x0000, 0x4000, ROM_MIRROR)
ROM_END
+
ROM_START (jopac)
ROM_REGION(0x10000,"maincpu",0) /* safer for the memory handler/bankswitching??? */
ROM_LOAD ("jopac.bin", 0x0000, 0x0400, CRC(11647ca5) SHA1(54b8d2c1317628de51a85fc1c424423a986775e4))
@@ -321,6 +339,7 @@ ROM_START (jopac)
ROM_CART_LOAD("cart", 0x0000, 0x4000, ROM_MIRROR)
ROM_END
+
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
COMP( 1978, odyssey2, 0, 0, odyssey2, odyssey2, odyssey2_state, odyssey2, "Magnavox", "Odyssey 2", 0 )
COMP( 1979, videopac, odyssey2, 0, videopac, odyssey2, odyssey2_state, odyssey2, "Philips", "Videopac G7000/C52", 0 )