Added driver data struct to dday.c

Unfortunately, if you load a save state too early the game starts with no sound. For the moment, no SUPPORT_SAVE flag, but the game goes in my list of drivers which needs a second look. Feel free to step up and fix saves, if you like
This commit is contained in:
Fabio Priuli 2009-11-27 00:44:28 +00:00
parent 6379e9c903
commit 7e6ff401f5
4 changed files with 146 additions and 86 deletions

1
.gitattributes vendored
View File

@ -2402,6 +2402,7 @@ src/mame/includes/cvs.h svneol=native#text/plain
src/mame/includes/cyberbal.h svneol=native#text/plain src/mame/includes/cyberbal.h svneol=native#text/plain
src/mame/includes/dc.h svneol=native#text/plain src/mame/includes/dc.h svneol=native#text/plain
src/mame/includes/dcheese.h svneol=native#text/plain src/mame/includes/dcheese.h svneol=native#text/plain
src/mame/includes/dday.h svneol=native#text/plain
src/mame/includes/ddragon.h svneol=native#text/plain src/mame/includes/ddragon.h svneol=native#text/plain
src/mame/includes/ddragon3.h svneol=native#text/plain src/mame/includes/ddragon3.h svneol=native#text/plain
src/mame/includes/dec0.h svneol=native#text/plain src/mame/includes/dec0.h svneol=native#text/plain

View File

