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

📄 main.c

📁 索尼公司著名游戏机PS2使用的引导工具文件源代码,这是爱好者自编的工具,可以使用它来引导自己的程序,达到跳过原光驱启动执行自己制作的程序的目的,在windows上可以安装使用ps2的专用开发包,搭建c
💻 C
字号:
#include "launchelf.h"

extern u8 *iomanx_irx;
extern int size_iomanx_irx;
extern u8 *filexio_irx;
extern int size_filexio_irx;
extern u8 *ps2dev9_irx;
extern int size_ps2dev9_irx;
extern u8 *ps2atad_irx;
extern int size_ps2atad_irx;
extern u8 *ps2hdd_irx;
extern int size_ps2hdd_irx;
extern u8 *ps2fs_irx;
extern int size_ps2fs_irx;
extern u8 *poweroff_irx;
extern int size_poweroff_irx;
extern u8 *loader_elf;
extern int size_loader_elf;
extern u8 *ps2netfs_irx;
extern int size_ps2netfs_irx;
extern u8 *iopmod_irx;
extern int size_iopmod_irx;
extern u8 *usbd_irx;
extern int size_usbd_irx;
extern u8 *usb_mass_irx;
extern int size_usb_mass_irx;
extern u8 *cdvd_irx;
extern int size_cdvd_irx;

//#define DEBUG
#ifdef DEBUG
#define dbgprintf(args...) scr_printf(args)
#define dbginit_scr() init_scr()
#else
#define dbgprintf(args...) do { } while(0)
#define dbginit_scr() do { } while(0)
#endif

enum
{
	BUTTON,
	DPAD
};

int trayopen=FALSE;
int selected=0;
int timeout=0;
int mode=BUTTON;
char LaunchElfDir[MAX_PATH], mainMsg[MAX_PATH];

////////////////////////////////////////////////////////////////////////
// 儊僀儞夋柺偺昤夋
int drawMainScreen(void)
{
	int nElfs=0;
	int i;
	int x, y;
	uint64 color;
	char c[MAX_PATH+8], f[MAX_PATH];
	char *p;
	
	strcpy(setting->dirElf[12], "CONFIG");
	
	clrScr(setting->color[0]);
	
	// 榞偺拞
	x = SCREEN_MARGIN + LINE_THICKNESS + FONT_WIDTH;
	y = SCREEN_MARGIN + FONT_HEIGHT*2 + LINE_THICKNESS + 12;
	if(setting->dirElf[0][0]){
		if(mode==BUTTON)	sprintf(c, "TIMEOUT: %d", timeout/SCANRATE);
		else				sprintf(c, "TIMEOUT: ");
		printXY(c, x, y/2, setting->color[3], TRUE);
		y += FONT_HEIGHT*2;
	}
	for(i=0; i<13; i++){
		if(setting->dirElf[i][0]){
			switch(i){
			case 0:
				strcpy(c,"DEFAULT: ");
				break;
			case 1:
				strcpy(c,"     仜: ");
				break;
			case 2:
				strcpy(c,"     亊: ");
				break;
			case 3:
				strcpy(c,"     仩: ");
				break;
			case 4:
				strcpy(c,"     仮: ");
				break;
			case 5:
				strcpy(c,"     L1: ");
				break;
			case 6:
				strcpy(c,"     R1: ");
				break;
			case 7:
				strcpy(c,"     L2: ");
				break;
			case 8:
				strcpy(c,"     R2: ");
				break;
			case 9:
				strcpy(c,"     L3: ");
				break;
			case 10:
				strcpy(c,"     R3: ");
				break;
			case 11:
				strcpy(c,"  START: ");
				break;
			case 12:
				strcpy(c," SELECT: ");
				break;
			}
			if(setting->filename){
				if((p=strrchr(setting->dirElf[i], '/')))
					strcpy(f, p+1);
				else
					strcpy(f, setting->dirElf[i]);
				if((p=strrchr(f, '.')))
					*p = 0;
			}else{
				strcpy(f, setting->dirElf[i]);
			}
			strcat(c, f);
			if(nElfs++==selected && mode==DPAD)
				color = setting->color[2];
			else
				color = setting->color[3];
			printXY(c, x, y/2, color, TRUE);
			y += FONT_HEIGHT;
		}
	}
	
	// 憖嶌愢柧
	x = SCREEN_MARGIN;
	y = SCREEN_HEIGHT-SCREEN_MARGIN-FONT_HEIGHT;
	if(mode==BUTTON)	sprintf(c, "PUSH ANY BUTTON or D-PAD!");
	else				sprintf(c, "仜:OK 亊:Cancel");
	
	setScrTmp(mainMsg, c);
	drawScr();
	
	return nElfs;
}

