diff options
| author | 2008-06-05 05:33:23 +0000 | |
|---|---|---|
| committer | 2008-06-05 05:33:23 +0000 | |
| commit | 707c11bd06fbf8c2bac781858bc54e1027d86f1f (patch) | |
| tree | 3cb7f914f13b08724d3aa3175c4fa757bdbf87f8 | |
| parent | 466bc7737cc4053dfbc8f3e2456d06795f9a09e8 (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.c | 47 | ||||
| -rw-r--r-- | src/mame/video/nmk16.c | 49 |
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; } |
