summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/drivers/tail2nos.c16
-rw-r--r--src/mame/drivers/wecleman.c17
-rw-r--r--src/mame/includes/tail2nos.h5
-rw-r--r--src/mame/video/k051316.c59
-rw-r--r--src/mame/video/k051316.h10
-rw-r--r--src/mame/video/k052109.h1
-rw-r--r--src/mame/video/tail2nos.c24
-rw-r--r--src/mame/video/wecleman.c1
8 files changed, 43 insertions, 90 deletions
diff --git a/src/mame/drivers/tail2nos.c b/src/mame/drivers/tail2nos.c
index 50c5299ffe2..1e6bdd64f2c 100644
--- a/src/mame/drivers/tail2nos.c
+++ b/src/mame/drivers/tail2nos.c
@@ -32,9 +32,9 @@ WRITE8_MEMBER(tail2nos_state::sound_bankswitch_w)
static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, tail2nos_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
- AM_RANGE(0x200000, 0x27ffff) AM_ROMBANK("bank1") /* extra ROM */
- AM_RANGE(0x2c0000, 0x2dffff) AM_ROMBANK("bank2")
- AM_RANGE(0x400000, 0x41ffff) AM_READWRITE(tail2nos_zoomdata_r, tail2nos_zoomdata_w)
+ AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("user1", 0) /* extra ROM */
+ AM_RANGE(0x2c0000, 0x2dffff) AM_ROM AM_REGION("user2", 0)
+ AM_RANGE(0x400000, 0x41ffff) AM_RAM_WRITE(tail2nos_zoomdata_w) AM_SHARE("k051316")
AM_RANGE(0x500000, 0x500fff) AM_DEVREADWRITE8("k051316", k051316_device, read, write, 0x00ff)
AM_RANGE(0x510000, 0x51001f) AM_DEVWRITE8("k051316", k051316_device, ctrl_w, 0x00ff)
AM_RANGE(0xff8000, 0xffbfff) AM_RAM /* work RAM */
@@ -194,10 +194,6 @@ void tail2nos_state::machine_start()
void tail2nos_state::machine_reset()
{
- /* point to the extra ROMs */
- membank("bank1")->set_base(memregion("user1")->base());
- membank("bank2")->set_base(memregion("user2")->base());
-
m_charbank = 0;
m_charpalette = 0;
m_video_enable = 0;
@@ -278,9 +274,6 @@ ROM_START( tail2nos )
ROM_LOAD( "oj1", 0x000000, 0x40000, CRC(39c36b35) SHA1(a97480696bf6d81bf415737e03cc5324d439ab84) )
ROM_LOAD( "oj2", 0x040000, 0x40000, CRC(77ccaea2) SHA1(e38175859c75c6d0f2f01752fad6e167608c4662) )
- ROM_REGION( 0x20000, "k051316", ROMREGION_ERASE00 )
- /* RAM, not ROM - handled at run time */
-
ROM_REGION( 0x20000, "ymsnd", 0 ) /* sound samples */
ROM_LOAD( "osb", 0x00000, 0x20000, CRC(d49ab2f5) SHA1(92f7f6c8f35ac39910879dd88d2cfb6db7c848c9) )
ROM_END
@@ -313,9 +306,6 @@ ROM_START( sformula )
ROM_LOAD( "oj1", 0x000000, 0x40000, CRC(39c36b35) SHA1(a97480696bf6d81bf415737e03cc5324d439ab84) )
ROM_LOAD( "oj2", 0x040000, 0x40000, CRC(77ccaea2) SHA1(e38175859c75c6d0f2f01752fad6e167608c4662) )
- ROM_REGION( 0x20000, "k051316", ROMREGION_ERASE00 )
- /* RAM, not ROM - handled at run time */
-
ROM_REGION( 0x20000, "ymsnd", 0 ) /* sound samples */
ROM_LOAD( "osb", 0x00000, 0x20000, CRC(d49ab2f5) SHA1(92f7f6c8f35ac39910879dd88d2cfb6db7c848c9) )
ROM_END
diff --git a/src/mame/drivers/wecleman.c b/src/mame/drivers/wecleman.c
index 383b2044d5a..9045f33997c 100644
--- a/src/mame/drivers/wecleman.c
+++ b/src/mame/drivers/wecleman.c
@@ -1373,8 +1373,10 @@ ROM_START( hotchase )
ROM_REGION( 0x20000, "k051316_1", 0 ) /* bg */
ROM_LOAD( "763e14", 0x000000, 0x020000, CRC(60392aa1) SHA1(8499eb40a246587e24f6fd00af2eaa6d75ee6363) )
- ROM_REGION( 0x10000, "k051316_2", 0 ) /* fg (patched) */
- ROM_LOAD( "763a13", 0x000000, 0x010000, CRC(8bed8e0d) SHA1(ccff330abc23fe499e76c16cab5783c3daf155dd) )
+ ROM_REGION( 0x08000, "k051316_2", 0 ) /* fg */
+ /* first half empty - PCB silkscreen reads "27256/27512" */
+ ROM_LOAD( "763a13", 0x000000, 0x008000, CRC(8bed8e0d) SHA1(ccff330abc23fe499e76c16cab5783c3daf155dd) )
+ ROM_CONTINUE( 0x000000, 0x008000 )
ROM_REGION( 0x20000, "gfx4", 0 ) /* road */
ROM_LOAD( "763e15", 0x000000, 0x020000, CRC(7110aa43) SHA1(639dc002cc1580f0530bb5bb17f574e2258d5954) )
@@ -1449,20 +1451,9 @@ DRIVER_INIT_MEMBER(wecleman_state,hotchase)
// UINT16 *RAM1 = (UINT16) memregion("maincpu")->base(); /* Main CPU patches */
// RAM[0x1140/2] = 0x0015; RAM[0x195c/2] = 0x601A; // faster self test
- UINT8 *RAM;
-
- /* Decode GFX Roms */
-
- /* Let's swap even and odd bytes of the sprites gfx roms */
- RAM = memregion("gfx1")->base();
-
/* Now we can unpack each nibble of the sprites into a pixel (one byte) */
hotchase_sprite_decode(3,0x80000*2); // num banks, bank len
- /* Let's copy the second half of the fg layer gfx (charset) over the first */
- RAM = memregion("k051316_2")->base();
- memcpy(&RAM[0], &RAM[0x10000/2], 0x10000/2);
-
m_spr_color_offs = 0;
}
diff --git a/src/mame/includes/tail2nos.h b/src/mame/includes/tail2nos.h
index 1c2dec8120d..8341049fcd9 100644
--- a/src/mame/includes/tail2nos.h
+++ b/src/mame/includes/tail2nos.h
@@ -13,6 +13,7 @@ public:
: driver_device(mconfig, type, tag),
m_bgvideoram(*this, "bgvideoram"),
m_spriteram(*this, "spriteram"),
+ m_zoomram(*this, "k051316"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_k051316(*this, "k051316"),
@@ -22,8 +23,7 @@ public:
/* memory pointers */
required_shared_ptr<UINT16> m_bgvideoram;
required_shared_ptr<UINT16> m_spriteram;
- UINT16 * m_zoomdata;
-// UINT16 * m_paletteram; // currently this uses generic palette handling
+ required_shared_ptr<UINT16> m_zoomram;
/* video-related */
tilemap_t *m_bg_tilemap;
@@ -40,7 +40,6 @@ public:
DECLARE_WRITE16_MEMBER(sound_command_w);
DECLARE_WRITE16_MEMBER(tail2nos_bgvideoram_w);
- DECLARE_READ16_MEMBER(tail2nos_zoomdata_r);
DECLARE_WRITE16_MEMBER(tail2nos_zoomdata_w);
DECLARE_WRITE16_MEMBER(tail2nos_gfxbank_w);
DECLARE_WRITE8_MEMBER(sound_bankswitch_w);
diff --git a/src/mame/video/k051316.c b/src/mame/video/k051316.c
index f0f85b12058..56a58ce35e5 100644
--- a/src/mame/video/k051316.c
+++ b/src/mame/video/k051316.c
@@ -1,5 +1,5 @@
/*
-Konami 051316
+Konami 051316 PSAC
------
Manages a 32x32 tilemap (16x16 tiles, 512x512 pixels) which can be zoomed,
distorted and rotated.
@@ -83,21 +83,6 @@ const gfx_layout k051316_device::charlayout8 =
256*8
};
-const gfx_layout k051316_device::charlayout_tail2nos =
-{
- 16,16,
- RGN_FRAC(1,1),
- 4,
- { 0, 1, 2, 3 },
- { WORD_XOR_BE(0)*4, WORD_XOR_BE(1)*4, WORD_XOR_BE(2)*4, WORD_XOR_BE(3)*4,
- WORD_XOR_BE(4)*4, WORD_XOR_BE(5)*4, WORD_XOR_BE(6)*4, WORD_XOR_BE(7)*4,
- WORD_XOR_BE(8)*4, WORD_XOR_BE(9)*4, WORD_XOR_BE(10)*4, WORD_XOR_BE(11)*4,
- WORD_XOR_BE(12)*4, WORD_XOR_BE(13)*4, WORD_XOR_BE(14)*4, WORD_XOR_BE(15)*4 },
- { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64,
- 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
- 128*8
-};
-
GFXDECODE_MEMBER( k051316_device::gfxinfo )
GFXDECODE_DEVICE(DEVICE_SELF, 0, charlayout4, 0, 1)
@@ -111,22 +96,21 @@ GFXDECODE_MEMBER( k051316_device::gfxinfo8 )
GFXDECODE_DEVICE(DEVICE_SELF, 0, charlayout8, 0, 1)
GFXDECODE_END
-GFXDECODE_MEMBER( k051316_device::gfxinfo4_tail2nos )
- GFXDECODE_DEVICE(DEVICE_SELF, 0, charlayout_tail2nos, 0, 1)
+GFXDECODE_MEMBER( k051316_device::gfxinfo4_ram )
+ GFXDECODE_DEVICE_RAM(DEVICE_SELF, 0, charlayout4, 0, 1)
GFXDECODE_END
k051316_device::k051316_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, K051316, "K051316 Video Controller", tag, owner, clock, "k051316", __FILE__),
+ : device_t(mconfig, K051316, "K051316 PSAC", tag, owner, clock, "k051316", __FILE__),
device_gfx_interface(mconfig, *this, gfxinfo),
- m_ram(NULL),
m_zoom_rom(NULL),
m_zoom_size(0),
m_dx(0),
m_dy(0),
m_wrap(0),
- m_pen_is_mask(false),
- m_bpp(0),
+ m_pen_is_mask(false),
+ m_pixels_per_byte(2), // 4bpp layout is default
m_transparent_pen(0)
{
}
@@ -134,22 +118,24 @@ k051316_device::k051316_device(const machine_config &mconfig, const char *tag, d
void k051316_device::set_bpp(device_t &device, int bpp)
{
k051316_device &dev = downcast<k051316_device &>(device);
- dev.m_bpp = bpp;
switch(bpp)
{
case 4:
device_gfx_interface::static_set_info(dev, gfxinfo);
+ dev.m_pixels_per_byte = 2;
break;
case 7:
device_gfx_interface::static_set_info(dev, gfxinfo7);
+ dev.m_pixels_per_byte = 1;
break;
case 8:
device_gfx_interface::static_set_info(dev, gfxinfo8);
+ dev.m_pixels_per_byte = 1;
break;
case -4:
- device_gfx_interface::static_set_info(dev, gfxinfo4_tail2nos);
- dev.m_bpp = 4;
+ device_gfx_interface::static_set_info(dev, gfxinfo4_ram);
+ dev.m_pixels_per_byte = 2;
break;
default:
fatalerror("Unsupported bpp\n");
@@ -164,18 +150,18 @@ void k051316_device::set_bpp(device_t &device, int bpp)
void k051316_device::device_start()
{
- m_zoom_rom = region()->base();
- m_zoom_size = region()->bytes();
+ memory_region *ROM = region();
+ if (ROM != NULL)
+ {
+ m_zoom_rom = ROM->base();
+ m_zoom_size = ROM->bytes();
+ }
decode_gfx();
gfx(0)->set_colors(palette()->entries() / gfx(0)->depth());
- if (m_bpp == 4)
- gfx(0)->set_source_and_total(m_zoom_rom, m_zoom_size / 128);
- else
- gfx(0)->set_source_and_total(m_zoom_rom, m_zoom_size / 256);
m_tmap = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(k051316_device::get_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
- m_ram = auto_alloc_array_clear(machine(), UINT8, 0x800);
+ m_ram.resize_and_clear(0x800);
if (!m_pen_is_mask)
m_tmap->set_transparent_pen(m_transparent_pen);
@@ -188,7 +174,7 @@ void k051316_device::device_start()
// bind callbacks
m_k051316_cb.bind_relative_to(*owner());
- save_pointer(NAME(m_ram), 0x800);
+ save_item(NAME(m_ram));
save_item(NAME(m_ctrlram));
save_item(NAME(m_wrap));
@@ -221,11 +207,12 @@ WRITE8_MEMBER( k051316_device::write )
READ8_MEMBER( k051316_device::rom_r )
{
+ assert (m_zoom_size != 0);
+
if ((m_ctrlram[0x0e] & 0x01) == 0)
{
int addr = offset + (m_ctrlram[0x0c] << 11) + (m_ctrlram[0x0d] << 19);
- if (m_bpp <= 4)
- addr /= 2;
+ addr /= m_pixels_per_byte;
addr &= m_zoom_size - 1;
// popmessage("%s: offset %04x addr %04x", space.machine().describe_context(), offset, addr);
@@ -245,7 +232,7 @@ WRITE8_MEMBER( k051316_device::ctrl_w )
//if (offset >= 0x0c) logerror("%s: write %02x to 051316 reg %x\n", space.machine().describe_context(), data, offset);
}
-// a few games (ajax, rollerg, ultraman, etc.) can enable and disable wraparound after start
+// some games (ajax, rollerg, ultraman, etc.) have external logic that can enable or disable wraparound dynamically
void k051316_device::wraparound_enable( int status )
{
m_wrap = status;
diff --git a/src/mame/video/k051316.h b/src/mame/video/k051316.h
index bccf18432c9..e5fae6b6eb2 100644
--- a/src/mame/video/k051316.h
+++ b/src/mame/video/k051316.h
@@ -32,11 +32,10 @@ public:
static const gfx_layout charlayout4;
static const gfx_layout charlayout7;
static const gfx_layout charlayout8;
- static const gfx_layout charlayout_tail2nos;
DECLARE_GFXDECODE_MEMBER(gfxinfo);
DECLARE_GFXDECODE_MEMBER(gfxinfo7);
DECLARE_GFXDECODE_MEMBER(gfxinfo8);
- DECLARE_GFXDECODE_MEMBER(gfxinfo4_tail2nos);
+ DECLARE_GFXDECODE_MEMBER(gfxinfo4_ram);
// static configuration
static void set_k051316_callback(device_t &device, k051316_cb_delegate callback) { downcast<k051316_device &>(device).m_k051316_cb = callback; }
@@ -74,7 +73,7 @@ public:
void zoom_draw(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect,int flags,UINT32 priority);
void wraparound_enable(int status);
- void zoomram_updated(UINT32 offs) { gfx(0)->mark_dirty(offs); }
+ void mark_gfx_dirty(offs_t byteoffset) { gfx(0)->mark_dirty(byteoffset * m_pixels_per_byte / (16 * 16)); }
protected:
// device-level overrides
@@ -83,7 +82,7 @@ protected:
private:
// internal state
- UINT8 *m_ram;
+ dynamic_array<UINT8> m_ram;
UINT8 m_ctrlram[16];
tilemap_t *m_tmap;
@@ -93,7 +92,8 @@ private:
int m_dx, m_dy;
int m_wrap;
bool m_pen_is_mask;
- int m_bpp, m_transparent_pen;
+ int m_pixels_per_byte;
+ int m_transparent_pen;
k051316_cb_delegate m_k051316_cb;
TILE_GET_INFO_MEMBER(get_tile_info);
diff --git a/src/mame/video/k052109.h b/src/mame/video/k052109.h
index 47ca4a063b5..99164157994 100644
--- a/src/mame/video/k052109.h
+++ b/src/mame/video/k052109.h
@@ -87,7 +87,6 @@ private:
UINT8 m_has_extra_video_ram;
INT32 m_rmrd_line;
UINT8 m_irq_enabled;
- //INT32 m_dx[3], m_dy[3];
UINT8 m_romsubbank, m_scrollctrl;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
diff --git a/src/mame/video/tail2nos.c b/src/mame/video/tail2nos.c
index 624ebf2f92f..0d54fb79711 100644
--- a/src/mame/video/tail2nos.c
+++ b/src/mame/video/tail2nos.c
@@ -44,10 +44,7 @@ void tail2nos_state::tail2nos_postload()
m_bg_tilemap->mark_all_dirty();
- for (i = 0; i < 0x20000; i += 64)
- {
- m_gfxdecode->gfx(2)->mark_dirty(i / 64);
- }
+ m_k051316->gfx(0)->mark_all_dirty();
}
void tail2nos_state::video_start()
@@ -56,9 +53,6 @@ void tail2nos_state::video_start()
m_bg_tilemap->set_transparent_pen(15);
- m_zoomdata = (UINT16 *)memregion("k051316")->base();
-
- save_pointer(NAME(m_zoomdata), 0x20000 / 2);
machine().save().register_postload(save_prepost_delegate(FUNC(tail2nos_state::tail2nos_postload), this));
}
@@ -76,19 +70,13 @@ WRITE16_MEMBER(tail2nos_state::tail2nos_bgvideoram_w)
m_bg_tilemap->mark_tile_dirty(offset);
}
-READ16_MEMBER(tail2nos_state::tail2nos_zoomdata_r)
-{
- return m_zoomdata[offset];
-}
-
WRITE16_MEMBER(tail2nos_state::tail2nos_zoomdata_w)
{
- int oldword = m_zoomdata[offset];
-
- COMBINE_DATA(&m_zoomdata[offset]);
- // mark dirty the tilemap inside K051316 device
- if (oldword != m_zoomdata[offset])
- m_k051316->zoomram_updated(offset / 64);
+ int oldword = m_zoomram[offset];
+ COMBINE_DATA(&m_zoomram[offset]);
+ // tell the K051316 device the data changed
+ if (oldword != m_zoomram[offset])
+ m_k051316->mark_gfx_dirty(offset * 2);
}
WRITE16_MEMBER(tail2nos_state::tail2nos_gfxbank_w)
diff --git a/src/mame/video/wecleman.c b/src/mame/video/wecleman.c
index b72cc0900aa..ac2df89d176 100644
--- a/src/mame/video/wecleman.c
+++ b/src/mame/video/wecleman.c
@@ -970,7 +970,6 @@ K051316_CB_MEMBER(wecleman_state::hotchase_zoom_callback_1)
K051316_CB_MEMBER(wecleman_state::hotchase_zoom_callback_2)
{
- *code |= (*color & 0x01) << 8;
*color = ((*color & 0x3f) << 1) | ((*code & 0x80) >> 7);
}