drgnmst.cpp : Cleanups, Reduce duplicates (#3705)

Add PALETTE_DECODER for palette
This commit is contained in:
cam900 2018-07-03 03:11:47 +09:00 committed by Vas Crabb
parent 2971f4cdbf
commit 595512e60e
3 changed files with 111 additions and 122 deletions

View File

@ -46,27 +46,23 @@ Notes:
#include "speaker.h"
WRITE16_MEMBER(drgnmst_state::drgnmst_coin_w)
WRITE16_MEMBER(drgnmst_state::coin_w)
{
machine().bookkeeping().coin_counter_w(0, data & 0x100);
machine().bookkeeping().coin_lockout_w(0, ~data & 0x400);
machine().bookkeeping().coin_lockout_w(1, ~data & 0x800);
}
WRITE16_MEMBER(drgnmst_state::drgnmst_snd_command_w)
WRITE8_MEMBER(drgnmst_state::snd_command_w)
{
if (ACCESSING_BITS_0_7)
{
m_snd_command = (data & 0xff);
m_maincpu->yield();
}
m_snd_command = (data & 0xff);
m_maincpu->yield();
}
WRITE16_MEMBER(drgnmst_state::drgnmst_snd_flag_w)
WRITE8_MEMBER(drgnmst_state::snd_flag_w)
{
/* Enables the following 68K write operation to latch through to the PIC */
if (ACCESSING_BITS_0_7)
m_snd_flag = 1;
m_snd_flag = 1;
}
@ -75,14 +71,14 @@ READ8_MEMBER(drgnmst_state::pic16c5x_port0_r)
return m_pic16c5x_port0;
}
READ8_MEMBER(drgnmst_state::drgnmst_snd_command_r)
READ8_MEMBER(drgnmst_state::snd_command_r)
{
int data = 0;
uint8_t data = 0;
switch (m_oki_control & 0x1f)
{
case 0x12: data = (m_oki_2->read(space, 0) & 0x0f); break;
case 0x16: data = (m_oki_1->read(space, 0) & 0x0f); break;
case 0x12: data = (m_oki[1]->read(space, 0) & 0x0f); break;
case 0x16: data = (m_oki[0]->read(space, 0) & 0x0f); break;
case 0x0b:
case 0x0f: data = m_snd_command; break;
default: break;
@ -91,7 +87,7 @@ READ8_MEMBER(drgnmst_state::drgnmst_snd_command_r)
return data;
}
READ8_MEMBER(drgnmst_state::drgnmst_snd_flag_r)
READ8_MEMBER(drgnmst_state::snd_flag_r)
{
if (m_snd_flag)
{
@ -102,22 +98,22 @@ READ8_MEMBER(drgnmst_state::drgnmst_snd_flag_r)
return 0x00;
}
WRITE8_MEMBER(drgnmst_state::drgnmst_pcm_banksel_w)
WRITE8_MEMBER(drgnmst_state::pcm_banksel_w)
{
/* This is a 4 bit port.
Each pair of bits is used in part of the OKI PCM ROM bank selectors.
See the Port 2 write handler below (drgnmst_snd_control_w) for details.
See the Port 2 write handler below (snd_control_w) for details.
*/
m_pic16c5x_port0 = data;
}
WRITE8_MEMBER(drgnmst_state::drgnmst_oki_w)
WRITE8_MEMBER(drgnmst_state::oki_w)
{
m_oki_command = data;
}
WRITE8_MEMBER(drgnmst_state::drgnmst_snd_control_w)
WRITE8_MEMBER(drgnmst_state::snd_control_w)
{
/* This port controls communications to and from the 68K, both OKI
devices, and part of the OKI PCM ROM bank selection.
@ -147,32 +143,32 @@ WRITE8_MEMBER(drgnmst_state::drgnmst_snd_control_w)
oki_new_bank = ((m_pic16c5x_port0 & 0xc) >> 2) | ((m_oki_control & 0x80) >> 5);
if (oki_new_bank != m_oki0_bank)
if (oki_new_bank != m_oki_bank[0])
{
m_oki0_bank = oki_new_bank;
if (m_oki0_bank)
m_oki_bank[0] = oki_new_bank;
if (m_oki_bank[0])
oki_new_bank--;
m_oki_1->set_rom_bank(oki_new_bank);
m_oki1bank->set_entry(oki_new_bank);
}
oki_new_bank = ((m_pic16c5x_port0 & 0x3) >> 0) | ((m_oki_control & 0x20) >> 3);
if (oki_new_bank != m_oki1_bank)
if (oki_new_bank != m_oki_bank[1])
{
m_oki1_bank = oki_new_bank;
m_oki_2->set_rom_bank(oki_new_bank);
m_oki_bank[1] = oki_new_bank;
m_oki[1]->set_rom_bank(oki_new_bank);
}
switch (m_oki_control & 0x1f)
{
case 0x11:
// logerror("Writing %02x to OKI1", m_oki_command);
// logerror(", PortC=%02x, Code=%02x, Bank0=%01x, Bank1=%01x\n", m_oki_control, m_snd_command, m_oki0_bank, m_oki1_bank);
m_oki_2->write(space, 0, m_oki_command);
// logerror(", PortC=%02x, Code=%02x, Bank0=%01x, Bank1=%01x\n", m_oki_control, m_snd_command, m_oki_bank[0], m_oki_bank[1]);
m_oki[1]->write(space, 0, m_oki_command);
break;
case 0x15:
// logerror("Writing %02x to OKI0", m_oki_command);
// logerror(", PortC=%02x, Code=%02x, Bank0=%01x, Bank1=%01x\n", m_oki_control, m_snd_command, m_oki0_bank, m_oki1_bank);
m_oki_1->write(space, 0, m_oki_command);
// logerror(", PortC=%02x, Code=%02x, Bank0=%01x, Bank1=%01x\n", m_oki_control, m_snd_command, m_oki_bank[0], m_oki_bank[1]);
m_oki[0]->write(space, 0, m_oki_command);
break;
default: break;
}
@ -188,24 +184,30 @@ void drgnmst_state::drgnmst_main_map(address_map &map)
map(0x800018, 0x800019).portr("SYSTEM");
map(0x80001a, 0x80001b).portr("DSW1");
map(0x80001c, 0x80001d).portr("DSW2");
map(0x800030, 0x800031).w(FUNC(drgnmst_state::drgnmst_coin_w));
map(0x800030, 0x800031).w(FUNC(drgnmst_state::coin_w));
map(0x800100, 0x80011f).writeonly().share("vidregs");
map(0x800120, 0x800121).nopw();
map(0x80014a, 0x80014b).nopw();
map(0x800154, 0x800155).writeonly().share("vidregs2"); // seems to be priority control
map(0x800176, 0x800177).portr("EXTRA");
map(0x800180, 0x800181).w(FUNC(drgnmst_state::drgnmst_snd_command_w));
map(0x800188, 0x800189).w(FUNC(drgnmst_state::drgnmst_snd_flag_w));
map(0x800181, 0x800181).w(FUNC(drgnmst_state::snd_command_w));
map(0x800189, 0x800189).w(FUNC(drgnmst_state::snd_flag_w));
map(0x8001e0, 0x8001e1).nopw();
map(0x900000, 0x903fff).ram().w(FUNC(drgnmst_state::drgnmst_paletteram_w)).share("paletteram");
map(0x904000, 0x907fff).ram().w(FUNC(drgnmst_state::drgnmst_md_videoram_w)).share("md_videoram");
map(0x908000, 0x90bfff).ram().w(FUNC(drgnmst_state::drgnmst_bg_videoram_w)).share("bg_videoram");
map(0x90c000, 0x90ffff).ram().w(FUNC(drgnmst_state::drgnmst_fg_videoram_w)).share("fg_videoram");
map(0x900000, 0x903fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x904000, 0x907fff).ram().w(FUNC(drgnmst_state::md_videoram_w)).share("md_videoram");
map(0x908000, 0x90bfff).ram().w(FUNC(drgnmst_state::bg_videoram_w)).share("bg_videoram");
map(0x90c000, 0x90ffff).ram().w(FUNC(drgnmst_state::fg_videoram_w)).share("fg_videoram");
map(0x920000, 0x923fff).ram().share("rowscrollram"); // rowscroll ram
map(0x930000, 0x9307ff).ram().share("spriteram"); // Sprites
map(0xff0000, 0xffffff).ram();
}
void drgnmst_state::drgnmst_oki1_map(address_map &map)
{
map(0x00000, 0x1ffff).rom();
map(0x20000, 0x3ffff).bankr("oki1bank");
}
static INPUT_PORTS_START( drgnmst )
PORT_START("P1_P2")
@ -298,7 +300,7 @@ static INPUT_PORTS_START( drgnmst )
INPUT_PORTS_END
static const gfx_layout drgnmst_char8x8_layout =
static const gfx_layout char8x8_layout =
{
8,8,
RGN_FRAC(1,1),
@ -310,7 +312,7 @@ static const gfx_layout drgnmst_char8x8_layout =
};
static const gfx_layout drgnmst_char16x16_layout =
static const gfx_layout char16x16_layout =
{
16,16,
RGN_FRAC(1,2),
@ -325,7 +327,7 @@ static const gfx_layout drgnmst_char16x16_layout =
static const gfx_layout drgnmst_char32x32_layout =
static const gfx_layout char32x32_layout =
{
32,32,
RGN_FRAC(1,2),
@ -345,33 +347,30 @@ static const gfx_layout drgnmst_char32x32_layout =
static GFXDECODE_START( gfx_drgnmst )
GFXDECODE_ENTRY( "gfx1", 0, drgnmst_char16x16_layout, 0, 0x200 ) /* sprite tiles */
GFXDECODE_ENTRY( "gfx2", 0, drgnmst_char8x8_layout, 0x200, 0x200 ) /* fg tiles */
GFXDECODE_ENTRY( "gfx2", 0, drgnmst_char16x16_layout, 0x0400, 0x200 ) /* md tiles */
GFXDECODE_ENTRY( "gfx2", 0, drgnmst_char32x32_layout, 0x0600, 0x200 ) /* bg tiles */
GFXDECODE_ENTRY( "gfx1", 0, char16x16_layout, 0, 0x20 ) /* sprite tiles */
GFXDECODE_ENTRY( "gfx2", 0, char8x8_layout, 0x200, 0x20 ) /* fg tiles */
GFXDECODE_ENTRY( "gfx2", 0, char16x16_layout, 0x400, 0x20 ) /* md tiles */
GFXDECODE_ENTRY( "gfx2", 0, char32x32_layout, 0x600, 0x20 ) /* bg tiles */
GFXDECODE_END
void drgnmst_state::machine_start()
{
save_item(NAME(m_snd_flag));
save_item(NAME(m_snd_command));
save_item(NAME(m_oki_control));
save_item(NAME(m_oki_command));
save_item(NAME(m_pic16c5x_port0));
save_item(NAME(m_oki1_bank));
save_item(NAME(m_oki0_bank));
save_item(NAME(m_oki_bank));
}
void drgnmst_state::machine_reset()
{
m_snd_flag = 0;
m_snd_command = 0;
m_oki_control = 0;
m_oki_command = 0;
m_pic16c5x_port0 = 0;
m_oki1_bank = 0;
m_oki0_bank = 0;
m_oki_bank[1] = 0;
m_oki_bank[0] = 0;
}
MACHINE_CONFIG_START(drgnmst_state::drgnmst)
@ -382,11 +381,11 @@ MACHINE_CONFIG_START(drgnmst_state::drgnmst)
MCFG_DEVICE_ADD("audiocpu", PIC16C55, 32000000/8) /* Confirmed */
MCFG_PIC16C5x_READ_A_CB(READ8(*this, drgnmst_state, pic16c5x_port0_r))
MCFG_PIC16C5x_WRITE_A_CB(WRITE8(*this, drgnmst_state, drgnmst_pcm_banksel_w))
MCFG_PIC16C5x_READ_B_CB(READ8(*this, drgnmst_state, drgnmst_snd_command_r))
MCFG_PIC16C5x_WRITE_B_CB(WRITE8(*this, drgnmst_state, drgnmst_oki_w))
MCFG_PIC16C5x_READ_C_CB(READ8(*this, drgnmst_state, drgnmst_snd_flag_r))
MCFG_PIC16C5x_WRITE_C_CB(WRITE8(*this, drgnmst_state, drgnmst_snd_control_w))
MCFG_PIC16C5x_WRITE_A_CB(WRITE8(*this, drgnmst_state, pcm_banksel_w))
MCFG_PIC16C5x_READ_B_CB(READ8(*this, drgnmst_state, snd_command_r))
MCFG_PIC16C5x_WRITE_B_CB(WRITE8(*this, drgnmst_state, oki_w))
MCFG_PIC16C5x_READ_C_CB(READ8(*this, drgnmst_state, snd_flag_r))
MCFG_PIC16C5x_WRITE_C_CB(WRITE8(*this, drgnmst_state, snd_control_w))
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_drgnmst)
@ -395,15 +394,17 @@ MACHINE_CONFIG_START(drgnmst_state::drgnmst)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(8*8, 56*8-1, 2*8, 30*8-1)
MCFG_SCREEN_UPDATE_DRIVER(drgnmst_state, screen_update_drgnmst)
MCFG_SCREEN_UPDATE_DRIVER(drgnmst_state, screen_update)
MCFG_SCREEN_PALETTE("palette")
MCFG_PALETTE_ADD("palette", 0x2000)
MCFG_PALETTE_FORMAT_CLASS(2, drgnmst_state, drgnmst_IIIIRRRRGGGGBBBB)
/* sound hardware */
SPEAKER(config, "mono").front_center();
MCFG_DEVICE_ADD("oki1", OKIM6295, 32000000/32, okim6295_device::PIN7_HIGH)
MCFG_DEVICE_ADDRESS_MAP(0, drgnmst_oki1_map)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MCFG_DEVICE_ADD("oki2", OKIM6295, 32000000/32, okim6295_device::PIN7_HIGH)
@ -465,7 +466,6 @@ void drgnmst_state::init_drgnmst()
{
uint8_t *drgnmst_PICROM_HEX = memregion("user1")->base();
uint16_t *drgnmst_PICROM = (uint16_t *)memregion("audiocpu")->base();
uint8_t *drgnmst_PCM = memregion("oki1")->base();
uint16_t src_pos = 0;
uint16_t dst_pos = 0;
@ -473,17 +473,8 @@ void drgnmst_state::init_drgnmst()
/* $00000-1ffff is the same through all banks */
/* $20000-3ffff in each bank is actually the switched area */
for (int32_t offs = 0x1ffff; offs >= 0; offs--)
{
drgnmst_PCM[0x120000 + offs] = drgnmst_PCM[0xa0000 + offs];
drgnmst_PCM[0x100000 + offs] = drgnmst_PCM[0x00000 + offs];
drgnmst_PCM[0x0e0000 + offs] = drgnmst_PCM[0x80000 + offs];
drgnmst_PCM[0x0c0000 + offs] = drgnmst_PCM[0x00000 + offs];
drgnmst_PCM[0x0a0000 + offs] = drgnmst_PCM[0x60000 + offs];
drgnmst_PCM[0x080000 + offs] = drgnmst_PCM[0x00000 + offs];
drgnmst_PCM[0x060000 + offs] = drgnmst_PCM[0x40000 + offs];
drgnmst_PCM[0x040000 + offs] = drgnmst_PCM[0x00000 + offs];
}
m_oki1bank->configure_entries(0, 8, memregion("oki1")->base() + 0x20000, 0x20000);
//m_oki1bank->configure_entries(0, 8, memregion("oki1")->base(), 0x20000); // TODO : Correct?
/**** Convert the PIC16C55 ASCII HEX dump to pure HEX ****/
do

View File

@ -1,15 +1,15 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
#include "sound/okim6295.h"
#include "cpu/pic16c5x/pic16c5x.h"
#include "sound/okim6295.h"
#include "emupal.h"
class drgnmst_state : public driver_device
{
public:
drgnmst_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
drgnmst_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_vidregs(*this, "vidregs"),
m_fg_videoram(*this, "fg_videoram"),
m_bg_videoram(*this, "bg_videoram"),
@ -17,9 +17,8 @@ public:
m_rowscrollram(*this, "rowscrollram"),
m_vidregs2(*this, "vidregs2"),
m_spriteram(*this, "spriteram"),
m_generic_paletteram_16(*this, "paletteram"),
m_oki_1(*this, "oki1"),
m_oki_2(*this, "oki2") ,
m_oki1bank(*this, "oki1bank"),
m_oki(*this, "oki%u", 1U),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_gfxdecode(*this, "gfxdecode"),
@ -38,7 +37,8 @@ private:
required_shared_ptr<uint16_t> m_rowscrollram;
required_shared_ptr<uint16_t> m_vidregs2;
required_shared_ptr<uint16_t> m_spriteram;
required_shared_ptr<uint16_t> m_generic_paletteram_16;
required_memory_bank m_oki1bank;
/* video-related */
tilemap_t *m_bg_tilemap;
@ -46,40 +46,38 @@ private:
tilemap_t *m_md_tilemap;
/* misc */
uint16_t m_snd_command;
uint8_t m_snd_command;
uint16_t m_snd_flag;
uint8_t m_oki_control;
uint8_t m_oki_command;
uint8_t m_pic16c5x_port0;
uint8_t m_oki0_bank;
uint8_t m_oki1_bank;
uint8_t m_oki_bank[2];
/* devices */
required_device<okim6295_device> m_oki_1;
required_device<okim6295_device> m_oki_2;
DECLARE_WRITE16_MEMBER(drgnmst_coin_w);
DECLARE_WRITE16_MEMBER(drgnmst_snd_command_w);
DECLARE_WRITE16_MEMBER(drgnmst_snd_flag_w);
required_device_array<okim6295_device, 2> m_oki;
DECLARE_WRITE16_MEMBER(coin_w);
DECLARE_WRITE8_MEMBER(snd_command_w);
DECLARE_WRITE8_MEMBER(snd_flag_w);
DECLARE_READ8_MEMBER(pic16c5x_port0_r);
DECLARE_READ8_MEMBER(drgnmst_snd_command_r);
DECLARE_READ8_MEMBER(drgnmst_snd_flag_r);
DECLARE_WRITE8_MEMBER(drgnmst_pcm_banksel_w);
DECLARE_WRITE8_MEMBER(drgnmst_oki_w);
DECLARE_WRITE8_MEMBER(drgnmst_snd_control_w);
DECLARE_WRITE16_MEMBER(drgnmst_paletteram_w);
DECLARE_WRITE16_MEMBER(drgnmst_fg_videoram_w);
DECLARE_WRITE16_MEMBER(drgnmst_bg_videoram_w);
DECLARE_WRITE16_MEMBER(drgnmst_md_videoram_w);
TILE_GET_INFO_MEMBER(get_drgnmst_fg_tile_info);
TILE_GET_INFO_MEMBER(get_drgnmst_bg_tile_info);
TILE_GET_INFO_MEMBER(get_drgnmst_md_tile_info);
TILEMAP_MAPPER_MEMBER(drgnmst_fg_tilemap_scan_cols);
TILEMAP_MAPPER_MEMBER(drgnmst_md_tilemap_scan_cols);
TILEMAP_MAPPER_MEMBER(drgnmst_bg_tilemap_scan_cols);
DECLARE_READ8_MEMBER(snd_command_r);
DECLARE_READ8_MEMBER(snd_flag_r);
DECLARE_WRITE8_MEMBER(pcm_banksel_w);
DECLARE_WRITE8_MEMBER(oki_w);
DECLARE_WRITE8_MEMBER(snd_control_w);
DECLARE_WRITE16_MEMBER(fg_videoram_w);
DECLARE_WRITE16_MEMBER(bg_videoram_w);
DECLARE_WRITE16_MEMBER(md_videoram_w);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_md_tile_info);
TILEMAP_MAPPER_MEMBER(fg_tilemap_scan_cols);
TILEMAP_MAPPER_MEMBER(md_tilemap_scan_cols);
TILEMAP_MAPPER_MEMBER(bg_tilemap_scan_cols);
DECLARE_PALETTE_DECODER(drgnmst_IIIIRRRRGGGGBBBB);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
uint32_t screen_update_drgnmst(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprect );
uint8_t drgnmst_asciitohex( uint8_t data );
required_device<cpu_device> m_maincpu;
@ -87,4 +85,5 @@ private:
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
void drgnmst_main_map(address_map &map);
void drgnmst_oki1_map(address_map &map);
};

View File

@ -8,13 +8,12 @@
#include "includes/drgnmst.h"
WRITE16_MEMBER(drgnmst_state::drgnmst_paletteram_w)
PALETTE_DECODER_MEMBER(drgnmst_state, drgnmst_IIIIRRRRGGGGBBBB)
{
COMBINE_DATA(&m_generic_paletteram_16[offset]);
int bright = 0x5 + ((data >> 12) & 0xf); // TODO : verify brightness value from real pcb
int r = (pal4bit((data >> 8) & 0x0f) * bright) / 0x14;
int g = (pal4bit((data >> 4) & 0x0f) * bright) / 0x14;
int b = (pal4bit((data >> 0) & 0x0f) * bright) / 0x14;
int const bright = 0x5 + ((raw >> 12) & 0xf); // TODO : verify brightness value from real pcb
int r = (pal4bit((raw >> 8) & 0x0f) * bright) / 0x14;
int g = (pal4bit((raw >> 4) & 0x0f) * bright) / 0x14;
int b = (pal4bit((raw >> 0) & 0x0f) * bright) / 0x14;
if (r < 0) r = 0;
if (r > 0xff) r = 0xff;
@ -22,10 +21,10 @@ WRITE16_MEMBER(drgnmst_state::drgnmst_paletteram_w)
if (g > 0xff) g = 0xff;
if (b < 0) b = 0;
if (b > 0xff) b = 0xff;
m_palette->set_pen_color(offset, rgb_t(r, g, b));
return rgb_t(r, g, b);
}
TILE_GET_INFO_MEMBER(drgnmst_state::get_drgnmst_fg_tile_info)
TILE_GET_INFO_MEMBER(drgnmst_state::get_fg_tile_info)
{
int tileno, colour, flipyx;
tileno = m_fg_videoram[tile_index * 2] & 0xfff;
@ -35,13 +34,13 @@ TILE_GET_INFO_MEMBER(drgnmst_state::get_drgnmst_fg_tile_info)
SET_TILE_INFO_MEMBER(1, tileno, colour, TILE_FLIPYX(flipyx));
}
WRITE16_MEMBER(drgnmst_state::drgnmst_fg_videoram_w)
WRITE16_MEMBER(drgnmst_state::fg_videoram_w)
{
COMBINE_DATA(&m_fg_videoram[offset]);
m_fg_tilemap->mark_tile_dirty(offset / 2);
}
TILE_GET_INFO_MEMBER(drgnmst_state::get_drgnmst_bg_tile_info)
TILE_GET_INFO_MEMBER(drgnmst_state::get_bg_tile_info)
{
int tileno, colour, flipyx;
tileno = (m_bg_videoram[tile_index * 2]& 0x1fff) + 0x800;
@ -51,13 +50,13 @@ TILE_GET_INFO_MEMBER(drgnmst_state::get_drgnmst_bg_tile_info)
SET_TILE_INFO_MEMBER(3, tileno, colour, TILE_FLIPYX(flipyx));
}
WRITE16_MEMBER(drgnmst_state::drgnmst_bg_videoram_w)
WRITE16_MEMBER(drgnmst_state::bg_videoram_w)
{
COMBINE_DATA(&m_bg_videoram[offset]);
m_bg_tilemap->mark_tile_dirty(offset / 2);
}
TILE_GET_INFO_MEMBER(drgnmst_state::get_drgnmst_md_tile_info)
TILE_GET_INFO_MEMBER(drgnmst_state::get_md_tile_info)
{
int tileno, colour, flipyx;
tileno = (m_md_videoram[tile_index * 2] & 0x7fff) - 0x2000;
@ -67,7 +66,7 @@ TILE_GET_INFO_MEMBER(drgnmst_state::get_drgnmst_md_tile_info)
SET_TILE_INFO_MEMBER(2, tileno, colour, TILE_FLIPYX(flipyx));
}
WRITE16_MEMBER(drgnmst_state::drgnmst_md_videoram_w)
WRITE16_MEMBER(drgnmst_state::md_videoram_w)
{
COMBINE_DATA(&m_md_videoram[offset]);
m_md_tilemap->mark_tile_dirty(offset / 2);
@ -120,37 +119,37 @@ void drgnmst_state::draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprect
}
TILEMAP_MAPPER_MEMBER(drgnmst_state::drgnmst_fg_tilemap_scan_cols)
TILEMAP_MAPPER_MEMBER(drgnmst_state::fg_tilemap_scan_cols)
{
return (col * 32) + (row & 0x1f) + ((row & 0xe0) >> 5) * 2048;
return ((col & 0x3f) << 5) | (row & 0x1f) | ((row & 0x20) << 6);
}
TILEMAP_MAPPER_MEMBER(drgnmst_state::drgnmst_md_tilemap_scan_cols)
TILEMAP_MAPPER_MEMBER(drgnmst_state::md_tilemap_scan_cols)
{
return (col * 16) + (row & 0x0f) + ((row & 0xf0) >> 4) * 1024;
return ((col & 0x3f) << 4) | (row & 0x0f) | ((row & 0x30) << 6);
}
TILEMAP_MAPPER_MEMBER(drgnmst_state::drgnmst_bg_tilemap_scan_cols)
TILEMAP_MAPPER_MEMBER(drgnmst_state::bg_tilemap_scan_cols)
{
return (col * 8) + (row & 0x07) + ((row & 0xf8) >> 3) * 512;
return ((col & 0x3f) << 3) | (row & 0x07) | ((row & 0x38) << 6);
}
void drgnmst_state::video_start()
{
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(drgnmst_state::get_drgnmst_fg_tile_info),this), tilemap_mapper_delegate(FUNC(drgnmst_state::drgnmst_fg_tilemap_scan_cols),this), 8, 8, 64,64);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(drgnmst_state::get_fg_tile_info),this), tilemap_mapper_delegate(FUNC(drgnmst_state::fg_tilemap_scan_cols),this), 8, 8, 64,64);
m_fg_tilemap->set_transparent_pen(15);
m_md_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(drgnmst_state::get_drgnmst_md_tile_info),this), tilemap_mapper_delegate(FUNC(drgnmst_state::drgnmst_md_tilemap_scan_cols),this), 16, 16, 64,64);
m_md_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(drgnmst_state::get_md_tile_info),this), tilemap_mapper_delegate(FUNC(drgnmst_state::md_tilemap_scan_cols),this), 16, 16, 64,64);
m_md_tilemap->set_transparent_pen(15);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(drgnmst_state::get_drgnmst_bg_tile_info),this), tilemap_mapper_delegate(FUNC(drgnmst_state::drgnmst_bg_tilemap_scan_cols),this), 32, 32, 64,64);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(drgnmst_state::get_bg_tile_info),this), tilemap_mapper_delegate(FUNC(drgnmst_state::bg_tilemap_scan_cols),this), 32, 32, 64,64);
m_bg_tilemap->set_transparent_pen(15);
// do the other tilemaps have rowscroll too? probably not ..
m_md_tilemap->set_scroll_rows(1024);
}
uint32_t drgnmst_state::screen_update_drgnmst(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t drgnmst_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int y, rowscroll_bank;