itech32.cpp : Updates (#4726)

* itech32.cpp : Updates
Simplify handlers, Reduce unncesessary ACCESSING_BITs, Duplicates, Runtime tag lookups, Fix some namings, Use shorter type values

* itech32.cpp : Default mem_mask values
This commit is contained in:
cam900 2019-03-31 00:46:40 +09:00 committed by R. Belmont
parent ca6826c0e4
commit eee5a80ae0
3 changed files with 250 additions and 330 deletions

View File

@ -403,7 +403,7 @@ WRITE_LINE_MEMBER(itech32_state::generate_int1)
} }
WRITE16_MEMBER(itech32_state::int1_ack_w) void itech32_state::int1_ack_w(u16 data)
{ {
update_interrupts(0, -1, -1); update_interrupts(0, -1, -1);
} }
@ -418,7 +418,7 @@ WRITE16_MEMBER(itech32_state::int1_ack_w)
void itech32_state::machine_start() void itech32_state::machine_start()
{ {
membank("soundbank")->configure_entries(0, 256, memregion("soundcpu")->base() + 0x10000, 0x4000); m_soundbank->configure_entries(0, 256, memregion("soundcpu")->base() + 0x10000, 0x4000);
m_irq_base = 0; m_irq_base = 0;
save_item(NAME(m_vint_state)); save_item(NAME(m_vint_state));
@ -461,8 +461,8 @@ void drivedge_state::machine_reset()
{ {
itech32_state::machine_reset(); itech32_state::machine_reset();
m_dsp1->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); m_dsp[0]->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
m_dsp2->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); m_dsp[1]->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
STOP_TMS_SPINNING(machine(), 0); STOP_TMS_SPINNING(machine(), 0);
STOP_TMS_SPINNING(machine(), 1); STOP_TMS_SPINNING(machine(), 1);
@ -470,6 +470,19 @@ void drivedge_state::machine_reset()
} }
/*************************************
*
* Color latches
*
*************************************/
template<unsigned Layer>
void itech32_state::color_w(u8 data)
{
m_color_latch[Layer] = (data & 0x7f) << 8;
}
/************************************* /*************************************
* *
@ -486,7 +499,7 @@ CUSTOM_INPUT_MEMBER(itech32_state::special_port_r)
return m_special_result; return m_special_result;
} }
READ16_MEMBER(itech32_state::trackball_r) u8 itech32_state::trackball_r()
{ {
int lower = ioport("TRACKX1")->read(); int lower = ioport("TRACKX1")->read();
int upper = ioport("TRACKY1")->read(); int upper = ioport("TRACKY1")->read();
@ -494,7 +507,7 @@ READ16_MEMBER(itech32_state::trackball_r)
return (lower & 15) | ((upper & 15) << 4); return (lower & 15) | ((upper & 15) << 4);
} }
READ16_MEMBER(itech32_state::trackball_p2_r) u8 itech32_state::trackball_p2_r()
{ {
int lower = ioport("TRACKX2")->read(); int lower = ioport("TRACKX2")->read();
int upper = ioport("TRACKY2")->read(); int upper = ioport("TRACKY2")->read();
@ -503,7 +516,7 @@ READ16_MEMBER(itech32_state::trackball_p2_r)
} }
READ32_MEMBER(itech32_state::trackball32_8bit_r) u16 itech32_state::trackball_8bit_r()
{ {
int lower = ioport("TRACKX1")->read(); int lower = ioport("TRACKX1")->read();
int upper = ioport("TRACKY1")->read(); int upper = ioport("TRACKY1")->read();
@ -512,7 +525,7 @@ READ32_MEMBER(itech32_state::trackball32_8bit_r)
} }
READ32_MEMBER(itech32_state::trackball32_4bit_p1_r) u32 itech32_state::trackball32_4bit_p1_r()
{ {
attotime curtime = machine().time(); attotime curtime = machine().time();
@ -548,7 +561,7 @@ READ32_MEMBER(itech32_state::trackball32_4bit_p1_r)
} }
READ32_MEMBER(itech32_state::trackball32_4bit_p2_r) u32 itech32_state::trackball32_4bit_p2_r()
{ {
attotime curtime = machine().time(); attotime curtime = machine().time();
@ -584,24 +597,24 @@ READ32_MEMBER(itech32_state::trackball32_4bit_p2_r)
} }
READ32_MEMBER(itech32_state::trackball32_4bit_combined_r) u32 itech32_state::trackball32_4bit_combined_r()
{ {
return trackball32_4bit_p1_r(space, offset, mem_mask) | return trackball32_4bit_p1_r() |
(trackball32_4bit_p2_r(space, offset, mem_mask) << 8); (trackball32_4bit_p2_r() << 8);
} }
READ32_MEMBER(drivedge_state::steering_r) u16 drivedge_state::steering_r()
{ {
int val = m_steer->read() * 2 - 0x100; int val = m_steer->read() * 2 - 0x100;
if (val < 0) val = 0x100 | (-val); if (val < 0) val = 0x100 | (-val);
return val << 16; return val;
} }
READ32_MEMBER(drivedge_state::gas_r) u16 drivedge_state::gas_r()
{ {
return m_gas->read() << 16; return m_gas->read();
} }
@ -611,27 +624,27 @@ READ32_MEMBER(drivedge_state::gas_r)
* *
*************************************/ *************************************/
READ16_MEMBER(itech32_state::wcbowl_prot_result_r) u16 itech32_state::wcbowl_prot_result_r()
{ {
return m_main_ram[0x111d/2]; return m_main_ram[0x111d/2];
} }
READ32_MEMBER(itech32_state::itech020_prot_result_r) u8 itech32_state::itech020_prot_result_r()
{ {
uint32_t result = ((uint32_t *)m_main_ram.target())[m_itech020_prot_address >> 2]; u32 result = ((u32 *)m_main_ram.target())[m_itech020_prot_address >> 2];
result >>= (~m_itech020_prot_address & 3) * 8; result >>= (~m_itech020_prot_address & 3) * 8;
return (result & 0xff) << 8; return result & 0xff;
} }
READ32_MEMBER(itech32_state::gt2kp_prot_result_r) u32 itech32_state::gt2kp_prot_result_r()
{ {
return 0x00010000; /* 32 bit value at 680000 to 680003 will return the needed value of 0x01 */ return 0x00010000; /* 32 bit value at 680000 to 680003 will return the needed value of 0x01 */
} }
READ32_MEMBER(itech32_state::gtclass_prot_result_r) u32 itech32_state::gtclass_prot_result_r()
{ {
return 0x00008000; /* 32 bit value at 680000 to 680003 will return the needed value of 0x80 */ return 0x00008000; /* 32 bit value at 680000 to 680003 will return the needed value of 0x80 */
} }
@ -644,9 +657,9 @@ READ32_MEMBER(itech32_state::gtclass_prot_result_r)
* *
*************************************/ *************************************/
WRITE8_MEMBER(itech32_state::sound_bank_w) void itech32_state::sound_bank_w(u8 data)
{ {
membank("soundbank")->set_entry(data); m_soundbank->set_entry(data);
} }
@ -665,27 +678,19 @@ TIMER_CALLBACK_MEMBER(itech32_state::delayed_sound_data_w)
} }
WRITE16_MEMBER(itech32_state::sound_data_w) void itech32_state::sound_data_w(u8 data)
{ {
if (ACCESSING_BITS_0_7) machine().scheduler().synchronize(timer_expired_delegate(FUNC(itech32_state::delayed_sound_data_w),this), data & 0xff);
machine().scheduler().synchronize(timer_expired_delegate(FUNC(itech32_state::delayed_sound_data_w),this), data & 0xff);
} }
READ32_MEMBER(itech32_state::sound_data32_r) u8 itech32_state::sound_return_r()
{ {
return m_sound_return << 16; return m_sound_return;
} }
WRITE32_MEMBER(itech32_state::sound_data32_w) u8 itech32_state::sound_data_r()
{
if (ACCESSING_BITS_16_23)
machine().scheduler().synchronize(timer_expired_delegate(FUNC(itech32_state::delayed_sound_data_w),this), (data >> 16) & 0xff);
}
READ8_MEMBER(itech32_state::sound_data_r)
{ {
m_soundcpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE); m_soundcpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
m_sound_int_state = 0; m_sound_int_state = 0;
@ -693,13 +698,13 @@ READ8_MEMBER(itech32_state::sound_data_r)
} }
WRITE8_MEMBER(itech32_state::sound_return_w) void itech32_state::sound_return_w(u8 data)
{ {
m_sound_return = data; m_sound_return = data;
} }
READ8_MEMBER(itech32_state::sound_data_buffer_r) u8 itech32_state::sound_data_buffer_r()
{ {
return 0; return 0;
} }
@ -712,7 +717,7 @@ READ8_MEMBER(itech32_state::sound_data_buffer_r)
* *
*************************************/ *************************************/
WRITE8_MEMBER(drivedge_state::portb_out) void drivedge_state::portb_out(u8 data)
{ {
// logerror("PIA port B write = %02x\n", data); // logerror("PIA port B write = %02x\n", data);
@ -736,7 +741,7 @@ WRITE_LINE_MEMBER(drivedge_state::turbo_light)
} }
WRITE8_MEMBER(itech32_state::pia_portb_out) void itech32_state::pia_portb_out(u8 data)
{ {
// logerror("PIA port B write = %02x\n", data); // logerror("PIA port B write = %02x\n", data);
@ -755,7 +760,7 @@ WRITE8_MEMBER(itech32_state::pia_portb_out)
* *
*************************************/ *************************************/
WRITE8_MEMBER(itech32_state::firq_clear_w) void itech32_state::firq_clear_w(u8 data)
{ {
m_soundcpu->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE); m_soundcpu->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE);
} }
@ -770,8 +775,8 @@ WRITE8_MEMBER(itech32_state::firq_clear_w)
WRITE32_MEMBER(drivedge_state::tms_reset_assert_w) WRITE32_MEMBER(drivedge_state::tms_reset_assert_w)
{ {
m_dsp1->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); m_dsp[0]->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
m_dsp2->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); m_dsp[1]->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
} }
@ -780,12 +785,12 @@ WRITE32_MEMBER(drivedge_state::tms_reset_clear_w)
/* kludge to prevent crash on first boot */ /* kludge to prevent crash on first boot */
if ((m_tms1_ram[0] & 0xff000000) == 0) if ((m_tms1_ram[0] & 0xff000000) == 0)
{ {
m_dsp1->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); m_dsp[0]->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
STOP_TMS_SPINNING(machine(), 0); STOP_TMS_SPINNING(machine(), 0);
} }
if ((m_tms2_ram[0] & 0xff000000) == 0) if ((m_tms2_ram[0] & 0xff000000) == 0)
{ {
m_dsp2->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); m_dsp[1]->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
STOP_TMS_SPINNING(machine(), 1); STOP_TMS_SPINNING(machine(), 1);
} }
} }
@ -826,32 +831,18 @@ WRITE32_MEMBER(drivedge_state::tms2_trigger_w)
READ32_MEMBER(drivedge_state::tms1_speedup_r) READ32_MEMBER(drivedge_state::tms1_speedup_r)
{ {
if (m_tms1_ram[0x382] == 0 && m_dsp1->pc() == 0xee) START_TMS_SPINNING(0); if (m_tms1_ram[0x382] == 0 && m_dsp[0]->pc() == 0xee) START_TMS_SPINNING(0);
return m_tms1_ram[0x382]; return m_tms1_ram[0x382];
} }
READ32_MEMBER(drivedge_state::tms2_speedup_r) READ32_MEMBER(drivedge_state::tms2_speedup_r)
{ {
if (m_tms2_ram[0x382] == 0 && m_dsp2->pc() == 0x809808) START_TMS_SPINNING(1); if (m_tms2_ram[0x382] == 0 && m_dsp[1]->pc() == 0x809808) START_TMS_SPINNING(1);
return m_tms2_ram[0x382]; return m_tms2_ram[0x382];
} }
/*************************************
*
* 32-bit shunts
*
*************************************/
WRITE32_MEMBER(itech32_state::int1_ack32_w)
{
int1_ack_w(space, offset, data, mem_mask);
}
/************************************* /*************************************
* *
* NVRAM read/write * NVRAM read/write
@ -863,7 +854,7 @@ void itech32_state::nvram_init(nvram_device &nvram, void *base, size_t length)
// if nvram is the main RAM, don't overwrite exception vectors // if nvram is the main RAM, don't overwrite exception vectors
int start = (base == m_main_ram) ? 0x80 : 0x00; int start = (base == m_main_ram) ? 0x80 : 0x00;
for (int i = start; i < length; i++) for (int i = start; i < length; i++)
((uint8_t *)base)[i] = machine().rand(); ((u8 *)base)[i] = machine().rand();
} }
void drivedge_state::nvram_init(nvram_device &nvram, void *base, size_t length) void drivedge_state::nvram_init(nvram_device &nvram, void *base, size_t length)
@ -871,7 +862,7 @@ void drivedge_state::nvram_init(nvram_device &nvram, void *base, size_t length)
itech32_state::nvram_init(nvram, base, length); itech32_state::nvram_init(nvram, base, length);
// due to accessing uninitialized RAM, we need this hack // due to accessing uninitialized RAM, we need this hack
((uint32_t *)m_main_ram.target())[0x2ce4/4] = 0x0000001e; ((u32 *)m_main_ram.target())[0x2ce4/4] = 0x0000001e;
} }
/************************************* /*************************************
@ -886,13 +877,14 @@ void itech32_state::timekill_map(address_map &map)
map(0x000000, 0x003fff).ram().share("nvram"); map(0x000000, 0x003fff).ram().share("nvram");
map(0x040000, 0x040001).portr("P1"); map(0x040000, 0x040001).portr("P1");
map(0x048000, 0x048001).portr("P2"); map(0x048000, 0x048001).portr("P2");
map(0x050000, 0x050001).portr("SYSTEM").w(FUNC(itech32_state::timekill_intensity_w)); map(0x050000, 0x050001).portr("SYSTEM");
map(0x050001, 0x050001).w(FUNC(itech32_state::timekill_intensity_w));
map(0x058000, 0x058001).portr("DIPS").w("watchdog", FUNC(watchdog_timer_device::reset16_w)); map(0x058000, 0x058001).portr("DIPS").w("watchdog", FUNC(watchdog_timer_device::reset16_w));
map(0x060000, 0x060001).w(FUNC(itech32_state::timekill_colora_w)); map(0x060001, 0x060001).w(FUNC(itech32_state::timekill_colora_w));
map(0x068000, 0x068001).w(FUNC(itech32_state::timekill_colorbc_w)); map(0x068001, 0x068001).w(FUNC(itech32_state::timekill_colorbc_w));
map(0x070000, 0x070001).nopw(); /* noisy */ map(0x070000, 0x070001).nopw(); /* noisy */
map(0x078000, 0x078001).w(FUNC(itech32_state::sound_data_w)); map(0x078001, 0x078001).w(FUNC(itech32_state::sound_data_w));
map(0x080000, 0x08007f).rw(FUNC(itech32_state::itech32_video_r), FUNC(itech32_state::itech32_video_w)).share("video"); map(0x080000, 0x08007f).rw(FUNC(itech32_state::video_r), FUNC(itech32_state::video_w)).share("video");
map(0x0a0000, 0x0a0001).w(FUNC(itech32_state::int1_ack_w)); map(0x0a0000, 0x0a0001).w(FUNC(itech32_state::int1_ack_w));
map(0x0c0000, 0x0c7fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x0c0000, 0x0c7fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x100000, 0x17ffff).rom().region("user1", 0).share("main_rom"); map(0x100000, 0x17ffff).rom().region("user1", 0).share("main_rom");
@ -908,13 +900,13 @@ void itech32_state::bloodstm_map(address_map &map)
map(0x180000, 0x180001).portr("P3"); map(0x180000, 0x180001).portr("P3");
map(0x200000, 0x200001).portr("P4").w("watchdog", FUNC(watchdog_timer_device::reset16_w)); map(0x200000, 0x200001).portr("P4").w("watchdog", FUNC(watchdog_timer_device::reset16_w));
map(0x280000, 0x280001).portr("DIPS"); map(0x280000, 0x280001).portr("DIPS");
map(0x300000, 0x300001).w(FUNC(itech32_state::bloodstm_color1_w)); map(0x300001, 0x300001).w(FUNC(itech32_state::color_w<0>));
map(0x380000, 0x380001).w(FUNC(itech32_state::bloodstm_color2_w)); map(0x380001, 0x380001).w(FUNC(itech32_state::color_w<1>));
map(0x400000, 0x400001).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); map(0x400000, 0x400001).w("watchdog", FUNC(watchdog_timer_device::reset16_w));
map(0x480000, 0x480001).w(FUNC(itech32_state::sound_data_w)); map(0x480001, 0x480001).w(FUNC(itech32_state::sound_data_w));
map(0x500000, 0x5000ff).rw(FUNC(itech32_state::bloodstm_video_r), FUNC(itech32_state::bloodstm_video_w)).share("video"); map(0x500000, 0x5000ff).rw(FUNC(itech32_state::bloodstm_video_r), FUNC(itech32_state::bloodstm_video_w)).share("video");
map(0x580000, 0x59ffff).ram().w(FUNC(itech32_state::bloodstm_paletteram_w)).share("palette"); map(0x580000, 0x59ffff).ram().w(FUNC(itech32_state::bloodstm_paletteram_w)).share("palette");
map(0x700000, 0x700001).w(FUNC(itech32_state::bloodstm_plane_w)); map(0x700001, 0x700001).w(FUNC(itech32_state::bloodstm_plane_w));
map(0x780000, 0x780001).portr("EXTRA"); map(0x780000, 0x780001).portr("EXTRA");
map(0x800000, 0x87ffff).mirror(0x780000).rom().region("user1", 0).share("main_rom"); map(0x800000, 0x87ffff).mirror(0x780000).rom().region("user1", 0).share("main_rom");
} }
@ -930,7 +922,7 @@ READ32_MEMBER(itech32_state::test1_r)
if (ACCESSING_BITS_16_23 && !m_written[0x100 + offset*4+1]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+1); if (ACCESSING_BITS_16_23 && !m_written[0x100 + offset*4+1]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+1);
if (ACCESSING_BITS_8_15 && !m_written[0x100 + offset*4+2]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+2); if (ACCESSING_BITS_8_15 && !m_written[0x100 + offset*4+2]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+2);
if (ACCESSING_BITS_0_7 && !m_written[0x100 + offset*4+3]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+3); if (ACCESSING_BITS_0_7 && !m_written[0x100 + offset*4+3]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+3);
return ((uint32_t *)m_main_ram)[0x100/4 + offset]; return ((u32 *)m_main_ram)[0x100/4 + offset];
} }
WRITE32_MEMBER(itech32_state::test1_w) WRITE32_MEMBER(itech32_state::test1_w)
@ -939,7 +931,7 @@ WRITE32_MEMBER(itech32_state::test1_w)
if (ACCESSING_BITS_16_23) m_written[0x100 + offset*4+1] = 1; if (ACCESSING_BITS_16_23) m_written[0x100 + offset*4+1] = 1;
if (ACCESSING_BITS_8_15) m_written[0x100 + offset*4+2] = 1; if (ACCESSING_BITS_8_15) m_written[0x100 + offset*4+2] = 1;
if (ACCESSING_BITS_0_7) m_written[0x100 + offset*4+3] = 1; if (ACCESSING_BITS_0_7) m_written[0x100 + offset*4+3] = 1;
COMBINE_DATA(&((uint32_t *)m_main_ram)[0x100/4 + offset]); COMBINE_DATA(&((u32 *)m_main_ram)[0x100/4 + offset]);
} }
READ32_MEMBER(itech32_state::test2_r) READ32_MEMBER(itech32_state::test2_r)
@ -948,7 +940,7 @@ READ32_MEMBER(itech32_state::test2_r)
if (ACCESSING_BITS_16_23 && !m_written[0xc00 + offset*4+1]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+1); if (ACCESSING_BITS_16_23 && !m_written[0xc00 + offset*4+1]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+1);
if (ACCESSING_BITS_8_15 && !m_written[0xc00 + offset*4+2]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+2); if (ACCESSING_BITS_8_15 && !m_written[0xc00 + offset*4+2]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+2);
if (ACCESSING_BITS_0_7 && !m_written[0xc00 + offset*4+3]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+3); if (ACCESSING_BITS_0_7 && !m_written[0xc00 + offset*4+3]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+3);
return ((uint32_t *)m_main_ram)[0xc00/4 + offset]; return ((u32 *)m_main_ram)[0xc00/4 + offset];
} }
WRITE32_MEMBER(itech32_state::test2_w) WRITE32_MEMBER(itech32_state::test2_w)
@ -957,7 +949,7 @@ WRITE32_MEMBER(itech32_state::test2_w)
if (ACCESSING_BITS_16_23) m_written[0xc00 + offset*4+1] = 1; if (ACCESSING_BITS_16_23) m_written[0xc00 + offset*4+1] = 1;
if (ACCESSING_BITS_8_15) m_written[0xc00 + offset*4+2] = 1; if (ACCESSING_BITS_8_15) m_written[0xc00 + offset*4+2] = 1;
if (ACCESSING_BITS_0_7) m_written[0xc00 + offset*4+3] = 1; if (ACCESSING_BITS_0_7) m_written[0xc00 + offset*4+3] = 1;
COMBINE_DATA(&((uint32_t *)m_main_ram)[0xc00/4 + offset]); COMBINE_DATA(&((u32 *)m_main_ram)[0xc00/4 + offset]);
} }
#endif #endif
@ -970,17 +962,18 @@ map(0x000c00, 0x007fff).mirror(0x40000).rw(FUNC(itech32_state::test2_r), FUNC(it
#endif #endif
map(0x080000, 0x080003).portr("80000"); map(0x080000, 0x080003).portr("80000");
map(0x082000, 0x082003).portr("82000"); map(0x082000, 0x082003).portr("82000");
map(0x084000, 0x084003).rw(FUNC(drivedge_state::sound_data32_r), FUNC(drivedge_state::sound_data32_w)); map(0x084001, 0x084001).rw(FUNC(drivedge_state::sound_return_r), FUNC(drivedge_state::sound_data_w));
// AM_RANGE(0x086000, 0x08623f) AM_RAM -- networking -- first 0x40 bytes = our data, next 0x40*8 bytes = their data, r/w on IRQ2 // AM_RANGE(0x086000, 0x08623f) AM_RAM -- networking -- first 0x40 bytes = our data, next 0x40*8 bytes = their data, r/w on IRQ2
map(0x088000, 0x088003).r(FUNC(drivedge_state::steering_r)); map(0x088000, 0x088001).r(FUNC(drivedge_state::steering_r));
map(0x08a000, 0x08a003).r(FUNC(drivedge_state::gas_r)).nopw(); map(0x08a000, 0x08a001).r(FUNC(drivedge_state::gas_r));
map(0x08a000, 0x08a003).nopw();
map(0x08c000, 0x08c003).portr("8c000"); map(0x08c000, 0x08c003).portr("8c000");
map(0x08e000, 0x08e003).portr("8e000").nopw(); map(0x08e000, 0x08e003).portr("8e000").nopw();
map(0x100000, 0x10000f).w(FUNC(drivedge_state::zbuf_control_w)).share("zctl"); map(0x100000, 0x10000f).w(FUNC(drivedge_state::zbuf_control_w)).share("zctl");
map(0x180000, 0x180003).w(FUNC(drivedge_state::color0_w)); map(0x180001, 0x180001).w(FUNC(drivedge_state::color_w<0>));
map(0x1a0000, 0x1bffff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); map(0x1a0000, 0x1bffff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette");
map(0x1c0000, 0x1c0003).nopw(); map(0x1c0000, 0x1c0003).nopw();
map(0x1e0000, 0x1e0113).rw(FUNC(drivedge_state::itech020_video_r), FUNC(drivedge_state::itech020_video_w)).share("video"); map(0x1e0000, 0x1e0113).rw(FUNC(drivedge_state::bloodstm_video_r), FUNC(drivedge_state::bloodstm_video_w)).share("video");
map(0x1e4000, 0x1e4003).w(FUNC(drivedge_state::tms_reset_assert_w)); map(0x1e4000, 0x1e4003).w(FUNC(drivedge_state::tms_reset_assert_w));
map(0x1ec000, 0x1ec003).w(FUNC(drivedge_state::tms_reset_clear_w)); map(0x1ec000, 0x1ec003).w(FUNC(drivedge_state::tms_reset_clear_w));
map(0x200000, 0x200003).portr("200000"); map(0x200000, 0x200003).portr("200000");
@ -1008,23 +1001,24 @@ void drivedge_state::tms2_map(address_map &map)
void itech32_state::itech020_map(address_map &map) void itech32_state::itech020_map(address_map &map)
{ {
map(0x000000, 0x007fff).ram().share("main_ram"); map(0x000000, 0x007fff).ram().share("main_ram");
map(0x080000, 0x080003).portr("P1").w(FUNC(itech32_state::int1_ack32_w)); map(0x080000, 0x080003).portr("P1").w(FUNC(itech32_state::int1_ack_w));
map(0x100000, 0x100003).portr("P2"); map(0x100000, 0x100003).portr("P2");
map(0x180000, 0x180003).portr("P3"); map(0x180000, 0x180003).portr("P3");
map(0x200000, 0x200003).portr("P4"); map(0x200000, 0x200003).portr("P4");
map(0x280000, 0x280003).portr("DIPS"); map(0x280000, 0x280003).portr("DIPS");
map(0x300000, 0x300003).w(FUNC(itech32_state::itech020_color1_w)); map(0x300003, 0x300003).w(FUNC(itech32_state::color_w<1>));
map(0x380000, 0x380003).w(FUNC(itech32_state::itech020_color2_w)); map(0x380003, 0x380003).w(FUNC(itech32_state::color_w<0>));
map(0x400000, 0x400003).w("watchdog", FUNC(watchdog_timer_device::reset32_w)); map(0x400000, 0x400003).w("watchdog", FUNC(watchdog_timer_device::reset32_w));
map(0x480000, 0x480003).w(FUNC(itech32_state::sound_data32_w)); map(0x480001, 0x480001).w(FUNC(itech32_state::sound_data_w));
map(0x500000, 0x5000ff).rw(FUNC(itech32_state::itech020_video_r), FUNC(itech32_state::itech020_video_w)).share("video"); map(0x500000, 0x5000ff).rw(FUNC(itech32_state::bloodstm_video_r), FUNC(itech32_state::bloodstm_video_w)).share("video");
map(0x578000, 0x57ffff).nopr(); /* touched by protection */ map(0x578000, 0x57ffff).nopr(); /* touched by protection */
map(0x580000, 0x59ffff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); map(0x580000, 0x59ffff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette");
map(0x600000, 0x603fff).ram().share("nvram"); map(0x600000, 0x603fff).ram().share("nvram");
/* ? */ map(0x61ff00, 0x61ffff).nopw(); /* Unknown Writes */ /* ? */ map(0x61ff00, 0x61ffff).nopw(); /* Unknown Writes */
map(0x680000, 0x680003).r(FUNC(itech32_state::itech020_prot_result_r)).nopw(); map(0x680002, 0x680002).r(FUNC(itech32_state::itech020_prot_result_r));
map(0x680000, 0x680003).nopw();
/* ! */ map(0x680800, 0x68083f).readonly().nopw(); /* Serial DUART Channel A/B & Top LED sign - To Do! */ /* ! */ map(0x680800, 0x68083f).readonly().nopw(); /* Serial DUART Channel A/B & Top LED sign - To Do! */
map(0x700000, 0x700003).w(FUNC(itech32_state::itech020_plane_w)); map(0x700002, 0x700002).w(FUNC(itech32_state::itech020_plane_w));
map(0x800000, 0xbfffff).rom().region("user1", 0).share("main_rom"); map(0x800000, 0xbfffff).rom().region("user1", 0).share("main_rom");
} }
@ -1684,7 +1678,7 @@ void itech32_state::base_devices(machine_config &config)
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(VIDEO_CLOCK, 508, 0, 384, 262, 0, 240); // most games configure the screen this way m_screen->set_raw(VIDEO_CLOCK, 508, 0, 384, 262, 0, 240); // most games configure the screen this way
// m_screen->set_raw(VIDEO_CLOCK, 508, 0, 384, 286, 0, 256); // sftm, wcbowl and shufshot configure it this way // m_screen->set_raw(VIDEO_CLOCK, 508, 0, 384, 286, 0, 256); // sftm, wcbowl and shufshot configure it this way
m_screen->set_screen_update(FUNC(itech32_state::screen_update_itech32)); m_screen->set_screen_update(FUNC(itech32_state::screen_update));
m_screen->set_palette(m_palette); m_screen->set_palette(m_palette);
m_screen->screen_vblank().set(FUNC(itech32_state::generate_int1)); m_screen->screen_vblank().set(FUNC(itech32_state::generate_int1));
@ -1738,11 +1732,11 @@ void drivedge_state::drivedge(machine_config &config)
M68EC020(config, m_maincpu, CPU020_CLOCK); M68EC020(config, m_maincpu, CPU020_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &drivedge_state::main_map); m_maincpu->set_addrmap(AS_PROGRAM, &drivedge_state::main_map);
TMS32031(config, m_dsp1, TMS_CLOCK); TMS32031(config, m_dsp[0], TMS_CLOCK);
m_dsp1->set_addrmap(AS_PROGRAM, &drivedge_state::tms1_map); m_dsp[0]->set_addrmap(AS_PROGRAM, &drivedge_state::tms1_map);
TMS32031(config, m_dsp2, TMS_CLOCK); TMS32031(config, m_dsp[1], TMS_CLOCK);
m_dsp2->set_addrmap(AS_PROGRAM, &drivedge_state::tms2_map); m_dsp[1]->set_addrmap(AS_PROGRAM, &drivedge_state::tms2_map);
m_palette->set_format(palette_device::xBGR_888, 32768); m_palette->set_format(palette_device::xBGR_888, 32768);
@ -4454,8 +4448,8 @@ void drivedge_state::driver_init()
m_vram_height = 1024; m_vram_height = 1024;
m_planes = 1; m_planes = 1;
m_dsp1->space(AS_PROGRAM).install_read_handler(0x8382, 0x8382, read32_delegate(FUNC(drivedge_state::tms1_speedup_r),this)); m_dsp[0]->space(AS_PROGRAM).install_read_handler(0x8382, 0x8382, read32_delegate(FUNC(drivedge_state::tms1_speedup_r),this));
m_dsp2->space(AS_PROGRAM).install_read_handler(0x8382, 0x8382, read32_delegate(FUNC(drivedge_state::tms2_speedup_r),this)); m_dsp[1]->space(AS_PROGRAM).install_read_handler(0x8382, 0x8382, read32_delegate(FUNC(drivedge_state::tms2_speedup_r),this));
} }
@ -4471,10 +4465,10 @@ void itech32_state::init_wcbowl()
m_vram_height = 1024; m_vram_height = 1024;
m_planes = 1; m_planes = 1;
m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680001, read16_delegate(FUNC(itech32_state::trackball_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680001, read8smo_delegate(FUNC(itech32_state::trackball_r),this), 0x00ff);
m_maincpu->space(AS_PROGRAM).nop_read(0x578000, 0x57ffff); m_maincpu->space(AS_PROGRAM).nop_read(0x578000, 0x57ffff);
m_maincpu->space(AS_PROGRAM).install_read_handler(0x680080, 0x680081, read16_delegate(FUNC(itech32_state::wcbowl_prot_result_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x680080, 0x680081, read16smo_delegate(FUNC(itech32_state::wcbowl_prot_result_r),this));
m_maincpu->space(AS_PROGRAM).nop_write(0x680080, 0x680081); m_maincpu->space(AS_PROGRAM).nop_write(0x680080, 0x680081);
} }
@ -4491,11 +4485,11 @@ void itech32_state::init_wcbowlj()
m_vram_height = 1024; m_vram_height = 1024;
m_planes = 1; m_planes = 1;
m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680001, read16_delegate(FUNC(itech32_state::trackball_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680001, read8smo_delegate(FUNC(itech32_state::trackball_r),this), 0x00ff);
m_maincpu->space(AS_PROGRAM).install_read_handler(0x680040, 0x680041, read16_delegate(FUNC(itech32_state::trackball_p2_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x680040, 0x680041, read8smo_delegate(FUNC(itech32_state::trackball_p2_r),this), 0x00ff);
m_maincpu->space(AS_PROGRAM).nop_read(0x578000, 0x57ffff); m_maincpu->space(AS_PROGRAM).nop_read(0x578000, 0x57ffff);
m_maincpu->space(AS_PROGRAM).install_read_handler(0x680080, 0x680081, read16_delegate(FUNC(itech32_state::wcbowl_prot_result_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x680080, 0x680081, read16smo_delegate(FUNC(itech32_state::wcbowl_prot_result_r),this));
m_maincpu->space(AS_PROGRAM).nop_write(0x680080, 0x680081); m_maincpu->space(AS_PROGRAM).nop_write(0x680080, 0x680081);
} }
@ -4508,8 +4502,8 @@ void itech32_state::init_sftm_common(int prot_addr)
m_itech020_prot_address = prot_addr; m_itech020_prot_address = prot_addr;
m_maincpu->space(AS_PROGRAM).install_write_handler(0x300000, 0x300003, write32_delegate(FUNC(itech32_state::itech020_color2_w),this)); m_maincpu->space(AS_PROGRAM).install_write_handler(0x300000, 0x300003, write8smo_delegate(FUNC(itech32_state::color_w<0>),this), 0x000000ff);
m_maincpu->space(AS_PROGRAM).install_write_handler(0x380000, 0x380003, write32_delegate(FUNC(itech32_state::itech020_color1_w),this)); m_maincpu->space(AS_PROGRAM).install_write_handler(0x380000, 0x380003, write8smo_delegate(FUNC(itech32_state::color_w<1>),this), 0x000000ff);
} }
@ -4538,10 +4532,10 @@ void itech32_state::init_shuffle_bowl_common(int prot_addr)
m_itech020_prot_address = prot_addr; m_itech020_prot_address = prot_addr;
m_maincpu->space(AS_PROGRAM).install_write_handler(0x300000, 0x300003, write32_delegate(FUNC(itech32_state::itech020_color2_w),this)); m_maincpu->space(AS_PROGRAM).install_write_handler(0x300000, 0x300003, write8smo_delegate(FUNC(itech32_state::color_w<0>),this), 0x000000ff);
m_maincpu->space(AS_PROGRAM).install_write_handler(0x380000, 0x380003, write32_delegate(FUNC(itech32_state::itech020_color1_w),this)); m_maincpu->space(AS_PROGRAM).install_write_handler(0x380000, 0x380003, write8smo_delegate(FUNC(itech32_state::color_w<1>),this), 0x000000ff);
m_maincpu->space(AS_PROGRAM).install_read_handler(0x180800, 0x180803, read32_delegate(FUNC(itech32_state::trackball32_4bit_p1_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x180800, 0x180803, read32smo_delegate(FUNC(itech32_state::trackball32_4bit_p1_r),this));
m_maincpu->space(AS_PROGRAM).install_read_handler(0x181000, 0x181003, read32_delegate(FUNC(itech32_state::trackball32_4bit_p2_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x181000, 0x181003, read32smo_delegate(FUNC(itech32_state::trackball32_4bit_p2_r),this));
} }
@ -4589,7 +4583,7 @@ void itech32_state::init_gt3d()
Hacked versions of this PCB have been found with GT97 Hacked versions of this PCB have been found with GT97
through GTClassic. This is _NOT_ a factory modification through GTClassic. This is _NOT_ a factory modification
*/ */
m_maincpu->space(AS_PROGRAM).install_read_handler(0x200000, 0x200003, read32_delegate(FUNC(itech32_state::trackball32_8bit_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x200000, 0x200003, read16smo_delegate(FUNC(itech32_state::trackball_8bit_r),this), 0x0000ffff);
init_gt_common(); init_gt_common();
} }
@ -4602,8 +4596,8 @@ void itech32_state::init_aama()
board share the same sound CPU code and sample ROMs. board share the same sound CPU code and sample ROMs.
This board has all versions of GT for it, GT3D through GTClassic This board has all versions of GT for it, GT3D through GTClassic
*/ */
m_maincpu->space(AS_PROGRAM).install_read_handler(0x180800, 0x180803, read32_delegate(FUNC(itech32_state::trackball32_4bit_p1_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x180800, 0x180803, read32smo_delegate(FUNC(itech32_state::trackball32_4bit_p1_r),this));
m_maincpu->space(AS_PROGRAM).install_read_handler(0x181000, 0x181003, read32_delegate(FUNC(itech32_state::trackball32_4bit_p2_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x181000, 0x181003, read32smo_delegate(FUNC(itech32_state::trackball32_4bit_p2_r),this));
init_gt_common(); init_gt_common();
} }
@ -4627,7 +4621,7 @@ void itech32_state::init_s_ver()
board: GT97 v1.21S, GT98, GT99, GT2K & GT Classic Versions 1.00S board: GT97 v1.21S, GT98, GT99, GT2K & GT Classic Versions 1.00S
Trackball info is read through 200202 (actually 200203). Trackball info is read through 200202 (actually 200203).
*/ */
m_maincpu->space(AS_PROGRAM).install_read_handler(0x200200, 0x200203, read32_delegate(FUNC(itech32_state::trackball32_4bit_p1_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x200200, 0x200203, read32smo_delegate(FUNC(itech32_state::trackball32_4bit_p1_r),this));
init_gt_common(); init_gt_common();
} }
@ -4641,7 +4635,7 @@ void itech32_state::init_gt3dl()
Player 1 trackball read through 200003 Player 1 trackball read through 200003
Player 2 trackball read through 200002 Player 2 trackball read through 200002
*/ */
m_maincpu->space(AS_PROGRAM).install_read_handler(0x200000, 0x200003, read32_delegate(FUNC(itech32_state::trackball32_4bit_combined_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x200000, 0x200003, read32smo_delegate(FUNC(itech32_state::trackball32_4bit_combined_r),this));
init_gt_common(); init_gt_common();
} }
@ -4649,7 +4643,7 @@ void itech32_state::init_gt3dl()
void itech32_state::init_gt2kp() void itech32_state::init_gt2kp()
{ {
/* a little extra protection */ /* a little extra protection */
m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680003, read32_delegate(FUNC(itech32_state::gt2kp_prot_result_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680003, read32smo_delegate(FUNC(itech32_state::gt2kp_prot_result_r),this));
init_aama(); init_aama();
/* The protection code is: /* The protection code is:
@ -4670,7 +4664,7 @@ Label1 bne.s Label1 ; Infinite loop if result isn't 0x01
void itech32_state::init_gtclasscp() void itech32_state::init_gtclasscp()
{ {
/* a little extra protection */ /* a little extra protection */
m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680003, read32_delegate(FUNC(itech32_state::gtclass_prot_result_r),this)); m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680003, read32smo_delegate(FUNC(itech32_state::gtclass_prot_result_r),this));
init_aama(); init_aama();
/* The protection code is: /* The protection code is:

View File

@ -42,7 +42,9 @@ public:
m_main_ram(*this, "main_ram", 0), m_main_ram(*this, "main_ram", 0),
m_nvram(*this, "nvram", 0), m_nvram(*this, "nvram", 0),
m_video(*this, "video", 0), m_video(*this, "video", 0),
m_main_rom(*this, "main_rom", 0) m_main_rom(*this, "main_rom", 0),
m_grom(*this, "gfx1"),
m_soundbank(*this, "soundbank")
{ } { }
void base_devices(machine_config &config); void base_devices(machine_config &config);
@ -82,21 +84,24 @@ protected:
required_device<ticket_dispenser_device> m_ticket; required_device<ticket_dispenser_device> m_ticket;
optional_device<timekeeper_device> m_timekeeper; optional_device<timekeeper_device> m_timekeeper;
optional_shared_ptr<uint16_t> m_main_ram; optional_shared_ptr<u16> m_main_ram;
optional_shared_ptr<uint16_t> m_nvram; optional_shared_ptr<u16> m_nvram;
optional_shared_ptr<uint16_t> m_video; optional_shared_ptr<u16> m_video;
optional_shared_ptr<uint16_t> m_main_rom; optional_shared_ptr<u16> m_main_rom;
required_region_ptr<u8> m_grom;
required_memory_bank m_soundbank;
virtual void nvram_init(nvram_device &nvram, void *base, size_t length); virtual void nvram_init(nvram_device &nvram, void *base, size_t length);
std::unique_ptr<uint16_t[]> m_videoram; std::unique_ptr<u16[]> m_videoram;
uint8_t m_vint_state; u8 m_vint_state;
uint8_t m_xint_state; u8 m_xint_state;
uint8_t m_qint_state; u8 m_qint_state;
uint8_t m_irq_base; u8 m_irq_base;
uint8_t m_sound_data; u8 m_sound_data;
uint8_t m_sound_return; u8 m_sound_return;
uint8_t m_sound_int_state; u8 m_sound_int_state;
offs_t m_itech020_prot_address; offs_t m_itech020_prot_address;
int m_special_result; int m_special_result;
int m_p1_effx; int m_p1_effx;
@ -107,67 +112,58 @@ protected:
int m_p2_effy; int m_p2_effy;
int m_p2_lastresult; int m_p2_lastresult;
attotime m_p2_lasttime; attotime m_p2_lasttime;
uint8_t m_written[0x8000]; u8 m_written[0x8000];
uint16_t m_xfer_xcount; u16 m_xfer_xcount;
uint16_t m_xfer_ycount; u16 m_xfer_ycount;
uint16_t m_xfer_xcur; u16 m_xfer_xcur;
uint16_t m_xfer_ycur; u16 m_xfer_ycur;
rectangle m_clip_rect; rectangle m_clip_rect;
rectangle m_scaled_clip_rect; rectangle m_scaled_clip_rect;
rectangle m_clip_save; rectangle m_clip_save;
emu_timer *m_scanline_timer; emu_timer *m_scanline_timer;
uint32_t m_grom_bank; u32 m_grom_bank;
uint16_t m_color_latch[2]; u16 m_color_latch[2];
uint8_t m_enable_latch[2]; u8 m_enable_latch[2];
uint16_t *m_videoplane[2]; u16 *m_videoplane[2];
// configuration at init time // configuration at init time
uint8_t m_planes; u8 m_planes;
uint16_t m_vram_height; u16 m_vram_height;
uint32_t m_vram_mask; u32 m_vram_mask;
uint32_t m_vram_xmask; u32 m_vram_xmask;
uint32_t m_vram_ymask; u32 m_vram_ymask;
uint8_t *m_grom_base; u32 m_grom_bank_mask;
uint32_t m_grom_size;
uint32_t m_grom_bank_mask;
DECLARE_WRITE16_MEMBER(int1_ack_w); void int1_ack_w(u16 data);
DECLARE_READ16_MEMBER(trackball_r); u8 trackball_r();
DECLARE_READ16_MEMBER(trackball_p2_r); u8 trackball_p2_r();
DECLARE_READ32_MEMBER(trackball32_8bit_r); u16 trackball_8bit_r();
DECLARE_READ32_MEMBER(trackball32_4bit_p1_r); u32 trackball32_4bit_p1_r();
DECLARE_READ32_MEMBER(trackball32_4bit_p2_r); u32 trackball32_4bit_p2_r();
DECLARE_READ32_MEMBER(trackball32_4bit_combined_r); u32 trackball32_4bit_combined_r();
DECLARE_READ16_MEMBER(wcbowl_prot_result_r); u16 wcbowl_prot_result_r();
DECLARE_READ32_MEMBER(itech020_prot_result_r); u8 itech020_prot_result_r();
DECLARE_READ32_MEMBER(gt2kp_prot_result_r); u32 gt2kp_prot_result_r();
DECLARE_READ32_MEMBER(gtclass_prot_result_r); u32 gtclass_prot_result_r();
DECLARE_WRITE8_MEMBER(sound_bank_w); void sound_bank_w(u8 data);
DECLARE_WRITE16_MEMBER(sound_data_w); void sound_data_w(u8 data);
DECLARE_READ32_MEMBER(sound_data32_r); u8 sound_return_r();
DECLARE_WRITE32_MEMBER(sound_data32_w); u8 sound_data_r();
DECLARE_READ8_MEMBER(sound_data_r); void sound_return_w(u8 data);
DECLARE_WRITE8_MEMBER(sound_return_w); u8 sound_data_buffer_r();
DECLARE_READ8_MEMBER(sound_data_buffer_r); void firq_clear_w(u8 data);
DECLARE_WRITE8_MEMBER(firq_clear_w); void timekill_colora_w(u8 data);
DECLARE_WRITE32_MEMBER(int1_ack32_w); void timekill_colorbc_w(u8 data);
DECLARE_WRITE16_MEMBER(timekill_colora_w); void timekill_intensity_w(u8 data);
DECLARE_WRITE16_MEMBER(timekill_colorbc_w); template<unsigned Layer> void color_w(u8 data);
DECLARE_WRITE16_MEMBER(timekill_intensity_w); void bloodstm_plane_w(u8 data);
DECLARE_WRITE16_MEMBER(bloodstm_color1_w); void itech020_plane_w(u8 data);
DECLARE_WRITE16_MEMBER(bloodstm_color2_w);
DECLARE_WRITE16_MEMBER(bloodstm_plane_w);
DECLARE_WRITE32_MEMBER(itech020_color1_w);
DECLARE_WRITE32_MEMBER(itech020_color2_w);
DECLARE_WRITE32_MEMBER(itech020_plane_w);
DECLARE_WRITE16_MEMBER(bloodstm_paletteram_w); DECLARE_WRITE16_MEMBER(bloodstm_paletteram_w);
DECLARE_WRITE16_MEMBER(itech32_video_w); void video_w(offs_t offset, u16 data, u16 mem_mask = u16(~0));
DECLARE_READ16_MEMBER(itech32_video_r); u16 video_r(offs_t offset);
DECLARE_WRITE16_MEMBER(bloodstm_video_w); void bloodstm_video_w(offs_t offset, u16 data, u16 mem_mask = u16(~0));
DECLARE_READ16_MEMBER(bloodstm_video_r); u16 bloodstm_video_r(offs_t offset);
DECLARE_WRITE32_MEMBER(itech020_video_w); void pia_portb_out(u8 data);
DECLARE_READ32_MEMBER(itech020_video_r);
DECLARE_WRITE8_MEMBER(pia_portb_out);
virtual void machine_start() override; virtual void machine_start() override;
virtual void machine_reset() override; virtual void machine_reset() override;
@ -178,7 +174,7 @@ protected:
void install_timekeeper(); void install_timekeeper();
void init_gt_common(); void init_gt_common();
uint32_t screen_update_itech32(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
WRITE_LINE_MEMBER(generate_int1); WRITE_LINE_MEMBER(generate_int1);
TIMER_CALLBACK_MEMBER(delayed_sound_data_w); TIMER_CALLBACK_MEMBER(delayed_sound_data_w);
TIMER_CALLBACK_MEMBER(scanline_interrupt); TIMER_CALLBACK_MEMBER(scanline_interrupt);
@ -187,14 +183,14 @@ protected:
inline void enable_clipping(); inline void enable_clipping();
virtual void logblit(const char *tag); virtual void logblit(const char *tag);
void update_interrupts(int fast); void update_interrupts(int fast);
void draw_raw(uint16_t *base, uint16_t color); void draw_raw(u16 *base, u16 color);
virtual void command_blit_raw(); virtual void command_blit_raw();
virtual void command_shift_reg(); virtual void command_shift_reg();
inline void draw_rle_fast(uint16_t *base, uint16_t color); inline void draw_rle_fast(u16 *base, u16 color);
inline void draw_rle_fast_xflip(uint16_t *base, uint16_t color); inline void draw_rle_fast_xflip(u16 *base, u16 color);
inline void draw_rle_slow(uint16_t *base, uint16_t color); inline void draw_rle_slow(u16 *base, u16 color);
void draw_rle(uint16_t *base, uint16_t color); void draw_rle(u16 *base, u16 color);
virtual void shiftreg_clear(uint16_t *base, uint16_t *zbase); virtual void shiftreg_clear(u16 *base, u16 *zbase);
void handle_video_command(); void handle_video_command();
void update_interrupts(int vint, int xint, int qint); void update_interrupts(int vint, int xint, int qint);
void bloodstm_map(address_map &map); void bloodstm_map(address_map &map);
@ -209,8 +205,7 @@ class drivedge_state : public itech32_state
public: public:
drivedge_state(const machine_config &mconfig, device_type type, const char *tag) : drivedge_state(const machine_config &mconfig, device_type type, const char *tag) :
itech32_state(mconfig, type, tag), itech32_state(mconfig, type, tag),
m_dsp1(*this, "dsp1"), m_dsp(*this, "dsp%u", 1U),
m_dsp2(*this, "dsp2"),
m_zbuf_control(*this, "zctl"), m_zbuf_control(*this, "zctl"),
m_tms1_boot(*this, "tms1_boot"), m_tms1_boot(*this, "tms1_boot"),
m_tms1_ram(*this, "tms1_ram"), m_tms1_ram(*this, "tms1_ram"),
@ -228,8 +223,8 @@ protected:
virtual void machine_start() override; virtual void machine_start() override;
virtual void machine_reset() override; virtual void machine_reset() override;
DECLARE_READ32_MEMBER(steering_r); u16 steering_r();
DECLARE_READ32_MEMBER(gas_r); u16 gas_r();
DECLARE_READ32_MEMBER(tms1_speedup_r); DECLARE_READ32_MEMBER(tms1_speedup_r);
DECLARE_READ32_MEMBER(tms2_speedup_r); DECLARE_READ32_MEMBER(tms2_speedup_r);
@ -240,10 +235,9 @@ protected:
DECLARE_WRITE32_MEMBER(tms1_trigger_w); DECLARE_WRITE32_MEMBER(tms1_trigger_w);
DECLARE_WRITE32_MEMBER(tms2_trigger_w); DECLARE_WRITE32_MEMBER(tms2_trigger_w);
DECLARE_WRITE32_MEMBER(color0_w); void zbuf_control_w(offs_t offset, u32 data, u32 mem_mask = u32(~0));
DECLARE_WRITE32_MEMBER(zbuf_control_w);
DECLARE_WRITE8_MEMBER(portb_out); void portb_out(u8 data);
DECLARE_WRITE_LINE_MEMBER(turbo_light); DECLARE_WRITE_LINE_MEMBER(turbo_light);
void main_map(address_map &map); void main_map(address_map &map);
@ -252,22 +246,21 @@ protected:
virtual void nvram_init(nvram_device &nvram, void *base, size_t length) override; virtual void nvram_init(nvram_device &nvram, void *base, size_t length) override;
virtual void logblit(const char *tag) override; virtual void logblit(const char *tag) override;
virtual void shiftreg_clear(uint16_t *base, uint16_t *zbase) override; virtual void shiftreg_clear(u16 *base, u16 *zbase) override;
virtual void command_blit_raw() override; virtual void command_blit_raw() override;
virtual void command_shift_reg() override; virtual void command_shift_reg() override;
void draw_raw(uint16_t *base, uint16_t *zbase, uint16_t color); void draw_raw(u16 *base, u16 *zbase, u16 color);
required_device<cpu_device> m_dsp1; required_device_array<cpu_device, 2> m_dsp;
required_device<cpu_device> m_dsp2; required_shared_ptr<u32> m_zbuf_control;
required_shared_ptr<uint32_t> m_zbuf_control; required_shared_ptr<u32> m_tms1_boot;
required_shared_ptr<uint32_t> m_tms1_boot; required_shared_ptr<u32> m_tms1_ram;
required_shared_ptr<uint32_t> m_tms1_ram; required_shared_ptr<u32> m_tms2_ram;
required_shared_ptr<uint32_t> m_tms2_ram;
output_finder<4> m_leds; output_finder<4> m_leds;
required_ioport m_steer; required_ioport m_steer;
required_ioport m_gas; required_ioport m_gas;
uint8_t m_tms_spinning[2]; u8 m_tms_spinning[2];
}; };
#endif // MAME_INCLUDES_ITECH32_H #endif // MAME_INCLUDES_ITECH32_H

View File

@ -10,6 +10,7 @@
#include "emu.h" #include "emu.h"
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "includes/itech32.h" #include "includes/itech32.h"
#include <algorithm>
/************************************* /*************************************
@ -168,8 +169,8 @@ void itech32_state::video_start()
int i; int i;
/* allocate memory */ /* allocate memory */
m_videoram = std::make_unique<uint16_t[]>(VRAM_WIDTH * (m_vram_height + 16) * 2); m_videoram = std::make_unique<u16[]>(VRAM_WIDTH * (m_vram_height + 16) * 2);
memset(m_videoram.get(), 0xff, VRAM_WIDTH * (m_vram_height + 16) * 2 * 2); std::fill_n(&m_videoram[0], VRAM_WIDTH * (m_vram_height + 16) * 2, 0xff);
/* videoplane[0] is the foreground; videoplane[1] is the background */ /* videoplane[0] is the foreground; videoplane[1] is the background */
m_videoplane[0] = &m_videoram[0 * VRAM_WIDTH * (m_vram_height + 16) + 8 * VRAM_WIDTH]; m_videoplane[0] = &m_videoram[0 * VRAM_WIDTH * (m_vram_height + 16) + 8 * VRAM_WIDTH];
@ -185,15 +186,13 @@ void itech32_state::video_start()
m_videoplane[0][i] = m_videoplane[1][i] = 0xff; m_videoplane[0][i] = m_videoplane[1][i] = 0xff;
/* fetch the GROM base */ /* fetch the GROM base */
m_grom_base = memregion("gfx1")->base();
m_grom_size = memregion("gfx1")->bytes();
m_grom_bank = 0; m_grom_bank = 0;
m_grom_bank_mask = m_grom_size >> 24; m_grom_bank_mask = m_grom.length() >> 24;
if (m_grom_bank_mask == 2) if (m_grom_bank_mask == 2)
m_grom_bank_mask = 3; m_grom_bank_mask = 3;
/* reset statics */ /* reset statics */
memset(m_video, 0, 0x80); std::fill_n(&m_video[0], m_video.bytes() >> 1, 0);
m_scanline_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(itech32_state::scanline_interrupt),this)); m_scanline_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(itech32_state::scanline_interrupt),this));
m_enable_latch[0] = 1; m_enable_latch[0] = 1;
@ -217,89 +216,40 @@ void itech32_state::video_start()
* *
*************************************/ *************************************/
WRITE16_MEMBER(itech32_state::timekill_colora_w) void itech32_state::timekill_colora_w(u8 data)
{ {
if (ACCESSING_BITS_0_7) m_enable_latch[0] = (~data >> 5) & 1;
{ m_enable_latch[1] = (~data >> 7) & 1;
m_enable_latch[0] = (~data >> 5) & 1; m_color_latch[0] = (data & 0x0f) << 8;
m_enable_latch[1] = (~data >> 7) & 1;
m_color_latch[0] = (data & 0x0f) << 8;
}
} }
WRITE16_MEMBER(itech32_state::timekill_colorbc_w) void itech32_state::timekill_colorbc_w(u8 data)
{ {
if (ACCESSING_BITS_0_7) m_color_latch[1] = ((data & 0xf0) << 4) | 0x1000;
m_color_latch[1] = ((data & 0xf0) << 4) | 0x1000;
} }
WRITE16_MEMBER(itech32_state::timekill_intensity_w) void itech32_state::timekill_intensity_w(u8 data)
{ {
if (ACCESSING_BITS_0_7) double intensity = (double)(data & 0xff) / (double)0x60;
{ for (int i = 0; i < 8192; i++)
double intensity = (double)(data & 0xff) / (double)0x60; m_palette->set_pen_contrast(i, intensity);
int i;
for (i = 0; i < 8192; i++)
m_palette->set_pen_contrast(i, intensity);
}
} }
WRITE16_MEMBER(itech32_state::bloodstm_color1_w) void itech32_state::bloodstm_plane_w(u8 data)
{ {
if (ACCESSING_BITS_0_7) m_enable_latch[0] = (~data >> 1) & 1;
m_color_latch[0] = (data & 0x7f) << 8; m_enable_latch[1] = (~data >> 2) & 1;
} }
WRITE16_MEMBER(itech32_state::bloodstm_color2_w) void itech32_state::itech020_plane_w(u8 data)
{ {
if (ACCESSING_BITS_0_7) m_enable_latch[0] = (~data >> 1) & 1;
m_color_latch[1] = (data & 0x7f) << 8; m_enable_latch[1] = (~data >> 2) & 1;
} m_grom_bank = ((data >> 6) & m_grom_bank_mask) << 24;
WRITE16_MEMBER(itech32_state::bloodstm_plane_w)
{
if (ACCESSING_BITS_0_7)
{
m_enable_latch[0] = (~data >> 1) & 1;
m_enable_latch[1] = (~data >> 2) & 1;
}
}
WRITE32_MEMBER(drivedge_state::color0_w)
{
if (ACCESSING_BITS_16_23)
m_color_latch[0] = ((data >> 16) & 0x7f) << 8;
}
WRITE32_MEMBER(itech32_state::itech020_color1_w)
{
if (ACCESSING_BITS_0_7)
m_color_latch[1] = (data & 0x7f) << 8;
}
WRITE32_MEMBER(itech32_state::itech020_color2_w)
{
if (ACCESSING_BITS_0_7)
m_color_latch[0] = (data & 0x7f) << 8;
}
WRITE32_MEMBER(itech32_state::itech020_plane_w)
{
if (ACCESSING_BITS_8_15)
{
m_enable_latch[0] = (~data >> 9) & 1;
m_enable_latch[1] = (~data >> 10) & 1;
m_grom_bank = ((data >> 14) & m_grom_bank_mask) << 24;
}
} }
@ -432,9 +382,9 @@ TIMER_CALLBACK_MEMBER(itech32_state::scanline_interrupt)
* *
*************************************/ *************************************/
void itech32_state::draw_raw(uint16_t *base, uint16_t color) void itech32_state::draw_raw(u16 *base, u16 color)
{ {
uint8_t *src = &m_grom_base[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom_size]; u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()];
int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1;
int width = VIDEO_TRANSFER_WIDTH << 8; int width = VIDEO_TRANSFER_WIDTH << 8;
int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT) << 8; int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT) << 8;
@ -463,7 +413,7 @@ void itech32_state::draw_raw(uint16_t *base, uint16_t color)
/* loop over Y in src pixels */ /* loop over Y in src pixels */
for (y = 0; y < height; y += ysrcstep, sy += ydststep) for (y = 0; y < height; y += ysrcstep, sy += ydststep)
{ {
uint8_t *rowsrc = &src[(y >> 8) * (width >> 8)]; u8 *rowsrc = &src[(y >> 8) * (width >> 8)];
/* simpler case: VIDEO_YSTEP_PER_X is zero */ /* simpler case: VIDEO_YSTEP_PER_X is zero */
if (VIDEO_YSTEP_PER_X == 0) if (VIDEO_YSTEP_PER_X == 0)
@ -471,7 +421,7 @@ void itech32_state::draw_raw(uint16_t *base, uint16_t color)
/* clip in the Y direction */ /* clip in the Y direction */
if (sy >= m_scaled_clip_rect.min_y && sy < m_scaled_clip_rect.max_y) if (sy >= m_scaled_clip_rect.min_y && sy < m_scaled_clip_rect.max_y)
{ {
uint32_t dstoffs; u32 dstoffs;
/* direction matters here */ /* direction matters here */
sx = startx; sx = startx;
@ -540,9 +490,9 @@ void itech32_state::draw_raw(uint16_t *base, uint16_t color)
} }
void drivedge_state::draw_raw(uint16_t *base, uint16_t *zbase, uint16_t color) void drivedge_state::draw_raw(u16 *base, u16 *zbase, u16 color)
{ {
uint8_t *src = &m_grom_base[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom_size]; u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()];
int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1;
int width = VIDEO_TRANSFER_WIDTH << 8; int width = VIDEO_TRANSFER_WIDTH << 8;
int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT) << 8; int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT) << 8;
@ -574,7 +524,7 @@ void drivedge_state::draw_raw(uint16_t *base, uint16_t *zbase, uint16_t color)
/* loop over Y in src pixels */ /* loop over Y in src pixels */
for (y = 0; y < height; y += ysrcstep, sy += ydststep) for (y = 0; y < height; y += ysrcstep, sy += ydststep)
{ {
uint8_t *rowsrc = src + (srcdelta >> 8); u8 *rowsrc = src + (srcdelta >> 8);
/* in the polygon case, we don't factor in the Y */ /* in the polygon case, we don't factor in the Y */
if (VIDEO_TRANSFER_FLAGS != 0x5490) if (VIDEO_TRANSFER_FLAGS != 0x5490)
@ -588,7 +538,7 @@ void drivedge_state::draw_raw(uint16_t *base, uint16_t *zbase, uint16_t color)
/* clip in the Y direction */ /* clip in the Y direction */
if (sy >= m_scaled_clip_rect.min_y && sy < m_scaled_clip_rect.max_y) if (sy >= m_scaled_clip_rect.min_y && sy < m_scaled_clip_rect.max_y)
{ {
uint32_t dstoffs, zbufoffs; u32 dstoffs, zbufoffs;
int32_t z = z0; int32_t z = z0;
/* direction matters here */ /* direction matters here */
@ -721,7 +671,7 @@ void drivedge_state::draw_raw(uint16_t *base, uint16_t *zbase, uint16_t color)
if (m_scaled_clip_rect.contains(sx, ty)) if (m_scaled_clip_rect.contains(sx, ty))
{ {
int pixel = rowsrc[x >> 8]; int pixel = rowsrc[x >> 8];
uint16_t *zbuf = &zbase[compute_safe_address(sx >> 8, ty >> 8)]; u16 *zbuf = &zbase[compute_safe_address(sx >> 8, ty >> 8)];
if (pixel != transparent_pen && zmatch == (*zbuf & (0x1f << 11))) if (pixel != transparent_pen && zmatch == (*zbuf & (0x1f << 11)))
{ {
base[compute_safe_address(sx >> 8, ty >> 8)] = pixel | color; base[compute_safe_address(sx >> 8, ty >> 8)] = pixel | color;
@ -736,7 +686,7 @@ void drivedge_state::draw_raw(uint16_t *base, uint16_t *zbase, uint16_t color)
if (m_scaled_clip_rect.contains(sx, ty)) if (m_scaled_clip_rect.contains(sx, ty))
{ {
int pixel = rowsrc[x >> 8]; int pixel = rowsrc[x >> 8];
uint16_t *zbuf = &zbase[compute_safe_address(sx >> 8, ty >> 8)]; u16 *zbuf = &zbase[compute_safe_address(sx >> 8, ty >> 8)];
if (pixel != transparent_pen && ((z >> 8) <= (*zbuf & 0x7ff))) if (pixel != transparent_pen && ((z >> 8) <= (*zbuf & 0x7ff)))
{ {
base[compute_safe_address(sx >> 8, ty >> 8)] = pixel | color; base[compute_safe_address(sx >> 8, ty >> 8)] = pixel | color;
@ -822,9 +772,9 @@ do { \
* *
*************************************/ *************************************/
inline void itech32_state::draw_rle_fast(uint16_t *base, uint16_t color) inline void itech32_state::draw_rle_fast(u16 *base, u16 color)
{ {
uint8_t *src = &m_grom_base[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom_size]; u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()];
int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1;
int width = VIDEO_TRANSFER_WIDTH; int width = VIDEO_TRANSFER_WIDTH;
int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT);
@ -849,7 +799,7 @@ inline void itech32_state::draw_rle_fast(uint16_t *base, uint16_t color)
/* loop over Y in src pixels */ /* loop over Y in src pixels */
for (y = 0; y < height; y++, sy += ydststep) for (y = 0; y < height; y++, sy += ydststep)
{ {
uint32_t dstoffs; u32 dstoffs;
/* clip in the Y direction */ /* clip in the Y direction */
if (sy < m_scaled_clip_rect.min_y || sy >= m_scaled_clip_rect.max_y) if (sy < m_scaled_clip_rect.min_y || sy >= m_scaled_clip_rect.max_y)
@ -899,9 +849,9 @@ inline void itech32_state::draw_rle_fast(uint16_t *base, uint16_t color)
} }
inline void itech32_state::draw_rle_fast_xflip(uint16_t *base, uint16_t color) inline void itech32_state::draw_rle_fast_xflip(u16 *base, u16 color)
{ {
uint8_t *src = &m_grom_base[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom_size]; u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()];
int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1;
int width = VIDEO_TRANSFER_WIDTH; int width = VIDEO_TRANSFER_WIDTH;
int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT);
@ -926,7 +876,7 @@ inline void itech32_state::draw_rle_fast_xflip(uint16_t *base, uint16_t color)
/* loop over Y in src pixels */ /* loop over Y in src pixels */
for (y = 0; y < height; y++, sy += ydststep) for (y = 0; y < height; y++, sy += ydststep)
{ {
uint32_t dstoffs; u32 dstoffs;
/* clip in the Y direction */ /* clip in the Y direction */
if (sy < m_scaled_clip_rect.min_y || sy >= m_scaled_clip_rect.max_y) if (sy < m_scaled_clip_rect.min_y || sy >= m_scaled_clip_rect.max_y)
@ -983,9 +933,9 @@ inline void itech32_state::draw_rle_fast_xflip(uint16_t *base, uint16_t color)
* *
*************************************/ *************************************/
inline void itech32_state::draw_rle_slow(uint16_t *base, uint16_t color) inline void itech32_state::draw_rle_slow(u16 *base, u16 color)
{ {
uint8_t *src = &m_grom_base[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom_size]; u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()];
int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1;
int width = VIDEO_TRANSFER_WIDTH; int width = VIDEO_TRANSFER_WIDTH;
int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT);
@ -1008,7 +958,7 @@ inline void itech32_state::draw_rle_slow(uint16_t *base, uint16_t color)
/* loop over Y in src pixels */ /* loop over Y in src pixels */
for (y = 0; y < height; y++, sy += ydststep) for (y = 0; y < height; y++, sy += ydststep)
{ {
uint32_t dstoffs; u32 dstoffs;
/* clip in the Y direction */ /* clip in the Y direction */
if (sy < m_scaled_clip_rect.min_y || sy >= m_scaled_clip_rect.max_y) if (sy < m_scaled_clip_rect.min_y || sy >= m_scaled_clip_rect.max_y)
@ -1061,7 +1011,7 @@ inline void itech32_state::draw_rle_slow(uint16_t *base, uint16_t color)
void itech32_state::draw_rle(uint16_t *base, uint16_t color) void itech32_state::draw_rle(u16 *base, u16 color)
{ {
/* adjust for (lack of) clipping */ /* adjust for (lack of) clipping */
if (!(VIDEO_TRANSFER_FLAGS & XFERFLAG_CLIP)) if (!(VIDEO_TRANSFER_FLAGS & XFERFLAG_CLIP))
@ -1090,7 +1040,7 @@ void itech32_state::draw_rle(uint16_t *base, uint16_t color)
* *
*************************************/ *************************************/
void itech32_state::shiftreg_clear(uint16_t *base, uint16_t *zbase) void itech32_state::shiftreg_clear(u16 *base, u16 *zbase)
{ {
const int ydir = (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ? -1 : 1; const int ydir = (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ? -1 : 1;
const int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); const int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT);
@ -1098,7 +1048,7 @@ void itech32_state::shiftreg_clear(uint16_t *base, uint16_t *zbase)
int sy = VIDEO_TRANSFER_Y & 0xfff; int sy = VIDEO_TRANSFER_Y & 0xfff;
/* first line is the source */ /* first line is the source */
uint16_t *src = &base[compute_safe_address(sx, sy)]; u16 *src = &base[compute_safe_address(sx, sy)];
sy += ydir; sy += ydir;
/* loop over height */ /* loop over height */
@ -1109,7 +1059,7 @@ void itech32_state::shiftreg_clear(uint16_t *base, uint16_t *zbase)
} }
} }
void drivedge_state::shiftreg_clear(uint16_t *base, uint16_t *zbase) void drivedge_state::shiftreg_clear(u16 *base, u16 *zbase)
{ {
int ydir = (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ? -1 : 1; int ydir = (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ? -1 : 1;
int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT);
@ -1117,7 +1067,7 @@ void drivedge_state::shiftreg_clear(uint16_t *base, uint16_t *zbase)
int sy = VIDEO_TRANSFER_Y & 0xfff; int sy = VIDEO_TRANSFER_Y & 0xfff;
/* first line is the source */ /* first line is the source */
uint16_t *src = &base[compute_safe_address(sx, sy)]; u16 *src = &base[compute_safe_address(sx, sy)];
sy += ydir; sy += ydir;
/* loop over height */ /* loop over height */
@ -1126,8 +1076,8 @@ void drivedge_state::shiftreg_clear(uint16_t *base, uint16_t *zbase)
memcpy(&base[compute_safe_address(sx, sy)], src, 512*2); memcpy(&base[compute_safe_address(sx, sy)], src, 512*2);
if (zbase) if (zbase)
{ {
uint16_t zval = ((m_zbuf_control[2] >> 8) & 0x7ff) | ((m_zbuf_control[2] & 0x1f) << 11); u16 zval = ((m_zbuf_control[2] >> 8) & 0x7ff) | ((m_zbuf_control[2] & 0x1f) << 11);
uint16_t *dst = &zbase[compute_safe_address(sx, sy)]; u16 *dst = &zbase[compute_safe_address(sx, sy)];
int x; int x;
for (x = 0; x < 512; x++) for (x = 0; x < 512; x++)
*dst++ = zval; *dst++ = zval;
@ -1246,7 +1196,7 @@ void drivedge_state::command_shift_reg()
* *
*************************************/ *************************************/
WRITE16_MEMBER(itech32_state::itech32_video_w) void itech32_state::video_w(offs_t offset, u16 data, u16 mem_mask)
{ {
rectangle visarea; rectangle visarea;
@ -1349,7 +1299,7 @@ WRITE16_MEMBER(itech32_state::itech32_video_w)
} }
READ16_MEMBER(itech32_state::itech32_video_r) u16 itech32_state::video_r(offs_t offset)
{ {
if (offset == 0) if (offset == 0)
{ {
@ -1371,67 +1321,50 @@ READ16_MEMBER(itech32_state::itech32_video_r)
* *
*************************************/ *************************************/
WRITE16_MEMBER(itech32_state::bloodstm_video_w) void itech32_state::bloodstm_video_w(offs_t offset, u16 data, u16 mem_mask)
{ {
itech32_video_w(space, offset / 2, data, mem_mask); video_w(offset / 2, data, mem_mask);
} }
READ16_MEMBER(itech32_state::bloodstm_video_r) u16 itech32_state::bloodstm_video_r(offs_t offset)
{ {
return itech32_video_r(space, offset / 2, mem_mask); return video_r(offset / 2);
} }
WRITE32_MEMBER(itech32_state::itech020_video_w) void drivedge_state::zbuf_control_w(offs_t offset, u32 data, u32 mem_mask)
{
if (ACCESSING_BITS_16_31)
itech32_video_w(space, offset, data >> 16, mem_mask >> 16);
else
itech32_video_w(space, offset, data, mem_mask);
}
WRITE32_MEMBER(drivedge_state::zbuf_control_w)
{ {
COMBINE_DATA(&m_zbuf_control[offset]); COMBINE_DATA(&m_zbuf_control[offset]);
} }
READ32_MEMBER(itech32_state::itech020_video_r)
{
int result = itech32_video_r(space, offset, mem_mask);
return (result << 16) | result;
}
/************************************* /*************************************
* *
* Main refresh * Main refresh
* *
*************************************/ *************************************/
uint32_t itech32_state::screen_update_itech32(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) u32 itech32_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
int y; int y;
/* loop over height */ /* loop over height */
for (y = cliprect.min_y; y <= cliprect.max_y; y++) for (y = cliprect.min_y; y <= cliprect.max_y; y++)
{ {
uint16_t *src1 = &m_videoplane[0][compute_safe_address(VIDEO_DISPLAY_XORIGIN1, VIDEO_DISPLAY_YORIGIN1 + y)]; u16 *src1 = &m_videoplane[0][compute_safe_address(VIDEO_DISPLAY_XORIGIN1, VIDEO_DISPLAY_YORIGIN1 + y)];
/* handle multi-plane case */ /* handle multi-plane case */
if (m_planes > 1) if (m_planes > 1)
{ {
uint16_t *src2 = &m_videoplane[1][compute_safe_address(VIDEO_DISPLAY_XORIGIN2 + VIDEO_DISPLAY_XSCROLL2, VIDEO_DISPLAY_YORIGIN2 + VIDEO_DISPLAY_YSCROLL2 + y)]; u16 *src2 = &m_videoplane[1][compute_safe_address(VIDEO_DISPLAY_XORIGIN2 + VIDEO_DISPLAY_XSCROLL2, VIDEO_DISPLAY_YORIGIN2 + VIDEO_DISPLAY_YSCROLL2 + y)];
uint16_t scanline[384]; u16 scanline[384];
int x; int x;
/* blend the pixels in the scanline; color xxFF is transparent */ /* blend the pixels in the scanline; color xxFF is transparent */
for (x = cliprect.min_x; x <= cliprect.max_x; x++) for (x = cliprect.min_x; x <= cliprect.max_x; x++)
{ {
uint16_t pixel = src1[x]; u16 pixel = src1[x];
if ((pixel & 0xff) == 0xff) if ((pixel & 0xff) == 0xff)
pixel = src2[x]; pixel = src2[x];
scanline[x] = pixel; scanline[x] = pixel;