mirror of
https://github.com/holub/mame
synced 2025-05-11 16:48:52 +03:00
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:
parent
c39297ce17
commit
2b40cd4e34
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user