mirror of
https://github.com/MiSTer-devel/InputTest_MiSTer.git
synced 2026-04-19 03:04:18 +00:00
Add simulated ps2 keyboard events (win only)
This commit is contained in:
@@ -71,7 +71,7 @@ void SimBus::BeforeEval()
|
||||
}
|
||||
|
||||
if (ioctl_file) {
|
||||
console.AddLog("ioctl_download addr %x ioctl_wait %x", *ioctl_addr, *ioctl_wait);
|
||||
//console.AddLog("ioctl_download addr %x ioctl_wait %x", *ioctl_addr, *ioctl_wait);
|
||||
if (*ioctl_wait == 0) {
|
||||
*ioctl_download = 1;
|
||||
*ioctl_wr = 1;
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#define WIN32
|
||||
#endif
|
||||
|
||||
|
||||
struct SimBus_DownloadChunk {
|
||||
public:
|
||||
std::string file;
|
||||
|
||||
@@ -18,6 +18,266 @@ unsigned char m_keyboardState_last[256];
|
||||
|
||||
#include <vector>
|
||||
|
||||
static const int ev2ps2[] =
|
||||
{
|
||||
NONE, //0 KEY_RESERVED
|
||||
0x76, //1 KEY_ESC
|
||||
0x16, //2 KEY_1
|
||||
0x1e, //3 KEY_2
|
||||
0x26, //4 KEY_3
|
||||
0x25, //5 KEY_4
|
||||
0x2e, //6 KEY_5
|
||||
0x36, //7 KEY_6
|
||||
0x3d, //8 KEY_7
|
||||
0x3e, //9 KEY_8
|
||||
0x46, //10 KEY_9
|
||||
0x45, //11 KEY_0
|
||||
0x4e, //12 KEY_MINUS
|
||||
0x55, //13 KEY_EQUAL
|
||||
0x66, //14 KEY_BACKSPACE
|
||||
0x0d, //15 KEY_TAB
|
||||
0x15, //16 KEY_Q
|
||||
0x1d, //17 KEY_W
|
||||
0x24, //18 KEY_E
|
||||
0x2d, //19 KEY_R
|
||||
0x2c, //20 KEY_T
|
||||
0x35, //21 KEY_Y
|
||||
0x3c, //22 KEY_U
|
||||
0x43, //23 KEY_I
|
||||
0x44, //24 KEY_O
|
||||
0x4d, //25 KEY_P
|
||||
0x54, //26 KEY_LEFTBRACE
|
||||
0x5b, //27 KEY_RIGHTBRACE
|
||||
0x5a, //28 KEY_ENTER
|
||||
LCTRL | 0x14, //29 KEY_LEFTCTRL
|
||||
0x1c, //30 KEY_A
|
||||
0x1b, //31 KEY_S
|
||||
0x23, //32 KEY_D
|
||||
0x2b, //33 KEY_F
|
||||
0x34, //34 KEY_G
|
||||
0x33, //35 KEY_H
|
||||
0x3b, //36 KEY_J
|
||||
0x42, //37 KEY_K
|
||||
0x4b, //38 KEY_L
|
||||
0x4c, //39 KEY_SEMICOLON
|
||||
0x52, //40 KEY_APOSTROPHE
|
||||
0x0e, //41 KEY_GRAVE
|
||||
LSHIFT | 0x12, //42 KEY_LEFTSHIFT
|
||||
0x5d, //43 KEY_BACKSLASH
|
||||
0x1a, //44 KEY_Z
|
||||
0x22, //45 KEY_X
|
||||
0x21, //46 KEY_C
|
||||
0x2a, //47 KEY_V
|
||||
0x32, //48 KEY_B
|
||||
0x31, //49 KEY_N
|
||||
0x3a, //50 KEY_M
|
||||
0x41, //51 KEY_COMMA
|
||||
0x49, //52 KEY_DOT
|
||||
0x4a, //53 KEY_SLASH
|
||||
RSHIFT | 0x59, //54 KEY_RIGHTSHIFT
|
||||
0x7c, //55 KEY_KPASTERISK
|
||||
LALT | 0x11, //56 KEY_LEFTALT
|
||||
0x29, //57 KEY_SPACE
|
||||
0x58, //58 KEY_CAPSLOCK
|
||||
0x05, //59 KEY_F1
|
||||
0x06, //60 KEY_F2
|
||||
0x04, //61 KEY_F3
|
||||
0x0c, //62 KEY_F4
|
||||
0x03, //63 KEY_F5
|
||||
0x0b, //64 KEY_F6
|
||||
0x83, //65 KEY_F7
|
||||
0x0a, //66 KEY_F8
|
||||
0x01, //67 KEY_F9
|
||||
0x09, //68 KEY_F10
|
||||
EMU_SWITCH_2 | 0x77, //69 KEY_NUMLOCK
|
||||
EMU_SWITCH_1 | 0x7E, //70 KEY_SCROLLLOCK
|
||||
0x6c, //71 KEY_KP7
|
||||
0x75, //72 KEY_KP8
|
||||
0x7d, //73 KEY_KP9
|
||||
0x7b, //74 KEY_KPMINUS
|
||||
0x6b, //75 KEY_KP4
|
||||
0x73, //76 KEY_KP5
|
||||
0x74, //77 KEY_KP6
|
||||
0x79, //78 KEY_KPPLUS
|
||||
0x69, //79 KEY_KP1
|
||||
0x72, //80 KEY_KP2
|
||||
0x7a, //81 KEY_KP3
|
||||
0x70, //82 KEY_KP0
|
||||
0x71, //83 KEY_KPDOT
|
||||
NONE, //84 ???
|
||||
NONE, //85 KEY_ZENKAKU
|
||||
0x61, //86 KEY_102ND
|
||||
0x78, //87 KEY_F11
|
||||
0x07, //88 KEY_F12
|
||||
NONE, //89 KEY_RO
|
||||
NONE, //90 KEY_KATAKANA
|
||||
NONE, //91 KEY_HIRAGANA
|
||||
NONE, //92 KEY_HENKAN
|
||||
NONE, //93 KEY_KATAKANA
|
||||
NONE, //94 KEY_MUHENKAN
|
||||
NONE, //95 KEY_KPJPCOMMA
|
||||
EXT | 0x5a, //96 KEY_KPENTER
|
||||
RCTRL | EXT | 0x14, //97 KEY_RIGHTCTRL
|
||||
EXT | 0x4a, //98 KEY_KPSLASH
|
||||
0xE2, //99 KEY_SYSRQ
|
||||
RALT | EXT | 0x11, //100 KEY_RIGHTALT
|
||||
NONE, //101 KEY_LINEFEED
|
||||
EXT | 0x6c, //102 KEY_HOME
|
||||
EXT | 0x75, //103 KEY_UP
|
||||
EXT | 0x7d, //104 KEY_PAGEUP
|
||||
EXT | 0x6b, //105 KEY_LEFT
|
||||
EXT | 0x74, //106 KEY_RIGHT
|
||||
EXT | 0x69, //107 KEY_END
|
||||
EXT | 0x72, //108 KEY_DOWN
|
||||
EXT | 0x7a, //109 KEY_PAGEDOWN
|
||||
EXT | 0x70, //110 KEY_INSERT
|
||||
EXT | 0x71, //111 KEY_DELETE
|
||||
NONE, //112 KEY_MACRO
|
||||
NONE, //113 KEY_MUTE
|
||||
NONE, //114 KEY_VOLUMEDOWN
|
||||
NONE, //115 KEY_VOLUMEUP
|
||||
NONE, //116 KEY_POWER
|
||||
NONE, //117 KEY_KPEQUAL
|
||||
NONE, //118 KEY_KPPLUSMINUS
|
||||
0xE1, //119 KEY_PAUSE
|
||||
NONE, //120 KEY_SCALE
|
||||
NONE, //121 KEY_KPCOMMA
|
||||
NONE, //122 KEY_HANGEUL
|
||||
NONE, //123 KEY_HANJA
|
||||
NONE, //124 KEY_YEN
|
||||
LGUI | EXT | 0x1f, //125 KEY_LEFTMETA
|
||||
RGUI | EXT | 0x27, //126 KEY_RIGHTMETA
|
||||
NONE, //127 KEY_COMPOSE
|
||||
NONE, //128 KEY_STOP
|
||||
NONE, //129 KEY_AGAIN
|
||||
NONE, //130 KEY_PROPS
|
||||
NONE, //131 KEY_UNDO
|
||||
NONE, //132 KEY_FRONT
|
||||
NONE, //133 KEY_COPY
|
||||
NONE, //134 KEY_OPEN
|
||||
NONE, //135 KEY_PASTE
|
||||
NONE, //136 KEY_FIND
|
||||
NONE, //137 KEY_CUT
|
||||
NONE, //138 KEY_HELP
|
||||
NONE, //139 KEY_MENU
|
||||
NONE, //140 KEY_CALC
|
||||
NONE, //141 KEY_SETUP
|
||||
NONE, //142 KEY_SLEEP
|
||||
NONE, //143 KEY_WAKEUP
|
||||
NONE, //144 KEY_FILE
|
||||
NONE, //145 KEY_SENDFILE
|
||||
NONE, //146 KEY_DELETEFILE
|
||||
NONE, //147 KEY_XFER
|
||||
NONE, //148 KEY_PROG1
|
||||
NONE, //149 KEY_PROG2
|
||||
NONE, //150 KEY_WWW
|
||||
NONE, //151 KEY_MSDOS
|
||||
NONE, //152 KEY_SCREENLOCK
|
||||
NONE, //153 KEY_DIRECTION
|
||||
NONE, //154 KEY_CYCLEWINDOWS
|
||||
NONE, //155 KEY_MAIL
|
||||
NONE, //156 KEY_BOOKMARKS
|
||||
NONE, //157 KEY_COMPUTER
|
||||
NONE, //158 KEY_BACK
|
||||
NONE, //159 KEY_FORWARD
|
||||
NONE, //160 KEY_CLOSECD
|
||||
NONE, //161 KEY_EJECTCD
|
||||
NONE, //162 KEY_EJECTCLOSECD
|
||||
NONE, //163 KEY_NEXTSONG
|
||||
NONE, //164 KEY_PLAYPAUSE
|
||||
NONE, //165 KEY_PREVIOUSSONG
|
||||
NONE, //166 KEY_STOPCD
|
||||
NONE, //167 KEY_RECORD
|
||||
NONE, //168 KEY_REWIND
|
||||
NONE, //169 KEY_PHONE
|
||||
NONE, //170 KEY_ISO
|
||||
NONE, //171 KEY_CONFIG
|
||||
NONE, //172 KEY_HOMEPAGE
|
||||
NONE, //173 KEY_REFRESH
|
||||
NONE, //174 KEY_EXIT
|
||||
NONE, //175 KEY_MOVE
|
||||
NONE, //176 KEY_EDIT
|
||||
NONE, //177 KEY_SCROLLUP
|
||||
NONE, //178 KEY_SCROLLDOWN
|
||||
NONE, //179 KEY_KPLEFTPAREN
|
||||
NONE, //180 KEY_KPRIGHTPAREN
|
||||
NONE, //181 KEY_NEW
|
||||
NONE, //182 KEY_REDO
|
||||
NONE, //183 KEY_F13
|
||||
NONE, //184 KEY_F14
|
||||
NONE, //185 KEY_F15
|
||||
NONE, //186 KEY_F16
|
||||
EMU_SWITCH_1 | 1, //187 KEY_F17
|
||||
EMU_SWITCH_1 | 2, //188 KEY_F18
|
||||
EMU_SWITCH_1 | 3, //189 KEY_F19
|
||||
EMU_SWITCH_1 | 4, //190 KEY_F20
|
||||
NONE, //191 KEY_F21
|
||||
NONE, //192 KEY_F22
|
||||
NONE, //193 KEY_F23
|
||||
0x5D, //194 U-mlaut on DE mapped to backslash
|
||||
NONE, //195 ???
|
||||
NONE, //196 ???
|
||||
NONE, //197 ???
|
||||
NONE, //198 ???
|
||||
NONE, //199 ???
|
||||
NONE, //200 KEY_PLAYCD
|
||||
NONE, //201 KEY_PAUSECD
|
||||
NONE, //202 KEY_PROG3
|
||||
NONE, //203 KEY_PROG4
|
||||
NONE, //204 KEY_DASHBOARD
|
||||
NONE, //205 KEY_SUSPEND
|
||||
NONE, //206 KEY_CLOSE
|
||||
NONE, //207 KEY_PLAY
|
||||
NONE, //208 KEY_FASTFORWARD
|
||||
NONE, //209 KEY_BASSBOOST
|
||||
NONE, //210 KEY_PRINT
|
||||
NONE, //211 KEY_HP
|
||||
NONE, //212 KEY_CAMERA
|
||||
NONE, //213 KEY_SOUND
|
||||
NONE, //214 KEY_QUESTION
|
||||
NONE, //215 KEY_EMAIL
|
||||
NONE, //216 KEY_CHAT
|
||||
NONE, //217 KEY_SEARCH
|
||||
NONE, //218 KEY_CONNECT
|
||||
NONE, //219 KEY_FINANCE
|
||||
NONE, //220 KEY_SPORT
|
||||
NONE, //221 KEY_SHOP
|
||||
NONE, //222 KEY_ALTERASE
|
||||
NONE, //223 KEY_CANCEL
|
||||
NONE, //224 KEY_BRIGHT_DOWN
|
||||
NONE, //225 KEY_BRIGHT_UP
|
||||
NONE, //226 KEY_MEDIA
|
||||
NONE, //227 KEY_SWITCHVIDEO
|
||||
NONE, //228 KEY_DILLUMTOGGLE
|
||||
NONE, //229 KEY_DILLUMDOWN
|
||||
NONE, //230 KEY_DILLUMUP
|
||||
NONE, //231 KEY_SEND
|
||||
NONE, //232 KEY_REPLY
|
||||
NONE, //233 KEY_FORWARDMAIL
|
||||
NONE, //234 KEY_SAVE
|
||||
NONE, //235 KEY_DOCUMENTS
|
||||
NONE, //236 KEY_BATTERY
|
||||
NONE, //237 KEY_BLUETOOTH
|
||||
NONE, //238 KEY_WLAN
|
||||
NONE, //239 KEY_UWB
|
||||
NONE, //240 KEY_UNKNOWN
|
||||
NONE, //241 KEY_VIDEO_NEXT
|
||||
NONE, //242 KEY_VIDEO_PREV
|
||||
NONE, //243 KEY_BRIGHT_CYCLE
|
||||
NONE, //244 KEY_BRIGHT_AUTO
|
||||
NONE, //245 KEY_DISPLAY_OFF
|
||||
NONE, //246 KEY_WWAN
|
||||
NONE, //247 KEY_RFKILL
|
||||
NONE, //248 KEY_MICMUTE
|
||||
NONE, //249 ???
|
||||
NONE, //250 ???
|
||||
NONE, //251 ???
|
||||
NONE, //252 ???
|
||||
NONE, //253 ???
|
||||
NONE, //254 ???
|
||||
NONE //255 ???
|
||||
};
|
||||
|
||||
bool ReadKeyboard()
|
||||
{
|
||||
#ifdef WIN32
|
||||
@@ -74,17 +334,22 @@ void SimInput::Read() {
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
for (unsigned char k = 0; k < 256; k++) {
|
||||
for (unsigned char k = 0; k < 128; k++) {
|
||||
if (m_keyboardState_last[k] != m_keyboardState[k]) {
|
||||
bool ext = 0;
|
||||
SimInput_PS2KeyEvent evt = SimInput_PS2KeyEvent(k, m_keyboardState[k], ext);
|
||||
keyEvents.push(evt);
|
||||
}
|
||||
m_keyboardState_last[k] = m_keyboardState[k];
|
||||
}
|
||||
#else
|
||||
m_keyboardState_last = m_keyboardState;
|
||||
m_keyboardState_last = m_keyboardState;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void SimInput::SetMapping(int index, int code) {
|
||||
printf("index %d code %d\n", index, code);
|
||||
//printf("index %d code %d\n", index, code);
|
||||
if (code < 256)
|
||||
mappings[index] = code;
|
||||
else
|
||||
@@ -101,6 +366,35 @@ void SimInput::CleanUp() {
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned ps2_key_temp;
|
||||
bool ps2_clock = 0;
|
||||
|
||||
void SimInput::BeforeEval()
|
||||
{
|
||||
if (keyEventTimer == 0) {
|
||||
if (keyEvents.size() > 0) {
|
||||
// Get chunk from queue
|
||||
SimInput_PS2KeyEvent evt = keyEvents.front();
|
||||
keyEvents.pop();
|
||||
|
||||
ps2_key_temp = ev2ps2[evt.code];
|
||||
|
||||
//if (evt.extended) { ps2_key_temp |= (1UL << 8); }
|
||||
if (evt.pressed) { ps2_key_temp |= (1UL << 9); }
|
||||
if (ps2_clock) { ps2_key_temp |= (1UL << 10); }
|
||||
|
||||
ps2_clock = !ps2_clock;
|
||||
|
||||
*ps2_key = ps2_key_temp;
|
||||
|
||||
keyEventTimer = keyEventWait;
|
||||
}
|
||||
}
|
||||
else {
|
||||
keyEventTimer--;
|
||||
}
|
||||
}
|
||||
|
||||
SimInput::SimInput(int count)
|
||||
{
|
||||
inputCount = count;
|
||||
|
||||
@@ -5,8 +5,24 @@
|
||||
#pragma comment(lib, "dinput8.lib")
|
||||
#pragma comment(lib, "dxguid.lib")
|
||||
#endif
|
||||
#include "verilated_heavy.h"
|
||||
#include <queue>
|
||||
#include <vector>
|
||||
|
||||
|
||||
struct SimInput_PS2KeyEvent {
|
||||
public:
|
||||
char code;
|
||||
bool pressed;
|
||||
bool extended;
|
||||
|
||||
SimInput_PS2KeyEvent(char code, bool pressed, bool extended) {
|
||||
this->code = code;
|
||||
this->pressed = pressed;
|
||||
this->extended = extended;
|
||||
}
|
||||
};
|
||||
|
||||
struct SimInput {
|
||||
public:
|
||||
|
||||
@@ -14,10 +30,34 @@ public:
|
||||
bool inputs[16];
|
||||
int mappings[16];
|
||||
|
||||
SData* ps2_key = NULL;
|
||||
std::queue<SimInput_PS2KeyEvent> keyEvents;
|
||||
unsigned int keyEventTimer = 0;
|
||||
unsigned int keyEventWait = 500;
|
||||
|
||||
#define NONE 0xFF
|
||||
#define LCTRL 0x000100
|
||||
#define LSHIFT 0x000200
|
||||
#define LALT 0x000400
|
||||
#define LGUI 0x000800
|
||||
#define RCTRL 0x001000
|
||||
#define RSHIFT 0x002000
|
||||
#define RALT 0x004000
|
||||
#define RGUI 0x008000
|
||||
#define MODMASK 0x00FF00
|
||||
#define OSD 0x010000 // to be used by OSD, not the core itself
|
||||
#define OSD_OPEN 0x020000 // OSD key not forwarded to core, but queued in arm controller
|
||||
#define CAPS_TOGGLE 0x040000 // caps lock toggle behaviour
|
||||
#define EXT 0x080000
|
||||
#define EMU_SWITCH_1 0x100000
|
||||
#define EMU_SWITCH_2 0x200000
|
||||
|
||||
|
||||
void Read();
|
||||
int Initialise();
|
||||
void CleanUp();
|
||||
void SetMapping(int index, int code);
|
||||
void BeforeEval(void);
|
||||
SimInput(int count);
|
||||
~SimInput();
|
||||
};
|
||||
|
||||
@@ -420,7 +420,6 @@ void SimVideo::Clock(bool hblank, bool vblank, bool hsync, bool vsync, uint32_t
|
||||
if (last_vsync && !vsync) {
|
||||
count_frame++;
|
||||
count_line = 0;
|
||||
frameChanged = 1;
|
||||
#ifdef WIN32
|
||||
GetSystemTime(&actualtime);
|
||||
time_ms = (actualtime.wSecond * 1000) + actualtime.wMilliseconds;
|
||||
|
||||
@@ -33,8 +33,6 @@ public:
|
||||
|
||||
ImTextureID texture_id;
|
||||
|
||||
bool frameChanged;
|
||||
|
||||
SimVideo(int width, int height, int rotate);
|
||||
~SimVideo();
|
||||
void UpdateTexture();
|
||||
|
||||
@@ -99,7 +99,10 @@ int verilate() {
|
||||
|
||||
// Simulate both edges of system clock
|
||||
if (clk_sys.clk != clk_sys.old) {
|
||||
if (clk_sys.clk) { bus.BeforeEval(); }
|
||||
if (clk_sys.clk) {
|
||||
input.BeforeEval();
|
||||
bus.BeforeEval();
|
||||
}
|
||||
top->eval();
|
||||
if (clk_sys.clk) { bus.AfterEval(); }
|
||||
}
|
||||
@@ -146,6 +149,7 @@ int main(int argc, char** argv, char** env) {
|
||||
bus.ioctl_wr = &top->ioctl_wr;
|
||||
bus.ioctl_dout = &top->ioctl_dout;
|
||||
//bus.ioctl_din = &top->ioctl_din;
|
||||
input.ps2_key = &top->ps2_key;
|
||||
|
||||
// Set up input module
|
||||
input.Initialise();
|
||||
@@ -177,10 +181,6 @@ int main(int argc, char** argv, char** env) {
|
||||
// Setup video output
|
||||
if (video.Initialise(windowTitle) == 1) { return 1; }
|
||||
|
||||
//bus.QueueDownload("../src/os.bin", 0);
|
||||
//bus.QueueDownload("../MiSTer.pf", 1);
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
MSG msg;
|
||||
ZeroMemory(&msg, sizeof(msg));
|
||||
@@ -306,37 +306,6 @@ int main(int argc, char** argv, char** env) {
|
||||
top->spinner_0 += 1;
|
||||
top->spinner_1 -= 1;
|
||||
|
||||
|
||||
if (video.frameChanged) {
|
||||
top->ps2_key = 0;
|
||||
|
||||
ps2_timer++;
|
||||
if (ps2_timer == 2) {
|
||||
ps2_scancode =0x16;
|
||||
ps2_toggle = !ps2_toggle;
|
||||
|
||||
ps2_timer = 0;
|
||||
}
|
||||
if (ps2_toggle) {
|
||||
top->ps2_key &= ~(1UL << 10);
|
||||
}
|
||||
else {
|
||||
top->ps2_key |= (1UL << 10);
|
||||
}
|
||||
|
||||
for (char b = 0; b < 8; b++) {
|
||||
char bit = (ps2_scancode >> b) & 1U;
|
||||
if (bit == 1) {
|
||||
top->ps2_key |= (1UL << b);
|
||||
}
|
||||
}
|
||||
}
|
||||
video.frameChanged = 0;
|
||||
|
||||
if (!bus.HasQueue() && input.inputs[input_pause]) {
|
||||
bus.QueueDownload("../src/os.bin", 0);
|
||||
}
|
||||
|
||||
top->ps2_mouse += 1;
|
||||
top->ps2_mouse_ext -= 1;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user