Prince of Persia (NES) password generator

You can talk about almost anything that you want to on this board.

Moderator: Moderators

Post Reply
angrylion
Posts: 13
Joined: Thu Jul 24, 2008 3:23 pm
Location: Moscow, Russia

Prince of Persia (NES) password generator

Post by angrylion »

Prince of Persia (NES) password generator for Windows. Source code included. Enjoy and comment...

http://w14.easy-share.com/1701000098.html
User avatar
jargon
B&: This is not your blog
Posts: 208
Joined: Fri Dec 07, 2007 11:40 pm
Location: 480/85260
Contact:

Warning

Post by jargon »

Okay, "PRINCE.EXE" has been verified by Mottzilla as clean.

I will port the PRINCE.C code to PRINCE.JS and link it in a response.

If anyone wants to disassemble that PRINCE.EXE and look it over line by line be my guest. But at first glance PRINCE.C looks 100% bogus. (It actually works fine. Just forgot how C worked, lol.)

-edit-
(Thanks, Mottzilla)

The source does look functional, and does in-fact generate Prince of Persia passwords.

However, I suggest compiling from "PRINCE.C" and running that, rather than *just* running "PRINCE.EXE". (For learning purposes.)
Last edited by jargon on Wed Aug 20, 2008 3:15 am, edited 2 times in total.
Cheers,
Timothy Robert Keal alias jargon

Image
Miser's House Anthology Project
User avatar
jargon
B&: This is not your blog
Posts: 208
Joined: Fri Dec 07, 2007 11:40 pm
Location: 480/85260
Contact:

Re: Prince of Persia (NES) password generator

Post by jargon »

angrylion wrote:Prince of Persia (NES) password generator for Windows. Source code included. Enjoy and comment...

