mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
kpontoon: add text layer tilemap, palette, and char ROM readback for POST [R. Belmont]
This commit is contained in:
parent
f3b3a0db44
commit
65f56d19c5
@ -1,5 +1,5 @@
|
|||||||
// license:BSD-3-Clause
|
// license:BSD-3-Clause
|
||||||
// copyright-holders:
|
// copyright-holders: R. Belmont
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Pontoon (GS270) (c) 1993 Konami
|
Pontoon (GS270) (c) 1993 Konami
|
||||||
@ -13,6 +13,9 @@ PWB353261A
|
|||||||
1 053252
|
1 053252
|
||||||
3 8-dip banks
|
3 8-dip banks
|
||||||
3 XTALs (1 21.05300MHz and 2 18.43200MHz)
|
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"
|
#include "emu.h"
|
||||||
@ -23,7 +26,7 @@ PWB353261A
|
|||||||
#include "emupal.h"
|
#include "emupal.h"
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
|
#include "tilemap.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@ -33,43 +36,98 @@ public:
|
|||||||
kpontoon_state(const machine_config &mconfig, device_type type, const char *tag) :
|
kpontoon_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||||
driver_device(mconfig, type, tag),
|
driver_device(mconfig, type, tag),
|
||||||
m_maincpu(*this, "maincpu"),
|
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);
|
void kpontoon(machine_config &config);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
|
virtual void machine_reset() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
tilemap_t *m_ttl_tilemap;
|
||||||
|
|
||||||
void main_map(address_map &map);
|
void main_map(address_map &map);
|
||||||
void sound_map(address_map &map);
|
void sound_map(address_map &map);
|
||||||
|
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_memory_bank m_mainbank;
|
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)
|
void kpontoon_state::main_map(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x0000, 0x7fff).rom().region("maincpu", 0);
|
map(0x0000, 0x7fff).rom().region("maincpu", 0);
|
||||||
map(0x8000, 0x9fff).bankr(m_mainbank);
|
map(0x8000, 0x9fff).bankr(m_mainbank);
|
||||||
map(0xa000, 0xafff).ram(); // ?
|
map(0xa000, 0xafff).ram();
|
||||||
map(0xb000, 0xbfff).ram(); // ?
|
map(0xb000, 0xbfff).ram(); // work RAM (stack is here)
|
||||||
map(0xc000, 0xcfff).ram(); // chars
|
|
||||||
map(0xe000, 0xefff).ram(); // ?
|
map(0x0000, 0xffff).view(m_charview);
|
||||||
map(0xf000, 0xf1ff).ram(); // palette?
|
m_charview[0](0xc000, 0xcfff).ram().share("ttl_vram").w(FUNC(kpontoon_state::ttl_ram_w));
|
||||||
map(0xf830, 0xf830).w(FUNC(kpontoon_state::bankswitch_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)
|
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->configure_entries(0, 4, memregion("maincpu")->base() + 0x8000, 0x2000);
|
||||||
m_mainbank->set_entry(0);
|
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)
|
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;
|
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_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // TODO: all wrong
|
||||||
screen.set_refresh_hz(60);
|
screen.set_refresh_hz(60);
|
||||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
|
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
|
||||||
screen.set_size(64*8, 32*8);
|
screen.set_size(128*8, 64*8);
|
||||||
screen.set_visarea(13*8, (64-13)*8-1, 2*8, 30*8-1);
|
screen.set_visarea(26*8, 90*8-1, 24, 56*8-1);
|
||||||
screen.set_screen_update(FUNC(kpontoon_state::screen_update));
|
screen.set_screen_update(FUNC(kpontoon_state::screen_update));
|
||||||
screen.set_palette("palette");
|
screen.set_palette("palette");
|
||||||
|
|
||||||
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 512); // TODO: all wrong
|
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 256); // TODO: all wrong
|
||||||
GFXDECODE(config, "gfxdecode", "palette", gfx_pontoon);
|
GFXDECODE(config, m_gfxdecode, "palette", gfx_pontoon);
|
||||||
|
|
||||||
// sound hardware
|
// sound hardware
|
||||||
SPEAKER(config, "lspeaker").front_left();
|
SPEAKER(config, "lspeaker").front_left();
|
||||||
@ -162,7 +248,7 @@ void kpontoon_state::kpontoon(machine_config &config)
|
|||||||
k053247_device &k053246(K053246(config, "k053246", 0));
|
k053247_device &k053246(K053246(config, "k053246", 0));
|
||||||
//k053246.set_sprite_callback(FUNC(kpontoon_state::sprite_callback));
|
//k053246.set_sprite_callback(FUNC(kpontoon_state::sprite_callback));
|
||||||
k053246.set_config(NORMAL_PLANE_ORDER, 0, 0); // TODO: verify
|
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_device &k054539(K054539(config, "k054539", 18.432_MHz_XTAL));
|
||||||
k054539.add_route(0, "rspeaker", 0.75);
|
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( "270ea13.bin", 0x00001, 0x10000, CRC(ead4a114) SHA1(ddce7c4c4606cedcc05c1d2e5fdeda5d1358c97e) )
|
||||||
ROM_LOAD64_BYTE( "270ea14.bin", 0x00000, 0x10000, CRC(ac6b06c2) SHA1(5584b1d1047f0e447dd20252eb0ec3089bd228fe) )
|
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( "270ea05.bin", 0x00000, 0x20000, CRC(d08e9a8b) SHA1(d333fa4f89907dd223e7a7d6c57a7fc78e61ee2d) )
|
||||||
ROM_LOAD16_BYTE( "270ea06.bin", 0x00001, 0x20000, CRC(11eccb4b) SHA1(b943aa492819aa0563fc5295a890cd59c4b8aa4c) )
|
ROM_LOAD16_BYTE( "270ea06.bin", 0x00001, 0x20000, CRC(11eccb4b) SHA1(b943aa492819aa0563fc5295a890cd59c4b8aa4c) )
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user