@ -52,32 +52,16 @@ write:
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "dday.h"
extern UINT8 *dday_bgvideoram;
extern UINT8 *dday_fgvideoram;
extern UINT8 *dday_textvideoram;
extern UINT8 *dday_colorram;
PALETTE_INIT( dday );
VIDEO_START( dday );
VIDEO_UPDATE( dday );
WRITE8_HANDLER( dday_bgvideoram_w );
WRITE8_HANDLER( dday_fgvideoram_w );
WRITE8_HANDLER( dday_textvideoram_w );
WRITE8_HANDLER( dday_colorram_w );
READ8_HANDLER( dday_colorram_r );
WRITE8_HANDLER( dday_control_w );
WRITE8_HANDLER( dday_sl_control_w );
READ8_HANDLER( dday_countdown_timer_r );
static ADDRESS_MAP_START( dday_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( dday_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x4000) AM_WRITE(dday_sl_control_w) AM_RANGE(0x4000, 0x4000) AM_WRITE(dday_sl_control_w)
AM_RANGE(0x5000, 0x53ff) AM_RAM_WRITE(dday_textvideoram_w) AM_BASE(&dday_textvideoram) AM_RANGE(0x5000, 0x53ff) AM_RAM_WRITE(dday_textvideoram_w) AM_BASE_MEMBER(dday_state, textvideoram)
AM_RANGE(0x5400, 0x57ff) AM_RAM_WRITE(dday_fgvideoram_w) AM_BASE(&dday_fgvideoram) AM_RANGE(0x5400, 0x57ff) AM_RAM_WRITE(dday_fgvideoram_w) AM_BASE_MEMBER(dday_state, fgvideoram)
AM_RANGE(0x5800, 0x5bff) AM_RAM_WRITE(dday_bgvideoram_w) AM_BASE(&dday_bgvideoram) AM_RANGE(0x5800, 0x5bff) AM_RAM_WRITE(dday_bgvideoram_w) AM_BASE_MEMBER(dday_state, bgvideoram)
AM_RANGE(0x5c00, 0x5fff) AM_READWRITE(dday_colorram_r, dday_colorram_w) AM_BASE(&dday_colorram) AM_RANGE(0x5c00, 0x5fff) AM_READWRITE(dday_colorram_r, dday_colorram_w) AM_BASE_MEMBER(dday_state, colorram)
AM_RANGE(0x6000, 0x63ff) AM_RAM AM_RANGE(0x6000, 0x63ff) AM_RAM
AM_RANGE(0x6400, 0x6401) AM_MIRROR(0x000e) AM_DEVWRITE("ay1", ay8910_address_data_w) AM_RANGE(0x6400, 0x6401) AM_MIRROR(0x000e) AM_DEVWRITE("ay1", ay8910_address_data_w)
AM_RANGE(0x6800, 0x6801) AM_DEVWRITE("ay2", ay8910_address_data_w) AM_RANGE(0x6800, 0x6801) AM_DEVWRITE("ay2", ay8910_address_data_w)
@ -186,7 +170,7 @@ static INPUT_PORTS_START( ddayc )
PORT_DIPSETTING( 0x30, DEF_STR( Easy ) ) // Easy - No Bombs, No Troop Carriers PORT_DIPSETTING( 0x30, DEF_STR( Easy ) ) // Easy - No Bombs, No Troop Carriers
PORT_DIPSETTING( 0x20, DEF_STR( Normal ) ) // Normal - No Bombs, Troop Carriers PORT_DIPSETTING( 0x20, DEF_STR( Normal ) ) // Normal - No Bombs, Troop Carriers
PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) // Hard - Bombs, Troop Carriers PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) // Hard - Bombs, Troop Carriers
PORT_DIPSETTING( 0x00, "Hard (duplicate setting)" ) // Same as 0x10 PORT_DIPSETTING( 0x00, "Hard (duplicate setting)" ) // Same as 0x10
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) // Doesn't seem to be used PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) // Doesn't seem to be used
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) )
@ -236,12 +220,40 @@ GFXDECODE_END
static MACHINE_START( dday )
{
dday_state *state = (dday_state *)machine->driver_data;
state->ay1 = devtag_get_device(machine, "ay1");
state_save_register_global(machine, state->control);
state_save_register_global(machine, state->sl_enable);
state_save_register_global(machine, state->sl_image);
state_save_register_global(machine, state->timer_value);
}
static MACHINE_RESET( dday )
{
dday_state *state = (dday_state *)machine->driver_data;
state->control = 0;
state->sl_enable = 0;
state->sl_image = 0;
}
static MACHINE_DRIVER_START( dday ) static MACHINE_DRIVER_START( dday )
/* driver data */
MDRV_DRIVER_DATA(dday_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 2000000) /* 2 MHz ? */ MDRV_CPU_ADD("maincpu", Z80, 2000000) /* 2 MHz ? */
MDRV_CPU_PROGRAM_MAP(dday_map) MDRV_CPU_PROGRAM_MAP(dday_map)
MDRV_MACHINE_START(dday)
MDRV_MACHINE_RESET(dday)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)

43
src/mame/includes/dday.h Normal file
View File

@ -0,0 +1,43 @@
/*************************************************************************
D-Day
*************************************************************************/
typedef struct _dday_state dday_state;
struct _dday_state
{
/* memory pointers */
UINT8 * bgvideoram;
UINT8 * fgvideoram;
UINT8 * textvideoram;
UINT8 * colorram;
/* video-related */
tilemap *fg_tilemap, *bg_tilemap, *text_tilemap, *sl_tilemap;
bitmap_t *main_bitmap;
int control;
int sl_image;
int sl_enable;
int timer_value;
/* devices */
const device_config *ay1;
};
/*----------- defined in video/dday.c -----------*/
PALETTE_INIT( dday );
VIDEO_START( dday );
VIDEO_UPDATE( dday );
WRITE8_HANDLER( dday_bgvideoram_w );
WRITE8_HANDLER( dday_fgvideoram_w );
WRITE8_HANDLER( dday_textvideoram_w );
WRITE8_HANDLER( dday_colorram_w );
READ8_HANDLER( dday_colorram_r );
WRITE8_HANDLER( dday_control_w );
WRITE8_HANDLER( dday_sl_control_w );
READ8_HANDLER( dday_countdown_timer_r );

View File

