# Basic Keycodes The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07)](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf) with the exception of `KC_NO`, `KC_TRNS` and keycodes in the `0xA5-DF` range. See below for more details. ## Letters and Numbers |Key |Description| |------|-----------| |`KC_A`|`a` and `A`| |`KC_B`|`b` and `B`| |`KC_C`|`c` and `C`| |`KC_D`|`d` and `D`| |`KC_E`|`e` and `E`| |`KC_F`|`f` and `F`| |`KC_G`|`g` and `G`| |`KC_H`|`h` and `H`| |`KC_I`|`i` and `I`| |`KC_J`|`j` and `J`| |`KC_K`|`k` and `K`| |`KC_L`|`l` and `L`| |`KC_M`|`m` and `M`| |`KC_N`|`n` and `N`| |`KC_O`|`o` and `O`| |`KC_P`|`p` and `P`| |`KC_Q`|`q` and `Q`| |`KC_R`|`r` and `R`| |`KC_S`|`s` and `S`| |`KC_T`|`t` and `T`| |`KC_U`|`u` and `U`| |`KC_V`|`v` and `V`| |`KC_W`|`w` and `W`| |`KC_X`|`x` and `X`| |`KC_Y`|`y` and `Y`| |`KC_Z`|`z` and `Z`| |`KC_1`|`1` and `!`| |`KC_2`|`2` and `@`| |`KC_3`|`3` and `#`| |`KC_4`|`4` and `$`| |`KC_5`|`5` and `%`| |`KC_6`|`6` and `^`| |`KC_7`|`7` and `&`| |`KC_8`|`8` and `*`| |`KC_9`|`9` and `(`| |`KC_0`|`0` and `)`| ## F Keys |Key |Description| |--------|-----------| |`KC_F1` |F1 | |`KC_F2` |F2 | |`KC_F3` |F3 | |`KC_F4` |F4 | |`KC_F5` |F5 | |`KC_F6` |F6 | |`KC_F7` |F7 | |`KC_F8` |F8 | |`KC_F9` |F9 | |`KC_F10`|F10 | |`KC_F11`|F11 | |`KC_F12`|F12 | |`KC_F13`|F13 | |`KC_F14`|F14 | |`KC_F15`|F15 | |`KC_F16`|F16 | |`KC_F17`|F17 | |`KC_F18`|F18 | |`KC_F19`|F19 | |`KC_F20`|F20 | |`KC_F21`|F21 | |`KC_F22`|F22 | |`KC_F23`|F23 | |`KC_F24`|F24 | ## Punctuation |Key |Aliases |Description | |-----------------|-------------------|-----------------------------------------------| |`KC_ENTER` |`KC_ENT` |Return (Enter) | |`KC_ESCAPE` |`KC_ESC` |Escape | |`KC_BSPACE` |`KC_BSPC` |Delete (Backspace) | |`KC_TAB` | |Tab | |`KC_SPACE` |`KC_SPC` |Spacebar | |`KC_MINUS` |`KC_MINS` |`-` and `_` | |`KC_EQUAL` |`KC_EQL` |`=` and `+` | |`KC_LBRACKET` |`KC_LBRC` |`[` and `{` | |`KC_RBRACKET` |`KC_RBRC` |`]` and `}` | |`KC_BSLASH` |`KC_BSLS` |`\` and `\|` | |`KC_NONUS_HASH` |`KC_NUHS` |Non-US `#` and `~` | |`KC_SCOLON` |`KC_SCLN` |`;` and `:` | |`KC_QUOTE` |`KC_QUOT` |`'` and `"` | |`KC_GRAVE` |`KC_GRV`, `KC_ZKHK`|` and `~`, JIS Zenkaku/Hankaku| |`KC_COMMA` |`KC_COMM` |`,` and `<` | |`KC_DOT` | |`.` and `>` | |`KC_SLASH` |`KC_SLSH` |`/` and `?` | |`KC_NONUS_BSLASH`|`KC_NUBS` |Non-US `\` and `\|` | ## Lock Keys |Key |Aliases |Description | |-------------------|--------------------|------------------------------------| |`KC_CAPSLOCK` |`KC_CLCK`, `KC_CAPS`|Caps Lock | |`KC_SCROLLLOCK` |`KC_SLCK`, `KC_BRMD`|Scroll Lock, Brightness Down (macOS)| |`KC_NUMLOCK` |`KC_NLCK` |Keypad Num Lock and Clear | |`KC_LOCKING_CAPS` |`KC_LCAP` |Locking Caps Lock | |`KC_LOCKING_NUM` |`KC_LNUM` |Locking Num Lock | |`KC_LOCKING_SCROLL`|`KC_LSCR` |Locking Scroll Lock | ## Modifiers |Key |Aliases |Description | |-----------|--------------------|------------------------------------| |`KC_LCTRL` |`KC_LCTL` |Left Control | |`KC_LSHIFT`|`KC_LSFT` |Left Shift | |`KC_LALT` |`KC_LOPT` |Left Alt (Option) | |`KC_LGUI` |`KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Meta key) | |`KC_RCTRL` |`KC_RCTL` |Right Control | |`KC_RSHIFT`|`KC_RSFT` |Right Shift | |`KC_RALT` |`KC_ROPT`, `KC_ALGR`|Right Alt (Option/AltGr) | |`KC_RGUI` |`KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Meta key)| ## International |Key |Aliases |Description | |----------|---------|---------------------| |`KC_INT1` |`KC_RO` |JIS `\` and `_` | |`KC_INT2` |`KC_KANA`|JIS Katakana/Hiragana| |`KC_INT3` |`KC_JYEN`|JIS `¥` and `\|` | |`KC_INT4` |`KC_HENK`|JIS Henkan | |`KC_INT5` |`KC_MHEN`|JIS Muhenkan | |`KC_INT6` | |JIS Numpad `,` | |`KC_INT7` | |International 7 | |`KC_INT8` | |International 8 | |`KC_INT9` | |International 9 | |`KC_LANG1`|`KC_HAEN`|Hangul/English | |`KC_LANG2`|`KC_HANJ`|Hanja | |`KC_LANG3`| |JIS Katakana | |`KC_LANG4`| |JIS Hiragana | |`KC_LANG5`| |JIS Zenkaku/Hankaku | |`KC_LANG6`| |Language 6 | |`KC_LANG7`| |Language 7 | |`KC_LANG8`| |Language 8 | |`KC_LANG9`| |Language 9 | ## Commands |Key |Aliases |Description | |------------------|------------------------------|------------------------------| |`KC_PSCREEN` |`KC_PSCR` |Print Screen | |`KC_PAUSE` |`KC_PAUS`, `KC_BRK`, `KC_BRMU`|Pause, Brightness Up (macOS) | |`KC_INSERT` |`KC_INS` |Insert | |`KC_HOME` | |Home | |`KC_PGUP` | |Page Up | |`KC_DELETE` |`KC_DEL` |Forward Delete | |`KC_END` | |End | |`KC_PGDOWN` |`KC_PGDN` |Page Down | |`KC_RIGHT` |`KC_RGHT` |Right Arrow | |`KC_LEFT` | |Left Arrow | |`KC_DOWN` | |Down Arrow | |`KC_UP` | |Up Arrow | |`KC_APPLICATION` |`KC_APP` |Application (Windows Menu Key)| |`KC_POWER` | |System Power (macOS/Linux) | |`KC_EXECUTE` |`KC_EXEC` |Execute | |`KC_HELP` | |Help | |`KC_MENU` | |Menu | |`KC_SELECT` |`KC_SLCT` |Select | |`KC_STOP` | |Stop | |`KC_AGAIN` |`KC_AGIN` |Again | |`KC_UNDO` | |Undo | |`KC_CUT` | |Cut | |`KC_COPY` | |Copy | |`KC_PASTE` |`KC_PSTE` |Paste | |`KC_FIND` | |Find | |`KC__MUTE` | |Mute (macOS) | |`KC__VOLUP` | |Volume Up (macOS) | |`KC__VOLDOWN` | |Volume Down (macOS) | |`KC_ALT_ERASE` |`KC_ERAS` |Alternate Erase | |`KC_SYSREQ` | |SysReq/Attention | |`KC_CANCEL` | |Cancel | |`KC_CLEAR` |`KC_CLR` |Clear | |`KC_PRIOR` | |Prior | |`KC_RETURN` | |Return | |`KC_SEPARATOR` | |Separator | |`KC_OUT` | |Out | |`KC_OPER` | |Oper | |`KC_CLEAR_AGAIN` | |Clear/Again | |`KC_CRSEL` | |CrSel/Props | |`KC_EXSEL` | |ExSel | ## Media Keys These keycodes are not part of the Keyboard/Keypad usage page. The `SYSTEM_` keycodes are found in the Generic Desktop page, and the rest are located in the Consumer page. ?> Some of these keycodes may behave differently depending on the OS. For example, on macOS, the keycodes `KC_MEDIA_FAST_FORWARD`, `KC_MEDIA_REWIND`, `KC_MEDIA_NEXT_TRACK` and `KC_MEDIA_PREV_TRACK` skip within the current track when held, but skip the entire track when tapped. |Key |Aliases |Description | |-----------------------|---------|-----------------------------| |`KC_SYSTEM_POWER` |`KC_PWR` |System Power Down | |`KC_SYSTEM_SLEEP` |`KC_SLEP`|System Sleep | |`KC_SYSTEM_WAKE` |`KC_WAKE`|System Wake | |`KC_AUDIO_MUTE` |`KC_MUTE`|Mute | |`KC_AUDIO_VOL_UP` |`KC_VOLU`|Volume Up | |`KC_AUDIO_VOL_DOWN` |`KC_VOLD`|Volume Down | |`KC_MEDIA_NEXT_TRACK` |`KC_MNXT`|Next Track | |`KC_MEDIA_PREV_TRACK` |`KC_MPRV`|Previous Track | |`KC_MEDIA_STOP` |`KC_MSTP`|Stop Track (Windows) | |`KC_MEDIA_PLAY_PAUSE` |`KC_MPLY`|Play/Pause Track | |`KC_MEDIA_SELECT` |`KC_MSEL`|Launch Media Player (Windows)| |`KC_MEDIA_EJECT` |`KC_EJCT`|Eject (macOS) | |`KC_MAIL` | |Launch Mail (Windows) | |`KC_CALCULATOR` |`KC_CALC`|Launch Calculator (Windows) | |`KC_MY_COMPUTER` |`KC_MYCM`|Launch My Computer (Windows) | |`KC_WWW_SEARCH` |`KC_WSCH`|Browser Search (Windows) | |`KC_WWW_HOME` |`KC_WHOM`|Browser Home (Windows) | |`KC_WWW_BACK` |`KC_WBAK`|Browser Back (Windows) | |`KC_WWW_FORWARD` |`KC_WFWD`|Browser Forward (Windows) | |`KC_WWW_STOP` |`KC_WSTP`|Browser Stop (Windows) | |`KC_WWW_REFRESH` |`KC_WREF`|Browser Refresh (Windows) | |`KC_WWW_FAVORITES` |`KC_WFAV`|Browser Favorites (Windows) | |`KC_MEDIA_FAST_FORWARD`|`KC_MFFD`|Next Track (macOS) | |`KC_MEDIA_REWIND` |`KC_MRWD`|Previous Track (macOS) | |`KC_BRIGHTNESS_UP` |`KC_BRIU`|Brightness Up | |`KC_BRIGHTNESS_DOWN` |`KC_BRID`|Brightness Down | ## Number Pad |Key |Aliases |Description | |-------------------|---------|------------------------------| |`KC_KP_SLASH` |`KC_PSLS`|Keypad `/` | |`KC_KP_ASTERISK` |`KC_PAST`|Keypad `*` | |`KC_KP_MINUS` |`KC_PMNS`|Keypad `-` | |`KC_KP_PLUS` |`KC_PPLS`|Keypad `+` | |`KC_KP_ENTER` |`KC_PENT`|Keypad Enter | |`KC_KP_1` |`KC_P1` |Keypad `1` and End | |`KC_KP_2` |`KC_P2` |Keypad `2` and Down Arrow | |`KC_KP_3` |`KC_P3` |Keypad `3` and Page Down | |`KC_KP_4` |`KC_P4` |Keypad `4` and Left Arrow | |`KC_KP_5` |`KC_P5` |Keypad `5` | |`KC_KP_6` |`KC_P6` |Keypad `6` and Right Arrow | |`KC_KP_7` |`KC_P7` |Keypad `7` and Home | |`KC_KP_8` |`KC_P8` |Keypad `8` and Up Arrow | |`KC_KP_9` |`KC_P9` |Keypad `9` and Page Up | |`KC_KP_0` |`KC_P0` |Keypad `0` and Insert | |`KC_KP_DOT` |`KC_PDOT`|Keypad `.` and Delete | |`KC_KP_EQUAL` |`KC_PEQL`|Keypad `=` | |`KC_KP_COMMA` |`KC_PCMM`|Keypad `,` | |`KC_KP_EQUAL_AS400`| |Keypad `=` on AS/400 keyboards| ## Special Keys In addition to these, keycodes in the range of `0xA5-DF` are reserved for internal use by TMK. |Key |Aliases |Description | |----------------|--------------------|---------------------------------------| |`KC_NO` |`XXXXXXX` |Ignore this key (NOOP) | |`KC_TRANSPARENT`|`KC_TRNS`, `_______`|Use the next lowest non-transparent key| n303' href='#n303'>303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
/**CFile****************************************************************

  FileName    [mvcCompare.c]

  PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]

  Synopsis    [Various cube comparison functions.]

  Author      [MVSIS Group]
  
  Affiliation [UC Berkeley]

  Date        [Ver. 1.0. Started - February 1, 2003.]

  Revision    [$Id: mvcCompare.c,v 1.5 2003/04/03 23:25:41 alanmi Exp $]

***********************************************************************/

