git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

gbdk-lib/examples/megaduck/laptop_keyboard/src/megaduck_key2ascii.c

      1 #include <gbdk/platform.h>
      2 #include <stdint.h>
      3 
      4 #include <duck/model.h>
      5 #include <duck/laptop_keycodes.h>
      6 
      7 #include "megaduck_key2ascii.h"
      8 #include "megaduck_keyboard.h"
      9 
     10 
     11 // TODO: Not a very efficient use of space, lots of null entries
     12 const char scancode_to_ascii_LUT_spanish[] = {
     13 
     14     // == Start of shift adjusted scan code range (0x00 through 0x7F) ==
     15     //
     16     // Caps lock is handled separate by manually adjusting a-z
     17 
     18     NO_KEY,     // 0x80
     19     NO_KEY,     // 0x81
     20     NO_KEY,     // 0x82
     21     NO_KEY,     // 0x83
     22     NO_KEY,     // 0x84
     23     '!',        // 0x85 Shift alt: !
     24     'Q',        // 0x86 Shift alt: Q
     25     'A',        // 0x87 Shift alt: A
     26     NO_KEY,     // 0x88
     27     '"',        // 0x89 Shift alt:  "
     28     'W',        // 0x8A Shift alt: W
     29     'S',        // 0x8B Shift alt: S
     30     NO_KEY,     // 0x8C
     31     '·',        // 0x8D Shift alt: · (Spanish, mid-dot) | § (German, legal section)
     32     'E',        // 0x8E Shift alt: E
     33     'D',        // 0x8F Shift alt: D
     34 
     35     NO_KEY,     // 0x90
     36     '$',        // 0x91 Shift alt: $
     37     'R',        // 0x92
     38     'F',        // 0x93
     39     NO_KEY,     // 0x94
     40     '%',        // 0x95 Shift alt: %
     41     'T',        // 0x96
     42     'G',        // 0x97
     43     NO_KEY,     // 0x98
     44     '&',        // 0x99 Shift alt: &
     45     'Y',        // 0x9A
     46     'H',        // 0x9B
     47     NO_KEY,     // 0x9C
     48     '/',        // 0x9D Shift alt: /
     49     'U',        // 0x9E
     50     'J',        // 0x9F
     51 
     52     NO_KEY,     // 0xA0
     53     '(',        // 0xA1 Shift alt: (
     54     'I',        // 0xA2
     55     'K',        // 0xA3
     56     NO_KEY,     // 0xA4
     57     ')',        // 0xA5 Shift alt: )
     58     'O',        // 0xA6
     59     'L',        // 0xA7
     60     NO_KEY,     // 0xA8
     61     '\\',       // 0xA9 Shift alt: "\"
     62     'P',        // 0xAA
     63     'Ñ',        // 0xAB
     64     NO_KEY,     // 0xAC
     65     '?',        // 0xAD Shift alt: ?
     66     '[',        // 0xAE Shift alt: [ (Spanish, only shift mode works) | German version: Ü
     67     'Ü',        // 0xAF
     68 
     69     NO_KEY,     // 0xB0
     70     '¿',        // 0xB1 Shift alt: ¿ (Spanish) | ` (German)  ; German version: ' (single quote?)
     71     '*',        // 0xB2 Shift alt: * | German version: · (mid-dot)
     72     'ª',        // 0xB3 Shift alt: Feminine Ordinal [A over line] (Spanish) | ^ (German)
     73     NO_KEY,     // 0xB4
     74     NO_KEY,     // 0xB5
     75     NO_KEY,     // 0xB6
     76     NO_KEY,     // 0xB7
     77     'Z',        // 0xB8  // German version : 'Y'
     78     NO_KEY,     // 0xB9
     79     NO_KEY,     // 0xBA
     80     NO_KEY,     // 0xBB
     81     'X',        // 0xBC
     82     '>',        // 0xBD Shift alt: >
     83     NO_KEY,     // 0xBE
     84     NO_KEY,     // 0xBF
     85 
     86     'C',        // 0xC0
     87     NO_KEY,     // 0xC1
     88     NO_KEY,     // 0xC2
     89     NO_KEY,     // 0xC3
     90     'V',        // 0xC4
     91     NO_KEY,     // 0xC5
     92     NO_KEY,     // 0xC6
     93     NO_KEY,     // 0xC7
     94     'B',        // 0xC8
     95     NO_KEY,     // 0xC9
     96     NO_KEY,     // 0xCA
     97     NO_KEY,     // 0xCB
     98     'N',        // 0xCC
     99     NO_KEY,     // 0xCD
    100     NO_KEY,     // 0xCE
    101     NO_KEY,     // 0xCF
    102 
    103     'M',        // 0xD0
    104     NO_KEY,     // 0xD1
    105     NO_KEY,     // 0xD2
    106     NO_KEY,     // 0xD3
    107     ';',        // 0xD4  ; Shift alt: ;
    108     NO_KEY,     // 0xD5
    109     NO_KEY,     // 0xD6
    110     NO_KEY,     // 0xD7
    111     ':',        // 0xD8  ; Shift alt: :
    112     NO_KEY,     // 0xD9
    113     NO_KEY,     // 0xDA
    114     NO_KEY,     // 0xDB
    115     '_',        // 0xDC  ; Shift alt: _ | German version: @
    116     NO_KEY,     // 0xDD
    117     NO_KEY,     // 0xDE
    118     NO_KEY,     // 0xDF
    119 
    120     NO_KEY,     // 0xE0
    121     NO_KEY,     // 0xE1
    122     NO_KEY,     // 0xE2
    123     NO_KEY,     // 0xE3
    124     NO_KEY,     // 0xE4
    125     NO_KEY,     // 0xE5
    126     NO_KEY,     // 0xE6
    127     NO_KEY,     // 0xE7
    128     NO_KEY,     // 0xE8
    129     NO_KEY,     // 0xE9
    130     NO_KEY,     // 0xEA
    131     NO_KEY,     // 0xEB
    132     NO_KEY,     // 0xEC
    133     NO_KEY,     // 0xED
    134     NO_KEY,     // 0xEE
    135     NO_KEY,     // 0xEF
    136 
    137     NO_KEY,     // 0xF0
    138     NO_KEY,     // 0xF1
    139     NO_KEY,     // 0xF2
    140     NO_KEY,     // 0xF3
    141     NO_KEY,     // 0xF4
    142     NO_KEY,     // 0xF5
    143     NO_KEY,     // 0xF6
    144     NO_KEY,     // 0xF7
    145     NO_KEY,     // 0xF8
    146     NO_KEY,     // 0xF9
    147     NO_KEY,     // 0xFA
    148     NO_KEY,     // 0xFB
    149     NO_KEY,     // 0xFC
    150     NO_KEY,     // 0xFD
    151     NO_KEY,     // 0xFE
    152     NO_KEY,     // 0xFF
    153 
    154 
    155 
    156     // == Start of actual scan code range (0x80 through 0xFF) ==
    157 
    158     NO_KEY,     // 0x80 SYS_KBD_CODE_F1
    159     KEY_ESCAPE, // 0x81 SYS_KBD_CODE_ESCAPE
    160     KEY_HELP,   // 0x82 SYS_KBD_CODE_HELP
    161     NO_KEY,     // 0x83
    162     NO_KEY,     // 0x84 SYS_KBD_CODE_F2
    163     '1',        // 0x85 SYS_KBD_CODE_1
    164     'q',        // 0x86 SYS_KBD_CODE_Q
    165     'a',        // 0x87 SYS_KBD_CODE_A
    166     NO_KEY,     // 0x88 SYS_KBD_CODE_F3
    167     '2',        // 0x89 SYS_KBD_CODE_2
    168     'w',        // 0x8A SYS_KBD_CODE_W
    169     's',        // 0x8B SYS_KBD_CODE_S
    170     NO_KEY,     // 0x8C SYS_KBD_CODE_F4
    171     '3',        // 0x8D SYS_KBD_CODE_3
    172     'e',        // 0x8E SYS_KBD_CODE_E
    173     'd',        // 0x8F SYS_KBD_CODE_D
    174 
    175     NO_KEY,     // 0x90 SYS_KBD_CODE_F5
    176     '4',        // 0x91 SYS_KBD_CODE_4
    177     'r',        // 0x92 SYS_KBD_CODE_R
    178     'f',        // 0x93 SYS_KBD_CODE_F
    179     NO_KEY,     // 0x94 SYS_KBD_CODE_F6
    180     '5',        // 0x95 SYS_KBD_CODE_5
    181     't',        // 0x96 SYS_KBD_CODE_T
    182     'g',        // 0x97 SYS_KBD_CODE_G
    183     NO_KEY,     // 0x98 SYS_KBD_CODE_F7
    184     '6',        // 0x99 SYS_KBD_CODE_6
    185     'y',        // 0x9A SYS_KBD_CODE_Y
    186     'h',        // 0x9B SYS_KBD_CODE_H
    187     NO_KEY,     // 0x9C SYS_KBD_CODE_F8
    188     '7',        // 0x9D SYS_KBD_CODE_7
    189     'u',        // 0x9E SYS_KBD_CODE_U
    190     'j',        // 0x9F SYS_KBD_CODE_J
    191 
    192     NO_KEY,     // 0xA0 SYS_KBD_CODE_F9
    193     '8',        // 0xA1 SYS_KBD_CODE_8
    194     'i',        // 0xA2 SYS_KBD_CODE_I
    195     'k',        // 0xA3 SYS_KBD_CODE_K
    196     NO_KEY,     // 0xA4 SYS_KBD_CODE_F10
    197     '9',        // 0xA5 SYS_KBD_CODE_9
    198     'o',        // 0xA6 SYS_KBD_CODE_O
    199     'l',        // 0xA7 SYS_KBD_CODE_L
    200     NO_KEY,     // 0xA8 SYS_KBD_CODE_F11
    201     '0',        // 0xA9 SYS_KBD_CODE_0
    202     'p',        // 0xAA SYS_KBD_CODE_P
    203     'ñ',        // 0xAB SYS_KBD_CODE_N_TILDE
    204     NO_KEY,     // 0xAC SYS_KBD_CODE_F12
    205     '\'',       // 0xAD SYS_KBD_CODE_SINGLE_QUOTE
    206     '`',        // 0xAE SYS_KBD_CODE_BACKTICK
    207     'ü',        // 0xAF SYS_KBD_CODE_U_UMLAUT
    208 
    209     NO_KEY,     // 0xB0
    210     '¡',        // 0xB1 SYS_KBD_CODE_EXCLAMATION_FLIPPED
    211     ']',        // 0xB2 SYS_KBD_CODE_RIGHT_SQ_BRACKET
    212     'º',     // 0xB3 SYS_KBD_CODE_O_OVER_LINE Masculine Ordinal
    213     NO_KEY,     // 0xB4
    214     KEY_BACKSPACE, // 0xB5 SYS_KBD_CODE_BACKSPACE
    215     KEY_ENTER,     // 0xB6 SYS_KBD_CODE_ENTER
    216     NO_KEY,     // 0xB7
    217     'z',        // 0xB8 SYS_KBD_CODE_Z     // German version : 'y'
    218     ' ',        // 0xB9 SYS_KBD_CODE_SPACE
    219     NO_KEY,     // 0xBA SYS_KBD_CODE_PIANO_DO_SHARP
    220     NO_KEY,     // 0xBB SYS_KBD_CODE_PIANO_DO
    221     'x',        // 0xBC SYS_KBD_CODE_X
    222     '<',        // 0xBD SYS_KBD_CODE_LESS_THAN
    223     NO_KEY,     // 0xBE SYS_KBD_CODE_PIANO_RE_SHARP
    224     NO_KEY,     // 0xBF SYS_KBD_CODE_PIANO_RE
    225 
    226     'c',        // 0xC0 SYS_KBD_CODE_C
    227     NO_KEY,     // 0xC1 SYS_KBD_CODE_PAGE_UP
    228     NO_KEY,     // 0xC2
    229     NO_KEY,     // 0xC3 SYS_KBD_CODE_PIANO_MI
    230     'v',        // 0xC4 SYS_KBD_CODE_V
    231     NO_KEY,     // 0xC5 SYS_KBD_CODE_PAGE_DOWN
    232     NO_KEY,     // 0xC6 SYS_KBD_CODE_PIANO_FA_SHARP
    233     NO_KEY,     // 0xC7 SYS_KBD_CODE_PIANO_FA
    234     'b',        // 0xC8 SYS_KBD_CODE_B
    235     NO_KEY,     // 0xC9 SYS_KBD_CODE_MEMORY_MINUS
    236     NO_KEY,     // 0xCA SYS_KBD_CODE_PIANO_SOL_SHARP
    237     NO_KEY,     // 0xCB SYS_KBD_CODE_PIANO_SOL
    238     'n',        // 0xCC SYS_KBD_CODE_N
    239     NO_KEY,     // 0xCD SYS_KBD_CODE_MEMORY_PLUS
    240     NO_KEY,     // 0xCE SYS_KBD_CODE_PIANO_LA_SHARP
    241     NO_KEY,     // 0xCF SYS_KBD_CODE_PIANO_LA
    242 
    243     'm',        // 0xD0 SYS_KBD_CODE_M
    244     NO_KEY,     // 0xD1 SYS_KBD_CODE_MEMORY_RECALL
    245     NO_KEY,     // 0xD2
    246     NO_KEY,     // 0xD3 SYS_KBD_CODE_PIANO_SI
    247     ',',        // 0xD4 SYS_KBD_CODE_COMMA
    248     NO_KEY,     // 0xD5 SYS_KBD_CODE_SQUAREROOT
    249     NO_KEY,     // 0xD6 SYS_KBD_CODE_PIANO_DO_2_SHARP
    250     NO_KEY,     // 0xD7 SYS_KBD_CODE_PIANO_DO_2
    251     '.',        // 0xD8 SYS_KBD_CODE_PERIOD
    252     '*',        // 0xD9 SYS_KBD_CODE_MULTIPLY
    253     NO_KEY,     // 0xDA SYS_KBD_CODE_PIANO_RE_2_SHARP
    254     NO_KEY,     // 0xDB SYS_KBD_CODE_PIANO_RE_2
    255     '-',        // 0xDC SYS_KBD_CODE_DASH
    256     KEY_ARROW_DOWN,     // 0xDD SYS_KBD_CODE_ARROW_DOWN    // TODO: Temporary
    257     KEY_PRINTSCREEN,    // 0xDE SYS_KBD_CODE_PRINTSCREEN_RIGHT // TODO: Temporary
    258     NO_KEY,     // 0xDF
    259 
    260     KEY_DELETE, // 0xE0 SYS_KBD_CODE_DELETE
    261     '-',        // 0xE1 SYS_KBD_CODE_MINUS
    262     NO_KEY,     // 0xE2 SYS_KBD_CODE_PIANO_FA_2_SHARP
    263     NO_KEY,     // 0xE3 SYS_KBD_CODE_PIANO_FA_2
    264     '÷',        // 0xE4 SYS_KBD_CODE_DIVIDE
    265     KEY_ARROW_LEFT,     // 0xE5 SYS_KBD_CODE_ARROW_LEFT    // TODO: Temporary
    266     NO_KEY,     // 0xE6 SYS_KBD_CODE_PIANO_SOL_2_SHARP
    267     NO_KEY,     // 0xE7 SYS_KBD_CODE_PIANO_SOL_2
    268     KEY_ARROW_UP,     // 0xE8 SYS_KBD_CODE_ARROW_UP    // TODO: Temporary
    269     '=',        // 0xE9 SYS_KBD_CODE_EQUALS
    270     NO_KEY,     // 0xEA SYS_KBD_CODE_PIANO_LA_2_SHARP
    271     NO_KEY,     // 0xEB SYS_KBD_CODE_PIANO_LA_2
    272     '+',        // 0xEC SYS_KBD_CODE_PLUS
    273     KEY_ARROW_RIGHT,     // 0xED SYS_KBD_CODE_ARROW_RIGHT    // TODO: Temporary
    274     NO_KEY,     // 0xEE
    275     NO_KEY,     // 0xEF SYS_KBD_CODE_PIANO_MI_2
    276 
    277     't',        // 0xF0 SYS_KBD_CODE_MAYBE_SYST_CODES_START
    278     NO_KEY,     // 0xF1
    279     NO_KEY,     // 0xF2
    280     NO_KEY,     // 0xF3
    281     NO_KEY,     // 0xF4
    282     NO_KEY,     // 0xF5
    283     NO_KEY,     // 0xF6 SYS_KBD_CODE_MAYBE_RX_NOT_A_KEY
    284     NO_KEY,     // 0xF7
    285     NO_KEY,     // 0xF8
    286     NO_KEY,     // 0xF9
    287     NO_KEY,     // 0xFA
    288     NO_KEY,     // 0xFB
    289     NO_KEY,     // 0xFC
    290     NO_KEY,     // 0xFD
    291     NO_KEY,     // 0xFE
    292     NO_KEY      // 0xFF
    293 };
    294 
    295 
    296 char duck_io_scancode_to_ascii(const uint8_t key_code, const uint8_t megaduck_model) {
    297 
    298     char ascii_char = scancode_to_ascii_LUT_spanish[key_code];
    299 
    300     // Handle alternate German keyboard layout
    301     if (megaduck_model == MEGADUCK_LAPTOP_GERMAN)
    302         switch (ascii_char) {
    303             // Row 1
    304             // case '·':  ascii_char = '§'; break;  // TODO: handling for these
    305             case '\'': ascii_char = 'ß'; break;
    306             // case '¿':  ascii_char = '`'; break;  // TODO: handling for these
    307             // case '¡':  ascii_char = '\''; break; // TODO: handling for these
    308             case '÷':  ascii_char = ':'; break;
    309             // Row 2
    310             case '[':  // maps to same char below
    311             case '`':  ascii_char = 'Ü'; break;
    312             case ']':  ascii_char = '·'; break;
    313             case 'y':  ascii_char = 'z'; break;
    314             case 'Y':  ascii_char = 'Z'; break;
    315             // Row 3
    316             // case 'ñ':  ascii_char = 'ö'; break; // TODO: handling for these
    317             // case 'Ñ':  ascii_char = 'Ö'; break; // TODO: handling for these
    318             // case 'ü':  ascii_char = 'ä'; break; // TODO: handling for these
    319             // case 'Ü':  ascii_char = 'Ä'; break; // TODO: handling for these
    320             // case 'ª':  ascii_char = '^'; break; // TODO: handling for these
    321             // case 'º':  ascii_char = '#'; break; // TODO: handling for these
    322             // Row 4
    323             case 'z':  ascii_char = 'y'; break;
    324             case 'Z':  ascii_char = 'Y'; break;
    325             case '-':  ascii_char = '@'; break;
    326         }
    327 
    328     return ascii_char;
    329 }

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.