mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 20:39:01 +00:00
129 lines
3.4 KiB
C#
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;
|
|
// }
|
|
// }
|
|
}
|
|
}
|