ddragon.cpp Cleanups (#3482)

* ddragon.cpp : Minor cleanup, Fix bit manipulations,  Add object finders instead runtime tag lookups, Add address_map_bank_device for darktowr_state bankswitching, Fix ADPCM ROM(Both MSM5205s hasn't share ROM space)

* ddragon.cpp : Fix compile, Fix bit manipulation, Minor cleanup
This commit is contained in:
cam900 2018-06-17 15:38:19 +09:00 committed by Vas Crabb
parent 30ab71db9a
commit d6a53357a5
3 changed files with 175 additions and 125 deletions

View File

@ -132,7 +132,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(ddragon_state::ddragon_scanline)
MACHINE_START_MEMBER(ddragon_state,ddragon)
{
/* configure banks */
membank("bank1")->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x4000);
if (m_mainbank)
m_mainbank->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x4000);
/* register for save states */
save_item(NAME(m_scrollx_hi));
@ -152,7 +153,7 @@ MACHINE_RESET_MEMBER(ddragon_state,ddragon)
m_ddragon_sub_port = 0;
m_adpcm_pos[0] = m_adpcm_pos[1] = 0;
m_adpcm_end[0] = m_adpcm_end[1] = 0;
m_adpcm_idle[0] = m_adpcm_idle[1] = 1;
m_adpcm_idle[0] = m_adpcm_idle[1] = true;
m_adpcm_data[0] = m_adpcm_data[1] = -1;
}
@ -181,7 +182,7 @@ WRITE8_MEMBER(ddragon_state::ddragon_bankswitch_w)
m_subcpu->set_input_line(INPUT_LINE_RESET, data & 0x08 ? CLEAR_LINE : ASSERT_LINE);
m_subcpu->set_input_line(INPUT_LINE_HALT, data & 0x10 ? ASSERT_LINE : CLEAR_LINE);
membank("bank1")->set_entry((data & 0xe0) >> 5);
m_mainbank->set_entry((data & 0xe0) >> 5);
}
@ -193,7 +194,7 @@ WRITE8_MEMBER(toffy_state::toffy_bankswitch_w)
// flip_screen_set(machine(), ~data & 0x04);
/* I don't know ... */
membank("bank1")->set_entry((data & 0x20) >> 5);
m_mainbank->set_entry((data & 0x20) >> 5);
}
@ -248,14 +249,7 @@ WRITE8_MEMBER(darktowr_state::darktowr_bankswitch_w)
m_subcpu->set_input_line(INPUT_LINE_RESET, data & 0x08 ? CLEAR_LINE : ASSERT_LINE);
m_subcpu->set_input_line(INPUT_LINE_HALT, data & 0x10 ? ASSERT_LINE : CLEAR_LINE);
int oldbank = membank("bank1")->entry();
int newbank = (data & 0xe0) >> 5;
membank("bank1")->set_entry(newbank);
if (newbank == 4 && oldbank != 4)
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x4000, 0x7fff, read8_delegate(FUNC(darktowr_state::darktowr_mcu_bank_r),this), write8_delegate(FUNC(darktowr_state::darktowr_mcu_bank_w),this));
else if (newbank != 4 && oldbank == 4)
m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0x4000, 0x7fff, "bank1");
m_darktowr_bank->set_bank((data & 0xe0) >> 5);
}
@ -319,12 +313,6 @@ WRITE8_MEMBER(ddragon_state::ddragon2_sub_irq_w)
}
WRITE_LINE_MEMBER(ddragon_state::irq_handler)
{
m_soundcpu->set_input_line(m_ym_irq, state ? ASSERT_LINE : CLEAR_LINE);
}
WRITE8_MEMBER(ddragon_state::ddragonba_port_w)
{
if ((data & 0x8) == 0)
@ -420,65 +408,62 @@ WRITE8_MEMBER(ddragon_state::ddragon_comram_w)
WRITE8_MEMBER(ddragon_state::dd_adpcm_w)
{
int chip = offset & 1;
msm5205_device *adpcm = chip ? m_adpcm2 : m_adpcm1;
switch (offset / 2)
switch (offset >> 1)
{
case 3:
m_adpcm_idle[chip] = 1;
adpcm->reset_w(1);
m_adpcm_idle[chip] = true;
m_adpcm[chip]->reset_w(1);
break;
case 2:
m_adpcm_pos[chip] = (data & 0x7f) * 0x200;
m_adpcm_pos[chip] = (data & 0x7f) << 9;
break;
case 1:
m_adpcm_end[chip] = (data & 0x7f) * 0x200;
m_adpcm_end[chip] = (data & 0x7f) << 9;
break;
case 0:
m_adpcm_idle[chip] = 0;
adpcm->reset_w(0);
m_adpcm_idle[chip] = false;
m_adpcm[chip]->reset_w(0);
break;
}
}
void ddragon_state::dd_adpcm_int( msm5205_device *device, int chip )
void ddragon_state::dd_adpcm_int( int chip )
{
if (m_adpcm_pos[chip] >= m_adpcm_end[chip] || m_adpcm_pos[chip] >= 0x10000)
if (m_adpcm_pos[chip] >= m_adpcm_end[chip] || m_adpcm_pos[chip] >= m_adpcm_rom[chip].length())
{
m_adpcm_idle[chip] = 1;
device->reset_w(1);
m_adpcm_idle[chip] = true;
m_adpcm[chip]->reset_w(1);
}
else if (m_adpcm_data[chip] != -1)
{
device->write_data(m_adpcm_data[chip] & 0x0f);
m_adpcm[chip]->write_data(m_adpcm_data[chip] & 0x0f);
m_adpcm_data[chip] = -1;
}
else
{
uint8_t *ROM = memregion("adpcm")->base() + 0x10000 * chip;
m_adpcm_data[chip] = ROM[m_adpcm_pos[chip]++];
device->write_data(m_adpcm_data[chip] >> 4);
m_adpcm_data[chip] = m_adpcm_rom[chip][m_adpcm_pos[chip]++];
m_adpcm[chip]->write_data(m_adpcm_data[chip] >> 4);
}
}
WRITE_LINE_MEMBER(ddragon_state::dd_adpcm_int_1)
{
dd_adpcm_int(m_adpcm1, 0);
dd_adpcm_int(0);
}
WRITE_LINE_MEMBER(ddragon_state::dd_adpcm_int_2)
{
dd_adpcm_int(m_adpcm2, 1);
dd_adpcm_int(1);
}
READ8_MEMBER(ddragon_state::dd_adpcm_status_r)
{
return m_adpcm_idle[0] + (m_adpcm_idle[1] << 1);
return (m_adpcm_idle[0] ? 1 : 0) | (m_adpcm_idle[1] ? 2 : 0);
}
@ -489,7 +474,7 @@ READ8_MEMBER(ddragon_state::dd_adpcm_status_r)
*
*************************************/
void ddragon_state::ddragon_map(address_map &map)
void ddragon_state::ddragon_base_map(address_map &map)
{
map(0x0000, 0x0fff).ram().share("rambase");
map(0x1000, 0x11ff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
@ -503,14 +488,39 @@ void ddragon_state::ddragon_map(address_map &map)
map(0x3802, 0x3802).portr("EXTRA");
map(0x3803, 0x3803).portr("DSW0");
map(0x3804, 0x3804).portr("DSW1");
map(0x3808, 0x3808).w(FUNC(ddragon_state::ddragon_bankswitch_w));
map(0x3809, 0x3809).writeonly().share("scrollx_lo");
map(0x380a, 0x380a).writeonly().share("scrolly_lo");
map(0x380b, 0x380f).rw(FUNC(ddragon_state::ddragon_interrupt_r), FUNC(ddragon_state::ddragon_interrupt_w));
map(0x4000, 0x7fff).bankr("bank1");
map(0x8000, 0xffff).rom();
}
void ddragon_state::ddragon_map(address_map &map)
{
ddragon_base_map(map);
map(0x3808, 0x3808).w(FUNC(ddragon_state::ddragon_bankswitch_w));
map(0x4000, 0x7fff).bankr("mainbank");
}
void toffy_state::toffy_map(address_map &map)
{
ddragon_base_map(map);
map(0x3808, 0x3808).w(FUNC(toffy_state::toffy_bankswitch_w));
map(0x4000, 0x7fff).bankr("mainbank");
}
void darktowr_state::darktowr_map(address_map &map)
{
ddragon_base_map(map);
map(0x3808, 0x3808).w(FUNC(darktowr_state::darktowr_bankswitch_w));
map(0x4000, 0x7fff).m(m_darktowr_bank, FUNC(address_map_bank_device::amap8));
}
void darktowr_state::darktowr_banked_map(address_map &map)
{
map(0x00000, 0x0ffff).rom().region("maincpu", 0x10000);
map(0x10000, 0x13fff).rw(FUNC(darktowr_state::darktowr_mcu_bank_r), FUNC(darktowr_state::darktowr_mcu_bank_w));
map(0x14000, 0x1ffff).rom().region("maincpu", 0x24000); // TODO : ROM? empty at most of darktowr_state games
}
void ddragon_state::dd2_map(address_map &map)
{
@ -530,12 +540,11 @@ void ddragon_state::dd2_map(address_map &map)
map(0x380b, 0x380f).rw(FUNC(ddragon_state::ddragon_interrupt_r), FUNC(ddragon_state::ddragon_interrupt_w));
map(0x3c00, 0x3dff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0x3e00, 0x3fff).ram().w(m_palette, FUNC(palette_device::write8_ext)).share("palette_ext");
map(0x4000, 0x7fff).bankr("bank1");
map(0x4000, 0x7fff).bankr("mainbank");
map(0x8000, 0xffff).rom();
}
/*************************************
*
* Sub CPU memory maps
@ -550,7 +559,6 @@ void ddragon_state::sub_map(address_map &map)
map(0xc000, 0xffff).rom();
}
void ddragon_state::ddragonba_sub_map(address_map &map)
{
map(0x0000, 0x0fff).ram();
@ -558,7 +566,6 @@ void ddragon_state::ddragonba_sub_map(address_map &map)
map(0xc000, 0xffff).rom();
}
void ddragon_state::dd2_sub_map(address_map &map)
{
map(0x0000, 0xbfff).rom();
@ -567,14 +574,12 @@ void ddragon_state::dd2_sub_map(address_map &map)
map(0xe000, 0xe000).w(FUNC(ddragon_state::ddragon2_sub_irq_w));
}
void ddragon_state::ddragonba_sub_portmap(address_map &map)
{
map(0x0000, 0x01ff).w(FUNC(ddragon_state::ddragonba_port_w));
}
/*************************************
*
* Sound CPU memory maps
@ -591,7 +596,6 @@ void ddragon_state::sound_map(address_map &map)
map(0x8000, 0xffff).rom();
}
void ddragon_state::dd2_sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
@ -602,7 +606,6 @@ void ddragon_state::dd2_sound_map(address_map &map)
}
/*************************************
*
* Input ports
@ -912,9 +915,9 @@ static const gfx_layout char_layout =
8,8,
RGN_FRAC(1,1),
4,
{ 0, 2, 4, 6 },
{ STEP4(0,2) },
{ 1, 0, 8*8+1, 8*8+0, 16*8+1, 16*8+0, 24*8+1, 24*8+0 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
{ STEP8(0,8) },
32*8
};
@ -926,8 +929,7 @@ static const gfx_layout tile_layout =
{ RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4, 0, 4 },
{ 3, 2, 1, 0, 16*8+3, 16*8+2, 16*8+1, 16*8+0,
32*8+3, 32*8+2, 32*8+1, 32*8+0, 48*8+3, 48*8+2, 48*8+1, 48*8+0 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
{ STEP16(0,8) },
64*8
};
@ -981,7 +983,7 @@ MACHINE_CONFIG_START(ddragon_state::ddragon)
MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("soundcpu", M6809_IRQ_LINE))
MCFG_DEVICE_ADD("fmsnd", YM2151, SOUND_CLOCK)
MCFG_YM2151_IRQ_HANDLER(WRITELINE(*this, ddragon_state, irq_handler))
MCFG_YM2151_IRQ_HANDLER(INPUTLINE("soundcpu", M6809_FIRQ_LINE))
MCFG_SOUND_ROUTE(0, "mono", 0.60)
MCFG_SOUND_ROUTE(1, "mono", 0.60)
@ -1053,7 +1055,7 @@ MACHINE_CONFIG_START(ddragon_state::ddragon6809)
MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("soundcpu", M6809_IRQ_LINE))
MCFG_DEVICE_ADD("fmsnd", YM2151, SOUND_CLOCK)
MCFG_YM2151_IRQ_HANDLER(WRITELINE(*this, ddragon_state,irq_handler))
MCFG_YM2151_IRQ_HANDLER(INPUTLINE("soundcpu", M6809_FIRQ_LINE))
MCFG_SOUND_ROUTE(0, "mono", 0.60)
MCFG_SOUND_ROUTE(1, "mono", 0.60)
@ -1106,7 +1108,7 @@ MACHINE_CONFIG_START(ddragon_state::ddragon2)
MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("soundcpu", INPUT_LINE_NMI))
MCFG_DEVICE_ADD("fmsnd", YM2151, SOUND_CLOCK)
MCFG_YM2151_IRQ_HANDLER(WRITELINE(*this, ddragon_state,irq_handler))
MCFG_YM2151_IRQ_HANDLER(INPUTLINE("soundcpu", 0))
MCFG_SOUND_ROUTE(0, "mono", 0.60)
MCFG_SOUND_ROUTE(1, "mono", 0.60)
@ -1119,9 +1121,19 @@ MACHINE_CONFIG_START(darktowr_state::darktowr)
ddragon(config);
/* basic machine hardware */
MCFG_DEVICE_MODIFY("maincpu")
MCFG_DEVICE_PROGRAM_MAP(darktowr_map)
MCFG_DEVICE_ADD("mcu", M68705P3, XTAL(4'000'000))
MCFG_M68705_PORTA_W_CB(WRITE8(*this, darktowr_state, mcu_port_a_w))
MCFG_DEVICE_ADD("darktowr_bank", ADDRESS_MAP_BANK, 0)
MCFG_DEVICE_PROGRAM_MAP(darktowr_banked_map)
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8)
MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(17)
MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000)
/* video hardware */
MACHINE_CONFIG_END
@ -1130,6 +1142,9 @@ MACHINE_CONFIG_START(toffy_state::toffy)
ddragon(config);
/* basic machine hardware */
MCFG_DEVICE_MODIFY("maincpu")
MCFG_DEVICE_PROGRAM_MAP(toffy_map)
MCFG_DEVICE_REMOVE("sub")
/* sound hardware */
@ -1177,9 +1192,11 @@ ROM_START( ddragon )
ROM_LOAD( "21j-i", 0x20000, 0x10000, CRC(5effb0a0) SHA1(1f21acb15dad824e831ed9a42b3fde096bb31141) )
ROM_LOAD( "21j-j", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "21j-6", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) )
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "21j-7", 0x00000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
@ -1218,9 +1235,11 @@ ROM_START( ddragonw )
ROM_LOAD( "21j-i", 0x20000, 0x10000, CRC(5effb0a0) SHA1(1f21acb15dad824e831ed9a42b3fde096bb31141) )
ROM_LOAD( "21j-j", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "21j-6", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) )
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "21j-7", 0x00000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -1259,9 +1278,11 @@ ROM_START( ddragonw1 )
ROM_LOAD( "21j-i", 0x20000, 0x10000, CRC(5effb0a0) SHA1(1f21acb15dad824e831ed9a42b3fde096bb31141) )
ROM_LOAD( "21j-j", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "21j-6", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) )
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "21j-7", 0x00000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -1300,9 +1321,11 @@ ROM_START( ddragonu )
ROM_LOAD( "21j-i", 0x20000, 0x10000, CRC(5effb0a0) SHA1(1f21acb15dad824e831ed9a42b3fde096bb31141) )
ROM_LOAD( "21j-j", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "21j-6", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) )
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "21j-7", 0x00000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -1341,9 +1364,11 @@ ROM_START( ddragonua )
ROM_LOAD( "21j-i", 0x20000, 0x10000, CRC(5effb0a0) SHA1(1f21acb15dad824e831ed9a42b3fde096bb31141) )
ROM_LOAD( "21j-j", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "21j-6", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) )
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "21j-7", 0x00000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -1383,9 +1408,11 @@ ROM_START( ddragonub )
ROM_LOAD( "21j-i", 0x20000, 0x10000, CRC(5effb0a0) SHA1(1f21acb15dad824e831ed9a42b3fde096bb31141) )
ROM_LOAD( "21j-j", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "21j-6", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) )
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "21j-7", 0x00000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -1425,9 +1452,11 @@ ROM_START( ddragonb ) /* Same program roms as the World set */
ROM_LOAD( "21j-i", 0x20000, 0x10000, CRC(5effb0a0) SHA1(1f21acb15dad824e831ed9a42b3fde096bb31141) )
ROM_LOAD( "21j-j", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "21j-6", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) )
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "21j-7", 0x00000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -1466,9 +1495,11 @@ ROM_START( ddragonba )
ROM_LOAD( "21j-i", 0x20000, 0x10000, CRC(5effb0a0) SHA1(1f21acb15dad824e831ed9a42b3fde096bb31141) )
ROM_LOAD( "21j-j", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "8.bin", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) )
ROM_LOAD( "7.bin", 0x10000, 0x10000, CRC(f9311f72) SHA1(aa554ef020e04dc896e5495bcddc64e489d0ffff) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "7.bin", 0x00000, 0x10000, CRC(f9311f72) SHA1(aa554ef020e04dc896e5495bcddc64e489d0ffff) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -1507,9 +1538,11 @@ ROM_START( ddragonb2 )
ROM_LOAD( "19.bin", 0x20000, 0x10000, CRC(22d65df2) SHA1(2f286a24ea7af438b39126a4ed0c515745981416) )
ROM_LOAD( "20.bin", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "b2_1.bin", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) )
ROM_LOAD( "2.bin", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "2.bin", 0x00000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -1566,9 +1599,11 @@ ROM_START( ddragon6809 )
ROM_LOAD( "6809_11.bin", 0x20000, 0x10000, CRC(4171b70d) SHA1(dc300c9bca6481417e97ad03c973e47389f261c1) )
ROM_LOAD( "6809_12.bin", 0x30000, 0x10000, CRC(5f6a6d6f) SHA1(7d546a226cda81c28e7ccfb4c5daebc65072198d) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "6809_14.bin", 0x00000, 0x08000, CRC(678f8657) SHA1(2652fdc6719d2c889ca87802f6e2cefae59fc2eb) )
ROM_LOAD( "6809_15.bin", 0x10000, 0x08000, CRC(10f21dea) SHA1(739cf649f91490384297a81a2cc9855acb58a1c0) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "6809_15.bin", 0x00000, 0x08000, CRC(10f21dea) SHA1(739cf649f91490384297a81a2cc9855acb58a1c0) )
ROM_END
/*
@ -1637,9 +1672,11 @@ ROM_START( ddragon6809a )
ROM_LOAD( "11.2b", 0x20000, 0x10000, CRC(4171b70d) SHA1(dc300c9bca6481417e97ad03c973e47389f261c1) )
ROM_LOAD( "12.2a", 0x30000, 0x10000, CRC(5f6a6d6f) SHA1(7d546a226cda81c28e7ccfb4c5daebc65072198d) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples (yes these really are smaller than the original game..) */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples (yes these really are smaller than the original game..) */
ROM_LOAD( "14.7q", 0x00000, 0x08000, CRC(678f8657) SHA1(2652fdc6719d2c889ca87802f6e2cefae59fc2eb) )
ROM_LOAD( "15.7o", 0x10000, 0x08000, CRC(10f21dea) SHA1(739cf649f91490384297a81a2cc9855acb58a1c0) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "15.7o", 0x00000, 0x08000, CRC(10f21dea) SHA1(739cf649f91490384297a81a2cc9855acb58a1c0) )
ROM_REGION( 0x20000, "user1", 0 ) /* PROMs */
ROM_LOAD( "27s21.5o", 0x00000, 0x100, CRC(673f68c3) SHA1(9381453e8f868d80b6069264509a339e20e2b6b1) )
@ -1844,9 +1881,11 @@ ROM_START( tstrike )
ROM_LOAD( "tstrike.109", 0x20000, 0x10000, CRC(8c2cd0bb) SHA1(364a708484c7750f38162d463104216bbd555b86) )
ROM_LOAD( "21j-j", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) ) /* from ddragon (108) */
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "tstrike.94", 0x00000, 0x10000, CRC(8a2c09fc) SHA1(f59a43c3fa814b169a51744f9604d36ae63c190f) ) /* first+second half identical */
ROM_LOAD( "tstrike.95", 0x10000, 0x08000, CRC(1812eecb) SHA1(9b7d526f30a86682cdf088600b25ea5a56b112ef) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "tstrike.95", 0x00000, 0x08000, CRC(1812eecb) SHA1(9b7d526f30a86682cdf088600b25ea5a56b112ef) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -1888,9 +1927,11 @@ ROM_START( tstrikea )
ROM_LOAD( "tstrike.109", 0x20000, 0x10000, CRC(8c2cd0bb) SHA1(364a708484c7750f38162d463104216bbd555b86) )
ROM_LOAD( "21j-j", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) ) /* from ddragon (108) */
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "tstrike.94", 0x00000, 0x10000, CRC(8a2c09fc) SHA1(f59a43c3fa814b169a51744f9604d36ae63c190f) ) /* first+second half identical */
ROM_LOAD( "tstrike.95", 0x10000, 0x08000, CRC(1812eecb) SHA1(9b7d526f30a86682cdf088600b25ea5a56b112ef) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "tstrike.95", 0x00000, 0x08000, CRC(1812eecb) SHA1(9b7d526f30a86682cdf088600b25ea5a56b112ef) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -1924,9 +1965,11 @@ ROM_START( ddungeon )
ROM_LOAD( "dd78.78", 0x00000, 0x08000, CRC(3deacae9) SHA1(6663f054ed3eed50c5cacfa5d22d465dfb179964) )
ROM_LOAD( "dd109.109", 0x10000, 0x08000, CRC(5a2f31eb) SHA1(1b85533443e148adb2a9c2c09c43cbf2c35c86bc) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "21j-6", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) ) /* at IC95 */
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) ) /* at IC94 */
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "21j-7", 0x00000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) ) /* at IC94 */
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -1963,9 +2006,11 @@ ROM_START( ddungeone )
ROM_LOAD( "dd78.78", 0x00000, 0x08000, CRC(3deacae9) SHA1(6663f054ed3eed50c5cacfa5d22d465dfb179964) ) /* 6B on this board */
ROM_LOAD( "dd109.109", 0x10000, 0x08000, CRC(5a2f31eb) SHA1(1b85533443e148adb2a9c2c09c43cbf2c35c86bc) ) /* 7C on this board */
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "21j-6", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) )
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "21j-7", 0x00000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -2008,9 +2053,11 @@ ROM_START( darktowr )
ROM_LOAD( "dt.109", 0x20000, 0x10000, CRC(15bdcb62) SHA1(75382a3805dc333b196e119d28b5c3f320bd9f2a) )
ROM_LOAD( "21j-j", 0x30000, 0x10000, CRC(5fb42e7c) SHA1(7953316712c56c6f8ca6bba127319e24b618b646) ) /* from ddragon */
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x10000, "adpcm1", 0 ) /* adpcm samples */
ROM_LOAD( "21j-6", 0x00000, 0x10000, CRC(34755de3) SHA1(57c06d6ce9497901072fa50a92b6ed0d2d4d6528) ) /* from ddragon */
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) ) /* from ddragon */
ROM_REGION( 0x10000, "adpcm2", 0 ) /* adpcm samples */
ROM_LOAD( "21j-7", 0x00000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) ) /* from ddragon */
ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
@ -2090,7 +2137,6 @@ ROM_END
void ddragon_state::init_ddragon()
{
m_sprite_irq = INPUT_LINE_NMI;
m_ym_irq = M6809_FIRQ_LINE;
m_technos_video_hw = 0;
}
@ -2098,7 +2144,6 @@ void ddragon_state::init_ddragon()
void ddragon_state::init_ddragon2()
{
m_sprite_irq = INPUT_LINE_NMI;
m_ym_irq = 0;
m_technos_video_hw = 2;
}
@ -2108,18 +2153,14 @@ void darktowr_state::init_darktowr()
save_item(NAME(m_mcu_port_a_out));
m_sprite_irq = INPUT_LINE_NMI;
m_ym_irq = M6809_FIRQ_LINE;
m_technos_video_hw = 0;
m_maincpu->space(AS_PROGRAM).install_write_handler(0x3808, 0x3808, write8_delegate(FUNC(darktowr_state::darktowr_bankswitch_w), this));
m_mcu_port_a_out = 0xff;
}
void toffy_state::init_toffy()
{
m_ym_irq = M6809_FIRQ_LINE;
m_technos_video_hw = 0;
m_maincpu->space(AS_PROGRAM).install_write_handler(0x3808, 0x3808, write8_delegate(FUNC(toffy_state::toffy_bankswitch_w), this));
/* the program rom has a simple bitswap encryption */
uint8_t *rom = memregion("maincpu")->base();
@ -2168,7 +2209,6 @@ void ddragon_state::init_ddragon6809()
}
m_sprite_irq = INPUT_LINE_NMI;
m_ym_irq = M6809_FIRQ_LINE;
m_technos_video_hw = 0;
}

