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,26 +46,22 @@ Notes:
#include "speaker.h" #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_counter_w(0, data & 0x100);
machine().bookkeeping().coin_lockout_w(0, ~data & 0x400); machine().bookkeeping().coin_lockout_w(0, ~data & 0x400);
machine().bookkeeping().coin_lockout_w(1, ~data & 0x800); 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_snd_command = (data & 0xff);
m_maincpu->yield(); 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 */ /* 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; 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) switch (m_oki_control & 0x1f)
{ {
case 0x12: data = (m_oki_2->read(space, 0) & 0x0f); break; case 0x12: data = (m_oki[1]->read(space, 0) & 0x0f); break;
case 0x16: data = (m_oki_1->read(space, 0) & 0x0f); break; case 0x16: data = (m_oki[0]->read(space, 0) & 0x0f); break;
case 0x0b: case 0x0b:
case 0x0f: data = m_snd_command; break; case 0x0f: data = m_snd_command; break;
default: break; default: break;
@ -91,7 +87,7 @@ READ8_MEMBER(drgnmst_state::drgnmst_snd_command_r)
return data; return data;
} }
READ8_MEMBER(drgnmst_state::drgnmst_snd_flag_r) READ8_MEMBER(drgnmst_state::snd_flag_r)
{ {
if (m_snd_flag) if (m_snd_flag)
{ {
@ -102,22 +98,22 @@ READ8_MEMBER(drgnmst_state::drgnmst_snd_flag_r)
return 0x00; return 0x00;
} }
WRITE8_MEMBER(drgnmst_state::drgnmst_pcm_banksel_w) WRITE8_MEMBER(drgnmst_state::pcm_banksel_w)
{ {
/* This is a 4 bit port. /* This is a 4 bit port.
Each pair of bits is used in part of the OKI PCM ROM bank selectors. 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; m_pic16c5x_port0 = data;
} }
WRITE8_MEMBER(drgnmst_state::drgnmst_oki_w) WRITE8_MEMBER(drgnmst_state::oki_w)
{ {
m_oki_command = data; 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 /* This port controls communications to and from the 68K, both OKI
devices, and part of the OKI PCM ROM bank selection. 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); 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; m_oki_bank[0] = oki_new_bank;
if (m_oki0_bank) if (m_oki_bank[0])
oki_new_bank--; 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); 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_bank[1] = oki_new_bank;
m_oki_2->set_rom_bank(oki_new_bank); m_oki[1]->set_rom_bank(oki_new_bank);
} }
switch (m_oki_control & 0x1f) switch (m_oki_control & 0x1f)
{ {
case 0x11: case 0x11:
// logerror("Writing %02x to OKI1", m_oki_command); // 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); // 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_2->write(space, 0, m_oki_command); m_oki[1]->write(space, 0, m_oki_command);
break; break;
case 0x15: case 0x15:
// logerror("Writing %02x to OKI0", m_oki_command); // 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); // 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); m_oki[0]->write(space, 0, m_oki_command);
break; break;
default: break; default: break;
} }
@ -188,24 +184,30 @@ void drgnmst_state::drgnmst_main_map(address_map &map)
map(0x800018, 0x800019).portr("SYSTEM"); map(0x800018, 0x800019).portr("SYSTEM");
map(0x80001a, 0x80001b).portr("DSW1"); map(0x80001a, 0x80001b).portr("DSW1");
map(0x80001c, 0x80001d).portr("DSW2"); 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(0x800100, 0x80011f).writeonly().share("vidregs");
map(0x800120, 0x800121).nopw(); map(0x800120, 0x800121).nopw();
map(0x80014a, 0x80014b).nopw(); map(0x80014a, 0x80014b).nopw();
map(0x800154, 0x800155).writeonly().share("vidregs2"); // seems to be priority control map(0x800154, 0x800155).writeonly().share("vidregs2"); // seems to be priority control
map(0x800176, 0x800177).portr("EXTRA"); map(0x800176, 0x800177).portr("EXTRA");
map(0x800180, 0x800181).w(FUNC(drgnmst_state::drgnmst_snd_command_w)); map(0x800181, 0x800181).w(FUNC(drgnmst_state::snd_command_w));
map(0x800188, 0x800189).w(FUNC(drgnmst_state::drgnmst_snd_flag_w)); map(0x800189, 0x800189).w(FUNC(drgnmst_state::snd_flag_w));
map(0x8001e0, 0x8001e1).nopw(); map(0x8001e0, 0x8001e1).nopw();
map(0x900000, 0x903fff).ram().w(FUNC(drgnmst_state::drgnmst_paletteram_w)).share("paletteram"); map(0x900000, 0x903fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x904000, 0x907fff).ram().w(FUNC(drgnmst_state::drgnmst_md_videoram_w)).share("md_videoram"); map(0x904000, 0x907fff).ram().w(FUNC(drgnmst_state::md_videoram_w)).share("md_videoram");
map(0x908000, 0x90bfff).ram().w(FUNC(drgnmst_state::drgnmst_bg_videoram_w)).share("bg_videoram"); map(0x908000, 0x90bfff).ram().w(FUNC(drgnmst_state::bg_videoram_w)).share("bg_videoram");
map(0x90c000, 0x90ffff).ram().w(FUNC(drgnmst_state::drgnmst_fg_videoram_w)).share("fg_videoram"); map(0x90c000, 0x90ffff).ram().w(FUNC(drgnmst_state::fg_videoram_w)).share("fg_videoram");
map(0x920000, 0x923fff).ram().share("rowscrollram"); // rowscroll ram map(0x920000, 0x923fff).ram().share("rowscrollram"); // rowscroll ram
map(0x930000, 0x9307ff).ram().share("spriteram"); // Sprites map(0x930000, 0x9307ff).ram().share("spriteram"); // Sprites
map(0xff0000, 0xffffff).ram(); 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 ) static INPUT_PORTS_START( drgnmst )
PORT_START("P1_P2") PORT_START("P1_P2")
@ -298,7 +300,7 @@ static INPUT_PORTS_START( drgnmst )
INPUT_PORTS_END INPUT_PORTS_END
static const gfx_layout drgnmst_char8x8_layout = static const gfx_layout char8x8_layout =
{ {
8,8, 8,8,
RGN_FRAC(1,1), 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, 16,16,
RGN_FRAC(1,2), 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, 32,32,
RGN_FRAC(1,2), RGN_FRAC(1,2),
@ -345,33 +347,30 @@ static const gfx_layout drgnmst_char32x32_layout =
static GFXDECODE_START( gfx_drgnmst ) static GFXDECODE_START( gfx_drgnmst )
GFXDECODE_ENTRY( "gfx1", 0, drgnmst_char16x16_layout, 0, 0x200 ) /* sprite tiles */ GFXDECODE_ENTRY( "gfx1", 0, char16x16_layout, 0, 0x20 ) /* sprite tiles */
GFXDECODE_ENTRY( "gfx2", 0, drgnmst_char8x8_layout, 0x200, 0x200 ) /* fg tiles */ GFXDECODE_ENTRY( "gfx2", 0, char8x8_layout, 0x200, 0x20 ) /* fg tiles */
GFXDECODE_ENTRY( "gfx2", 0, drgnmst_char16x16_layout, 0x0400, 0x200 ) /* md tiles */ GFXDECODE_ENTRY( "gfx2", 0, char16x16_layout, 0x400, 0x20 ) /* md tiles */
GFXDECODE_ENTRY( "gfx2", 0, drgnmst_char32x32_layout, 0x0600, 0x200 ) /* bg tiles */ GFXDECODE_ENTRY( "gfx2", 0, char32x32_layout, 0x600, 0x20 ) /* bg tiles */
GFXDECODE_END GFXDECODE_END
void drgnmst_state::machine_start() void drgnmst_state::machine_start()
{ {
save_item(NAME(m_snd_flag)); save_item(NAME(m_snd_flag));
save_item(NAME(m_snd_command));
save_item(NAME(m_oki_control)); save_item(NAME(m_oki_control));
save_item(NAME(m_oki_command)); save_item(NAME(m_oki_command));
save_item(NAME(m_pic16c5x_port0)); save_item(NAME(m_pic16c5x_port0));
save_item(NAME(m_oki1_bank)); save_item(NAME(m_oki_bank));
save_item(NAME(m_oki0_bank));
} }
void drgnmst_state::machine_reset() void drgnmst_state::machine_reset()
{ {
m_snd_flag = 0; m_snd_flag = 0;
m_snd_command = 0;
m_oki_control = 0; m_oki_control = 0;
m_oki_command = 0; m_oki_command = 0;
m_pic16c5x_port0 = 0; m_pic16c5x_port0 = 0;
m_oki1_bank = 0; m_oki_bank[1] = 0;
m_oki0_bank = 0; m_oki_bank[0] = 0;
} }
MACHINE_CONFIG_START(drgnmst_state::drgnmst) 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_DEVICE_ADD("audiocpu", PIC16C55, 32000000/8) /* Confirmed */
MCFG_PIC16C5x_READ_A_CB(READ8(*this, drgnmst_state, pic16c5x_port0_r)) 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_WRITE_A_CB(WRITE8(*this, drgnmst_state, pcm_banksel_w))
MCFG_PIC16C5x_READ_B_CB(READ8(*this, drgnmst_state, drgnmst_snd_command_r)) MCFG_PIC16C5x_READ_B_CB(READ8(*this, drgnmst_state, snd_command_r))
MCFG_PIC16C5x_WRITE_B_CB(WRITE8(*this, drgnmst_state, drgnmst_oki_w)) MCFG_PIC16C5x_WRITE_B_CB(WRITE8(*this, drgnmst_state, oki_w))
MCFG_PIC16C5x_READ_C_CB(READ8(*this, drgnmst_state, drgnmst_snd_flag_r)) MCFG_PIC16C5x_READ_C_CB(READ8(*this, drgnmst_state, snd_flag_r))
MCFG_PIC16C5x_WRITE_C_CB(WRITE8(*this, drgnmst_state, drgnmst_snd_control_w)) MCFG_PIC16C5x_WRITE_C_CB(WRITE8(*this, drgnmst_state, snd_control_w))
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_drgnmst) 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_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(8*8, 56*8-1, 2*8, 30*8-1) 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_SCREEN_PALETTE("palette")
MCFG_PALETTE_ADD("palette", 0x2000) MCFG_PALETTE_ADD("palette", 0x2000)
MCFG_PALETTE_FORMAT_CLASS(2, drgnmst_state, drgnmst_IIIIRRRRGGGGBBBB)
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
MCFG_DEVICE_ADD("oki1", OKIM6295, 32000000/32, okim6295_device::PIN7_HIGH) 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_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MCFG_DEVICE_ADD("oki2", OKIM6295, 32000000/32, okim6295_device::PIN7_HIGH) 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(); uint8_t *drgnmst_PICROM_HEX = memregion("user1")->base();
uint16_t *drgnmst_PICROM = (uint16_t *)memregion("audiocpu")->base(); uint16_t *drgnmst_PICROM = (uint16_t *)memregion("audiocpu")->base();
uint8_t *drgnmst_PCM = memregion("oki1")->base();
uint16_t src_pos = 0; uint16_t src_pos = 0;
uint16_t dst_pos = 0; uint16_t dst_pos = 0;
@ -473,17 +473,8 @@ void drgnmst_state::init_drgnmst()
/* $00000-1ffff is the same through all banks */ /* $00000-1ffff is the same through all banks */
/* $20000-3ffff in each bank is actually the switched area */ /* $20000-3ffff in each bank is actually the switched area */
for (int32_t offs = 0x1ffff; offs >= 0; offs--) m_oki1bank->configure_entries(0, 8, memregion("oki1")->base() + 0x20000, 0x20000);
{ //m_oki1bank->configure_entries(0, 8, memregion("oki1")->base(), 0x20000); // TODO : Correct?
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];
}
/**** Convert the PIC16C55 ASCII HEX dump to pure HEX ****/ /**** Convert the PIC16C55 ASCII HEX dump to pure HEX ****/
do do