////////////////////////////////////////////////////////////////////////
// loadModules
void delay(int count)
{
	int i;
	int ret;
	for (i  = 0; i < count; i++) {
	        ret = 0x01000000;
		while(ret--) asm("nop\nnop\nnop\nnop");
	}
}

void initsbv_patches(void)
{
	static int SbvPatchesInited=FALSE;
	
	if(!SbvPatchesInited){
		dbgprintf("Init MrBrown sbv_patches\n");
		sbv_patch_enable_lmb();
		sbv_patch_disable_prefix_check();
		SbvPatchesInited=TRUE;
	}
}

void loadModules(void)
{
	dbgprintf("Loading SIO2MAN\n");
	SifLoadModule("rom0:SIO2MAN", 0, NULL);
	dbgprintf("Loading MCMAN\n");
	SifLoadModule("rom0:MCMAN", 0, NULL);
	dbgprintf("Loading MCSERV\n");
	SifLoadModule("rom0:MCSERV", 0, NULL);
	dbgprintf("Loading PADMAN\n");
	SifLoadModule("rom0:PADMAN", 0, NULL);
}

void loadCdModules(void)
{
	static int loaded=FALSE;
	int ret;
	
	if(!loaded){
		initsbv_patches();
		SifExecModuleBuffer(&cdvd_irx, size_cdvd_irx, 0, NULL, &ret);
		cdInit(CDVD_INIT_INIT);
		CDVD_Init();
		loaded=TRUE;
	}
}

void loadUsbModules(void)
{
	static int loaded=FALSE;
	int ret;
	
	if(!loaded){
		initsbv_patches();
		SifExecModuleBuffer(&usbd_irx, size_usbd_irx, 0, NULL, &ret);
		SifExecModuleBuffer(&usb_mass_irx, size_usb_mass_irx, 0, NULL, &ret);
		delay(3);
		ret = usb_mass_bindRpc();
		loaded=TRUE;
	}
}

void poweroffHandler(int i)
{
	hddPowerOff();
}

void loadHddModules(void)
{
	static int loaded=FALSE;
	int ret;
	int i=0;
	static char hddarg[] = "-o" "\0" "4" "\0" "-n" "\0" "20";
	static char pfsarg[] = "-m" "\0" "4" "\0" "-o" "\0" "10" "\0" "-n" "\0" "40";
	
	if(!loaded){
		drawMsg("Loading HDD Modules...");
		hddPreparePoweroff();
		hddSetUserPoweroffCallback((void *)poweroffHandler,(void *)i);
		
		initsbv_patches();
		SifExecModuleBuffer(&poweroff_irx, size_poweroff_irx, 0, NULL, &ret);
		SifExecModuleBuffer(&iomanx_irx, size_iomanx_irx, 0, NULL, &ret);
		SifExecModuleBuffer(&filexio_irx, size_filexio_irx, 0, NULL, &ret);
		SifExecModuleBuffer(&ps2dev9_irx, size_ps2dev9_irx, 0, NULL, &ret);
		SifExecModuleBuffer(&ps2atad_irx, size_ps2atad_irx, 0, NULL, &ret);
		SifExecModuleBuffer(&ps2hdd_irx, size_ps2hdd_irx, sizeof(hddarg), hddarg, &ret);
		SifExecModuleBuffer(&ps2fs_irx, size_ps2fs_irx, sizeof(pfsarg), pfsarg, &ret);
		SifExecModuleBuffer(&ps2netfs_irx, size_ps2netfs_irx, 0, NULL, &ret);
		loaded = TRUE;
	}
}

