diff --git a/src/mame/drivers/kpontoon.cpp b/src/mame/drivers/kpontoon.cpp index 8ff93de81e2..a6e59ec9013 100644 --- a/src/mame/drivers/kpontoon.cpp +++ b/src/mame/drivers/kpontoon.cpp @@ -1,18 +1,21 @@ // license:BSD-3-Clause -// copyright-holders: +// copyright-holders: R. Belmont /* -Pontoon (GS270) (c) 1993 Konami + Pontoon (GS270) (c) 1993 Konami -PWB353261A + PWB353261A -2 Z84C0008PEC -1 053246A -1 053247A -1 054539 -1 053252 -3 8-dip banks -3 XTALs (1 21.05300MHz and 2 18.43200MHz) + 2 Z84C0008PEC + 1 053246A + 1 053247A + 1 054539 + 1 053252 + 3 8-dip banks + 3 XTALs (1 21.05300MHz and 2 18.43200MHz) + + TTL char readback: + C000-D000 window, control bit 7 enables ROM readback, bit 6 selects which ROM, F450 banks */ #include "emu.h" @@ -23,7 +26,7 @@ PWB353261A #include "emupal.h" #include "screen.h" #include "speaker.h" - +#include "tilemap.h" namespace { @@ -33,43 +36,98 @@ public: kpontoon_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_mainbank(*this, "mainbank") + m_mainbank(*this, "mainbank"), + m_ttl_vram(*this, "ttl_vram"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette"), + m_charview(*this, "charview"), + m_charrom(*this, "chars") { } void kpontoon(machine_config &config); protected: virtual void machine_start() override; + virtual void machine_reset() override; private: + tilemap_t *m_ttl_tilemap; + void main_map(address_map &map); void sound_map(address_map &map); required_device m_maincpu; required_memory_bank m_mainbank; + required_shared_ptr m_ttl_vram; + required_device m_gfxdecode; + required_device m_palette; + memory_view m_charview; + required_region_ptr m_charrom; - void bankswitch_w(uint8_t data); + void control_w(u8 data); + void charrom_bank_w(u8 data); + u8 charrom_r(offs_t offset); + void ttl_ram_w(offs_t offset, u8 data); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + TILE_GET_INFO_MEMBER(ttl_get_tile_info); + + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + u8 m_control; + u8 m_charrom_bank; }; -void kpontoon_state::bankswitch_w(uint8_t data) +void kpontoon_state::control_w(u8 data) { - m_mainbank->set_entry(data & 0x03); +/* + bit 7 = 1 to enable char ROM readback at C000-D000, 0 for char VRAM + bit 6 = ? + bit 5 = char ROM select for readback + bit 4 = ? + bit 3 = ? + bit 2 = ? + bit 0,1 = program ROM bank +*/ - // logerror("f830 write: %02x\n", data); + m_mainbank->set_entry(data & 0x03); + m_charview.select(BIT(data, 7)); + m_control = data; +} + +void kpontoon_state::charrom_bank_w(u8 data) +{ + m_charrom_bank = data; +} + +u8 kpontoon_state::charrom_r(offs_t offset) +{ + offs_t loc = ((0x1000 * m_charrom_bank) + offset) << 1; + + // ROMs are byte interleaved, bit 6 selects which ROM we're reading + if (!BIT(m_control, 5)) + { + loc += 1; + } + + return m_charrom[loc]; } void kpontoon_state::main_map(address_map &map) { map(0x0000, 0x7fff).rom().region("maincpu", 0); map(0x8000, 0x9fff).bankr(m_mainbank); - map(0xa000, 0xafff).ram(); // ? - map(0xb000, 0xbfff).ram(); // ? - map(0xc000, 0xcfff).ram(); // chars - map(0xe000, 0xefff).ram(); // ? - map(0xf000, 0xf1ff).ram(); // palette? - map(0xf830, 0xf830).w(FUNC(kpontoon_state::bankswitch_w)); + map(0xa000, 0xafff).ram(); + map(0xb000, 0xbfff).ram(); // work RAM (stack is here) + + map(0x0000, 0xffff).view(m_charview); + m_charview[0](0xc000, 0xcfff).ram().share("ttl_vram").w(FUNC(kpontoon_state::ttl_ram_w)); + m_charview[1](0xc000, 0xcfff).r(FUNC(kpontoon_state::charrom_r)); + + map(0xe000, 0xefff).ram(); + map(0xf000, 0xf1ff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette"); + map(0xf450, 0xf450).w(FUNC(kpontoon_state::charrom_bank_w)); + map(0xf470, 0xf470).nopw(); // watchdog + map(0xf830, 0xf830).w(FUNC(kpontoon_state::control_w)); } void kpontoon_state::sound_map(address_map &map) @@ -120,10 +178,38 @@ void kpontoon_state::machine_start() { m_mainbank->configure_entries(0, 4, memregion("maincpu")->base() + 0x8000, 0x2000); m_mainbank->set_entry(0); + + m_ttl_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(kpontoon_state::ttl_get_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 32); + m_ttl_tilemap->set_transparent_pen(0); +} + +void kpontoon_state::machine_reset() +{ + m_charview.select(0); +} + +void kpontoon_state::ttl_ram_w(offs_t offset, u8 data) +{ + u8 *vram = (u8 *)m_ttl_vram.target(); + vram[offset] = data; + m_ttl_tilemap->mark_tile_dirty(offset / 2); +} + +TILE_GET_INFO_MEMBER(kpontoon_state::ttl_get_tile_info) +{ + u8 *vram = (u8 *)m_ttl_vram.target(); + int attr, code; + + attr = vram[(tile_index << 1) + 1]; + code = vram[(tile_index << 1)]; + + tileinfo.set(0, code, attr, 0); } uint32_t kpontoon_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { + bitmap.fill(0, cliprect); + m_ttl_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0; } @@ -147,13 +233,13 @@ void kpontoon_state::kpontoon(machine_config &config) screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // TODO: all wrong screen.set_refresh_hz(60); screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); - screen.set_size(64*8, 32*8); - screen.set_visarea(13*8, (64-13)*8-1, 2*8, 30*8-1); + screen.set_size(128*8, 64*8); + screen.set_visarea(26*8, 90*8-1, 24, 56*8-1); screen.set_screen_update(FUNC(kpontoon_state::screen_update)); screen.set_palette("palette"); - PALETTE(config, "palette").set_format(palette_device::xBGR_555, 512); // TODO: all wrong - GFXDECODE(config, "gfxdecode", "palette", gfx_pontoon); + PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 256); // TODO: all wrong + GFXDECODE(config, m_gfxdecode, "palette", gfx_pontoon); // sound hardware SPEAKER(config, "lspeaker").front_left(); @@ -162,7 +248,7 @@ void kpontoon_state::kpontoon(machine_config &config) k053247_device &k053246(K053246(config, "k053246", 0)); //k053246.set_sprite_callback(FUNC(kpontoon_state::sprite_callback)); k053246.set_config(NORMAL_PLANE_ORDER, 0, 0); // TODO: verify - k053246.set_palette("palette"); + k053246.set_palette(m_palette); k054539_device &k054539(K054539(config, "k054539", 18.432_MHz_XTAL)); k054539.add_route(0, "rspeaker", 0.75); @@ -187,7 +273,7 @@ ROM_START( kpontoon ) ROM_LOAD64_BYTE( "270ea13.bin", 0x00001, 0x10000, CRC(ead4a114) SHA1(ddce7c4c4606cedcc05c1d2e5fdeda5d1358c97e) ) ROM_LOAD64_BYTE( "270ea14.bin", 0x00000, 0x10000, CRC(ac6b06c2) SHA1(5584b1d1047f0e447dd20252eb0ec3089bd228fe) ) - ROM_REGION( 0x40000, "chars", 0 ) // they aren't near any Konami custom + ROM_REGION( 0x40000, "chars", 0 ) ROM_LOAD16_BYTE( "270ea05.bin", 0x00000, 0x20000, CRC(d08e9a8b) SHA1(d333fa4f89907dd223e7a7d6c57a7fc78e61ee2d) ) ROM_LOAD16_BYTE( "270ea06.bin", 0x00001, 0x20000, CRC(11eccb4b) SHA1(b943aa492819aa0563fc5295a890cd59c4b8aa4c) )