[Scummvm-git-logs] scummvm master -> 9152c3dc4ef957e6150642b688caf2b63a3ba3ba
mikrosk
noreply at scummvm.org
Sat Feb 24 05:22:09 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
9152c3dc4e BACKENDS: ATARI: Buffer also mouse buttons state
Commit: 9152c3dc4ef957e6150642b688caf2b63a3ba3ba
https://github.com/scummvm/scummvm/commit/9152c3dc4ef957e6150642b688caf2b63a3ba3ba
Author: Miro Kropacek (miro.kropacek at gmail.com)
Date: 2024-02-24T06:21:43+01:00
Commit Message:
BACKENDS: ATARI: Buffer also mouse buttons state
Now double-click works also on really slow hardware. And Hatari.
Also, partially revert commit 01a2d2ed because events can't be passed
to the (multitasking) OS. So basically let's hope that it works fine now
even without handling IKBD overruns. I'm not able to replicate the issue
with Hatari + FF + slow UI + mouse movement anymore.
Changed paths:
backends/events/atari/atari-events.cpp
backends/events/atari/atari-events.h
backends/platform/atari/atari_ikbd.S
diff --git a/backends/events/atari/atari-events.cpp b/backends/events/atari/atari-events.cpp
index 25a5158e7b2..c4a85237100 100644
--- a/backends/events/atari/atari-events.cpp
+++ b/backends/events/atari/atari-events.cpp
@@ -29,18 +29,22 @@
#include "backends/platform/atari/osystem_atari.h"
#include "common/rect.h"
-//! bit 0: rmb
-//! bit 1: lmb
-volatile uint8 g_atari_ikbd_mouse_buttons_state = 0;
-volatile int16 g_atari_ikbd_mouse_delta_x = 0;
-volatile int16 g_atari_ikbd_mouse_delta_y = 0;
-
#define SCANCODES_SIZE 256
volatile uint8 g_atari_ikbd_scancodes[SCANCODES_SIZE];
uint16 g_atari_ikbd_scancodes_mask = SCANCODES_SIZE-1;
-volatile uint16 g_atari_ikbb_scancodes_head = 0;
-static uint16 g_atari_ikbb_scancodes_tail = 0;
+volatile uint16 g_atari_ikbd_scancodes_head = 0;
+static uint16 g_atari_ikbd_scancodes_tail = 0;
+
+//! bit 0: rmb
+//! bit 1: lmb
+#define MOUSEBUTTONS_SIZE 4
+volatile uint8 g_atari_ikbd_mousebuttons[MOUSEBUTTONS_SIZE];
+uint16 g_atari_ikbd_mousebuttons_mask = MOUSEBUTTONS_SIZE-1;
+volatile uint16 g_atari_ikbd_mousebuttons_head = 0;
+static uint16 g_atari_ikbd_mousebuttons_tail = 0;
+volatile int16 g_atari_ikbd_mouse_delta_x = 0;
+volatile int16 g_atari_ikbd_mouse_delta_y = 0;
AtariEventSource::AtariEventSource() {
_system = dynamic_cast<OSystem_Atari*>(g_system);
@@ -108,32 +112,33 @@ bool AtariEventSource::pollEvent(Common::Event &event) {
_system->update();
- if ((g_atari_ikbd_mouse_buttons_state & 0x01) && !_oldRmbDown) {
- event.type = Common::EVENT_RBUTTONDOWN;
- event.mouse = _graphicsManager->getMousePosition();
- _oldRmbDown = true;
- return true;
- }
-
- if (!(g_atari_ikbd_mouse_buttons_state & 0x01) && _oldRmbDown) {
- event.type = Common::EVENT_RBUTTONUP;
- event.mouse = _graphicsManager->getMousePosition();
- _oldRmbDown = false;
- return true;
- }
+ if (g_atari_ikbd_mousebuttons_head != g_atari_ikbd_mousebuttons_tail) {
+ byte buttonState = g_atari_ikbd_mousebuttons[g_atari_ikbd_mousebuttons_tail++];
+ g_atari_ikbd_mousebuttons_tail &= MOUSEBUTTONS_SIZE-1;
- if ((g_atari_ikbd_mouse_buttons_state & 0x02) && !_oldLmbDown) {
- event.type = Common::EVENT_LBUTTONDOWN;
- event.mouse = _graphicsManager->getMousePosition();
- _oldLmbDown = true;
- return true;
- }
+ if (buttonState & 0x01) {
+ _rmbDown = true;
+ event.type = Common::EVENT_RBUTTONDOWN;
+ event.mouse = _graphicsManager->getMousePosition();
+ return true;
+ } else if (_rmbDown) {
+ _rmbDown = false;
+ event.type = Common::EVENT_RBUTTONUP;
+ event.mouse = _graphicsManager->getMousePosition();
+ return true;
+ }
- if (!(g_atari_ikbd_mouse_buttons_state & 0x02) && _oldLmbDown) {
- event.type = Common::EVENT_LBUTTONUP;
- event.mouse = _graphicsManager->getMousePosition();
- _oldLmbDown = false;
- return true;
+ if (buttonState & 0x02) {
+ _lmbDown = true;
+ event.type = Common::EVENT_LBUTTONDOWN;
+ event.mouse = _graphicsManager->getMousePosition();
+ return true;
+ } else if (_lmbDown) {
+ _lmbDown = false;
+ event.type = Common::EVENT_LBUTTONUP;
+ event.mouse = _graphicsManager->getMousePosition();
+ return true;
+ }
}
if (g_atari_ikbd_mouse_delta_x != 0 || g_atari_ikbd_mouse_delta_y != 0) {
@@ -150,9 +155,9 @@ bool AtariEventSource::pollEvent(Common::Event &event) {
return true;
}
- if (g_atari_ikbb_scancodes_head != g_atari_ikbb_scancodes_tail) {
- byte scancode = g_atari_ikbd_scancodes[g_atari_ikbb_scancodes_tail++];
- g_atari_ikbb_scancodes_tail &= SCANCODES_SIZE-1;
+ if (g_atari_ikbd_scancodes_head != g_atari_ikbd_scancodes_tail) {
+ byte scancode = g_atari_ikbd_scancodes[g_atari_ikbd_scancodes_tail++];
+ g_atari_ikbd_scancodes_tail &= SCANCODES_SIZE-1;
bool pressed = !(scancode & 0x80);
scancode &= 0x7f;
diff --git a/backends/events/atari/atari-events.h b/backends/events/atari/atari-events.h
index c98b6e307cf..38c29019090 100644
--- a/backends/events/atari/atari-events.h
+++ b/backends/events/atari/atari-events.h
@@ -44,8 +44,8 @@ private:
OSystem_Atari *_system = nullptr;
AtariGraphicsManager *_graphicsManager = nullptr;
- bool _oldLmbDown = false;
- bool _oldRmbDown = false;
+ bool _lmbDown = false;
+ bool _rmbDown = false;
bool _lshiftActive = false;
bool _rshiftActive = false;
diff --git a/backends/platform/atari/atari_ikbd.S b/backends/platform/atari/atari_ikbd.S
index 88850f6a95f..47cbea43dc2 100644
--- a/backends/platform/atari/atari_ikbd.S
+++ b/backends/platform/atari/atari_ikbd.S
@@ -27,13 +27,16 @@
.global SYM(atari_old_kbdvec)
.global SYM(atari_old_mousevec)
- .extern SYM(g_atari_ikbd_mouse_buttons_state)
+ .extern SYM(g_atari_ikbd_mousebuttons)
+ .extern SYM(g_atari_ikbd_mousebuttons_mask)
+ .extern SYM(g_atari_ikbd_mousebuttons_head)
+
.extern SYM(g_atari_ikbd_mouse_delta_x)
- .extern SYM(_atari_ikbd_mouse_delta_y)
+ .extern SYM(g_atari_ikbd_mouse_delta_y)
.extern SYM(g_atari_ikbd_scancodes)
.extern SYM(g_atari_ikbd_scancodes_mask)
- .extern SYM(g_atari_ikbb_scancodes_head)
+ .extern SYM(g_atari_ikbd_scancodes_head)
.text
@@ -42,21 +45,39 @@
SYM(atari_old_kbdvec):
dc.l 0
SYM(atari_kbdvec):
- movem.l d1/a0,-(sp)
+ lea pressed_keys,a0
+ clr.l d1
+ move.b d0,d1
+ bpl.b key_pressed | bit 7 cleared
+
+key_released:
+ and.b #0x7f,d1
+ tst.b (a0,d1.l) | pressed before?
+ bne.b key_released_ok
+
+ | if we get a sudden release key event,
+ | let the original handler process it
+ move.l (atari_old_kbdvec,pc),a0
+ jmp (a0)
+
+key_released_ok:
+ clr.b (a0,d1.l) | mark as released
+ bra.b kbdvec_process
+key_pressed:
+ addq.b #1,(a0,d1.l) | mark as pressed
+
+kbdvec_process:
lea SYM(g_atari_ikbd_scancodes),a0
- move.w SYM(g_atari_ikbb_scancodes_head),d1
+ move.w SYM(g_atari_ikbd_scancodes_head),d1
- | g_atari_ikbd_scancodes[g_atari_ikbb_scancodes_head] = scancode
+ | g_atari_ikbd_scancodes[g_atari_ikbd_scancodes_head] = scancode
move.b d0,(0.b,a0,d1.w)
addq.l #1,d1
and.w SYM(g_atari_ikbd_scancodes_mask),d1
- move.w d1,SYM(g_atari_ikbb_scancodes_head)
-
- movem.l (sp)+,d1/a0
- move.l (atari_old_kbdvec,pc),-(sp)
+ move.w d1,SYM(g_atari_ikbd_scancodes_head)
rts
@@ -65,10 +86,24 @@ SYM(atari_kbdvec):
SYM(atari_old_mousevec):
dc.l 0
SYM(atari_mousevec):
- movem.l d0/a0,-(sp)
+ move.b (a0)+,d0
+ cmp.b old_buttons,d0
+ beq.b no_buttons
- move.b (a0)+,SYM(g_atari_ikbd_mouse_buttons_state)
+ move.b d0,old_buttons
+ lea SYM(g_atari_ikbd_mousebuttons),a1
+ move.w SYM(g_atari_ikbd_mousebuttons_head),d1
+
+ | g_atari_ikbd_mousebuttons[g_atari_ikbd_mousebuttons_head] = buttons
+
+ move.b d0,(0.b,a1,d1.w)
+
+ addq.w #1,d1
+ and.w SYM(g_atari_ikbd_mousebuttons_mask),d1
+ move.w d1,SYM(g_atari_ikbd_mousebuttons_head)
+
+no_buttons:
move.b (a0)+,d0
ext.w d0
add.w d0,SYM(g_atari_ikbd_mouse_delta_x)
@@ -76,7 +111,11 @@ SYM(atari_mousevec):
move.b (a0)+,d0
ext.w d0
add.w d0,SYM(g_atari_ikbd_mouse_delta_y)
-
- movem.l (sp)+,d0/a0
- move.l (atari_old_mousevec,pc),-(sp)
rts
+
+ .bss
+
+pressed_keys:
+ ds.b 128
+old_buttons:
+ ds.b 1
More information about the Scummvm-git-logs
mailing list