void prepare_to_exit() { printf ("****** Exiting THPS Demo *****\n"); //Nx::CEngine::sSuspendEngine(); // turn off Nx engine interrupts NxPs2::SuspendEngine(); // Sfx::CSfxManager* sfx_manager = Sfx::CSfxManager::Instance(); sfx_manager->PauseSounds( ); if (!Config::CD()) { printf ("Re-initializing the CD/DVD drive\n"); // if we did not come from a CD, then we need to initilaize the CD here // so we can test exiting back to the bootstrap program sceCdInit(SCECdINIT); sceCdMmode(SCECdDVD); sceCdDiskReady(0); } else { printf ("Stopping streaming etc, on CD/DVD drive\n"); Pcm::StopStreams( ); Pcm::StopMusic( ); sceCdStStop(); // also stop streaming.... Yes!! sceCdStop(); // stop Cd sceCdSync(0); // wait for commands to execute sceCdDiskReady(0); // wait for Cd to be ready again } scePadEnd(); // Another Sony reccomendation (from James Wang, newgroup post, 6/11/2002) }
//------------------------------------------------------------------------- void *cbrpc_cddiskready(u32 fno, void *buf, int size) { // CD Disk Ready RPC callback if (*(int *)buf == 0) *(int *)buf = sceCdDiskReady(0); else *(int *)buf = sceCdDiskReady(1); return buf; }
//------------------------------------------------------------------------- void *cbrpc_cddiskready2(u32 fno, void *buf, int size) { // CD Disk Ready2 RPC callback *(int *)buf = sceCdDiskReady(0); return buf; }
//------------------------------------------------------------------------- void *rpcNCmd_cddiskready(u32 fno, void *buf, int size) { // CD Disk Ready RPC NCMD *(int *)buf = sceCdDiskReady(0); return buf; }
//-------------------------------------------------------------- void cdvd_readee(void *buf) { // Read Disc datas to EE mem buffer u32 nbytes, nsectors, sectors_to_read, size_64b, size_64bb, bytesent, temp; int sector_size, flag_64b; void *fsvRbuf = (void *)cdvdfsv_buf; void *eeaddr_64b, *eeaddr2_64b; cdvdfsv_readee_t readee; RpcCdvd_t *r = (RpcCdvd_t *)buf; if (r->sectors == 0) { *(int *)buf = 0; return; } sector_size = 2328; if ((r->mode.datapattern & 0xff) != 1) { sector_size = 2340; if ((r->mode.datapattern & 0xff) != 2) sector_size = 2048; } r->eeaddr1 = (void *)((u32)r->eeaddr1 & 0x1fffffff); r->eeaddr2 = (void *)((u32)r->eeaddr2 & 0x1fffffff); r->buf = (void *)((u32)r->buf & 0x1fffffff); sceCdDiskReady(0); sectors_to_read = r->sectors; bytesent = 0; if (r->eeaddr2) mips_memset((void *)curlsn_buf, 0, 16); readee.pdst1 = (void *)r->buf; eeaddr_64b = (void *)(((u32)r->buf + 0x3f) & 0xffffffc0); // get the next 64-bytes aligned address if ((u32)r->buf & 0x3f) readee.b1len = (((u32)r->buf & 0xffffffc0) - (u32)r->buf) + 64; // get how many bytes needed to get a 64 bytes alignment else readee.b1len = 0; nbytes = r->sectors * sector_size; temp = (u32)r->buf + nbytes; eeaddr2_64b = (void *)(temp & 0xffffffc0); temp -= (u32)eeaddr2_64b; readee.pdst2 = eeaddr2_64b; // get the end address on a 64 bytes align readee.b2len = temp; // get bytes remainder at end of 64 bytes align fsvRbuf += temp; if (readee.b1len) flag_64b = 0; // 64 bytes alignment flag else { if (temp) flag_64b = 0; else flag_64b = 1; } while (1) { do { if ((sectors_to_read == 0) || (sceCdGetError() == CDVD_ERR_ABRT)) { if (r->eeaddr1) sysmemSendEE((void *)&readee, (void *)r->eeaddr1, sizeof(cdvdfsv_readee_t)); if (r->eeaddr2) { *((u32 *)&curlsn_buf[0]) = nbytes; sysmemSendEE((void *)curlsn_buf, (void *)r->eeaddr2, 16); } *(int *)buf = 1; return; } if (flag_64b == 0) { // not 64 bytes aligned buf if (sectors_to_read < CDVDFSV_BUF_SECTORS) nsectors = sectors_to_read; else nsectors = CDVDFSV_BUF_SECTORS-1; temp = nsectors + 1; } else { // 64 bytes aligned buf if (sectors_to_read < (CDVDFSV_BUF_SECTORS+1)) nsectors = sectors_to_read; else nsectors = CDVDFSV_BUF_SECTORS; temp = nsectors; } sceCdRead0(r->lsn, temp, (void *)fsvRbuf, NULL); size_64b = nsectors * sector_size; size_64bb = size_64b; if (!flag_64b) { if (sectors_to_read == r->sectors) // check that was the first read mips_memcpy((void *)readee.buf1, (void *)fsvRbuf, readee.b1len); if ((!flag_64b) && (sectors_to_read == nsectors) && (readee.b1len)) size_64bb = size_64b - 64; } if (size_64bb > 0) { sysmemSendEE((void *)(fsvRbuf + readee.b1len), (void *)eeaddr_64b, size_64bb); bytesent += size_64bb; } if (r->eeaddr2) { temp = bytesent; if (temp < 0) temp += 2047; temp = temp >> 11; *((u32 *)&curlsn_buf[0]) = temp; sysmemSendEE((void *)curlsn_buf, (void *)r->eeaddr2, 16); } sectors_to_read -= nsectors; r->lsn += nsectors; eeaddr_64b += size_64b; } while ((flag_64b) || (sectors_to_read)); mips_memcpy((void *)readee.buf2, (void *)(fsvRbuf + size_64b - readee.b2len), readee.b2len); }