/* This program is copyright Ian Molton (c) 2003
 * You may NOT redistribute it without permission
 * You may NOT remove this header under any circumstances
 */

#include <stdio.h>

int main(void){
	long table[] = {0x90000000, 0xa0000000, 0x00000001, 0x90100000, 0x00000000, 0x00000004, 0x90500000, 0xa0500000, 0x0000003b, 0x80000000, 0xa0100000, 0x00000004, 0x80400000, 0x00400000, 0x0000001c, 0x88400000, 0x40000000, 0x00000014, 0x88200000, 0x48000000, 0x00000001, 0x88300000, 0x44000000, 0x00000001, 0x8b500000, 0x20000000, 0x00000001, 0x8b400000, 0x28000000, 0x00000001, 0x98000000, 0x2c000000, 0x00000040, 0x8b700000, 0x30000000, 0x00000001, 0x8b600000, 0x38000000, 0x00000001, 0x9c000000, 0x3c000000, 0x00000040, 0x8c000000, 0x0c000000, 0x00000010, 0, 0, 0};
	
	long out_addr = 0xa003c000;

	long i, val, out;
	long *ptr;
	long mask;
	long a, b, c;
	long pass;
	long mmapping[4096];

	val = 0x402;
	out = out_addr;

	for(i = 0 ; i < 4096 ; i++){
		mmapping[i] = val;
		out+=4;
		val += 0x100000;
	}

	out = out_addr + 8192;

	pass = 0;
	mask = 0x40e;

	do{
		ptr = (long *)&table;

		do{
			a = *ptr++;
			b = *ptr++;
			c = *ptr++;
			if(c == 0) goto out;
			a = a & 0x1ff00000;
			b = b & 0xfff00000;
			a = out + (a>>18);
			mask += b;
			do{
			//	printf("%08x %08x\n", (unsigned int)(a-out_addr)>>2, (unsigned int)mask);
				mmapping[(a-out_addr)>>2] = mask;
				a += 4;
				mask += 0x100000;
				c -= 1;
			}while(c != 0);
			mask &= 0x000fffff;
		}while(1);
out:
		pass++;
		mask &= 0xfffffff3;
		out += 2048;
	}while(pass < 2);

	for(i = 0 ; i < 4096 ; i++)
		printf("%03x00000  %08x   (%03x)\n", (unsigned int)i, (unsigned int)mmapping[i] & 0xfffff000, (unsigned int)mmapping[i] & 0xfff);


	return 0;
}
	