////////////////////////////////////////////////////////////////////////
// SYSTEM.CNF偺撉傒庢傝
int ReadCNF(char *direlf)
{
	char *systemcnf;
	int fd;
	int size;
	int n;
	int i;
	
	/*
	loadCdModules();
	CDVD_FlushCache();
	CDVD_DiskReady(0);
	*/
	i = 0x10000;
	while(i--) asm("nop\nnop\nnop\nnop");
	fd = fioOpen("cdrom0:\\SYSTEM.CNF;1",1);
	if(fd>=0) {
		size = fioLseek(fd,0,SEEK_END);
		fioLseek(fd,0,SEEK_SET);
		systemcnf = (char*)malloc(size+1);
		fioRead(fd, systemcnf, size);
		systemcnf[size+1]=0;
		for(n=0; systemcnf[n]!=0; n++){
			if(!strncmp(&systemcnf[n], "BOOT2", 5)) {
				n+=5;
				break;
			}
		}
		while(systemcnf[n]!=0 && systemcnf[n]==' ') n++;
		if(systemcnf[n]!=0 ) n++; // salta '='
		while(systemcnf[n]!=0 && systemcnf[n]==' ') n++;
		if(systemcnf[n]==0){
			free(systemcnf);
			return 0;
		}
		
		for(i=0; systemcnf[n+i]!=0; i++) {
			direlf[i] = systemcnf[n+i];
			if(i>2)
				if(!strncmp(&direlf[i-1], ";1", 2)) {
					direlf[i+1]=0;
					break;
				}
		}
		fioClose(fd);
		free(systemcnf);
		return 1;
	}
	return 0;
}

////////////////////////////////////////////////////////////////////////
// ELF偺僥僗僩偲幚峴
void RunElf(const char *path)
{
	char tmp[MAX_PATH];
	static char fullpath[MAX_PATH];
	static char party[40];
	char *p;
	
	if(path[0]==0) return;
	
	if(!strncmp(path, "hdd0:/", 6)){
		loadHddModules();
		sprintf(party, "hdd0:%s", path+6);
		p = strchr(party, '/');
		sprintf(fullpath, "pfs0:%s", p);
		*p = 0;
	}else if(!strncmp(path, "mc", 2)){
		party[0] = 0;
		if(path[2]==':'){
			strcpy(fullpath, "mc0:");
			strcat(fullpath, path+3);
			if(checkELFheader(fullpath)<0){
				fullpath[2]='1';
				if(checkELFheader(fullpath)<0){
					sprintf(mainMsg, "%s is Not Found.", path);
					return;
				}
			}
		} else {
			strcpy(fullpath, path);
			if(checkELFheader(fullpath)<0){
				sprintf(mainMsg, "%s is Not Found.", path);
				return;
			}
		}
	}else if(!strncmp(path, "mass", 4)){
		loadUsbModules();
		party[0] = 0;
		strcpy(fullpath, "mass:");
		strcat(fullpath, path+6);
		if(checkELFheader(fullpath)<0){
			sprintf(mainMsg, "%s is Not Found.", path);
			return;
		}
	}else if(!stricmp(path, "MISC/PS2Disc")){
		drawMsg("Reading SYSTEM.CNF...");
		strcpy(mainMsg, "Failed");
		party[0]=0;
		trayopen=FALSE;
		if(!ReadCNF(fullpath)) return;
		//strcpy(mainMsg, "Succece!"); return;
	}else if(!stricmp(path, "MISC/FileBrowser")){
		mainMsg[0] = 0;
		tmp[0] = 0;
		LastDir[0] = 0;
		getFilePath(tmp, FALSE);
		if(tmp[0]) RunElf(tmp);
		else return;
	}else if(!stricmp(path, "MISC/PS2Browser")){
		party[0]=0;
		strcpy(fullpath,"rom0:OSDSYS");
	}else if(!strncmp(path, "cdfs", 4)){
		party[0] = 0;
		strcpy(fullpath, path);
		CDVD_FlushCache();
		CDVD_DiskReady(0);
	}else if(!strncmp(path, "rom", 3)){
		party[0] = 0;
		strcpy(fullpath, path);
	}
	
	clrScr(ITO_RGBA(0x00, 0x00, 0x00, 0));
	drawScr();
	clrScr(ITO_RGBA(0x00, 0x00, 0x00, 0));
	drawScr();
	free(setting);
	free(elisaFnt);
	padPortClose(0,0);
	RunLoaderElf(fullpath, party);
}

