Hooked up the 1414M4 chip emulation for Crazy Climber 2 [Angelo Salese] (and refactored the code, now it's a fully common component)

This commit is contained in:
Angelo Salese 2011-04-22 21:01:30 +00:00
parent c39297ce17
commit 2b40cd4e34
3 changed files with 88 additions and 260 deletions

View File

@ -36,7 +36,7 @@ TODO:
Notes: Notes:
- the initial level color fade in effect in Armed F is confirmed on real HW, i.e. goes from - the initial level color fade in effect in Armed F is confirmed on real HW, i.e. goes from
red to blue; red to blue;
- Crazy Climber 2 does use the 1414M4 chip, but the data used gets overwritten by the m68k code.
@ -192,46 +192,6 @@ Stephh's notes (based on the games M68000 code and some tests) :
---- ---- ---- ---x coin counter 0 ---- ---- ---- ---x coin counter 0
*/ */
static WRITE16_HANDLER( io_w )
{
armedf_state *state = space->machine().driver_data<armedf_state>();
if(data & 0x4000 && ((state->m_vreg & 0x4000) == 0)) //0 -> 1 transition
printf("%04x\n",(state->m_text_videoram[0] << 8) | (state->m_text_videoram[1] & 0xff));
COMBINE_DATA(&state->m_vreg);
coin_counter_w(space->machine(), 0, (data & 1) >> 0);
coin_counter_w(space->machine(), 1, (data & 2) >> 1);
flip_screen_set(space->machine(), state->m_vreg & 0x1000);
}
static WRITE16_HANDLER( cclimbr2_io_w )
{
armedf_state *state = space->machine().driver_data<armedf_state>();
if(data & 0x4000 && ((state->m_vreg & 0x4000) == 0)) //0 -> 1 transition
{
/* latch fg scroll values */
state->m_fg_scrollx = (state->m_text_videoram[0x0d] & 0xff) | ((state->m_text_videoram[0x0e] & 0x3) << 8);
state->m_fg_scrolly = (state->m_text_videoram[0x0b] & 0xff) | ((state->m_text_videoram[0x0c] & 0x3) << 8);
/* process the command */
//terrafu_mcu_exec(space,(state->m_text_videoram[0] << 8) | (state->m_text_videoram[1] & 0xff));
/* mark tiles dirty */
tilemap_mark_all_tiles_dirty(state->m_tx_tilemap);
}
COMBINE_DATA(&state->m_vreg);
coin_counter_w(space->machine(), 0, (data & 1) >> 0);
coin_counter_w(space->machine(), 1, (data & 2) >> 1);
flip_screen_set(space->machine(), state->m_vreg & 0x1000);
}
static WRITE16_HANDLER( terraf_io_w ) static WRITE16_HANDLER( terraf_io_w )
{ {
armedf_state *state = space->machine().driver_data<armedf_state>(); armedf_state *state = space->machine().driver_data<armedf_state>();
@ -243,7 +203,7 @@ static WRITE16_HANDLER( terraf_io_w )
state->m_fg_scrolly = (state->m_text_videoram[0x0b] & 0xff) | ((state->m_text_videoram[0x0c] & 0x3) << 8); state->m_fg_scrolly = (state->m_text_videoram[0x0b] & 0xff) | ((state->m_text_videoram[0x0c] & 0x3) << 8);
/* process the command */ /* process the command */
terrafu_mcu_exec(space,(state->m_text_videoram[0] << 8) | (state->m_text_videoram[1] & 0xff)); nb_1414m4_exec(space,(state->m_text_videoram[0] << 8) | (state->m_text_videoram[1] & 0xff));
/* mark tiles dirty */ /* mark tiles dirty */
tilemap_mark_all_tiles_dirty(state->m_tx_tilemap); tilemap_mark_all_tiles_dirty(state->m_tx_tilemap);
@ -272,31 +232,6 @@ static WRITE16_HANDLER( terrafb_io_w )
flip_screen_set(space->machine(), state->m_vreg & 0x1000); flip_screen_set(space->machine(), state->m_vreg & 0x1000);
} }
static WRITE16_HANDLER( kozure_io_w )
{
armedf_state *state = space->machine().driver_data<armedf_state>();
if(data & 0x4000 && ((state->m_vreg & 0x4000) == 0)) //0 -> 1 transition
{
/* latch fg scroll values */
state->m_fg_scrollx = (state->m_text_videoram[0x0d] & 0xff) | ((state->m_text_videoram[0x0e] & 0x3) << 8);
state->m_fg_scrolly = (state->m_text_videoram[0x0b] & 0xff) | ((state->m_text_videoram[0x0c] & 0x3) << 8);
/* process the command */
kozure_mcu_exec(space,(state->m_text_videoram[0] << 8) | (state->m_text_videoram[1] & 0xff));
/* mark tiles dirty */
tilemap_mark_all_tiles_dirty(state->m_tx_tilemap);
}
COMBINE_DATA(&state->m_vreg);
coin_counter_w(space->machine(), 0, (data & 1) >> 0);
coin_counter_w(space->machine(), 1, (data & 2) >> 1);
flip_screen_set(space->machine(), state->m_vreg & 0x1000);
}
static WRITE16_HANDLER( bootleg_io_w ) static WRITE16_HANDLER( bootleg_io_w )
{ {
armedf_state *state = space->machine().driver_data<armedf_state>(); armedf_state *state = space->machine().driver_data<armedf_state>();
@ -312,30 +247,6 @@ static WRITE16_HANDLER( bootleg_io_w )
flip_screen_set(space->machine(), state->m_vreg & 0x1000); flip_screen_set(space->machine(), state->m_vreg & 0x1000);
} }
static WRITE16_HANDLER( legion_io_w )
{
armedf_state *state = space->machine().driver_data<armedf_state>();
if(data & 0x4000 && ((state->m_vreg & 0x4000) == 0)) //0 -> 1 transition
{
/* latch fg scroll values */
state->m_fg_scrollx = (state->m_text_videoram[0x0d] & 0xff) | ((state->m_text_videoram[0x0e] & 0x3) << 8);
state->m_fg_scrolly = (state->m_text_videoram[0x0b] & 0xff) | ((state->m_text_videoram[0x0c] & 0x3) << 8);
legion_mcu_exec(space,(state->m_text_videoram[0] << 8) | (state->m_text_videoram[1] & 0xff));
/* mark tiles dirty */
tilemap_mark_all_tiles_dirty(state->m_tx_tilemap);
}
COMBINE_DATA(&state->m_vreg);
coin_counter_w(space->machine(), 0, (data & 1) >> 0);
coin_counter_w(space->machine(), 1, (data & 2) >> 1);
flip_screen_set(space->machine(), state->m_vreg & 0x1000);
}
static WRITE16_HANDLER( sound_command_w ) static WRITE16_HANDLER( sound_command_w )
{ {
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
@ -489,7 +400,7 @@ static ADDRESS_MAP_START( armedf_map, AS_PROGRAM, 16 )
AM_RANGE(0x06c004, 0x06c005) AM_READ_PORT("DSW1") AM_RANGE(0x06c004, 0x06c005) AM_READ_PORT("DSW1")
AM_RANGE(0x06c006, 0x06c007) AM_READ_PORT("DSW2") AM_RANGE(0x06c006, 0x06c007) AM_READ_PORT("DSW2")
AM_RANGE(0x06c000, 0x06c7ff) AM_RAM AM_RANGE(0x06c000, 0x06c7ff) AM_RAM
AM_RANGE(0x06d000, 0x06d001) AM_WRITE(io_w) AM_RANGE(0x06d000, 0x06d001) AM_WRITE(terraf_io_w)
AM_RANGE(0x06d002, 0x06d003) AM_WRITE(armedf_bg_scrollx_w) AM_RANGE(0x06d002, 0x06d003) AM_WRITE(armedf_bg_scrollx_w)
AM_RANGE(0x06d004, 0x06d005) AM_WRITE(armedf_bg_scrolly_w) AM_RANGE(0x06d004, 0x06d005) AM_WRITE(armedf_bg_scrolly_w)
AM_RANGE(0x06d006, 0x06d007) AM_WRITE(armedf_fg_scrollx_w) AM_RANGE(0x06d006, 0x06d007) AM_WRITE(armedf_fg_scrollx_w)
@ -1259,7 +1170,7 @@ ROM_START( legion )
ROM_LOAD( "legion.1k", 0x000000, 0x010000, CRC(ff5a0db9) SHA1(9308deb363d3b7686cc69485ec14201dd68f9a97) ) // lg12 ROM_LOAD( "legion.1k", 0x000000, 0x010000, CRC(ff5a0db9) SHA1(9308deb363d3b7686cc69485ec14201dd68f9a97) ) // lg12
ROM_LOAD( "legion.1j", 0x010000, 0x010000, CRC(bae220c8) SHA1(392ae0fb0351dcad7b0e8e0ed4a1dc6e07f493df) ) // lg11 ROM_LOAD( "legion.1j", 0x010000, 0x010000, CRC(bae220c8) SHA1(392ae0fb0351dcad7b0e8e0ed4a1dc6e07f493df) ) // lg11
ROM_REGION( 0x4000, "gfx5", 0 ) /* data for mcu/blitter */ ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter */
ROM_LOAD ( "lg7.bin", 0x0000, 0x4000, CRC(533e2b58) SHA1(a13ea4a530038760ffa87713903c59a932452717) ) ROM_LOAD ( "lg7.bin", 0x0000, 0x4000, CRC(533e2b58) SHA1(a13ea4a530038760ffa87713903c59a932452717) )
ROM_END ROM_END
@ -1287,7 +1198,6 @@ ROM_START( legiono )
ROM_REGION( 0x20000, "gfx4", 0 ) ROM_REGION( 0x20000, "gfx4", 0 )
ROM_LOAD( "legion.1k", 0x000000, 0x010000, CRC(ff5a0db9) SHA1(9308deb363d3b7686cc69485ec14201dd68f9a97) ) ROM_LOAD( "legion.1k", 0x000000, 0x010000, CRC(ff5a0db9) SHA1(9308deb363d3b7686cc69485ec14201dd68f9a97) )
ROM_LOAD( "legion.1j", 0x010000, 0x010000, CRC(bae220c8) SHA1(392ae0fb0351dcad7b0e8e0ed4a1dc6e07f493df) ) ROM_LOAD( "legion.1j", 0x010000, 0x010000, CRC(bae220c8) SHA1(392ae0fb0351dcad7b0e8e0ed4a1dc6e07f493df) )
ROM_END ROM_END
ROM_START( terraf ) ROM_START( terraf )
@ -1317,7 +1227,7 @@ ROM_START( terraf )
ROM_LOAD( "tf-003.7d", 0x00000, 0x10000, CRC(d74085a1) SHA1(3f6ba85dbd6e48a502c115b2d322a586fc4f56c9) ) /* sprites */ ROM_LOAD( "tf-003.7d", 0x00000, 0x10000, CRC(d74085a1) SHA1(3f6ba85dbd6e48a502c115b2d322a586fc4f56c9) ) /* sprites */
ROM_LOAD( "tf-002.9d", 0x10000, 0x10000, CRC(148aa0c5) SHA1(8d8a565540e91b384a9c154522501921b7da4d4e) ) ROM_LOAD( "tf-002.9d", 0x10000, 0x10000, CRC(148aa0c5) SHA1(8d8a565540e91b384a9c154522501921b7da4d4e) )
ROM_REGION( 0x4000, "gfx5", 0 ) /* data for mcu/blitter */ ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter, shouldn't be loaded? */
ROM_LOAD( "tf-10.11c", 0x0000, 0x4000, CRC(ac705812) SHA1(65be46ee959d8478cb6dffb25e61f7742276997b) ) ROM_LOAD( "tf-10.11c", 0x0000, 0x4000, CRC(ac705812) SHA1(65be46ee959d8478cb6dffb25e61f7742276997b) )
ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */ ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */
@ -1417,7 +1327,7 @@ ROM_START( terrafu )
ROM_LOAD( "tf-003.7d", 0x00000, 0x10000, CRC(d74085a1) SHA1(3f6ba85dbd6e48a502c115b2d322a586fc4f56c9) ) /* sprites */ ROM_LOAD( "tf-003.7d", 0x00000, 0x10000, CRC(d74085a1) SHA1(3f6ba85dbd6e48a502c115b2d322a586fc4f56c9) ) /* sprites */
ROM_LOAD( "tf-002.9d", 0x10000, 0x10000, CRC(148aa0c5) SHA1(8d8a565540e91b384a9c154522501921b7da4d4e) ) ROM_LOAD( "tf-002.9d", 0x10000, 0x10000, CRC(148aa0c5) SHA1(8d8a565540e91b384a9c154522501921b7da4d4e) )
ROM_REGION( 0x4000, "gfx5", 0 ) /* data for mcu/blitter */ ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter */
ROM_LOAD( "tf-10.11c", 0x0000, 0x4000, CRC(ac705812) SHA1(65be46ee959d8478cb6dffb25e61f7742276997b) ) ROM_LOAD( "tf-10.11c", 0x0000, 0x4000, CRC(ac705812) SHA1(65be46ee959d8478cb6dffb25e61f7742276997b) )
ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */ ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */
@ -1451,7 +1361,7 @@ ROM_START( terrafa )
ROM_LOAD( "12.7d", 0x00000, 0x10000, CRC(2d1f2ceb) SHA1(77544e1c4bda06feac135a96bb76af7c79278dc0) ) /* sprites */ ROM_LOAD( "12.7d", 0x00000, 0x10000, CRC(2d1f2ceb) SHA1(77544e1c4bda06feac135a96bb76af7c79278dc0) ) /* sprites */
ROM_LOAD( "13.9d", 0x10000, 0x10000, CRC(1d2f92d6) SHA1(e842c6bf95a5958a6ca2c85e68b9bc3cc15211a4) ) ROM_LOAD( "13.9d", 0x10000, 0x10000, CRC(1d2f92d6) SHA1(e842c6bf95a5958a6ca2c85e68b9bc3cc15211a4) )
ROM_REGION( 0x4000, "gfx5", 0 ) /* data for mcu/blitter */ ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter */
ROM_LOAD( "tf-10.11c", 0x0000, 0x4000, CRC(ac705812) SHA1(65be46ee959d8478cb6dffb25e61f7742276997b) ) ROM_LOAD( "tf-10.11c", 0x0000, 0x4000, CRC(ac705812) SHA1(65be46ee959d8478cb6dffb25e61f7742276997b) )
ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */ ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */
@ -1484,7 +1394,7 @@ ROM_START( kozure )
ROM_LOAD( "kozure12.8d", 0x00000, 0x20000, CRC(15f4021d) SHA1(b2ba6fda1a7bdaae97de4b0157b9b656b4385e08) ) /* sprites */ ROM_LOAD( "kozure12.8d", 0x00000, 0x20000, CRC(15f4021d) SHA1(b2ba6fda1a7bdaae97de4b0157b9b656b4385e08) ) /* sprites */
ROM_LOAD( "kozure13.9d", 0x20000, 0x20000, CRC(b3b6c753) SHA1(9ad061cac9558320b5cfd1ac1ac8d7f1788270cc) ) ROM_LOAD( "kozure13.9d", 0x20000, 0x20000, CRC(b3b6c753) SHA1(9ad061cac9558320b5cfd1ac1ac8d7f1788270cc) )
ROM_REGION( 0x4000, "gfx5", 0 ) /* data for mcu/blitter */ ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter */
ROM_LOAD( "kozure10.11c", 0x0000, 0x4000, CRC(f48be21d) SHA1(5d6db049f30cab98f672814a86a06609c1fa8fb4) ) ROM_LOAD( "kozure10.11c", 0x0000, 0x4000, CRC(f48be21d) SHA1(5d6db049f30cab98f672814a86a06609c1fa8fb4) )
ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */ ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */
@ -1521,7 +1431,7 @@ ROM_START( cclimbr2 )
ROM_LOAD( "13.bin", 0x20000, 0x10000, CRC(6b6ec999) SHA1(7749ce435f497732bd1b6958974cd95e960fc9fe) ) ROM_LOAD( "13.bin", 0x20000, 0x10000, CRC(6b6ec999) SHA1(7749ce435f497732bd1b6958974cd95e960fc9fe) )
ROM_LOAD( "14.bin", 0x30000, 0x10000, CRC(f426a4ad) SHA1(facccb21ca73c560d3a38e05e677782516d5b0c0) ) ROM_LOAD( "14.bin", 0x30000, 0x10000, CRC(f426a4ad) SHA1(facccb21ca73c560d3a38e05e677782516d5b0c0) )
ROM_REGION( 0x4000, "gfx5", 0 ) /* data for mcu/blitter */ ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter */
ROM_LOAD( "9.bin", 0x0000, 0x4000, CRC(740d260f) SHA1(5b4487930c7a1fb0a796aec2243bec631b1b5104) ) ROM_LOAD( "9.bin", 0x0000, 0x4000, CRC(740d260f) SHA1(5b4487930c7a1fb0a796aec2243bec631b1b5104) )
ROM_END ROM_END
@ -1555,7 +1465,7 @@ ROM_START( cclimbr2a )
ROM_LOAD( "13.bin", 0x20000, 0x10000, CRC(6b6ec999) SHA1(7749ce435f497732bd1b6958974cd95e960fc9fe) ) ROM_LOAD( "13.bin", 0x20000, 0x10000, CRC(6b6ec999) SHA1(7749ce435f497732bd1b6958974cd95e960fc9fe) )
ROM_LOAD( "14.bin", 0x30000, 0x10000, CRC(f426a4ad) SHA1(facccb21ca73c560d3a38e05e677782516d5b0c0) ) ROM_LOAD( "14.bin", 0x30000, 0x10000, CRC(f426a4ad) SHA1(facccb21ca73c560d3a38e05e677782516d5b0c0) )
ROM_REGION( 0x4000, "gfx5", 0 ) /* data for mcu/blitter */ ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter */
ROM_LOAD( "9.bin", 0x0000, 0x4000, CRC(740d260f) SHA1(5b4487930c7a1fb0a796aec2243bec631b1b5104) ) ROM_LOAD( "9.bin", 0x0000, 0x4000, CRC(740d260f) SHA1(5b4487930c7a1fb0a796aec2243bec631b1b5104) )
ROM_END ROM_END
@ -1667,7 +1577,7 @@ static DRIVER_INIT( kozure )
armedf_state *state = machine.driver_data<armedf_state>(); armedf_state *state = machine.driver_data<armedf_state>();
state->m_scroll_type = 0; state->m_scroll_type = 0;
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x07c000, 0x07c001, FUNC(kozure_io_w) ); machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x07c000, 0x07c001, FUNC(terraf_io_w) );
} }
@ -1683,7 +1593,7 @@ static DRIVER_INIT( legion )
RAM[0x000488 / 2] = 0x4e71; RAM[0x000488 / 2] = 0x4e71;
#endif #endif
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x07c000, 0x07c001, FUNC(legion_io_w) ); machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x07c000, 0x07c001, FUNC(terraf_io_w) );
state->m_scroll_type = 2; state->m_scroll_type = 2;
} }
@ -1708,7 +1618,7 @@ static DRIVER_INIT( cclimbr2 )
{ {
armedf_state *state = machine.driver_data<armedf_state>(); armedf_state *state = machine.driver_data<armedf_state>();
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x07c000, 0x07c001, FUNC(cclimbr2_io_w) ); machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x07c000, 0x07c001, FUNC(terraf_io_w) );
state->m_scroll_type = 3; state->m_scroll_type = 3;
} }

