From 49eeca47b4c6122b581acb1c18fafbc8a28e7dd5 Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Wed, 30 Mar 2011 15:42:18 +0000 Subject: [PATCH] Implemented karnov style sprites in its own file, shared with karnov and dec8 drivers [David Haywood] --- .gitattributes | 2 + src/mame/drivers/dec8.c | 59 ++++++++++++------- src/mame/drivers/karnov.c | 27 ++++++++- src/mame/mame.mak | 1 + src/mame/video/dec8.c | 77 +++---------------------- src/mame/video/deckarn.c | 117 ++++++++++++++++++++++++++++++++++++++ src/mame/video/deckarn.h | 36 ++++++++++++ src/mame/video/karnov.c | 66 +-------------------- 8 files changed, 231 insertions(+), 154 deletions(-) create mode 100644 src/mame/video/deckarn.c create mode 100644 src/mame/video/deckarn.h diff --git a/.gitattributes b/.gitattributes index 0c6a27245b9..71411ead904 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3850,6 +3850,8 @@ src/mame/video/dec0.c svneol=native#text/plain src/mame/video/dec8.c svneol=native#text/plain src/mame/video/decbac06.c svneol=native#text/plain src/mame/video/decbac06.h svneol=native#text/plain +src/mame/video/deckarn.c svneol=native#text/plain +src/mame/video/deckarn.h svneol=native#text/plain src/mame/video/decmxc06.c svneol=native#text/plain src/mame/video/decmxc06.h svneol=native#text/plain src/mame/video/deco16ic.c svneol=native#text/plain diff --git a/src/mame/drivers/dec8.c b/src/mame/drivers/dec8.c index 988fd4b5c44..5d4de592f26 100644 --- a/src/mame/drivers/dec8.c +++ b/src/mame/drivers/dec8.c @@ -49,14 +49,26 @@ To do: #include "includes/dec8.h" #include "video/decbac06.h" #include "video/decmxc06.h" +#include "video/deckarn.h" /******************************************************************************/ +static WRITE8_HANDLER( dec8_mxc06_karn_buffer_spriteram_w) +{ + dec8_state *state = space->machine().driver_data(); + UINT8* spriteram = space->machine().generic.spriteram.u8; + // copy to a 16-bit region for the sprite chip + for (int i=0;i<0x800/2;i++) + { + state->buffered_spriteram16[i] = spriteram[(i*2)+1] | (spriteram[(i*2)+0] <<8); + } +} + /* Only used by ghostb, gondo, garyoret, other games can control buffering */ static SCREEN_EOF( dec8 ) { address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram_w(space, 0, 0); + dec8_mxc06_karn_buffer_spriteram_w(space, 0, 0); } static READ8_HANDLER( i8751_h_r ) @@ -488,16 +500,7 @@ static WRITE8_HANDLER( flip_screen_w ) { flip_screen_set(space->machine(), data) /******************************************************************************/ -static WRITE8_HANDLER( dec8_mxc06_buffer_spriteram_w) -{ - dec8_state *state = space->machine().driver_data(); - UINT8* spriteram = space->machine().generic.spriteram.u8; - // copy to a 16-bit region for the sprite chip - for (int i=0;i<0x800/2;i++) - { - state->buffered_spriteram16[i] = spriteram[(i*2)+1] | (spriteram[(i*2)+0] <<8); - } -} + static ADDRESS_MAP_START( cobra_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM @@ -518,7 +521,7 @@ static ADDRESS_MAP_START( cobra_map, AS_PROGRAM, 8 ) AM_RANGE(0x3a00, 0x3a07) AM_DEVWRITE("tilegen2", deco_bac06_pf_control0_8bit_w) AM_RANGE(0x3a10, 0x3a1f) AM_DEVWRITE("tilegen2", deco_bac06_pf_control1_8bit_w) AM_RANGE(0x3c00, 0x3c00) AM_WRITE(dec8_bank_w) - AM_RANGE(0x3c02, 0x3c02) AM_WRITE(dec8_mxc06_buffer_spriteram_w) /* DMA */ + AM_RANGE(0x3c02, 0x3c02) AM_WRITE(dec8_mxc06_karn_buffer_spriteram_w) /* DMA */ AM_RANGE(0x3e00, 0x3e00) AM_WRITE(dec8_sound_w) AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1") AM_RANGE(0x8000, 0xffff) AM_ROM @@ -609,7 +612,7 @@ static ADDRESS_MAP_START( oscar_map, AS_PROGRAM, 8 ) AM_RANGE(0x3c04, 0x3c04) AM_READ_PORT("DSW1") AM_RANGE(0x3c00, 0x3c07) AM_DEVWRITE("tilegen1", deco_bac06_pf_control0_8bit_w) AM_RANGE(0x3c10, 0x3c1f) AM_DEVWRITE("tilegen1", deco_bac06_pf_control1_8bit_w) - AM_RANGE(0x3c80, 0x3c80) AM_WRITE(dec8_mxc06_buffer_spriteram_w) /* DMA */ + AM_RANGE(0x3c80, 0x3c80) AM_WRITE(dec8_mxc06_karn_buffer_spriteram_w) /* DMA */ AM_RANGE(0x3d00, 0x3d00) AM_WRITE(dec8_bank_w) /* BNKS */ AM_RANGE(0x3d80, 0x3d80) AM_WRITE(dec8_sound_w) /* SOUN */ AM_RANGE(0x3e00, 0x3e00) AM_WRITENOP /* COINCL */ @@ -636,7 +639,7 @@ static ADDRESS_MAP_START( lastmisn_map, AS_PROGRAM, 8 ) AM_RANGE(0x1803, 0x1803) AM_READ_PORT("DSW0") /* Dip 1 */ AM_RANGE(0x1804, 0x1804) AM_READ_PORT("DSW1") /* Dip 2 */ AM_RANGE(0x1800, 0x1804) AM_WRITE(shackled_int_w) - AM_RANGE(0x1805, 0x1805) AM_WRITE(buffer_spriteram_w) /* DMA */ + AM_RANGE(0x1805, 0x1805) AM_WRITE(dec8_mxc06_karn_buffer_spriteram_w) /* DMA */ AM_RANGE(0x1806, 0x1806) AM_READ(i8751_h_r) AM_RANGE(0x1807, 0x1807) AM_READWRITE(i8751_l_r, flip_screen_w) AM_RANGE(0x1809, 0x1809) AM_WRITE(lastmisn_scrollx_w) /* Scroll LSB */ @@ -662,7 +665,7 @@ static ADDRESS_MAP_START( lastmisn_sub_map, AS_PROGRAM, 8 ) AM_RANGE(0x1803, 0x1803) AM_READ_PORT("DSW0") /* Dip 1 */ AM_RANGE(0x1804, 0x1804) AM_READ_PORT("DSW1") /* Dip 2 */ AM_RANGE(0x1800, 0x1804) AM_WRITE(shackled_int_w) - AM_RANGE(0x1805, 0x1805) AM_WRITE(buffer_spriteram_w) /* DMA */ + AM_RANGE(0x1805, 0x1805) AM_WRITE(dec8_mxc06_karn_buffer_spriteram_w) /* DMA */ AM_RANGE(0x1807, 0x1807) AM_WRITE(flip_screen_w) AM_RANGE(0x180c, 0x180c) AM_WRITE(dec8_sound_w) AM_RANGE(0x2000, 0x27ff) AM_RAM_WRITE(dec8_videoram_w) @@ -682,7 +685,7 @@ static ADDRESS_MAP_START( shackled_map, AS_PROGRAM, 8 ) AM_RANGE(0x1803, 0x1803) AM_READ_PORT("DSW0") AM_RANGE(0x1804, 0x1804) AM_READ_PORT("DSW1") AM_RANGE(0x1800, 0x1804) AM_WRITE(shackled_int_w) - AM_RANGE(0x1805, 0x1805) AM_WRITE(buffer_spriteram_w) /* DMA */ + AM_RANGE(0x1805, 0x1805) AM_WRITE(dec8_mxc06_karn_buffer_spriteram_w) /* DMA */ AM_RANGE(0x1807, 0x1807) AM_WRITE(flip_screen_w) AM_RANGE(0x1809, 0x1809) AM_WRITE(lastmisn_scrollx_w) /* Scroll LSB */ AM_RANGE(0x180b, 0x180b) AM_WRITE(lastmisn_scrolly_w) /* Scroll LSB */ @@ -706,7 +709,7 @@ static ADDRESS_MAP_START( shackled_sub_map, AS_PROGRAM, 8 ) AM_RANGE(0x1803, 0x1803) AM_READ_PORT("DSW0") AM_RANGE(0x1804, 0x1804) AM_READ_PORT("DSW1") AM_RANGE(0x1800, 0x1804) AM_WRITE(shackled_int_w) - AM_RANGE(0x1805, 0x1805) AM_WRITE(buffer_spriteram_w) /* DMA */ + AM_RANGE(0x1805, 0x1805) AM_WRITE(dec8_mxc06_karn_buffer_spriteram_w) /* DMA */ AM_RANGE(0x1806, 0x1806) AM_READ(i8751_h_r) AM_RANGE(0x1807, 0x1807) AM_READWRITE(i8751_l_r, flip_screen_w) AM_RANGE(0x1809, 0x1809) AM_WRITE(lastmisn_scrollx_w) /* Scroll LSB */ @@ -730,7 +733,7 @@ static ADDRESS_MAP_START( csilver_map, AS_PROGRAM, 8 ) AM_RANGE(0x1803, 0x1803) AM_READ_PORT("IN2") AM_RANGE(0x1804, 0x1804) AM_READ_PORT("DSW1") /* Dip 2 */ AM_RANGE(0x1800, 0x1804) AM_WRITE(shackled_int_w) - AM_RANGE(0x1805, 0x1805) AM_READ_PORT("DSW0") AM_WRITE(buffer_spriteram_w) /* Dip 1, DMA */ + AM_RANGE(0x1805, 0x1805) AM_READ_PORT("DSW0") AM_WRITE(dec8_mxc06_karn_buffer_spriteram_w) /* Dip 1, DMA */ AM_RANGE(0x1807, 0x1807) AM_WRITE(flip_screen_w) AM_RANGE(0x1808, 0x180b) AM_WRITE(dec8_scroll2_w) AM_RANGE(0x180c, 0x180c) AM_WRITE(dec8_sound_w) @@ -753,7 +756,7 @@ static ADDRESS_MAP_START( csilver_sub_map, AS_PROGRAM, 8 ) AM_RANGE(0x1803, 0x1803) AM_READ_PORT("IN2") AM_RANGE(0x1804, 0x1804) AM_READ_PORT("DSW1") AM_RANGE(0x1800, 0x1804) AM_WRITE(shackled_int_w) - AM_RANGE(0x1805, 0x1805) AM_READ_PORT("DSW0") AM_WRITE(buffer_spriteram_w) /* DMA */ + AM_RANGE(0x1805, 0x1805) AM_READ_PORT("DSW0") AM_WRITE(dec8_mxc06_karn_buffer_spriteram_w) /* DMA */ AM_RANGE(0x180c, 0x180c) AM_WRITE(dec8_sound_w) AM_RANGE(0x2000, 0x27ff) AM_RAM_WRITE(dec8_videoram_w) AM_BASE_SIZE_MEMBER(dec8_state, videoram, videoram_size) AM_RANGE(0x2800, 0x2fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) @@ -2064,6 +2067,9 @@ static MACHINE_CONFIG_START( ghostb, dec8_state ) MCFG_DEVICE_ADD("tilegen1", deco_bac06_, 0) deco_bac06_device_config::set_gfx_region_wide(device, 2,2,0); + MCFG_DEVICE_ADD("spritegen", deco_karnovsprites_, 0) + deco_karnovsprites_device_config::set_gfx_region(device, 1); + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) @@ -2213,6 +2219,9 @@ static MACHINE_CONFIG_START( gondo, dec8_state ) /* video hardware */ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) + MCFG_DEVICE_ADD("spritegen", deco_karnovsprites_, 0) + deco_karnovsprites_device_config::set_gfx_region(device, 1); + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) @@ -2261,6 +2270,9 @@ static MACHINE_CONFIG_START( lastmisn, dec8_state ) /* video hardware */ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) + MCFG_DEVICE_ADD("spritegen", deco_karnovsprites_, 0) + deco_karnovsprites_device_config::set_gfx_region(device, 1); + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) @@ -2308,6 +2320,9 @@ static MACHINE_CONFIG_START( shackled, dec8_state ) /* video hardware */ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) + MCFG_DEVICE_ADD("spritegen", deco_karnovsprites_, 0) + deco_karnovsprites_device_config::set_gfx_region(device, 1); + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) @@ -2356,6 +2371,9 @@ static MACHINE_CONFIG_START( csilver, dec8_state ) /* video hardware */ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) + MCFG_DEVICE_ADD("spritegen", deco_karnovsprites_, 0) + deco_karnovsprites_device_config::set_gfx_region(device, 1); + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) @@ -2404,6 +2422,9 @@ static MACHINE_CONFIG_START( garyoret, dec8_state ) /* video hardware */ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) + MCFG_DEVICE_ADD("spritegen", deco_karnovsprites_, 0) + deco_karnovsprites_device_config::set_gfx_region(device, 1); + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) diff --git a/src/mame/drivers/karnov.c b/src/mame/drivers/karnov.c index fe92935b124..7fb2233021c 100644 --- a/src/mame/drivers/karnov.c +++ b/src/mame/drivers/karnov.c @@ -23,6 +23,7 @@ There is another Karnov rom set - a bootleg version of the Japanese roms with the Data East copyright removed - not supported because the original Japanese roms work fine. + ^^ This should be added (DH, 30/03/11) One of the two color PROMs for chelnov and chelnoj is different; one is most likely a bad read, but I don't know which one. @@ -81,7 +82,7 @@ Stephh's notes (based on the games M68000 code and some tests) : #include "sound/2203intf.h" #include "sound/3526intf.h" #include "includes/karnov.h" - +#include "video/deckarn.h" /************************************* * @@ -837,6 +838,9 @@ static MACHINE_CONFIG_START( karnov, karnov_state ) MCFG_GFXDECODE(karnov) MCFG_PALETTE_LENGTH(1024) + MCFG_DEVICE_ADD("spritegen", deco_karnovsprites_, 0) + deco_karnovsprites_device_config::set_gfx_region(device, 2); + MCFG_PALETTE_INIT(karnov) MCFG_VIDEO_START(karnov) @@ -879,6 +883,9 @@ static MACHINE_CONFIG_START( wndrplnt, karnov_state ) MCFG_GFXDECODE(karnov) MCFG_PALETTE_LENGTH(1024) + MCFG_DEVICE_ADD("spritegen", deco_karnovsprites_, 0) + deco_karnovsprites_device_config::set_gfx_region(device, 2); + MCFG_PALETTE_INIT(karnov) MCFG_VIDEO_START(wndrplnt) @@ -912,6 +919,9 @@ ROM_START( karnov ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 Sound CPU */ ROM_LOAD( "dn05-5", 0x8000, 0x8000, CRC(fa1a31a8) SHA1(5007a625be03c546d2a78444d72c28761b10cdb0) ) + ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 MCU */ + ROM_LOAD( "karnov_i8751", 0x0000, 0x1000, NO_DUMP ) + ROM_REGION( 0x08000, "gfx1", 0 ) ROM_LOAD( "dn00-", 0x00000, 0x08000, CRC(0ed77c6d) SHA1(4ec86ac56c01c158a580dc13dea3e5cbdf90d0e9) ) /* Characters */ @@ -948,6 +958,9 @@ ROM_START( karnovj ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 Sound CPU */ ROM_LOAD( "kar5", 0x8000, 0x8000, CRC(7c9158f1) SHA1(dfba7b3abd6b8d6991f0207cd252ee652a6050c2) ) + ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 MCU */ + ROM_LOAD( "karnovj_i8751", 0x0000, 0x1000, NO_DUMP ) + ROM_REGION( 0x08000, "gfx1", 0 ) ROM_LOAD( "dn00-", 0x00000, 0x08000, CRC(0ed77c6d) SHA1(4ec86ac56c01c158a580dc13dea3e5cbdf90d0e9) ) /* Characters */ @@ -984,6 +997,9 @@ ROM_START( wndrplnt ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 Sound CPU */ ROM_LOAD( "ea05.bin", 0x8000, 0x8000, CRC(8dbb6231) SHA1(342faa020448ce916e820b3df18d44191983f7a6) ) + ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 MCU */ + ROM_LOAD( "wndrplnt_i8751", 0x0000, 0x1000, NO_DUMP ) + ROM_REGION( 0x08000, "gfx1", 0 ) ROM_LOAD( "ea00.bin", 0x00000, 0x08000, CRC(9f3cac4c) SHA1(af8a275ff531029dbada3c820c9f660fef383100) ) /* Characters */ @@ -1020,6 +1036,9 @@ ROM_START( chelnov ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 Sound CPU */ ROM_LOAD( "ee05-.f3", 0x8000, 0x8000, CRC(6a8936b4) SHA1(2b72cb749e6bddb67c2bd3d27b3a92511f9ef016) ) + ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 MCU */ + ROM_LOAD( "chelnov_i8751", 0x0000, 0x1000, NO_DUMP ) + ROM_REGION( 0x08000, "gfx1", 0 ) ROM_LOAD( "ee00-e.c5", 0x00000, 0x08000, CRC(e06e5c6b) SHA1(70166257da5be428cb8404d8e1063c59c7722365) ) /* Characters */ @@ -1053,6 +1072,9 @@ ROM_START( chelnovu ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 Sound CPU */ ROM_LOAD( "ee05-.f3", 0x8000, 0x8000, CRC(6a8936b4) SHA1(2b72cb749e6bddb67c2bd3d27b3a92511f9ef016) ) + ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 MCU */ + ROM_LOAD( "chelnovu_i8751", 0x0000, 0x1000, NO_DUMP ) + ROM_REGION( 0x08000, "gfx1", 0 ) ROM_LOAD( "ee00-e.c5", 0x00000, 0x08000, CRC(e06e5c6b) SHA1(70166257da5be428cb8404d8e1063c59c7722365) ) /* Characters */ @@ -1086,6 +1108,9 @@ ROM_START( chelnovj ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 Sound CPU */ ROM_LOAD( "ee05-.f3", 0x8000, 0x8000, CRC(6a8936b4) SHA1(2b72cb749e6bddb67c2bd3d27b3a92511f9ef016) ) + ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 MCU */ + ROM_LOAD( "chelnovj_i8751", 0x0000, 0x1000, NO_DUMP ) + ROM_REGION( 0x08000, "gfx1", 0 ) ROM_LOAD( "a-c5.bin", 0x00000, 0x08000, CRC(1abf2c6d) SHA1(86d625ae94cd9ea69e4e613895410640efb175b3) ) /* Characters */ diff --git a/src/mame/mame.mak b/src/mame/mame.mak index 58b427574df..f8a03571cb0 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -613,6 +613,7 @@ $(MAMEOBJ)/dataeast.a: \ $(VIDEO)/decocomn.o \ $(VIDEO)/decospr.o \ $(VIDEO)/decmxc06.o \ + $(VIDEO)/deckarn.o \ $(MAMEOBJ)/dooyong.a: \ $(DRIVERS)/dooyong.o $(VIDEO)/dooyong.o \ diff --git a/src/mame/video/dec8.c b/src/mame/video/dec8.c index 9f3dfbfb944..575dec31416 100644 --- a/src/mame/video/dec8.c +++ b/src/mame/video/dec8.c @@ -45,6 +45,7 @@ sprites. #include "includes/dec8.h" #include "video/decbac06.h" #include "video/decmxc06.h" +#include "video/deckarn.h" /*************************************************************************** @@ -220,70 +221,6 @@ WRITE8_HANDLER( gondo_scroll_w ) /******************************************************************************/ -/* 'Karnov' sprites, used by Gondomania, Last Mission, Shackled, Ghostbusters */ -static void draw_sprites1( running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) -{ - UINT8 *buffered_spriteram = machine.generic.buffered_spriteram.u8; - int offs, x, y, sprite, sprite2, colour, extra, fx, fy; - - for (offs = 0; offs < 0x800; offs += 8) - { - y = buffered_spriteram[offs + 1] + (buffered_spriteram[offs] << 8); - if ((y & 0x8000) == 0) continue; - - fx = buffered_spriteram[offs + 3]; - - if ((fx & 0x1) == 0) continue; - - extra = fx & 0x10; - fy = fx & 0x2; - fx = fx & 0x4; - - x = buffered_spriteram[offs + 5] + (buffered_spriteram[offs + 4] << 8); - colour = buffered_spriteram[offs + 6] >> 4; - if (priority == 1 && (colour & 8)) continue; - if (priority == 2 && !(colour & 8)) continue; - sprite = buffered_spriteram[offs + 7] + (buffered_spriteram[offs + 6] << 8); - sprite &= 0x0fff; - - if (extra) {y = y + 16; sprite &= 0xffe;} - - x = x & 0x01ff; - y = y & 0x01ff; - x = (x + 16) % 0x200; - y = (y + 16) % 0x200; - x = 256 - x; - y = 256 - y; - if (flip_screen_get(machine)) - { - y = 240 - y; - x = 240 - x; - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - if (extra) y = y - 16; - } - - /* Y Flip determines order of multi-sprite */ - if (extra && fy) - { - sprite2 = sprite; - sprite++; - } - else - sprite2 = sprite + 1; - - drawgfx_transpen(bitmap,cliprect,machine.gfx[1], - sprite, - colour,fx,fy,x,y,0); - - /* 1 more sprite drawn underneath */ - if (extra) - drawgfx_transpen(bitmap,cliprect,machine.gfx[1], - sprite2, - colour,fx,fy,x,y+16,0); - } -} - static void srdarwin_draw_sprites( running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) { @@ -385,7 +322,7 @@ SCREEN_UPDATE( ghostb ) { dec8_state *state = screen->machine().driver_data(); screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - draw_sprites1(screen->machine(), bitmap, cliprect, 0); + screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->buffered_spriteram16, 0x400, 0); tilemap_draw(bitmap, cliprect, state->fix_tilemap, 0, 0); return 0; } @@ -464,7 +401,7 @@ SCREEN_UPDATE( lastmisn ) tilemap_set_scrolly(state->bg_tilemap, 0, ((state->scroll2[2] << 8)+ state->scroll2[3])); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0); - draw_sprites1(screen->machine(), bitmap, cliprect, 0); + screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->buffered_spriteram16, 0x400, 0); tilemap_draw(bitmap, cliprect, state->fix_tilemap, 0, 0); return 0; } @@ -478,7 +415,7 @@ SCREEN_UPDATE( shackled ) tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER1 | 0, 0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER1 | 1, 0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER0 | 0, 0); - draw_sprites1(screen->machine(), bitmap, cliprect, 0); + screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->buffered_spriteram16, 0x400, 0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER0 | 1, 0); tilemap_draw(bitmap, cliprect, state->fix_tilemap, 0, 0); return 0; @@ -618,9 +555,9 @@ SCREEN_UPDATE( gondo ) tilemap_set_scrolly(state->bg_tilemap, 0, ((state->scroll2[2] << 8) + state->scroll2[3])); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites1(screen->machine(), bitmap, cliprect, 2); + screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->buffered_spriteram16, 0x400, 2); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER0, 0); - draw_sprites1(screen->machine(), bitmap, cliprect, 1); + screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->buffered_spriteram16, 0x400, 1); tilemap_draw(bitmap, cliprect, state->fix_tilemap, 0, 0); return 0; } @@ -632,7 +569,7 @@ SCREEN_UPDATE( garyoret ) tilemap_set_scrolly(state->bg_tilemap, 0, ((state->scroll2[2] << 8) + state->scroll2[3])); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0); - draw_sprites1(screen->machine(), bitmap, cliprect, 0); + screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->buffered_spriteram16, 0x400, 0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 1, 0); tilemap_draw(bitmap, cliprect, state->fix_tilemap, 0, 0); return 0; diff --git a/src/mame/video/deckarn.c b/src/mame/video/deckarn.c new file mode 100644 index 00000000000..38079cdf81c --- /dev/null +++ b/src/mame/video/deckarn.c @@ -0,0 +1,117 @@ +/* Data East 'Karnov style' sprites */ +/* Custom Chip ??? */ + +#include "emu.h" +#include "deckarn.h" + +deco_karnovsprites_device_config::deco_karnovsprites_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) + : device_config(mconfig, static_alloc_device_config, "karnovsprites_device", tag, owner, clock) +{ + m_gfxregion = 0; +} + +device_config *deco_karnovsprites_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) +{ + return global_alloc(deco_karnovsprites_device_config(mconfig, tag, owner, clock)); +} + +device_t *deco_karnovsprites_device_config::alloc_device(running_machine &machine) const +{ + return auto_alloc(machine, deco_karnovsprites_device(machine, *this)); +} + +void deco_karnovsprites_device_config::set_gfx_region(device_config *device, int region) +{ + deco_karnovsprites_device_config *dev = downcast(device); + dev->m_gfxregion = region; +} + + +deco_karnovsprites_device::deco_karnovsprites_device(running_machine &_machine, const deco_karnovsprites_device_config &config) + : device_t(_machine, config), + m_config(config), + m_gfxregion(m_config.m_gfxregion) +{ +} + +void deco_karnovsprites_device::device_start() +{ + +} + +void deco_karnovsprites_device::device_reset() +{ + +} + +void deco_karnovsprites_device::draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram, int size, int priority ) +{ + int offs; + + for (offs = 0; offs < size; offs += 4) + { + int x, y, sprite, sprite2, colour, fx, fy, extra; + + y = spriteram[offs]; + if (!(y & 0x8000)) + continue; + + y = y & 0x1ff; + sprite = spriteram[offs + 3]; + colour = sprite >> 12; + + if (priority == 1 && (colour & 8)) continue; + if (priority == 2 && !(colour & 8)) continue; + + sprite = sprite & 0xfff; + x = spriteram[offs + 2] & 0x1ff; + + fx = spriteram[offs + 1]; + + // the 8-bit implementation had this, why? + //if ((fx & 0x1) == 0) continue; + + extra = (fx & 0x10) ? 1 : 0; + fy = fx & 0x2; + fx = fx & 0x4; + + if (extra) + { + y = y + 16; + sprite &= 0xffe; // taken from 8-bit version + } + + /* Convert the co-ords..*/ + x = (x + 16) % 0x200; + y = (y + 16) % 0x200; + x = 256 - x; + y = 256 - y; + if (flip_screen_get(machine)) + { + y = 240 - y; + x = 240 - x; + if (fx) fx = 0; else fx = 1; + if (fy) fy = 0; else fy = 1; + if (extra) y = y - 16; + } + + /* Y Flip determines order of multi-sprite */ + if (extra && fy) + { + sprite2 = sprite; + sprite++; + } + else + sprite2 = sprite + 1; + + drawgfx_transpen(bitmap,cliprect,machine.gfx[m_gfxregion], + sprite, + colour,fx,fy,x,y,0); + + /* 1 more sprite drawn underneath */ + if (extra) + drawgfx_transpen(bitmap,cliprect,machine.gfx[m_gfxregion], + sprite2, + colour,fx,fy,x,y+16,0); + } +} diff --git a/src/mame/video/deckarn.h b/src/mame/video/deckarn.h new file mode 100644 index 00000000000..4ccc78ff6be --- /dev/null +++ b/src/mame/video/deckarn.h @@ -0,0 +1,36 @@ + + +class deco_karnovsprites_device_config : public device_config +{ + friend class deco_karnovsprites_device; + deco_karnovsprites_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); +public: + static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); + virtual device_t *alloc_device(running_machine &machine) const; + static void set_gfx_region(device_config *device, int region); + +protected: + UINT8 m_gfxregion; +}; + +class deco_karnovsprites_device : public device_t +{ + friend class deco_karnovsprites_device_config; + deco_karnovsprites_device(running_machine &_machine, const deco_karnovsprites_device_config &config); +public: + void set_gfxregion(int region) { m_gfxregion = region; }; + void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram, int size, int priority ); + +protected: + virtual void device_start(); + virtual void device_reset(); + const deco_karnovsprites_device_config &m_config; + + UINT8 m_gfxregion; +private: + +}; + +const device_type deco_karnovsprites_ = deco_karnovsprites_device_config::static_alloc_device_config; + + diff --git a/src/mame/video/karnov.c b/src/mame/video/karnov.c index 1e03df2d81f..78d3100e245 100644 --- a/src/mame/video/karnov.c +++ b/src/mame/video/karnov.c @@ -6,6 +6,7 @@ #include "emu.h" #include "includes/karnov.h" +#include "video/deckarn.h" /*************************************************************************** @@ -120,76 +121,13 @@ static void draw_background( running_machine &machine, bitmap_t *bitmap, const r copyscrollbitmap(bitmap, state->bitmap_f, 1, &scrollx, 1, &scrolly, cliprect); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) -{ - karnov_state *state = machine.driver_data(); - UINT16 *buffered_spriteram16 = machine.generic.buffered_spriteram.u16; - int offs; - - for (offs = 0; offs <0x800; offs += 4) - { - int x, y, sprite, sprite2, colour, fx, fy, extra; - - y = buffered_spriteram16[offs]; - if (!(y & 0x8000)) - continue; - - y = y & 0x1ff; - sprite = buffered_spriteram16[offs + 3]; - colour = sprite >> 12; - sprite = sprite & 0xfff; - x = buffered_spriteram16[offs + 2] & 0x1ff; - - fx = buffered_spriteram16[offs + 1]; - extra = (fx & 0x10) ? 1 : 0; - fy = fx & 0x2; - fx = fx & 0x4; - - if (extra) - y = y + 16; - - /* Convert the co-ords..*/ - x = (x + 16) % 0x200; - y = (y + 16) % 0x200; - x = 256 - x; - y = 256 - y; - if (state->flipscreen) - { - y = 240 - y; - x = 240 - x; - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - if (extra) y = y - 16; - } - - /* Y Flip determines order of multi-sprite */ - if (extra && fy) - { - sprite2 = sprite; - sprite++; - } - else - sprite2 = sprite + 1; - - drawgfx_transpen(bitmap,cliprect,machine.gfx[2], - sprite, - colour,fx,fy,x,y,0); - - /* 1 more sprite drawn underneath */ - if (extra) - drawgfx_transpen(bitmap,cliprect,machine.gfx[2], - sprite2, - colour,fx,fy,x,y+16,0); - } -} - /******************************************************************************/ SCREEN_UPDATE( karnov ) { karnov_state *state = screen->machine().driver_data(); draw_background(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); + screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0x800, 0); tilemap_draw(bitmap, cliprect, state->fix_tilemap, 0, 0); return 0; }