From 9d9eb868bc1923cb48084002099c81c370cbae57 Mon Sep 17 00:00:00 2001
From: rainwarrior <rainwarrior@users.sf.net>
Date: Sat, 23 Apr 2016 06:12:46 +0000
Subject: [PATCH] Rewrite Subor Mouse code, fixed latch updating outside of
 strobe.

---
 trunk/src/input/mouse.cpp | 65 ++++++++++++++++++---------------------
 1 file changed, 30 insertions(+), 35 deletions(-)

diff --git a/trunk/src/input/mouse.cpp b/trunk/src/input/mouse.cpp
index 2f58c733..17adf69c 100644
--- a/trunk/src/input/mouse.cpp
+++ b/trunk/src/input/mouse.cpp
@@ -18,64 +18,59 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+// implementation of Subor Mouse
+// used in Educational Computer 2000
+
 #include <string.h>
 #include <stdlib.h>
 #include "share.h"
 
 typedef struct {
-  int32 mzx, mzy, mzxold, mzyold;
-  uint32 readbit;
-  uint32 data;
+	uint8 latch;
+	int32 mx,my;
+	int32 lmx,lmy;
+	uint32 mb;
 } MOUSE;
 
 static MOUSE Mouse;
 
 static void StrobeMOUSE(int w)
 {
-  Mouse.readbit=0;
+	Mouse.latch = Mouse.mb & 0x03;
+
+	int32 dx = Mouse.mx - Mouse.lmx;
+	int32 dy = Mouse.my - Mouse.lmy;
+
+	Mouse.lmx = Mouse.mx;
+	Mouse.lmy = Mouse.my;
+
+	if      (dx > 0) Mouse.latch |= (0x2 << 2);
+	else if (dx < 0) Mouse.latch |= (0x3 << 2);
+	if      (dy > 0) Mouse.latch |= (0x2 << 4);
+	else if (dy < 0) Mouse.latch |= (0x3 << 4);
+
+	//FCEU_printf("Subor Mouse: %02X\n",Mouse.latch);
 }
 
 static uint8 ReadMOUSE(int w)
 {
-  uint8 ret=0;
-  if(Mouse.readbit>=8)
-    ret|=1;
-  else
-  {
-    ret|=(Mouse.data>>Mouse.readbit)&1;
-    if(!fceuindbg)
-      Mouse.readbit++;
-  }
-  return(ret);
+	uint8 result = Mouse.latch & 0x01;
+	Mouse.latch = (Mouse.latch >> 1) | 0x80;
+	return result;
 }
 
 static void UpdateMOUSE(int w, void *data, int arg)
 {
-  uint32 *ptr=(uint32*)data;
-  Mouse.data=0;
-  Mouse.mzxold=Mouse.mzx;
-  Mouse.mzyold=Mouse.mzy;
-  Mouse.mzx=ptr[0];
-  Mouse.mzy=ptr[1];
-  Mouse.data|=ptr[2];
-  if((Mouse.mzxold-Mouse.mzx)>0)
-    Mouse.data|=0x0C;
-  else if((Mouse.mzxold-Mouse.mzx)<0)
-    Mouse.data|=0x04;
-  if((Mouse.mzyold-Mouse.mzy)>0)
-    Mouse.data|=0x30;
-  else if((Mouse.mzyold-Mouse.mzy)<0)
-    Mouse.data|=0x10;
+	uint32 *ptr=(uint32*)data;
+	Mouse.mx = ptr[0];
+	Mouse.my = ptr[1];
+	Mouse.mb = ptr[2];
 }
 
 static INPUTC MOUSEC={ReadMOUSE,0,StrobeMOUSE,UpdateMOUSE,0,0};
 
 INPUTC *FCEU_InitMouse(int w)
 {
-  Mouse.mzx=0;
-  Mouse.mzy=0;
-  Mouse.mzxold=0;
-  Mouse.mzyold=0;
-  Mouse.data=0;
-  return(&MOUSEC);
+	memset(&Mouse,0,sizeof(Mouse));
+	return(&MOUSEC);
 }