using System; using System.Collections.Generic; using System.Linq; using System.Text; using CPUBus = Cosmos.Core_Plugs.IOPortImpl; using Cosmos.Core; using GuessKernel; //using Cosmos.Kernel; namespace Cosmos.Hardware { /// /// This class describes the mouse. /// public class Mouse { private Cosmos.Core.IOGroup.Mouse g = new Core.IOGroup.Mouse(); /// /// The X location of the mouse. /// public uint X; /// /// The Y location of the mouse. /// public uint Y; /// /// The state the mouse is currently in. /// public MouseState Buttons; /// /// This is the required call to start /// the mouse receiving interrupts. /// public void Initialize() { Cosmos.Core_Plugs.IOPortImpl.Read8(0X60); g.p60.Byte = 0x20; byte statusByte = Read(); byte modstatusByte = (byte)(((statusByte >> 2) << 1) + 1); // Enable status byte 2 byte final = (byte)(((modstatusByte >> 5) << 1) + ((modstatusByte << 4) >> 4)); // Disable status byte 5 g.p60.Byte = 0x60; Write(final); //Enable the auxiliary mouse device WaitSignal(); g.p64.Byte = 0xA8; //Tell the mouse to use default settings Write(0xF6); Read(); //Acknowledge //Set Remote Mode Write(0xF0); Read(); //Acknowledge ////Enable the auxiliary mouse device //WaitSignal(); //g.p64.Byte = 0xA8; ////// enable interrupt //WaitSignal(); //g.p64.Byte = 0x20; //WaitData(); //byte tmpst = g.p60.Byte; //tmpst = (byte)(((tmpst >> 2) << 1) + 1); //byte status = (byte)(((tmpst >> 5) << 1) + ((byte)(tmpst << 4) >> 4)); ////byte status = (byte)(g.p60.Byte | 2); //WaitSignal(); //g.p64.Byte = 0x60; //WaitSignal(); //g.p60.Byte = status; ////Tell the mouse to use default settings //Write(0xF6); //Read(); //Acknowledge ////Set Remote Mode //Write(0xF0); //Read(); //Acknowledge } private byte Read() { WaitData(); return g.p60.Byte; } private void Write(byte b) { //Wait to be able to send a command WaitSignal(); //Tell the mouse we are sending a command g.p64.Byte = 0xD4; //Wait for the final part WaitSignal(); //Finally write g.p60.Byte = b; } public bool TimedOut = false; public bool TimedOut2 = false; public bool TimedOut3 = false; public bool TimedOut4 = false; public bool TimedOut5 = false; private void WaitData() { for (int i = 0; i < 100000 && ((g.p64.Byte & 1) != 1); i++) { if (i == 99999) { if (!TimedOut) TimedOut = true; else if (!TimedOut2) TimedOut2 = true; else if (!TimedOut3) TimedOut3 = true; else if (!TimedOut4) TimedOut3 = true; else if (!TimedOut5) TimedOut3 = true; } } } private void WaitSignal() { for (int i = 0; i < 100000 && ((g.p64.Byte & 2) != 0); i++) { } } /// /// The possible states of a mouse. /// public enum MouseState { /// /// No button is pressed. /// None = 0, /// /// The left mouse button is pressed. /// Left = 1, /// /// The right mouse button is pressed. /// Right = 2, /// /// The middle mouse button is pressed. /// Middle = 4 } private byte[] mouse_byte = new byte[4]; public void HandleMouse() { Write(0xEB); uint i = Read(); if (i != 0xFA) // this means it didn't respond with an acknowledge { if (i == 0xFE) // The mouse send back 'Resend' TimedOut4 = true; else { TimedOut3 = true; } } else { TimedOut4 = false; #region Read Bytes mouse_byte[0] = Read(); mouse_byte[1] = Read(); mouse_byte[2] = Read(); #endregion #region Process Bytes X += mouse_byte[1]; Y += mouse_byte[2]; if (X < 0) { X = 0; } else if (X > 319) { X = 319; } if (Y < 0) { Y = 0; } else if (Y > 199) { Y = 199; } if ((mouse_byte[0] & 1) == 1) { Buttons = MouseState.Left; } else if ((mouse_byte[0] & 2) == 1) { Buttons = MouseState.Right; } else if ((mouse_byte[0] & 3) == 1) { Buttons = MouseState.Middle; } #endregion //Console.WriteLine("X: " + X + " Y: " + Y); if (GuessOS.MouseX != X || GuessOS.MouseY != Y) { GuessOS.MouseX = X; GuessOS.MouseY = Y; Cosmos.System.Global.Console.WriteLine("X: " + X + " Y: " + Y); } } } } }