summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/HALKit/AMD64/HalKernelMouse.cxx
diff options
context:
space:
mode:
authorAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-15 18:35:34 +0200
committerAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-15 18:35:34 +0200
commitf3d931aa7cfaf96baef8383b59a8938779541ee7 (patch)
treefdb9fc51badb3dbd03e46ab0766a49d9522e13e2 /dev/Kernel/HALKit/AMD64/HalKernelMouse.cxx
parent86640816e8b1d3595365f1fcc8a2a9e61fb40ff1 (diff)
[IMP] Moved source code into dev/ folder.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel/HALKit/AMD64/HalKernelMouse.cxx')
-rw-r--r--dev/Kernel/HALKit/AMD64/HalKernelMouse.cxx190
1 files changed, 190 insertions, 0 deletions
diff --git a/dev/Kernel/HALKit/AMD64/HalKernelMouse.cxx b/dev/Kernel/HALKit/AMD64/HalKernelMouse.cxx
new file mode 100644
index 00000000..bff5e5ee
--- /dev/null
+++ b/dev/Kernel/HALKit/AMD64/HalKernelMouse.cxx
@@ -0,0 +1,190 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+------------------------------------------- */
+
+#include <Modules/PS2/PS2MouseInterface.hxx>
+#include <Modules/CoreCG/FbRenderer.hxx>
+#include <Modules/CoreCG/Rsrc/Cursor.rsrc>
+#include <KernelKit/Framebuffer.hxx>
+#include <NewKit/Defines.hxx>
+
+/// @note forward decl.
+EXTERN_C Kernel::Boolean _hal_draw_mouse();
+EXTERN_C Kernel::Void _hal_init_mouse();
+
+STATIC Kernel::Int32 kPrevX = 10;
+STATIC Kernel::Int32 kPrevY = 10;
+STATIC Kernel::Int32 kX = 10;
+STATIC Kernel::Int32 kY = 10;
+STATIC Kernel::Int32 kMouseCycle = 0;
+STATIC Kernel::PS2MouseInterface kMousePS2;
+STATIC Kernel::Char kMousePacket[4] = {};
+STATIC Kernel::Boolean kMousePacketReady = false;
+
+STATIC CGInit();
+
+#define kPS2Leftbutton 0b00000001
+#define kPS2Middlebutton 0b00000010
+#define kPS2Rightbutton 0b00000100
+#define kPS2XSign 0b00010000
+#define kPS2YSign 0b00100000
+#define kPS2XOverflow 0b01000000
+#define kPS2YOverflow 0b10000000
+
+using namespace Kernel;
+
+Void hal_handle_mouse()
+{
+ Kernel::UInt8 data = HAL::In8(0x60);
+
+ switch (kMouseCycle)
+ {
+ case 0:
+ if (kMousePacketReady)
+ break;
+ if ((data & 0b00001000) == 0)
+ break;
+ kMousePacket[0] = data;
+ kMouseCycle++;
+ break;
+ case 1:
+ if (kMousePacketReady)
+ break;
+ kMousePacket[1] = data;
+ kMouseCycle++;
+ break;
+ case 2:
+ if (kMousePacketReady)
+ break;
+ kMousePacket[2] = data;
+ kMousePacketReady = true;
+ kMouseCycle = 0;
+ break;
+ }
+
+ // Notify PIC controller that we're done with it's interrupt.
+
+ Kernel::HAL::Out8(0x20, 0x20);
+ Kernel::HAL::Out8(0xA0, 0x20);
+}
+
+/// @brief Interrupt handler for the mouse.
+EXTERN_C Void _hal_handle_mouse()
+{
+ hal_handle_mouse();
+}
+
+EXTERN_C Boolean _hal_left_button_pressed()
+{
+ return kMousePacket[0] & kPS2Leftbutton;
+}
+EXTERN_C Boolean _hal_right_button_pressed()
+{
+ return kMousePacket[0] & kPS2Rightbutton;
+}
+EXTERN_C Boolean _hal_middle_button_pressed()
+{
+ return kMousePacket[0] & kPS2Middlebutton;
+}
+
+/// @brief Draws the kernel's mouse.
+EXTERN_C Boolean _hal_draw_mouse()
+{
+ if (!kMousePacketReady)
+ return false;
+
+ bool xNegative, yNegative, xOverflow, yOverflow;
+
+ if (kMousePacket[0] & kPS2XSign)
+ {
+ xNegative = true;
+ }
+ else
+ xNegative = false;
+
+ if (kMousePacket[0] & kPS2YSign)
+ {
+ yNegative = true;
+ }
+ else
+ yNegative = false;
+
+ if (kMousePacket[0] & kPS2XOverflow)
+ {
+ xOverflow = true;
+ }
+ else
+ xOverflow = false;
+
+ if (kMousePacket[0] & kPS2YOverflow)
+ {
+ yOverflow = true;
+ }
+ else
+ yOverflow = false;
+
+ if (!xNegative)
+ {
+ kX += kMousePacket[1];
+ if (xOverflow)
+ {
+ kX += 255;
+ }
+ }
+ else
+ {
+ kMousePacket[1] = 256 - kMousePacket[1];
+ kX -= kMousePacket[1];
+ if (xOverflow)
+ {
+ kX -= 255;
+ }
+ }
+
+ if (!yNegative)
+ {
+ kY -= kMousePacket[2];
+ if (yOverflow)
+ {
+ kY -= 255;
+ }
+ }
+ else
+ {
+ kMousePacket[2] = 256 - kMousePacket[2];
+ kY += kMousePacket[2];
+ if (yOverflow)
+ {
+ kY += 255;
+ }
+ }
+
+ if (kX < 0)
+ kX = 0;
+ if (kX > kHandoverHeader->f_GOP.f_Width - 8)
+ kX = kHandoverHeader->f_GOP.f_Width - 8;
+
+ if (kY < 0)
+ kY = 0;
+ if (kY > kHandoverHeader->f_GOP.f_Height - 16)
+ kY = kHandoverHeader->f_GOP.f_Height - 16;
+
+ /// Draw mouse here.
+
+ kPrevX = kX;
+ kPrevY = kY;
+
+ kMousePacketReady = false;
+ return true;
+}
+
+/// @brief Init kernel mouse.
+EXTERN_C Void _hal_init_mouse()
+{
+ kMousePS2.Init();
+
+ HAL::Out8(0x21, 0b11111001);
+ HAL::Out8(0xA1, 0b11101111);
+}