diff --git a/zsnes/src/mmlib/mm.c b/zsnes/src/mmlib/mm.c index f23f6176..e55fe6ae 100644 --- a/zsnes/src/mmlib/mm.c +++ b/zsnes/src/mmlib/mm.c @@ -54,11 +54,15 @@ int ManyMouse_Init(void) for (i = 0; mice_drivers[i]; i++) { int mice = mice_drivers[i]->init(); - if (mice >= 0) + if (mice > 0) { driver = mice_drivers[i]; return(mice); } /* if */ + else + { + return(0); + } } /* for */ return(-1); diff --git a/zsnes/src/uic.c b/zsnes/src/uic.c index 7a5f1032..4ef37a70 100644 --- a/zsnes/src/uic.c +++ b/zsnes/src/uic.c @@ -447,10 +447,13 @@ void DisplayBatteryStatus() #ifndef __MSDOS__ int MouseCount = 0; -int Mouse1MoveX = 0; -int Mouse2MoveX = 0; -int Mouse1MoveY = 0; -int Mouse2MoveY = 0; + +unsigned short MouseMoveX[2]; +unsigned short MouseMoveY[2]; +unsigned short MouseButton[2]; + +bool MouseWaiting[2]; +ManyMouseEvent MouseEvent[2]; void MultiMouseShutdown() { @@ -464,6 +467,10 @@ void MultiMouseInit() printf("ManyMouse: %d mice detected.\n", MouseCount); if (MouseCount > 1) { + MouseMoveX[0] = MouseMoveX[1] = 0; + MouseMoveY[0] = MouseMoveY[1] = 0; + MouseButton[0] = MouseButton[1] = 0; + MouseWaiting[0] = MouseWaiting[1] = false; atexit(MultiMouseShutdown); } else @@ -472,41 +479,35 @@ void MultiMouseInit() } } -bool Mouse1Waiting = false, Mouse2Waiting = false; -ManyMouseEvent Mouse1Event,Mouse2Event; +#define BIT(x) (1 << (x)) +#define MOUSE_BUTTON_HANDLE(mouse, bit, value) \ + if (value) { mouse |= BIT(bit); } \ + else { mouse &= ~BIT(bit); } - -void MultiMouseProcess(unsigned int mouse) +unsigned char mouse; +void MultiMouseProcess() { ManyMouseEvent event; event.device = ~0; - Mouse1MoveX = Mouse1MoveY = Mouse2MoveX = Mouse2MoveY = 0; + MouseMoveX[mouse] = 0; + MouseMoveY[mouse] = 0; + //MouseButton[mouse] = 0; - if (mouse == 1) + if (MouseWaiting[mouse]) { - if (Mouse1Waiting) + if (MouseEvent[mouse].type == MANYMOUSE_EVENT_RELMOTION) { - if (Mouse1Event.type == MANYMOUSE_EVENT_RELMOTION) - { - if (Mouse1Event.item == 0) { Mouse1MoveX = Mouse1Event.value; } else { Mouse1MoveY = Mouse1Event.value; } - } - Mouse1Waiting = false; - return; + if (MouseEvent[mouse].item == 0) { MouseMoveX[mouse] = MouseEvent[mouse].value; } + else { MouseMoveY[mouse] = MouseEvent[mouse].value; } } - } - - if (mouse == 2) - { - if (Mouse2Waiting) + else if (MouseEvent[mouse].type == MANYMOUSE_EVENT_BUTTON) { - if (Mouse2Event.type == MANYMOUSE_EVENT_RELMOTION) - { - if (Mouse2Event.item == 1) { Mouse2MoveX = Mouse2Event.value; } else { Mouse2MoveY = Mouse2Event.value; } - } - Mouse2Waiting = false; - return; + if (MouseEvent[mouse].item == 0) { MOUSE_BUTTON_HANDLE(MouseButton[mouse], 0, MouseEvent[mouse].value); } + else if (MouseEvent[mouse].item == 1) { MOUSE_BUTTON_HANDLE(MouseButton[mouse], 1, MouseEvent[mouse].value); } } + MouseWaiting[mouse] = false; + return; } while ((event.device != 0) && (event.device != 1)) @@ -516,31 +517,23 @@ void MultiMouseProcess(unsigned int mouse) return; } - if ((mouse == 1) && event.device == 1) + if (event.device == (mouse^1)) { - Mouse2Event = event; - Mouse2Waiting = true; - event.device = ~0; - } - if ((mouse == 2) && event.device == 0) - { - Mouse1Event = event; - Mouse1Waiting = true; + MouseEvent[event.device] = event; + MouseWaiting[event.device] = true; event.device = ~0; } } if (event.type == MANYMOUSE_EVENT_RELMOTION) { - if (event.device == 0) - { - if (event.item == 0) { Mouse1MoveX = event.value; } else { Mouse1MoveY = event.value; } - return; - } - if (event.device == 1) - { - if (event.item == 0) { Mouse2MoveX = event.value; } else { Mouse2MoveY = event.value; } - } + if (event.item == 0) { MouseMoveX[mouse] = event.value; } + else { MouseMoveY[mouse] = event.value; } + } + else if (event.type == MANYMOUSE_EVENT_BUTTON) + { + if (event.item == 0) { MOUSE_BUTTON_HANDLE(MouseButton[mouse], 0, event.value); } + else if (event.item == 1) { MOUSE_BUTTON_HANDLE(MouseButton[mouse], 1, event.value); } } } diff --git a/zsnes/src/vcache.asm b/zsnes/src/vcache.asm index 46a2a40d..cba3a622 100644 --- a/zsnes/src/vcache.asm +++ b/zsnes/src/vcache.asm @@ -518,7 +518,7 @@ NEWSYM cachevideo .nospeedreset mov eax,[KeyResetAll] test byte[pressed+eax],1 - je .nodis6 + je near .nodis6 mov byte[pressed+eax],2 mov byte[Voice0Disable],1 mov byte[Voice1Disable],1 diff --git a/zsnes/src/video/procvid.asm b/zsnes/src/video/procvid.asm index 171d8a29..6240b403 100644 --- a/zsnes/src/video/procvid.asm +++ b/zsnes/src/video/procvid.asm @@ -42,7 +42,7 @@ EXTSYM MovieDisplayFrame EXTSYM MouseCount,device2 %ifndef __MSDOS__ -EXTSYM Mouse1MoveX,Mouse1MoveY,Mouse2MoveX,Mouse2MoveY,MultiMouseProcess +EXTSYM MouseMoveX,MouseMoveY,MouseButton,MultiMouseProcess,mouse %endif %ifdef __MSDOS__ @@ -153,20 +153,22 @@ NEWSYM processmouse1 push edi push edx push ebx - call Get_MouseData - mov [mousebuttons],bx %ifndef __MSDOS__ cmp byte[MouseCount],1 jle .nomultimouse pushad - mov eax,1 + mov byte[mouse],0 call MultiMouseProcess popad - mov cx,[Mouse1MoveX] - mov dx,[Mouse1MoveY] + mov bx,[MouseButton] + mov [mousebuttons],bx + mov cx,[MouseMoveX] + mov dx,[MouseMoveY] jmp .mousestuff .nomultimouse %endif + call Get_MouseData + mov [mousebuttons],bx call Get_MousePositionDisplacement .mousestuff mov word[mousexpos],0 @@ -203,11 +205,23 @@ NEWSYM processmouse2 push edi push edx push ebx +%ifndef __MSDOS__ + cmp byte[MouseCount],1 + jle .nomultimouse + pushad + mov byte[mouse],1 + call MultiMouseProcess + popad + mov bx,[MouseButton+2] + jmp .mousestuff +.nomultimouse +%endif call Get_MouseData +.mousestuff mov [mousebuttons],bx cmp byte[device2],2 jne .ss - cmp byte[pressed+13],0 + cmp byte[pressed+13],0 je .noautosw cmp byte[ssautoswb],1 je .ss @@ -226,18 +240,14 @@ NEWSYM processmouse2 .ss %ifndef __MSDOS__ cmp byte[MouseCount],1 - jle .nomultimouse - pushad - mov eax,2 - call MultiMouseProcess - popad - mov cx,[Mouse2MoveX] - mov dx,[Mouse2MoveY] - jmp .mousestuff -.nomultimouse + jle .nomultimouse2 + mov cx,[MouseMoveX+2] + mov dx,[MouseMoveY+2] + jmp .mousestuff2 +.nomultimouse2 %endif call Get_MousePositionDisplacement -.mousestuff +.mousestuff2 cmp byte[device2],3 je .le cmp byte[device2],4