summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/stadhero.c12
-rw-r--r--src/mame/includes/stadhero.h6
-rw-r--r--src/mame/video/decbac06.c55
-rw-r--r--src/mame/video/decbac06.h6
-rw-r--r--src/mame/video/stadhero.c54
5 files changed, 69 insertions, 64 deletions
diff --git a/src/mame/drivers/stadhero.c b/src/mame/drivers/stadhero.c
index cda482f07df..2a827657680 100644
--- a/src/mame/drivers/stadhero.c
+++ b/src/mame/drivers/stadhero.c
@@ -4,6 +4,8 @@
Emulation by Bryan McPhail, mish@tendril.co.uk
+ Are the colours correct on the scoreboard screen? they look strange
+
***************************************************************************/
#include "emu.h"
@@ -13,6 +15,7 @@
#include "sound/3812intf.h"
#include "sound/okim6295.h"
#include "includes/stadhero.h"
+#include "video/decbac06.h"
/******************************************************************************/
@@ -56,9 +59,9 @@ static WRITE16_HANDLER( stadhero_control_w )
static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16 )
AM_RANGE(0x000000, 0x01ffff) AM_ROM
AM_RANGE(0x200000, 0x2007ff) AM_RAM_WRITE(stadhero_pf1_data_w) AM_BASE_MEMBER(stadhero_state, pf1_data)
- AM_RANGE(0x240000, 0x240007) AM_RAM AM_BASE_MEMBER(stadhero_state, pf2_control_0)
- AM_RANGE(0x240010, 0x240017) AM_WRITEONLY AM_BASE_MEMBER(stadhero_state, pf2_control_1)
- AM_RANGE(0x260000, 0x261fff) AM_READWRITE(stadhero_pf2_data_r, stadhero_pf2_data_w)
+ AM_RANGE(0x240000, 0x240007) AM_DEVWRITE("tilegen1", deco_bac06_pf_control_0_w) /* text layer */
+ AM_RANGE(0x240010, 0x240017) AM_DEVWRITE("tilegen1", deco_bac06_pf_control_1_w)
+ AM_RANGE(0x260000, 0x261fff) AM_DEVREADWRITE("tilegen1", deco_bac06_pf_data_r, deco_bac06_pf_data_w)
AM_RANGE(0x30c000, 0x30c00b) AM_READWRITE(stadhero_control_r, stadhero_control_w)
AM_RANGE(0x310000, 0x3107ff) AM_RAM_WRITE(paletteram16_xxxxBBBBGGGGRRRR_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xff8000, 0xffbfff) AM_RAM /* Main ram */
@@ -230,6 +233,9 @@ static MACHINE_CONFIG_START( stadhero, stadhero_state )
MCFG_GFXDECODE(stadhero)
MCFG_PALETTE_LENGTH(1024)
+ MCFG_DEVICE_ADD("tilegen1", deco_bac06_, 0)
+ deco_bac06_device_config::set_gfx_region_wide(device, 1,1,2);
+
MCFG_VIDEO_START(stadhero)
/* sound hardware */
diff --git a/src/mame/includes/stadhero.h b/src/mame/includes/stadhero.h
index 6c818329480..e51867d026f 100644
--- a/src/mame/includes/stadhero.h
+++ b/src/mame/includes/stadhero.h
@@ -5,11 +5,7 @@ public:
: driver_device(machine, config) { }
UINT16 *pf1_data;
- UINT16 *pf2_control_0;
- UINT16 *pf2_control_1;
- UINT16 *pf2_data;
tilemap_t *pf1_tilemap;
- tilemap_t *pf2_tilemap;
int flipscreen;
UINT16 *spriteram;
};
@@ -21,5 +17,3 @@ VIDEO_START( stadhero );
SCREEN_UPDATE( stadhero );
WRITE16_HANDLER( stadhero_pf1_data_w );
-READ16_HANDLER( stadhero_pf2_data_r );
-WRITE16_HANDLER( stadhero_pf2_data_w );
diff --git a/src/mame/video/decbac06.c b/src/mame/video/decbac06.c
index cac6fadd620..7ccffccad22 100644
--- a/src/mame/video/decbac06.c
+++ b/src/mame/video/decbac06.c
@@ -95,17 +95,17 @@ deco_bac06_device::deco_bac06_device(running_machine &_machine, const deco_bac06
static TILEMAP_MAPPER( tile_shape0_scan )
{
- return (col & 0xf) + ((row & 0xf) << 4) + ((col & 0x70) << 4);
+ return (col & 0xf) + ((row & 0xf) << 4) + ((col & 0x1f0) << 4);
}
static TILEMAP_MAPPER( tile_shape1_scan )
{
- return (col & 0xf) + ((row & 0x1f) << 4) + ((col & 0x30) << 5);
+ return (col & 0xf) + ((row & 0x1f) << 4) + ((col & 0xf0) << 5);
}
static TILEMAP_MAPPER( tile_shape2_scan )
{
- return (col & 0xf) + ((row & 0x3f) << 4) + ((col & 0x10) << 6);
+ return (col & 0xf) + ((row & 0x3f) << 4) + ((col & 0x70) << 6);
}
static TILEMAP_MAPPER( tile_shape0_8x8_scan )
@@ -129,7 +129,9 @@ static TILEMAP_MAPPER( tile_shape2_8x8_scan )
static TILE_GET_INFO_DEVICE( get_pf8x8_tile_info )
{
+
deco_bac06_device *dev = (deco_bac06_device*)device;
+ if (dev->m_rambank&1) tile_index+=0x1000;
int tile=dev->pf_data[tile_index];
int colourpri=(tile>>12);
SET_TILE_INFO_DEVICE(dev->tile_region,tile&0xfff,0,0);
@@ -139,6 +141,7 @@ static TILE_GET_INFO_DEVICE( get_pf8x8_tile_info )
static TILE_GET_INFO_DEVICE( get_pf16x16_tile_info )
{
deco_bac06_device *dev = (deco_bac06_device*)device;
+ if (dev->m_rambank&1) tile_index+=0x1000;
int tile=dev->pf_data[tile_index];
int colourpri=(tile>>12);
SET_TILE_INFO_DEVICE(dev->tile_region,tile&0xfff,0,0);
@@ -156,7 +159,13 @@ void deco_bac06_device::create_tilemaps(int region8x8, int region16x16)
tile_region = region16x16;
- if (m_wide)
+ if (m_wide==2)
+ {
+ pf16x16_tilemap[0] = tilemap_create_device(this, get_pf16x16_tile_info, tile_shape0_scan, 16, 16, 256, 16);
+ pf16x16_tilemap[1] = tilemap_create_device(this, get_pf16x16_tile_info, tile_shape1_scan, 16, 16, 128, 32);
+ pf16x16_tilemap[2] = tilemap_create_device(this, get_pf16x16_tile_info, tile_shape2_scan, 16, 16, 64, 64);
+ }
+ else if (m_wide==1)
{
pf16x16_tilemap[0] = tilemap_create_device(this, get_pf16x16_tile_info, tile_shape0_scan, 16, 16, 128, 16);
pf16x16_tilemap[1] = tilemap_create_device(this, get_pf16x16_tile_info, tile_shape1_scan, 16, 16, 64, 32);
@@ -172,12 +181,16 @@ void deco_bac06_device::create_tilemaps(int region8x8, int region16x16)
void deco_bac06_device::device_start()
{
- pf_data = auto_alloc_array_clear(this->machine, UINT16, 0x2000 / 2); // 0x2000 is the maximum needed, some games / chip setups map less and mirror
+ pf_data = auto_alloc_array_clear(this->machine, UINT16, 0x4000 / 2); // 0x2000 is the maximum needed, some games / chip setups map less and mirror - stadium hero banks this to 0x4000?!
pf_rowscroll = auto_alloc_array_clear(this->machine, UINT16, 0x2000 / 2);
pf_colscroll = auto_alloc_array_clear(this->machine, UINT16, 0x2000 / 2);
create_tilemaps(m_gfxregion8x8, m_gfxregion16x16);
m_gfxcolmask = 0x0f;
+
+ m_bppmult = 0x10;
+ m_bppmask = 0x0f;
+ m_rambank = 0;
}
void deco_bac06_device::device_reset()
@@ -258,13 +271,13 @@ void deco_bac06_device::custom_tilemap_draw(running_machine *machine,
colpri = *BITMAP_ADDR8(flags_bitmap, (src_y + column_offset)&height_mask, src_x&width_mask)&0xf;
src_x++;
- if ((flags&TILEMAP_DRAW_OPAQUE) || (p&0xf))
+ if ((flags&TILEMAP_DRAW_OPAQUE) || (p&m_bppmask))
{
if ((p&penmask)==pencondition)
if((colpri&colprimask)==colpricondition)
- *BITMAP_ADDR16(bitmap, y, x) = p+(colpri&m_gfxcolmask)*0x10;
+ *BITMAP_ADDR16(bitmap, y, x) = p+(colpri&m_gfxcolmask)*m_bppmult;
}
}
src_y++;
@@ -309,12 +322,33 @@ WRITE16_DEVICE_HANDLER( deco_bac06_pf_control_0_w )
{
offset &= 3;
deco_bac06_device *dev = (deco_bac06_device*)device;
+
COMBINE_DATA(&dev->pf_control_0[offset]);
+
+ if (offset==2)
+ {
+ int newbank = dev->pf_control_0[offset]&1;
+ if ((newbank&1) != (dev->m_rambank&1))
+ {
+ // I don't know WHY Stadium Hero uses this as a bank but the RAM test expects it..
+ // I'm curious as to if anything else sets it tho
+ if (strcmp(dev->machine->gamedrv->name,"stadhero"))
+ printf("tilemap ram bank change to %d\n", newbank&1);
+
+ dev->m_rambank = newbank&1;
+ tilemap_mark_all_tiles_dirty(dev->pf8x8_tilemap[0]);
+ tilemap_mark_all_tiles_dirty(dev->pf8x8_tilemap[1]);
+ tilemap_mark_all_tiles_dirty(dev->pf8x8_tilemap[2]);
+ tilemap_mark_all_tiles_dirty(dev->pf16x16_tilemap[0]);
+ tilemap_mark_all_tiles_dirty(dev->pf16x16_tilemap[1]);
+ tilemap_mark_all_tiles_dirty(dev->pf16x16_tilemap[2]);
+ }
+ }
}
READ16_DEVICE_HANDLER( deco_bac06_pf_control_1_r )
{
- offset &= 3;
+ offset &= 7;
deco_bac06_device *dev = (deco_bac06_device*)device;
return dev->pf_control_1[offset];
}
@@ -328,7 +362,10 @@ WRITE16_DEVICE_HANDLER( deco_bac06_pf_control_1_w )
WRITE16_DEVICE_HANDLER( deco_bac06_pf_data_w )
{
+
deco_bac06_device *dev = (deco_bac06_device*)device;
+ if (dev->m_rambank&1) offset+=0x1000;
+
COMBINE_DATA(&dev->pf_data[offset]);
tilemap_mark_tile_dirty(dev->pf8x8_tilemap[0],offset);
tilemap_mark_tile_dirty(dev->pf8x8_tilemap[1],offset);
@@ -341,6 +378,8 @@ WRITE16_DEVICE_HANDLER( deco_bac06_pf_data_w )
READ16_DEVICE_HANDLER( deco_bac06_pf_data_r )
{
deco_bac06_device *dev = (deco_bac06_device*)device;
+ if (dev->m_rambank&1) offset+=0x1000;
+
return dev->pf_data[offset];
}
diff --git a/src/mame/video/decbac06.h b/src/mame/video/decbac06.h
index 26e12b094a6..42935aa2983 100644
--- a/src/mame/video/decbac06.h
+++ b/src/mame/video/decbac06.h
@@ -37,8 +37,9 @@ public:
void deco_bac06_pf_draw(running_machine *machine,bitmap_t *bitmap,const rectangle *cliprect,int flags,UINT16 penmask, UINT16 pencondition,UINT16 colprimask, UINT16 colpricondition);
UINT8 get_flip_state(void) { return pf_control_0[0]&0x80; };
void set_colmask(int data) { m_gfxcolmask = data; }
-
+ void set_bppmultmask( int mult, int mask ) { m_bppmult = mult; m_bppmask = mask; } // stadium hero has 3bpp tiles
UINT8 m_gfxcolmask;
+ int m_rambank; // external connection?
protected:
virtual void device_start();
@@ -49,6 +50,9 @@ protected:
UINT8 m_gfxregion16x16;
int m_wide;
+ UINT8 m_bppmult;
+ UINT8 m_bppmask;
+
void custom_tilemap_draw(running_machine *machine,
bitmap_t *bitmap,
const rectangle *cliprect,
diff --git a/src/mame/video/stadhero.c b/src/mame/video/stadhero.c
index 1f08c91a47b..4f8e4033cfa 100644
--- a/src/mame/video/stadhero.c
+++ b/src/mame/video/stadhero.c
@@ -5,13 +5,14 @@
*********************************************************************
MXC-06 chip to produce sprites, see dec0.c
- BAC-06 chip for background?
+ BAC-06 chip for background
+ ??? for text layer
***************************************************************************/
#include "emu.h"
#include "includes/stadhero.h"
-
+#include "video/decbac06.h"
/******************************************************************************/
@@ -84,12 +85,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
SCREEN_UPDATE( stadhero )
{
stadhero_state *state = screen->machine->driver_data<stadhero_state>();
- state->flipscreen=state->pf2_control_0[0]&0x80;
- tilemap_set_flip_all(screen->machine,state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
- tilemap_set_scrollx( state->pf2_tilemap,0, state->pf2_control_1[0] );
- tilemap_set_scrolly( state->pf2_tilemap,0, state->pf2_control_1[1] );
+// tilemap_set_flip_all(screen->machine,state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
+
+ screen->machine->device<deco_bac06_device>("tilegen1")->set_bppmultmask(0x8, 0x7);
+ screen->machine->device<deco_bac06_device>("tilegen1")->deco_bac06_pf_draw(screen->machine,bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00);
- tilemap_draw(bitmap,cliprect,state->pf2_tilemap,0,0);
+ //pf2 draw
draw_sprites(screen->machine, bitmap,cliprect,0x00,0x00);
tilemap_draw(bitmap,cliprect,state->pf1_tilemap,0,0);
return 0;
@@ -104,44 +105,9 @@ WRITE16_HANDLER( stadhero_pf1_data_w )
tilemap_mark_tile_dirty(state->pf1_tilemap,offset);
}
-READ16_HANDLER( stadhero_pf2_data_r )
-{
- stadhero_state *state = space->machine->driver_data<stadhero_state>();
- return state->pf2_data[((state->pf2_control_0[2] & 0x01) ? 0x1000 : 0) | offset];
-}
-
-WRITE16_HANDLER( stadhero_pf2_data_w )
-{
- stadhero_state *state = space->machine->driver_data<stadhero_state>();
- COMBINE_DATA(&state->pf2_data[((state->pf2_control_0[2] & 0x01) ? 0x1000 : 0) | offset]);
- tilemap_mark_tile_dirty(state->pf2_tilemap,offset);
-}
-
/******************************************************************************/
-static TILEMAP_MAPPER( stadhero_scan )
-{
- /* logical (col,row) -> memory offset */
- return (col & 0xf) + ((row & 0xf) << 4) + ((row & 0x30) << 4) + ((col & 0x30) << 6);
-}
-
-static TILE_GET_INFO( get_pf2_tile_info )
-{
- stadhero_state *state = machine->driver_data<stadhero_state>();
- int tile,color;
-
- tile=state->pf2_data[((state->pf2_control_0[2] & 0x01) ? 0x1000 : 0) | tile_index];
- color=tile >> 12;
- tile=tile&0xfff;
-
- SET_TILE_INFO(
- 1,
- tile,
- color,
- 0);
-}
-
static TILE_GET_INFO( get_pf1_tile_info )
{
stadhero_state *state = machine->driver_data<stadhero_state>();
@@ -160,10 +126,6 @@ VIDEO_START( stadhero )
{
stadhero_state *state = machine->driver_data<stadhero_state>();
state->pf1_tilemap = tilemap_create(machine, get_pf1_tile_info,tilemap_scan_rows, 8, 8,32,32);
- state->pf2_tilemap = tilemap_create(machine, get_pf2_tile_info,stadhero_scan, 16,16,64,64);
-
- state->pf2_data = auto_alloc_array(machine, UINT16, 0x2000);
-
tilemap_set_transparent_pen(state->pf1_tilemap,0);
}