void NPServerProcessInput (void) { static uint8 header = 0; static uint32 pos = 0; KeyMap myKeys; if (npserver.phasecount == 0) { for (int c = 1; c <= NP_MAX_CLIENTS; c++) if (npplayer[c].ready) sem_wait(sememu[c]); for (uint32 j = 0; j < npserver.phasespan; j++) nprecvpad[0][j] = npcachpad[j]; for (int i = 0; i < npserver.numplayers; i++) { for (uint32 j = 0; j < npserver.phasespan; j++) { npactvpad[i][j] = npsendpad[i][j]; npsendpad[i][j] = nprecvpad[i][j]; } } if (npserver.header & 0x80) { for (int i = 0; i < npserver.numplayers; i++) { npactvpad[i][npserver.phasespan] = 0; npsendpad[i][npserver.phasespan] = 0; } npserver.phasespan++; if (npserver.phasespan > (uint32) Memory.ROMFramesPerSecond) npserver.phasespan = (uint32) Memory.ROMFramesPerSecond; char str[256]; sprintf(str, "delay: %d", npserver.phasespan); S9xMessage(0, 0, str); } else if (npserver.header & 0x40) { npserver.phasespan--; if (npserver.phasespan == 0) npserver.phasespan = 1; char str[256]; sprintf(str, "delay: %d", npserver.phasespan); S9xMessage(0, 0, str); } npserver.header = header; header = 0; pos = 0; } for (int i = 0; i < npserver.numplayers; i++) { controlPad[i] = npactvpad[i][pos]; ControlPadFlagsToS9xReportButtons(i, controlPad[i]); } GetKeys(myKeys); if (ISpKeyIsPressed(kISpEsc) || KeyIsPressed(myKeys, keyCode[kKeyEsc])) { if (s9xthreadrunning) { if (!eventQueued) { PostQueueToSubEventLoop(); eventQueued = true; } } else running = false; return; } uint32 pad = 0; JoypadScanDirection(0, &pad); if (ISpKeyIsPressed(kISp1PR )) pad |= 0x0010; if (ISpKeyIsPressed(kISp1PL )) pad |= 0x0020; if (ISpKeyIsPressed(kISp1PX )) pad |= 0x0040; if (ISpKeyIsPressed(kISp1PA )) pad |= 0x0080; if (ISpKeyIsPressed(kISp1PStart )) pad |= 0x1000; if (ISpKeyIsPressed(kISp1PSelect)) pad |= 0x2000; if (ISpKeyIsPressed(kISp1PY )) pad |= 0x4000; if (ISpKeyIsPressed(kISp1PB )) pad |= 0x8000; if (KeyIsPressed(myKeys, keyCode[k1PR] )) pad |= 0x0010; if (KeyIsPressed(myKeys, keyCode[k1PL] )) pad |= 0x0020; if (KeyIsPressed(myKeys, keyCode[k1PX] )) pad |= 0x0040; if (KeyIsPressed(myKeys, keyCode[k1PA] )) pad |= 0x0080; if (KeyIsPressed(myKeys, keyCode[k1PRight] )) pad |= 0x0100; if (KeyIsPressed(myKeys, keyCode[k1PLeft] )) pad |= 0x0200; if (KeyIsPressed(myKeys, keyCode[k1PDown] )) pad |= 0x0400; if (KeyIsPressed(myKeys, keyCode[k1PUp] )) pad |= 0x0800; if (KeyIsPressed(myKeys, keyCode[k1PStart] )) pad |= 0x1000; if (KeyIsPressed(myKeys, keyCode[k1PSelect])) pad |= 0x2000; if (KeyIsPressed(myKeys, keyCode[k1PY] )) pad |= 0x4000; if (KeyIsPressed(myKeys, keyCode[k1PB] )) pad |= 0x8000; npcachpad[pos] = pad; if (KeyIsPressed(myKeys, keyCode[k2PR])) header |= 0x80; if (KeyIsPressed(myKeys, keyCode[k2PL])) header |= 0x40; if (npserver.phasecount == 0) { npserver.phasecount = npserver.phasespan; for (int c = 1; c <= NP_MAX_CLIENTS; c++) if (npplayer[c].ready) sem_post(sempad[c]); } npserver.phasecount--; pos++; }
void NPClientProcessInput(void) { KeyMap myKeys; static uint32 pos = 0; #define KeyIsPressed(km, k) (1 & (((unsigned char *) km) [(k) >> 3] >> ((k) & 7))) if (npclient.exitsgn) { if (s9xthreadrunning) { if (!eventQueued) { PostQueueToSubEventLoop(); eventQueued = true; } } else running = false; return; } if (npclient.phasecount == 0) { sem_wait(csememu); for (int i = 0; i < npclient.numplayers; i++) for (uint32 j = 0; j < npclient.phasespan; j++) npcactvpad[i][j] = npcrecvpad[i][j]; for (uint32 j = 0; j < npclient.phasespan; j++) npcsendpad[j] = npccachpad[j]; if (npclient.header & 0x80) { npcsendpad[npclient.phasespan] = 0; for (int i = 0; i < npclient.numplayers; i++) npcactvpad[i][npclient.phasespan] = 0; npclient.phasespan++; if (npclient.phasespan > (uint32) Memory.ROMFramesPerSecond) npclient.phasespan = (uint32) Memory.ROMFramesPerSecond; char str[256]; sprintf(str, "delay: %d", npclient.phasespan); S9xMessage(0, 0, str); } else if (npclient.header & 0x40) { npclient.phasespan--; if (npclient.phasespan == 0) npclient.phasespan = 1; char str[256]; sprintf(str, "delay: %d", npclient.phasespan); S9xMessage(0, 0, str); } npclient.header = 0; pos = 0; } for (int i = 0; i < npclient.numplayers; i++) { controlPad[i] = npcactvpad[i][pos]; ControlPadFlagsToS9xReportButtons(i, controlPad[i]); } GetKeys(myKeys); uint32 pad = 0; JoypadScanDirection(0, &pad); if (ISpKeyIsPressed(kISp1PR )) pad |= 0x0010; if (ISpKeyIsPressed(kISp1PL )) pad |= 0x0020; if (ISpKeyIsPressed(kISp1PX )) pad |= 0x0040; if (ISpKeyIsPressed(kISp1PA )) pad |= 0x0080; if (ISpKeyIsPressed(kISp1PStart )) pad |= 0x1000; if (ISpKeyIsPressed(kISp1PSelect)) pad |= 0x2000; if (ISpKeyIsPressed(kISp1PY )) pad |= 0x4000; if (ISpKeyIsPressed(kISp1PB )) pad |= 0x8000; if (KeyIsPressed(myKeys, keyCode[k1PR] )) pad |= 0x0010; if (KeyIsPressed(myKeys, keyCode[k1PL] )) pad |= 0x0020; if (KeyIsPressed(myKeys, keyCode[k1PX] )) pad |= 0x0040; if (KeyIsPressed(myKeys, keyCode[k1PA] )) pad |= 0x0080; if (KeyIsPressed(myKeys, keyCode[k1PRight] )) pad |= 0x0100; if (KeyIsPressed(myKeys, keyCode[k1PLeft] )) pad |= 0x0200; if (KeyIsPressed(myKeys, keyCode[k1PDown] )) pad |= 0x0400; if (KeyIsPressed(myKeys, keyCode[k1PUp] )) pad |= 0x0800; if (KeyIsPressed(myKeys, keyCode[k1PStart] )) pad |= 0x1000; if (KeyIsPressed(myKeys, keyCode[k1PSelect])) pad |= 0x2000; if (KeyIsPressed(myKeys, keyCode[k1PY] )) pad |= 0x4000; if (KeyIsPressed(myKeys, keyCode[k1PB] )) pad |= 0x8000; npccachpad[pos] = pad; if (npclient.phasecount == 0) { npclient.phasecount = npclient.phasespan; sem_post(csempad); } npclient.phasecount--; pos++; }