feat: some clean up and validation of multiboot header

This commit is contained in:
2021-03-04 22:18:58 +01:00
parent 300e80c2e8
commit e532099ea7
9 changed files with 419 additions and 15 deletions

View File

@@ -0,0 +1,810 @@
[
[
"1",
"29/A9",
"0E/F0 0E",
"0E/F0 0E",
"`",
"~"
],
[
"2",
"02/82",
"16/F0 16",
"16/F0 16",
"1",
"!"
],
[
"3",
"03/83",
"1E/F0 1E",
"1E/F0 1E",
"2",
"@"
],
[
"4",
"04/84",
"26/F0 26",
"26/F0 26",
"3",
"#"
],
[
"5",
"05/85",
"25/F0 25",
"25/F0 25",
"4",
"$"
],
[
"6",
"06/86",
"2E/F0 2E",
"2E/F0 2E",
"5",
"%"
],
[
"7",
"07/87",
"36/F0 36",
"36/F0 36",
"6",
"^"
],
[
"8",
"08/88",
"3D/F0 3D",
"3D/F0 3D",
"7",
"&"
],
[
"9",
"09/89",
"3E/F0 3E",
"3E/F0 3E",
"8",
"*"
],
[
"10",
"0A/8A",
"46/F0 46",
"46/F0 46",
"9",
"("
],
[
"11",
"0B/8B",
"45/F0 45",
"45/F0 45",
"0",
")"
],
[
"12",
"0C/8C",
"4E/F0 4E",
"4E/F0 4E",
"-",
"_"
],
[
"13",
"0D/8D",
"55/F0 55",
"55/F0 55",
"=",
"+"
],
[
"15",
"0E/8E",
"66/F0 66",
"66/F0 66",
"Backspace",
""
],
[
"16",
"0F/8F",
"0D/F0 0D",
"0D/F0 0D",
"Tab",
""
],
[
"17",
"10/90",
"15/F0 15",
"15/F0 15",
"q",
"Q"
],
[
"18",
"11/91",
"1D/F0 1D",
"1D/F0 1D",
"w",
"W"
],
[
"19",
"12/92",
"24/F0 24",
"24/F0 24",
"e",
"E"
],
[
"20",
"13/93",
"2D/F0 2D",
"2D/F0 2D",
"r",
"R"
],
[
"21",
"14/94",
"2C/F0 2C",
"2C/F0 2C",
"t",
"T"
],
[
"22",
"15/95",
"35/F0 35",
"35/F0 35",
"y",
"Y"
],
[
"23",
"16/96",
"3C/F0 3C",
"3C/F0 3C",
"u",
"U"
],
[
"24",
"17/97",
"43/F0 43",
"43/F0 43",
"i",
"I"
],
[
"25",
"18/98",
"44/F0 44",
"44/F0 44",
"o",
"O"
],
[
"26",
"19/99",
"4D/F0 4D",
"4D/F0 4D",
"p",
"P"
],
[
"27",
"1A/9A",
"54/F0 54",
"54/F0 54",
"[",
"{"
],
[
"28",
"1B/9B",
"5B/F0 5B",
"5B/F0 5B",
"]",
"}"
],
[
"30",
"3A/BA",
"58/F0 58",
"58/F0 58",
"Caps Lock",
""
],
[
"31",
"1E/9E",
"1C/F0 1C",
"1C/F0 1C",
"a",
"A"
],
[
"32",
"1F/9F",
"1B/F0 1B",
"1B/F0 1B",
"s",
"S"
],
[
"33",
"20/A0",
"23/F0 23",
"23/F0 23",
"d",
"D"
],
[
"34",
"21/A1",
"2B/F0 2B",
"2B/F0 2B",
"f",
"F"
],
[
"35",
"22/A2",
"34/F0 34",
"34/F0 34",
"g",
"G"
],
[
"36",
"23/A3",
"33/F0 33",
"33/F0 33",
"h",
"H"
],
[
"37",
"24/A4",
"3B/F0 3B",
"3B/F0 3B",
"j",
"J"
],
[
"38",
"25/A5",
"42/F0 42",
"42/F0 42",
"k",
"K"
],
[
"39",
"26/A6",
"4B/F0 4B",
"4B/F0 4B",
"l",
"L"
],
[
"40",
"27/A7",
"4C/F0 4C",
"4C/F0 4C",
";",
":"
],
[
"41",
"28/A8",
"52/F0 52",
"52/F0 52",
"'",
"\""
],
[
"43",
"1C/9C",
"5A/F0 5A",
"5A/F0 5A",
"Enter",
"Enter"
],
[
"44",
"2A/AA",
"12/F0 12",
"12/F0 12",
"Left Shift",
""
],
[
"46",
"2C/AC",
"1A/F0 1A",
"1A/F0 1A",
"z",
"Z"
],
[
"47",
"2D/AD",
"22/F0 22",
"22/F0 22",
"x",
"X"
],
[
"48",
"2E/AE",
"21/F0 21",
"21/F0 21",
"c",
"C"
],
[
"49",
"2F/AF",
"2A/F0 2A",
"2A/F0 2A",
"v",
"V"
],
[
"50",
"30/B0",
"32/F0 32",
"32/F0 32",
"b",
"B"
],
[
"51",
"31/B1",
"31/F0 31",
"31/F0 31",
"n",
"N"
],
[
"52",
"32/B2",
"3A/F0 3A",
"3A/F0 3A",
"m",
"M"
],
[
"53",
"33/B3",
"41/F0 41",
"41/F0 41",
",",
"<"
],
[
"54",
"34/B4",
"49/F0 49",
"49/F0 49",
".",
">"
],
[
"55",
"35/B5",
"4A/F0 4A",
"4A/F0 4A",
"/",
"?"
],
[
"57",
"36/B6",
"59/F0 59",
"59/F0 59",
"Right Shift",
""
],
[
"58",
"1D/9D",
"14/F0 14",
"11/F0 11",
"Left Ctrl",
""
],
[
"60",
"38/B8",
"11/F0 11",
"19/F0 19",
"Left Alt",
""
],
[
"61",
"39/B9",
"29/F0 29",
"29/F0 29",
"Spacebar",
""
],
[
"62",
"E0 38/E0 B8",
"E0 11/E0 F0 11",
"39/F0 39",
"Right Alt",
""
],
[
"64",
"E0 1D/E0 9D",
"E0 14/E0 F0 14",
"58/F0 58",
"Right Ctrl",
""
],
[
"75",
"E0 52/E0 D2 (base)",
"E0 70/E0 F0 70 (base)",
"67/F0 67",
"Insert",
""
],
[
"76",
"E0 4B/E0 CB (base)",
"E0 71/E0 F0 71 (base)",
"64/F0 64",
"Delete",
""
],
[
"79",
"E0 4B/E0 CB (base)",
"E0 6B/E0 F0 6B (base)",
"61/F0 61",
"Left Arrow",
""
],
[
"80",
"E0 47/E0 C7 (base)",
"E0 6C/E0 F0 6C (base)",
"6E/F0 6E",
"Home",
""
],
[
"81",
"E0 4F/E0 CF (base)",
"E0 69/E0 F0 69 (base)",
"65/F0 65",
"End",
""
],
[
"83",
"E0 48/E0 C8 (base)",
"E0 75/E0 F0 75 (base)",
"63/F0 63",
"Up Arrow",
""
],
[
"84",
"E0 50/E0 D0 (base)",
"E0 72/E0 F0 72 (base)",
"60/F0 60",
"Down Arrow",
""
],
[
"85",
"E0 49/E0 C9 (base)",
"E0 7D/E0 F0 7D (base)",
"6F/F0 6F",
"Page Up",
""
],
[
"86",
"E0 51/E0 D1 (base)",
"E0 7A/E0 F0 7A (base)",
"6D/F0 6D",
"Page Down",
""
],
[
"89",
"E0 4D/E0 CD (base)",
"E0 74/E0 F0 74 (base)",
"6A/F0 6A",
"Right Arrow",
""
],
[
"90",
"45/C5",
"77/F0 77",
"76/F0 76",
"Num Lock",
""
],
[
"91",
"47/C7",
"6C/F0 6C",
"6C/F0 6C",
"Keypad 7",
""
],
[
"92",
"4B/CB",
"6B/F0 6B",
"6B/F0 6B",
"Keypad 4",
""
],
[
"93",
"4F/CF",
"69/F0 69",
"69/F0 69",
"Keypad 1",
""
],
[
"95",
"E0 35/E0 B5 (base)",
"E0 4A/E0 F0 4A (base)",
"77/F0 77",
"Keypad /",
""
],
[
"96",
"48/C8",
"75/F0 75",
"75/F0 75",
"Keypad 8",
""
],
[
"97",
"4C/CC",
"73/F0 73",
"73/F0 73",
"Keypad 5",
""
],
[
"98",
"50/D0",
"72/F0 72",
"72/F0 72",
"Keypad 2",
""
],
[
"99",
"52/D2",
"70/F0 70",
"70/F0 70",
"Keypad 0",
""
],
[
"100",
"37/B7",
"7C/F0 7C",
"7E/F0 7E",
"Keypad *",
""
],
[
"101",
"49/C9",
"7D/F0 7D",
"7D/F0 7D",
"Keypad 9",
""
],
[
"102",
"4D/CD",
"74/F0 74",
"74/F0 74",
"Keypad 6",
""
],
[
"103",
"51/D1",
"7A/F0 7A",
"7A/F0 7A",
"Keypad 3",
""
],
[
"104",
"53/D3",
"71/F0 71",
"71/F0 71",
"Keypad .",
""
],
[
"105",
"4A/CA",
"7B/F0 7B",
"84/F0 84",
"Keypad -",
""
],
[
"106",
"4E/CE",
"79/F0 79",
"7C/F0 7C",
"Keypad +",
""
],
[
"108",
"E0 1C/E0 9C",
"E0 5A/E0 F0 5A",
"79/F0 79",
"Keypad Enter",
""
],
[
"110",
"01/81",
"76/F0 76",
"08/F0 08",
"Esc",
""
],
[
"112",
"3B/BB",
"05/F0 05",
"07/F0 07",
"F1",
""
],
[
"113",
"3C/BC",
"06/F0 06",
"0F/F0 0F",
"F2",
""
],
[
"114",
"3D/BD",
"04/F0 04",
"17/F0 17",
"F3",
""
],
[
"115",
"3E/BE",
"0C/F0 0C",
"1F/F0 1F",
"F4",
""
],
[
"116",
"3F/BF",
"03/F0 03",
"27/F0 27",
"F5",
""
],
[
"117",
"40/C0",
"0B/F0 0B",
"2F/F0 2F",
"F6",
""
],
[
"118",
"41/C1",
"83/F0 83",
"37/F0 37",
"F7",
""
],
[
"119",
"42/C2",
"0A/F0 0A",
"3F/F0 3F",
"F8",
""
],
[
"120",
"43/C3",
"01/F0 01",
"47/F0 47",
"F9",
""
],
[
"121",
"44/C4",
"09/F0 09",
"4F/F0 4F",
"F10",
""
],
[
"122",
"57/D7",
"78/F0 78",
"56/F0 56",
"F11",
""
],
[
"123",
"58/D8",
"07/F0 07",
"5E/F0 5E",
"F12",
""
],
[
"124",
"E0 2A E0 37/E0 B7 E0 AA",
"E0 12 E0 7C/E0 F0 7C E0 F0 12",
"57/F0 57",
"Print Screen",
""
],
[
"125",
"46/C6",
"7E/F0 7E",
"5F/F0 5F",
"Scroll Lock",
""
],
[
"126",
"E1 1D 45/E1 9D C5",
"E1 14 77 E1/F0 14 F0 77",
"62/F0 62",
"Pause Break",
""
],
[
"29 or 42*",
"2B/AB",
"5D/F0 5D",
"5C/F0 5C or 53/F0 53",
"\\",
"|"
]
]

