summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame
diff options
context:
space:
mode:
author Fabio Priuli <etabeta78@users.noreply.github.com>2009-11-27 00:44:28 +0000
committer Fabio Priuli <etabeta78@users.noreply.github.com>2009-11-27 00:44:28 +0000
commit7e6ff401f5dff01eb9a5b1f1e78c96a2aa700ef8 (patch)
treeda5a291de6b23c6fa79410ebe2936d71f4f9af88 /src/mame
parent6379e9c903f6463057fc4c7f22a821f979ab9663 (diff)
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
Diffstat (limited to 'src/mame')
-rw-r--r--src/mame/drivers/dday.c56
-rw-r--r--src/mame/includes/dday.h43
-rw-r--r--src/mame/video/dday.c132
3 files changed, 145 insertions, 86 deletions
diff --git a/src/mame/drivers/dday.c b/src/mame/drivers/dday.c
index 882620af01f..396bb45bcfc 100644
--- a/src/mame/drivers/dday.c
+++ b/src/mame/drivers/dday.c
@@ -52,32 +52,16 @@ write:
#include "driver.h"
#include "cpu/z80/z80.h"
#include "sound/ay8910.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 );
+#include "dday.h"
static ADDRESS_MAP_START( dday_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM
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(0x5400, 0x57ff) AM_RAM_WRITE(dday_fgvideoram_w) AM_BASE(&dday_fgvideoram)
- AM_RANGE(0x5800, 0x5bff) AM_RAM_WRITE(dday_bgvideoram_w) AM_BASE(&dday_bgvideoram)
- AM_RANGE(0x5c00, 0x5fff) AM_READWRITE(dday_colorram_r, dday_colorram_w) AM_BASE(&dday_colorram)
+ 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_MEMBER(dday_state, fgvideoram)
+ 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_MEMBER(dday_state, colorram)
AM_RANGE(0x6000, 0x63ff) AM_RAM
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)
@@ -186,7 +170,7 @@ static INPUT_PORTS_START( ddayc )
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( 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_DIPSETTING( 0x00, DEF_STR( Off ) )
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 )
+ /* driver data */
+ MDRV_DRIVER_DATA(dday_state)
+
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 2000000) /* 2 MHz ? */
MDRV_CPU_PROGRAM_MAP(dday_map)
+ MDRV_MACHINE_START(dday)
+ MDRV_MACHINE_RESET(dday)
+
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
diff --git a/src/mame/includes/dday.h b/src/mame/includes/dday.h
new file mode 100644
index 00000000000..af709507770
--- /dev/null
+++ b/src/mame/includes/dday.h
@@ -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 );
diff --git a/src/mame/video/dday.c b/src/mame/video/dday.c
index abd734d642a..3b91f1cfa94 100644
--- a/src/mame/video/dday.c
+++ b/src/mame/video/dday.c
@@ -10,19 +10,7 @@
#include "driver.h"
#include "sound/ay8910.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;
+#include "dday.h"
/* 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 )
{
- 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 )
{
- timer_value--;
+ dday_state *state = (dday_state *)machine->driver_data;
+ state->timer_value--;
- if (timer_value < 0)
- timer_value = 99;
+ if (state->timer_value < 0)
+ state->timer_value = 99;
}
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);
}
@@ -163,38 +155,42 @@ PALETTE_INIT( dday )
static TILE_GET_INFO( get_bg_tile_info )
{
+ dday_state *state = (dday_state *)machine->driver_data;
int code;
- code = dday_bgvideoram[tile_index];
+ code = state->bgvideoram[tile_index];
SET_TILE_INFO(0, code, code >> 5, 0);
}
static TILE_GET_INFO( get_fg_tile_info )
{
+ dday_state *state = (dday_state *)machine->driver_data;
int code, flipx;
- flipx = dday_colorram[tile_index & 0x03e0] & 0x01;
- code = dday_fgvideoram[flipx ? tile_index ^ 0x1f : tile_index];
+ flipx = state->colorram[tile_index & 0x03e0] & 0x01;
+ code = state->fgvideoram[flipx ? tile_index ^ 0x1f : tile_index];
SET_TILE_INFO(2, code, code >> 5, flipx ? TILE_FLIPX : 0);
}
static TILE_GET_INFO( get_text_tile_info )
{
+ dday_state *state = (dday_state *)machine->driver_data;
int code;
- code = dday_textvideoram[tile_index];
+ code = state->textvideoram[tile_index];
SET_TILE_INFO(1, code, code >> 5, 0);
}
static TILE_GET_INFO( get_sl_tile_info )
{
+ dday_state *state = (dday_state *)machine->driver_data;
int code, sl_flipx, flipx;
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;
- 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 */
tile_index = ((tile_index & 0x03e0) >> 1) | (tile_index & 0x0f);
@@ -217,76 +213,82 @@ static TILE_GET_INFO( get_sl_tile_info )
VIDEO_START( dday )
{
- bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows,8,8,32,32);
- fg_tilemap = tilemap_create(machine, get_fg_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);
- 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);
-
- tilemap_set_transmask(bg_tilemap,0,0x00f0,0xff0f); /* pens 0-3 have priority over the foreground layer */
-
- tilemap_set_transparent_pen(fg_tilemap, 0);
+ dday_state *state = (dday_state *)machine->driver_data;
+ state->bg_tilemap = tilemap_create(machine, get_bg_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);
+ 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);
- tilemap_set_transparent_pen(text_tilemap, 0);
+ state->main_bitmap = video_screen_auto_bitmap_alloc(machine->primary_screen);
- control = 0;
- sl_enable = 0;
- sl_image = 0;
+ 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(state->text_tilemap, 0);
start_countdown_timer(machine);
}
WRITE8_HANDLER( dday_bgvideoram_w )
{
- dday_bgvideoram[offset] = data;
- tilemap_mark_tile_dirty(bg_tilemap, offset);
+ dday_state *state = (dday_state *)space->machine->driver_data;
+
+ state->bgvideoram[offset] = data;
+ tilemap_mark_tile_dirty(state->bg_tilemap, offset);
}
WRITE8_HANDLER( dday_fgvideoram_w )
{
- dday_fgvideoram[offset] = data;
- tilemap_mark_tile_dirty(fg_tilemap, offset);
- tilemap_mark_tile_dirty(fg_tilemap, offset ^ 0x1f); /* for flipx case */
+ dday_state *state = (dday_state *)space->machine->driver_data;
+
+ 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 )
{
- dday_textvideoram[offset] = data;
- tilemap_mark_tile_dirty(text_tilemap, offset);
+ dday_state *state = (dday_state *)space->machine->driver_data;
+
+ state->textvideoram[offset] = data;
+ tilemap_mark_tile_dirty(state->text_tilemap, offset);
}
WRITE8_HANDLER( dday_colorram_w )
{
+ dday_state *state = (dday_state *)space->machine->driver_data;
int i;
offset &= 0x03e0;
- dday_colorram[offset & 0x3e0] = data;
+ state->colorram[offset & 0x3e0] = data;
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 )
{
- 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 )
{
- if (sl_image != data)
- {
- sl_image = data;
+ dday_state *state = (dday_state *)space->machine->driver_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 )
{
+ dday_state *state = (dday_state *)space->machine->driver_data;
+
//if (data & 0xac) logerror("Control = %02X\n", data & 0xac);
/* bit 0 is coin counter 1 */
@@ -296,15 +298,15 @@ WRITE8_HANDLER( dday_control_w )
coin_counter_w(space->machine, 1, data & 0x02);
/* bit 4 is sound enable */
- if (!(data & 0x10) && (control & 0x10))
- devtag_reset(space->machine, "ay1");
+ if (!(data & 0x10) && (state->control & 0x10))
+ device_reset(state->ay1);
sound_global_enable(space->machine, data & 0x10);
/* 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 )
{
- tilemap_draw(main_bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1,0);
- 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);
+ dday_state *state = (dday_state *)screen->machine->driver_data;
+
+ 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 (sl_enable)
+ if (state->sl_enable)
{
/* apply shadow */
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 (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)
src_pixel += screen->machine->config->total_colors;
@@ -339,7 +343,7 @@ VIDEO_UPDATE( dday )
}
}
else
- copybitmap(bitmap,main_bitmap,0,0,0,0,cliprect);
+ copybitmap(bitmap, state->main_bitmap, 0, 0, 0, 0, cliprect);
return 0;
}