mirror of
https://github.com/holub/mame
synced 2025-04-19 23:12:11 +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,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) )
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user