#include "mvc.h"

ABC_NAMESPACE_IMPL_START


////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
///                     FUNCTION DEFINITIONS                         ///
////////////////////////////////////////////////////////////////////////

/**Function*************************************************************

  Synopsis    [Compares two cubes according to their integer value.]

  Description []

  SideEffects []

  SeeAlso     []

***********************************************************************/
int Mvc_CubeCompareInt( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask )
{
    if ( Mvc_Cube1Words(pC1) )
    {
        if ( pC1->pData[0] < pC2->pData[0] )
            return -1;
        if ( pC1->pData[0] > pC2->pData[0] )
            return 1;
        return 0;
    }
    else if ( Mvc_Cube2Words(pC1) )
    {
        if ( pC1->pData[1] < pC2->pData[1] )
            return -1;
        if ( pC1->pData[1] > pC2->pData[1] )
            return 1;
        if ( pC1->pData[0] < pC2->pData[0] )
            return -1;
        if ( pC1->pData[0] > pC2->pData[0] )
            return 1;
        return 0;
    }
    else                            
    {
        int i = Mvc_CubeReadLast(pC1);
        for(; i >= 0; i--)
        {
            if ( pC1->pData[i] < pC2->pData[i] )
                return -1;
            if ( pC1->pData[i] > pC2->pData[i] )
                return 1;
        }
        return 0;
    }
}


