ksim65/src/main/kotlin/razorvine/c64emu/Petscii.kt

1122 lines
66 KiB
Kotlin
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 razorvine.c64emu
import java.io.CharConversionException
object Petscii {
// decoding: from Petscii/Screencodes (0-255) to unicode
// character tables used from https://github.com/dj51d/cbmcodecs
private val decodingPetsciiLowercase = arrayOf(
'\u0000', // 0x00 -> \u0000
'\ufffe', // 0x01 -> UNDEFINED
'\ufffe', // 0x02 -> UNDEFINED
'\ufffe', // 0x03 -> UNDEFINED
'\ufffe', // 0x04 -> UNDEFINED
'\uf100', // 0x05 -> WHITE COLOR SWITCH (CUS)
'\ufffe', // 0x06 -> UNDEFINED
'\ufffe', // 0x07 -> UNDEFINED
'\uf118', // 0x08 -> DISABLE CHARACTER SET SWITCHING (CUS)
'\uf119', // 0x09 -> ENABLE CHARACTER SET SWITCHING (CUS)
'\ufffe', // 0x0A -> UNDEFINED
'\ufffe', // 0x0B -> UNDEFINED
'\ufffe', // 0x0C -> UNDEFINED
'\r' , // 0x0D -> CARRIAGE RETURN
'\u000e', // 0x0E -> SHIFT OUT
'\ufffe', // 0x0F -> UNDEFINED
'\ufffe', // 0x10 -> UNDEFINED
'\uf11c', // 0x11 -> CURSOR DOWN (CUS)
'\uf11a', // 0x12 -> REVERSE VIDEO ON (CUS)
'\uf120', // 0x13 -> HOME (CUS)
'\u007f', // 0x14 -> DELETE
'\ufffe', // 0x15 -> UNDEFINED
'\ufffe', // 0x16 -> UNDEFINED
'\ufffe', // 0x17 -> UNDEFINED
'\ufffe', // 0x18 -> UNDEFINED
'\ufffe', // 0x19 -> UNDEFINED
'\ufffe', // 0x1A -> UNDEFINED
'\ufffe', // 0x1B -> UNDEFINED
'\uf101', // 0x1C -> RED COLOR SWITCH (CUS)
'\uf11d', // 0x1D -> CURSOR RIGHT (CUS)
'\uf102', // 0x1E -> GREEN COLOR SWITCH (CUS)
'\uf103', // 0x1F -> BLUE COLOR SWITCH (CUS)
' ' , // 0x20 -> SPACE
'!' , // ! 0x21 -> EXCLAMATION MARK
'"' , // " 0x22 -> QUOTATION MARK
'#' , // # 0x23 -> NUMBER SIGN
'$' , // $ 0x24 -> DOLLAR SIGN
'%' , // % 0x25 -> PERCENT SIGN
'&' , // & 0x26 -> AMPERSAND
'\'' , // ' 0x27 -> APOSTROPHE
'(' , // ( 0x28 -> LEFT PARENTHESIS
')' , // ) 0x29 -> RIGHT PARENTHESIS
'*' , // * 0x2A -> ASTERISK
'+' , // + 0x2B -> PLUS SIGN
',' , // , 0x2C -> COMMA
'-' , // - 0x2D -> HYPHEN-MINUS
'.' , // . 0x2E -> FULL STOP
'/' , // / 0x2F -> SOLIDUS
'0' , // 0 0x30 -> DIGIT ZERO
'1' , // 1 0x31 -> DIGIT ONE
'2' , // 2 0x32 -> DIGIT TWO
'3' , // 3 0x33 -> DIGIT THREE
'4' , // 4 0x34 -> DIGIT FOUR
'5' , // 5 0x35 -> DIGIT FIVE
'6' , // 6 0x36 -> DIGIT SIX
'7' , // 7 0x37 -> DIGIT SEVEN
'8' , // 8 0x38 -> DIGIT EIGHT
'9' , // 9 0x39 -> DIGIT NINE
':' , // : 0x3A -> COLON
';' , // ; 0x3B -> SEMICOLON
'<' , // < 0x3C -> LESS-THAN SIGN
'=' , // = 0x3D -> EQUALS SIGN
'>' , // > 0x3E -> GREATER-THAN SIGN
'?' , // ? 0x3F -> QUESTION MARK
'@' , // @ 0x40 -> COMMERCIAL AT
'a' , // a 0x41 -> LATIN SMALL LETTER A
'b' , // b 0x42 -> LATIN SMALL LETTER B
'c' , // c 0x43 -> LATIN SMALL LETTER C
'd' , // d 0x44 -> LATIN SMALL LETTER D
'e' , // e 0x45 -> LATIN SMALL LETTER E
'f' , // f 0x46 -> LATIN SMALL LETTER F
'g' , // g 0x47 -> LATIN SMALL LETTER G
'h' , // h 0x48 -> LATIN SMALL LETTER H
'i' , // i 0x49 -> LATIN SMALL LETTER I
'j' , // j 0x4A -> LATIN SMALL LETTER J
'k' , // k 0x4B -> LATIN SMALL LETTER K
'l' , // l 0x4C -> LATIN SMALL LETTER L
'm' , // m 0x4D -> LATIN SMALL LETTER M
'n' , // n 0x4E -> LATIN SMALL LETTER N
'o' , // o 0x4F -> LATIN SMALL LETTER O
'p' , // p 0x50 -> LATIN SMALL LETTER P
'q' , // q 0x51 -> LATIN SMALL LETTER Q
'r' , // r 0x52 -> LATIN SMALL LETTER R
's' , // s 0x53 -> LATIN SMALL LETTER S
't' , // t 0x54 -> LATIN SMALL LETTER T
'u' , // u 0x55 -> LATIN SMALL LETTER U
'v' , // v 0x56 -> LATIN SMALL LETTER V
'w' , // w 0x57 -> LATIN SMALL LETTER W
'x' , // x 0x58 -> LATIN SMALL LETTER X
'y' , // y 0x59 -> LATIN SMALL LETTER Y
'z' , // z 0x5A -> LATIN SMALL LETTER Z
'[' , // [ 0x5B -> LEFT SQUARE BRACKET
'\u00a3', // £ 0x5C -> POUND SIGN
']' , // ] 0x5D -> RIGHT SQUARE BRACKET
'\u2191', // ↑ 0x5E -> UPWARDS ARROW
'\u2190', // ← 0x5F -> LEFTWARDS ARROW
'\u2500', // ─ 0x60 -> BOX DRAWINGS LIGHT HORIZONTAL
'A' , // A 0x61 -> LATIN CAPITAL LETTER A
'B' , // B 0x62 -> LATIN CAPITAL LETTER B
'C' , // C 0x63 -> LATIN CAPITAL LETTER C
'D' , // D 0x64 -> LATIN CAPITAL LETTER D
'E' , // E 0x65 -> LATIN CAPITAL LETTER E
'F' , // F 0x66 -> LATIN CAPITAL LETTER F
'G' , // G 0x67 -> LATIN CAPITAL LETTER G
'H' , // H 0x68 -> LATIN CAPITAL LETTER H
'I' , // I 0x69 -> LATIN CAPITAL LETTER I
'J' , // J 0x6A -> LATIN CAPITAL LETTER J
'K' , // K 0x6B -> LATIN CAPITAL LETTER K
'L' , // L 0x6C -> LATIN CAPITAL LETTER L
'M' , // M 0x6D -> LATIN CAPITAL LETTER M
'N' , // N 0x6E -> LATIN CAPITAL LETTER N
'O' , // O 0x6F -> LATIN CAPITAL LETTER O
'P' , // P 0x70 -> LATIN CAPITAL LETTER P
'Q' , // Q 0x71 -> LATIN CAPITAL LETTER Q
'R' , // R 0x72 -> LATIN CAPITAL LETTER R
'S' , // S 0x73 -> LATIN CAPITAL LETTER S
'T' , // T 0x74 -> LATIN CAPITAL LETTER T
'U' , // U 0x75 -> LATIN CAPITAL LETTER U
'V' , // V 0x76 -> LATIN CAPITAL LETTER V
'W' , // W 0x77 -> LATIN CAPITAL LETTER W
'X' , // X 0x78 -> LATIN CAPITAL LETTER X
'Y' , // Y 0x79 -> LATIN CAPITAL LETTER Y
'Z' , // Z 0x7A -> LATIN CAPITAL LETTER Z
'\u253c', // ┼ 0x7B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
'\uf12e', //  0x7C -> LEFT HALF BLOCK MEDIUM SHADE (CUS)
'\u2502', // │ 0x7D -> BOX DRAWINGS LIGHT VERTICAL
'\u2592', // ▒ 0x7E -> MEDIUM SHADE
'\uf139', //  0x7F -> MEDIUM SHADE SLASHED LEFT (CUS)
'\ufffe', // 0x80 -> UNDEFINED
'\uf104', // 0x81 -> ORANGE COLOR SWITCH (CUS)
'\ufffe', // 0x82 -> UNDEFINED
'\ufffe', // 0x83 -> UNDEFINED
'\ufffe', // 0x84 -> UNDEFINED
'\uf110', //  0x85 -> FUNCTION KEY 1 (CUS)
'\uf112', //  0x86 -> FUNCTION KEY 3 (CUS)
'\uf114', //  0x87 -> FUNCTION KEY 5 (CUS)
'\uf116', //  0x88 -> FUNCTION KEY 7 (CUS)
'\uf111', //  0x89 -> FUNCTION KEY 2 (CUS)
'\uf113', //  0x8A -> FUNCTION KEY 4 (CUS)
'\uf115', //  0x8B -> FUNCTION KEY 6 (CUS)
'\uf117', //  0x8C -> FUNCTION KEY 8 (CUS)
'\n' , // 0x8D -> LINE FEED
'\u000f', //  0x8E -> SHIFT IN
'\ufffe', // 0x8F -> UNDEFINED
'\uf105', // 0x90 -> BLACK COLOR SWITCH (CUS)
'\uf11e', //  0x91 -> CURSOR UP (CUS)
'\uf11b', //  0x92 -> REVERSE VIDEO OFF (CUS)
'\u000c', // 0x93 -> FORM FEED
'\uf121', //  0x94 -> INSERT (CUS)
'\uf106', // 0x95 -> BROWN COLOR SWITCH (CUS)
'\uf107', // 0x96 -> LIGHT RED COLOR SWITCH (CUS)
'\uf108', // 0x97 -> GRAY 1 COLOR SWITCH (CUS)
'\uf109', //  0x98 -> GRAY 2 COLOR SWITCH (CUS)
'\uf10a', //  0x99 -> LIGHT GREEN COLOR SWITCH (CUS)
'\uf10b', //  0x9A -> LIGHT BLUE COLOR SWITCH (CUS)
'\uf10c', //  0x9B -> GRAY 3 COLOR SWITCH (CUS)
'\uf10d', //  0x9C -> PURPLE COLOR SWITCH (CUS)
'\uf11d', //  0x9D -> CURSOR LEFT (CUS)
'\uf10e', //  0x9E -> YELLOW COLOR SWITCH (CUS)
'\uf10f', //  0x9F -> CYAN COLOR SWITCH (CUS)
'\u00a0', // 0xA0 -> NO-BREAK SPACE
'\u258c', // ▌ 0xA1 -> LEFT HALF BLOCK
'\u2584', // ▄ 0xA2 -> LOWER HALF BLOCK
'\u2594', // ▔ 0xA3 -> UPPER ONE EIGHTH BLOCK
'\u2581', // ▁ 0xA4 -> LOWER ONE EIGHTH BLOCK
'\u258f', // ▏ 0xA5 -> LEFT ONE EIGHTH BLOCK
'\u2592', // ▒ 0xA6 -> MEDIUM SHADE
'\u2595', // ▕ 0xA7 -> RIGHT ONE EIGHTH BLOCK
'\uf12f', //  0xA8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS)
'\uf13a', //  0xA9 -> MEDIUM SHADE SLASHED RIGHT (CUS)
'\uf130', //  0xAA -> RIGHT ONE QUARTER BLOCK (CUS)
'\u251c', // ├ 0xAB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT
'\u2597', // ▗ 0xAC -> QUADRANT LOWER RIGHT
'\u2514', // └ 0xAD -> BOX DRAWINGS LIGHT UP AND RIGHT
'\u2510', // ┐ 0xAE -> BOX DRAWINGS LIGHT DOWN AND LEFT
'\u2582', // ▂ 0xAF -> LOWER ONE QUARTER BLOCK
'\u250c', // ┌ 0xB0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT
'\u2534', // ┴ 0xB1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL
'\u252c', // ┬ 0xB2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
'\u2524', // ┤ 0xB3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT
'\u258e', // ▎ 0xB4 -> LEFT ONE QUARTER BLOCK
'\u258d', // ▍ 0xB5 -> LEFT THREE EIGTHS BLOCK
'\uf131', //  0xB6 -> RIGHT THREE EIGHTHS BLOCK (CUS)
'\uf132', //  0xB7 -> UPPER ONE QUARTER BLOCK (CUS)
'\uf133', //  0xB8 -> UPPER THREE EIGHTS BLOCK (CUS)
'\u2583', // ▃ 0xB9 -> LOWER THREE EIGHTHS BLOCK
'\u2713', // ✓ 0xBA -> CHECK MARK
'\u2596', // ▖ 0xBB -> QUADRANT LOWER LEFT
'\u259d', // ▝ 0xBC -> QUADRANT UPPER RIGHT
'\u2518', // ┘ 0xBD -> BOX DRAWINGS LIGHT UP AND LEFT
'\u2598', // ▘ 0xBE -> QUADRANT UPPER LEFT
'\u259a', // ▚ 0xBF -> QUADRANT UPPER LEFT AND LOWER RIGHT
'\u2500', // ─ 0xC0 -> BOX DRAWINGS LIGHT HORIZONTAL
'A' , // A 0xC1 -> LATIN CAPITAL LETTER A
'B' , // B 0xC2 -> LATIN CAPITAL LETTER B
'C' , // C 0xC3 -> LATIN CAPITAL LETTER C
'D' , // D 0xC4 -> LATIN CAPITAL LETTER D
'E' , // E 0xC5 -> LATIN CAPITAL LETTER E
'F' , // F 0xC6 -> LATIN CAPITAL LETTER F
'G' , // G 0xC7 -> LATIN CAPITAL LETTER G
'H' , // H 0xC8 -> LATIN CAPITAL LETTER H
'I' , // I 0xC9 -> LATIN CAPITAL LETTER I
'J' , // J 0xCA -> LATIN CAPITAL LETTER J
'K' , // K 0xCB -> LATIN CAPITAL LETTER K
'L' , // L 0xCC -> LATIN CAPITAL LETTER L
'M' , // M 0xCD -> LATIN CAPITAL LETTER M
'N' , // N 0xCE -> LATIN CAPITAL LETTER N
'O' , // O 0xCF -> LATIN CAPITAL LETTER O
'P' , // P 0xD0 -> LATIN CAPITAL LETTER P
'Q' , // Q 0xD1 -> LATIN CAPITAL LETTER Q
'R' , // R 0xD2 -> LATIN CAPITAL LETTER R
'S' , // S 0xD3 -> LATIN CAPITAL LETTER S
'T' , // T 0xD4 -> LATIN CAPITAL LETTER T
'U' , // U 0xD5 -> LATIN CAPITAL LETTER U
'V' , // V 0xD6 -> LATIN CAPITAL LETTER V
'W' , // W 0xD7 -> LATIN CAPITAL LETTER W
'X' , // X 0xD8 -> LATIN CAPITAL LETTER X
'Y' , // Y 0xD9 -> LATIN CAPITAL LETTER Y
'Z' , // Z 0xDA -> LATIN CAPITAL LETTER Z
'\u253c', // ┼ 0xDB -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
'\uf12e', //  0xDC -> LEFT HALF BLOCK MEDIUM SHADE (CUS)
'\u2502', // │ 0xDD -> BOX DRAWINGS LIGHT VERTICAL
'\u2592', // ▒ 0xDE -> MEDIUM SHADE
'\uf139', //  0xDF -> MEDIUM SHADE SLASHED LEFT (CUS)
'\u00a0', // 0xE0 -> NO-BREAK SPACE
'\u258c', // ▌ 0xE1 -> LEFT HALF BLOCK
'\u2584', // ▄ 0xE2 -> LOWER HALF BLOCK
'\u2594', // ▔ 0xE3 -> UPPER ONE EIGHTH BLOCK
'\u2581', // ▁ 0xE4 -> LOWER ONE EIGHTH BLOCK
'\u258f', // ▏ 0xE5 -> LEFT ONE EIGHTH BLOCK
'\u2592', // ▒ 0xE6 -> MEDIUM SHADE
'\u2595', // ▕ 0xE7 -> RIGHT ONE EIGHTH BLOCK
'\uf12f', //  0xE8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS)
'\uf13a', //  0xE9 -> MEDIUM SHADE SLASHED RIGHT (CUS)
'\uf130', //  0xEA -> RIGHT ONE QUARTER BLOCK (CUS)
'\u251c', // ├ 0xEB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT
'\u2597', // ▗ 0xEC -> QUADRANT LOWER RIGHT
'\u2514', // └ 0xED -> BOX DRAWINGS LIGHT UP AND RIGHT
'\u2510', // ┐ 0xEE -> BOX DRAWINGS LIGHT DOWN AND LEFT
'\u2582', // ▂ 0xEF -> LOWER ONE QUARTER BLOCK
'\u250c', // ┌ 0xF0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT
'\u2534', // ┴ 0xF1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL
'\u252c', // ┬ 0xF2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
'\u2524', // ┤ 0xF3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT
'\u258e', // ▎ 0xF4 -> LEFT ONE QUARTER BLOCK
'\u258d', // ▍ 0xF5 -> LEFT THREE EIGTHS BLOCK
'\uf131', //  0xF6 -> RIGHT THREE EIGHTHS BLOCK (CUS)
'\uf132', //  0xF7 -> UPPER ONE QUARTER BLOCK (CUS)
'\uf133', //  0xF8 -> UPPER THREE EIGHTS BLOCK (CUS)
'\u2583', // ▃ 0xF9 -> LOWER THREE EIGHTHS BLOCK
'\u2713', // ✓ 0xFA -> CHECK MARK
'\u2596', // ▖ 0xFB -> QUADRANT LOWER LEFT
'\u259d', // ▝ 0xFC -> QUADRANT UPPER RIGHT
'\u2518', // ┘ 0xFD -> BOX DRAWINGS LIGHT UP AND LEFT
'\u2598', // ▘ 0xFE -> QUADRANT UPPER LEFT
'\u2592' // ▒ 0xFF -> MEDIUM SHADE
)
private val decodingPetsciiUppercase = arrayOf(
'\u0000', // 0x00 -> \u0000
'\ufffe', // 0x01 -> UNDEFINED
'\ufffe', // 0x02 -> UNDEFINED
'\ufffe', // 0x03 -> UNDEFINED
'\ufffe', // 0x04 -> UNDEFINED
'\uf100', // 0x05 -> WHITE COLOR SWITCH (CUS)
'\ufffe', // 0x06 -> UNDEFINED
'\ufffe', // 0x07 -> UNDEFINED
'\uf118', // 0x08 -> DISABLE CHARACTER SET SWITCHING (CUS)
'\uf119', // 0x09 -> ENABLE CHARACTER SET SWITCHING (CUS)
'\ufffe', // 0x0A -> UNDEFINED
'\ufffe', // 0x0B -> UNDEFINED
'\ufffe', // 0x0C -> UNDEFINED
'\r' , // 0x0D -> CARRIAGE RETURN
'\u000e', // 0x0E -> SHIFT OUT
'\ufffe', // 0x0F -> UNDEFINED
'\ufffe', // 0x10 -> UNDEFINED
'\uf11c', // 0x11 -> CURSOR DOWN (CUS)
'\uf11a', // 0x12 -> REVERSE VIDEO ON (CUS)
'\uf120', // 0x13 -> HOME (CUS)
'\u007f', // 0x14 -> DELETE
'\ufffe', // 0x15 -> UNDEFINED
'\ufffe', // 0x16 -> UNDEFINED
'\ufffe', // 0x17 -> UNDEFINED
'\ufffe', // 0x18 -> UNDEFINED
'\ufffe', // 0x19 -> UNDEFINED
'\ufffe', // 0x1A -> UNDEFINED
'\ufffe', // 0x1B -> UNDEFINED
'\uf101', // 0x1C -> RED COLOR SWITCH (CUS)
'\uf11d', // 0x1D -> CURSOR RIGHT (CUS)
'\uf102', // 0x1E -> GREEN COLOR SWITCH (CUS)
'\uf103', // 0x1F -> BLUE COLOR SWITCH (CUS)
' ' , // 0x20 -> SPACE
'!' , // ! 0x21 -> EXCLAMATION MARK
'"' , // " 0x22 -> QUOTATION MARK
'#' , // # 0x23 -> NUMBER SIGN
'$' , // $ 0x24 -> DOLLAR SIGN
'%' , // % 0x25 -> PERCENT SIGN
'&' , // & 0x26 -> AMPERSAND
'\'' , // ' 0x27 -> APOSTROPHE
'(' , // ( 0x28 -> LEFT PARENTHESIS
')' , // ) 0x29 -> RIGHT PARENTHESIS
'*' , // * 0x2A -> ASTERISK
'+' , // + 0x2B -> PLUS SIGN
',' , // , 0x2C -> COMMA
'-' , // - 0x2D -> HYPHEN-MINUS
'.' , // . 0x2E -> FULL STOP
'/' , // / 0x2F -> SOLIDUS
'0' , // 0 0x30 -> DIGIT ZERO
'1' , // 1 0x31 -> DIGIT ONE
'2' , // 2 0x32 -> DIGIT TWO
'3' , // 3 0x33 -> DIGIT THREE
'4' , // 4 0x34 -> DIGIT FOUR
'5' , // 5 0x35 -> DIGIT FIVE
'6' , // 6 0x36 -> DIGIT SIX
'7' , // 7 0x37 -> DIGIT SEVEN
'8' , // 8 0x38 -> DIGIT EIGHT
'9' , // 9 0x39 -> DIGIT NINE
':' , // : 0x3A -> COLON
';' , // ; 0x3B -> SEMICOLON
'<' , // < 0x3C -> LESS-THAN SIGN
'=' , // = 0x3D -> EQUALS SIGN
'>' , // > 0x3E -> GREATER-THAN SIGN
'?' , // ? 0x3F -> QUESTION MARK
'@' , // @ 0x40 -> COMMERCIAL AT
'A' , // A 0x41 -> LATIN CAPITAL LETTER A
'B' , // B 0x42 -> LATIN CAPITAL LETTER B
'C' , // C 0x43 -> LATIN CAPITAL LETTER C
'D' , // D 0x44 -> LATIN CAPITAL LETTER D
'E' , // E 0x45 -> LATIN CAPITAL LETTER E
'F' , // F 0x46 -> LATIN CAPITAL LETTER F
'G' , // G 0x47 -> LATIN CAPITAL LETTER G
'H' , // H 0x48 -> LATIN CAPITAL LETTER H
'I' , // I 0x49 -> LATIN CAPITAL LETTER I
'J' , // J 0x4A -> LATIN CAPITAL LETTER J
'K' , // K 0x4B -> LATIN CAPITAL LETTER K
'L' , // L 0x4C -> LATIN CAPITAL LETTER L
'M' , // M 0x4D -> LATIN CAPITAL LETTER M
'N' , // N 0x4E -> LATIN CAPITAL LETTER N
'O' , // O 0x4F -> LATIN CAPITAL LETTER O
'P' , // P 0x50 -> LATIN CAPITAL LETTER P
'Q' , // Q 0x51 -> LATIN CAPITAL LETTER Q
'R' , // R 0x52 -> LATIN CAPITAL LETTER R
'S' , // S 0x53 -> LATIN CAPITAL LETTER S
'T' , // T 0x54 -> LATIN CAPITAL LETTER T
'U' , // U 0x55 -> LATIN CAPITAL LETTER U
'V' , // V 0x56 -> LATIN CAPITAL LETTER V
'W' , // W 0x57 -> LATIN CAPITAL LETTER W
'X' , // X 0x58 -> LATIN CAPITAL LETTER X
'Y' , // Y 0x59 -> LATIN CAPITAL LETTER Y
'Z' , // Z 0x5A -> LATIN CAPITAL LETTER Z
'[' , // [ 0x5B -> LEFT SQUARE BRACKET
'\u00a3', // £ 0x5C -> POUND SIGN
']' , // ] 0x5D -> RIGHT SQUARE BRACKET
'\u2191', // ↑ 0x5E -> UPWARDS ARROW
'\u2190', // ← 0x5F -> LEFTWARDS ARROW
'\u2500', // ─ 0x60 -> BOX DRAWINGS LIGHT HORIZONTAL
'\u2660', // ♠ 0x61 -> BLACK SPADE SUIT
'\u2502', // │ 0x62 -> BOX DRAWINGS LIGHT VERTICAL
'\u2500', // ─ 0x63 -> BOX DRAWINGS LIGHT HORIZONTAL
'\uf122', //  0x64 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER UP (CUS)
'\uf123', //  0x65 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS UP (CUS)
'\uf124', //  0x66 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER DOWN (CUS)
'\uf126', //  0x67 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER LEFT (CUS)
'\uf128', //  0x68 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER RIGHT (CUS)
'\u256e', // ╮ 0x69 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT
'\u2570', // ╰ 0x6A -> BOX DRAWINGS LIGHT ARC UP AND RIGHT
'\u256f', // ╯ 0x6B -> BOX DRAWINGS LIGHT ARC UP AND LEFT
'\uf12a', //  0x6C -> ONE EIGHTH BLOCK UP AND RIGHT (CUS)
'\u2572', // ╲ 0x6D -> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
'\u2571', // 0x6E -> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
'\uf12b', //  0x6F -> ONE EIGHTH BLOCK DOWN AND RIGHT (CUS)
'\uf12c', //  0x70 -> ONE EIGHTH BLOCK DOWN AND LEFT (CUS)
'\u25cf', // ● 0x71 -> BLACK CIRCLE
'\uf125', //  0x72 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS DOWN (CUS)
'\u2665', // ♥ 0x73 -> BLACK HEART SUIT
'\uf127', //  0x74 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS LEFT (CUS)
'\u256d', // ╭ 0x75 -> BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
'\u2573', // 0x76 -> BOX DRAWINGS LIGHT DIAGONAL CROSS
'\u25cb', // ○ 0x77 -> WHITE CIRCLE
'\u2663', // ♣ 0x78 -> BLACK CLUB SUIT
'\uf129', //  0x79 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS RIGHT (CUS)
'\u2666', // ♦ 0x7A -> BLACK DIAMOND SUIT
'\u253c', // ┼ 0x7B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
'\uf12e', //  0x7C -> LEFT HALF BLOCK MEDIUM SHADE (CUS)
'\u2502', // │ 0x7D -> BOX DRAWINGS LIGHT VERTICAL
'\u03c0', // π 0x7E -> GREEK SMALL LETTER PI
'\u25e5', // ◥ 0x7F -> BLACK UPPER RIGHT TRIANGLE
'\ufffe', // 0x80 -> UNDEFINED
'\uf104', //  0x81 -> ORANGE COLOR SWITCH (CUS)
'\ufffe', // 0x82 -> UNDEFINED
'\ufffe', // 0x83 -> UNDEFINED
'\ufffe', // 0x84 -> UNDEFINED
'\uf110', // 0x85 -> FUNCTION KEY 1 (CUS)
'\uf112', // 0x86 -> FUNCTION KEY 3 (CUS)
'\uf114', // 0x87 -> FUNCTION KEY 5 (CUS)
'\uf116', // 0x88 -> FUNCTION KEY 7 (CUS)
'\uf111', // 0x89 -> FUNCTION KEY 2 (CUS)
'\uf113', // 0x8A -> FUNCTION KEY 4 (CUS)
'\uf115', // 0x8B -> FUNCTION KEY 6 (CUS)
'\uf117', // 0x8C -> FUNCTION KEY 8 (CUS)
'\n' , // 0x8D -> LINE FEED
'\u000f', // 0x8E -> SHIFT IN
'\ufffe', // 0x8F -> UNDEFINED
'\uf105', // 0x90 -> BLACK COLOR SWITCH (CUS)
'\uf11e', // 0x91 -> CURSOR UP (CUS)
'\uf11b', // 0x92 -> REVERSE VIDEO OFF (CUS)
'\u000c', // 0x93 -> FORM FEED
'\uf121', // 0x94 -> INSERT (CUS)
'\uf106', // 0x95 -> BROWN COLOR SWITCH (CUS)
'\uf107', // 0x96 -> LIGHT RED COLOR SWITCH (CUS)
'\uf108', // 0x97 -> GRAY 1 COLOR SWITCH (CUS)
'\uf109', // 0x98 -> GRAY 2 COLOR SWITCH (CUS)
'\uf10a', // 0x99 -> LIGHT GREEN COLOR SWITCH (CUS)
'\uf10b', // 0x9A -> LIGHT BLUE COLOR SWITCH (CUS)
'\uf10c', // 0x9B -> GRAY 3 COLOR SWITCH (CUS)
'\uf10d', // 0x9C -> PURPLE COLOR SWITCH (CUS)
'\uf11d', // 0x9D -> CURSOR LEFT (CUS)
'\uf10e', // 0x9E -> YELLOW COLOR SWITCH (CUS)
'\uf10f', // 0x9F -> CYAN COLOR SWITCH (CUS)
'\u00a0', // 0xA0 -> NO-BREAK SPACE
'\u258c', // ▌ 0xA1 -> LEFT HALF BLOCK
'\u2584', // ▄ 0xA2 -> LOWER HALF BLOCK
'\u2594', // ▔ 0xA3 -> UPPER ONE EIGHTH BLOCK
'\u2581', // ▁ 0xA4 -> LOWER ONE EIGHTH BLOCK
'\u258f', // ▏ 0xA5 -> LEFT ONE EIGHTH BLOCK
'\u2592', // ▒ 0xA6 -> MEDIUM SHADE
'\u2595', // ▕ 0xA7 -> RIGHT ONE EIGHTH BLOCK
'\uf12f', //  0xA8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS)
'\u25e4', // ◤ 0xA9 -> BLACK UPPER LEFT TRIANGLE
'\uf130', //  0xAA -> RIGHT ONE QUARTER BLOCK (CUS)
'\u251c', // ├ 0xAB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT
'\u2597', // ▗ 0xAC -> QUADRANT LOWER RIGHT
'\u2514', // └ 0xAD -> BOX DRAWINGS LIGHT UP AND RIGHT
'\u2510', // ┐ 0xAE -> BOX DRAWINGS LIGHT DOWN AND LEFT
'\u2582', // ▂ 0xAF -> LOWER ONE QUARTER BLOCK
'\u250c', // ┌ 0xB0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT
'\u2534', // ┴ 0xB1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL
'\u252c', // ┬ 0xB2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
'\u2524', // ┤ 0xB3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT
'\u258e', // ▎ 0xB4 -> LEFT ONE QUARTER BLOCK
'\u258d', // ▍ 0xB5 -> LEFT THREE EIGTHS BLOCK
'\uf131', //  0xB6 -> RIGHT THREE EIGHTHS BLOCK (CUS)
'\uf132', //  0xB7 -> UPPER ONE QUARTER BLOCK (CUS)
'\uf133', //  0xB8 -> UPPER THREE EIGHTS BLOCK (CUS)
'\u2583', // ▃ 0xB9 -> LOWER THREE EIGHTHS BLOCK
'\uf12d', //  0xBA -> ONE EIGHTH BLOCK UP AND LEFT (CUS)
'\u2596', // ▖ 0xBB -> QUADRANT LOWER LEFT
'\u259d', // ▝ 0xBC -> QUADRANT UPPER RIGHT
'\u2518', // ┘ 0xBD -> BOX DRAWINGS LIGHT UP AND LEFT
'\u2598', // ▘ 0xBE -> QUADRANT UPPER LEFT
'\u259a', // ▚ 0xBF -> QUADRANT UPPER LEFT AND LOWER RIGHT
'\u2500', // ─ 0xC0 -> BOX DRAWINGS LIGHT HORIZONTAL
'\u2660', // ♠ 0xC1 -> BLACK SPADE SUIT
'\u2502', // │ 0xC2 -> BOX DRAWINGS LIGHT VERTICAL
'\u2500', // ─ 0xC3 -> BOX DRAWINGS LIGHT HORIZONTAL
'\uf122', //  0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER UP (CUS)
'\uf123', //  0xC5 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS UP (CUS)
'\uf124', //  0xC6 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER DOWN (CUS)
'\uf126', //  0xC7 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER LEFT (CUS)
'\uf128', //  0xC8 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER RIGHT (CUS)
'\u256e', // ╮ 0xC9 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT
'\u2570', // ╰ 0xCA -> BOX DRAWINGS LIGHT ARC UP AND RIGHT
'\u256f', // ╯ 0xCB -> BOX DRAWINGS LIGHT ARC UP AND LEFT
'\uf12a', //  0xCC -> ONE EIGHTH BLOCK UP AND RIGHT (CUS)
'\u2572', // ╲ 0xCD -> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
'\u2571', // 0xCE -> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
'\uf12b', //  0xCF -> ONE EIGHTH BLOCK DOWN AND RIGHT (CUS)
'\uf12c', //  0xD0 -> ONE EIGHTH BLOCK DOWN AND LEFT (CUS)
'\u25cf', // ● 0xD1 -> BLACK CIRCLE
'\uf125', //  0xD2 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS DOWN (CUS)
'\u2665', // ♥ 0xD3 -> BLACK HEART SUIT
'\uf127', //  0xD4 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS LEFT (CUS)
'\u256d', // ╭ 0xD5 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT
'\u2573', // 0xD6 -> BOX DRAWINGS LIGHT DIAGONAL CROSS
'\u25cb', // ○ 0xD7 -> WHITE CIRCLE
'\u2663', // ♣ 0xD8 -> BLACK CLUB SUIT
'\uf129', //  0xD9 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS RIGHT (CUS)
'\u2666', // ♦ 0xDA -> BLACK DIAMOND SUIT
'\u253c', // ┼ 0xDB -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
'\uf12e', //  0xDC -> LEFT HALF BLOCK MEDIUM SHADE (CUS)
'\u2502', // │ 0xDD -> BOX DRAWINGS LIGHT VERTICAL
'\u03c0', // π 0xDE -> GREEK SMALL LETTER PI
'\u25e5', // ◥ 0xDF -> BLACK UPPER RIGHT TRIANGLE
'\u00a0', // 0xE0 -> NO-BREAK SPACE
'\u258c', // ▌ 0xE1 -> LEFT HALF BLOCK
'\u2584', // ▄ 0xE2 -> LOWER HALF BLOCK
'\u2594', // ▔ 0xE3 -> UPPER ONE EIGHTH BLOCK
'\u2581', // ▁ 0xE4 -> LOWER ONE EIGHTH BLOCK
'\u258f', // ▏ 0xE5 -> LEFT ONE EIGHTH BLOCK
'\u2592', // ▒ 0xE6 -> MEDIUM SHADE
'\u2595', // ▕ 0xE7 -> RIGHT ONE EIGHTH BLOCK
'\uf12f', //  0xE8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS)
'\u25e4', // ◤ 0xE9 -> BLACK UPPER LEFT TRIANGLE
'\uf130', //  0xEA -> RIGHT ONE QUARTER BLOCK (CUS)
'\u251c', // ├ 0xEB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT
'\u2597', // ▗ 0xEC -> QUADRANT LOWER RIGHT
'\u2514', // └ 0xED -> BOX DRAWINGS LIGHT UP AND RIGHT
'\u2510', // ┐ 0xEE -> BOX DRAWINGS LIGHT DOWN AND LEFT
'\u2582', // ▂ 0xEF -> LOWER ONE QUARTER BLOCK
'\u250c', // ┌ 0xF0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT
'\u2534', // ┴ 0xF1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL
'\u252c', // ┬ 0xF2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
'\u2524', // ┤ 0xF3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT
'\u258e', // ▎ 0xF4 -> LEFT ONE QUARTER BLOCK
'\u258d', // ▍ 0xF5 -> LEFT THREE EIGTHS BLOCK
'\uf131', //  0xF6 -> RIGHT THREE EIGHTHS BLOCK (CUS)
'\uf132', //  0xF7 -> UPPER ONE QUARTER BLOCK (CUS)
'\uf133', //  0xF8 -> UPPER THREE EIGHTS BLOCK (CUS)
'\u2583', // ▃ 0xF9 -> LOWER THREE EIGHTHS BLOCK
'\uf12d', //  0xFA -> ONE EIGHTH BLOCK UP AND LEFT (CUS)
'\u2596', // ▖ 0xFB -> QUADRANT LOWER LEFT
'\u259d', // ▝ 0xFC -> QUADRANT UPPER RIGHT
'\u2518', // ┘ 0xFD -> BOX DRAWINGS LIGHT UP AND LEFT
'\u2598', // ▘ 0xFE -> QUADRANT UPPER LEFT
'\u03c0' // π 0xFF -> GREEK SMALL LETTER PI
)
private val decodingScreencodeLowercase = arrayOf(
'@' , // @ 0x00 -> COMMERCIAL AT
'a' , // a 0x01 -> LATIN SMALL LETTER A
'b' , // b 0x02 -> LATIN SMALL LETTER B
'c' , // c 0x03 -> LATIN SMALL LETTER C
'd' , // d 0x04 -> LATIN SMALL LETTER D
'e' , // e 0x05 -> LATIN SMALL LETTER E
'f' , // f 0x06 -> LATIN SMALL LETTER F
'g' , // g 0x07 -> LATIN SMALL LETTER G
'h' , // h 0x08 -> LATIN SMALL LETTER H
'i' , // i 0x09 -> LATIN SMALL LETTER I
'j' , // j 0x0A -> LATIN SMALL LETTER J
'k' , // k 0x0B -> LATIN SMALL LETTER K
'l' , // l 0x0C -> LATIN SMALL LETTER L
'm' , // m 0x0D -> LATIN SMALL LETTER M
'n' , // n 0x0E -> LATIN SMALL LETTER N
'o' , // o 0x0F -> LATIN SMALL LETTER O
'p' , // p 0x10 -> LATIN SMALL LETTER P
'q' , // q 0x11 -> LATIN SMALL LETTER Q
'r' , // r 0x12 -> LATIN SMALL LETTER R
's' , // s 0x13 -> LATIN SMALL LETTER S
't' , // t 0x14 -> LATIN SMALL LETTER T
'u' , // u 0x15 -> LATIN SMALL LETTER U
'v' , // v 0x16 -> LATIN SMALL LETTER V
'w' , // w 0x17 -> LATIN SMALL LETTER W
'x' , // x 0x18 -> LATIN SMALL LETTER X
'y' , // y 0x19 -> LATIN SMALL LETTER Y
'z' , // z 0x1A -> LATIN SMALL LETTER Z
'[' , // [ 0x1B -> LEFT SQUARE BRACKET
'\u00a3', // £ 0x1C -> POUND SIGN
']' , // ] 0x1D -> RIGHT SQUARE BRACKET
'\u2191', // ↑ 0x1E -> UPWARDS ARROW
'\u2190', // ← 0x1F -> LEFTWARDS ARROW
' ' , // 0x20 -> SPACE
'!' , // ! 0x21 -> EXCLAMATION MARK
'"' , // " 0x22 -> QUOTATION MARK
'#' , // # 0x23 -> NUMBER SIGN
'$' , // $ 0x24 -> DOLLAR SIGN
'%' , // % 0x25 -> PERCENT SIGN
'&' , // & 0x26 -> AMPERSAND
'\'' , // ' 0x27 -> APOSTROPHE
'(' , // ( 0x28 -> LEFT PARENTHESIS
')' , // ) 0x29 -> RIGHT PARENTHESIS
'*' , // * 0x2A -> ASTERISK
'+' , // + 0x2B -> PLUS SIGN
',' , // , 0x2C -> COMMA
'-' , // - 0x2D -> HYPHEN-MINUS
'.' , // . 0x2E -> FULL STOP
'/' , // / 0x2F -> SOLIDUS
'0' , // 0 0x30 -> DIGIT ZERO
'1' , // 1 0x31 -> DIGIT ONE
'2' , // 2 0x32 -> DIGIT TWO
'3' , // 3 0x33 -> DIGIT THREE
'4' , // 4 0x34 -> DIGIT FOUR
'5' , // 5 0x35 -> DIGIT FIVE
'6' , // 6 0x36 -> DIGIT SIX
'7' , // 7 0x37 -> DIGIT SEVEN
'8' , // 8 0x38 -> DIGIT EIGHT
'9' , // 9 0x39 -> DIGIT NINE
':' , // : 0x3A -> COLON
';' , // ; 0x3B -> SEMICOLON
'<' , // < 0x3C -> LESS-THAN SIGN
'=' , // = 0x3D -> EQUALS SIGN
'>' , // > 0x3E -> GREATER-THAN SIGN
'?' , // ? 0x3F -> QUESTION MARK
'\u2500', // ─ 0x40 -> BOX DRAWINGS LIGHT HORIZONTAL
'A' , // A 0x41 -> LATIN CAPITAL LETTER A
'B' , // B 0x42 -> LATIN CAPITAL LETTER B
'C' , // C 0x43 -> LATIN CAPITAL LETTER C
'D' , // D 0x44 -> LATIN CAPITAL LETTER D
'E' , // E 0x45 -> LATIN CAPITAL LETTER E
'F' , // F 0x46 -> LATIN CAPITAL LETTER F
'G' , // G 0x47 -> LATIN CAPITAL LETTER G
'H' , // H 0x48 -> LATIN CAPITAL LETTER H
'I' , // I 0x49 -> LATIN CAPITAL LETTER I
'J' , // J 0x4A -> LATIN CAPITAL LETTER J
'K' , // K 0x4B -> LATIN CAPITAL LETTER K
'L' , // L 0x4C -> LATIN CAPITAL LETTER L
'M' , // M 0x4D -> LATIN CAPITAL LETTER M
'N' , // N 0x4E -> LATIN CAPITAL LETTER N
'O' , // O 0x4F -> LATIN CAPITAL LETTER O
'P' , // P 0x50 -> LATIN CAPITAL LETTER P
'Q' , // Q 0x51 -> LATIN CAPITAL LETTER Q
'R' , // R 0x52 -> LATIN CAPITAL LETTER R
'S' , // S 0x53 -> LATIN CAPITAL LETTER S
'T' , // T 0x54 -> LATIN CAPITAL LETTER T
'U' , // U 0x55 -> LATIN CAPITAL LETTER U
'V' , // V 0x56 -> LATIN CAPITAL LETTER V
'W' , // W 0x57 -> LATIN CAPITAL LETTER W
'X' , // X 0x58 -> LATIN CAPITAL LETTER X
'Y' , // Y 0x59 -> LATIN CAPITAL LETTER Y
'Z' , // Z 0x5A -> LATIN CAPITAL LETTER Z
'\u253c', // ┼ 0x5B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
'\uf12e', //  0x5C -> LEFT HALF BLOCK MEDIUM SHADE (CUS)
'\u2502', // │ 0x5D -> BOX DRAWINGS LIGHT VERTICAL
'\u2592', // ▒ 0x5E -> MEDIUM SHADE
'\uf139', //  0x5F -> MEDIUM SHADE SLASHED LEFT (CUS)
'\u00a0', // 0x60 -> NO-BREAK SPACE
'\u258c', // ▌ 0x61 -> LEFT HALF BLOCK
'\u2584', // ▄ 0x62 -> LOWER HALF BLOCK
'\u2594', // ▔ 0x63 -> UPPER ONE EIGHTH BLOCK
'\u2581', // ▁ 0x64 -> LOWER ONE EIGHTH BLOCK
'\u258f', // ▏ 0x65 -> LEFT ONE EIGHTH BLOCK
'\u2592', // ▒ 0x66 -> MEDIUM SHADE
'\u2595', // ▕ 0x67 -> RIGHT ONE EIGHTH BLOCK
'\uf12f', //  0x68 -> LOWER HALF BLOCK MEDIUM SHADE (CUS)
'\uf13a', //  0x69 -> MEDIUM SHADE SLASHED RIGHT (CUS)
'\uf130', //  0x6A -> RIGHT ONE QUARTER BLOCK (CUS)
'\u251c', // ├ 0x6B -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT
'\u2597', // ▗ 0x6C -> QUADRANT LOWER RIGHT
'\u2514', // └ 0x6D -> BOX DRAWINGS LIGHT UP AND RIGHT
'\u2510', // ┐ 0x6E -> BOX DRAWINGS LIGHT DOWN AND LEFT
'\u2582', // ▂ 0x6F -> LOWER ONE QUARTER BLOCK
'\u250c', // ┌ 0x70 -> BOX DRAWINGS LIGHT DOWN AND RIGHT
'\u2534', // ┴ 0x71 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL
'\u252c', // ┬ 0x72 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
'\u2524', // ┤ 0x73 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT
'\u258e', // ▎ 0x74 -> LEFT ONE QUARTER BLOCK
'\u258d', // ▍ 0x75 -> LEFT THREE EIGTHS BLOCK
'\uf131', //  0x76 -> RIGHT THREE EIGHTHS BLOCK (CUS)
'\uf132', //  0x77 -> UPPER ONE QUARTER BLOCK (CUS)
'\uf133', //  0x78 -> UPPER THREE EIGHTS BLOCK (CUS)
'\u2583', // ▃ 0x79 -> LOWER THREE EIGHTHS BLOCK
'\u2713', // ✓ 0x7A -> CHECK MARK
'\u2596', // ▖ 0x7B -> QUADRANT LOWER LEFT
'\u259d', // ▝ 0x7C -> QUADRANT UPPER RIGHT
'\u2518', // ┘ 0x7D -> BOX DRAWINGS LIGHT UP AND LEFT
'\u2598', // ▘ 0x7E -> QUADRANT UPPER LEFT
'\u259a', // ▚ 0x7F -> QUADRANT UPPER LEFT AND LOWER RIGHT
'\ufffe', // 0x80 -> UNDEFINED
'\ufffe', // 0x81 -> UNDEFINED
'\ufffe', // 0x82 -> UNDEFINED
'\ufffe', // 0x83 -> UNDEFINED
'\ufffe', // 0x84 -> UNDEFINED
'\ufffe', // 0x85 -> UNDEFINED
'\ufffe', // 0x86 -> UNDEFINED
'\ufffe', // 0x87 -> UNDEFINED
'\ufffe', // 0x88 -> UNDEFINED
'\ufffe', // 0x89 -> UNDEFINED
'\ufffe', // 0x8A -> UNDEFINED
'\ufffe', // 0x8B -> UNDEFINED
'\ufffe', // 0x8C -> UNDEFINED
'\ufffe', // 0x8D -> UNDEFINED
'\ufffe', // 0x8E -> UNDEFINED
'\ufffe', // 0x8F -> UNDEFINED
'\ufffe', // 0x90 -> UNDEFINED
'\ufffe', // 0x91 -> UNDEFINED
'\ufffe', // 0x92 -> UNDEFINED
'\ufffe', // 0x93 -> UNDEFINED
'\ufffe', // 0x94 -> UNDEFINED
'\ufffe', // 0x95 -> UNDEFINED
'\ufffe', // 0x96 -> UNDEFINED
'\ufffe', // 0x97 -> UNDEFINED
'\ufffe', // 0x98 -> UNDEFINED
'\ufffe', // 0x99 -> UNDEFINED
'\ufffe', // 0x9A -> UNDEFINED
'\ufffe', // 0x9B -> UNDEFINED
'\ufffe', // 0x9C -> UNDEFINED
'\ufffe', // 0x9D -> UNDEFINED
'\ufffe', // 0x9E -> UNDEFINED
'\ufffe', // 0x9F -> UNDEFINED
'\ufffe', // 0xA0 -> UNDEFINED
'\ufffe', // 0xA1 -> UNDEFINED
'\ufffe', // 0xA2 -> UNDEFINED
'\ufffe', // 0xA3 -> UNDEFINED
'\ufffe', // 0xA4 -> UNDEFINED
'\ufffe', // 0xA5 -> UNDEFINED
'\ufffe', // 0xA6 -> UNDEFINED
'\ufffe', // 0xA7 -> UNDEFINED
'\ufffe', // 0xA8 -> UNDEFINED
'\ufffe', // 0xA9 -> UNDEFINED
'\ufffe', // 0xAA -> UNDEFINED
'\ufffe', // 0xAB -> UNDEFINED
'\ufffe', // 0xAC -> UNDEFINED
'\ufffe', // 0xAD -> UNDEFINED
'\ufffe', // 0xAE -> UNDEFINED
'\ufffe', // 0xAF -> UNDEFINED
'\ufffe', // 0xB0 -> UNDEFINED
'\ufffe', // 0xB1 -> UNDEFINED
'\ufffe', // 0xB2 -> UNDEFINED
'\ufffe', // 0xB3 -> UNDEFINED
'\ufffe', // 0xB4 -> UNDEFINED
'\ufffe', // 0xB5 -> UNDEFINED
'\ufffe', // 0xB6 -> UNDEFINED
'\ufffe', // 0xB7 -> UNDEFINED
'\ufffe', // 0xB8 -> UNDEFINED
'\ufffe', // 0xB9 -> UNDEFINED
'\ufffe', // 0xBA -> UNDEFINED
'\ufffe', // 0xBB -> UNDEFINED
'\ufffe', // 0xBC -> UNDEFINED
'\ufffe', // 0xBD -> UNDEFINED
'\ufffe', // 0xBE -> UNDEFINED
'\ufffe', // 0xBF -> UNDEFINED
'\ufffe', // 0xC0 -> UNDEFINED
'\ufffe', // 0xC1 -> UNDEFINED
'\ufffe', // 0xC2 -> UNDEFINED
'\ufffe', // 0xC3 -> UNDEFINED
'\ufffe', // 0xC4 -> UNDEFINED
'\ufffe', // 0xC5 -> UNDEFINED
'\ufffe', // 0xC6 -> UNDEFINED
'\ufffe', // 0xC7 -> UNDEFINED
'\ufffe', // 0xC8 -> UNDEFINED
'\ufffe', // 0xC9 -> UNDEFINED
'\ufffe', // 0xCA -> UNDEFINED
'\ufffe', // 0xCB -> UNDEFINED
'\ufffe', // 0xCC -> UNDEFINED
'\ufffe', // 0xCD -> UNDEFINED
'\ufffe', // 0xCE -> UNDEFINED
'\ufffe', // 0xCF -> UNDEFINED
'\ufffe', // 0xD0 -> UNDEFINED
'\ufffe', // 0xD1 -> UNDEFINED
'\ufffe', // 0xD2 -> UNDEFINED
'\ufffe', // 0xD3 -> UNDEFINED
'\ufffe', // 0xD4 -> UNDEFINED
'\ufffe', // 0xD5 -> UNDEFINED
'\ufffe', // 0xD6 -> UNDEFINED
'\ufffe', // 0xD7 -> UNDEFINED
'\ufffe', // 0xD8 -> UNDEFINED
'\ufffe', // 0xD9 -> UNDEFINED
'\ufffe', // 0xDA -> UNDEFINED
'\ufffe', // 0xDB -> UNDEFINED
'\ufffe', // 0xDC -> UNDEFINED
'\ufffe', // 0xDD -> UNDEFINED
'\ufffe', // 0xDE -> UNDEFINED
'\ufffe', // 0xDF -> UNDEFINED
'\ufffe', // 0xE0 -> UNDEFINED
'\ufffe', // 0xE1 -> UNDEFINED
'\ufffe', // 0xE2 -> UNDEFINED
'\ufffe', // 0xE3 -> UNDEFINED
'\ufffe', // 0xE4 -> UNDEFINED
'\ufffe', // 0xE5 -> UNDEFINED
'\ufffe', // 0xE6 -> UNDEFINED
'\ufffe', // 0xE7 -> UNDEFINED
'\ufffe', // 0xE8 -> UNDEFINED
'\ufffe', // 0xE9 -> UNDEFINED
'\ufffe', // 0xEA -> UNDEFINED
'\ufffe', // 0xEB -> UNDEFINED
'\ufffe', // 0xEC -> UNDEFINED
'\ufffe', // 0xED -> UNDEFINED
'\ufffe', // 0xEE -> UNDEFINED
'\ufffe', // 0xEF -> UNDEFINED
'\ufffe', // 0xF0 -> UNDEFINED
'\ufffe', // 0xF1 -> UNDEFINED
'\ufffe', // 0xF2 -> UNDEFINED
'\ufffe', // 0xF3 -> UNDEFINED
'\ufffe', // 0xF4 -> UNDEFINED
'\ufffe', // 0xF5 -> UNDEFINED
'\ufffe', // 0xF6 -> UNDEFINED
'\ufffe', // 0xF7 -> UNDEFINED
'\ufffe', // 0xF8 -> UNDEFINED
'\ufffe', // 0xF9 -> UNDEFINED
'\ufffe', // 0xFA -> UNDEFINED
'\ufffe', // 0xFB -> UNDEFINED
'\ufffe', // 0xFC -> UNDEFINED
'\ufffe', // 0xFD -> UNDEFINED
'\ufffe', // 0xFE -> UNDEFINED
'\ufffe' // 0xFF -> UNDEFINED
)
private val decodingScreencodeUppercase = arrayOf(
'@' , // @ 0x00 -> COMMERCIAL AT
'A' , // A 0x01 -> LATIN CAPITAL LETTER A
'B' , // B 0x02 -> LATIN CAPITAL LETTER B
'C' , // C 0x03 -> LATIN CAPITAL LETTER C
'D' , // D 0x04 -> LATIN CAPITAL LETTER D
'E' , // E 0x05 -> LATIN CAPITAL LETTER E
'F' , // F 0x06 -> LATIN CAPITAL LETTER F
'G' , // G 0x07 -> LATIN CAPITAL LETTER G
'H' , // H 0x08 -> LATIN CAPITAL LETTER H
'I' , // I 0x09 -> LATIN CAPITAL LETTER I
'J' , // J 0x0A -> LATIN CAPITAL LETTER J
'K' , // K 0x0B -> LATIN CAPITAL LETTER K
'L' , // L 0x0C -> LATIN CAPITAL LETTER L
'M' , // M 0x0D -> LATIN CAPITAL LETTER M
'N' , // N 0x0E -> LATIN CAPITAL LETTER N
'O' , // O 0x0F -> LATIN CAPITAL LETTER O
'P' , // P 0x10 -> LATIN CAPITAL LETTER P
'Q' , // Q 0x11 -> LATIN CAPITAL LETTER Q
'R' , // R 0x12 -> LATIN CAPITAL LETTER R
'S' , // S 0x13 -> LATIN CAPITAL LETTER S
'T' , // T 0x14 -> LATIN CAPITAL LETTER T
'U' , // U 0x15 -> LATIN CAPITAL LETTER U
'V' , // V 0x16 -> LATIN CAPITAL LETTER V
'W' , // W 0x17 -> LATIN CAPITAL LETTER W
'X' , // X 0x18 -> LATIN CAPITAL LETTER X
'Y' , // Y 0x19 -> LATIN CAPITAL LETTER Y
'Z' , // Z 0x1A -> LATIN CAPITAL LETTER Z
'[' , // [ 0x1B -> LEFT SQUARE BRACKET
'\u00a3', // £ 0x1C -> POUND SIGN
']' , // ] 0x1D -> RIGHT SQUARE BRACKET
'\u2191', // ↑ 0x1E -> UPWARDS ARROW
'\u2190', // ← 0x1F -> LEFTWARDS ARROW
' ' , // 0x20 -> SPACE
'!' , // ! 0x21 -> EXCLAMATION MARK
'"' , // " 0x22 -> QUOTATION MARK
'#' , // # 0x23 -> NUMBER SIGN
'$' , // $ 0x24 -> DOLLAR SIGN
'%' , // % 0x25 -> PERCENT SIGN
'&' , // & 0x26 -> AMPERSAND
'\'' , // ' 0x27 -> APOSTROPHE
'(' , // ( 0x28 -> LEFT PARENTHESIS
')' , // ) 0x29 -> RIGHT PARENTHESIS
'*' , // * 0x2A -> ASTERISK
'+' , // + 0x2B -> PLUS SIGN
',' , // , 0x2C -> COMMA
'-' , // - 0x2D -> HYPHEN-MINUS
'.' , // . 0x2E -> FULL STOP
'/' , // / 0x2F -> SOLIDUS
'0' , // 0 0x30 -> DIGIT ZERO
'1' , // 1 0x31 -> DIGIT ONE
'2' , // 2 0x32 -> DIGIT TWO
'3' , // 3 0x33 -> DIGIT THREE
'4' , // 4 0x34 -> DIGIT FOUR
'5' , // 5 0x35 -> DIGIT FIVE
'6' , // 6 0x36 -> DIGIT SIX
'7' , // 7 0x37 -> DIGIT SEVEN
'8' , // 8 0x38 -> DIGIT EIGHT
'9' , // 9 0x39 -> DIGIT NINE
':' , // : 0x3A -> COLON
';' , // ; 0x3B -> SEMICOLON
'<' , // < 0x3C -> LESS-THAN SIGN
'=' , // = 0x3D -> EQUALS SIGN
'>' , // > 0x3E -> GREATER-THAN SIGN
'?' , // ? 0x3F -> QUESTION MARK
'\u2500', // ─ 0x40 -> BOX DRAWINGS LIGHT HORIZONTAL
'\u2660', // ♠ 0x41 -> BLACK SPADE SUIT
'\u2502', // │ 0x42 -> BOX DRAWINGS LIGHT VERTICAL
'\u2500', // ─ 0x43 -> BOX DRAWINGS LIGHT HORIZONTAL
'\uf122', //  0x44 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER UP (CUS)
'\uf123', //  0x45 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS UP (CUS)
'\uf124', //  0x46 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER DOWN (CUS)
'\uf126', //  0x47 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER LEFT (CUS)
'\uf128', //  0x48 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER RIGHT (CUS)
'\u256e', // ╮ 0x49 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT
'\u2570', // ╰ 0x4A -> BOX DRAWINGS LIGHT ARC UP AND RIGHT
'\u256f', // ╯ 0x4B -> BOX DRAWINGS LIGHT ARC UP AND LEFT
'\uf12a', //  0x4C -> ONE EIGHTH BLOCK UP AND RIGHT (CUS)
'\u2572', // ╲ 0x4D -> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
'\u2571', // 0x4E -> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
'\uf12b', //  0x4F -> ONE EIGHTH BLOCK DOWN AND RIGHT (CUS)
'\uf12c', //  0x50 -> ONE EIGHTH BLOCK DOWN AND LEFT (CUS)
'\u25cf', // ● 0x51 -> BLACK CIRCLE
'\uf125', //  0x52 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS DOWN (CUS)
'\u2665', // ♥ 0x53 -> BLACK HEART SUIT
'\uf127', //  0x54 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS LEFT (CUS)
'\u256d', // ╭ 0x55 -> BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
'\u2573', // 0x56 -> BOX DRAWINGS LIGHT DIAGONAL CROSS
'\u25cb', // ○ 0x57 -> WHITE CIRCLE
'\u2663', // ♣ 0x58 -> BLACK CLUB SUIT
'\uf129', //  0x59 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS RIGHT (CUS)
'\u2666', // ♦ 0x5A -> BLACK DIAMOND SUIT
'\u253c', // ┼ 0x5B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
'\uf12e', //  0x5C -> LEFT HALF BLOCK MEDIUM SHADE (CUS)
'\u2502', // │ 0x5D -> BOX DRAWINGS LIGHT VERTICAL
'\u03c0', // π 0x5E -> GREEK SMALL LETTER PI
'\u25e5', // ◥ 0x5F -> BLACK UPPER RIGHT TRIANGLE
'\u00a0', // 0x60 -> NO-BREAK SPACE
'\u258c', // ▌ 0x61 -> LEFT HALF BLOCK
'\u2584', // ▄ 0x62 -> LOWER HALF BLOCK
'\u2594', // ▔ 0x63 -> UPPER ONE EIGHTH BLOCK
'\u2581', // ▁ 0x64 -> LOWER ONE EIGHTH BLOCK
'\u258f', // ▏ 0x65 -> LEFT ONE EIGHTH BLOCK
'\u2592', // ▒ 0x66 -> MEDIUM SHADE
'\u2595', // ▕ 0x67 -> RIGHT ONE EIGHTH BLOCK
'\uf12f', //  0x68 -> LOWER HALF BLOCK MEDIUM SHADE (CUS)
'\u25e4', // ◤ 0x69 -> BLACK UPPER LEFT TRIANGLE
'\uf130', //  0x6A -> RIGHT ONE QUARTER BLOCK (CUS)
'\u251c', // ├ 0x6B -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT
'\u2597', // ▗ 0x6C -> QUADRANT LOWER RIGHT
'\u2514', // └ 0x6D -> BOX DRAWINGS LIGHT UP AND RIGHT
'\u2510', // ┐ 0x6E -> BOX DRAWINGS LIGHT DOWN AND LEFT
'\u2582', // ▂ 0x6F -> LOWER ONE QUARTER BLOCK
'\u250c', // ┌ 0x70 -> BOX DRAWINGS LIGHT DOWN AND RIGHT
'\u2534', // ┴ 0x71 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL
'\u252c', // ┬ 0x72 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
'\u2524', // ┤ 0x73 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT
'\u258e', // ▎ 0x74 -> LEFT ONE QUARTER BLOCK
'\u258d', // ▍ 0x75 -> LEFT THREE EIGTHS BLOCK
'\uf131', //  0x76 -> RIGHT THREE EIGHTHS BLOCK (CUS)
'\uf132', //  0x77 -> UPPER ONE QUARTER BLOCK (CUS)
'\uf133', //  0x78 -> UPPER THREE EIGHTS BLOCK (CUS)
'\u2583', // ▃ 0x79 -> LOWER THREE EIGHTHS BLOCK
'\uf12d', //  0x7A -> ONE EIGHTH BLOCK UP AND LEFT (CUS)
'\u2596', // ▖ 0x7B -> QUADRANT LOWER LEFT
'\u259d', // ▝ 0x7C -> QUADRANT UPPER RIGHT
'\u2518', // ┘ 0x7D -> BOX DRAWINGS LIGHT UP AND LEFT
'\u2598', // ▘ 0x7E -> QUADRANT UPPER LEFT
'\u259a', // ▚ 0x7F -> QUADRANT UPPER LEFT AND LOWER RIGHT
'\ufffe', // 0x80 -> UNDEFINED
'\ufffe', // 0x81 -> UNDEFINED
'\ufffe', // 0x82 -> UNDEFINED
'\ufffe', // 0x83 -> UNDEFINED
'\ufffe', // 0x84 -> UNDEFINED
'\ufffe', // 0x85 -> UNDEFINED
'\ufffe', // 0x86 -> UNDEFINED
'\ufffe', // 0x87 -> UNDEFINED
'\ufffe', // 0x88 -> UNDEFINED
'\ufffe', // 0x89 -> UNDEFINED
'\ufffe', // 0x8A -> UNDEFINED
'\ufffe', // 0x8B -> UNDEFINED
'\ufffe', // 0x8C -> UNDEFINED
'\ufffe', // 0x8D -> UNDEFINED
'\ufffe', // 0x8E -> UNDEFINED
'\ufffe', // 0x8F -> UNDEFINED
'\ufffe', // 0x90 -> UNDEFINED
'\ufffe', // 0x91 -> UNDEFINED
'\ufffe', // 0x92 -> UNDEFINED
'\ufffe', // 0x93 -> UNDEFINED
'\ufffe', // 0x94 -> UNDEFINED
'\ufffe', // 0x95 -> UNDEFINED
'\ufffe', // 0x96 -> UNDEFINED
'\ufffe', // 0x97 -> UNDEFINED
'\ufffe', // 0x98 -> UNDEFINED
'\ufffe', // 0x99 -> UNDEFINED
'\ufffe', // 0x9A -> UNDEFINED
'\ufffe', // 0x9B -> UNDEFINED
'\ufffe', // 0x9C -> UNDEFINED
'\ufffe', // 0x9D -> UNDEFINED
'\ufffe', // 0x9E -> UNDEFINED
'\ufffe', // 0x9F -> UNDEFINED
'\ufffe', // 0xA0 -> UNDEFINED
'\ufffe', // 0xA1 -> UNDEFINED
'\ufffe', // 0xA2 -> UNDEFINED
'\ufffe', // 0xA3 -> UNDEFINED
'\ufffe', // 0xA4 -> UNDEFINED
'\ufffe', // 0xA5 -> UNDEFINED
'\ufffe', // 0xA6 -> UNDEFINED
'\ufffe', // 0xA7 -> UNDEFINED
'\ufffe', // 0xA8 -> UNDEFINED
'\ufffe', // 0xA9 -> UNDEFINED
'\ufffe', // 0xAA -> UNDEFINED
'\ufffe', // 0xAB -> UNDEFINED
'\ufffe', // 0xAC -> UNDEFINED
'\ufffe', // 0xAD -> UNDEFINED
'\ufffe', // 0xAE -> UNDEFINED
'\ufffe', // 0xAF -> UNDEFINED
'\ufffe', // 0xB0 -> UNDEFINED
'\ufffe', // 0xB1 -> UNDEFINED
'\ufffe', // 0xB2 -> UNDEFINED
'\ufffe', // 0xB3 -> UNDEFINED
'\ufffe', // 0xB4 -> UNDEFINED
'\ufffe', // 0xB5 -> UNDEFINED
'\ufffe', // 0xB6 -> UNDEFINED
'\ufffe', // 0xB7 -> UNDEFINED
'\ufffe', // 0xB8 -> UNDEFINED
'\ufffe', // 0xB9 -> UNDEFINED
'\ufffe', // 0xBA -> UNDEFINED
'\ufffe', // 0xBB -> UNDEFINED
'\ufffe', // 0xBC -> UNDEFINED
'\ufffe', // 0xBD -> UNDEFINED
'\ufffe', // 0xBE -> UNDEFINED
'\ufffe', // 0xBF -> UNDEFINED
'\ufffe', // 0xC0 -> UNDEFINED
'\ufffe', // 0xC1 -> UNDEFINED
'\ufffe', // 0xC2 -> UNDEFINED
'\ufffe', // 0xC3 -> UNDEFINED
'\ufffe', // 0xC4 -> UNDEFINED
'\ufffe', // 0xC5 -> UNDEFINED
'\ufffe', // 0xC6 -> UNDEFINED
'\ufffe', // 0xC7 -> UNDEFINED
'\ufffe', // 0xC8 -> UNDEFINED
'\ufffe', // 0xC9 -> UNDEFINED
'\ufffe', // 0xCA -> UNDEFINED
'\ufffe', // 0xCB -> UNDEFINED
'\ufffe', // 0xCC -> UNDEFINED
'\ufffe', // 0xCD -> UNDEFINED
'\ufffe', // 0xCE -> UNDEFINED
'\ufffe', // 0xCF -> UNDEFINED
'\ufffe', // 0xD0 -> UNDEFINED
'\ufffe', // 0xD1 -> UNDEFINED
'\ufffe', // 0xD2 -> UNDEFINED
'\ufffe', // 0xD3 -> UNDEFINED
'\ufffe', // 0xD4 -> UNDEFINED
'\ufffe', // 0xD5 -> UNDEFINED
'\ufffe', // 0xD6 -> UNDEFINED
'\ufffe', // 0xD7 -> UNDEFINED
'\ufffe', // 0xD8 -> UNDEFINED
'\ufffe', // 0xD9 -> UNDEFINED
'\ufffe', // 0xDA -> UNDEFINED
'\ufffe', // 0xDB -> UNDEFINED
'\ufffe', // 0xDC -> UNDEFINED
'\ufffe', // 0xDD -> UNDEFINED
'\ufffe', // 0xDE -> UNDEFINED
'\ufffe', // 0xDF -> UNDEFINED
'\ufffe', // 0xE0 -> UNDEFINED
'\ufffe', // 0xE1 -> UNDEFINED
'\ufffe', // 0xE2 -> UNDEFINED
'\ufffe', // 0xE3 -> UNDEFINED
'\ufffe', // 0xE4 -> UNDEFINED
'\ufffe', // 0xE5 -> UNDEFINED
'\ufffe', // 0xE6 -> UNDEFINED
'\ufffe', // 0xE7 -> UNDEFINED
'\ufffe', // 0xE8 -> UNDEFINED
'\ufffe', // 0xE9 -> UNDEFINED
'\ufffe', // 0xEA -> UNDEFINED
'\ufffe', // 0xEB -> UNDEFINED
'\ufffe', // 0xEC -> UNDEFINED
'\ufffe', // 0xED -> UNDEFINED
'\ufffe', // 0xEE -> UNDEFINED
'\ufffe', // 0xEF -> UNDEFINED
'\ufffe', // 0xF0 -> UNDEFINED
'\ufffe', // 0xF1 -> UNDEFINED
'\ufffe', // 0xF2 -> UNDEFINED
'\ufffe', // 0xF3 -> UNDEFINED
'\ufffe', // 0xF4 -> UNDEFINED
'\ufffe', // 0xF5 -> UNDEFINED
'\ufffe', // 0xF6 -> UNDEFINED
'\ufffe', // 0xF7 -> UNDEFINED
'\ufffe', // 0xF8 -> UNDEFINED
'\ufffe', // 0xF9 -> UNDEFINED
'\ufffe', // 0xFA -> UNDEFINED
'\ufffe', // 0xFB -> UNDEFINED
'\ufffe', // 0xFC -> UNDEFINED
'\ufffe', // 0xFD -> UNDEFINED
'\ufffe', // 0xFE -> UNDEFINED
'\ufffe' // 0xFF -> UNDEFINED
)
// encoding: from unicode to Petscii/Screencodes (0-255)
private val encodingPetsciiLowercase = decodingPetsciiLowercase.withIndex().associate{it.value to it.index}
private val encodingPetsciiUppercase = decodingPetsciiUppercase.withIndex().associate{it.value to it.index}
private val encodingScreencodeLowercase = decodingScreencodeLowercase.withIndex().associate{it.value to it.index}
private val encodingScreencodeUppercase = decodingScreencodeUppercase.withIndex().associate{it.value to it.index}
fun encodePetscii(text: String, lowercase: Boolean = false): List<Short> {
val lookup = if(lowercase) encodingPetsciiLowercase else encodingPetsciiUppercase
return text.map {
val petscii = lookup[it]
petscii?.toShort() ?: if(it=='\u0000')
0.toShort()
else {
val case = if (lowercase) "lower" else "upper"
throw CharConversionException("no ${case}case Petscii character for '$it'")
}
}
}
fun decodePetscii(petscii: Iterable<Short>, lowercase: Boolean = false): String {
val decodeTable = if(lowercase) decodingPetsciiLowercase else decodingPetsciiUppercase
return petscii.map { decodeTable[it.toInt()] }.joinToString("")
}
fun encodeScreencode(text: String, lowercase: Boolean = false): List<Short> {
val lookup = if(lowercase) encodingScreencodeLowercase else encodingScreencodeUppercase
return text.map{
val screencode = lookup[it]
screencode?.toShort() ?: if(it=='\u0000')
0.toShort()
else {
val case = if (lowercase) "lower" else "upper"
throw CharConversionException("no ${case}Screencode character for '$it'")
}
}
}
fun decodeScreencode(screencode: Iterable<Short>, lowercase: Boolean = false): String {
val decodeTable = if(lowercase) decodingScreencodeLowercase else decodingScreencodeUppercase
return screencode.map { decodeTable[it.toInt()] }.joinToString("")
}
fun petscii2scr(petscii_code: Short, inverseVideo: Boolean): Short {
val code = when {
petscii_code <= 0x1f -> petscii_code + 128
petscii_code <= 0x3f -> petscii_code.toInt()
petscii_code <= 0x5f -> petscii_code - 64
petscii_code <= 0x7f -> petscii_code - 32
petscii_code <= 0x9f -> petscii_code + 64
petscii_code <= 0xbf -> petscii_code - 64
petscii_code <= 0xfe -> petscii_code - 128
petscii_code == 255.toShort() -> 95
else -> throw CharConversionException("petscii code out of range")
}
if(inverseVideo)
return (code or 0x80).toShort()
return code.toShort()
}
fun scr2petscii(screencode: Short): Short {
val petscii = when {
screencode <= 0x1f -> screencode + 64
screencode <= 0x3f -> screencode.toInt()
screencode <= 0x5d -> screencode +123
screencode == 0x5e.toShort() -> 255
screencode == 0x5f.toShort() -> 223
screencode <= 0x7f -> screencode + 64
screencode <= 0xbf -> screencode - 128
screencode <= 0xfe -> screencode - 64
screencode == 255.toShort() -> 191
else -> throw CharConversionException("screencode out of range")
}
return petscii.toShort()
}
}