summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Michaël Banaan Ananas <happppp@users.noreply.github.com>2010-07-16 21:49:53 +0000
committer Michaël Banaan Ananas <happppp@users.noreply.github.com>2010-07-16 21:49:53 +0000
commite1feb6722444762508e70306325ee3ff7bede0b5 (patch)
tree3c1325aa8b1e39eab53126e754b8b9e582b050fc /src
parent9d5c4e6badecc548b97058b976eb47f2db3b2dd5 (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.c38
-rw-r--r--src/mame/includes/gaiden.h9
-rw-r--r--src/mame/video/gaiden.c62
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;