View File

@@ -0,0 +1,124 @@
#!/usr/bin/env python3
import functools
import itertools
import json
import unicodedata
from typing import NamedTuple, List, Optional
import pyperclip
class KeyCode(NamedTuple):
scan_code: int
name_lower: str
name_upper: str
ascii_lower: Optional[str]
ascii_upper: Optional[str]
# scancodes retrieved from https://wiki.osdev.org/PS/2_Keyboard
# scancodes transformed with https://www.convertjson.com/html-table-to-json.htm
blacklist_names = {'(zero)'}
special_map = {
'\\': 'forwardSlash',
'/': 'backSlash',
'[': 'bracketLeft',
']': 'bracketRight',
';': 'colonPressed',
"'": None,
'`': None,
',': 'comma',
'.': 'dot',
# todo keypad *
'-': 'dash',
'=': 'equals',
}
def get_unknown(i):
return KeyCode(i, f"Unknown{i:02x}Lower", f"Unknown{i:02x}Upper", None, None)
def not_in_blacklist(name: str) -> bool:
return name not in blacklist_names
def remove_braces(name: str) -> str:
name = name.lstrip('(').rstrip(')')
if name in special_map:
return special_map[name]
return name
def key_name_to_name(names: List[str]) -> str:
_names: List[str] = list(filter(lambda i: i is not None, map(remove_braces, filter(not_in_blacklist, names))))
_names_cap = itertools.chain([_names[0][0].lower() + _names[0][1:]],
map(lambda i: i[0].upper() + i[1:], _names[1:]))
return ''.join(_names_cap)
def get_name(item: str):
item = item.replace(' ', ' ')
if len(item) == 1:
item = unicodedata.name(item).title()
if item.startswith('Latin'):
return 'Letter' + item.split()[-1]
return item.replace(' ', '_') if item else None
def transform_set1(path):
codes = []
with open(path) as f:
data = json.load(f)
for ibm_number, make_break_1, _, _, lower, upper in data:
make_code, break_code = make_break_1.split('/')
if make_code.startswith('E0') or make_code.startswith('E1'):
# skipping multi codes for now
continue
make_code_i = int(make_code, base=16)
break_code_i = int(break_code, base=16)
if make_code_i != break_code_i ^ 0x80:
raise ValueError("Make/Break not equal" + ibm_number)
codes.append(KeyCode(
make_code_i,
get_name(lower),
get_name(upper),
lower,
upper,
))
codes_map = {}
for code in codes:
if code.scan_code in codes_map:
raise ValueError(f"Duplicate code {code!r}")
codes_map[code.scan_code] = code
# max_val = functools.reduce(lambda a, b: max(a, b), map(lambda x: x.scan_code, codes), 0)
return codes_map
# txts = []
# for i in range(max_val):
# code = codes_map.get(i) or get_unknown(i)
# txts.append(f'{code.scan_code}\t{code.name_lower}\t{code.name_upper}\t{code.ascii_lower or None}\t{code.ascii_upper or None}')
# pyperclip.copy('\n'.join(txts))
def get_ascii_val(val: str):
if not val:
return 'NULL'
if len(val) > 1:
return 'NULL'
if val == "'":
return "'\\''"
return repr(val)
def main():
transform_set1()
if __name__ == '__main__':
main()