summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nicola Salmoria <nicola@mamedev.org>2008-06-05 05:33:23 +0000
committer Nicola Salmoria <nicola@mamedev.org>2008-06-05 05:33:23 +0000
commit707c11bd06fbf8c2bac781858bc54e1027d86f1f (patch)
tree3cb7f914f13b08724d3aa3175c4fa757bdbf87f8
parent466bc7737cc4053dfbc8f3e2456d06795f9a09e8 (diff)
increased gunnail 68000 clock to 12MHz to match readme. This avoids slowdowns.
added support for per-scanline y scroll. Fixes level 5 and boss explosions. 00778: gunnail: The background in stage 5 is wrong. 00779: gunnail: After you kill a boss, always a number of vertical lines will appear.
-rw-r--r--src/mame/drivers/nmk16.c47
-rw-r--r--src/mame/video/nmk16.c49
2 files changed, 55 insertions, 41 deletions
diff --git a/src/mame/drivers/nmk16.c b/src/mame/drivers/nmk16.c
index bb3ee59af8f..ca0f8738b52 100644
--- a/src/mame/drivers/nmk16.c
+++ b/src/mame/drivers/nmk16.c
@@ -201,7 +201,7 @@ static WRITE16_HANDLER( nmk16_mainram_strange_w )
}
extern UINT16 *nmk_bgvideoram,*nmk_fgvideoram,*nmk_txvideoram;
-extern UINT16 *gunnail_scrollram;
+extern UINT16 *gunnail_scrollram, *gunnail_scrollramy;
READ16_HANDLER( nmk_bgvideoram_r );
WRITE16_HANDLER( nmk_bgvideoram_w );
@@ -212,8 +212,6 @@ WRITE16_HANDLER( nmk_txvideoram_w );
WRITE16_HANDLER( nmk_scroll_w );
WRITE16_HANDLER( nmk_scroll_2_w );
WRITE16_HANDLER( nmk_scroll_3_w );
-WRITE16_HANDLER( gunnail_scrollx_w );
-WRITE16_HANDLER( gunnail_scrolly_w );
WRITE16_HANDLER( nmk_flipscreen_w );
WRITE16_HANDLER( nmk_tilebank_w );
WRITE16_HANDLER( bioship_scroll_w );
@@ -991,33 +989,24 @@ static ADDRESS_MAP_START( macross_writemem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x09c000, 0x09c7ff) AM_WRITE(nmk_txvideoram_w) AM_BASE(&nmk_txvideoram)
ADDRESS_MAP_END
-static ADDRESS_MAP_START( gunnail_readmem, ADDRESS_SPACE_PROGRAM, 16 )
- AM_RANGE(0x000000, 0x07ffff) AM_READ(SMH_ROM)
+static ADDRESS_MAP_START( gunnail_map, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x080000, 0x080001) AM_READ(input_port_0_word_r)
AM_RANGE(0x080002, 0x080003) AM_READ(input_port_1_word_r)
AM_RANGE(0x080008, 0x080009) AM_READ(input_port_2_word_r)
AM_RANGE(0x08000a, 0x08000b) AM_READ(input_port_3_word_r)
AM_RANGE(0x08000e, 0x08000f) AM_READ(NMK004_r)
- AM_RANGE(0x088000, 0x0887ff) AM_READ(SMH_RAM) /* palette ram */
- AM_RANGE(0x090000, 0x093fff) AM_READ(nmk_bgvideoram_r)
- AM_RANGE(0x09c000, 0x09cfff) AM_READ(nmk_txvideoram_r)
- AM_RANGE(0x09d000, 0x09dfff) AM_READ(nmk_txvideoram_r) /* mirror */
- AM_RANGE(0x0f0000, 0x0fffff) AM_RAM AM_BASE(&nmk16_mainram)
-ADDRESS_MAP_END
-
-static ADDRESS_MAP_START( gunnail_writemem, ADDRESS_SPACE_PROGRAM, 16 )
- AM_RANGE(0x000000, 0x07ffff) AM_WRITE(SMH_ROM)
AM_RANGE(0x080014, 0x080015) AM_WRITE(nmk_flipscreen_w)
AM_RANGE(0x080016, 0x080017) AM_WRITE(SMH_NOP) /* IRQ enable? */
AM_RANGE(0x080018, 0x080019) AM_WRITE(nmk_tilebank_w)
AM_RANGE(0x08001e, 0x08001f) AM_WRITE(NMK004_w)
- AM_RANGE(0x088000, 0x0887ff) AM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_BASE(&paletteram16)
- AM_RANGE(0x08c000, 0x08c1ff) AM_RAM_WRITE(gunnail_scrollx_w) AM_BASE(&gunnail_scrollram)
- AM_RANGE(0x08c200, 0x08c201) AM_WRITE(gunnail_scrolly_w)
- AM_RANGE(0x08c202, 0x08c7ff) AM_RAM // extra scroll registers (used after a boss is killed and in level 5)
- AM_RANGE(0x090000, 0x093fff) AM_WRITE(nmk_bgvideoram_w) AM_BASE(&nmk_bgvideoram)
- AM_RANGE(0x09c000, 0x09cfff) AM_WRITE(nmk_txvideoram_w) AM_BASE(&nmk_txvideoram)
- AM_RANGE(0x09d000, 0x09dfff) AM_WRITE(nmk_txvideoram_w) /* mirror */
+ AM_RANGE(0x088000, 0x0887ff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x08c000, 0x08c1ff) AM_WRITEONLY AM_BASE(&gunnail_scrollram)
+ AM_RANGE(0x08c200, 0x08c3ff) AM_WRITEONLY AM_BASE(&gunnail_scrollramy)
+ AM_RANGE(0x08c400, 0x08c7ff) AM_WRITEONLY // unknown
+ AM_RANGE(0x090000, 0x093fff) AM_RAM_WRITE(nmk_bgvideoram_w) AM_BASE(&nmk_bgvideoram)
+ AM_RANGE(0x09c000, 0x09cfff) AM_RAM_WRITE(nmk_txvideoram_w) AM_MIRROR(0x001000) AM_BASE(&nmk_txvideoram)
+ AM_RANGE(0x0f0000, 0x0fffff) AM_RAM AM_BASE(&nmk16_mainram)
ADDRESS_MAP_END
static ADDRESS_MAP_START( macross2_readmem, ADDRESS_SPACE_PROGRAM, 16 )
@@ -4352,8 +4341,8 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( gunnail )
/* basic machine hardware */
- MDRV_CPU_ADD(M68000, 10000000) /* 10 MHz? */
- MDRV_CPU_PROGRAM_MAP(gunnail_readmem,gunnail_writemem)
+ MDRV_CPU_ADD(M68000, 12000000) /* 12 MHz? */
+ MDRV_CPU_PROGRAM_MAP(gunnail_map, 0)
MDRV_CPU_VBLANK_INT("main", irq4_line_hold)
MDRV_CPU_PERIODIC_INT(irq1_line_hold,112)
@@ -4362,7 +4351,7 @@ static MACHINE_DRIVER_START( gunnail )
/* video hardware */
MDRV_SCREEN_ADD("main", RASTER)
MDRV_SCREEN_REFRESH_RATE(56)
- MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
+// MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 256)
MDRV_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1)
@@ -5973,6 +5962,16 @@ ROM_START( macross )
ROM_LOAD( "921a10", 0x0200, 0x0020, CRC(8371e42d) SHA1(6cfd70dfa00e85ec1df8832d41df331cc3e3733a) ) /* unknown */
ROM_END
+/*
+Gunnail (JPN Ver.)
+(c)1992 NMK
+AK92077
+
+CPU :MC68000P12
+Sound:YM2203C,OKI M6295 x2
+OSC :12.0000MHz,16.0000MHz,10.0000MHz
+Other:NMK 111 x3,214 x2,901,903 x2,902,005,004,215,008,009 x2
+*/
ROM_START( gunnail )
ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "3e.bin", 0x00000, 0x40000, CRC(61d985b2) SHA1(96daca603f18accb47f98a3e584b2c84fc5a2ca4) )
diff --git a/src/mame/video/nmk16.c b/src/mame/video/nmk16.c
index 890be16b37d..44bd34296a5 100644
--- a/src/mame/video/nmk16.c
+++ b/src/mame/video/nmk16.c
@@ -10,8 +10,7 @@
#include "driver.h"
UINT16 *nmk_bgvideoram,*nmk_fgvideoram,*nmk_txvideoram;
-UINT16 *gunnail_scrollram;
-static UINT16 gunnail_scrolly;
+UINT16 *gunnail_scrollram, *gunnail_scrollramy;
static int redraw_bitmap;
@@ -403,16 +402,6 @@ WRITE16_HANDLER( bioship_bank_w )
}
}
-WRITE16_HANDLER( gunnail_scrollx_w )
-{
- COMBINE_DATA(&gunnail_scrollram[offset]);
-}
-
-WRITE16_HANDLER( gunnail_scrolly_w )
-{
- COMBINE_DATA(&gunnail_scrolly);
-}
-
/***************************************************************************
Display refresh
@@ -746,15 +735,41 @@ VIDEO_UPDATE( tharrier )
VIDEO_UPDATE( gunnail )
{
- int i;
+ int y1, i;
+ rectangle bgclip = *cliprect;
- for (i = 0;i < 256;i++)
+ // the hardware supports per-scanline X *and* Y scroll which isn't
+ // supported by tilemaps so we have to draw the tilemap one line at a time
+ y1 = cliprect->min_y;
+ while (y1 <= cliprect->max_y)
{
- tilemap_set_scrollx(bg_tilemap,(i+gunnail_scrolly) & 0x1ff,gunnail_scrollram[0] + gunnail_scrollram[i] - videoshift);
+ int const yscroll = gunnail_scrollramy[0] + gunnail_scrollramy[y1];
+ int y2;
+
+ // group all consecutive lines with the same y scroll to reduce overhead
+ y2 = y1+1;
+ while (y2 <= cliprect->max_y && gunnail_scrollramy[y2] == gunnail_scrollramy[y1])
+ y2++;
+
+ bgclip.min_y = y1;
+ bgclip.max_y = y2-1;
+
+ tilemap_set_scrolly(bg_tilemap, 0, yscroll);
+ for (i = y1; i < y2; i++)
+ tilemap_set_scrollx(bg_tilemap,(i + yscroll) & 0x1ff, gunnail_scrollram[0] + gunnail_scrollram[i] - videoshift);
+
+ tilemap_draw(bitmap,&bgclip,bg_tilemap,0,0);
+
+ y1 = y2;
}
- tilemap_set_scrolly(bg_tilemap,0,gunnail_scrolly);
- VIDEO_UPDATE_CALL(macross);
+ nmk16_draw_sprites(screen->machine, bitmap,cliprect,3);
+ nmk16_draw_sprites(screen->machine, bitmap,cliprect,2);
+ nmk16_draw_sprites(screen->machine, bitmap,cliprect,1);
+ nmk16_draw_sprites(screen->machine, bitmap,cliprect,0);
+
+ tilemap_set_scrollx(tx_tilemap,0,-videoshift);
+ tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
return 0;
}