mirror of
https://github.com/holub/mame
synced 2025-05-29 00:53:09 +03:00
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:
parent
6379e9c903
commit
7e6ff401f5
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -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/dc.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/ddragon3.h svneol=native#text/plain
|
||||
src/mame/includes/dec0.h svneol=native#text/plain
|
||||
|
@ -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)
|
||||
@ -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)
|
||||
|
43
src/mame/includes/dday.h
Normal file
43
src/mame/includes/dday.h
Normal 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 );
|
@ -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);
|
||||
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);
|
||||
|
||||
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_transparent_pen(fg_tilemap, 0);
|
||||
|
||||
tilemap_set_transparent_pen(text_tilemap, 0);
|
||||
|
||||
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;
|
||||
|
||||
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 */
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user