ooops... forgot that I added driver data struct to cheekyms.c as well. here it is.

This commit is contained in:
Fabio Priuli 2009-11-25 01:14:45 +00:00
parent c2d537c3dd
commit 9b5b396d06
4 changed files with 103 additions and 70 deletions

1
.gitattributes vendored
View File

@ -2375,6 +2375,7 @@ src/mame/includes/centiped.h svneol=native#text/plain
src/mame/includes/chaknpop.h svneol=native#text/plain src/mame/includes/chaknpop.h svneol=native#text/plain
src/mame/includes/champbas.h svneol=native#text/plain src/mame/includes/champbas.h svneol=native#text/plain
src/mame/includes/changela.h svneol=native#text/plain src/mame/includes/changela.h svneol=native#text/plain
src/mame/includes/cheekyms.h svneol=native#text/plain
src/mame/includes/cidelsa.h svneol=native#text/plain src/mame/includes/cidelsa.h svneol=native#text/plain
src/mame/includes/cinemat.h svneol=native#text/plain src/mame/includes/cinemat.h svneol=native#text/plain
src/mame/includes/circus.h svneol=native#text/plain src/mame/includes/circus.h svneol=native#text/plain

View File

@ -9,18 +9,7 @@
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "sound/dac.h" #include "sound/dac.h"
#include "cheekyms.h"
extern UINT8 *cheekyms_videoram;
extern UINT8 *cheekyms_spriteram;
extern UINT8 *cheekyms_port_80;
PALETTE_INIT( cheekyms );
VIDEO_START( cheekyms );
VIDEO_UPDATE( cheekyms );
WRITE8_HANDLER( cheekyms_port_40_w );
WRITE8_HANDLER( cheekyms_port_80_w );
static INPUT_CHANGED( coin_inserted ) static INPUT_CHANGED( coin_inserted )
@ -34,16 +23,16 @@ static INPUT_CHANGED( coin_inserted )
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x0000, 0x1fff) AM_ROM
AM_RANGE(0x3000, 0x33ff) AM_RAM AM_RANGE(0x3000, 0x33ff) AM_RAM
AM_RANGE(0x3800, 0x3bff) AM_RAM AM_BASE(&cheekyms_videoram) AM_RANGE(0x3800, 0x3bff) AM_RAM AM_BASE_MEMBER(cheekyms_state, videoram)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( io_map, ADDRESS_SPACE_IO, 8 ) static ADDRESS_MAP_START( io_map, ADDRESS_SPACE_IO, 8 )
ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x00) AM_READ_PORT("DSW") AM_RANGE(0x00, 0x00) AM_READ_PORT("DSW")
AM_RANGE(0x01, 0x01) AM_READ_PORT("INPUTS") AM_RANGE(0x01, 0x01) AM_READ_PORT("INPUTS")
AM_RANGE(0x20, 0x3f) AM_WRITEONLY AM_BASE(&cheekyms_spriteram) AM_RANGE(0x20, 0x3f) AM_WRITEONLY AM_BASE_MEMBER(cheekyms_state, spriteram)
AM_RANGE(0x40, 0x40) AM_WRITE(cheekyms_port_40_w) AM_RANGE(0x40, 0x40) AM_WRITE(cheekyms_port_40_w)
AM_RANGE(0x80, 0x80) AM_WRITE(cheekyms_port_80_w) AM_BASE(&cheekyms_port_80) AM_RANGE(0x80, 0x80) AM_WRITE(cheekyms_port_80_w) AM_BASE_MEMBER(cheekyms_state, port_80)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -118,14 +107,26 @@ static GFXDECODE_START( cheekyms )
GFXDECODE_END GFXDECODE_END
static MACHINE_START( cheekyms )
{
cheekyms_state *state = (cheekyms_state *)machine->driver_data;
state->dac = devtag_get_device(machine, "dac");
}
static MACHINE_DRIVER_START( cheekyms ) static MACHINE_DRIVER_START( cheekyms )
/* driver data */
MDRV_DRIVER_DATA(cheekyms_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,5000000/2) /* 2.5 MHz */ MDRV_CPU_ADD("maincpu", Z80,5000000/2) /* 2.5 MHz */
MDRV_CPU_PROGRAM_MAP(main_map) MDRV_CPU_PROGRAM_MAP(main_map)
MDRV_CPU_IO_MAP(io_map) MDRV_CPU_IO_MAP(io_map)
MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) MDRV_CPU_VBLANK_INT("screen", irq0_line_hold)
MDRV_MACHINE_START(cheekyms)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)

