summaryrefslogtreecommitdiff
path: root/Emulator/Chip/HIDDevice.cs
blob: 87bb2c38c64d01d4bdcab40c78469a1db509da40 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
namespace Q1.Emulator.Chip;

public class HIDDevice : RamDevice
{
    public HIDDevice(u16 start) : base(start, HIDDevice.CalculateSize()) { }

    public static u16 CalculateSize()
    {
        return 4 + 256;
    }

    public void SetMouse(u16 positionalIndex, bool leftDown, bool rightDown, bool middleDown)
    {
        this.WriteWord(this.AddressableStart, positionalIndex);
        u16 buttons = (u16) ((leftDown ? 1 : 0)
                             | ((rightDown ? 1 : 0)  << 1)
                             | ((middleDown ? 1 : 0) << 2));
        this.WriteWord((u16) (this.AddressableStart + 2), buttons);
    }

    public void SetKeyboard(u8 scanCode, bool pressed)
    {
        int index = scanCode >> 3; // keyCode / 8
        int bit = scanCode & 7;    // keyCode % 8

        ushort addr = (ushort) (4 + index);
        u8 value = this.Read(addr);

        if (pressed)
            value |= (u8) (1 << bit);
        else
            value &= (u8) ~(1 << bit);

        this.Write((u16) (this.AddressableStart + addr), value);
    }
}