diff options
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 |
commit | 7e6ff401f5dff01eb9a5b1f1e78c96a2aa700ef8 (patch) | |
tree | da5a291de6b23c6fa79410ebe2936d71f4f9af88 /src/mame | |
parent | 6379e9c903f6463057fc4c7f22a821f979ab9663 (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.c | 56 | ||||
-rw-r--r-- | src/mame/includes/dday.h | 43 | ||||
-rw-r--r-- | src/mame/video/dday.c | 132 |
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; } |