/**Function*************************************************************

  Synopsis    [Compares the cubes (1) by size, (2) by integer value.]

  Description []

  SideEffects []

  SeeAlso     []

***********************************************************************/
int Mvc_CubeCompareSizeAndInt( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask )
{
    // compare the cubes by size
    if ( Mvc_CubeReadSize( pC1 ) < Mvc_CubeReadSize( pC2 ) )
        return 1;
    if ( Mvc_CubeReadSize( pC1 ) > Mvc_CubeReadSize( pC2 ) )
        return -1;
    // the cubes have the same size

    // compare the cubes as integers
    if ( Mvc_Cube1Words( pC1 ) )
    {
        if ( pC1->pData[0] < pC2->pData[0] )
            return -1;
        if ( pC1->pData[0] > pC2->pData[0] )
            return 1;
        return 0;
    }
    else if ( Mvc_Cube2Words( pC1 ) )
    {
        if ( pC1->pData[1] < pC2->pData[1] )
            return -1;
        if ( pC1->pData[1] > pC2->pData[1] )
            return 1;
        if ( pC1->pData[0] < pC2->pData[0] )
            return -1;
        if ( pC1->pData[0] > pC2->pData[0] )
            return 1;
        return 0;
    }
    else                            
    {
        int i = Mvc_CubeReadLast( pC1 );
        for(; i >= 0; i--)
        {
            if ( pC1->pData[i] < pC2->pData[i] )
                return -1;
            if ( pC1->pData[i] > pC2->pData[i] )
                return 1;
        }
        return 0;
    }
}

