s32 padEnd(void) { if(padman_init != 0) { int port,slot; for(port = 0; port < 2; port++) for(slot=0; slot < 4; slot++) { if((openSlots[port] >> slot) & 0x1) padPortClose(port, slot, 1); } SetEventFlag(vblankData.eventflag, EF_EXIT_THREAD); vblankData.padEnd = 1; WaitEventFlag(vblankData.eventflag, EF_VB_WAIT_THREAD_EXIT, 0x11, 0); DeleteThreadsEventFlag( &vblankData ); while(ReleaseVblankHandler(0, (void*)VblankStart) != 0) M_PRINTF("Release VB_START failed.\n"); while(ReleaseVblankHandler(1, VblankEnd) != 0) M_PRINTF("Release VB_END failed.\n"); padman_init = 0; }
void ExecGame(void) { int i; scr_printf(" Installing Engine...\n"); u32 EngineStore = 0x80080000; u32 EngineRead = (void*)Engine; for (i = 0; i < sizeof(Engine); i += 4) { //scr_printf("A"); ee_kmode_enter(); *(u32*)EngineStore = *(u32*)EngineRead; ee_kmode_exit(); EngineStore += 4; EngineRead += 4; } ee_kmode_enter(); *(u32*)0x80081000 = 0x80081010; //Writes the initial storage of the codes ee_kmode_exit(); waitCdReady(); scr_printf(" Loading...\n"); //for (a = 0; a < 40000000; a++) { } if(strlen(bootFileName = parseSystemCnf()) <= 0) { scr_printf(" == Fatal Error ==\n"); SleepThread(); } scr_printf("\n Loaded Game!\n"); u32 HookValue = (0x00080000 / 4) + 0x0C000000; padPortClose(0, 0); //scr_printf(" Shut down PAD, shutting down RPC\n GOODBYE!!!"); SifExitRpc(); ee_kmode_enter(); *(u32*)0x800002FC = HookValue; ee_kmode_exit(); LoadExecPS2((const char *)bootFileName, 0, NULL); SleepThread(); }
/** Unloads a single pad. * @see unloadPads */ static void unloadPad(struct pad_data_t* pad) { padPortClose(pad->port, pad->slot); }
void Ps2Pad::initPad(void) { int modes = 0; if (_padStatus == STAT_NONE) { if (padPortOpen(_port, _slot, _padBuf) == 1) { _padStatus = STAT_OPEN; _padInitTime = _system->getMillis(); } else { padPortClose(_port, _slot); printf("Unable to open port (%d/%d)!\n", _port, _slot); } } else { if (checkPadReady(_port, _slot)) { switch (_padStatus) { case STAT_OPEN: _padStatus = STAT_DETECT; break; case STAT_DETECT: _isDualShock = false; modes = padInfoMode(_port, _slot, PAD_MODETABLE, -1); // Verify that the controller has a DUAL SHOCK mode for (int cnt = 0; cnt < modes; cnt++) if (padInfoMode(_port, _slot, PAD_MODETABLE, cnt) == PAD_TYPE_DUALSHOCK) _isDualShock = true; // If ExId != 0x0 => This controller has actuator engines // This check should always pass if the Dual Shock test above passed if (_isDualShock) if (padInfoMode(_port, _slot, PAD_MODECUREXID, 0) == 0) _isDualShock = false; if (_isDualShock) { // When using MMODE_LOCK, user cant change mode with Select button padSetMainMode(_port, _slot, PAD_MMODE_DUALSHOCK, PAD_MMODE_LOCK); _padStatus = STAT_INIT_DSHOCK; } else _padStatus = STAT_WAIT_READY; break; case STAT_INIT_DSHOCK: padEnterPressMode(_port, _slot); _padStatus = STAT_CHECK_ACT; break; case STAT_CHECK_ACT: _actuators = padInfoAct(_port, _slot, -1, 0); if (_actuators != 0) _padStatus = STAT_INIT_ACT; else { _isDualShock = false; _padStatus = STAT_WAIT_READY; } break; case STAT_INIT_ACT: char actAlign[6]; actAlign[0] = 0; actAlign[1] = 1; actAlign[2] = actAlign[3] = actAlign[4] = actAlign[5] = 0xff; padSetActAlign(_port, _slot, actAlign); _padStatus = STAT_WAIT_READY; break; case STAT_WAIT_READY: _padStatus = STAT_OKAY; break; case STAT_OKAY: case STAT_NONE: // pad is already initialized (or not there) break; } } else { // check for timeout... if (_system->getMillis() - _padInitTime > 5000) { // still no pad, give up. if (padPortClose(_port, _slot) != 1) printf("WARNING: can't close port: %d/%d\n", _port, _slot); printf("looking for pad, gave up and closed port\n"); _padStatus = STAT_NONE; } } } }
void PadDeinitPads(void) { padPortClose(0, 0); padPortClose(1, 0); padEnd(); }