diff options
Diffstat (limited to 'src/mame/machine/cdislavehle.cpp')
-rw-r--r-- | src/mame/machine/cdislavehle.cpp | 523 |
1 files changed, 0 insertions, 523 deletions
diff --git a/src/mame/machine/cdislavehle.cpp b/src/mame/machine/cdislavehle.cpp deleted file mode 100644 index c8e01d67a10..00000000000 --- a/src/mame/machine/cdislavehle.cpp +++ /dev/null @@ -1,523 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -/****************************************************************************** - - CD-i Mono-I SLAVE MCU simulation - ------------------- - -******************************************************************************* - -STATUS: -- Just enough for the Mono-I CD-i board to work somewhat properly. - -TODO: -- Proper LLE. - -*******************************************************************************/ - -#include "emu.h" -#include "machine/cdislavehle.h" - -#define LOG_IRQS (1 << 0) -#define LOG_COMMANDS (1 << 1) -#define LOG_READS (1 << 2) -#define LOG_WRITES (1 << 3) -#define LOG_UNKNOWNS (1 << 4) -#define LOG_ALL (LOG_IRQS | LOG_COMMANDS | LOG_READS | LOG_WRITES | LOG_UNKNOWNS) - -#define VERBOSE (0) -#include "logmacro.h" - -// device type definition -DEFINE_DEVICE_TYPE(CDI_SLAVE_HLE, cdislave_hle_device, "cdislavehle", "CD-i Mono-I Slave HLE") - - -//************************************************************************** -// MEMBER FUNCTIONS -//************************************************************************** - -TIMER_CALLBACK_MEMBER( cdislave_hle_device::trigger_readback_int ) -{ - LOGMASKED(LOG_IRQS, "Asserting IRQ2\n"); - m_int_callback(ASSERT_LINE); - m_interrupt_timer->adjust(attotime::never); -} - -void cdislave_hle_device::prepare_readback(const attotime &delay, uint8_t channel, uint8_t count, uint8_t data0, uint8_t data1, uint8_t data2, uint8_t data3, uint8_t cmd) -{ - m_channel[channel].m_out_index = 0; - m_channel[channel].m_out_count = count; - m_channel[channel].m_out_buf[0] = data0; - m_channel[channel].m_out_buf[1] = data1; - m_channel[channel].m_out_buf[2] = data2; - m_channel[channel].m_out_buf[3] = data3; - m_channel[channel].m_out_cmd = cmd; - - m_interrupt_timer->adjust(delay); -} - -void cdislave_hle_device::perform_mouse_update() -{ - uint16_t x = m_mousex->read(); - uint16_t y = m_mousey->read(); - uint8_t buttons = m_mousebtn->read(); - - uint16_t old_mouse_x = m_real_mouse_x; - uint16_t old_mouse_y = m_real_mouse_y; - - if (m_real_mouse_x == 0xffff) - { - old_mouse_x = x & 0x3ff; - old_mouse_y = y & 0x3ff; - } - - m_real_mouse_x = x & 0x3ff; - m_real_mouse_y = y & 0x3ff; - - m_fake_mouse_x += (m_real_mouse_x - old_mouse_x); - m_fake_mouse_y += (m_real_mouse_y - old_mouse_y); - - while (m_fake_mouse_x > 0x3ff) - { - m_fake_mouse_x += 0x400; - } - - while (m_fake_mouse_y > 0x3ff) - { - m_fake_mouse_y += 0x400; - } - - x = m_fake_mouse_x; - y = m_fake_mouse_y; - - if (m_polling_active) - { - prepare_readback(attotime::zero, 0, 4, ((x & 0x380) >> 7) | (buttons << 4), x & 0x7f, (y & 0x380) >> 7, y & 0x7f, 0xf7); - } -} - -INPUT_CHANGED_MEMBER( cdislave_hle_device::mouse_update ) -{ - perform_mouse_update(); -} - -static INPUT_PORTS_START(cdislave_mouse) - PORT_START("MOUSEX") - PORT_BIT(0x3ff, 0x000, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0x3ff) PORT_KEYDELTA(2) PORT_CHANGED_MEMBER(DEVICE_SELF, cdislave_hle_device, mouse_update, 0) - - PORT_START("MOUSEY") - PORT_BIT(0x3ff, 0x000, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0x3ff) PORT_KEYDELTA(2) PORT_CHANGED_MEMBER(DEVICE_SELF, cdislave_hle_device, mouse_update, 0) - - PORT_START("MOUSEBTN") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("Mouse Button 1") PORT_CHANGED_MEMBER(DEVICE_SELF, cdislave_hle_device, mouse_update, 0) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Mouse Button 2") PORT_CHANGED_MEMBER(DEVICE_SELF, cdislave_hle_device, mouse_update, 0) - PORT_BIT(0xfc, IP_ACTIVE_HIGH, IPT_UNUSED) -INPUT_PORTS_END - -ioport_constructor cdislave_hle_device::device_input_ports() const -{ - return INPUT_PORTS_NAME(cdislave_mouse); -} - -uint16_t cdislave_hle_device::slave_r(offs_t offset) -{ - if (m_channel[offset].m_out_count) - { - uint8_t ret = m_channel[offset].m_out_buf[m_channel[offset].m_out_index]; - LOGMASKED(LOG_READS, "%s: slave_r: Channel %d: %d, %02x\n", machine().describe_context(), offset, m_channel[offset].m_out_index, ret); - if (m_channel[offset].m_out_index == 0) - { - switch (m_channel[offset].m_out_cmd) - { - case 0xb0: - case 0xb1: - case 0xf0: - case 0xf3: - case 0xf4: - case 0xf7: - LOGMASKED(LOG_IRQS, "slave_r: De-asserting IRQ2\n"); - m_int_callback(CLEAR_LINE); - break; - } - } - m_channel[offset].m_out_index++; - m_channel[offset].m_out_count--; - if (!m_channel[offset].m_out_count) - { - m_channel[offset].m_out_index = 0; - m_channel[offset].m_out_cmd = 0; - memset(m_channel[offset].m_out_buf, 0, 4); - } - return ret; - } - LOGMASKED(LOG_READS, "slave_r: Channel %d: %d (nothing to output)\n", offset, m_channel[offset].m_out_index); - return 0xff; -} - -void cdislave_hle_device::set_mouse_position() -{ -// uint16_t x, y; - - //printf( "Set mouse position: %02x %02x %02x\n", m_in_buf[0], m_in_buf[1], m_in_buf[2] ); - - m_fake_mouse_y = ((m_in_buf[1] & 0x0f) << 6) | (m_in_buf[0] & 0x3f); - m_fake_mouse_x = ((m_in_buf[1] & 0x70) << 3) | m_in_buf[2]; - -// x = m_fake_mouse_x; -// y = m_fake_mouse_y; - - if (m_polling_active) - { - //prepare_readback(attotime::zero, 0, 4, (x & 0x380) >> 7, x & 0x7f, (y & 0x380) >> 7, y & 0x7f, 0xf7); - } -} - -void cdislave_hle_device::slave_w(offs_t offset, uint16_t data) -{ - LOGMASKED(LOG_WRITES, "slave_w: Channel %d: %d = %02x\n", offset, m_in_index, data & 0x00ff); - switch (offset) - { - case 0: - if (m_in_index) - { - m_in_buf[m_in_index] = data & 0x00ff; - m_in_index++; - if (m_in_index == m_in_count) - { - switch (m_in_buf[0]) - { - case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: - case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf: - case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7: - case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf: - case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: - case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef: - case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: - case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: // Update Mouse Position - set_mouse_position(); - memset(m_in_buf, 0, 17); - m_in_index = 0; - m_in_count = 0; - break; - } - } - } - else - { - m_in_buf[m_in_index] = data & 0x00ff; - m_in_index++; - switch (data & 0x00ff) - { - case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: - case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf: - case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7: - case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf: - case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: - case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef: - case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: - case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: - LOGMASKED(LOG_COMMANDS, "slave_w: Channel %d: Update Mouse Position (0x%02x)\n", offset, data & 0x00ff); - m_in_count = 3; - break; - default: - LOGMASKED(LOG_COMMANDS | LOG_UNKNOWNS, "slave_w: Channel %d: Unknown register: %02x\n", offset, data & 0x00ff); - m_in_index = 0; - break; - } - } - break; - case 1: - if (m_in_index) - { - m_in_buf[m_in_index] = data & 0x00ff; - m_in_index++; - if (m_in_index == m_in_count) - { - switch (m_in_buf[0]) - { - case 0xf0: // Set Front Panel LCD - memcpy(m_lcd_state, m_in_buf + 1, 16); - memset(m_in_buf, 0, 17); - m_in_index = 0; - m_in_count = 0; - break; - default: - memset(m_in_buf, 0, 17); - m_in_index = 0; - m_in_count = 0; - break; - } - } - } - else - { - switch (data & 0x00ff) - { - default: - LOGMASKED(LOG_COMMANDS | LOG_UNKNOWNS, "slave_w: Channel %d: Unknown register: %02x\n", offset, data & 0x00ff); - memset(m_in_buf, 0, 17); - m_in_index = 0; - m_in_count = 0; - break; - } - } - break; - case 2: - if (m_in_index) - { - m_in_buf[m_in_index] = data & 0x00ff; - m_in_index++; - if (m_in_index == m_in_count) - { - switch (m_in_buf[0]) - { - case 0xf0: // Set Front Panel LCD - memset(m_in_buf + 1, 0, 16); - m_in_count = 17; - break; - default: - memset(m_in_buf, 0, 17); - m_in_index = 0; - m_in_count = 0; - break; - } - } - } - else - { - m_in_buf[m_in_index] = data & 0x00ff; - m_in_index++; - switch (data & 0x00ff) - { - case 0x82: // Mute Audio - LOGMASKED(LOG_COMMANDS, "slave_w: Channel %d: Mute Audio (0x82)\n", offset); - m_dmadac[0]->enable(0); - m_dmadac[1]->enable(0); - m_in_index = 0; - m_in_count = 0; - //cdic->audio_sample_timer->adjust(attotime::never); - break; - case 0x83: // Unmute Audio - LOGMASKED(LOG_COMMANDS, "slave_w: Channel %d: Unmute Audio (0x83)\n", offset); - m_dmadac[0]->enable(1); - m_dmadac[1]->enable(1); - m_in_index = 0; - m_in_count = 0; - break; - case 0xf0: // Set Front Panel LCD - LOGMASKED(LOG_COMMANDS, "slave_w: Channel %d: Set Front Panel LCD (0xf0)\n", offset); - m_in_count = 17; - break; - default: - LOGMASKED(LOG_COMMANDS | LOG_UNKNOWNS, "slave_w: Channel %d: Unknown register: %02x\n", offset, data & 0x00ff); - memset(m_in_buf, 0, 17); - m_in_index = 0; - m_in_count = 0; - break; - } - } - break; - case 3: - if (m_in_index) - { - m_in_buf[m_in_index] = data & 0x00ff; - m_in_index++; - if (m_in_index == m_in_count) - { - switch (m_in_buf[0]) - { - case 0xb0: // Request Disc Status - memset(m_in_buf, 0, 17); - m_in_index = 0; - m_in_count = 0; - prepare_readback(attotime::from_hz(4), 3, 4, 0xb0, 0x00, 0x02, 0x15, 0xb0); - break; - //case 0xb1: // Request Disc Base - //memset(m_in_buf, 0, 17); - //m_in_index = 0; - //m_in_count = 0; - //prepare_readback(attotime::from_hz(10000), 3, 4, 0xb1, 0x00, 0x00, 0x00, 0xb1); - //break; - default: - memset(m_in_buf, 0, 17); - m_in_index = 0; - m_in_count = 0; - break; - } - } - } - else - { - m_in_buf[m_in_index] = data & 0x00ff; - m_in_index++; - switch (data & 0x00ff) - { - case 0xb0: // Request Disc Status - LOGMASKED(LOG_COMMANDS | LOG_WRITES, "slave_w: Channel %d: Request Disc Status (0xb0)\n", offset); - m_in_count = 4; - break; - case 0xb1: // Request Disc Base - LOGMASKED(LOG_COMMANDS | LOG_WRITES, "slave_w: Channel %d: Request Disc Base (0xb1)\n", offset); - m_in_count = 4; - break; - case 0xf0: // Request SLAVE Revision - LOGMASKED(LOG_COMMANDS | LOG_WRITES, "slave_w: Channel %d: Request SLAVE Revision (0xf0)\n", offset); - prepare_readback(attotime::from_hz(10000), 2, 2, 0xf0, 0x32, 0x31, 0, 0xf0); - m_in_index = 0; - break; - case 0xf3: // Request Pointer Type - LOGMASKED(LOG_COMMANDS | LOG_WRITES, "slave_w: Channel %d: Request Pointer Type (0xf3)\n", offset); - m_in_index = 0; - prepare_readback(attotime::from_hz(10000), 2, 2, 0xf3, 1, 0, 0, 0xf3); - break; - case 0xf4: // Request Test Plug Status - LOGMASKED(LOG_COMMANDS | LOG_WRITES, "slave_w: Channel %d: Request Test Plug Status (0xf4)\n", offset); - m_in_index = 0; - prepare_readback(attotime::from_hz(10000), 2, 2, 0xf4, 0, 0, 0, 0xf4); - break; - case 0xf6: // Request NTSC/PAL Status - LOGMASKED(LOG_COMMANDS | LOG_WRITES, "slave_w: Channel %d: Request NTSC/PAL Status (0xf6)\n", offset); - prepare_readback(attotime::never, 2, 2, 0xf6, 2, 0, 0, 0xf6); - m_in_index = 0; - break; - case 0xf7: // Enable Input Polling - LOGMASKED(LOG_COMMANDS | LOG_WRITES, "slave_w: Channel %d: Activate Input Polling (0xf7)\n", offset); - m_polling_active = 1; - m_in_index = 0; - break; - case 0xfa: // Enable X-Bus Interrupts - LOGMASKED(LOG_COMMANDS | LOG_WRITES, "slave_w: Channel %d: X-Bus Interrupt Enable (0xfa)\n", offset); - m_xbus_interrupt_enable = 1; - m_in_index = 0; - break; - default: - LOGMASKED(LOG_COMMANDS | LOG_UNKNOWNS, "slave_w: Channel %d: Unknown register: %02x\n", offset, data & 0x00ff); - memset(m_in_buf, 0, 17); - m_in_index = 0; - m_in_count = 0; - break; - } - } - break; - } -} - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// cdislave_hle_device - constructor -//------------------------------------------------- - -cdislave_hle_device::cdislave_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, CDI_SLAVE_HLE, tag, owner, clock) - , m_int_callback(*this) - , m_dmadac(*this, ":dac%u", 1U) - , m_mousex(*this, "MOUSEX") - , m_mousey(*this, "MOUSEY") - , m_mousebtn(*this, "MOUSEBTN") -{ -} - -//------------------------------------------------- -// device_resolve_objects - resolve objects that -// may be needed for other devices to set -// initial conditions at start time -//------------------------------------------------- - -void cdislave_hle_device::device_resolve_objects() -{ - m_int_callback.resolve_safe(); -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void cdislave_hle_device::device_start() -{ - save_item(NAME(m_channel[0].m_out_buf[0])); - save_item(NAME(m_channel[0].m_out_buf[1])); - save_item(NAME(m_channel[0].m_out_buf[2])); - save_item(NAME(m_channel[0].m_out_buf[3])); - save_item(NAME(m_channel[0].m_out_index)); - save_item(NAME(m_channel[0].m_out_count)); - save_item(NAME(m_channel[0].m_out_cmd)); - save_item(NAME(m_channel[1].m_out_buf[0])); - save_item(NAME(m_channel[1].m_out_buf[1])); - save_item(NAME(m_channel[1].m_out_buf[2])); - save_item(NAME(m_channel[1].m_out_buf[3])); - save_item(NAME(m_channel[1].m_out_index)); - save_item(NAME(m_channel[1].m_out_count)); - save_item(NAME(m_channel[1].m_out_cmd)); - save_item(NAME(m_channel[2].m_out_buf[0])); - save_item(NAME(m_channel[2].m_out_buf[1])); - save_item(NAME(m_channel[2].m_out_buf[2])); - save_item(NAME(m_channel[2].m_out_buf[3])); - save_item(NAME(m_channel[2].m_out_index)); - save_item(NAME(m_channel[2].m_out_count)); - save_item(NAME(m_channel[2].m_out_cmd)); - save_item(NAME(m_channel[3].m_out_buf[0])); - save_item(NAME(m_channel[3].m_out_buf[1])); - save_item(NAME(m_channel[3].m_out_buf[2])); - save_item(NAME(m_channel[3].m_out_buf[3])); - save_item(NAME(m_channel[3].m_out_index)); - save_item(NAME(m_channel[3].m_out_count)); - save_item(NAME(m_channel[3].m_out_cmd)); - - save_item(NAME(m_in_buf)); - save_item(NAME(m_in_index)); - save_item(NAME(m_in_count)); - - save_item(NAME(m_polling_active)); - - save_item(NAME(m_xbus_interrupt_enable)); - - save_item(NAME(m_lcd_state)); - - save_item(NAME(m_real_mouse_x)); - save_item(NAME(m_real_mouse_y)); - - save_item(NAME(m_fake_mouse_x)); - save_item(NAME(m_fake_mouse_y)); - - m_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(cdislave_hle_device::trigger_readback_int), this)); - m_interrupt_timer->adjust(attotime::never); -} - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void cdislave_hle_device::device_reset() -{ - for (auto & elem : m_channel) - { - elem.m_out_buf[0] = 0; - elem.m_out_buf[1] = 0; - elem.m_out_buf[2] = 0; - elem.m_out_buf[3] = 0; - elem.m_out_index = 0; - elem.m_out_count = 0; - elem.m_out_cmd = 0; - } - - memset(m_in_buf, 0, 17); - m_in_index = 0; - m_in_count = 0; - - m_polling_active = 0; - - m_xbus_interrupt_enable = 0; - - memset(m_lcd_state, 0, 16); - - m_real_mouse_x = 0xffff; - m_real_mouse_y = 0xffff; - - m_fake_mouse_x = 0; - m_fake_mouse_y = 0; - - m_int_callback(CLEAR_LINE); -} |