diff options
author | ajrhacker <ajrhacker@users.noreply.github.com> | 2018-04-07 15:12:32 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-07 15:12:32 -0400 |
commit | 8785008a9ff6ed84b3300472a75cd3831d9c1926 (patch) | |
tree | 411fe73bdbb6b07886feb8aafc74f272230d828a | |
parent | 11314aafec402e035dc3db3df096765e621ed3aa (diff) | |
parent | 5d681235f049096b07be02e019deb78fa41d99f6 (diff) |
Merge pull request #3433 from cam900/atarisy2_bank
atarisy2.cpp Cleanups
-rw-r--r-- | src/mame/drivers/atarisy2.cpp | 61 | ||||
-rw-r--r-- | src/mame/includes/atarisy2.h | 42 | ||||
-rw-r--r-- | src/mame/video/atarisy2.cpp | 67 |
3 files changed, 70 insertions, 100 deletions
diff --git a/src/mame/drivers/atarisy2.cpp b/src/mame/drivers/atarisy2.cpp index 1a04fb35172..069a564727b 100644 --- a/src/mame/drivers/atarisy2.cpp +++ b/src/mame/drivers/atarisy2.cpp @@ -204,8 +204,8 @@ MACHINE_START_MEMBER(atarisy2_state,atarisy2) save_item(NAME(m_p2portrd_state)); save_item(NAME(m_sound_reset_state)); - m_rombank1->configure_entries(0, 64, memregion("maincpu")->base() + 0x10000, 0x2000); - m_rombank2->configure_entries(0, 64, memregion("maincpu")->base() + 0x10000, 0x2000); + for (int bank = 0; bank < 2; bank++) + m_rombank[bank]->configure_entries(0, 64, memregion("maincpu")->base() + 0x10000, 0x2000); } @@ -296,10 +296,7 @@ WRITE16_MEMBER(atarisy2_state::bankselect_w) int banknumber = ((data >> 10) & 0x3f) ^ 0x03; banknumber = bitswap<16>(banknumber, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 1, 0, 3, 2); - if (offset) - m_rombank2->set_entry(banknumber); - else - m_rombank1->set_entry(banknumber); + m_rombank[offset]->set_entry(banknumber); } @@ -726,7 +723,6 @@ WRITE8_MEMBER(atarisy2_state::coincount_w) } - /************************************* * * Main CPU memory handlers @@ -752,7 +748,7 @@ void atarisy2_state::main_map(address_map &map) map(0x1780, 0x1781).mirror(0x007e).w(this, FUNC(atarisy2_state::yscroll_w)).share("yscroll"); map(0x1800, 0x1801).mirror(0x03fe).r(this, FUNC(atarisy2_state::switch_r)).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); map(0x1c00, 0x1c01).mirror(0x03fe).r(this, FUNC(atarisy2_state::sound_r)); - map(0x2000, 0x3fff).rw(this, FUNC(atarisy2_state::videoram_r), FUNC(atarisy2_state::videoram_w)); + map(0x2000, 0x3fff).m(m_vrambank, FUNC(address_map_bank_device::amap16)); map(0x4000, 0x5fff).bankr("rombank1"); map(0x6000, 0x7fff).bankr("rombank2"); map(0x8000, 0xffff).rom(); @@ -760,6 +756,22 @@ void atarisy2_state::main_map(address_map &map) } +/************************************* + * + * Bankswitched VRAM handlers + * + *************************************/ + +/* full memory map derived from schematics */ +void atarisy2_state::vrambank_map(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x17ff).ram().w(m_alpha_tilemap, FUNC(tilemap_device::write16)).share("alpha"); + map(0x1800, 0x1fff).ram().w(this, FUNC(atarisy2_state::spriteram_w)).share("mob"); + map(0x2000, 0x3fff).ram(); + map(0x4000, 0x7fff).ram().w(m_playfield_tilemap, FUNC(tilemap_device::write16)).share("playfield"); +} + /************************************* * @@ -790,7 +802,6 @@ void atarisy2_state::sound_map(address_map &map) } - /************************************* * * Port definitions @@ -1114,7 +1125,6 @@ static INPUT_PORTS_START( apb ) INPUT_PORTS_END - /************************************* * * Graphics definitions @@ -1127,9 +1137,9 @@ static const gfx_layout anlayout = RGN_FRAC(1,1), 2, { 0, 4 }, - { 0, 1, 2, 3, 8, 9, 10, 11 }, - { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 }, - 8*16 + { STEP4(0,1), STEP4(8,1) }, + { STEP8(0,8*2) }, + 8*8*2 }; @@ -1139,9 +1149,9 @@ static const gfx_layout pflayout = RGN_FRAC(1,2), 4, { 0, 4, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4 }, - { 0, 1, 2, 3, 8, 9, 10, 11 }, - { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 }, - 8*16 + { STEP4(0,1), STEP4(8,1) }, + { STEP8(0,8*2) }, + 8*8*2 }; @@ -1151,9 +1161,9 @@ static const gfx_layout molayout = RGN_FRAC(1,2), 4, { 0, 4, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4 }, - { 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27 }, - { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 }, - 8*64 + { STEP4(8*0,1), STEP4(8*1,1), STEP4(8*2,1), STEP4(8*3,1) }, + { STEP8(0,8*4) }, + 16*16*2 }; @@ -1216,6 +1226,13 @@ MACHINE_CONFIG_START(atarisy2_state::atarisy2) MCFG_SCREEN_PALETTE("palette") MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(atarisy2_state, vblank_int)) + MCFG_DEVICE_ADD("vrambank", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(vrambank_map) + MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(16) + MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(15) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x2000) + MCFG_VIDEO_START_OVERRIDE(atarisy2_state,atarisy2) /* sound hardware */ @@ -1279,8 +1296,6 @@ MACHINE_CONFIG_START(atarisy2_state::apb) MACHINE_CONFIG_END - - /************************************* * * ROM definition(s) @@ -1500,6 +1515,7 @@ ROM_START( paperboyp ) ROM_LOAD( "vid_t06.rv1", 0x000000, 0x002000, BAD_DUMP CRC(60d7aebb) SHA1(ad74221c4270496ebcfedd46ea16dca2cda1b4be) ) ROM_END + ROM_START( 720 ) ROM_REGION( 0x90000, "maincpu", 0 ) /* 9 * 64k T11 code */ ROM_LOAD16_BYTE( "136047-3126.7lm", 0x008000, 0x004000, CRC(43abd367) SHA1(bb58c42f25ef0ee5357782652e9e2b28df0ba82e) ) @@ -1908,7 +1924,6 @@ ROM_START( 720gr1 ) ROM_END - ROM_START( ssprint ) ROM_REGION( 0x90000, "maincpu", 0 ) /* 9*64k for T11 code */ ROM_LOAD16_BYTE( "136042-330.7l", 0x008000, 0x004000, CRC(ee312027) SHA1(7caeaf6220022ffffc7d1feefec24163bed70275) ) @@ -3237,7 +3252,6 @@ ROM_START( apbf ) ROM_END - /************************************* * * Driver initialization @@ -3312,7 +3326,6 @@ DRIVER_INIT_MEMBER(atarisy2_state,apb) } - /************************************* * * Game driver(s) diff --git a/src/mame/includes/atarisy2.h b/src/mame/includes/atarisy2.h index 03db8308ed6..be76279270d 100644 --- a/src/mame/includes/atarisy2.h +++ b/src/mame/includes/atarisy2.h @@ -10,6 +10,7 @@ #include "video/atarimo.h" #include "cpu/m6502/m6502.h" #include "cpu/t11/t11.h" +#include "machine/bankdev.h" #include "machine/watchdog.h" #include "sound/ym2151.h" #include "sound/pokey.h" @@ -20,26 +21,27 @@ class atarisy2_state : public atarigen_state { public: atarisy2_state(const machine_config &mconfig, device_type type, const char *tag) - : atarigen_state(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"), - m_mob(*this, "mob"), - m_slapstic_base(*this, "slapstic_base"), - m_playfield_tilemap(*this, "playfield"), - m_alpha_tilemap(*this, "alpha"), - m_soundcomm(*this, "soundcomm"), - m_ym2151(*this, "ymsnd"), - m_pokey(*this, "pokey%u", 1U), - m_tms5220(*this, "tms"), - m_rombank1(*this, "rombank1"), - m_rombank2(*this, "rombank2"), - m_slapstic(*this, "slapstic") - { } + : atarigen_state(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_audiocpu(*this, "audiocpu") + , m_mob(*this, "mob") + , m_slapstic_base(*this, "slapstic_base") + , m_vrambank(*this, "vrambank") + , m_playfield_tilemap(*this, "playfield") + , m_alpha_tilemap(*this, "alpha") + , m_soundcomm(*this, "soundcomm") + , m_ym2151(*this, "ymsnd") + , m_pokey(*this, "pokey%u", 1U) + , m_tms5220(*this, "tms") + , m_rombank(*this, "rombank%u", 1U) + , m_slapstic(*this, "slapstic") + { } required_device<t11_device> m_maincpu; required_device<m6502_device> m_audiocpu; required_device<atari_motion_objects_device> m_mob; required_shared_ptr<uint16_t> m_slapstic_base; + required_device<address_map_bank_device> m_vrambank; uint8_t m_interrupt_enable; @@ -56,15 +58,13 @@ public: uint8_t m_p2portwr_state; uint8_t m_p2portrd_state; - required_memory_bank m_rombank1; - required_memory_bank m_rombank2; + required_memory_bank_array<2> m_rombank; required_device<atari_slapstic_device> m_slapstic; uint8_t m_sound_reset_state; emu_timer * m_yscroll_reset_timer; uint32_t m_playfield_tile_bank[2]; - uint32_t m_videobank; // 720 fake joystick double m_joy_last_angle; @@ -75,8 +75,6 @@ public: int32_t m_spin_pos; /* track fake position of spinner */ uint32_t m_spin_center_count; - uint16_t m_vram[0x8000/2]; - virtual void device_post_load() override; virtual void update_interrupts() override; @@ -112,11 +110,10 @@ public: TIMER_CALLBACK_MEMBER(delayed_int_enable_w); TIMER_CALLBACK_MEMBER(reset_yscroll_callback); DECLARE_READ16_MEMBER(slapstic_r); - DECLARE_READ16_MEMBER(videoram_r); DECLARE_WRITE16_MEMBER(slapstic_w); DECLARE_WRITE16_MEMBER(yscroll_w); DECLARE_WRITE16_MEMBER(xscroll_w); - DECLARE_WRITE16_MEMBER(videoram_w); + DECLARE_WRITE16_MEMBER(spriteram_w); DECLARE_PALETTE_DECODER(RRRRGGGGBBBBIIII); static const atari_motion_objects_config s_mob_config; @@ -128,4 +125,5 @@ public: void csprint(machine_config &config); void main_map(address_map &map); void sound_map(address_map &map); + void vrambank_map(address_map &map); }; diff --git a/src/mame/video/atarisy2.cpp b/src/mame/video/atarisy2.cpp index a76b917760e..bc869696a2f 100644 --- a/src/mame/video/atarisy2.cpp +++ b/src/mame/video/atarisy2.cpp @@ -12,7 +12,6 @@ #include "includes/atarisy2.h" - /************************************* * * Tilemap callbacks @@ -31,14 +30,13 @@ TILE_GET_INFO_MEMBER(atarisy2_state::get_alpha_tile_info) TILE_GET_INFO_MEMBER(atarisy2_state::get_playfield_tile_info) { uint16_t data = m_playfield_tilemap->basemem_read(tile_index); - int code = m_playfield_tile_bank[(data >> 10) & 1] + (data & 0x3ff); + int code = (m_playfield_tile_bank[(data >> 10) & 1] << 10) | (data & 0x3ff); int color = (data >> 11) & 7; SET_TILE_INFO_MEMBER(0, code, color, 0); tileinfo.category = (~data >> 14) & 3; } - /************************************* * * Video system start @@ -81,23 +79,15 @@ const atari_motion_objects_config atarisy2_state::s_mob_config = VIDEO_START_MEMBER(atarisy2_state,atarisy2) { - /* initialize banked memory */ - m_alpha_tilemap->basemem().set(&m_vram[0x0000], 0x2000, 16, ENDIANNESS_NATIVE, 2); - m_playfield_tilemap->basemem().set(&m_vram[0x2000], 0x2000, 16, ENDIANNESS_NATIVE, 2); - m_mob->set_spriteram(&m_vram[0x0c00], 0x0400); - /* reset the statics */ m_yscroll_reset_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(atarisy2_state::reset_yscroll_callback),this)); - m_videobank = 0; + m_vrambank->set_bank(0); /* save states */ save_item(NAME(m_playfield_tile_bank)); - save_item(NAME(m_videobank)); - save_item(NAME(m_vram)); } - /************************************* * * Scroll/playfield bank write @@ -118,9 +108,9 @@ WRITE16_MEMBER( atarisy2_state::xscroll_w ) m_playfield_tilemap->set_scrollx(0, newscroll >> 6); /* update the playfield banking */ - if (m_playfield_tile_bank[0] != (newscroll & 0x0f) * 0x400) + if (m_playfield_tile_bank[0] != (newscroll & 0x0f)) { - m_playfield_tile_bank[0] = (newscroll & 0x0f) * 0x400; + m_playfield_tile_bank[0] = (newscroll & 0x0f); m_playfield_tilemap->mark_all_dirty(); } @@ -152,9 +142,9 @@ WRITE16_MEMBER( atarisy2_state::yscroll_w ) m_yscroll_reset_timer->adjust(m_screen->time_until_pos(0), newscroll >> 6); /* update the playfield banking */ - if (m_playfield_tile_bank[1] != (newscroll & 0x0f) * 0x400) + if (m_playfield_tile_bank[1] != (newscroll & 0x0f)) { - m_playfield_tile_bank[1] = (newscroll & 0x0f) * 0x400; + m_playfield_tile_bank[1] = (newscroll & 0x0f); m_playfield_tilemap->mark_all_dirty(); } @@ -163,7 +153,6 @@ WRITE16_MEMBER( atarisy2_state::yscroll_w ) } - /************************************* * * Palette RAM to RGB converter @@ -194,7 +183,6 @@ PALETTE_DECODER_MEMBER( atarisy2_state, RRRRGGGGBBBBIIII ) } - /************************************* * * Video RAM bank read/write handlers @@ -207,7 +195,7 @@ READ16_MEMBER( atarisy2_state::slapstic_r ) m_slapstic->slapstic_tweak(space, offset); /* an extra tweak for the next opcode fetch */ - m_videobank = m_slapstic->slapstic_tweak(space, 0x1234) * 0x1000; + m_vrambank->set_bank(m_slapstic->slapstic_tweak(space, 0x1234)); return result; } @@ -217,54 +205,25 @@ WRITE16_MEMBER( atarisy2_state::slapstic_w ) m_slapstic->slapstic_tweak(space, offset); /* an extra tweak for the next opcode fetch */ - m_videobank = m_slapstic->slapstic_tweak(space, 0x1234) * 0x1000; + m_vrambank->set_bank(m_slapstic->slapstic_tweak(space, 0x1234)); } - /************************************* * * Video RAM read/write handlers * *************************************/ -READ16_MEMBER( atarisy2_state::videoram_r ) -{ - int offs = offset | m_videobank; - return m_vram[offs]; -} - - -WRITE16_MEMBER( atarisy2_state::videoram_w ) +WRITE16_MEMBER( atarisy2_state::spriteram_w ) { - int offs = offset | m_videobank; - - /* alpharam? */ - if (offs < 0x0c00) - m_alpha_tilemap->write16(space, offs, data, mem_mask); - - /* spriteram? */ - else if (offs < 0x1000) - { - /* force an update if the link of object 0 is about to change */ - if (offs == 0x0c03) - m_screen->update_partial(m_screen->vpos()); - COMBINE_DATA(&m_mob->spriteram()[offs - 0x0c00]); - } - - /* playfieldram? */ - else if (offs >= 0x2000) - m_playfield_tilemap->write16(space, offs - 0x2000, data, mem_mask); - - /* generic case */ - else - { - COMBINE_DATA(&m_vram[offs]); - } + /* force an update if the link of object 0 is about to change */ + if (offs == 0x0003) + m_screen->update_partial(m_screen->vpos()); + COMBINE_DATA(&m_mob->spriteram()[offset]); } - /************************************* * * Main refresh |