summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2011-04-22 21:01:30 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2011-04-22 21:01:30 +0000
commit2b40cd4e3484af0db87e5ca8d4f0eea885e30ced (patch)
treee180187d687dd4a43cda5e232022b6dcb022ded7
parentc39297ce17a00c9d55a45dacddc3314b1dd52fa5 (diff)
Hooked up the 1414M4 chip emulation for Crazy Climber 2 [Angelo Salese] (and refactored the code, now it's a fully common component)
-rw-r--r--src/mame/drivers/armedf.c116
-rw-r--r--src/mame/includes/armedf.h4
-rw-r--r--src/mame/machine/armedf.c220
3 files changed, 84 insertions, 256 deletions
diff --git a/src/mame/drivers/armedf.c b/src/mame/drivers/armedf.c
index 6bd7019390c..1a136d987d3 100644
--- a/src/mame/drivers/armedf.c
+++ b/src/mame/drivers/armedf.c
@@ -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;
}
diff --git a/src/mame/includes/armedf.h b/src/mame/includes/armedf.h
index 5de2cb048ff..de68f322209 100644
--- a/src/mame/includes/armedf.h
+++ b/src/mame/includes/armedf.h
@@ -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);
diff --git a/src/mame/machine/armedf.c b/src/mame/machine/armedf.c
index 800b5330924..8e1b313704b 100644
--- a/src/mame/machine/armedf.c
+++ b/src/mame/machine/armedf.c
@@ -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++)
- {
- state->m_text_videoram[i+0x050+0x0000] = data[i+0x00+0x0025] & 0xff;
- state->m_text_videoram[i+0x050+0x0400] = data[i+0x10+0x0025] & 0xff;
- }
- state->m_text_videoram[0x05f+0x000] = (credit_count + tile_base);
- state->m_text_videoram[0x05f+0x400] = (pal_base);
+ 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)
+ if(credit_count == 1) /* ONE PLAYER ONLY */
{
- 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;
- }
+ dst = ((data[0x07b]<<8)|(data[0x07c]&0xff)) & 0x3fff;
+ nichibutsu_1414m4_dma(space,0x007d,dst,0x18,fl_cond);
}
- else if(credit_count > 1)
+ else if(credit_count > 1) /* ONE OR TWO PLAYERS */
{
- 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)
- {
- 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;
+ UINT8 * data = (UINT8 *)space->machine().region("blit_data")->base();
+ UINT16 dst;
- case 0x0e00:
- if(!(mcu_cmd & 4))
- {
- insert_coin_msg(space);
- credit_msg(space);
+ dst = ((data[0xdf]<<8)|(data[0xe0]&0xff)) & 0x3fff;
+ nichibutsu_1414m4_dma(space,0x00e1,dst,8,1); /* hi-score */
- terrafu_sm_transfer(space,0x0135,0x01a8,0x10,!(mcu_cmd & 1)); /* game over */
- }
- break;
- //default:
- //printf("%04x\n",mcu_cmd);
+ if(mcu_cmd & 0x04)
+ {
+ 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 */
+ }
}
-}
-
-void kozure_mcu_exec(address_space *space,UINT16 mcu_cmd)
-{
- switch(mcu_cmd & 0xff00)
+ else
{
- 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,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);
- }
- break;
-
- //default:
- // printf("%04x\n",mcu_cmd);
+ 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 legion_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,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);
- }
+ /* 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);
}
}