diff options
| author | 2011-04-22 21:01:30 +0000 | |
|---|---|---|
| committer | 2011-04-22 21:01:30 +0000 | |
| commit | 2b40cd4e3484af0db87e5ca8d4f0eea885e30ced (patch) | |
| tree | e180187d687dd4a43cda5e232022b6dcb022ded7 | |
| parent | c39297ce17a00c9d55a45dacddc3314b1dd52fa5 (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.c | 116 | ||||
| -rw-r--r-- | src/mame/includes/armedf.h | 4 | ||||
| -rw-r--r-- | src/mame/machine/armedf.c | 220 |
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); } } |
