VirtualBox

Ignore:
Timestamp:
Jul 22, 2013 5:44:50 PM (11 years ago)
Author:
vboxsync
Message:

PS2K: Merged and extended scan set 1/2 processing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Input/PS2K.cpp

    r47313 r47321  
    889889    key_def const   *pKeyDef;
    890890    uint8_t         abCodes[16];
     891    uint8_t         u8MakeCode;
    891892
    892893    LogFlowFunc(("key %s: 0x%02x (set %d)\n", fKeyDown ? "down" : "up", u8HidCode, pThis->u8ScanSet));
     
    920921        pThis->fNumLockOn ^= true;
    921922
    922     if (pThis->u8ScanSet == 2)
    923     {
    924         /* Handle Scan Set 2 - used almost all the time. */
     923    if (pThis->u8ScanSet == 1 || pThis->u8ScanSet == 2)
     924    {
     925        /* The basic scan set 1 and 2 logic is the same, only the scan codes differ.
     926         * Since scan set 2 is used almost all the time, that case is handled first.
     927         */
    925928        abCodes[0] = 0;
    926929        if (fKeyDown)
     
    931934                /* Pause/Break sends different data if either Ctrl is held. */
    932935                if (pThis->u8Modifiers & (MOD_LCTRL | MOD_RCTRL))
    933                     strcpy((char *)abCodes, "\xE0\x7E\xE0\xF0\x7E");
     936                    strcpy((char *)abCodes, pThis->u8ScanSet == 2 ?
     937                           "\xE0\x7E\xE0\xF0\x7E" : "\xE0\x46\xE0\xC6");
    934938                else
    935                     strcpy((char *)abCodes, "\xE1\x14\x77\xE1\xF0\x14\xF0\x77");
     939                    strcpy((char *)abCodes, pThis->u8ScanSet == 2 ?
     940                           "\xE1\x14\x77\xE1\xF0\x14\xF0\x77" : "\xE1\x1D\x45\xE1\x9D\xC5");
    936941            }
    937942            else if (pKeyDef->keyFlags & KF_PS)
    938943            {
    939                 /* Print Screen depends on all Ctrl, Shift, *and* Alt! */
     944                /* Print Screen depends on all of Ctrl, Shift, *and* Alt! */
    940945                if (pThis->u8Modifiers & (MOD_LALT | MOD_RALT))
    941                     strcpy((char *)abCodes, "\x84");
     946                    strcpy((char *)abCodes, pThis->u8ScanSet == 2 ?
     947                           "\x84" : "\x54");
    942948                else if (pThis->u8Modifiers & (MOD_LSHIFT | MOD_RSHIFT))
    943                     strcpy((char *)abCodes, "\xE0\x7C");
     949                    strcpy((char *)abCodes, pThis->u8ScanSet == 2 ?
     950                           "\xE0\x7C" : "\xE0\x37");
    944951                else
    945                     strcpy((char *)abCodes, "\xE0\x12\xE0\x7C");
     952                    strcpy((char *)abCodes, pThis->u8ScanSet == 2 ?
     953                           "\xE0\x12\xE0\x7C" : "\xE0\x2A\xE0\x37");
    946954            }
    947             else if (pKeyDef->keyFlags & KF_GK)
     955            else if (pKeyDef->keyFlags & (KF_GK | KF_NS))
    948956            {
    949                 if (pThis->fNumLockOn)
     957                /* The numeric pad keys fake Shift presses or releases
     958                 * depending on Num Lock and Shift key state. The '/'
     959                 * key behaves in a similar manner but does not depend on
     960                 * the Num Lock state.
     961                 */
     962                if (!pThis->fNumLockOn || (pKeyDef->keyFlags & KF_NS))
    950963                {
    951                     if ((pThis->u8Modifiers & (MOD_LSHIFT | MOD_RSHIFT)) == 0)
    952                         strcpy((char *)abCodes, "\xE0\x12");
     964                    if (pThis->u8Modifiers & MOD_LSHIFT)
     965                        strcat((char *)abCodes, pThis->u8ScanSet == 2 ?
     966                               "\xE0\xF0\x12" : "\xE0\xAA");
     967                    if (pThis->u8Modifiers & MOD_RSHIFT)
     968                        strcat((char *)abCodes, pThis->u8ScanSet == 2 ?
     969                               "\xE0\xF0\x59" : "\xE0\xB6");
    953970                }
    954971                else
    955972                {
    956                     if (pThis->u8Modifiers & MOD_LSHIFT)
    957                         strcat((char *)abCodes, "\xE0\xF0\x12");
    958                     if (pThis->u8Modifiers & MOD_RSHIFT)
    959                         strcat((char *)abCodes, "\xE0\xF0\x59");
     973                    Assert(pThis->fNumLockOn);  /* Not for KF_NS! */
     974                    if ((pThis->u8Modifiers & (MOD_LSHIFT | MOD_RSHIFT)) == 0)
     975                        strcpy((char *)abCodes, pThis->u8ScanSet == 2 ?
     976                               "\xE0\x12" : "\xE0\x2A");
     977                    /* Else Shift cancels NumLock, so no prefix! */
    960978                }
    961979            }
     
    967985
    968986            /* Standard processing for regular keys only. */
     987            u8MakeCode = pThis->u8ScanSet == 2 ? pKeyDef->makeS2 : pKeyDef->makeS1;
    969988            if (!(pKeyDef->keyFlags & (KF_PB | KF_PS)))
    970989            {
    971990                if (pKeyDef->keyFlags & (KF_E0 | KF_GK | KF_NS))
    972991                    ps2kInsertQueue((GeneriQ *)&pThis->keyQ, 0xE0);
    973                 ps2kInsertQueue((GeneriQ *)&pThis->keyQ, pKeyDef->makeS2);
     992                ps2kInsertQueue((GeneriQ *)&pThis->keyQ, u8MakeCode);
    974993            }
    975994        }
     
    9831002                /* Undo faked Print Screen state as needed. */
    9841003                if (pThis->u8Modifiers & (MOD_LALT | MOD_RALT))
    985                     strcpy((char *)abCodes, "\xF0\x84");
     1004                    strcpy((char *)abCodes, pThis->u8ScanSet == 2 ?
     1005                           "\xF0\x84" : "\xD4");
    9861006                else if (pThis->u8Modifiers & (MOD_LSHIFT | MOD_RSHIFT))
    987                     strcpy((char *)abCodes, "\xE0\xF0\x7C");
     1007                    strcpy((char *)abCodes, pThis->u8ScanSet == 2 ?
     1008                           "\xE0\xF0\x7C" : "\xE0\xB7");
    9881009                else
    989                     strcpy((char *)abCodes, "\xE0\xF0\x7C\xE0\xF0\x12");
     1010                    strcpy((char *)abCodes, pThis->u8ScanSet == 2 ?
     1011                           "\xE0\xF0\x7C\xE0\xF0\x12" : "\xE0\xB7\xE0\xAA");
    9901012            }
    9911013            else
     
    9941016                if (pKeyDef->keyFlags & (KF_E0 | KF_GK | KF_NS))
    9951017                    ps2kInsertQueue((GeneriQ *)&pThis->keyQ, 0xE0);
    996                 ps2kInsertQueue((GeneriQ *)&pThis->keyQ, 0xF0);
    997                 ps2kInsertQueue((GeneriQ *)&pThis->keyQ, pKeyDef->makeS2);
     1018                if (pThis->u8ScanSet == 2) {
     1019                    ps2kInsertQueue((GeneriQ *)&pThis->keyQ, 0xF0);
     1020                    ps2kInsertQueue((GeneriQ *)&pThis->keyQ, pKeyDef->makeS2);
     1021                } else {
     1022                    Assert(pThis->u8ScanSet == 1);
     1023                    ps2kInsertQueue((GeneriQ *)&pThis->keyQ, pKeyDef->makeS1 | 0x80);
     1024                }
    9981025
    9991026                /* Restore shift state for gray keys. */
    1000                 if (pKeyDef->keyFlags & KF_GK)
     1027                if (pKeyDef->keyFlags & (KF_GK | KF_NS))
    10011028                {
    1002                     if (pThis->fNumLockOn)
     1029                    if (!pThis->fNumLockOn || (pKeyDef->keyFlags & KF_NS))
    10031030                    {
    1004                         if ((pThis->u8Modifiers & (MOD_LSHIFT | MOD_RSHIFT)) == 0)
    1005                             strcpy((char *)abCodes, "\xE0\xF0\x12");
     1031                        if (pThis->u8Modifiers & MOD_LSHIFT)
     1032                            strcat((char *)abCodes, pThis->u8ScanSet == 2 ?
     1033                                   "\xE0\x12" : "\xE0\x2A");
     1034                        if (pThis->u8Modifiers & MOD_RSHIFT)
     1035                            strcat((char *)abCodes, pThis->u8ScanSet == 2 ?
     1036                                   "\xE0\x59" : "\xE0\x36");
    10061037                    }
    10071038                    else
    10081039                    {
    1009                         if (pThis->u8Modifiers & MOD_RSHIFT)
    1010                             strcat((char *)abCodes, "\xE0\x59");
    1011                         if (pThis->u8Modifiers & MOD_LSHIFT)
    1012                             strcat((char *)abCodes, "\xE0\x12");
     1040                        Assert(pThis->fNumLockOn);  /* Not for KF_NS! */
     1041                        if ((pThis->u8Modifiers & (MOD_LSHIFT | MOD_RSHIFT)) == 0)
     1042                            strcpy((char *)abCodes, pThis->u8ScanSet == 2 ?
     1043                                   "\xE0\xF0\x12" : "\xE0\xAA");
    10131044                    }
    10141045                }
     
    10221053        }
    10231054    }
    1024     else if (pThis->u8ScanSet == 1)
    1025     {
    1026         /* Handle Scan Set 1 - similar in complexity to Set 2. */
    1027         if (fKeyDown)
    1028         {
    1029             if (pKeyDef->keyFlags & (KF_E0 | KF_GK | KF_NS | KF_PS))
    1030                 ps2kInsertQueue((GeneriQ *)&pThis->keyQ, 0xE0);
    1031             ps2kInsertQueue((GeneriQ *)&pThis->keyQ, pKeyDef->makeS1);
    1032         }
    1033         else if (!(pKeyDef->keyFlags & (KF_NB | KF_PB))) {
    1034             if (pKeyDef->keyFlags & (KF_E0 | KF_GK | KF_NS | KF_PS))
    1035                 ps2kInsertQueue((GeneriQ *)&pThis->keyQ, 0xE0);
    1036             ps2kInsertQueue((GeneriQ *)&pThis->keyQ, pKeyDef->makeS1 | 0x80);
    1037         }
    1038     }
    10391055    else
    10401056    {
    10411057        /* Handle Scan Set 3 - very straightforward. */
     1058        Assert(pThis->u8ScanSet == 3);
    10421059        if (fKeyDown)
    10431060        {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette