00001
00007 #include "../dllkit/dllkit.h"
00008 #include "../usrmsgs.h"
00009 #include <tchar.h>
00010 #include <stdlib.h>
00011
00012 #define KBSTAT IOLO + 21
00013 #define SHIFTSTAT IOLO + 22
00014 #define RANDOM IOLO + 23
00015
00016 #define ADR(X, Y) (((X) << 8) + (Y))
00017
00025 unsigned char KbMap[256] = {
00026
00027 255, 255, 255, 255, 255, 255, 255, 30, 125, 255,
00028 255, 255, 0, 255, 255, 255, 255, 255, 255, 1,
00029 255, 255, 2, 3, 4, 5, 27, 255, 255, 255,
00030 255, 32, 255, 255, 255, 255, 30, 28, 31, 29,
00031 255, 255, 255, 255, 127, 126, 255, 48, 49, 50,
00032 51, 52, 53, 54, 55, 56, 57, 255, 255, 255,
00033 255, 255, 255, 255, 65, 66, 67, 68, 69, 70,
00034 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
00035 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
00036 255, 255, 255, 255, 255, 48, 49, 50, 51, 52,
00037 53, 54, 55, 56, 57, 42, 43, 255, 45, 255,
00038 47, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00039 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00040 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00041 255, 255, 255, 124, 255, 255, 255, 255, 255, 255,
00042 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00043 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00044 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00045 255, 255, 255, 255, 255, 59, 61, 44, 45, 46,
00046 47, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00047 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00048 255, 255, 255, 255, 255, 255, 255, 255, 91, 92,
00049 93, 39, 255, 255, 255, 255, 255, 255, 255, 255,
00050 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00051 255, 255, 255, 255, 255, 255, 255
00052 };
00053
00054 #define SHIFTFLAG 0x01
00055 #define CTRLFLAG 0x02
00056
00057
00058 volatile unsigned char Key = 0;
00059 volatile unsigned char KbState = 0;
00060
00061
00062 HANDLE hThisModule;
00063 MSGLIST Msgs;
00064 INITDLLSTRUCT info;
00065
00066 BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call,
00067 LPVOID lpReserved)
00068 {
00069 hThisModule = hModule;
00070 switch (ul_reason_for_call) {
00071 case DLL_PROCESS_ATTACH:
00072 CreateMsgList(&Msgs, 2);
00073 break;
00074 case DLL_PROCESS_DETACH:
00075 FreeMsgList(Msgs);
00076 break;
00077 }
00078 return TRUE;
00079 }
00080
00081 DLLEXPORT void __cdecl InitDll(INITDLLSTRUCT* ids, INITDLLINFO* idi)
00082 {
00083
00084 AddMessage(Msgs, WM_KEYDOWN);
00085 AddMessage(Msgs, WM_KEYUP);
00086
00087
00088 info.CSMemory = ids->CSMemory;
00089 info.hInst = ids->hInst;
00090 info.hWnd = ids->hWnd;
00091 info.memory = ids->memory;
00092 info.memgetb = ids->memgetb;
00093 info.memsetb = ids->memsetb;
00094 info.optional = ids->optional;
00095
00096
00097 Key = 0;
00098
00099
00100 srand((UINT) GetTickCount());
00101
00102
00103 idi->iolo = IOLO + 21;
00104 idi->iohi = IOLO + 30;
00105 idi->msglist = Msgs;
00106 }
00107
00108
00109 DLLEXPORT void __cdecl OnMessage(MESSAGEDLLSTRUCT* mds)
00110 {
00111 switch (mds->message) {
00112 case WM_KEYDOWN:
00113 switch (mds->wParam) {
00114 case VK_SHIFT:
00115 KbState |= SHIFTFLAG;
00116 break;
00117 case VK_CONTROL:
00118 KbState |= CTRLFLAG;
00119 break;
00120 default:
00121 Key = (char) mds->wParam & 0xFF;
00122 if (KbMap[Key - 1] != 255) {
00123 (*info.memsetb)(IRQID, 1);
00124 SendMessage(info.hWnd, IRQMSG, 0, 0);
00125 }
00126 break;
00127 }
00128 break;
00129 case WM_KEYUP:
00130 switch (mds->wParam) {
00131 case VK_SHIFT:
00132 KbState &= ~SHIFTFLAG;
00133 break;
00134 case VK_CONTROL:
00135 KbState &= ~CTRLFLAG;
00136 break;
00137 default:
00138 if (Key != 0 && KbMap[Key - 1] != 255) {
00139 (*info.memsetb)(IRQID, 2);
00140 SendMessage(info.hWnd, IRQMSG, 0, 0);
00141 }
00142 Key = 0;
00143 break;
00144 }
00145 break;
00146 }
00147
00148 }
00149
00150 #define IOSETGET(GVAR, SVAR) \
00151 if (mode == IOREAD) { \
00152 *data = GVAR; \
00153 } \
00154 else { \
00155 SVAR = *data; \
00156 }
00157
00158 DLLEXPORT void __cdecl IOFunc(UINT adr, unsigned char* data,
00159 iomode mode)
00160 {
00161 switch (adr) {
00162 case KBSTAT:
00163 if (mode == IOREAD && Key != 0) {
00164 *data = KbMap[Key - 1];
00165 }
00166 else if (mode == IOREAD) {
00167 *data = 255;
00168 }
00169
00170 break;
00171 case SHIFTSTAT:
00172 if (mode == IOREAD) {
00173 *data = KbState;
00174 }
00175 break;
00176 case RANDOM:
00177 if (mode == IOREAD) {
00178 *data = (unsigned char) (rand() % 0xFF);
00179 }
00180 break;
00181 }
00182 }
00183