/**Function*************************************************************

  Synopsis    [Compares two cubes under the mask.]

  Description []

  SideEffects []

  SeeAlso     []

***********************************************************************/
int Mvc_CubeCompareIntUnderMask( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask )
{
    unsigned uBits1, uBits2;

    // compare the cubes under the mask
    if ( Mvc_Cube1Words(pC1) )
    {
        uBits1 = pC1->pData[0] & pMask->pData[0];
        uBits2 = pC2->pData[0] & pMask->pData[0];
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;
        // cubes are equal
        return 0;
    }
    else if ( Mvc_Cube2Words(pC1) )
    {
        uBits1 = pC1->pData[1] & pMask->pData[1];
        uBits2 = pC2->pData[1] & pMask->pData[1];
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;
        uBits1 = pC1->pData[0] & pMask->pData[0];
        uBits2 = pC2->pData[0] & pMask->pData[0];
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;
        return 0;
    }
    else                            
    {
        int i = Mvc_CubeReadLast(pC1);
        for(; i >= 0; i--)
        {
            uBits1 = pC1->pData[i] & pMask->pData[i];
            uBits2 = pC2->pData[i] & pMask->pData[i];
            if ( uBits1 < uBits2 )
                return -1;
            if ( uBits1 > uBits2 )
                return 1;
        }
        return 0;
    }
}