View File

@ -48,6 +48,4 @@ WRITE16_HANDLER( armedf_fg_scrolly_w );
WRITE16_HANDLER( armedf_bg_scrollx_w ); WRITE16_HANDLER( armedf_bg_scrollx_w );
WRITE16_HANDLER( armedf_bg_scrolly_w ); WRITE16_HANDLER( armedf_bg_scrolly_w );
void terrafu_mcu_exec(address_space *space,UINT16 mcu_cmd); void nb_1414m4_exec(address_space *space,UINT16 mcu_cmd);
void kozure_mcu_exec(address_space *space,UINT16 mcu_cmd);
void legion_mcu_exec(address_space *space,UINT16 mcu_cmd);

View File

@ -11,6 +11,8 @@ TODO:
- merge implementations - merge implementations
- where is the condition that makes "insert coin" text to properly blink? - where is the condition that makes "insert coin" text to properly blink?
- first byte meaning is completely unknown; - first byte meaning is completely unknown;
- Kozure Ookami "credit X" message during attract mode completely clears the status bar, dunno how it's supposed to
be displayed;
Notes: Notes:
- Just before any string in the "MCU" rom, there's a control byte, this meaning is as follows: - Just before any string in the "MCU" rom, there's a control byte, this meaning is as follows:
@ -27,10 +29,10 @@ Notes:
#include "emu.h" #include "emu.h"
#include "includes/armedf.h" #include "includes/armedf.h"
static void terrafu_sm_transfer(address_space *space,UINT16 src,UINT16 dst,UINT16 size, UINT8 condition) static void nichibutsu_1414m4_dma(address_space *space,UINT16 src,UINT16 dst,UINT16 size, UINT8 condition)
{ {
armedf_state *state = space->machine().driver_data<armedf_state>(); armedf_state *state = space->machine().driver_data<armedf_state>();
UINT8 * data = (UINT8 *)space->machine().region("gfx5")->base(); UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
int i; int i;
for(i=0;i<size;i++) for(i=0;i<size;i++)
@ -38,12 +40,12 @@ static void terrafu_sm_transfer(address_space *space,UINT16 src,UINT16 dst,UINT1
if(i+dst+0x000 < 18) if(i+dst+0x000 < 18)
continue; continue;
state->m_text_videoram[i+dst+0x000] = (condition) ? (data[i+(0)+src] & 0xff) : 0x20; state->m_text_videoram[i+dst+0x000] = (condition) ? (data[i+(0)+src] & 0xff) : 0x00;
state->m_text_videoram[i+dst+0x400] = data[i+(size)+src] & 0xff; state->m_text_videoram[i+dst+0x400] = data[i+(size)+src] & 0xff;
} }
} }
static void legion_layer_clear(address_space *space,UINT16 dst,UINT8 tile,UINT8 pal) static void nichibutsu_1414m4_fill(address_space *space,UINT16 dst,UINT8 tile,UINT8 pal)
{ {
armedf_state *state = space->machine().driver_data<armedf_state>(); armedf_state *state = space->machine().driver_data<armedf_state>();
int i; int i;
@ -61,8 +63,7 @@ static void legion_layer_clear(address_space *space,UINT16 dst,UINT8 tile,UINT8
static void insert_coin_msg(address_space *space) static void insert_coin_msg(address_space *space)
{ {
armedf_state *state = space->machine().driver_data<armedf_state>(); armedf_state *state = space->machine().driver_data<armedf_state>();
UINT8 * data = (UINT8 *)space->machine().region("gfx5")->base(); UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
int i;
int credit_count = (state->m_text_videoram[0xf] & 0xff); int credit_count = (state->m_text_videoram[0xf] & 0xff);
UINT8 fl_cond = space->machine().primary_screen->frame_number() & 0x10; /* for insert coin "flickering" */ UINT8 fl_cond = space->machine().primary_screen->frame_number() & 0x10; /* for insert coin "flickering" */
UINT16 dst; UINT16 dst;
@ -71,59 +72,41 @@ static void insert_coin_msg(address_space *space)
{ {
dst = (data[0x01]<<8|data[0x02]) & 0x7fff; dst = (data[0x01]<<8|data[0x02]) & 0x7fff;
for(i=0;i<0x10;i++) /* INSERT COIN */ nichibutsu_1414m4_dma(space,0x0003,dst,0x10,fl_cond);
{
state->m_text_videoram[i+dst+0x0000] = (fl_cond) ? 0x20 : data[i+0x00+0x0003] & 0xff;
state->m_text_videoram[i+dst+0x0400] = data[i+0x10+0x0003] & 0xff;
}
} }
else else
{ {
dst = (data[0x49]<<8|data[0x4a]) & 0x7fff; dst = (data[0x49]<<8|data[0x4a]) & 0x7fff;
for(i=0;i<0x18;i++) /* PUSH START BUTTON */ nichibutsu_1414m4_dma(space,0x004b,dst,0x18,1);
{
state->m_text_videoram[i+dst+0x0000] = data[i+0x00+0x004b] & 0xff;
state->m_text_videoram[i+dst+0x0400] = data[i+0x18+0x004b] & 0xff;
}
} }
} }
static void credit_msg(address_space *space) static void credit_msg(address_space *space)
{ {
armedf_state *state = space->machine().driver_data<armedf_state>(); armedf_state *state = space->machine().driver_data<armedf_state>();
UINT8 * data = (UINT8 *)space->machine().region("gfx5")->base(); UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
int i;
int credit_count = (state->m_text_videoram[0xf] & 0xff); int credit_count = (state->m_text_videoram[0xf] & 0xff);
UINT8 fl_cond = space->machine().primary_screen->frame_number() & 0x10; /* for insert coin "flickering" */ UINT8 fl_cond = space->machine().primary_screen->frame_number() & 0x10; /* for insert coin "flickering" */
UINT8 tile_base, pal_base; UINT16 dst;
tile_base = data[0x47]; dst = ((data[0x023]<<8)|(data[0x024]&0xff)) & 0x3fff;
pal_base = data[0x48]; nichibutsu_1414m4_dma(space,0x0025,dst,0x10,1); /* credit */
for(i=0;i<0x10;i++) dst = ((data[0x045]<<8)|(data[0x046]&0xff)) & 0x3fff;
dst++; // data is 0x5e, needs to be 0x5f ...
state->m_text_videoram[dst+0x000] = (credit_count + data[0x47]); /* credit num */
state->m_text_videoram[dst+0x400] = (data[0x48]);
if(credit_count == 1) /* ONE PLAYER ONLY */
{ {
state->m_text_videoram[i+0x050+0x0000] = data[i+0x00+0x0025] & 0xff; dst = ((data[0x07b]<<8)|(data[0x07c]&0xff)) & 0x3fff;
state->m_text_videoram[i+0x050+0x0400] = data[i+0x10+0x0025] & 0xff; nichibutsu_1414m4_dma(space,0x007d,dst,0x18,fl_cond);
} }
state->m_text_videoram[0x05f+0x000] = (credit_count + tile_base); else if(credit_count > 1) /* ONE OR TWO PLAYERS */
state->m_text_videoram[0x05f+0x400] = (pal_base);
if(credit_count == 1)
{ {
for(i=0;i<0x18;i++) /* ONE PLAYER ONLY */ dst = ((data[0x0ad]<<8)|(data[0x0ae]&0xff)) & 0x3fff;
{ nichibutsu_1414m4_dma(space,0x00af,dst,0x18,fl_cond);
state->m_text_videoram[i+0x168+0x0000] = (fl_cond) ? 0x20 : data[i+0x00+0x007d] & 0xff;
state->m_text_videoram[i+0x168+0x0400] = data[i+0x18+0x007d] & 0xff;
}
}
else if(credit_count > 1)
{
for(i=0;i<0x18;i++) /* ONE OR TWO PLAYERS */
{
state->m_text_videoram[i+0x168+0x0000] = (fl_cond) ? 0x20 : data[i+0x00+0x00af] & 0xff;
state->m_text_videoram[i+0x168+0x0400] = data[i+0x18+0x00af] & 0xff;
}
} }
} }
@ -160,7 +143,7 @@ static void kozure_score_msg(address_space *space,UINT16 dst,UINT8 src_base)
static void nichibutsu_1414m4_0200(address_space *space, UINT16 mcu_cmd) static void nichibutsu_1414m4_0200(address_space *space, UINT16 mcu_cmd)
{ {
UINT8 * data = (UINT8 *)space->machine().region("gfx5")->base(); UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
UINT16 dst; UINT16 dst;
dst = (data[0x330+((mcu_cmd & 0xf)*2)]<<8)|(data[0x331+((mcu_cmd & 0xf)*2)]&0xff); dst = (data[0x330+((mcu_cmd & 0xf)*2)]<<8)|(data[0x331+((mcu_cmd & 0xf)*2)]&0xff);
@ -168,9 +151,9 @@ static void nichibutsu_1414m4_0200(address_space *space, UINT16 mcu_cmd)
dst &= 0x3fff; dst &= 0x3fff;
if(dst & 0x7ff) // fill if(dst & 0x7ff) // fill
legion_layer_clear(space,0x0000,data[dst & 0x3fff],data[dst+1]); nichibutsu_1414m4_fill(space,0x0000,data[dst & 0x3fff],data[dst+1]);
else // src -> dst else // src -> dst
terrafu_sm_transfer(space,dst & 0x3fff,0x0000,0x400,1); nichibutsu_1414m4_dma(space,dst & 0x3fff,0x0000,0x400,1);
} }
/* /*
@ -206,23 +189,23 @@ static void nichibutsu_1414m4_0200(address_space *space, UINT16 mcu_cmd)
static void nichibutsu_1414m4_0600(address_space *space, UINT8 is2p) static void nichibutsu_1414m4_0600(address_space *space, UINT8 is2p)
{ {
armedf_state *state = space->machine().driver_data<armedf_state>(); armedf_state *state = space->machine().driver_data<armedf_state>();
UINT8 * data = (UINT8 *)space->machine().region("gfx5")->base(); UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
int i;
UINT16 dst; UINT16 dst;
int i;
dst = ((data[0x1f5]<<8)|(data[0x1f6]&0xff)) & 0x3fff; dst = ((data[0x1f5]<<8)|(data[0x1f6]&0xff)) & 0x3fff;
state->m_text_videoram[dst] = (state->m_text_videoram[7] & 0x7) + 0x30;//data[0x1f7]; state->m_text_videoram[dst] = (state->m_text_videoram[7] & 0x7) + 0x30;//data[0x1f7];
dst = ((data[0x1f8]<<8)|(data[0x1f9]&0xff)) & 0x3fff; dst = ((data[0x1f8]<<8)|(data[0x1f9]&0xff)) & 0x3fff;
terrafu_sm_transfer(space,0x1fa + (((state->m_text_videoram[7] & 0x30) >> 4) * 0x18),dst,12,1); nichibutsu_1414m4_dma(space,0x1fa + (((state->m_text_videoram[7] & 0x30) >> 4) * 0x18),dst,12,1);
// 0x25a - 0x261 unknown meaning // 0x25a - 0x261 unknown meaning
dst = ((data[0x262]<<8)|(data[0x263]&0xff)) & 0x3fff; dst = ((data[0x262]<<8)|(data[0x263]&0xff)) & 0x3fff;
terrafu_sm_transfer(space,0x264 + (((state->m_text_videoram[7] & 0x80) >> 7) * 0x18),dst,12,1); nichibutsu_1414m4_dma(space,0x264 + (((state->m_text_videoram[7] & 0x80) >> 7) * 0x18),dst,12,1);
dst = ((data[0x294]<<8)|(data[0x295]&0xff)) & 0x3fff; dst = ((data[0x294]<<8)|(data[0x295]&0xff)) & 0x3fff;
terrafu_sm_transfer(space,0x296 + (((state->m_text_videoram[7] & 0x40) >> 6) * 0x18),dst,12,1); nichibutsu_1414m4_dma(space,0x296 + (((state->m_text_videoram[7] & 0x40) >> 6) * 0x18),dst,12,1);
dst = ((data[0x2c6]<<8)|(data[0x2c7]&0xff)) & 0x3fff; dst = ((data[0x2c6]<<8)|(data[0x2c7]&0xff)) & 0x3fff;
state->m_text_videoram[dst] = ((state->m_text_videoram[0xf] & 0xf0) >> 4) + 0x30;//data[0x2c8]; state->m_text_videoram[dst] = ((state->m_text_videoram[0xf] & 0xf0) >> 4) + 0x30;//data[0x2c8];
@ -241,136 +224,73 @@ static void nichibutsu_1414m4_0600(address_space *space, UINT8 is2p)
state->m_text_videoram[dst+1] = (state->m_text_videoram[0x11] & 0x0f) + 0x30;//data[0x2d5]; state->m_text_videoram[dst+1] = (state->m_text_videoram[0x11] & 0x0f) + 0x30;//data[0x2d5];
dst = ((data[0x2d6]<<8)|(data[0x2d7]&0xff)) & 0x3fff; dst = ((data[0x2d6]<<8)|(data[0x2d7]&0xff)) & 0x3fff;
terrafu_sm_transfer(space,0x2d8 + (is2p * 0x18),dst,12,1); // 1p / 2p string nichibutsu_1414m4_dma(space,0x2d8 + (is2p * 0x18),dst,12,1); // 1p / 2p string
dst = ((data[0x308]<<8)|(data[0x309]&0xff)) & 0x3fff; dst = ((data[0x308]<<8)|(data[0x309]&0xff)) & 0x3fff;
for(i=0;i<5;i++) /* system inputs */ for(i=0;i<5;i++) /* system inputs */
terrafu_sm_transfer(space,0x310 + (((state->m_text_videoram[0x04] >> (4-i)) & 1) * 6),dst + (i * 0x20),0x3,1); nichibutsu_1414m4_dma(space,0x310 + (((state->m_text_videoram[0x04] >> (4-i)) & 1) * 6),dst + (i * 0x20),0x3,1);
dst = ((data[0x30a]<<8)|(data[0x30b]&0xff)) & 0x3fff; dst = ((data[0x30a]<<8)|(data[0x30b]&0xff)) & 0x3fff;
for(i=0;i<7;i++) /* 1p / 2p inputs */ for(i=0;i<7;i++) /* 1p / 2p inputs */
terrafu_sm_transfer(space,0x310 + (((state->m_text_videoram[0x02 + is2p] >> (6-i)) & 1) * 6),dst + (i * 0x20),0x3,1); nichibutsu_1414m4_dma(space,0x310 + (((state->m_text_videoram[0x02 + is2p] >> (6-i)) & 1) * 6),dst + (i * 0x20),0x3,1);
dst = ((data[0x30c]<<8)|(data[0x30d]&0xff)) & 0x3fff; dst = ((data[0x30c]<<8)|(data[0x30d]&0xff)) & 0x3fff;
for(i=0;i<8;i++) /* dips */ for(i=0;i<8;i++) /* dips */
terrafu_sm_transfer(space,0x310 + (((state->m_text_videoram[0x05] >> (7-i)) & 1) * 6),dst + (i * 0x20),0x3,1); nichibutsu_1414m4_dma(space,0x310 + (((state->m_text_videoram[0x05] >> (7-i)) & 1) * 6),dst + (i * 0x20),0x3,1);
dst = ((data[0x30e]<<8)|(data[0x30f]&0xff)) & 0x3fff; dst = ((data[0x30e]<<8)|(data[0x30f]&0xff)) & 0x3fff;
for(i=0;i<8;i++) /* dips */ for(i=0;i<8;i++) /* dips */
terrafu_sm_transfer(space,0x310 + (((state->m_text_videoram[0x06] >> (7-i)) & 1) * 6),dst + (i * 0x20),0x3,1); nichibutsu_1414m4_dma(space,0x310 + (((state->m_text_videoram[0x06] >> (7-i)) & 1) * 6),dst + (i * 0x20),0x3,1);
} }
void terrafu_mcu_exec(address_space *space,UINT16 mcu_cmd) static void nichibutsu_1414m4_0e00(address_space *space,UINT16 mcu_cmd)
{ {
switch(mcu_cmd & 0xff00) UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
UINT16 dst;
dst = ((data[0xdf]<<8)|(data[0xe0]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x00e1,dst,8,1); /* hi-score */
if(mcu_cmd & 0x04)
{ {
case 0x0000: /* title screen / continue */ dst = ((data[0xfb]<<8)|(data[0xfc]&0xff)) & 0x3fff;
insert_coin_msg(space); nichibutsu_1414m4_dma(space,0x00fd,dst,8,!(mcu_cmd & 1)); /* 1p-msg */
credit_msg(space); dst = ((data[0x10d]<<8)|(data[0x10e]&0xff)) & 0x3fff;
break; kozure_score_msg(space,dst,0); /* 1p score */
if(mcu_cmd & 0x80)
case 0x0200: /* direct DMA'ing / fill */ {
nichibutsu_1414m4_0200(space,mcu_cmd & 0x7); dst = ((data[0x117]<<8)|(data[0x118]&0xff)) & 0x3fff;
break; nichibutsu_1414m4_dma(space,0x0119,dst,8,!(mcu_cmd & 2)); /* 2p-msg */
dst = ((data[0x129]<<8)|(data[0x12a]&0xff)) & 0x3fff;
case 0x0600: /* service mode */ kozure_score_msg(space,dst,1); /* 2p score */
nichibutsu_1414m4_0600(space,mcu_cmd & 1); }
break; }
else
case 0x0e00: {
if(!(mcu_cmd & 4)) dst = ((data[0x133]<<8)|(data[0x134]&0xff)) & 0x3fff;
{ nichibutsu_1414m4_dma(space,0x0135,dst,0x10,!(mcu_cmd & 1)); /* game over */
insert_coin_msg(space); insert_coin_msg(space);
credit_msg(space); credit_msg(space);
terrafu_sm_transfer(space,0x0135,0x01a8,0x10,!(mcu_cmd & 1)); /* game over */
}
break;
//default:
//printf("%04x\n",mcu_cmd);
} }
} }
void kozure_mcu_exec(address_space *space,UINT16 mcu_cmd) void nb_1414m4_exec(address_space *space,UINT16 mcu_cmd)
{ {
switch(mcu_cmd & 0xff00) switch(mcu_cmd & 0xff00)
{ {
case 0x0000: /* title screen / continue */ /* title screen / continue screens */
insert_coin_msg(space); case 0x0000: insert_coin_msg(space); credit_msg(space); break;
credit_msg(space);
break;
case 0x0200: /* direct DMA'ing / fill */ /* direct DMA'ing / fill */
nichibutsu_1414m4_0200(space,mcu_cmd & 0x7); case 0x0200: nichibutsu_1414m4_0200(space,mcu_cmd & 0x7); break;
break;
case 0x0600: /* service mode */
nichibutsu_1414m4_0600(space,mcu_cmd & 1); case 0x0600: nichibutsu_1414m4_0600(space,mcu_cmd & 1); break;
break;
case 0x0e00: /* 1p / hi-score msg / 2p + points */ /* gameplay */
terrafu_sm_transfer(space,0x00e1,0x03ac,8,1); /* hi-score */ case 0x0e00: nichibutsu_1414m4_0e00(space,mcu_cmd & 0xff); break;
if(mcu_cmd & 0x04) default:
{ popmessage("NB 1414M4 executes %04x command, contact MAMEdev\n",mcu_cmd);
terrafu_sm_transfer(space,0x00fd,0x03a0,8,!(mcu_cmd & 1)); /* 1p-msg */
kozure_score_msg(space,0x380,0); /* 1p score */
if(mcu_cmd & 0x80)
{
terrafu_sm_transfer(space,0x0119,0x03b8,8,!(mcu_cmd & 2)); /* 2p-msg */
kozure_score_msg(space,0x398,1); /* 2p score */
}
}
else
{
terrafu_sm_transfer(space,0x0135,0x0128,0x10,!(mcu_cmd & 1)); /* game over */
insert_coin_msg(space);
//credit_msg(space,0x30,0x30);
}
break; break;
//default:
// printf("%04x\n",mcu_cmd);
}
}
void legion_mcu_exec(address_space *space,UINT16 mcu_cmd)
{
switch(mcu_cmd & 0xff00)
{
case 0x0000: /* title screen / continue */
insert_coin_msg(space);
credit_msg(space);
break;
case 0x0200: /* direct DMA'ing / fill */
nichibutsu_1414m4_0200(space,mcu_cmd & 0x7);
break;
case 0x0600:
nichibutsu_1414m4_0600(space,mcu_cmd & 1);
break;
case 0x0e00: /* 1p / hi-score msg / 2p + points */
terrafu_sm_transfer(space,0x00e1,0x080c,8,1); /* hi-score */
if(mcu_cmd & 0x04)
{
terrafu_sm_transfer(space,0x00fd,0x03a0,8,!(mcu_cmd & 1)); /* 1p-msg */
//kozure_score_msg(space,0x380,0); /* 1p score */
if(mcu_cmd & 0x80)
{
terrafu_sm_transfer(space,0x0119,0x03b8,8,!(mcu_cmd & 2)); /* 2p-msg */
//kozure_score_msg(space,0x398,1); /* 2p score */
}
}
else
{
terrafu_sm_transfer(space,0x0135,0x0128,0x10,!(mcu_cmd & 1)); /* game over */
insert_coin_msg(space);
//credit_msg(space,0x30,0x30);
}
break;
//default:
// printf("%04x\n",mcu_cmd);
} }
} }