View File

@ -0,0 +1,31 @@
/*************************************************************************
Cheeky Mouse
*************************************************************************/
typedef struct _cheekyms_state cheekyms_state;
struct _cheekyms_state
{
/* memory pointers */
UINT8 * videoram;
UINT8 * spriteram;
UINT8 * port_80;
/* video-related */
tilemap *cm_tilemap;
bitmap_t *bitmap_buffer;
/* devices */
const device_config *dac;
};
/*----------- defined in video/cheekyms.c -----------*/
PALETTE_INIT( cheekyms );
VIDEO_START( cheekyms );
VIDEO_UPDATE( cheekyms );
WRITE8_HANDLER( cheekyms_port_40_w );
WRITE8_HANDLER( cheekyms_port_80_w );

View File

@ -10,37 +10,30 @@ Functions to emulate the video hardware of the machine.
#include "driver.h" #include "driver.h"
#include "sound/dac.h" #include "sound/dac.h"
#include "cheekyms.h"
UINT8 *cheekyms_videoram;
UINT8 *cheekyms_spriteram;
UINT8 *cheekyms_port_80;
static tilemap *cheekyms_tilemap;
static bitmap_t *bitmap_buffer;
/* bit 3 and 7 of the char color PROMs are used for something -- not currently emulated - /* bit 3 and 7 of the char color PROMs are used for something -- not currently emulated -
thus GAME_IMPERFECT_GRAPHICS */ thus GAME_IMPERFECT_GRAPHICS */
PALETTE_INIT( cheekyms ) PALETTE_INIT( cheekyms )
{ {
int i,j,bit,r,g,b; int i, j, bit, r, g, b;
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
{ {
for (j = 0;j < 0x20;j++) for (j = 0; j < 0x20; j++)
{ {
/* red component */ /* red component */
bit = (color_prom[0x20*(i/2)+j] >> ((4*(i&1))+0)) & 0x01; bit = (color_prom[0x20 * (i / 2) + j] >> ((4 * (i & 1)) + 0)) & 0x01;
r = 0xff * bit; r = 0xff * bit;
/* green component */ /* green component */
bit = (color_prom[0x20*(i/2)+j] >> ((4*(i&1))+1)) & 0x01; bit = (color_prom[0x20 * (i / 2) + j] >> ((4 * (i & 1)) + 1)) & 0x01;
g = 0xff * bit; g = 0xff * bit;
/* blue component */ /* blue component */
bit = (color_prom[0x20*(i/2)+j] >> ((4*(i&1))+2)) & 0x01; bit = (color_prom[0x20 * (i / 2) + j] >> ((4 * (i & 1)) + 2)) & 0x01;
b = 0xff * bit; b = 0xff * bit;
palette_set_color(machine,(i*0x20)+j,MAKE_RGB(r,g,b)); palette_set_color(machine, (i * 0x20) + j, MAKE_RGB(r,g,b));
} }
} }
} }
@ -48,19 +41,22 @@ PALETTE_INIT( cheekyms )
WRITE8_HANDLER( cheekyms_port_40_w ) WRITE8_HANDLER( cheekyms_port_40_w )
{ {
/* the lower bits probably trigger sound samples */ cheekyms_state *state = (cheekyms_state *)space->machine->driver_data;
dac_data_w(devtag_get_device(space->machine, "dac"), data ? 0x80 : 0); /* the lower bits probably trigger sound samples */
dac_data_w(state->dac, data ? 0x80 : 0);
} }
WRITE8_HANDLER( cheekyms_port_80_w ) WRITE8_HANDLER( cheekyms_port_80_w )
{ {
cheekyms_state *state = (cheekyms_state *)space->machine->driver_data;
/* d0-d1 - sound enables, not sure which bit is which */ /* d0-d1 - sound enables, not sure which bit is which */
/* d3-d5 - man scroll amount */ /* d3-d5 - man scroll amount */
/* d6 - palette select (selects either 0 = PROM M9, 1 = PROM M8) */ /* d6 - palette select (selects either 0 = PROM M9, 1 = PROM M8) */
/* d7 - screen flip */ /* d7 - screen flip */
*cheekyms_port_80 = data; *state->port_80 = data;
/* d2 - interrupt enable */ /* d2 - interrupt enable */
interrupt_enable_w(space, offset, data & 0x04); interrupt_enable_w(space, offset, data & 0x04);
@ -70,12 +66,13 @@ WRITE8_HANDLER( cheekyms_port_80_w )
static TILE_GET_INFO( cheekyms_get_tile_info ) static TILE_GET_INFO( cheekyms_get_tile_info )
{ {
cheekyms_state *state = (cheekyms_state *)machine->driver_data;
int color; int color;
int x = tile_index & 0x1f; int x = tile_index & 0x1f;
int y = tile_index >> 5; int y = tile_index >> 5;
int code = cheekyms_videoram[tile_index]; int code = state->videoram[tile_index];
int palette = (*cheekyms_port_80 >> 2) & 0x10; int palette = (*state->port_80 >> 2) & 0x10;
if (x >= 0x1e) if (x >= 0x1e)
{ {
@ -99,33 +96,35 @@ static TILE_GET_INFO( cheekyms_get_tile_info )
VIDEO_START( cheekyms ) VIDEO_START( cheekyms )
{ {
cheekyms_state *state = (cheekyms_state *)machine->driver_data;
int width, height; int width, height;
width = video_screen_get_width(machine->primary_screen); width = video_screen_get_width(machine->primary_screen);
height = video_screen_get_height(machine->primary_screen); height = video_screen_get_height(machine->primary_screen);
bitmap_buffer = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); state->bitmap_buffer = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
cheekyms_tilemap = tilemap_create(machine, cheekyms_get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->cm_tilemap = tilemap_create(machine, cheekyms_get_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(cheekyms_tilemap, 0); tilemap_set_transparent_pen(state->cm_tilemap, 0);
} }
static void draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, int flip) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, int flip )
{ {
cheekyms_state *state = (cheekyms_state *)machine->driver_data;
offs_t offs; offs_t offs;
for (offs = 0; offs < 0x20; offs += 4) for (offs = 0; offs < 0x20; offs += 4)
{ {
int x, y, code, color; int x, y, code, color;
if ((cheekyms_spriteram[offs + 3] & 0x08) == 0x00) continue; if ((state->spriteram[offs + 3] & 0x08) == 0x00) continue;
x = 256 - cheekyms_spriteram[offs + 2]; x = 256 - state->spriteram[offs + 2];
y = cheekyms_spriteram[offs + 1]; y = state->spriteram[offs + 1];
code = (~cheekyms_spriteram[offs + 0] & 0x0f) << 1; code = (~state->spriteram[offs + 0] & 0x0f) << 1;
color = (~cheekyms_spriteram[offs + 3] & 0x07); color = (~state->spriteram[offs + 3] & 0x07);
if (cheekyms_spriteram[offs + 0] & 0x80) if (state->spriteram[offs + 0] & 0x80)
{ {
if (!flip) if (!flip)
code++; code++;
@ -134,7 +133,7 @@ static void draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_
} }
else else
{ {
if (cheekyms_spriteram[offs + 0] & 0x02) if (state->spriteram[offs + 0] & 0x02)
{ {
drawgfx_transpen(bitmap, cliprect, gfx, code | 0x20, color, 0, 0, x, y, 0); drawgfx_transpen(bitmap, cliprect, gfx, code | 0x20, color, 0, 0, x, y, 0);
drawgfx_transpen(bitmap, cliprect, gfx, code | 0x21, color, 0, 0, 0x10 + x, y, 0); drawgfx_transpen(bitmap, cliprect, gfx, code | 0x21, color, 0, 0, 0x10 + x, y, 0);
@ -151,47 +150,48 @@ static void draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_
VIDEO_UPDATE( cheekyms ) VIDEO_UPDATE( cheekyms )
{ {
int y,x; cheekyms_state *state = (cheekyms_state *)screen->machine->driver_data;
int scrolly = ((*cheekyms_port_80 >> 3) & 0x07); int y, x;
int flip = *cheekyms_port_80 & 0x80; int scrolly = ((*state->port_80 >> 3) & 0x07);
int flip = *state->port_80 & 0x80;
tilemap_mark_all_tiles_dirty_all(screen->machine); tilemap_mark_all_tiles_dirty_all(screen->machine);
tilemap_set_flip_all(screen->machine, flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); tilemap_set_flip_all(screen->machine, flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);
bitmap_fill(bitmap, cliprect, 0); bitmap_fill(bitmap, cliprect, 0);
bitmap_fill(bitmap_buffer, cliprect, 0); bitmap_fill(state->bitmap_buffer, cliprect, 0);
/* sprites go under the playfield */ /* sprites go under the playfield */
draw_sprites(bitmap, cliprect, screen->machine->gfx[1], flip); draw_sprites(screen->machine, bitmap, cliprect, screen->machine->gfx[1], flip);
/* draw the tilemap to a temp bitmap */ /* draw the tilemap to a temp bitmap */
tilemap_draw(bitmap_buffer, cliprect, cheekyms_tilemap, 0, 0); tilemap_draw(state->bitmap_buffer, cliprect, state->cm_tilemap, 0, 0);
/* draw the tilemap to the final bitmap applying the scroll to the man character */ /* draw the tilemap to the final bitmap applying the scroll to the man character */
for(y = cliprect->min_y; y <= cliprect->max_y; y++) for (y = cliprect->min_y; y <= cliprect->max_y; y++)
{ {
for(x = cliprect->min_x; x <= cliprect->max_x; x++) for (x = cliprect->min_x; x <= cliprect->max_x; x++)
{ {
int in_man_area; int in_man_area;
if(flip) if (flip)
{ {
in_man_area = (x >= (32-12-1)*8 && x < (32-8)*8 && y > 5*8 && y < 27*8); in_man_area = (x >= (32 - 12 - 1) * 8 && x < (32 - 8) * 8 && y > 5 * 8 && y < 27 * 8);
} }
else else
{ {
in_man_area = (x >= 8*8 && x < 12*8 && y > 5*8 && y < 27*8); in_man_area = (x >= 8 * 8 && x < 12 * 8 && y > 5 * 8 && y < 27 * 8);
} }
if(in_man_area) if (in_man_area)
{ {
if ((y + scrolly) < 27*8 && *BITMAP_ADDR16(bitmap_buffer, y + scrolly, x) != 0) if ((y + scrolly) < 27 * 8 && *BITMAP_ADDR16(state->bitmap_buffer, y + scrolly, x) != 0)
*BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(bitmap_buffer, y + scrolly, x); *BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(state->bitmap_buffer, y + scrolly, x);
} }
else else
{ {
if(*BITMAP_ADDR16(bitmap_buffer, y, x) != 0) if(*BITMAP_ADDR16(state->bitmap_buffer, y, x) != 0)
*BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(bitmap_buffer, y, x); *BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(state->bitmap_buffer, y, x);
} }
} }
} }