⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filer.c

📁 索尼公司著名游戏机PS2使用的引导工具文件源代码,这是爱好者自编的工具,可以使用它来引导自己的程序,达到跳过原光驱启动执行自己制作的程序的目的,在windows上可以安装使用ps2的专用开发包,搭建c
💻 C
📖 第 1 页 / 共 3 页
字号:
		for(i=0; i<KEY_LEN; i++)
			drawChar(KEY[i],
				KEY_X+2+4 + (i%WFONTS+1)*20 - 12,
				KEY_Y+16 + (i/WFONTS)*8,
				setting->color[3]);
		printXY("OK                       CANCEL",
			KEY_X+2+4 + 20 - 12,
			KEY_Y+16 + HFONTS*8,
			setting->color[3], TRUE);
		if(sel<=WFONTS*HFONTS)
			x = KEY_X+2+4 + (sel%WFONTS+1)*20 - 20;
		else
			x = KEY_X+2+4 + 25*8;
		y = KEY_Y+16 + (sel/WFONTS)*8;
		drawChar(127, x, y, setting->color[3]);
		
		// 憖嶌愢柧
		x = SCREEN_MARGIN;
		y = SCREEN_HEIGHT-SCREEN_MARGIN-FONT_HEIGHT;
		itoSprite(setting->color[0],
			0,
			y/2,
			SCREEN_WIDTH,
			y/2+8, 0);
		printXY("仜:OK 亊:Back L1:Left R1:Right START:Enter",
			x, y/2, setting->color[2], TRUE);
		drawScr();
	}
	return 0;
}

///////////////////////////////////////////////////////////////////////////
// 僼傽僀儖儕僗僩愝掕
int setFileList(const char *path, const char *ext, FILEINFO *files, int cnfmode)
{
	char *p;
	int nfiles, i, j, ret;
	
	// 僼傽僀儖儕僗僩愝掕
	if(path[0]==0){
		strcpy(files[0].name, "mc0:");
		strcpy(files[1].name, "mc1:");
		strcpy(files[2].name, "hdd0:");
		strcpy(files[3].name, "cdfs:");
		strcpy(files[4].name, "mass:");
		files[0].attr = FIO_S_IFDIR;
		files[1].attr = FIO_S_IFDIR;
		files[2].attr = FIO_S_IFDIR;
		files[3].attr = FIO_S_IFDIR;
		files[4].attr = FIO_S_IFDIR;
		nfiles = 5;
		for(i=0; i<nfiles; i++)
			files[i].title[0]=0;
		if(cnfmode){
			strcpy(files[nfiles].name, "MISC");
			files[nfiles].attr = FIO_S_IFDIR;
			nfiles++;
		}
		vfreeSpace=FALSE;
	}else if(!strcmp(path, "MISC/")){
		strcpy(files[0].name, "..");
		strcpy(files[1].name, "FileBrowser");
		strcpy(files[2].name, "PS2Browser");
		strcpy(files[3].name, "PS2Disc");
		files[0].attr = FIO_S_IFDIR;
		files[1].attr = FIO_S_IFREG;
		files[2].attr = FIO_S_IFREG;
		files[3].attr = FIO_S_IFREG;
		nfiles = 4;
		for(i=0; i<nfiles; i++)
			files[i].title[0]=0;
	}else{
		strcpy(files[0].name, "..");
		files[0].attr = FIO_S_IFDIR;
		nfiles = getDir(path, &files[1]) + 1;
		if(strcmp(ext,"*")){
			for(i=j=1; i<nfiles; i++){
				if(files[i].attr & FIO_S_IFDIR)
					files[j++] = files[i];
				else{
					p = strrchr(files[i].name, '.');
					if(p!=NULL && !stricmp(ext,p+1))
						files[j++] = files[i];
				}
			}
			nfiles = j;
		}
		if(title){
			for(i=1; i<nfiles; i++){
				ret = getGameTitle(path, &files[i], files[i].title);
				if(ret<0) files[i].title[0]=0;
			}
		}
		if(!strcmp(path, "hdd0:/"))
			vfreeSpace=FALSE;
		else if(nfiles>1)
			sort(&files[1], 0, nfiles-2);
	}
	
	return nfiles;
}

