/*
 *  Shinobi Library
 *  Copyright (c) 1999 SEGA
 *
 *       Keyboard
 *
 *  Module  : Library Header File
 *  File    : sg_pdkbd.h
 *  Create  : 1998-03-25
 *  Modify  : 1999-12-24
 *  Version : 2.00
 *  Note    :
 */

#ifndef _SG_PDKBD_H_
#define _SG_PDKBD_H_

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include <sg_xpt.h>
#include <sg_pad.h>


/*
 *  DEFINES / MACROS
 */

/******** 特殊キービットアサイン ********************************************/
/******** Special keys bit assign *******************************************/
#define PDD_KEY_CTRL_RGUI     (1 << 7)     /* S2                            */
#define PDD_KEY_CTRL_RALT     (1 << 6)     /* R-ALT                         */
#define PDD_KEY_CTRL_RSHIFT   (1 << 5)     /* R-SHIFT                       */
#define PDD_KEY_CTRL_RCTRL    (1 << 4)     /* R-CTRL                        */
#define PDD_KEY_CTRL_LGUI     (1 << 3)     /* S1                            */
#define PDD_KEY_CTRL_LALT     (1 << 2)     /* L-ALT                         */
#define PDD_KEY_CTRL_LSHIFT   (1 << 1)     /* L-SHIFT                       */
#define PDD_KEY_CTRL_LCTRL    (1 << 0)     /* L-CTRL                        */
#define PDD_KEY_CTRL_S2       (1 << 7)     /* S2                            */
#define PDD_KEY_CTRL_S1       (1 << 3)     /* S1                            */

/******** LED点灯状態 *******************************************************/
/******** LED lighting state ************************************************/
#define PDD_LED_SHIFT         (1 << 7)     /* Shift                         */
#define PDD_LED_POWER         (1 << 6)     /* Power                         */
#define PDD_LED_KANA          (1 << 5)     /* Kana                          */
#define PDD_LED_SCRLOCK       (1 << 2)     /* Scroll Lock                   */
#define PDD_LED_CAPLOCK       (1 << 1)     /* Caps Lock                     */
#define PDD_LED_NUMLOCK       (1 << 0)     /* Num Lock                      */

/******** キーボード言語 ****************************************************/
/******** Keyboard language *************************************************/
#define PDD_KBDLANG_JP        0x01         /* Japan                         */
#define PDD_KBDLANG_US        0x02         /* America                       */
#define PDD_KBDLANG_UK        0x03         /* England                       */
#define PDD_KBDLANG_GERMANY   0x04         /* Germany                       */
#define PDD_KBDLANG_FRANCE    0x05         /* France                        */
#define PDD_KBDLANG_ITALY     0x06         /* Italy                         */
#define PDD_KBDLANG_SPAIN     0x07         /* Spain                         */
#define PDD_KBDLANG_SWEDEN    0x08         /* Sweden                        */
#define PDD_KBDLANG_SWITZER   0x09         /* Switzerland                   */
#define PDD_KBDLANG_NETHER    0x0a         /* The Netherlands               */
#define PDD_KBDLANG_PORTUGAL  0x0b         /* Portugal                      */
#define PDD_KBDLANG_LATIN     0x0c         /* Latin America                 */
#define PDD_KBDLANG_CANFRENCH 0x0d         /* Canadian French               */
#define PDD_KBDLANG_RUSSIA    0x0e         /* Russia                        */
#define PDD_KBDLANG_CHINA     0x0f         /* China                         */
#define PDD_KBDLANG_KOREA     0x10         /* Korea                         */
                                           /* 0x11 - 0xff are reserved      */

/******** キーボードタイプ***************************************************/
/******** Keyboard type *****************************************************/
#define PDD_KBDTYPE_89        0x01         /*  89 keys                      */
#define PDD_KBDTYPE_92        0x02         /*  92 keys                      */
#define PDD_KBDTYPE_101       0x03         /* 101 keys                      */
#define PDD_KBDTYPE_102       0x04         /* 102 keys                      */
#define PDD_KBDTYPE_104       0x05         /* 104 keys                      */
#define PDD_KBDTYPE_105       0x06         /* 105 keys                      */
#define PDD_KBDTYPE_106       0x07         /* 106 keys                      */
#define PDD_KBDTYPE_109       0x08         /* 109 keys                      */
#define PDD_KBDTYPE_87        0x09         /*  87 keys                      */
#define PDD_KBDTYPE_88        0x0a         /*  88 keys                      */
                                           /* 0x0b - 0xff are reserved      */

/******** LEDの制御 *********************************************************/
/******** LED Control *******************************************************/
#define PDD_LEDCTRL_HOST      0x00         /* ホスト(DC)が制御する          */
                                           /* Dreamcast controls LCD.       */
#define PDD_LEDCTRL_KEYBOARD  0x80         /* キーボードが制御する          */
                                           /* Keyboard controler LCD.       */


/*
 *  TYPEDEFS
 */

/******** キーボード情報構造体 *********************************************/
/******** Keyboard info structure ******************************************/
typedef struct {
	Uint8 lang;                           /* キーボード言語                */
	                                      /* Language                      */
	Uint8 type;                           /* キーボードタイプ              */
	                                      /* Type                          */
	Uint8 led;                            /* LEDの種類                     */
	                                      /* LED Type                      */
	Uint8 led_ctrl;                       /* LEDの制御                     */
	                                      /* LED Control                   */
} PDS_KEYBOARDINFO;

/******** キーボードデータ構造体 *******************************************/
/******** Keyboard data structure ******************************************/
typedef struct {
	Uint8 ctrl;                           /* 特殊キーの状態                */
	                                      /* Special keys state            */
	Uint8 led;                            /* LEDの点灯状態                 */
	                                      /* LED lighting state            */
	Uint8 key[6];                         /* 押されているキーコード        */
	                                      /* key codes                     */
	PDS_KEYBOARDINFO* info;               /* キーボード情報へのポインタ    */
	                                      /* Pointer to keyboard info      */
} PDS_KEYBOARD;



/*
 *  PROTOTYPES
 */

/******** 低レベルキーボード関数 *******************************************/
/******** Low level keyboard functions *************************************/
void pdKbdInit(void);
void pdKbdExit(void);
const PDS_KEYBOARD* pdKbdGetData(Uint32 port);
const PDS_KEYBOARDINFO* pdKbdGetInfo(Uint32 port);
void pdKbdExecServer(void);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _SG_PDKBD_H_ */
