Cosmos/source/Archive/Cosmos.Hardware/Mouse.cs

129 lines
3.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cosmos.Kernel;
namespace Cosmos.Hardware2
{
public static class Mouse
{
public static int X, Y;
public static MouseState Buttons;
public static void Initialize()
{
////enable mouse
//WaitSignal();
//CPUBus.Write8(0x64, 0xA8);
//// enable interrupt
//WaitSignal();
//CPUBus.Write8(0x64, 0x20);
//WaitData();
//byte status = (byte)(CPUBus.Read8(0x60) | 2);
//WaitSignal();
//CPUBus.Write8(0x64, 0x60);
//WaitSignal();
//CPUBus.Write8(0x60, status);
////default
//Write(0xF6);
//Read(); //Acknowledge
////Enable the mouse
//Write(0xF4);
//Read(); //Acknowledge
//Interrupts.AddIRQHandler(12, new Interrupts.InterruptDelegate(HandleMouse));
}
private static byte Read()
{
WaitData();
return CPUBus.Read8(0x60);
}
private static void Write(byte b)
{
//Wait to be able to send a command
WaitSignal();
//Tell the mouse we are sending a command
CPUBus.Write8(0x64, 0xD4);
//Wait for the final part
WaitSignal();
//Finally write
CPUBus.Write8(0x60, b);
}
private static void WaitData()
{
for (int i = 0; i < 1000 & ((CPUBus.Read8(0x64) & 1) == 1); i++)
;
}
private static void WaitSignal()
{
for (int i = 0; i < 1000 & ((CPUBus.Read8(0x64) & 2) != 0); i++)
;
}
public enum MouseState
{
None=0,
Left=1,
Right =2,
Middle =4
}
private static byte mouse_cycle =0;
private static int[] mouse_byte = new int[4];
// public static void HandleMouse(ref IRQContext context)
// {
// switch (mouse_cycle)
// {
// case 0:
// mouse_byte[0] = CPUBus.Read8(0x60);
// if ((mouse_byte[0] & 0x8) == 0x8)
// mouse_cycle++;
// break;
// case 1:
// mouse_byte[1] = CPUBus.Read8(0x60);
// mouse_cycle++;
// break;
// case 2:
// mouse_byte[2] = CPUBus.Read8(0x60);
// mouse_cycle = 0;
// if ((mouse_byte[0] & 0x10) == 0x10)
// X -= mouse_byte[1] ^ 0xff;
// else
// X += mouse_byte[1];
// if ((mouse_byte[0] & 0x20) == 0x20)
// Y += mouse_byte[2] ^ 0xff;
// else
// 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;
// Buttons = (MouseState)(mouse_byte[0] & 0x7);
// break;
// }
// }
}
}