////////////////////////////////////////////////////////////////////////
// 擟堄偺僼傽僀儖僷僗傪曉偡
void getFilePath(char *out, int cnfmode)
{
	char path[MAX_PATH], oldFolder[MAX_PATH],
		msg0[MAX_PATH], msg1[MAX_PATH],
		tmp[MAX_PATH], ext[8], *p;
	uint64 color;
	FILEINFO files[MAX_ENTRY];
	int nfiles=0, sel=0, top=0, rows=MAX_ROWS;
	int cd=TRUE, up=FALSE, pushed=TRUE;
	int nofnt=FALSE;
	int x, y, y0, y1;
	int i, ret, fd;
	size_t size;
	
	if(cnfmode) strcpy(ext, "elf");
	else		strcpy(ext, "*");
	strcpy(path, LastDir);
	mountedParty[0][0]=0;
	mountedParty[1][0]=0;
	clipPath[0] = 0;
	nclipFiles = 0;
	cut = 0;
	title=FALSE;
	while(1){
		waitPadReady(0, 0);
		if(readpad()){
			if(new_pad) pushed=TRUE;
			if(new_pad & PAD_UP)
				sel--;
			else if(new_pad & PAD_DOWN)
				sel++;
			else if(new_pad & PAD_LEFT)
				sel-=rows/2;
			else if(new_pad & PAD_RIGHT)
				sel+=rows/2;
			else if(new_pad & PAD_TRIANGLE)
				up=TRUE;
			else if(new_pad & PAD_CIRCLE){
				if(files[sel].attr & FIO_S_IFDIR){
					if(!strcmp(files[sel].name,".."))
						up=TRUE;
					else {
						strcat(path, files[sel].name);
						strcat(path, "/");
						cd=TRUE;
					}
				}else{
					sprintf(out, "%s%s", path, files[sel].name);
					if(checkELFheader(out)<0){
						pushed=FALSE;
						sprintf(msg0, "This file isn't ELF.");
					}else{
						strcpy(LastDir, path);
						break;
					}
				}
			}
			if(cnfmode){
				// 僼傽僀儖儅僗僋愗傝懼偊
				if(new_pad & PAD_SQUARE) {
					if(!strcmp(ext,"*")) strcpy(ext, "elf");
					else				 strcpy(ext, "*");
					cd=TRUE;
				// 儊僀儞儊僯儏乕偵栠傞
				} else if(new_pad & PAD_CROSS){
					if(mountedParty[0][0]!=0) fileXioUmount("pfs0:");
					return;
				}
			}else{
				// 儊僯儏乕
				if(new_pad & PAD_R1) {
					ret = menu(path, files[sel].name);
					// 僋儕僢僾儃乕僪偵僐僺乕
					if(ret==COPY || ret==CUT){
						strcpy(clipPath, path);
						if(nmarks>0){
							for(i=nclipFiles=0; i<nfiles; i++)
								if(marks[i])
									clipFiles[nclipFiles++]=files[i];
						}else{
							clipFiles[0]=files[sel];
							nclipFiles = 1;
						}
						sprintf(msg0, "Copied to the Clipboard");
						pushed=FALSE;
						if(ret==CUT)	cut=TRUE;
						else			cut=FALSE;
					// 僨儕乕僩
					} else if(ret==DELETE){
						if(nmarks==0){
							if(title && files[sel].title[0])
								sprintf(tmp,"%s",files[sel].title);
							else{
								sprintf(tmp,"%s",files[sel].name);
								if(files[sel].attr & FIO_S_IFDIR)
									strcat(tmp,"/");
							}
							strcat(tmp, "\nDelete?");
							ret = ynDialog(tmp);
						}else
							ret = ynDialog("Mark Files Delete?");
						
						if(ret>0){
							if(nmarks==0){
								strcpy(tmp, files[sel].name);
								if(files[sel].attr & FIO_S_IFDIR) strcat(tmp,"/");
								strcat(tmp, " deleting");
								drawMsg(tmp);
								ret=delete(path, &files[sel]);
							}else{
								for(i=0; i<nfiles; i++){
									if(marks[i]){
										strcpy(tmp, files[i].name);
										if(files[i].attr & FIO_S_IFDIR) strcat(tmp,"/");
										strcat(tmp, " deleting");
										drawMsg(tmp);
										ret=delete(path, &files[i]);
										if(ret<0) break;
									}
								}
							}
							if(ret>=0) cd=TRUE;
							else{
								strcpy(msg0, "Delete Failed");
								pushed = FALSE;
							}
						}
					// 儕僱乕儉
					} else if(ret==RENAME){
						strcpy(tmp, files[sel].name);
						if(keyboard(tmp, 36)>=0){
							if(Rename(path, &files[sel], tmp)<0){
								pushed=FALSE;
								strcpy(msg0, "Rename Failed");
							}else
								cd=TRUE;
						}
					// 僋儕僢僾儃乕僪偐傜儁乕僗僩
					} else if(ret==PASTE){
						drawMsg("Pasting...");
						ret=paste(path);
						if(ret < 0){
							strcpy(msg0, "Paste Failed");
							pushed = FALSE;
						}else
							if(cut) nclipFiles=0;
						cd=TRUE;
					// 怴婯僼僅儖僟嶌惉
					} else if(ret==NEWDIR){
						tmp[0]=0;
						if(keyboard(tmp, 36)>=0){
							ret = newdir(path, tmp);
							if(ret == -17){
								strcpy(msg0, "directory already exists");
								pushed=FALSE;
							}else if(ret < 0){
								strcpy(msg0, "NewDir Failed");
								pushed=FALSE;
							}else{
								strcat(path, tmp);
								strcat(path, "/");
								cd=TRUE;
							}
						}
					// 僒僀僘昞帵
					} else if(ret==GETSIZE){
						drawMsg("Checking Size...");
						if(nmarks==0){
							size=getFileSize(path, &files[sel]);
						}else{
							for(i=size=0; i<nfiles; i++){
								if(marks[i])
									size+=getFileSize(path, &files[i]);
								if(size<0) size=-1;
							}
						}
						if(size<0){
							strcpy(msg0, "Paste Failed");
						}else{
							if(size >= 1024*1024)
								sprintf(msg0, "SIZE = %.1fMB", (double)size/1024/1024);
							else if(size >= 1024)
								sprintf(msg0, "SIZE = %.1fKB", (double)size/1024);
							else
								sprintf(msg0, "SIZE = %dB", size);
						}
						pushed = FALSE;
					}
				// 儅乕僋
				} else if(new_pad & PAD_CROSS) {
					if(sel!=0 && path[0]!=0 && strcmp(path,"hdd0:/")){
						if(marks[sel]){
							marks[sel]=FALSE;
							nmarks--;
						}else{
							marks[sel]=TRUE;
							nmarks++;
						}
					}
					sel++;
				// 儅乕僋斀揮
				} else if(new_pad & PAD_SQUARE) {
					if(path[0]!=0 && strcmp(path,"hdd0:/")){
						for(i=1; i<nfiles; i++){
							if(marks[i]){
								marks[i]=FALSE;
								nmarks--;
							}else{
								marks[i]=TRUE;
								nmarks++;
							}
						}
					}
				// 僞僀僩儖昞帵愗傝懼偊
				} else if(new_pad & PAD_L1) {
					if(elisaFnt==NULL && nofnt==FALSE){
						sprintf(tmp, "%s%s", LaunchElfDir, "ELISA100.FNT");
						if(!strncmp(tmp, "cdrom", 5)) strcat(tmp, ";1");
						fd = fioOpen(tmp, O_RDONLY);
						if(fd>0){
							ret = fioLseek(fd,0,SEEK_END);
							if(ret==55016){
								elisaFnt = (char*)malloc(ret);
								fioLseek(fd,0,SEEK_SET);
								fioRead(fd, elisaFnt, ret);
								fioClose(fd);
							}
						}else
							nofnt = TRUE;
					}
					title = !title;
					if(elisaFnt!=NULL){
						if(title) rows=19;
						else	  rows=MAX_ROWS;
					}
					cd=TRUE;
				// 儊僀儞儊僯儏乕偵栠傞
				} else if(new_pad & PAD_SELECT){
					if(mountedParty[0][0]!=0) fileXioUmount("pfs0:");
					if(mountedParty[1][0]!=0) fileXioUmount("pfs1:");
					return;
				}
			}
		}
		// 忋埵僼僅儖僟堏摦
		if(up){
			if((p=strrchr(path, '/'))!=NULL)
				*p = 0;
			if((p=strrchr(path, '/'))!=NULL){
				p++;
				strcpy(oldFolder, p);
				*p = 0;
			}else{
				strcpy(oldFolder, path);
				path[0] = 0;
			}
			cd=TRUE;
		}
		// 僼僅儖僟堏摦
		if(cd){
			nfiles = setFileList(path, ext, files, cnfmode);
			// 嬻偒梕検庢摼
			if(!cnfmode){
				if(!strncmp(path, "mc", 2)){
					mcGetInfo(path[2]-'0', 0, NULL, &mcfreeSpace, NULL);
				}else if(!strncmp(path,"hdd",3)&&strcmp(path,"hdd0:/")){
					freeSpace = 
					fileXioDevctl("pfs0:",PFSCTL_GET_ZONE_FREE,NULL,0,NULL,0)*fileXioDevctl("pfs0:",PFSCTL_GET_ZONE_SIZE,NULL,0,NULL,0);
					vfreeSpace=TRUE;
				}
			}
			// 曄悢弶婜壔
			sel=0;
			top=0;
			if(up){
				for(i=0; i<nfiles; i++) {
					if(!strcmp(oldFolder, files[i].name)) {
						sel=i;
						top=sel-3;
						break;
					}
				}
			}
			nmarks = 0;
			memset(marks, 0, MAX_ENTRY);
			cd=FALSE;
			up=FALSE;
		}
		if(strncmp(path,"cdfs",4) && setting->discControl)
			CDVD_Stop();
		// 僼傽僀儖儕僗僩昞帵梡曄悢偺惓婯壔
		if(top > nfiles-rows)	top=nfiles-rows;
		if(top < 0)				top=0;
		if(sel >= nfiles)		sel=nfiles-1;
		if(sel < 0)				sel=0;
		if(sel >= top+rows)		top=sel-rows+1;
		if(sel < top)			top=sel;
		
		// 夋柺昤夋奐巒
		clrScr(setting->color[0]);
		// 僼傽僀儖儕僗僩
		x = SCREEN_MARGIN + LINE_THICKNESS + FONT_WIDTH;
		y = SCREEN_MARGIN + FONT_HEIGHT*2 + LINE_THICKNESS + 12;
		if(title && elisaFnt!=NULL) y-=2;
		for(i=0; i<rows; i++)
		{
			if(top+i >= nfiles) break;
			if(top+i == sel) color = setting->color[2];
			else			 color = setting->color[3];
			if(files[top+i].attr & FIO_S_IFDIR){
				if(!strcmp(files[top+i].name,".."))
					strcpy(tmp,"..");
				else if(title && files[top+i].title[0]!=0)
					strcpy(tmp,files[top+i].title);
				else
					sprintf(tmp, "%s/", files[top+i].name);
			}else
				strcpy(tmp,files[top+i].name);
			printXY(tmp, x+4, y/2, color, TRUE);
			if(marks[top+i]) drawChar('*', x-6, y/2, setting->color[3]);
			y += FONT_HEIGHT;
			if(title && elisaFnt!=NULL) y+=2;
		}
		// 僗僋儘乕儖僶乕
		if(nfiles > rows)
		{
			itoSprite(setting->color[1],
				SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS-14,
				(SCREEN_MARGIN+FONT_HEIGHT*2+4)/2,
				SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS-12,
				(SCREEN_HEIGHT-SCREEN_MARGIN-FONT_HEIGHT)/2,
				0);
			y0=(SCREEN_HEIGHT-SCREEN_MARGIN*2-FONT_HEIGHT*3-LINE_THICKNESS*2-4)
				* ((double)top/nfiles);
			y1=(SCREEN_HEIGHT-SCREEN_MARGIN*2-FONT_HEIGHT*3-LINE_THICKNESS*2-4)
				* ((double)(top+rows)/nfiles);
			itoSprite(setting->color[1],
				SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS-11,
				(y0+SCREEN_MARGIN+FONT_HEIGHT*2+LINE_THICKNESS+4)/2,
				SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS-1,
				(y1+SCREEN_MARGIN+FONT_HEIGHT*2+LINE_THICKNESS+4)/2,
				0);
		}
		// 儊僢僙乕僕
		if(pushed) sprintf(msg0, "Path: %s", path);
		// 憖嶌愢柧
		if(cnfmode){
			if(!strcmp(ext, "*"))
				sprintf(msg1, "仜:OK 亊:Cancel 仮:Up 仩:*->ELF");
			else
				sprintf(msg1, "仜:OK 亊:Cancel 仮:Up 仩:ELF->*");
		}else{
			if(title)
				sprintf(msg1, "仜:OK 仮:Up 亊:Mark 仩:RevMark L1:TitleOFF R1:Menu");
			else
				sprintf(msg1, "仜:OK 仮:Up 亊:Mark 仩:RevMark L1:TitleON  R1:Menu");
		}
		setScrTmp(msg0, msg1);
		// 僼儕乕僗儁乕僗昞帵
		if(!strncmp(path, "mc", 2) && !vfreeSpace && !cnfmode){
			if(mcSync(1,NULL,NULL)!=0){
				freeSpace = mcfreeSpace*1024;
				vfreeSpace=TRUE;
			}
		}
		if(vfreeSpace){
			if(freeSpace >= 1024*1024)
				sprintf(tmp, "[%.1fMB free]", (double)freeSpace/1024/1024);
			else if(freeSpace >= 1024)
				sprintf(tmp, "[%.1fKB free]", (double)freeSpace/1024);
			else
				sprintf(tmp, "[%dB free]", freeSpace);
			ret=strlen(tmp);
			itoSprite(setting->color[0],
				SCREEN_WIDTH-SCREEN_MARGIN-(ret+1)*8,
				(SCREEN_MARGIN+FONT_HEIGHT+4)/2,
				SCREEN_WIDTH,
				(SCREEN_MARGIN+FONT_HEIGHT+20)/2, 0);
			printXY(tmp,
				SCREEN_WIDTH-SCREEN_MARGIN-ret*8,
				(SCREEN_MARGIN+FONT_HEIGHT+4)/2,
				setting->color[2], TRUE);
		}
		
		drawScr();
	}
	
	if(mountedParty[0][0]!=0) fileXioUmount("pfs0:");
	if(mountedParty[1][0]!=0) fileXioUmount("pfs1:");
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -