summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2018-02-20 20:21:21 +1100
committer Vas Crabb <vas@vastheman.com>2018-02-20 20:21:21 +1100
commit66f5c175ef568942f3bf9e0831b690c8d3a1e109 (patch)
treee0be7b6cc2264735273941621777e007a0e83b6c
parent724db00c5c1eeceda51a94a3eb0907f016b5f96b (diff)
even more encapsulation/cleanup (nw)
-rw-r--r--src/mame/drivers/cyberbal.cpp84
-rw-r--r--src/mame/drivers/unico.cpp89
-rw-r--r--src/mame/drivers/vectrex.cpp53
-rw-r--r--src/mame/includes/cyberbal.h164
-rw-r--r--src/mame/includes/unico.h116
-rw-r--r--src/mame/includes/vectrex.h155
-rw-r--r--src/mame/machine/vectrex.cpp74
-rw-r--r--src/mame/video/cyberbal.cpp166
-rw-r--r--src/mame/video/unico.cpp4
-rw-r--r--src/mame/video/vectrex.cpp58
10 files changed, 521 insertions, 442 deletions
diff --git a/src/mame/drivers/cyberbal.cpp b/src/mame/drivers/cyberbal.cpp
index 34a404c5a21..ced3401ec8b 100644
--- a/src/mame/drivers/cyberbal.cpp
+++ b/src/mame/drivers/cyberbal.cpp
@@ -38,24 +38,22 @@
*
*************************************/
+void cyberbal2p_state::update_interrupts()
+{
+ m_maincpu->set_input_line(1, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(3, m_sound_int_state ? ASSERT_LINE : CLEAR_LINE);
+}
+
void cyberbal_state::update_interrupts()
{
- if (m_extracpu != nullptr)
- {
- m_maincpu->set_input_line(1, m_sound_int_state ? ASSERT_LINE : CLEAR_LINE);
- m_extracpu->set_input_line(1, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
- }
- else
- {
- m_maincpu->set_input_line(1, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
- m_maincpu->set_input_line(3, m_sound_int_state ? ASSERT_LINE : CLEAR_LINE);
- }
+ m_maincpu->set_input_line(1, m_sound_int_state ? ASSERT_LINE : CLEAR_LINE);
+ m_extracpu->set_input_line(1, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
}
-MACHINE_START_MEMBER(cyberbal_state,cyberbal2p)
+void cyberbal_state::machine_start()
{
- atarigen_state::machine_start();
+ cyberbal_base_state::machine_start();
save_item(NAME(m_fast_68k_int));
save_item(NAME(m_io_68k_int));
@@ -63,19 +61,15 @@ MACHINE_START_MEMBER(cyberbal_state,cyberbal2p)
save_item(NAME(m_sound_data_from_6502));
save_item(NAME(m_sound_data_from_68k_ready));
save_item(NAME(m_sound_data_from_6502_ready));
-}
-
-MACHINE_START_MEMBER(cyberbal_state,cyberbal)
-{
- MACHINE_START_CALL_MEMBER(cyberbal2p);
membank("soundbank")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x1000);
}
-MACHINE_RESET_MEMBER(cyberbal_state,cyberbal)
+void cyberbal_state::machine_reset()
{
- atarigen_state::machine_reset();
+
+ cyberbal_base_state::machine_reset();
scanline_timer_reset(*m_lscreen, 8);
cyberbal_sound_reset();
@@ -85,9 +79,9 @@ MACHINE_RESET_MEMBER(cyberbal_state,cyberbal)
}
-MACHINE_RESET_MEMBER(cyberbal_state,cyberbal2p)
+void cyberbal2p_state::machine_reset()
{
- atarigen_state::machine_reset();
+ cyberbal_base_state::machine_reset();
scanline_timer_reset(*m_screen, 8);
}
@@ -99,7 +93,7 @@ MACHINE_RESET_MEMBER(cyberbal_state,cyberbal2p)
*
*************************************/
-READ16_MEMBER(cyberbal_state::sound_state_r)
+READ16_MEMBER(cyberbal2p_state::sound_state_r)
{
int temp = 0xffff;
if (m_jsa->main_to_sound_ready()) temp ^= 0xffff;
@@ -227,7 +221,7 @@ ADDRESS_MAP_END
*
*************************************/
-ADDRESS_MAP_START(cyberbal_state::cyberbal2p_map)
+ADDRESS_MAP_START(cyberbal2p_state::cyberbal2p_map)
AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0xfc0000, 0xfc0003) AM_READ_PORT("IN0")
AM_RANGE(0xfc2000, 0xfc2003) AM_READ_PORT("IN1")
@@ -415,9 +409,6 @@ MACHINE_CONFIG_START(cyberbal_state::cyberbal)
MCFG_QUANTUM_TIME(attotime::from_hz(600))
- MCFG_MACHINE_START_OVERRIDE(cyberbal_state,cyberbal)
- MCFG_MACHINE_RESET_OVERRIDE(cyberbal_state,cyberbal)
-
MCFG_EEPROM_2804_ADD("eeprom")
MCFG_EEPROM_28XX_LOCK_AFTER_WRITE(true)
@@ -457,8 +448,6 @@ MACHINE_CONFIG_START(cyberbal_state::cyberbal)
MCFG_SCREEN_UPDATE_DRIVER(cyberbal_state, screen_update_cyberbal_right)
MCFG_SCREEN_PALETTE("rpalette")
- MCFG_VIDEO_START_OVERRIDE(cyberbal_state,cyberbal)
-
/* sound hardware */
MCFG_ATARI_SOUND_COMM_ADD("soundcomm", "audiocpu", WRITELINE(cyberbal_state, sound_int_write_line))
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
@@ -486,15 +475,12 @@ MACHINE_CONFIG_START(cyberbal_state::cyberbalt)
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(cyberbal_state::cyberbal2p)
+MACHINE_CONFIG_START(cyberbal2p_state::cyberbal2p)
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
MCFG_CPU_PROGRAM_MAP(cyberbal2p_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cyberbal_state, video_int_gen)
-
- MCFG_MACHINE_START_OVERRIDE(cyberbal_state,cyberbal2p)
- MCFG_MACHINE_RESET_OVERRIDE(cyberbal_state,cyberbal2p)
+ MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cyberbal2p_state, video_int_gen)
MCFG_EEPROM_2816_ADD("eeprom")
MCFG_EEPROM_28XX_LOCK_AFTER_WRITE(true)
@@ -506,9 +492,9 @@ MACHINE_CONFIG_START(cyberbal_state::cyberbal2p)
MCFG_PALETTE_ADD("palette", 2048)
MCFG_PALETTE_FORMAT(IRRRRRGGGGGBBBBB)
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, cyberbal_state, get_playfield_tile_info, 16,8, SCAN_ROWS, 64,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, cyberbal_state, get_alpha_tile_info, 16,8, SCAN_ROWS, 64,32, 0)
- MCFG_ATARI_MOTION_OBJECTS_ADD("mob", "screen", cyberbal_state::s_mob_config)
+ MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, cyberbal2p_state, get_playfield_tile_info, 16,8, SCAN_ROWS, 64,64)
+ MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, cyberbal2p_state, get_alpha_tile_info, 16,8, SCAN_ROWS, 64,32, 0)
+ MCFG_ATARI_MOTION_OBJECTS_ADD("mob", "screen", cyberbal2p_state::s_mob_config)
MCFG_ATARI_MOTION_OBJECTS_GFXDECODE("gfxdecode")
MCFG_SCREEN_ADD("screen", RASTER)
@@ -516,15 +502,13 @@ MACHINE_CONFIG_START(cyberbal_state::cyberbal2p)
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS-2 chip to generate video signals */
MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz, 456*2, 0, 336*2, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(cyberbal_state, screen_update_cyberbal2p)
+ MCFG_SCREEN_UPDATE_DRIVER(cyberbal2p_state, screen_update_cyberbal2p)
MCFG_SCREEN_PALETTE("palette")
- MCFG_VIDEO_START_OVERRIDE(cyberbal_state,cyberbal2p)
-
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_ATARI_JSA_II_ADD("jsa", WRITELINE(cyberbal_state, sound_int_write_line))
+ MCFG_ATARI_JSA_II_ADD("jsa", WRITELINE(cyberbal2p_state, sound_int_write_line))
MCFG_ATARI_JSA_TEST_PORT("IN2", 15)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
@@ -1074,15 +1058,15 @@ DRIVER_INIT_MEMBER(cyberbal_state,cyberbalt)
*
*************************************/
-GAMEL(1988, cyberbal, 0, cyberbal, cyberbal, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball (rev 4)", 0, layout_dualhsxs )
-GAMEL(1988, cyberbal2, cyberbal, cyberbal, cyberbal, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball (rev 2)", 0, layout_dualhsxs )
-GAMEL(1988, cyberbal1, cyberbal, cyberbal, cyberbal, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball (rev 1)", 0, layout_dualhsxs )
-GAMEL(1988, cyberbalp, cyberbal, cyberbal, cyberbal, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball (prototype)", 0, layout_dualhsxs )
+GAMEL(1988, cyberbal, 0, cyberbal, cyberbal, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball (rev 4)", 0, layout_dualhsxs )
+GAMEL(1988, cyberbal2, cyberbal, cyberbal, cyberbal, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball (rev 2)", 0, layout_dualhsxs )
+GAMEL(1988, cyberbal1, cyberbal, cyberbal, cyberbal, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball (rev 1)", 0, layout_dualhsxs )
+GAMEL(1988, cyberbalp, cyberbal, cyberbal, cyberbal, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball (prototype)", 0, layout_dualhsxs )
-GAME( 1989, cyberbal2p, cyberbal, cyberbal2p, cyberbal2p, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball 2072 (2 player, rev 4)", 0 )
-GAME( 1989, cyberbal2p3, cyberbal, cyberbal2p, cyberbal2p, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball 2072 (2 player, rev 3)", 0 )
-GAME( 1989, cyberbal2p2, cyberbal, cyberbal2p, cyberbal2p, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball 2072 (2 player, rev 2)", 0 )
-GAME( 1989, cyberbal2p1, cyberbal, cyberbal2p, cyberbal2p, cyberbal_state, 0, ROT0, "Atari Games", "Cyberball 2072 (2 player, rev 1)", 0 )
+GAME( 1989, cyberbal2p, cyberbal, cyberbal2p, cyberbal2p, cyberbal2p_state, 0, ROT0, "Atari Games", "Cyberball 2072 (2 player, rev 4)", 0 )
+GAME( 1989, cyberbal2p3, cyberbal, cyberbal2p, cyberbal2p, cyberbal2p_state, 0, ROT0, "Atari Games", "Cyberball 2072 (2 player, rev 3)", 0 )
+GAME( 1989, cyberbal2p2, cyberbal, cyberbal2p, cyberbal2p, cyberbal2p_state, 0, ROT0, "Atari Games", "Cyberball 2072 (2 player, rev 2)", 0 )
+GAME( 1989, cyberbal2p1, cyberbal, cyberbal2p, cyberbal2p, cyberbal2p_state, 0, ROT0, "Atari Games", "Cyberball 2072 (2 player, rev 1)", 0 )
-GAMEL(1989, cyberbalt, cyberbal, cyberbalt, cyberbal, cyberbal_state, cyberbalt, ROT0, "Atari Games", "Tournament Cyberball 2072 (rev 2)", 0, layout_dualhsxs )
-GAMEL(1989, cyberbalt1, cyberbal, cyberbalt, cyberbal, cyberbal_state, cyberbalt, ROT0, "Atari Games", "Tournament Cyberball 2072 (rev 1)", 0, layout_dualhsxs )
+GAMEL(1989, cyberbalt, cyberbal, cyberbalt, cyberbal, cyberbal_state, cyberbalt, ROT0, "Atari Games", "Tournament Cyberball 2072 (rev 2)", 0, layout_dualhsxs )
+GAMEL(1989, cyberbalt1, cyberbal, cyberbalt, cyberbal, cyberbal_state, cyberbalt, ROT0, "Atari Games", "Tournament Cyberball 2072 (rev 1)", 0, layout_dualhsxs )
diff --git a/src/mame/drivers/unico.cpp b/src/mame/drivers/unico.cpp
index c7c8a71e735..2ab3a68e4a5 100644
--- a/src/mame/drivers/unico.cpp
+++ b/src/mame/drivers/unico.cpp
@@ -82,7 +82,7 @@ ADDRESS_MAP_END
Zero Point
***************************************************************************/
-WRITE16_MEMBER(unico_state::zeropnt_sound_bank_w)
+WRITE16_MEMBER(zeropnt_state::zeropnt_sound_bank_w)
{
if (ACCESSING_BITS_8_15)
{
@@ -101,9 +101,9 @@ WRITE16_MEMBER(unico_state::zeropnt_sound_bank_w)
}
/* Light Gun - need to wiggle the input slightly otherwise fire doesn't work */
-READ16_MEMBER(unico_state::unico_gunx_0_msb_r)
+READ16_MEMBER(zeropnt_state::unico_gunx_0_msb_r)
{
- int x=ioport("X0")->read();
+ int x=m_gun_axes[X0]->read();
x=x*384/256; /* On screen pixel X */
if (x<0x160) x=0x30 + (x*0xd0/0x15f);
@@ -112,18 +112,18 @@ READ16_MEMBER(unico_state::unico_gunx_0_msb_r)
return ((x&0xff) ^ (m_screen->frame_number()&1))<<8;
}
-READ16_MEMBER(unico_state::unico_guny_0_msb_r)
+READ16_MEMBER(zeropnt_state::unico_guny_0_msb_r)
{
- int y=ioport("Y0")->read();
+ int y=m_gun_axes[Y0]->read();
y=0x18+((y*0xe0)/0xff);
return ((y&0xff) ^ (m_screen->frame_number()&1))<<8;
}
-READ16_MEMBER(unico_state::unico_gunx_1_msb_r)
+READ16_MEMBER(zeropnt_state::unico_gunx_1_msb_r)
{
- int x=ioport("X1")->read();
+ int x=m_gun_axes[X1]->read();
x=x*384/256; /* On screen pixel X */
if (x<0x160) x=0x30 + (x*0xd0/0x15f);
@@ -132,16 +132,16 @@ READ16_MEMBER(unico_state::unico_gunx_1_msb_r)
return ((x&0xff) ^ (m_screen->frame_number()&1))<<8;
}
-READ16_MEMBER(unico_state::unico_guny_1_msb_r)
+READ16_MEMBER(zeropnt_state::unico_guny_1_msb_r)
{
- int y=ioport("Y1")->read();
+ int y=m_gun_axes[Y1]->read();
y=0x18+((y*0xe0)/0xff);
return ((y&0xff) ^ (m_screen->frame_number()&1))<<8;
}
-ADDRESS_MAP_START(unico_state::zeropnt_map)
+ADDRESS_MAP_START(zeropnt_state::zeropnt_map)
AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM
AM_RANGE(0xef0000, 0xefffff) AM_RAM // RAM
AM_RANGE(0x800030, 0x800031) AM_WRITENOP // ? 0
@@ -169,12 +169,12 @@ ADDRESS_MAP_END
Zero Point 2
***************************************************************************/
-READ32_MEMBER(unico_state::zeropnt2_gunx_0_msb_r){ return (unico_gunx_0_msb_r(space,0,0xffff)-0x0800) << 16; }
-READ32_MEMBER(unico_state::zeropnt2_guny_0_msb_r){ return (unico_guny_0_msb_r(space,0,0xffff)+0x0800) << 16; }
-READ32_MEMBER(unico_state::zeropnt2_gunx_1_msb_r){ return (unico_gunx_1_msb_r(space,0,0xffff)-0x0800) << 16; }
-READ32_MEMBER(unico_state::zeropnt2_guny_1_msb_r){ return (unico_guny_1_msb_r(space,0,0xffff)+0x0800) << 16; }
+READ32_MEMBER(zeropnt2_state::zeropnt2_gunx_0_msb_r) { return (unico_gunx_0_msb_r(space,0,0xffff)-0x0800) << 16; }
+READ32_MEMBER(zeropnt2_state::zeropnt2_guny_0_msb_r) { return (unico_guny_0_msb_r(space,0,0xffff)+0x0800) << 16; }
+READ32_MEMBER(zeropnt2_state::zeropnt2_gunx_1_msb_r) { return (unico_gunx_1_msb_r(space,0,0xffff)-0x0800) << 16; }
+READ32_MEMBER(zeropnt2_state::zeropnt2_guny_1_msb_r) { return (unico_guny_1_msb_r(space,0,0xffff)+0x0800) << 16; }
-WRITE32_MEMBER(unico_state::zeropnt2_sound_bank_w)
+WRITE32_MEMBER(zeropnt2_state::zeropnt2_sound_bank_w)
{
if (ACCESSING_BITS_24_31)
{
@@ -185,7 +185,7 @@ WRITE32_MEMBER(unico_state::zeropnt2_sound_bank_w)
}
}
-WRITE32_MEMBER(unico_state::zeropnt2_leds_w)
+WRITE32_MEMBER(zeropnt2_state::zeropnt2_leds_w)
{
if (ACCESSING_BITS_16_23)
{
@@ -195,7 +195,7 @@ WRITE32_MEMBER(unico_state::zeropnt2_leds_w)
}
}
-WRITE32_MEMBER(unico_state::zeropnt2_eeprom_w)
+WRITE32_MEMBER(zeropnt2_state::zeropnt2_eeprom_w)
{
if (data & ~0xfe00000)
logerror("%s - Unknown EEPROM bit written %04X\n",machine().describe_context(),data);
@@ -213,7 +213,7 @@ WRITE32_MEMBER(unico_state::zeropnt2_eeprom_w)
}
}
-ADDRESS_MAP_START(unico_state::zeropnt2_map)
+ADDRESS_MAP_START(zeropnt2_state::zeropnt2_map)
AM_RANGE(0x000000, 0x1fffff) AM_ROM // ROM
AM_RANGE(0x800018, 0x80001b) AM_READ_PORT("SYSTEM")
AM_RANGE(0x800024, 0x800027) AM_DEVREADWRITE8("oki1", okim6295_device, read, write, 0x00ff0000) // Sound
@@ -561,10 +561,6 @@ GFXDECODE_END
***************************************************************************/
-MACHINE_RESET_MEMBER(unico_state,unico)
-{
-}
-
/***************************************************************************
Burglar X
@@ -573,12 +569,10 @@ MACHINE_RESET_MEMBER(unico_state,unico)
MACHINE_CONFIG_START(unico_state::burglarx)
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68000, XTAL(32'000'000)/2) /* 16MHz */
+ MCFG_CPU_ADD("maincpu", M68000, 32_MHz_XTAL/2) /* 16MHz */
MCFG_CPU_PROGRAM_MAP(burglarx_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", unico_state, irq2_line_hold)
- MCFG_MACHINE_RESET_OVERRIDE(unico_state,unico)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@@ -591,8 +585,6 @@ MACHINE_CONFIG_START(unico_state::burglarx)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", unico)
MCFG_PALETTE_ADD("palette", 8192)
- MCFG_VIDEO_START_OVERRIDE(unico_state,unico)
-
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
@@ -600,7 +592,7 @@ MACHINE_CONFIG_START(unico_state::burglarx)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
- MCFG_OKIM6295_ADD("oki", XTAL(32'000'000)/32, PIN7_HIGH) // clock frequency & pin 7 not verified
+ MCFG_OKIM6295_ADD("oki", 32_MHz_XTAL/32, PIN7_HIGH) // clock frequency & pin 7 not verified
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
MACHINE_CONFIG_END
@@ -611,34 +603,25 @@ MACHINE_CONFIG_END
Zero Point
***************************************************************************/
-MACHINE_RESET_MEMBER(unico_state,zeropt)
-{
- MACHINE_RESET_CALL_MEMBER(unico);
-}
-
-MACHINE_CONFIG_START(unico_state::zeropnt)
+MACHINE_CONFIG_START(zeropnt_state::zeropnt)
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68000, XTAL(32'000'000)/2) /* 16MHz */
+ MCFG_CPU_ADD("maincpu", M68000, 32_MHz_XTAL/2) /* 16MHz */
MCFG_CPU_PROGRAM_MAP(zeropnt_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", unico_state, irq2_line_hold)
- MCFG_MACHINE_RESET_OVERRIDE(unico_state,zeropt)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(384, 224)
MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 224-1)
- MCFG_SCREEN_UPDATE_DRIVER(unico_state, screen_update_unico)
+ MCFG_SCREEN_UPDATE_DRIVER(zeropnt_state, screen_update_unico)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", unico)
MCFG_PALETTE_ADD("palette", 8192)
- MCFG_VIDEO_START_OVERRIDE(unico_state,unico)
-
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
@@ -646,7 +629,7 @@ MACHINE_CONFIG_START(unico_state::zeropnt)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
- MCFG_OKIM6295_ADD("oki", XTAL(32'000'000)/32, PIN7_HIGH) // clock frequency & pin 7 not verified
+ MCFG_OKIM6295_ADD("oki", 32_MHz_XTAL/32, PIN7_HIGH) // clock frequency & pin 7 not verified
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
MACHINE_CONFIG_END
@@ -657,14 +640,12 @@ MACHINE_CONFIG_END
Zero Point 2
***************************************************************************/
-MACHINE_CONFIG_START(unico_state::zeropnt2)
+MACHINE_CONFIG_START(zeropnt2_state::zeropnt2)
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68EC020, XTAL(32'000'000)/2) /* 16MHz */
+ MCFG_CPU_ADD("maincpu", M68EC020, 32_MHz_XTAL/2) /* 16MHz */
MCFG_CPU_PROGRAM_MAP(zeropnt2_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", unico_state, irq2_line_hold)
-
- MCFG_MACHINE_RESET_OVERRIDE(unico_state,zeropt)
+ MCFG_CPU_VBLANK_INT_DRIVER("screen", unico_state, irq2_line_hold)
MCFG_EEPROM_SERIAL_93C46_8BIT_ADD("eeprom")
@@ -674,14 +655,12 @@ MACHINE_CONFIG_START(unico_state::zeropnt2)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(384, 224)
MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 224-1)
- MCFG_SCREEN_UPDATE_DRIVER(unico_state, screen_update_unico)
+ MCFG_SCREEN_UPDATE_DRIVER(zeropnt2_state, screen_update_unico)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", unico)
MCFG_PALETTE_ADD("palette", 8192)
- MCFG_VIDEO_START_OVERRIDE(unico_state,unico)
-
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
@@ -689,7 +668,7 @@ MACHINE_CONFIG_START(unico_state::zeropnt2)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.70)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.70)
- MCFG_OKIM6295_ADD("oki1", XTAL(32'000'000)/32, PIN7_HIGH) // clock frequency & pin 7 not verified
+ MCFG_OKIM6295_ADD("oki1", 32_MHz_XTAL/32, PIN7_HIGH) // clock frequency & pin 7 not verified
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
@@ -1050,8 +1029,8 @@ ROM_END
***************************************************************************/
-GAME( 1997, burglarx, 0, burglarx, burglarx, unico_state, 0, ROT0, "Unico", "Burglar X" , 0 )
-GAME( 1998, zeropnt, 0, zeropnt, zeropnt, unico_state, 0, ROT0, "Unico", "Zero Point (set 1)", 0 )
-GAME( 1998, zeropnta, zeropnt, zeropnt, zeropnt, unico_state, 0, ROT0, "Unico", "Zero Point (set 2)", 0 )
-GAME( 1998, zeropntj, zeropnt, zeropnt, zeropnt, unico_state, 0, ROT0, "Unico", "Zero Point (Japan)", 0 )
-GAME( 1999, zeropnt2, 0, zeropnt2, zeropnt2, unico_state, 0, ROT0, "Unico", "Zero Point 2", 0 )
+GAME( 1997, burglarx, 0, burglarx, burglarx, unico_state, 0, ROT0, "Unico", "Burglar X" , 0 )
+GAME( 1998, zeropnt, 0, zeropnt, zeropnt, zeropnt_state, 0, ROT0, "Unico", "Zero Point (set 1)", 0 )
+GAME( 1998, zeropnta, zeropnt, zeropnt, zeropnt, zeropnt_state, 0, ROT0, "Unico", "Zero Point (set 2)", 0 )
+GAME( 1998, zeropntj, zeropnt, zeropnt, zeropnt, zeropnt_state, 0, ROT0, "Unico", "Zero Point (Japan)", 0 )
+GAME( 1999, zeropnt2, 0, zeropnt2, zeropnt2, zeropnt2_state, 0, ROT0, "Unico", "Zero Point 2", 0 )
diff --git a/src/mame/drivers/vectrex.cpp b/src/mame/drivers/vectrex.cpp
index e959fd469ab..2da98c59f89 100644
--- a/src/mame/drivers/vectrex.cpp
+++ b/src/mame/drivers/vectrex.cpp
@@ -95,10 +95,9 @@ static SLOT_INTERFACE_START(vectrex_cart)
SLOT_INTERFACE_INTERNAL("vec_sram", VECTREX_ROM_SRAM)
SLOT_INTERFACE_END
-MACHINE_CONFIG_START(vectrex_state::vectrex)
+MACHINE_CONFIG_START(vectrex_base_state::vectrex_base)
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", MC6809, XTAL(6'000'000)) // 68A09
- MCFG_CPU_PROGRAM_MAP(vectrex_map)
+ MCFG_CPU_ADD("maincpu", MC6809, 6_MHz_XTAL) // 68A09
/* video hardware */
MCFG_VECTOR_ADD("vector")
@@ -106,7 +105,7 @@ MACHINE_CONFIG_START(vectrex_state::vectrex)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_SIZE(400, 300)
MCFG_SCREEN_VISIBLE_AREA(0, 399, 0, 299)
- MCFG_SCREEN_UPDATE_DRIVER(vectrex_state, screen_update_vectrex)
+ MCFG_SCREEN_UPDATE_DRIVER(vectrex_base_state, screen_update_vectrex)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("speaker")
@@ -114,20 +113,27 @@ MACHINE_CONFIG_START(vectrex_state::vectrex)
MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ADD("ay8912", AY8912, XTAL(6'000'000) / 4)
+ MCFG_SOUND_ADD("ay8912", AY8912, 6_MHz_XTAL / 4)
MCFG_AY8910_PORT_A_READ_CB(IOPORT("BUTTONS"))
- MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(vectrex_state, vectrex_psg_port_w))
+ MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(vectrex_base_state, vectrex_psg_port_w))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.2)
/* via */
- MCFG_DEVICE_ADD("via6522_0", VIA6522, XTAL(6'000'000) / 4)
- MCFG_VIA6522_READPA_HANDLER(READ8(vectrex_state, vectrex_via_pa_r))
- MCFG_VIA6522_READPB_HANDLER(READ8(vectrex_state, vectrex_via_pb_r))
- MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(vectrex_state, v_via_pa_w))
- MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(vectrex_state, v_via_pb_w))
- MCFG_VIA6522_CA2_HANDLER(WRITELINE(vectrex_state, v_via_ca2_w))
- MCFG_VIA6522_CB2_HANDLER(WRITELINE(vectrex_state, v_via_cb2_w))
- MCFG_VIA6522_IRQ_HANDLER(WRITELINE(vectrex_state, vectrex_via_irq))
+ MCFG_DEVICE_ADD("via6522_0", VIA6522, 6_MHz_XTAL / 4)
+ MCFG_VIA6522_READPA_HANDLER(READ8(vectrex_base_state, vectrex_via_pa_r))
+ MCFG_VIA6522_READPB_HANDLER(READ8(vectrex_base_state, vectrex_via_pb_r))
+ MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(vectrex_base_state, v_via_pa_w))
+ MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(vectrex_base_state, v_via_pb_w))
+ MCFG_VIA6522_CA2_HANDLER(WRITELINE(vectrex_base_state, v_via_ca2_w))
+ MCFG_VIA6522_CB2_HANDLER(WRITELINE(vectrex_base_state, v_via_cb2_w))
+ MCFG_VIA6522_IRQ_HANDLER(WRITELINE(vectrex_base_state, vectrex_via_irq))
+MACHINE_CONFIG_END
+
+MACHINE_CONFIG_START(vectrex_state::vectrex)
+ vectrex_base(config);
+
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(vectrex_map)
/* cartridge */
MCFG_VECTREX_CARTRIDGE_ADD("cartslot", vectrex_cart, nullptr)
@@ -187,7 +193,7 @@ ROM_END
*****************************************************************/
-ADDRESS_MAP_START(vectrex_state::raaspec_map)
+ADDRESS_MAP_START(raaspec_state::raaspec_map)
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM AM_SHARE("nvram")
AM_RANGE(0xa000, 0xa000) AM_WRITE(raaspec_led_w)
@@ -215,19 +221,16 @@ static INPUT_PORTS_START(raaspec)
INPUT_PORTS_END
-MACHINE_CONFIG_START(vectrex_state::raaspec)
- vectrex(config);
+MACHINE_CONFIG_START(raaspec_state::raaspec)
+ vectrex_base(config);
+
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(raaspec_map)
MCFG_NVRAM_ADD_0FILL("nvram")
- MCFG_VIDEO_START_OVERRIDE(vectrex_state,raaspec)
-
/* via */
MCFG_DEVICE_MODIFY("via6522_0")
- MCFG_VIA6522_READPB_HANDLER(READ8(vectrex_state, vectrex_s1_via_pb_r))
-
- MCFG_DEVICE_REMOVE("cartslot")
+ MCFG_VIA6522_READPB_HANDLER(READ8(raaspec_state, vectrex_s1_via_pb_r))
MACHINE_CONFIG_END
ROM_START(raaspec)
@@ -242,7 +245,7 @@ ROM_END
***************************************************************************/
-// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT MONITOR COMPANY FULLNAME
-CONS(1982, vectrex, 0, 0, vectrex, vectrex, vectrex_state, vectrex, "General Consumer Electronics", "Vectrex" , ROT270)
+// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT MONITOR COMPANY FULLNAME
+CONS(1982, vectrex, 0, 0, vectrex, vectrex, vectrex_state, 0, "General Consumer Electronics", "Vectrex" , ROT270)
-GAME(1984, raaspec, 0, raaspec, raaspec, vectrex_state, vectrex, ROT270, "Roy Abel & Associates", "Spectrum I+", MACHINE_NOT_WORKING ) //TODO: button labels & timings, a mandatory artwork too?
+GAME(1984, raaspec, 0, raaspec, raaspec, raaspec_state, 0, ROT270, "Roy Abel & Associates", "Spectrum I+", MACHINE_NOT_WORKING ) //TODO: button labels & timings, a mandatory artwork too?
diff --git a/src/mame/includes/cyberbal.h b/src/mame/includes/cyberbal.h
index a9b45cbe193..4631b9c6f72 100644
--- a/src/mame/includes/cyberbal.h
+++ b/src/mame/includes/cyberbal.h
@@ -19,11 +19,71 @@
#include "sound/ym2151.h"
#include "screen.h"
-class cyberbal_state : public atarigen_state
+class cyberbal_base_state : public atarigen_state
+{
+protected:
+ cyberbal_base_state(const machine_config &mconfig, device_type type, const char *tag) :
+ atarigen_state(mconfig, type, tag),
+ m_playfield_tilemap(*this, "playfield"),
+ m_alpha_tilemap(*this, "alpha"),
+ m_mob(*this, "mob")
+ { }
+
+ TILE_GET_INFO_MEMBER(get_alpha_tile_info);
+ TILE_GET_INFO_MEMBER(get_playfield_tile_info);
+
+ virtual void video_start() override;
+
+ void scanline_update_one(screen_device &screen, int scanline, int i, tilemap_t &curplayfield, tilemap_device &curalpha);
+ uint32_t update_one_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, atari_motion_objects_device &curmob, tilemap_t &curplayfield, tilemap_t &curalpha);
+
+ static const atari_motion_objects_config s_mob_config;
+
+ required_device<tilemap_device> m_playfield_tilemap;
+ required_device<tilemap_device> m_alpha_tilemap;
+ required_device<atari_motion_objects_device> m_mob;
+
+ uint16_t m_current_slip[2];
+
+private:
+ uint8_t m_playfield_palette_bank[2];
+ uint16_t m_playfield_xscroll[2];
+ uint16_t m_playfield_yscroll[2];
+};
+
+
+class cyberbal2p_state : public cyberbal_base_state
+{
+public:
+ cyberbal2p_state(const machine_config &mconfig, device_type type, const char *tag) :
+ cyberbal_base_state(mconfig, type, tag),
+ m_jsa(*this, "jsa")
+ { }
+
+ void cyberbal2p(machine_config &config);
+
+protected:
+ DECLARE_READ16_MEMBER(sound_state_r);
+
+ virtual void update_interrupts() override;
+ virtual void scanline_update(screen_device &screen, int scanline) override;
+ virtual void machine_reset() override;
+ virtual void video_start() override;
+ uint32_t screen_update_cyberbal2p(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ // memory maps
+ void cyberbal2p_map(address_map &map);
+
+private:
+ required_device<atari_jsa_ii_device> m_jsa;
+};
+
+
+class cyberbal_state : public cyberbal_base_state
{
public:
cyberbal_state(const machine_config &mconfig, device_type type, const char *tag) :
- atarigen_state(mconfig, type, tag),
+ cyberbal_base_state(mconfig, type, tag),
m_audiocpu(*this, "audiocpu"),
m_extracpu(*this, "extra"),
m_daccpu(*this, "dac"),
@@ -31,10 +91,6 @@ public:
m_ldac(*this, "ldac"),
m_soundcomm(*this, "soundcomm"),
m_ymsnd(*this, "ymsnd"),
- m_jsa(*this, "jsa"),
- m_playfield_tilemap(*this, "playfield"),
- m_alpha_tilemap(*this, "alpha"),
- m_mob(*this, "mob"),
m_playfield2_tilemap(*this, "playfield2"),
m_alpha2_tilemap(*this, "alpha2"),
m_mob2(*this, "mob2"),
@@ -42,38 +98,24 @@ public:
m_rscreen(*this, "rscreen")
{ }
- optional_device<m6502_device> m_audiocpu;
- optional_device<cpu_device> m_extracpu;
- optional_device<cpu_device> m_daccpu;
- optional_device<dac_word_interface> m_rdac;
- optional_device<dac_word_interface> m_ldac;
- optional_device<atari_sound_comm_device> m_soundcomm;
- optional_device<ym2151_device> m_ymsnd;
- optional_device<atari_jsa_ii_device> m_jsa;
- required_device<tilemap_device> m_playfield_tilemap;
- required_device<tilemap_device> m_alpha_tilemap;
- required_device<atari_motion_objects_device> m_mob;
- optional_device<tilemap_device> m_playfield2_tilemap;
- optional_device<tilemap_device> m_alpha2_tilemap;
- optional_device<atari_motion_objects_device> m_mob2;
- optional_device<screen_device> m_lscreen;
- optional_device<screen_device> m_rscreen;
-
- uint16_t m_current_slip[2];
- uint8_t m_playfield_palette_bank[2];
- uint16_t m_playfield_xscroll[2];
- uint16_t m_playfield_yscroll[2];
-
- uint8_t m_fast_68k_int;
- uint8_t m_io_68k_int;
- uint8_t m_sound_data_from_68k;
- uint8_t m_sound_data_from_6502;
- uint8_t m_sound_data_from_68k_ready;
- uint8_t m_sound_data_from_6502_ready;
+ DECLARE_DRIVER_INIT(cyberbalt);
+ void cyberbal(machine_config &config);
+ void cyberbalt(machine_config &config);
+
+protected:
+ DECLARE_WRITE16_MEMBER(p2_reset_w);
+ TILE_GET_INFO_MEMBER(get_alpha2_tile_info);
+ TILE_GET_INFO_MEMBER(get_playfield2_tile_info);
+
virtual void update_interrupts() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
- DECLARE_READ16_MEMBER(sound_state_r);
- DECLARE_WRITE16_MEMBER(p2_reset_w);
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ virtual void video_start() override;
+ uint32_t screen_update_cyberbal_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ uint32_t screen_update_cyberbal_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ // sound-related
DECLARE_READ8_MEMBER(special_port3_r);
DECLARE_READ8_MEMBER(sound_6502_stat_r);
DECLARE_WRITE8_MEMBER(sound_bank_select_w);
@@ -83,38 +125,36 @@ public:
DECLARE_READ16_MEMBER(sound_68k_r);
DECLARE_WRITE16_MEMBER(sound_68k_w);
DECLARE_WRITE16_MEMBER(sound_68k_dac_w);
- DECLARE_DRIVER_INIT(cyberbalt);
- TILE_GET_INFO_MEMBER(get_alpha_tile_info);
- TILE_GET_INFO_MEMBER(get_alpha2_tile_info);
- TILE_GET_INFO_MEMBER(get_playfield_tile_info);
- TILE_GET_INFO_MEMBER(get_playfield2_tile_info);
- DECLARE_MACHINE_START(cyberbal);
- DECLARE_MACHINE_START(cyberbal2p);
- DECLARE_MACHINE_RESET(cyberbal);
- DECLARE_VIDEO_START(cyberbal);
- DECLARE_MACHINE_RESET(cyberbal2p);
- DECLARE_VIDEO_START(cyberbal2p);
- uint32_t screen_update_cyberbal_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_cyberbal_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_cyberbal2p(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(sound_68k_irq_gen);
+ void cyberbal_sound_reset();
+ void update_sound_68k_interrupts();
- static const atari_motion_objects_config s_mob_config;
-
- void cyberbalt(machine_config &config);
- void cyberbal2p(machine_config &config);
- void cyberbal(machine_config &config);
- void cyberbal2p_map(address_map &map);
- void extra_map(address_map &map);
+ // memory maps
void main_map(address_map &map);
- void sound_68k_map(address_map &map);
+ void extra_map(address_map &map);
void sound_map(address_map &map);
+ void sound_68k_map(address_map &map);
private:
- void video_start_common(int screens);
- void cyberbal_sound_reset();
- uint32_t update_one_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int index);
- void update_sound_68k_interrupts();
+ required_device<m6502_device> m_audiocpu;
+ required_device<cpu_device> m_extracpu;
+ required_device<cpu_device> m_daccpu;
+ required_device<dac_word_interface> m_rdac;
+ required_device<dac_word_interface> m_ldac;
+ required_device<atari_sound_comm_device> m_soundcomm;
+ required_device<ym2151_device> m_ymsnd;
+ required_device<tilemap_device> m_playfield2_tilemap;
+ required_device<tilemap_device> m_alpha2_tilemap;
+ required_device<atari_motion_objects_device> m_mob2;
+ required_device<screen_device> m_lscreen;
+ required_device<screen_device> m_rscreen;
+
+ uint8_t m_fast_68k_int;
+ uint8_t m_io_68k_int;
+ uint8_t m_sound_data_from_68k;
+ uint8_t m_sound_data_from_6502;
+ uint8_t m_sound_data_from_68k_ready;
+ uint8_t m_sound_data_from_6502_ready;
};
#endif // MAME_INCLUDES_CYBERBAL_H
diff --git a/src/mame/includes/unico.h b/src/mame/includes/unico.h
index c2555b54863..500e836d57c 100644
--- a/src/mame/includes/unico.h
+++ b/src/mame/includes/unico.h
@@ -1,5 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Luca Elia
+#ifndef MAME_INCLUDES_UNICO_H
+#define MAME_INCLUDES_UNICO_H
+
+#pragma once
+
#include "sound/okim6295.h"
#include "machine/eepromser.h"
#include "screen.h"
@@ -7,63 +12,104 @@
class unico_state : public driver_device
{
public:
- unico_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ unico_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_palette(*this, "palette"),
m_maincpu(*this, "maincpu"),
m_oki(*this, "oki"),
- m_eeprom(*this, "eeprom"),
m_gfxdecode(*this, "gfxdecode"),
- m_screen(*this, "screen"),
- m_palette(*this, "palette"),
- m_generic_paletteram_16(*this, "paletteram"),
- m_generic_paletteram_32(*this, "paletteram") { }
+ m_generic_paletteram_16(*this, "paletteram")
+ { }
+
+ void burglarx(machine_config &config);
+
+protected:
+ DECLARE_WRITE16_MEMBER(unico_palette_w);
+ DECLARE_READ16_MEMBER(unico_vram_r);
+ DECLARE_WRITE16_MEMBER(unico_vram_w);
+ DECLARE_READ16_MEMBER(unico_scroll_r);
+ DECLARE_WRITE16_MEMBER(unico_scroll_w);
+ DECLARE_READ16_MEMBER(unico_spriteram_r);
+ DECLARE_WRITE16_MEMBER(unico_spriteram_w);
+ DECLARE_WRITE16_MEMBER(burglarx_sound_bank_w);
+ TILE_GET_INFO_MEMBER(get_tile_info);
+ virtual void video_start() override;
+ uint32_t screen_update_unico(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void unico_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect);
+
+ void burglarx_map(address_map &map);
+
+ required_device<palette_device> m_palette;
+
+private:
std::unique_ptr<uint16_t[]> m_vram;
std::unique_ptr<uint16_t[]> m_scroll;
tilemap_t *m_tilemap[3];
int m_sprites_scrolldx;
int m_sprites_scrolldy;
std::unique_ptr<uint16_t[]> m_spriteram;
+
+ required_device<cpu_device> m_maincpu;
+ optional_device<okim6295_device> m_oki;
+ required_device<gfxdecode_device> m_gfxdecode;
+ optional_shared_ptr<uint16_t> m_generic_paletteram_16;
+};
+
+class zeropnt_state : public unico_state
+{
+public:
+ zeropnt_state(const machine_config &mconfig, device_type type, const char *tag) :
+ unico_state(mconfig, type, tag),
+ m_screen(*this, "screen"),
+ m_gun_axes(*this, { "Y0", "X0", "Y1", "X1" })
+ { }
+
+ void zeropnt(machine_config &config);
+
+protected:
DECLARE_WRITE16_MEMBER(zeropnt_sound_bank_w);
DECLARE_READ16_MEMBER(unico_gunx_0_msb_r);
DECLARE_READ16_MEMBER(unico_guny_0_msb_r);
DECLARE_READ16_MEMBER(unico_gunx_1_msb_r);
DECLARE_READ16_MEMBER(unico_guny_1_msb_r);
+
+ void zeropnt_map(address_map &map);
+
+private:
+ enum { Y0, X0, Y1, X1 }; // gun axis indices
+
+ required_device<screen_device> m_screen;
+ required_ioport_array<4> m_gun_axes;
+};
+
+class zeropnt2_state : public zeropnt_state
+{
+public:
+ zeropnt2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ zeropnt_state(mconfig, type, tag),
+ m_eeprom(*this, "eeprom"),
+ m_generic_paletteram_32(*this, "paletteram")
+ { }
+
+ void zeropnt2(machine_config &config);
+
+protected:
+ DECLARE_WRITE32_MEMBER(unico_palette32_w);
DECLARE_READ32_MEMBER(zeropnt2_gunx_0_msb_r);
DECLARE_READ32_MEMBER(zeropnt2_guny_0_msb_r);
DECLARE_READ32_MEMBER(zeropnt2_gunx_1_msb_r);
DECLARE_READ32_MEMBER(zeropnt2_guny_1_msb_r);
DECLARE_WRITE32_MEMBER(zeropnt2_sound_bank_w);
DECLARE_WRITE32_MEMBER(zeropnt2_leds_w);
- DECLARE_WRITE16_MEMBER(unico_palette_w);
- DECLARE_WRITE32_MEMBER(unico_palette32_w);
- DECLARE_READ16_MEMBER(unico_vram_r);
- DECLARE_WRITE16_MEMBER(unico_vram_w);
- DECLARE_READ16_MEMBER(unico_scroll_r);
- DECLARE_WRITE16_MEMBER(unico_scroll_w);
- DECLARE_READ16_MEMBER(unico_spriteram_r);
- DECLARE_WRITE16_MEMBER(unico_spriteram_w);
- DECLARE_WRITE16_MEMBER(burglarx_sound_bank_w);
DECLARE_WRITE32_MEMBER(zeropnt2_eeprom_w);
- TILE_GET_INFO_MEMBER(get_tile_info);
- DECLARE_MACHINE_RESET(unico);
- DECLARE_VIDEO_START(unico);
- DECLARE_MACHINE_RESET(zeropt);
- uint32_t screen_update_unico(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void unico_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect);
- required_device<cpu_device> m_maincpu;
- optional_device<okim6295_device> m_oki;
- optional_device<eeprom_serial_93cxx_device> m_eeprom;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<screen_device> m_screen;
- required_device<palette_device> m_palette;
- optional_shared_ptr<uint16_t> m_generic_paletteram_16;
- optional_shared_ptr<uint32_t> m_generic_paletteram_32;
- void zeropnt2(machine_config &config);
- void zeropnt(machine_config &config);
- void burglarx(machine_config &config);
- void burglarx_map(address_map &map);
+
void zeropnt2_map(address_map &map);
- void zeropnt_map(address_map &map);
+
+private:
+ required_device<eeprom_serial_93cxx_device> m_eeprom;
+ required_shared_ptr<uint32_t> m_generic_paletteram_32;
};
+
+#endif // MAME_INCLUDES_UNICO_H
diff --git a/src/mame/includes/vectrex.h b/src/mame/includes/vectrex.h
index 36a53f98060..116b5d99e35 100644
--- a/src/mame/includes/vectrex.h
+++ b/src/mame/includes/vectrex.h
@@ -5,10 +5,11 @@
* includes/vectrex.h
*
****************************************************************************/
-
#ifndef MAME_INCLUDES_VECTREX_H
#define MAME_INCLUDES_VECTREX_H
+#pragma once
+
#include "machine/6522via.h"
#include "sound/dac.h"
#include "sound/ay8910.h"
@@ -21,14 +22,7 @@
#define NVECT 10000
-struct vectrex_point
-{
- int x; int y;
- rgb_t col;
- int intensity;
-};
-
-class vectrex_state : public driver_device
+class vectrex_base_state : public driver_device
{
public:
enum
@@ -42,35 +36,81 @@ public:
TIMER_UPDATE_SIGNAL
};
- vectrex_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_gce_vectorram(*this, "gce_vectorram"),
+protected:
+ vectrex_base_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
+ m_cart(*this, "cartslot"),
+ m_gce_vectorram(*this, "gce_vectorram"),
m_via6522_0(*this, "via6522_0"),
m_dac(*this, "dac"),
m_ay8912(*this, "ay8912"),
m_vector(*this, "vector"),
- m_cart(*this, "cartslot"),
m_io_contr(*this, {"CONTR1X", "CONTR1Y", "CONTR2X", "CONTR2Y"}),
m_io_buttons(*this, "BUTTONS"),
m_io_3dconf(*this, "3DCONF"),
m_io_lpenconf(*this, "LPENCONF"),
m_io_lpenx(*this, "LPENX"),
m_io_lpeny(*this, "LPENY"),
- m_io_coin(*this, "COIN"),
m_screen(*this, "screen")
{ }
- required_shared_ptr<uint8_t> m_gce_vectorram;
- int m_imager_status;
- uint32_t m_beam_color;
+ DECLARE_WRITE8_MEMBER(vectrex_psg_port_w);
+ DECLARE_READ8_MEMBER(vectrex_via_r);
+ DECLARE_WRITE8_MEMBER(vectrex_via_w);
+ virtual void driver_start() override;
+ virtual void video_start() override;
+ uint32_t screen_update_vectrex(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ TIMER_CALLBACK_MEMBER(vectrex_imager_change_color);
+ TIMER_CALLBACK_MEMBER(update_level);
+ TIMER_CALLBACK_MEMBER(vectrex_imager_eye);
+ TIMER_CALLBACK_MEMBER(lightpen_trigger);
+ TIMER_CALLBACK_MEMBER(vectrex_refresh);
+ TIMER_CALLBACK_MEMBER(vectrex_zero_integrators);
+ TIMER_CALLBACK_MEMBER(update_signal);
+ DECLARE_READ8_MEMBER(vectrex_via_pb_r);
+ DECLARE_READ8_MEMBER(vectrex_via_pa_r);
+ DECLARE_WRITE8_MEMBER(v_via_pb_w);
+ DECLARE_WRITE8_MEMBER(v_via_pa_w);
+ DECLARE_WRITE_LINE_MEMBER(v_via_ca2_w);
+ DECLARE_WRITE_LINE_MEMBER(v_via_cb2_w);
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(vectrex_cart);
+ DECLARE_WRITE_LINE_MEMBER(vectrex_via_irq);
+
+ void vectrex_base(machine_config &config);
+
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ void configure_imager(bool reset_refresh, const double *imager_angles);
+ void vectrex_configuration();
+ void vectrex_multiplexer(int mux);
+ void vectrex_add_point(int x, int y, rgb_t color, int intensity);
+ void vectrex_add_point_stereo(int x, int y, rgb_t color, int intensity);
+
unsigned char m_via_out[2];
+
+ required_device<cpu_device> m_maincpu;
+ optional_device<vectrex_cart_slot_device> m_cart;
+
double m_imager_freq;
emu_timer *m_imager_timer;
+ emu_timer *m_lp_t;
+
+private:
+ struct vectrex_point
+ {
+ int x; int y;
+ rgb_t col;
+ int intensity;
+ };
+
+ required_shared_ptr<uint8_t> m_gce_vectorram;
+ int m_imager_status;
+ uint32_t m_beam_color;
int m_lightpen_port;
int m_reset_refresh;
- rgb_t m_imager_colors[6];
const double *m_imager_angles;
+ rgb_t m_imager_colors[6];
unsigned char m_imager_pinlevel;
int m_old_mcontrol;
double m_sl;
@@ -84,7 +124,6 @@ public:
int m_lightpen_down;
int m_pen_x;
int m_pen_y;
- emu_timer *m_lp_t;
emu_timer *m_refresh;
uint8_t m_blank;
uint8_t m_ramp;
@@ -96,59 +135,57 @@ public:
uint16_t m_via_timer2;
attotime m_vector_start_time;
uint8_t m_cb2;
- void (vectrex_state::*vector_add_point_function)(int, int, rgb_t, int);
- DECLARE_WRITE8_MEMBER(vectrex_psg_port_w);
- DECLARE_READ8_MEMBER(vectrex_via_r);
- DECLARE_WRITE8_MEMBER(vectrex_via_w);
- DECLARE_WRITE8_MEMBER(raaspec_led_w);
- DECLARE_DRIVER_INIT(vectrex);
- virtual void video_start() override;
- virtual void machine_start() override;
- DECLARE_VIDEO_START(raaspec);
- uint32_t screen_update_vectrex(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- TIMER_CALLBACK_MEMBER(vectrex_imager_change_color);
- TIMER_CALLBACK_MEMBER(update_level);
- TIMER_CALLBACK_MEMBER(vectrex_imager_eye);
- TIMER_CALLBACK_MEMBER(lightpen_trigger);
- TIMER_CALLBACK_MEMBER(vectrex_refresh);
- TIMER_CALLBACK_MEMBER(vectrex_zero_integrators);
- TIMER_CALLBACK_MEMBER(update_signal);
- DECLARE_READ8_MEMBER(vectrex_via_pb_r);
- DECLARE_READ8_MEMBER(vectrex_via_pa_r);
- DECLARE_READ8_MEMBER(vectrex_s1_via_pb_r);
- DECLARE_WRITE8_MEMBER(v_via_pb_w);
- DECLARE_WRITE8_MEMBER(v_via_pa_w);
- DECLARE_WRITE_LINE_MEMBER(v_via_ca2_w);
- DECLARE_WRITE_LINE_MEMBER(v_via_cb2_w);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER( vectrex_cart );
- DECLARE_WRITE_LINE_MEMBER(vectrex_via_irq);
+ void (vectrex_base_state::*vector_add_point_function)(int, int, rgb_t, int);
- void vectrex(machine_config &config);
- void raaspec(machine_config &config);
- void raaspec_map(address_map &map);
- void vectrex_map(address_map &map);
-protected:
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-
- required_device<cpu_device> m_maincpu;
required_device<via6522_device> m_via6522_0;
required_device<dac_byte_interface> m_dac;
required_device<ay8910_device> m_ay8912;
required_device<vector_device> m_vector;
- optional_device<vectrex_cart_slot_device> m_cart;
optional_ioport_array<4> m_io_contr;
required_ioport m_io_buttons;
required_ioport m_io_3dconf;
required_ioport m_io_lpenconf;
required_ioport m_io_lpenx;
required_ioport m_io_lpeny;
- optional_ioport m_io_coin;
required_device<screen_device> m_screen;
+};
- void vectrex_configuration();
- void vectrex_multiplexer(int mux);
- void vectrex_add_point(int x, int y, rgb_t color, int intensity);
- void vectrex_add_point_stereo(int x, int y, rgb_t color, int intensity);
+
+class vectrex_state : public vectrex_base_state
+{
+public:
+ vectrex_state(const machine_config &mconfig, device_type type, const char *tag) :
+ vectrex_base_state(mconfig, type, tag)
+ { }
+
+ void vectrex(machine_config &config);
+
+protected:
+ virtual void video_start() override;
+ virtual void machine_start() override;
+
+ void vectrex_map(address_map &map);
+};
+
+
+class raaspec_state : public vectrex_base_state
+{
+public:
+ raaspec_state(const machine_config &mconfig, device_type type, const char *tag) :
+ vectrex_base_state(mconfig, type, tag),
+ m_io_coin(*this, "COIN")
+ { }
+
+ void raaspec(machine_config &config);
+
+protected:
+ DECLARE_WRITE8_MEMBER(raaspec_led_w);
+ DECLARE_READ8_MEMBER(vectrex_s1_via_pb_r);
+
+ void raaspec_map(address_map &map);
+
+private:
+ required_ioport m_io_coin;
};
#endif // MAME_INCLUDES_VECTREX_H
diff --git a/src/mame/machine/vectrex.cpp b/src/mame/machine/vectrex.cpp
index 55b6c072f98..67d64165f09 100644
--- a/src/mame/machine/vectrex.cpp
+++ b/src/mame/machine/vectrex.cpp
@@ -1,11 +1,11 @@
// license:BSD-3-Clause
// copyright-holders:Mathis Rosenhauer
#include "emu.h"
+#include "includes/vectrex.h"
+
#include "cpu/m6809/m6809.h"
#include "sound/ay8910.h"
-#include "includes/vectrex.h"
-
#define VC_RED rgb_t(0xff, 0x00, 0x00)
#define VC_GREEN rgb_t(0x00, 0xff, 0x00)
@@ -48,7 +48,7 @@ static const double unknown_game_angles[3] = {0,0.16666666, 0.33333333};
-void vectrex_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+void vectrex_base_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch (id)
{
@@ -74,7 +74,7 @@ void vectrex_state::device_timer(emu_timer &timer, device_timer_id id, int param
update_signal(ptr, param);
break;
default:
- assert_always(false, "Unknown id in vectrex_state::device_timer");
+ fatalerror("Unknown id in vectrex_base_state::device_timer");
}
}
@@ -86,7 +86,13 @@ void vectrex_state::device_timer(emu_timer &timer, device_timer_id id, int param
*********************************************************************/
-void vectrex_state::vectrex_configuration()
+void vectrex_base_state::configure_imager(bool reset_refresh, const double *imager_angles)
+{
+ m_reset_refresh = reset_refresh;
+ m_imager_angles = imager_angles;
+}
+
+void vectrex_base_state::vectrex_configuration()
{
unsigned char cport = m_io_3dconf->read();
@@ -98,7 +104,7 @@ void vectrex_state::vectrex_configuration()
if (m_imager_status == 0)
m_imager_status = cport & 0x01;
- vector_add_point_function = cport & 0x02 ? &vectrex_state::vectrex_add_point_stereo: &vectrex_state::vectrex_add_point;
+ vector_add_point_function = cport & 0x02 ? &vectrex_base_state::vectrex_add_point_stereo: &vectrex_base_state::vectrex_add_point;
switch ((cport >> 2) & 0x07)
{
@@ -161,7 +167,7 @@ void vectrex_state::vectrex_configuration()
}
else
{
- vector_add_point_function = &vectrex_state::vectrex_add_point;
+ vector_add_point_function = &vectrex_base_state::vectrex_add_point;
m_beam_color = rgb_t::white();
m_imager_colors[0] = m_imager_colors[1] = m_imager_colors[2] = m_imager_colors[3] = m_imager_colors[4] = m_imager_colors[5] = rgb_t::white();
}
@@ -175,13 +181,13 @@ void vectrex_state::vectrex_configuration()
*********************************************************************/
-WRITE_LINE_MEMBER(vectrex_state::vectrex_via_irq)
+WRITE_LINE_MEMBER(vectrex_base_state::vectrex_via_irq)
{
m_maincpu->set_input_line(M6809_IRQ_LINE, state);
}
-READ8_MEMBER(vectrex_state::vectrex_via_pb_r)
+READ8_MEMBER(vectrex_base_state::vectrex_via_pb_r)
{
int pot = m_io_contr[(m_via_out[PORTB] & 0x6) >> 1]->read() - 0x80;
@@ -194,7 +200,7 @@ READ8_MEMBER(vectrex_state::vectrex_via_pb_r)
}
-READ8_MEMBER(vectrex_state::vectrex_via_pa_r)
+READ8_MEMBER(vectrex_base_state::vectrex_via_pa_r)
{
if ((!(m_via_out[PORTB] & 0x10)) && (m_via_out[PORTB] & 0x08))
/* BDIR inactive, we can read the PSG. BC1 has to be active. */
@@ -206,7 +212,7 @@ READ8_MEMBER(vectrex_state::vectrex_via_pa_r)
}
-READ8_MEMBER(vectrex_state::vectrex_s1_via_pb_r)
+READ8_MEMBER(raaspec_state::vectrex_s1_via_pb_r)
{
return (m_via_out[PORTB] & ~0x40) | (m_io_coin->read() & 0x40);
}
@@ -218,20 +224,20 @@ READ8_MEMBER(vectrex_state::vectrex_s1_via_pb_r)
*********************************************************************/
-TIMER_CALLBACK_MEMBER(vectrex_state::vectrex_imager_change_color)
+TIMER_CALLBACK_MEMBER(vectrex_base_state::vectrex_imager_change_color)
{
m_beam_color = param;
}
-TIMER_CALLBACK_MEMBER(vectrex_state::update_level)
+TIMER_CALLBACK_MEMBER(vectrex_base_state::update_level)
{
if (ptr)
* (uint8_t *) ptr = param;
}
-TIMER_CALLBACK_MEMBER(vectrex_state::vectrex_imager_eye)
+TIMER_CALLBACK_MEMBER(vectrex_base_state::vectrex_imager_eye)
{
int coffset;
double rtime = (1.0 / m_imager_freq);
@@ -258,7 +264,7 @@ TIMER_CALLBACK_MEMBER(vectrex_state::vectrex_imager_eye)
}
-WRITE8_MEMBER(vectrex_state::vectrex_psg_port_w)
+WRITE8_MEMBER(vectrex_base_state::vectrex_psg_port_w)
{
double wavel, ang_acc, tmp;
int mcontrol;
@@ -299,7 +305,7 @@ WRITE8_MEMBER(vectrex_state::vectrex_psg_port_w)
}
}
-DRIVER_INIT_MEMBER(vectrex_state,vectrex)
+void vectrex_base_state::driver_start()
{
m_imager_angles = unknown_game_angles;
m_beam_color = rgb_t::white();
@@ -318,36 +324,32 @@ DRIVER_INIT_MEMBER(vectrex_state,vectrex)
void vectrex_state::machine_start()
{
- if (m_cart && m_cart->exists())
+ if (m_cart->exists())
{
// install cart accesses
if (m_cart->get_type() == VECTREX_SRAM)
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0000, 0x7fff, read8_delegate(FUNC(vectrex_cart_slot_device::read_rom),(vectrex_cart_slot_device*)m_cart), write8_delegate(FUNC(vectrex_cart_slot_device::write_ram),(vectrex_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0000, 0x7fff, read8_delegate(FUNC(vectrex_cart_slot_device::read_rom),(vectrex_cart_slot_device*)m_cart), write8_delegate(FUNC(vectrex_cart_slot_device::write_ram),m_cart.target()));
else
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x7fff, read8_delegate(FUNC(vectrex_cart_slot_device::read_rom),(vectrex_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x7fff, read8_delegate(FUNC(vectrex_cart_slot_device::read_rom),m_cart.target()));
// setup 3d imager and refresh timer
- // If VIA T2 starts, reset refresh timer. This is the best strategy for most games.
- m_reset_refresh = 1;
- m_imager_angles = narrow_escape_angles;
-
// let's do this 3D detection
switch (m_cart->get_vec3d())
{
- case VEC3D_MINEST:
- m_imager_angles = minestorm_3d_angles;
- // Don't reset T2 each time it's written. This would cause jerking in mine3.
- m_reset_refresh = 0;
- break;
- case VEC3D_CCOAST:
- m_imager_angles = crazy_coaster_angles;
- break;
- case VEC3D_NARROW:
- m_imager_angles = narrow_escape_angles;
- break;
- default:
- break;
+ case VEC3D_MINEST:
+ // Don't reset T2 each time it's written. This would cause jerking in mine3.
+ configure_imager(false, minestorm_3d_angles);
+ break;
+ case VEC3D_CCOAST:
+ configure_imager(true, crazy_coaster_angles);
+ break;
+ case VEC3D_NARROW:
+ configure_imager(true, narrow_escape_angles);
+ break;
+ default:
+ // If VIA T2 starts, reset refresh timer. This is the best strategy for most games.
+ configure_imager(true, narrow_escape_angles);
}
}
}
diff --git a/src/mame/video/cyberbal.cpp b/src/mame/video/cyberbal.cpp
index 31b132a0436..bce32eb631a 100644
--- a/src/mame/video/cyberbal.cpp
+++ b/src/mame/video/cyberbal.cpp
@@ -21,7 +21,7 @@
*
*************************************/
-TILE_GET_INFO_MEMBER(cyberbal_state::get_alpha_tile_info)
+TILE_GET_INFO_MEMBER(cyberbal_base_state::get_alpha_tile_info)
{
uint16_t data = m_alpha_tilemap->basemem_read(tile_index);
int code = data & 0xfff;
@@ -39,7 +39,7 @@ TILE_GET_INFO_MEMBER(cyberbal_state::get_alpha2_tile_info)
}
-TILE_GET_INFO_MEMBER(cyberbal_state::get_playfield_tile_info)
+TILE_GET_INFO_MEMBER(cyberbal_base_state::get_playfield_tile_info)
{
uint16_t data = m_playfield_tilemap->basemem_read(tile_index);
int code = data & 0x1fff;
@@ -65,7 +65,7 @@ TILE_GET_INFO_MEMBER(cyberbal_state::get_playfield2_tile_info)
*
*************************************/
-const atari_motion_objects_config cyberbal_state::s_mob_config =
+const atari_motion_objects_config cyberbal_base_state::s_mob_config =
{
1, /* index to which gfx system */
1, /* number of motion object banks */
@@ -99,19 +99,10 @@ const atari_motion_objects_config cyberbal_state::s_mob_config =
0, /* resulting value to indicate "special" */
};
-void cyberbal_state::video_start_common(int screens)
+void cyberbal_base_state::video_start()
{
- if (screens == 2)
- {
- palette_device *rpalette = subdevice<palette_device>("rpalette");
- m_playfield2_tilemap->set_palette(*rpalette);
- m_alpha2_tilemap->set_palette(*rpalette);
- }
-
/* initialize the motion objects */
m_mob->set_slipram(&m_current_slip[0]);
- if (screens == 2)
- m_mob2->set_slipram(&m_current_slip[1]);
/* save states */
save_item(NAME(m_current_slip));
@@ -121,9 +112,15 @@ void cyberbal_state::video_start_common(int screens)
}
-VIDEO_START_MEMBER(cyberbal_state,cyberbal)
+void cyberbal_state::video_start()
{
- video_start_common(2);
+ palette_device *rpalette = subdevice<palette_device>("rpalette");
+ m_playfield2_tilemap->set_palette(*rpalette);
+ m_alpha2_tilemap->set_palette(*rpalette);
+
+ cyberbal_base_state::video_start();
+
+ m_mob2->set_slipram(&m_current_slip[1]);
/* adjust the sprite positions */
m_mob->set_xscroll(4);
@@ -131,9 +128,9 @@ VIDEO_START_MEMBER(cyberbal_state,cyberbal)
}
-VIDEO_START_MEMBER(cyberbal_state,cyberbal2p)
+void cyberbal2p_state::video_start()
{
- video_start_common(1);
+ cyberbal_base_state::video_start();
/* adjust the sprite positions */
m_mob->set_xscroll(5);
@@ -147,72 +144,74 @@ VIDEO_START_MEMBER(cyberbal_state,cyberbal2p)
*
*************************************/
-void cyberbal_state::scanline_update(screen_device &screen, int scanline)
+void cyberbal_base_state::scanline_update_one(screen_device &screen, int scanline, int i, tilemap_t &curplayfield, tilemap_device &curalpha)
{
- /* loop over screens */
- int i = 0;
- for (screen_device &update_screen : screen_device_iterator(*this))
+ /* keep in range */
+ int offset = ((scanline - 8) / 8) * 64 + 47;
+ if (offset < 0)
+ offset += 0x800;
+ else if (offset >= 0x800)
+ return;
+
+ /* update the current parameters */
+ uint16_t word = curalpha.basemem_read(offset + 3);
+ if (!(word & 1))
{
- /* need explicit target() because one is optional_device and other is required_device */
- tilemap_t *curplayfield = i ? m_playfield2_tilemap.target() : m_playfield_tilemap.target();
- tilemap_device *curalpha = i ? m_alpha2_tilemap.target() : m_alpha_tilemap.target();
-
- /* keep in range */
- int offset = ((scanline - 8) / 8) * 64 + 47;
- if (offset < 0)
- offset += 0x800;
- else if (offset >= 0x800)
- return;
-
- /* update the current parameters */
- uint16_t word = curalpha->basemem_read(offset + 3);
- if (!(word & 1))
+ if (((word >> 1) & 7) != m_playfield_palette_bank[i])
{
- if (((word >> 1) & 7) != m_playfield_palette_bank[i])
- {
- if (scanline > 0)
- update_screen.update_partial(scanline - 1);
- m_playfield_palette_bank[i] = (word >> 1) & 7;
- curplayfield->set_palette_offset(m_playfield_palette_bank[i] << 8);
- }
+ if (scanline > 0)
+ screen.update_partial(scanline - 1);
+ m_playfield_palette_bank[i] = (word >> 1) & 7;
+ curplayfield.set_palette_offset(m_playfield_palette_bank[i] << 8);
}
- word = curalpha->basemem_read(offset + 4);
- if (!(word & 1))
+ }
+ word = curalpha.basemem_read(offset + 4);
+ if (!(word & 1))
+ {
+ int newscroll = 2 * (((word >> 7) + 4) & 0x1ff);
+ if (newscroll != m_playfield_xscroll[i])
{
- int newscroll = 2 * (((word >> 7) + 4) & 0x1ff);
- if (newscroll != m_playfield_xscroll[i])
- {
- if (scanline > 0)
- update_screen.update_partial(scanline - 1);
- curplayfield->set_scrollx(0, newscroll);
- m_playfield_xscroll[i] = newscroll;
- }
+ if (scanline > 0)
+ screen.update_partial(scanline - 1);
+ curplayfield.set_scrollx(0, newscroll);
+ m_playfield_xscroll[i] = newscroll;
}
- word = curalpha->basemem_read(offset + 5);
- if (!(word & 1))
+ }
+ word = curalpha.basemem_read(offset + 5);
+ if (!(word & 1))
+ {
+ /* a new vscroll latches the offset into a counter; we must adjust for this */
+ int newscroll = ((word >> 7) - (scanline)) & 0x1ff;
+ if (newscroll != m_playfield_yscroll[i])
{
- /* a new vscroll latches the offset into a counter; we must adjust for this */
- int newscroll = ((word >> 7) - (scanline)) & 0x1ff;
- if (newscroll != m_playfield_yscroll[i])
- {
- if (scanline > 0)
- update_screen.update_partial(scanline - 1);
- curplayfield->set_scrolly(0, newscroll);
- m_playfield_yscroll[i] = newscroll;
- }
+ if (scanline > 0)
+ screen.update_partial(scanline - 1);
+ curplayfield.set_scrolly(0, newscroll);
+ m_playfield_yscroll[i] = newscroll;
}
- word = curalpha->basemem_read(offset + 7);
- if (!(word & 1))
+ }
+ word = curalpha.basemem_read(offset + 7);
+ if (!(word & 1))
+ {
+ if (m_current_slip[i] != word)
{
- if (m_current_slip[i] != word)
- {
- if (scanline > 0)
- update_screen.update_partial(scanline - 1);
- m_current_slip[i] = word;
- }
+ if (scanline > 0)
+ screen.update_partial(scanline - 1);
+ m_current_slip[i] = word;
}
- i++;
}
+ i++;
+}
+
+void cyberbal_state::scanline_update(screen_device &screen, int scanline)
+{
+ scanline_update_one(*m_lscreen, scanline, 0, *m_playfield_tilemap, *m_alpha_tilemap);
+ scanline_update_one(*m_rscreen, scanline, 1, *m_playfield2_tilemap, *m_alpha2_tilemap);
+}
+
+void cyberbal2p_state::scanline_update(screen_device &screen, int scanline)
+{
+ scanline_update_one(*m_screen, scanline, 0, *m_playfield_tilemap, *m_alpha_tilemap);
}
@@ -223,19 +222,17 @@ void cyberbal_state::scanline_update(screen_device &screen, int scanline)
*
*************************************/
-uint32_t cyberbal_state::update_one_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int index)
+uint32_t cyberbal_base_state::update_one_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, atari_motion_objects_device &curmob, tilemap_t &curplayfield, tilemap_t &curalpha)
{
// start drawing
- atari_motion_objects_device *curmob = index ? m_mob2.target() : m_mob.target();
- curmob->draw_async(cliprect);
+ curmob.draw_async(cliprect);
/* draw the playfield */
- tilemap_t *curplayfield = index ? m_playfield2_tilemap.target() : m_playfield_tilemap.target();
- curplayfield->draw(screen, bitmap, cliprect, 0, 0);
+ curplayfield.draw(screen, bitmap, cliprect, 0, 0);
/* draw and merge the MO */
- bitmap_ind16 &mobitmap = curmob->bitmap();
- for (const sparse_dirty_rect *rect = curmob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next())
+ bitmap_ind16 &mobitmap = curmob.bitmap();
+ for (const sparse_dirty_rect *rect = curmob.first_dirty_rect(cliprect); rect != nullptr; rect = rect->next())
for (int y = rect->min_y; y <= rect->max_y; y++)
{
uint16_t *mo = &mobitmap.pix16(y);
@@ -250,23 +247,22 @@ uint32_t cyberbal_state::update_one_screen(screen_device &screen, bitmap_ind16 &
}
/* add the alpha on top */
- tilemap_t *curalpha = index ? m_alpha2_tilemap.target() : m_alpha_tilemap.target();
- curalpha->draw(screen, bitmap, cliprect, 0, 0);
+ curalpha.draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
uint32_t cyberbal_state::screen_update_cyberbal_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- return update_one_screen(screen, bitmap, cliprect, 0);
+ return update_one_screen(screen, bitmap, cliprect, *m_mob, *m_playfield_tilemap, *m_alpha_tilemap);
}
uint32_t cyberbal_state::screen_update_cyberbal_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- return update_one_screen(screen, bitmap, cliprect, 1);
+ return update_one_screen(screen, bitmap, cliprect, *m_mob2, *m_playfield2_tilemap, *m_alpha2_tilemap);
}
-uint32_t cyberbal_state::screen_update_cyberbal2p(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t cyberbal2p_state::screen_update_cyberbal2p(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- return update_one_screen(screen, bitmap, cliprect, 0);
+ return update_one_screen(screen, bitmap, cliprect, *m_mob, *m_playfield_tilemap, *m_alpha_tilemap);
}
diff --git a/src/mame/video/unico.cpp b/src/mame/video/unico.cpp
index f7c745b7e55..3493bd39dfa 100644
--- a/src/mame/video/unico.cpp
+++ b/src/mame/video/unico.cpp
@@ -65,7 +65,7 @@ WRITE16_MEMBER(unico_state::unico_palette_w)
(data2 >> 8) & 0xFC );
}
-WRITE32_MEMBER(unico_state::unico_palette32_w)
+WRITE32_MEMBER(zeropnt2_state::unico_palette32_w)
{
uint32_t rgb0 = COMBINE_DATA(&m_generic_paletteram_32[offset]);
m_palette->set_pen_color( offset,
@@ -125,7 +125,7 @@ WRITE16_MEMBER(unico_state::unico_spriteram_w) { COMBINE_DATA(&m_spriteram[offs
***************************************************************************/
-VIDEO_START_MEMBER(unico_state,unico)
+void unico_state::video_start()
{
m_vram = make_unique_clear<uint16_t[]>(0xc000 / 2);
m_scroll = make_unique_clear<uint16_t[]>(0x18 / 2);
diff --git a/src/mame/video/vectrex.cpp b/src/mame/video/vectrex.cpp
index 194d5fc1f2d..30fa2ea66a7 100644
--- a/src/mame/video/vectrex.cpp
+++ b/src/mame/video/vectrex.cpp
@@ -39,7 +39,7 @@ enum {
*********************************************************************/
-TIMER_CALLBACK_MEMBER(vectrex_state::lightpen_trigger)
+TIMER_CALLBACK_MEMBER(vectrex_base_state::lightpen_trigger)
{
if (m_lightpen_port & 1)
{
@@ -73,12 +73,12 @@ TIMER_CALLBACK_MEMBER(vectrex_state::lightpen_trigger)
*********************************************************************/
-READ8_MEMBER(vectrex_state::vectrex_via_r)
+READ8_MEMBER(vectrex_base_state::vectrex_via_r)
{
return m_via6522_0->read(space, offset);
}
-WRITE8_MEMBER(vectrex_state::vectrex_via_w)
+WRITE8_MEMBER(vectrex_base_state::vectrex_via_w)
{
attotime period;
@@ -112,7 +112,7 @@ WRITE8_MEMBER(vectrex_state::vectrex_via_w)
*********************************************************************/
-TIMER_CALLBACK_MEMBER(vectrex_state::vectrex_refresh)
+TIMER_CALLBACK_MEMBER(vectrex_base_state::vectrex_refresh)
{
/* Refresh only marks the range of vectors which will be drawn
* during the next screen_update. */
@@ -121,7 +121,7 @@ TIMER_CALLBACK_MEMBER(vectrex_state::vectrex_refresh)
}
-uint32_t vectrex_state::screen_update_vectrex(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+uint32_t vectrex_base_state::screen_update_vectrex(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int i;
@@ -153,7 +153,7 @@ uint32_t vectrex_state::screen_update_vectrex(screen_device &screen, bitmap_rgb3
*********************************************************************/
-void vectrex_state::vectrex_add_point(int x, int y, rgb_t color, int intensity)
+void vectrex_base_state::vectrex_add_point(int x, int y, rgb_t color, int intensity)
{
vectrex_point *newpoint;
@@ -167,7 +167,7 @@ void vectrex_state::vectrex_add_point(int x, int y, rgb_t color, int intensity)
}
-void vectrex_state::vectrex_add_point_stereo(int x, int y, rgb_t color, int intensity)
+void vectrex_base_state::vectrex_add_point_stereo(int x, int y, rgb_t color, int intensity)
{
if (m_imager_status == 2) /* left = 1, right = 2 */
vectrex_add_point((int)(y * M_SQRT1_2)+ m_x_center,
@@ -182,7 +182,7 @@ void vectrex_state::vectrex_add_point_stereo(int x, int y, rgb_t color, int inte
}
-TIMER_CALLBACK_MEMBER(vectrex_state::vectrex_zero_integrators)
+TIMER_CALLBACK_MEMBER(vectrex_base_state::vectrex_zero_integrators)
{
m_x_int = m_x_center + (m_analog[A_ZR] * INT_PER_CLOCK);
m_y_int = m_y_center + (m_analog[A_ZR] * INT_PER_CLOCK);
@@ -200,7 +200,7 @@ TIMER_CALLBACK_MEMBER(vectrex_state::vectrex_zero_integrators)
*********************************************************************/
-TIMER_CALLBACK_MEMBER(vectrex_state::update_signal)
+TIMER_CALLBACK_MEMBER(vectrex_base_state::update_signal)
{
int length;
@@ -233,7 +233,7 @@ TIMER_CALLBACK_MEMBER(vectrex_state::update_signal)
*********************************************************************/
-void vectrex_state::video_start()
+void vectrex_base_state::video_start()
{
const rectangle &visarea = m_screen->visible_area();
@@ -242,15 +242,21 @@ void vectrex_state::video_start()
m_x_max = visarea.max_x << 16;
m_y_max = visarea.max_y << 16;
+ vector_add_point_function = &vectrex_base_state::vectrex_add_point;
+
+ m_refresh = timer_alloc(TIMER_VECTREX_REFRESH);
+}
+
+void vectrex_state::video_start()
+{
+ vectrex_base_state::video_start();
+
m_imager_freq = 1;
- vector_add_point_function = &vectrex_state::vectrex_add_point;
m_imager_timer = timer_alloc(TIMER_VECTREX_IMAGER_EYE);
m_imager_timer->adjust(attotime::from_hz(m_imager_freq), 2, attotime::from_hz(m_imager_freq));
m_lp_t = timer_alloc(TIMER_LIGHTPEN_TRIGGER);
-
- m_refresh = timer_alloc(TIMER_VECTREX_REFRESH);
}
@@ -260,7 +266,7 @@ void vectrex_state::video_start()
*********************************************************************/
-void vectrex_state::vectrex_multiplexer(int mux)
+void vectrex_base_state::vectrex_multiplexer(int mux)
{
timer_set(attotime::from_nsec(ANALOG_DELAY), TIMER_UPDATE_SIGNAL, m_via_out[PORTA], &m_analog[mux]);
@@ -269,7 +275,7 @@ void vectrex_state::vectrex_multiplexer(int mux)
}
-WRITE8_MEMBER(vectrex_state::v_via_pb_w)
+WRITE8_MEMBER(vectrex_base_state::v_via_pb_w)
{
if (!(data & 0x80))
{
@@ -352,7 +358,7 @@ WRITE8_MEMBER(vectrex_state::v_via_pb_w)
}
-WRITE8_MEMBER(vectrex_state::v_via_pa_w)
+WRITE8_MEMBER(vectrex_base_state::v_via_pa_w)
{
/* DAC output always goes to Y integrator */
m_via_out[PORTA] = data;
@@ -363,14 +369,14 @@ WRITE8_MEMBER(vectrex_state::v_via_pa_w)
}
-WRITE_LINE_MEMBER(vectrex_state::v_via_ca2_w)
+WRITE_LINE_MEMBER(vectrex_base_state::v_via_ca2_w)
{
if (state == 0)
timer_set(attotime::from_nsec(ANALOG_DELAY), TIMER_VECTREX_ZERO_INTEGRATORS);
}
-WRITE_LINE_MEMBER(vectrex_state::v_via_cb2_w)
+WRITE_LINE_MEMBER(vectrex_base_state::v_via_cb2_w)
{
int dx, dy;
@@ -405,23 +411,9 @@ WRITE_LINE_MEMBER(vectrex_state::v_via_cb2_w)
*****************************************************************/
-WRITE8_MEMBER(vectrex_state::raaspec_led_w)
+WRITE8_MEMBER(raaspec_state::raaspec_led_w)
{
logerror("Spectrum I+ LED: %i%i%i%i%i%i%i%i\n",
(data>>7)&0x1, (data>>6)&0x1, (data>>5)&0x1, (data>>4)&0x1,
(data>>3)&0x1, (data>>2)&0x1, (data>>1)&0x1, data&0x1);
}
-
-
-VIDEO_START_MEMBER(vectrex_state,raaspec)
-{
- const rectangle &visarea = m_screen->visible_area();
-
- m_x_center=(visarea.width() / 2) << 16;
- m_y_center=(visarea.height() / 2) << 16;
- m_x_max = visarea.max_x << 16;
- m_y_max = visarea.max_y << 16;
-
- vector_add_point_function = &vectrex_state::vectrex_add_point;
- m_refresh = timer_alloc(TIMER_VECTREX_REFRESH);
-}