/**Function*************************************************************

  Synopsis    [Compares two cubes under the mask.]

  Description []

  SideEffects []

  SeeAlso     []

***********************************************************************/
int Mvc_CubeCompareIntOutsideMask( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask )
{
    unsigned uBits1, uBits2;

    // compare the cubes under the mask
    if ( Mvc_Cube1Words(pC1) )
    {
        uBits1 = pC1->pData[0] | pMask->pData[0];
        uBits2 = pC2->pData[0] | pMask->pData[0];
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;
        // cubes are equal
        return 0;
    }
    else if ( Mvc_Cube2Words(pC1) )
    {
        uBits1 = pC1->pData[1] | pMask->pData[1];
        uBits2 = pC2->pData[1] | pMask->pData[1];
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;
        uBits1 = pC1->pData[0] | pMask->pData[0];
        uBits2 = pC2->pData[0] | pMask->pData[0];
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;
        return 0;
    }
    else                            
    {
        int i = Mvc_CubeReadLast(pC1);
        for(; i >= 0; i--)
        {
            uBits1 = pC1->pData[i] | pMask->pData[i];
            uBits2 = pC2->pData[i] | pMask->pData[i];
            if ( uBits1 < uBits2 )
                return -1;
            if ( uBits1 > uBits2 )
                return 1;
        }
        return 0;
    }
}


/**Function*************************************************************

  Synopsis    [Compares the cubes (1) outside the mask, (2) under the mask.]

  Description []

  SideEffects []

  SeeAlso     []

***********************************************************************/
int Mvc_CubeCompareIntOutsideAndUnderMask( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask )
{
    unsigned uBits1, uBits2;

    if ( Mvc_Cube1Words(pC1) )
    {
        // compare the cubes outside the mask
        uBits1 = pC1->pData[0] & ~(pMask->pData[0]);
        uBits2 = pC2->pData[0] & ~(pMask->pData[0]);
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;

        // compare the cubes under the mask
        uBits1 = pC1->pData[0] & pMask->pData[0];
        uBits2 = pC2->pData[0] & pMask->pData[0];
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;
        // cubes are equal
        // should never happen
        assert( 0 );
        return 0;
    }
    else if ( Mvc_Cube2Words(pC1) )
    {
        // compare the cubes outside the mask
        uBits1 = pC1->pData[1] & ~(pMask->pData[1]);
        uBits2 = pC2->pData[1] & ~(pMask->pData[1]);
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;

        uBits1 = pC1->pData[0] & ~(pMask->pData[0]);
        uBits2 = pC2->pData[0] & ~(pMask->pData[0]);
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;

        // compare the cubes under the mask
        uBits1 = pC1->pData[1] & pMask->pData[1];
        uBits2 = pC2->pData[1] & pMask->pData[1];
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;

        uBits1 = pC1->pData[0] & pMask->pData[0];
        uBits2 = pC2->pData[0] & pMask->pData[0];
        if ( uBits1 < uBits2 )
            return -1;
        if ( uBits1 > uBits2 )
            return 1;

        // cubes are equal
        // should never happen
        assert( 0 );
        return 0;
    }
    else                            
    {
        int i;

        // compare the cubes outside the mask
        for( i = Mvc_CubeReadLast(pC1); i >= 0; i-- )
        {
            uBits1 = pC1->pData[i] & ~(pMask->pData[i]);
            uBits2 = pC2->pData[i] & ~(pMask->pData[i]);
            if ( uBits1 < uBits2 )
                return -1;
            if ( uBits1 > uBits2 )
                return 1;
        }
        // compare the cubes under the mask
        for( i = Mvc_CubeReadLast(pC1); i >= 0; i-- )
        {
            uBits1 = pC1->pData[i] & pMask->pData[i];
            uBits2 = pC2->pData[i] & pMask->pData[i];
            if ( uBits1 < uBits2 )
                return -1;
            if ( uBits1 > uBits2 )
                return 1;
        }
/*
        {
            Mvc_Cover_t * pCover;
            pCover = Mvc_CoverAlloc( NULL, 96 );
            Mvc_CubePrint( pCover, pC1 );
            Mvc_CubePrint( pCover, pC2 );
            Mvc_CubePrint( pCover, pMask );
        }
*/
        // cubes are equal
        // should never happen
        assert( 0 );
        return 0;
    }
}

////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////


ABC_NAMESPACE_IMPL_END