1 //
2 // Copyright (c) 2010-2018 Antmicro
3 // Copyright (c) 2011-2015 Realtime Embedded
4 //
5 // This file is licensed under the MIT License.
6 // Full license text is available in 'licenses/MIT.txt'.
7 //
8 using System.Collections.Generic;
9 
10 namespace Antmicro.Renode.Peripherals.Input
11 {
12     public sealed class PS2ScanCodeTranslator
13     {
14         public static PS2ScanCodeTranslator Instance { get; private set; }
15 
PS2ScanCodeTranslator()16         static PS2ScanCodeTranslator()
17         {
18             Instance = new PS2ScanCodeTranslator();
19         }
20 
GetCode(KeyScanCode scanCode)21         public int GetCode(KeyScanCode scanCode)
22         {
23             int result;
24             if(!mapping.TryGetValue(scanCode, out result))
25             {
26                 result = 0;
27             }
28             return result;
29         }
30 
PS2ScanCodeTranslator()31         private PS2ScanCodeTranslator()
32         {
33             mapping = new Dictionary<KeyScanCode, int>();
34 
35             mapping.Add(KeyScanCode.Number1, 0x16);
36             mapping.Add(KeyScanCode.Number2, 0x1E);
37             mapping.Add(KeyScanCode.Number3, 0x26);
38             mapping.Add(KeyScanCode.Number4, 0x25);
39             mapping.Add(KeyScanCode.Number5, 0x2E);
40             mapping.Add(KeyScanCode.Number6, 0x36);
41             mapping.Add(KeyScanCode.Number7, 0x3D);
42             mapping.Add(KeyScanCode.Number8, 0x3E);
43             mapping.Add(KeyScanCode.Number9, 0x46);
44             mapping.Add(KeyScanCode.Number0, 0x45);
45             mapping.Add(KeyScanCode.Q, 0x15);
46             mapping.Add(KeyScanCode.W, 0x1D);
47             mapping.Add(KeyScanCode.E, 0x24);
48             mapping.Add(KeyScanCode.R, 0x2D);
49             mapping.Add(KeyScanCode.T, 0x2C);
50             mapping.Add(KeyScanCode.Y, 0x35);
51             mapping.Add(KeyScanCode.U, 0x3C);
52             mapping.Add(KeyScanCode.I, 0x43);
53             mapping.Add(KeyScanCode.O, 0x44);
54             mapping.Add(KeyScanCode.P, 0x4D);
55             mapping.Add(KeyScanCode.A, 0x1C);
56             mapping.Add(KeyScanCode.S, 0x1B);
57             mapping.Add(KeyScanCode.D, 0x23);
58             mapping.Add(KeyScanCode.F, 0x2B);
59             mapping.Add(KeyScanCode.G, 0x34);
60             mapping.Add(KeyScanCode.H, 0x33);
61             mapping.Add(KeyScanCode.J, 0x3B);
62             mapping.Add(KeyScanCode.K, 0x42);
63             mapping.Add(KeyScanCode.L, 0x4B);
64             mapping.Add(KeyScanCode.Z, 0x1A);
65             mapping.Add(KeyScanCode.X, 0x22);
66             mapping.Add(KeyScanCode.C, 0x21);
67             mapping.Add(KeyScanCode.V, 0x2A);
68             mapping.Add(KeyScanCode.B, 0x32);
69             mapping.Add(KeyScanCode.N, 0x31);
70             mapping.Add(KeyScanCode.M, 0x3A);
71             mapping.Add(KeyScanCode.OemMinus, 0x4E);
72             mapping.Add(KeyScanCode.OemPlus, 0x55);
73             mapping.Add(KeyScanCode.OemOpenBrackets, 0x54);
74             mapping.Add(KeyScanCode.OemCloseBrackets, 0x5B);
75             mapping.Add(KeyScanCode.BackSpace, 0x66);
76             mapping.Add(KeyScanCode.OemPipe, 0x5D);
77             mapping.Add(KeyScanCode.OemComma, 0x49);
78             mapping.Add(KeyScanCode.OemSemicolon, 0x4C);
79             mapping.Add(KeyScanCode.OemQuotes, 0x52);
80             mapping.Add(KeyScanCode.OemPeriod, 0x41);
81             mapping.Add(KeyScanCode.OemQuestion, 0x4A);
82             mapping.Add(KeyScanCode.Tab, 0x0D);
83             mapping.Add(KeyScanCode.ShiftL, 0x12);
84             mapping.Add(KeyScanCode.CapsLock, 0x58);
85             mapping.Add(KeyScanCode.ShiftR, 0x59);
86             mapping.Add(KeyScanCode.F1, 0x05);
87             mapping.Add(KeyScanCode.F2, 0x06);
88             mapping.Add(KeyScanCode.F3, 0x04);
89             mapping.Add(KeyScanCode.F4, 0x0C);
90             mapping.Add(KeyScanCode.F5, 0x03);
91             mapping.Add(KeyScanCode.F6, 0x0B);
92             mapping.Add(KeyScanCode.F7, 0x83);
93             mapping.Add(KeyScanCode.F8, 0x0A);
94             mapping.Add(KeyScanCode.F9, 0x01);
95             mapping.Add(KeyScanCode.F10, 0x09);
96             mapping.Add(KeyScanCode.F11, 0x78);
97             mapping.Add(KeyScanCode.F12, 0x07);
98             mapping.Add(KeyScanCode.Pause, 0x777E);
99             mapping.Add(KeyScanCode.Insert, 0xE070);
100             mapping.Add(KeyScanCode.Delete, 0xE071);
101             mapping.Add(KeyScanCode.Left, 0xE06B);
102             mapping.Add(KeyScanCode.Right, 0xE074);
103             mapping.Add(KeyScanCode.Up, 0xE075);
104             mapping.Add(KeyScanCode.Down, 0xE072);
105             mapping.Add(KeyScanCode.Keypad1, 0x69);
106             mapping.Add(KeyScanCode.Keypad2, 0x72);
107             mapping.Add(KeyScanCode.Keypad3, 0x7A);
108             mapping.Add(KeyScanCode.Keypad4, 0x6B);
109             mapping.Add(KeyScanCode.Keypad5, 0x73);
110             mapping.Add(KeyScanCode.Keypad6, 0x74);
111             mapping.Add(KeyScanCode.Keypad7, 0x6C);
112             mapping.Add(KeyScanCode.Keypad8, 0x75);
113             mapping.Add(KeyScanCode.Keypad9, 0x7D);
114             mapping.Add(KeyScanCode.Keypad0, 0x70);
115       //    mapping.Add(KeyScanCode.KDiv, 0x4A);
116             mapping.Add(KeyScanCode.KeypadMultiply, 0x7C);
117             mapping.Add(KeyScanCode.KeypadMinus, 0x7B);
118             mapping.Add(KeyScanCode.KeypadPlus, 0x79);
119             mapping.Add(KeyScanCode.KeypadComma, 0x71);
120             mapping.Add(KeyScanCode.NumLock, 0x77);
121             mapping.Add(KeyScanCode.Enter, 0x5A);
122             mapping.Add(KeyScanCode.KeypadEnter, 0xE01C);
123             mapping.Add(KeyScanCode.CtrlL, 0x14);
124             mapping.Add(KeyScanCode.CtrlR, 0xE014);
125             mapping.Add(KeyScanCode.AltL, 0x11);
126             mapping.Add(KeyScanCode.AltR, 0xE011);
127             mapping.Add(KeyScanCode.WinL, 0xE01F);
128             mapping.Add(KeyScanCode.WinR, 0xE027);
129             mapping.Add(KeyScanCode.WinMenu, 0xE02F);
130             mapping.Add(KeyScanCode.Escape, 0x76);
131             mapping.Add(KeyScanCode.Tilde, 0x0E);
132             mapping.Add(KeyScanCode.Space, 0x29);
133             mapping.Add(KeyScanCode.Home, 0xE06C);
134             mapping.Add(KeyScanCode.End, 0xE069);
135             mapping.Add(KeyScanCode.PageUp, 0xE07D);
136             mapping.Add(KeyScanCode.PageDown, 0xE07A);
137             mapping.Add(KeyScanCode.ScrollLock, 0x7E);
138         }
139 
140         private readonly Dictionary<KeyScanCode, int> mapping;
141     }
142 }
143 
144