kpontoon: add text layer tilemap, palette, and char ROM readback for POST [R. Belmont]

This commit is contained in:
arbee 2021-01-26 23:11:24 -05:00
parent f3b3a0db44
commit 65f56d19c5

View File

@ -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<cpu_device> m_maincpu;
required_memory_bank m_mainbank;
required_shared_ptr<u8> m_ttl_vram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
memory_view m_charview;
required_region_ptr<u8> 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) )