/*
 * Copyright(C) Paul und Scherer (mct.de/mct.net)
 *
 * This example demonstrates how to...
 *
 *  ... use the TPU in emulation mode.
 */

#include <string.h>
#include <target.h>

#define MASK_A					/* select mask A or G */

static long const mask[] = {			/* the mask */

#ifdef MASK_A

 /*
  * Mask A
  */
 0x3ffffffe,0x7ffffefe,0x231fffff,0xe31e21ff,0xe31e41ff,0xe31e61ff,0xe31e81ff,0xe31ea1ff,
 0xe31ec1ff,0xe31ee1ff,0x60f9fed7,0xbfffffc8,0x3e7ff80e,0xd212ffff,0x3c7ff80b,0xae12feff,
 0x3c7ff80b,0xbe14f2cf,0x101ff013,0x425cf5c7,0x167e400f,0x307cf80f,0xa619feff,0x1ffff003,
 0xa228feff,0x035ff007,0x9029ffff,0x20dfd007,0x7ff9ffff,0x22dc0fff,0x8400feff,0x3edff007,
 0x3efff00f,0x9a00ffff,0x7fffffd3,0x3ffff817,0xb026ffff,0x7fffffd6,0xc402f000,0x3ffff816,
 0x902ffec7,0x1e7ff013,0x60dddfc7,0xd0247013,0xa02ffeff,0x3c7ff80b,0x4258f5c6,0x7ffdfffe,
 0xbfffffd8,0x3c7ff817,0x7ff9feca,0x7ffffffa,0x387ffddb,0x3a7ffddf,0xac33ffff,0xbfffffc0,
 0xcfff5007,0x1ffff80b,0x1ffffa03,0x565c3fff,0x3cfff012,0x16fffa03,0x023ff003,0x9a44fed3,
 0x1ffff00f,0x1ffff80f,0x1ffffa03,0x565dffff,0x3ffff813,0x227fffff,0x1e7ff203,0xff5e0fff,
 0x366a3ffd,0xdfffe807,0x161de013,0x804df6ff,0xc030f003,0x30fef013,0x505dffd2,0xbffffff9,
 0x1ffff007,0x3ffff003,0x7ff9fed2,0x988dfffc,0x785fffdf,0x1ffff80b,0x161c0013,0x9452ffff,
 0x845cfec7,0x035fd00b,0xc25ef80f,0x703fdfcf,0x035fe80b,0x163fe00f,0x101ff017,0x22fe7fff,
 0x17fc0017,0x8467ffff,0x027fe013,0x009cc813,0x846efeff,0xd26effff,0x20dfdfff,0x1ffff013,
 0x209defff,0x846dfeff,0x17fc4813,0x846efeff,0xc055f00f,0x00dfe813,0x249ff013,0x375fffff,
 0x347ff80b,0x223fffff,0xe67e2bff,0x167fd203,0x1e1ffa03,0x321e3ffd,0x36fe4fff,0x1c1e3017,
 0x20c63fff,0x20c63fff,0x9e7dfeff,0x3f5fffff,0x3f5fdfff,0x055df803,0x9481f5ff,0xd284ffff,
 0x3675ffff,0x3665ffff,0x9084feff,0x367fdfff,0x8c86feff,0x7ffff3ff,0x35fdffff,0x9489feff,
 0x1ffff807,0x269c0803,0x5259feff,0xe73e21ff,0x947dfeff,0x7ffffefe,0x7ffffffb,0x1ffff817,
 0x1ffff013,0x7a19fedf,0x21fc4807,0x8ca55084,0xb096ffff,0x36ffffff,0x405dcfce,0xb09950c7,
 0x988efeff,0x1a1fd817,0x003ff013,0x3ffff807,0x347ff00f,0x98a5ffff,0x7ffffffb,0x21fccfff,
 0x8495ffdf,0x33fccfff,0x90a5fec7,0x8ea6ffff,0x3a5ff00f,0x205ff00f,0x5ffdffd6,0x98aff4cf,
 0xd0abffff,0x7ffff3ff,0x98adfecf,0x29ffffff,0x5c5dcfd6,0xb0afffff,0x3c7ff80b,0xd4dfffff,
 0x31e5cfff,0x84b44fd7,0x7c7e3fc7,0x565dc1de,0x5c5c3fce,0xb0b954c7,0x69fffffb,0x3c7ff80b,
 0xc0b0f007,0x9aa5f1ff,0x007ff007,0x7a1fdffb,0x21fcc00f,0x949ffeff,0xd4dfffff,0xd0ccffff,
 0x1a1ff013,0x01fc6817,0xacc4feff,0x3ffff806,0x8c00ffff,0xbea550c7,0x3ffff807,0xac00feff,
 0xb0d6feff,0x3ffff007,0xa4ccfeff,0x9cb5ffff,0x181ff80b,0x323ecfff,0x35fc0fff,0x90d14fd7,
 0x585df5ce,0x363e3fff,0x33fc8fff,0x8cd5fec7,0x545df5ce,0x545dc1de,0x1a1ff013,0x007ff017,
 0x21fc4007,0x8ca550c7,0x21fcc00f,0x94beffd7,0x8c95ffdf,0x5a5dffd6,0xbc00fef9,0x023ff003,
 0x227fffff,0x1e1ffa03,0xff5e0fff,0x320afffd,0xdbffffff,0x32e7ffff,0x3e67d80b,0x3e1fcfff,
 0xbf14fef8,0x7ef9eeff,0xa4f4feff,0xe1fc03ff,0x94eeffff,0x20dfd00b,0xa0f4ffff,0x9af2feff,
 0x200dffff,0x320dffff,0x950bfeff,0x5c5dcffe,0x001ff803,0x3edff00b,0x3cfff003,0x7c22cfff,
 0x98fafeff,0x3209ffff,0xf20801d7,0x327ff813,0x347ff817,0x1ffff00f,0x1adc05fb,0x20dfd5fb,
 0x8711feff,0x33fdffff,0x950bfeff,0x1e1ff00f,0xff5e0fff,0x223fffff,0x320afffd,0x3225ffff,
 0x8d0bffff,0x910bffff,0x5c5cbfce,0x1e1fc5fb,0x31fdffff,0x8d13feff,0xa0f3feff,0xd113ffff,
 0x3c7ff803,0x3e1fffff,0x3e7ff80b,0x5c5dcfff,0xfe3fffff,0x7217dfd7,0x20fe75fb,0x73bebfc2,
 0xad1cffc7,0xa51efeff,0xa133ffff,0x565dcffe,0xa533feff,0xa122feff,0x1ffff5fb,0x20dfd5fb,
 0xaf10ffff,0x7ffbffff,0x1ffff007,0x3adc0fff,0x9527ffff,0xc311f5fb,0x365fffff,0x023fe00b,
 0xb32cfeff,0x23fdffff,0x229fd00b,0x23fc8fff,0x8530ffff,0x3e9ff00b,0x3edfe5fb,0x3fbfefff,
 0xad32feff,0x7fffffdf,0x565dcffa,0x3dfccfff,0xc2f4f00b,0x8cebffff,0x035ff80f,0x367fd80f,
 0x1ffff80f,0x163ff80b,0x37fc8fff,0x853effff,0x3c7ff817,0x7ffbfffe,0xaf41feff,0x3c7ff813,
 0xd402fffc,0x207fffff,0x1ffff203,0x229fd203,0xb349feff,0x7ffff1fb,0x1ffff003,0x3e7ff80f,
 0xbffffff8,0x7ff9fefe,0xe1e401c7,0x8f4efef8,0x7859feff,0x7a59feff,0x3c7ff807,0xd551ffff,
 0x525cb5fa,0x163ff00b,0x101df80f,0x8758ffff,0x36feb013,0x37fc4fff,0x8559ffff,0xd9ff1fff,
 0x545cf18a,0x545cf14a,0xa54effff,0xd14fffff,0xa55ffeff,0x9d5ffeff,0x3c7ff807,0xd551ffff,
 0x545cf3fa,0x505df3fe,0xad69ffff,0xbfff0ffc,0x585fffff,0xffffffff,0xb169fec3,0xcfff300b,
 0x5c5e31ff,0xb76dffff,0x1ffff007,0x70e9fefb,0x3ffff006,0x70e9fefb,0x30ffc006,0xbd6b40bf,
 0xbd6d407f,0xe1e401c7,0x8f75fed0,0x7859ffff,0x3a5fffff,0xb387feff,0x1ffff00f,0xcfff3013,
 0x3c7ff803,0x307fffff,0x027ff203,0x101ffa03,0x3ffff817,0x163ff00b,0x121e300f,0x525c34cb,
 0x347e3806,0x9c00feff,0xcfffe817,0xb600ffff,0x36fe3007,0x505df3d6,0x7ffffedf,0x3c7ff803,
 0x107ef00b,0x5c5c35c3,0xad8efeff,0x1ffff013,0x235fffff,0xd402fffc,0x3ffff806,0x7ffffede,
 0x9996feff,0x1ffff013,0x007ff017,0xcfffea03,0x167e300f,0x367e3807,0x565df3d6,0xbfff07fc,
 0x6739feff,0x3effc00f,0xb59cffff,0x3efff00f,0x387ff80a,0x6739ffff,0x103df813,0xb7a2feff,
 0x10ffca03,0x35fdcfff,0x8c01feff,0x303cf00f,0x1cfff817,0xb3a8feff,0x367fd203,0x35fdcfff,
 0x8fabfeff,0x1ffff203,0x30ffd202,0x30ffe202,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
 0xf801f801,0xe99ce997,0x619d619d,0x619d619d,0xf801f801,0xf801f801,0xf801f801,0xf801f801,
 0xf800f800,0x01716181,0x39903996,0x71879178,0x918f6182,0x918f6182,0x91926182,0x71869178,
 0x31703170,0x316f1162,0x316b4168,0x316d4168,0x10011001,0x10011001,0x316b4168,0x316d4168,
 0x295c295a,0x014af800,0x9161f95e,0x314e314e,0xf801f801,0xf801f801,0xf801f801,0xf801f801,
 0x11471147,0xf800f800,0x31363136,0x31363136,0xf801f801,0xf801f801,0x31363136,0x31363136,
 0x10e610e6,0xf800f800,0x50ea1918,0x50ea1918,0xf801f801,0xf801f801,0xf801f801,0xf801f801,
 0x80c0a0c7,0xe88f10de,0x70a97097,0x70a770b5,0xf801f801,0xf801f801,0xf801f801,0xf801f801,
 0x108d108d,0x104f6053,0x905c9059,0x905c9059,0x108d108d,0x108d108d,0x108d108d,0x108d108d,
 0x00340034,0x10001030,0x1031384a,0x1031384a,0x1001483d,0x1001483d,0x1001483d,0x1001483d,
 0x10001000,0x100a1000,0x400f802c,0x400d802c,0x10011001,0x10011001,0x400f802c,0x400d802c

#else	/* #ifdef MASK_A */

 /*
  * Mask G
  */
 0x3ffffffe,0x7ffffefe,0xac04ffc0,0x7fffffcf,0x7ff9fefe,0xac1fffff,0xa40dffff,0x673bffff,
 0xffffffff,0xb400feff,0xd02fffff,0xa40dffff,0x7ffbffff,0x1cfe080f,0x367c380f,0x9014feff,
 0x1ffff013,0x30fdd013,0x8c14feff,0x7ffffffb,0xa41dffff,0x1ffff007,0x20dfd007,0x22dc0fff,
 0x841dfeff,0x3edff007,0x3ffff817,0x7ffffffb,0x3efff00f,0x3cfff00b,0x5c5dcffe,0xa436ffff,
 0x7ffbffff,0xd01d3fff,0xac0bffff,0xa436ffff,0x673bffff,0xb000ffff,0xb400feff,0xd01d1fff,
 0xb400ffff,0xd01d1fff,0xac1fffff,0xa40dffff,0x673bffff,0xffffffff,0xb400ffff,0xd00d3fff,
 0xac0bffff,0xa436ffff,0x673bffff,0xb000feff,0xd028ffff,0x7ffbfffe,0x7ffdfefe,0xbfff417f,
 0x00cdf003,0x903bffdf,0x5859ffd7,0x943dffc7,0x7ff9feca,0x11edf007,0x92424eff,0x181ff80b,
 0x3a1fffff,0xbfff7fff,0xe6de09ff,0x362df007,0x1c5eb003,0x9248f3fc,0x226dffff,0x7ffff5ff,
 0x984dffff,0x3667ffff,0x924dfeff,0x145e7203,0x345e3fff,0x5ff9fefa,0xbc3840bf,0x002ff007,
 0x200fffff,0x15fc480b,0x8459ffff,0xe07e05ff,0x16dffa03,0x280cf007,0x9058feff,0x5c5873fe,
 0x5c5875fe,0xae55ffff,0xe6de09ff,0xb25efeff,0x229defff,0x9455feff,0x3cfff007,0x7ff9ffc2,
 0xbc6740bd,0xbc67407d,0x9c01ffcc,0x185ff807,0x31fccfff,0x8cbcffd7,0x9472fedf,0x7ff9fec2,
 0x9a6bffff,0x307fd807,0x307fe807,0x1ffff00b,0x01fdf003,0x9464ffff,0x31fccfff,0x8cbcffff,
 0x9472feff,0x98bcfeff,0x9a80feff,0x101ff00b,0x203edfff,0x15fc480f,0x947dffff,0x8c80feff,
 0x227fffff,0x21fccfff,0x8681ffff,0x20dfd00b,0xc0a2f80f,0x360dffff,0x9081feff,0xd0a8ffff,
 0x20dfe00b,0x00dde813,0x869fffff,0x160df80f,0xe07e3fff,0xb296feff,0xe63fe1ff,0x928ffeff,
 0xe1fde7ff,0x8e94ffc7,0xe1fdcfff,0x8e94ffff,0xe07e47ff,0xe1fdb7ff,0xe07e4fff,0x8c94ffff,
 0x9e97ffff,0xe07fa7ff,0xd297ffff,0xe07f77ff,0xe7fc61ff,0x9497ffff,0x367ebfff,0x17edf203,
 0x929bffcf,0x223fffff,0x203fffff,0x32ffffff,0xff5e0fff,0x1e1ff80f,0x320a3ffd,0x36efffff,
 0x33fc0fff,0x90a7feff,0x160df00b,0x92a8feff,0x327e580f,0xd2a8ffff,0x20dfe00b,0x30e7f00f,
 0x1c1e7813,0x362dffff,0x1f47d017,0x90adfeff,0x2547ffff,0x9ab2ffff,0x3075f817,0x3065f817,
 0x90b2feff,0x367fd817,0x8eb5f4ff,0x255defff,0x7ffff3ff,0x5259feff,0xe73e21ff,0x9401ffff,
 0xaeb2feff,0x3675ffff,0xd2b2ffff,0x3675ffff,0x9a80ffff,0x103fd00b,0x201fffff,0xd275ffff,
 0x361e4fff,0xbfffffc8,0x7ffbfeff,0x7ffdfffe,0xa4c9feff,0x3ffff013,0x08fff80f,0x5c5cfffb,
 0xb0cbfefd,0xa0cbfefc,0x70fbdfff,0x3ffff016,0xa4c3ffff,0x3e7ff817,0x5c583fc6,0xbfff05c4,
 0x7ff9fed6,0xbfff4144,0x58583eda,0x9aeffeff,0x3efff003,0x5c58feff,0x1ffff00b,0x11fdf80f,
 0x8c01ffff,0x7ffff5cb,0x367fd813,0x30ffc017,0x3ffff00a,0x1c5ef013,0x9af4feff,0x30fde013,
 0x8ceeffff,0x94e9ffff,0x1ffff017,0x1ffff803,0x30edf017,0x90e7ffff,0x5ff9f4fe,0x367fd803,
 0x5ff9f2fe,0xaceefeff,0xb2e4feff,0x1ffff003,0xd2e4ffff,0x30ffdfff,0x5ff9f2c6,0x1c5ef00f,
 0xacf2feff,0x30ffdfff,0x366ff013,0x5c58f0ce,0x8efcffff,0x1e1ff817,0xb6f9ffff,0x5669feff,
 0x3ffff816,0x367fc817,0x1ffff803,0x367fd802,0xb4feffff,0x3e0fcfff,0xad05feff,0x1667f003,
 0xb102feff,0x30ffdfff,0x31edffff,0x9105feff,0x321fcfff,0x1ffff00f,0x655805c7,0x366ffffd,
 0x367e780b,0x7ffffffa,0x231fffff,0xe31e21ff,0xe31e41ff,0xe31e61ff,0xe31e81ff,0xe31ea1ff,
 0xe31ec1ff,0xe31ee1ff,0x035ff80f,0x367fd80f,0x007ff00f,0x103ff00b,0x9f19ffff,0x11fc8a03,
 0x3c7fffff,0x851bffff,0xd124f817,0xaf1efeff,0x3ffff813,0xc50af004,0xb323ffff,0x7ffffffb,
 0xbd24f0ff,0xbd23fec0,0xbfffffc8,0x3e7ff80f,0x7ff9fefe,0x035ff007,0xbf3ffeff,0x385fffff,
 0x16fffa03,0x035ff00b,0x103ef817,0x143cc013,0x8f34feff,0x101ec007,0x20dde007,0x8d31feff,
 0x22dfe007,0xd54bffff,0xd33ef813,0x367e4817,0x35fc4fff,0x813effff,0x201fdfff,0x22dc4007,
 0x953affff,0x32dff007,0xd54bffff,0x1ffff813,0x3ffff817,0x367e7813,0xad41fefc,0xb141fecd,
 0x7fffffc7,0xc74bf80f,0x1c3ef007,0x30edffff,0x934743ff,0x255defff,0xbfff45ff,0x5459ffff,
 0x9743feff,0xe73e21ff,0x7ffffefa,0xe06611ff,0x267effff,0xcbfff203,0x021ff817,0xbd5106c4,
 0xbfff07cc,0x6739feff,0x3effc017,0xb555ffff,0x3efff017,0xad57feff,0xe73fe1ff,0xb159feff,
 0xe73fe1ff,0x1e27d00f,0xc55ff817,0xc55ff817,0x9d5efeff,0xc55ff817,0x371ff202,0x17fdf813,
 0x8d62feff,0x30febfff,0x3427ffff,0xdbffffff,0xe73e21ff,0xbf68464c,0x185ff007,0x09fff007,
 0x3c7ffa03,0x20dfd007,0x22dc0fff,0x9780feff,0x107ff003,0xd182f807,0xbd7046bc,0xbfff477c,
 0xaf80ffc7,0x1e5ff203,0x105ff003,0x101ff00f,0x023ff80f,0xb380feff,0x1c5e7203,0x367fdfff,
 0x303c8203,0x32ee8fff,0x8f7efeff,0x307ebfff,0x32efffff,0x307fffff,0xb581ffff,0x3c7ef807,
 0x5c583efe,0x3c7ef80b,0x5c583efa,0xbfff07c4,0x6739feff,0x3effc00f,0xb588ffff,0x3efff00f,
 0x387ff80a,0x6739ffff,0x103df813,0xb78efeff,0x10ffca03,0x35fdcfff,0x8c01feff,0x303cf00f,
 0x1cfff817,0xb399ffff,0x367fd203,0xb799feff,0x35fdcfff,0xad99feff,0xe73e21cf,0xe73fe1ff,
 0xbd99f2fd,0x8fa8fedf,0x1e1fd203,0x30fe4203,0x7fffffd6,0x7e03dfff,0xafa5ffff,0x063ff817,
 0x9ba3f6ff,0xe73e21c7,0x30ffcfff,0x353ff00f,0xbfa5fefc,0x367fdfff,0x9b9bfeff,0x1207f203,
 0x30fe7202,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
 0xfe01fe01,0xef88ef83,0x6189619d,0x6189619d,0xfe01fe01,0xfe01fe01,0xfe01fe01,0xfe01fe01,
 0xa96ea96e,0x896f8965,0xa970a967,0x89708967,0xee01ee01,0xee01ee01,0xa970a967,0x89708967,
 0xfe01fe01,0xef4fef50,0xef51ef51,0xef51ef51,0xfe01fe01,0xfe01fe01,0xef51ef51,0xef51ef51,
 0xee00ee00,0x01250927,0x09280928,0x09280928,0x01250927,0x01250927,0x09280928,0x09280928,
 0x11211121,0x1122fe01,0x31123112,0x31123112,0xfe01fe01,0xfe01fe01,0xfe01fe01,0xfe01fe01,
 0xfe01fe01,0xeecf20d1,0x28d328dd,0x28d328dd,0xee01ee01,0xee01ee01,0xee01ee01,0xee01ee01,
 0xee01ee01,0x40c1ee01,0xa0c460cc,0xa0c460cc,0xee01ee01,0xee01ee01,0xa0c460cc,0xa0c460cc,
 0xee60ee60,0xee610062,0x20682068,0x20682068,0xee01ee01,0xee01ee01,0x20682068,0x20682068,
 0x304e3037,0x304e3037,0x004f004f,0x004f004f,0xfe01003d,0xfe01003d,0xfe01003d,0xfe01003d,
 0xfe36fe36,0xfe360002,0x402a4030,0x40054022,0xfe01fe01,0xfe01fe01,0x402a4030,0x40054022

#endif	/* #ifdef MASK_A */
};

/*
 * Initialize emulation mode.
 *
 * This can be done only once after reset!
 */
void
tpu_emu(int mcr)
{
    INTERN.ramc.rambar = 0xff00;			/* set RAM addr */
    memcpy((void *)0xff0000, mask, sizeof(mask));	/* load emulation */
    INTERN.tpu.tmcr = mcr|0x400;			/* config for emu */
}

int
main(void)
{
	#define DESIRED_TPUMCR_VALUE	0	/* choose value for mcr */

	tpu_emu(DESIRED_TPUMCR_VALUE);		/* start emulation mode... */

	/*
	 * The TPU is now running in emulation mode
	 * and your program can use the pre-defined
	 * functions for the selected mask.
	 */

	return 0;
}
