mirror of
https://github.com/holub/mame
synced 2025-06-30 07:58:56 +03:00
Fixed 03176: cheekyms: Graphic Regression [Pierpaolo Prazzoli]
This commit is contained in:
parent
f7627e13a3
commit
1e887cf719
@ -41,7 +41,7 @@ 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_WRITE(SMH_RAM) AM_BASE(&cheekyms_spriteram)
|
AM_RANGE(0x20, 0x3f) AM_WRITEONLY AM_BASE(&cheekyms_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(&cheekyms_port_80)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
@ -180,4 +180,4 @@ ROM_END
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
GAME( 1980, cheekyms, 0, cheekyms, cheekyms, 0, ROT270, "Universal", "Cheeky Mouse", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
|
GAME( 1980, cheekyms, 0, cheekyms, cheekyms, 0, ROT270, "Universal", "Cheeky Mouse", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
|
||||||
|
@ -17,7 +17,7 @@ UINT8 *cheekyms_spriteram;
|
|||||||
UINT8 *cheekyms_port_80;
|
UINT8 *cheekyms_port_80;
|
||||||
|
|
||||||
static tilemap *cheekyms_tilemap;
|
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 */
|
||||||
@ -97,9 +97,14 @@ static TILE_GET_INFO( cheekyms_get_tile_info )
|
|||||||
SET_TILE_INFO(0, code, color, 0);
|
SET_TILE_INFO(0, code, color, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VIDEO_START( cheekyms )
|
VIDEO_START( cheekyms )
|
||||||
{
|
{
|
||||||
|
int width, height;
|
||||||
|
|
||||||
|
width = video_screen_get_width(machine->primary_screen);
|
||||||
|
height = video_screen_get_height(machine->primary_screen);
|
||||||
|
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);
|
cheekyms_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(cheekyms_tilemap, 0);
|
||||||
}
|
}
|
||||||
@ -146,57 +151,51 @@ static void draw_sprites(gfx_element **gfx, bitmap_t *bitmap, const rectangle *c
|
|||||||
|
|
||||||
VIDEO_UPDATE( cheekyms )
|
VIDEO_UPDATE( cheekyms )
|
||||||
{
|
{
|
||||||
#define SCROLL_X_MIN 8
|
int y,x;
|
||||||
#define SCROLL_X_MAX 12
|
int scrolly = ((*cheekyms_port_80 >> 3) & 0x07);
|
||||||
#define SCROLL_Y_MIN 6
|
|
||||||
#define SCROLL_Y_MAX 25
|
|
||||||
|
|
||||||
const rectangle clip_no_scroll_top = { 0*8, 32*8-1, 0*8, SCROLL_Y_MIN*8-1 };
|
|
||||||
const rectangle clip_no_scroll_bottom = { 0*8, 32*8-1, (SCROLL_Y_MAX+1)*8, 32*8-1 };
|
|
||||||
const rectangle clip_no_scroll_left_nf = { 0*8, SCROLL_X_MIN*8-1, SCROLL_Y_MIN*8, (SCROLL_Y_MAX+1)*8-1 };
|
|
||||||
const rectangle clip_no_scroll_right_nf = { (SCROLL_X_MAX+1)*8, 32*8-1, SCROLL_Y_MIN*8, (SCROLL_Y_MAX+1)*8-1 };
|
|
||||||
const rectangle clip_no_scroll_left_f = { (32-SCROLL_X_MIN)*8, 32*8-1, SCROLL_Y_MIN*8, (SCROLL_Y_MAX+1)*8-1 };
|
|
||||||
const rectangle clip_no_scroll_right_f = { 0*8, (32-SCROLL_X_MAX-1)*8-1, SCROLL_Y_MIN*8, (SCROLL_Y_MAX+1)*8-1 };
|
|
||||||
const rectangle clip_scroll_nf = { SCROLL_X_MIN*8, 13*8-1, SCROLL_Y_MIN*8, (SCROLL_Y_MAX+1)*8-1 };
|
|
||||||
const rectangle clip_scroll_f = { (32-SCROLL_X_MAX-1)*8, (32-SCROLL_X_MIN)*8-1, SCROLL_Y_MIN*8, (SCROLL_Y_MAX+1)*8-1 };
|
|
||||||
|
|
||||||
int flip = *cheekyms_port_80 & 0x80;
|
int flip = *cheekyms_port_80 & 0x80;
|
||||||
|
|
||||||
tilemap_mark_all_tiles_dirty(ALL_TILEMAPS);
|
tilemap_mark_all_tiles_dirty(ALL_TILEMAPS);
|
||||||
tilemap_set_flip(ALL_TILEMAPS, flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);
|
tilemap_set_flip(ALL_TILEMAPS, flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);
|
||||||
|
|
||||||
bitmap_fill(bitmap, cliprect, 0);
|
bitmap_fill(bitmap, cliprect, 0);
|
||||||
|
bitmap_fill(bitmap_buffer, cliprect, 0);
|
||||||
|
|
||||||
/* sprites go under the playfield */
|
/* sprites go under the playfield */
|
||||||
draw_sprites(screen->machine->gfx, bitmap, cliprect, flip);
|
draw_sprites(screen->machine->gfx, bitmap, cliprect, flip);
|
||||||
|
|
||||||
/* draw the non-scrolling parts of the playfield first */
|
/* draw the tilemap to a temp bitmap */
|
||||||
tilemap_set_scrolly(cheekyms_tilemap, 0, 0);
|
tilemap_draw(bitmap_buffer, cliprect, cheekyms_tilemap, 0, 0);
|
||||||
tilemap_draw(bitmap, &clip_no_scroll_top, cheekyms_tilemap, 0, 0);
|
|
||||||
tilemap_draw(bitmap, &clip_no_scroll_bottom, cheekyms_tilemap, 0, 0);
|
/* 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(x = cliprect->min_x; x <= cliprect->max_x; x++)
|
||||||
|
{
|
||||||
|
int in_man_area;
|
||||||
|
|
||||||
if(flip)
|
if(flip)
|
||||||
{
|
{
|
||||||
tilemap_draw(bitmap, &clip_no_scroll_left_f, cheekyms_tilemap, 0, 0);
|
in_man_area = (x >= (32-12-1)*8 && x < (32-8)*8 && y > 5*8 && y < 27*8);
|
||||||
tilemap_draw(bitmap, &clip_no_scroll_right_f, cheekyms_tilemap, 0, 0);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tilemap_draw(bitmap, &clip_no_scroll_left_nf, cheekyms_tilemap, 0, 0);
|
in_man_area = (x >= 8*8 && x < 12*8 && y > 5*8 && y < 27*8);
|
||||||
tilemap_draw(bitmap, &clip_no_scroll_right_nf, cheekyms_tilemap, 0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now the scrolling part */
|
if(in_man_area)
|
||||||
if (flip)
|
|
||||||
{
|
{
|
||||||
tilemap_set_scrolly(cheekyms_tilemap, 0, -((*cheekyms_port_80 >> 3) & 0x07));
|
if ((y + scrolly) < 27*8 && *BITMAP_ADDR16(bitmap_buffer, y + scrolly, x) != 0)
|
||||||
tilemap_draw(bitmap, &clip_scroll_f, cheekyms_tilemap, 0, 0);
|
*BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(bitmap_buffer, y + scrolly, x);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tilemap_set_scrolly(cheekyms_tilemap, 0, (*cheekyms_port_80 >> 3) & 0x07);
|
if(*BITMAP_ADDR16(bitmap_buffer, y, x) != 0)
|
||||||
tilemap_draw(bitmap, &clip_scroll_nf, cheekyms_tilemap, 0, 0);
|
*BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(bitmap_buffer, y, x);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user