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:
- the initial level color fade in effect in Armed F is confirmed on real HW, i.e. goes from
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
*/
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 )
{
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);
/* 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 */
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);
}
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 )
{
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);
}
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 )
{
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(0x06c006, 0x06c007) AM_READ_PORT("DSW2")
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(0x06d004, 0x06d005) AM_WRITE(armedf_bg_scrolly_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.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_END
@ -1287,7 +1198,6 @@ ROM_START( legiono )
ROM_REGION( 0x20000, "gfx4", 0 )
ROM_LOAD( "legion.1k", 0x000000, 0x010000, CRC(ff5a0db9) SHA1(9308deb363d3b7686cc69485ec14201dd68f9a97) )
ROM_LOAD( "legion.1j", 0x010000, 0x010000, CRC(bae220c8) SHA1(392ae0fb0351dcad7b0e8e0ed4a1dc6e07f493df) )
ROM_END
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-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_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-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_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( "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_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( "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_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( "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_END
@ -1555,7 +1465,7 @@ ROM_START( cclimbr2a )
ROM_LOAD( "13.bin", 0x20000, 0x10000, CRC(6b6ec999) SHA1(7749ce435f497732bd1b6958974cd95e960fc9fe) )
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_END
@ -1667,7 +1577,7 @@ static DRIVER_INIT( kozure )
armedf_state *state = machine.driver_data<armedf_state>();
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;
#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;
}
@ -1708,7 +1618,7 @@ static DRIVER_INIT( cclimbr2 )
{
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;
}

View File

@ -48,6 +48,4 @@ WRITE16_HANDLER( armedf_fg_scrolly_w );
WRITE16_HANDLER( armedf_bg_scrollx_w );
WRITE16_HANDLER( armedf_bg_scrolly_w );
void terrafu_mcu_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);
void nb_1414m4_exec(address_space *space,UINT16 mcu_cmd);

View File

@ -11,6 +11,8 @@ TODO:
- merge implementations
- where is the condition that makes "insert coin" text to properly blink?
- 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:
- 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 "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>();
UINT8 * data = (UINT8 *)space->machine().region("gfx5")->base();
UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
int 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)
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;
}
}
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>();
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)
{
armedf_state *state = space->machine().driver_data<armedf_state>();
UINT8 * data = (UINT8 *)space->machine().region("gfx5")->base();
int i;
UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
int credit_count = (state->m_text_videoram[0xf] & 0xff);
UINT8 fl_cond = space->machine().primary_screen->frame_number() & 0x10; /* for insert coin "flickering" */
UINT16 dst;
@ -71,59 +72,41 @@ static void insert_coin_msg(address_space *space)
{
dst = (data[0x01]<<8|data[0x02]) & 0x7fff;
for(i=0;i<0x10;i++) /* INSERT COIN */
{
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;
}
nichibutsu_1414m4_dma(space,0x0003,dst,0x10,fl_cond);
}
else
{
dst = (data[0x49]<<8|data[0x4a]) & 0x7fff;
for(i=0;i<0x18;i++) /* PUSH START BUTTON */
{
state->m_text_videoram[i+dst+0x0000] = data[i+0x00+0x004b] & 0xff;
state->m_text_videoram[i+dst+0x0400] = data[i+0x18+0x004b] & 0xff;
}
nichibutsu_1414m4_dma(space,0x004b,dst,0x18,1);
}
}
static void credit_msg(address_space *space)
{
armedf_state *state = space->machine().driver_data<armedf_state>();
UINT8 * data = (UINT8 *)space->machine().region("gfx5")->base();
int i;
UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
int credit_count = (state->m_text_videoram[0xf] & 0xff);
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];
pal_base = data[0x48];
dst = ((data[0x023]<<8)|(data[0x024]&0xff)) & 0x3fff;
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;
state->m_text_videoram[i+0x050+0x0400] = data[i+0x10+0x0025] & 0xff;
dst = ((data[0x07b]<<8)|(data[0x07c]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x007d,dst,0x18,fl_cond);
}
state->m_text_videoram[0x05f+0x000] = (credit_count + tile_base);
state->m_text_videoram[0x05f+0x400] = (pal_base);
if(credit_count == 1)
else if(credit_count > 1) /* ONE OR TWO PLAYERS */
{
for(i=0;i<0x18;i++) /* ONE PLAYER ONLY */
{
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;
}
dst = ((data[0x0ad]<<8)|(data[0x0ae]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x00af,dst,0x18,fl_cond);
}
}
@ -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)
{
UINT8 * data = (UINT8 *)space->machine().region("gfx5")->base();
UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
UINT16 dst;
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;
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
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)
{
armedf_state *state = space->machine().driver_data<armedf_state>();
UINT8 * data = (UINT8 *)space->machine().region("gfx5")->base();
int i;
UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
UINT16 dst;
int i;
dst = ((data[0x1f5]<<8)|(data[0x1f6]&0xff)) & 0x3fff;
state->m_text_videoram[dst] = (state->m_text_videoram[7] & 0x7) + 0x30;//data[0x1f7];
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
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;
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;
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];
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;
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;
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;
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;
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 */
insert_coin_msg(space);
credit_msg(space);
break;
case 0x0200: /* direct DMA'ing / fill */
nichibutsu_1414m4_0200(space,mcu_cmd & 0x7);
break;
case 0x0600: /* service mode */
nichibutsu_1414m4_0600(space,mcu_cmd & 1);
break;
case 0x0e00:
if(!(mcu_cmd & 4))
{
insert_coin_msg(space);
credit_msg(space);
terrafu_sm_transfer(space,0x0135,0x01a8,0x10,!(mcu_cmd & 1)); /* game over */
}
break;
//default:
//printf("%04x\n",mcu_cmd);
dst = ((data[0xfb]<<8)|(data[0xfc]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x00fd,dst,8,!(mcu_cmd & 1)); /* 1p-msg */
dst = ((data[0x10d]<<8)|(data[0x10e]&0xff)) & 0x3fff;
kozure_score_msg(space,dst,0); /* 1p score */
if(mcu_cmd & 0x80)
{
dst = ((data[0x117]<<8)|(data[0x118]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x0119,dst,8,!(mcu_cmd & 2)); /* 2p-msg */
dst = ((data[0x129]<<8)|(data[0x12a]&0xff)) & 0x3fff;
kozure_score_msg(space,dst,1); /* 2p score */
}
}
else
{
dst = ((data[0x133]<<8)|(data[0x134]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x0135,dst,0x10,!(mcu_cmd & 1)); /* game over */
insert_coin_msg(space);
credit_msg(space);
}
}
void kozure_mcu_exec(address_space *space,UINT16 mcu_cmd)
void nb_1414m4_exec(address_space *space,UINT16 mcu_cmd)
{
switch(mcu_cmd & 0xff00)
{
case 0x0000: /* title screen / continue */
insert_coin_msg(space);
credit_msg(space);
break;
/* title screen / continue screens */
case 0x0000: insert_coin_msg(space); credit_msg(space); break;
case 0x0200: /* direct DMA'ing / fill */
nichibutsu_1414m4_0200(space,mcu_cmd & 0x7);
break;
/* direct DMA'ing / fill */
case 0x0200: nichibutsu_1414m4_0200(space,mcu_cmd & 0x7); break;
case 0x0600:
nichibutsu_1414m4_0600(space,mcu_cmd & 1);
break;
/* service mode */
case 0x0600: nichibutsu_1414m4_0600(space,mcu_cmd & 1); break;
case 0x0e00: /* 1p / hi-score msg / 2p + points */
terrafu_sm_transfer(space,0x00e1,0x03ac,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);
}
/* gameplay */
case 0x0e00: nichibutsu_1414m4_0e00(space,mcu_cmd & 0xff); break;
default:
popmessage("NB 1414M4 executes %04x command, contact MAMEdev\n",mcu_cmd);
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);
}
}