View File

@ -7,6 +7,7 @@
*************************************************************************/
#include "cpu/m6805/m68705.h"
#include "machine/bankdev.h"
#include "machine/gen_latch.h"
#include "machine/timer.h"
#include "sound/msm5205.h"
@ -29,12 +30,13 @@ public:
, m_maincpu(*this, "maincpu")
, m_soundcpu(*this, "soundcpu")
, m_subcpu(*this, "sub")
, m_adpcm1(*this, "adpcm1")
, m_adpcm2(*this, "adpcm2")
, m_adpcm(*this, "adpcm%u", 1U)
, m_gfxdecode(*this, "gfxdecode")
, m_screen(*this, "screen")
, m_palette(*this, "palette")
, m_soundlatch(*this, "soundlatch")
, m_mainbank(*this, "mainbank")
, m_adpcm_rom(*this, "adpcm%u", 1U)
{
}
@ -50,18 +52,17 @@ public:
/* video-related */
tilemap_t *m_fg_tilemap;
tilemap_t *m_bg_tilemap;
uint8_t m_technos_video_hw;
uint8_t m_scrollx_hi;
uint8_t m_scrolly_hi;
uint8_t m_technos_video_hw;
uint8_t m_scrollx_hi;
uint8_t m_scrolly_hi;
/* misc */
uint8_t m_ddragon_sub_port;
uint8_t m_sprite_irq;
uint8_t m_ym_irq;
uint8_t m_adpcm_sound_irq;
uint32_t m_adpcm_pos[2];
uint32_t m_adpcm_end[2];
uint8_t m_adpcm_idle[2];
uint8_t m_ddragon_sub_port;
uint8_t m_sprite_irq;
uint8_t m_adpcm_sound_irq;
uint32_t m_adpcm_pos[2];
uint32_t m_adpcm_end[2];
bool m_adpcm_idle[2];
int m_adpcm_data[2];
/* for Sai Yu Gou Ma Roku */
@ -79,17 +80,18 @@ public:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_soundcpu;
optional_device<cpu_device> m_subcpu;
optional_device<msm5205_device> m_adpcm1;
optional_device<msm5205_device> m_adpcm2;
optional_device_array<msm5205_device, 2> m_adpcm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
optional_memory_bank m_mainbank;
optional_region_ptr_array<uint8_t, 2> m_adpcm_rom;
int scanline_to_vcount(int scanline);
void ddragon_interrupt_ack(address_space &space, offs_t offset, uint8_t data);
void dd_adpcm_int(msm5205_device *device, int chip);
void dd_adpcm_int(int chip);
/* video/ddragon.c */
TILEMAP_MAPPER_MEMBER(background_scan);
@ -105,7 +107,6 @@ public:
TIMER_DEVICE_CALLBACK_MEMBER(ddragon_scanline);
DECLARE_WRITE_LINE_MEMBER(irq_handler);
DECLARE_WRITE8_MEMBER(ddragon_bgvideoram_w);
DECLARE_WRITE8_MEMBER(ddragon_fgvideoram_w);
DECLARE_CUSTOM_INPUT_MEMBER(subcpu_bus_free);
@ -136,6 +137,7 @@ public:
void dd2_sound_map(address_map &map);
void dd2_sub_map(address_map &map);
void ddragon_map(address_map &map);
void ddragon_base_map(address_map &map);
void ddragonba_sub_map(address_map &map);
void ddragonba_sub_portmap(address_map &map);
void sound_map(address_map &map);
@ -149,6 +151,7 @@ public:
darktowr_state(const machine_config &mconfig, device_type type, const char *tag)
: ddragon_state(mconfig, type, tag)
, m_mcu(*this, "mcu")
, m_darktowr_bank(*this, "darktowr_bank")
, m_mcu_port_a_out(0xff)
{
}
@ -161,10 +164,13 @@ public:
void init_darktowr();
void darktowr(machine_config &config);
void darktowr_map(address_map &map);
void darktowr_banked_map(address_map &map);
protected:
required_device<m68705p_device> m_mcu;
optional_device<address_map_bank_device> m_darktowr_bank;
uint8_t m_mcu_port_a_out;;
uint8_t m_mcu_port_a_out;
};
@ -180,4 +186,5 @@ public:
void init_toffy();
void toffy(machine_config &config);
void toffy_map(address_map &map);
};

