nb1414m4.c: converted to a device, no functional change expected (nw)

This commit is contained in:
Ivan Vangelista 2015-02-21 15:37:08 +01:00
parent 0edcf59a50
commit 41fd6c25d8
6 changed files with 179 additions and 107 deletions

View File

@ -293,7 +293,6 @@ Notes:
#include "sound/dac.h"
#include "sound/3812intf.h"
#include "includes/armedf.h"
#include "includes/nb1414m4.h"
#define LEGION_HACK 0
@ -318,7 +317,7 @@ Notes:
WRITE16_MEMBER(armedf_state::terraf_io_w)
{
if(data & 0x4000 && ((m_vreg & 0x4000) == 0)) //0 -> 1 transition
nb_1414m4_exec(space,(m_text_videoram[0] << 8) | (m_text_videoram[1] & 0xff),m_text_videoram,m_fg_scrollx,m_fg_scrolly,m_tx_tilemap);
m_nb1414m4->exec((m_text_videoram[0] << 8) | (m_text_videoram[1] & 0xff),m_text_videoram,m_fg_scrollx,m_fg_scrolly,m_tx_tilemap);
COMBINE_DATA(&m_vreg);
@ -477,7 +476,7 @@ static ADDRESS_MAP_START( legiono_map, AS_PROGRAM, 16, armedf_state )
AM_RANGE(0x060000, 0x060fff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0x061000, 0x063fff) AM_RAM
AM_RANGE(0x064000, 0x064fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
AM_RANGE(0x068000, 0x069fff) AM_READWRITE8(nb1414m4_text_videoram_r,nb1414m4_text_videoram_w,0x00ff)
AM_RANGE(0x068000, 0x069fff) AM_READWRITE8(armedf_text_videoram_r,armedf_text_videoram_w,0x00ff)
AM_RANGE(0x06a000, 0x06a9ff) AM_RAM
AM_RANGE(0x06c000, 0x06cfff) AM_RAM AM_SHARE("spr_pal_clut")
AM_RANGE(0x070000, 0x070fff) AM_RAM_WRITE(armedf_fg_videoram_w) AM_SHARE("fg_videoram")
@ -1179,6 +1178,8 @@ static MACHINE_CONFIG_START( terraf, armedf_state )
MCFG_MACHINE_START_OVERRIDE(armedf_state,armedf)
MCFG_MACHINE_RESET_OVERRIDE(armedf_state,armedf)
MCFG_DEVICE_ADD("nb1414m4", NB1414M4, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -1276,6 +1277,8 @@ static MACHINE_CONFIG_START( kozure, armedf_state )
MCFG_MACHINE_START_OVERRIDE(armedf_state,armedf)
MCFG_MACHINE_RESET_OVERRIDE(armedf_state,armedf)
MCFG_DEVICE_ADD("nb1414m4", NB1414M4, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -1368,6 +1371,8 @@ static MACHINE_CONFIG_START( cclimbr2, armedf_state )
MCFG_MACHINE_START_OVERRIDE(armedf_state,armedf)
MCFG_MACHINE_RESET_OVERRIDE(armedf_state,armedf)
MCFG_DEVICE_ADD("nb1414m4", NB1414M4, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -1414,6 +1419,8 @@ static MACHINE_CONFIG_START( legion, armedf_state )
MCFG_MACHINE_START_OVERRIDE(armedf_state,armedf)
MCFG_MACHINE_RESET_OVERRIDE(armedf_state,armedf)
MCFG_DEVICE_ADD("nb1414m4", NB1414M4, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -1461,6 +1468,7 @@ static MACHINE_CONFIG_START( legiono, armedf_state )
MCFG_MACHINE_START_OVERRIDE(armedf_state,armedf)
MCFG_MACHINE_RESET_OVERRIDE(armedf_state,armedf)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -1580,7 +1588,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, "blit_data", 0 ) /* data for mcu/blitter */
ROM_REGION( 0x4000, "nb1414m4", 0 ) /* data for mcu/blitter */
ROM_LOAD ( "lg7.bin", 0x0000, 0x4000, CRC(533e2b58) SHA1(a13ea4a530038760ffa87713903c59a932452717) )
ROM_END
@ -1637,7 +1645,7 @@ ROM_START( terraf )
ROM_LOAD( "12.7d", 0x00000, 0x10000, CRC(2d1f2ceb) SHA1(77544e1c4bda06feac135a96bb76af7c79278dc0) ) /* sprites */
ROM_LOAD( "13.9d", 0x10000, 0x10000, CRC(1d2f92d6) SHA1(e842c6bf95a5958a6ca2c85e68b9bc3cc15211a4) )
ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter */
ROM_REGION( 0x4000, "nb1414m4", 0 ) /* data for mcu/blitter */
ROM_LOAD( "10.11c", 0x0000, 0x4000, CRC(ac705812) SHA1(65be46ee959d8478cb6dffb25e61f7742276997b) )
ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */
@ -1671,7 +1679,7 @@ ROM_START( terrafu ) /* Bootleg of the USA version?, uses some roms common to bo
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, "blit_data", 0 ) /* data for mcu/blitter */
ROM_REGION( 0x4000, "nb1414m4", 0 ) /* data for mcu/blitter */
ROM_LOAD( "10.11c", 0x0000, 0x4000, CRC(ac705812) SHA1(65be46ee959d8478cb6dffb25e61f7742276997b) )
ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */
@ -1705,7 +1713,7 @@ ROM_START( terrafj )
ROM_LOAD( "tfj-12.7d", 0x00000, 0x10000, CRC(d74085a1) SHA1(3f6ba85dbd6e48a502c115b2d322a586fc4f56c9) ) /* sprites */
ROM_LOAD( "tfj-13.9d", 0x10000, 0x10000, CRC(148aa0c5) SHA1(8d8a565540e91b384a9c154522501921b7da4d4e) )
ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter */
ROM_REGION( 0x4000, "nb1414m4", 0 ) /* data for mcu/blitter */
ROM_LOAD( "10.11c", 0x0000, 0x4000, CRC(ac705812) SHA1(65be46ee959d8478cb6dffb25e61f7742276997b) )
ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */
@ -1846,7 +1854,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, "blit_data", 0 ) /* data for mcu/blitter */
ROM_REGION( 0x4000, "nb1414m4", 0 ) /* data for mcu/blitter */
ROM_LOAD( "kozure10.11c", 0x0000, 0x4000, CRC(f48be21d) SHA1(5d6db049f30cab98f672814a86a06609c1fa8fb4) )
ROM_REGION( 0x0100, "proms", 0 ) /* Unknown use */
@ -1883,7 +1891,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, "blit_data", 0 ) /* data for mcu/blitter */
ROM_REGION( 0x4000, "nb1414m4", 0 ) /* data for mcu/blitter */
ROM_LOAD( "9.bin", 0x0000, 0x4000, CRC(740d260f) SHA1(5b4487930c7a1fb0a796aec2243bec631b1b5104) )
ROM_END
@ -1917,7 +1925,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, "blit_data", 0 ) /* data for mcu/blitter */
ROM_REGION( 0x4000, "nb1414m4", 0 ) /* data for mcu/blitter */
ROM_LOAD( "9.bin", 0x0000, 0x4000, CRC(740d260f) SHA1(5b4487930c7a1fb0a796aec2243bec631b1b5104) )
ROM_END
@ -2120,6 +2128,8 @@ DRIVER_INIT_MEMBER(armedf_state,legiono)
m_maincpu->space(AS_PROGRAM).install_write_handler(0x07c000, 0x07c001, write16_delegate(FUNC(armedf_state::bootleg_io_w),this));
m_scroll_type = 2;
save_item(NAME(m_legion_cmd));
}
DRIVER_INIT_MEMBER(armedf_state,cclimbr2)

View File

@ -32,7 +32,6 @@ Takahiro Nogi (nogi@kt.rim.or.jp) 1999/12/17 -
#include "sound/dac.h"
#include "sound/3526intf.h"
#include "includes/galivan.h"
#include "includes/nb1414m4.h"
WRITE8_MEMBER(galivan_state::galivan_sound_command_w)
@ -91,7 +90,7 @@ ADDRESS_MAP_END
WRITE8_MEMBER(galivan_state::blit_trigger_w)
{
nb_1414m4_exec(space,(m_videoram[0] << 8) | (m_videoram[1] & 0xff),m_videoram,m_scrollx,m_scrolly,m_tx_tilemap);
m_nb1414m4->exec((m_videoram[0] << 8) | (m_videoram[1] & 0xff),m_videoram,m_scrollx,m_scrolly,m_tx_tilemap);
}
static ADDRESS_MAP_START( ninjemak_io_map, AS_IO, 8, galivan_state )
@ -472,6 +471,8 @@ static MACHINE_CONFIG_START( ninjemak, galivan_state )
MCFG_MACHINE_START_OVERRIDE(galivan_state,ninjemak)
MCFG_MACHINE_RESET_OVERRIDE(galivan_state,ninjemak)
MCFG_DEVICE_ADD("nb1414m4", NB1414M4, 0)
/* video hardware */
MCFG_BUFFERED_SPRITERAM8_ADD("spriteram")
@ -505,7 +506,10 @@ static MACHINE_CONFIG_START( ninjemak, galivan_state )
MACHINE_CONFIG_END
MACHINE_CONFIG_DERIVED(youmab, ninjemak)
MCFG_DEVICE_REMOVE("nb1414m4")
MACHINE_CONFIG_END
/***************************************************************************
Game driver(s)
@ -763,7 +767,7 @@ ROM_START( ninjemak )
ROM_LOAD( "ninjemak.7", 0x0000, 0x4000, CRC(80c20d36) SHA1(f20724754824030d62059388f3ea2224f5b7a60e) )
ROM_LOAD( "ninjemak.6", 0x4000, 0x4000, CRC(1da7a651) SHA1(5307452058164a0bc39d144dd204627a9ead7543) )
ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter? */
ROM_REGION( 0x4000, "nb1414m4", 0 ) /* data for mcu/blitter? */
ROM_LOAD( "ninjemak.5", 0x0000, 0x4000, CRC(5f91dd30) SHA1(3513c0a2e4ca83f602cacad6af9c07fe9e4b16a1) ) /* text layer data */
ROM_REGION( 0x0400, "proms", 0 ) /* Region 3 - color data */
@ -805,7 +809,7 @@ ROM_START( youma )
ROM_LOAD( "ninjemak.7", 0x0000, 0x4000, CRC(80c20d36) SHA1(f20724754824030d62059388f3ea2224f5b7a60e) )
ROM_LOAD( "ninjemak.6", 0x4000, 0x4000, CRC(1da7a651) SHA1(5307452058164a0bc39d144dd204627a9ead7543) )
ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter? */
ROM_REGION( 0x4000, "nb1414m4", 0 ) /* data for mcu/blitter? */
ROM_LOAD( "ync-5.bin", 0x0000, 0x4000, CRC(993e4ab2) SHA1(aceafc83b36db4db923d27f77ad045e626678bae) ) /* text layer data */
ROM_REGION( 0x0400, "proms", 0 ) /* Region 3 - color data */
@ -847,7 +851,7 @@ ROM_START( youma2 )
ROM_LOAD( "ninjemak.7", 0x0000, 0x4000, CRC(80c20d36) SHA1(f20724754824030d62059388f3ea2224f5b7a60e) )
ROM_LOAD( "ninjemak.6", 0x4000, 0x4000, CRC(1da7a651) SHA1(5307452058164a0bc39d144dd204627a9ead7543) )
ROM_REGION( 0x4000, "blit_data", 0 ) /* data for mcu/blitter? */
ROM_REGION( 0x4000, "nb1414m4", 0 ) /* data for mcu/blitter? */
ROM_LOAD( "5.15d", 0x0000, 0x4000, CRC(1b4f64aa) SHA1(2cb2db946bf93e0928d6aa2e2dd29acb92981567) ) /* text layer data x */
ROM_REGION( 0x0400, "proms", 0 ) /* Region 3 - color data */
@ -1093,5 +1097,5 @@ GAME( 1986, dangarb, dangar, galivan, dangarb, driver_device, 0, ROT270, "b
GAME( 1986, ninjemak, 0, ninjemak, ninjemak, driver_device, 0, ROT270, "Nichibutsu", "Ninja Emaki (US)", GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION )
GAME( 1986, youma, ninjemak, ninjemak, ninjemak, driver_device, 0, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan)", GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION )
GAME( 1986, youma2, ninjemak, ninjemak, ninjemak, driver_device, 0, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan, alt)", GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION )
GAME( 1986, youmab, ninjemak, ninjemak, ninjemak, galivan_state, youmab, ROT270, "bootleg", "Youma Ninpou Chou (Game Electronics bootleg, set 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION ) // player is invincible
GAME( 1986, youmab2, ninjemak, ninjemak, ninjemak, galivan_state, youmab, ROT270, "bootleg", "Youma Ninpou Chou (Game Electronics bootleg, set 2)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION ) // ""
GAME( 1986, youmab, ninjemak, youmab, ninjemak, galivan_state, youmab, ROT270, "bootleg", "Youma Ninpou Chou (Game Electronics bootleg, set 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION ) // player is invincible
GAME( 1986, youmab2, ninjemak, youmab, ninjemak, galivan_state, youmab, ROT270, "bootleg", "Youma Ninpou Chou (Game Electronics bootleg, set 2)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION ) // ""

View File

@ -1,3 +1,4 @@
#include "includes/nb1414m4.h"
#include "video/bufsprite.h"
class armedf_state : public driver_device
@ -7,6 +8,7 @@ public:
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_extra(*this, "extra"),
m_nb1414m4(*this, "nb1414m4"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_spriteram(*this, "spriteram"),
@ -18,6 +20,7 @@ public:
/* devices */
required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_extra;
optional_device<nb1414m4_device> m_nb1414m4;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<buffered_spriteram16_device> m_spriteram;

View File

@ -4,6 +4,7 @@
***************************************************************************/
#include "includes/nb1414m4.h"
#include "video/bufsprite.h"
class galivan_state : public driver_device
@ -14,6 +15,7 @@ public:
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram"),
m_maincpu(*this, "maincpu"),
m_nb1414m4(*this, "nb1414m4"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette") { }
@ -63,6 +65,7 @@ public:
UINT32 screen_update_ninjemak(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
required_device<cpu_device> m_maincpu;
optional_device<nb1414m4_device> m_nb1414m4;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
};

View File

@ -1 +1,29 @@
void nb_1414m4_exec(address_space &space,UINT16 mcu_cmd,UINT8 *vram,UINT16 &scrollx,UINT16 &scrolly,tilemap_t *tilemap);
class nb1414m4_device : public device_t,
public device_video_interface
{
public:
nb1414m4_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
~nb1414m4_device() {}
void exec(UINT16 mcu_cmd, UINT8 *vram, UINT16 &scrollx, UINT16 &scrolly, tilemap_t *tilemap);
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
private:
void dma(UINT16 src, UINT16 dst, UINT16 size, UINT8 condition, UINT8 *vram);
void fill(UINT16 dst, UINT8 tile, UINT8 pal, UINT8 *vram);
void insert_coin_msg(UINT8 *vram);
void credit_msg(UINT8 *vram);
void kozure_score_msg(UINT16 dst, UINT8 src_base, UINT8 *vram);
void _0200(UINT16 mcu_cmd, UINT8 *vram);
void _0600(UINT8 is2p, UINT8 *vram);
void _0e00(UINT16 mcu_cmd, UINT8 *vram);
UINT8 *m_data;
};
extern const device_type NB1414M4;

View File

@ -14,7 +14,6 @@ TODO:
- Ninja Emaki triggers unknown commands 0x8000 & 0xff20;
- Ninja Emaki continue screen is corrupt;
- How to NOT draw the params?
- Device-ify this;
Notes:
- Just before any string in the "MCU" rom, there's a control byte, this meaning is as follows:
@ -31,9 +30,40 @@ Notes:
#include "emu.h"
#include "includes/nb1414m4.h"
static void nichibutsu_1414m4_dma(address_space &space,UINT16 src,UINT16 dst,UINT16 size, UINT8 condition,UINT8 *vram)
const device_type NB1414M4 = &device_creator<nb1414m4_device>;
nb1414m4_device::nb1414m4_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, NB1414M4, "NB1414M4 Mahjong Custom", tag, owner, clock, "nb1414m4", __FILE__),
device_video_interface(mconfig, *this),
m_data(NULL)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void nb1414m4_device::device_start()
{
m_data = region()->base();
}
//-------------------------------------------------
// device_reset - device-specific startup
//-------------------------------------------------
void nb1414m4_device::device_reset()
{
}
/*****************************************************************************
DEVICE HANDLERS
*****************************************************************************/
void nb1414m4_device::dma(UINT16 src, UINT16 dst, UINT16 size, UINT8 condition, UINT8 *vram)
{
UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base();
int i;
for(i=0;i<size;i++)
@ -41,13 +71,13 @@ static void nichibutsu_1414m4_dma(address_space &space,UINT16 src,UINT16 dst,UIN
if(i+dst+0x000 < 18) //avoid param overwrite
continue;
vram[i+dst+0x000] = (condition) ? (data[i+(0)+src] & 0xff) : 0x20;
vram[i+dst+0x000] = (condition) ? (m_data[i+(0)+src] & 0xff) : 0x20;
vram[i+dst+0x400] = data[i+(size)+src] & 0xff;
vram[i+dst+0x400] = m_data[i+(size)+src] & 0xff;
}
}
static void nichibutsu_1414m4_fill(address_space &space,UINT16 dst,UINT8 tile,UINT8 pal,UINT8 *vram)
void nb1414m4_device::fill(UINT16 dst, UINT8 tile, UINT8 pal, UINT8 *vram)
{
int i;
@ -61,61 +91,58 @@ static void nichibutsu_1414m4_fill(address_space &space,UINT16 dst,UINT8 tile,UI
}
}
static void insert_coin_msg(address_space &space,UINT8 *vram)
void nb1414m4_device::insert_coin_msg(UINT8 *vram)
{
UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base();
int credit_count = (vram[0xf] & 0xff);
UINT8 fl_cond = space.machine().first_screen()->frame_number() & 0x10; /* for insert coin "flickering" */
UINT8 fl_cond = m_screen->frame_number() & 0x10; /* for insert coin "flickering" */
UINT16 dst;
if(credit_count == 0)
{
dst = (data[0x01]<<8|data[0x02]) & 0x3fff;
dst = (m_data[0x01]<<8|m_data[0x02]) & 0x3fff;
nichibutsu_1414m4_dma(space,0x0003,dst,0x10,fl_cond,vram);
dma(0x0003,dst,0x10,fl_cond,vram);
}
else
{
dst = (data[0x49]<<8|data[0x4a]) & 0x3fff;
dst = (m_data[0x49]<<8|m_data[0x4a]) & 0x3fff;
nichibutsu_1414m4_dma(space,0x004b,dst,0x18,1,vram);
dma(0x004b,dst,0x18,1,vram);
}
}
static void credit_msg(address_space &space,UINT8 *vram)
void nb1414m4_device::credit_msg(UINT8 *vram)
{
UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base();
int credit_count = (vram[0xf] & 0xff);
UINT8 fl_cond = space.machine().first_screen()->frame_number() & 0x10; /* for insert coin "flickering" */
UINT8 fl_cond = m_screen->frame_number() & 0x10; /* for insert coin "flickering" */
UINT16 dst;
dst = ((data[0x023]<<8)|(data[0x024]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x0025,dst,0x10,1,vram); /* credit */
dst = ((m_data[0x023]<<8)|(m_data[0x024]&0xff)) & 0x3fff;
dma(0x0025,dst,0x10,1,vram); /* credit */
dst = ((data[0x045]<<8)|(data[0x046]&0xff)) & 0x3fff;
dst++; // data is 0x5e, needs to be 0x5f ...
dst = ((m_data[0x045]<<8)|(m_data[0x046]&0xff)) & 0x3fff;
dst++; // m_data is 0x5e, needs to be 0x5f ...
vram[dst+0x000] = (credit_count + 0x30); /* credit num */
vram[dst+0x400] = (data[0x48]);
vram[dst+0x400] = (m_data[0x48]);
if(credit_count == 1) /* ONE PLAYER ONLY */
{
dst = ((data[0x07b]<<8)|(data[0x07c]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x007d,dst,0x18,fl_cond,vram);
dst = ((m_data[0x07b]<<8)|(m_data[0x07c]&0xff)) & 0x3fff;
dma(0x007d,dst,0x18,fl_cond,vram);
}
else if(credit_count > 1) /* ONE OR TWO PLAYERS */
{
dst = ((data[0x0ad]<<8)|(data[0x0ae]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x00af,dst,0x18,fl_cond,vram);
dst = ((m_data[0x0ad]<<8)|(m_data[0x0ae]&0xff)) & 0x3fff;
dma(0x00af,dst,0x18,fl_cond,vram);
}
}
static void kozure_score_msg(address_space &space,UINT16 dst,UINT8 src_base,UINT8 *vram)
void nb1414m4_device::kozure_score_msg(UINT16 dst, UINT8 src_base, UINT8 *vram)
{
int i;
UINT8 first_digit;
UINT8 res;
UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base();
first_digit = 0;
for(i=0;i<6;i++)
@ -130,29 +157,28 @@ static void kozure_score_msg(address_space &space,UINT16 dst,UINT8 src_base,UINT
else
vram[i+dst+0x0000] = 0x20;
vram[i+dst+0x0400] = data[0x10f+(src_base*0x1c)+i];
vram[i+dst+0x0400] = m_data[0x10f+(src_base*0x1c)+i];
}
vram[6+dst+0x0000] = 0x30;
vram[6+dst+0x0400] = data[0x10f+(src_base*0x1c)+6];
vram[6+dst+0x0400] = m_data[0x10f+(src_base*0x1c)+6];
vram[7+dst+0x0000] = 0x30;
vram[7+dst+0x0400] = data[0x10f+(src_base*0x1c)+7];
vram[7+dst+0x0400] = m_data[0x10f+(src_base*0x1c)+7];
}
static void nichibutsu_1414m4_0200(address_space &space, UINT16 mcu_cmd,UINT8 *vram)
void nb1414m4_device::_0200(UINT16 mcu_cmd, UINT8 *vram)
{
UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base();
UINT16 dst;
dst = (data[0x330+((mcu_cmd & 0xf)*2)]<<8)|(data[0x331+((mcu_cmd & 0xf)*2)]&0xff);
dst = (m_data[0x330+((mcu_cmd & 0xf)*2)]<<8)|(m_data[0x331+((mcu_cmd & 0xf)*2)]&0xff);
dst &= 0x3fff;
if(dst & 0x7ff) // fill
nichibutsu_1414m4_fill(space,0x0000,data[dst & 0x3fff],data[dst+1],vram);
fill(0x0000,m_data[dst & 0x3fff],m_data[dst+1],vram);
else // src -> dst
nichibutsu_1414m4_dma(space,dst & 0x3fff,0x0000,0x400,1,vram);
dma(dst & 0x3fff,0x0000,0x400,1,vram);
}
/*
@ -185,95 +211,93 @@ static void nichibutsu_1414m4_0200(address_space &space, UINT16 mcu_cmd,UINT8 *v
[0x10] coinage B
[0x11] sound test num
*/
static void nichibutsu_1414m4_0600(address_space &space, UINT8 is2p,UINT8 *vram)
void nb1414m4_device::_0600(UINT8 is2p, UINT8 *vram)
{
UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base();
UINT16 dst;
int i;
dst = ((data[0x1f5]<<8)|(data[0x1f6]&0xff)) & 0x3fff;
vram[dst] = (vram[7] & 0x7) + 0x30;//data[0x1f7];
dst = ((m_data[0x1f5]<<8)|(m_data[0x1f6]&0xff)) & 0x3fff;
vram[dst] = (vram[7] & 0x7) + 0x30;//m_data[0x1f7];
dst = ((data[0x1f8]<<8)|(data[0x1f9]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x1fa + (((vram[7] & 0x30) >> 4) * 0x18),dst,12,1,vram);
dst = ((m_data[0x1f8]<<8)|(m_data[0x1f9]&0xff)) & 0x3fff;
dma(0x1fa + (((vram[7] & 0x30) >> 4) * 0x18),dst,12,1,vram);
// 0x25a - 0x261 unknown meaning
dst = ((data[0x262]<<8)|(data[0x263]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x264 + (((vram[7] & 0x80) >> 7) * 0x18),dst,12,1,vram);
dst = ((m_data[0x262]<<8)|(m_data[0x263]&0xff)) & 0x3fff;
dma(0x264 + (((vram[7] & 0x80) >> 7) * 0x18),dst,12,1,vram);
dst = ((data[0x294]<<8)|(data[0x295]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x296 + (((vram[7] & 0x40) >> 6) * 0x18),dst,12,1,vram);
dst = ((m_data[0x294]<<8)|(m_data[0x295]&0xff)) & 0x3fff;
dma(0x296 + (((vram[7] & 0x40) >> 6) * 0x18),dst,12,1,vram);
dst = ((data[0x2c6]<<8)|(data[0x2c7]&0xff)) & 0x3fff;
vram[dst] = ((vram[0xf] & 0xf0) >> 4) + 0x30;//data[0x2c8];
dst = ((m_data[0x2c6]<<8)|(m_data[0x2c7]&0xff)) & 0x3fff;
vram[dst] = ((vram[0xf] & 0xf0) >> 4) + 0x30;//m_data[0x2c8];
dst = ((data[0x2c9]<<8)|(data[0x2ca]&0xff)) & 0x3fff;
vram[dst] = ((vram[0xf] & 0x0f) >> 0) + 0x30;//data[0x2cb];
dst = ((m_data[0x2c9]<<8)|(m_data[0x2ca]&0xff)) & 0x3fff;
vram[dst] = ((vram[0xf] & 0x0f) >> 0) + 0x30;//m_data[0x2cb];
dst = ((data[0x2cc]<<8)|(data[0x2cd]&0xff)) & 0x3fff;
vram[dst] = ((vram[0x10] & 0xf0) >> 4) + 0x30;//data[0x2ce];
dst = ((m_data[0x2cc]<<8)|(m_data[0x2cd]&0xff)) & 0x3fff;
vram[dst] = ((vram[0x10] & 0xf0) >> 4) + 0x30;//m_data[0x2ce];
dst = ((data[0x2cf]<<8)|(data[0x2d0]&0xff)) & 0x3fff;
vram[dst] = ((vram[0x10] & 0x0f) >> 0) + 0x30;//data[0x2d1];
dst = ((m_data[0x2cf]<<8)|(m_data[0x2d0]&0xff)) & 0x3fff;
vram[dst] = ((vram[0x10] & 0x0f) >> 0) + 0x30;//m_data[0x2d1];
dst = ((data[0x2d2]<<8)|(data[0x2d3]&0xff)) & 0x3fff;
vram[dst+0] = ((vram[0x11] & 0xf0) >> 4) + 0x30;//data[0x2d4];
vram[dst+1] = (vram[0x11] & 0x0f) + 0x30;//data[0x2d5];
dst = ((m_data[0x2d2]<<8)|(m_data[0x2d3]&0xff)) & 0x3fff;
vram[dst+0] = ((vram[0x11] & 0xf0) >> 4) + 0x30;//m_data[0x2d4];
vram[dst+1] = (vram[0x11] & 0x0f) + 0x30;//m_data[0x2d5];
dst = ((data[0x2d6]<<8)|(data[0x2d7]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x2d8 + (is2p * 0x18),dst,12,1,vram); // 1p / 2p string
dst = ((m_data[0x2d6]<<8)|(m_data[0x2d7]&0xff)) & 0x3fff;
dma(0x2d8 + (is2p * 0x18),dst,12,1,vram); // 1p / 2p string
dst = ((data[0x308]<<8)|(data[0x309]&0xff)) & 0x3fff;
dst = ((m_data[0x308]<<8)|(m_data[0x309]&0xff)) & 0x3fff;
for(i=0;i<5;i++) /* system inputs */
nichibutsu_1414m4_dma(space,0x310 + (((vram[0x04] >> (4-i)) & 1) * 6),dst + (i * 0x20),0x3,1,vram);
dma(0x310 + (((vram[0x04] >> (4-i)) & 1) * 6),dst + (i * 0x20),0x3,1,vram);
dst = ((data[0x30a]<<8)|(data[0x30b]&0xff)) & 0x3fff;
dst = ((m_data[0x30a]<<8)|(m_data[0x30b]&0xff)) & 0x3fff;
for(i=0;i<7;i++) /* 1p / 2p inputs */
nichibutsu_1414m4_dma(space,0x310 + (((vram[0x02 + is2p] >> (6-i)) & 1) * 6),dst + (i * 0x20),0x3,1,vram);
dma(0x310 + (((vram[0x02 + is2p] >> (6-i)) & 1) * 6),dst + (i * 0x20),0x3,1,vram);
dst = ((data[0x30c]<<8)|(data[0x30d]&0xff)) & 0x3fff;
dst = ((m_data[0x30c]<<8)|(m_data[0x30d]&0xff)) & 0x3fff;
for(i=0;i<8;i++) /* dips */
nichibutsu_1414m4_dma(space,0x310 + (((vram[0x05] >> (7-i)) & 1) * 6),dst + (i * 0x20),0x3,1,vram);
dma(0x310 + (((vram[0x05] >> (7-i)) & 1) * 6),dst + (i * 0x20),0x3,1,vram);
dst = ((data[0x30e]<<8)|(data[0x30f]&0xff)) & 0x3fff;
dst = ((m_data[0x30e]<<8)|(m_data[0x30f]&0xff)) & 0x3fff;
for(i=0;i<8;i++) /* dips */
nichibutsu_1414m4_dma(space,0x310 + (((vram[0x06] >> (7-i)) & 1) * 6),dst + (i * 0x20),0x3,1,vram);
dma(0x310 + (((vram[0x06] >> (7-i)) & 1) * 6),dst + (i * 0x20),0x3,1,vram);
}
static void nichibutsu_1414m4_0e00(address_space &space,UINT16 mcu_cmd,UINT8 *vram)
void nb1414m4_device::_0e00(UINT16 mcu_cmd, UINT8 *vram)
{
UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base();
UINT16 dst;
dst = ((data[0xdf]<<8)|(data[0xe0]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x00e1,dst,8,1,vram); /* hi-score */
dst = ((m_data[0xdf]<<8)|(m_data[0xe0]&0xff)) & 0x3fff;
dma(0x00e1,dst,8,1,vram); /* hi-score */
if(mcu_cmd & 0x04)
{
dst = ((data[0xfb]<<8)|(data[0xfc]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x00fd,dst,8,!(mcu_cmd & 1),vram); /* 1p-msg */
dst = ((data[0x10d]<<8)|(data[0x10e]&0xff)) & 0x3fff;
kozure_score_msg(space,dst,0,vram); /* 1p score */
dst = ((m_data[0xfb]<<8)|(m_data[0xfc]&0xff)) & 0x3fff;
dma(0x00fd,dst,8,!(mcu_cmd & 1),vram); /* 1p-msg */
dst = ((m_data[0x10d]<<8)|(m_data[0x10e]&0xff)) & 0x3fff;
kozure_score_msg(dst,0,vram); /* 1p score */
if(mcu_cmd & 0x80)
{
dst = ((data[0x117]<<8)|(data[0x118]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x0119,dst,8,!(mcu_cmd & 2),vram); /* 2p-msg */
dst = ((data[0x129]<<8)|(data[0x12a]&0xff)) & 0x3fff;
kozure_score_msg(space,dst,1,vram); /* 2p score */
dst = ((m_data[0x117]<<8)|(m_data[0x118]&0xff)) & 0x3fff;
dma(0x0119,dst,8,!(mcu_cmd & 2),vram); /* 2p-msg */
dst = ((m_data[0x129]<<8)|(m_data[0x12a]&0xff)) & 0x3fff;
kozure_score_msg(dst,1,vram); /* 2p score */
}
}
else
{
dst = ((data[0x133]<<8)|(data[0x134]&0xff)) & 0x3fff;
nichibutsu_1414m4_dma(space,0x0135,dst,0x10,!(mcu_cmd & 1),vram); /* game over */
insert_coin_msg(space,vram);
dst = ((m_data[0x133]<<8)|(m_data[0x134]&0xff)) & 0x3fff;
dma(0x0135,dst,0x10,!(mcu_cmd & 1),vram); /* game over */
insert_coin_msg(vram);
if((mcu_cmd & 0x18) == 0) // TODO: either one of these two disables credit display
credit_msg(space,vram);
credit_msg(vram);
}
}
void nb_1414m4_exec(address_space &space,UINT16 mcu_cmd,UINT8 *vram,UINT16 &scrollx,UINT16 &scrolly,tilemap_t *tilemap)
void nb1414m4_device::exec(UINT16 mcu_cmd, UINT8 *vram, UINT16 &scrollx, UINT16 &scrolly, tilemap_t *tilemap)
{
/* latch fg scroll values */
scrollx = (vram[0x0d] & 0xff) | ((vram[0x0e] & 0xff) << 8);
@ -283,16 +307,16 @@ void nb_1414m4_exec(address_space &space,UINT16 mcu_cmd,UINT8 *vram,UINT16 &scro
switch(mcu_cmd & 0xff00)
{
/* title screen / continue screens */
case 0x0000: insert_coin_msg(space,vram); credit_msg(space,vram); break;
case 0x0000: insert_coin_msg(vram); credit_msg(vram); break;
/* direct DMA'ing / fill */
case 0x0200: nichibutsu_1414m4_0200(space,mcu_cmd & 0x87,vram); break;
case 0x0200: _0200(mcu_cmd & 0x87,vram); break;
/* service mode */
case 0x0600: nichibutsu_1414m4_0600(space,mcu_cmd & 1,vram); break;
case 0x0600: _0600(mcu_cmd & 1,vram); break;
/* gameplay */
case 0x0e00: nichibutsu_1414m4_0e00(space,mcu_cmd & 0xff,vram); break;
case 0x0e00: _0e00(mcu_cmd & 0xff,vram); break;
case 0x8000: break; //Ninja Emaki, attract mode
case 0xff00: break; //Ninja Emaki POST, presumably invalid