mirror of
https://github.com/holub/mame
synced 2025-04-24 01:11:11 +03:00
williams.c: convert defender hardware games to bankdev (nw)
This commit is contained in:
parent
8d58fd9af4
commit
d569fd2931
@ -509,32 +509,23 @@
|
||||
|
||||
static ADDRESS_MAP_START( defender_map, AS_PROGRAM, 8, williams_state )
|
||||
AM_RANGE(0x0000, 0xbfff) AM_RAM AM_SHARE("videoram")
|
||||
/* range from 0xc000-0xcfff is mapped programmatically below */
|
||||
AM_RANGE(0xc000, 0xc00f) AM_SHARE("paletteram")
|
||||
AM_RANGE(0xc400, 0xc4ff) AM_SHARE("nvram")
|
||||
AM_RANGE(0xc000, 0xcfff) AM_ROMBANK("bank1")
|
||||
AM_RANGE(0xc000, 0xcfff) AM_DEVICE("bankc000", address_map_bank_device, amap8)
|
||||
AM_RANGE(0xd000, 0xdfff) AM_WRITE(defender_bank_select_w)
|
||||
AM_RANGE(0xd000, 0xffff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
void williams_state::defender_install_io_space(address_space &space)
|
||||
{
|
||||
pia6821_device *pia_0 = space.machine().device<pia6821_device>("pia_0");
|
||||
pia6821_device *pia_1 = space.machine().device<pia6821_device>("pia_1");
|
||||
|
||||
/* this routine dynamically installs the memory mapped above from c000-cfff */
|
||||
space.install_write_bank (0xc000, 0xc00f, 0, 0x03e0, "bank4");
|
||||
space.install_write_handler (0xc010, 0xc01f, 0, 0x03e0, write8_delegate(FUNC(williams_state::defender_video_control_w),this));
|
||||
space.install_write_handler (0xc3ff, 0xc3ff, write8_delegate(FUNC(williams_state::williams_watchdog_reset_w),this));
|
||||
space.install_read_bank(0xc400, 0xc4ff, 0, 0x0300, "bank3");
|
||||
space.install_write_handler(0xc400, 0xc4ff, 0, 0x0300, write8_delegate(FUNC(williams_state::williams_cmos_w),this));
|
||||
space.install_read_handler (0xc800, 0xcbff, 0, 0x03e0, read8_delegate(FUNC(williams_state::williams_video_counter_r),this));
|
||||
space.install_readwrite_handler(0xcc00, 0xcc03, 0, 0x03e0, read8_delegate(FUNC(pia6821_device::read), pia_1), write8_delegate(FUNC(pia6821_device::write), pia_1));
|
||||
space.install_readwrite_handler(0xcc04, 0xcc07, 0, 0x03e0, read8_delegate(FUNC(pia6821_device::read), pia_0), write8_delegate(FUNC(pia6821_device::write), pia_0));
|
||||
membank("bank3")->set_base(m_nvram);
|
||||
membank("bank4")->set_base(m_generic_paletteram_8);
|
||||
}
|
||||
static ADDRESS_MAP_START( defender_bankc000_map, AS_PROGRAM, 8, williams_state )
|
||||
AM_RANGE(0x0000, 0x000f) AM_MIRROR(0x03e0) AM_WRITEONLY AM_SHARE("paletteram")
|
||||
AM_RANGE(0x03ff, 0x03ff) AM_WRITE(williams_watchdog_reset_w)
|
||||
AM_RANGE(0x0010, 0x001f) AM_MIRROR(0x03e0) AM_WRITE(defender_video_control_w)
|
||||
AM_RANGE(0x0400, 0x04ff) AM_MIRROR(0x0300) AM_RAM_WRITE(williams_cmos_w) AM_SHARE("nvram")
|
||||
AM_RANGE(0x0800, 0x0bff) AM_READ(williams_video_counter_r)
|
||||
AM_RANGE(0x0c00, 0x0c03) AM_MIRROR(0x03e0) AM_DEVREADWRITE("pia_1", pia6821_device, read, write)
|
||||
AM_RANGE(0x0c04, 0x0c07) AM_MIRROR(0x03e0) AM_DEVREADWRITE("pia_0", pia6821_device, read, write)
|
||||
AM_RANGE(0x1000, 0x9fff) AM_ROM AM_REGION("maincpu", 0x10000)
|
||||
AM_RANGE(0xa000, 0xffff) AM_NOP
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
|
||||
@ -1432,17 +1423,17 @@ GFXDECODE_END
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static MACHINE_CONFIG_START( defender, williams_state )
|
||||
static MACHINE_CONFIG_START( williams, williams_state )
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", M6809, MASTER_CLOCK/3/4)
|
||||
MCFG_CPU_PROGRAM_MAP(defender_map)
|
||||
MCFG_CPU_PROGRAM_MAP(williams_map)
|
||||
|
||||
MCFG_CPU_ADD("soundcpu", M6808, SOUND_CLOCK) // internal clock divider of 4, effective frequency is 894.886kHz
|
||||
MCFG_CPU_PROGRAM_MAP(defender_sound_map)
|
||||
MCFG_CPU_PROGRAM_MAP(sound_map)
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(williams_state,defender)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(williams_state,defender)
|
||||
MCFG_MACHINE_START_OVERRIDE(williams_state,williams)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(williams_state,williams)
|
||||
MCFG_NVRAM_ADD_0FILL("nvram")
|
||||
|
||||
MCFG_TIMER_DRIVER_ADD("scan_timer", williams_state, williams_va11_callback)
|
||||
@ -1451,7 +1442,7 @@ static MACHINE_CONFIG_START( defender, williams_state )
|
||||
/* video hardware */
|
||||
MCFG_SCREEN_ADD("screen", RASTER)
|
||||
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE | VIDEO_ALWAYS_UPDATE)
|
||||
MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*2/3, 512, 10, 304, 260, 7, 245)
|
||||
MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*2/3, 512, 6, 298, 260, 7, 247)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(williams_state, screen_update_williams)
|
||||
|
||||
MCFG_VIDEO_START_OVERRIDE(williams_state,williams)
|
||||
@ -1480,27 +1471,35 @@ static MACHINE_CONFIG_START( defender, williams_state )
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( jin, defender ) // needs a different screen size or the credit text is clipped
|
||||
/* basic machine hardware */
|
||||
MCFG_SCREEN_MODIFY("screen")
|
||||
MCFG_SCREEN_VISIBLE_AREA(0, 315, 7, 245)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( williams, defender )
|
||||
static MACHINE_CONFIG_DERIVED( defender, williams )
|
||||
|
||||
/* basic machine hardware */
|
||||
|
||||
MCFG_CPU_MODIFY("maincpu")
|
||||
MCFG_CPU_PROGRAM_MAP(williams_map)
|
||||
MCFG_CPU_PROGRAM_MAP(defender_map)
|
||||
|
||||
MCFG_CPU_MODIFY("soundcpu")
|
||||
MCFG_CPU_PROGRAM_MAP(sound_map)
|
||||
MCFG_CPU_PROGRAM_MAP(defender_sound_map)
|
||||
|
||||
MCFG_DEVICE_ADD("bankc000", ADDRESS_MAP_BANK, 0)
|
||||
MCFG_DEVICE_PROGRAM_MAP(defender_bankc000_map)
|
||||
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
|
||||
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
|
||||
MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(16)
|
||||
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000)
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(williams_state,defender)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(williams_state,defender)
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(williams_state,williams)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(williams_state,williams)
|
||||
MCFG_SCREEN_MODIFY("screen")
|
||||
MCFG_SCREEN_VISIBLE_AREA(6, 298-1, 7, 247-1)
|
||||
MCFG_SCREEN_VISIBLE_AREA(12, 304-1, 7, 247-1)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( jin, defender ) // needs a different screen size or the credit text is clipped
|
||||
/* basic machine hardware */
|
||||
MCFG_SCREEN_MODIFY("screen")
|
||||
MCFG_SCREEN_VISIBLE_AREA(0, 315, 7, 247-1)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
@ -1538,24 +1537,6 @@ static MACHINE_CONFIG_DERIVED( lottofun, williams )
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( alienar, defender )
|
||||
|
||||
/* basic machine hardware */
|
||||
|
||||
MCFG_CPU_MODIFY("maincpu")
|
||||
MCFG_CPU_PROGRAM_MAP(williams_map)
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(williams_state,williams)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(williams_state,williams)
|
||||
MCFG_SCREEN_MODIFY("screen")
|
||||
MCFG_SCREEN_VISIBLE_AREA(6, 298-1, 7, 247-1)
|
||||
|
||||
/* pia */
|
||||
MCFG_DEVICE_MODIFY("pia_0")
|
||||
MCFG_PIA_CB2_HANDLER(WRITELINE(williams_state, williams_port_select_w))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( sinistar, williams )
|
||||
|
||||
/* basic machine hardware */
|
||||
@ -1582,7 +1563,7 @@ static MACHINE_CONFIG_DERIVED( playball, williams )
|
||||
|
||||
/* video hardware */
|
||||
MCFG_SCREEN_MODIFY("screen")
|
||||
MCFG_SCREEN_VISIBLE_AREA(6, 298-1, 8, 239-1)
|
||||
MCFG_SCREEN_VISIBLE_AREA(6, 298-1, 8, 240-1)
|
||||
|
||||
/* sound hardware */
|
||||
MCFG_SOUND_ADD("cvsd", HC55516, 0)
|
||||
@ -3045,8 +3026,8 @@ GAME( 1983, blaster, 0, blaster, blaster, blaster_state, blas
|
||||
GAME( 1983, blastero, blaster, blaster, blaster, blaster_state, blaster, ROT0, "Williams / Vid Kidz", "Blaster (location test)", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1983, blasterkit, blaster, blastkit, blastkit, blaster_state, blaster, ROT0, "Williams / Vid Kidz", "Blaster (conversion kit)", GAME_SUPPORTS_SAVE ) // mono sound
|
||||
GAME( 1985, spdball, 0, spdball, spdball, williams_state, spdball, ROT0, "Williams", "Speed Ball - Contest at Neonworld (prototype)", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1985, alienar, 0, alienar, alienar, williams_state, alienar, ROT0, "Duncan Brown", "Alien Arena", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1985, alienaru, alienar, alienar, alienar, williams_state, alienaru, ROT0, "Duncan Brown", "Alien Arena (Stargate upgrade)", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1985, alienar, 0, williams_muxed, alienar, williams_state, alienar, ROT0, "Duncan Brown", "Alien Arena", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1985, alienaru, alienar, williams_muxed, alienar, williams_state, alienaru, ROT0, "Duncan Brown", "Alien Arena (Stargate upgrade)", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1987, lottofun, 0, lottofun, lottofun, williams_state, lottofun, ROT0, "H.A.R. Management", "Lotto Fun", GAME_SUPPORTS_SAVE )
|
||||
|
||||
/* 2nd Generation Williams hardware with tilemaps */
|
||||
|
@ -467,8 +467,7 @@ static MACHINE_CONFIG_START( wmg, wmg_state )
|
||||
/* video hardware */
|
||||
MCFG_SCREEN_ADD("screen", RASTER)
|
||||
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE | VIDEO_ALWAYS_UPDATE)
|
||||
MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*2/3, 512, 10, 304, 260, 7, 245)
|
||||
MCFG_SCREEN_VISIBLE_AREA(6, 298-1, 7, 247-1)
|
||||
MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*2/3, 512, 6, 298, 260, 7, 247)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(williams_state, screen_update_williams)
|
||||
|
||||
MCFG_VIDEO_START_OVERRIDE(williams_state,williams)
|
||||
|
@ -18,6 +18,7 @@ public:
|
||||
m_videoram(*this, "videoram"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_soundcpu(*this, "soundcpu"),
|
||||
m_bankc000(*this, "bankc000"),
|
||||
m_screen(*this, "screen"),
|
||||
m_palette(*this, "palette"),
|
||||
m_generic_paletteram_8(*this, "paletteram") { }
|
||||
@ -42,7 +43,6 @@ public:
|
||||
UINT16 m_blitter_clip_address;
|
||||
UINT8 m_blitter_window_enable;
|
||||
UINT8 m_cocktail;
|
||||
UINT8 m_vram_bank;
|
||||
UINT8 m_port_select;
|
||||
rgb_t *m_palette_lookup;
|
||||
UINT8 m_blitterram[8];
|
||||
@ -94,13 +94,11 @@ public:
|
||||
DECLARE_READ8_MEMBER(williams_input_port_49way_0_5_r);
|
||||
DECLARE_WRITE_LINE_MEMBER(lottofun_coin_lock_w);
|
||||
|
||||
void defender_postload();
|
||||
void state_save_register();
|
||||
void create_palette_lookup();
|
||||
void blitter_init(int blitter_config, const UINT8 *remap_prom);
|
||||
inline void blit_pixel(address_space &space, int dstaddr, int srcdata, int controlbyte);
|
||||
int blitter_core(address_space &space, int sstart, int dstart, int w, int h, int data);
|
||||
void defender_install_io_space(address_space &space);
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(williams_main_irq);
|
||||
DECLARE_WRITE_LINE_MEMBER(williams_main_firq);
|
||||
@ -108,6 +106,7 @@ public:
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_soundcpu;
|
||||
optional_device<address_map_bank_device> m_bankc000;
|
||||
required_device<screen_device> m_screen;
|
||||
optional_device<palette_device> m_palette;
|
||||
optional_shared_ptr<UINT8> m_generic_paletteram_8;
|
||||
@ -129,7 +128,8 @@ public:
|
||||
|
||||
rgb_t m_blaster_color0;
|
||||
UINT8 m_blaster_video_control;
|
||||
UINT8 m_blaster_bank;
|
||||
UINT8 m_vram_bank;
|
||||
UINT8 m_rom_bank;
|
||||
|
||||
DECLARE_WRITE8_MEMBER(blaster_vram_select_w);
|
||||
DECLARE_WRITE8_MEMBER(blaster_bank_select_w);
|
||||
|
@ -135,8 +135,6 @@ MACHINE_START_MEMBER(williams_state,williams_common)
|
||||
/* configure the memory bank */
|
||||
membank("bank1")->configure_entry(1, memregion("maincpu")->base() + 0x10000);
|
||||
membank("bank1")->configure_entry(0, m_videoram);
|
||||
|
||||
save_item(NAME(m_vram_bank));
|
||||
}
|
||||
|
||||
|
||||
@ -225,9 +223,6 @@ MACHINE_START_MEMBER(williams2_state,williams2)
|
||||
membank("bank1")->configure_entries(1, 4, memregion("maincpu")->base() + 0x10000, 0x10000);
|
||||
membank("bank1")->configure_entry(0, m_videoram);
|
||||
membank("vram8000")->set_base(&m_videoram[0x8000]);
|
||||
|
||||
/* register for save states */
|
||||
save_item(NAME(m_vram_bank));
|
||||
}
|
||||
|
||||
|
||||
@ -258,8 +253,7 @@ MACHINE_RESET_MEMBER(williams2_state,williams2)
|
||||
WRITE8_MEMBER(williams_state::williams_vram_select_w)
|
||||
{
|
||||
/* VRAM/ROM banking from bit 0 */
|
||||
m_vram_bank = data & 0x01;
|
||||
membank("bank1")->set_entry(m_vram_bank);
|
||||
membank("bank1")->set_entry(data & 0x01);
|
||||
|
||||
/* cocktail flip from bit 1 */
|
||||
m_cocktail = data & 0x02;
|
||||
@ -268,10 +262,8 @@ WRITE8_MEMBER(williams_state::williams_vram_select_w)
|
||||
|
||||
WRITE8_MEMBER(williams2_state::williams2_bank_select_w)
|
||||
{
|
||||
m_vram_bank = data & 0x07;
|
||||
|
||||
/* the low two bits control the paging */
|
||||
switch (m_vram_bank & 0x03)
|
||||
switch (data & 0x03)
|
||||
{
|
||||
/* page 0 is video ram */
|
||||
case 0:
|
||||
@ -282,13 +274,13 @@ WRITE8_MEMBER(williams2_state::williams2_bank_select_w)
|
||||
/* pages 1 and 2 are ROM */
|
||||
case 1:
|
||||
case 2:
|
||||
membank("bank1")->set_entry(1 + ((m_vram_bank & 6) >> 1));
|
||||
membank("bank1")->set_entry(1 + ((data & 6) >> 1));
|
||||
m_bank8000->set_bank(0);
|
||||
break;
|
||||
|
||||
/* page 3 accesses palette RAM; the remaining areas are as if page 1 ROM was selected */
|
||||
case 3:
|
||||
membank("bank1")->set_entry(1 + ((m_vram_bank & 4) >> 1));
|
||||
membank("bank1")->set_entry(1 + ((data & 4) >> 1));
|
||||
m_bank8000->set_bank(1);
|
||||
break;
|
||||
}
|
||||
@ -489,21 +481,8 @@ WRITE8_MEMBER(williams2_state::williams2_7segment_w)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::defender_postload()
|
||||
{
|
||||
address_space &space = m_maincpu->space(AS_PROGRAM);
|
||||
defender_bank_select_w(space, 0, m_vram_bank);
|
||||
}
|
||||
|
||||
|
||||
MACHINE_START_MEMBER(williams_state,defender)
|
||||
{
|
||||
MACHINE_START_CALL_MEMBER(williams_common);
|
||||
|
||||
/* configure the banking and make sure it is reset to 0 */
|
||||
membank("bank1")->configure_entries(0, 9, &memregion("maincpu")->base()[0x10000], 0x1000);
|
||||
|
||||
machine().save().register_postload(save_prepost_delegate(FUNC(williams_state::defender_postload), this));
|
||||
}
|
||||
|
||||
|
||||
@ -525,36 +504,7 @@ WRITE8_MEMBER(williams_state::defender_video_control_w)
|
||||
|
||||
WRITE8_MEMBER(williams_state::defender_bank_select_w)
|
||||
{
|
||||
m_vram_bank = data & 0x0f;
|
||||
|
||||
/* set bank address */
|
||||
switch (data)
|
||||
{
|
||||
/* page 0 is I/O &space */
|
||||
case 0:
|
||||
defender_install_io_space(space);
|
||||
break;
|
||||
|
||||
/* pages 1-9 map to ROM banks */
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
space.install_read_bank(0xc000, 0xcfff, "bank1");
|
||||
space.unmap_write(0xc000, 0xcfff);
|
||||
membank("bank1")->set_entry(m_vram_bank - 1);
|
||||
break;
|
||||
|
||||
/* pages A-F are not connected */
|
||||
default:
|
||||
space.nop_readwrite(0xc000, 0xcfff);
|
||||
break;
|
||||
}
|
||||
m_bankc000->set_bank(data & 0x0f);
|
||||
}
|
||||
|
||||
|
||||
@ -602,8 +552,6 @@ WRITE8_MEMBER(williams_state::sinistar_vram_select_w)
|
||||
|
||||
MACHINE_START_MEMBER(blaster_state,blaster)
|
||||
{
|
||||
MACHINE_START_CALL_MEMBER(williams_common);
|
||||
|
||||
/* banking is different for blaster */
|
||||
membank("bank1")->configure_entries(1, 16, memregion("maincpu")->base() + 0x18000, 0x4000);
|
||||
membank("bank1")->configure_entry(0, m_videoram);
|
||||
@ -611,7 +559,9 @@ MACHINE_START_MEMBER(blaster_state,blaster)
|
||||
membank("bank2")->configure_entries(1, 16, memregion("maincpu")->base() + 0x10000, 0x0000);
|
||||
membank("bank2")->configure_entry(0, &m_videoram[0x4000]);
|
||||
|
||||
save_item(NAME(m_blaster_bank));
|
||||
/* register for save states */
|
||||
save_item(NAME(m_vram_bank));
|
||||
save_item(NAME(m_rom_bank));
|
||||
}
|
||||
|
||||
|
||||
@ -623,8 +573,8 @@ MACHINE_RESET_MEMBER(blaster_state,blaster)
|
||||
|
||||
inline void blaster_state::update_blaster_banking()
|
||||
{
|
||||
membank("bank1")->set_entry(m_vram_bank * (m_blaster_bank + 1));
|
||||
membank("bank2")->set_entry(m_vram_bank * (m_blaster_bank + 1));
|
||||
membank("bank1")->set_entry(m_vram_bank * (m_rom_bank + 1));
|
||||
membank("bank2")->set_entry(m_vram_bank * (m_rom_bank + 1));
|
||||
}
|
||||
|
||||
|
||||
@ -644,7 +594,7 @@ WRITE8_MEMBER(blaster_state::blaster_vram_select_w)
|
||||
|
||||
WRITE8_MEMBER(blaster_state::blaster_bank_select_w)
|
||||
{
|
||||
m_blaster_bank = data & 0x0f;
|
||||
m_rom_bank = data & 0x0f;
|
||||
update_blaster_banking();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user