unsigned short code68K[] = {0x4E71,0xFC1E,0x4E75};

volatile unsigned long	vector	:	0x68FFF994;
static volatile unsigned long	data = 0;

void main(void);
void MySuperModeCode(void);
void Setup(void);
void PatchMe(void);

void main(void)
{
	unsigned long	oldVector = vector;	
	
	if(data != 0)
		return;
	
	Setup();
	MakeDataExecutable((void*)((unsigned long*)PatchMe)[0],8);
	vector = ((unsigned long*)MySuperModeCode)[0];
	CallUniversalProc((UniversalProcPtr)code68K,kPascalStackBased);
	vector = oldVector;
}

asm void Setup(void)
{
	lwz	r3,PatchMe(RTOC);
	lwz	r3,0(r3);
	
	sth		RTOC,10(r3);
	rlwinm	r4,RTOC,32-16,16,31;
	sth		r4,6(r3);
	
	blr;
}

asm void MySuperModeCode(void)
{
	lis		r3,'Ga';
	ori		r3,r3,'ry';
	
	lis		r4,0x0505;
	ori		r4,r4,0x1956;
	
	li		r5,-0x3FF0;
	xoris	r5,r5,0xFFFF;
	
	li		r7,0;
	
	twi		31,r31,2;

entry static	PatchMe
	mr		r0,RTOC;
	lis		RTOC,0;
	ori		RTOC,RTOC,0;
	
	mfspr	r3,287;
	stw		r3,data(RTOC);
	
	mfmsr	r5;
	ori		r5,r5,0xC010
	mtmsr	r5;
	isync;
	
	mr		RTOC,r0;
	
	ori		r3,r30,0x6084;
	mtctr	r3;
	bctr;
}
