diff options
| author | 2010-07-16 21:49:53 +0000 | |
|---|---|---|
| committer | 2010-07-16 21:49:53 +0000 | |
| commit | e1feb6722444762508e70306325ee3ff7bede0b5 (patch) | |
| tree | 3c1325aa8b1e39eab53126e754b8b9e582b050fc /src | |
| parent | 9d5c4e6badecc548b97058b976eb47f2db3b2dd5 (diff) | |
mt bug 3943 fix.
This breaks flip screen though in gaiden, wildfang, raiga. I don't know how to fix this in a clean way, any takers?
Diffstat (limited to 'src')
| -rw-r--r-- | src/mame/drivers/gaiden.c | 38 | ||||
| -rw-r--r-- | src/mame/includes/gaiden.h | 9 | ||||
| -rw-r--r-- | src/mame/video/gaiden.c | 62 |
3 files changed, 86 insertions, 23 deletions
diff --git a/src/mame/drivers/gaiden.c b/src/mame/drivers/gaiden.c index ae58879eabc..79865b601b1 100644 --- a/src/mame/drivers/gaiden.c +++ b/src/mame/drivers/gaiden.c @@ -9,8 +9,6 @@ Ninja Gaiden memory map (preliminary) 076000-077fff Sprite RAM 078000-079fff Palette RAM -07a100-07a1ff Unknown - memory mapped ports: read: @@ -22,12 +20,19 @@ read: see the input_ports definition below for details on the input bits write: -07a104-07a105 text layer Y scroll -07a10c-07a10d text layer X scroll -07a204-07a205 front layer Y scroll -07a20c-07a20d front layer X scroll -07a304-07a305 back layer Y scroll -07a30c-07a30d back layer X scroll +07a002-07a003 sprite layer Y offset +07a104-07a105 text layer Y scroll +07a108-07a109 text layer Y scroll offset +07a10c-07a10d text layer X scroll +07a204-07a205 front layer Y scroll +07a208-07a209 front layer Y scroll offset +07a20c-07a20d front layer X scroll +07a304-07a305 back layer Y scroll +07a308-07a309 back layer Y scroll offset +07a30c-07a30d back layer X scroll + +unknown writes during boot sequence and/or game start: +07a000, 07a004, 07a006, 07a100, 07a110, 07a200, 07a210, 07a300, 07a310 Notes: - The sprite Y size control is slightly different from gaiden/wildfang to @@ -301,6 +306,11 @@ static MACHINE_RESET( raiga ) state->bg_scroll_y = 0; state->fg_scroll_x = 0; state->fg_scroll_y = 0; + + state->tx_offset_y = 0; + state->fg_offset_y = 0; + state->bg_offset_y = 0; + state->spr_offset_y = 0; } static MACHINE_START( raiga ) @@ -317,6 +327,11 @@ static MACHINE_START( raiga ) state_save_register_global(machine, state->bg_scroll_y); state_save_register_global(machine, state->fg_scroll_x); state_save_register_global(machine, state->fg_scroll_y); + + state_save_register_global(machine, state->tx_offset_y); + state_save_register_global(machine, state->fg_offset_y); + state_save_register_global(machine, state->bg_offset_y); + state_save_register_global(machine, state->spr_offset_y); } static WRITE16_HANDLER( raiga_protection_w ) @@ -387,13 +402,16 @@ static ADDRESS_MAP_START( gaiden_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x076000, 0x077fff) AM_RAM AM_BASE_SIZE_MEMBER(gaiden_state, spriteram, spriteram_size) AM_RANGE(0x078000, 0x079fff) AM_RAM_WRITE(paletteram16_xxxxBBBBGGGGRRRR_word_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x07a000, 0x07a001) AM_READ_PORT("SYSTEM") - AM_RANGE(0x07a002, 0x07a003) AM_READ_PORT("P1_P2") + AM_RANGE(0x07a002, 0x07a003) AM_READ_PORT("P1_P2") AM_WRITE(gaiden_sproffsety_w) AM_RANGE(0x07a004, 0x07a005) AM_READ_PORT("DSW") AM_RANGE(0x07a104, 0x07a105) AM_WRITE(gaiden_txscrolly_w) + AM_RANGE(0x07a108, 0x07a109) AM_WRITE(gaiden_txoffsety_w) AM_RANGE(0x07a10c, 0x07a10d) AM_WRITE(gaiden_txscrollx_w) AM_RANGE(0x07a204, 0x07a205) AM_WRITE(gaiden_fgscrolly_w) + AM_RANGE(0x07a208, 0x07a209) AM_WRITE(gaiden_fgoffsety_w) AM_RANGE(0x07a20c, 0x07a20d) AM_WRITE(gaiden_fgscrollx_w) AM_RANGE(0x07a304, 0x07a305) AM_WRITE(gaiden_bgscrolly_w) + AM_RANGE(0x07a308, 0x07a309) AM_WRITE(gaiden_bgoffsety_w) AM_RANGE(0x07a30c, 0x07a30d) AM_WRITE(gaiden_bgscrollx_w) AM_RANGE(0x07a800, 0x07a801) AM_WRITE(watchdog_reset16_w) AM_RANGE(0x07a802, 0x07a803) AM_WRITE(gaiden_sound_command_w) @@ -873,7 +891,7 @@ static MACHINE_DRIVER_START( shadoww ) MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MDRV_SCREEN_SIZE(32*8, 32*8) - MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) + MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1) MDRV_GFXDECODE(gaiden) MDRV_PALETTE_LENGTH(4096) diff --git a/src/mame/includes/gaiden.h b/src/mame/includes/gaiden.h index 83db5fcc5fa..9e8f34c3380 100644 --- a/src/mame/includes/gaiden.h +++ b/src/mame/includes/gaiden.h @@ -19,11 +19,12 @@ public: size_t spriteram_size; /* video-related */ - tilemap_t *text_layer,*foreground,*background; + tilemap_t *text_layer,*foreground,*background; bitmap_t *sprite_bitmap, *tile_bitmap_bg, *tile_bitmap_fg; UINT16 tx_scroll_x, tx_scroll_y; UINT16 bg_scroll_x, bg_scroll_y; UINT16 fg_scroll_x, fg_scroll_y; + INT8 tx_offset_y, bg_offset_y, fg_offset_y, spr_offset_y; /* misc */ int sprite_sizey; @@ -52,10 +53,14 @@ READ16_HANDLER( gaiden_videoram2_r ); WRITE16_HANDLER( gaiden_videoram3_w ); READ16_HANDLER( gaiden_videoram3_r ); +WRITE16_HANDLER( gaiden_flip_w ); WRITE16_HANDLER( gaiden_txscrollx_w ); WRITE16_HANDLER( gaiden_txscrolly_w ); WRITE16_HANDLER( gaiden_fgscrollx_w ); WRITE16_HANDLER( gaiden_fgscrolly_w ); WRITE16_HANDLER( gaiden_bgscrollx_w ); WRITE16_HANDLER( gaiden_bgscrolly_w ); -WRITE16_HANDLER( gaiden_flip_w ); +WRITE16_HANDLER( gaiden_txoffsety_w ); +WRITE16_HANDLER( gaiden_fgoffsety_w ); +WRITE16_HANDLER( gaiden_bgoffsety_w ); +WRITE16_HANDLER( gaiden_sproffsety_w ); diff --git a/src/mame/video/gaiden.c b/src/mame/video/gaiden.c index d749794c3e2..4d8bc789848 100644 --- a/src/mame/video/gaiden.c +++ b/src/mame/video/gaiden.c @@ -165,6 +165,12 @@ VIDEO_START( drgnbowl ) ***************************************************************************/ +WRITE16_HANDLER( gaiden_flip_w ) +{ + if (ACCESSING_BITS_0_7) + flip_screen_set(space->machine, data & 1); +} + WRITE16_HANDLER( gaiden_txscrollx_w ) { gaiden_state *state = (gaiden_state *)space->machine->driver_data; @@ -176,7 +182,7 @@ WRITE16_HANDLER( gaiden_txscrolly_w ) { gaiden_state *state = (gaiden_state *)space->machine->driver_data; COMBINE_DATA(&state->tx_scroll_y); - tilemap_set_scrolly(state->text_layer, 0, state->tx_scroll_y); + tilemap_set_scrolly(state->text_layer, 0, (state->tx_scroll_y - state->tx_offset_y) & 0xffff); } WRITE16_HANDLER( gaiden_fgscrollx_w ) @@ -190,7 +196,7 @@ WRITE16_HANDLER( gaiden_fgscrolly_w ) { gaiden_state *state = (gaiden_state *)space->machine->driver_data; COMBINE_DATA(&state->fg_scroll_y); - tilemap_set_scrolly(state->foreground, 0, state->fg_scroll_y); + tilemap_set_scrolly(state->foreground, 0, (state->fg_scroll_y - state->fg_offset_y) & 0xffff); } WRITE16_HANDLER( gaiden_bgscrollx_w ) @@ -204,23 +210,57 @@ WRITE16_HANDLER( gaiden_bgscrolly_w ) { gaiden_state *state = (gaiden_state *)space->machine->driver_data; COMBINE_DATA(&state->bg_scroll_y); - tilemap_set_scrolly(state->background, 0, state->bg_scroll_y); + tilemap_set_scrolly(state->background, 0, (state->bg_scroll_y - state->bg_offset_y) & 0xffff); } -WRITE16_HANDLER( gaiden_videoram3_w ) +WRITE16_HANDLER( gaiden_txoffsety_w ) { gaiden_state *state = (gaiden_state *)space->machine->driver_data; - COMBINE_DATA(&state->videoram3[offset]); - tilemap_mark_tile_dirty(state->background, offset & 0x07ff); + + if (ACCESSING_BITS_0_7) { + state->tx_offset_y = data; + tilemap_set_scrolly(state->text_layer, 0, (state->tx_scroll_y - state->tx_offset_y) & 0xffff); + } } -WRITE16_HANDLER( gaiden_flip_w ) +WRITE16_HANDLER( gaiden_fgoffsety_w ) { - if (ACCESSING_BITS_0_7) - flip_screen_set(space->machine, data & 1); + gaiden_state *state = (gaiden_state *)space->machine->driver_data; + + if (ACCESSING_BITS_0_7) { + state->fg_offset_y = data; + tilemap_set_scrolly(state->foreground, 0, (state->fg_scroll_y - state->fg_offset_y) & 0xffff); + } +} + +WRITE16_HANDLER( gaiden_bgoffsety_w ) +{ + gaiden_state *state = (gaiden_state *)space->machine->driver_data; + + if (ACCESSING_BITS_0_7) { + state->bg_offset_y = data; + tilemap_set_scrolly(state->background, 0, (state->bg_scroll_y - state->bg_offset_y) & 0xffff); + } +} + +WRITE16_HANDLER( gaiden_sproffsety_w ) +{ + gaiden_state *state = (gaiden_state *)space->machine->driver_data; + + if (ACCESSING_BITS_0_7) { + state->spr_offset_y = data; + // handled in draw_sprites + } } +WRITE16_HANDLER( gaiden_videoram3_w ) +{ + gaiden_state *state = (gaiden_state *)space->machine->driver_data; + COMBINE_DATA(&state->videoram3[offset]); + tilemap_mark_tile_dirty(state->background, offset & 0x07ff); +} + READ16_HANDLER( gaiden_videoram3_r ) { gaiden_state *state = (gaiden_state *)space->machine->driver_data; @@ -358,7 +398,7 @@ static void gaiden_draw_sprites( running_machine *machine, bitmap_t *bitmap_bg, /* raiga needs something like this */ UINT32 number = (source[1] & (sizex > 2 ? 0x7ff8 : 0x7ffc)); - int ypos = source[3] & 0x01ff; + int ypos = (source[3] + state->spr_offset_y) & 0x01ff; int xpos = source[4] & 0x01ff; color = (color >> 4) & 0x0f; @@ -480,7 +520,7 @@ static void raiga_draw_sprites( running_machine *machine, bitmap_t *bitmap_bg, b /* raiga needs something like this */ UINT32 number = (source[1] & (sizex > 2 ? 0x7ff8 : 0x7ffc)); - int ypos = source[3] & 0x01ff; + int ypos = (source[3] + state->spr_offset_y) & 0x01ff; int xpos = source[4] & 0x01ff; color = (color >> 4) & 0x0f; |
