==== KbdXlate ====
**Bindings**: [[xlat#C bindings|C]], [[xlat#MASM bindings|MASM]]
This call translates scan codes with shift states into ASCII codes. 
KbdXlate (XlateRecord, KbdHandle) 
//XlateRecord// (**PKBDTRANS**) - input 
Address of the translation record structure: 
//chardata// (**KBDKEYINFO**) 
Character data information structure as defined in //[[charin|KbdCharIn]]// call. 
//kbdflag// (**USHORT**) 
See the //[[KbdDDFlagWord]]// call in the "Keyboard Device Driver" section of IBM Operating System/2 Version 1.2 I/O Subsystems And Device Support Volume 1. 
//xlate// (**USHORT**) 
Translation flag: 
^Value ^Definition ^
|0 |Translation incomplete. |
|1 |Translation complete. |
//xlatestate1// (**USHORT**) 
Identifies the state of translation across successive calls; initially the value should be zero. It may take several calls to this function to complete a character. The value should not be changed unless a new translation is required, that is, reset value to zero. 
//xlatestate2// (**USHORT**) 
See description for //xlatestate1//. 
//KbdHandle// (**HKBD**) - input 
Default keyboard or the logical keyboard. 
//rc// (**USHORT**) - return 
Return code descriptions are: 
|0 |NO_ERROR |
|439 |ERROR_KBD_INVALID_HANDLE |
|445 |ERROR_KBD_FOCUS_REQUIRED |
|447 |ERROR_KBD_KEYBOARD_BUSY |
|464 |ERROR_KBD_DETACHED |
|504 |ERROR_KBD_EXTENDED_SG |
**Remarks**
It may take several calls to complete a translation because of accent key combinations, or other complex operations. 
The //Xlatestate1// and //Xlatestate2// are for use by the keyboard translation routines. These fields are reserved and must only be accessed by the caller prior to starting a translation sequence and then they must be set to zero. The //KbdXlate// function is intended to be used for translating a particular scan code for a given shift state. The //KbdXlate// function is not intended to be a replacement for the OS/2 system keystroke translation function. 
=== C bindings ===
typedef struct _KBDTRANS {    /* kbxl */
  UCHAR      chChar;          /* ASCII character code */
  UCHAR      chScan;          /* Scan code */
  UCHAR      fbStatus;        /* State of the character */
  UCHAR      bNlsShift;       /* Shift status (reserved set to zero) */
  USHORT     fsState;         /* Shift state */
  ULONG      time;
  USHORT     fsDD;
  USHORT     fsXlate;
  USHORT     fsShift;
  USHORT     sZero;
} KBDTRANS;
#define INCL_KBD
USHORT  rc = KbdXlate(XlateRecord, KbdHandle);
PKBDTRANS        XlateRecord;   /* Translation Record */
HKBD             KbdHandle;     /* Keyboard handle */
USHORT           rc;            /* return code 
=== MASM bindings ===
KBDTRANS struc
  kbxl_chChar    db  ? ;ASCII character code
  kbxl_chScan    db  ? ;scan code
  kbxl_fbStatus  db  ? ;State of the character
  kbxl_bNlsShift db  ? ;shift status (reserved set to zero)
  kbxl_fsState   dw  ? ;shift state
  kbxl_time      dd  ?
  kbxl_fsDD      dw  ?
  kbxl_fsXlate   dw  ?
  kbxl_fsShift   dw  ?
  kbxl_sZero     dw  ?
KBDTRANS ends
EXTRN  KbdXlate:FAR
INCL_KBD            EQU 1
PUSH@  OTHER   XlateRecord   ;Translation Record
PUSH   WORD    KbdHandle     ;Keyboard handle
CALL   KbdXlate
Returns WORD