Files
tinygo/src/machine/usb/keyboard.go
T

1056 lines
44 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package usb
import "errors"
var (
ErrInvalidCodepoint = errors.New("invalid Unicode codepoint")
ErrInvalidKeycode = errors.New("invalid keyboard keycode")
ErrInvalidUTF8 = errors.New("invalid UTF-8 encoding")
ErrKeypressMaximum = errors.New("maximum keypresses exceeded")
)
// Keyboard represents a USB HID keyboard device with support for international
// layouts and various control, system, multimedia, and consumer keycodes.
//
// Keyboard implements the io.Writer interface that translates UTF-8 encoded
// byte strings into sequences of keypress events.
type Keyboard struct {
dc *dcd
hc *descHIDClass
// led holds the current state of all keyboard LEDs:
// 1=NumLock 2=CapsLock 4=ScrollLock 8=Compose 16=Kana
led uint8
// mod holds the current state of all keyboard modifier keys:
// 1=LeftCtrl 2=LeftShift 4=LeftAlt 8=LeftGUI
// 16=RightCtrl 32=RightShift 64=RightAlt 128=RightGUI
mod uint8
// key holds a list of all keyboard keys currently pressed.
key *[hidKeyboardKeyCount]uint8
con *[hidKeyboardConCount]uint16
sys *[hidKeyboardSysCount]uint8
// decode holds the current state of the UTF-8 decoder.
decode decodeState
// wideChar holds high bits for the UTF-8 decoder.
wideChar uint16
}
// decodeState represents a state in the UTF-8 decode state machine.
type decodeState uint8
// Constant enumerated values of type decodeState.
const (
decodeReset decodeState = iota
decodeByte1
decodeByte2
decodeByte3
)
// configure initializes the receiver Keyboard by associating it with the given
// USB device controller driver and HID class configuration.
func (kb *Keyboard) configure(dc *dcd, hc *descHIDClass) {
kb.dc = dc
kb.hc = hc
}
// Write transmits press-and-release key sequences for each Keycode translated
// from the given UTF-8 byte string. Write implements the io.Writer interface
// and conforms to all documented conventions for arguments and return values.
func (kb *Keyboard) Write(b []byte) (n int, err error) {
for _, c := range b {
if err = kb.WriteByte(c); nil != err {
break
}
n += 1
}
return
}
// WriteByte processes a single byte from a UTF-8 byte string. This method is a
// stateful method with respect to the receiver Keyboard, meaning that its exact
// behavior will depend on the current state of its UTF-8 decode state machine:
//
// (a) If the given byte is a valid ASCII encoding (0-127), then a keypress
// sequence is immediately transmitted for the respective Keycode.
//
// (b) If the given byte represents the final byte in a multi-byte codepoint,
// then a keypress sequence is immediately transmitted by translating the
// multi-byte codepoint to its respective Keycode.
//
// (c) If the given byte appears to represent high bits for a multi-byte
// codepoint, then the bits are copied to the receiver's internal state
// machine buffer for use by a subsequent call to WriteByte() (or Write())
// that completes the codepoint.
//
// (d) If the given byte is out of range, or contains illegal bits for the
// current state of the UTF-8 decoder, then the UTF-8 decode state machine
// is reset to its initial state.
//
// In cases (c) and (d), a keypress sequence is not generated and no data is
// transmitted. In case (c), additional bytes must be received via WriteByte()
// (or Write()) to complete or discard the current codepoint.
func (kb *Keyboard) WriteByte(b byte) error {
switch {
case b < 0x80:
// 1-byte encoding (0x00-0x7F)
kb.decode = decodeByte1
return kb.write(uint16(b))
case b < 0xC0:
// 2nd, 3rd, or 4th byte (0x80-0xBF)
b = Keycode(b).key()
switch kb.decode {
case decodeByte2:
kb.decode = decodeByte1
return kb.write(kb.wideChar | uint16(b))
case decodeByte3:
kb.decode = decodeByte2
kb.wideChar |= uint16(b) << 6
}
case b < 0xE0:
// 2-byte encoding (0xC2-0xDF), or illegal byte 2 (0xC0-0xC1)
kb.decode = decodeByte2
kb.wideChar = uint16(b&0x1F) << 6
case b < 0xF0:
// 3-byte encoding (0xE0-0xEF)
kb.decode = decodeByte3
kb.wideChar = uint16(b&0x0F) << 12
default:
// 4-byte encoding unsupported (0xF0-0xF4), or illegal byte 4 (0xF5-0xFF)
kb.decode = decodeReset
return ErrInvalidUTF8
}
return nil
}
func (kb *Keyboard) write(p uint16) error {
c := keycode(p)
if 0 == c {
return ErrInvalidCodepoint
}
if d := deadkey(c); 0 != d {
if err := kb.writeKeycode(d); nil != err {
return err
}
}
return kb.writeKeycode(c)
}
func (kb *Keyboard) writeKeycode(c Keycode) error {
kb.mod = c.mod()
kb.key[0] = c.key()
kb.key[1] = 0
kb.key[2] = 0
kb.key[3] = 0
kb.key[4] = 0
kb.key[5] = 0
if !kb.dc.keyboardSendKeys(false) {
return ErrHIDReportTransfer
}
kb.mod = 0
kb.key[0] = 0
if !kb.dc.keyboardSendKeys(false) {
return ErrHIDReportTransfer
}
return nil
}
// Press transmits a press-and-release sequence for the given Keycode, which
// simulates a discrete keypress event.
//
// The following values of Keycode are supported:
//
// 0x0020 - 0x007F ASCII (U+0020 to U+007F) [USES LAYOUT]
// 0x0080 - 0xC1FF Unicode (U+0080 to U+C1FF) [USES LAYOUT]
// 0xC200 - 0xDFFF UTF-8 packed (U+0080 to U+07FF) [USES LAYOUT]
// 0xE000 - 0xE0FF Modifier key (bitmap, 8 keys, Shift/Ctrl/Alt/GUI)
// 0xE200 - 0xE2FF System key (HID usage code, page 1)
// 0xE400 - 0xE7FF Media/Consumer key (HID usage code, page 12)
// 0xF000 - 0xFFFF Normal key (HID usage code, page 7)
func (kb *Keyboard) Press(c Keycode) error {
if err := kb.Down(c); nil != err {
return err
}
return kb.Up(c)
}
// Down transmits a press (key-down) event for the given Keycode.
//
// The host will interpret the key as being held down continuously until a
// corresponding release (key-up) event is transmitted, e.g., via method Up().
//
// See godoc comment on method Press() for details on what input is accepted and
// how it is interpreted.
func (kb *Keyboard) Down(c Keycode) error {
var res uint8
msb := c >> 8
if msb >= 0xC2 {
if msb < 0xE0 {
c = ((msb & 0x1F) << 6) | Keycode(c.key())
} else {
switch msb {
case 0xF0:
return kb.down(uint8(c), 0)
case 0xE0:
return kb.down(0, uint8(c))
case 0xE2:
return kb.downSys(uint8(c))
default:
if 0xE4 <= msb && msb <= 0xE7 {
return kb.downCon(uint16(c & 0x03FF))
}
return ErrInvalidKeycode
}
}
}
c = keycode(uint16(c))
if 0 == c {
return ErrInvalidCodepoint
}
if d := deadkey(c); 0 != d {
res = kb.mod
if 0 != res {
kb.mod = 0
kb.dc.keyboardSendKeys(false)
}
kb.down(d.key(), d.mod())
kb.up(d.key(), d.mod())
}
return kb.down(c.key(), c.mod()|res)
}
func (kb *Keyboard) down(key uint8, mod uint8) error {
send := false
if 0 != mod {
if kb.mod&mod != mod {
kb.mod |= mod
send = true
}
}
if 0 != key {
for _, k := range kb.key {
if k == key {
goto end
}
}
for i, k := range kb.key {
if 0 == k {
kb.key[i] = key
send = true
goto end
}
}
return ErrKeypressMaximum
}
end:
if send {
if !kb.dc.keyboardSendKeys(false) {
return ErrHIDReportTransfer
}
}
return nil
}
func (kb *Keyboard) downCon(key uint16) error {
if 0 == key {
return ErrInvalidKeycode
}
for _, k := range kb.con {
if key == k {
return nil // already pressed
}
}
for i, k := range kb.con {
if 0 == k {
kb.con[i] = key
if !kb.dc.keyboardSendKeys(true) {
return ErrHIDReportTransfer
}
return nil
}
}
return ErrKeypressMaximum
}
func (kb *Keyboard) downSys(key uint8) error {
if 0 == key {
return ErrInvalidKeycode
}
for _, k := range kb.sys {
if key == k {
return nil // already pressed
}
}
for i, k := range kb.sys {
if 0 == k {
kb.sys[i] = key
if !kb.dc.keyboardSendKeys(true) {
return ErrHIDReportTransfer
}
return nil
}
}
return ErrKeypressMaximum
}
// Release transmits a release (key-up) event for the given Keycode.
//
// See godoc comment on method Press() for details on what input is accepted and
// how it is interpreted.
func (kb *Keyboard) Up(c Keycode) error {
msb := c >> 8
if msb >= 0xC2 {
if msb < 0xE0 {
c = ((msb & 0x1F) << 6) | Keycode(c.key())
} else {
switch msb {
case 0xF0:
return kb.up(uint8(c), 0)
case 0xE0:
return kb.up(0, uint8(c))
case 0xE2:
return kb.upSys(uint8(c))
default:
if 0xE4 <= msb && msb <= 0xE7 {
return kb.upCon(uint16(c & 0x03FF))
}
return ErrInvalidKeycode
}
}
}
c = keycode(uint16(c))
if 0 == c {
return ErrInvalidCodepoint
}
return kb.up(c.key(), c.mod())
}
func (kb *Keyboard) Release() error {
bits := uint16(kb.mod)
kb.mod = 0
for i, k := range kb.key {
bits |= uint16(k)
kb.key[i] = 0
}
if 0 != bits {
if !kb.dc.keyboardSendKeys(false) {
return ErrHIDReportTransfer
}
}
bits = 0
for i, k := range kb.con {
bits |= k
kb.con[i] = 0
}
for i, k := range kb.sys {
bits |= uint16(k)
kb.sys[i] = 0
}
if 0 != bits {
if !kb.dc.keyboardSendKeys(true) {
return ErrHIDReportTransfer
}
}
return nil
}
func (kb *Keyboard) up(key uint8, mod uint8) error {
send := false
if 0 != mod {
if kb.mod&mod != 0 {
kb.mod &^= mod
send = true
}
}
if 0 != key {
for i, k := range kb.key {
if key == k {
kb.key[i] = 0
send = true
}
}
}
if send {
if !kb.dc.keyboardSendKeys(false) {
return ErrHIDReportTransfer
}
}
return nil
}
func (kb *Keyboard) upCon(key uint16) error {
if 0 == key {
return ErrInvalidKeycode
}
for i, k := range kb.con {
if key == k {
kb.con[i] = 0
if !kb.dc.keyboardSendKeys(true) {
return ErrHIDReportTransfer
}
return nil
}
}
return nil
}
func (kb *Keyboard) upSys(key uint8) error {
if 0 == key {
return ErrInvalidKeycode
}
for i, k := range kb.sys {
if key == k {
kb.sys[i] = 0
if !kb.dc.keyboardSendKeys(true) {
return ErrHIDReportTransfer
}
return nil
}
}
return nil
}
// Keycode is a package-defined bitmap used to encode the value of a given key.
type Keycode uint16
// keycode returns the given Unicode codepoint translated to a Keycode sequence.
// Unicode codepoints greater than U+FFFF are unsupported.
//go:inline
func keycode(p uint16) Keycode {
if p < 0x80 {
return ascii[p]
} else if p >= 0xA0 && p < 0x0100 {
return iso88591[p-0xA0]
} else if uint16(UNICODEEXTRA00) == p {
return KEYCODEEXTRA00.mask()
}
return 0
}
//go:inline
func deadkey(c Keycode) Keycode {
switch c & deadkeysMask {
case acuteAccentBits:
return deadkeyAcuteAccent
case circumflexBits:
return deadkeyCircumflex
case diaeresisBits:
return deadkeyDiaeresis
case graveAccentBits:
return deadkeyGraveAccent
case tildeBits:
return deadkeyTilde
}
return 0
}
//go:inline
func (c Keycode) mask() Keycode { return c & keycodeMask }
//go:inline
func (c Keycode) key() uint8 { return uint8(c & keyMask) }
//go:inline
func (c Keycode) mod() uint8 {
var m Keycode
if 0 != c&shiftMask {
m |= KeyModifierShift
}
if 0 != c&altgrMask {
m |= KeyModifierRightAlt
}
return uint8(m)
}
//go:inline
func (c Keycode) Shift() Keycode { return c | KeyModifierShift }
const (
hidKeyboardKeyCount = 6 // Max number of simultaneous keypresses
hidKeyboardSysCount = 3
hidKeyboardConCount = 4
)
// Keycodes common to all Keyboard layouts
const (
KeyModifierCtrl Keycode = (0x01 | 0xE000)
KeyModifierShift Keycode = (0x02 | 0xE000)
KeyModifierAlt Keycode = (0x04 | 0xE000)
KeyModifierGUI Keycode = (0x08 | 0xE000)
KeyModifierLeftCtrl Keycode = (0x01 | 0xE000)
KeyModifierLeftShift Keycode = (0x02 | 0xE000)
KeyModifierLeftAlt Keycode = (0x04 | 0xE000)
KeyModifierLeftGUI Keycode = (0x08 | 0xE000)
KeyModifierRightCtrl Keycode = (0x10 | 0xE000)
KeyModifierRightShift Keycode = (0x20 | 0xE000)
KeyModifierRightAlt Keycode = (0x40 | 0xE000)
KeyModifierRightGUI Keycode = (0x80 | 0xE000)
KeySystemPowerDown Keycode = (0x81 | 0xE200)
KeySystemSleep Keycode = (0x82 | 0xE200)
KeySystemWakeUp Keycode = (0x83 | 0xE200)
KeyMediaPlay Keycode = (0xB0 | 0xE400)
KeyMediaPause Keycode = (0xB1 | 0xE400)
KeyMediaRecord Keycode = (0xB2 | 0xE400)
KeyMediaFastForward Keycode = (0xB3 | 0xE400)
KeyMediaRewind Keycode = (0xB4 | 0xE400)
KeyMediaNextTrack Keycode = (0xB5 | 0xE400)
KeyMediaPrevTrack Keycode = (0xB6 | 0xE400)
KeyMediaStop Keycode = (0xB7 | 0xE400)
KeyMediaEject Keycode = (0xB8 | 0xE400)
KeyMediaRandomPlay Keycode = (0xB9 | 0xE400)
KeyMediaPlayPause Keycode = (0xCD | 0xE400)
KeyMediaPlaySkip Keycode = (0xCE | 0xE400)
KeyMediaMute Keycode = (0xE2 | 0xE400)
KeyMediaVolumeInc Keycode = (0xE9 | 0xE400)
KeyMediaVolumeDec Keycode = (0xEA | 0xE400)
KeyA Keycode = (4 | 0xF000)
KeyB Keycode = (5 | 0xF000)
KeyC Keycode = (6 | 0xF000)
KeyD Keycode = (7 | 0xF000)
KeyE Keycode = (8 | 0xF000)
KeyF Keycode = (9 | 0xF000)
KeyG Keycode = (10 | 0xF000)
KeyH Keycode = (11 | 0xF000)
KeyI Keycode = (12 | 0xF000)
KeyJ Keycode = (13 | 0xF000)
KeyK Keycode = (14 | 0xF000)
KeyL Keycode = (15 | 0xF000)
KeyM Keycode = (16 | 0xF000)
KeyN Keycode = (17 | 0xF000)
KeyO Keycode = (18 | 0xF000)
KeyP Keycode = (19 | 0xF000)
KeyQ Keycode = (20 | 0xF000)
KeyR Keycode = (21 | 0xF000)
KeyS Keycode = (22 | 0xF000)
KeyT Keycode = (23 | 0xF000)
KeyU Keycode = (24 | 0xF000)
KeyV Keycode = (25 | 0xF000)
KeyW Keycode = (26 | 0xF000)
KeyX Keycode = (27 | 0xF000)
KeyY Keycode = (28 | 0xF000)
KeyZ Keycode = (29 | 0xF000)
Key1 Keycode = (30 | 0xF000)
Key2 Keycode = (31 | 0xF000)
Key3 Keycode = (32 | 0xF000)
Key4 Keycode = (33 | 0xF000)
Key5 Keycode = (34 | 0xF000)
Key6 Keycode = (35 | 0xF000)
Key7 Keycode = (36 | 0xF000)
Key8 Keycode = (37 | 0xF000)
Key9 Keycode = (38 | 0xF000)
Key0 Keycode = (39 | 0xF000)
KeyEnter Keycode = (40 | 0xF000)
KeyEsc Keycode = (41 | 0xF000)
KeyBackspace Keycode = (42 | 0xF000)
KeyTab Keycode = (43 | 0xF000)
KeySpace Keycode = (44 | 0xF000)
KeyMinus Keycode = (45 | 0xF000)
KeyEqual Keycode = (46 | 0xF000)
KeyLeftBrace Keycode = (47 | 0xF000)
KeyRightBrace Keycode = (48 | 0xF000)
KeyBackslash Keycode = (49 | 0xF000)
KeyNonUsNum Keycode = (50 | 0xF000)
KeySemicolon Keycode = (51 | 0xF000)
KeyQuote Keycode = (52 | 0xF000)
KeyTilde Keycode = (53 | 0xF000)
KeyComma Keycode = (54 | 0xF000)
KeyPeriod Keycode = (55 | 0xF000)
KeySlash Keycode = (56 | 0xF000)
KeyCapsLock Keycode = (57 | 0xF000)
KeyF1 Keycode = (58 | 0xF000)
KeyF2 Keycode = (59 | 0xF000)
KeyF3 Keycode = (60 | 0xF000)
KeyF4 Keycode = (61 | 0xF000)
KeyF5 Keycode = (62 | 0xF000)
KeyF6 Keycode = (63 | 0xF000)
KeyF7 Keycode = (64 | 0xF000)
KeyF8 Keycode = (65 | 0xF000)
KeyF9 Keycode = (66 | 0xF000)
KeyF10 Keycode = (67 | 0xF000)
KeyF11 Keycode = (68 | 0xF000)
KeyF12 Keycode = (69 | 0xF000)
KeyPrintscreen Keycode = (70 | 0xF000)
KeyScrollLock Keycode = (71 | 0xF000)
KeyPause Keycode = (72 | 0xF000)
KeyInsert Keycode = (73 | 0xF000)
KeyHome Keycode = (74 | 0xF000)
KeyPageUp Keycode = (75 | 0xF000)
KeyDelete Keycode = (76 | 0xF000)
KeyEnd Keycode = (77 | 0xF000)
KeyPageDown Keycode = (78 | 0xF000)
KeyRight Keycode = (79 | 0xF000)
KeyLeft Keycode = (80 | 0xF000)
KeyDown Keycode = (81 | 0xF000)
KeyUp Keycode = (82 | 0xF000)
KeyNumLock Keycode = (83 | 0xF000)
KeypadSlash Keycode = (84 | 0xF000)
KeypadAsterisk Keycode = (85 | 0xF000)
KeypadMinus Keycode = (86 | 0xF000)
KeypadPlus Keycode = (87 | 0xF000)
KeypadEnter Keycode = (88 | 0xF000)
Keypad1 Keycode = (89 | 0xF000)
Keypad2 Keycode = (90 | 0xF000)
Keypad3 Keycode = (91 | 0xF000)
Keypad4 Keycode = (92 | 0xF000)
Keypad5 Keycode = (93 | 0xF000)
Keypad6 Keycode = (94 | 0xF000)
Keypad7 Keycode = (95 | 0xF000)
Keypad8 Keycode = (96 | 0xF000)
Keypad9 Keycode = (97 | 0xF000)
Keypad0 Keycode = (98 | 0xF000)
KeypadPeriod Keycode = (99 | 0xF000)
KeyNonUSBS Keycode = (100 | 0xF000)
KeyMenu Keycode = (101 | 0xF000)
KeyF13 Keycode = (104 | 0xF000)
KeyF14 Keycode = (105 | 0xF000)
KeyF15 Keycode = (106 | 0xF000)
KeyF16 Keycode = (107 | 0xF000)
KeyF17 Keycode = (108 | 0xF000)
KeyF18 Keycode = (109 | 0xF000)
KeyF19 Keycode = (110 | 0xF000)
KeyF20 Keycode = (111 | 0xF000)
KeyF21 Keycode = (112 | 0xF000)
KeyF22 Keycode = (113 | 0xF000)
KeyF23 Keycode = (114 | 0xF000)
KeyF24 Keycode = (115 | 0xF000)
KeyUpArrow Keycode = KeyUp
KeyDownArrow Keycode = KeyDown
KeyLeftArrow Keycode = KeyLeft
KeyRightArrow Keycode = KeyRight
KeyReturn Keycode = KeyEnter
KeyLeftCtrl Keycode = KeyModifierLeftCtrl
KeyLeftShift Keycode = KeyModifierLeftShift
KeyLeftAlt Keycode = KeyModifierLeftAlt
KeyLeftGUI Keycode = KeyModifierLeftGUI
KeyRightCtrl Keycode = KeyModifierRightCtrl
KeyRightShift Keycode = KeyModifierRightShift
KeyRightAlt Keycode = KeyModifierRightAlt
KeyRightGUI Keycode = KeyModifierRightGUI
)
// Keycodes for layout US English (0x0904)
const (
keycodeMask Keycode = 0x07FF
keyMask Keycode = 0x003F
shiftMask Keycode = 0x0040
altgrMask Keycode = 0x0080
deadkeysMask Keycode = 0x0700
circumflexBits Keycode = 0x0100
acuteAccentBits Keycode = 0x0200
graveAccentBits Keycode = 0x0300
tildeBits Keycode = 0x0400
diaeresisBits Keycode = 0x0500
deadkeyCircumflex Keycode = Key6 + shiftMask
deadkeyAcuteAccent Keycode = KeyQuote
deadkeyGraveAccent Keycode = KeyTilde
deadkeyTilde Keycode = KeyTilde + shiftMask
deadkeyDiaeresis Keycode = KeyQuote + shiftMask
ASCII00 Keycode = 0 // 0 NUL
ASCII01 Keycode = 0 // 1 SOH
ASCII02 Keycode = 0 // 2 STX
ASCII03 Keycode = 0 // 3 ETX
ASCII04 Keycode = 0 // 4 EOT
ASCII05 Keycode = 0 // 5 ENQ
ASCII06 Keycode = 0 // 6 ACK
ASCII07 Keycode = 0 // 7 BEL
ASCII08 Keycode = KeyBackspace // 8 BS
ASCII09 Keycode = KeyTab // 9 TAB
ASCII0A Keycode = KeyEnter // 10 LF
ASCII0B Keycode = 0 // 11 VT
ASCII0C Keycode = 0 // 12 FF
ASCII0D Keycode = 0 // 13 CR
ASCII0E Keycode = 0 // 14 SO
ASCII0F Keycode = 0 // 15 SI
ASCII10 Keycode = 0 // 16 DEL
ASCII11 Keycode = 0 // 17 DC1
ASCII12 Keycode = 0 // 18 DC2
ASCII13 Keycode = 0 // 19 DC3
ASCII14 Keycode = 0 // 20 DC4
ASCII15 Keycode = 0 // 21 NAK
ASCII16 Keycode = 0 // 22 SYN
ASCII17 Keycode = 0 // 23 ETB
ASCII18 Keycode = 0 // 24 CAN
ASCII19 Keycode = 0 // 25 EM
ASCII1A Keycode = 0 // 26 SUB
ASCII1B Keycode = 0 // 27 ESC
ASCII1C Keycode = 0 // 28 FS
ASCII1D Keycode = 0 // 29 GS
ASCII1E Keycode = 0 // 30 RS
ASCII1F Keycode = 0 // 31 US
ASCII20 Keycode = KeySpace // 32 SPACE
ASCII21 Keycode = Key1 + shiftMask // 33 !
ASCII22 Keycode = diaeresisBits + KeySpace // 34 "
ASCII23 Keycode = Key3 + shiftMask // 35 #
ASCII24 Keycode = Key4 + shiftMask // 36 $
ASCII25 Keycode = Key5 + shiftMask // 37 %
ASCII26 Keycode = Key7 + shiftMask // 38 &
ASCII27 Keycode = acuteAccentBits + KeySpace // 39 '
ASCII28 Keycode = Key9 + shiftMask // 40 (
ASCII29 Keycode = Key0 + shiftMask // 41 )
ASCII2A Keycode = Key8 + shiftMask // 42 *
ASCII2B Keycode = KeyEqual + shiftMask // 43 +
ASCII2C Keycode = KeyComma // 44 ,
ASCII2D Keycode = KeyMinus // 45 -
ASCII2E Keycode = KeyPeriod // 46 .
ASCII2F Keycode = KeySlash // 47 /
ASCII30 Keycode = Key0 // 48 0
ASCII31 Keycode = Key1 // 49 1
ASCII32 Keycode = Key2 // 50 2
ASCII33 Keycode = Key3 // 51 3
ASCII34 Keycode = Key4 // 52 4
ASCII35 Keycode = Key5 // 53 5
ASCII36 Keycode = Key6 // 54 6
ASCII37 Keycode = Key7 // 55 7
ASCII38 Keycode = Key8 // 55 8
ASCII39 Keycode = Key9 // 57 9
ASCII3A Keycode = KeySemicolon + shiftMask // 58 :
ASCII3B Keycode = KeySemicolon // 59 ;
ASCII3C Keycode = KeyComma + shiftMask // 60 <
ASCII3D Keycode = KeyEqual // 61 =
ASCII3E Keycode = KeyPeriod + shiftMask // 62 >
ASCII3F Keycode = KeySlash + shiftMask // 63 ?
ASCII40 Keycode = Key2 + shiftMask // 64 @
ASCII41 Keycode = KeyA + shiftMask // 65 A
ASCII42 Keycode = KeyB + shiftMask // 66 B
ASCII43 Keycode = KeyC + shiftMask // 67 C
ASCII44 Keycode = KeyD + shiftMask // 68 D
ASCII45 Keycode = KeyE + shiftMask // 69 E
ASCII46 Keycode = KeyF + shiftMask // 70 F
ASCII47 Keycode = KeyG + shiftMask // 71 G
ASCII48 Keycode = KeyH + shiftMask // 72 H
ASCII49 Keycode = KeyI + shiftMask // 73 I
ASCII4A Keycode = KeyJ + shiftMask // 74 J
ASCII4B Keycode = KeyK + shiftMask // 75 K
ASCII4C Keycode = KeyL + shiftMask // 76 L
ASCII4D Keycode = KeyM + shiftMask // 77 M
ASCII4E Keycode = KeyN + shiftMask // 78 N
ASCII4F Keycode = KeyO + shiftMask // 79 O
ASCII50 Keycode = KeyP + shiftMask // 80 P
ASCII51 Keycode = KeyQ + shiftMask // 81 Q
ASCII52 Keycode = KeyR + shiftMask // 82 R
ASCII53 Keycode = KeyS + shiftMask // 83 S
ASCII54 Keycode = KeyT + shiftMask // 84 T
ASCII55 Keycode = KeyU + shiftMask // 85 U
ASCII56 Keycode = KeyV + shiftMask // 86 V
ASCII57 Keycode = KeyW + shiftMask // 87 W
ASCII58 Keycode = KeyX + shiftMask // 88 X
ASCII59 Keycode = KeyY + shiftMask // 89 Y
ASCII5A Keycode = KeyZ + shiftMask // 90 Z
ASCII5B Keycode = KeyLeftBrace // 91 [
ASCII5C Keycode = KeyBackslash // 92 \
ASCII5D Keycode = KeyRightBrace // 93 ]
ASCII5E Keycode = circumflexBits + KeySpace // 94 ^
ASCII5F Keycode = KeyMinus + shiftMask // 95
ASCII60 Keycode = graveAccentBits + KeySpace // 96 `
ASCII61 Keycode = KeyA // 97 a
ASCII62 Keycode = KeyB // 98 b
ASCII63 Keycode = KeyC // 99 c
ASCII64 Keycode = KeyD // 100 d
ASCII65 Keycode = KeyE // 101 e
ASCII66 Keycode = KeyF // 102 f
ASCII67 Keycode = KeyG // 103 g
ASCII68 Keycode = KeyH // 104 h
ASCII69 Keycode = KeyI // 105 i
ASCII6A Keycode = KeyJ // 106 j
ASCII6B Keycode = KeyK // 107 k
ASCII6C Keycode = KeyL // 108 l
ASCII6D Keycode = KeyM // 109 m
ASCII6E Keycode = KeyN // 110 n
ASCII6F Keycode = KeyO // 111 o
ASCII70 Keycode = KeyP // 112 p
ASCII71 Keycode = KeyQ // 113 q
ASCII72 Keycode = KeyR // 114 r
ASCII73 Keycode = KeyS // 115 s
ASCII74 Keycode = KeyT // 116 t
ASCII75 Keycode = KeyU // 117 u
ASCII76 Keycode = KeyV // 118 v
ASCII77 Keycode = KeyW // 119 w
ASCII78 Keycode = KeyX // 120 x
ASCII79 Keycode = KeyY // 121 y
ASCII7A Keycode = KeyZ // 122 z
ASCII7B Keycode = KeyLeftBrace + shiftMask // 123 {
ASCII7C Keycode = KeyBackslash + shiftMask // 124 |
ASCII7D Keycode = KeyRightBrace + shiftMask // 125 }
ASCII7E Keycode = tildeBits + KeySpace // 126 ~
ASCII7F Keycode = KeyBackspace // 127 DEL
ISO88591A0 Keycode = KeySpace // 160 Nonbreakng Space
ISO88591A1 Keycode = Key1 + altgrMask // 161 ¡ Inverted Exclamation
ISO88591A2 Keycode = KeyC + altgrMask + shiftMask // 162 ¢ Cent SIGN
ISO88591A3 Keycode = Key4 + altgrMask + shiftMask // 163 £ Pound Sign
ISO88591A4 Keycode = Key4 + altgrMask // 164 ¤ Currency or Euro Sign
ISO88591A5 Keycode = KeyMinus + altgrMask // 165 ¥ YEN SIGN
ISO88591A6 Keycode = KeyBackslash + altgrMask + shiftMask // 166 ¦ BROKEN BAR ??
ISO88591A7 Keycode = KeyS + altgrMask + shiftMask // 167 § SECTION SIGN
ISO88591A8 Keycode = KeyQuote + altgrMask + shiftMask // 168 ¨ DIAERESIS
ISO88591A9 Keycode = KeyC + altgrMask // 169 © COPYRIGHT SIGN
ISO88591AA Keycode = 0 // 170 ª FEMININE ORDINAL
ISO88591AB Keycode = KeyLeftBrace + altgrMask // 171 « LEFT DOUBLE ANGLE QUOTE
ISO88591AC Keycode = KeyBackslash + altgrMask // 172 ¬ NOT SIGN ??
ISO88591AD Keycode = 0 // 173 SOFT HYPHEN
ISO88591AE Keycode = KeyR + altgrMask // 174 ® REGISTERED SIGN
ISO88591AF Keycode = 0 // 175 ¯ MACRON
ISO88591B0 Keycode = KeySemicolon + altgrMask + shiftMask // 176 ° DEGREE SIGN
ISO88591B1 Keycode = 0 // 177 ± PLUS-MINUS SIGN
ISO88591B2 Keycode = Key2 + altgrMask // 178 ² SUPERSCRIPT TWO
ISO88591B3 Keycode = Key3 + altgrMask // 179 ³ SUPERSCRIPT THREE
ISO88591B4 Keycode = KeyQuote + altgrMask // 180 ´ ACUTE ACCENT
ISO88591B5 Keycode = KeyM + altgrMask // 181 µ MICRO SIGN
ISO88591B6 Keycode = KeySemicolon + altgrMask // 182 ¶ PILCROW SIGN
ISO88591B7 Keycode = 0 // 183 · MIDDLE DOT
ISO88591B8 Keycode = 0 // 184 ¸ CEDILLA
ISO88591B9 Keycode = Key1 + altgrMask + shiftMask // 185 ¹ SUPERSCRIPT ONE
ISO88591BA Keycode = 0 // 186 º MASCULINE ORDINAL
ISO88591BB Keycode = KeyRightBrace + altgrMask // 187 » RIGHT DOUBLE ANGLE QUOTE
ISO88591BC Keycode = Key6 + altgrMask // 188 ¼ FRACTION ONE QUARTER
ISO88591BD Keycode = Key7 + altgrMask // 189 ½ FRACTION ONE HALF
ISO88591BE Keycode = Key8 + altgrMask // 190 ¾ FRACTION THREE QUARTERS
ISO88591BF Keycode = KeySlash + altgrMask // 191 ¿ INVERTED QUESTION MARK
ISO88591C0 Keycode = graveAccentBits + KeyA + shiftMask // 192 À A GRAVE
ISO88591C1 Keycode = KeyA + altgrMask + shiftMask // 193 Á A ACUTE
ISO88591C2 Keycode = circumflexBits + KeyA + shiftMask // 194 Â A CIRCUMFLEX
ISO88591C3 Keycode = tildeBits + KeyA + shiftMask // 195 Ã A TILDE
ISO88591C4 Keycode = KeyQ + altgrMask + shiftMask // 196 Ä A DIAERESIS
ISO88591C5 Keycode = KeyW + altgrMask + shiftMask // 197 Å A RING ABOVE
ISO88591C6 Keycode = KeyZ + altgrMask + shiftMask // 198 Æ AE
ISO88591C7 Keycode = KeyComma + altgrMask + shiftMask // 199 Ç C CEDILLA
ISO88591C8 Keycode = graveAccentBits + KeyE + shiftMask // 200 È E GRAVE
ISO88591C9 Keycode = KeyE + altgrMask + shiftMask // 201 É E ACUTE
ISO88591CA Keycode = circumflexBits + KeyE + shiftMask // 202 Ê E CIRCUMFLEX
ISO88591CB Keycode = diaeresisBits + KeyE + shiftMask // 203 Ë E DIAERESIS
ISO88591CC Keycode = graveAccentBits + KeyI + shiftMask // 204 Ì I GRAVE
ISO88591CD Keycode = KeyI + altgrMask + shiftMask // 205 Í I ACUTE
ISO88591CE Keycode = circumflexBits + KeyI + shiftMask // 206 Î I CIRCUMFLEX
ISO88591CF Keycode = diaeresisBits + KeyI + shiftMask // 207 Ï I DIAERESIS
ISO88591D0 Keycode = KeyD + altgrMask + shiftMask // 208 Ð ETH
ISO88591D1 Keycode = KeyN + altgrMask + shiftMask // 209 Ñ N TILDE
ISO88591D2 Keycode = graveAccentBits + KeyO + shiftMask // 210 Ò O GRAVE
ISO88591D3 Keycode = KeyO + altgrMask + shiftMask // 211 Ó O ACUTE
ISO88591D4 Keycode = circumflexBits + KeyO + shiftMask // 212 Ô O CIRCUMFLEX
ISO88591D5 Keycode = tildeBits + KeyO + shiftMask // 213 Õ O TILDE
ISO88591D6 Keycode = KeyP + altgrMask + shiftMask // 214 Ö O DIAERESIS
ISO88591D7 Keycode = KeyEqual + altgrMask // 215 × MULTIPLICATION
ISO88591D8 Keycode = KeyL + altgrMask + shiftMask // 216 Ø O STROKE
ISO88591D9 Keycode = graveAccentBits + KeyU + shiftMask // 217 Ù U GRAVE
ISO88591DA Keycode = KeyU + altgrMask + shiftMask // 218 Ú U ACUTE
ISO88591DB Keycode = circumflexBits + KeyU + shiftMask // 219 Û U CIRCUMFLEX
ISO88591DC Keycode = KeyY + altgrMask + shiftMask // 220 Ü U DIAERESIS
ISO88591DD Keycode = acuteAccentBits + KeyY + shiftMask // 221 Ý Y ACUTE
ISO88591DE Keycode = KeyT + altgrMask + shiftMask // 222 Þ THORN
ISO88591DF Keycode = KeyS + altgrMask // 223 ß SHARP S
ISO88591E0 Keycode = graveAccentBits + KeyA // 224 à a GRAVE
ISO88591E1 Keycode = KeyA + altgrMask // 225 á a ACUTE
ISO88591E2 Keycode = circumflexBits + KeyA // 226 â a CIRCUMFLEX
ISO88591E3 Keycode = tildeBits + KeyA // 227 ã a TILDE
ISO88591E4 Keycode = diaeresisBits + KeyA // 228 ä a DIAERESIS
ISO88591E5 Keycode = KeyW + altgrMask // 229 å a RING ABOVE
ISO88591E6 Keycode = KeyZ + altgrMask // 230 æ ae
ISO88591E7 Keycode = KeyComma + altgrMask // 231 ç c CEDILLA
ISO88591E8 Keycode = graveAccentBits + KeyE // 232 è e GRAVE
ISO88591E9 Keycode = acuteAccentBits + KeyE // 233 é e ACUTE
ISO88591EA Keycode = circumflexBits + KeyE // 234 ê e CIRCUMFLEX
ISO88591EB Keycode = diaeresisBits + KeyE // 235 ë e DIAERESIS
ISO88591EC Keycode = graveAccentBits + KeyI // 236 ì i GRAVE
ISO88591ED Keycode = KeyI + altgrMask // 237 í i ACUTE
ISO88591EE Keycode = circumflexBits + KeyI // 238 î i CIRCUMFLEX
ISO88591EF Keycode = diaeresisBits + KeyI // 239 ï i DIAERESIS
ISO88591F0 Keycode = KeyD + altgrMask // 240 ð ETH
ISO88591F1 Keycode = KeyN + altgrMask // 241 ñ n TILDE
ISO88591F2 Keycode = graveAccentBits + KeyO // 242 ò o GRAVE
ISO88591F3 Keycode = KeyO + altgrMask // 243 ó o ACUTE
ISO88591F4 Keycode = circumflexBits + KeyO // 244 ô o CIRCUMFLEX
ISO88591F5 Keycode = tildeBits + KeyO // 245 õ o TILDE
ISO88591F6 Keycode = KeyP + altgrMask // 246 ö o DIAERESIS
ISO88591F7 Keycode = KeyEqual + altgrMask + shiftMask // 247 ÷ DIVISION
ISO88591F8 Keycode = KeyL + altgrMask // 248 ø o STROKE
ISO88591F9 Keycode = graveAccentBits + KeyU // 249 ù u GRAVE
ISO88591FA Keycode = KeyU + altgrMask // 250 ú u ACUTE
ISO88591FB Keycode = circumflexBits + KeyU // 251 û u CIRCUMFLEX
ISO88591FC Keycode = KeyY + altgrMask // 252 ü u DIAERESIS
ISO88591FD Keycode = acuteAccentBits + KeyY // 253 ý y ACUTE
ISO88591FE Keycode = KeyT + altgrMask // 254 þ THORN
ISO88591FF Keycode = diaeresisBits + KeyY // 255 ÿ y DIAERESIS
UNICODE20AC Keycode = Key5 + altgrMask // € Euro Sign
UNICODEEXTRA00 Keycode = 0x20AC
KEYCODEEXTRA00 Keycode = Key5 + altgrMask // 20AC € Euro Sign
// ASCII20 Keycode = KeySpace // 32 SPACE
// ASCII21 Keycode = Key1 + shiftMask // 33 !
// ASCII22 Keycode = KeyQuote + shiftMask // 34 "
// ASCII23 Keycode = Key3 + shiftMask // 35 #
// ASCII24 Keycode = Key4 + shiftMask // 36 $
// ASCII25 Keycode = Key5 + shiftMask // 37 %
// ASCII26 Keycode = Key7 + shiftMask // 38 &
// ASCII27 Keycode = KeyQuote // 39 '
// ASCII28 Keycode = Key9 + shiftMask // 40 (
// ASCII29 Keycode = Key0 + shiftMask // 41 )
// ASCII2A Keycode = Key8 + shiftMask // 42 *
// ASCII2B Keycode = KeyEqual + shiftMask // 43 +
// ASCII2C Keycode = KeyComma // 44 ,
// ASCII2D Keycode = KeyMinus // 45 -
// ASCII2E Keycode = KeyPeriod // 46 .
// ASCII2F Keycode = KeySlash // 47 /
// ASCII30 Keycode = Key0 // 48 0
// ASCII31 Keycode = Key1 // 49 1
// ASCII32 Keycode = Key2 // 50 2
// ASCII33 Keycode = Key3 // 51 3
// ASCII34 Keycode = Key4 // 52 4
// ASCII35 Keycode = Key5 // 53 5
// ASCII36 Keycode = Key6 // 54 6
// ASCII37 Keycode = Key7 // 55 7
// ASCII38 Keycode = Key8 // 55 8
// ASCII39 Keycode = Key9 // 57 9
// ASCII3A Keycode = KeySemicolon + shiftMask // 58 :
// ASCII3B Keycode = KeySemicolon // 59 ;
// ASCII3C Keycode = KeyComma + shiftMask // 60 <
// ASCII3D Keycode = KeyEqual // 61 =
// ASCII3E Keycode = KeyPeriod + shiftMask // 62 >
// ASCII3F Keycode = KeySlash + shiftMask // 63 ?
// ASCII40 Keycode = Key2 + shiftMask // 64 @
// ASCII41 Keycode = KeyA + shiftMask // 65 A
// ASCII42 Keycode = KeyB + shiftMask // 66 B
// ASCII43 Keycode = KeyC + shiftMask // 67 C
// ASCII44 Keycode = KeyD + shiftMask // 68 D
// ASCII45 Keycode = KeyE + shiftMask // 69 E
// ASCII46 Keycode = KeyF + shiftMask // 70 F
// ASCII47 Keycode = KeyG + shiftMask // 71 G
// ASCII48 Keycode = KeyH + shiftMask // 72 H
// ASCII49 Keycode = KeyI + shiftMask // 73 I
// ASCII4A Keycode = KeyJ + shiftMask // 74 J
// ASCII4B Keycode = KeyK + shiftMask // 75 K
// ASCII4C Keycode = KeyL + shiftMask // 76 L
// ASCII4D Keycode = KeyM + shiftMask // 77 M
// ASCII4E Keycode = KeyN + shiftMask // 78 N
// ASCII4F Keycode = KeyO + shiftMask // 79 O
// ASCII50 Keycode = KeyP + shiftMask // 80 P
// ASCII51 Keycode = KeyQ + shiftMask // 81 Q
// ASCII52 Keycode = KeyR + shiftMask // 82 R
// ASCII53 Keycode = KeyS + shiftMask // 83 S
// ASCII54 Keycode = KeyT + shiftMask // 84 T
// ASCII55 Keycode = KeyU + shiftMask // 85 U
// ASCII56 Keycode = KeyV + shiftMask // 86 V
// ASCII57 Keycode = KeyW + shiftMask // 87 W
// ASCII58 Keycode = KeyX + shiftMask // 88 X
// ASCII59 Keycode = KeyY + shiftMask // 89 Y
// ASCII5A Keycode = KeyZ + shiftMask // 90 Z
// ASCII5B Keycode = KeyLeftBrace // 91 [
// ASCII5C Keycode = KeyBackslash // 92 \
// ASCII5D Keycode = KeyRightBrace // 93 ]
// ASCII5E Keycode = Key6 + shiftMask // 94 ^
// ASCII5F Keycode = KeyMinus + shiftMask // 95
// ASCII60 Keycode = KeyTilde // 96 `
// ASCII61 Keycode = KeyA // 97 a
// ASCII62 Keycode = KeyB // 98 b
// ASCII63 Keycode = KeyC // 99 c
// ASCII64 Keycode = KeyD // 100 d
// ASCII65 Keycode = KeyE // 101 e
// ASCII66 Keycode = KeyF // 102 f
// ASCII67 Keycode = KeyG // 103 g
// ASCII68 Keycode = KeyH // 104 h
// ASCII69 Keycode = KeyI // 105 i
// ASCII6A Keycode = KeyJ // 106 j
// ASCII6B Keycode = KeyK // 107 k
// ASCII6C Keycode = KeyL // 108 l
// ASCII6D Keycode = KeyM // 109 m
// ASCII6E Keycode = KeyN // 110 n
// ASCII6F Keycode = KeyO // 111 o
// ASCII70 Keycode = KeyP // 112 p
// ASCII71 Keycode = KeyQ // 113 q
// ASCII72 Keycode = KeyR // 114 r
// ASCII73 Keycode = KeyS // 115 s
// ASCII74 Keycode = KeyT // 116 t
// ASCII75 Keycode = KeyU // 117 u
// ASCII76 Keycode = KeyV // 118 v
// ASCII77 Keycode = KeyW // 119 w
// ASCII78 Keycode = KeyX // 120 x
// ASCII79 Keycode = KeyY // 121 y
// ASCII7A Keycode = KeyZ // 122 z
// ASCII7B Keycode = KeyLeftBrace + shiftMask // 123 {
// ASCII7C Keycode = KeyBackslash + shiftMask // 124 |
// ASCII7D Keycode = KeyRightBrace + shiftMask // 125 }
// ASCII7E Keycode = KeyTilde + shiftMask // 126 ~
// ASCII7F Keycode = KeyBackspace // 127 DEL
)
var ascii = [...]Keycode{
ASCII00.mask(), ASCII01.mask(), ASCII02.mask(), ASCII03.mask(),
ASCII04.mask(), ASCII05.mask(), ASCII06.mask(), ASCII07.mask(),
ASCII08.mask(), ASCII09.mask(), ASCII0A.mask(), ASCII0B.mask(),
ASCII0C.mask(), ASCII0D.mask(), ASCII0E.mask(), ASCII0F.mask(),
ASCII10.mask(), ASCII11.mask(), ASCII12.mask(), ASCII13.mask(),
ASCII14.mask(), ASCII15.mask(), ASCII16.mask(), ASCII17.mask(),
ASCII18.mask(), ASCII19.mask(), ASCII1A.mask(), ASCII1B.mask(),
ASCII1C.mask(), ASCII1D.mask(), ASCII1E.mask(), ASCII1F.mask(),
ASCII20.mask(), ASCII21.mask(), ASCII22.mask(), ASCII23.mask(),
ASCII24.mask(), ASCII25.mask(), ASCII26.mask(), ASCII27.mask(),
ASCII28.mask(), ASCII29.mask(), ASCII2A.mask(), ASCII2B.mask(),
ASCII2C.mask(), ASCII2D.mask(), ASCII2E.mask(), ASCII2F.mask(),
ASCII30.mask(), ASCII31.mask(), ASCII32.mask(), ASCII33.mask(),
ASCII34.mask(), ASCII35.mask(), ASCII36.mask(), ASCII37.mask(),
ASCII38.mask(), ASCII39.mask(), ASCII3A.mask(), ASCII3B.mask(),
ASCII3C.mask(), ASCII3D.mask(), ASCII3E.mask(), ASCII3F.mask(),
ASCII40.mask(), ASCII41.mask(), ASCII42.mask(), ASCII43.mask(),
ASCII44.mask(), ASCII45.mask(), ASCII46.mask(), ASCII47.mask(),
ASCII48.mask(), ASCII49.mask(), ASCII4A.mask(), ASCII4B.mask(),
ASCII4C.mask(), ASCII4D.mask(), ASCII4E.mask(), ASCII4F.mask(),
ASCII50.mask(), ASCII51.mask(), ASCII52.mask(), ASCII53.mask(),
ASCII54.mask(), ASCII55.mask(), ASCII56.mask(), ASCII57.mask(),
ASCII58.mask(), ASCII59.mask(), ASCII5A.mask(), ASCII5B.mask(),
ASCII5C.mask(), ASCII5D.mask(), ASCII5E.mask(), ASCII5F.mask(),
ASCII60.mask(), ASCII61.mask(), ASCII62.mask(), ASCII63.mask(),
ASCII64.mask(), ASCII65.mask(), ASCII66.mask(), ASCII67.mask(),
ASCII68.mask(), ASCII69.mask(), ASCII6A.mask(), ASCII6B.mask(),
ASCII6C.mask(), ASCII6D.mask(), ASCII6E.mask(), ASCII6F.mask(),
ASCII70.mask(), ASCII71.mask(), ASCII72.mask(), ASCII73.mask(),
ASCII74.mask(), ASCII75.mask(), ASCII76.mask(), ASCII77.mask(),
ASCII78.mask(), ASCII79.mask(), ASCII7A.mask(), ASCII7B.mask(),
ASCII7C.mask(), ASCII7D.mask(), ASCII7E.mask(), ASCII7F.mask(),
}
var iso88591 = [...]Keycode{
ISO88591A0.mask(), ISO88591A1.mask(), ISO88591A2.mask(), ISO88591A3.mask(),
ISO88591A4.mask(), ISO88591A5.mask(), ISO88591A6.mask(), ISO88591A7.mask(),
ISO88591A8.mask(), ISO88591A9.mask(), ISO88591AA.mask(), ISO88591AB.mask(),
ISO88591AC.mask(), ISO88591AD.mask(), ISO88591AE.mask(), ISO88591AF.mask(),
ISO88591B0.mask(), ISO88591B1.mask(), ISO88591B2.mask(), ISO88591B3.mask(),
ISO88591B4.mask(), ISO88591B5.mask(), ISO88591B6.mask(), ISO88591B7.mask(),
ISO88591B8.mask(), ISO88591B9.mask(), ISO88591BA.mask(), ISO88591BB.mask(),
ISO88591BC.mask(), ISO88591BD.mask(), ISO88591BE.mask(), ISO88591BF.mask(),
ISO88591C0.mask(), ISO88591C1.mask(), ISO88591C2.mask(), ISO88591C3.mask(),
ISO88591C4.mask(), ISO88591C5.mask(), ISO88591C6.mask(), ISO88591C7.mask(),
ISO88591C8.mask(), ISO88591C9.mask(), ISO88591CA.mask(), ISO88591CB.mask(),
ISO88591CC.mask(), ISO88591CD.mask(), ISO88591CE.mask(), ISO88591CF.mask(),
ISO88591D0.mask(), ISO88591D1.mask(), ISO88591D2.mask(), ISO88591D3.mask(),
ISO88591D4.mask(), ISO88591D5.mask(), ISO88591D6.mask(), ISO88591D7.mask(),
ISO88591D8.mask(), ISO88591D9.mask(), ISO88591DA.mask(), ISO88591DB.mask(),
ISO88591DC.mask(), ISO88591DD.mask(), ISO88591DE.mask(), ISO88591DF.mask(),
ISO88591E0.mask(), ISO88591E1.mask(), ISO88591E2.mask(), ISO88591E3.mask(),
ISO88591E4.mask(), ISO88591E5.mask(), ISO88591E6.mask(), ISO88591E7.mask(),
ISO88591E8.mask(), ISO88591E9.mask(), ISO88591EA.mask(), ISO88591EB.mask(),
ISO88591EC.mask(), ISO88591ED.mask(), ISO88591EE.mask(), ISO88591EF.mask(),
ISO88591F0.mask(), ISO88591F1.mask(), ISO88591F2.mask(), ISO88591F3.mask(),
ISO88591F4.mask(), ISO88591F5.mask(), ISO88591F6.mask(), ISO88591F7.mask(),
ISO88591F8.mask(), ISO88591F9.mask(), ISO88591FA.mask(), ISO88591FB.mask(),
ISO88591FC.mask(), ISO88591FD.mask(), ISO88591FE.mask(), ISO88591FF.mask(),
}