View File

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

View File

@ -8,13 +8,12 @@
#include "includes/drgnmst.h" #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 const bright = 0x5 + ((raw >> 12) & 0xf); // TODO : verify brightness value from real pcb
int bright = 0x5 + ((data >> 12) & 0xf); // TODO : verify brightness value from real pcb int r = (pal4bit((raw >> 8) & 0x0f) * bright) / 0x14;
int r = (pal4bit((data >> 8) & 0x0f) * bright) / 0x14; int g = (pal4bit((raw >> 4) & 0x0f) * bright) / 0x14;
int g = (pal4bit((data >> 4) & 0x0f) * bright) / 0x14; int b = (pal4bit((raw >> 0) & 0x0f) * bright) / 0x14;
int b = (pal4bit((data >> 0) & 0x0f) * bright) / 0x14;
if (r < 0) r = 0; if (r < 0) r = 0;
if (r > 0xff) r = 0xff; if (r > 0xff) r = 0xff;
@ -22,10 +21,10 @@ WRITE16_MEMBER(drgnmst_state::drgnmst_paletteram_w)
if (g > 0xff) g = 0xff; if (g > 0xff) g = 0xff;
if (b < 0) b = 0; if (b < 0) b = 0;
if (b > 0xff) b = 0xff; 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; int tileno, colour, flipyx;
tileno = m_fg_videoram[tile_index * 2] & 0xfff; 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)); 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]); COMBINE_DATA(&m_fg_videoram[offset]);
m_fg_tilemap->mark_tile_dirty(offset / 2); 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; int tileno, colour, flipyx;
tileno = (m_bg_videoram[tile_index * 2]& 0x1fff) + 0x800; 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)); 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]); COMBINE_DATA(&m_bg_videoram[offset]);
m_bg_tilemap->mark_tile_dirty(offset / 2); 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; int tileno, colour, flipyx;
tileno = (m_md_videoram[tile_index * 2] & 0x7fff) - 0x2000; 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)); 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]); COMBINE_DATA(&m_md_videoram[offset]);
m_md_tilemap->mark_tile_dirty(offset / 2); 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() 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_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_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); m_bg_tilemap->set_transparent_pen(15);
// do the other tilemaps have rowscroll too? probably not .. // do the other tilemaps have rowscroll too? probably not ..
m_md_tilemap->set_scroll_rows(1024); 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; int y, rowscroll_bank;