diff --git a/src/mame/drivers/backfire.c b/src/mame/drivers/backfire.c index 6b25bd3d5f9..39659dbf07c 100644 --- a/src/mame/drivers/backfire.c +++ b/src/mame/drivers/backfire.c @@ -414,7 +414,7 @@ static int backfire_bank_callback( int bank ) static const deco16ic_interface backfire_deco16ic_intf = { "lscreen", - 0, 0, 1, + 0, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0x00, 0x40, 0x10, 0x50, /* color base */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/boogwing.c b/src/mame/drivers/boogwing.c index 3fc84b506ef..1db54aa70c5 100644 --- a/src/mame/drivers/boogwing.c +++ b/src/mame/drivers/boogwing.c @@ -311,7 +311,7 @@ static int boogwing_bank_callback2( const int bank ) static const deco16ic_interface boogwing_deco16ic_intf = { "screen", - 0, 0, 1, + 0, 0, 1, 1, 0x0f, 0x1f, 0x0f, 0x0f, /* trans masks (pf2 has 5bpp graphics) */ 0, 0, 0, 16, /* color base (pf2 is non default) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/cbuster.c b/src/mame/drivers/cbuster.c index 9b527f0b00f..ab2edcb4509 100644 --- a/src/mame/drivers/cbuster.c +++ b/src/mame/drivers/cbuster.c @@ -283,7 +283,7 @@ static int twocrude_bank_callback( const int bank ) static const deco16ic_interface twocrude_deco16ic_intf = { "screen", - 0, 0, 1, + 0, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0x00, 0x20, 0x30, 0x40, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/cninja.c b/src/mame/drivers/cninja.c index 66facdf3acf..2b21b06bb8e 100644 --- a/src/mame/drivers/cninja.c +++ b/src/mame/drivers/cninja.c @@ -777,7 +777,7 @@ static int mutantf_2_bank_callback( const int bank ) static const deco16ic_interface cninja_deco16ic_intf = { "screen", - 0, 1, 1, + 0, 1, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 48, /* color base */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ @@ -790,7 +790,7 @@ static const deco16ic_interface cninja_deco16ic_intf = static const deco16ic_interface edrandy_deco16ic_intf = { "screen", - 0, 0, 1, + 0, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 48, /* color base */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ @@ -803,7 +803,7 @@ static const deco16ic_interface edrandy_deco16ic_intf = static const deco16ic_interface robocop2_deco16ic_intf = { "screen", - 0, 0, 1, + 0, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 48, /* color base */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ @@ -816,7 +816,7 @@ static const deco16ic_interface robocop2_deco16ic_intf = static const deco16ic_interface mutantf_deco16ic_intf = { "screen", - 0, 0, 1, + 0, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 0x30, 0x20, 0x40, /* color base */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/dassault.c b/src/mame/drivers/dassault.c index 424c9999986..e3700d44f88 100644 --- a/src/mame/drivers/dassault.c +++ b/src/mame/drivers/dassault.c @@ -541,7 +541,7 @@ static int dassault_bank_callback( const int bank ) static const deco16ic_interface dassault_deco16ic_intf = { "screen", - 0, 0, 1, + 0, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 16, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/dblewing.c b/src/mame/drivers/dblewing.c index 051012b5911..70be37ede18 100644 --- a/src/mame/drivers/dblewing.c +++ b/src/mame/drivers/dblewing.c @@ -543,7 +543,7 @@ static int dblewing_bank_callback( const int bank ) static const deco16ic_interface dblewing_deco16ic_intf = { "screen", - 1, 0, 1, + 1, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 16, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/deco156.c b/src/mame/drivers/deco156.c index f14910e4d2b..980f8d2b296 100644 --- a/src/mame/drivers/deco156.c +++ b/src/mame/drivers/deco156.c @@ -315,7 +315,7 @@ static int deco156_bank_callback(const int bank) static const deco16ic_interface deco156_deco16ic_intf = { "screen", - 1, 0, 1, + 1, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 16, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/deco32.c b/src/mame/drivers/deco32.c index 3f5e2603331..5a2034231c6 100644 --- a/src/mame/drivers/deco32.c +++ b/src/mame/drivers/deco32.c @@ -253,7 +253,7 @@ static int fghthist_bank_callback( int bank ) static const deco16ic_interface fghthist_deco16ic_intf = { "screen", - 0, 0, 1, + 0, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0x00, 0x10, 0x20, 0x30, /* color base */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ @@ -728,6 +728,19 @@ static WRITE32_HANDLER( deco32_buffer_spriteram2_w ) memcpy(state->spriteram16_2_buffered, state->spriteram16_2, 0x1000); } + + + +static READ32_HANDLER( deco32_pf1_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf1_rowscroll[offset] ^ 0xffff0000; } +static READ32_HANDLER( deco32_pf2_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf2_rowscroll[offset] ^ 0xffff0000; } +static READ32_HANDLER( deco32_pf3_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf3_rowscroll[offset] ^ 0xffff0000; } +static READ32_HANDLER( deco32_pf4_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf4_rowscroll[offset] ^ 0xffff0000; } +static WRITE32_HANDLER( deco32_pf1_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf1_rowscroll[offset]); } +static WRITE32_HANDLER( deco32_pf2_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf2_rowscroll[offset]); } +static WRITE32_HANDLER( deco32_pf3_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf3_rowscroll[offset]); } +static WRITE32_HANDLER( deco32_pf4_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf4_rowscroll[offset]); } + + static ADDRESS_MAP_START( captaven_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x000000, 0x0fffff) AM_ROM @@ -746,30 +759,21 @@ static ADDRESS_MAP_START( captaven_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x178000, 0x178003) AM_WRITE(deco32_pri_w) - AM_RANGE(0x180000, 0x18001f) AM_RAM_WRITE(deco32_pf12_control_w) AM_BASE_MEMBER(deco32_state, pf12_control) - AM_RANGE(0x190000, 0x191fff) AM_RAM_WRITE(deco32_pf1_data_w) AM_BASE_MEMBER(deco32_state, pf1_data) - AM_RANGE(0x192000, 0x193fff) AM_WRITE(deco32_pf1_data_w) /* Mirror address - bug in program code */ - AM_RANGE(0x194000, 0x195fff) AM_RAM_WRITE(deco32_pf2_data_w) AM_BASE_MEMBER(deco32_state, pf2_data) - AM_RANGE(0x1a0000, 0x1a1fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf1_rowscroll32) - AM_RANGE(0x1a4000, 0x1a5fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf2_rowscroll32) + AM_RANGE(0x180000, 0x18001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf12_control_dword_r, deco16ic_pf12_control_dword_w) + AM_RANGE(0x190000, 0x191fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w) + AM_RANGE(0x192000, 0x193fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w) /* Mirror address - bug in program code */ + AM_RANGE(0x194000, 0x195fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf2_data_dword_r, deco16ic_pf2_data_dword_w) + AM_RANGE(0x1a0000, 0x1a1fff) AM_READWRITE(deco32_pf1_rowscroll_r, deco32_pf1_rowscroll_w) + AM_RANGE(0x1a4000, 0x1a5fff) AM_READWRITE(deco32_pf2_rowscroll_r, deco32_pf2_rowscroll_w) - AM_RANGE(0x1c0000, 0x1c001f) AM_RAM_WRITE(deco32_pf34_control_w) AM_BASE_MEMBER(deco32_state, pf34_control) - AM_RANGE(0x1d0000, 0x1d1fff) AM_RAM_WRITE(deco32_pf3_data_w) AM_BASE_MEMBER(deco32_state, pf3_data) - AM_RANGE(0x1e0000, 0x1e1fff) AM_RAM AM_BASE_MEMBER(deco32_state, pf3_rowscroll32) + AM_RANGE(0x1c0000, 0x1c001f) AM_DEVREADWRITE("deco_custom", deco16ic_pf34_control_dword_r, deco16ic_pf34_control_dword_w) + AM_RANGE(0x1d0000, 0x1d1fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf3_data_dword_r, deco16ic_pf3_data_dword_w) + AM_RANGE(0x1d4000, 0x1d5fff) AM_DEVREADWRITE("deco_custom", deco16ic_pf4_data_dword_r, deco16ic_pf4_data_dword_w) // unused + AM_RANGE(0x1e0000, 0x1e1fff) AM_READWRITE(deco32_pf3_rowscroll_r, deco32_pf3_rowscroll_w) + AM_RANGE(0x1e4000, 0x1e5fff) AM_READWRITE(deco32_pf4_rowscroll_r, deco32_pf4_rowscroll_w) // unused ADDRESS_MAP_END - -static READ32_HANDLER( deco32_pf1_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf1_rowscroll[offset] ^ 0xffff0000; } -static READ32_HANDLER( deco32_pf2_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf2_rowscroll[offset] ^ 0xffff0000; } -static READ32_HANDLER( deco32_pf3_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf3_rowscroll[offset] ^ 0xffff0000; } -static READ32_HANDLER( deco32_pf4_rowscroll_r ) { deco32_state *state = space->machine->driver_data(); return state->pf4_rowscroll[offset] ^ 0xffff0000; } -static WRITE32_HANDLER( deco32_pf1_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf1_rowscroll[offset]); } -static WRITE32_HANDLER( deco32_pf2_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf2_rowscroll[offset]); } -static WRITE32_HANDLER( deco32_pf3_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf3_rowscroll[offset]); } -static WRITE32_HANDLER( deco32_pf4_rowscroll_w ) { deco32_state *state = space->machine->driver_data(); data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&state->pf4_rowscroll[offset]); } - - static ADDRESS_MAP_START( fghthist_map, ADDRESS_SPACE_PROGRAM, 32 ) // AM_RANGE(0x000000, 0x001fff) AM_ROM AM_WRITE(deco32_pf1_data_w) // wtf?? AM_RANGE(0x000000, 0x0fffff) AM_ROM @@ -1640,9 +1644,9 @@ static const gfx_layout spritelayout5 = }; static GFXDECODE_START( captaven ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 512, 32 ) /* Characters 8x8 */ - GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 512, 32 ) /* Tiles 16x16 */ - GFXDECODE_ENTRY( "gfx2", 0, tilelayout2, 1024, 4 ) /* Tiles 16x16 */ + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 128 ) /* Characters 8x8 */ + GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 128 ) /* Tiles 16x16 */ + GFXDECODE_ENTRY( "gfx2", 0, tilelayout2, 0, 128 ) /* Tiles 16x16 */ GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 0, 32 ) /* Sprites 16x16 */ GFXDECODE_END @@ -1760,6 +1764,29 @@ UINT16 captaven_pri_callback(UINT16 x) } } +static int captaven_bank_callback( int bank ) +{ + bank = bank >> 4; + bank = (bank & 2) >> 1; + + return bank * 0x4000; +} + +// pf4 not used (pf3 is in 8bpp mode) +static const deco16ic_interface captaven_deco16ic_intf = +{ + "screen", + 0, 0, 1, 0, // pf12only, split, fullwidth12 / fullwidth34 + 0x0f, 0x0f, 0xff, 0x00, /* trans masks (default values) */ + 0x20, 0x20, 0x10, 0x00, /* color base */ + 0x0f, 0x0f, 0x0f, 0x00, /* color masks (default values) */ + 0, + 0, + captaven_bank_callback, + NULL, +}; + + static MACHINE_CONFIG_START( captaven, deco32_state ) /* basic machine hardware */ @@ -1785,6 +1812,8 @@ static MACHINE_CONFIG_START( captaven, deco32_state ) MCFG_GFXDECODE(captaven) MCFG_PALETTE_LENGTH(2048) + MCFG_DECO16IC_ADD("deco_custom", captaven_deco16ic_intf) + MCFG_DEVICE_ADD("spritegen", decospr_, 0) decospr_device_config::set_gfx_region(device, 3); decospr_device_config::set_pri_callback(device, captaven_pri_callback); diff --git a/src/mame/drivers/dietgo.c b/src/mame/drivers/dietgo.c index e194227a827..dd327fdc6d8 100644 --- a/src/mame/drivers/dietgo.c +++ b/src/mame/drivers/dietgo.c @@ -180,7 +180,7 @@ static int dietgo_bank_callback(const int bank) static const deco16ic_interface dietgo_deco16ic_intf = { "screen", - 1, 0, 1, + 1, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 16, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/funkyjet.c b/src/mame/drivers/funkyjet.c index 861bc96967d..de3dd47abcd 100644 --- a/src/mame/drivers/funkyjet.c +++ b/src/mame/drivers/funkyjet.c @@ -289,7 +289,7 @@ static const ym2151_interface ym2151_config = static const deco16ic_interface funkyjet_deco16ic_intf = { "screen", - 1, 0, 1, + 1, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 16, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/mirage.c b/src/mame/drivers/mirage.c index 1de844f2ced..aaad1a86c49 100644 --- a/src/mame/drivers/mirage.c +++ b/src/mame/drivers/mirage.c @@ -290,7 +290,7 @@ static int mirage_bank_callback( const int bank ) static const deco16ic_interface mirage_deco16ic_intf = { "screen", - 1, 0, 1, + 1, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 16, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/pktgaldx.c b/src/mame/drivers/pktgaldx.c index 3fbfa852293..b6d86b80cd6 100644 --- a/src/mame/drivers/pktgaldx.c +++ b/src/mame/drivers/pktgaldx.c @@ -300,7 +300,7 @@ static int pktgaldx_bank_callback( const int bank ) static const deco16ic_interface pktgaldx_deco16ic_intf = { "screen", - 1, 0, 1, + 1, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 16, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/rohga.c b/src/mame/drivers/rohga.c index edc5f57668a..91159f76567 100644 --- a/src/mame/drivers/rohga.c +++ b/src/mame/drivers/rohga.c @@ -749,7 +749,7 @@ static int rohga_bank_callback( const int bank ) static const deco16ic_interface rohga_deco16ic_intf = { "screen", - 0, 0, 1, + 0, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 16, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ @@ -762,7 +762,7 @@ static const deco16ic_interface rohga_deco16ic_intf = static const deco16ic_interface nitrobal_deco16ic_intf = { "screen", - 0, 0, 0, + 0, 0, 0, 0, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 0, /* color base (pf4 is not default) */ 0x0f, 0x0f, 0, 0, /* color masks */ diff --git a/src/mame/drivers/simpl156.c b/src/mame/drivers/simpl156.c index 5940397e2cd..38b590bd77e 100644 --- a/src/mame/drivers/simpl156.c +++ b/src/mame/drivers/simpl156.c @@ -407,7 +407,7 @@ static int simpl156_bank_callback(const int bank) static const deco16ic_interface simpl156_deco16ic_intf = { "screen", - 1, 0, 1, + 1, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 16, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/supbtime.c b/src/mame/drivers/supbtime.c index e092d2ba5ca..bf438e28ec1 100644 --- a/src/mame/drivers/supbtime.c +++ b/src/mame/drivers/supbtime.c @@ -323,7 +323,7 @@ static const ym2151_interface ym2151_config = static const deco16ic_interface supbtime_deco16ic_intf = { "screen", - 1, 0, 1, + 1, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 16, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/tumblep.c b/src/mame/drivers/tumblep.c index 9e261a5cb1b..4363d620f1e 100644 --- a/src/mame/drivers/tumblep.c +++ b/src/mame/drivers/tumblep.c @@ -288,7 +288,7 @@ static const ym2151_interface ym2151_config = static const deco16ic_interface tumblep_deco16ic_intf = { "screen", - 1, 0, 1, + 1, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0, 16, 0, 16, /* color base (default values) */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/drivers/vaportra.c b/src/mame/drivers/vaportra.c index 0a1bfbfc3a8..7b47c3c2c4c 100644 --- a/src/mame/drivers/vaportra.c +++ b/src/mame/drivers/vaportra.c @@ -219,7 +219,7 @@ static int vaportra_bank_callback( const int bank ) static const deco16ic_interface vaportra_deco16ic_intf = { "screen", - 0, 0, 1, + 0, 0, 1, 1, 0x0f, 0x0f, 0x0f, 0x0f, /* trans masks (default values) */ 0x00, 0x20, 0x30, 0x40, /* color base */ 0x0f, 0x0f, 0x0f, 0x0f, /* color masks (default values) */ diff --git a/src/mame/video/deco16ic.c b/src/mame/video/deco16ic.c index 4111c6af29d..4d9544e1f3f 100644 --- a/src/mame/video/deco16ic.c +++ b/src/mame/video/deco16ic.c @@ -149,22 +149,7 @@ Rowscroll style: #include "video/deco16ic.h" #include "ui.h" -#if 0 -void deco16ic_set_vram( const device_config *device, UINT8 *ram_bank ) -{ - deco16ic_state *deco16ic = get_safe_token(device); - - deco16ic->vram = ram_bank; -} - -UINT8 *deco16icvdp_get_vram( const device_config *device ) -{ - deco16ic_state *deco16ic = get_safe_token(device); - - return deco16ic->vram; -} -#endif - +/* Note, each device should have 2 tilemaps, not 4.. games with 4 chips use 2 devices.. this should be fixed here! */ typedef struct _deco16ic_state deco16ic_state; struct _deco16ic_state @@ -199,6 +184,8 @@ struct _deco16ic_state int pf1_trans_mask, pf2_trans_mask, pf3_trans_mask, pf4_trans_mask; int pf12_last_small, pf12_last_big, pf34_last_big; + + int pf3_8bpp_mode; }; /***************************************************************************** @@ -349,11 +336,25 @@ static TILE_GET_INFO_DEVICE( get_pf3_tile_info ) } } - SET_TILE_INFO_DEVICE( - deco16ic->pf34_16x16_gfx_bank, - (tile & 0xfff) | deco16ic->pf3_bank, - (colour & deco16ic->pf3_colourmask) + deco16ic->pf3_colour_bank, - flags); + if (deco16ic->pf3_8bpp_mode) + { + // Captain America operates this chip in 8bpp mode. + // In 8bpp mode you appear to only get 1 layer, not 2, but you also + // have an extra 2 tile bits, and 2 less colour bits. + SET_TILE_INFO_DEVICE( + deco16ic->pf34_16x16_gfx_bank, + (tile & 0x3fff) | deco16ic->pf3_bank, + ((colour & deco16ic->pf3_colourmask) + deco16ic->pf3_colour_bank)>>2, + flags); + } + else + { + SET_TILE_INFO_DEVICE( + deco16ic->pf34_16x16_gfx_bank, + (tile & 0xfff) | deco16ic->pf3_bank, + ((colour & deco16ic->pf3_colourmask) + deco16ic->pf3_colour_bank), + flags); + } } static TILE_GET_INFO_DEVICE( get_pf2_tile_info ) @@ -481,6 +482,7 @@ static TILE_GET_INFO_DEVICE( get_pf1_tile_info_b ) static void custom_tilemap_draw( device_t *device, bitmap_t *bitmap, + const rectangle *cliprect, tilemap_t *tilemap0_8x8, tilemap_t *tilemap0_16x16, tilemap_t *tilemap1_8x8, @@ -513,11 +515,15 @@ static void custom_tilemap_draw( if (!BIT(control0, 7)) return; + int starty = cliprect->min_y; + int endy = cliprect->max_y+1; + width_mask = src_bitmap0->width - 1; height_mask = src_bitmap0->height - 1; - src_y = scrolly + 8; + src_y = scrolly + starty; + - for (y = 8; y < 248; y++) + for (y = starty; y < endy; y++) { if (rowscroll_ptr && BIT(control1, 6)) src_x = scrollx + rowscroll_ptr[src_y / row_type]; @@ -587,6 +593,13 @@ static void custom_tilemap_draw( /******************************************************************************/ +/* captain america seems to have a similar 8bpp feature to robocop2, investigate merging */ +void deco16ic_set_pf3_8bpp_mode(device_t *device, int mode) +{ + deco16ic_state *deco16ic = get_safe_token(device); + deco16ic->pf3_8bpp_mode = mode; +} + /* robocop 2 can switch between 2 tilemaps at 4bpp, or 1 at 8bpp */ void deco16ic_set_tilemap_colour_mask( device_t *device, int tmap, int mask ) { @@ -716,12 +729,14 @@ WRITE16_DEVICE_HANDLER( deco16ic_pf12_control_w ) { deco16ic_state *deco16ic = get_safe_token(device); COMBINE_DATA(&deco16ic->pf12_control[offset]); + device->machine->primary_screen->update_partial(device->machine->primary_screen->vpos()); } WRITE16_DEVICE_HANDLER( deco16ic_pf34_control_w ) { deco16ic_state *deco16ic = get_safe_token(device); COMBINE_DATA(&deco16ic->pf34_control[offset]); + device->machine->primary_screen->update_partial(device->machine->primary_screen->vpos()); } READ16_DEVICE_HANDLER( deco16ic_pf12_control_r ) @@ -799,18 +814,6 @@ WRITE32_DEVICE_HANDLER( deco16ic_pf4_data_dword_w ) } - -#if 0 -void deco_allocate_sprite_bitmap(running_machine *machine) -{ - /* Allow sprite bitmap to be used by Deco32 games as well */ - int width = machine->primary_screen->width(); - int height = machine->primary_screen->height(); - sprite_priority_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16 ); -} - -#endif - /*****************************************************************************************/ static int deco16_pf_update( @@ -1168,7 +1171,7 @@ void deco16ic_tilemap_1_draw( device_t *device, bitmap_t *bitmap, const rectangl if (deco16ic->use_custom_pf1) { - custom_tilemap_draw(device, bitmap, deco16ic->pf1_tilemap_8x8, deco16ic->pf1_tilemap_16x16, 0, 0, deco16ic->pf1_rowscroll_ptr, deco16ic->pf12_control[1], deco16ic->pf12_control[2], deco16ic->pf12_control[5] & 0xff, deco16ic->pf12_control[6] & 0xff, 0, 0, deco16ic->pf1_trans_mask, flags, priority); + custom_tilemap_draw(device, bitmap, cliprect, deco16ic->pf1_tilemap_8x8, deco16ic->pf1_tilemap_16x16, 0, 0, deco16ic->pf1_rowscroll_ptr, deco16ic->pf12_control[1], deco16ic->pf12_control[2], deco16ic->pf12_control[5] & 0xff, deco16ic->pf12_control[6] & 0xff, 0, 0, deco16ic->pf1_trans_mask, flags, priority); } else { @@ -1185,7 +1188,7 @@ void deco16ic_tilemap_2_draw(device_t *device, bitmap_t *bitmap, const rectangle if (deco16ic->use_custom_pf2) { - custom_tilemap_draw(device, bitmap, deco16ic->pf2_tilemap_8x8, deco16ic->pf2_tilemap_16x16, 0, 0, deco16ic->pf2_rowscroll_ptr, deco16ic->pf12_control[3], deco16ic->pf12_control[4], deco16ic->pf12_control[5] >> 8, deco16ic->pf12_control[6] >> 8, 0, 0, deco16ic->pf2_trans_mask, flags, priority); + custom_tilemap_draw(device, bitmap, cliprect, deco16ic->pf2_tilemap_8x8, deco16ic->pf2_tilemap_16x16, 0, 0, deco16ic->pf2_rowscroll_ptr, deco16ic->pf12_control[3], deco16ic->pf12_control[4], deco16ic->pf12_control[5] >> 8, deco16ic->pf12_control[6] >> 8, 0, 0, deco16ic->pf2_trans_mask, flags, priority); } else { @@ -1201,7 +1204,7 @@ void deco16ic_tilemap_3_draw(device_t *device, bitmap_t *bitmap, const rectangle deco16ic_state *deco16ic = get_safe_token(device); if (deco16ic->use_custom_pf3) - custom_tilemap_draw(device, bitmap, 0, deco16ic->pf3_tilemap_16x16, 0, 0, deco16ic->pf3_rowscroll_ptr, deco16ic->pf34_control[1], deco16ic->pf34_control[2], deco16ic->pf34_control[5] & 0xff, deco16ic->pf34_control[6] & 0xff, 0, 0, deco16ic->pf3_trans_mask, flags, priority); + custom_tilemap_draw(device, bitmap, cliprect, 0, deco16ic->pf3_tilemap_16x16, 0, 0, deco16ic->pf3_rowscroll_ptr, deco16ic->pf34_control[1], deco16ic->pf34_control[2], deco16ic->pf34_control[5] & 0xff, deco16ic->pf34_control[6] & 0xff, 0, 0, deco16ic->pf3_trans_mask, flags, priority); else if (deco16ic->pf3_tilemap_16x16) tilemap_draw(bitmap, cliprect, deco16ic->pf3_tilemap_16x16, flags, priority); } @@ -1211,7 +1214,7 @@ void deco16ic_tilemap_4_draw(device_t *device, bitmap_t *bitmap, const rectangle deco16ic_state *deco16ic = get_safe_token(device); if (deco16ic->use_custom_pf4) - custom_tilemap_draw(device, bitmap, 0, deco16ic->pf4_tilemap_16x16, 0, 0, deco16ic->pf4_rowscroll_ptr, deco16ic->pf34_control[3], deco16ic->pf34_control[4], deco16ic->pf34_control[5] >> 8, deco16ic->pf34_control[6] >> 8, 0, 0, deco16ic->pf4_trans_mask, flags, priority); + custom_tilemap_draw(device, bitmap, cliprect, 0, deco16ic->pf4_tilemap_16x16, 0, 0, deco16ic->pf4_rowscroll_ptr, deco16ic->pf34_control[3], deco16ic->pf34_control[4], deco16ic->pf34_control[5] >> 8, deco16ic->pf34_control[6] >> 8, 0, 0, deco16ic->pf4_trans_mask, flags, priority); else if (deco16ic->pf4_tilemap_16x16) tilemap_draw(bitmap, cliprect, deco16ic->pf4_tilemap_16x16, flags, priority); } @@ -1222,7 +1225,7 @@ void deco16ic_tilemap_4_draw(device_t *device, bitmap_t *bitmap, const rectangle void deco16ic_tilemap_34_combine_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority) { deco16ic_state *deco16ic = get_safe_token(device); - custom_tilemap_draw(device, bitmap, 0, deco16ic->pf3_tilemap_16x16, 0, deco16ic->pf4_tilemap_16x16, deco16ic->pf3_rowscroll_ptr, deco16ic->pf34_control[1], deco16ic->pf34_control[2], deco16ic->pf34_control[5] & 0xff, deco16ic->pf34_control[6] & 0xff, 0xf, 4, 0xff, flags, priority); + custom_tilemap_draw(device, bitmap, cliprect, 0, deco16ic->pf3_tilemap_16x16, 0, deco16ic->pf4_tilemap_16x16, deco16ic->pf3_rowscroll_ptr, deco16ic->pf34_control[1], deco16ic->pf34_control[2], deco16ic->pf34_control[5] & 0xff, deco16ic->pf34_control[6] & 0xff, 0xf, 4, 0xff, flags, priority); } @@ -1266,16 +1269,16 @@ static DEVICE_START( deco16ic ) deco16ic->pf1_tilemap_8x8 = tilemap_create_device(device, get_pf1_tile_info_b, tilemap_scan_rows, 8, 8, 64, 32); if (intf->split) - deco16ic->pf2_tilemap_16x16 = tilemap_create_device(device, get_pf2_tile_info, deco16_scan_rows, 16, 16, intf->full_width ? 64 : 32, 32); + deco16ic->pf2_tilemap_16x16 = tilemap_create_device(device, get_pf2_tile_info, deco16_scan_rows, 16, 16, intf->full_width12 ? 64 : 32, 32); else - deco16ic->pf2_tilemap_16x16 = tilemap_create_device(device, get_pf2_tile_info, deco16_scan_rows, 16, 16, intf->full_width ? 64 : 32, 32); + deco16ic->pf2_tilemap_16x16 = tilemap_create_device(device, get_pf2_tile_info, deco16_scan_rows, 16, 16, intf->full_width12 ? 64 : 32, 32); - deco16ic->pf2_tilemap_8x8 = tilemap_create_device(device, get_pf2_tile_info_b, tilemap_scan_rows, 8, 8, intf->full_width ? 64 : 32, 32); + deco16ic->pf2_tilemap_8x8 = tilemap_create_device(device, get_pf2_tile_info_b, tilemap_scan_rows, 8, 8, intf->full_width12 ? 64 : 32, 32); if (!intf->pf12_only) { - deco16ic->pf4_tilemap_16x16 = tilemap_create_device(device, get_pf4_tile_info, deco16_scan_rows, 16, 16, intf->full_width ? 64 : 32, 32); - deco16ic->pf3_tilemap_16x16 = tilemap_create_device(device, get_pf3_tile_info, deco16_scan_rows, 16, 16, intf->full_width ? 64 : 32, 32); + deco16ic->pf4_tilemap_16x16 = tilemap_create_device(device, get_pf4_tile_info, deco16_scan_rows, 16, 16, intf->full_width34 ? 64 : 32, 32); + deco16ic->pf3_tilemap_16x16 = tilemap_create_device(device, get_pf3_tile_info, deco16_scan_rows, 16, 16, intf->full_width34 ? 64 : 32, 32); } else { @@ -1297,6 +1300,7 @@ static DEVICE_START( deco16ic ) tilemap_set_transparent_pen(deco16ic->pf4_tilemap_16x16, 0); } + deco16ic->pf3_8bpp_mode = 0; deco16ic->dirty_palette = auto_alloc_array_clear(device->machine, UINT8, 4096); deco16ic->raster_display_list = auto_alloc_array_clear(device->machine, UINT16, 20 * 256 / 2); @@ -1324,6 +1328,7 @@ static DEVICE_START( deco16ic ) device->save_item(NAME(deco16ic->pf12_last_small)); device->save_item(NAME(deco16ic->pf12_last_big)); device->save_item(NAME(deco16ic->pf34_last_big)); + device->save_item(NAME(deco16ic->pf3_8bpp_mode)); device->save_pointer(NAME(deco16ic->dirty_palette), 4096); device->save_pointer(NAME(deco16ic->raster_display_list), 20 * 256 / 2); diff --git a/src/mame/video/deco16ic.h b/src/mame/video/deco16ic.h index 0d288468516..cc76808c613 100644 --- a/src/mame/video/deco16ic.h +++ b/src/mame/video/deco16ic.h @@ -26,7 +26,8 @@ struct _deco16ic_interface const char *screen; int pf12_only; int split; - int full_width; + int full_width12; + int full_width34; int trans_mask1, trans_mask2, trans_mask3, trans_mask4; int col_base1, col_base2, col_base3, col_base4; @@ -118,6 +119,9 @@ void deco16ic_pdrawgfx( void deco16ic_set_tilemap_colour_mask(device_t *device, int tmap, int mask); void deco16ic_pf34_set_gfxbank(device_t *device, int small, int big); +/* used by captaven */ +void deco16ic_set_pf3_8bpp_mode(device_t *device, int mode); + /* used by stoneage */ void deco16ic_set_scrolldx(device_t *device, int tmap, int size, int dx, int dx_if_flipped); diff --git a/src/mame/video/deco32.c b/src/mame/video/deco32.c index 30821d988cb..7134c296ba4 100644 --- a/src/mame/video/deco32.c +++ b/src/mame/video/deco32.c @@ -647,13 +647,6 @@ static TILE_GET_INFO( get_pf4_tile_info ) SET_TILE_INFO(2,(tile&0xfff)|state->pf4_bank,colour+state->pf4_colourbank,flags); } -/* Captain America tilemap chip 2 has different banking and colour from normal */ -static TILE_GET_INFO( get_ca_pf3_tile_info ) -{ - deco32_state *state = machine->driver_data(); - int tile=state->pf3_data[tile_index]; - SET_TILE_INFO(2,(tile&0x3fff)+state->pf3_bank,(tile >> 14)&3,0); -} static TILE_GET_INFO( get_ll_pf3_tile_info ) { @@ -690,38 +683,14 @@ static TILE_GET_INFO( get_ll_pf4_tile_info ) VIDEO_START( captaven ) { deco32_state *state = machine->driver_data(); - state->pf1_tilemap = tilemap_create(machine, get_pf1_tile_info, tilemap_scan_rows, 8, 8,64,32); - state->pf1a_tilemap =tilemap_create(machine, get_pf1a_tile_info, deco16_scan_rows,16,16,64,32); - state->pf2_tilemap = tilemap_create(machine, get_pf2_tile_info, deco16_scan_rows,16,16,64,32); - state->pf3_tilemap = tilemap_create(machine, get_ca_pf3_tile_info, tilemap_scan_rows,16,16,32,32); - - tilemap_set_transparent_pen(state->pf1_tilemap,0); - tilemap_set_transparent_pen(state->pf1a_tilemap,0); - tilemap_set_transparent_pen(state->pf2_tilemap,0); - tilemap_set_transparent_pen(state->pf3_tilemap,0); - - state->pf2_colourbank=16; - state->pf4_colourbank=0; state->has_ace_ram=0; } VIDEO_START( fghthist ) { deco32_state *state = machine->driver_data(); - //state->pf1_tilemap = tilemap_create(machine, get_pf1_tile_info, tilemap_scan_rows, 8, 8,64,32); - //state->pf2_tilemap = tilemap_create(machine, get_pf2_tile_info, deco16_scan_rows, 16,16,64,32); - //state->pf3_tilemap = tilemap_create(machine, get_pf3_tile_info, deco16_scan_rows, 16,16,64,32); - //state->pf4_tilemap = tilemap_create(machine, get_pf4_tile_info, deco16_scan_rows, 16,16,64,32); - //state->pf1a_tilemap =0; state->dirty_palette = auto_alloc_array(machine, UINT8, 4096); - machine->device("spritegen")->alloc_sprite_bitmap(machine); - - //tilemap_set_transparent_pen(state->pf1_tilemap,0); - //tilemap_set_transparent_pen(state->pf2_tilemap,0); - //tilemap_set_transparent_pen(state->pf3_tilemap,0); - - //state->pf2_colourbank=state->pf4_colourbank=0; state->has_ace_ram=0; } @@ -925,57 +894,32 @@ static void combined_tilemap_draw(running_machine* machine, bitmap_t *bitmap, co SCREEN_UPDATE( captaven ) { deco32_state *state = screen->machine->driver_data(); - int pf1_enable,pf2_enable,pf3_enable; + state->deco16ic = screen->machine->device("deco_custom"); - flip_screen_set(screen->machine, state->pf12_control[0]&0x80); tilemap_set_flip_all(screen->machine,flip_screen_get(screen->machine) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - deco32_setup_scroll(state->pf1_tilemap, 256,(state->pf12_control[5]>>0)&0xff,(state->pf12_control[6]>>0)&0xff,state->pf12_control[2],state->pf12_control[1],state->pf1_rowscroll32,state->pf1_rowscroll32+0x200); - deco32_setup_scroll(state->pf1a_tilemap,512,(state->pf12_control[5]>>0)&0xff,(state->pf12_control[6]>>0)&0xff,state->pf12_control[2],state->pf12_control[1],state->pf1_rowscroll32,state->pf1_rowscroll32+0x200); - deco32_setup_scroll(state->pf2_tilemap, 512,(state->pf12_control[5]>>8)&0xff,(state->pf12_control[6]>>8)&0xff,state->pf12_control[4],state->pf12_control[3],state->pf2_rowscroll32,state->pf2_rowscroll32+0x200); - deco32_setup_scroll(state->pf3_tilemap, 512,(state->pf34_control[5]>>0)&0xff,(state->pf34_control[6]>>0)&0xff,state->pf34_control[4],state->pf34_control[3],state->pf3_rowscroll32,state->pf3_rowscroll32+0x200); - - /* PF1 & PF2 only have enough roms for 1 bank */ - state->pf1_bank=0;//(state->pf12_control[7]>> 4)&0xf; - state->pf2_bank=0;//(state->pf12_control[7]>>12)&0xf; - state->pf3_bank=(state->pf34_control[7]>> 4)&0xf; - - if (state->pf34_control[7]&0x0020) state->pf3_bank=0x4000; else state->pf3_bank=0; - if (state->pf3_bank!=state->last_pf3_bank) tilemap_mark_all_tiles_dirty(state->pf3_tilemap); - state->last_pf3_bank=state->pf3_bank; - - pf1_enable=state->pf12_control[5]&0x0080; - pf2_enable=state->pf12_control[5]&0x8000; - pf3_enable=state->pf34_control[5]&0x0080; - - tilemap_set_enable(state->pf1_tilemap,pf1_enable); - tilemap_set_enable(state->pf1a_tilemap,pf1_enable); - tilemap_set_enable(state->pf2_tilemap,pf2_enable); - tilemap_set_enable(state->pf3_tilemap,pf3_enable); - bitmap_fill(screen->machine->priority_bitmap,cliprect,0); - if ((state->pri&1)==0) { - if (pf3_enable) - tilemap_draw(bitmap,cliprect,state->pf3_tilemap,TILEMAP_DRAW_OPAQUE,1); - else - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine)); + bitmap_fill(bitmap,cliprect,screen->machine->pens[0x000]); // Palette index not confirmed - tilemap_draw(bitmap,cliprect,state->pf2_tilemap,0,2); - } else { - if (pf2_enable) { - tilemap_draw(bitmap,cliprect,state->pf2_tilemap,0,1); - } - else - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine)); + deco16ic_set_pf3_8bpp_mode(state->deco16ic, 1); - tilemap_draw(bitmap,cliprect,state->pf3_tilemap,0,2); + deco16ic_pf12_update(state->deco16ic, state->pf1_rowscroll, state->pf2_rowscroll); + deco16ic_pf34_update(state->deco16ic, state->pf3_rowscroll, state->pf4_rowscroll); + + // pf4 not used (because pf3 is in 8bpp mode) + + if ((state->pri&1)==0) + { + deco16ic_tilemap_3_draw(state->deco16ic, bitmap, cliprect, 0, 1); + deco16ic_tilemap_2_draw(state->deco16ic, bitmap, cliprect, 0, 2); + } + else + { + deco16ic_tilemap_2_draw(state->deco16ic, bitmap, cliprect, 0, 1); + deco16ic_tilemap_3_draw(state->deco16ic, bitmap, cliprect, 0, 2); } - /* PF1 can be in 8x8 mode or 16x16 mode */ - if (state->pf12_control[6]&0x80) - tilemap_draw(bitmap,cliprect,state->pf1_tilemap,0,4); - else - tilemap_draw(bitmap,cliprect,state->pf1a_tilemap,0,4); + deco16ic_tilemap_1_draw(state->deco16ic, bitmap, cliprect, 0, 4); screen->machine->device("spritegen")->set_alt_format(true); screen->machine->device("spritegen")->draw_sprites(screen->machine, bitmap, cliprect, state->spriteram16_buffered, 0x400);