From 66f5c175ef568942f3bf9e0831b690c8d3a1e109 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 20 Feb 2018 20:21:21 +1100 Subject: even more encapsulation/cleanup (nw) --- src/mame/drivers/cyberbal.cpp | 84 +++++++++------------ src/mame/drivers/unico.cpp | 89 +++++++++------------- src/mame/drivers/vectrex.cpp | 53 +++++++------- src/mame/includes/cyberbal.h | 164 +++++++++++++++++++++++++---------------- src/mame/includes/unico.h | 116 ++++++++++++++++++++--------- src/mame/includes/vectrex.h | 155 ++++++++++++++++++++++++--------------- src/mame/machine/vectrex.cpp | 74 ++++++++++--------- src/mame/video/cyberbal.cpp | 166 +++++++++++++++++++++--------------------- src/mame/video/unico.cpp | 4 +- src/mame/video/vectrex.cpp | 58 +++++++-------- 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 m_playfield_tilemap; + required_device m_alpha_tilemap; + required_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 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 m_audiocpu; - optional_device m_extracpu; - optional_device m_daccpu; - optional_device m_rdac; - optional_device m_ldac; - optional_device m_soundcomm; - optional_device m_ymsnd; - optional_device m_jsa; - required_device m_playfield_tilemap; - required_device m_alpha_tilemap; - required_device m_mob; - optional_device m_playfield2_tilemap; - optional_device m_alpha2_tilemap; - optional_device m_mob2; - optional_device m_lscreen; - optional_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 m_audiocpu; + required_device m_extracpu; + required_device m_daccpu; + required_device m_rdac; + required_device m_ldac; + required_device m_soundcomm; + required_device m_ymsnd; + required_device m_playfield2_tilemap; + required_device m_alpha2_tilemap; + required_device m_mob2; + required_device m_lscreen; + required_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 m_palette; + +private: std::unique_ptr m_vram; std::unique_ptr m_scroll; tilemap_t *m_tilemap[3]; int m_sprites_scrolldx; int m_sprites_scrolldy; std::unique_ptr m_spriteram; + + required_device m_maincpu; + optional_device m_oki; + required_device m_gfxdecode; + optional_shared_ptr 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 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 m_maincpu; - optional_device m_oki; - optional_device m_eeprom; - required_device m_gfxdecode; - required_device m_screen; - required_device m_palette; - optional_shared_ptr m_generic_paletteram_16; - optional_shared_ptr 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 m_eeprom; + required_shared_ptr 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 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 m_maincpu; + optional_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 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 m_maincpu; required_device m_via6522_0; required_device m_dac; required_device m_ay8912; required_device m_vector; - optional_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 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("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("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(0xc000 / 2); m_scroll = make_unique_clear(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); -} -- cgit v1.2.3