diff options
Diffstat (limited to 'src/mame/machine/midxunit.cpp')
-rw-r--r-- | src/mame/machine/midxunit.cpp | 87 |
1 files changed, 32 insertions, 55 deletions
diff --git a/src/mame/machine/midxunit.cpp b/src/mame/machine/midxunit.cpp index 2bcda95e389..23464c614c7 100644 --- a/src/mame/machine/midxunit.cpp +++ b/src/mame/machine/midxunit.cpp @@ -7,12 +7,7 @@ **************************************************************************/ #include "emu.h" -#include "cpu/tms34010/tms34010.h" -#include "cpu/m6809/m6809.h" -#include "audio/dcs.h" -#include "includes/midtunit.h" #include "includes/midxunit.h" -#include "midwayic.h" #define LOG_IO (1 << 0) #define LOG_UART (1 << 1) @@ -29,14 +24,14 @@ * *************************************/ -uint16_t midxunit_state::midxunit_cmos_r(offs_t offset) +uint8_t midxunit_state::midxunit_cmos_r(offs_t offset) { - return m_nvram[offset]; + return m_nvram_data[offset]; } -void midxunit_state::midxunit_cmos_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void midxunit_state::midxunit_cmos_w(offs_t offset, uint8_t data) { - COMBINE_DATA(m_nvram+offset); + m_nvram_data[offset] = data; } @@ -127,14 +122,9 @@ WRITE_LINE_MEMBER(midxunit_state::midxunit_dcs_output_full) } -uint16_t midxunit_state::midxunit_uart_r(offs_t offset) +uint8_t midxunit_state::midxunit_uart_r(offs_t offset) { - int result = 0; - - /* convert to a byte offset */ - if (offset & 1) - return 0; - offset /= 2; + uint8_t result = 0; /* switch off the offset */ switch (offset) @@ -152,7 +142,7 @@ uint16_t midxunit_state::midxunit_uart_r(offs_t offset) /* non-loopback case: bit 0 means data ready, bit 2 means ok to send */ else { - int temp = midxunit_sound_state_r(); + int temp = m_dcs->control_r(); result |= (temp & 0x800) >> 9; result |= (~temp & 0x400) >> 10; machine().scheduler().synchronize(); @@ -167,7 +157,11 @@ uint16_t midxunit_state::midxunit_uart_r(offs_t offset) /* non-loopback case: read from the DCS system */ else - result = midxunit_sound_r(); + { + LOGMASKED(LOG_SOUND, "%08X:Sound read\n", m_maincpu->pc()); + + result = m_dcs->data_r(); + } break; case 5: /* register 5 seems to be like 3, but with in/out swapped */ @@ -179,7 +173,7 @@ uint16_t midxunit_state::midxunit_uart_r(offs_t offset) /* non-loopback case: bit 0 means data ready, bit 2 means ok to send */ else { - int temp = midxunit_sound_state_r(); + int temp = m_dcs->control_r(); result |= (temp & 0x800) >> 11; result |= (~temp & 0x400) >> 8; machine().scheduler().synchronize(); @@ -196,14 +190,8 @@ uint16_t midxunit_state::midxunit_uart_r(offs_t offset) } -void midxunit_state::midxunit_uart_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void midxunit_state::midxunit_uart_w(offs_t offset, uint8_t data) { - /* convert to a byte offset, ignoring MSB writes */ - if ((offset & 1) || !ACCESSING_BITS_0_7) - return; - offset /= 2; - data &= 0xff; - /* switch off the offset */ switch (offset) { @@ -215,7 +203,7 @@ void midxunit_state::midxunit_uart_w(offs_t offset, uint16_t data, uint16_t mem_ /* non-loopback case: send to the DCS system */ else - midxunit_sound_w(0, data, mem_mask); + m_dcs->data_w(data); break; case 5: /* register 5 write seems to reset things */ @@ -253,12 +241,15 @@ void midxunit_state::machine_start() m_gun_recoil.resolve(); m_gun_led.resolve(); + m_nvram_data = std::make_unique<uint8_t[]>(0x2000); + m_nvram->set_base(m_nvram_data.get(), 0x2000); + save_item(NAME(m_cmos_write_enable)); save_item(NAME(m_iodata)); - save_item(NAME(m_ioshuffle)); save_item(NAME(m_uart)); save_item(NAME(m_security_bits)); save_item(NAME(m_adc_int)); + save_pointer(NAME(m_nvram_data), 0x2000); } void midxunit_state::machine_reset() @@ -269,10 +260,6 @@ void midxunit_state::machine_reset() m_security_bits = 0; - /* reset I/O shuffling */ - for (int i = 0; i < 16; i++) - m_ioshuffle[i] = i % 8; - m_dcs->set_io_callbacks(write_line_delegate(*this, FUNC(midxunit_state::midxunit_dcs_output_full)), write_line_delegate(*this)); } @@ -314,37 +301,27 @@ void midxunit_state::midxunit_security_clock_w(offs_t offset, uint16_t data, uin /************************************* * - * Sound write handlers + * DMA registers (inverted word select) * *************************************/ -uint16_t midxunit_state::midxunit_sound_r() +uint32_t midxunit_state::midxunit_dma_r(offs_t offset, uint32_t mem_mask) { - LOGMASKED(LOG_SOUND, "%08X:Sound read\n", m_maincpu->pc()); - - return m_dcs->data_r() & 0xff; -} + uint32_t result = 0; + if (ACCESSING_BITS_0_15) + result |= uint32_t(m_video->midtunit_dma_r(offset * 2 + 1)) << 16; + if (ACCESSING_BITS_16_31) + result |= m_video->midtunit_dma_r(offset * 2); -uint16_t midxunit_state::midxunit_sound_state_r() -{ - return m_dcs->control_r(); + return result; } -void midxunit_state::midxunit_sound_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void midxunit_state::midxunit_dma_w(offs_t offset, uint32_t data, uint32_t mem_mask) { - /* check for out-of-bounds accesses */ - if (offset) - { - LOGMASKED(LOG_SOUND | LOG_UNKNOWN, "%s: Unexpected write to sound (hi) = %04X\n", machine().describe_context(), data); - return; - } - - /* call through based on the sound type */ - if (ACCESSING_BITS_0_7) - { - LOGMASKED(LOG_SOUND, "%s: Sound write = %04X\n", machine().describe_context(), data); - m_dcs->data_w(data & 0xff); - } + if (ACCESSING_BITS_0_15) + m_video->midtunit_dma_w(offset * 2 + 1, data >> 16); + if (ACCESSING_BITS_16_31) + m_video->midtunit_dma_w(offset * 2, data & 0xffff); } |