summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/clickstart.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/clickstart.cpp')
-rw-r--r--src/mame/drivers/clickstart.cpp145
1 files changed, 81 insertions, 64 deletions
diff --git a/src/mame/drivers/clickstart.cpp b/src/mame/drivers/clickstart.cpp
index ac5fcb27a00..845ee87a311 100644
--- a/src/mame/drivers/clickstart.cpp
+++ b/src/mame/drivers/clickstart.cpp
@@ -47,9 +47,11 @@ public:
, m_system_region(*this, "maincpu")
, m_io_mouse_x(*this, "MOUSEX")
, m_io_mouse_y(*this, "MOUSEY")
+ , m_keys(*this, "KEYS%u", 0U)
, m_cart_region(nullptr)
, m_mouse_x(0)
, m_mouse_y(0)
+ , m_mouse_button(0)
, m_mouse_dx(0)
, m_mouse_dy(0)
, m_uart_tx_fifo_start(0)
@@ -98,14 +100,16 @@ private:
required_memory_region m_system_region;
required_ioport m_io_mouse_x;
required_ioport m_io_mouse_y;
+ required_ioport_array<3> m_keys;
memory_region *m_cart_region;
uint16_t m_mouse_x;
uint16_t m_mouse_y;
+ uint8_t m_mouse_button;
int16_t m_mouse_dx;
int16_t m_mouse_dy;
- uint8_t m_uart_tx_fifo[32]; // arbitrary size
+ uint8_t m_uart_tx_fifo[1024]; // arbitrary size
uint8_t m_uart_tx_fifo_start;
uint8_t m_uart_tx_fifo_end;
uint8_t m_uart_tx_fifo_count;
@@ -125,6 +129,7 @@ void clickstart_state::machine_start()
save_item(NAME(m_mouse_x));
save_item(NAME(m_mouse_y));
+ save_item(NAME(m_mouse_button));
save_item(NAME(m_mouse_dx));
save_item(NAME(m_mouse_dy));
@@ -141,8 +146,9 @@ void clickstart_state::machine_start()
void clickstart_state::machine_reset()
{
- m_mouse_x = 0xffff;
- m_mouse_y = 0xffff;
+ m_mouse_x = m_io_mouse_x->read();
+ m_mouse_y = m_io_mouse_y->read();
+ m_mouse_button = 0;
m_mouse_dx = 0;
m_mouse_dy = 0;
@@ -198,18 +204,20 @@ void clickstart_state::uart_tx_fifo_push(uint8_t value)
INPUT_CHANGED_MEMBER(clickstart_state::key_update)
{
const size_t keycode = static_cast<size_t>(param);
+
printf("keycode:%02x, oldval:%02x, newval:%02x\n", (uint8_t)keycode, oldval, newval);
- uint8_t buffer[5] = {};
- buffer[0] = 0x01;
- buffer[1] = newval ? keycode : 0x3f;
- buffer[2] = 0x3f;
- buffer[3] = 0x01;
+ uint8_t buffer[6] = {};
+ buffer[0] = 0x00;
+ buffer[1] = 0x01;
+ buffer[2] = newval ? keycode : 0x3f;
+ buffer[3] = 0x2f;
buffer[4] = 0x01;
+ buffer[5] = 0x01;
printf("Keyboard queueing: ");
uint16_t sum = 0;
- for (int i = 0; i < 5; i++)
+ for (int i = 0; i < 6; i++)
{
uart_tx_fifo_push(buffer[i] ^ 0xff);
sum += buffer[i];
@@ -222,32 +230,38 @@ INPUT_CHANGED_MEMBER(clickstart_state::key_update)
INPUT_CHANGED_MEMBER(clickstart_state::mouse_update)
{
- uint16_t x = m_io_mouse_x->read();
- uint16_t y = m_io_mouse_y->read();
- uint16_t old_mouse_x = m_mouse_x;
- uint16_t old_mouse_y = m_mouse_y;
-
- if (m_mouse_x == 0xffff)
- {
- old_mouse_x = x;
- old_mouse_y = y;
- }
-
- m_mouse_x = x;
- m_mouse_y = y;
-
- m_mouse_dx += (m_mouse_x - old_mouse_x);
- m_mouse_dy += (m_mouse_y - old_mouse_y);
-
- if (m_mouse_dx < -63)
- m_mouse_dx = -63;
- else if (m_mouse_dx > 62)
- m_mouse_dx = 62;
-
- if (m_mouse_dy < -63)
- m_mouse_dy = -63;
- else if (m_mouse_dy > 62)
- m_mouse_dy = 62;
+ m_mouse_button = newval ? (uint8_t)static_cast<size_t>(param) : 0;
+
+ const uint16_t x_val(m_io_mouse_x->read());
+ const uint16_t y_val(m_io_mouse_y->read());
+ int16_t x_delta(x_val - m_mouse_x);
+ int16_t y_delta(y_val - m_mouse_y);
+
+ // deal with wraparound
+ if (0x0200 <= x_delta)
+ x_delta -= 0x400;
+ else if (-0x0200 >= x_delta)
+ x_delta += 0x400;
+ if (0x100 <= y_delta)
+ y_delta -= 0x200;
+ else if (-0x100 >= y_delta)
+ x_delta += 0x200;
+
+ m_mouse_x = x_val;
+ m_mouse_y = y_val;
+
+ m_mouse_dx = x_delta;
+ m_mouse_dy = -y_delta;
+
+ if (m_mouse_dx < -255)
+ m_mouse_dx = -255;
+ else if (m_mouse_dx > 255)
+ m_mouse_dx = 255;
+
+ if (m_mouse_dy < -255)
+ m_mouse_dy = -255;
+ else if (m_mouse_dy > 255)
+ m_mouse_dy = 255;
update_mouse_buffer();
@@ -257,27 +271,22 @@ INPUT_CHANGED_MEMBER(clickstart_state::mouse_update)
void clickstart_state::update_mouse_buffer()
{
- if (m_mouse_dx == 0 && m_mouse_dy == 0)
- return;
-
- uint8_t buffer[5] = {};
- buffer[0] = 0x01;
- buffer[1] = 0x3f;
- buffer[2] = 0x3f;
- buffer[3] = (m_mouse_dx + 1) & 0x3f;
- buffer[4] = (m_mouse_dy + 1) & 0x3f;
+ uint8_t buffer[6] = {};
+ buffer[0] = 0x00;
+ buffer[1] = 0x01 | m_mouse_button;
+ buffer[2] = 0x3e | ((m_mouse_dx >> 1) & 0x80);
+ buffer[3] = 0x3f | ((m_mouse_dy >> 1) & 0x80);
+ buffer[4] = (m_mouse_dx & 0xfe) + 1;
+ buffer[5] = (m_mouse_dy & 0xfe) + 1;
- printf("Mouse queueing: ");
uint16_t sum = 0;
- for (int i = 0; i < 5; i++)
+ for (int i = 0; i < 6; i++)
{
uart_tx_fifo_push(buffer[i] ^ 0xff);
sum += buffer[i];
- printf("%02x/%02x ", buffer[i], buffer[i] ^ 0xff);
}
sum = (sum & 0xff) ^ 0xff;
uart_tx_fifo_push((uint8_t)sum);
- printf("%02x\n", (uint8_t)sum);
}
READ16_MEMBER(clickstart_state::rom_r)
@@ -302,24 +311,26 @@ WRITE16_MEMBER(clickstart_state::porta_w)
WRITE16_MEMBER(clickstart_state::portb_w)
{
- logerror("%s: portb_w: %04x & %04x\n", machine().describe_context(), data, mem_mask);
+ //logerror("%s: portb_w: %04x & %04x\n", machine().describe_context(), data, mem_mask);
}
WRITE16_MEMBER(clickstart_state::portc_w)
{
+ // Bit 12: SCK from SPG SIO
+ // Bit 11: SDA from SPG SIO
//logerror("%s: portc_w: %04x & %04x\n", machine().describe_context(), data, mem_mask);
}
READ16_MEMBER(clickstart_state::porta_r)
{
uint16_t data = 0x4000;
- //logerror("%s: porta_r: %04x & %04x\n", machine().describe_context(), data, mem_mask);
+ logerror("%s: porta_r: %04x & %04x\n", machine().describe_context(), data, mem_mask);
return data;
}
READ16_MEMBER(clickstart_state::portb_r)
{
- logerror("%s: portb_r: %04x\n", machine().describe_context(), mem_mask);
+ //logerror("%s: portb_r: %04x\n", machine().describe_context(), mem_mask);
return 0;
}
@@ -343,10 +354,14 @@ void clickstart_state::mem_map(address_map &map)
static INPUT_PORTS_START( clickstart )
PORT_START("MOUSEX")
- PORT_BIT(0x3e, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, mouse_update, 0)
+ PORT_BIT(0x3ff, 0x00, IPT_MOUSE_X) PORT_MINMAX(0x0000,0x03ff) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, mouse_update, 0)
PORT_START("MOUSEY")
- PORT_BIT(0x3e, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, mouse_update, 0)
+ PORT_BIT(0x1ff, 0x00, IPT_MOUSE_Y) PORT_MINMAX(0x0000,0x01ff) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, mouse_update, 0)
+
+ PORT_START("MOUSEBTN")
+ PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, mouse_update, 0x10)
+ PORT_BIT(0xfffe, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("KEYS0")
PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x01) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
@@ -377,21 +392,23 @@ static INPUT_PORTS_START( clickstart )
PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x18) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('x')
PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x19) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('y')
PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1a) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('z')
- PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1b) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
- PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1c) PORT_CODE(KEYCODE_1) PORT_CHAR('1')
- PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1d) PORT_CODE(KEYCODE_2) PORT_CHAR('2')
- PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1e) PORT_CODE(KEYCODE_3) PORT_CHAR('3')
- PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1f) PORT_CODE(KEYCODE_4) PORT_CHAR('4')
- PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x20) PORT_CODE(KEYCODE_5) PORT_CHAR('5')
+ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x25) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
+ PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x26) PORT_CODE(KEYCODE_1) PORT_CHAR('1')
+ PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x28) PORT_CODE(KEYCODE_2) PORT_CHAR('2')
+ PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x29) PORT_CODE(KEYCODE_3) PORT_CHAR('3')
+ PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x2a) PORT_CODE(KEYCODE_4) PORT_CHAR('4')
+ PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x2b) PORT_CODE(KEYCODE_5) PORT_CHAR('5')
PORT_START("KEYS2")
- PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x21) PORT_CODE(KEYCODE_6) PORT_CHAR('6')
- PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x22) PORT_CODE(KEYCODE_7) PORT_CHAR('7')
- PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x23) PORT_CODE(KEYCODE_8) PORT_CHAR('8')
+ PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x2d) PORT_CODE(KEYCODE_6) PORT_CHAR('6')
+ PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x2e) PORT_CODE(KEYCODE_7) PORT_CHAR('7')
+ PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x2f) PORT_CODE(KEYCODE_8) PORT_CHAR('8')
PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x24) PORT_CODE(KEYCODE_9) PORT_CHAR('9')
PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x27) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
- PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0xa9) PORT_CODE(KEYCODE_LSHIFT) PORT_NAME("Shift")
- PORT_BIT(0xffc0, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x2c) PORT_CODE(KEYCODE_LALT) PORT_NAME("Music")
+ PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0xa9) PORT_CODE(KEYCODE_LSHIFT) PORT_NAME("Shift") PORT_TOGGLE
+ PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x2f) PORT_CODE(KEYCODE_TILDE) PORT_NAME("Pause") PORT_TOGGLE
+ PORT_BIT(0xff00, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
// There is a SEEPROM on the motherboard (type?)