removes win95 polyfill bits

This commit is contained in:
Dethrace Labs 2025-05-28 13:02:42 +12:00
parent db63ac6dfb
commit effccaa8d2
15 changed files with 259 additions and 918 deletions

View File

@ -83,7 +83,8 @@ void KeyboardHandler(void) {
tU8 up;
static tU8 extended;
LOG_TRACE("()");
NOT_IMPLEMENTED();
gHarness_platform.GetKeyboardState(gKeyboard_bits);
}
// IDA: int __usercall KeyDown@<EAX>(tU8 pScan_code@<EAX>)
@ -216,6 +217,7 @@ void KeyBegin(void) {
// gPrev_keyboard_handler = dos_getvect(9);
// dos_setvect(9, KeyboardHandler);
gHarness_platform.SetKeyHandler(KeyboardHandler);
}
// IDA: void __cdecl KeyEnd()
@ -239,7 +241,7 @@ void PDSetKeyArray(int* pKeys, int pMark) {
LOG_TRACE10("(%p, %d)", pKeys, pMark);
// Required in some cases like a tight loop waiting for a keypress
gHarness_platform.ProcessWindowMessages(NULL);
gHarness_platform.ProcessWindowMessages();
gKeys_pressed = 0;
for (i = 0; i < COUNT_OF(gScan_code); i++) {
@ -755,7 +757,7 @@ int PDGetTotalTime(void) {
// IDA: int __usercall PDServiceSystem@<EAX>(tU32 pTime_since_last_call@<EAX>)
int PDServiceSystem(tU32 pTime_since_last_call) {
gHarness_platform.ProcessWindowMessages(NULL);
gHarness_platform.ProcessWindowMessages();
return 0;
}

View File

@ -84,6 +84,8 @@ void KeyboardHandler(void) {
static tU8 extended;
LOG_TRACE("()");
NOT_IMPLEMENTED();
// dos code reads scancodes from interrupt
}
// IDA: int __usercall KeyDown@<EAX>(tU8 pScan_code@<EAX>)

View File

@ -74,7 +74,7 @@ endif()
if(DETHRACE_PLATFORM_SDL2)
target_sources(harness PRIVATE
platforms/sdl2.c
platforms/sdl2_scancode_to_dinput.h
platforms/sdl_scancode_map.h
platforms/sdl2_syms.h
)
target_compile_definitions(harness PRIVATE DETHRACE_PLATFORM_SDL2)

View File

@ -0,0 +1,109 @@
#ifndef DETHRACE_SCANCODES_H
#define DETHRACE_SCANCODES_H
// These are copied from `KeyBegin`
// todo: remove duplication
#define SCANCODE_ESCAPE 0x01
#define SCANCODE_1 0x02
#define SCANCODE_2 0x03
#define SCANCODE_3 0x04
#define SCANCODE_4 0x05
#define SCANCODE_5 0x06
#define SCANCODE_6 0x07
#define SCANCODE_7 0x08
#define SCANCODE_8 0x09
#define SCANCODE_9 0x0A
#define SCANCODE_0 0x0B
#define SCANCODE_MINUS 0x0C /* - on main keyboard */
#define SCANCODE_EQUALS 0x0D
#define SCANCODE_BACK 0x0E /* backspace */
#define SCANCODE_TAB 0x0F
#define SCANCODE_Q 0x10
#define SCANCODE_W 0x11
#define SCANCODE_E 0x12
#define SCANCODE_R 0x13
#define SCANCODE_T 0x14
#define SCANCODE_Y 0x15
#define SCANCODE_U 0x16
#define SCANCODE_I 0x17
#define SCANCODE_O 0x18
#define SCANCODE_P 0x19
#define SCANCODE_LBRACKET 0x1A
#define SCANCODE_RBRACKET 0x1B
#define SCANCODE_RETURN 0x1C /* Enter on main keyboard */
#define SCANCODE_LCONTROL 0x1D
#define SCANCODE_A 0x1E
#define SCANCODE_S 0x1F
#define SCANCODE_D 0x20
#define SCANCODE_F 0x21
#define SCANCODE_G 0x22
#define SCANCODE_H 0x23
#define SCANCODE_J 0x24
#define SCANCODE_K 0x25
#define SCANCODE_L 0x26
#define SCANCODE_SEMICOLON 0x27
#define SCANCODE_APOSTROPHE 0x28
#define SCANCODE_GRAVE 0x29
#define SCANCODE_LSHIFT 0x2A
#define SCANCODE_BACKSLASH 0x2B
#define SCANCODE_Z 0x2C
#define SCANCODE_X 0x2D
#define SCANCODE_C 0x2E
#define SCANCODE_V 0x2F
#define SCANCODE_B 0x30
#define SCANCODE_N 0x31
#define SCANCODE_M 0x32
#define SCANCODE_COMMA 0x33
#define SCANCODE_PERIOD 0x34
#define SCANCODE_SLASH 0x35
#define SCANCODE_RSHIFT 0x36
#define SCANCODE_MULTIPLY 0x37 /* * on numeric keypad */
#define SCANCODE_LALT 0x38
#define SCANCODE_SPACE 0x39
#define SCANCODE_CAPITAL 0x3A
#define SCANCODE_F1 0x3B
#define SCANCODE_F2 0x3C
#define SCANCODE_F3 0x3D
#define SCANCODE_F4 0x3E
#define SCANCODE_F5 0x3F
#define SCANCODE_F6 0x40
#define SCANCODE_F7 0x41
#define SCANCODE_F8 0x42
#define SCANCODE_F9 0x43
#define SCANCODE_F10 0x44
#define SCANCODE_NUMLOCK 0x45
#define SCANCODE_SCROLL 0x46
#define SCANCODE_NUMPAD7 0x47
#define SCANCODE_NUMPAD8 0x48
#define SCANCODE_NUMPAD9 0x49
#define SCANCODE_SUBTRACT 0x4A /* - on numeric keypad */
#define SCANCODE_NUMPAD4 0x4B
#define SCANCODE_NUMPAD5 0x4C
#define SCANCODE_NUMPAD6 0x4D
#define SCANCODE_ADD 0x4E /* + on numeric keypad */
#define SCANCODE_NUMPAD1 0x4F
#define SCANCODE_NUMPAD2 0x50
#define SCANCODE_NUMPAD3 0x51
#define SCANCODE_NUMPAD0 0x52
#define SCANCODE_DECIMAL 0x53 /* . on numeric keypad */
#define SCANCODE_OEM_102 0x56 /* <> or \| on RT 102-key keyboard (Non-U.S.) */
#define SCANCODE_F11 0x57
#define SCANCODE_F12 0x58
#define SCANCODE_NUMPADENTER 0x9C /* Enter on numeric keypad */
#define SCANCODE_RCONTROL 0x9D
#define SCANCODE_DIVIDE 0xB5 /* / on numeric keypad */
#define SCANCODE_RALT 0xB8
#define SCANCODE_PAUSE 0xC5
#define SCANCODE_HOME 0xC7
#define SCANCODE_UP 0xC8
#define SCANCODE_PGUP 0xC9
#define SCANCODE_LEFT 0xCB
#define SCANCODE_RIGHT 0xCD
#define SCANCODE_END 0xCF
#define SCANCODE_DOWN 0xD0
#define SCANCODE_PGDN 0xD1
#define SCANCODE_INSERT 0xD2
#define SCANCODE_DELETE 0xD3
#endif

View File

@ -2,7 +2,6 @@
#define HARNESS_HOOKS_H
#include "brender.h"
#include "harness/win95_polyfill_defs.h"
#include <stdio.h>
typedef enum tHarness_window_type {
@ -15,7 +14,7 @@ typedef struct tHarness_platform {
// Render a fullscreen quad using the specified pixel data
void (*Renderer_Present)(br_pixelmap* src);
// Set the 256 color palette to use (BGRA format)
void (*Renderer_SetPalette)(PALETTEENTRY_* palette);
void (*Renderer_SetPalette)(br_colour* palette);
// Get mouse button state
int (*GetMouseButtons)(int* button_1, int* button_2);
// Get mouse position
@ -23,13 +22,16 @@ typedef struct tHarness_platform {
// Close specified window
void (*DestroyWindow)(void* window);
// Process window messages, return any WM_QUIT message
void (*ProcessWindowMessages)(MSG_* msg);
void (*ProcessWindowMessages)(void);
// Set position of a window
int (*SetWindowPos)(void* hWnd, int x, int y, int nWidth, int nHeight);
// Show/hide the cursor
int (*ShowCursor)(int show);
// Get keyboard state. Expected to be in DirectInput key codes
void (*GetKeyboardState)(unsigned int count, uint8_t* buffer);
// invoked when key is set up or down
void (*SetKeyHandler)(void (*handler_func)(void));
// Get keyboard state. Argument expected to point to 32 byte buffer - 1 bit per key
void (*GetKeyboardState)(uint32_t* buffer);
// Sleep
void (*Sleep)(uint32_t dwMilliseconds);
// Get ticks

View File

@ -1,88 +0,0 @@
#ifndef _POLYFILL_H_
#define _POLYFILL_H_
#include "harness/compiler.h"
#include "win95_polyfill_defs.h"
#include <assert.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
// All functions have a "_" suffix to avoid collisions with <windows.h>-defined types
uint32_t GetFileAttributesA_(char* path);
int SetFileAttributesA_(char* lpFileName, uint32_t dwFileAttributes);
void* CreateFileA_(
char* lpFileName,
uint32_t dwDesiredAccess,
uint32_t dwShareMode,
void* lpSecurityAttributes,
uint32_t dwCreationDisposition,
uint32_t dwFlagsAndAttributes,
void* hTemplateFile);
uint32_t GetFileSize_(
void* hFile,
uint32_t* lpFileSizeHigh);
int CloseHandle_(
void* hObject);
void GlobalMemoryStatus_(MEMORYSTATUS_* lpBuffer);
int GetCursorPos_(POINT_* lpPoint);
int ScreenToClient_(void* hWnd, POINT_* lpPoint);
uint32_t timeGetTime_(void);
uint32_t GetCurrentDirectoryA_(uint32_t nBufferLength, char* lpBuffer);
int SetCurrentDirectoryA_(char* lpPathName);
uint32_t GetShortPathNameA_(char* lpszLongPath, char* lpszShortPath, uint32_t cchBuffer);
HANDLE_ FindFirstFileA_(char* lpFileName, WIN32_FIND_DATAA_* lpFindFileData);
int FindNextFileA_(HANDLE_ hFindFile, WIN32_FIND_DATAA_* lpFindFileData);
int FindClose_(HANDLE_ hFindFile);
void* CreateWindowExA_(uint32_t dwExStyle, char* lpClassName, char* lpWindowName, uint32_t dwStyle, int X, int Y, int nWidth, int nHeight, void* hWndParent, void* hMenu, void* hInstance, void* lpParam);
int SetWindowPos_(void* hWnd, void* hWndInsertAfter, int X, int Y, int cx, int cy, unsigned int uFlags);
int ShowCursor_(int bShow);
int SendMessageA_(void* hWnd, unsigned int Msg, unsigned int wParam, long lParam);
int MessageBoxA_(void* hWnd, char* lpText, char* lpCaption, unsigned int uType);
int DestroyWindow_(void* hWnd);
HARNESS_NORETURN void ExitProcess_(unsigned int uExitCode);
void TranslateMessage_(MSG_* lpMsg);
void DispatchMessageA_(MSG_* lpMsg);
int PeekMessageA_(MSG_* lpMsg, void* hWnd, unsigned int wMsgFilterMin, unsigned int wMsgFilterMax, unsigned int wRemoveMsg);
int GetMessageA_(MSG_* lpMsg, void* hWnd, unsigned int wMsgFilterMin, unsigned int wMsgFilterMax);
void Sleep_(uint32_t dwMilliseconds);
void DirectDraw_CreateSurface(int width, int height);
void DirectDrawDevice_SetPaletteEntries(PALETTEENTRY_* palette, int pFirst_colour, int pCount);
void DirectInputDevice_GetDeviceState(unsigned int keys, uint8_t* buffer);
void _splitpath_(char* path, char* drive, char* dir, char* fname, char* ext);
int _CrtDbgReport_(int reportType, const char* filename, int linenumber, const char* moduleName, const char* format, ...);
#endif

View File

@ -1,74 +0,0 @@
#ifndef WIN95_POLYFILL_TYPES_H
#define WIN95_POLYFILL_TYPES_H
#include <stddef.h>
#include <stdint.h>
typedef void* HANDLE_;
#define GENERIC_READ 0x80000000
#define OPEN_EXISTING 3
#define FILE_ATTRIBUTE_NORMAL 0x80
#define INVALID_HANDLE_VALUE ((HANDLE_*)-1)
#define INVALID_FILE_ATTRIBUTES -1
#define FILE_ATTRIBUTE_READONLY 0x01
#define FILE_ATTRIBUTE_NORMAL 0x80
#define HWND_BROADCAST ((void*)0xffff)
#define _CRT_ASSERT 2
#define WM_QUIT 0x0012
#define MB_ICONERROR 0x00000010
typedef struct _MEMORYSTATUS_ {
uint32_t dwLength;
uint32_t dwMemoryLoad;
size_t dwTotalPhys;
size_t dwAvailPhys;
size_t dwTotalPageFile;
size_t dwAvailPageFile;
size_t dwTotalVirtual;
size_t dwAvailVirtual;
} MEMORYSTATUS_;
typedef struct tagPOINT_ {
long x;
long y;
} POINT_;
#pragma pack(push, 1)
typedef struct tagPALETTEENTRY_ {
uint8_t peRed;
uint8_t peGreen;
uint8_t peBlue;
uint8_t peFlags;
} PALETTEENTRY_;
#pragma pack(pop)
typedef struct _WIN32_FIND_DATA_ {
// uint32_t dwFileAttributes;
// FILETIME ftCreationTime;
// FILETIME ftLastAccessTime;
// FILETIME ftLastWriteTime;
// uint32_t nFileSizeHigh;
// uint32_t nFileSizeLow;
// uint32_t dwReserved0;
// uint32_t dwReserved1;
char cFileName[1024];
// char cAlternateFileName[14];
} WIN32_FIND_DATAA_;
typedef struct tagMSG_ {
void* hwnd;
unsigned int message;
int wParam;
long lParam;
uint32_t time;
POINT_ pt;
uint32_t lPrivate;
} MSG_;
#endif

View File

@ -1,52 +0,0 @@
/*
* Inspiration taken from https://github.com/TheAssemblyArmada/Vanilla-Conquer/blob/vanilla/common/sockets.h
*/
#ifndef HARNESS_WINSOCK_H
#define HARNESS_WINSOCK_H
#include <assert.h>
#ifdef _WIN32
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <winsock2.h>
#include <ws2tcpip.h>
#else /* Assume posix style sockets on non-windows */
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h> // for getaddrinfo() and freeaddrinfo()
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h> // for close()
#define WSAEISCONN EISCONN
#define WSAEINPROGRESS EINPROGRESS
#define WSAEALREADY EALREADY
#define WSAEADDRINUSE EADDRINUSE
#define WSAEADDRNOTAVAIL EADDRNOTAVAIL
#define WSAEBADF EBADF
#define WSAECONNREFUSED ECONNREFUSED
#define WSAEINTR EINTR
#define WSAENOTSOCK ENOTSOCK
#define WSAEWOULDBLOCK EWOULDBLOCK
#define WSAEINVAL EINVAL
#define WSAETIMEDOUT ETIMEDOUT
#define MAKEWORD(x, y) ((y) << 8 | (x))
typedef struct WSADATA {
} WSADATA;
int WSAStartup(int version, WSADATA* data);
int WSAGetLastError(void);
int WSACleanup(void);
int ioctlsocket(int handle, long cmd, unsigned long* argp);
int closesocket(int handle);
#endif /* _WIN32 */
#endif

View File

@ -16,11 +16,11 @@ static int null_show_error_message(char* title, char* text) {
return 0;
}
static void null_get_and_handle_message(MSG_* msg) {
static void null_get_and_handle_message(void) {
null_time += 1;
}
static void null_get_keyboard_state(unsigned int count, uint8_t* buffer) {
static void null_get_keyboard_state(uint32_t* buffer) {
null_time += 1;
}
@ -39,7 +39,7 @@ static int null_show_cursor(int show) {
return 0;
}
static void null_set_palette(PALETTEENTRY_* palette) {
static void null_set_palette(br_colour* palette) {
null_time += 1;
}

View File

@ -140,7 +140,7 @@ static int is_only_key_modifier(int modifier_flags, int flag_check) {
return (modifier_flags & flag_check) && (modifier_flags & (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_META)) == (modifier_flags & flag_check);
}
static void SDL1_Harness_ProcessWindowMessages(MSG_* msg) {
static void SDL1_Harness_ProcessWindowMessages() {
SDL_Event event;
int dinput_key;

View File

@ -4,9 +4,8 @@
#include "harness/config.h"
#include "harness/hooks.h"
#include "harness/trace.h"
#include "sdl2_scancode_to_dinput.h"
#include "sdl2_syms.h"
#include "sdl_scancode_to_set1.h"
#include "sdl_scancode_map.h"
SDL_COMPILE_TIME_ASSERT(sdl2_platform_requires_SDL2, SDL_MAJOR_VERSION == 2);
@ -22,7 +21,10 @@ static int render_width, render_height;
static Uint32 last_frame_time;
static uint8_t shadow_key_state[SDL_NUM_SCANCODES];
void (*gKeyHandler_func)(void);
// 32 bytes, 1 bit per key. Matches dos executable behavior
static uint32_t key_state[8];
static struct {
int x, y;
@ -31,7 +33,6 @@ static struct {
// Callbacks back into original game code
extern void QuitGame(void);
extern uint32_t gKeyboard_bits[8];
extern br_pixelmap* gBack_screen;
#ifdef DETHRACE_SDL_DYNAMIC
@ -118,9 +119,8 @@ static int is_only_key_modifier(int modifier_flags, int flag_check) {
return (modifier_flags & flag_check) && (modifier_flags & (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_GUI)) == (modifier_flags & flag_check);
}
static void SDL2_Harness_ProcessWindowMessages(MSG_* msg) {
static void SDL2_Harness_ProcessWindowMessages(void) {
SDL_Event event;
int set1_scancode;
while (SDL2_PollEvent(&event)) {
switch (event.type) {
@ -142,22 +142,19 @@ static void SDL2_Harness_ProcessWindowMessages(MSG_* msg) {
}
}
// Map incoming SDL scancode to PC set 1 scan code as used by game code
// set1_scancode = sdl_to_set1_scancode[event.key.keysym.scancode];
int x = event.key.keysym.scancode;
set1_scancode = sdlScanCodeToDirectInputKeyNum[event.key.keysym.scancode];
if (set1_scancode == 0) {
// Map incoming SDL scancode to PC scan code as used by game code
int dethrace_scancode = sdl_scancode_map[event.key.keysym.scancode];
if (dethrace_scancode == 0) {
LOG_WARN("unexpected scan code %s (%d)", SDL2_GetScancodeName(event.key.keysym.scancode), event.key.keysym.scancode);
return;
}
if (event.type == SDL_KEYDOWN) {
gKeyboard_bits[set1_scancode >> 5] |= (1 << (set1_scancode & 0x1F));
shadow_key_state[set1_scancode] = 0xff;
key_state[dethrace_scancode >> 5] |= (1 << (dethrace_scancode & 0x1F));
} else {
gKeyboard_bits[set1_scancode >> 5] &= ~(1 << (set1_scancode & 0x1F));
shadow_key_state[set1_scancode] = 0;
key_state[dethrace_scancode >> 5] &= ~(1 << (dethrace_scancode & 0x1F));
}
gKeyHandler_func();
break;
case SDL_WINDOWEVENT:
@ -172,8 +169,12 @@ static void SDL2_Harness_ProcessWindowMessages(MSG_* msg) {
}
}
static void SDL2_Harness_GetKeyboardState(unsigned int count, uint8_t* buffer) {
memcpy(buffer, shadow_key_state, count);
static void SDL2_Harness_SetKeyHandler(void (*handler_func)(void)) {
gKeyHandler_func = handler_func;
}
static void SDL2_Harness_GetKeyboardState(uint32_t* buffer) {
memcpy(buffer, key_state, sizeof(key_state));
}
static int SDL2_Harness_GetMouseButtons(int* pButton1, int* pButton2) {
@ -323,7 +324,7 @@ static void SDL2_Harness_CreateWindow(const char* title, int width, int height,
static void SDL2_Harness_Swap(br_pixelmap* back_buffer) {
SDL2_Harness_ProcessWindowMessages(NULL);
SDL2_Harness_ProcessWindowMessages();
if (gl_context != NULL) {
SDL2_GL_SwapWindow(window);
@ -376,6 +377,7 @@ static int SDL2_Harness_Platform_Init(tHarness_platform* platform) {
platform->ShowCursor = SDL2_ShowCursor;
platform->SetWindowPos = SDL2_Harness_SetWindowPos;
platform->DestroyWindow = SDL2_Harness_DestroyWindow;
platform->SetKeyHandler = SDL2_Harness_SetKeyHandler;
platform->GetKeyboardState = SDL2_Harness_GetKeyboardState;
platform->GetMousePosition = SDL2_Harness_GetMousePosition;
platform->GetMouseButtons = SDL2_Harness_GetMouseButtons;

View File

@ -1,388 +0,0 @@
/*
* Maps SDL2 scancodes to directinput keynums/scancodes.
* Useful if you're porting a game that uses dinput scancodes internally
* (for key bindings etc) or any other lib (like CEGUI) that uses them.
*
* (C) 2015 Daniel Gibson
*
* Homepage: https://github.com/DanielGibson/Snippets/
*
* License:
* This software is dual-licensed to the public domain and under the following
* license: you are granted a perpetual, irrevocable license to copy, modify,
* publish, and distribute this file as you see fit.
* No warranty implied; use at your own risk.
*
* So you can do whatever you want with this code, including copying it
* (or parts of it) into your own source.
* No need to mention me or this "license" in your code or docs, even though
* it would be appreciated, of course.
*
*/
#include <SDL.h>
#if 0
// Usage Example:
// #include "sdl2_scancode_to_dinput.h"
static int SDLScanCodeToKeyNum(SDL_Scancode sc) {
int idx = (int)sc;
assert(idx >= 0 && idx < SDL_NUM_SCANCODES);
return scanCodeToKeyNum[idx];
}
static SDL_Scancode KeyNumToSDLScanCode(int keyNum) {
if (keyNum >= 0 && keyNum < 0xEF) {
for (int i = 0; i < SDL_NUM_SCANCODES; ++i) {
if (scanCodeToKeyNum[i] == keyNum)
return (SDL_Scancode)i;
}
}
return SDL_SCANCODE_UNKNOWN;
}
#endif // 0
#ifndef _SDL2_SCANCODE_TO_DINPUT_H_
#define _SDL2_SCANCODE_TO_DINPUT_H_
// TODO: map the following keys, if possible:
// #define DIK_UNDERLINE 0x93 /* (NEC PC98) */
// #define DIK_KANJI 0x94 /* (Japanese keyboard) */
// #define DIK_AX 0x96 /* (Japan AX) */
// #define DIK_UNLABELED 0x97 /* (J3100) */
//
// #define DIK_WAKE 0xE3 /* System Wake */
//
// (#define DIK_ABNT_C2 0x7E /* Numpad . on Brazilian keyboard */ - system should map this to KP_COMMA or something,
// according to USB doc, so probably it doesn't need mapping here)
// maps SDL2 scancodes to directinput keynums/scancodes - dinput_key = sdlScanCodeToDirectInputKeyNum[(int)your_sdl2_scancode];
static int sdlScanCodeToDirectInputKeyNum[SDL_NUM_SCANCODES] = {
0x0, // SDL_SCANCODE_UNKNOWN = 0, => 0 should also work for dinput codes as "not assigned/unknown"
0x0, // // 1 (unused)
0x0, // // 2 (unused)
0x0, // // 3 (unused)
0x1E, // SDL_SCANCODE_A = 4, - DIK_A
0x30, // SDL_SCANCODE_B = 5, - DIK_B
0x2E, // SDL_SCANCODE_C = 6, - DIK_C
0x20, // SDL_SCANCODE_D = 7, - DIK_D
0x12, // SDL_SCANCODE_E = 8, - DIK_E
0x21, // SDL_SCANCODE_F = 9, - DIK_F
0x22, // SDL_SCANCODE_G = 10, - DIK_G
0x23, // SDL_SCANCODE_H = 11, - DIK_H
0x17, // SDL_SCANCODE_I = 12, - DIK_I
0x24, // SDL_SCANCODE_J = 13, - DIK_J
0x25, // SDL_SCANCODE_K = 14, - DIK_K
0x26, // SDL_SCANCODE_L = 15, - DIK_L
0x32, // SDL_SCANCODE_M = 16, - DIK_M
0x31, // SDL_SCANCODE_N = 17, - DIK_N
0x18, // SDL_SCANCODE_O = 18, - DIK_O
0x19, // SDL_SCANCODE_P = 19, - DIK_P
0x10, // SDL_SCANCODE_Q = 20, - DIK_Q
0x13, // SDL_SCANCODE_R = 21, - DIK_R
0x1F, // SDL_SCANCODE_S = 22, - DIK_S
0x14, // SDL_SCANCODE_T = 23, - DIK_T
0x16, // SDL_SCANCODE_U = 24, - DIK_U
0x2F, // SDL_SCANCODE_V = 25, - DIK_V
0x11, // SDL_SCANCODE_W = 26, - DIK_W
0x2D, // SDL_SCANCODE_X = 27, - DIK_X
0x15, // SDL_SCANCODE_Y = 28, - DIK_Y
0x2C, // SDL_SCANCODE_Z = 29, - DIK_Z
0x02, // SDL_SCANCODE_1 = 30, - DIK_1
0x03, // SDL_SCANCODE_2 = 31, - DIK_2
0x04, // SDL_SCANCODE_3 = 32, - DIK_3
0x05, // SDL_SCANCODE_4 = 33, - DIK_4
0x06, // SDL_SCANCODE_5 = 34, - DIK_5
0x07, // SDL_SCANCODE_6 = 35, - DIK_6
0x08, // SDL_SCANCODE_7 = 36, - DIK_7
0x09, // SDL_SCANCODE_8 = 37, - DIK_8
0x0A, // SDL_SCANCODE_9 = 38, - DIK_9
0x0B, // SDL_SCANCODE_0 = 39, - DIK_0
0x1C, // SDL_SCANCODE_RETURN = 40, - DIK_RETURN
0x01, // SDL_SCANCODE_ESCAPE = 41, - DIK_ESCAPE
0x0E, // SDL_SCANCODE_BACKSPACE = 42, - DIK_BACK
0x0F, // SDL_SCANCODE_TAB = 43, - DIK_TAB
0x39, // SDL_SCANCODE_SPACE = 44, - DIK_SPACE
0x0C, // SDL_SCANCODE_MINUS = 45, - DIK_MINUS
0x0D, // SDL_SCANCODE_EQUALS = 46, - DIK_EQUALS
0x1A, // SDL_SCANCODE_LEFTBRACKET = 47, - DIK_LBRACKET
0x1B, // SDL_SCANCODE_RIGHTBRACKET = 48, - DIK_RBRACKET
0x2B, // SDL_SCANCODE_BACKSLASH = 49, // next to enter, US: [\|] DE: [#'] UK: [#~] - DIK_BACKSLASH
0x2B, // SDL_SCANCODE_NONUSHASH = 50, // same key as before actually on some layouts, systems should map this to SDL_SCANCODE_BACKSLASH - DIK_BACKSLASH
0x27, // SDL_SCANCODE_SEMICOLON = 51, - DIK_SEMICOLON
0x28, // SDL_SCANCODE_APOSTROPHE = 52, - DIK_APOSTROPHE
0x29, // SDL_SCANCODE_GRAVE = 53, // "quake/doom3 console key" - DIK_GRAVE
0x33, // SDL_SCANCODE_COMMA = 54, - DIK_COMMA
0x34, // SDL_SCANCODE_PERIOD = 55, - DIK_PERIOD
0x35, // SDL_SCANCODE_SLASH = 56, - DIK_SLASH
0x3A, // SDL_SCANCODE_CAPSLOCK = 57, - DIK_CAPITAL
0x3B, // SDL_SCANCODE_F1 = 58, - DIK_F1
0x3C, // SDL_SCANCODE_F2 = 59, - DIK_F2
0x3D, // SDL_SCANCODE_F3 = 60, - DIK_F3
0x3E, // SDL_SCANCODE_F4 = 61, - DIK_F4
0x3F, // SDL_SCANCODE_F5 = 62, - DIK_F5
0x40, // SDL_SCANCODE_F6 = 63, - DIK_F6
0x41, // SDL_SCANCODE_F7 = 64, - DIK_F7
0x42, // SDL_SCANCODE_F8 = 65, - DIK_F8
0x43, // SDL_SCANCODE_F9 = 66, - DIK_F9
0x44, // SDL_SCANCODE_F10 = 67, - DIK_F10
0x57, // SDL_SCANCODE_F11 = 68, - DIK_F11
0x58, // SDL_SCANCODE_F12 = 69, - DIK_F12
0xB7, // SDL_SCANCODE_PRINTSCREEN = 70, // - DIK_SYSRQ; SDL_SCANCODE_SYSREQ also maps to this!
0x46, // SDL_SCANCODE_SCROLLLOCK = 71, - DIK_SCROLL
0xC5, // SDL_SCANCODE_PAUSE = 72, - DIK_PAUSE
0xD2, // SDL_SCANCODE_INSERT = 73, // insert on PC, help on some Mac keyboards (but does send code 73, not 117) - DIK_INSERT
0xC7, // SDL_SCANCODE_HOME = 74, - DIK_HOME
0xC9, // SDL_SCANCODE_PAGEUP = 75, - DIK_PRIOR
0xD3, // SDL_SCANCODE_DELETE = 76, - DIK_DELETE
0xCF, // SDL_SCANCODE_END = 77, - DIK_END
0xD1, // SDL_SCANCODE_PAGEDOWN = 78, - DIK_NEXT
0xCD, // SDL_SCANCODE_RIGHT = 79, - DIK_RIGHT
0xCB, // SDL_SCANCODE_LEFT = 80, - DIK_LEFT
0xD0, // SDL_SCANCODE_DOWN = 81, - DIK_DOWN
0xC8, // SDL_SCANCODE_UP = 82, - DIK_UP
0x45, // SDL_SCANCODE_NUMLOCKCLEAR = 83, // num lock on PC, clear on Mac keyboards - DIK_NUMLOCK
0xB5, // SDL_SCANCODE_KP_DIVIDE = 84, - DIK_DIVIDE
0x37, // SDL_SCANCODE_KP_MULTIPLY = 85, - DIK_MULTIPLY
0x4A, // SDL_SCANCODE_KP_MINUS = 86, - DIK_SUBTRACT
0x4E, // SDL_SCANCODE_KP_PLUS = 87, - DIK_ADD
0x9C, // SDL_SCANCODE_KP_ENTER = 88, - DIK_NUMPADENTER
0x4F, // SDL_SCANCODE_KP_1 = 89, - DIK_NUMPAD1
0x50, // SDL_SCANCODE_KP_2 = 90, - DIK_NUMPAD2
0x51, // SDL_SCANCODE_KP_3 = 91, - DIK_NUMPAD3
0x4B, // SDL_SCANCODE_KP_4 = 92, - DIK_NUMPAD4
0x4C, // SDL_SCANCODE_KP_5 = 93, - DIK_NUMPAD5
0x4D, // SDL_SCANCODE_KP_6 = 94, - DIK_NUMPAD6
0x47, // SDL_SCANCODE_KP_7 = 95, - DIK_NUMPAD7
0x48, // SDL_SCANCODE_KP_8 = 96, - DIK_NUMPAD8
0x49, // SDL_SCANCODE_KP_9 = 97, - DIK_NUMPAD9
0x52, // SDL_SCANCODE_KP_0 = 98, - DIK_NUMPAD0
0x53, // SDL_SCANCODE_KP_PERIOD = 99, - DIK_DECIMAL
0x56, // SDL_SCANCODE_NONUSBACKSLASH = 100, // [<>|] on german keyboard, next to left shift - DIK_OEM_102
0xDD, // SDL_SCANCODE_APPLICATION = 101, // windows contextual menu, compose - DIK_APPS
0xDE, // SDL_SCANCODE_POWER = 102, // should be a status flag, but some mac keyboards have a power key - DIK_POWER
0x8D, // SDL_SCANCODE_KP_EQUALS = 103, - DIK_NUMPADEQUALS
0x64, // SDL_SCANCODE_F13 = 104, - DIK_F13
0x65, // SDL_SCANCODE_F14 = 105, - DIK_F14
0x66, // SDL_SCANCODE_F15 = 106, - DIK_F15
0x67, // SDL_SCANCODE_F16 = 107, // TODO: F16 and up don't have DIK_ constants! is this right?
0x68, // SDL_SCANCODE_F17 = 108, // (at least 0x67-0x6F have no DIK_constants at all)
0x69, // SDL_SCANCODE_F18 = 109,
0x6A, // SDL_SCANCODE_F19 = 110,
0x6B, // SDL_SCANCODE_F20 = 111,
0x6C, // SDL_SCANCODE_F21 = 112,
0x6D, // SDL_SCANCODE_F22 = 113,
0x6E, // SDL_SCANCODE_F23 = 114,
0x6F, // SDL_SCANCODE_F24 = 115,
0x0, // SDL_SCANCODE_EXECUTE = 116,
0x0, // SDL_SCANCODE_HELP = 117,
0x0, // SDL_SCANCODE_MENU = 118,
0x0, // SDL_SCANCODE_SELECT = 119,
0x95, // SDL_SCANCODE_STOP = 120, - DIK_STOP
0x0, // SDL_SCANCODE_AGAIN = 121, // redo
0x0, // SDL_SCANCODE_UNDO = 122,
0x0, // SDL_SCANCODE_CUT = 123,
0x0, // SDL_SCANCODE_COPY = 124,
0x0, // SDL_SCANCODE_PASTE = 125,
0x0, // SDL_SCANCODE_FIND = 126,
0x0, // SDL_SCANCODE_MUTE = 127,
0xB0, // SDL_SCANCODE_VOLUMEUP = 128, - DIK_VOLUMEUP
0xAE, // SDL_SCANCODE_VOLUMEDOWN = 129, - DIK_VOLUMEDOWN
// /* not sure whether there's a reason to enable these */
0x0, // /* SDL_SCANCODE_LOCKINGCAPSLOCK = 130, */
0x0, // /* SDL_SCANCODE_LOCKINGNUMLOCK = 131, */
0x0, // /* SDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */
0xB3, // SDL_SCANCODE_KP_COMMA = 133, - DIK_NUMPADCOMMA
0x0, // SDL_SCANCODE_KP_EQUALSAS400 = 134,
0x73, // SDL_SCANCODE_INTERNATIONAL1 = 135, // this is really brazilian / and ? - DIK_ABNT_C1
0x0, // SDL_SCANCODE_INTERNATIONAL2 = 136, // TODO: Hut1_12v2.pdf page 60, footnote 16
0x7D, // SDL_SCANCODE_INTERNATIONAL3 = 137, - DIK_YEN
0x79, // SDL_SCANCODE_INTERNATIONAL4 = 138, // Japan: XFER/"convert kana -> kanji", right of space - DIK_CONVERT
0x7B, // SDL_SCANCODE_INTERNATIONAL5 = 139, // Japan: NFER/"don't convert kana -> kanji", left of space - DIK_NOCONVERT
0x0, // SDL_SCANCODE_INTERNATIONAL6 = 140, // TODO: Hut1_12v2.pdf page 60, footnote 20
0x0, // SDL_SCANCODE_INTERNATIONAL7 = 141, // Toggle Double-Byte/Single-Byte mode.
0x0, // SDL_SCANCODE_INTERNATIONAL8 = 142, // Undefined, available for other Front End Language Processors
0x0, // SDL_SCANCODE_INTERNATIONAL9 = 143, // Undefined, available for other Front End Language Processors
0x0, // SDL_SCANCODE_LANG1 = 144, // Hangul/English toggle (Korea)
0x0, // SDL_SCANCODE_LANG2 = 145, // Hanja conversion (Korea)
0x70, // SDL_SCANCODE_LANG3 = 146, // Katakana (Japan) - DIK_KANA
0x0, // SDL_SCANCODE_LANG4 = 147, // Hiragana (Japan)
0x0, // SDL_SCANCODE_LANG5 = 148, // Zenkaku/Hankaku (Japan)
0x0, // SDL_SCANCODE_LANG6 = 149, // reserved
0x0, // SDL_SCANCODE_LANG7 = 150, // reserved
0x0, // SDL_SCANCODE_LANG8 = 151, // reserved
0x0, // SDL_SCANCODE_LANG9 = 152, // reserved
0x0, // SDL_SCANCODE_ALTERASE = 153, // Erase-Eaze
0xB7, // SDL_SCANCODE_SYSREQ = 154, - DIK_SYSRQ; SDL_SCANCODE_PRINTSCREEN also maps to this!
0x0, // SDL_SCANCODE_CANCEL = 155,
0x0, // SDL_SCANCODE_CLEAR = 156,
0x0, // SDL_SCANCODE_PRIOR = 157,
0x0, // SDL_SCANCODE_RETURN2 = 158,
0x0, // SDL_SCANCODE_SEPARATOR = 159,
0x0, // SDL_SCANCODE_OUT = 160,
0x0, // SDL_SCANCODE_OPER = 161,
0x0, // SDL_SCANCODE_CLEARAGAIN = 162,
0x0, // SDL_SCANCODE_CRSEL = 163,
0x0, // SDL_SCANCODE_EXSEL = 164,
0x0, // 165 (unused)
0x0, // 166 (unused)
0x0, // 167 (unused)
0x0, // 168 (unused)
0x0, // 169 (unused)
0x0, // 170 (unused)
0x0, // 171 (unused)
0x0, // 172 (unused)
0x0, // 173 (unused)
0x0, // 174 (unused)
0x0, // 175 (unused)
0x0, // SDL_SCANCODE_KP_00 = 176,
0x0, // SDL_SCANCODE_KP_000 = 177,
0x0, // SDL_SCANCODE_THOUSANDSSEPARATOR = 178,
0x0, // SDL_SCANCODE_DECIMALSEPARATOR = 179,
0x0, // SDL_SCANCODE_CURRENCYUNIT = 180,
0x0, // SDL_SCANCODE_CURRENCYSUBUNIT = 181,
0x0, // SDL_SCANCODE_KP_LEFTPAREN = 182,
0x0, // SDL_SCANCODE_KP_RIGHTPAREN = 183,
0x0, // SDL_SCANCODE_KP_LEFTBRACE = 184,
0x0, // SDL_SCANCODE_KP_RIGHTBRACE = 185,
0x0, // SDL_SCANCODE_KP_TAB = 186,
0x0, // SDL_SCANCODE_KP_BACKSPACE = 187,
0x0, // SDL_SCANCODE_KP_A = 188,
0x0, // SDL_SCANCODE_KP_B = 189,
0x0, // SDL_SCANCODE_KP_C = 190,
0x0, // SDL_SCANCODE_KP_D = 191,
0x0, // SDL_SCANCODE_KP_E = 192,
0x0, // SDL_SCANCODE_KP_F = 193,
0x0, // SDL_SCANCODE_KP_XOR = 194,
0x0, // SDL_SCANCODE_KP_POWER = 195,
0x0, // SDL_SCANCODE_KP_PERCENT = 196,
0x0, // SDL_SCANCODE_KP_LESS = 197,
0x0, // SDL_SCANCODE_KP_GREATER = 198,
0x0, // SDL_SCANCODE_KP_AMPERSAND = 199,
0x0, // SDL_SCANCODE_KP_DBLAMPERSAND = 200,
0x0, // SDL_SCANCODE_KP_VERTICALBAR = 201,
0x0, // SDL_SCANCODE_KP_DBLVERTICALBAR = 202,
0x92, // SDL_SCANCODE_KP_COLON = 203, - DIK_COLON
0x0, // SDL_SCANCODE_KP_HASH = 204,
0x0, // SDL_SCANCODE_KP_SPACE = 205,
0x91, // SDL_SCANCODE_KP_AT = 206, - DIK_AT
0x0, // SDL_SCANCODE_KP_EXCLAM = 207,
0x0, // SDL_SCANCODE_KP_MEMSTORE = 208,
0x0, // SDL_SCANCODE_KP_MEMRECALL = 209,
0x0, // SDL_SCANCODE_KP_MEMCLEAR = 210,
0x0, // SDL_SCANCODE_KP_MEMADD = 211,
0x0, // SDL_SCANCODE_KP_MEMSUBTRACT = 212,
0x0, // SDL_SCANCODE_KP_MEMMULTIPLY = 213,
0x0, // SDL_SCANCODE_KP_MEMDIVIDE = 214,
0x0, // SDL_SCANCODE_KP_PLUSMINUS = 215,
0x0, // SDL_SCANCODE_KP_CLEAR = 216,
0x0, // SDL_SCANCODE_KP_CLEARENTRY = 217,
0x0, // SDL_SCANCODE_KP_BINARY = 218,
0x0, // SDL_SCANCODE_KP_OCTAL = 219,
0x0, // SDL_SCANCODE_KP_DECIMAL = 220,
0x0, // SDL_SCANCODE_KP_HEXADECIMAL = 221,
0x0, // 222 (unused)
0x0, // 223 (unused)
0x1D, // SDL_SCANCODE_LCTRL = 224, - DIK_LCONTROL
0x2A, // SDL_SCANCODE_LSHIFT = 225, - DIK_LSHIFT
0x38, // SDL_SCANCODE_LALT = 226, // left Alt, option - DIK_LMENU
0xDB, // SDL_SCANCODE_LGUI = 227, // left windows, command (apple), meta - DIK_LWIN
0x9D, // SDL_SCANCODE_RCTRL = 228, - DIK_RCONTROL
0x36, // SDL_SCANCODE_RSHIFT = 229, - DIK_RSHIFT
0xB8, // SDL_SCANCODE_RALT = 230, // right Alt/AltGr, option - DIK_RMENU, also used for SDL_SCANCODE_MODE!
0xDC, // SDL_SCANCODE_RGUI = 231, // left windows, command (apple), meta - DIK_RWIN
// 232 - 256 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, // 232 - 240 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 241-250 unused
0, 0, 0, 0, 0, 0, // 251-256 unused
0xB8, // SDL_SCANCODE_MODE = 257, // this seems to be the AltGr Key? - DIK_RMENU (right alt)
// These values are mapped from usage page 0x0C (USB consumer page).
0x99, // SDL_SCANCODE_AUDIONEXT = 258, - DIK_NEXTTRACK
0x90, // SDL_SCANCODE_AUDIOPREV = 259, - DIK_PREVTRACK, which is DIK_CIRCUMFLEX on japanese keyboards
0xA4, // SDL_SCANCODE_AUDIOSTOP = 260, - DIK_MEDIASTOP
0xA2, // SDL_SCANCODE_AUDIOPLAY = 261, - DIK_PLAYPAUSE
0xA0, // SDL_SCANCODE_AUDIOMUTE = 262, - DIK_MUTE
0xED, // SDL_SCANCODE_MEDIASELECT = 263, - DIK_MEDIASELECT
0x0, // SDL_SCANCODE_WWW = 264,
0xEC, // SDL_SCANCODE_MAIL = 265, - DIK_MAIL
0xA1, // SDL_SCANCODE_CALCULATOR = 266, - DIK_CALCULATOR
0xEB, // SDL_SCANCODE_COMPUTER = 267, - DIK_MYCOMPUTER
0xE5, // SDL_SCANCODE_AC_SEARCH = 268, - DIK_WEBSEARCH
0xB2, // SDL_SCANCODE_AC_HOME = 269, - DIK_WEBHOME
0xEA, // SDL_SCANCODE_AC_BACK = 270, - DIK_WEBBACK
0xE9, // SDL_SCANCODE_AC_FORWARD = 271, - DIK_WEBFORWARD
0xE8, // SDL_SCANCODE_AC_STOP = 272, - DIK_WEBSTOP
0xE7, // SDL_SCANCODE_AC_REFRESH = 273, - DIK_WEBREFRESH
0xE6, // SDL_SCANCODE_AC_BOOKMARKS = 274, - DIK_WEBFAVORITES
// These are values that Christian Walther added (for mac keyboard?).
0x0, // SDL_SCANCODE_BRIGHTNESSDOWN = 275,
0x0, // SDL_SCANCODE_BRIGHTNESSUP = 276,
0x0, // SDL_SCANCODE_DISPLAYSWITCH = 277, // display mirroring/dual display switch, video mode switch
0x0, // SDL_SCANCODE_KBDILLUMTOGGLE = 278,
0x0, // SDL_SCANCODE_KBDILLUMDOWN = 279,
0x0, // SDL_SCANCODE_KBDILLUMUP = 280,
0x0, // SDL_SCANCODE_EJECT = 281,
0xDF, // SDL_SCANCODE_SLEEP = 282, - DIK_SLEEP
0x0, // SDL_SCANCODE_APP1 = 283,
0x0, // SDL_SCANCODE_APP2 = 284,
// end of Walther-keys
// the rest up to 511 are currently not named in SDL
0, 0, 0, 0, 0, 0, // 285-290 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 291-300 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 301-320 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 321-340 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 341-360 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 361-380 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 381-400 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 401-420 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 421-440 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 441-460 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 461-480 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 481-500 unused
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 501-511 unused
};
#endif /* _SDL2_SCANCODE_TO_DINPUT_H_ */

View File

@ -0,0 +1,111 @@
#ifndef SDL_SCANCODE_MAP_H
#define SDL_SCANCODE_MAP_H
#include "dethrace_scancodes.h"
#include <SDL.h>
int sdl_scancode_map[SDL_NUM_SCANCODES] = {
[SDL_SCANCODE_ESCAPE] = SCANCODE_ESCAPE,
[SDL_SCANCODE_1] = SCANCODE_1,
[SDL_SCANCODE_2] = SCANCODE_2,
[SDL_SCANCODE_3] = SCANCODE_3,
[SDL_SCANCODE_4] = SCANCODE_4,
[SDL_SCANCODE_5] = SCANCODE_5,
[SDL_SCANCODE_6] = SCANCODE_6,
[SDL_SCANCODE_7] = SCANCODE_7,
[SDL_SCANCODE_8] = SCANCODE_8,
[SDL_SCANCODE_9] = SCANCODE_9,
[SDL_SCANCODE_0] = SCANCODE_0,
[SDL_SCANCODE_MINUS] = SCANCODE_MINUS,
[SDL_SCANCODE_EQUALS] = SCANCODE_EQUALS,
[SDL_SCANCODE_BACKSPACE] = SCANCODE_BACK,
[SDL_SCANCODE_TAB] = SCANCODE_TAB,
[SDL_SCANCODE_Q] = SCANCODE_Q,
[SDL_SCANCODE_W] = SCANCODE_W,
[SDL_SCANCODE_E] = SCANCODE_E,
[SDL_SCANCODE_R] = SCANCODE_R,
[SDL_SCANCODE_T] = SCANCODE_T,
[SDL_SCANCODE_Y] = SCANCODE_Y,
[SDL_SCANCODE_U] = SCANCODE_U,
[SDL_SCANCODE_I] = SCANCODE_I,
[SDL_SCANCODE_O] = SCANCODE_O,
[SDL_SCANCODE_P] = SCANCODE_P,
[SDL_SCANCODE_LEFTBRACKET] = SCANCODE_LBRACKET,
[SDL_SCANCODE_RIGHTBRACKET] = SCANCODE_RBRACKET,
[SDL_SCANCODE_RETURN] = SCANCODE_RETURN,
[SDL_SCANCODE_LCTRL] = SCANCODE_LCONTROL,
[SDL_SCANCODE_A] = SCANCODE_A,
[SDL_SCANCODE_S] = SCANCODE_S,
[SDL_SCANCODE_D] = SCANCODE_D,
[SDL_SCANCODE_F] = SCANCODE_F,
[SDL_SCANCODE_G] = SCANCODE_G,
[SDL_SCANCODE_H] = SCANCODE_H,
[SDL_SCANCODE_J] = SCANCODE_J,
[SDL_SCANCODE_K] = SCANCODE_K,
[SDL_SCANCODE_L] = SCANCODE_L,
[SDL_SCANCODE_SEMICOLON] = SCANCODE_SEMICOLON,
[SDL_SCANCODE_APOSTROPHE] = SCANCODE_APOSTROPHE,
[SDL_SCANCODE_GRAVE] = SCANCODE_GRAVE,
[SDL_SCANCODE_LSHIFT] = SCANCODE_LSHIFT,
[SDL_SCANCODE_BACKSLASH] = SCANCODE_BACKSLASH,
[SDL_SCANCODE_Z] = SCANCODE_Z,
[SDL_SCANCODE_X] = SCANCODE_X,
[SDL_SCANCODE_C] = SCANCODE_C,
[SDL_SCANCODE_V] = SCANCODE_V,
[SDL_SCANCODE_B] = SCANCODE_B,
[SDL_SCANCODE_N] = SCANCODE_N,
[SDL_SCANCODE_M] = SCANCODE_M,
[SDL_SCANCODE_COMMA] = SCANCODE_COMMA,
[SDL_SCANCODE_PERIOD] = SCANCODE_PERIOD,
[SDL_SCANCODE_SLASH] = SCANCODE_SLASH,
[SDL_SCANCODE_RSHIFT] = SCANCODE_RSHIFT,
[SDL_SCANCODE_KP_MULTIPLY] = SCANCODE_MULTIPLY,
[SDL_SCANCODE_LALT] = SCANCODE_LALT,
[SDL_SCANCODE_SPACE] = SCANCODE_SPACE,
[SDL_SCANCODE_CAPSLOCK] = SCANCODE_CAPITAL,
[SDL_SCANCODE_F1] = SCANCODE_F1,
[SDL_SCANCODE_F2] = SCANCODE_F2,
[SDL_SCANCODE_F3] = SCANCODE_F3,
[SDL_SCANCODE_F4] = SCANCODE_F4,
[SDL_SCANCODE_F5] = SCANCODE_F5,
[SDL_SCANCODE_F6] = SCANCODE_F6,
[SDL_SCANCODE_F7] = SCANCODE_F7,
[SDL_SCANCODE_F8] = SCANCODE_F8,
[SDL_SCANCODE_F9] = SCANCODE_F9,
[SDL_SCANCODE_F10] = SCANCODE_F10,
[SDL_SCANCODE_NUMLOCKCLEAR] = SCANCODE_NUMLOCK,
[SDL_SCANCODE_SCROLLLOCK] = SCANCODE_SCROLL,
[SDL_SCANCODE_KP_7] = SCANCODE_NUMPAD7,
[SDL_SCANCODE_KP_8] = SCANCODE_NUMPAD8,
[SDL_SCANCODE_KP_9] = SCANCODE_NUMPAD9,
[SDL_SCANCODE_KP_MINUS] = SCANCODE_SUBTRACT,
[SDL_SCANCODE_KP_4] = SCANCODE_NUMPAD4,
[SDL_SCANCODE_KP_5] = SCANCODE_NUMPAD5,
[SDL_SCANCODE_KP_6] = SCANCODE_NUMPAD6,
[SDL_SCANCODE_KP_PLUS] = SCANCODE_ADD,
[SDL_SCANCODE_KP_1] = SCANCODE_NUMPAD1,
[SDL_SCANCODE_KP_2] = SCANCODE_NUMPAD2,
[SDL_SCANCODE_KP_3] = SCANCODE_NUMPAD3,
[SDL_SCANCODE_KP_0] = SCANCODE_NUMPAD0,
[SDL_SCANCODE_KP_PERIOD] = SCANCODE_DECIMAL,
[SDL_SCANCODE_NONUSBACKSLASH] = SCANCODE_OEM_102,
[SDL_SCANCODE_F11] = SCANCODE_F11,
[SDL_SCANCODE_F12] = SCANCODE_F12,
[SDL_SCANCODE_KP_ENTER] = SCANCODE_NUMPADENTER,
[SDL_SCANCODE_RCTRL] = SCANCODE_RCONTROL,
[SDL_SCANCODE_KP_DIVIDE] = SCANCODE_DIVIDE,
[SDL_SCANCODE_RALT] = SCANCODE_RALT,
[SDL_SCANCODE_PAUSE] = SCANCODE_PAUSE,
[SDL_SCANCODE_HOME] = SCANCODE_HOME,
[SDL_SCANCODE_UP] = SCANCODE_UP,
[SDL_SCANCODE_PAGEUP] = SCANCODE_PGUP,
[SDL_SCANCODE_LEFT] = SCANCODE_LEFT,
[SDL_SCANCODE_RIGHT] = SCANCODE_RIGHT,
[SDL_SCANCODE_END] = SCANCODE_END,
[SDL_SCANCODE_DOWN] = SCANCODE_DOWN,
[SDL_SCANCODE_PAGEDOWN] = SCANCODE_PGDN,
[SDL_SCANCODE_INSERT] = SCANCODE_INSERT,
[SDL_SCANCODE_DELETE] = SCANCODE_DELETE,
};
#endif /* _SDL2_SCANCODE_TO_DINPUT_H_ */

View File

@ -1,254 +0,0 @@
#if 0
#include "harness/hooks.h"
#include "harness/os.h"
#include "harness/win95_polyfill.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#if defined(_WIN32) || defined(_WIN64)
#include <direct.h>
#include <windows.h>
// https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/getcwd-wgetcwd?view=msvc-170
#define getcwd _getcwd
#define chdir _chdir
#else
#include <dirent.h>
#include <libgen.h>
#include <unistd.h>
#endif
// All functions have a "_" suffix to avoid collisions with <windows.h>-defined types
uint32_t GetFileAttributesA_(char* lpFileName) {
FILE* f = fopen(lpFileName, "r");
if (f == NULL) {
return INVALID_FILE_ATTRIBUTES;
}
fclose(f);
return FILE_ATTRIBUTE_NORMAL;
}
int SetFileAttributesA_(char* lpFileName, uint32_t dwFileAttributes) {
// no-op for now
return 0;
}
void* CreateFileA_(char* lpFileName, uint32_t dwDesiredAccess, uint32_t dwShareMode, void* lpSecurityAttributes, uint32_t dwCreationDisposition, uint32_t dwFlagsAndAttributes, void* hTemplateFile) {
assert(dwDesiredAccess == GENERIC_READ);
assert(lpSecurityAttributes == NULL);
assert(dwCreationDisposition == OPEN_EXISTING);
FILE* f = fopen(lpFileName, "r");
if (!f) {
return INVALID_HANDLE_VALUE;
}
return f;
}
uint32_t GetFileSize_(void* hFile, uint32_t* lpFileSizeHigh) {
assert(lpFileSizeHigh == NULL);
long current_offset = ftell(hFile);
fseek(hFile, 0, SEEK_END);
long size = ftell(hFile);
fseek(hFile, current_offset, SEEK_SET);
return size;
}
int CloseHandle_(void* hObject) {
fclose(hObject);
return 0;
}
void GlobalMemoryStatus_(MEMORYSTATUS_* lpBuffer) {
lpBuffer->dwTotalPhys = 64000000;
lpBuffer->dwAvailPhys = 64000000; // pretend we have a whole 64mb of ram!
lpBuffer->dwAvailPageFile = 0;
lpBuffer->dwTotalVirtual = 0;
lpBuffer->dwAvailVirtual = 0;
lpBuffer->dwMemoryLoad = 0;
lpBuffer->dwTotalPageFile = 0;
}
int GetCursorPos_(POINT_* lpPoint) {
int x, y;
gHarness_platform.GetMousePosition(&x, &y);
lpPoint->x = x;
lpPoint->y = y;
return 0;
}
int ScreenToClient_(void* hWnd, POINT_* lpPoint) {
// no-op, we assume the point is already relative to client
return 0;
}
uint32_t timeGetTime_(void) {
return gHarness_platform.GetTicks();
}
uint32_t GetCurrentDirectoryA_(uint32_t nBufferLength, char* lpBuffer) {
char* ret = getcwd(lpBuffer, nBufferLength);
if (ret == NULL) {
return 0;
}
return strlen(lpBuffer);
}
int SetCurrentDirectoryA_(char* lpPathName) {
int ret = chdir(lpPathName);
// chdir returning zero means success, SetCurrentDirectory returning non-zero means success
if (ret == 0) {
return 1;
} else {
return 0;
}
}
HANDLE_ FindFirstFileA_(char* lpFileName, WIN32_FIND_DATAA_* lpFindFileData) {
assert(strcmp(lpFileName, "*.???") == 0);
#if defined(_WIN32) || defined(_WIN64)
WIN32_FIND_DATA fd;
void* hFile = FindFirstFile(lpFileName, &fd);
if (hFile != INVALID_HANDLE_VALUE) {
strcpy(lpFindFileData->cFileName, fd.cFileName);
}
return hFile;
#else
DIR* dir;
strcpy(lpFileName, ".");
dir = opendir(lpFileName);
if (dir == NULL) {
return INVALID_HANDLE_VALUE;
}
if (FindNextFileA_(dir, lpFindFileData)) {
return dir;
} else {
closedir(dir);
return INVALID_HANDLE_VALUE;
}
#endif
}
int FindNextFileA_(HANDLE_ hFindFile, WIN32_FIND_DATAA_* lpFindFileData) {
#if defined(_WIN32) || defined(_WIN64)
WIN32_FIND_DATA fd;
int result = FindNextFile(hFindFile, &fd);
if (result) {
strcpy(lpFindFileData->cFileName, fd.cFileName);
}
return result;
#else
struct dirent* entry;
if (hFindFile == NULL) {
return 0;
}
while ((entry = readdir(hFindFile)) != NULL) {
if (entry->d_type == DT_REG) {
strcpy(lpFindFileData->cFileName, entry->d_name);
return 1;
}
}
return 0;
#endif
}
int FindClose_(HANDLE_ hFindFile) {
#if defined(_WIN32) || defined(_WIN64)
return FindClose(hFindFile);
#else
return closedir(hFindFile);
#endif
}
void* CreateWindowExA_(uint32_t dwExStyle, char* lpClassName, char* lpWindowName, uint32_t dwStyle, int X, int Y, int nWidth, int nHeight, void* hWndParent, void* hMenu, void* hInstance, void* lpParam) {
gHarness_platform.CreateWindow_(lpWindowName, nWidth, nHeight, eWindow_type_software);
return NULL;
}
int SetWindowPos_(void* hWnd, void* hWndInsertAfter, int X, int Y, int cx, int cy, unsigned int uFlags) {
return gHarness_platform.SetWindowPos(hWnd, X, Y, cx, cy);
}
int ShowCursor_(int bShow) {
gHarness_platform.ShowCursor(bShow);
return 0;
}
int SendMessageA_(void* hWnd, unsigned int Msg, unsigned int wParam, long lParam) {
return 0;
}
int MessageBoxA_(void* hWnd, char* lpText, char* lpCaption, unsigned int uType) {
// only ever used for errors
assert(uType == MB_ICONERROR);
return gHarness_platform.ShowErrorMessage(hWnd, lpText, lpCaption);
}
int DestroyWindow_(void* hWnd) {
gHarness_platform.DestroyWindow(hWnd);
return 0;
}
void ExitProcess_(unsigned int uExitCode) {
exit(uExitCode);
}
void TranslateMessage_(MSG_* lpMsg) {
// no-op
}
void DispatchMessageA_(MSG_* lpMsg) {
// no-op
}
int PeekMessageA_(MSG_* lpMsg, void* hWnd, unsigned int wMsgFilterMin, unsigned int wMsgFilterMax, unsigned int wRemoveMsg) {
return gHarness_platform.ProcessWindowMessages(lpMsg);
}
int GetMessageA_(MSG_* lpMsg, void* hWnd, unsigned int wMsgFilterMin, unsigned int wMsgFilterMax) {
return gHarness_platform.ProcessWindowMessages(lpMsg);
}
void Sleep_(uint32_t dwMilliseconds) {
gHarness_platform.Sleep(dwMilliseconds);
}
void DirectDraw_CreateSurface(int width, int height) {
// no-op
}
void DirectInputDevice_GetDeviceState(unsigned int count, uint8_t* buffer) {
gHarness_platform.GetKeyboardState(count, buffer);
}
void DirectDrawDevice_SetPaletteEntries(PALETTEENTRY_* palette, int pFirst_colour, int pCount) {
assert(pFirst_colour == 0);
assert(pCount == 256);
gHarness_platform.Renderer_SetPalette(palette);
}
void _splitpath_(char* path, char* drive, char* dir, char* fname, char* ext) {
assert(dir == NULL);
assert(fname != NULL);
char* result = OS_Basename(path);
strcpy(fname, result);
}
int _CrtDbgReport_(int reportType, const char* filename, int linenumber, const char* moduleName, const char* format, ...) {
printf("_CrtDbgReport: (TODO)\n");
return 1;
}
#endif

View File

@ -1,31 +0,0 @@
#include "harness/winsock.h"
#ifndef _WIN32
int WSAStartup(int version, WSADATA* data) {
// very minimal, we don't care about the arguments
return 0;
}
int WSAGetLastError(void) {
return errno;
}
int WSACleanup(void) {
return 0;
}
// Only implement non-blocking call for now
int ioctlsocket(int handle, long cmd, unsigned long* argp) {
assert(cmd == FIONBIO);
int flags = fcntl(handle, F_GETFL);
flags |= O_NONBLOCK;
return fcntl(handle, F_SETFL, flags);
}
int closesocket(int handle) {
return close(handle);
}
#endif