summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2008-01-03 10:42:31 +0000
committer Aaron Giles <aaron@aarongiles.com>2008-01-03 10:42:31 +0000
commitb3fb53626459554998b46881bb8a3900db91980e (patch)
treeade7140a4cd9c3d269e3dc19e98db0484f0fde73 /src
parenteafea6095095ee14ef47a61ba4c9249a5ffa8a6d (diff)
Added save state support to btoads.
Fixed btoads0103gre.
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/btoads.c13
-rw-r--r--src/mame/video/btoads.c109
2 files changed, 98 insertions, 24 deletions
diff --git a/src/mame/drivers/btoads.c b/src/mame/drivers/btoads.c
index 906c4af1d94..f79ad8cc22d 100644
--- a/src/mame/drivers/btoads.c
+++ b/src/mame/drivers/btoads.c
@@ -35,6 +35,16 @@ static UINT8 sound_int_state;
*
*************************************/
+static MACHINE_START( btoads )
+{
+ state_save_register_global(main_to_sound_data);
+ state_save_register_global(main_to_sound_ready);
+ state_save_register_global(sound_to_main_data);
+ state_save_register_global(sound_to_main_ready);
+ state_save_register_global(sound_int_state);
+}
+
+
static MACHINE_RESET( btoads )
{
tlc34076_reset(6);
@@ -333,6 +343,7 @@ static MACHINE_DRIVER_START( btoads )
MDRV_CPU_IO_MAP(sound_io_map,0)
MDRV_CPU_PERIODIC_INT(irq0_line_assert, 183)
+ MDRV_MACHINE_START(btoads)
MDRV_MACHINE_RESET(btoads)
MDRV_NVRAM_HANDLER(generic_1fill)
@@ -384,4 +395,4 @@ ROM_END
*
*************************************/
-GAME( 1994, btoads, 0, btoads, btoads, 0, ROT0, "Rare", "Battle Toads", 0 )
+GAME( 1994, btoads, 0, btoads, btoads, 0, ROT0, "Rare", "Battle Toads", GAME_SUPPORTS_SAVE )
diff --git a/src/mame/video/btoads.c b/src/mame/video/btoads.c
index fb8306010ba..127cd7f1b4f 100644
--- a/src/mame/video/btoads.c
+++ b/src/mame/video/btoads.c
@@ -29,9 +29,9 @@ UINT16 *btoads_sprite_control;
static UINT8 *vram_fg_draw, *vram_fg_display;
-static int xscroll0, yscroll0;
-static int xscroll1, yscroll1;
-static int screen_control;
+static INT32 xscroll0, yscroll0;
+static INT32 xscroll1, yscroll1;
+static UINT8 screen_control;
static UINT16 sprite_source_offs;
static UINT8 *sprite_dest_base;
@@ -52,6 +52,16 @@ VIDEO_START( btoads )
/* initialize the swapped pointers */
vram_fg_draw = (UINT8 *)btoads_vram_fg0;
vram_fg_display = (UINT8 *)btoads_vram_fg1;
+
+ state_save_register_global(xscroll0);
+ state_save_register_global(xscroll1);
+ state_save_register_global(yscroll0);
+ state_save_register_global(yscroll1);
+ state_save_register_global(screen_control);
+
+ state_save_register_global(sprite_source_offs);
+ state_save_register_global(sprite_dest_offs);
+ state_save_register_global(misc_control);
}
@@ -340,43 +350,55 @@ void btoads_scanline_update(running_machine *machine, int screen, mame_bitmap *b
UINT16 *dst = BITMAP_ADDR16(bitmap, scanline, 0);
int coladdr = fulladdr & 0x3ff;
int x;
+
+ if (BT_DEBUG)
+ popmessage("screen_control = %02X", screen_control);
/* for each scanline, switch off the render mode */
switch (screen_control & 3)
{
/* mode 0: used in ship level, snake boss, title screen (free play) */
+ /* priority is:
+ 1. BG1 pixels with the high bit set
+ 2. Sprites
+ 3. BG1
+ 4. BG0
+ */
case 0:
-
- /* mode 2: used in EOA screen, jetpack level, first level, high score screen */
- case 2:
for (x = params->heblnk; x < params->hsblnk; x += 2, coladdr++)
{
+ UINT16 bg0pix = bg0_base[(coladdr + xscroll0) & 0xff];
+ UINT16 bg1pix = bg1_base[(coladdr + xscroll1) & 0xff];
UINT8 sprpix = spr_base[coladdr & 0xff];
- if (sprpix)
- {
+ if (bg1pix & 0x80)
+ dst[x + 0] = bg1pix & 0xff;
+ else if (sprpix)
dst[x + 0] = sprpix;
- dst[x + 1] = sprpix;
- }
+ else if (bg1pix & 0xff)
+ dst[x + 0] = bg1pix & 0xff;
else
- {
- UINT16 bg0pix = bg0_base[(coladdr + xscroll0) & 0xff];
- UINT16 bg1pix = bg1_base[(coladdr + xscroll1) & 0xff];
-
- if (bg1pix & 0xff)
- dst[x + 0] = bg1pix & 0xff;
- else
- dst[x + 0] = bg0pix & 0xff;
+ dst[x + 0] = bg0pix & 0xff;
- if (bg1pix >> 8)
- dst[x + 1] = bg1pix >> 8;
- else
- dst[x + 1] = bg0pix >> 8;
- }
+ if (bg1pix & 0x8000)
+ dst[x + 1] = bg1pix >> 8;
+ else if (sprpix)
+ dst[x + 1] = sprpix;
+ else if (bg1pix >> 8)
+ dst[x + 1] = bg1pix >> 8;
+ else
+ dst[x + 1] = bg0pix >> 8;
}
break;
/* mode 1: used in snow level, title screen (free play), top part of rolling ball level */
+ /* priority is:
+ 1. Sprite pixels with high bit clear
+ 2. BG0
+ 3. BG1 pixels with high bit set
+ 4. Sprite pixels with high bit set
+ 5. BG1
+ */
case 1:
for (x = params->heblnk; x < params->hsblnk; x += 2, coladdr++)
{
@@ -413,7 +435,48 @@ void btoads_scanline_update(running_machine *machine, int screen, mame_bitmap *b
}
break;
+ /* mode 2: used in EOA screen, jetpack level, first level, high score screen */
+ /* priority is:
+ 1. Sprites
+ 2. BG1
+ 3. BG0
+ */
+ case 2:
+ for (x = params->heblnk; x < params->hsblnk; x += 2, coladdr++)
+ {
+ UINT8 sprpix = spr_base[coladdr & 0xff];
+
+ if (sprpix)
+ {
+ dst[x + 0] = sprpix;
+ dst[x + 1] = sprpix;
+ }
+ else
+ {
+ UINT16 bg0pix = bg0_base[(coladdr + xscroll0) & 0xff];
+ UINT16 bg1pix = bg1_base[(coladdr + xscroll1) & 0xff];
+
+ if (bg1pix & 0xff)
+ dst[x + 0] = bg1pix & 0xff;
+ else
+ dst[x + 0] = bg0pix & 0xff;
+
+ if (bg1pix >> 8)
+ dst[x + 1] = bg1pix >> 8;
+ else
+ dst[x + 1] = bg0pix >> 8;
+ }
+ }
+ break;
+
/* mode 3: used in toilet level, toad intros, bottom of rolling ball level */
+ /* priority is:
+ 1. BG1 pixels with the high bit set
+ 2. Sprite pixels with the high bit set
+ 3. BG1
+ 4. Sprites
+ 5. BG0
+ */
case 3:
for (x = params->heblnk; x < params->hsblnk; x += 2, coladdr++)
{