http://w14.easy-share.com/1701000098.html
This is what i now have thus far as JavaScript: (no, it doesn't seem to work due to some glitch on my behalf.)

If anyone can figure out why the following JavaScript I wrote doesn't do anything please post the corrections in this thread. (Firebug says nothing is wrong with it for some reason.)

Code: Select all

<html><head><title>PRINCE OF PERSIA PASSWORD PROGRAM</title></head><body><h1>PRINCE OF PERSIA PASSWORD PROGRAM</h1>
<script type="text/javascript">
var var_Password=new Array();
var_Password[0]=0;	/*$0766 in RAM, when a player enters it*/
var_Password[1]=0;	/*$0767 in RAM, when a player enters it*/
var_Password[2]=0;	/*$0768 in RAM, when a player enters it*/
var_Password[3]=0;	/*$0769 in RAM, when a player enters it*/
var_Password[4]=0;	/*$076A in RAM, when a player enters it*/
var_Password[5]=0;	/*$076B in RAM, when a player enters it*/
var_Password[6]=0;	/*$076C in RAM, when a player enters it*/
var_Password[7]=0;	/*$076D in RAM, when a player enters it*/
var var_Invalidity=0;	/*$0764 in RAM*/
var var_Level=0;		/*$0070 in RAM*/
var var_TimeTens=0;	/*$04C5 in RAM*/
var var_TimeOnes=0;	/*$04C6 in RAM*/
var var_Byte4BF=0;
var var_Byte17=0;
var var_Byte18=0;
var var_a=0;
var var_x=0;
var var_c=0;		/*carry flag*/
/*former char Byte76A is Password[4] now, former char Byte76C is Password[6] now*/

main();

function main()
{
	var var_Choice=prompt('Enter g if you'd like to generate a new password./nEnter a to analyze an existing password./n','');
	/*flushall();*/
	if (var_Choice=='a')
		PasswordChecker();
	if (var_Choice=='g')
		PasswordGenerator();
	if (var_Choice=='s')	/*'level function' is basic when generating a pass*/
		BuildORTable();	/*so here a bit of 'hidden' investigation, which will be useful*/
	/*if I ever decide to rewrite this prog to output all passes possible, not just one*/
	prompt('Press enter to quit./n','');
	/*getch();*/
	return 0;
}

function PasswordChecker()
{
	var var_InputString=new Array();	/*one extra byte needed due to fgets*/
	var_i=0;
	var var_string=prompt('Please enter your password to test:/n','');
	var_InputString(0)=ord(substr(var_string,0,1);)
	var_InputString(1)=ord(substr(var_string,1,1);)
	var_InputString(2)=ord(substr(var_string,2,1);)
	var_InputString(3)=ord(substr(var_string,3,1);)
	var_InputString(4)=ord(substr(var_string,4,1);)
	var_InputString(5)=ord(substr(var_string,5,1);)
	var_InputString(6)=ord(substr(var_string,6,1);)
	var_InputString(7)=ord(substr(var_string,7,1);)
	for(var_i=0;var_i<8;var_i++)
	{
		if((var_InputString[var_i]>57)||(var_InputString[var_i]<48))
		{
			document.write('This string contains non-digits.<br>');
			return;
		}
		else
			var_Password[var_i]=var_InputString[var_i]-48;	/*ascii to digit*/
	}
	sub_BB4F(var_Password);
	if (var_Invalidity==1)
	{
		document.write('This password is invalid.<br>');
		return;
	}
	document.write('Level: '+var_Level);
	document.write(' Time: '+TimeTens+''+TimeOnes);
	if (var_Level==15)
	document.write('Level 15 doesn't exist. So-called level 15 passwords are programming mistakes and cause system hang.<br>');
	if (var_Level==16)
	document.write('Level 16 doesn't exist. So-called level 16 passwords are programming mistakes and lead you to a buggy screen where Prince can't move.<br>');
	return;
}

function sub_BB4F(var_Password)	/*var_BB4F*/
{
	var_a=0;
	var_x=0;
	while(var_x<8)
	{
		var_a=var_a+var_Password[var_x];
		var_x++;
	}
	if(var_a==0)
	{
		var_Invalidity=1;	/*var_BBC0*/
		return;
	}
	var_Byte17=var_Password[4];	/*var_BB63*/
	var_Byte18=var_Password[6];
	var_Password[4]=0;
	var_Password[6]=0;
	sub_BB21();	/*var_BB72,calculates and writes 1st checksum to Password[4], 2nd checksum to Password[6]*/
	if (var_Password[4]!=var_Byte17)
	{
		var_Invalidity=1;
		return;
	}
	if (var_Password[6]!=var_Byte18)	/*var_BB7C*/
	{
		var_Invalidity=1;
		return;
	}
	var_Invalidity=0;//var_BB85
	var_a=var_Password[7];
	sub_BBEA();
	var_a=var_a&3;	/*var_BB8E*/
	var_a=var_a*4;
	var_Password[7]=var_a;
	var_a=var_Password[1];
	sub_BBE0();	/*var_BB98*/
	var_a=var_a|var_Password[7];
	var_Level=var_a+1;	/*+1 is my insertion*/
	/*if (Level!=1)//I chose to omit this var_BBA2-var_BBA4 code b/c it's unknown what byte at var_06EE means*/
	var_a=var_Password[0];
	sub_BBE0();	/*var_BBAA*/
	var_TimeTens=var_a;
	var_a=var_Password[3];
	sub_BBEA();
	var_TimeOnes=var_a;
	return;	/*var_BBBF*/
}

function SEC_SBC_6502(var_operand)
{
	var_c=1;
	if((var_a-var_operand)>=0)
		var_a=var_a-var_operand;
	else
	{
		var_a=var_a-var_operand+256;
		var_c=0;
	};
}

function ADC_6502_simplified(var_operand)
{
	if((var_a+var_operand)<256)
	var_a=var_a+var_operand;
	else var_a=var_a+var_operand-256;
}

function sub_BB21()
{
	var_x=0;
BB23:
	var_a=var_Password[4];
	var_a=var_a+var_Password[var_x];
	if(var_a<10)
	{
BB46:
	var_Password[4]=var_a;	/*var_BB46*/
		var_x++;
		if (var_x!=8)
		goto BB23;
		else return;	/*var_BB4E*/
	}
	else
	/*var_BB2E*/
	{
		Byte4BF=a;
		a=Password[6];
		a++;//we came here b/c c=1
		if (a<10)
		goto BB3D;
		else
		SEC_SBC_6502(10);//can we get here? I doubt...
BB3D:	var_Password[6]=a;
		a=Byte4BF;
		SEC_SBC_6502(10);//var_BB44, no danger of negative result
		goto BB46;
	}
}

function sub_BBE0()
{
	SEC_SBC_6502(var_Password[2]);
	if (var_c==1)
		return;
	ADC_6502_simplified(10);
	return;
}

function sub_BBEA()
{
	SEC_SBC_6502(var_Password[5]);
	if(var_c==1)
		return;
	ADC_6502_simplified(10);
	return;
}

function PasswordGenerator()
{
	var var_DesiredLevel=0;
	var var_DesiredTimeTens=0;
	var var_DesiredTimeOnes=0;
	var_GeneratedPass=new Array();
	var_GeneratedPass[0]=0;
	var_GeneratedPass[1]=0;
	var_GeneratedPass[2]=0;
	var_GeneratedPass[3]=0;
	var_GeneratedPass[4]=0;
	var_GeneratedPass[5]=0;
	var_GeneratedPass[6]=0;
	var_GeneratedPass[7]=0;
	var_InputLevel=new Array();
	var_InputLevel[0]=0;	/*one extra char needed b/c of fgets*/
	var_InputLevel[1]=0;	/*one extra char needed b/c of fgets*/
	var_InputLevel[2]=0;	/*one extra char needed b/c of fgets*/
	var_InputTime=new Array();
	var_InputTime[0]=0;
	var_InputTime[1]=0;
	var_InputTime[2]=0;
	var_i=0;
	var var_level=prompt('Enter a desired level: ','');
	var_InputLevel[0]=ord(substr(var_level,0,1));
	var_InputLevel[1]=ord(substr(var_level,1,1));
	var var_time=('Enter remaining time: ','');
	var_InputTime[0]=ord(substr(var_time,0,1));
	var_InputTime[1]=ord(substr(var_time,1,1));
	if((var_InputLevel[0]==32)||(var_InputLevel[0]==10))/*our defence against user's folly comes first*/
		var_InputLevel[0]=48;
	if((var_InputTime[0]==32)||(var_InputTime[0]==10))
		var_InputTime[0]=48;
	if((var_InputLevel[1]==32)||(var_InputLevel[1]==10))
	{
		var_InputLevel[1]=var_InputLevel[0];
		var_InputLevel[0]=48;
	}
	if((var_InputTime[1]==32)||(var_InputTime[1]==10))
	{
		var_InputTime[1]=var_InputTime[0];
		var_InputTime[0]=48;
	}
	for(var_i=0;var_i<2;var_i++)/*then comes a real check*/
	{
		if ((var_InputLevel[var_i]>57)||(var_InputLevel[var_i]<48)||(var_InputTime[var_i]>57)||(var_InputTime[var_i]<48))
		{
			document.write('Your data contains non-digits.<br>');
			return;
		}
	};
	if((atoi(var_InputLevel)>0)&&(atoi(var_InputLevel)<15))
	var_DesiredLevel=atoi(var_InputLevel);
	else
	{
		document.write('Your level is out of 1-14 range.<br>');
		return;
	};
	var_DesiredTimeTens=var_InputTime[0]-48;	/*0 mins is also possible:11111112*/
	var_DesiredTimeOnes=var_InputTime[1]-48;	/*99 mins is also possible:99097030*/
	var_SimplifiedLevelGenerator(var_GeneratedPass, var_DesiredLevel);
	var_GeneratedPass[0]=var_DesiredTimeTens;
	var_GeneratedPass[3]=var_DesiredTimeOnes;	/*now 6 digits are filled*/
	for(var_i=0;var_i<8;var_i++)
		var_Password[var_i]=var_GeneratedPass[var_i];
	var_Password[4]=0;
	var_Password[6]=0;
	sub_BB21();	/*calculates checksums for us*/
	var_GeneratedPass[4]=var_Password[4];
	var_GeneratedPass[6]=var_Password[6];	/*now all 8 digits are stored*/
	for(var_i=0;var_i<8;var_i++)	/*let's check our password*/
	var_Password[var_i]=var_GeneratedPass[var_i];
	sub_BB4F(var_Password);
	if(var_Invalidity==1)
	{
		document.write('This passgen miserably failed due to bugs.<br>');
		return;
	}
	document.write('Your password is generated and confirmed to be correct: <br>');
	for(var_i=0;var_i<8;var_i++)
	{
		document.write(var_GeneratedPass[var_i]);
	}
	document.write('<br>');
	return;
}

function BuildORTable()
{
	/*our goal's to find all n2res/n8res combos for the given level*/
	var_x=0;
	var_y=0;
	var var_current_result=0;
	var var_n2results=new Array();
	var_n2results[0]=0;	/*SBC(N2-N3)*/
	var_n2results[1]=1;
	var_n2results[2]=2;
	var_n2results[3]=3;
	var_n2results[4]=4;
	var_n2results[5]=5;
	var_n2results[6]=6;
	var_n2results[7]=7;
	var_n2results[8]=8;
	var_n2results[9]=9;
	var_n8results[0]=0;
	var_n8results[1]=4;
	var_n8results[2]=8;
	var_n8results[3]=12;
	for(var_x=0;var_x<10;var_x++)
	{
		for(var_y=0;var_y<4;var_y++)
		{
			var_current_result=var_n2result[var_x]|var_n8result[var_y];
			if(var_current_result<14)
			document.write(var_current_result+1)+': '+var_n2result[var_x]+' '+var_n8result[var_y])+'<br>');
		}
	}
	document.write('Now smaller results: <br>');
	for(var_x=0;var_x<10;var_x++)
	/*seek what sBC(N8-N6) should amount to*/
	{
		for(var_y=0;var_y<4;var_y++)
		{
			var_current_result=(var_x&3)*var_4;
			if(var_current_result==var_n8result[var_y])
			document.write(var_n2result[var_y].': '.var_x.'<br>');
		}
	}
	return 0;
}

function BuildParticularLevelsArray(var_DesiredLevel)
{
	return 0;
}

function SimplifiedLevelGenerator(var_PassToFill,var_Level)//finds just one 2nd,3rd,6th,8th digit combo
{
	var_x=0;
	var_y=0;
	var var_n2result=0;
	var var_n8result=0;
	var var_current_result=0;
	var var_n2results=new Array();
	var_n2results[0]=0;	/*SBC(N2-N3)*/
	var_n2results[1]=1;
	var_n2results[2]=2;
	var_n2results[3]=3;
	var_n2results[4]=4;
	var_n2results[5]=5;
	var_n2results[6]=6;
	var_n2results[7]=7;
	var_n2results[8]=8;
	var_n2results[9]=9;
	var_n8results[0]=0;
	var_n8results[1]=4;
	var_n8results[2]=8;
	var_n8results[3]=12;
	var var_n8minorresult=0;	//SBC(N8-N6)
	for(var_x=0;var_x<10;var_x++)
	{
		for(var_y=0;var_y<4;var_y++)
		{
			var_current_result=var_n2results[var_x]|var_n8results[var_y];
			if(var_current_result==(var_Level-1))
			/*level x is internally stored in x-1 presentation*/
			{
				var_n2result=var_n2results[var_x];
				var_n8result=var_n8results[var_y];
				break;
			};
		}
	}
	for(var_x=0;var_x<10;var_x++)
	{
		if ((var_x&3)*4==var_n8result)
		{
			var_n8minorresult=var_x;
			break;
		}
	}
	var_PassToFill[2]=0;
	var_PassToFill[1]=var_n2result;
	var_PassToFill[5]=0;
	var_PassToFill[7]=var_n8minorresult;
}
function getinput(var_box,var_default){
	return prompt(var_box, var_default);	
}
function atoi(var_string){
	return ParseInt(var_string);
}
function ord(var_string ) {
    return var_string.charCodeAt(0);
}
</script>
</body></html>
Last edited by jargon on Wed Aug 20, 2008 3:12 am, edited 1 time in total.
Cheers,
Timothy Robert Keal alias jargon

Image
Miser's House Anthology Project
User avatar
jargon
B&: This is not your blog
Posts: 208
Joined: Fri Dec 07, 2007 11:40 pm
Location: 480/85260
Contact:

Post by jargon »

If someone with more experience with JavaScript wants to fix the js version i made of angrylion's "Prince of Persia" password generator; be my guest. Firebug isn't reporting any errors.
Cheers,
Timothy Robert Keal alias jargon

Image
Miser's House Anthology Project
User avatar
MottZilla
Posts: 2835
Joined: Wed Dec 06, 2006 8:18 pm

Post by MottZilla »

Nice job angrylion. You can all ignore you know who, there is nothing "fishy" with the password generator.
Post Reply