Main Page   Data Structures   File List   Data Fields   Globals   Related Pages  

perifdll.c

Go to the documentation of this file.
00001 
00007 #include "../dllkit/dllkit.h"
00008 #include "../usrmsgs.h"
00009 #include <tchar.h>
00010 #include <stdlib.h>     //Random
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 //      1  , 2  , 3  , 4  , 5  , 6  , 7  , 8  , 9  , 10
00027         255, 255, 255, 255, 255, 255, 255,  30, 125, 255,       // 10
00028         255, 255,   0, 255, 255, 255, 255, 255, 255,   1,       // 20
00029         255, 255,   2,   3,       4,   5,  27, 255, 255, 255,   // 30
00030         255,  32, 255, 255, 255, 255,  30,  28,  31,  29,       // 40
00031         255, 255, 255, 255, 127, 126, 255,  48,  49,  50,       // 50
00032          51,  52,  53,  54,  55,  56,  57, 255, 255, 255,       // 60
00033         255, 255, 255, 255,  65,  66,  67,  68,  69,  70,       // 70
00034          71,  72,  73,  74,  75,  76,  77,  78,  79,  80,       // 80
00035          81,  82,  83,  84,  85,  86,  87,  88,  89,  90,       // 90
00036         255, 255, 255, 255, 255,  48,  49,  50,  51,  52,       // 100
00037          53,  54,  55,  56,  57,  42,  43, 255,  45, 255,       // 110
00038          47, 255, 255, 255, 255, 255, 255, 255, 255, 255,       // 120
00039         255, 255, 255, 255, 255, 255, 255, 255, 255, 255,       // 130
00040         255, 255, 255, 255, 255, 255, 255, 255, 255, 255,       // 140
00041         255, 255, 255, 124, 255, 255, 255, 255, 255, 255,       // 150
00042         255, 255, 255, 255, 255, 255, 255, 255, 255, 255,       // 160
00043         255, 255, 255, 255, 255, 255, 255, 255, 255, 255,       // 170
00044         255, 255, 255, 255, 255, 255, 255, 255, 255, 255,       // 180
00045         255, 255, 255, 255, 255,  59,  61,  44,  45,  46,       // 190
00046          47, 255, 255, 255, 255, 255, 255, 255, 255, 255,       // 200
00047         255, 255, 255, 255, 255, 255, 255, 255, 255, 255,       // 210
00048         255, 255, 255, 255, 255, 255, 255, 255,  91,  92,       // 220
00049          93,  39, 255, 255, 255, 255, 255, 255, 255, 255,       // 230
00050         255, 255, 255, 255, 255, 255, 255, 255, 255, 255,       // 240
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         // Add Message list of messages to be catched
00084         AddMessage(Msgs, WM_KEYDOWN);
00085         AddMessage(Msgs, WM_KEYUP);
00086 
00087         // Copy informations passed to this dll
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         // Initialize pseudo-random number generator 
00100         srand((UINT) GetTickCount());
00101 
00102         // Fill the return idi structure
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                 //*data = 75;
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 

Generated on Fri Sep 6 18:32:14 2002 for Emu6502 by doxygen1.2.17