1
0
mirror of https://github.com/irmen/ksim65.git synced 2024-06-06 07:29:29 +00:00
ksim65/src/main/kotlin/net/razorvine/ksim65/Petscii.kt

1122 lines
66 KiB
Kotlin
Raw Normal View History

2019-09-11 00:17:59 +00:00
package net.razorvine.ksim65
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()
}
}