From ee93a9155103cb019aea2c50d3fc5f112062ab50 Mon Sep 17 00:00:00 2001 From: Couriersud Date: Sun, 24 Feb 2008 19:55:52 +0000 Subject: [PATCH] dkong.c: * remove usage of video/generic spriteram, videoram & flip_screen --- src/mame/drivers/dkong.c | 24 ++++++++----- src/mame/includes/dkong.h | 6 +++- src/mame/video/dkong.c | 75 +++++++++++++++++++++------------------ 3 files changed, 62 insertions(+), 43 deletions(-) diff --git a/src/mame/drivers/dkong.c b/src/mame/drivers/dkong.c index 4acad8dedf4..b5d7063eaca 100644 --- a/src/mame/drivers/dkong.c +++ b/src/mame/drivers/dkong.c @@ -717,8 +717,10 @@ static WRITE8_HANDLER( dkong3_2a03_reset_w ) static ADDRESS_MAP_START( dkong_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x6000, 0x6bff) AM_RAM - AM_RANGE(0x7000, 0x73ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) /* sprite set 1 */ - AM_RANGE(0x7400, 0x77ff) AM_READWRITE(MRA8_RAM, dkong_videoram_w) AM_BASE(&videoram) + AM_RANGE(0x7000, 0x73ff) AM_RAM AM_BASE_MEMBER(dkong_state, sprite_ram) + AM_SIZE_MEMBER(dkong_state, sprite_ram_size) /* sprite set 1 */ + AM_RANGE(0x7400, 0x77ff) AM_READWRITE(MRA8_RAM, dkong_videoram_w) + AM_BASE_MEMBER(dkong_state, video_ram) AM_RANGE(0x7800, 0x780f) AM_READWRITE(dma8257_0_r, dma8257_0_w) /* P8257 control registers */ AM_RANGE(0x7c00, 0x7c00) AM_READ_PORT("IN0") AM_WRITE(dkong_sh_tuneselect_w) /* IN0, sound CPU intf */ AM_RANGE(0x7c80, 0x7c80) AM_READ_PORT("IN1") AM_WRITE(radarscp_grid_color_w) /* IN1 */ @@ -737,8 +739,10 @@ static ADDRESS_MAP_START( dkongjr_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x5fff) AM_ROM AM_RANGE(0x6000, 0x6bff) AM_RAM AM_RANGE(0x6c00, 0x6fff) AM_RAM /* DK3 bootleg only */ - AM_RANGE(0x7000, 0x73ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) /* sprite set 1 */ - AM_RANGE(0x7400, 0x77ff) AM_READWRITE(MRA8_RAM, dkong_videoram_w) AM_BASE(&videoram) + AM_RANGE(0x7000, 0x73ff) AM_RAM AM_BASE_MEMBER(dkong_state, sprite_ram) + AM_SIZE_MEMBER(dkong_state, sprite_ram_size) /* sprite set 1 */ + AM_RANGE(0x7400, 0x77ff) AM_READWRITE(MRA8_RAM, dkong_videoram_w) + AM_BASE_MEMBER(dkong_state, video_ram) AM_RANGE(0x7800, 0x780f) AM_READWRITE(dma8257_0_r, dma8257_0_w) /* P8257 control registers */ AM_RANGE(0x7c00, 0x7c00) AM_READ_PORT("IN0") AM_WRITE(dkongjr_sh_tuneselect_w) AM_RANGE(0x7c80, 0x7c80) AM_READ_PORT("IN1") AM_WRITE(dkongjr_gfxbank_w) @@ -761,8 +765,10 @@ static ADDRESS_MAP_START( dkong3_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x5fff) AM_ROM AM_RANGE(0x6000, 0x67ff) AM_RAM AM_RANGE(0x6800, 0x6fff) AM_RAM - AM_RANGE(0x7000, 0x73ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) /* sprite set 1 */ - AM_RANGE(0x7400, 0x77ff) AM_READWRITE(MRA8_RAM, dkong_videoram_w) AM_BASE(&videoram) + AM_RANGE(0x7000, 0x73ff) AM_RAM AM_BASE_MEMBER(dkong_state, sprite_ram) + AM_SIZE_MEMBER(dkong_state, sprite_ram_size) /* sprite set 1 */ + AM_RANGE(0x7400, 0x77ff) AM_READWRITE(MRA8_RAM, dkong_videoram_w) + AM_BASE_MEMBER(dkong_state, video_ram) AM_RANGE(0x7c00, 0x7c00) AM_READ_PORT("IN0") AM_WRITE(soundlatch_w) AM_RANGE(0x7c80, 0x7c80) AM_READ_PORT("IN1") AM_WRITE(soundlatch2_w) AM_RANGE(0x7d00, 0x7d00) AM_READ_PORT("DSW0") AM_WRITE(soundlatch3_w) @@ -794,7 +800,8 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( hunchbkd_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x0fff) AM_ROM - AM_RANGE(0x1000, 0x13ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) /* 0x7000 */ + AM_RANGE(0x1000, 0x13ff) AM_RAM AM_BASE_MEMBER(dkong_state, sprite_ram) + AM_SIZE_MEMBER(dkong_state, sprite_ram_size) /* 0x7000 */ AM_RANGE(0x1400, 0x1400) AM_READ_PORT("IN0") AM_WRITE(dkong_sh_tuneselect_w) AM_RANGE(0x1480, 0x1480) AM_READ_PORT("IN1") AM_RANGE(0x1500, 0x1500) AM_READ(dkong_in2_r) /* IN2 */ @@ -806,7 +813,8 @@ static ADDRESS_MAP_START( hunchbkd_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x1585, 0x1585) AM_WRITE(p8257_drq_w) /* P8257 ==> /DRQ0 /DRQ1 */ AM_RANGE(0x1586, 0x1587) AM_WRITE(dkong_palettebank_w) AM_RANGE(0x1600, 0x17ff) AM_RAM /* 0x6400 spriteram location */ - AM_RANGE(0x1800, 0x1bff) AM_READWRITE(MRA8_RAM, dkong_videoram_w) AM_BASE(&videoram) /* 0x7400 */ + AM_RANGE(0x1800, 0x1bff) AM_READWRITE(MRA8_RAM, dkong_videoram_w) + AM_BASE_MEMBER(dkong_state, video_ram) /* 0x7400 */ AM_RANGE(0x1C00, 0x1f7f) AM_RAM /* 0x6000 */ AM_RANGE(0x1f80, 0x1f8f) AM_READWRITE(dma8257_0_r, dma8257_0_w) /* P8257 control registers */ /* 0x6800 not remapped */ diff --git a/src/mame/includes/dkong.h b/src/mame/includes/dkong.h index 3ab056afcdc..a4abda06d47 100644 --- a/src/mame/includes/dkong.h +++ b/src/mame/includes/dkong.h @@ -71,6 +71,9 @@ struct _dkong_state const UINT8 * color_codes; emu_timer * scanline_timer; INT8 vidhw; /* Selected video hardware RS Conversion / TKG04 */ + UINT8 * video_ram; + UINT8 * sprite_ram; + size_t sprite_ram_size; /* radar scope */ UINT8 sig30Hz; @@ -93,7 +96,8 @@ struct _dkong_state UINT16 grid_col; UINT8 sprite_bank; UINT8 dma_latch; - + UINT8 flip; + /* reverse address lookup map - hunchbkd */ INT16 rev_map[0x200]; diff --git a/src/mame/video/dkong.c b/src/mame/video/dkong.c index 5500202baff..9ecbf052dca 100644 --- a/src/mame/video/dkong.c +++ b/src/mame/video/dkong.c @@ -448,7 +448,7 @@ PALETTE_INIT( dkong3 ) static TILE_GET_INFO( dkong_bg_tile_info ) { dkong_state *state = machine->driver_data; - int code = videoram[tile_index] + 256 * state->gfx_bank; + int code = state->video_ram[tile_index] + 256 * state->gfx_bank; int color = (state->color_codes[tile_index % 32 + 32 * (tile_index / 32 / 4)] & 0x0f) + 0x10 * state->palette_bank; SET_TILE_INFO(0, code, color, 0); @@ -457,7 +457,7 @@ static TILE_GET_INFO( dkong_bg_tile_info ) static TILE_GET_INFO( radarsc1_bg_tile_info ) { dkong_state *state = machine->driver_data; - int code = videoram[tile_index] + 256 * state->gfx_bank; + int code = state->video_ram[tile_index] + 256 * state->gfx_bank; int color = (state->color_codes[tile_index % 32] & 0x0f); color = color | (state->palette_bank<<4); @@ -474,9 +474,9 @@ WRITE8_HANDLER( dkong_videoram_w ) { dkong_state *state = Machine->driver_data; - if (videoram[offset] != data) + if (state->video_ram[offset] != data) { - videoram[offset] = data; + state->video_ram[offset] = data; tilemap_mark_tile_dirty(state->bg_tilemap, offset); } } @@ -553,7 +553,9 @@ WRITE8_HANDLER( radarscp_grid_color_w ) WRITE8_HANDLER( dkong_flipscreen_w ) { - flip_screen_set(~data & 0x01); + dkong_state *state = Machine->driver_data; + + state->flip = ~data & 0x01; } WRITE8_HANDLER( dkong_spritebank_w ) @@ -575,55 +577,55 @@ static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const re int offs; /* Draw the sprites. */ - for (offs = state->sprite_bank<<9;offs < (state->sprite_bank<<9) + 0x200 /* spriteram_size */; offs += 4) + for (offs = state->sprite_bank<<9;offs < (state->sprite_bank<<9) + 0x200 /* sprite_ram_size */; offs += 4) { - if (spriteram[offs]) + if (state->sprite_ram[offs]) { - /* spriteram[offs + 2] & 0x40 is used by Donkey Kong 3 only */ - /* spriteram[offs + 2] & 0x30 don't seem to be used (they are */ + /* sprite_ram[offs + 2] & 0x40 is used by Donkey Kong 3 only */ + /* sprite_ram[offs + 2] & 0x30 don't seem to be used (they are */ /* probably not part of the color code, since Mario Bros, which */ /* has similar hardware, uses a memory mapped port to change */ /* palette bank, so it's limited to 16 color codes) */ int x,y; - x = spriteram[offs + 3] - 8; - y = 240 - spriteram[offs] + 7; + x = state->sprite_ram[offs + 3] - 8; + y = 240 - state->sprite_ram[offs] + 7; - if (flip_screen) + if (state->flip) { x = 240 - x; - y = VTOTAL - VBEND - y; + y = VTOTAL - VBEND - y - 8; drawgfx(bitmap,machine->gfx[1], - (spriteram[offs + 1] & 0x7f) + ((spriteram[offs + 2] & mask_bank) << shift_bits), - (spriteram[offs + 2] & 0x0f) + 16 * state->palette_bank, - !(spriteram[offs + 2] & 0x80),!(spriteram[offs + 1] & 0x80), + (state->sprite_ram[offs + 1] & 0x7f) + ((state->sprite_ram[offs + 2] & mask_bank) << shift_bits), + (state->sprite_ram[offs + 2] & 0x0f) + 16 * state->palette_bank, + !(state->sprite_ram[offs + 2] & 0x80),!(state->sprite_ram[offs + 1] & 0x80), x,y, cliprect,TRANSPARENCY_PEN,0); /* draw with wrap around - this fixes the 'beheading' bug */ drawgfx(bitmap,machine->gfx[1], - (spriteram[offs + 1] & 0x7f) + ((spriteram[offs + 2] & mask_bank) << shift_bits), - (spriteram[offs + 2] & 0x0f) + 16 * state->palette_bank, - (spriteram[offs + 2] & 0x80),(spriteram[offs + 1] & 0x80), + (state->sprite_ram[offs + 1] & 0x7f) + ((state->sprite_ram[offs + 2] & mask_bank) << shift_bits), + (state->sprite_ram[offs + 2] & 0x0f) + 16 * state->palette_bank, + (state->sprite_ram[offs + 2] & 0x80),(state->sprite_ram[offs + 1] & 0x80), x-256,y, cliprect,TRANSPARENCY_PEN,0); } else { drawgfx(bitmap,machine->gfx[1], - (spriteram[offs + 1] & 0x7f) + ((spriteram[offs + 2] & mask_bank) << shift_bits), - (spriteram[offs + 2] & 0x0f) + 16 * state->palette_bank, - (spriteram[offs + 2] & 0x80),(spriteram[offs + 1] & 0x80), + (state->sprite_ram[offs + 1] & 0x7f) + ((state->sprite_ram[offs + 2] & mask_bank) << shift_bits), + (state->sprite_ram[offs + 2] & 0x0f) + 16 * state->palette_bank, + (state->sprite_ram[offs + 2] & 0x80),(state->sprite_ram[offs + 1] & 0x80), x,y, cliprect,TRANSPARENCY_PEN,0); /* draw with wrap around - this fixes the 'beheading' bug */ drawgfx(bitmap,machine->gfx[1], - (spriteram[offs + 1] & 0x7f) + ((spriteram[offs + 2] & mask_bank) << shift_bits), - (spriteram[offs + 2] & 0x0f) + 16 * state->palette_bank, - (spriteram[offs + 2] & 0x80),(spriteram[offs + 1] & 0x80), + (state->sprite_ram[offs + 1] & 0x7f) + ((state->sprite_ram[offs + 2] & mask_bank) << shift_bits), + (state->sprite_ram[offs + 2] & 0x0f) + 16 * state->palette_bank, + (state->sprite_ram[offs + 2] & 0x80),(state->sprite_ram[offs + 1] & 0x80), x+256,y, cliprect,TRANSPARENCY_PEN,0); } @@ -804,7 +806,7 @@ static TIMER_CALLBACK( scanline_callback ) radarscp_step(machine, y); if (y <= machine->screen[0].visarea.min_y || y > machine->screen[0].visarea.max_y) counter = 0; - offset = ((-flip_screen) ^ state->rflip_sig) ? 0x000 : 0x400; + offset = (state->flip ^ state->rflip_sig) ? 0x000 : 0x400; x = 0; while (x < machine->screen[0].width) { @@ -877,9 +879,10 @@ static VIDEO_START( dkong_base ) state_save_register_global(state->snd02_enable); state_save_register_global(state->sig_ansn); state_save_register_global(state->grid_col); + state_save_register_global(state->flip); /* this must be registered here - hmmm */ - state_save_register_global(flip_screen); + //state_save_register_global(flip_screen); } @@ -919,6 +922,10 @@ VIDEO_UPDATE( dkong ) { dkong_state *state = machine->driver_data; + tilemap_set_flip(ALL_TILEMAPS, state->flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + tilemap_set_scrollx(state->bg_tilemap, 0, state->flip ? 0 : 0); + tilemap_set_scrolly(state->bg_tilemap, 0, state->flip ? -8 : 0); + switch (state->hardware_type) { case HARDWARE_TKG02: @@ -947,15 +954,15 @@ VIDEO_UPDATE( pestplce ) tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0); /* Draw the sprites. */ - for (offs = 0;offs < spriteram_size;offs += 4) + for (offs = 0;offs < state->sprite_ram_size;offs += 4) { - if (spriteram[offs]) + if (state->sprite_ram[offs]) { drawgfx(bitmap,machine->gfx[1], - spriteram[offs + 2], - (spriteram[offs + 1] & 0x0f) + 16 * state->palette_bank, - spriteram[offs + 1] & 0x80,spriteram[offs + 1] & 0x40, - spriteram[offs + 3] - 8,240 - spriteram[offs] + 8, + state->sprite_ram[offs + 2], + (state->sprite_ram[offs + 1] & 0x0f) + 16 * state->palette_bank, + state->sprite_ram[offs + 1] & 0x80,state->sprite_ram[offs + 1] & 0x40, + state->sprite_ram[offs + 3] - 8,240 - state->sprite_ram[offs] + 8, cliprect,TRANSPARENCY_PEN,0); } } @@ -968,7 +975,7 @@ VIDEO_UPDATE( spclforc ) tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0); - /* it uses spriteram[offs + 2] & 0x10 for sprite bank */ + /* it uses sprite_ram[offs + 2] & 0x10 for sprite bank */ draw_sprites(machine, bitmap, cliprect, 0x10, 3); return 0; }