View File

@ -55,32 +55,35 @@ Sprite layout.
TILEMAP_MAPPER_MEMBER(ddragon_state::background_scan)
{
/* logical (col,row) -> memory offset */
return (col & 0x0f) + ((row & 0x0f) << 4) + ((col & 0x10) << 4) + ((row & 0x10) << 5);
return (col & 0x0f) | ((row & 0x0f) << 4) | ((col & 0x10) << 4) | ((row & 0x10) << 5);
}
TILE_GET_INFO_MEMBER(ddragon_state::get_bg_tile_info)
{
uint8_t attr = m_bgvideoram[2 * tile_index];
tile_index <<= 1;
uint8_t attr = m_bgvideoram[tile_index];
SET_TILE_INFO_MEMBER(2,
m_bgvideoram[2 * tile_index+1] + ((attr & 0x07) << 8),
m_bgvideoram[tile_index | 1] | ((attr & 0x07) << 8),
(attr >> 3) & 0x07,
TILE_FLIPYX((attr & 0xc0) >> 6));
}
TILE_GET_INFO_MEMBER(ddragon_state::get_fg_tile_info)
{
uint8_t attr = m_fgvideoram[2 * tile_index];
tile_index <<= 1;
uint8_t attr = m_fgvideoram[tile_index];
SET_TILE_INFO_MEMBER(0,
m_fgvideoram[2 * tile_index + 1] + ((attr & 0x07) << 8),
m_fgvideoram[tile_index | 1] | ((attr & 0x07) << 8),
attr >> 5,
0);
}
TILE_GET_INFO_MEMBER(ddragon_state::get_fg_16color_tile_info)
{
uint8_t attr = m_fgvideoram[2 * tile_index];
tile_index <<= 1;
uint8_t attr = m_fgvideoram[tile_index];
SET_TILE_INFO_MEMBER(0,
m_fgvideoram[2 * tile_index+1] + ((attr & 0x0f) << 8),
m_fgvideoram[tile_index | 1] | ((attr & 0x0f) << 8),
attr >> 4,
0);
}
@ -114,13 +117,13 @@ VIDEO_START_MEMBER(ddragon_state,ddragon)
WRITE8_MEMBER(ddragon_state::ddragon_bgvideoram_w)
{
m_bgvideoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset / 2);
m_bg_tilemap->mark_tile_dirty(offset >> 1);
}
WRITE8_MEMBER(ddragon_state::ddragon_fgvideoram_w)
{
m_fgvideoram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset / 2);
m_fg_tilemap->mark_tile_dirty(offset >> 1);
}
@ -145,8 +148,8 @@ void ddragon_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
int attr = src[i + 1];
if (attr & 0x80) /* visible */
{
int sx = 240 - src[i + 4] + ((attr & 2) << 7);
int sy = 232 - src[i + 0] + ((attr & 1) << 8);
int sx = 240 - (src[i + 4] | ((attr & 2) << 7));
int sy = 232 - (src[i + 0] | ((attr & 1) << 8));
int size = (attr & 0x30) >> 4;
int flipx = attr & 8;
int flipy = attr & 4;
@ -158,7 +161,7 @@ void ddragon_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
if (m_technos_video_hw == 2) /* Double Dragon 2 */
{
color = src[i + 2] >> 5;
which = src[i + 3] + ((src[i + 2] & 0x1f) << 8);
which = src[i + 3] | ((src[i + 2] & 0x1f) << 8);
}
else
{
@ -168,7 +171,7 @@ void ddragon_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
if ((sy < -7) && (sy > -16)) sy += 256; /* fix sprite clip */
}
color = src[i + 2] >> 4;
which = src[i + 3] + ((src[i + 2] & 0x0f) << 8);
which = src[i + 3] | ((src[i + 2] & 0x0f) << 8);
}
if (flip_screen())