@ -10,19 +10,7 @@
#include "driver.h" #include "driver.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "dday.h"
UINT8 *dday_bgvideoram;
UINT8 *dday_fgvideoram;
UINT8 *dday_textvideoram;
UINT8 *dday_colorram;
static tilemap *fg_tilemap, *bg_tilemap, *text_tilemap, *sl_tilemap;
static bitmap_t *main_bitmap;
static int control;
static int sl_image;
static int sl_enable;
static int timer_value;
/* Note: There seems to be no way to reset this timer via hardware. /* Note: There seems to be no way to reset this timer via hardware.
@ -32,20 +20,24 @@ static int timer_value;
READ8_HANDLER( dday_countdown_timer_r ) READ8_HANDLER( dday_countdown_timer_r )
{ {
return ((timer_value / 10) << 4) | (timer_value % 10); dday_state *state = (dday_state *)space->machine->driver_data;
return ((state->timer_value / 10) << 4) | (state->timer_value % 10);
} }
static TIMER_CALLBACK( countdown_timer_callback ) static TIMER_CALLBACK( countdown_timer_callback )
{ {
timer_value--; dday_state *state = (dday_state *)machine->driver_data;
state->timer_value--;
if (timer_value < 0) if (state->timer_value < 0)
timer_value = 99; state->timer_value = 99;
} }
static void start_countdown_timer(running_machine *machine) static void start_countdown_timer(running_machine *machine)
{ {
timer_value = 0; dday_state *state = (dday_state *)machine->driver_data;
state->timer_value = 0;
timer_pulse(machine, ATTOTIME_IN_SEC(1), NULL, 0, countdown_timer_callback); timer_pulse(machine, ATTOTIME_IN_SEC(1), NULL, 0, countdown_timer_callback);
} }
@ -163,38 +155,42 @@ PALETTE_INIT( dday )
static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_bg_tile_info )
{ {
dday_state *state = (dday_state *)machine->driver_data;
int code; int code;
code = dday_bgvideoram[tile_index]; code = state->bgvideoram[tile_index];
SET_TILE_INFO(0, code, code >> 5, 0); SET_TILE_INFO(0, code, code >> 5, 0);
} }
static TILE_GET_INFO( get_fg_tile_info ) static TILE_GET_INFO( get_fg_tile_info )
{ {
dday_state *state = (dday_state *)machine->driver_data;
int code, flipx; int code, flipx;
flipx = dday_colorram[tile_index & 0x03e0] & 0x01; flipx = state->colorram[tile_index & 0x03e0] & 0x01;
code = dday_fgvideoram[flipx ? tile_index ^ 0x1f : tile_index]; code = state->fgvideoram[flipx ? tile_index ^ 0x1f : tile_index];
SET_TILE_INFO(2, code, code >> 5, flipx ? TILE_FLIPX : 0); SET_TILE_INFO(2, code, code >> 5, flipx ? TILE_FLIPX : 0);
} }
static TILE_GET_INFO( get_text_tile_info ) static TILE_GET_INFO( get_text_tile_info )
{ {
dday_state *state = (dday_state *)machine->driver_data;
int code; int code;
code = dday_textvideoram[tile_index]; code = state->textvideoram[tile_index];
SET_TILE_INFO(1, code, code >> 5, 0); SET_TILE_INFO(1, code, code >> 5, 0);
} }
static TILE_GET_INFO( get_sl_tile_info ) static TILE_GET_INFO( get_sl_tile_info )
{ {
dday_state *state = (dday_state *)machine->driver_data;
int code, sl_flipx, flipx; int code, sl_flipx, flipx;
UINT8* sl_map; UINT8* sl_map;
sl_map = &memory_region(machine, "user1")[(sl_image & 0x07) * 0x0200]; sl_map = &memory_region(machine, "user1")[(state->sl_image & 0x07) * 0x0200];
flipx = (tile_index >> 4) & 0x01; flipx = (tile_index >> 4) & 0x01;
sl_flipx = (sl_image >> 3) & 0x01; sl_flipx = (state->sl_image >> 3) & 0x01;
/* bit 4 is really a flip indicator. Need to shift bits 5-9 to the right by 1 */ /* bit 4 is really a flip indicator. Need to shift bits 5-9 to the right by 1 */
tile_index = ((tile_index & 0x03e0) >> 1) | (tile_index & 0x0f); tile_index = ((tile_index & 0x03e0) >> 1) | (tile_index & 0x0f);
@ -217,76 +213,82 @@ static TILE_GET_INFO( get_sl_tile_info )
VIDEO_START( dday ) VIDEO_START( dday )
{ {
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows,8,8,32,32); dday_state *state = (dday_state *)machine->driver_data;
fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows,8,8,32,32); state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
text_tilemap = tilemap_create(machine, get_text_tile_info,tilemap_scan_rows,8,8,32,32); state->fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
sl_tilemap = tilemap_create(machine, get_sl_tile_info, tilemap_scan_rows,8,8,32,32); state->text_tilemap = tilemap_create(machine, get_text_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
state->sl_tilemap = tilemap_create(machine, get_sl_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
main_bitmap = video_screen_auto_bitmap_alloc(machine->primary_screen); state->main_bitmap = video_screen_auto_bitmap_alloc(machine->primary_screen);
tilemap_set_transmask(bg_tilemap,0,0x00f0,0xff0f); /* pens 0-3 have priority over the foreground layer */ tilemap_set_transmask(state->bg_tilemap, 0, 0x00f0, 0xff0f); /* pens 0-3 have priority over the foreground layer */
tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_set_transparent_pen(fg_tilemap, 0); tilemap_set_transparent_pen(state->text_tilemap, 0);
tilemap_set_transparent_pen(text_tilemap, 0);
control = 0;
sl_enable = 0;
sl_image = 0;
start_countdown_timer(machine); start_countdown_timer(machine);
} }
WRITE8_HANDLER( dday_bgvideoram_w ) WRITE8_HANDLER( dday_bgvideoram_w )
{ {
dday_bgvideoram[offset] = data; dday_state *state = (dday_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap, offset);
state->bgvideoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
WRITE8_HANDLER( dday_fgvideoram_w ) WRITE8_HANDLER( dday_fgvideoram_w )
{ {
dday_fgvideoram[offset] = data; dday_state *state = (dday_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(fg_tilemap, offset);
tilemap_mark_tile_dirty(fg_tilemap, offset ^ 0x1f); /* for flipx case */ state->fgvideoram[offset] = data;
tilemap_mark_tile_dirty(state->fg_tilemap, offset);
tilemap_mark_tile_dirty(state->fg_tilemap, offset ^ 0x1f); /* for flipx case */
} }
WRITE8_HANDLER( dday_textvideoram_w ) WRITE8_HANDLER( dday_textvideoram_w )
{ {
dday_textvideoram[offset] = data; dday_state *state = (dday_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(text_tilemap, offset);
state->textvideoram[offset] = data;
tilemap_mark_tile_dirty(state->text_tilemap, offset);
} }
WRITE8_HANDLER( dday_colorram_w ) WRITE8_HANDLER( dday_colorram_w )
{ {
dday_state *state = (dday_state *)space->machine->driver_data;
int i; int i;
offset &= 0x03e0; offset &= 0x03e0;
dday_colorram[offset & 0x3e0] = data; state->colorram[offset & 0x3e0] = data;
for (i = 0; i < 0x20; i++) for (i = 0; i < 0x20; i++)
tilemap_mark_tile_dirty(fg_tilemap, offset + i); tilemap_mark_tile_dirty(state->fg_tilemap, offset + i);
} }
READ8_HANDLER( dday_colorram_r ) READ8_HANDLER( dday_colorram_r )
{ {
return dday_colorram[offset & 0x03e0]; dday_state *state = (dday_state *)space->machine->driver_data;
return state->colorram[offset & 0x03e0];
} }
WRITE8_HANDLER( dday_sl_control_w ) WRITE8_HANDLER( dday_sl_control_w )
{ {
if (sl_image != data) dday_state *state = (dday_state *)space->machine->driver_data;
{
sl_image = data;
tilemap_mark_all_tiles_dirty(sl_tilemap); if (state->sl_image != data)
{
state->sl_image = data;
tilemap_mark_all_tiles_dirty(state->sl_tilemap);
} }
} }
WRITE8_HANDLER( dday_control_w ) WRITE8_HANDLER( dday_control_w )
{ {
dday_state *state = (dday_state *)space->machine->driver_data;
//if (data & 0xac) logerror("Control = %02X\n", data & 0xac); //if (data & 0xac) logerror("Control = %02X\n", data & 0xac);
/* bit 0 is coin counter 1 */ /* bit 0 is coin counter 1 */
@ -296,15 +298,15 @@ WRITE8_HANDLER( dday_control_w )
coin_counter_w(space->machine, 1, data & 0x02); coin_counter_w(space->machine, 1, data & 0x02);
/* bit 4 is sound enable */ /* bit 4 is sound enable */
if (!(data & 0x10) && (control & 0x10)) if (!(data & 0x10) && (state->control & 0x10))
devtag_reset(space->machine, "ay1"); device_reset(state->ay1);
sound_global_enable(space->machine, data & 0x10); sound_global_enable(space->machine, data & 0x10);
/* bit 6 is search light enable */ /* bit 6 is search light enable */
sl_enable = data & 0x40; state->sl_enable = data & 0x40;
control = data; state->control = data;
} }
/*************************************************************************** /***************************************************************************
@ -315,22 +317,24 @@ WRITE8_HANDLER( dday_control_w )
VIDEO_UPDATE( dday ) VIDEO_UPDATE( dday )
{ {
tilemap_draw(main_bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1,0); dday_state *state = (dday_state *)screen->machine->driver_data;
tilemap_draw(main_bitmap,cliprect,fg_tilemap,0,0);
tilemap_draw(main_bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0,0);
tilemap_draw(main_bitmap,cliprect,text_tilemap,0,0);
if (sl_enable) tilemap_draw(state->main_bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER1, 0);
tilemap_draw(state->main_bitmap, cliprect, state->fg_tilemap, 0, 0);
tilemap_draw(state->main_bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER0, 0);
tilemap_draw(state->main_bitmap, cliprect, state->text_tilemap, 0, 0);
if (state->sl_enable)
{ {
/* apply shadow */ /* apply shadow */
int x, y; int x, y;
bitmap_t *sl_bitmap = tilemap_get_pixmap(sl_tilemap); bitmap_t *sl_bitmap = tilemap_get_pixmap(state->sl_tilemap);
for (x = cliprect->min_x; x <= cliprect->max_x; x++) for (x = cliprect->min_x; x <= cliprect->max_x; x++)
for (y = cliprect->min_y; y <= cliprect->max_y; y++) for (y = cliprect->min_y; y <= cliprect->max_y; y++)
{ {
UINT16 src_pixel = *BITMAP_ADDR16(main_bitmap, y, x); UINT16 src_pixel = *BITMAP_ADDR16(state->main_bitmap, y, x);
if (*BITMAP_ADDR16(sl_bitmap, y, x) == 0xff) if (*BITMAP_ADDR16(sl_bitmap, y, x) == 0xff)
src_pixel += screen->machine->config->total_colors; src_pixel += screen->machine->config->total_colors;
@ -339,7 +343,7 @@ VIDEO_UPDATE( dday )
} }
} }
else else
copybitmap(bitmap,main_bitmap,0,0,0,0,cliprect); copybitmap(bitmap, state->main_bitmap, 0, 0, 0, 0, cliprect);
return 0; return 0;
} }