////////////////////////////////////////////////////////////////////////
// 曽岦僉乕偱慖戰偝傟偨ELF偺幚峴
void RunSelectedElf(void)
{
	int n=0;
	int i;
	
	for(i=0; i<12; i++){
		if(setting->dirElf[i][0] && n++==selected){
			RunElf(setting->dirElf[i]);
			break;
		}
	}
}

////////////////////////////////////////////////////////////////////////
// main
int main(int argc, char *argv[])
{
	char *p;
	int nElfs;
	CdvdDiscType_t cdmode;
	
	SifInitRpc(0);
	loadModules();
	
	strcpy(LaunchElfDir, argv[0]);
	if((p=strrchr(LaunchElfDir, '/'))==NULL)
		p=strrchr(LaunchElfDir, '\\');
	if(p!=NULL) *(p+1)=0;
	LastDir[0] = 0;
	
	setupPad();
	
	mcInit(MC_TYPE_MC);
	loadConfig(mainMsg);
	if(setting->discControl)
		loadCdModules();
	
	setupito();
	
	timeout = (setting->timeout+1)*SCANRATE;
	while(1){
		if(setting->discControl){
			CDVD_Stop();
			cdmode = cdGetDiscType();
			if(cdmode==CDVD_TYPE_NODISK){
				trayopen = TRUE;
				strcpy(mainMsg, "No Disc");
			}else if(cdmode>=0x01 && cdmode<=0x04){
				strcpy(mainMsg, "Detecting Disc");
			}else if(trayopen==TRUE){
				trayopen=FALSE;
				strcpy(mainMsg, "Stop Disc");
			}
		}
		
		timeout--;
		nElfs = drawMainScreen();
		
		waitPadReady(0,0);
		if(readpad()){
			switch(mode){
			case BUTTON:
				if(new_pad & PAD_CIRCLE){
					RunElf(setting->dirElf[1]);
				}else if(new_pad & PAD_CROSS) 
					RunElf(setting->dirElf[2]);
				else if(new_pad & PAD_SQUARE) 
					RunElf(setting->dirElf[3]);
				else if(new_pad & PAD_TRIANGLE) 
					RunElf(setting->dirElf[4]);
				else if(new_pad & PAD_L1) 
					RunElf(setting->dirElf[5]);
				else if(new_pad & PAD_R1) 
					RunElf(setting->dirElf[6]);
				else if(new_pad & PAD_L2) 
					RunElf(setting->dirElf[7]);
				else if(new_pad & PAD_R2) 
					RunElf(setting->dirElf[8]);
				else if(new_pad & PAD_L3)
					RunElf(setting->dirElf[9]);
				else if(new_pad & PAD_R3)
					RunElf(setting->dirElf[10]);
				else if(new_pad & PAD_START)
					RunElf(setting->dirElf[11]);
				else if(new_pad & PAD_SELECT){
					config(mainMsg);
					timeout = (setting->timeout+1)*SCANRATE;
					if(setting->discControl)
						loadCdModules();
				}else if(new_pad & PAD_UP || new_pad & PAD_DOWN){
					selected=0;
					mode=DPAD;
				}
				break;
			
			case DPAD:
				if(new_pad & PAD_UP){
					selected--;
					if(selected<0)
						selected=nElfs-1;
				}else if(new_pad & PAD_DOWN){
					selected++;
					if(selected>=nElfs)
						selected=0;
				}else if(new_pad & PAD_CROSS){
					mode=BUTTON;
					timeout = (setting->timeout+1)*SCANRATE;
				}else if(new_pad & PAD_CIRCLE){
					if(selected==nElfs-1){
						mode=BUTTON;
						config(mainMsg);
						timeout = (setting->timeout+1)*SCANRATE;
						if(setting->discControl)
							loadCdModules();
					}else
						RunSelectedElf();
				}
				break;
			}
		}
		if(timeout/SCANRATE==0 && setting->dirElf[0][0] && mode==BUTTON){
			RunElf(setting->dirElf[0]);
			timeout = (setting->timeout+1)*SCANRATE;
		}
	}
}

⌨️ 快捷键说明

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