window['trsEmu'] = (function() {
// Version 1.4.d
var op;
var opcb;
var oped;
var opx;
var opxcb;
var ptable;
var qq;
var extmp;
var ixy_d;
var rom = [
0xf3,0xaf,0xc3,0x15,0x30,0xc3,0x00,0x40,0xc3,0x00,0x40,0xe1,0xe9,0xc3,0x12,0x30,
0xc3,0x03,0x40,0xc5,0x06,0x01,0x18,0x2e,0xc3,0x06,0x40,0xc5,0x06,0x02,0x18,0x26,
0xc3,0x09,0x40,0xc5,0x06,0x04,0x18,0x1e,0xc3,0x0c,0x40,0x11,0x15,0x40,0x18,0xe3,
0xc3,0x0f,0x40,0x11,0x1d,0x40,0x18,0xe3,0xc3,0x12,0x40,0x11,0x25,0x40,0x18,0xdb,
0xc3,0xd9,0x05,0xc9,0x00,0x00,0xc3,0x74,0x06,0xcd,0x2b,0x00,0xb7,0xc0,0x18,0xf9,
0x11,0xe5,0x41,0x18,0xbe,0x11,0xed,0x41,0x18,0xc1,0x11,0xf5,0x41,0x18,0xbc,0x00,
0xc3,0xfb,0x01,0x20,0xfb,0xc9,0xc3,0x39,0x30,0xc3,0x52,0x04,0x11,0x1d,0x42,0x18,
0xaa,0x00,0xc3,0xcc,0x06,0x11,0x80,0x40,0x21,0xf7,0x18,0x01,0x27,0x00,0xed,0xb0,
0x21,0xe5,0x42,0x36,0x3a,0x23,0x70,0x23,0x36,0x2c,0x23,0x22,0xa7,0x40,0x11,0x2d,
0x01,0x06,0x1c,0x21,0x52,0x41,0x36,0xc3,0x23,0x73,0x23,0x72,0x23,0x10,0xf7,0x06,
0x15,0x36,0xc9,0x23,0x23,0x23,0x10,0xf9,0x21,0xe8,0x43,0x70,0x31,0xf8,0x42,0xcd,
0x8f,0x1b,0x00,0x00,0x00,0x21,0x05,0x01,0xcd,0xa7,0x28,0xcd,0xb3,0x1b,0x38,0xf5,
0xd7,0xb7,0x20,0x12,0x21,0x4c,0x44,0x23,0x7c,0xb5,0x28,0x1b,0x7e,0x47,0x2f,0x77,
0xbe,0x70,0x28,0xf3,0x18,0x11,0xcd,0x5a,0x1e,0xb7,0xc2,0x97,0x19,0xeb,0x2b,0x3e,
0x8f,0x46,0x77,0xbe,0x70,0x20,0xce,0x2b,0x11,0x14,0x45,0xdf,0xda,0x7a,0x19,0x11,
0xce,0xff,0x22,0xb1,0x40,0x19,0x22,0xa0,0x40,0xcd,0x4d,0x1b,0x21,0x11,0x01,0xc3,
0xeb,0x37,0xc3,0x19,0x1a,0x4d,0x65,0x6d,0x6f,0x72,0x79,0x20,0x53,0x69,0x7a,0x65,
0x00,0x52,0x61,0x64,0x69,0x6f,0x20,0x53,0x68,0x61,0x63,0x6b,0x20,0x4d,0x6f,0x64,
0x65,0x6c,0x20,0x49,0x49,0x49,0x20,0x42,0x61,0x73,0x69,0x63,0x0d,0x1e,0x2c,0xc3,
0xa2,0x19,0xd7,0xaf,0x01,0x3e,0x80,0x01,0x3e,0x01,0xf5,0xcf,0x28,0xcd,0x1c,0x2b,
0xfe,0x80,0xd2,0x4a,0x1e,0xf5,0xcf,0x2c,0xcd,0x1c,0x2b,0xfe,0x30,0xd2,0x4a,0x1e,
0x16,0xff,0x14,0xd6,0x03,0x30,0xfb,0xc6,0x03,0x4f,0xf1,0x87,0x5f,0x06,0x02,0x7a,
0x1f,0x57,0x7b,0x1f,0x5f,0x10,0xf8,0x79,0x8f,0x3c,0x47,0xaf,0x37,0x8f,0x10,0xfd,
0x4f,0x7a,0xf6,0x3c,0x57,0x1a,0xb7,0xfa,0x7c,0x01,0x3e,0x80,0x47,0xf1,0xb7,0x78,
0x28,0x10,0x12,0xfa,0x8f,0x01,0x79,0x2f,0x4f,0x1a,0xa1,0x12,0xcf,0x29,0xc9,0xb1,
0x18,0xf9,0xa1,0xc6,0xff,0x9f,0xe5,0xcd,0x8d,0x09,0xe1,0x18,0xef,0xd7,0xe5,0x3a,
0x99,0x40,0xb7,0x20,0x06,0xcd,0x58,0x03,0xb7,0x28,0x11,0xf5,0xaf,0x32,0x99,0x40,
0x3c,0xcd,0x57,0x28,0xf1,0x2a,0xd4,0x40,0x77,0xc3,0x84,0x28,0x21,0x28,0x19,0x22,
0x21,0x41,0x3e,0x03,0x32,0xaf,0x40,0xe1,0xc9,0x3e,0x1c,0xcd,0x3a,0x03,0x3e,0x1f,
0xc3,0x3a,0x03,0xed,0x5f,0x32,0xab,0x40,0xc9,0x21,0x00,0x3c,0x7e,0xfe,0x80,0x38,
0x02,0x3e,0x2e,0xcd,0x3b,0x00,0x23,0xcb,0x74,0x20,0x29,0x7d,0xe6,0x3f,0x20,0xec,
0xcd,0x14,0x02,0x18,0xe7,0x10,0xfe,0xc9,0xc3,0x0c,0x30,0x7f,0x0b,0x78,0xb1,0x20,
0xfa,0xc9,0x28,0x63,0x29,0x20,0x27,0x38,0x30,0x20,0x54,0x61,0x6e,0x64,0x79,0x0d,
0x1e,0x3d,0xaf,0xc9,0x3e,0x0d,0xcd,0x3b,0x00,0xaf,0xc9,0x7e,0x23,0xfe,0x03,0xc8,
0xcd,0x33,0x00,0xfe,0x0d,0x20,0xf4,0xc9,0xe3,0xc3,0x2a,0x30,0x18,0xe4,0xfb,0xc3,
0x19,0x1a,0x3f,0x3c,0xc9,0xd5,0xc5,0xe5,0x2a,0x0e,0x42,0xe3,0xc9,0xe5,0x21,0x00,
0x30,0x18,0xe5,0xf3,0xcd,0x0f,0x30,0xe5,0x21,0x06,0x30,0x18,0xdb,0xe5,0x2a,0x0c,
0x42,0xe3,0xc9,0xe3,0x3a,0x11,0x42,0xb7,0x28,0x03,0x23,0x23,0x23,0xe3,0xc9,0xc1,
0xc9,0xcd,0x64,0x02,0x18,0xe7,0x3c,0x3c,0x18,0x1f,0x1c,0x1f,0x1e,0x1f,0x1e,0x1f,
0x1f,0x1e,0x1f,0x1e,0x1f,0x00,0x00,0x1d,0x1e,0x44,0x69,0x73,0x6b,0x65,0x74,0x74,
0x65,0x3f,0x03,0xf2,0xc3,0x87,0x02,0xf3,0xcd,0x0f,0x30,0x18,0xb0,0x3a,0x40,0x38,
0xe6,0x04,0xc9,0xc3,0x43,0x02,0x18,0xab,0x3a,0x10,0x42,0xcb,0xc7,0x32,0x10,0x42,
0xc9,0x3a,0x10,0x42,0xcb,0x87,0x18,0xf5,0xc9,0xcd,0x14,0x03,0x22,0xdf,0x40,0xcd,
0xf8,0x01,0xcd,0xe2,0x41,0x31,0x88,0x42,0xcd,0xfe,0x20,0x3e,0x2a,0xcd,0x2a,0x03,
0xcd,0xb3,0x1b,0xda,0xcc,0x06,0xd7,0xca,0x97,0x19,0xfe,0x2f,0x28,0x4f,0xcd,0x93,
0x02,0xcd,0x35,0x02,0xfe,0x55,0x20,0xf9,0x06,0x06,0x7e,0xb7,0x28,0x09,0xcd,0x35,
0x02,0xbe,0x23,0x20,0xec,0x10,0xf3,0xcd,0x2c,0x02,0xcd,0x35,0x02,0xfe,0x78,0x28,
0xb8,0xfe,0x3c,0x20,0xf5,0xcd,0x35,0x02,0x47,0xcd,0x14,0x03,0x85,0x4f,0xcd,0x35,
0x02,0x77,0x23,0x81,0x4f,0x10,0xf7,0xcd,0x35,0x02,0xb9,0x28,0xda,0x3e,0x43,0x32,
0x3e,0x3c,0x18,0xd6,0xcd,0x35,0x02,0x6f,0xcd,0x35,0x02,0x67,0xc9,0xeb,0x2a,0xdf,
0x40,0xeb,0xd7,0xc4,0x5a,0x1e,0x20,0x8a,0xeb,0xe9,0xc5,0x4f,0xcd,0xc1,0x41,0x3a,
0x9c,0x40,0xb7,0x79,0xc1,0xfa,0x64,0x02,0x20,0x62,0xd5,0xcd,0x33,0x00,0xf5,0xcd,
0x48,0x03,0x32,0xa6,0x40,0xf1,0xd1,0xc9,0x3a,0x3d,0x40,0xe6,0x08,0x3a,0x20,0x40,
0x28,0x03,0x0f,0xe6,0x1f,0xe6,0x3f,0xc9,0xcd,0xc4,0x41,0xd5,0xcd,0x2b,0x00,0xd1,
0xc9,0xaf,0x32,0x99,0x40,0x32,0xa6,0x40,0xcd,0xaf,0x41,0xc5,0x2a,0xa7,0x40,0x06,
0xf0,0xcd,0xd9,0x05,0xf5,0x48,0x06,0x00,0x09,0x36,0x00,0x2a,0xa7,0x40,0xf1,0xc1,
0x2b,0xd8,0xaf,0xc9,0xcd,0x58,0x03,0xb7,0xc0,0x18,0xf9,0xaf,0x32,0x9c,0x40,0x3a,
0x9b,0x40,0xb7,0xc8,0x3e,0x0d,0xd5,0xcd,0x9c,0x03,0xd1,0xc9,0xf5,0xd5,0xc5,0x4f,
0x1e,0x00,0xfe,0x0c,0x28,0x10,0xfe,0x0a,0x20,0x03,0x3e,0x0d,0x4f,0xfe,0x0d,0x28,
0x05,0x3a,0x9b,0x40,0x3c,0x5f,0x7b,0x32,0x9b,0x40,0x79,0xcd,0x3b,0x00,0xc1,0xd1,
0xf1,0xc9,0x79,0xfe,0x20,0x30,0x1e,0xfe,0x0d,0x28,0x2a,0xfe,0x0c,0x20,0x30,0xdd,
0x7e,0x03,0xdd,0x96,0x04,0x47,0xcd,0x40,0x04,0x3e,0x0a,0xd3,0xf8,0x10,0xf7,0xdd,
0x36,0x05,0x00,0x18,0x54,0xfe,0x80,0x30,0x30,0x06,0x00,0xd6,0x20,0x4f,0x21,0x45,
0x31,0x09,0x4e,0x18,0x0e,0xdd,0x7e,0x05,0xb7,0x79,0x20,0x03,0x3e,0x0a,0x4f,0xfe,
0x20,0x38,0x16,0xdd,0x7e,0x06,0x3c,0x28,0x10,0xdd,0xbe,0x05,0x30,0x0b,0xcd,0x40,
0x04,0x3e,0x0d,0xd3,0xf8,0xdd,0x36,0x05,0x00,0xcd,0x40,0x04,0x79,0xd3,0xf8,0xdd,
0x34,0x05,0xfe,0x0d,0x28,0x04,0xfe,0x0a,0x20,0x13,0xdd,0x36,0x05,0x00,0xdd,0x34,
0x04,0xdd,0x7e,0x04,0xdd,0xbe,0x03,0x20,0x04,0xdd,0x36,0x04,0x01,0xaf,0x79,0xc9,
0xcd,0x4b,0x04,0xc8,0xcd,0x8d,0x02,0x28,0xf7,0xf1,0xc9,0xdb,0xf8,0xe6,0xf0,0xfe,
0x30,0xc9,0x21,0xbf,0x36,0x11,0x15,0x40,0x01,0x18,0x00,0xed,0xb0,0x21,0xf9,0x36,
0x11,0xe5,0x41,0x01,0x18,0x00,0xed,0xb0,0xc9,0x20,0xda,0xaf,0x32,0x14,0x42,0x2a,
0xa4,0x40,0xc9,0xf3,0xdd,0x6e,0x03,0xdd,0x66,0x04,0xdd,0x7e,0x05,0xb7,0x28,0x01,
0x77,0x79,0xfe,0x20,0xda,0x21,0x05,0xfe,0xc0,0x30,0x2c,0xcd,0x76,0x05,0x7c,0xe6,
0x03,0xf6,0x3c,0x67,0x56,0xdd,0x7e,0x05,0xb7,0x28,0x0d,0xdd,0x72,0x05,0xdd,0x7e,
0x06,0xfe,0x20,0x30,0x02,0x3e,0xb0,0x77,0xdd,0x75,0x03,0xdd,0x74,0x04,0xaf,0x79,
0xfb,0xc9,0x7d,0xe6,0xc0,0x6f,0xc9,0xdd,0x7e,0x07,0xb7,0x79,0x20,0xcd,0xd6,0xc0,
0x28,0xcc,0x47,0x3e,0x20,0xcd,0x76,0x05,0x10,0xf9,0x18,0xc2,0x7e,0xdd,0x77,0x05,
0xc9,0xaf,0x18,0xf9,0x21,0x00,0x3c,0x3a,0x10,0x42,0xe6,0xfb,0xcd,0x70,0x05,0x3a,
0x14,0x42,0xe6,0x07,0xc8,0xcd,0x04,0x05,0x3d,0x18,0xf9,0x2b,0x3a,0x10,0x42,0xe6,
0x04,0x28,0x01,0x2b,0x36,0x20,0xc9,0x3a,0x10,0x42,0xe6,0x04,0xc4,0xff,0x04,0x7d,
0xe6,0x3f,0x2b,0xc0,0x11,0x40,0x00,0x19,0xc9,0x23,0x7d,0xe6,0x3f,0xc0,0x11,0xc0,
0xff,0x19,0xc9,0x3a,0x10,0x42,0xf6,0x04,0xcd,0x70,0x05,0x23,0x7d,0xe6,0xfe,0x6f,
0xc9,0x11,0x8e,0x04,0xd5,0xfe,0x08,0x28,0xc2,0xfe,0x0a,0xca,0xaf,0x05,0xfe,0x0d,
0xca,0xaf,0x05,0xfe,0x0e,0x28,0x95,0xfe,0x0f,0x28,0x96,0xd6,0x15,0x28,0x21,0x3d,
0x28,0x29,0x3d,0x28,0xce,0x3d,0x28,0xaf,0x3d,0x28,0xbe,0x3d,0x28,0xb6,0x3d,0x28,
0xbd,0x3d,0xca,0xd4,0x04,0x3d,0xca,0xb2,0x04,0x3d,0x28,0x60,0x3d,0x28,0x66,0xc9,
0xdd,0x7e,0x07,0xe6,0x01,0xee,0x01,0xdd,0x77,0x07,0xc9,0x3a,0x10,0x42,0xee,0x08,
0x32,0x10,0x42,0xd3,0xec,0xc9,0x77,0x23,0x3a,0x10,0x42,0xe6,0x04,0x28,0x01,0x23,
0x7c,0xfe,0x40,0xc0,0xcd,0x0e,0x05,0xe5,0x3a,0x14,0x42,0xe6,0x07,0x21,0x00,0x3c,
0x11,0x00,0x04,0xc5,0x01,0x40,0x00,0x3c,0x09,0xeb,0xb7,0xed,0x42,0xeb,0x3d,0x20,
0xf7,0xd5,0xe5,0xb7,0xed,0x42,0xeb,0xe1,0xc1,0xed,0xb0,0xc1,0xeb,0x18,0x17,0xcd,
0xb2,0x04,0xe5,0xcd,0x04,0x05,0x7c,0xfe,0x40,0x28,0xcd,0xd1,0xe5,0x54,0x7d,0xf6,
0x3f,0x5f,0x13,0x18,0x04,0xe5,0x11,0x00,0x40,0x36,0x20,0x23,0xdf,0x20,0xfa,0xe1,
0xc9,0x52,0x4f,0x4e,0xe6,0xf0,0xfe,0x30,0xc9,0xe5,0x3e,0x0e,0xcd,0x33,0x00,0x48,
0xcd,0x49,0x00,0xfe,0x20,0x30,0x25,0xfe,0x0d,0xca,0x62,0x06,0xfe,0x1f,0x28,0x29,
0xfe,0x01,0x28,0x6d,0x11,0xe0,0x05,0xd5,0xfe,0x08,0x28,0x34,0xfe,0x18,0x28,0x2b,
0xfe,0x09,0x28,0x42,0xfe,0x19,0x28,0x39,0xfe,0x0a,0xc0,0xd1,0x77,0x78,0xb7,0x28,
0xcf,0x7e,0x23,0xcd,0x33,0x00,0x05,0x18,0xc7,0xcd,0xc9,0x01,0x41,0xe1,0xe5,0xc3,
0xe0,0x05,0xcd,0x30,0x06,0x2b,0x7e,0x23,0xfe,0x0a,0xc8,0x78,0xb9,0x20,0xf3,0xc9,
0x78,0xb9,0xc8,0x2b,0x7e,0xfe,0x0a,0x23,0xc8,0x2b,0x3e,0x08,0xcd,0x33,0x00,0x04,
0xc9,0x3e,0x17,0xc3,0x33,0x00,0xcd,0x48,0x03,0xe6,0x07,0x2f,0x3c,0xc6,0x08,0x5f,
0x78,0xb7,0xc8,0x3e,0x20,0x77,0x23,0xd5,0xcd,0x33,0x00,0xd1,0x05,0x1d,0xc8,0x18,
0xef,0x37,0xf5,0x3e,0x0d,0x77,0xcd,0x33,0x00,0x3e,0x0f,0xcd,0x33,0x00,0x79,0x90,
0x47,0xf1,0xe1,0xc9,0xe5,0xdd,0xe5,0xd5,0xdd,0xe1,0xd5,0x21,0x94,0x06,0xe5,0x4f,
0x1a,0xcb,0x7f,0x28,0x05,0xa0,0xb8,0xc2,0x33,0x40,0xa0,0xfe,0x02,0xdd,0x6e,0x01,
0xdd,0x66,0x02,0xe9,0xd1,0xdd,0xe1,0xe1,0xc1,0xc9,0xaf,0x32,0x9f,0x40,0x16,0xff,
0xc3,0x8d,0x2b,0xe6,0xfd,0x32,0x9f,0x40,0x3e,0x3a,0xb7,0xf2,0xe2,0x06,0x3a,0x9f,
0x40,0x1f,0x38,0x2e,0x1f,0x1f,0x30,0x3e,0x7e,0xfe,0xfb,0xe5,0xc5,0x21,0xdf,0x06,
0xe5,0xc0,0x0b,0x0a,0xfe,0x4d,0xc0,0x0b,0x0a,0xfe,0x45,0xc0,0x0b,0x0a,0xfe,0x52,
0xc0,0x0b,0x0a,0xfe,0x3a,0xc0,0xf1,0xf1,0xe1,0x14,0x14,0x14,0x14,0x18,0x25,0xc1,
0xe1,0x7e,0xc3,0x89,0x2b,0x3a,0x9f,0x40,0xf6,0x02,0x32,0x9f,0x40,0xaf,0xc9,0x3a,
0x9f,0x40,0xf6,0x04,0x18,0xf4,0x17,0x38,0xe9,0x7e,0xfe,0x88,0xcc,0xe5,0x06,0xfe,
0x93,0xcc,0xef,0x06,0x7e,0xc3,0xa0,0x2b,0x21,0x80,0x13,0xcd,0xc2,0x09,0x18,0x06,
0xcd,0xc2,0x09,0xcd,0x82,0x09,0x78,0xb7,0xc8,0x3a,0x24,0x41,0xb7,0xca,0xb4,0x09,
0x90,0x30,0x0c,0x2f,0x3c,0xeb,0xcd,0xa4,0x09,0xeb,0xcd,0xb4,0x09,0xc1,0xd1,0xfe,
0x19,0xd0,0xf5,0xcd,0xdf,0x09,0x67,0xf1,0xcd,0xd7,0x07,0xb4,0x21,0x21,0x41,0xf2,
0x54,0x07,0xcd,0xb7,0x07,0xd2,0x96,0x07,0x23,0x34,0xca,0xb2,0x07,0x2e,0x01,0xcd,
0xeb,0x07,0x18,0x42,0xaf,0x90,0x47,0x7e,0x9b,0x5f,0x23,0x7e,0x9a,0x57,0x23,0x7e,
0x99,0x4f,0xdc,0xc3,0x07,0x68,0x63,0xaf,0x47,0x79,0xb7,0x20,0x18,0x4a,0x54,0x65,
0x6f,0x78,0xd6,0x08,0xfe,0xe0,0x20,0xf0,0xaf,0x32,0x24,0x41,0xc9,0x05,0x29,0x7a,
0x17,0x57,0x79,0x8f,0x4f,0xf2,0x7d,0x07,0x78,0x5c,0x45,0xb7,0x28,0x08,0x21,0x24,
0x41,0x86,0x77,0x30,0xe3,0xc8,0x78,0x21,0x24,0x41,0xb7,0xfc,0xa8,0x07,0x46,0x23,
0x7e,0xe6,0x80,0xa9,0x4f,0xc3,0xb4,0x09,0x1c,0xc0,0x14,0xc0,0x0c,0xc0,0x0e,0x80,
0x34,0xc0,0x1e,0x0a,0xc3,0xa2,0x19,0x7e,0x83,0x5f,0x23,0x7e,0x8a,0x57,0x23,0x7e,
0x89,0x4f,0xc9,0x21,0x25,0x41,0x7e,0x2f,0x77,0xaf,0x6f,0x90,0x47,0x7d,0x9b,0x5f,
0x7d,0x9a,0x57,0x7d,0x99,0x4f,0xc9,0x06,0x00,0xd6,0x08,0x38,0x07,0x43,0x5a,0x51,
0x0e,0x00,0x18,0xf5,0xc6,0x09,0x6f,0xaf,0x2d,0xc8,0x79,0x1f,0x4f,0x7a,0x1f,0x57,
0x7b,0x1f,0x5f,0x78,0x1f,0x47,0x18,0xef,0x00,0x00,0x00,0x81,0x03,0xaa,0x56,0x19,
0x80,0xf1,0x22,0x76,0x80,0x45,0xaa,0x38,0x82,0xcd,0x55,0x09,0xb7,0xea,0x4a,0x1e,
0x21,0x24,0x41,0x7e,0x01,0x35,0x80,0x11,0xf3,0x04,0x90,0xf5,0x70,0xd5,0xc5,0xcd,
0x16,0x07,0xc1,0xd1,0x04,0xcd,0xa2,0x08,0x21,0xf8,0x07,0xcd,0x10,0x07,0x21,0xfc,
0x07,0xcd,0x9a,0x14,0x01,0x80,0x80,0x11,0x00,0x00,0xcd,0x16,0x07,0xf1,0xcd,0x89,
0x0f,0x01,0x31,0x80,0x11,0x18,0x72,0xcd,0x55,0x09,0xc8,0x2e,0x00,0xcd,0x14,0x09,
0x79,0x32,0x4f,0x41,0xeb,0x22,0x50,0x41,0x01,0x00,0x00,0x50,0x58,0x21,0x65,0x07,
0xe5,0x21,0x69,0x08,0xe5,0xe5,0x21,0x21,0x41,0x7e,0x23,0xb7,0x28,0x24,0xe5,0x2e,
0x08,0x1f,0x67,0x79,0x30,0x0b,0xe5,0x2a,0x50,0x41,0x19,0xeb,0xe1,0x3a,0x4f,0x41,
0x89,0x1f,0x4f,0x7a,0x1f,0x57,0x7b,0x1f,0x5f,0x78,0x1f,0x47,0x2d,0x7c,0x20,0xe1,
0xe1,0xc9,0x43,0x5a,0x51,0x4f,0xc9,0xcd,0xa4,0x09,0x21,0xd8,0x0d,0xcd,0xb1,0x09,
0xc1,0xd1,0xcd,0x55,0x09,0xca,0x9a,0x19,0x2e,0xff,0xcd,0x14,0x09,0x34,0x34,0x2b,
0x7e,0x32,0x89,0x40,0x2b,0x7e,0x32,0x85,0x40,0x2b,0x7e,0x32,0x81,0x40,0x41,0xeb,
0xaf,0x4f,0x57,0x5f,0x32,0x8c,0x40,0xe5,0xc5,0x7d,0xcd,0x80,0x40,0xde,0x00,0x3f,
0x30,0x07,0x32,0x8c,0x40,0xf1,0xf1,0x37,0xd2,0xc1,0xe1,0x79,0x3c,0x3d,0x1f,0xfa,
0x97,0x07,0x17,0x7b,0x17,0x5f,0x7a,0x17,0x57,0x79,0x17,0x4f,0x29,0x78,0x17,0x47,
0x3a,0x8c,0x40,0x17,0x32,0x8c,0x40,0x79,0xb2,0xb3,0x20,0xcb,0xe5,0x21,0x24,0x41,
0x35,0xe1,0x20,0xc3,0xc3,0xb2,0x07,0x3e,0xff,0x2e,0xaf,0x21,0x2d,0x41,0x4e,0x23,
0xae,0x47,0x2e,0x00,0x78,0xb7,0x28,0x1f,0x7d,0x21,0x24,0x41,0xae,0x80,0x47,0x1f,
0xa8,0x78,0xf2,0x36,0x09,0xc6,0x80,0x77,0xca,0x90,0x08,0xcd,0xdf,0x09,0x77,0x2b,
0xc9,0xcd,0x55,0x09,0x2f,0xe1,0xb7,0xe1,0xf2,0x78,0x07,0xc3,0xb2,0x07,0xcd,0xbf,
0x09,0x78,0xb7,0xc8,0xc6,0x02,0xda,0xb2,0x07,0x47,0xcd,0x16,0x07,0x21,0x24,0x41,
0x34,0xc0,0xc3,0xb2,0x07,0x3a,0x24,0x41,0xb7,0xc8,0x3a,0x23,0x41,0xfe,0x2f,0x17,
0x9f,0xc0,0x3c,0xc9,0x06,0x88,0x11,0x00,0x00,0x21,0x24,0x41,0x4f,0x70,0x06,0x00,
0x23,0x36,0x80,0x17,0xc3,0x62,0x07,0xcd,0x94,0x09,0xf0,0xe7,0xfa,0x5b,0x0c,0xca,
0xf6,0x0a,0x21,0x23,0x41,0x7e,0xee,0x80,0x77,0xc9,0xcd,0x94,0x09,0x6f,0x17,0x9f,
0x67,0xc3,0x9a,0x0a,0xe7,0xca,0xf6,0x0a,0xf2,0x55,0x09,0x2a,0x21,0x41,0x7c,0xb5,
0xc8,0x7c,0x18,0xbb,0xeb,0x2a,0x21,0x41,0xe3,0xe5,0x2a,0x23,0x41,0xe3,0xe5,0xeb,
0xc9,0xcd,0xc2,0x09,0xeb,0x22,0x21,0x41,0x60,0x69,0x22,0x23,0x41,0xeb,0xc9,0x21,
0x21,0x41,0x5e,0x23,0x56,0x23,0x4e,0x23,0x46,0x23,0xc9,0x11,0x21,0x41,0x06,0x04,
0x18,0x05,0xeb,0x3a,0xaf,0x40,0x47,0x1a,0x77,0x13,0x23,0x05,0x20,0xf9,0xc9,0x21,
0x23,0x41,0x7e,0x07,0x37,0x1f,0x77,0x3f,0x1f,0x23,0x23,0x77,0x79,0x07,0x37,0x1f,
0x4f,0x1f,0xae,0xc9,0x21,0x27,0x41,0x11,0xd2,0x09,0x18,0x06,0x21,0x27,0x41,0x11,
0xd3,0x09,0xd5,0x11,0x21,0x41,0xe7,0xd8,0x11,0x1d,0x41,0xc9,0x78,0xb7,0xca,0x55,
0x09,0x21,0x5e,0x09,0xe5,0xcd,0x55,0x09,0x79,0xc8,0x21,0x23,0x41,0xae,0x79,0xf8,
0xcd,0x26,0x0a,0x1f,0xa9,0xc9,0x23,0x78,0xbe,0xc0,0x2b,0x79,0xbe,0xc0,0x2b,0x7a,
0xbe,0xc0,0x2b,0x7b,0x96,0xc0,0xe1,0xe1,0xc9,0x7a,0xac,0x7c,0xfa,0x5f,0x09,0xba,
0xc2,0x60,0x09,0x7d,0x93,0xc2,0x60,0x09,0xc9,0x21,0x27,0x41,0xcd,0xd3,0x09,0x11,
0x2e,0x41,0x1a,0xb7,0xca,0x55,0x09,0x21,0x5e,0x09,0xe5,0xcd,0x55,0x09,0x1b,0x1a,
0x4f,0xc8,0x21,0x23,0x41,0xae,0x79,0xf8,0x13,0x23,0x06,0x08,0x1a,0x96,0xc2,0x23,
0x0a,0x1b,0x2b,0x05,0x20,0xf6,0xc1,0xc9,0xcd,0x4f,0x0a,0xc2,0x5e,0x09,0xc9,0xe7,
0x2a,0x21,0x41,0xf8,0xca,0xf6,0x0a,0xd4,0xb9,0x0a,0x21,0xb2,0x07,0xe5,0x3a,0x24,
0x41,0xfe,0x90,0x30,0x0e,0xcd,0xfb,0x0a,0xeb,0xd1,0x22,0x21,0x41,0x3e,0x02,0x32,
0xaf,0x40,0xc9,0x01,0x80,0x90,0x11,0x00,0x00,0xcd,0x0c,0x0a,0xc0,0x61,0x6a,0x18,
0xe8,0xe7,0xe0,0xfa,0xcc,0x0a,0xca,0xf6,0x0a,0xcd,0xbf,0x09,0xcd,0xef,0x0a,0x78,
0xb7,0xc8,0xcd,0xdf,0x09,0x21,0x20,0x41,0x46,0xc3,0x96,0x07,0x2a,0x21,0x41,0xcd,
0xef,0x0a,0x7c,0x55,0x1e,0x00,0x06,0x90,0xc3,0x69,0x09,0xe7,0xd0,0xca,0xf6,0x0a,
0xfc,0xcc,0x0a,0x21,0x00,0x00,0x22,0x1d,0x41,0x22,0x1f,0x41,0x3e,0x08,0x01,0x3e,
0x04,0xc3,0x9f,0x0a,0xe7,0xc8,0x1e,0x18,0xc3,0xa2,0x19,0x47,0x4f,0x57,0x5f,0xb7,
0xc8,0xe5,0xcd,0xbf,0x09,0xcd,0xdf,0x09,0xae,0x67,0xfc,0x1f,0x0b,0x3e,0x98,0x90,
0xcd,0xd7,0x07,0x7c,0x17,0xdc,0xa8,0x07,0x06,0x00,0xdc,0xc3,0x07,0xe1,0xc9,0x1b,
0x7a,0xa3,0x3c,0xc0,0x0b,0xc9,0xe7,0xf8,0xcd,0x55,0x09,0xf2,0x37,0x0b,0xcd,0x82,
0x09,0xcd,0x37,0x0b,0xc3,0x7b,0x09,0xe7,0xf8,0x30,0x1e,0x28,0xb9,0xcd,0x8e,0x0a,
0x21,0x24,0x41,0x7e,0xfe,0x98,0x3a,0x21,0x41,0xd0,0x7e,0xcd,0xfb,0x0a,0x36,0x98,
0x7b,0xf5,0x79,0x17,0xcd,0x62,0x07,0xf1,0xc9,0x21,0x24,0x41,0x7e,0xfe,0x90,0xda,
0x7f,0x0a,0x20,0x14,0x4f,0x2b,0x7e,0xee,0x80,0x06,0x06,0x2b,0xb6,0x05,0x20,0xfb,
0xb7,0x21,0x00,0x80,0xca,0x9a,0x0a,0x79,0xfe,0xb8,0xd0,0xf5,0xcd,0xbf,0x09,0xcd,
0xdf,0x09,0xae,0x2b,0x36,0xb8,0xf5,0xfc,0xa0,0x0b,0x21,0x23,0x41,0x3e,0xb8,0x90,
0xcd,0x69,0x0d,0xf1,0xfc,0x20,0x0d,0xaf,0x32,0x1c,0x41,0xf1,0xd0,0xc3,0xd8,0x0c,
0x21,0x1d,0x41,0x7e,0x35,0xb7,0x23,0x28,0xfa,0xc9,0xe5,0x21,0x00,0x00,0x78,0xb1,
0x28,0x12,0x3e,0x10,0x29,0xda,0x3d,0x27,0xeb,0x29,0xeb,0x30,0x04,0x09,0xda,0x3d,
0x27,0x3d,0x20,0xf0,0xeb,0xe1,0xc9,0x7c,0x17,0x9f,0x47,0xcd,0x51,0x0c,0x79,0x98,
0x18,0x03,0x7c,0x17,0x9f,0x47,0xe5,0x7a,0x17,0x9f,0x19,0x88,0x0f,0xac,0xf2,0x99,
0x0a,0xc5,0xeb,0xcd,0xcf,0x0a,0xf1,0xe1,0xcd,0xa4,0x09,0xeb,0xcd,0x6b,0x0c,0xc3,
0x8f,0x0f,0x7c,0xb5,0xca,0x9a,0x0a,0xe5,0xd5,0xcd,0x45,0x0c,0xc5,0x44,0x4d,0x21,
0x00,0x00,0x3e,0x10,0x29,0x38,0x1f,0xeb,0x29,0xeb,0x30,0x04,0x09,0xda,0x26,0x0c,
0x3d,0x20,0xf1,0xc1,0xd1,0x7c,0xb7,0xfa,0x1f,0x0c,0xd1,0x78,0xc3,0x4d,0x0c,0xee,
0x80,0xb5,0x28,0x13,0xeb,0x01,0xc1,0xe1,0xcd,0xcf,0x0a,0xe1,0xcd,0xa4,0x09,0xcd,
0xcf,0x0a,0xc1,0xd1,0xc3,0x47,0x08,0x78,0xb7,0xc1,0xfa,0x9a,0x0a,0xd5,0xcd,0xcf,
0x0a,0xd1,0xc3,0x82,0x09,0x7c,0xaa,0x47,0xcd,0x4c,0x0c,0xeb,0x7c,0xb7,0xf2,0x9a,
0x0a,0xaf,0x4f,0x95,0x6f,0x79,0x9c,0x67,0xc3,0x9a,0x0a,0x2a,0x21,0x41,0xcd,0x51,
0x0c,0x7c,0xee,0x80,0xb5,0xc0,0xeb,0xcd,0xef,0x0a,0xaf,0x06,0x98,0xc3,0x69,0x09,
0x21,0x2d,0x41,0x7e,0xee,0x80,0x77,0x21,0x2e,0x41,0x7e,0xb7,0xc8,0x47,0x2b,0x4e,
0x11,0x24,0x41,0x1a,0xb7,0xca,0xf4,0x09,0x90,0x30,0x16,0x2f,0x3c,0xf5,0x0e,0x08,
0x23,0xe5,0x1a,0x46,0x77,0x78,0x12,0x1b,0x2b,0x0d,0x20,0xf6,0xe1,0x46,0x2b,0x4e,
0xf1,0xfe,0x39,0xd0,0xf5,0xcd,0xdf,0x09,0x23,0x36,0x00,0x47,0xf1,0x21,0x2d,0x41,
0xcd,0x69,0x0d,0x3a,0x26,0x41,0x32,0x1c,0x41,0x78,0xb7,0xf2,0xcf,0x0c,0xcd,0x33,
0x0d,0xd2,0x0e,0x0d,0xeb,0x34,0xca,0xb2,0x07,0xcd,0x90,0x0d,0xc3,0x0e,0x0d,0xcd,
0x45,0x0d,0x21,0x25,0x41,0xdc,0x57,0x0d,0xaf,0x47,0x3a,0x23,0x41,0xb7,0x20,0x1e,
0x21,0x1c,0x41,0x0e,0x08,0x56,0x77,0x7a,0x23,0x0d,0x20,0xf9,0x78,0xd6,0x08,0xfe,
0xc0,0x20,0xe6,0xc3,0x78,0x07,0x05,0x21,0x1c,0x41,0xcd,0x97,0x0d,0xb7,0xf2,0xf6,
0x0c,0x78,0xb7,0x28,0x09,0x21,0x24,0x41,0x86,0x77,0xd2,0x78,0x07,0xc8,0x3a,0x1c,
0x41,0xb7,0xfc,0x20,0x0d,0x21,0x25,0x41,0x7e,0xe6,0x80,0x2b,0x2b,0xae,0x77,0xc9,
0x21,0x1d,0x41,0x06,0x07,0x34,0xc0,0x23,0x05,0x20,0xfa,0x34,0xca,0xb2,0x07,0x2b,
0x36,0x80,0xc9,0x21,0x27,0x41,0x11,0x1d,0x41,0x0e,0x07,0xaf,0x1a,0x8e,0x12,0x13,
0x23,0x0d,0x20,0xf8,0xc9,0x21,0x27,0x41,0x11,0x1d,0x41,0x0e,0x07,0xaf,0x1a,0x9e,
0x12,0x13,0x23,0x0d,0x20,0xf8,0xc9,0x7e,0x2f,0x77,0x21,0x1c,0x41,0x06,0x08,0xaf,
0x4f,0x79,0x9e,0x77,0x23,0x05,0x20,0xf9,0xc9,0x71,0xe5,0xd6,0x08,0x38,0x0e,0xe1,
0xe5,0x11,0x00,0x08,0x4e,0x73,0x59,0x2b,0x15,0x20,0xf9,0x18,0xee,0xc6,0x09,0x57,
0xaf,0xe1,0x15,0xc8,0xe5,0x1e,0x08,0x7e,0x1f,0x77,0x2b,0x1d,0x20,0xf9,0x18,0xf0,
0x21,0x23,0x41,0x16,0x01,0x18,0xed,0x0e,0x08,0x7e,0x17,0x77,0x23,0x0d,0x20,0xf9,
0xc9,0xcd,0x55,0x09,0xc8,0xcd,0x0a,0x09,0xcd,0x39,0x0e,0x71,0x13,0x06,0x07,0x1a,
0x13,0xb7,0xd5,0x28,0x17,0x0e,0x08,0xc5,0x1f,0x47,0xdc,0x33,0x0d,0xcd,0x90,0x0d,
0x78,0xc1,0x0d,0x20,0xf2,0xd1,0x05,0x20,0xe6,0xc3,0xd8,0x0c,0x21,0x23,0x41,0xcd,
0x70,0x0d,0x18,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x84,0x11,0xd4,0x0d,0x21,
0x27,0x41,0xcd,0xd3,0x09,0x3a,0x2e,0x41,0xb7,0xca,0x9a,0x19,0xcd,0x07,0x09,0x34,
0x34,0xcd,0x39,0x0e,0x21,0x51,0x41,0x71,0x41,0x11,0x4a,0x41,0x21,0x27,0x41,0xcd,
0x4b,0x0d,0x1a,0x99,0x3f,0x38,0x0b,0x11,0x4a,0x41,0x21,0x27,0x41,0xcd,0x39,0x0d,
0xaf,0xda,0x12,0x04,0x3a,0x23,0x41,0x3c,0x3d,0x1f,0xfa,0x11,0x0d,0x17,0x21,0x1d,
0x41,0x0e,0x07,0xcd,0x99,0x0d,0x21,0x4a,0x41,0xcd,0x97,0x0d,0x78,0xb7,0x20,0xc9,
0x21,0x24,0x41,0x35,0x20,0xc3,0xc3,0xb2,0x07,0x79,0x32,0x2d,0x41,0x2b,0x11,0x50,
0x41,0x01,0x00,0x07,0x7e,0x12,0x71,0x1b,0x2b,0x05,0x20,0xf8,0xc9,0xcd,0xfc,0x09,
0xeb,0x2b,0x7e,0xb7,0xc8,0xc6,0x02,0xda,0xb2,0x07,0x77,0xe5,0xcd,0x77,0x0c,0xe1,
0x34,0xc0,0xc3,0xb2,0x07,0xcd,0x78,0x07,0xcd,0xec,0x0a,0xf6,0xaf,0xeb,0x01,0xff,
0x00,0x60,0x68,0xcc,0x9a,0x0a,0xeb,0x7e,0xfe,0x2d,0xf5,0xca,0x83,0x0e,0xfe,0x2b,
0x28,0x01,0x2b,0xd7,0xda,0x29,0x0f,0xfe,0x2e,0xca,0xe4,0x0e,0xfe,0x45,0x28,0x14,
0xfe,0x25,0xca,0xee,0x0e,0xfe,0x23,0xca,0xf5,0x0e,0xfe,0x21,0xca,0xf6,0x0e,0xfe,
0x44,0x20,0x24,0xb7,0xcd,0xfb,0x0e,0xe5,0x21,0xbd,0x0e,0xe3,0xd7,0x15,0xfe,0xce,
0xc8,0xfe,0x2d,0xc8,0x14,0xfe,0xcd,0xc8,0xfe,0x2b,0xc8,0x2b,0xf1,0xd7,0xda,0x94,
0x0f,0x14,0x20,0x03,0xaf,0x93,0x5f,0xe5,0x7b,0x90,0xf4,0x0a,0x0f,0xfc,0x18,0x0f,
0x20,0xf8,0xe1,0xf1,0xe5,0xcc,0x7b,0x09,0xe1,0xe7,0xe8,0xe5,0x21,0x90,0x08,0xe5,
0xcd,0xa3,0x0a,0xc9,0xe7,0x0c,0x20,0xdf,0xdc,0xfb,0x0e,0xc3,0x83,0x0e,0xe7,0xf2,
0x97,0x19,0x23,0x18,0xd2,0xb7,0xcd,0xfb,0x0e,0x18,0xf7,0xe5,0xd5,0xc5,0xf5,0xcc,
0xb1,0x0a,0xf1,0xc4,0xdb,0x0a,0xc1,0xd1,0xe1,0xc9,0xc8,0xf5,0xe7,0xf5,0xe4,0x3e,
0x09,0xf1,0xec,0x4d,0x0e,0xf1,0x3d,0xc9,0xd5,0xe5,0xf5,0xe7,0xf5,0xe4,0x97,0x08,
0xf1,0xec,0xdc,0x0d,0xf1,0xe1,0xd1,0x3c,0xc9,0xd5,0x78,0x89,0x47,0xc5,0xe5,0x7e,
0xd6,0x30,0xf5,0xe7,0xf2,0x5d,0x0f,0x2a,0x21,0x41,0x11,0xcd,0x0c,0xdf,0x30,0x19,
0x54,0x5d,0x29,0x29,0x19,0x29,0xf1,0x4f,0x09,0x7c,0xb7,0xfa,0x57,0x0f,0x22,0x21,
0x41,0xe1,0xc1,0xd1,0xc3,0x83,0x0e,0x79,0xf5,0xcd,0xcc,0x0a,0x37,0x30,0x18,0x01,
0x74,0x94,0x11,0x00,0x24,0xcd,0x0c,0x0a,0xf2,0x74,0x0f,0xcd,0x3e,0x09,0xf1,0xcd,
0x89,0x0f,0x18,0xdd,0xcd,0xe3,0x0a,0xcd,0x4d,0x0e,0xcd,0xfc,0x09,0xf1,0xcd,0x64,
0x09,0xcd,0xe3,0x0a,0xcd,0x77,0x0c,0x18,0xc8,0xcd,0xa4,0x09,0xcd,0x64,0x09,0xc1,
0xd1,0xc3,0x16,0x07,0x7b,0xfe,0x0a,0x30,0x09,0x07,0x07,0x83,0x07,0x86,0xd6,0x30,
0x5f,0xfa,0x1e,0x32,0xc3,0xbd,0x0e,0xe5,0x21,0x24,0x19,0xcd,0xa7,0x28,0xe1,0xcd,
0x9a,0x0a,0xaf,0xcd,0x34,0x10,0xb6,0xcd,0xd9,0x0f,0xc3,0xa6,0x28,0xaf,0xcd,0x34,
0x10,0xe6,0x08,0x28,0x02,0x36,0x2b,0xeb,0xcd,0x94,0x09,0xeb,0xf2,0xd9,0x0f,0x36,
0x2d,0xc5,0xe5,0xcd,0x7b,0x09,0xe1,0xc1,0xb4,0x23,0x36,0x30,0x3a,0xd8,0x40,0x57,
0x17,0x3a,0xaf,0x40,0xda,0x9a,0x10,0xca,0x92,0x10,0xfe,0x04,0xd2,0x3d,0x10,0x01,
0x00,0x00,0xcd,0x2f,0x13,0x21,0x30,0x41,0x46,0x0e,0x20,0x3a,0xd8,0x40,0x5f,0xe6,
0x20,0x28,0x07,0x78,0xb9,0x0e,0x2a,0x20,0x01,0x41,0x71,0xd7,0x28,0x14,0xfe,0x45,
0x28,0x10,0xfe,0x44,0x28,0x0c,0xfe,0x30,0x28,0xf0,0xfe,0x2c,0x28,0xec,0xfe,0x2e,
0x20,0x03,0x2b,0x36,0x30,0x7b,0xe6,0x10,0x28,0x03,0x2b,0x36,0x24,0x7b,0xe6,0x04,
0xc0,0x2b,0x70,0xc9,0x32,0xd8,0x40,0x21,0x30,0x41,0x36,0x20,0xc9,0xfe,0x05,0xe5,
0xde,0x00,0x17,0x57,0x14,0xcd,0x01,0x12,0x01,0x00,0x03,0x82,0xfa,0x57,0x10,0x14,
0xba,0x30,0x04,0x3c,0x47,0x3e,0x02,0xd6,0x02,0xe1,0xf5,0xcd,0x91,0x12,0x36,0x30,
0xcc,0xc9,0x09,0xcd,0xa4,0x12,0x2b,0x7e,0xfe,0x30,0x28,0xfa,0xfe,0x2e,0xc4,0xc9,
0x09,0xf1,0x28,0x1f,0xf5,0xe7,0x3e,0x22,0x8f,0x77,0x23,0xf1,0x36,0x2b,0xf2,0x85,
0x10,0x36,0x2d,0x2f,0x3c,0x06,0x2f,0x04,0xd6,0x0a,0x30,0xfb,0xc6,0x3a,0x23,0x70,
0x23,0x77,0x23,0x36,0x00,0xeb,0x21,0x30,0x41,0xc9,0x23,0xc5,0xfe,0x04,0x7a,0xd2,
0x09,0x11,0x1f,0xda,0xa3,0x11,0x01,0x03,0x06,0xcd,0x89,0x12,0xd1,0x7a,0xd6,0x05,
0xf4,0x69,0x12,0xcd,0x2f,0x13,0x7b,0xb7,0xcc,0x2f,0x09,0x3d,0xf4,0x69,0x12,0xe5,
0xcd,0xf5,0x0f,0xe1,0x28,0x02,0x70,0x23,0x36,0x00,0x21,0x2f,0x41,0x23,0x3a,0xf3,
0x40,0x95,0x92,0xc8,0x7e,0xfe,0x20,0x28,0xf4,0xfe,0x2a,0x28,0xf0,0x2b,0xe5,0xf5,
0x01,0xdf,0x10,0xc5,0xd7,0xfe,0x2d,0xc8,0xfe,0x2b,0xc8,0xfe,0x24,0xc8,0xc1,0xfe,
0x30,0x20,0x0f,0x23,0xd7,0x30,0x0b,0x2b,0x01,0x2b,0x77,0xf1,0x28,0xfb,0xc1,0xc3,
0xce,0x10,0xf1,0x28,0xfd,0xe1,0x36,0x25,0xc9,0xe5,0x1f,0xda,0xaa,0x11,0x28,0x14,
0x11,0x84,0x13,0xcd,0x49,0x0a,0x16,0x10,0xfa,0x32,0x11,0xe1,0xc1,0xcd,0xbd,0x0f,
0x2b,0x36,0x25,0xc9,0x01,0x0e,0xb6,0x11,0xca,0x1b,0xcd,0x0c,0x0a,0xf2,0x1b,0x11,
0x16,0x06,0xcd,0x55,0x09,0xc4,0x01,0x12,0xe1,0xc1,0xfa,0x57,0x11,0xc5,0x5f,0x78,
0x92,0x93,0xf4,0x69,0x12,0xcd,0x7d,0x12,0xcd,0xa4,0x12,0xb3,0xc4,0x77,0x12,0xb3,
0xc4,0x91,0x12,0xd1,0xc3,0xb6,0x10,0x5f,0x79,0xb7,0xc4,0x16,0x0f,0x83,0xfa,0x62,
0x11,0xaf,0xc5,0xf5,0xfc,0x18,0x0f,0xfa,0x64,0x11,0xc1,0x7b,0x90,0xc1,0x5f,0x82,
0x78,0xfa,0x7f,0x11,0x92,0x93,0xf4,0x69,0x12,0xc5,0xcd,0x7d,0x12,0x18,0x11,0xcd,
0x69,0x12,0x79,0xcd,0x94,0x12,0x4f,0xaf,0x92,0x93,0xcd,0x69,0x12,0xc5,0x47,0x4f,
0xcd,0xa4,0x12,0xc1,0xb1,0x20,0x03,0x2a,0xf3,0x40,0x83,0x3d,0xf4,0x69,0x12,0x50,
0xc3,0xbf,0x10,0xe5,0xd5,0xcd,0xcc,0x0a,0xd1,0xaf,0xca,0xb0,0x11,0x1e,0x10,0x01,
0x1e,0x06,0xcd,0x55,0x09,0x37,0xc4,0x01,0x12,0xe1,0xc1,0xf5,0x79,0xb7,0xf5,0xc4,
0x16,0x0f,0x80,0x4f,0x7a,0xe6,0x04,0xfe,0x01,0x9f,0x57,0x81,0x4f,0x93,0xf5,0xc5,
0xfc,0x18,0x0f,0xfa,0xd0,0x11,0xc1,0xf1,0xc5,0xf5,0xfa,0xde,0x11,0xaf,0x2f,0x3c,
0x80,0x3c,0x82,0x47,0x0e,0x00,0xcd,0xa4,0x12,0xf1,0xf4,0x71,0x12,0xc1,0xf1,0xcc,
0x2f,0x09,0xf1,0x38,0x03,0x83,0x90,0x92,0xc5,0xcd,0x74,0x10,0xeb,0xd1,0xc3,0xbf,
0x10,0xd5,0xaf,0xf5,0xe7,0xe2,0x22,0x12,0x3a,0x24,0x41,0xfe,0x91,0xd2,0x22,0x12,
0x11,0x64,0x13,0x21,0x27,0x41,0xcd,0xd3,0x09,0xcd,0xa1,0x0d,0xf1,0xd6,0x0a,0xf5,
0x18,0xe6,0xcd,0x4f,0x12,0xe7,0x30,0x0b,0x01,0x43,0x91,0x11,0xf9,0x4f,0xcd,0x0c,
0x0a,0x18,0x06,0x11,0x6c,0x13,0xcd,0x49,0x0a,0xf2,0x4b,0x12,0xf1,0xcd,0x0b,0x0f,
0xf5,0x18,0xe2,0xf1,0xcd,0x18,0x0f,0xf5,0xcd,0x4f,0x12,0xf1,0xd1,0xb7,0xc9,0xe7,
0xea,0x5e,0x12,0x01,0x74,0x94,0x11,0xf8,0x23,0xcd,0x0c,0x0a,0x18,0x06,0x11,0x74,
0x13,0xcd,0x49,0x0a,0xe1,0xf2,0x43,0x12,0xe9,0xb7,0xc8,0x3d,0x36,0x30,0x23,0x18,
0xf9,0x20,0x04,0xc8,0xcd,0x91,0x12,0x36,0x30,0x23,0x3d,0x18,0xf6,0x7b,0x82,0x3c,
0x47,0x3c,0xd6,0x03,0x30,0xfc,0xc6,0x05,0x4f,0x3a,0xd8,0x40,0xe6,0x40,0xc0,0x4f,
0xc9,0x05,0x20,0x08,0x36,0x2e,0x22,0xf3,0x40,0x23,0x48,0xc9,0x0d,0xc0,0x36,0x2c,
0x23,0x0e,0x03,0xc9,0xd5,0xe7,0xe2,0xea,0x12,0xc5,0xe5,0xcd,0xfc,0x09,0x21,0x7c,
0x13,0xcd,0xf7,0x09,0xcd,0x77,0x0c,0xaf,0xcd,0x7b,0x0b,0xe1,0xc1,0x11,0x8c,0x13,
0x3e,0x0a,0xcd,0x91,0x12,0xc5,0xf5,0xe5,0xd5,0x06,0x2f,0x04,0xe1,0xe5,0xcd,0x48,
0x0d,0x30,0xf8,0xe1,0xcd,0x36,0x0d,0xeb,0xe1,0x70,0x23,0xf1,0xc1,0x3d,0x20,0xe2,
0xc5,0xe5,0x21,0x1d,0x41,0xcd,0xb1,0x09,0x18,0x0c,0xc5,0xe5,0xcd,0x08,0x07,0x3c,
0xcd,0xfb,0x0a,0xcd,0xb4,0x09,0xe1,0xc1,0xaf,0x11,0xd2,0x13,0x3f,0xcd,0x91,0x12,
0xc5,0xf5,0xe5,0xd5,0xcd,0xbf,0x09,0xe1,0x06,0x2f,0x04,0x7b,0x96,0x5f,0x23,0x7a,
0x9e,0x57,0x23,0x79,0x9e,0x4f,0x2b,0x2b,0x30,0xf0,0xcd,0xb7,0x07,0x23,0xcd,0xb4,
0x09,0xeb,0xe1,0x70,0x23,0xf1,0xc1,0x38,0xd3,0x13,0x13,0x3e,0x04,0x18,0x06,0xd5,
0x11,0xd8,0x13,0x3e,0x05,0xcd,0x91,0x12,0xc5,0xf5,0xe5,0xeb,0x4e,0x23,0x46,0xc5,
0x23,0xe3,0xeb,0x2a,0x21,0x41,0x06,0x2f,0x04,0x7d,0x93,0x6f,0x7c,0x9a,0x67,0x30,
0xf7,0x19,0x22,0x21,0x41,0xd1,0xe1,0x70,0x23,0xf1,0xc1,0x3d,0x20,0xd7,0xcd,0x91,
0x12,0x77,0xd1,0xc9,0x00,0x00,0x00,0x00,0xf9,0x02,0x15,0xa2,0xfd,0xff,0x9f,0x31,
0xa9,0x5f,0x63,0xb2,0xfe,0xff,0x03,0xbf,0xc9,0x1b,0x0e,0xb6,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0x00,0x00,0x04,0xbf,0xc9,0x1b,0x0e,0xb6,0x00,0x80,0xc6,0xa4,
0x7e,0x8d,0x03,0x00,0x40,0x7a,0x10,0xf3,0x5a,0x00,0x00,0xa0,0x72,0x4e,0x18,0x09,
0x00,0x00,0x10,0xa5,0xd4,0xe8,0x00,0x00,0x00,0xe8,0x76,0x48,0x17,0x00,0x00,0x00,
0xe4,0x0b,0x54,0x02,0x00,0x00,0x00,0xca,0x9a,0x3b,0x00,0x00,0x00,0x00,0xe1,0xf5,
0x05,0x00,0x00,0x00,0x80,0x96,0x98,0x00,0x00,0x00,0x00,0x40,0x42,0x0f,0x00,0x00,
0x00,0x00,0xa0,0x86,0x01,0x10,0x27,0x00,0x10,0x27,0xe8,0x03,0x64,0x00,0x0a,0x00,
0x01,0x00,0x21,0x82,0x09,0xe3,0xe9,0xcd,0xa4,0x09,0x21,0x80,0x13,0xcd,0xb1,0x09,
0x18,0x03,0xcd,0xb1,0x0a,0xc1,0xd1,0xcd,0x55,0x09,0x78,0x28,0x3c,0xf2,0x04,0x14,
0xb7,0xca,0x9a,0x19,0xb7,0xca,0x79,0x07,0xd5,0xc5,0x79,0xf6,0x7f,0xcd,0xbf,0x09,
0xf2,0x21,0x14,0xd5,0xc5,0xcd,0x40,0x0b,0xc1,0xd1,0xf5,0xcd,0x0c,0x0a,0xe1,0x7c,
0x1f,0xe1,0x22,0x23,0x41,0xe1,0x22,0x21,0x41,0xdc,0xe2,0x13,0xcc,0x82,0x09,0xd5,
0xc5,0xcd,0x09,0x08,0xc1,0xd1,0xcd,0x47,0x08,0xcd,0xa4,0x09,0x01,0x38,0x81,0x11,
0x3b,0xaa,0xcd,0x47,0x08,0x3a,0x24,0x41,0xfe,0x88,0xd2,0x31,0x09,0xcd,0x40,0x0b,
0xc6,0x80,0xc6,0x02,0xda,0x31,0x09,0xf5,0x21,0xf8,0x07,0xcd,0x0b,0x07,0xcd,0x41,
0x08,0xf1,0xc1,0xd1,0xf5,0xcd,0x13,0x07,0xcd,0x82,0x09,0x21,0x79,0x14,0xcd,0xa9,
0x14,0x11,0x00,0x00,0xc1,0x4a,0xc3,0x47,0x08,0x08,0x40,0x2e,0x94,0x74,0x70,0x4f,
0x2e,0x77,0x6e,0x02,0x88,0x7a,0xe6,0xa0,0x2a,0x7c,0x50,0xaa,0xaa,0x7e,0xff,0xff,
0x7f,0x7f,0x00,0x00,0x80,0x81,0x00,0x00,0x00,0x81,0xcd,0xa4,0x09,0x11,0x32,0x0c,
0xd5,0xe5,0xcd,0xbf,0x09,0xcd,0x47,0x08,0xe1,0xcd,0xa4,0x09,0x7e,0x23,0xcd,0xb1,
0x09,0x06,0xf1,0xc1,0xd1,0x3d,0xc8,0xd5,0xc5,0xf5,0xe5,0xcd,0x47,0x08,0xe1,0xcd,
0xc2,0x09,0xe5,0xcd,0x16,0x07,0xe1,0x18,0xe9,0xcd,0x7f,0x0a,0x7c,0xb7,0xfa,0x4a,
0x1e,0xb5,0xca,0xf0,0x14,0xe5,0xcd,0xf0,0x14,0xcd,0xbf,0x09,0xeb,0xe3,0xc5,0xcd,
0xcf,0x0a,0xc1,0xd1,0xcd,0x47,0x08,0x21,0xf8,0x07,0xcd,0x0b,0x07,0xc3,0x40,0x0b,
0x21,0x90,0x40,0xe5,0x11,0x00,0x00,0x4b,0x26,0x03,0x2e,0x08,0xeb,0x29,0xeb,0x79,
0x17,0x4f,0xe3,0x7e,0x07,0x77,0xe3,0xd2,0x16,0x15,0xe5,0x2a,0xaa,0x40,0x19,0xeb,
0x3a,0xac,0x40,0x89,0x4f,0xe1,0x2d,0xc2,0xfc,0x14,0xe3,0x23,0xe3,0x25,0xc2,0xfa,
0x14,0xe1,0x21,0x65,0xb0,0x19,0x22,0xaa,0x40,0xcd,0xef,0x0a,0x3e,0x05,0x89,0x32,
0xac,0x40,0xeb,0x06,0x80,0x21,0x25,0x41,0x70,0x2b,0x70,0x4f,0x06,0x00,0xc3,0x65,
0x07,0x21,0x8b,0x15,0xcd,0x0b,0x07,0xcd,0xa4,0x09,0x01,0x49,0x83,0x11,0xdb,0x0f,
0xcd,0xb4,0x09,0xc1,0xd1,0xcd,0xa2,0x08,0xcd,0xa4,0x09,0xcd,0x40,0x0b,0xc1,0xd1,
0xcd,0x13,0x07,0x21,0x8f,0x15,0xcd,0x10,0x07,0xcd,0x55,0x09,0x37,0xf2,0x77,0x15,
0xcd,0x08,0x07,0xcd,0x55,0x09,0xb7,0xf5,0xf4,0x82,0x09,0x21,0x8f,0x15,0xcd,0x0b,
0x07,0xf1,0xd4,0x82,0x09,0x21,0x93,0x15,0xc3,0x9a,0x14,0xdb,0x0f,0x49,0x81,0x00,
0x00,0x00,0x7f,0x05,0xba,0xd7,0x1e,0x86,0x64,0x26,0x99,0x87,0x58,0x34,0x23,0x87,
0xe0,0x5d,0xa5,0x86,0xda,0x0f,0x49,0x83,0xcd,0xa4,0x09,0xcd,0x47,0x15,0xc1,0xe1,
0xcd,0xa4,0x09,0xeb,0xcd,0xb4,0x09,0xcd,0x41,0x15,0xc3,0xa0,0x08,0xcd,0x55,0x09,
0xfc,0xe2,0x13,0xfc,0x82,0x09,0x3a,0x24,0x41,0xfe,0x81,0x38,0x0c,0x01,0x00,0x81,
0x51,0x59,0xcd,0xa2,0x08,0x21,0x10,0x07,0xe5,0x21,0xe3,0x15,0xcd,0x9a,0x14,0x21,
0x8b,0x15,0xc9,0x09,0x4a,0xd7,0x3b,0x78,0x02,0x6e,0x84,0x7b,0xfe,0xc1,0x2f,0x7c,
0x74,0x31,0x9a,0x7d,0x84,0x3d,0x5a,0x7d,0xc8,0x7f,0x91,0x7e,0xe4,0xbb,0x4c,0x7e,
0x6c,0xaa,0xaa,0x7f,0x00,0x00,0x00,0x81,0x8a,0x09,0x37,0x0b,0x77,0x09,0xd4,0x27,
0xef,0x2a,0xf5,0x27,0xe7,0x13,0xc9,0x14,0x09,0x08,0x39,0x14,0x41,0x15,0x47,0x15,
0xa8,0x15,0xbd,0x15,0xaa,0x2c,0x52,0x41,0x58,0x41,0x5e,0x41,0x61,0x41,0x64,0x41,
0x67,0x41,0x6a,0x41,0x6d,0x41,0x70,0x41,0x7f,0x0a,0xb1,0x0a,0xdb,0x0a,0x26,0x0b,
0x03,0x2a,0x36,0x28,0xc5,0x2a,0x0f,0x2a,0x1f,0x2a,0x61,0x2a,0x91,0x2a,0x9a,0x2a,
0xc5,0x4e,0x44,0xc6,0x4f,0x52,0xd2,0x45,0x53,0x45,0x54,0xd3,0x45,0x54,0xc3,0x4c,
0x53,0xc3,0x4d,0x44,0xd2,0x41,0x4e,0x44,0x4f,0x4d,0xce,0x45,0x58,0x54,0xc4,0x41,
0x54,0x41,0xc9,0x4e,0x50,0x55,0x54,0xc4,0x49,0x4d,0xd2,0x45,0x41,0x44,0xcc,0x45,
0x54,0xc7,0x4f,0x54,0x4f,0xd2,0x55,0x4e,0xc9,0x46,0xd2,0x45,0x53,0x54,0x4f,0x52,
0x45,0xc7,0x4f,0x53,0x55,0x42,0xd2,0x45,0x54,0x55,0x52,0x4e,0xd2,0x45,0x4d,0xd3,
0x54,0x4f,0x50,0xc5,0x4c,0x53,0x45,0xd4,0x52,0x4f,0x4e,0xd4,0x52,0x4f,0x46,0x46,
0xc4,0x45,0x46,0x53,0x54,0x52,0xc4,0x45,0x46,0x49,0x4e,0x54,0xc4,0x45,0x46,0x53,
0x4e,0x47,0xc4,0x45,0x46,0x44,0x42,0x4c,0xcc,0x49,0x4e,0x45,0xc5,0x44,0x49,0x54,
0xc5,0x52,0x52,0x4f,0x52,0xd2,0x45,0x53,0x55,0x4d,0x45,0xcf,0x55,0x54,0xcf,0x4e,
0xcf,0x50,0x45,0x4e,0xc6,0x49,0x45,0x4c,0x44,0xc7,0x45,0x54,0xd0,0x55,0x54,0xc3,
0x4c,0x4f,0x53,0x45,0xcc,0x4f,0x41,0x44,0xcd,0x45,0x52,0x47,0x45,0xce,0x41,0x4d,
0x45,0xcb,0x49,0x4c,0x4c,0xcc,0x53,0x45,0x54,0xd2,0x53,0x45,0x54,0xd3,0x41,0x56,
0x45,0xd3,0x59,0x53,0x54,0x45,0x4d,0xcc,0x50,0x52,0x49,0x4e,0x54,0xc4,0x45,0x46,
0xd0,0x4f,0x4b,0x45,0xd0,0x52,0x49,0x4e,0x54,0xc3,0x4f,0x4e,0x54,0xcc,0x49,0x53,
0x54,0xcc,0x4c,0x49,0x53,0x54,0xc4,0x45,0x4c,0x45,0x54,0x45,0xc1,0x55,0x54,0x4f,
0xc3,0x4c,0x45,0x41,0x52,0xc3,0x4c,0x4f,0x41,0x44,0xc3,0x53,0x41,0x56,0x45,0xce,
0x45,0x57,0xd4,0x41,0x42,0x28,0xd4,0x4f,0xc6,0x4e,0xd5,0x53,0x49,0x4e,0x47,0xd6,
0x41,0x52,0x50,0x54,0x52,0xd5,0x53,0x52,0xc5,0x52,0x4c,0xc5,0x52,0x52,0xd3,0x54,
0x52,0x49,0x4e,0x47,0x24,0xc9,0x4e,0x53,0x54,0x52,0xd0,0x4f,0x49,0x4e,0x54,0xd4,
0x49,0x4d,0x45,0x24,0xcd,0x45,0x4d,0xc9,0x4e,0x4b,0x45,0x59,0x24,0xd4,0x48,0x45,
0x4e,0xce,0x4f,0x54,0xd3,0x54,0x45,0x50,0xab,0xad,0xaa,0xaf,0xdb,0xc1,0x4e,0x44,
0xcf,0x52,0xbe,0xbd,0xbc,0xd3,0x47,0x4e,0xc9,0x4e,0x54,0xc1,0x42,0x53,0xc6,0x52,
0x45,0xc9,0x4e,0x50,0xd0,0x4f,0x53,0xd3,0x51,0x52,0xd2,0x4e,0x44,0xcc,0x4f,0x47,
0xc5,0x58,0x50,0xc3,0x4f,0x53,0xd3,0x49,0x4e,0xd4,0x41,0x4e,0xc1,0x54,0x4e,0xd0,
0x45,0x45,0x4b,0xc3,0x56,0x49,0xc3,0x56,0x53,0xc3,0x56,0x44,0xc5,0x4f,0x46,0xcc,
0x4f,0x43,0xcc,0x4f,0x46,0xcd,0x4b,0x49,0x24,0xcd,0x4b,0x53,0x24,0xcd,0x4b,0x44,
0x24,0xc3,0x49,0x4e,0x54,0xc3,0x53,0x4e,0x47,0xc3,0x44,0x42,0x4c,0xc6,0x49,0x58,
0xcc,0x45,0x4e,0xd3,0x54,0x52,0x24,0xd6,0x41,0x4c,0xc1,0x53,0x43,0xc3,0x48,0x52,
0x24,0xcc,0x45,0x46,0x54,0x24,0xd2,0x49,0x47,0x48,0x54,0x24,0xcd,0x49,0x44,0x24,
0xa7,0x80,0xae,0x1d,0xa1,0x1c,0x38,0x01,0x35,0x01,0xc9,0x01,0x73,0x41,0xd3,0x01,
0xb6,0x22,0x05,0x1f,0x9a,0x21,0x08,0x26,0xef,0x21,0x21,0x1f,0xc2,0x1e,0xa3,0x1e,
0x39,0x20,0x91,0x1d,0xb1,0x1e,0xde,0x1e,0x07,0x1f,0xa9,0x1d,0x07,0x1f,0xf7,0x1d,
0xf8,0x1d,0x00,0x1e,0x03,0x1e,0x06,0x1e,0x09,0x1e,0xa3,0x41,0x60,0x2e,0xf4,0x1f,
0xaf,0x1f,0xfb,0x2a,0x6c,0x1f,0x79,0x41,0x7c,0x41,0x7f,0x41,0x82,0x41,0x85,0x41,
0x88,0x41,0x8b,0x41,0x8e,0x41,0x91,0x41,0x97,0x41,0x9a,0x41,0xa0,0x41,0xb2,0x02,
0x67,0x20,0x5b,0x41,0xb1,0x2c,0x6f,0x20,0xe4,0x1d,0x2e,0x2b,0x29,0x2b,0xc6,0x2b,
0x08,0x20,0x7a,0x1e,0x1f,0x2c,0xf5,0x2b,0x49,0x1b,0x79,0x79,0x7c,0x7c,0x7f,0x50,
0x46,0xdb,0x0a,0x00,0x00,0x7f,0x0a,0xf4,0x0a,0xb1,0x0a,0x77,0x0c,0x70,0x0c,0xa1,
0x0d,0xe5,0x0d,0x78,0x0a,0x16,0x07,0x13,0x07,0x47,0x08,0xa2,0x08,0x0c,0x0a,0xd2,
0x0b,0xc7,0x0b,0xf2,0x0b,0x90,0x24,0x39,0x0a,0x4e,0x46,0x53,0x4e,0x52,0x47,0x4f,
0x44,0x46,0x43,0x4f,0x56,0x4f,0x4d,0x55,0x4c,0x42,0x53,0x44,0x44,0x2f,0x30,0x49,
0x44,0x54,0x4d,0x4f,0x53,0x4c,0x53,0x53,0x54,0x43,0x4e,0x4e,0x52,0x52,0x57,0x55,
0x45,0x4d,0x4f,0x46,0x44,0x4c,0x33,0xd6,0x00,0x6f,0x7c,0xde,0x00,0x67,0x78,0xde,
0x00,0x47,0x3e,0x00,0xc9,0x4a,0x1e,0x40,0xe6,0x4d,0xdb,0x00,0xc9,0xd3,0x00,0xc9,
0x00,0x00,0x00,0x00,0x40,0x30,0x00,0x4c,0x44,0xfe,0xff,0xe9,0x43,0x20,0x45,0x72,
0x72,0x6f,0x72,0x00,0x20,0x69,0x6e,0x20,0x00,0x52,0x45,0x41,0x44,0x59,0x0d,0x00,
0x42,0x72,0x65,0x61,0x6b,0x00,0x21,0x04,0x00,0x39,0x7e,0x23,0xfe,0x81,0xc0,0x4e,
0x23,0x46,0x23,0xe5,0x69,0x60,0x7a,0xb3,0xeb,0x28,0x02,0xeb,0xdf,0x01,0x0e,0x00,
0xe1,0xc8,0x09,0x18,0xe5,0xcd,0x6c,0x19,0xc5,0xe3,0xc1,0xdf,0x7e,0x02,0xc8,0x0b,
0x2b,0x18,0xf8,0xe5,0x2a,0xfd,0x40,0x06,0x00,0x09,0x09,0x3e,0xe5,0x3e,0xc6,0x95,
0x6f,0x3e,0xff,0x9c,0x38,0x04,0x67,0x39,0xe1,0xd8,0x1e,0x0c,0x18,0x24,0x2a,0xa2,
0x40,0x7c,0xa5,0x3c,0x28,0x08,0x3a,0xf2,0x40,0xb7,0x1e,0x22,0x20,0x14,0xc3,0xc1,
0x1d,0x2a,0xda,0x40,0x22,0xa2,0x40,0x1e,0x02,0x01,0x1e,0x14,0x01,0x1e,0x00,0x01,
0x1e,0x24,0x2a,0xa2,0x40,0x22,0xea,0x40,0x22,0xec,0x40,0x01,0xb4,0x19,0x2a,0xe8,
0x40,0xc3,0x9a,0x1b,0xc1,0x7b,0x4b,0x32,0x9a,0x40,0x2a,0xe6,0x40,0x22,0xee,0x40,
0xeb,0x2a,0xea,0x40,0x7c,0xa5,0x3c,0x28,0x07,0x22,0xf5,0x40,0xeb,0x22,0xf7,0x40,
0x2a,0xf0,0x40,0x7c,0xb5,0xeb,0x21,0xf2,0x40,0x28,0x08,0xa6,0x20,0x05,0x35,0xeb,
0xc3,0x36,0x1d,0xaf,0x77,0x59,0xcd,0xf9,0x20,0x21,0xc9,0x18,0xcd,0xa6,0x41,0x57,
0x3e,0x3f,0xcd,0x2a,0x03,0x19,0x7e,0xcd,0x2a,0x03,0xd7,0xcd,0x2a,0x03,0x21,0x1d,
0x19,0xe5,0x2a,0xea,0x40,0xe3,0xcd,0xa7,0x28,0xe1,0x11,0xfe,0xff,0xdf,0xca,0x74,
0x06,0x7c,0xa5,0x3c,0xc4,0xa7,0x0f,0x3e,0xc1,0xcd,0x8b,0x03,0xcd,0xac,0x41,0xcd,
0xf8,0x01,0xcd,0xf9,0x20,0x21,0x29,0x19,0xcd,0xa7,0x28,0x3a,0x9a,0x40,0xd6,0x02,
0xcc,0x53,0x2e,0x21,0xff,0xff,0x22,0xa2,0x40,0x3a,0xe1,0x40,0xb7,0x28,0x37,0x2a,
0xe2,0x40,0xe5,0xcd,0xaf,0x0f,0xd1,0xd5,0xcd,0x2c,0x1b,0x3e,0x2a,0x38,0x02,0x3e,
0x20,0xcd,0x2a,0x03,0xcd,0x61,0x03,0xd1,0x30,0x06,0xaf,0x32,0xe1,0x40,0x18,0xb9,
0x2a,0xe4,0x40,0x19,0x38,0xf4,0xd5,0x11,0xf9,0xff,0xdf,0xd1,0x30,0xec,0x22,0xe2,
0x40,0xf6,0xff,0xc3,0xeb,0x2f,0x3e,0x3e,0xcd,0x2a,0x03,0xcd,0x61,0x03,0xda,0x33,
0x1a,0xd7,0x3c,0x3d,0xca,0x33,0x1a,0xf5,0xcd,0x5a,0x1e,0x2b,0x7e,0xfe,0x20,0x28,
0xfa,0x23,0x7e,0xfe,0x20,0xcc,0xc9,0x09,0xd5,0xcd,0xc0,0x1b,0xd1,0xf1,0x22,0xe6,
0x40,0xcd,0xb2,0x41,0xd2,0x5a,0x1d,0xd5,0xc5,0xaf,0x32,0xdd,0x40,0xd7,0xb7,0xf5,
0xeb,0x22,0xec,0x40,0xeb,0xcd,0x2c,0x1b,0xc5,0xdc,0xe4,0x2b,0xd1,0xf1,0xd5,0x28,
0x27,0xd1,0x2a,0xf9,0x40,0xe3,0xc1,0x09,0xe5,0xcd,0x55,0x19,0xe1,0x22,0xf9,0x40,
0xeb,0x74,0xd1,0xe5,0x23,0x23,0x73,0x23,0x72,0x23,0xeb,0x2a,0xa7,0x40,0xeb,0x1b,
0x1b,0x1a,0x77,0x23,0x13,0xb7,0x20,0xf9,0xd1,0xcd,0xfc,0x1a,0xcd,0xb5,0x41,0xcd,
0x5d,0x1b,0xcd,0xb8,0x41,0xc3,0x33,0x1a,0x2a,0xa4,0x40,0xeb,0x62,0x6b,0x7e,0x23,
0xb6,0xc8,0x23,0x23,0x23,0xaf,0xbe,0x23,0x20,0xfc,0xeb,0x73,0x23,0x72,0x18,0xec,
0x11,0x00,0x00,0xd5,0x28,0x09,0xd1,0xcd,0x4f,0x1e,0xd5,0x28,0x0b,0xcf,0xce,0x11,
0xfa,0xff,0xc4,0x4f,0x1e,0xc2,0x97,0x19,0xeb,0xd1,0xe3,0xe5,0x2a,0xa4,0x40,0x44,
0x4d,0x7e,0x23,0xb6,0x2b,0xc8,0x23,0x23,0x7e,0x23,0x66,0x6f,0xdf,0x60,0x69,0x7e,
0x23,0x66,0x6f,0x3f,0xc8,0x3f,0xd0,0x18,0xe6,0xc0,0xcd,0xc9,0x01,0x2a,0xa4,0x40,
0xcd,0xf8,0x1d,0x32,0xe1,0x40,0x77,0x23,0x77,0x23,0x22,0xf9,0x40,0xcd,0x6b,0x04,
0x2b,0x22,0xdf,0x40,0x06,0x1a,0x21,0x01,0x41,0x36,0x04,0x23,0x10,0xfb,0xaf,0x32,
0xf2,0x40,0x6f,0x67,0x22,0xf0,0x40,0x22,0xf7,0x40,0x2a,0xb1,0x40,0x22,0xd6,0x40,
0xcd,0x91,0x1d,0x2a,0xf9,0x40,0x22,0xfb,0x40,0x22,0xfd,0x40,0xcd,0xbb,0x41,0xc1,
0x2a,0xa0,0x40,0x2b,0x2b,0x22,0xe8,0x40,0x23,0x23,0xf9,0x21,0xb5,0x40,0x22,0xb3,
0x40,0xcd,0x8b,0x03,0xcd,0x69,0x21,0xaf,0x67,0x6f,0x32,0xdc,0x40,0xe5,0xc5,0x2a,
0xdf,0x40,0xc9,0x3e,0x3f,0xcd,0x2a,0x03,0x3e,0x20,0xcd,0x2a,0x03,0xc3,0x61,0x03,
0xaf,0x32,0xb0,0x40,0x4f,0xeb,0x2a,0xa7,0x40,0x2b,0x2b,0xeb,0x7e,0xfe,0x20,0xca,
0x5b,0x1c,0x47,0xfe,0x22,0xca,0x77,0x1c,0xb7,0xca,0x7d,0x1c,0x3a,0xb0,0x40,0xb7,
0x7e,0xc2,0x5b,0x1c,0xfe,0x3f,0x3e,0xb2,0xca,0x5b,0x1c,0x7e,0xfe,0x30,0x38,0x05,
0xfe,0x3c,0xda,0x5b,0x1c,0xd5,0x11,0x4f,0x16,0xc5,0x01,0x3d,0x1c,0xc5,0x06,0x7f,
0x7e,0xfe,0x61,0x38,0x07,0xfe,0x7b,0x30,0x03,0xe6,0x5f,0x77,0x4e,0xeb,0x23,0xb6,
0xf2,0x0e,0x1c,0x04,0x7e,0xe6,0x7f,0xc8,0xb9,0x20,0xf3,0xeb,0xe5,0x13,0x1a,0xb7,
0xfa,0x39,0x1c,0x4f,0x78,0xfe,0x8d,0x20,0x02,0xd7,0x2b,0x23,0x7e,0xfe,0x61,0x38,
0x02,0xe6,0x5f,0xb9,0x28,0xe7,0xe1,0x18,0xd3,0x48,0xf1,0xeb,0xc9,0xeb,0x79,0xc1,
0xd1,0xeb,0xfe,0x95,0x36,0x3a,0x20,0x02,0x0c,0x23,0xfe,0xfb,0x20,0x0c,0x36,0x3a,
0x23,0x06,0x93,0x70,0x23,0xeb,0x0c,0x0c,0x18,0x1d,0xeb,0x23,0x12,0x13,0x0c,0xd6,
0x3a,0x28,0x04,0xfe,0x4e,0x20,0x03,0x32,0xb0,0x40,0xd6,0x59,0xc2,0xcc,0x1b,0x47,
0x7e,0xb7,0x28,0x09,0xb8,0x28,0xe4,0x23,0x12,0x0c,0x13,0x18,0xf3,0x21,0x05,0x00,
0x44,0x09,0x44,0x4d,0x2a,0xa7,0x40,0x2b,0x2b,0x2b,0x12,0x13,0x12,0x13,0x12,0xc9,
0x7c,0x92,0xc0,0x7d,0x93,0xc9,0x7e,0xe3,0xbe,0x23,0xe3,0xca,0x78,0x1d,0xc3,0x97,
0x19,0x3e,0x64,0x32,0xdc,0x40,0xcd,0x21,0x1f,0xe3,0xcd,0x36,0x19,0xd1,0x20,0x05,
0x09,0xf9,0x22,0xe8,0x40,0xeb,0x0e,0x08,0xcd,0x63,0x19,0xe5,0xcd,0x05,0x1f,0xe3,
0xe5,0x2a,0xa2,0x40,0xe3,0xcf,0xbd,0xe7,0xca,0xf6,0x0a,0xd2,0xf6,0x0a,0xf5,0xcd,
0x37,0x23,0xf1,0xe5,0xf2,0xec,0x1c,0xcd,0x7f,0x0a,0xe3,0x11,0x01,0x00,0x7e,0xfe,
0xcc,0xcc,0x01,0x2b,0xd5,0xe5,0xeb,0xcd,0x9e,0x09,0x18,0x22,0xcd,0xb1,0x0a,0xcd,
0xbf,0x09,0xe1,0xc5,0xd5,0x01,0x00,0x81,0x51,0x5a,0x7e,0xfe,0xcc,0x3e,0x01,0x20,
0x0e,0xcd,0x38,0x23,0xe5,0xcd,0xb1,0x0a,0xcd,0xbf,0x09,0xcd,0x55,0x09,0xe1,0xc5,
0xd5,0x4f,0xe7,0x47,0xc5,0xe5,0x2a,0xdf,0x40,0xe3,0x06,0x81,0xc5,0x33,0xcd,0x58,
0x03,0xb7,0xc4,0xa0,0x1d,0x22,0xe6,0x40,0xed,0x73,0xe8,0x40,0x7e,0xfe,0x3a,0x28,
0x29,0xb7,0xc2,0x97,0x19,0x23,0x7e,0x23,0xb6,0xca,0x7e,0x19,0x23,0x5e,0x23,0x56,
0xeb,0x22,0xa2,0x40,0x3a,0x1b,0x41,0xb7,0x28,0x0f,0xd5,0x3e,0x3c,0xcd,0x2a,0x03,
0xcd,0xaf,0x0f,0x3e,0x3e,0xcd,0x2a,0x03,0xd1,0xeb,0xd7,0x11,0x1e,0x1d,0xd5,0xc8,
0xd6,0x80,0xda,0x21,0x1f,0xfe,0x3c,0xd2,0xe7,0x2a,0x07,0x4f,0x06,0x00,0xeb,0x21,
0x22,0x18,0x09,0x4e,0x23,0x46,0xc5,0xeb,0x23,0x7e,0xfe,0x3a,0xd0,0xfe,0x20,0xca,
0x78,0x1d,0xfe,0x0b,0x30,0x05,0xfe,0x09,0xd2,0x78,0x1d,0xfe,0x30,0x3f,0x3c,0x3d,
0xc9,0xeb,0x2a,0xa4,0x40,0x2b,0x22,0xff,0x40,0xeb,0xc9,0xcd,0x58,0x03,0xb7,0xc8,
0xfe,0x60,0xcc,0x84,0x03,0x32,0x99,0x40,0x3d,0xc0,0x3c,0xc3,0xb4,0x1d,0xc0,0xf5,
0xcc,0xbb,0x41,0xf1,0x22,0xe6,0x40,0x21,0xb5,0x40,0x22,0xb3,0x40,0x21,0xf6,0xff,
0xc1,0x2a,0xa2,0x40,0xe5,0xf5,0x7d,0xa4,0x3c,0x28,0x09,0x22,0xf5,0x40,0x2a,0xe6,
0x40,0x22,0xf7,0x40,0xcd,0x8b,0x03,0xcd,0xf9,0x20,0xf1,0x21,0x30,0x19,0xc2,0x06,
0x1a,0xc3,0x18,0x1a,0x2a,0xf7,0x40,0x7c,0xb5,0x1e,0x20,0xca,0xa2,0x19,0xeb,0x2a,
0xf5,0x40,0x22,0xa2,0x40,0xeb,0xc9,0x3e,0xaf,0x32,0x1b,0x41,0xc9,0xf1,0xe1,0xc9,
0x1e,0x03,0x01,0x1e,0x02,0x01,0x1e,0x04,0x01,0x1e,0x08,0xcd,0x3d,0x1e,0x01,0x97,
0x19,0xc5,0xd8,0xd6,0x41,0x4f,0x47,0xd7,0xfe,0xce,0x20,0x09,0xd7,0xcd,0x3d,0x1e,
0xd8,0xd6,0x41,0x47,0xd7,0x78,0x91,0xd8,0x3c,0xe3,0x21,0x01,0x41,0x06,0x00,0x09,
0x73,0x23,0x3d,0x20,0xfb,0xe1,0x7e,0xfe,0x2c,0xc0,0xd7,0x18,0xce,0x7e,0xfe,0x41,
0xd8,0xfe,0x5b,0x3f,0xc9,0xd7,0xcd,0x02,0x2b,0xf0,0x1e,0x08,0xc3,0xa2,0x19,0x7e,
0xfe,0x2e,0xeb,0x2a,0xec,0x40,0xeb,0xca,0x78,0x1d,0x2b,0x11,0x00,0x00,0xd7,0xd0,
0xe5,0xf5,0x21,0x98,0x19,0xdf,0xda,0x97,0x19,0x62,0x6b,0x19,0x29,0x19,0x29,0xf1,
0xd6,0x30,0x5f,0x16,0x00,0x19,0xeb,0xe1,0x18,0xe4,0xca,0x61,0x1b,0xcd,0x46,0x1e,
0x2b,0xd7,0xc0,0xe5,0x2a,0xb1,0x40,0x7d,0x93,0x5f,0x7c,0x9a,0x57,0xda,0x7a,0x19,
0x2a,0xf9,0x40,0x01,0x28,0x00,0x09,0xdf,0xd2,0x7a,0x19,0xeb,0x22,0xa0,0x40,0xe1,
0xc3,0x61,0x1b,0xca,0x5d,0x1b,0xcd,0xc7,0x41,0xcd,0x61,0x1b,0x01,0x1e,0x1d,0x18,
0x10,0x0e,0x03,0xcd,0x63,0x19,0xc1,0xe5,0xe5,0x2a,0xa2,0x40,0xe3,0x3e,0x91,0xf5,
0x33,0xc5,0xcd,0x5a,0x1e,0xcd,0x07,0x1f,0xe5,0x2a,0xa2,0x40,0xdf,0xe1,0x23,0xdc,
0x2f,0x1b,0xd4,0x2c,0x1b,0x60,0x69,0x2b,0xd8,0x1e,0x0e,0xc3,0xa2,0x19,0xc0,0x16,
0xff,0xcd,0x36,0x19,0xf9,0x22,0xe8,0x40,0xfe,0x91,0x1e,0x04,0xc2,0xa2,0x19,0xe1,
0x22,0xa2,0x40,0x23,0x7c,0xb5,0x20,0x07,0x3a,0xdd,0x40,0xb7,0xc2,0x18,0x1a,0x21,
0x1e,0x1d,0xe3,0x3e,0xe1,0x01,0x3a,0x0e,0x00,0x06,0x00,0x79,0x48,0x47,0x7e,0xb7,
0xc8,0xb8,0xc8,0x23,0xfe,0x22,0x28,0xf3,0xd6,0x8f,0x20,0xf2,0xb8,0x8a,0x57,0x18,
0xed,0xcd,0x0d,0x26,0xcf,0xd5,0xeb,0x22,0xdf,0x40,0xeb,0xd5,0xe7,0xf5,0xcd,0x37,
0x23,0xf1,0xe3,0xc6,0x03,0xcd,0x19,0x28,0xcd,0x03,0x0a,0xe5,0x20,0x28,0x2a,0x21,
0x41,0xe5,0x23,0x5e,0x23,0x56,0x2a,0xa4,0x40,0xdf,0x30,0x0e,0x2a,0xa0,0x40,0xdf,
0xd1,0x30,0x0f,0x2a,0xf9,0x40,0xdf,0x30,0x09,0x3e,0xd1,0xcd,0xf5,0x29,0xeb,0xcd,
0x43,0x28,0xcd,0xf5,0x29,0xe3,0xcd,0xd3,0x09,0xd1,0xe1,0xc9,0xfe,0x9e,0x20,0x25,
0xd7,0xcf,0x8d,0xcd,0x5a,0x1e,0x7a,0xb3,0x28,0x09,0xcd,0x2a,0x1b,0x50,0x59,0xe1,
0xd2,0xd9,0x1e,0xeb,0x22,0xf0,0x40,0xeb,0xd8,0x3a,0xf2,0x40,0xb7,0xc8,0x3a,0x9a,
0x40,0x5f,0xc3,0xab,0x19,0xcd,0x1c,0x2b,0x7e,0x47,0xfe,0x91,0x28,0x03,0xcf,0x8d,
0x2b,0x4b,0x0d,0x78,0xca,0x60,0x1d,0xcd,0x5b,0x1e,0xfe,0x2c,0xc0,0x18,0xf3,0x11,
0xf2,0x40,0x1a,0xb7,0xca,0xa0,0x19,0x3c,0x32,0x9a,0x40,0x12,0x7e,0xfe,0x87,0x28,
0x0c,0xcd,0x5a,0x1e,0xc0,0x7a,0xb3,0xc2,0xc5,0x1e,0x3c,0x18,0x02,0xd7,0xc0,0x2a,
0xee,0x40,0xeb,0x2a,0xea,0x40,0x22,0xa2,0x40,0xeb,0xc0,0x7e,0xb7,0x20,0x04,0x23,
0x23,0x23,0x23,0x23,0x7a,0xa3,0x3c,0xc2,0x05,0x1f,0x3a,0xdd,0x40,0x3d,0xca,0xbe,
0x1d,0xc3,0x05,0x1f,0xcd,0x1c,0x2b,0xc0,0xb7,0xca,0x4a,0x1e,0x3d,0x87,0x5f,0xfe,
0x2d,0x38,0x02,0x1e,0x26,0xc3,0xa2,0x19,0x11,0x0a,0x00,0xd5,0x28,0x17,0xcd,0x4f,
0x1e,0xeb,0xe3,0x28,0x11,0xeb,0xcf,0x2c,0xeb,0x2a,0xe4,0x40,0xeb,0x28,0x06,0xcd,
0x5a,0x1e,0xc2,0x97,0x19,0xeb,0x7c,0xb5,0xca,0x4a,0x1e,0x22,0xe4,0x40,0x32,0xe1,
0x40,0xe1,0x22,0xe2,0x40,0xc1,0xc3,0x33,0x1a,0xcd,0x37,0x23,0x7e,0xfe,0x2c,0xcc,
0x78,0x1d,0xfe,0xca,0xcc,0x78,0x1d,0x2b,0xe5,0xcd,0x94,0x09,0xe1,0x28,0x07,0xd7,
0xda,0xc2,0x1e,0xc3,0x5f,0x1d,0x16,0x01,0xcd,0x05,0x1f,0xb7,0xc8,0xd7,0xfe,0x95,
0x20,0xf6,0x15,0x20,0xf3,0x18,0xe8,0x3e,0x01,0x32,0x9c,0x40,0xc3,0x7c,0x20,0xcd,
0xca,0x41,0xfe,0x23,0x20,0x06,0xcd,0x84,0x02,0x32,0x9c,0x40,0x2b,0xd7,0xcc,0xfe,
0x20,0xca,0x69,0x21,0xf6,0x20,0xfe,0x60,0x20,0x1b,0xcd,0x01,0x2b,0xfe,0x04,0xd2,
0x4a,0x1e,0xe5,0x21,0x00,0x3c,0x19,0x22,0x20,0x40,0x7b,0xe6,0x3f,0x32,0xa6,0x40,
0xe1,0xcf,0x2c,0x18,0xc7,0x7e,0xfe,0xbf,0xca,0xbd,0x2c,0xfe,0xbc,0xca,0x37,0x21,
0xe5,0xfe,0x2c,0x28,0x53,0xfe,0x3b,0x28,0x5e,0xcd,0x37,0x23,0xe3,0xe7,0x28,0x32,
0xcd,0xbd,0x0f,0xcd,0x65,0x28,0xcd,0xcd,0x41,0x2a,0x21,0x41,0x3a,0x9c,0x40,0xb7,
0xfa,0xe9,0x20,0x28,0x08,0x3a,0x9b,0x40,0x86,0xfe,0x84,0x18,0x09,0x3a,0x9d,0x40,
0x47,0x3a,0xa6,0x40,0x86,0xb8,0xd4,0xfe,0x20,0xcd,0xaa,0x28,0x3e,0x20,0xcd,0x2a,
0x03,0xb7,0xcc,0xaa,0x28,0xe1,0xc3,0x7c,0x20,0x3a,0xa6,0x40,0xb7,0xc8,0x3e,0x0d,
0xcd,0x2a,0x03,0xcd,0xd0,0x41,0xaf,0xc9,0xcd,0xd3,0x41,0x3a,0x9c,0x40,0xb7,0xf2,
0x19,0x21,0x3e,0x2c,0xcd,0x2a,0x03,0x18,0x4b,0x28,0x08,0x3a,0x9b,0x40,0xfe,0x70,
0xc3,0x2b,0x21,0x3a,0x9e,0x40,0x47,0x3a,0xa6,0x40,0xb8,0xd4,0xfe,0x20,0x30,0x34,
0xd6,0x10,0x30,0xfc,0x2f,0x18,0x23,0xcd,0x1b,0x2b,0xe6,0x7f,0x5f,0xcf,0x29,0x2b,
0xe5,0xcd,0xd3,0x41,0x3a,0x9c,0x40,0xb7,0xfa,0x4a,0x1e,0xca,0x53,0x21,0x3a,0x9b,
0x40,0x18,0x03,0x3a,0xa6,0x40,0x2f,0x83,0x30,0x0a,0x3c,0x47,0x3e,0x20,0xcd,0x2a,
0x03,0x05,0x20,0xfa,0xe1,0xd7,0xc3,0x81,0x20,0x3a,0x9c,0x40,0xb7,0xfc,0xf8,0x01,
0xaf,0x32,0x9c,0x40,0xcd,0xbe,0x41,0xc9,0x3f,0x52,0x45,0x44,0x4f,0x0d,0x00,0x3a,
0xde,0x40,0xb7,0xc2,0x91,0x19,0x3a,0xa9,0x40,0xb7,0x1e,0x2a,0xca,0xa2,0x19,0xc1,
0x21,0x78,0x21,0xcd,0xa7,0x28,0x2a,0xe6,0x40,0xc9,0xcd,0x28,0x28,0x7e,0xcd,0xd6,
0x41,0xd6,0x23,0x32,0xa9,0x40,0x7e,0x20,0x20,0xcd,0x93,0x02,0xe5,0x06,0xfa,0x2a,
0xa7,0x40,0xcd,0x35,0x02,0x77,0x23,0xfe,0x0d,0x28,0x02,0x10,0xf5,0x2b,0x36,0x00,
0xcd,0xf8,0x01,0x2a,0xa7,0x40,0x2b,0x18,0x22,0x01,0xdb,0x21,0xc5,0xfe,0x22,0xc0,
0xcd,0x66,0x28,0xcf,0x3b,0xe5,0xcd,0xaa,0x28,0xe1,0xc9,0xe5,0xcd,0xb3,0x1b,0xc1,
0xda,0xbe,0x1d,0x23,0x7e,0xb7,0x2b,0xc5,0xca,0x04,0x1f,0x36,0x2c,0x18,0x05,0xe5,
0x2a,0xff,0x40,0xf6,0xaf,0x32,0xde,0x40,0xe3,0x18,0x02,0xcf,0x2c,0xcd,0x0d,0x26,
0xe3,0xd5,0x7e,0xfe,0x2c,0x28,0x26,0x3a,0xde,0x40,0xb7,0xc2,0x96,0x22,0x3a,0xa9,
0x40,0xb7,0x1e,0x06,0xca,0xa2,0x19,0x3e,0x3f,0xcd,0x2a,0x03,0xcd,0xb3,0x1b,0xd1,
0xc1,0xda,0xbe,0x1d,0x23,0x7e,0xb7,0x2b,0xc5,0xca,0x04,0x1f,0xd5,0xcd,0xdc,0x41,
0xe7,0xf5,0x20,0x19,0xd7,0x57,0x47,0xfe,0x22,0x28,0x05,0x16,0x3a,0x06,0x2c,0x2b,
0xcd,0x69,0x28,0xf1,0xeb,0x21,0x5a,0x22,0xe3,0xd5,0xc3,0x33,0x1f,0xd7,0xf1,0xf5,
0x01,0x43,0x22,0xc5,0xda,0x6c,0x0e,0xd2,0x65,0x0e,0x2b,0xd7,0x28,0x05,0xfe,0x2c,
0xc2,0x7f,0x21,0xe3,0x2b,0xd7,0xc2,0xfb,0x21,0xd1,0x00,0x00,0x00,0x00,0x00,0x3a,
0xde,0x40,0xb7,0xeb,0xc2,0x96,0x1d,0xd5,0xcd,0xdf,0x41,0xb6,0x21,0x86,0x22,0xc4,
0xa7,0x28,0xe1,0xc3,0x69,0x21,0x3f,0x45,0x78,0x74,0x72,0x61,0x20,0x69,0x67,0x6e,
0x6f,0x72,0x65,0x64,0x0d,0x00,0xcd,0x05,0x1f,0xb7,0x20,0x12,0x23,0x7e,0x23,0xb6,
0x1e,0x06,0xca,0xa2,0x19,0x23,0x5e,0x23,0x56,0xeb,0x22,0xda,0x40,0xeb,0xd7,0xfe,
0x88,0x20,0xe3,0xc3,0x2d,0x22,0x11,0x00,0x00,0xc4,0x0d,0x26,0x22,0xdf,0x40,0xcd,
0x36,0x19,0xc2,0x9d,0x19,0xf9,0x22,0xe8,0x40,0xd5,0x7e,0x23,0xf5,0xd5,0x7e,0x23,
0xb7,0xfa,0xea,0x22,0xcd,0xb1,0x09,0xe3,0xe5,0xcd,0x0b,0x07,0xe1,0xcd,0xcb,0x09,
0xe1,0xcd,0xc2,0x09,0xe5,0xcd,0x0c,0x0a,0x18,0x29,0x23,0x23,0x23,0x23,0x4e,0x23,
0x46,0x23,0xe3,0x5e,0x23,0x56,0xe5,0x69,0x60,0xcd,0xd2,0x0b,0x3a,0xaf,0x40,0xfe,
0x04,0xca,0xb2,0x07,0xeb,0xe1,0x72,0x2b,0x73,0xe1,0xd5,0x5e,0x23,0x56,0x23,0xe3,
0xcd,0x39,0x0a,0xe1,0xc1,0x90,0xcd,0xc2,0x09,0x28,0x09,0xeb,0x22,0xa2,0x40,0x69,
0x60,0xc3,0x1a,0x1d,0xf9,0x22,0xe8,0x40,0x2a,0xdf,0x40,0x7e,0xfe,0x2c,0xc2,0x1e,
0x1d,0xd7,0xcd,0xb9,0x22,0xcf,0x28,0x2b,0x16,0x00,0xd5,0x0e,0x01,0xcd,0x63,0x19,
0xcd,0x9f,0x24,0x22,0xf3,0x40,0x2a,0xf3,0x40,0xc1,0x7e,0x16,0x00,0xd6,0xd4,0x38,
0x13,0xfe,0x03,0x30,0x0f,0xfe,0x01,0x17,0xaa,0xba,0x57,0xda,0x97,0x19,0x22,0xd8,
0x40,0xd7,0x18,0xe9,0x7a,0xb7,0xc2,0xec,0x23,0x7e,0x22,0xd8,0x40,0xd6,0xcd,0xd8,
0xfe,0x07,0xd0,0x5f,0x3a,0xaf,0x40,0xd6,0x03,0xb3,0xca,0x8f,0x29,0x21,0x9a,0x18,
0x19,0x78,0x56,0xba,0xd0,0xc5,0x01,0x46,0x23,0xc5,0x7a,0xfe,0x7f,0xca,0xd4,0x23,
0xfe,0x51,0xda,0xe1,0x23,0x21,0x21,0x41,0xb7,0x3a,0xaf,0x40,0x3d,0x3d,0x3d,0xca,
0xf6,0x0a,0x4e,0x23,0x46,0xc5,0xfa,0xc5,0x23,0x23,0x4e,0x23,0x46,0xc5,0xf5,0xb7,
0xe2,0xc4,0x23,0xf1,0x23,0x38,0x03,0x21,0x1d,0x41,0x4e,0x23,0x46,0x23,0xc5,0x4e,
0x23,0x46,0xc5,0x06,0xf1,0xc6,0x03,0x4b,0x47,0xc5,0x01,0x06,0x24,0xc5,0x2a,0xd8,
0x40,0xc3,0x3a,0x23,0xcd,0xb1,0x0a,0xcd,0xa4,0x09,0x01,0xf2,0x13,0x16,0x7f,0x18,
0xec,0xd5,0xcd,0x7f,0x0a,0xd1,0xe5,0x01,0xe9,0x25,0x18,0xe1,0x78,0xfe,0x64,0xd0,
0xc5,0xd5,0x11,0x04,0x64,0x21,0xb8,0x25,0xe5,0xe7,0xc2,0x95,0x23,0x2a,0x21,0x41,
0xe5,0x01,0x8c,0x25,0x18,0xc7,0xc1,0x79,0x32,0xb0,0x40,0x78,0xfe,0x08,0x28,0x28,
0x3a,0xaf,0x40,0xfe,0x08,0xca,0x60,0x24,0x57,0x78,0xfe,0x04,0xca,0x72,0x24,0x7a,
0xfe,0x03,0xca,0xf6,0x0a,0xd2,0x7c,0x24,0x21,0xbf,0x18,0x06,0x00,0x09,0x09,0x4e,
0x23,0x46,0xd1,0x2a,0x21,0x41,0xc5,0xc9,0xcd,0xdb,0x0a,0xcd,0xfc,0x09,0xe1,0x22,
0x1f,0x41,0xe1,0x22,0x1d,0x41,0xc1,0xd1,0xcd,0xb4,0x09,0xcd,0xdb,0x0a,0x21,0xab,
0x18,0x3a,0xb0,0x40,0x07,0xc5,0x4f,0x06,0x00,0x09,0xc1,0x7e,0x23,0x66,0x6f,0xe9,
0xc5,0xcd,0xfc,0x09,0xf1,0x32,0xaf,0x40,0xfe,0x04,0x28,0xda,0xe1,0x22,0x21,0x41,
0x18,0xd9,0xcd,0xb1,0x0a,0xc1,0xd1,0x21,0xb5,0x18,0x18,0xd5,0xe1,0xcd,0xa4,0x09,
0xcd,0xcf,0x0a,0xcd,0xbf,0x09,0xe1,0x22,0x23,0x41,0xe1,0x22,0x21,0x41,0x18,0xe7,
0xe5,0xeb,0xcd,0xcf,0x0a,0xe1,0xcd,0xa4,0x09,0xcd,0xcf,0x0a,0xc3,0xa0,0x08,0xd7,
0x1e,0x28,0xca,0xa2,0x19,0xda,0x6c,0x0e,0xcd,0x3d,0x1e,0xd2,0x40,0x25,0xfe,0xcd,
0x28,0xed,0xfe,0x2e,0xca,0x6c,0x0e,0xfe,0xce,0xca,0x32,0x25,0xfe,0x22,0xca,0x66,
0x28,0xfe,0xcb,0xca,0xc4,0x25,0xfe,0x26,0xca,0x94,0x41,0xfe,0xc3,0x20,0x0a,0xd7,
0x3a,0x9a,0x40,0xe5,0xcd,0xf8,0x27,0xe1,0xc9,0xfe,0xc2,0x20,0x0a,0xd7,0xe5,0x2a,
0xea,0x40,0xcd,0x66,0x0c,0xe1,0xc9,0xfe,0xc0,0x20,0x14,0xd7,0xcf,0x28,0xcd,0x0d,
0x26,0xcf,0x29,0xe5,0xeb,0x7c,0xb5,0xca,0x4a,0x1e,0xcd,0x9a,0x0a,0xe1,0xc9,0xfe,
0xc1,0xca,0xfe,0x27,0xfe,0xc5,0xca,0x9d,0x41,0xfe,0xc8,0xca,0xc9,0x27,0xfe,0xc7,
0xca,0x76,0x41,0xfe,0xc6,0xca,0x32,0x01,0xfe,0xc9,0xca,0x9d,0x01,0xfe,0xc4,0xca,
0x2f,0x2a,0xfe,0xbe,0xca,0x55,0x41,0xd6,0xd7,0xd2,0x4e,0x25,0xcd,0x35,0x23,0xcf,
0x29,0xc9,0x16,0x7d,0xcd,0x3a,0x23,0x2a,0xf3,0x40,0xe5,0xcd,0x7b,0x09,0xe1,0xc9,
0xcd,0x0d,0x26,0xe5,0xeb,0x22,0x21,0x41,0xe7,0xc4,0xf7,0x09,0xe1,0xc9,0x06,0x00,
0x07,0x4f,0xc5,0xd7,0x79,0xfe,0x41,0x38,0x16,0xcd,0x35,0x23,0xcf,0x2c,0xcd,0xf4,
0x0a,0xeb,0x2a,0x21,0x41,0xe3,0xe5,0xeb,0xcd,0x1c,0x2b,0xeb,0xe3,0x18,0x14,0xcd,
0x2c,0x25,0xe3,0x7d,0xfe,0x0c,0x38,0x07,0xfe,0x1b,0xe5,0xdc,0xb1,0x0a,0xe1,0x11,
0x3e,0x25,0xd5,0x01,0x08,0x16,0x09,0x4e,0x23,0x66,0x69,0xe9,0xcd,0xd7,0x29,0x7e,
0x23,0x4e,0x23,0x46,0xd1,0xc5,0xf5,0xcd,0xde,0x29,0xd1,0x5e,0x23,0x4e,0x23,0x46,
0xe1,0x7b,0xb2,0xc8,0x7a,0xd6,0x01,0xd8,0xaf,0xbb,0x3c,0xd0,0x15,0x1d,0x0a,0xbe,
0x23,0x03,0x28,0xed,0x3f,0xc3,0x60,0x09,0x3c,0x8f,0xc1,0xa0,0xc6,0xff,0x9f,0xcd,
0x8d,0x09,0x18,0x12,0x16,0x5a,0xcd,0x3a,0x23,0xcd,0x7f,0x0a,0x7d,0x2f,0x6f,0x7c,
0x2f,0x67,0x22,0x21,0x41,0xc1,0xc3,0x46,0x23,0x3a,0xaf,0x40,0xfe,0x08,0x30,0x05,
0xd6,0x03,0xb7,0x37,0xc9,0xd6,0x03,0xb7,0xc9,0xc5,0xcd,0x7f,0x0a,0xf1,0xd1,0x01,
0xfa,0x27,0xc5,0xfe,0x46,0x20,0x06,0x7b,0xb5,0x6f,0x7c,0xb2,0xc9,0x7b,0xa5,0x6f,
0x7c,0xa2,0xc9,0x2b,0xd7,0xc8,0xcf,0x2c,0x01,0x03,0x26,0xc5,0xf6,0xaf,0x32,0xae,
0x40,0x46,0xcd,0x3d,0x1e,0xda,0x97,0x19,0xaf,0x4f,0xd7,0x38,0x05,0xcd,0x3d,0x1e,
0x38,0x09,0x4f,0xd7,0x38,0xfd,0xcd,0x3d,0x1e,0x30,0xf8,0x11,0x52,0x26,0xd5,0x16,
0x02,0xfe,0x25,0xc8,0x14,0xfe,0x24,0xc8,0x14,0xfe,0x21,0xc8,0x16,0x08,0xfe,0x23,
0xc8,0x78,0xd6,0x41,0xe6,0x7f,0x5f,0x16,0x00,0xe5,0x21,0x01,0x41,0x19,0x56,0xe1,
0x2b,0xc9,0x7a,0x32,0xaf,0x40,0xd7,0x3a,0xdc,0x40,0xb7,0xc2,0x64,0x26,0x7e,0xd6,
0x28,0xca,0xe9,0x26,0xaf,0x32,0xdc,0x40,0xe5,0xd5,0x2a,0xf9,0x40,0xeb,0x2a,0xfb,
0x40,0xdf,0xe1,0x28,0x19,0x1a,0x6f,0xbc,0x13,0x20,0x0b,0x1a,0xb9,0x20,0x07,0x13,
0x1a,0xb8,0xca,0xcc,0x26,0x3e,0x13,0x13,0xe5,0x26,0x00,0x19,0x18,0xdf,0x7c,0xe1,
0xe3,0xf5,0xd5,0x11,0xf1,0x24,0xdf,0x28,0x36,0x11,0x43,0x25,0xdf,0xd1,0x28,0x35,
0xf1,0xe3,0xe5,0xc5,0x4f,0x06,0x00,0xc5,0x03,0x03,0x03,0x2a,0xfd,0x40,0xe5,0x09,
0xc1,0xe5,0xcd,0x55,0x19,0xe1,0x22,0xfd,0x40,0x60,0x69,0x22,0xfb,0x40,0x2b,0x36,
0x00,0xdf,0x20,0xfa,0xd1,0x73,0x23,0xd1,0x73,0x23,0x72,0xeb,0x13,0xe1,0xc9,0x57,
0x5f,0xf1,0xf1,0xe3,0xc9,0x32,0x24,0x41,0xc1,0x67,0x6f,0x22,0x21,0x41,0xe7,0x20,
0x06,0x21,0x28,0x19,0x22,0x21,0x41,0xe1,0xc9,0xe5,0x2a,0xae,0x40,0xe3,0x57,0xd5,
0xc5,0xcd,0x45,0x1e,0xc1,0xf1,0xeb,0xe3,0xe5,0xeb,0x3c,0x57,0x7e,0xfe,0x2c,0x28,
0xee,0xcf,0x29,0x22,0xf3,0x40,0xe1,0x22,0xae,0x40,0xd5,0x2a,0xfb,0x40,0x3e,0x19,
0xeb,0x2a,0xfd,0x40,0xeb,0xdf,0x3a,0xaf,0x40,0x28,0x27,0xbe,0x23,0x20,0x08,0x7e,
0xb9,0x23,0x20,0x04,0x7e,0xb8,0x3e,0x23,0x23,0x5e,0x23,0x56,0x23,0x20,0xe0,0x3a,
0xae,0x40,0xb7,0x1e,0x12,0xc2,0xa2,0x19,0xf1,0x96,0xca,0x95,0x27,0x1e,0x10,0xc3,
0xa2,0x19,0x77,0x23,0x5f,0x16,0x00,0xf1,0x71,0x23,0x70,0x23,0x4f,0xcd,0x63,0x19,
0x23,0x23,0x22,0xd8,0x40,0x71,0x23,0x3a,0xae,0x40,0x17,0x79,0x01,0x0b,0x00,0x30,
0x02,0xc1,0x03,0x71,0x23,0x70,0x23,0xf5,0xcd,0xaa,0x0b,0xf1,0x3d,0x20,0xed,0xf5,
0x42,0x4b,0xeb,0x19,0x38,0xc7,0xcd,0x6c,0x19,0x22,0xfd,0x40,0x2b,0x36,0x00,0xdf,
0x20,0xfa,0x03,0x57,0x2a,0xd8,0x40,0x5e,0xeb,0x29,0x09,0xeb,0x2b,0x2b,0x73,0x23,
0x72,0x23,0xf1,0x38,0x30,0x47,0x4f,0x7e,0x23,0x16,0xe1,0x5e,0x23,0x56,0x23,0xe3,
0xf5,0xdf,0xd2,0x3d,0x27,0xcd,0xaa,0x0b,0x19,0xf1,0x3d,0x44,0x4d,0x20,0xeb,0x3a,
0xaf,0x40,0x44,0x4d,0x29,0xd6,0x04,0x38,0x04,0x29,0x28,0x06,0x29,0xb7,0xe2,0xc2,
0x27,0x09,0xc1,0x09,0xeb,0x2a,0xf3,0x40,0xc9,0xaf,0xe5,0x32,0xaf,0x40,0xcd,0xd4,
0x27,0xe1,0xd7,0xc9,0x2a,0xfd,0x40,0xeb,0x21,0x00,0x00,0x39,0xe7,0x20,0x0d,0xcd,
0xda,0x29,0xcd,0xe6,0x28,0x2a,0xa0,0x40,0xeb,0x2a,0xd6,0x40,0x7d,0x93,0x6f,0x7c,
0x9a,0x67,0xc3,0x66,0x0c,0x3a,0xa6,0x40,0x6f,0xaf,0x67,0xc3,0x9a,0x0a,0xcd,0xa9,
0x41,0xd7,0xcd,0x2c,0x25,0xe5,0x21,0x90,0x08,0xe5,0x3a,0xaf,0x40,0xf5,0xfe,0x03,
0xcc,0xda,0x29,0xf1,0xeb,0x2a,0x8e,0x40,0xe9,0xe5,0xe6,0x07,0x21,0xa1,0x18,0x4f,
0x06,0x00,0x09,0xcd,0x86,0x25,0xe1,0xc9,0xe5,0x2a,0xa2,0x40,0x23,0x7c,0xb5,0xe1,
0xc0,0x1e,0x16,0xc3,0xa2,0x19,0xcd,0xbd,0x0f,0xcd,0x65,0x28,0xcd,0xda,0x29,0x01,
0x2b,0x2a,0xc5,0x7e,0x23,0xe5,0xcd,0xbf,0x28,0xe1,0x4e,0x23,0x46,0xcd,0x5a,0x28,
0xe5,0x6f,0xcd,0xce,0x29,0xd1,0xc9,0xcd,0xbf,0x28,0x21,0xd3,0x40,0xe5,0x77,0x23,
0x73,0x23,0x72,0xe1,0xc9,0x2b,0x06,0x22,0x50,0xe5,0x0e,0xff,0x23,0x7e,0x0c,0xb7,
0x28,0x06,0xba,0x28,0x03,0xb8,0x20,0xf4,0xfe,0x22,0xcc,0x78,0x1d,0xe3,0x23,0xeb,
0x79,0xcd,0x5a,0x28,0x11,0xd3,0x40,0x3e,0xd5,0x2a,0xb3,0x40,0x22,0x21,0x41,0x3e,
0x03,0x32,0xaf,0x40,0xcd,0xd3,0x09,0x11,0xd6,0x40,0xdf,0x22,0xb3,0x40,0xe1,0x7e,
0xc0,0x1e,0x1e,0xc3,0xa2,0x19,0x23,0xcd,0x65,0x28,0xcd,0xda,0x29,0xcd,0xc4,0x09,
0x14,0x15,0xc8,0x0a,0xcd,0x2a,0x03,0xfe,0x0d,0xcc,0x03,0x21,0x03,0x18,0xf2,0xb7,
0x0e,0xf1,0xf5,0x2a,0xa0,0x40,0xeb,0x2a,0xd6,0x40,0x2f,0x4f,0x06,0xff,0x09,0x23,
0xdf,0x38,0x07,0x22,0xd6,0x40,0x23,0xeb,0xf1,0xc9,0xf1,0x1e,0x1a,0xca,0xa2,0x19,
0xbf,0xf5,0x01,0xc1,0x28,0xc5,0x2a,0xb1,0x40,0x22,0xd6,0x40,0x21,0x00,0x00,0xe5,
0x2a,0xa0,0x40,0xe5,0x21,0xb5,0x40,0xeb,0x2a,0xb3,0x40,0xeb,0xdf,0x01,0xf7,0x28,
0xc2,0x4a,0x29,0x2a,0xf9,0x40,0xeb,0x2a,0xfb,0x40,0xeb,0xdf,0x28,0x13,0x7e,0x23,
0x23,0x23,0xfe,0x03,0x20,0x04,0xcd,0x4b,0x29,0xaf,0x5f,0x16,0x00,0x19,0x18,0xe6,
0xc1,0xeb,0x2a,0xfd,0x40,0xeb,0xdf,0xca,0x6b,0x29,0x7e,0x23,0xcd,0xc2,0x09,0xe5,
0x09,0xfe,0x03,0x20,0xeb,0x22,0xd8,0x40,0xe1,0x4e,0x06,0x00,0x09,0x09,0x23,0xeb,
0x2a,0xd8,0x40,0xeb,0xdf,0x28,0xda,0x01,0x3f,0x29,0xc5,0xaf,0xb6,0x23,0x5e,0x23,
0x56,0x23,0xc8,0x44,0x4d,0x2a,0xd6,0x40,0xdf,0x60,0x69,0xd8,0xe1,0xe3,0xdf,0xe3,
0xe5,0x60,0x69,0xd0,0xc1,0xf1,0xf1,0xe5,0xd5,0xc5,0xc9,0xd1,0xe1,0x7d,0xb4,0xc8,
0x2b,0x46,0x2b,0x4e,0xe5,0x2b,0x6e,0x26,0x00,0x09,0x50,0x59,0x2b,0x44,0x4d,0x2a,
0xd6,0x40,0xcd,0x58,0x19,0xe1,0x71,0x23,0x70,0x69,0x60,0x2b,0xc3,0xe9,0x28,0xc5,
0xe5,0x2a,0x21,0x41,0xe3,0xcd,0x9f,0x24,0xe3,0xcd,0xf4,0x0a,0x7e,0xe5,0x2a,0x21,
0x41,0xe5,0x86,0x1e,0x1c,0xda,0xa2,0x19,0xcd,0x57,0x28,0xd1,0xcd,0xde,0x29,0xe3,
0xcd,0xdd,0x29,0xe5,0x2a,0xd4,0x40,0xeb,0xcd,0xc6,0x29,0xcd,0xc6,0x29,0x21,0x49,
0x23,0xe3,0xe5,0xc3,0x84,0x28,0xe1,0xe3,0x7e,0x23,0x4e,0x23,0x46,0x6f,0x2c,0x2d,
0xc8,0x0a,0x12,0x03,0x13,0x18,0xf8,0xcd,0xf4,0x0a,0x2a,0x21,0x41,0xeb,0xcd,0xf5,
0x29,0xeb,0xc0,0xd5,0x50,0x59,0x1b,0x4e,0x2a,0xd6,0x40,0xdf,0x20,0x05,0x47,0x09,
0x22,0xd6,0x40,0xe1,0xc9,0x2a,0xb3,0x40,0x2b,0x46,0x2b,0x4e,0x2b,0xdf,0xc0,0x22,
0xb3,0x40,0xc9,0x01,0xf8,0x27,0xc5,0xcd,0xd7,0x29,0xaf,0x57,0x7e,0xb7,0xc9,0x01,
0xf8,0x27,0xc5,0xcd,0x07,0x2a,0xca,0x4a,0x1e,0x23,0x5e,0x23,0x56,0x1a,0xc9,0x3e,
0x01,0xcd,0x57,0x28,0xcd,0x1f,0x2b,0x2a,0xd4,0x40,0x73,0xc1,0xc3,0x84,0x28,0xd7,
0xcf,0x28,0xcd,0x1c,0x2b,0xd5,0xcf,0x2c,0xcd,0x37,0x23,0xcf,0x29,0xe3,0xe5,0xe7,
0x28,0x05,0xcd,0x1f,0x2b,0x18,0x03,0xcd,0x13,0x2a,0xd1,0xf5,0xf5,0x7b,0xcd,0x57,
0x28,0x5f,0xf1,0x1c,0x1d,0x28,0xd4,0x2a,0xd4,0x40,0x77,0x23,0x1d,0x20,0xfb,0x18,
0xca,0xcd,0xdf,0x2a,0xaf,0xe3,0x4f,0x3e,0xe5,0xe5,0x7e,0xb8,0x38,0x02,0x78,0x11,
0x0e,0x00,0xc5,0xcd,0xbf,0x28,0xc1,0xe1,0xe5,0x23,0x46,0x23,0x66,0x68,0x06,0x00,
0x09,0x44,0x4d,0xcd,0x5a,0x28,0x6f,0xcd,0xce,0x29,0xd1,0xcd,0xde,0x29,0xc3,0x84,
0x28,0xcd,0xdf,0x2a,0xd1,0xd5,0x1a,0x90,0x18,0xcb,0xeb,0x7e,0xcd,0xe2,0x2a,0x04,
0x05,0xca,0x4a,0x1e,0xc5,0x1e,0xff,0xfe,0x29,0x28,0x05,0xcf,0x2c,0xcd,0x1c,0x2b,
0xcf,0x29,0xf1,0xe3,0x01,0x69,0x2a,0xc5,0x3d,0xbe,0x06,0x00,0xd0,0x4f,0x7e,0x91,
0xbb,0x47,0xd8,0x43,0xc9,0xcd,0x07,0x2a,0xca,0xf8,0x27,0x5f,0x23,0x7e,0x23,0x66,
0x6f,0xe5,0x19,0x46,0x72,0xe3,0xc5,0x7e,0xcd,0x65,0x0e,0xc1,0xe1,0x70,0xc9,0xeb,
0xcf,0x29,0xc1,0xd1,0xc5,0x43,0xc9,0xfe,0x7a,0xc2,0x97,0x19,0xc3,0xd9,0x41,0xcd,
0x1f,0x2b,0x32,0x94,0x40,0xcd,0x93,0x40,0xc3,0xf8,0x27,0xcd,0x0e,0x2b,0xc3,0x96,
0x40,0xd7,0xcd,0x37,0x23,0xe5,0xcd,0x7f,0x0a,0xeb,0xe1,0x7a,0xb7,0xc9,0xcd,0x1c,
0x2b,0x32,0x94,0x40,0x32,0x97,0x40,0xcf,0x2c,0x18,0x01,0xd7,0xcd,0x37,0x23,0xcd,
0x05,0x2b,0xc2,0x4a,0x1e,0x2b,0xd7,0x7b,0xc9,0x3e,0x01,0x32,0x9c,0x40,0xc1,0xcd,
0x10,0x1b,0xc5,0x21,0xff,0xff,0x22,0xa2,0x40,0xe1,0xd1,0x4e,0x23,0x46,0x23,0x78,
0xb1,0xca,0x19,0x1a,0xcd,0xdf,0x41,0xcd,0x9b,0x1d,0xc5,0x4e,0x23,0x46,0x23,0xc5,
0xe3,0xeb,0xdf,0xc1,0xda,0x18,0x1a,0xe3,0xe5,0xc5,0xeb,0x22,0xec,0x40,0xcd,0xaf,
0x0f,0x3e,0x20,0xe1,0xcd,0x2a,0x03,0xcd,0x7e,0x2b,0x2a,0xa7,0x40,0xcd,0x75,0x2b,
0xcd,0xfe,0x20,0x18,0xbe,0x7e,0xb7,0xc8,0xcd,0x2a,0x03,0x23,0x18,0xf7,0xe5,0x2a,
0xa7,0x40,0x44,0x4d,0xe1,0xc3,0x9a,0x06,0x00,0x03,0x15,0xc8,0x23,0x7e,0xb7,0x02,
0xc8,0xc3,0x2d,0x30,0xfe,0xfb,0x20,0x08,0x0b,0x0b,0x0b,0x0b,0x14,0x14,0x14,0x14,
0xfe,0x95,0xcc,0x24,0x0b,0xd6,0x7f,0xe5,0x5f,0x21,0x50,0x16,0x7e,0xb7,0x23,0xf2,
0xac,0x2b,0x1d,0x20,0xf7,0xe6,0x7f,0x02,0x03,0x15,0xca,0xd8,0x28,0x7e,0x23,0xb7,
0xf2,0xb7,0x2b,0xe1,0x18,0xc6,0xcd,0x10,0x1b,0xd1,0xc5,0xc5,0xcd,0x2c,0x1b,0x30,
0x05,0x54,0x5d,0xe3,0xe5,0xdf,0xd2,0x4a,0x1e,0x21,0x29,0x19,0xcd,0xa7,0x28,0xc1,
0x21,0xe8,0x1a,0xe3,0xeb,0x2a,0xf9,0x40,0x1a,0x02,0x03,0x13,0xdf,0x20,0xf9,0x60,
0x69,0x22,0xf9,0x40,0xc9,0xcd,0x84,0x02,0xcd,0x37,0x23,0xe5,0xcd,0x13,0x2a,0x3e,
0xd3,0xcd,0x64,0x02,0xcd,0x61,0x02,0x1a,0xcd,0x64,0x02,0x2a,0xa4,0x40,0xeb,0x2a,
0xf9,0x40,0x1a,0x13,0xcd,0x64,0x02,0xdf,0x20,0xf8,0xcd,0xf8,0x01,0xe1,0xc9,0xd6,
0xb2,0x28,0x02,0xaf,0x01,0x2f,0x23,0xf5,0x7e,0xb7,0x28,0x07,0xcd,0x37,0x23,0xcd,
0x13,0x2a,0x1a,0x6f,0xf1,0xb7,0x67,0x22,0x21,0x41,0xcc,0x4d,0x1b,0x21,0x00,0x00,
0xcd,0x93,0x02,0x2a,0x21,0x41,0xeb,0x06,0x03,0xcd,0x35,0x02,0xd6,0xd3,0x20,0xf7,
0x10,0xf7,0xcd,0x35,0x02,0x1c,0x1d,0x28,0x03,0xbb,0x20,0x37,0x2a,0xa4,0x40,0x06,
0x03,0xcd,0x35,0x02,0x5f,0x96,0xa2,0x20,0x21,0x73,0xcd,0x6c,0x19,0x7e,0xb7,0x23,
0x20,0xed,0xcd,0x2c,0x02,0x10,0xea,0x22,0xf9,0x40,0xcd,0xf8,0x01,0x21,0x29,0x19,
0xcd,0xa7,0x28,0x2a,0xa4,0x40,0xe5,0xc3,0xe8,0x1a,0xcd,0xbd,0x31,0xcd,0xa7,0x28,
0xc3,0x18,0x1a,0x32,0x3e,0x3c,0x06,0x03,0xcd,0x35,0x02,0xb7,0x20,0xf8,0x10,0xf8,
0xcd,0x96,0x02,0x18,0xa2,0x42,0x41,0x44,0x0d,0x00,0xcd,0x7f,0x0a,0x7e,0xc3,0xf8,
0x27,0xcd,0x02,0x2b,0xd5,0xcf,0x2c,0xcd,0x1c,0x2b,0xd1,0x12,0xc9,0xcd,0x38,0x23,
0xcd,0xf4,0x0a,0xcf,0x3b,0xeb,0x2a,0x21,0x41,0x18,0x08,0x3a,0xde,0x40,0xb7,0x28,
0x0c,0xd1,0xeb,0xe5,0xaf,0x32,0xde,0x40,0xba,0xf5,0xd5,0x46,0xb0,0xca,0x4a,0x1e,
0x23,0x4e,0x23,0x66,0x69,0x18,0x1c,0x58,0xe5,0x0e,0x02,0x7e,0x23,0xfe,0x25,0xca,
0x17,0x2e,0xfe,0x20,0x20,0x03,0x0c,0x10,0xf2,0xe1,0x43,0x3e,0x25,0xcd,0x49,0x2e,
0xcd,0x2a,0x03,0xaf,0x5f,0x57,0xcd,0x49,0x2e,0x57,0x7e,0x23,0xfe,0x21,0xca,0x14,
0x2e,0xfe,0x23,0x28,0x37,0x05,0xca,0xfe,0x2d,0xfe,0x2b,0x3e,0x08,0x28,0xe7,0x2b,
0x7e,0x23,0xfe,0x2e,0x28,0x40,0xfe,0x25,0x28,0xbd,0xbe,0x20,0xd0,0xfe,0x24,0x28,
0x14,0xfe,0x2a,0x20,0xc8,0x78,0xfe,0x02,0x23,0x38,0x03,0x7e,0xfe,0x24,0x3e,0x20,
0x20,0x07,0x05,0x1c,0xfe,0xaf,0xc6,0x10,0x23,0x1c,0x82,0x57,0x1c,0x0e,0x00,0x05,
0x28,0x47,0x7e,0x23,0xfe,0x2e,0x28,0x18,0xfe,0x23,0x28,0xf0,0xfe,0x2c,0x20,0x1a,
0x7a,0xf6,0x40,0x57,0x18,0xe6,0x7e,0xfe,0x23,0x3e,0x2e,0x20,0x90,0x0e,0x01,0x23,
0x0c,0x05,0x28,0x25,0x7e,0x23,0xfe,0x23,0x28,0xf6,0xd5,0x11,0x97,0x2d,0xd5,0x54,
0x5d,0xfe,0x5b,0xc0,0xbe,0xc0,0x23,0xbe,0xc0,0x23,0xbe,0xc0,0x23,0x78,0xd6,0x04,
0xd8,0xd1,0xd1,0x47,0x14,0x23,0xca,0xeb,0xd1,0x7a,0x2b,0x1c,0xe6,0x08,0x20,0x15,
0x1d,0x78,0xb7,0x28,0x10,0x7e,0xd6,0x2d,0x28,0x06,0xfe,0xfe,0x20,0x07,0x3e,0x08,
0xc6,0x04,0x82,0x57,0x05,0xe1,0xf1,0x28,0x50,0xc5,0xd5,0xcd,0x37,0x23,0xd1,0xc1,
0xc5,0xe5,0x43,0x78,0x81,0xfe,0x19,0xd2,0x4a,0x1e,0x7a,0xf6,0x80,0xcd,0xbe,0x0f,
0xcd,0xa7,0x28,0xe1,0x2b,0xd7,0x37,0x28,0x0d,0x32,0xde,0x40,0xfe,0x3b,0x28,0x05,
0xfe,0x2c,0xc2,0x97,0x19,0xd7,0xc1,0xeb,0xe1,0xe5,0xf5,0xd5,0x7e,0x90,0x23,0x4e,
0x23,0x66,0x69,0x16,0x00,0x5f,0x19,0x78,0xb7,0xc2,0x03,0x2d,0x18,0x06,0xcd,0x49,
0x2e,0xcd,0x2a,0x03,0xe1,0xf1,0xc2,0xcb,0x2c,0xdc,0xfe,0x20,0xe3,0xcd,0xdd,0x29,
0xe1,0xc3,0x69,0x21,0x0e,0x01,0x3e,0xf1,0x05,0xcd,0x49,0x2e,0xe1,0xf1,0x28,0xe9,
0xc5,0xcd,0x37,0x23,0xcd,0xf4,0x0a,0xc1,0xc5,0xe5,0x2a,0x21,0x41,0x41,0x0e,0x00,
0xc5,0xcd,0x68,0x2a,0xcd,0xaa,0x28,0x2a,0x21,0x41,0xf1,0x96,0x47,0x3e,0x20,0x04,
0x05,0xca,0xd3,0x2d,0xcd,0x2a,0x03,0x18,0xf7,0xf5,0x7a,0xb7,0x3e,0x2b,0xc4,0x2a,
0x03,0xf1,0xc9,0x32,0x9a,0x40,0x2a,0xea,0x40,0xb4,0xa5,0x3c,0xeb,0xc8,0x18,0x04,
0xcd,0x4f,0x1e,0xc0,0xe1,0xeb,0x22,0xec,0x40,0xeb,0xcd,0x2c,0x1b,0xd2,0xd9,0x1e,
0x60,0x69,0x23,0x23,0x4e,0x23,0x46,0x23,0xc5,0xcd,0x7e,0x2b,0xe1,0xe5,0xcd,0xaf,
0x0f,0x3e,0x20,0xcd,0x2a,0x03,0x2a,0xa7,0x40,0x3e,0x0e,0xcd,0x2a,0x03,0xe5,0x0e,
0xff,0x0c,0x7e,0xb7,0x23,0x20,0xfa,0xe1,0x47,0x16,0x00,0xcd,0x84,0x03,0xd6,0x30,
0x38,0x0e,0xfe,0x0a,0x30,0x0a,0x5f,0x7a,0x07,0x07,0x82,0x07,0x83,0x57,0x18,0xeb,
0xe5,0x21,0x99,0x2e,0xe3,0x15,0x14,0xc2,0xbb,0x2e,0x14,0xfe,0xd8,0xca,0xd2,0x2f,
0xfe,0xdd,0xca,0xe0,0x2f,0xfe,0xf0,0x28,0x41,0xfe,0x31,0x38,0x02,0xd6,0x20,0xfe,
0x21,0xca,0xf6,0x2f,0xfe,0x1c,0xca,0x40,0x2f,0xfe,0x23,0x28,0x3f,0xfe,0x19,0xca,
0x7d,0x2f,0xfe,0x14,0xca,0x4a,0x2f,0xfe,0x13,0xca,0x65,0x2f,0xfe,0x15,0xca,0xe3,
0x2f,0xfe,0x28,0xca,0x78,0x2f,0xfe,0x1b,0x28,0x1c,0xfe,0x18,0xca,0x75,0x2f,0xfe,
0x11,0xc0,0xc1,0xd1,0xcd,0xfe,0x20,0xc3,0x65,0x2e,0x7e,0xb7,0xc8,0x04,0xcd,0x2a,
0x03,0x23,0x15,0x20,0xf5,0xc9,0xe5,0x21,0x5f,0x2f,0xe3,0x37,0xf5,0xcd,0x84,0x03,
0x5f,0xf1,0xf5,0xdc,0x5f,0x2f,0x7e,0xb7,0xca,0x3e,0x2f,0xcd,0x2a,0x03,0xf1,0xf5,
0xdc,0xa1,0x2f,0x38,0x02,0x23,0x04,0x7e,0xbb,0x20,0xeb,0x15,0x20,0xe8,0xf1,0xc9,
0xcd,0x75,0x2b,0xcd,0xfe,0x20,0xc1,0xc3,0x7c,0x2e,0x7e,0xb7,0xc8,0x3e,0x21,0xcd,
0x2a,0x03,0x7e,0xb7,0x28,0x09,0xcd,0x2a,0x03,0xcd,0xa1,0x2f,0x15,0x20,0xf3,0x3e,
0x21,0xcd,0x2a,0x03,0xc9,0x7e,0xb7,0xc8,0xcd,0x84,0x03,0x77,0xcd,0x2a,0x03,0x23,
0x04,0x15,0x20,0xf1,0xc9,0x36,0x00,0x48,0x16,0xff,0xcd,0x0a,0x2f,0xcd,0x84,0x03,
0xb7,0xca,0x7d,0x2f,0xfe,0x08,0x28,0x0a,0xfe,0x0d,0xca,0xe0,0x2f,0xfe,0x1b,0xc8,
0x20,0x1e,0x3e,0x08,0x05,0x04,0x28,0x1f,0xcd,0x2a,0x03,0x2b,0x05,0x11,0x7d,0x2f,
0xd5,0xe5,0x0d,0x7e,0xb7,0x37,0xca,0x90,0x08,0x23,0x7e,0x2b,0x77,0x23,0x18,0xf3,
0xf5,0x79,0xfe,0xff,0x38,0x03,0xf1,0x18,0xc4,0x90,0x0c,0x04,0xc5,0xeb,0x6f,0x26,
0x00,0x19,0x44,0x4d,0x23,0xcd,0x58,0x19,0xc1,0xf1,0x77,0xcd,0x2a,0x03,0x23,0xc3,
0x7d,0x2f,0x78,0xb7,0xc8,0x05,0x2b,0x3e,0x08,0xcd,0x2a,0x03,0x15,0x20,0xf3,0xc9,
0xcd,0x75,0x2b,0xcd,0xfe,0x20,0xc1,0xd1,0x7a,0xa3,0x3c,0x2a,0xa7,0x40,0x2b,0xc8,
0x37,0x23,0xf5,0xc3,0x98,0x1a,0xc1,0xd1,0xc3,0x19,0x1a,0xde,0xc3,0xc3,0x44,0xb2,
0xc3,0x5e,0x32,0xc3,0x9b,0x32,0xc3,0x74,0x32,0xc3,0xda,0x32,0xc3,0xc0,0x31,0xc3,
0xd1,0x31,0xc3,0xab,0x34,0xc3,0x55,0x34,0xc3,0xc2,0x35,0xc3,0xfb,0x35,0xc3,0x5a,
0x36,0xc3,0x80,0x36,0xc3,0x8e,0x33,0xc3,0x39,0x37,0xc3,0xf7,0x31,0xc3,0x7b,0x37,
0xc3,0x99,0x37,0xc3,0xbb,0x35,0xc3,0xa0,0x35,0xdb,0xe4,0xcb,0x6f,0xc3,0x1c,0x35,
0x18,0xd3,0xc3,0xb5,0x37,0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,
0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,
0x3a,0xea,0x37,0xb7,0xc9,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,
0x3b,0x2c,0x2d,0x2e,0x2f,0x0d,0x1f,0x01,0x5b,0x0a,0x08,0x09,0x20,0x21,0xdc,0x05,
0x22,0xff,0x41,0xaf,0xc9,0x60,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,
0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,
0x77,0xaf,0xc9,0xaa,0xaa,0x00,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,
0x2b,0x3c,0x3d,0x3e,0x3f,0x0d,0x1f,0x01,0x1b,0x1a,0x18,0x19,0x20,0x3e,0x01,0x21,
0x19,0x40,0xae,0x18,0xdb,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,
0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,
0xcd,0xd9,0x01,0xaf,0xc9,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,
0x3b,0x2c,0x2d,0x2e,0x2f,0x0d,0x1f,0x01,0x5b,0x0a,0x08,0x09,0x20,0x28,0xe1,0xa6,
0xfe,0x01,0xc0,0xef,0xc9,0x60,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,
0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,
0x14,0x23,0xcb,0x01,0xc9,0x00,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,
0x2b,0x3c,0x3d,0x3e,0x3f,0x0d,0x1f,0x01,0x1b,0x1a,0x18,0x19,0x20,0x3a,0xfd,0x41,
0x6f,0x3a,0xfe,0x41,0xc9,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,
0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,
0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,
0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,
0x5b,0x5c,0x5d,0x5e,0x5f,0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,
0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,
0x7b,0x7c,0x7d,0x7e,0x7f,0x3e,0x01,0xd3,0xff,0x06,0x0d,0x10,0xfe,0x3e,0x02,0xd3,
0xff,0x06,0x0d,0x10,0xfe,0xcd,0xf3,0x31,0x06,0x78,0x10,0xfe,0xc9,0x21,0xa5,0x2c,
0x3a,0x13,0x42,0xd3,0xe0,0xdb,0xff,0x3a,0x10,0x42,0xe6,0xfd,0xcd,0xed,0x31,0xfb,
0xc9,0xeb,0xe3,0xc5,0xe5,0xeb,0xdb,0xec,0x11,0x20,0x20,0xed,0x53,0x3e,0x3c,0xcd,
0xe8,0x31,0x01,0x00,0x7d,0xc3,0x60,0x00,0x3a,0x10,0x42,0xf6,0x02,0x32,0x10,0x42,
0xd3,0xec,0xc9,0xaf,0xd3,0xff,0xc9,0x7e,0xd6,0x23,0xc2,0x53,0x02,0xcd,0x01,0x2b,
0xcf,0x2c,0xc9,0x06,0x08,0xcd,0x20,0x32,0x10,0xfb,0x3a,0x12,0x42,0x3c,0xe6,0x5f,
0x32,0x12,0x42,0x20,0x08,0x3a,0x3f,0x3c,0xee,0x0a,0x32,0x3f,0x3c,0x7a,0x18,0x78,
0xc5,0xdb,0xff,0x17,0x38,0x08,0xcd,0x8d,0x02,0x28,0xf6,0xc3,0x5c,0x33,0x06,0x6e,
0x10,0xfe,0xcd,0xf3,0x31,0x06,0x98,0x10,0xfe,0xdb,0xff,0xc1,0x17,0xcb,0x12,0x18,
0xb2,0xf5,0xc5,0xd5,0x0e,0x08,0x57,0xcd,0xa5,0x31,0xcb,0x02,0x30,0x0a,0xcd,0xa5,
0x31,0x0d,0x20,0xf3,0xd1,0xc1,0xf1,0xc9,0x06,0x9a,0x10,0xfe,0x18,0xf3,0xe5,0x21,
0x41,0x32,0x22,0x0c,0x42,0x06,0x53,0xaf,0xcd,0x41,0x32,0x10,0xfb,0x3e,0xa5,0xcd,
0x41,0x32,0x18,0x23,0xe5,0x21,0x03,0x32,0x22,0x0e,0x42,0x06,0x40,0x16,0x00,0xcd,
0x20,0x32,0x7a,0xb7,0x20,0xf5,0x10,0xf7,0xcd,0x20,0x32,0x7a,0xfe,0xa5,0x20,0xf8,
0x21,0x2a,0x2a,0x22,0x3e,0x3c,0x7c,0xe1,0xc1,0xd1,0xc9,0xe5,0x21,0xba,0x32,0x22,
0x0c,0x42,0x06,0x00,0x3e,0x55,0xcd,0xb4,0x32,0x10,0xf9,0x3e,0x7f,0xcd,0xb4,0x32,
0x3e,0xa5,0x18,0xe3,0xf5,0xc5,0xd5,0x4f,0x18,0x07,0xf5,0xc5,0xd5,0x4f,0xcd,0x3e,
0x33,0x06,0x08,0xcd,0x35,0x33,0x10,0xfb,0x18,0x8a,0xcd,0x50,0x33,0x06,0x08,0xcd,
0x50,0x33,0xcd,0x7c,0x33,0x10,0xf8,0xc3,0x0a,0x32,0xe5,0x21,0xca,0x32,0x22,0x0e,
0x42,0x3e,0x01,0xd3,0xe0,0x06,0x80,0xcd,0x50,0x33,0x79,0xfe,0x0f,0x38,0xf6,0xfe,
0x3e,0x30,0xf2,0x10,0xf2,0x21,0x00,0x00,0x06,0x40,0xcd,0x50,0x33,0xcd,0x50,0x33,
0x51,0xcd,0x50,0x33,0x7a,0x91,0x30,0x02,0xed,0x44,0xfe,0x0d,0x38,0x05,0x24,0x10,
0xe9,0x18,0x03,0x2c,0x10,0xe4,0x3e,0x40,0xbc,0x28,0x0a,0xbd,0x20,0xd7,0x3e,0x02,
0xd3,0xe0,0xcd,0x50,0x33,0x16,0x00,0xcd,0x50,0x33,0xcd,0x7c,0x33,0x7a,0xfe,0x7f,
0x20,0xf5,0xc3,0x90,0x32,0xcb,0x01,0x30,0x05,0x11,0x17,0x12,0x18,0x03,0x11,0x2f,
0x2b,0x15,0x20,0xfd,0x3e,0x02,0xd3,0xff,0x1d,0x20,0xfd,0x3e,0x01,0xd3,0xff,0xc9,
0xfb,0x0e,0x00,0x0c,0x3a,0x40,0x38,0xe6,0x04,0x28,0xf8,0xf3,0x21,0x42,0x4b,0x22,
0x3e,0x3c,0xc3,0x03,0x42,0x1e,0x01,0x18,0x02,0x1e,0x00,0x3e,0x06,0x81,0x4f,0xdb,
0xff,0xe6,0x01,0xbb,0x20,0x03,0xf1,0xf1,0xc9,0xf1,0xfb,0xc9,0x79,0xfe,0x22,0xcb,
0x12,0xfe,0x0f,0x38,0x03,0xfe,0x3e,0xd8,0x3e,0x44,0x32,0x3e,0x3c,0xc9,0xcd,0x60,
0x30,0x20,0x10,0x01,0x80,0x38,0x21,0x18,0x40,0x0a,0xe6,0x02,0x5f,0xae,0x73,0xa3,
0xc2,0xbd,0x30,0x3e,0xff,0x21,0x40,0x38,0xcb,0x66,0x28,0x08,0xcb,0x25,0xcb,0x46,
0x28,0x02,0x3e,0x1f,0x32,0x24,0x42,0x01,0x01,0x38,0x21,0x36,0x40,0x16,0x00,0x0a,
0x5f,0xae,0x73,0xa3,0x20,0x32,0xcd,0x20,0x31,0xf2,0xbf,0x33,0xcd,0x3d,0x31,0xa6,
0x20,0x08,0xed,0x62,0x22,0x01,0x42,0xc3,0x7d,0x30,0xe5,0x2a,0x01,0x42,0x23,0x22,
0x01,0x42,0xed,0x5b,0xff,0x41,0xed,0x52,0xd1,0xda,0xa1,0x30,0xaf,0x12,0x22,0x01,
0x42,0x2e,0x96,0x22,0xff,0x41,0x18,0xab,0x5f,0xc5,0x01,0xc4,0x05,0xcd,0x60,0x00,
0xc1,0x0a,0xa3,0xc8,0x32,0xfe,0x41,0x7d,0x32,0xfd,0x41,0x7a,0x17,0x17,0x17,0x57,
0x7b,0x0f,0x38,0x03,0x14,0x18,0xfa,0xcd,0x60,0x30,0x3a,0x80,0x38,0x20,0x02,0xe6,
0x01,0xe6,0x03,0x28,0x02,0xcb,0xf2,0x3a,0x19,0x40,0xb7,0x28,0x02,0xcb,0xfa,0x21,
0x45,0x30,0x5a,0x16,0x00,0x19,0x7e,0xfe,0x1a,0xca,0xa1,0x30,0x47,0xcd,0x60,0x30,
0x78,0x28,0x04,0xb7,0xca,0xbd,0x30,0x21,0x24,0x42,0xfe,0x2a,0x20,0x04,0x3e,0x1f,
0xbe,0x78,0xc3,0xfd,0x30,0xed,0x56,0x31,0x7d,0x40,0xd3,0xe4,0xf6,0x20,0xd3,0xec,
0x3e,0x81,0xd3,0xf4,0x3e,0xd0,0xd3,0xf0,0xcd,0x18,0x35,0x3e,0x04,0xd3,0xe0,0x3e,
0x0b,0xd3,0xf0,0x21,0xaa,0x36,0x11,0x00,0x40,0x01,0x4c,0x00,0xed,0xb0,0x21,0xf9,
0x36,0x11,0xe5,0x41,0x01,0x40,0x00,0xed,0xb0,0xcd,0xc9,0x01,0xcd,0x8d,0x02,0xc2,
0xaf,0x37,0xdb,0xf0,0x3c,0xca,0xaf,0x37,0x01,0x00,0x00,0x0b,0x3e,0x81,0xd3,0xf4,
0x78,0xb1,0xca,0xaf,0x37,0xdb,0xf0,0xcb,0x57,0x28,0xf0,0x1e,0x05,0x01,0x00,0x00,
0xdb,0xf0,0xcb,0x4f,0x20,0x11,0x0b,0x3e,0x81,0xd3,0xf4,0x78,0xb1,0x20,0xf1,0x21,
0x77,0x02,0xcd,0x1b,0x02,0x18,0xe4,0x1d,0x20,0xe3,0x3e,0x81,0xd3,0xf4,0x21,0x02,
0x35,0x22,0x4a,0x40,0x3e,0xc3,0x32,0x49,0x40,0x3e,0x80,0xd3,0xe4,0x01,0xf3,0x00,
0x21,0x00,0x43,0x3e,0x01,0xd3,0xf2,0x3e,0x80,0xd3,0xf0,0xcd,0x18,0x35,0xdb,0xf0,
0xe6,0x02,0xca,0xee,0x34,0xed,0xa2,0x3e,0x81,0xf6,0x40,0xd3,0xf4,0xed,0xa2,0xc3,
0xf7,0x34,0xaf,0xd3,0xe4,0x21,0xed,0x45,0x22,0x49,0x40,0xcd,0x18,0x35,0xdb,0xf0,
0xe1,0xe6,0x1c,0xca,0x00,0x43,0x18,0xb2,0xc5,0xc1,0x00,0xc9,0xc2,0x49,0x40,0xdb,
0xe4,0xcb,0x6f,0x28,0xfa,0xc3,0x00,0x00,0xff,0x11,0x91,0x35,0xd5,0xdb,0xec,0x3a,
0x22,0x40,0xb7,0x28,0x22,0x3a,0x1c,0x40,0xb7,0x20,0x1c,0x21,0x1a,0x40,0x35,0x20,
0x16,0x36,0x07,0x23,0x7e,0xe6,0x01,0xee,0x01,0x77,0x2a,0x20,0x40,0x28,0x05,0x3a,
0x23,0x40,0x18,0x02,0x3e,0x20,0x77,0x21,0x16,0x42,0x35,0xc0,0x36,0x1e,0x23,0x11,
0x66,0x02,0x06,0x03,0x34,0x1a,0x96,0xc0,0x77,0x23,0x13,0x10,0xf7,0x23,0x34,0x23,
0x7e,0x2b,0x3d,0x83,0x5f,0x1a,0xbe,0xd0,0x7e,0xfe,0x1e,0x30,0x06,0x2b,0x7e,0x23,
0xe6,0x03,0xc8,0x36,0x01,0x23,0x34,0x7e,0xd6,0x0d,0xd8,0x36,0x01,0x2b,0x2b,0x34,
0xc9,0x3a,0x10,0x42,0xcb,0x47,0xc8,0x3a,0x16,0x42,0xfe,0x1e,0xc0,0x21,0x35,0x3c,
0x11,0x19,0x42,0x0e,0x3a,0x06,0x03,0x1a,0x1b,0x36,0x2f,0x34,0xd6,0x0a,0x30,0xfb,
0xc6,0x3a,0x23,0x77,0x23,0x05,0xc8,0x71,0x23,0x18,0xec,0x11,0x1c,0x42,0x0e,0x2f,
0x18,0xe3,0xf5,0xdb,0xe0,0x1f,0xd2,0x65,0x33,0x1f,0xd2,0x69,0x33,0xc5,0xd5,0xe5,
0xdd,0xe5,0xfd,0xe5,0x21,0xf1,0x35,0xe5,0x1f,0xd2,0x46,0x40,0x1f,0xd2,0x3d,0x40,
0x1f,0xd2,0x06,0x42,0x1f,0xd2,0x09,0x42,0x1f,0xd2,0x40,0x40,0x1f,0xd2,0x43,0x40,
0xe1,0xfd,0xe1,0xdd,0xe1,0xe1,0xd1,0xc1,0xf1,0xfb,0xc9,0xf3,0xdb,0xea,0xfe,0xff,
0x28,0x38,0xaf,0xd3,0xe8,0xdd,0x7e,0x03,0xd3,0xe9,0xdd,0x7e,0x04,0xb7,0x28,0x2a,
0xd3,0xea,0xfd,0x21,0xe5,0x41,0xcd,0x44,0x36,0xdd,0x7e,0x05,0xb7,0x28,0x04,0xfd,
0xcb,0x04,0xce,0xfd,0xcb,0x04,0xd6,0xfd,0x21,0xed,0x41,0xb7,0x28,0x04,0xfd,0xcb,
0x04,0xce,0xfd,0xcb,0x04,0xd6,0xdb,0xe8,0xfb,0xc9,0xaf,0x06,0x04,0x0e,0xe8,0xed,
0x79,0x0c,0x10,0xfb,0x21,0xe8,0x41,0x06,0x03,0x36,0x00,0x23,0x10,0xfb,0x21,0xf0,
0x41,0x06,0x03,0x36,0x00,0x23,0x10,0xfb,0x18,0xdc,0xdd,0x21,0xe5,0x41,0xaf,0xdd,
0x77,0x03,0xdd,0xcb,0x04,0x56,0xc8,0xdb,0xea,0xcb,0x7f,0x20,0x0d,0xdd,0xcb,0x04,
0x4e,0xc8,0xcd,0x8d,0x02,0x28,0xf0,0xc3,0x03,0x42,0xdb,0xeb,0xdd,0x77,0x03,0xc9,
0xdd,0x21,0xed,0x41,0xdd,0xcb,0x04,0x56,0xc8,0xdb,0xea,0xcb,0x77,0x20,0x0d,0xdd,
0xcb,0x04,0x4e,0xc8,0xcd,0x8d,0x02,0x28,0xf0,0xc3,0x03,0x42,0xdd,0x7e,0x03,0xb7,
0x20,0x01,0x79,0xd3,0xeb,0xdd,0x36,0x03,0x00,0xc9,0xc3,0x96,0x1c,0xc3,0x78,0x1d,
0xc3,0x90,0x1c,0xc3,0xd9,0x25,0xc9,0x00,0x00,0xc9,0x00,0x00,0xc3,0x18,0x30,0x01,
0x24,0x30,0x00,0x01,0x07,0x00,0x00,0x07,0x73,0x04,0x00,0x3c,0x00,0xb0,0x00,0x06,
0xc2,0x03,0x43,0x01,0x00,0xff,0x52,0xc3,0x00,0x50,0xc7,0x00,0x00,0xaf,0xc9,0x00,
0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xc3,0xfa,0x35,0xc3,0xfa,0x35,0xc3,0xfa,0x35,
0xc3,0x29,0x35,0xc7,0x00,0x00,0x00,0x00,0x00,0x01,0x1e,0x30,0x00,0x00,0x00,0x52,
0x49,0x02,0x21,0x30,0x00,0x00,0x00,0x52,0x4f,0x02,0x1b,0x30,0x55,0x6c,0xff,0x52,
0x4e,0x00,0x00,0xff,0xff,0x00,0x00,0xc3,0x2e,0x02,0xc3,0xfa,0x35,0xc3,0xfa,0x35,
0x41,0x32,0x03,0x32,0x28,0x03,0x3c,0x04,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,
0x00,0x02,0x39,0x37,0x00,0x00,0x00,0x00,0xff,0xdd,0x7e,0x03,0xfe,0x52,0x20,0x03,
0xdd,0x7e,0x04,0xcd,0x5e,0x37,0xc0,0xe5,0xdd,0x7e,0x05,0xfe,0x52,0x20,0x03,0xdd,
0x7e,0x06,0xcd,0x5e,0x37,0xeb,0xe1,0xc0,0x01,0x03,0x00,0xed,0xb0,0xc9,0x21,0x6c,
0x37,0x01,0x0f,0x00,0xed,0xb1,0xc0,0x7e,0x23,0x66,0x6f,0xc9,0x4b,0x15,0x40,0x44,
0x1d,0x40,0x50,0x25,0x40,0x49,0xe5,0x41,0x4f,0xed,0x41,0xfe,0x22,0x20,0x0a,0x3a,
0x9f,0x40,0xee,0x01,0x32,0x9f,0x40,0x3e,0x22,0xfe,0x3a,0xc2,0xaa,0x06,0x3a,0x9f,
0x40,0x1f,0xda,0xa8,0x06,0x17,0xc3,0xa3,0x06,0xd7,0xe5,0x3e,0x11,0xcd,0x57,0x28,
0x2a,0xd4,0x40,0xcd,0xbb,0x35,0x36,0x20,0x23,0xcd,0xa0,0x35,0xc3,0x84,0x28,0xcd,
0xb5,0x37,0xc3,0x75,0x00,0xfb,0xcd,0xd7,0x37,0x21,0xf6,0x37,0xcd,0x1b,0x02,0xcd,
0x49,0x00,0xfe,0x0d,0x28,0x0e,0xf5,0xcd,0x33,0x00,0xf1,0xfe,0x48,0x28,0x05,0xfe,
0x4c,0x20,0xe2,0xaf,0x32,0x11,0x42,0x3e,0x0d,0xc3,0x33,0x00,0x21,0x30,0x30,0x22,
0x77,0x41,0xc3,0x2e,0x02,0xaa,0xaa,0xaa,0xff,0xff,0x01,0xcd,0x1b,0x02,0x21,0x02,
0x02,0xcd,0x1b,0x02,0x18,0xe6,0x0e,0x43,0x61,0x73,0x73,0x3f,0x20,0x03,0xaa,0xaa
];
var glyph = [
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x24,0x20,0xf8,0x20,0x24,0xf8,0x00,0x00,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,
0x08,0x10,0x78,0x84,0xfc,0x80,0x78,0x00,0x00,0x00,0x00,0x00,
0x48,0x00,0x84,0x84,0x84,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0x10,0x28,0x10,0x28,0x44,0x7c,0x44,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xfc,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
0x28,0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00,0x00,0x00,
0x3a,0x44,0x4c,0x54,0x64,0x44,0xb8,0x00,0x00,0x00,0x00,0x00,
0x20,0x10,0x84,0x84,0x84,0x8c,0x74,0x00,0x00,0x00,0x00,0x00,
0x64,0x98,0x00,0x58,0x64,0x44,0x44,0x00,0x00,0x00,0x00,0x00,
0x10,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x70,0x00,0x70,0x08,0x78,0x88,0x74,0x00,0x00,0x00,0x00,0x00,
0x7c,0xf4,0x88,0x88,0xf0,0x90,0x88,0x00,0x00,0x00,0x00,0x00,
0x28,0x00,0x10,0x28,0x44,0x7c,0x44,0x00,0x00,0x00,0x00,0x00,
0x64,0x98,0x10,0x28,0x44,0x7c,0x44,0x00,0x00,0x00,0x00,0x00,
0x64,0x98,0x44,0x64,0x54,0x4c,0x44,0x00,0x00,0x00,0x00,0x00,
0x00,0x28,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00,0x00,0x00,
0x12,0x2c,0x4c,0x54,0x64,0x68,0x90,0x00,0x00,0x00,0x00,0x00,
0x64,0x98,0x00,0x78,0x84,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0x78,0x44,0x44,0x78,0x44,0x44,0xf8,0x00,0x00,0x00,0x00,0x00,
0x48,0x00,0x84,0x84,0x84,0x8c,0x74,0x00,0x00,0x00,0x00,0x00,
0x64,0x98,0x00,0x30,0x48,0x48,0x30,0x00,0x00,0x00,0x00,0x00,
0x38,0x54,0x14,0x38,0x50,0x54,0x38,0x00,0x00,0x00,0x00,0x00,
0x50,0x00,0x70,0x08,0x78,0x88,0x74,0x00,0x00,0x00,0x00,0x00,
0x40,0x20,0x70,0x08,0x78,0x88,0x74,0x00,0x00,0x00,0x00,0x00,
0x20,0x00,0x70,0x08,0x78,0x88,0x74,0x00,0x00,0x00,0x00,0x00,
0x78,0x80,0xf8,0x84,0x7c,0x04,0x78,0x00,0x00,0x00,0x00,0x00,
0x08,0x10,0x7c,0x40,0x7c,0x40,0x7c,0x00,0x00,0x00,0x00,0x00,
0x10,0x3c,0x48,0x4c,0x78,0x48,0x4c,0x00,0x00,0x00,0x00,0x00,
0x38,0x44,0x40,0x40,0x44,0x38,0x10,0x20,0x00,0x00,0x00,0x00,
0x00,0x00,0x64,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x48,0x48,0xfc,0x48,0xfc,0x48,0x48,0x00,0x00,0x00,0x00,0x00,
0x20,0x78,0xa0,0x70,0x28,0xf0,0x20,0x00,0x00,0x00,0x00,0x00,
0x00,0xc4,0xc8,0x10,0x20,0x4c,0x8c,0x00,0x00,0x00,0x00,0x00,
0x70,0x88,0x90,0x60,0x94,0x88,0x74,0x00,0x00,0x00,0x00,0x00,
0x10,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x10,0x20,0x20,0x20,0x10,0x08,0x00,0x00,0x00,0x00,0x00,
0x40,0x20,0x10,0x10,0x10,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
0x20,0xa8,0x70,0xf8,0x70,0xa8,0x20,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,
0x78,0x84,0x8c,0xb4,0xc4,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00,0x00,
0x78,0x84,0x04,0x38,0x40,0x80,0xfc,0x00,0x00,0x00,0x00,0x00,
0x78,0x84,0x04,0x38,0x04,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0x08,0x18,0x28,0x48,0xfc,0x08,0x08,0x00,0x00,0x00,0x00,0x00,
0xfc,0x80,0xf8,0x04,0x04,0x88,0x70,0x00,0x00,0x00,0x00,0x00,
0x38,0x40,0x80,0xf8,0x84,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0xfc,0x84,0x08,0x10,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
0x78,0x84,0x84,0x78,0x84,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0x78,0x84,0x84,0x7c,0x04,0x08,0x70,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,
0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
0x78,0x84,0x04,0x18,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
0x38,0x44,0x94,0xac,0x90,0x40,0x3c,0x00,0x00,0x00,0x00,0x00,
0x30,0x48,0x84,0xfc,0x84,0x84,0x84,0x00,0x00,0x00,0x00,0x00,
0xf8,0x44,0x44,0x78,0x44,0x44,0xf8,0x00,0x00,0x00,0x00,0x00,
0x38,0x44,0x80,0x80,0x80,0x44,0x38,0x00,0x00,0x00,0x00,0x00,
0xf0,0x48,0x44,0x44,0x44,0x48,0xf0,0x00,0x00,0x00,0x00,0x00,
0xfc,0x80,0x80,0xf0,0x80,0x80,0xfc,0x00,0x00,0x00,0x00,0x00,
0xfc,0x80,0x80,0xf0,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
0x38,0x44,0x80,0x9c,0x84,0x44,0x38,0x00,0x00,0x00,0x00,0x00,
0x84,0x84,0x84,0xfc,0x84,0x84,0x84,0x00,0x00,0x00,0x00,0x00,
0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00,0x00,
0x1c,0x08,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,
0x84,0x88,0x90,0xe0,0x90,0x88,0x84,0x00,0x00,0x00,0x00,0x00,
0x80,0x80,0x80,0x80,0x80,0x80,0xfc,0x00,0x00,0x00,0x00,0x00,
0x84,0xcc,0xb4,0x84,0x84,0x84,0x84,0x00,0x00,0x00,0x00,0x00,
0x84,0xc4,0xa4,0x94,0x8c,0x84,0x84,0x00,0x00,0x00,0x00,0x00,
0x78,0x84,0x84,0x84,0x84,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0xf8,0x84,0x84,0xf8,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
0x78,0x84,0x84,0x84,0x94,0x88,0x74,0x00,0x00,0x00,0x00,0x00,
0xf8,0x84,0x84,0xf8,0x90,0x88,0x84,0x00,0x00,0x00,0x00,0x00,
0x78,0x84,0x80,0x78,0x04,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
0x84,0x84,0x84,0x84,0x84,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0x84,0x84,0x84,0x48,0x48,0x30,0x30,0x00,0x00,0x00,0x00,0x00,
0x84,0x84,0x84,0x84,0xb4,0xcc,0x84,0x00,0x00,0x00,0x00,0x00,
0x84,0x84,0x48,0x30,0x48,0x84,0x84,0x00,0x00,0x00,0x00,0x00,
0x88,0x88,0x88,0x70,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
0xfc,0x04,0x08,0x30,0x40,0x80,0xfc,0x00,0x00,0x00,0x00,0x00,
0x38,0x20,0x20,0x20,0x20,0x20,0x38,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x00,0x00,0x00,0x00,0x00,
0x70,0x10,0x10,0x10,0x10,0x10,0x70,0x00,0x00,0x00,0x00,0x00,
0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,
0x20,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x70,0x08,0x78,0x88,0x74,0x00,0x00,0x00,0x00,0x00,
0x80,0x80,0xb8,0xc4,0x84,0xc4,0xb8,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x78,0x84,0x80,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0x04,0x04,0x74,0x8c,0x84,0x8c,0x74,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x78,0x84,0xfc,0x80,0x7c,0x00,0x00,0x00,0x00,0x00,
0x18,0x24,0x20,0xf8,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x74,0x8c,0x8c,0x74,0x04,0x78,0x00,0x00,0x00,0x00,
0x80,0x80,0xb8,0xc4,0x84,0x84,0x84,0x00,0x00,0x00,0x00,0x00,
0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00,0x00,
0x08,0x00,0x18,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,
0x80,0x80,0x88,0x90,0xa0,0xd0,0x88,0x00,0x00,0x00,0x00,0x00,
0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xec,0x92,0x92,0x92,0x92,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xb8,0xc4,0x84,0x84,0x84,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x78,0x84,0x84,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xb8,0xc4,0xc4,0xb8,0x80,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x74,0x8c,0x8c,0x74,0x04,0x04,0x00,0x00,0x00,0x00,
0x00,0x00,0xb8,0xc4,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7c,0x80,0x78,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,
0x20,0x20,0xf8,0x20,0x20,0x24,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x84,0x84,0x84,0x8c,0x74,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x84,0x84,0x84,0x48,0x30,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x82,0x82,0x92,0x92,0x6c,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x84,0x48,0x30,0x48,0x84,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x84,0x84,0x8c,0x74,0x04,0x78,0x00,0x00,0x00,0x00,
0x00,0x00,0xfc,0x08,0x30,0x40,0xfc,0x00,0x00,0x00,0x00,0x00,
0x18,0x20,0x20,0x40,0x20,0x20,0x18,0x00,0x00,0x00,0x00,0x00,
0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
0x60,0x10,0x10,0x08,0x10,0x10,0x60,0x00,0x00,0x00,0x00,0x00,
0x60,0x92,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x10,0xfe,0x10,0x10,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,
0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,
0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,
0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,
0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,
0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,
0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,
0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,
0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,
0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,
0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,
0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,
0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,
0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,
0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,
0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,
0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,
0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,
0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,
0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,
0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,
0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,
0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,
0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,
0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,
0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,
0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,
0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,
0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,
0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,
0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,
0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,
0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x10,0x38,0x7c,0xfe,0xfe,0x7c,0x10,0x10,0x00,0x00,0x00,0x00,
0x00,0x6c,0xfe,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
0x38,0x38,0x10,0xd6,0xfe,0xd6,0x10,0x38,0x00,0x00,0x00,0x00,
0x3c,0x42,0xa5,0x81,0xa5,0x99,0x42,0x3c,0x00,0x00,0x00,0x00,
0x3c,0x42,0xa5,0x81,0x99,0xa5,0x42,0x3c,0x00,0x00,0x00,0x00,
0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x78,0x00,0x00,0x00,0x00,
0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x78,0x00,0x00,0x00,0x00,
0x00,0x00,0x79,0x86,0x86,0x79,0x00,0x00,0x00,0x00,0x00,0x00,
0x78,0x44,0x78,0x44,0x44,0x78,0x40,0x80,0x00,0x00,0x00,0x00,
0xc2,0x24,0x28,0x30,0x20,0x60,0x60,0x00,0x00,0x00,0x00,0x00,
0x18,0x24,0x20,0x18,0x14,0x24,0x18,0x00,0x00,0x00,0x00,0x00,
0x0c,0x10,0x20,0x7c,0x20,0x10,0x0c,0x00,0x00,0x00,0x00,0x00,
0x2c,0x0c,0x10,0x20,0x38,0x04,0x18,0x00,0x00,0x00,0x00,0x00,
0x5c,0xa4,0x24,0x24,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,
0x10,0x28,0x44,0x7c,0x44,0x28,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x40,0x40,0x40,0x44,0x44,0x38,0x00,0x00,0x00,0x00,0x00,
0x40,0x48,0x50,0x60,0x50,0x4a,0x44,0x00,0x00,0x00,0x00,0x00,
0x40,0x20,0x20,0x20,0x30,0x48,0x84,0x00,0x00,0x00,0x00,0x00,
0x48,0x48,0x48,0x48,0x74,0x40,0x40,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x64,0x24,0x28,0x30,0x20,0x00,0x00,0x00,0x00,0x00,
0x10,0x38,0x40,0x30,0x40,0x38,0x04,0x18,0x00,0x00,0x00,0x00,
0x00,0x30,0x48,0x84,0x84,0x48,0x30,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7c,0xa8,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,
0x00,0x30,0x48,0x48,0x70,0x40,0x40,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7c,0x90,0x90,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7c,0x90,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0xc8,0x48,0x48,0x48,0x30,0x00,0x00,0x00,0x00,0x00,
0x10,0x38,0x54,0x54,0x54,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xc4,0x28,0x10,0x28,0x46,0x00,0x00,0x00,0x00,0x00,
0x92,0x54,0x54,0x38,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x44,0x82,0x92,0x92,0x6c,0x00,0x00,0x00,0x00,0x00,
0x38,0x44,0x82,0x82,0xc6,0x44,0xc6,0x00,0x00,0x00,0x00,0x00,
0x3c,0x20,0x20,0x20,0xa0,0x60,0x20,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x00,0x7c,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0xfc,0x40,0x20,0x18,0x20,0x40,0xfc,0x00,0x00,0x00,0x00,0x00,
0x00,0x64,0x98,0x00,0x64,0x98,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x28,0x44,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,
0x04,0x08,0x10,0x10,0x08,0x08,0x10,0x20,0x00,0x00,0x00,0x00,
0x02,0x04,0xfe,0x10,0xfe,0x40,0x80,0x00,0x00,0x00,0x00,0x00,
0x20,0x10,0x08,0x7c,0x20,0x10,0x08,0x00,0x00,0x00,0x00,0x00,
0x7e,0xa4,0x48,0x10,0x24,0x4a,0x84,0x00,0x00,0x00,0x00,0x00,
0x38,0x44,0x82,0x82,0xfe,0x44,0x44,0xc6,0x00,0x00,0x00,0x00,
0x00,0x00,0x6c,0x92,0x92,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0x08,0x90,0xa0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,
0x78,0x80,0x70,0x88,0x70,0x08,0xf0,0x00,0x00,0x00,0x00,0x00,
0x44,0xaa,0x54,0x28,0x54,0xaa,0x44,0x00,0x00,0x00,0x00,0x00,
0x3c,0x42,0x9d,0xa1,0xa1,0x9d,0x42,0x3c,0x00,0x00,0x00,0x00,
0x84,0x48,0x30,0x48,0x30,0x48,0x84,0x00,0x00,0x00,0x00,0x00,
0x7c,0x94,0x94,0x7c,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0x00,
0x10,0x38,0x54,0x50,0x54,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
0x3c,0x7a,0xa5,0xa5,0xb9,0xa9,0x66,0x3c,0x00,0x00,0x00,0x00,
0x5f,0x60,0x63,0x62,0x64,0x7b,0x60,0x5f,0x00,0x00,0x00,0x00,
0xff,0x04,0x03,0xfc,0x02,0xfc,0x04,0xf8,0x00,0x00,0x00,0x00,
0xfc,0x02,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xf0,0x88,0x88,0xf0,0x94,0x88,0x96,0x00,0x00,0x00,0x00,0x00,
0x61,0x82,0x84,0x68,0x16,0x29,0x49,0x86,0x00,0x00,0x00,0x00,
0x0e,0x06,0x0a,0x70,0x90,0x90,0x60,0x00,0x00,0x00,0x00,0x00,
0x38,0x44,0x44,0x44,0x38,0x10,0x38,0x10,0x00,0x00,0x00,0x00,
0x0f,0x08,0x08,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xe3,0xdd,0xf3,0xf7,0xff,0xf7,0xff,0x00,0x00,0x00,0x00,
0x10,0x28,0x10,0x38,0x54,0x10,0x28,0x44,0x00,0x00,0x00,0x00,
0x10,0x28,0x10,0x38,0x54,0x28,0x7c,0x28,0x00,0x00,0x00,0x00,
0x10,0x28,0x44,0x44,0x44,0x54,0x6c,0x44,0x00,0x00,0x00,0x00,
0x44,0x28,0x10,0x7c,0x10,0x7c,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x40,0xa0,0x40,0x00,0x00,0x00,0x00,0x00,
0x7e,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x04,0x04,0x04,0x04,0xfc,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x08,0x38,0x10,0x20,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xf8,0x08,0x30,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x04,0x08,0x18,0x28,0x08,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x7c,0x44,0x04,0x08,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x38,0x10,0x10,0x7c,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x08,0x7c,0x30,0x50,0x90,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x20,0x78,0x28,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x38,0x08,0x08,0x7c,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7c,0x04,0x3c,0x04,0x7c,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x54,0x54,0x44,0x08,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xfc,0x04,0x28,0x30,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
0x08,0x10,0x20,0x60,0xa0,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
0x10,0x7c,0x44,0x04,0x08,0x10,0x20,0x00,0x00,0x00,0x00,0x00,
0x7c,0x10,0x10,0x10,0x10,0x10,0x7c,0x00,0x00,0x00,0x00,0x00,
0x10,0xfc,0x10,0x30,0x50,0x90,0x10,0x00,0x00,0x00,0x00,0x00,
0x20,0xfc,0x24,0x24,0x24,0x44,0x9c,0x00,0x00,0x00,0x00,0x00,
0x10,0x38,0x10,0x7c,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,
0x7c,0x44,0x44,0x84,0x08,0x10,0x20,0x00,0x00,0x00,0x00,0x00,
0x40,0x40,0x7c,0x50,0x90,0x10,0x20,0x00,0x00,0x00,0x00,0x00,
0xfc,0x04,0x04,0x04,0x04,0x04,0xfc,0x00,0x00,0x00,0x00,0x00,
0x48,0xfc,0x48,0x48,0x08,0x10,0x20,0x00,0x00,0x00,0x00,0x00,
0x70,0x04,0xe4,0x04,0x04,0x48,0x30,0x00,0x00,0x00,0x00,0x00,
0xfc,0x02,0x04,0x08,0x10,0x20,0x50,0x88,0x00,0x00,0x00,0x00,
0x20,0xfc,0x24,0x28,0x20,0x24,0x38,0x00,0x00,0x00,0x00,0x00,
0x84,0x44,0x24,0x08,0x10,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
0xfc,0x84,0x84,0x14,0x08,0x10,0x20,0x00,0x00,0x00,0x00,0x00,
0x14,0xf8,0x10,0x7c,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,
0xfc,0x00,0xfc,0x04,0x08,0x10,0x60,0x00,0x00,0x00,0x00,0x00,
0x38,0x00,0x7c,0x10,0x10,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
0x80,0x80,0xe0,0x90,0x88,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
0x10,0x7c,0x10,0x10,0x10,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
0x38,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,
0xfc,0x04,0x04,0x28,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,
0x10,0xfc,0x04,0x08,0x18,0x34,0x50,0x00,0x00,0x00,0x00,0x00,
0x0c,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,
0x10,0x08,0x14,0x14,0x14,0x24,0x44,0x00,0x00,0x00,0x00,0x00,
0x80,0x80,0xfc,0x80,0x80,0x84,0x78,0x00,0x00,0x00,0x00,0x00,
0xfc,0x04,0x04,0x08,0x10,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x20,0x50,0x88,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x7c,0x10,0x54,0x54,0x54,0x10,0x00,0x00,0x00,0x00,0x00,
0xfc,0x04,0x04,0x28,0x10,0x08,0x04,0x00,0x00,0x00,0x00,0x00,
0x80,0x78,0x84,0x78,0x84,0x78,0x04,0x00,0x00,0x00,0x00,0x00,
0x08,0x10,0x20,0x40,0x90,0x88,0x74,0x00,0x00,0x00,0x00,0x00,
0x04,0x44,0x28,0x10,0x28,0x40,0x80,0x00,0x00,0x00,0x00,0x00,
0xfc,0x20,0x78,0x20,0x20,0x24,0x18,0x00,0x00,0x00,0x00,0x00,
0x20,0xfc,0x24,0x28,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
0x78,0x08,0x08,0x08,0x10,0x20,0xfc,0x00,0x00,0x00,0x00,0x00,
0xfc,0x04,0x04,0x7c,0x04,0x04,0xfc,0x00,0x00,0x00,0x00,0x00,
0x54,0x54,0x44,0x04,0x08,0x10,0x20,0x00,0x00,0x00,0x00,0x00,
0x84,0x84,0x84,0x84,0x88,0x10,0x20,0x00,0x00,0x00,0x00,0x00,
0xa0,0xa0,0xa0,0xa4,0xa4,0xa8,0xb0,0x00,0x00,0x00,0x00,0x00,
0x80,0x80,0x80,0x88,0x88,0x90,0xe0,0x00,0x00,0x00,0x00,0x00,
0xfc,0x84,0x84,0x84,0x84,0x84,0xfc,0x00,0x00,0x00,0x00,0x00,
0xfc,0x84,0x84,0x04,0x08,0x10,0x20,0x00,0x00,0x00,0x00,0x00,
0xf2,0x02,0x02,0x02,0x04,0x88,0x70,0x00,0x00,0x00,0x00,0x00,
0x40,0xa0,0x50,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x40,0xa0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x04,0x34,0x54,0x54,0x38,0x00,0x00,0x00,0x00,
0x00,0x10,0x28,0x44,0x44,0x7c,0x44,0x44,0x00,0x00,0x00,0x00,
0x00,0x78,0x24,0x24,0x38,0x24,0x24,0x78,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00,0x00,
0x00,0x78,0x24,0x24,0x24,0x24,0x24,0x78,0x00,0x00,0x00,0x00,
0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x7c,0x00,0x00,0x00,0x00,
0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x40,0x00,0x00,0x00,0x00,
0x00,0x3c,0x40,0x40,0x5c,0x44,0x44,0x3c,0x00,0x00,0x00,0x00,
0x00,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x00,0x00,0x00,0x00,
0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00,0x00,
0x00,0x04,0x04,0x04,0x04,0x04,0x44,0x38,0x00,0x00,0x00,0x00,
0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00,0x00,
0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00,0x00,0x00,0x00,
0x00,0x44,0x6c,0x54,0x54,0x44,0x44,0x44,0x00,0x00,0x00,0x00,
0x00,0x44,0x64,0x54,0x4c,0x44,0x44,0x44,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00,0x00,
0x00,0x78,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00,0x00,
0x00,0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00,0x00,0x00,
0x00,0x7c,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,
0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00,0x00,
0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00,0x00,
0x00,0x44,0x44,0x44,0x44,0x54,0x6c,0x44,0x00,0x00,0x00,0x00,
0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00,0x00,
0x00,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,
0x00,0x7c,0x04,0x08,0x10,0x20,0x40,0x7c,0x00,0x00,0x00,0x00,
0x00,0x10,0x38,0x54,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x10,0x54,0x38,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x20,0x7c,0x20,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x08,0x7c,0x08,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00,0x00,0x00,
0x00,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x28,0x28,0x7c,0x28,0x7c,0x28,0x28,0x00,0x00,0x00,0x00,
0x00,0x10,0x3c,0x50,0x38,0x14,0x78,0x10,0x00,0x00,0x00,0x00,
0x00,0x60,0x64,0x08,0x10,0x20,0x4c,0x0c,0x00,0x00,0x00,0x00,
0x00,0x20,0x50,0x50,0x20,0x54,0x48,0x34,0x00,0x00,0x00,0x00,
0x00,0x30,0x30,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x20,0x20,0x20,0x10,0x08,0x00,0x00,0x00,0x00,
0x00,0x20,0x10,0x08,0x08,0x08,0x10,0x20,0x00,0x00,0x00,0x00,
0x00,0x10,0x54,0x38,0x7c,0x38,0x54,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x10,0x7c,0x10,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x4c,0x54,0x64,0x44,0x38,0x00,0x00,0x00,0x00,
0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x04,0x38,0x40,0x40,0x7c,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x04,0x18,0x04,0x44,0x38,0x00,0x00,0x00,0x00,
0x00,0x08,0x18,0x28,0x48,0x7c,0x08,0x08,0x00,0x00,0x00,0x00,
0x00,0x7c,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00,0x00,0x00,
0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x38,0x00,0x00,0x00,0x00,
0x00,0x7c,0x04,0x08,0x10,0x20,0x40,0x40,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x44,0x3c,0x04,0x08,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,
0x00,0x30,0x30,0x00,0x30,0x30,0x10,0x20,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x04,0x08,0x10,0x00,0x10,0x00,0x00,0x00,0x00,
0x18,0x24,0x20,0xf8,0x20,0x24,0xf8,0x00,0x00,0x00,0x00,0x00,
0x88,0x50,0xf8,0x20,0xf8,0x20,0x20,0x00,0x00,0x00,0x00,0x00,
0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0x00,0x00,0x00,0x00,0x00,
0xac,0x84,0x9c,0xa4,0xa0,0x8c,0x84,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xaa,0x20,0x9d,0xa6,0x82,0x8c,0x90,0xb6,
0xb9,0xaa,0xa9,0xa9,0xaa,0x20,0x95,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x20,0x85,0x8a,
0x88,0x8c,0x81,0x89,0x8c,0x8a,0x8a,0x8a,0x8a,0x8c,0x85,0x20,
0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x31,0x2e,0x34,0x2e,
0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x79,0x20,0x50,0x65,0x74,0x65,0x72,0x20,0x61,0x6e,0x64,
0x20,0x47,0x65,0x6f,0x72,0x67,0x65,0x20,0x50,0x68,0x69,0x6c,
0x6c,0x69,0x70,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x70,
0x65,0x6f,0x70,0x6c,0x65,0x2e,0x63,0x73,0x2e,0x75,0x62,0x63,
0x2e,0x63,0x61,0x2f,0x7e,0x70,0x70,0x68,0x69,0x6c,0x6c,0x69,
0x70,0x2f,0x74,0x72,0x73,0x38,0x30,0x2e,0x68,0x74,0x6d,0x6c,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x6e,0x70,0x32,
0x30,0x38,0x34,0x40,0x67,0x6d,0x61,0x69,0x6c,0x2e,0x63,0x6f,
0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
] ;
// Support routines for refz80.js and trs80.html
// (signed char) replacement
function signed_char(x)
{
x &= 0xff;
if (x >= 128) x -= 256;
return x;
}
function signed_int(x)
{
return x & 0xff;
}
function cy(z,N)
{
z.cycles -= N;
}
function build_ptable()
{
// Table for parity flag lookup.
var i, cnt;
ptable = [];
for (i = 0; i < 256; i++) {
cnt =
!!(i & 0x80) +
!!(i & 0x40) +
!!(i & 0x20) +
!!(i & 0x10) +
!!(i & 0x08) +
!!(i & 0x04) +
!!(i & 0x02) +
!!(i & 0x01) ;
ptable[i] = !(cnt & 1)
}
}
function TRS80PortIn(z, port)
{
// XXX - only reports status of video IRQ, not others.
if (port == 0xe0)
return (z.beam_IRQ ? ~4 : 0xff) & 255;
// XXX - big hack -- port 255 gives most of 236
if (port == 0xff)
return (z.port236output & ~3) & 255;
if (port == 0xec)
z.beam_IRQ = 0;
if (port == 0xf8)
return 0x30; // printer is ready!
return 255;
}
function TRS80PortOut(z, port, data)
{
if (port == 236) {
z.port236output = data;
}
if (port == 0xe0) {
z.beam_IRQ_enabled = data & 4;
}
}
function getCaller(arg)
{
var caller = arg.callee.caller.toString();
caller = caller.substr('function '.length);
caller = caller.substr(0, caller.indexOf('('));
return caller;
}
function chkb(z, val)
{
if ((val & 0xff) != val) {
var caller = getCaller(arguments)
writeDebug("chkb fail from '" + caller + "' val=" + val + " (" + hex8(val) + ")");
z.cycles = -1;
stopEmulator(z);
}
return val & 0xff;
}
function chkw(z, val)
{
if ((val & 0xffff) != val) {
var caller = getCaller(arguments)
writeDebug("chkw fail from '" + caller + "' val=" + val + " (" + hex8(val) + ")");
z.cycles = -1;
stopEmulator(z);
}
return val & 0xffff;
}
function getZ80()
{
return z80;
}
function adc16(z,accV,val)
{
var res;
z.reg.tmp = accV & 0xff
z.reg.tmp = add(z, z.reg.tmp, val & 0xff, !!(z.reg.fC), 1)
res = z.reg.tmp
z.reg.tmp = (accV >> 8) & 0xff
z.reg.tmp = add(z, z.reg.tmp, (val >> 8) & 0xff, !!(z.reg.fC), 1)
res = (z.reg.tmp << 8) | res
accV = res
assign_z(z, !(accV))
return accV
}
function add(z,accV,val,cry,docarry)
{
var res;
res = signed_int(accV) + val + cry
assign_s(z, res & 0x80)
if (docarry) assign_c(z, res & 0x100)
assign_h(z, ((accV & 15) + (val & 15) + cry) & 16)
assign_n(z, 0)
assign_z(z, !(res & 0xff))
res = signed_char(accV) + signed_char(val) + cry
assign_pv(z, res > 127 || res < -128)
accV = signed_int(accV) + val + cry
return accV & 255
}
function add16(z,accV,val)
{
var r;
assign_n(z, 0)
assign_h(z, ((accV & 0xfff) + (val & 0xfff)) & 0x1000)
r = ((accV & 0xff) + (val & 0xff)) >> 8
assign_c(z, ((accV >> 8) + (val >> 8) + r) & 0x100)
accV += val
return accV & 65535
}
function and(z,val)
{
z.reg.A =z.reg.A & val
assign_s(z, z.reg.A & 0x80)
assign_z(z, !(z.reg.A))
assign_h(z, 1)
assign_pv(z, parity(z.reg.A))
assign_n(z, 0)
assign_c(z, 0)
}
function assign_3(z,val)
{
z.reg.f3 = val
}
function assign_5(z,val)
{
z.reg.f5 = val
}
function assign_c(z,val)
{
z.reg.fC = val
}
function assign_h(z,val)
{
z.reg.fH = val
}
function assign_n(z,val)
{
z.reg.fN = val
}
function assign_pv(z,val)
{
z.reg.fPV = val
}
function assign_s(z,val)
{
z.reg.fS = val
}
function assign_z(z,val)
{
z.reg.fZ = val
}
function bit(z,val,bit)
{
assign_h(z, 1)
assign_n(z, 0)
assign_z(z, !(val & (1 << bit)))
}
function branch(z,cond)
{
var newpc;
newpc = signed_char(z.mem[z.reg.PC++])
newpc += z.reg.PC
if (cond) {
z.reg.PC = newpc
return 12
}
return 7
}
function call(z,cond)
{
var newpc;
newpc = fetch_nn(z)
if (cond) {
push(z, z.reg.PC)
z.reg.PC = newpc
cy(z, 7)
}
}
function checkTrace(z,T)
{
return T[0] == z.cycles && T[1] == z.reg.PC && T[2] == getAF(z) && T[3] == z.reg.BC && T[4] == z.reg.DE && T[5] == z.reg.HL && T[6] == z.reg.SP && T[7] == z.reg.IX && T[8] == z.reg.IY
}
function cp(z,val)
{
z.reg.tmp = z.reg.A
z.reg.tmp = sub(z, z.reg.tmp, val, 0, 1)
}
function daa(z)
{
var res;
res = z.reg.A
if (getF(z) & 2) {
if ((res & 15) > 9 || (getF(z) & 16))
res -= 6
if (z.reg.A > 0x99 || !!(z.reg.fC))
res -= 0x60
assign_h(z, (getF(z) & 16) && (z.reg.A & 15) < 6)
if (z.reg.A > 0x99)
assign_c(z, 1)
z.reg.A = (res & 255)
}
else {
if ((res & 15) > 9 || (getF(z) & 16))
res += 6
if (res > 0x9f || !!(z.reg.fC))
res += 0x60
if (res > 255)
assign_c(z, 1)
assign_h(z, (z.reg.A & 15) > 9)
z.reg.A = (res & 255)
}
assign_s(z, z.reg.A & 0x80)
assign_z(z, !(z.reg.A))
assign_pv(z, parity(z.reg.A))
assign_5(z, z.reg.A & 0x20)
assign_3(z, z.reg.A & 0x08)
}
function dec_b(z)
{
qq = ((z.reg.BC >> 8) - 1) & 255 ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function dec_bc(z)
{
z.reg.BC = (z.reg.BC - 1) & 0xffff
}
function dec_de(z)
{
z.reg.DE = (z.reg.DE - 1) & 0xffff
}
function dec_hl(z)
{
z.reg.HL = (z.reg.HL - 1) & 0xffff
}
function dec_sp(z)
{
z.reg.SP = (z.reg.SP - 1) & 0xffff
}
function dec_xy(z)
{
z.reg.IQ = (z.reg.IQ - 1) & 0xffff
}
function decp(z,accV)
{
accV = sub(z, accV, 1, 0, 0)
return accV
}
function ex_memsp(z,rV)
{
var temp;
temp = rV
rV = load16(z, z.reg.SP)
store16(z, z.reg.SP, temp)
return rV
}
function fetch_n(z)
{
return z.mem[z.reg.PC++]
}
function fetch_nn(z)
{
var lw;
lw = z.mem[z.reg.PC++]
return (z.mem[z.reg.PC++] << 8) | lw
}
function fetch_opcode(z)
{
z.reg.R = (z.reg.R + 1) & 0x7f
return z.mem[z.reg.PC++]
}
function genirq(z,vec)
{
push( z, z.reg.PC )
z.reg.PC = vec
}
function getAF(z)
{
return (z.reg.A << 8) | getF(z)
}
function getF(z)
{
var res = 0
if (z.reg.fS ) res |= 0x80
if (z.reg.fZ ) res |= 0x40
if (z.reg.f5 ) res |= 0x20
if (z.reg.fH ) res |= 0x10
if (z.reg.f3 ) res |= 0x08
if (z.reg.fPV) res |= 0x04
if (z.reg.fN ) res |= 0x02
if (z.reg.fC ) res |= 0x01
return res
}
function getRegList(z,T)
{
T[0] = z.reg.PC
T[1] = getAF(z)
T[2] = z.reg.BC
T[3] = z.reg.DE
T[4] = z.reg.HL
T[5] = z.reg.SP
T[6] = z.reg.IX
T[7] = z.reg.IY
T[8] = z.cycles
}
function zin(z,port,accV,doflags)
{
accV = TRS80PortIn(z, port)
if (doflags) {
assign_s(z, accV & 0x80)
assign_z(z, !(accV))
assign_h(z, 0)
assign_pv(z, parity(accV))
assign_n(z, 0)
}
return accV
}
function inc_bc(z)
{
z.reg.BC = (z.reg.BC + 1) & 0xffff
}
function inc_de(z)
{
z.reg.DE = (z.reg.DE + 1) & 0xffff
}
function inc_hl(z)
{
z.reg.HL = (z.reg.HL + 1) & 0xffff
}
function inc_sp(z)
{
z.reg.SP = (z.reg.SP + 1) & 0xffff
}
function inc_xy(z)
{
z.reg.IQ = (z.reg.IQ + 1) & 0xffff
}
function incp(z,accV)
{
accV = add(z, accV, 1, 0, 0)
return accV
}
function ixy(z)
{
return signed_char(z.mem[z.reg.PC++]) + z.reg.IQ
}
function jump(z,cond)
{
var newpc;
newpc = fetch_nn(z)
if (cond) {
z.reg.PC = newpc
}
}
function load16(z,mem)
{
var lw;
lw = z.mem[mem++]
return (z.mem[mem] << 8) | lw
}
function load8(z,mem)
{
return z.mem[mem]
}
function main00(z)
{
var t;
return 0
}
function main01(z)
{
return 0
}
function main10(z)
{
return 0
}
function main11(z)
{
return 0
}
function mode_1_IRQ(z)
{
if (z.reg.IFF1 == 0)
return 0
push(z, z.reg.PC)
z.reg.PC = 0x38
z.reg.IFF1 = z.reg.IFF2 = 0
cy(z, 11 + 2)
return 1
}
function op_00(z)
{
cy(z, 4)
}
function op_01(z)
{
cy(z, 10)
z.reg.BC = fetch_nn(z)
}
function op_02(z)
{
cy(z, 7)
store8(z, z.reg.BC, z.reg.A)
}
function op_03(z)
{
cy(z, 6)
inc_bc(z)
}
function op_04(z)
{
cy(z, 4)
qq = incp(z, (z.reg.BC >> 8)) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function op_05(z)
{
cy(z, 4)
qq = decp(z, (z.reg.BC >> 8)) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function op_06(z)
{
cy(z, 7)
qq = fetch_n(z) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function op_07(z)
{
cy(z, 4)
rlca(z)
}
function op_08(z)
{
cy(z, 4)
extmp = getAF(z); setAF(z, z.reg.AFp); z.reg.AFp = extmp
}
function op_09(z)
{
cy(z, 11)
z.reg.HL = add16(z, z.reg.HL, z.reg.BC)
}
function op_0a(z)
{
cy(z, 7)
z.reg.A = load8(z, z.reg.BC)
}
function op_0b(z)
{
cy(z, 6)
dec_bc(z)
}
function op_0c(z)
{
cy(z, 4)
qq = incp(z, (z.reg.BC & 0xff)) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function op_0d(z)
{
cy(z, 4)
qq = decp(z, (z.reg.BC & 0xff)) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function op_0e(z)
{
cy(z, 7)
qq = fetch_n(z) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function op_0f(z)
{
cy(z, 4)
rrca(z)
}
function op_10(z)
{
dec_b(z)
cy(z, branch(z, !!((z.reg.BC >> 8))) + 1)
}
function op_11(z)
{
cy(z, 10)
z.reg.DE = fetch_nn(z)
}
function op_12(z)
{
cy(z, 7)
store8(z, z.reg.DE, z.reg.A)
}
function op_13(z)
{
cy(z, 6)
inc_de(z)
}
function op_14(z)
{
cy(z, 4)
qq = incp(z, (z.reg.DE >> 8)) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function op_15(z)
{
cy(z, 4)
qq = decp(z, (z.reg.DE >> 8)) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function op_16(z)
{
cy(z, 7)
qq = fetch_n(z) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function op_17(z)
{
cy(z, 4)
rla(z)
}
function op_18(z)
{
cy(z, branch(z, 1) )
}
function op_19(z)
{
cy(z, 11)
z.reg.HL = add16(z, z.reg.HL, z.reg.DE)
}
function op_1a(z)
{
cy(z, 7)
z.reg.A = load8(z, z.reg.DE)
}
function op_1b(z)
{
cy(z, 6)
dec_de(z)
}
function op_1c(z)
{
cy(z, 4)
qq = incp(z, (z.reg.DE & 0xff)) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function op_1d(z)
{
cy(z, 4)
qq = decp(z, (z.reg.DE & 0xff)) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function op_1e(z)
{
cy(z, 7)
qq = fetch_n(z) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function op_1f(z)
{
cy(z, 4)
rra(z)
}
function op_20(z)
{
cy(z, branch(z, !(z.reg.fZ)) )
}
function op_21(z)
{
cy(z, 10)
z.reg.HL = fetch_nn(z)
}
function op_22(z)
{
cy(z, 16)
store16(z, fetch_nn(z), z.reg.HL)
}
function op_23(z)
{
cy(z, 6)
inc_hl(z)
}
function op_24(z)
{
cy(z, 4)
qq = incp(z, (z.reg.HL >> 8)) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function op_25(z)
{
cy(z, 4)
qq = decp(z, (z.reg.HL >> 8)) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function op_26(z)
{
cy(z, 7)
qq = fetch_n(z) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function op_27(z)
{
cy(z, 4)
daa(z)
}
function op_28(z)
{
cy(z, branch(z, z.reg.fZ) )
}
function op_29(z)
{
cy(z, 11)
z.reg.HL = add16(z, z.reg.HL, z.reg.HL)
}
function op_2a(z)
{
cy(z, 16)
z.reg.HL = load16(z, fetch_nn(z))
}
function op_2b(z)
{
cy(z, 6)
dec_hl(z)
}
function op_2c(z)
{
cy(z, 4)
qq = incp(z, (z.reg.HL & 0xff)) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function op_2d(z)
{
cy(z, 4)
qq = decp(z, (z.reg.HL & 0xff)) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function op_2e(z)
{
cy(z, 7)
qq = fetch_n(z) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function op_2f(z)
{
cy(z, 4)
z.reg.A = (~z.reg.A) & 255
assign_h(z, 1)
assign_n(z, 1)
}
function op_30(z)
{
cy(z, branch(z, !(z.reg.fC)) )
}
function op_31(z)
{
cy(z, 10)
z.reg.SP = fetch_nn(z)
}
function op_32(z)
{
cy(z, 13)
store8(z, fetch_nn(z), z.reg.A)
}
function op_33(z)
{
cy(z, 6)
inc_sp(z)
}
function op_34(z)
{
cy(z, 11)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = incp(z, z.reg.tmp)
store8(z, z.reg.HL, z.reg.tmp)
}
function op_35(z)
{
cy(z, 11)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = decp(z, z.reg.tmp)
store8(z, z.reg.HL, z.reg.tmp)
}
function op_36(z)
{
cy(z, 10)
store8(z, z.reg.HL, fetch_n(z))
}
function op_37(z)
{
cy(z, 4)
assign_c(z, 1)
assign_h(z, 0)
assign_n(z, 0)
}
function op_38(z)
{
cy(z, branch(z, z.reg.fC) )
}
function op_39(z)
{
cy(z, 11)
z.reg.HL = add16(z, z.reg.HL, z.reg.SP)
}
function op_3a(z)
{
cy(z, 13)
z.reg.A = load8(z, fetch_nn(z))
}
function op_3b(z)
{
cy(z, 6)
dec_sp(z)
}
function op_3c(z)
{
cy(z, 4)
z.reg.A = incp(z, z.reg.A)
}
function op_3d(z)
{
cy(z, 4)
z.reg.A = decp(z, z.reg.A)
}
function op_3e(z)
{
cy(z, 7)
z.reg.A = fetch_n(z)
}
function op_3f(z)
{
cy(z, 4)
assign_h(z, !!(z.reg.fC))
assign_c(z, !(!!(z.reg.fC)))
assign_n(z, 0)
}
function op_40(z)
{
cy(z, 4)
}
function op_41(z)
{
cy(z, 4)
qq = (z.reg.BC & 0xff) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function op_42(z)
{
cy(z, 4)
qq = (z.reg.DE >> 8) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function op_43(z)
{
cy(z, 4)
qq = (z.reg.DE & 0xff) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function op_44(z)
{
cy(z, 4)
qq = (z.reg.HL >> 8) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function op_45(z)
{
cy(z, 4)
qq = (z.reg.HL & 0xff) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function op_46(z)
{
cy(z, 7)
qq = load8(z, z.reg.HL) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function op_47(z)
{
cy(z, 4)
qq = z.reg.A ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function op_48(z)
{
cy(z, 4)
qq = (z.reg.BC >> 8) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function op_49(z)
{
cy(z, 4)
}
function op_4a(z)
{
cy(z, 4)
qq = (z.reg.DE >> 8) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function op_4b(z)
{
cy(z, 4)
qq = (z.reg.DE & 0xff) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function op_4c(z)
{
cy(z, 4)
qq = (z.reg.HL >> 8) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function op_4d(z)
{
cy(z, 4)
qq = (z.reg.HL & 0xff) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function op_4e(z)
{
cy(z, 7)
qq = load8(z, z.reg.HL) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function op_4f(z)
{
cy(z, 4)
qq = z.reg.A ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function op_50(z)
{
cy(z, 4)
qq = (z.reg.BC >> 8) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function op_51(z)
{
cy(z, 4)
qq = (z.reg.BC & 0xff) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function op_52(z)
{
cy(z, 4)
}
function op_53(z)
{
cy(z, 4)
qq = (z.reg.DE & 0xff) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function op_54(z)
{
cy(z, 4)
qq = (z.reg.HL >> 8) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function op_55(z)
{
cy(z, 4)
qq = (z.reg.HL & 0xff) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function op_56(z)
{
cy(z, 7)
qq = load8(z, z.reg.HL) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function op_57(z)
{
cy(z, 4)
qq = z.reg.A ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function op_58(z)
{
cy(z, 4)
qq = (z.reg.BC >> 8) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function op_59(z)
{
cy(z, 4)
qq = (z.reg.BC & 0xff) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function op_5a(z)
{
cy(z, 4)
qq = (z.reg.DE >> 8) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function op_5b(z)
{
cy(z, 4)
}
function op_5c(z)
{
cy(z, 4)
qq = (z.reg.HL >> 8) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function op_5d(z)
{
cy(z, 4)
qq = (z.reg.HL & 0xff) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function op_5e(z)
{
cy(z, 7)
qq = load8(z, z.reg.HL) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function op_5f(z)
{
cy(z, 4)
qq = z.reg.A ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function op_60(z)
{
cy(z, 4)
qq = (z.reg.BC >> 8) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function op_61(z)
{
cy(z, 4)
qq = (z.reg.BC & 0xff) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function op_62(z)
{
cy(z, 4)
qq = (z.reg.DE >> 8) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function op_63(z)
{
cy(z, 4)
qq = (z.reg.DE & 0xff) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function op_64(z)
{
cy(z, 4)
}
function op_65(z)
{
cy(z, 4)
qq = (z.reg.HL & 0xff) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function op_66(z)
{
cy(z, 7)
qq = load8(z, z.reg.HL) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function op_67(z)
{
cy(z, 4)
qq = z.reg.A ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function op_68(z)
{
cy(z, 4)
qq = (z.reg.BC >> 8) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function op_69(z)
{
cy(z, 4)
qq = (z.reg.BC & 0xff) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function op_6a(z)
{
cy(z, 4)
qq = (z.reg.DE >> 8) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function op_6b(z)
{
cy(z, 4)
qq = (z.reg.DE & 0xff) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function op_6c(z)
{
cy(z, 4)
qq = (z.reg.HL >> 8) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function op_6d(z)
{
cy(z, 4)
}
function op_6e(z)
{
cy(z, 7)
qq = load8(z, z.reg.HL) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function op_6f(z)
{
cy(z, 4)
qq = z.reg.A ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function op_70(z)
{
cy(z, 7)
store8(z, z.reg.HL, (z.reg.BC >> 8))
}
function op_71(z)
{
cy(z, 7)
store8(z, z.reg.HL, (z.reg.BC & 0xff))
}
function op_72(z)
{
cy(z, 7)
store8(z, z.reg.HL, (z.reg.DE >> 8))
}
function op_73(z)
{
cy(z, 7)
store8(z, z.reg.HL, (z.reg.DE & 0xff))
}
function op_74(z)
{
cy(z, 7)
store8(z, z.reg.HL, (z.reg.HL >> 8))
}
function op_75(z)
{
cy(z, 7)
store8(z, z.reg.HL, (z.reg.HL & 0xff))
}
function op_76(z)
{
cy(z, 4)
z.reg.PC--
}
function op_77(z)
{
cy(z, 7)
store8(z, z.reg.HL, z.reg.A)
}
function op_78(z)
{
cy(z, 4)
z.reg.A = (z.reg.BC >> 8)
}
function op_79(z)
{
cy(z, 4)
z.reg.A = (z.reg.BC & 0xff)
}
function op_7a(z)
{
cy(z, 4)
z.reg.A = (z.reg.DE >> 8)
}
function op_7b(z)
{
cy(z, 4)
z.reg.A = (z.reg.DE & 0xff)
}
function op_7c(z)
{
cy(z, 4)
z.reg.A = (z.reg.HL >> 8)
}
function op_7d(z)
{
cy(z, 4)
z.reg.A = (z.reg.HL & 0xff)
}
function op_7e(z)
{
cy(z, 7)
z.reg.A = load8(z, z.reg.HL)
}
function op_7f(z)
{
cy(z, 4)
}
function op_80(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.BC >> 8), 0, 1)
}
function op_81(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.BC & 0xff), 0, 1)
}
function op_82(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.DE >> 8), 0, 1)
}
function op_83(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.DE & 0xff), 0, 1)
}
function op_84(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.HL >> 8), 0, 1)
}
function op_85(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.HL & 0xff), 0, 1)
}
function op_86(z)
{
cy(z, 7)
z.reg.A = add(z, z.reg.A, load8(z, z.reg.HL), 0, 1)
}
function op_87(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, z.reg.A, 0, 1)
}
function op_88(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.BC >> 8), !!(z.reg.fC), 1)
}
function op_89(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.BC & 0xff), !!(z.reg.fC), 1)
}
function op_8a(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.DE >> 8), !!(z.reg.fC), 1)
}
function op_8b(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.DE & 0xff), !!(z.reg.fC), 1)
}
function op_8c(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.HL >> 8), !!(z.reg.fC), 1)
}
function op_8d(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, (z.reg.HL & 0xff), !!(z.reg.fC), 1)
}
function op_8e(z)
{
cy(z, 7)
z.reg.A = add(z, z.reg.A, load8(z, z.reg.HL), !!(z.reg.fC), 1)
}
function op_8f(z)
{
cy(z, 4)
z.reg.A = add(z, z.reg.A, z.reg.A, !!(z.reg.fC), 1)
}
function op_90(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.BC >> 8), 0, 1)
}
function op_91(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.BC & 0xff), 0, 1)
}
function op_92(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.DE >> 8), 0, 1)
}
function op_93(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.DE & 0xff), 0, 1)
}
function op_94(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.HL >> 8), 0, 1)
}
function op_95(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.HL & 0xff), 0, 1)
}
function op_96(z)
{
cy(z, 7)
z.reg.A = sub(z, z.reg.A, load8(z, z.reg.HL), 0, 1)
}
function op_97(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, z.reg.A, 0, 1)
}
function op_98(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.BC >> 8), !!(z.reg.fC), 1)
}
function op_99(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.BC & 0xff), !!(z.reg.fC), 1)
}
function op_9a(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.DE >> 8), !!(z.reg.fC), 1)
}
function op_9b(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.DE & 0xff), !!(z.reg.fC), 1)
}
function op_9c(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.HL >> 8), !!(z.reg.fC), 1)
}
function op_9d(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, (z.reg.HL & 0xff), !!(z.reg.fC), 1)
}
function op_9e(z)
{
cy(z, 7)
z.reg.A = sub(z, z.reg.A, load8(z, z.reg.HL), !!(z.reg.fC), 1)
}
function op_9f(z)
{
cy(z, 4)
z.reg.A = sub(z, z.reg.A, z.reg.A, !!(z.reg.fC), 1)
}
function op_a0(z)
{
cy(z, 4)
and(z, (z.reg.BC >> 8))
}
function op_a1(z)
{
cy(z, 4)
and(z, (z.reg.BC & 0xff))
}
function op_a2(z)
{
cy(z, 4)
and(z, (z.reg.DE >> 8))
}
function op_a3(z)
{
cy(z, 4)
and(z, (z.reg.DE & 0xff))
}
function op_a4(z)
{
cy(z, 4)
and(z, (z.reg.HL >> 8))
}
function op_a5(z)
{
cy(z, 4)
and(z, (z.reg.HL & 0xff))
}
function op_a6(z)
{
cy(z, 7)
and(z, load8(z, z.reg.HL))
}
function op_a7(z)
{
cy(z, 4)
and(z, z.reg.A)
}
function op_a8(z)
{
cy(z, 4)
xor(z, (z.reg.BC >> 8))
}
function op_a9(z)
{
cy(z, 4)
xor(z, (z.reg.BC & 0xff))
}
function op_aa(z)
{
cy(z, 4)
xor(z, (z.reg.DE >> 8))
}
function op_ab(z)
{
cy(z, 4)
xor(z, (z.reg.DE & 0xff))
}
function op_ac(z)
{
cy(z, 4)
xor(z, (z.reg.HL >> 8))
}
function op_ad(z)
{
cy(z, 4)
xor(z, (z.reg.HL & 0xff))
}
function op_ae(z)
{
cy(z, 7)
xor(z, load8(z, z.reg.HL))
}
function op_af(z)
{
cy(z, 4)
xor(z, z.reg.A)
}
function op_b0(z)
{
cy(z, 4)
or(z, (z.reg.BC >> 8))
}
function op_b1(z)
{
cy(z, 4)
or(z, (z.reg.BC & 0xff))
}
function op_b2(z)
{
cy(z, 4)
or(z, (z.reg.DE >> 8))
}
function op_b3(z)
{
cy(z, 4)
or(z, (z.reg.DE & 0xff))
}
function op_b4(z)
{
cy(z, 4)
or(z, (z.reg.HL >> 8))
}
function op_b5(z)
{
cy(z, 4)
or(z, (z.reg.HL & 0xff))
}
function op_b6(z)
{
cy(z, 7)
or(z, load8(z, z.reg.HL))
}
function op_b7(z)
{
cy(z, 4)
or(z, z.reg.A)
}
function op_b8(z)
{
cy(z, 4)
cp(z, (z.reg.BC >> 8))
}
function op_b9(z)
{
cy(z, 4)
cp(z, (z.reg.BC & 0xff))
}
function op_ba(z)
{
cy(z, 4)
cp(z, (z.reg.DE >> 8))
}
function op_bb(z)
{
cy(z, 4)
cp(z, (z.reg.DE & 0xff))
}
function op_bc(z)
{
cy(z, 4)
cp(z, (z.reg.HL >> 8))
}
function op_bd(z)
{
cy(z, 4)
cp(z, (z.reg.HL & 0xff))
}
function op_be(z)
{
cy(z, 7)
cp(z, load8(z, z.reg.HL))
}
function op_bf(z)
{
cy(z, 4)
cp(z, z.reg.A)
}
function op_c0(z)
{
cy(z, 5)
if (!(z.reg.fZ)) {z.reg.PC = pop(z, z.reg.PC)
cy(z, 6)
}
}
function op_c1(z)
{
cy(z, 10)
z.reg.BC = pop(z, z.reg.BC)
}
function op_c2(z)
{
cy(z, 10)
jump(z, !(z.reg.fZ))
}
function op_c3(z)
{
cy(z, 10)
jump(z, 1)
}
function op_c4(z)
{
cy(z, 10)
call(z, !(z.reg.fZ))
}
function op_c5(z)
{
cy(z, 11)
push(z, z.reg.BC)
}
function op_c6(z)
{
cy(z, 7)
z.reg.A = add(z, z.reg.A, fetch_n(z), 0, 1)
}
function op_c7(z)
{
cy(z, 11)
push(z, z.reg.PC)
z.reg.PC = 0x00
}
function op_c8(z)
{
cy(z, 5)
if (z.reg.fZ) {z.reg.PC = pop(z, z.reg.PC)
cy(z, 6)
}
}
function op_c9(z)
{
cy(z, 10)
z.reg.PC = pop(z, z.reg.PC)
}
function op_ca(z)
{
cy(z, 10)
jump(z, z.reg.fZ)
}
function op_cb(z)
{
return cb(z)
}
function op_cc(z)
{
cy(z, 10)
call(z, z.reg.fZ)
}
function op_cd(z)
{
cy(z, 10)
call(z, 1)
}
function op_ce(z)
{
cy(z, 7)
z.reg.A = add(z, z.reg.A, fetch_n(z), !!(z.reg.fC), 1)
}
function op_cf(z)
{
cy(z, 11)
push(z, z.reg.PC)
z.reg.PC = 0x08
}
function op_d0(z)
{
cy(z, 5)
if (!(z.reg.fC)) { z.reg.PC = pop(z, z.reg.PC)
cy(z, 6)
}
}
function op_d1(z)
{
cy(z, 10)
z.reg.DE = pop(z, z.reg.DE)
}
function op_d2(z)
{
cy(z, 10)
jump(z, !(z.reg.fC))
}
function op_d3(z)
{
cy(z, 11)
zout(z, fetch_n(z), z.reg.A)
}
function op_d4(z)
{
cy(z, 10)
call(z, !(z.reg.fC))
}
function op_d5(z)
{
cy(z, 11)
push(z, z.reg.DE)
}
function op_d6(z)
{
cy(z, 7)
z.reg.A = sub(z, z.reg.A, fetch_n(z), 0, 1)
}
function op_d7(z)
{
cy(z, 11)
push(z, z.reg.PC)
z.reg.PC = 0x10
}
function op_d8(z)
{
cy(z, 5)
if (z.reg.fC) { z.reg.PC = pop(z, z.reg.PC)
cy(z, 6)
}
}
function op_d9(z)
{
cy(z, 4)
extmp = z.reg.BC; z.reg.BC = z.reg.BCp; z.reg.BCp = extmp
extmp = z.reg.DE; z.reg.DE = z.reg.DEp; z.reg.DEp = extmp
extmp = z.reg.HL; z.reg.HL = z.reg.HLp; z.reg.HLp = extmp
}
function op_da(z)
{
cy(z, 10)
jump(z, z.reg.fC)
}
function op_db(z)
{
cy(z, 11)
z.reg.A = zin(z, fetch_n(z), z.reg.A, 0)
}
function op_dc(z)
{
cy(z, 10)
call(z, z.reg.fC)
}
function op_de(z)
{
cy(z, 7)
z.reg.A = sub(z, z.reg.A, fetch_n(z), !!(z.reg.fC), 1)
}
function op_df(z)
{
cy(z, 11)
push(z, z.reg.PC)
z.reg.PC = 0x18
}
function op_e0(z)
{
cy(z, 5)
if (!(z.reg.fPV)) { z.reg.PC = pop(z, z.reg.PC)
cy(z, 6)
}
}
function op_e1(z)
{
cy(z, 10)
z.reg.HL = pop(z, z.reg.HL)
}
function op_e2(z)
{
cy(z, 10)
jump(z, !(z.reg.fPV))
}
function op_e3(z)
{
cy(z, 19)
z.reg.HL = ex_memsp(z, z.reg.HL)
}
function op_e4(z)
{
cy(z, 10)
call(z, !(z.reg.fPV))
}
function op_e5(z)
{
cy(z, 11)
push(z, z.reg.HL)
}
function op_e6(z)
{
cy(z, 7)
and(z, fetch_n(z))
}
function op_e7(z)
{
cy(z, 11)
push(z, z.reg.PC)
z.reg.PC = 0x20
}
function op_e8(z)
{
cy(z, 5)
if (z.reg.fPV) { z.reg.PC = pop(z, z.reg.PC)
cy(z, 6)
}
}
function op_e9(z)
{
cy(z, 4)
z.reg.PC = z.reg.HL
}
function op_ea(z)
{
cy(z, 10)
jump(z, z.reg.fPV)
}
function op_eb(z)
{
cy(z, 4)
extmp = z.reg.DE; z.reg.DE = z.reg.HL; z.reg.HL = extmp
}
function op_ec(z)
{
cy(z, 10)
call(z, z.reg.fPV)
}
function op_ed(z)
{
return ed(z)
}
function op_ee(z)
{
cy(z, 7)
xor(z, fetch_n(z))
}
function op_ef(z)
{
cy(z, 11)
push(z, z.reg.PC)
z.reg.PC = 0x28
}
function op_f0(z)
{
cy(z, 5)
if (!(z.reg.fS)) { z.reg.PC = pop(z, z.reg.PC)
cy(z, 6)
}
}
function op_f1(z)
{
cy(z, 10)
setAF(z, pop(z, getAF(z)) )
}
function op_f2(z)
{
cy(z, 10)
jump(z, !(z.reg.fS))
}
function op_f3(z)
{
cy(z, 4)
z.reg.IFF1 = z.reg.IFF2 = 0
}
function op_f4(z)
{
cy(z, 10)
call(z, !(z.reg.fS))
}
function op_f5(z)
{
cy(z, 11)
push(z, getAF(z))
}
function op_f6(z)
{
cy(z, 7)
or(z, fetch_n(z))
}
function op_f7(z)
{
cy(z, 11)
push(z, z.reg.PC)
z.reg.PC = 0x30
}
function op_f8(z)
{
cy(z, 5)
if (z.reg.fS) { z.reg.PC = pop(z, z.reg.PC)
cy(z, 6)
}
}
function op_f9(z)
{
cy(z, 6)
z.reg.SP = z.reg.HL
}
function op_fa(z)
{
cy(z, 10)
jump(z, z.reg.fS)
}
function op_fb(z)
{
cy(z, 4)
z.reg.IFF1 = z.reg.IFF2 = 1
}
function op_fc(z)
{
cy(z, 10)
call(z, z.reg.fS)
}
function op_fe(z)
{
cy(z, 7)
cp(z, fetch_n(z))
}
function op_ff(z)
{
cy(z, 11)
push(z, z.reg.PC)
z.reg.PC = 0x38
}
function opcb_00(z)
{
cy(z, 8)
qq = rlc(z, (z.reg.BC >> 8)) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_01(z)
{
cy(z, 8)
qq = rlc(z, (z.reg.BC & 0xff)) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_02(z)
{
cy(z, 8)
qq = rlc(z, (z.reg.DE >> 8)) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_03(z)
{
cy(z, 8)
qq = rlc(z, (z.reg.DE & 0xff)) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_04(z)
{
cy(z, 8)
qq = rlc(z, (z.reg.HL >> 8)) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_05(z)
{
cy(z, 8)
qq = rlc(z, (z.reg.HL & 0xff)) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_06(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = rlc(z, z.reg.tmp)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_07(z)
{
cy(z, 8)
z.reg.A = rlc(z, z.reg.A)
}
function opcb_08(z)
{
cy(z, 8)
qq = rrc(z, (z.reg.BC >> 8)) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_09(z)
{
cy(z, 8)
qq = rrc(z, (z.reg.BC & 0xff)) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_0a(z)
{
cy(z, 8)
qq = rrc(z, (z.reg.DE >> 8)) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_0b(z)
{
cy(z, 8)
qq = rrc(z, (z.reg.DE & 0xff)) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_0c(z)
{
cy(z, 8)
qq = rrc(z, (z.reg.HL >> 8)) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_0d(z)
{
cy(z, 8)
qq = rrc(z, (z.reg.HL & 0xff)) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_0e(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = rrc(z, z.reg.tmp)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_0f(z)
{
cy(z, 8)
z.reg.A = rrc(z, z.reg.A)
}
function opcb_10(z)
{
cy(z, 8)
qq = rl(z, (z.reg.BC >> 8)) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_11(z)
{
cy(z, 8)
qq = rl(z, (z.reg.BC & 0xff)) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_12(z)
{
cy(z, 8)
qq = rl(z, (z.reg.DE >> 8)) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_13(z)
{
cy(z, 8)
qq = rl(z, (z.reg.DE & 0xff)) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_14(z)
{
cy(z, 8)
qq = rl(z, (z.reg.HL >> 8)) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_15(z)
{
cy(z, 8)
qq = rl(z, (z.reg.HL & 0xff)) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_16(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = rl(z, z.reg.tmp)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_17(z)
{
cy(z, 8)
z.reg.A = rl(z, z.reg.A)
}
function opcb_18(z)
{
cy(z, 8)
qq = rr(z, (z.reg.BC >> 8)) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_19(z)
{
cy(z, 8)
qq = rr(z, (z.reg.BC & 0xff)) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_1a(z)
{
cy(z, 8)
qq = rr(z, (z.reg.DE >> 8)) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_1b(z)
{
cy(z, 8)
qq = rr(z, (z.reg.DE & 0xff)) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_1c(z)
{
cy(z, 8)
qq = rr(z, (z.reg.HL >> 8)) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_1d(z)
{
cy(z, 8)
qq = rr(z, (z.reg.HL & 0xff)) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_1e(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = rr(z, z.reg.tmp)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_1f(z)
{
cy(z, 8)
z.reg.A = rr(z, z.reg.A)
}
function opcb_20(z)
{
cy(z, 8)
qq = sla(z, (z.reg.BC >> 8)) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_21(z)
{
cy(z, 8)
qq = sla(z, (z.reg.BC & 0xff)) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_22(z)
{
cy(z, 8)
qq = sla(z, (z.reg.DE >> 8)) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_23(z)
{
cy(z, 8)
qq = sla(z, (z.reg.DE & 0xff)) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_24(z)
{
cy(z, 8)
qq = sla(z, (z.reg.HL >> 8)) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_25(z)
{
cy(z, 8)
qq = sla(z, (z.reg.HL & 0xff)) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_26(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = sla(z, z.reg.tmp)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_27(z)
{
cy(z, 8)
z.reg.A = sla(z, z.reg.A)
}
function opcb_28(z)
{
cy(z, 8)
qq = sra(z, (z.reg.BC >> 8)) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_29(z)
{
cy(z, 8)
qq = sra(z, (z.reg.BC & 0xff)) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_2a(z)
{
cy(z, 8)
qq = sra(z, (z.reg.DE >> 8)) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_2b(z)
{
cy(z, 8)
qq = sra(z, (z.reg.DE & 0xff)) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_2c(z)
{
cy(z, 8)
qq = sra(z, (z.reg.HL >> 8)) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_2d(z)
{
cy(z, 8)
qq = sra(z, (z.reg.HL & 0xff)) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_2e(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = sra(z, z.reg.tmp)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_2f(z)
{
cy(z, 8)
z.reg.A = sra(z, z.reg.A)
}
function opcb_30(z)
{
cy(z, 8)
qq = sl1(z, (z.reg.BC >> 8)) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_31(z)
{
cy(z, 8)
qq = sl1(z, (z.reg.BC & 0xff)) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_32(z)
{
cy(z, 8)
qq = sl1(z, (z.reg.DE >> 8)) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_33(z)
{
cy(z, 8)
qq = sl1(z, (z.reg.DE & 0xff)) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_34(z)
{
cy(z, 8)
qq = sl1(z, (z.reg.HL >> 8)) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_35(z)
{
cy(z, 8)
qq = sl1(z, (z.reg.HL & 0xff)) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_36(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = sl1(z, z.reg.tmp)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_37(z)
{
cy(z, 8)
z.reg.A = sl1(z, z.reg.A)
}
function opcb_38(z)
{
cy(z, 8)
qq = srl(z, (z.reg.BC >> 8)) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_39(z)
{
cy(z, 8)
qq = srl(z, (z.reg.BC & 0xff)) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_3a(z)
{
cy(z, 8)
qq = srl(z, (z.reg.DE >> 8)) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_3b(z)
{
cy(z, 8)
qq = srl(z, (z.reg.DE & 0xff)) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_3c(z)
{
cy(z, 8)
qq = srl(z, (z.reg.HL >> 8)) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_3d(z)
{
cy(z, 8)
qq = srl(z, (z.reg.HL & 0xff)) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_3e(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = srl(z, z.reg.tmp)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_3f(z)
{
cy(z, 8)
z.reg.A = srl(z, z.reg.A)
}
function opcb_40(z)
{
cy(z, 8)
bit(z, (z.reg.BC >> 8), 0)
}
function opcb_41(z)
{
cy(z, 8)
bit(z, (z.reg.BC & 0xff), 0)
}
function opcb_42(z)
{
cy(z, 8)
bit(z, (z.reg.DE >> 8), 0)
}
function opcb_43(z)
{
cy(z, 8)
bit(z, (z.reg.DE & 0xff), 0)
}
function opcb_44(z)
{
cy(z, 8)
bit(z, (z.reg.HL >> 8), 0)
}
function opcb_45(z)
{
cy(z, 8)
bit(z, (z.reg.HL & 0xff), 0)
}
function opcb_46(z)
{
cy(z, 12)
bit(z, load8(z, z.reg.HL), 0)
}
function opcb_47(z)
{
cy(z, 8)
bit(z, z.reg.A, 0)
}
function opcb_48(z)
{
cy(z, 8)
bit(z, (z.reg.BC >> 8), 1)
}
function opcb_49(z)
{
cy(z, 8)
bit(z, (z.reg.BC & 0xff), 1)
}
function opcb_4a(z)
{
cy(z, 8)
bit(z, (z.reg.DE >> 8), 1)
}
function opcb_4b(z)
{
cy(z, 8)
bit(z, (z.reg.DE & 0xff), 1)
}
function opcb_4c(z)
{
cy(z, 8)
bit(z, (z.reg.HL >> 8), 1)
}
function opcb_4d(z)
{
cy(z, 8)
bit(z, (z.reg.HL & 0xff), 1)
}
function opcb_4e(z)
{
cy(z, 12)
bit(z, load8(z, z.reg.HL), 1)
}
function opcb_4f(z)
{
cy(z, 8)
bit(z, z.reg.A, 1)
}
function opcb_50(z)
{
cy(z, 8)
bit(z, (z.reg.BC >> 8), 2)
}
function opcb_51(z)
{
cy(z, 8)
bit(z, (z.reg.BC & 0xff), 2)
}
function opcb_52(z)
{
cy(z, 8)
bit(z, (z.reg.DE >> 8), 2)
}
function opcb_53(z)
{
cy(z, 8)
bit(z, (z.reg.DE & 0xff), 2)
}
function opcb_54(z)
{
cy(z, 8)
bit(z, (z.reg.HL >> 8), 2)
}
function opcb_55(z)
{
cy(z, 8)
bit(z, (z.reg.HL & 0xff), 2)
}
function opcb_56(z)
{
cy(z, 12)
bit(z, load8(z, z.reg.HL), 2)
}
function opcb_57(z)
{
cy(z, 8)
bit(z, z.reg.A, 2)
}
function opcb_58(z)
{
cy(z, 8)
bit(z, (z.reg.BC >> 8), 3)
}
function opcb_59(z)
{
cy(z, 8)
bit(z, (z.reg.BC & 0xff), 3)
}
function opcb_5a(z)
{
cy(z, 8)
bit(z, (z.reg.DE >> 8), 3)
}
function opcb_5b(z)
{
cy(z, 8)
bit(z, (z.reg.DE & 0xff), 3)
}
function opcb_5c(z)
{
cy(z, 8)
bit(z, (z.reg.HL >> 8), 3)
}
function opcb_5d(z)
{
cy(z, 8)
bit(z, (z.reg.HL & 0xff), 3)
}
function opcb_5e(z)
{
cy(z, 12)
bit(z, load8(z, z.reg.HL), 3)
}
function opcb_5f(z)
{
cy(z, 8)
bit(z, z.reg.A, 3)
}
function opcb_60(z)
{
cy(z, 8)
bit(z, (z.reg.BC >> 8), 4)
}
function opcb_61(z)
{
cy(z, 8)
bit(z, (z.reg.BC & 0xff), 4)
}
function opcb_62(z)
{
cy(z, 8)
bit(z, (z.reg.DE >> 8), 4)
}
function opcb_63(z)
{
cy(z, 8)
bit(z, (z.reg.DE & 0xff), 4)
}
function opcb_64(z)
{
cy(z, 8)
bit(z, (z.reg.HL >> 8), 4)
}
function opcb_65(z)
{
cy(z, 8)
bit(z, (z.reg.HL & 0xff), 4)
}
function opcb_66(z)
{
cy(z, 12)
bit(z, load8(z, z.reg.HL), 4)
}
function opcb_67(z)
{
cy(z, 8)
bit(z, z.reg.A, 4)
}
function opcb_68(z)
{
cy(z, 8)
bit(z, (z.reg.BC >> 8), 5)
}
function opcb_69(z)
{
cy(z, 8)
bit(z, (z.reg.BC & 0xff), 5)
}
function opcb_6a(z)
{
cy(z, 8)
bit(z, (z.reg.DE >> 8), 5)
}
function opcb_6b(z)
{
cy(z, 8)
bit(z, (z.reg.DE & 0xff), 5)
}
function opcb_6c(z)
{
cy(z, 8)
bit(z, (z.reg.HL >> 8), 5)
}
function opcb_6d(z)
{
cy(z, 8)
bit(z, (z.reg.HL & 0xff), 5)
}
function opcb_6e(z)
{
cy(z, 12)
bit(z, load8(z, z.reg.HL), 5)
}
function opcb_6f(z)
{
cy(z, 8)
bit(z, z.reg.A, 5)
}
function opcb_70(z)
{
cy(z, 8)
bit(z, (z.reg.BC >> 8), 6)
}
function opcb_71(z)
{
cy(z, 8)
bit(z, (z.reg.BC & 0xff), 6)
}
function opcb_72(z)
{
cy(z, 8)
bit(z, (z.reg.DE >> 8), 6)
}
function opcb_73(z)
{
cy(z, 8)
bit(z, (z.reg.DE & 0xff), 6)
}
function opcb_74(z)
{
cy(z, 8)
bit(z, (z.reg.HL >> 8), 6)
}
function opcb_75(z)
{
cy(z, 8)
bit(z, (z.reg.HL & 0xff), 6)
}
function opcb_76(z)
{
cy(z, 12)
bit(z, load8(z, z.reg.HL), 6)
}
function opcb_77(z)
{
cy(z, 8)
bit(z, z.reg.A, 6)
}
function opcb_78(z)
{
cy(z, 8)
bit(z, (z.reg.BC >> 8), 7)
}
function opcb_79(z)
{
cy(z, 8)
bit(z, (z.reg.BC & 0xff), 7)
}
function opcb_7a(z)
{
cy(z, 8)
bit(z, (z.reg.DE >> 8), 7)
}
function opcb_7b(z)
{
cy(z, 8)
bit(z, (z.reg.DE & 0xff), 7)
}
function opcb_7c(z)
{
cy(z, 8)
bit(z, (z.reg.HL >> 8), 7)
}
function opcb_7d(z)
{
cy(z, 8)
bit(z, (z.reg.HL & 0xff), 7)
}
function opcb_7e(z)
{
cy(z, 12)
bit(z, load8(z, z.reg.HL), 7)
}
function opcb_7f(z)
{
cy(z, 8)
bit(z, z.reg.A, 7)
}
function opcb_80(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC >> 8), 0) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_81(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC & 0xff), 0) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_82(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE >> 8), 0) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_83(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE & 0xff), 0) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_84(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL >> 8), 0) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_85(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL & 0xff), 0) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_86(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = res(z, z.reg.tmp ,0)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_87(z)
{
cy(z, 8)
z.reg.A = res(z, z.reg.A, 0)
}
function opcb_88(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC >> 8), 1) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_89(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC & 0xff), 1) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_8a(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE >> 8), 1) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_8b(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE & 0xff), 1) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_8c(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL >> 8), 1) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_8d(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL & 0xff), 1) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_8e(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = res(z, z.reg.tmp ,1)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_8f(z)
{
cy(z, 8)
z.reg.A = res(z, z.reg.A, 1)
}
function opcb_90(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC >> 8), 2) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_91(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC & 0xff), 2) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_92(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE >> 8), 2) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_93(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE & 0xff), 2) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_94(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL >> 8), 2) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_95(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL & 0xff), 2) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_96(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = res(z, z.reg.tmp ,2)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_97(z)
{
cy(z, 8)
z.reg.A = res(z, z.reg.A, 2)
}
function opcb_98(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC >> 8), 3) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_99(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC & 0xff), 3) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_9a(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE >> 8), 3) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_9b(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE & 0xff), 3) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_9c(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL >> 8), 3) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_9d(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL & 0xff), 3) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_9e(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = res(z, z.reg.tmp ,3)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_9f(z)
{
cy(z, 8)
z.reg.A = res(z, z.reg.A, 3)
}
function opcb_a0(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC >> 8), 4) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_a1(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC & 0xff), 4) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_a2(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE >> 8), 4) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_a3(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE & 0xff), 4) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_a4(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL >> 8), 4) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_a5(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL & 0xff), 4) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_a6(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = res(z, z.reg.tmp ,4)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_a7(z)
{
cy(z, 8)
z.reg.A = res(z, z.reg.A, 4)
}
function opcb_a8(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC >> 8), 5) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_a9(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC & 0xff), 5) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_aa(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE >> 8), 5) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_ab(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE & 0xff), 5) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_ac(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL >> 8), 5) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_ad(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL & 0xff), 5) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_ae(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = res(z, z.reg.tmp ,5)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_af(z)
{
cy(z, 8)
z.reg.A = res(z, z.reg.A, 5)
}
function opcb_b0(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC >> 8), 6) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_b1(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC & 0xff), 6) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_b2(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE >> 8), 6) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_b3(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE & 0xff), 6) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_b4(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL >> 8), 6) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_b5(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL & 0xff), 6) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_b6(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = res(z, z.reg.tmp ,6)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_b7(z)
{
cy(z, 8)
z.reg.A = res(z, z.reg.A, 6)
}
function opcb_b8(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC >> 8), 7) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_b9(z)
{
cy(z, 8)
qq = res(z, (z.reg.BC & 0xff), 7) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_ba(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE >> 8), 7) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_bb(z)
{
cy(z, 8)
qq = res(z, (z.reg.DE & 0xff), 7) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_bc(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL >> 8), 7) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_bd(z)
{
cy(z, 8)
qq = res(z, (z.reg.HL & 0xff), 7) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_be(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = res(z, z.reg.tmp ,7)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_bf(z)
{
cy(z, 8)
z.reg.A = res(z, z.reg.A, 7)
}
function opcb_c0(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC >> 8), 0) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_c1(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC & 0xff), 0) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_c2(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE >> 8), 0) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_c3(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE & 0xff), 0) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_c4(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL >> 8), 0) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_c5(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL & 0xff), 0) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_c6(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = set(z, z.reg.tmp ,0)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_c7(z)
{
cy(z, 8)
z.reg.A = set(z, z.reg.A, 0)
}
function opcb_c8(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC >> 8), 1) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_c9(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC & 0xff), 1) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_ca(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE >> 8), 1) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_cb(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE & 0xff), 1) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_cc(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL >> 8), 1) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_cd(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL & 0xff), 1) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_ce(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = set(z, z.reg.tmp ,1)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_cf(z)
{
cy(z, 8)
z.reg.A = set(z, z.reg.A, 1)
}
function opcb_d0(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC >> 8), 2) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_d1(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC & 0xff), 2) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_d2(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE >> 8), 2) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_d3(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE & 0xff), 2) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_d4(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL >> 8), 2) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_d5(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL & 0xff), 2) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_d6(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = set(z, z.reg.tmp ,2)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_d7(z)
{
cy(z, 8)
z.reg.A = set(z, z.reg.A, 2)
}
function opcb_d8(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC >> 8), 3) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_d9(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC & 0xff), 3) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_da(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE >> 8), 3) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_db(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE & 0xff), 3) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_dc(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL >> 8), 3) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_dd(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL & 0xff), 3) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_de(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = set(z, z.reg.tmp ,3)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_default(z)
{
}
function opcb_df(z)
{
cy(z, 8)
z.reg.A = set(z, z.reg.A, 3)
}
function opcb_e0(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC >> 8), 4) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_e1(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC & 0xff), 4) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_e2(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE >> 8), 4) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_e3(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE & 0xff), 4) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_e4(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL >> 8), 4) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_e5(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL & 0xff), 4) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_e6(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = set(z, z.reg.tmp ,4)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_e7(z)
{
cy(z, 8)
z.reg.A = set(z, z.reg.A, 4)
}
function opcb_e8(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC >> 8), 5) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_e9(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC & 0xff), 5) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_ea(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE >> 8), 5) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_eb(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE & 0xff), 5) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_ec(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL >> 8), 5) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_ed(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL & 0xff), 5) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_ee(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = set(z, z.reg.tmp ,5)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_ef(z)
{
cy(z, 8)
z.reg.A = set(z, z.reg.A, 5)
}
function opcb_f0(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC >> 8), 6) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_f1(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC & 0xff), 6) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_f2(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE >> 8), 6) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_f3(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE & 0xff), 6) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_f4(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL >> 8), 6) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_f5(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL & 0xff), 6) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_f6(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = set(z, z.reg.tmp ,6)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_f7(z)
{
cy(z, 8)
z.reg.A = set(z, z.reg.A, 6)
}
function opcb_f8(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC >> 8), 7) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opcb_f9(z)
{
cy(z, 8)
qq = set(z, (z.reg.BC & 0xff), 7) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opcb_fa(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE >> 8), 7) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opcb_fb(z)
{
cy(z, 8)
qq = set(z, (z.reg.DE & 0xff), 7) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opcb_fc(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL >> 8), 7) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opcb_fd(z)
{
cy(z, 8)
qq = set(z, (z.reg.HL & 0xff), 7) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opcb_fe(z)
{
cy(z, 15)
z.reg.tmp = load8(z, z.reg.HL)
z.reg.tmp = set(z, z.reg.tmp ,7)
store8(z, z.reg.HL, z.reg.tmp)
}
function opcb_ff(z)
{
cy(z, 8)
z.reg.A = set(z, z.reg.A, 7)
}
function oped_40(z)
{
cy(z, 12)
qq = zin(z, (z.reg.BC & 0xff), (z.reg.BC >> 8), 1) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function oped_41(z)
{
cy(z, 12)
zout(z, (z.reg.BC & 0xff), (z.reg.BC >> 8))
}
function oped_42(z)
{
cy(z, 15)
z.reg.HL = sbc16(z, z.reg.HL, z.reg.BC)
}
function oped_43(z)
{
cy(z, 20)
store16(z, fetch_nn(z), z.reg.BC)
}
function oped_44(z)
{
cy(z, 8)
z.reg.tmp = z.reg.A
z.reg.A = 0
z.reg.A = sub(z, z.reg.A, z.reg.tmp, 0, 1)
}
function oped_45(z)
{
cy(z, 14)
z.reg.IFF1 = z.reg.IFF2
z.reg.PC = pop(z, z.reg.PC)
}
function oped_46(z)
{
cy(z, 8)
z.reg.IM = 0
}
function oped_47(z)
{
cy(z, 9)
z.reg.I = z.reg.A
}
function oped_48(z)
{
cy(z, 12)
qq = zin(z, (z.reg.BC & 0xff), (z.reg.BC & 0xff), 1) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function oped_49(z)
{
cy(z, 12)
zout(z, (z.reg.BC & 0xff), (z.reg.BC & 0xff))
}
function oped_4a(z)
{
cy(z, 15)
z.reg.HL = adc16(z, z.reg.HL, z.reg.BC)
}
function oped_4b(z)
{
cy(z, 20)
z.reg.BC = load16(z, fetch_nn(z))
}
function oped_4d(z)
{
cy(z, 14)
z.reg.IFF1 = z.reg.IFF2
z.reg.PC = pop(z, z.reg.PC)
}
function oped_4f(z)
{
cy(z, 9)
z.reg.R = z.reg.A
}
function oped_50(z)
{
cy(z, 12)
qq = zin(z, (z.reg.BC & 0xff), (z.reg.DE >> 8), 1) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function oped_51(z)
{
cy(z, 12)
zout(z, (z.reg.BC & 0xff), (z.reg.DE >> 8))
}
function oped_52(z)
{
cy(z, 15)
z.reg.HL = sbc16(z, z.reg.HL, z.reg.DE)
}
function oped_53(z)
{
cy(z, 20)
store16(z, fetch_nn(z), z.reg.DE)
}
function oped_56(z)
{
cy(z, 8)
z.reg.IM = 1
}
function oped_57(z)
{
cy(z, 9)
z.reg.A = z.reg.I
assign_h(z, 0)
assign_n(z, 0)
assign_s(z, z.reg.I & 0x80)
assign_z(z, !(z.reg.I))
assign_pv(z, z.reg.IFF2)
}
function oped_58(z)
{
cy(z, 12)
qq = zin(z, (z.reg.BC & 0xff), (z.reg.DE & 0xff), 1) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function oped_59(z)
{
cy(z, 12)
zout(z, (z.reg.BC & 0xff), (z.reg.DE & 0xff))
}
function oped_5a(z)
{
cy(z, 15)
z.reg.HL = adc16(z, z.reg.HL, z.reg.DE)
}
function oped_5b(z)
{
cy(z, 20)
z.reg.DE = load16(z, fetch_nn(z))
}
function oped_5e(z)
{
cy(z, 8)
z.reg.IM = 2
}
function oped_5f(z)
{
z.reg.A = z.reg.R
assign_h(z, 0)
assign_n(z, 0)
assign_s(z, z.reg.R & 0x80)
assign_z(z, !(z.reg.R))
assign_pv(z, z.reg.IFF2)
cy(z, 9)
}
function oped_60(z)
{
cy(z, 12)
qq = zin(z, (z.reg.BC & 0xff), (z.reg.HL >> 8), 1) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function oped_61(z)
{
cy(z, 12)
zout(z, (z.reg.BC & 0xff), (z.reg.HL >> 8))
}
function oped_62(z)
{
cy(z, 15)
z.reg.HL = sbc16(z, z.reg.HL, z.reg.HL)
}
function oped_63(z)
{
cy(z, 20)
store16(z, fetch_nn(z), z.reg.HL)
}
function oped_67(z)
{
cy(z, 18)
z.reg.tmp = load8(z, z.reg.HL) & 15
store8(z, z.reg.HL,(((z.mem[z.reg.HL] >> 4) & 15) | (z.reg.A << 4)) )
z.reg.A = (z.reg.A & 0xf0) | z.reg.tmp
assign_s(z, z.reg.A & 0x80)
assign_z(z, !(z.reg.A))
assign_h(z, 0)
assign_pv(z, parity(z.reg.A))
assign_n(z, 0)
}
function oped_68(z)
{
cy(z, 12)
qq = zin(z, (z.reg.BC & 0xff), (z.reg.HL & 0xff), 1) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function oped_69(z)
{
cy(z, 12)
zout(z, (z.reg.BC & 0xff), (z.reg.HL & 0xff))
}
function oped_6a(z)
{
cy(z, 15)
z.reg.HL = adc16(z, z.reg.HL, z.reg.HL)
}
function oped_6b(z)
{
cy(z, 20)
z.reg.HL = load16(z, fetch_nn(z))
}
function oped_6f(z)
{
cy(z, 18)
z.reg.tmp = (load8(z, z.reg.HL) >> 4) & 15
store8(z, z.reg.HL, ((z.mem[z.reg.HL] << 4) | (z.reg.A & 15)) )
z.reg.A = (z.reg.A & 0xf0) | z.reg.tmp
assign_s(z, z.reg.A & 0x80)
assign_z(z, !(z.reg.A))
assign_h(z, 0)
assign_pv(z, parity(z.reg.A))
assign_n(z, 0)
}
function oped_72(z)
{
cy(z, 15)
z.reg.HL = sbc16(z, z.reg.HL, z.reg.SP)
}
function oped_73(z)
{
cy(z, 20)
store16(z, fetch_nn(z), z.reg.SP)
}
function oped_78(z)
{
cy(z, 12)
z.reg.A = zin(z, (z.reg.BC & 0xff), z.reg.A, 1)
}
function oped_79(z)
{
cy(z, 12)
zout(z, (z.reg.BC & 0xff), z.reg.A)
}
function oped_7a(z)
{
cy(z, 15)
z.reg.HL = adc16(z, z.reg.HL, z.reg.SP)
}
function oped_7b(z)
{
cy(z, 20)
z.reg.SP = load16(z, fetch_nn(z))
}
function oped_a0(z)
{
cy(z, 16)
store8(z, z.reg.DE, load8(z, z.reg.HL))
inc_hl(z)
inc_de(z)
dec_bc(z)
assign_h(z, 0)
assign_n(z, 0)
assign_pv(z, z.reg.BC)
}
function oped_a1(z)
{
cy(z, 16)
z.reg.tmp = !!(z.reg.fC)
cp(z, load8(z, z.reg.HL))
inc_hl(z)
dec_bc(z)
assign_pv(z, z.reg.BC)
assign_c(z, z.reg.tmp)
}
function oped_a2(z)
{
cy(z, 16)
z.reg.tmp = zin(z, (z.reg.BC & 0xff), z.reg.tmp ,0)
store8(z, z.reg.HL, z.reg.tmp)
inc_hl(z)
dec_b(z)
assign_z(z, !((z.reg.BC >> 8)))
assign_n(z, 1)
}
function oped_a3(z)
{
cy(z, 16)
zout(z, (z.reg.BC & 0xff), load8(z, z.reg.HL))
inc_hl(z)
dec_b(z)
assign_z(z, !((z.reg.BC >> 8)))
assign_n(z, 1)
}
function oped_a8(z)
{
cy(z, 16)
store8(z, z.reg.DE, load8(z, z.reg.HL))
dec_hl(z)
dec_de(z)
dec_bc(z)
assign_h(z, 0)
assign_n(z, 0)
assign_pv(z, z.reg.BC)
}
function oped_a9(z)
{
cy(z, 16)
z.reg.tmp = !!(z.reg.fC)
cp(z, load8(z, z.reg.HL))
dec_hl(z)
dec_bc(z)
assign_pv(z, z.reg.BC)
assign_c(z, z.reg.tmp)
}
function oped_aa(z)
{
cy(z, 16)
z.reg.tmp = zin(z, (z.reg.BC & 0xff), z.reg.tmp ,0)
store8(z, z.reg.HL, z.reg.tmp)
dec_hl(z)
dec_b(z)
assign_z(z, !((z.reg.BC >> 8)))
assign_n(z, 1)
}
function oped_ab(z)
{
cy(z, 16)
zout(z, (z.reg.BC & 0xff), load8(z, z.reg.HL))
dec_hl(z)
dec_b(z)
assign_z(z, !((z.reg.BC >> 8)))
assign_n(z, 1)
}
function oped_b0(z)
{
store8(z, z.reg.DE, load8(z, z.reg.HL))
inc_hl(z)
inc_de(z)
dec_bc(z)
assign_h(z, 0)
assign_n(z, 0)
assign_pv(z, z.reg.BC)
if ( z.reg.BC == 0 ) { cy(z, 16 )
return
}
cy(z, 21)
z.reg.PC = z.reg.PC - 2
}
function oped_b1(z)
{
z.reg.tmp = !!(z.reg.fC)
cp(z, load8(z, z.reg.HL))
inc_hl(z)
dec_bc(z)
assign_pv(z, z.reg.BC)
assign_c(z, z.reg.tmp)
if ( z.reg.BC == 0 || z.reg.fZ ) { cy(z, 16 )
return
}
cy(z, 21)
z.reg.PC = z.reg.PC - 2
}
function oped_b2(z)
{
z.reg.tmp = zin(z, (z.reg.BC & 0xff), z.reg.tmp ,0)
store8(z, z.reg.HL, z.reg.tmp)
inc_hl(z)
dec_b(z)
assign_z(z, !((z.reg.BC >> 8)))
assign_n(z, 1)
if (!!((z.reg.BC >> 8))) { z.reg.PC = z.reg.PC - 2
cy(z, 21)
}
else { cy(z, 16)
}
}
function oped_b3(z)
{
zout(z, (z.reg.BC & 0xff), load8(z, z.reg.HL))
inc_hl(z)
dec_b(z)
assign_z(z, !((z.reg.BC >> 8)))
assign_n(z, 1)
if (!!((z.reg.BC >> 8))) { z.reg.PC = z.reg.PC - 2
cy(z, 21)
}
else { cy(z, 16)
}
}
function oped_b8(z)
{
store8(z, z.reg.DE, load8(z, z.reg.HL))
dec_hl(z)
dec_de(z)
dec_bc(z)
assign_h(z, 0)
assign_n(z, 0)
assign_pv(z, z.reg.BC)
if ( z.reg.BC == 0 ) { cy(z, 16 )
return
}
cy(z, 21)
z.reg.PC = z.reg.PC - 2
}
function oped_b9(z)
{
z.reg.tmp = !!(z.reg.fC)
cp(z, load8(z, z.reg.HL))
dec_hl(z)
dec_bc(z)
assign_pv(z, z.reg.BC)
assign_c(z, z.reg.tmp)
if ( z.reg.BC == 0 || z.reg.fZ ) { cy(z, 16 )
return
}
z.reg.PC = z.reg.PC - 2
}
function oped_ba(z)
{
z.reg.tmp = zin(z, (z.reg.BC & 0xff), z.reg.tmp ,0)
store8(z, z.reg.HL, z.reg.tmp)
dec_hl(z)
dec_b(z)
assign_z(z, !((z.reg.BC >> 8)))
assign_n(z, 1)
if (!!((z.reg.BC >> 8))) { z.reg.PC = z.reg.PC - 2
cy(z, 21)
}
else { cy(z, 16)
}
}
function oped_bb(z)
{
zout(z, (z.reg.BC & 0xff), load8(z, z.reg.HL))
dec_hl(z)
dec_b(z)
assign_z(z, !((z.reg.BC >> 8)))
assign_n(z, 1)
if (!!((z.reg.BC >> 8))) { z.reg.PC = z.reg.PC - 2
cy(z, 21)
}
else { cy(z, 16)
}
}
function oped_default(z)
{
}
function opx_09(z)
{
cy(z, 15)
z.reg.IQ = add16(z, z.reg.IQ, z.reg.BC)
}
function opx_19(z)
{
cy(z, 15)
z.reg.IQ = add16(z, z.reg.IQ, z.reg.DE)
}
function opx_21(z)
{
cy(z, 14)
z.reg.IQ = fetch_nn(z)
}
function opx_22(z)
{
cy(z, 20)
store16(z, fetch_nn(z), z.reg.IQ)
}
function opx_23(z)
{
cy(z, 10)
inc_xy(z)
}
function opx_24(z)
{
cy(z, 8)
qq = incp(z, (z.reg.IQ >> 8)) ; z.reg.IQ = (z.reg.IQ & 0xff) | (qq << 8)
}
function opx_25(z)
{
cy(z, 8)
qq = decp(z, (z.reg.IQ >> 8)) ; z.reg.IQ = (z.reg.IQ & 0xff) | (qq << 8)
}
function opx_26(z)
{
cy(z, 11)
qq = fetch_n(z) ; z.reg.IQ = (z.reg.IQ & 0xff) | (qq << 8)
}
function opx_29(z)
{
cy(z, 15)
z.reg.IQ = add16(z, z.reg.IQ, z.reg.IQ)
}
function opx_2a(z)
{
cy(z, 20)
z.reg.IQ = load16(z, fetch_nn(z))
}
function opx_2b(z)
{
cy(z, 10)
dec_xy(z)
}
function opx_2c(z)
{
cy(z, 8)
qq = incp(z, (z.reg.IQ & 0xff)) ; z.reg.IQ = (z.reg.IQ & 0xff00) | qq
}
function opx_2d(z)
{
cy(z, 8)
qq = decp(z, (z.reg.IQ & 0xff)) ; z.reg.IQ = (z.reg.IQ & 0xff00) | qq
}
function opx_2e(z)
{
cy(z, 11)
qq = fetch_n(z) ; z.reg.IQ = (z.reg.IQ & 0xff00) | qq
}
function opx_34(z)
{
cy(z, 23)
z.reg.tmp = load8(z, ixy_d = ixy(z))
z.reg.tmp = incp(z, z.reg.tmp)
store8(z, ixy_d, z.reg.tmp)
}
function opx_35(z)
{
cy(z, 23)
z.reg.tmp = load8(z, ixy_d = ixy(z))
z.reg.tmp = decp(z, z.reg.tmp)
store8(z, ixy_d, z.reg.tmp)
}
function opx_36(z)
{
cy(z, 19)
ixy_d = ixy(z)
store8(z, ixy_d, fetch_n(z))
}
function opx_39(z)
{
cy(z, 15)
z.reg.IQ = add16(z, z.reg.IQ, z.reg.SP)
}
function opx_44(z)
{
cy(z, 8)
qq = (z.reg.IQ >> 8) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opx_45(z)
{
cy(z, 8)
qq = (z.reg.IQ & 0xff) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opx_46(z)
{
cy(z, 19)
qq = load8(z, ixy(z)) ; z.reg.BC = (z.reg.BC & 0xff) | (qq << 8)
}
function opx_4c(z)
{
cy(z, 8)
qq = (z.reg.IQ >> 8) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opx_4d(z)
{
cy(z, 8)
qq = (z.reg.IQ & 0xff) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opx_4e(z)
{
cy(z, 19)
qq = load8(z, ixy(z)) ; z.reg.BC = (z.reg.BC & 0xff00) | qq
}
function opx_54(z)
{
cy(z, 8)
qq = (z.reg.IQ >> 8) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opx_55(z)
{
cy(z, 8)
qq = (z.reg.IQ & 0xff) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opx_56(z)
{
cy(z, 19)
qq = load8(z, ixy(z)) ; z.reg.DE = (z.reg.DE & 0xff) | (qq << 8)
}
function opx_5c(z)
{
cy(z, 8)
qq = (z.reg.IQ >> 8) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opx_5d(z)
{
cy(z, 8)
qq = (z.reg.IQ & 0xff) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opx_5e(z)
{
cy(z, 19)
qq = load8(z, ixy(z)) ; z.reg.DE = (z.reg.DE & 0xff00) | qq
}
function opx_60(z)
{
cy(z, 8)
qq = (z.reg.BC >> 8) ; z.reg.IQ = (z.reg.IQ & 0xff) | (qq << 8)
}
function opx_61(z)
{
cy(z, 8)
qq = (z.reg.BC & 0xff) ; z.reg.IQ = (z.reg.IQ & 0xff) | (qq << 8)
}
function opx_62(z)
{
cy(z, 8)
qq = (z.reg.DE >> 8) ; z.reg.IQ = (z.reg.IQ & 0xff) | (qq << 8)
}
function opx_63(z)
{
cy(z, 8)
qq = (z.reg.DE & 0xff) ; z.reg.IQ = (z.reg.IQ & 0xff) | (qq << 8)
}
function opx_64(z)
{
cy(z, 8)
}
function opx_65(z)
{
cy(z, 8)
qq = (z.reg.IQ & 0xff) ; z.reg.IQ = (z.reg.IQ & 0xff) | (qq << 8)
}
function opx_66(z)
{
cy(z, 19)
qq = load8(z, ixy(z)) ; z.reg.HL = (z.reg.HL & 0xff) | (qq << 8)
}
function opx_67(z)
{
cy(z, 8)
qq = z.reg.A ; z.reg.IQ = (z.reg.IQ & 0xff) | (qq << 8)
}
function opx_68(z)
{
cy(z, 8)
qq = (z.reg.BC >> 8) ; z.reg.IQ = (z.reg.IQ & 0xff00) | qq
}
function opx_69(z)
{
cy(z, 8)
qq = (z.reg.BC & 0xff) ; z.reg.IQ = (z.reg.IQ & 0xff00) | qq
}
function opx_6a(z)
{
cy(z, 8)
qq = (z.reg.DE >> 8) ; z.reg.IQ = (z.reg.IQ & 0xff00) | qq
}
function opx_6b(z)
{
cy(z, 8)
qq = (z.reg.DE & 0xff) ; z.reg.IQ = (z.reg.IQ & 0xff00) | qq
}
function opx_6c(z)
{
cy(z, 8)
qq = (z.reg.IQ >> 8) ; z.reg.IQ = (z.reg.IQ & 0xff00) | qq
}
function opx_6d(z)
{
cy(z, 8)
}
function opx_6e(z)
{
cy(z, 19)
qq = load8(z, ixy(z)) ; z.reg.HL = (z.reg.HL & 0xff00) | qq
}
function opx_6f(z)
{
cy(z, 8)
qq = z.reg.A ; z.reg.IQ = (z.reg.IQ & 0xff00) | qq
}
function opx_70(z)
{
cy(z, 19)
store8(z, ixy(z), (z.reg.BC >> 8))
}
function opx_71(z)
{
cy(z, 19)
store8(z, ixy(z), (z.reg.BC & 0xff))
}
function opx_72(z)
{
cy(z, 19)
store8(z, ixy(z), (z.reg.DE >> 8))
}
function opx_73(z)
{
cy(z, 19)
store8(z, ixy(z), (z.reg.DE & 0xff))
}
function opx_74(z)
{
cy(z, 19)
store8(z, ixy(z), (z.reg.HL >> 8))
}
function opx_75(z)
{
cy(z, 19)
store8(z, ixy(z), (z.reg.HL & 0xff))
}
function opx_77(z)
{
cy(z, 19)
store8(z, ixy(z), z.reg.A)
}
function opx_7c(z)
{
cy(z, 8)
z.reg.A = (z.reg.IQ >> 8)
}
function opx_7d(z)
{
cy(z, 8)
z.reg.A = (z.reg.IQ & 0xff)
}
function opx_7e(z)
{
cy(z, 19)
z.reg.A = load8(z, ixy(z))
}
function opx_84(z)
{
cy(z, 8)
z.reg.A = add(z, z.reg.A, (z.reg.IQ >> 8), 0, 1)
}
function opx_85(z)
{
cy(z, 8)
z.reg.A = add(z, z.reg.A, (z.reg.IQ & 0xff), 0, 1)
}
function opx_86(z)
{
cy(z, 19)
z.reg.A = add(z, z.reg.A, load8(z, ixy(z)), 0, 1)
}
function opx_8c(z)
{
cy(z, 8)
z.reg.A = add(z, z.reg.A, (z.reg.IQ >> 8), !!(z.reg.fC), 1)
}
function opx_8d(z)
{
cy(z, 8)
z.reg.A = add(z, z.reg.A, (z.reg.IQ & 0xff), !!(z.reg.fC), 1)
}
function opx_8e(z)
{
cy(z, 19)
z.reg.A = add(z, z.reg.A, load8(z, ixy(z)), !!(z.reg.fC), 1)
}
function opx_94(z)
{
cy(z, 8)
z.reg.A = sub(z, z.reg.A, (z.reg.IQ >> 8), 0, 1)
}
function opx_95(z)
{
cy(z, 8)
z.reg.A = sub(z, z.reg.A, (z.reg.IQ & 0xff), 0, 1)
}
function opx_96(z)
{
cy(z, 19)
z.reg.A = sub(z, z.reg.A, load8(z, ixy(z)), 0, 1)
}
function opx_9c(z)
{
cy(z, 8)
z.reg.A = sub(z, z.reg.A, (z.reg.IQ >> 8), !!(z.reg.fC), 1)
}
function opx_9d(z)
{
cy(z, 8)
z.reg.A = sub(z, z.reg.A, (z.reg.IQ & 0xff), !!(z.reg.fC), 1)
}
function opx_9e(z)
{
cy(z, 19)
z.reg.A = sub(z, z.reg.A, load8(z, ixy(z)), !!(z.reg.fC), 1)
}
function opx_a4(z)
{
cy(z, 8)
and(z, (z.reg.IQ >> 8))
}
function opx_a5(z)
{
cy(z, 8)
and(z, (z.reg.IQ & 0xff))
}
function opx_a6(z)
{
cy(z, 19)
and(z, load8(z, ixy(z)))
}
function opx_ac(z)
{
cy(z, 8)
xor(z, (z.reg.IQ >> 8))
}
function opx_ad(z)
{
cy(z, 8)
xor(z, (z.reg.IQ & 0xff))
}
function opx_ae(z)
{
cy(z, 19)
xor(z, load8(z, ixy(z)))
}
function opx_b4(z)
{
cy(z, 8)
or(z, (z.reg.IQ >> 8))
}
function opx_b5(z)
{
cy(z, 8)
or(z, (z.reg.IQ & 0xff))
}
function opx_b6(z)
{
cy(z, 19)
or(z, load8(z, ixy(z)))
}
function opx_bc(z)
{
cy(z, 8)
cp(z, (z.reg.IQ >> 8))
}
function opx_bd(z)
{
cy(z, 8)
cp(z, (z.reg.IQ & 0xff))
}
function opx_be(z)
{
cy(z, 19)
cp(z, load8(z, ixy(z)))
}
function opx_default(z)
{
}
function opx_e1(z)
{
cy(z, 14)
z.reg.IQ = pop(z, z.reg.IQ)
}
function opx_e3(z)
{
cy(z, 23)
z.reg.IQ = ex_memsp(z, z.reg.IQ)
}
function opx_e5(z)
{
cy(z, 15)
push(z, z.reg.IQ)
}
function opx_e9(z)
{
cy(z, 8)
z.reg.PC = z.reg.IQ
}
function opx_f9(z)
{
cy(z, 10)
z.reg.SP = z.reg.IQ
}
function opxcb_06(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = rlc(z, z.reg.tmp)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_0e(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = rrc(z, z.reg.tmp)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_16(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = rl(z, z.reg.tmp)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_1e(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = rr(z, z.reg.tmp)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_26(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = sla(z, z.reg.tmp)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_2e(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = sra(z, z.reg.tmp)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_36(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = sl1(z, z.reg.tmp)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_3e(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = srl(z, z.reg.tmp)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_46(z,ixy_d)
{
cy(z, 20)
bit(z, z.reg.tmp, 0)
}
function opxcb_4e(z,ixy_d)
{
cy(z, 20)
bit(z, z.reg.tmp, 1)
}
function opxcb_56(z,ixy_d)
{
cy(z, 20)
bit(z, z.reg.tmp, 2)
}
function opxcb_5e(z,ixy_d)
{
cy(z, 20)
bit(z, z.reg.tmp, 3)
}
function opxcb_66(z,ixy_d)
{
cy(z, 20)
bit(z, z.reg.tmp, 4)
}
function opxcb_6e(z,ixy_d)
{
cy(z, 20)
bit(z, z.reg.tmp, 5)
}
function opxcb_76(z,ixy_d)
{
cy(z, 20)
bit(z, z.reg.tmp, 6)
}
function opxcb_7e(z,ixy_d)
{
cy(z, 20)
bit(z, z.reg.tmp, 7)
}
function opxcb_86(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = res(z, z.reg.tmp ,0)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_8e(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = res(z, z.reg.tmp ,1)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_96(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = res(z, z.reg.tmp ,2)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_9e(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = res(z, z.reg.tmp ,3)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_a6(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = res(z, z.reg.tmp ,4)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_ae(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = res(z, z.reg.tmp ,5)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_b6(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = res(z, z.reg.tmp ,6)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_be(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = res(z, z.reg.tmp ,7)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_c6(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = set(z, z.reg.tmp ,0)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_ce(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = set(z, z.reg.tmp ,1)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_d6(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = set(z, z.reg.tmp ,2)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_de(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = set(z, z.reg.tmp ,3)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_default(z,ixy_d)
{
}
function opxcb_e6(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = set(z, z.reg.tmp ,4)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_ee(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = set(z, z.reg.tmp ,5)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_f6(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = set(z, z.reg.tmp ,6)
store8(z, ixy_d, z.reg.tmp)
}
function opxcb_fe(z,ixy_d)
{
cy(z, 23)
z.reg.tmp = set(z, z.reg.tmp ,7)
store8(z, ixy_d, z.reg.tmp)
}
function or(z,val)
{
z.reg.A =z.reg.A | val
assign_s(z, z.reg.A & 0x80)
assign_z(z, !(z.reg.A))
assign_h(z, 0)
assign_pv(z, parity(z.reg.A))
assign_n(z, 0)
assign_c(z, 0)
}
function zout(z,port,val)
{
TRS80PortOut(z, port, val)
}
function parity(val)
{
return ptable[val & 0xff]
}
function pop(z,valV)
{
var popval;
popval = 0
popval = z.mem[z.reg.SP]
inc_sp(z)
popval |= ((z.mem[z.reg.SP] & 0xff) << 8)
valV = popval
inc_sp(z)
return valV
}
function push(z,val)
{
dec_sp(z)
putbyte(z, z.reg.SP, ((val >> 8) & 255))
dec_sp(z)
putbyte(z, z.reg.SP, (val & 255))
}
function putbyte(z,addr,val)
{
if (addr >= 12288) z.mem[addr] = val
}
function res(z,valV,bit)
{
valV &= ~(1 << bit)
return valV
}
function resetz80(z)
{
z.reg.PC = 0
z.cycles = 0
setAF(z, 0 )
z.reg.BC = 0
z.reg.DE = 0
z.reg.HL = 0
z.reg.AFp = 0
z.reg.BCp = 0
z.reg.DEp = 0
z.reg.HLp = 0
z.reg.IX = 0
z.reg.IY = 0
z.reg.SP = 0
z.reg.I = 0
z.reg.IFF1 = 0
z.reg.IFF2 = 0
z.reg.IM = 0
z.reg.R = 0
z.beam_IRQ = 0
z.beam_IRQ_enabled = 0
z.frame_cnt = 0
z.port236output = 0
}
function rl(z,accV)
{
var prevc;
prevc = !!(z.reg.fC)
assign_c(z, accV & 0x80)
accV <<= 1
accV &= 255
accV |= prevc
rs_flags(z, accV)
return accV
}
function rla(z)
{
var prevc;
prevc = !!(z.reg.fC)
assign_h(z, 0)
assign_n(z, 0)
assign_c(z, z.reg.A & 0x80)
z.reg.A =z.reg.A << 1
z.reg.A =z.reg.A & 255
z.reg.A =z.reg.A | prevc
}
function rlc(z,accV)
{
assign_c(z, accV & 0x80)
accV <<= 1
accV &= 255
accV |= !!(z.reg.fC)
rs_flags(z, accV)
return accV
}
function rlca(z)
{
assign_h(z, 0)
assign_n(z, 0)
assign_c(z, z.reg.A & 0x80)
z.reg.A =z.reg.A << 1
z.reg.A =z.reg.A & 255
z.reg.A =z.reg.A | !!(z.reg.fC)
}
function rr(z,accV)
{
var prevc;
prevc = !!(z.reg.fC)
assign_c(z, accV & 1)
accV = (accV >> 1) & 0x7f
accV |= prevc << 7
rs_flags(z, accV)
return accV
}
function rra(z)
{
var prevc;
prevc = !!(z.reg.fC)
assign_h(z, 0)
assign_n(z, 0)
assign_c(z, z.reg.A & 1)
z.reg.A = (z.reg.A >> 1) & 0x7f
z.reg.A =z.reg.A | prevc << 7
}
function rrc(z,accV)
{
assign_c(z, accV & 1)
accV = (accV >> 1) & 0x7f
accV |= !!(z.reg.fC) << 7
rs_flags(z, accV)
return accV
}
function rrca(z)
{
assign_h(z, 0)
assign_n(z, 0)
assign_c(z, z.reg.A & 1)
z.reg.A = (z.reg.A >> 1) & 0x7f
z.reg.A =z.reg.A | !!(z.reg.fC) << 7
}
function rs_flags(z,val)
{
assign_z(z, !(val))
assign_s(z, val & 0x80)
assign_h(z, 0)
assign_pv(z, parity(val))
assign_n(z, 0)
assign_5(z, val & 0x20)
assign_3(z, val & 0x08)
}
function sbc16(z,accV,val)
{
var res;
z.reg.tmp = accV & 0xff
z.reg.tmp = sub(z, z.reg.tmp, val & 0xff, !!(z.reg.fC), 1)
res = z.reg.tmp
z.reg.tmp = (accV >> 8) & 0xff
z.reg.tmp = sub(z, z.reg.tmp, (val >> 8) & 0xff, !!(z.reg.fC), 1)
res = (z.reg.tmp << 8) | res
accV = res
assign_z(z, !(accV))
return accV
}
function set(z,valV,bit)
{
valV |= 1 << bit
return valV
}
function setAF(z,val)
{
z.reg.A = (val >> 8)
setF(z, val)
}
function setF(z,val)
{
z.reg.fS = (val & 0x80)
z.reg.fZ = (val & 0x40)
z.reg.f5 = (val & 0x20)
z.reg.fH = (val & 0x10)
z.reg.f3 = (val & 0x08)
z.reg.fPV = (val & 0x04)
z.reg.fN = (val & 0x02)
z.reg.fC = (val & 0x01)
}
function setPC(z,val)
{
z.reg.PC = val
}
function setZ80TraceState(z,T)
{
z.cycles = T[ 0]
z.reg.PC = T[ 1]
setAF(z, T[ 2] )
z.reg.BC = T[ 3]
z.reg.DE = T[ 4]
z.reg.HL = T[ 5]
z.reg.SP = T[ 6]
z.reg.IX = T[ 7]
z.reg.IY = T[ 8]
z.reg.AFp = T[ 9]
z.reg.BCp = T[10]
z.reg.DEp = T[11]
z.reg.HLp = T[12]
z.reg.I = T[13]
z.reg.R = T[14]
z.reg.IM = T[15]
z.reg.IFF1 = T[16]
z.reg.IFF2 = T[17]
z.port236output = T[18]
z.beam_IRQ = T[19]
z.beam_IRQ_enabled = T[20]
z.frame_cnt = T[21]
}
function sl1(z,accV)
{
assign_c(z, accV & 0x80)
accV <<= 1
accV &= 255
accV |= 1
rs_flags(z, accV)
return accV
}
function sla(z,accV)
{
assign_c(z, accV & 0x80)
accV <<= 1
accV &= 255
rs_flags(z, accV)
return accV
}
function sra(z,accV)
{
assign_c(z, accV & 1)
accV = (accV >> 1) & 0x7f
accV |= (accV << 1) & 0x80
rs_flags(z, accV)
return accV
}
function srl(z,accV)
{
assign_c(z, accV & 1)
accV = (accV >> 1) & 0x7f
rs_flags(z, accV)
return accV
}
function store16(z,mem,val)
{
putbyte(z, mem, (val & 0xff))
putbyte(z, (mem + 1), ((val >> 8) & 0xff))
}
function store8(z,mem,val)
{
putbyte(z, mem, val)
}
function sub(z,accV,val,cry,docarry)
{
var res;
res = signed_int(accV) - val - cry
assign_s(z, res & 0x80)
if (docarry) assign_c(z, res & 0x100)
assign_h(z, ((accV & 15) - (val & 15) - cry) & 16)
assign_n(z, 1)
assign_z(z, !(res & 0xff))
res = signed_char(accV) - signed_char(val) - cry
assign_pv(z, res > 127 || res < -128)
accV = signed_int(accV) - val - cry
return accV & 255
}
function xor(z,val)
{
z.reg.A =z.reg.A ^ val
assign_s(z, z.reg.A & 0x80)
assign_z(z, !(z.reg.A))
assign_h(z, 0)
assign_pv(z, parity(z.reg.A))
assign_n(z, 0)
assign_c(z, 0)
}
function build_op()
{
op = [];
op[0x00] = op_00;
op[0x01] = op_01;
op[0x02] = op_02;
op[0x03] = op_03;
op[0x04] = op_04;
op[0x05] = op_05;
op[0x06] = op_06;
op[0x07] = op_07;
op[0x08] = op_08;
op[0x09] = op_09;
op[0x0a] = op_0a;
op[0x0b] = op_0b;
op[0x0c] = op_0c;
op[0x0d] = op_0d;
op[0x0e] = op_0e;
op[0x0f] = op_0f;
op[0x10] = op_10;
op[0x11] = op_11;
op[0x12] = op_12;
op[0x13] = op_13;
op[0x14] = op_14;
op[0x15] = op_15;
op[0x16] = op_16;
op[0x17] = op_17;
op[0x18] = op_18;
op[0x19] = op_19;
op[0x1a] = op_1a;
op[0x1b] = op_1b;
op[0x1c] = op_1c;
op[0x1d] = op_1d;
op[0x1e] = op_1e;
op[0x1f] = op_1f;
op[0x20] = op_20;
op[0x21] = op_21;
op[0x22] = op_22;
op[0x23] = op_23;
op[0x24] = op_24;
op[0x25] = op_25;
op[0x26] = op_26;
op[0x27] = op_27;
op[0x28] = op_28;
op[0x29] = op_29;
op[0x2a] = op_2a;
op[0x2b] = op_2b;
op[0x2c] = op_2c;
op[0x2d] = op_2d;
op[0x2e] = op_2e;
op[0x2f] = op_2f;
op[0x30] = op_30;
op[0x31] = op_31;
op[0x32] = op_32;
op[0x33] = op_33;
op[0x34] = op_34;
op[0x35] = op_35;
op[0x36] = op_36;
op[0x37] = op_37;
op[0x38] = op_38;
op[0x39] = op_39;
op[0x3a] = op_3a;
op[0x3b] = op_3b;
op[0x3c] = op_3c;
op[0x3d] = op_3d;
op[0x3e] = op_3e;
op[0x3f] = op_3f;
op[0x40] = op_40;
op[0x41] = op_41;
op[0x42] = op_42;
op[0x43] = op_43;
op[0x44] = op_44;
op[0x45] = op_45;
op[0x46] = op_46;
op[0x47] = op_47;
op[0x48] = op_48;
op[0x49] = op_49;
op[0x4a] = op_4a;
op[0x4b] = op_4b;
op[0x4c] = op_4c;
op[0x4d] = op_4d;
op[0x4e] = op_4e;
op[0x4f] = op_4f;
op[0x50] = op_50;
op[0x51] = op_51;
op[0x52] = op_52;
op[0x53] = op_53;
op[0x54] = op_54;
op[0x55] = op_55;
op[0x56] = op_56;
op[0x57] = op_57;
op[0x58] = op_58;
op[0x59] = op_59;
op[0x5a] = op_5a;
op[0x5b] = op_5b;
op[0x5c] = op_5c;
op[0x5d] = op_5d;
op[0x5e] = op_5e;
op[0x5f] = op_5f;
op[0x60] = op_60;
op[0x61] = op_61;
op[0x62] = op_62;
op[0x63] = op_63;
op[0x64] = op_64;
op[0x65] = op_65;
op[0x66] = op_66;
op[0x67] = op_67;
op[0x68] = op_68;
op[0x69] = op_69;
op[0x6a] = op_6a;
op[0x6b] = op_6b;
op[0x6c] = op_6c;
op[0x6d] = op_6d;
op[0x6e] = op_6e;
op[0x6f] = op_6f;
op[0x70] = op_70;
op[0x71] = op_71;
op[0x72] = op_72;
op[0x73] = op_73;
op[0x74] = op_74;
op[0x75] = op_75;
op[0x76] = op_76;
op[0x77] = op_77;
op[0x78] = op_78;
op[0x79] = op_79;
op[0x7a] = op_7a;
op[0x7b] = op_7b;
op[0x7c] = op_7c;
op[0x7d] = op_7d;
op[0x7e] = op_7e;
op[0x7f] = op_7f;
op[0x80] = op_80;
op[0x81] = op_81;
op[0x82] = op_82;
op[0x83] = op_83;
op[0x84] = op_84;
op[0x85] = op_85;
op[0x86] = op_86;
op[0x87] = op_87;
op[0x88] = op_88;
op[0x89] = op_89;
op[0x8a] = op_8a;
op[0x8b] = op_8b;
op[0x8c] = op_8c;
op[0x8d] = op_8d;
op[0x8e] = op_8e;
op[0x8f] = op_8f;
op[0x90] = op_90;
op[0x91] = op_91;
op[0x92] = op_92;
op[0x93] = op_93;
op[0x94] = op_94;
op[0x95] = op_95;
op[0x96] = op_96;
op[0x97] = op_97;
op[0x98] = op_98;
op[0x99] = op_99;
op[0x9a] = op_9a;
op[0x9b] = op_9b;
op[0x9c] = op_9c;
op[0x9d] = op_9d;
op[0x9e] = op_9e;
op[0x9f] = op_9f;
op[0xa0] = op_a0;
op[0xa1] = op_a1;
op[0xa2] = op_a2;
op[0xa3] = op_a3;
op[0xa4] = op_a4;
op[0xa5] = op_a5;
op[0xa6] = op_a6;
op[0xa7] = op_a7;
op[0xa8] = op_a8;
op[0xa9] = op_a9;
op[0xaa] = op_aa;
op[0xab] = op_ab;
op[0xac] = op_ac;
op[0xad] = op_ad;
op[0xae] = op_ae;
op[0xaf] = op_af;
op[0xb0] = op_b0;
op[0xb1] = op_b1;
op[0xb2] = op_b2;
op[0xb3] = op_b3;
op[0xb4] = op_b4;
op[0xb5] = op_b5;
op[0xb6] = op_b6;
op[0xb7] = op_b7;
op[0xb8] = op_b8;
op[0xb9] = op_b9;
op[0xba] = op_ba;
op[0xbb] = op_bb;
op[0xbc] = op_bc;
op[0xbd] = op_bd;
op[0xbe] = op_be;
op[0xbf] = op_bf;
op[0xc0] = op_c0;
op[0xc1] = op_c1;
op[0xc2] = op_c2;
op[0xc3] = op_c3;
op[0xc4] = op_c4;
op[0xc5] = op_c5;
op[0xc6] = op_c6;
op[0xc7] = op_c7;
op[0xc8] = op_c8;
op[0xc9] = op_c9;
op[0xca] = op_ca;
op[0xcb] = function(z) { return opcb[fetch_opcode(z)](z); }
op[0xcc] = op_cc;
op[0xcd] = op_cd;
op[0xce] = op_ce;
op[0xcf] = op_cf;
op[0xd0] = op_d0;
op[0xd1] = op_d1;
op[0xd2] = op_d2;
op[0xd3] = op_d3;
op[0xd4] = op_d4;
op[0xd5] = op_d5;
op[0xd6] = op_d6;
op[0xd7] = op_d7;
op[0xd8] = op_d8;
op[0xd9] = op_d9;
op[0xda] = op_da;
op[0xdb] = op_db;
op[0xdc] = op_dc;
op[0xdd] = function(z) { z.reg.IQ = z.reg.IX; opx[fetch_opcode(z)](z); z.reg.IX = z.reg.IQ; }
op[0xde] = op_de;
op[0xdf] = op_df;
op[0xe0] = op_e0;
op[0xe1] = op_e1;
op[0xe2] = op_e2;
op[0xe3] = op_e3;
op[0xe4] = op_e4;
op[0xe5] = op_e5;
op[0xe6] = op_e6;
op[0xe7] = op_e7;
op[0xe8] = op_e8;
op[0xe9] = op_e9;
op[0xea] = op_ea;
op[0xeb] = op_eb;
op[0xec] = op_ec;
op[0xed] = function(z) { return oped[fetch_opcode(z)](z); }
op[0xee] = op_ee;
op[0xef] = op_ef;
op[0xf0] = op_f0;
op[0xf1] = op_f1;
op[0xf2] = op_f2;
op[0xf3] = op_f3;
op[0xf4] = op_f4;
op[0xf5] = op_f5;
op[0xf6] = op_f6;
op[0xf7] = op_f7;
op[0xf8] = op_f8;
op[0xf9] = op_f9;
op[0xfa] = op_fa;
op[0xfb] = op_fb;
op[0xfc] = op_fc;
op[0xfd] = function(z) { z.reg.IQ = z.reg.IY; opx[fetch_opcode(z)](z); z.reg.IY = z.reg.IQ; }
op[0xfe] = op_fe;
op[0xff] = op_ff;
}
function build_oped()
{
oped = [];
var i;
for (i = 0; i < 256; i++) oped[i] = oped_default
oped[0x40] = oped_40;
oped[0x41] = oped_41;
oped[0x42] = oped_42;
oped[0x43] = oped_43;
oped[0x44] = oped_44;
oped[0x45] = oped_45;
oped[0x46] = oped_46;
oped[0x47] = oped_47;
oped[0x48] = oped_48;
oped[0x49] = oped_49;
oped[0x4a] = oped_4a;
oped[0x4b] = oped_4b;
oped[0x4d] = oped_4d;
oped[0x4f] = oped_4f;
oped[0x50] = oped_50;
oped[0x51] = oped_51;
oped[0x52] = oped_52;
oped[0x53] = oped_53;
oped[0x56] = oped_56;
oped[0x57] = oped_57;
oped[0x58] = oped_58;
oped[0x59] = oped_59;
oped[0x5a] = oped_5a;
oped[0x5b] = oped_5b;
oped[0x5e] = oped_5e;
oped[0x5f] = oped_5f;
oped[0x60] = oped_60;
oped[0x61] = oped_61;
oped[0x62] = oped_62;
oped[0x63] = oped_63;
oped[0x67] = oped_67;
oped[0x68] = oped_68;
oped[0x69] = oped_69;
oped[0x6a] = oped_6a;
oped[0x6b] = oped_6b;
oped[0x6f] = oped_6f;
oped[0x72] = oped_72;
oped[0x73] = oped_73;
oped[0x78] = oped_78;
oped[0x79] = oped_79;
oped[0x7a] = oped_7a;
oped[0x7b] = oped_7b;
oped[0xa0] = oped_a0;
oped[0xa1] = oped_a1;
oped[0xa2] = oped_a2;
oped[0xa3] = oped_a3;
oped[0xa8] = oped_a8;
oped[0xa9] = oped_a9;
oped[0xaa] = oped_aa;
oped[0xab] = oped_ab;
oped[0xb0] = oped_b0;
oped[0xb1] = oped_b1;
oped[0xb2] = oped_b2;
oped[0xb3] = oped_b3;
oped[0xb8] = oped_b8;
oped[0xb9] = oped_b9;
oped[0xba] = oped_ba;
oped[0xbb] = oped_bb;
}
function build_opcb()
{
opcb = [];
var i;
for (i = 0; i < 256; i++) opcb[i] = opcb_default
opcb[0x00] = opcb_00;
opcb[0x01] = opcb_01;
opcb[0x02] = opcb_02;
opcb[0x03] = opcb_03;
opcb[0x04] = opcb_04;
opcb[0x05] = opcb_05;
opcb[0x06] = opcb_06;
opcb[0x07] = opcb_07;
opcb[0x08] = opcb_08;
opcb[0x09] = opcb_09;
opcb[0x0a] = opcb_0a;
opcb[0x0b] = opcb_0b;
opcb[0x0c] = opcb_0c;
opcb[0x0d] = opcb_0d;
opcb[0x0e] = opcb_0e;
opcb[0x0f] = opcb_0f;
opcb[0x10] = opcb_10;
opcb[0x11] = opcb_11;
opcb[0x12] = opcb_12;
opcb[0x13] = opcb_13;
opcb[0x14] = opcb_14;
opcb[0x15] = opcb_15;
opcb[0x16] = opcb_16;
opcb[0x17] = opcb_17;
opcb[0x18] = opcb_18;
opcb[0x19] = opcb_19;
opcb[0x1a] = opcb_1a;
opcb[0x1b] = opcb_1b;
opcb[0x1c] = opcb_1c;
opcb[0x1d] = opcb_1d;
opcb[0x1e] = opcb_1e;
opcb[0x1f] = opcb_1f;
opcb[0x20] = opcb_20;
opcb[0x21] = opcb_21;
opcb[0x22] = opcb_22;
opcb[0x23] = opcb_23;
opcb[0x24] = opcb_24;
opcb[0x25] = opcb_25;
opcb[0x26] = opcb_26;
opcb[0x27] = opcb_27;
opcb[0x28] = opcb_28;
opcb[0x29] = opcb_29;
opcb[0x2a] = opcb_2a;
opcb[0x2b] = opcb_2b;
opcb[0x2c] = opcb_2c;
opcb[0x2d] = opcb_2d;
opcb[0x2e] = opcb_2e;
opcb[0x2f] = opcb_2f;
opcb[0x30] = opcb_30;
opcb[0x31] = opcb_31;
opcb[0x32] = opcb_32;
opcb[0x33] = opcb_33;
opcb[0x34] = opcb_34;
opcb[0x35] = opcb_35;
opcb[0x36] = opcb_36;
opcb[0x37] = opcb_37;
opcb[0x38] = opcb_38;
opcb[0x39] = opcb_39;
opcb[0x3a] = opcb_3a;
opcb[0x3b] = opcb_3b;
opcb[0x3c] = opcb_3c;
opcb[0x3d] = opcb_3d;
opcb[0x3e] = opcb_3e;
opcb[0x3f] = opcb_3f;
opcb[0x40] = opcb_40;
opcb[0x41] = opcb_41;
opcb[0x42] = opcb_42;
opcb[0x43] = opcb_43;
opcb[0x44] = opcb_44;
opcb[0x45] = opcb_45;
opcb[0x46] = opcb_46;
opcb[0x47] = opcb_47;
opcb[0x48] = opcb_48;
opcb[0x49] = opcb_49;
opcb[0x4a] = opcb_4a;
opcb[0x4b] = opcb_4b;
opcb[0x4c] = opcb_4c;
opcb[0x4d] = opcb_4d;
opcb[0x4e] = opcb_4e;
opcb[0x4f] = opcb_4f;
opcb[0x50] = opcb_50;
opcb[0x51] = opcb_51;
opcb[0x52] = opcb_52;
opcb[0x53] = opcb_53;
opcb[0x54] = opcb_54;
opcb[0x55] = opcb_55;
opcb[0x56] = opcb_56;
opcb[0x57] = opcb_57;
opcb[0x58] = opcb_58;
opcb[0x59] = opcb_59;
opcb[0x5a] = opcb_5a;
opcb[0x5b] = opcb_5b;
opcb[0x5c] = opcb_5c;
opcb[0x5d] = opcb_5d;
opcb[0x5e] = opcb_5e;
opcb[0x5f] = opcb_5f;
opcb[0x60] = opcb_60;
opcb[0x61] = opcb_61;
opcb[0x62] = opcb_62;
opcb[0x63] = opcb_63;
opcb[0x64] = opcb_64;
opcb[0x65] = opcb_65;
opcb[0x66] = opcb_66;
opcb[0x67] = opcb_67;
opcb[0x68] = opcb_68;
opcb[0x69] = opcb_69;
opcb[0x6a] = opcb_6a;
opcb[0x6b] = opcb_6b;
opcb[0x6c] = opcb_6c;
opcb[0x6d] = opcb_6d;
opcb[0x6e] = opcb_6e;
opcb[0x6f] = opcb_6f;
opcb[0x70] = opcb_70;
opcb[0x71] = opcb_71;
opcb[0x72] = opcb_72;
opcb[0x73] = opcb_73;
opcb[0x74] = opcb_74;
opcb[0x75] = opcb_75;
opcb[0x76] = opcb_76;
opcb[0x77] = opcb_77;
opcb[0x78] = opcb_78;
opcb[0x79] = opcb_79;
opcb[0x7a] = opcb_7a;
opcb[0x7b] = opcb_7b;
opcb[0x7c] = opcb_7c;
opcb[0x7d] = opcb_7d;
opcb[0x7e] = opcb_7e;
opcb[0x7f] = opcb_7f;
opcb[0x80] = opcb_80;
opcb[0x81] = opcb_81;
opcb[0x82] = opcb_82;
opcb[0x83] = opcb_83;
opcb[0x84] = opcb_84;
opcb[0x85] = opcb_85;
opcb[0x86] = opcb_86;
opcb[0x87] = opcb_87;
opcb[0x88] = opcb_88;
opcb[0x89] = opcb_89;
opcb[0x8a] = opcb_8a;
opcb[0x8b] = opcb_8b;
opcb[0x8c] = opcb_8c;
opcb[0x8d] = opcb_8d;
opcb[0x8e] = opcb_8e;
opcb[0x8f] = opcb_8f;
opcb[0x90] = opcb_90;
opcb[0x91] = opcb_91;
opcb[0x92] = opcb_92;
opcb[0x93] = opcb_93;
opcb[0x94] = opcb_94;
opcb[0x95] = opcb_95;
opcb[0x96] = opcb_96;
opcb[0x97] = opcb_97;
opcb[0x98] = opcb_98;
opcb[0x99] = opcb_99;
opcb[0x9a] = opcb_9a;
opcb[0x9b] = opcb_9b;
opcb[0x9c] = opcb_9c;
opcb[0x9d] = opcb_9d;
opcb[0x9e] = opcb_9e;
opcb[0x9f] = opcb_9f;
opcb[0xa0] = opcb_a0;
opcb[0xa1] = opcb_a1;
opcb[0xa2] = opcb_a2;
opcb[0xa3] = opcb_a3;
opcb[0xa4] = opcb_a4;
opcb[0xa5] = opcb_a5;
opcb[0xa6] = opcb_a6;
opcb[0xa7] = opcb_a7;
opcb[0xa8] = opcb_a8;
opcb[0xa9] = opcb_a9;
opcb[0xaa] = opcb_aa;
opcb[0xab] = opcb_ab;
opcb[0xac] = opcb_ac;
opcb[0xad] = opcb_ad;
opcb[0xae] = opcb_ae;
opcb[0xaf] = opcb_af;
opcb[0xb0] = opcb_b0;
opcb[0xb1] = opcb_b1;
opcb[0xb2] = opcb_b2;
opcb[0xb3] = opcb_b3;
opcb[0xb4] = opcb_b4;
opcb[0xb5] = opcb_b5;
opcb[0xb6] = opcb_b6;
opcb[0xb7] = opcb_b7;
opcb[0xb8] = opcb_b8;
opcb[0xb9] = opcb_b9;
opcb[0xba] = opcb_ba;
opcb[0xbb] = opcb_bb;
opcb[0xbc] = opcb_bc;
opcb[0xbd] = opcb_bd;
opcb[0xbe] = opcb_be;
opcb[0xbf] = opcb_bf;
opcb[0xc0] = opcb_c0;
opcb[0xc1] = opcb_c1;
opcb[0xc2] = opcb_c2;
opcb[0xc3] = opcb_c3;
opcb[0xc4] = opcb_c4;
opcb[0xc5] = opcb_c5;
opcb[0xc6] = opcb_c6;
opcb[0xc7] = opcb_c7;
opcb[0xc8] = opcb_c8;
opcb[0xc9] = opcb_c9;
opcb[0xca] = opcb_ca;
opcb[0xcb] = opcb_cb;
opcb[0xcc] = opcb_cc;
opcb[0xcd] = opcb_cd;
opcb[0xce] = opcb_ce;
opcb[0xcf] = opcb_cf;
opcb[0xd0] = opcb_d0;
opcb[0xd1] = opcb_d1;
opcb[0xd2] = opcb_d2;
opcb[0xd3] = opcb_d3;
opcb[0xd4] = opcb_d4;
opcb[0xd5] = opcb_d5;
opcb[0xd6] = opcb_d6;
opcb[0xd7] = opcb_d7;
opcb[0xd8] = opcb_d8;
opcb[0xd9] = opcb_d9;
opcb[0xda] = opcb_da;
opcb[0xdb] = opcb_db;
opcb[0xdc] = opcb_dc;
opcb[0xdd] = opcb_dd;
opcb[0xde] = opcb_de;
opcb[0xdf] = opcb_df;
opcb[0xe0] = opcb_e0;
opcb[0xe1] = opcb_e1;
opcb[0xe2] = opcb_e2;
opcb[0xe3] = opcb_e3;
opcb[0xe4] = opcb_e4;
opcb[0xe5] = opcb_e5;
opcb[0xe6] = opcb_e6;
opcb[0xe7] = opcb_e7;
opcb[0xe8] = opcb_e8;
opcb[0xe9] = opcb_e9;
opcb[0xea] = opcb_ea;
opcb[0xeb] = opcb_eb;
opcb[0xec] = opcb_ec;
opcb[0xed] = opcb_ed;
opcb[0xee] = opcb_ee;
opcb[0xef] = opcb_ef;
opcb[0xf0] = opcb_f0;
opcb[0xf1] = opcb_f1;
opcb[0xf2] = opcb_f2;
opcb[0xf3] = opcb_f3;
opcb[0xf4] = opcb_f4;
opcb[0xf5] = opcb_f5;
opcb[0xf6] = opcb_f6;
opcb[0xf7] = opcb_f7;
opcb[0xf8] = opcb_f8;
opcb[0xf9] = opcb_f9;
opcb[0xfa] = opcb_fa;
opcb[0xfb] = opcb_fb;
opcb[0xfc] = opcb_fc;
opcb[0xfd] = opcb_fd;
opcb[0xfe] = opcb_fe;
opcb[0xff] = opcb_ff;
}
function build_opx()
{
opx = [];
var i;
for (i = 0; i < 256; i++) opx[i] = opx_default
opx[0x09] = opx_09;
opx[0x19] = opx_19;
opx[0x21] = opx_21;
opx[0x22] = opx_22;
opx[0x23] = opx_23;
opx[0x24] = opx_24;
opx[0x25] = opx_25;
opx[0x26] = opx_26;
opx[0x29] = opx_29;
opx[0x2a] = opx_2a;
opx[0x2b] = opx_2b;
opx[0x2c] = opx_2c;
opx[0x2d] = opx_2d;
opx[0x2e] = opx_2e;
opx[0x34] = opx_34;
opx[0x35] = opx_35;
opx[0x36] = opx_36;
opx[0x39] = opx_39;
opx[0x44] = opx_44;
opx[0x45] = opx_45;
opx[0x46] = opx_46;
opx[0x4c] = opx_4c;
opx[0x4d] = opx_4d;
opx[0x4e] = opx_4e;
opx[0x54] = opx_54;
opx[0x55] = opx_55;
opx[0x56] = opx_56;
opx[0x5c] = opx_5c;
opx[0x5d] = opx_5d;
opx[0x5e] = opx_5e;
opx[0x60] = opx_60;
opx[0x61] = opx_61;
opx[0x62] = opx_62;
opx[0x63] = opx_63;
opx[0x64] = opx_64;
opx[0x65] = opx_65;
opx[0x66] = opx_66;
opx[0x67] = opx_67;
opx[0x68] = opx_68;
opx[0x69] = opx_69;
opx[0x6a] = opx_6a;
opx[0x6b] = opx_6b;
opx[0x6c] = opx_6c;
opx[0x6d] = opx_6d;
opx[0x6e] = opx_6e;
opx[0x6f] = opx_6f;
opx[0x70] = opx_70;
opx[0x71] = opx_71;
opx[0x72] = opx_72;
opx[0x73] = opx_73;
opx[0x74] = opx_74;
opx[0x75] = opx_75;
opx[0x77] = opx_77;
opx[0x7c] = opx_7c;
opx[0x7d] = opx_7d;
opx[0x7e] = opx_7e;
opx[0x84] = opx_84;
opx[0x85] = opx_85;
opx[0x86] = opx_86;
opx[0x8c] = opx_8c;
opx[0x8d] = opx_8d;
opx[0x8e] = opx_8e;
opx[0x94] = opx_94;
opx[0x95] = opx_95;
opx[0x96] = opx_96;
opx[0x9c] = opx_9c;
opx[0x9d] = opx_9d;
opx[0x9e] = opx_9e;
opx[0xa4] = opx_a4;
opx[0xa5] = opx_a5;
opx[0xa6] = opx_a6;
opx[0xac] = opx_ac;
opx[0xad] = opx_ad;
opx[0xae] = opx_ae;
opx[0xb4] = opx_b4;
opx[0xb5] = opx_b5;
opx[0xb6] = opx_b6;
opx[0xbc] = opx_bc;
opx[0xbd] = opx_bd;
opx[0xbe] = opx_be;
opx[0xcb] = function(z) {
var ixy_d = ixy(z);
z.reg.tmp = z.mem[ixy_d];
return opxcb[fetch_opcode(z)](z, ixy_d);
}
opx[0xe1] = opx_e1;
opx[0xe3] = opx_e3;
opx[0xe5] = opx_e5;
opx[0xe9] = opx_e9;
opx[0xf9] = opx_f9;
}
function build_opxcb()
{
opxcb = [];
var i;
for (i = 0; i < 256; i++) opxcb[i] = opxcb_default
opxcb[0x06] = opxcb_06;
opxcb[0x0e] = opxcb_0e;
opxcb[0x16] = opxcb_16;
opxcb[0x1e] = opxcb_1e;
opxcb[0x26] = opxcb_26;
opxcb[0x2e] = opxcb_2e;
opxcb[0x36] = opxcb_36;
opxcb[0x3e] = opxcb_3e;
opxcb[0x46] = opxcb_46;
opxcb[0x4e] = opxcb_4e;
opxcb[0x56] = opxcb_56;
opxcb[0x5e] = opxcb_5e;
opxcb[0x66] = opxcb_66;
opxcb[0x6e] = opxcb_6e;
opxcb[0x76] = opxcb_76;
opxcb[0x7e] = opxcb_7e;
opxcb[0x86] = opxcb_86;
opxcb[0x8e] = opxcb_8e;
opxcb[0x96] = opxcb_96;
opxcb[0x9e] = opxcb_9e;
opxcb[0xa6] = opxcb_a6;
opxcb[0xae] = opxcb_ae;
opxcb[0xb6] = opxcb_b6;
opxcb[0xbe] = opxcb_be;
opxcb[0xc6] = opxcb_c6;
opxcb[0xce] = opxcb_ce;
opxcb[0xd6] = opxcb_d6;
opxcb[0xde] = opxcb_de;
opxcb[0xe6] = opxcb_e6;
opxcb[0xee] = opxcb_ee;
opxcb[0xf6] = opxcb_f6;
opxcb[0xfe] = opxcb_fe;
}
function build_all()
{
build_op();
build_oped();
build_opcb();
build_opx();
build_opxcb();
}
function stepz80(z)
{
op[fetch_opcode(z)](z);
} // stepz80
function runz80(z)
{
while (z.cycles >= 0) {
op[fetch_opcode(z)](z);
}
} // runz80
/**
* @constructor
*/
function regz80()
{
this.A = 0;
this.fS = 0;
this.fZ = 0;
this.f5 = 0;
this.fH = 0;
this.f3 = 0;
this.fPV = 0;
this.fN = 0;
this.fC = 0;
this.BC = 0
this.DE = 0
this.HL = 0
this.IX = 0
this.IY = 0
this.SP = 0
this.PC = 0
this.AFp = 0;
this.BCp = 0
this.DEp = 0
this.HLp = 0
this.I = 0
this.R = 0
this.IM = 0
this.IFF1 = 0
this.IFF2 = 0
this.tmp = 0;
this.IQ = 0;
}
/**
* @constructor
*/
function z80cons()
{
this.reg = new regz80()
this.cycles = 0
this.mem = [];
this.port236output = 0
this.beam_IRQ = 0
this.beam_IRQ_enabled = 0
this.frame_cnt = 0
}
var gLoadData;
var gGetByte;
function LoadFile(z, url, basicLoadAddress, followup)
{
load_binary_resource(url, function(res) {
if (typeof res == "string") {
followup("Error loading URL " + url + "\r\n" + res);
return;
}
gLoadData = res[0];
gGetByte = res[1];
res = LoadFileData(z);
if (res != null) {
followup("Error parsing URL " + url + "\r\n" + res);
return;
}
followup(null);
});
}
function LoadRawData(z, arr)
{
var err;
gLoadData = arr;
if (typeof arr == "string") {
gGetByte = function(index, data) { return arr.charCodeAt(index) & 0xff; }
}
else {
gGetByte = function(index, data) { return arr[index] & 0xff; };
}
err = LoadFileData(z);
if (err != null) {
DisplayError(z, err);
return "Parse Error:\r\n" + err;
}
return null;
}
function StartExecutable(z, addr)
{
z.mem[0x4022] = 0; // disable cursor
z.reg.IFF1 = z.reg.IFF2 = 0; // disable interrupts
setPC(z, addr);
//writeDebug("Exec at " + hex4(addr));
}
// Try to return a "sensible" address for start of BASIC code.
function GetBasicPointer(z)
{
var res = z.mem[0x40a4] + (z.mem[0x40a5] << 8);
if (res < 0x4200 || res >= 0x4500) {
return "BASIC start 0x" + hex4(res) + " is uninitialized";
}
return res;
}
function LoadFileData(z)
{
var byte0;
var int0;
var err = null;
var format = DetectMedia();
if (format[0] != 0) {
ConvertMedia(format[0], format[1]);
}
byte0 = GetMediaByte(0);
int0 = GetMediaIntBigEndian(0);
if (int0 == 0x7f706e70)
{
z.trace = ParseTrace(z);
if (!z.trace) {
writeDebug("Trace load failed");
}
}
if (byte0 == 0x55)
{
err = ParseSystemTape(z);
}
else if (byte0 == 0xD3)
{
err = ParseTokenizedBasicTape(z);
}
else if (byte0 == 58/*':'*/)
{
err = ParseHexFile(z);
}
else if (byte0 <= 0x1f)
{
err = ParseCmdFile(z);
}
else if (byte0 == 0xff) {
err = ParseBasicBinary(z, 1);
}
else if (byte0 >= 0x30 && byte0 <= 0x39)
{
var baseAddr = GetBasicPointer(z);
if (typeof baseAddr == "string") {
err = baseAddr;
} else {
err = ParseBasic(z, baseAddr);
}
}
DebugEvent_show(z);
return err;
}
function AvailableBytes(pos)
{
return GetMediaLength() - pos;
}
function GetMediaLength()
{
return gLoadData.length;
}
function GetMediaBits(index, count)
{
var mask = (1 << count) - 1;
var addr = Math.floor(index / 8);
var pos = index % 8;
var res = (GetMediaByte(addr) << 8) | GetMediaByte(addr + 1);
return (res >> (16 - count - pos)) & mask;
}
function ConvertMedia(format, offset)
{
var stride = 8;
if (format == 1500) {
stride = 9;
offset++; // skip 0 or 1 start bits
}
var newData = [];
var length = GetMediaLength() * 8;
while (offset + stride <= length) {
newData[newData.length] = GetMediaBits(offset, 8);
offset += stride;
}
gLoadData = newData;
gGetByte = function(index, data) { return data[index] & 0xff; };
}
function DetectMedia()
{
var i;
var media = 0;
var bitPos = 0;
// Try high speed cassette. Header of $55 bytes followed by $7F.
// Or {01}* 0111 1111. Transferred tapes will have the $7F sync byte
// byte aligned, but we'll do things at a bit level. But won't go
// into the machinations of skipping bad bits.
var leaderLength = 0;
var bitWanted = 0;
for (i = bitPos; i < GetMediaLength()*8 - 8; i++)
{
if (leaderLength > 32 && GetMediaBits(i, 8) == 0x7f)
{
leaderLength += 8;
media = 1500; // cassette1500
bitPos += leaderLength;
return [media, leaderLength];
}
if (leaderLength == 0)
{
bitWanted = !GetMediaBits(i, 1);
leaderLength++;
}
else
{
var bit = GetMediaBits(i, 1);
if (bit != bitWanted)
{
break;
}
else
{
leaderLength++;
bitWanted = !bitWanted;
}
}
}
// Now look at low-speed cassette. Generally $00 followed by $A5.
// Or 0* 1010 0101. But then we'll have to figure out if it was
// really 250 baud.
leaderLength = 0;
for (i = bitPos; i < GetMediaLength()*8 - 8; i++)
{
if (leaderLength > 32 && GetMediaBits(i, 8) == 0xa5)
{
i += 8;
leaderLength = i - bitPos;
bitPos = i;
media = 500; // cassette500
break;
}
else if (GetMediaBits(i, 1) == 0)
{
leaderLength++;
}
else
{
// Don't give up immediately. Huge kludge for Micro Chess capture.
leaderLength = 0;
if (i - bitPos > 32)
{
break;
}
}
}
// $40, $41 or $42 will mean Level I. There are more robust
// checks we could do but this will suffice.
if (media == 500)
{
var loadHi = GetMediaBits(bitPos, 8);
if (loadHi == 0x40 || loadHi == 0x41 || loadHi == 0x42)
{
media = 250; // cassette250;
}
return [media, leaderLength];
}
// We don't really know; leave it to the default we set originally.
return [0, 0];
}
function GetMediaByte(index)
{
return gGetByte(index, gLoadData);
}
function GetMediaWord(byteOffset)
{
return GetMediaByte(byteOffset) + (GetMediaByte(byteOffset + 1) << 8);
}
function GetMediaWordBigEndian(byteOffset)
{
return (GetMediaByte(byteOffset) << 8) + GetMediaByte(byteOffset + 1);
}
function GetMediaIntBigEndian(b)
{
var res = 0;
res = (res << 8) | GetMediaByte(b + 0);
res = (res << 8) | GetMediaByte(b + 1);
res = (res << 8) | GetMediaByte(b + 2);
res = (res << 8) | GetMediaByte(b + 3);
return res;
}
// Actually loads the system tape
function ParseSystemTape(z)
{
// Assume we already have seen the 0x55 name header code.
// BTW, Model III ROM will keep reading bytes until it sees an 0x55.
var bpos = 1;
var i;
var length;
var addr;
var sum;
var checksum;
var execAddr;
// TRS80Record *name = new TRS80Record(TRS80Record::name, 0, 6);
if (AvailableBytes(bpos) < 6) {
return "System header truncated";
}
for (i = 0; i < 6; i++)
{
GetMediaByte(bpos++);
}
// if (m_errorMessage)
// {
// delete name;
// return;
// }
// AddRecord(name);
// BTW, Model III ROM keeps grabbing bytes and skips over any non 0x3c or 0x78
// bytes. This makes Microchess work because it has a 7 character file name.
// "CHESS ".
// We'll allow for it in a very specific way.
if (GetMediaByte(bpos) == 0x20)
{
bpos++;
}
while (GetMediaByte(bpos) == 0x3c)
{
var recordPos = bpos;
bpos++;
if (AvailableBytes(bpos) < 1) {
return "EOF at 0x" + hex4(bpos);
}
length = GetMediaByte(bpos++);
// if (m_errorMessage) return;
if (length == 0)
{
length = 256;
}
if (AvailableBytes(bpos) < 3 + length) {
return "truncated record 0x" + hex4(recordPos);
}
addr = GetMediaWord(bpos);
// if (m_errorMessage) return;
sum = (addr & 255) + (addr >> 8);
bpos += 2;
// TRS80Record *load = new TRS80Record(TRS80Record::loadmem, addr, length);
for (i = 0; i < length; i++)
{
z.mem[addr + i] = GetMediaByte(bpos++);
sum += z.mem[addr + i];
// if (m_errorMessage)
// {
// delete load;
// return;
// }
}
checksum = GetMediaByte(bpos++);
// if (m_errorMessage)
// {
// delete load;
// return;
// }
if (checksum != (sum & 255))
{
writeDebug("Failed checksum " + checksum + " != " + (sum & 255));
// if (m_ignoreChecksumError)
// {
// AddRecord(new TRS80Record("Checksum error."));
// }
// else
// {
// delete load;
// m_errorMessage = "Checksum error.";
// return;
// }
return "checksum 0x" + hex2(checksum) + " != 0x" + hex2(sum & 255);
}
// AddRecord(load);
}
execAddr = -1;
if (GetMediaByte(bpos) == 0x78)
{
execAddr = GetMediaWord(bpos + 1);
// if (m_errorMessage) return;
bpos += 3;
// System loading sets stack to $4288 before execution
z.reg.SP = 0x4288;
StartExecutable(z, execAddr);
}
else {
return "No start address found at 0x" + hex4(bpos);
}
/*
SeekMediaByte(bpos);
// However, if any data was loaded into $41E2 (the SYSTEM hook) then
// we'll assume the start address is there. Which is a tiny bit
// dicey as the stack should be set to $4288 and the exec address
// should be put into $40DF. At least on the Model III.
//
// Now, some clever bunnies put an address into the 401e display address
// to redirect SYSTEM when it prints the '*?' prompt. So we'll check
// for that as an alternate.
//
// The emulator should, based on ROM, put this stuff in and do the
// same steps to simulate a SYSTEM command fully.
//
// A flag to turn off this auto-checking would be nice. But we
// only trigger it if it really seems intentional. Otherwise it
// is just ignored as, in general, loading before the start of
// BASIC can lead to all sorts of weird crashes.
//
// I note $420E as cassette vector address on the Model III.
unsigned char loaded41e1[2];
memset(loaded41e1, 0, sizeof(loaded41e1));
m_file->LoadRange(0, 0x41e1, 0x41e2, loaded41e1);
unsigned char vector[2];
unsigned char vector_loaded[2];
memset(vector_loaded, 0, sizeof(vector_loaded));
m_file->LoadRange(vector, 0x401e, 0x401f, vector_loaded);
if (!loaded41e1[0] && loaded41e1[1])
{
execAddr = 0x41e2;
}
else if (vector_loaded[0] && vector_loaded[1])
{
execAddr = (vector[1] << 8) | vector[0];
}
if (execAddr >= 0)
{
TRS80Record *exec = new TRS80Record(TRS80Record::execute, execAddr, 0);
AddRecord(exec);
}
else
{
m_errorMessage = "Cassette system file with bad record type.";
}
*/
return null;
}
function ParseCmdFile(z)
{
var pos = 0;
var seenExec = 0;
while (AvailableBytes(pos) > 0)
{
var recordPos = pos;
var cmdRecordType = GetMediaByte(pos++);
// if (m_errorMessage) return;
if (cmdRecordType > 0x1f)
{
// Some CMD files end with garbage, ignore if we have a start address.
if (!seenExec) {
return "Invalid /CMD record type 0x" + hex2(cmdRecordType) + " at 0x" + hex4(recordPos);
}
return null;
}
var length = GetMediaByte(pos++);
var load = 0;
// if (m_errorMessage) return;
// TRS80Record::Action recordType;
var addr = cmdRecordType;
switch (cmdRecordType)
{
case 0:
// AddRecord(new TRS80Record(TRS80Record::eof, 0, 0));
// TODO - could add crap past end as part of true fidelity.
// SeekMediaByte(pos);
return null;
case 1:
case 2:
if (AvailableBytes(pos) < 2) {
return "Truncated record at 0x" + hex4(recordPos);
}
addr = GetMediaWord(pos);
pos += 2;
if (cmdRecordType == 1)
{
length -= 2;
length &= 255;
load = 1;
// recordType = TRS80Record::loadmem;
}
else
{
// recordType = TRS80Record::execute;
length = -1;
StartExecutable(z, addr);
seenExec = 1;
// Often bad records after exec--treat execute record as EOF
return null;
}
break;
case 5:
// recordType = TRS80Record::name;
break;
default:
// recordType = TRS80Record::cmdRecord;
break;
}
if (length == 0)
length = 256;
if (length == -1)
length = 0;
// TRS80Record *rec = new TRS80Record(recordType, addr, length);
if (AvailableBytes(pos) < length) {
return "Truncated record length 0x" + hex4(length) + " type 0x" + hex2(cmdRecordType) + " at 0x" + hex4(recordPos);
}
var i;
for (i = 0; i < length; i++)
{
var bite = GetMediaByte(pos + i);
if (load)
z.mem[addr + i] = bite;
}
pos += length;
// if (m_errorMessage)
// {
// delete rec;
// return;
// }
// AddRecord(rec);
// It would seem that crap after the execution address is OK. I'd like to generate
// a warning but have no warning mechanism as of yet. Well, now I do. But
// not for such a low-level warning.
// if (recordType == TRS80Record::execute)
// {
// SeekMediaByte(pos);
// return;
// }
}
// SeekMediaByte(pos);
return null;
}
function ParseTokenizedBasicTape(z)
{
var d0, d1, d2, nameByte;
d0 = GetMediaByte(0);
d1 = GetMediaByte(1);
d2 = GetMediaByte(2);
nameByte = GetMediaByte(3);
if (d0 != 0xD3 || d1 != 0xD3 || d2 != 0xD3)
{
return "Missing BASIC tape header 0xD3 bytes.";
}
return ParseBasicBinary(z, 4);
}
function ParseBasicBinary(z, offset)
{
var addr;
var pos = offset;
var line = 0;
addr = GetBasicPointer(z);
if (typeof addr == "string") {
return addr;
}
if (AvailableBytes(pos) < 4) {
return "BASIC header truncated at 0x" + hex4(pos);
}
while (AvailableBytes(pos) > 2)
{
var base = addr;
var nextPointer;
nextPointer = GetMediaWord(pos);
if (nextPointer == 0) {
break;
}
SetWord(z.mem, addr, nextPointer); pos += 2; addr += 2;
if (AvailableBytes(pos) < 2) {
return "Unexpected EOF at 0x" + hex4(pos) + " prev line " + line;
}
SetWord(z.mem, addr, line = GetMediaWord(pos)); pos += 2; addr += 2;
while (AvailableBytes(pos) > 0) {
var data = GetMediaByte(pos);
z.mem[addr] = data; pos++; addr++;
if (data == 0) {
SetWord(z.mem, base, addr);
break;
}
}
if (AvailableBytes(pos) <= 0) {
return "Unexpected EOF at 0x" + hex4(pos) + " line " + line;
}
}
AddBasicPointers(z, addr);
return null;
}
function ParseBasic(z, basicLoadAddress)
{
var pos = 0;
var prevLine = -1;
var lineNum;
//writeDebug("Base Addr: " + hex4(basicLoadAddress));
while (AvailableBytes(pos) > 0)
{
var line = "";
while (AvailableBytes(pos) > 0)
{
var ch = GetMediaByte(pos++);
if (ch == 0x0a || ch == 0x0d || ch < 0)
{
line += String.fromCharCode(0x0a);
break;
}
line += String.fromCharCode(ch);
}
var parser = MkParser(line);
var tokenizedLength = parser.tokenize();
if (typeof tokenizedLength == "string")
{
writeDebug("Syntax error.");
return tokenizedLength + "\r\n" + line;
}
lineNum = parser.tok[0] + parser.tok[1]*256;
if (lineNum <= prevLine) {
return "Bad line order, " + lineNum + " appears after " + prevLine + "\r\n" + line;
}
prevLine = lineNum;
var nextAddr = basicLoadAddress + 2 + tokenizedLength;
SetWord(z.mem, basicLoadAddress, nextAddr);
basicLoadAddress += 2;
for (var i = 0; i < tokenizedLength; i++)
{
z.mem[basicLoadAddress++] = parser.tok[i];
}
while (AvailableBytes(pos) > 0)
{
var ch = GetMediaByte(pos);
if (ch == 0x0a || ch == 0x0d)
{
pos++;
}
else
{
break;
}
}
}
// SeekMediaByte(pos);
AddBasicPointers(z, basicLoadAddress);
return null;
}
function SetWord(mem, offset, val)
{
mem[offset] = (val & 255);
mem[offset+1] = ((val >> 8) & 255);
}
function AddBasicPointers(z, basicEndAddress)
{
// Null pointer to terminate BASIC program.
SetWord(z.mem, basicEndAddress, 0);
basicEndAddress += 2;
// end of BASIC program pointer
SetWord(z.mem, 0x40f9, basicEndAddress);
// start of array variables pointer
SetWord(z.mem, 0x40fb, basicEndAddress);
// start of free memory pointer
SetWord(z.mem, 0x40fd, basicEndAddress);
}
var REM = 147;
var DATA = 136;
var REMQUOT = 251;
var ELSE = 149;
function MkParser(linedata)
{
return {
lp : 0,
tp : 0,
line : linedata,
token : [
"END",
"FOR", "RESET", "SET", "CLS", "CMD", "RANDOM", "NEXT", "DATA", "INPUT",
"DIM", "READ", "LET", "GOTO", "RUN", "IF", "RESTORE", "GOSUB", "RETURN",
"REM", "STOP", "ELSE", "TRON", "TROFF", "DEFSTR", "DEFINT", "DEFSNG",
"DEFDBL", "LINE", "EDIT", "ERROR", "RESUME", "OUT", "ON", "OPEN",
"FIELD", "GET", "PUT", "CLOSE", "LOAD", "MERGE", "NAME", "KILL", "LSET",
"RSET", "SAVE", "SYSTEM", "LPRINT", "DEF", "POKE", "PRINT", "CONT",
"LIST", "LLIST", "DELETE", "AUTO", "CLEAR", "CLOAD", "CSAVE", "NEW",
"TAB(", "TO", "FN", "USING", "VARPTR", "USR", "ERL", "ERR", "STRING$",
"INSTR", "POINT", "TIME$", "MEM", "INKEY$", "THEN", "NOT", "STEP",
"+", "-", "*", "/", "[", "AND", "OR", ">", "=", "<", "SGN", "INT",
"ABS", "FRE", "INP", "POS", "SQR", "RND", "LOG", "EXP", "COS", "SIN",
"TAN", "ATN", "PEEK", "CVI", "CVS", "CVD", "EOF", "LOC", "LOF", "MKI$",
"MKS$", "MKD$", "CINT", "CSNG", "CDBL", "FIX", "LEN", "STR$", "VAL",
"ASC", "CHR$", "LEFT$", "RIGHT$", "MID$"
],
tok : [],
skipspace : function()
{
var ch;
for ( ; this.lp < this.line.length; this.lp++)
{
ch = this.line.charCodeAt(this.lp);
if (ch != 0x20 && ch != 0x09) {
return;
}
}
},
isdigit : function()
{
if (this.eol()) return false;
var ch = this.line.charCodeAt(this.lp);
return (ch >= 0x30 && ch <= 0x39);
},
eol : function()
{
return this.lp >= this.line.length;
},
toupper : function(ch)
{
if (ch >= 0x61 && ch <= 0x7a) {
ch -= 0x20;
}
return ch;
},
curr : function()
{
if (this.eol()) { return -1; }
return this.line.charCodeAt(this.lp);
},
next : function()
{
if (this.eol()) { return -1; }
return this.line.charCodeAt(this.lp++);
},
append : function(ch)
{
this.tok[this.tp++] = ch;
},
tokenize : function()
{
var lnum;
var ch;
this.lp = 0;
this.tp = 0;
this.tok = [];
this.skipspace();
var ltext = "";
while (this.isdigit()) {
ltext += this.line.substr(this.lp, 1);
this.lp++;
}
lnum = parseInt(ltext, 10);
this.skipspace();
if (this.eol())
return "Blank line " + lnum;
this.append(lnum & 255);
this.append((lnum >> 8) & 255);
// writeDebug("lnum = " + lnum.toString());
while (!this.eol()) {
switch (this.curr()) {
case 0x0a: // '\n':
this.lp++;
break;
case 0x27: // '\'':
this.append(0x3a); // ':';
this.append(REM);
this.append(REMQUOT);
this.lp++;
while (!this.eol()) {
this.append(this.next());
}
this.append(0);
if (this.tok[this.tp-2] == '\n') {
this.tok[this.tp-2] = 0;
this.tp--;
}
return this.tp;
case 0x22: // '"':
this.append(this.next());
while (!this.eol() && this.curr() != 0x0a) {
this.append(this.next());
if (this.line.charCodeAt(this.lp-1) == 0x22) {
break;
}
}
break;
default:
ch = this.curr();
ch = this.toupper(ch);
this.tok[this.tp] = ch;
// "Slow" loop through all tokens.
var tindex;
for (tindex = 0; tindex < this.token.length; tindex++) {
var len = this.token[tindex].length;
if (this.line.substr(this.lp, len).toUpperCase() == this.token[tindex]) {
if (tindex + 0x80 == REM || tindex + 0x80 == DATA) {
this.tok[this.tp++] = tindex + 0x80;
this.lp += this.token[tindex].length;
while (!this.eol()) {
this.append(this.next());
}
this.append(0);
if (this.tok[this.tp-2] == 0x0a) {
this.tok[this.tp-2] = 0;
this.tp--;
}
return this.tp;
}
else if (tindex + 0x80 == ELSE && this.tok[this.tp-1] != 0x3a)
this.append(0x3a);
this.tok[this.tp] = tindex + 0x80;
this.lp += this.token[tindex].length - 1;
break;
}
}
this.tp++;
this.lp++;
}
}
this.append(0);
return this.tp;
}
} ;
}
function HexDigitValue(digit)
{
if (digit >= 48 && digit <= 48+9)
return digit - 48;
if (digit >= 0x41 && digit <= 0x46)
return 10 + digit - 0x41;
if (digit >= 0x61 && digit <= 0x66)
return 10 + digit - 0x61;
return -1;
}
function HexPairValue(highDigit, lowDigit)
{
var high = HexDigitValue(highDigit);
var low = HexDigitValue(lowDigit);
if (high >= 0 && low >= 0)
{
return high * 16 + low;
}
return -1;
}
function GetHexByte(pos)
{
var hexByte = HexPairValue(GetMediaByte(pos), GetMediaByte(pos + 1));
// if (hexByte < 0)
// {
// if (!m_errorMessage) m_errorMessage = "Bad hexadecimal number.";
// }
// *pos += 2;
return hexByte;
}
function ParseHexFile(z)
{
var pos = -1;
var seenExec = 0;
for (;;)
{
do
{
pos++;
if (/*m_errorMessage ||*/ AvailableBytes(pos) < 8)
{
// SeekMediaByte(pos);
if (!seenExec) {
return "exec address not found";
}
return null;
}
}
while (HexDigitValue(GetMediaByte(pos)) < 0);
var sum = 0x100;
var baseAddr = pos;
var hexRecordLength = GetHexByte(pos); pos += 2; sum -= hexRecordLength;
var address = GetHexByte(pos) << 8; pos += 2; sum -= (address >> 8)
address += GetHexByte(pos); pos += 2; sum -= (address & 0xff);
// Skip record type byte; we don't need it. Here 0 == data, 1 == execute
var type = GetHexByte(pos); pos += 2; sum -= type;
if (type < 0) {
return "Missing type field at 0x" + hex4(pos - 2);
}
//if (m_errorMessage) return;
if (hexRecordLength == 0)
{
// I assume this is a checksum; not bothering with it for now.
var checksum = GetHexByte(pos); pos += 2;
// if (m_errorMessage) return;
if (checksum < 0) {
return "Missing checksum at pos 0x" + hex4(pos - 2);
}
if (checksum != (sum & 255)) {
return "checksum 0x" + hex2(checksum) + " != " + hex2(sum & 255) + " at 0x" + hex4(baseAddr);
}
StartExecutable(z, address);
seenExec = 1;
// AddRecord(new TRS80Record(TRS80Record::execute, address, 0));
}
else
{
// TRS80Record *load = new TRS80Record(TRS80Record::loadmem, address, hexRecordLength);
if (AvailableBytes(pos) < hexRecordLength*2 + 2) {
return "Record len=0x" + hex4(hexRecordLength) + " truncated at 0x" + hex4(pos);
}
var i;
for (i = 0; i < hexRecordLength; i++)
{
z.mem[address + i] = GetHexByte(pos); pos += 2;
sum -= z.mem[address + i];
}
var checksum = GetHexByte(pos); pos += 2;
if (checksum != (sum & 255)) {
return "checksum 0x" + hex2(checksum & 255) + " != " + hex2(sum & 255) + " at 0x" + hex4(baseAddr);
}
// if (m_errorMessage)
// {
// delete load;
// return;
// }
// AddRecord(load);
}
}
// SeekMediaByte(pos);
return null;
}
var TRACE_MEM = 0;
var TRACE_KBD = 1;
var TRACE_TRC = 2;
var TRACE_Z80 = 3;
/**
* @constructor
*/
function TraceMem(addr, length)
{
this.kind = TRACE_MEM;
this.addr = addr;
this.data = new Array(length);
}
/**
* @constructor
*/
function TraceKbd()
{
this.kind = TRACE_KBD;
this.data = new Array();
}
/**
* @constructor
*/
function TraceTrc()
{
this.kind = TRACE_TRC;
this.data = new Array();
}
/**
* @constructor
*/
function TraceZ80(cycles)
{
this.kind = TRACE_Z80;
this.data = new Array(18);
this.data[0] = cycles;
}
function ParseTrace(z)
{
var bpos = 4;
var rec;
var len;
var addr;
var cycles;
var i;
var recarray = new Array();
var fieldCount = 0;
var seconds;
var instructions = 0;
writeDebug("Trace file size: " + GetMediaLength() + " bytes");
while (bpos < GetMediaLength())
{
var kind = GetMediaIntBigEndian(bpos);
bpos += 4;
switch (kind) {
case 0x244d454d: /* $MEM */
addr = GetMediaIntBigEndian(bpos);
bpos += 4;
len = GetMediaIntBigEndian(bpos);
bpos += 4;
rec = new TraceMem(addr, len);
for (i = 0; i < len; i++) {
rec.data[i] = GetMediaByte(bpos + i);
}
bpos += len;
break;
case 0x244b4244: /* $KBD */
rec = new TraceKbd();
len = 8;
for (i = 0; i < len; i++) {
rec.data[i] = GetMediaByte(bpos + i);
}
bpos += len;
break;
case 0x245a3830: /* $Z80 */
cycles = GetMediaIntBigEndian(bpos);
bpos += 4;
rec = new TraceZ80(cycles)
for (i = 0; i < 22; i++) {
rec.data[i + 1] = GetMediaWordBigEndian(bpos);
bpos += 2;
}
break;
case 0x24545243: /* $TRC */
fieldCount++;
rec = new TraceTrc();
cycles = GetMediaIntBigEndian(bpos);
bpos += 4;
len = 0;
while (cycles >= 0 && bpos < GetMediaLength()) {
instructions++;
rec.data[len] = new Array(9);
rec.data[len][0] = cycles;
for (i = 0; i < 8; i++) {
rec.data[len][i+1] = GetMediaWordBigEndian(bpos);
bpos += 2;
}
len += 1;
cycles = GetMediaIntBigEndian(bpos);
bpos += 4;
}
break;
case 0x24454e44: /* $END */
seconds = Math.floor(fieldCount / 60 * 100) / 100;
writeDebug("Trace loaded, " + fieldCount + " fields (" + seconds + " sec) " + instructions + " insns");
return recarray;
break;
default:
writeDebug("Unknown record type " + kind.toString());
return null;
}
recarray[recarray.length] = rec;
}
writeDebug("Ran out of bytes in trace");
writeDebug("Pos = " + bpos.toString());
writeDebug("Media length = " + GetMediaLength());
}
function load_binary_resource(url, followup) {
if(/trident/i.test(navigator.userAgent))
load_binary_resource_IE11(url, followup);
else if(/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent))
load_binary_resource_IE(url, followup);
else
load_binary_resource_AJAX(url, followup);
}
function load_binary_resource_AJAX(url, followup) {
var req = new XMLHttpRequest();
req["open"]('GET', url, false);
//XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com]
req["overrideMimeType"]('text/plain; charset=x-user-defined');
req["onreadystatechange"] = function () {
if (req["readyState"] == req["DONE"]) {
if (req["status"] != 200) {
followup("error: " + req["status"].toString() + " " + req["statusText"]);
}
else {
followup( [
req["responseText"],
function(index, data) { return data.charCodeAt(index) & 0xff; }
]);
}
}
};
req["send"](null);
}
function load_binary_resource_IE11(fileURL, followup)
{
var req = new XMLHttpRequest();
req["open"]("GET", fileURL, true);
req["responseType"] = "blob";
req["onreadystatechange"] = function () {
if (req["readyState"] == req["DONE"]) {
if (req["status"] != 200) {
followup("error: " + req["status"].toString() + " " + req["statusText"]);
}
else {
var reader = new FileReader();
reader.addEventListener("loadend", function() {
followup( [
new Uint8Array(reader.result),
function(index, data) { return data[index] & 0xff; }
]);
});
reader.readAsArrayBuffer(req["response"]); // req.response is a blob
}
}
}
req["send"]();
}
function load_binary_resource_IE(fileURL, followup)
{
var vbArr = BinFileReaderImpl_IE_VBAjaxLoader(fileURL);
if (typeof vbArr == "string") {
followup(vbArr);
}
else {
fileContents = vbArr["toArray"]();
if (fileContents.length > 0) {
fileContents = fileContents.slice(0, fileContents.length - 1);
}
followup( [
fileContents,
function(index, data) { return data[index] & 0xff; }
]);
}
}
// IE compatibility--add Visual Basic method for loading binary data.
if(/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) {
document.write('');
}
function GrabFocus(z)
{
LoseFocus(currfocus);
currfocus = z;
window.onblur = function(event) { if (currfocus) { keysetup(currfocus); } };
if(/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent))
{
document.onkeyup = function() { return currfocus ? keyup(z, event) : true; }
document.onkeydown = function() { return currfocus ? keydown(z, event) : true; }
document.onkeypress = function() { return currfocus ? keypress(z, event) : true; }
}
else
{
document.onkeyup = function(event) { return currfocus ? keyup(z, event) : true; }
document.onkeydown = function(event) { return currfocus ? keydown(z, event) : true; }
document.onkeypress = function(event) { return currfocus ? keypress(z, event) : true; }
}
}
function LoseFocus(z)
{
if (z) {
// release all knowledge of held keys
keysetup(z);
if (z == currfocus) {
currfocus = null;
}
}
}
function keyinit()
{
var opera = /opera/i.test(navigator.userAgent);
var ff = /firefox/i.test(navigator.userAgent);
keycap = [];
var k189 = opera ? 109 : 189;
var k186 = opera ? 59 : 186;
var k187 = opera ? 61 : 187;
if (ff) {
k189 = 173;
k186 = 59;
k187 = 61;
}
var k = 1024;
keycap[65+k] = 'A'; keycap[65] = 'a';
keycap[66+k] = 'B'; keycap[66] = 'b';
keycap[67+k] = 'C'; keycap[67] = 'c';
keycap[68+k] = 'D'; keycap[68] = 'd';
keycap[69+k] = 'E'; keycap[69] = 'e';
keycap[70+k] = 'F'; keycap[70] = 'f';
keycap[71+k] = 'G'; keycap[71] = 'g';
keycap[72+k] = 'H'; keycap[72] = 'h';
keycap[73+k] = 'I'; keycap[73] = 'i';
keycap[74+k] = 'J'; keycap[74] = 'j';
keycap[75+k] = 'K'; keycap[75] = 'k';
keycap[76+k] = 'L'; keycap[76] = 'l';
keycap[77+k] = 'M'; keycap[77] = 'm';
keycap[78+k] = 'N'; keycap[78] = 'n';
keycap[79+k] = 'O'; keycap[79] = 'o';
keycap[80+k] = 'P'; keycap[80] = 'p';
keycap[81+k] = 'Q'; keycap[81] = 'q';
keycap[82+k] = 'R'; keycap[82] = 'r';
keycap[83+k] = 'S'; keycap[83] = 's';
keycap[84+k] = 'T'; keycap[84] = 't';
keycap[85+k] = 'U'; keycap[85] = 'u';
keycap[86+k] = 'V'; keycap[86] = 'v';
keycap[87+k] = 'W'; keycap[87] = 'w';
keycap[88+k] = 'X'; keycap[88] = 'x';
keycap[89+k] = 'Y'; keycap[89] = 'y';
keycap[90+k] = 'Z'; keycap[90] = 'z';
keycap[48+k] = ')'; keycap[48] = '0';
keycap[49+k] = '!'; keycap[49] = '1';
keycap[50+k] = '@'; keycap[50] = '2';
keycap[51+k] = '#'; keycap[51] = '3';
keycap[52+k] = '$'; keycap[52] = '4';
keycap[53+k] = '%'; keycap[53] = '5';
keycap[54+k] = '^'; keycap[54] = '6';
keycap[55+k] = '&'; keycap[55] = '7';
keycap[56+k] = '*'; keycap[56] = '8';
keycap[57+k] = '('; keycap[57] = '9';
keycap[k189+k] = '_'; keycap[k189] = '-';
keycap[k186+k] = ':'; keycap[k186] = ';';
keycap[188 +k] = '<'; keycap[188 ] = ',';
keycap[k187+k] = '+'; keycap[k187] = '=';
keycap[190 +k] = '>'; keycap[190 ] = '.';
keycap[191 +k] = '?'; keycap[191 ] = '/';
keycap[222 +k] = '"'; keycap[222] = "'";
keycap[192 ] = '`';
keycap[13+k] = "\015"; keycap[13] = "\015"; // return
keycap[27+k] = "\003"; keycap[27] = "\003"; // break (escape)
keycap[38+k] = "\013"; keycap[38] = "\013"; // up
keycap[40+k] = "\012"; keycap[40] = "\012"; // down
keycap[ 8+k] = "\010"; keycap[ 8] = "\010"; // left
keycap[37+k] = "\010"; keycap[37] = "\010"; // left
keycap[39+k] = "\016"; keycap[39] = "\011"; // right
keycap[32+k] = "\040"; keycap[32] = "\040"; // space
keycap[220+k] = "\001"; keycap[220] = "\001"; // clear
// Keypad - no numlock
// Cannot map digits because of conflicts with arrow keys.
keycap[111+k] = '/'; keycap[111] = '/';
keycap[106+k] = '*'; keycap[106] = '*';
keycap[109+k] = '-'; keycap[109] = '-';
keycap[107+k] = '+'; keycap[107] = '+';
keycap[ 46+k] = '.'; keycap[ 46] = '.';
// enter handled by code 13
// Keypad - numlock
keycap[103+k] = '7'; keycap[103] = '7';
keycap[104+k] = '8'; keycap[104] = '8';
keycap[105+k] = '9'; keycap[105] = '9';
keycap[100+k] = '4'; keycap[100] = '4';
keycap[101+k] = '5'; keycap[101] = '5';
keycap[102+k] = '6'; keycap[102] = '6';
keycap[ 97+k] = '1'; keycap[ 97] = '1';
keycap[ 98+k] = '2'; keycap[ 98] = '2';
keycap[ 99+k] = '3'; keycap[ 99] = '3';
keycap[ 96+k] = '0'; keycap[ 96] = '0';
keycap[110+k] = '.'; keycap[110] = '.';
asciibit = []
asciibit['@'] = { bit: 0x0008, shift: 0 }; // @
asciibit['a'] = { bit: 0x0009, shift: 0 }; // A
asciibit['b'] = { bit: 0x000a, shift: 0 }; // B
asciibit['c'] = { bit: 0x000b, shift: 0 }; // C
asciibit['d'] = { bit: 0x000c, shift: 0 }; // D
asciibit['e'] = { bit: 0x000d, shift: 0 }; // E
asciibit['f'] = { bit: 0x000e, shift: 0 }; // F
asciibit['g'] = { bit: 0x000f, shift: 0 }; // G
asciibit['h'] = { bit: 0x0010, shift: 0 }; // H
asciibit['i'] = { bit: 0x0011, shift: 0 }; // I
asciibit['j'] = { bit: 0x0012, shift: 0 }; // J
asciibit['k'] = { bit: 0x0013, shift: 0 }; // K
asciibit['l'] = { bit: 0x0014, shift: 0 }; // L
asciibit['m'] = { bit: 0x0015, shift: 0 }; // M
asciibit['n'] = { bit: 0x0016, shift: 0 }; // N
asciibit['o'] = { bit: 0x0017, shift: 0 }; // O
asciibit['p'] = { bit: 0x0020, shift: 0 }; // P
asciibit['q'] = { bit: 0x0021, shift: 0 }; // Q
asciibit['r'] = { bit: 0x0022, shift: 0 }; // R
asciibit['s'] = { bit: 0x0023, shift: 0 }; // S
asciibit['t'] = { bit: 0x0024, shift: 0 }; // T
asciibit['u'] = { bit: 0x0025, shift: 0 }; // U
asciibit['v'] = { bit: 0x0026, shift: 0 }; // V
asciibit['w'] = { bit: 0x0027, shift: 0 }; // W
asciibit['x'] = { bit: 0x0040, shift: 0 }; // X
asciibit['y'] = { bit: 0x0041, shift: 0 }; // Y
asciibit['z'] = { bit: 0x0042, shift: 0 }; // Z
asciibit['0'] = { bit: 0x0080, shift: 0 }; // 0
asciibit['1'] = { bit: 0x0081, shift: 0 }; // 1
asciibit['2'] = { bit: 0x0082, shift: 0 }; // 2
asciibit['3'] = { bit: 0x0083, shift: 0 }; // 3
asciibit['4'] = { bit: 0x0084, shift: 0 }; // 4
asciibit['5'] = { bit: 0x0085, shift: 0 }; // 5
asciibit['6'] = { bit: 0x0086, shift: 0 }; // 6
asciibit['7'] = { bit: 0x0087, shift: 0 }; // 7
asciibit['8'] = { bit: 0x0100, shift: 0 }; // 8
asciibit['9'] = { bit: 0x0101, shift: 0 }; // 9
asciibit[':'] = { bit: 0x0102, shift: 0 }; // :
asciibit[';'] = { bit: 0x0103, shift: 0 }; // ;
asciibit[','] = { bit: 0x0104, shift: 0 }; // ,
asciibit['-'] = { bit: 0x0105, shift: 0 }; // -
asciibit['.'] = { bit: 0x0106, shift: 0 }; // .
asciibit['/'] = { bit: 0x0107, shift: 0 }; // /
asciibit["\015"] = { bit: 0x0200, shift: 0 }; // enter
asciibit["\001"] = { bit: 0x0201, shift: 0 }; // clear
asciibit["\003"] = { bit: 0x0202, shift: 0 }; // break
asciibit["\013"] = { bit: 0x0203, shift: 0 }; // up
asciibit["\012"] = { bit: 0x0204, shift: 0 }; // down
asciibit["\010"] = { bit: 0x0205, shift: 0 }; // left
asciibit["\011"] = { bit: 0x0206, shift: 0 }; // right
asciibit["\016"] = { bit: 0x0206, shift: 1 }; // shift-right
asciibit["\040"] = { bit: 0x0207, shift: 0 }; // space
asciibit["\004"] = { bit: 0x0400, shift: 0 }; // left shift
asciibit["\005"] = { bit: 0x0401, shift: 0 }; // right shift
asciibit['`'] = { bit: 0x0008, shift: 1 }; // @
asciibit['A'] = { bit: 0x0009, shift: 1 }; // A
asciibit['B'] = { bit: 0x000a, shift: 1 }; // B
asciibit['C'] = { bit: 0x000b, shift: 1 }; // C
asciibit['D'] = { bit: 0x000c, shift: 1 }; // D
asciibit['E'] = { bit: 0x000d, shift: 1 }; // E
asciibit['F'] = { bit: 0x000e, shift: 1 }; // F
asciibit['G'] = { bit: 0x000f, shift: 1 }; // G
asciibit['H'] = { bit: 0x0010, shift: 1 }; // H
asciibit['I'] = { bit: 0x0011, shift: 1 }; // I
asciibit['J'] = { bit: 0x0012, shift: 1 }; // J
asciibit['K'] = { bit: 0x0013, shift: 1 }; // K
asciibit['L'] = { bit: 0x0014, shift: 1 }; // L
asciibit['M'] = { bit: 0x0015, shift: 1 }; // M
asciibit['N'] = { bit: 0x0016, shift: 1 }; // N
asciibit['O'] = { bit: 0x0017, shift: 1 }; // O
asciibit['P'] = { bit: 0x0020, shift: 1 }; // P
asciibit['Q'] = { bit: 0x0021, shift: 1 }; // Q
asciibit['R'] = { bit: 0x0022, shift: 1 }; // R
asciibit['S'] = { bit: 0x0023, shift: 1 }; // S
asciibit['T'] = { bit: 0x0024, shift: 1 }; // T
asciibit['U'] = { bit: 0x0025, shift: 1 }; // U
asciibit['V'] = { bit: 0x0026, shift: 1 }; // V
asciibit['W'] = { bit: 0x0027, shift: 1 }; // W
asciibit['X'] = { bit: 0x0040, shift: 1 }; // X
asciibit['Y'] = { bit: 0x0041, shift: 1 }; // Y
asciibit['Z'] = { bit: 0x0042, shift: 1 }; // Z
asciibit['_'] = { bit: 0x0080, shift: 1 }; // 0
asciibit['!'] = { bit: 0x0081, shift: 1 }; // 1
asciibit['"'] = { bit: 0x0082, shift: 1 }; // 2
asciibit['#'] = { bit: 0x0083, shift: 1 }; // 3
asciibit['$'] = { bit: 0x0084, shift: 1 }; // 4
asciibit['%'] = { bit: 0x0085, shift: 1 }; // 5
asciibit['&'] = { bit: 0x0086, shift: 1 }; // 6
asciibit["'"] = { bit: 0x0087, shift: 1 }; // 7
asciibit['('] = { bit: 0x0100, shift: 1 }; // 8
asciibit[')'] = { bit: 0x0101, shift: 1 }; // 9
asciibit['*'] = { bit: 0x0102, shift: 1 }; // :
asciibit['+'] = { bit: 0x0103, shift: 1 }; // ;
asciibit['<'] = { bit: 0x0104, shift: 1 }; // ,
asciibit['='] = { bit: 0x0105, shift: 1 }; // -
asciibit['>'] = { bit: 0x0106, shift: 1 }; // .
asciibit['?'] = { bit: 0x0107, shift: 1 }; // /
}
function keysetup(z)
{
z.keymatrix = [];
z.keyheld = [];
z.keyboard = {};
z.keybit = [];
var i;
for (i in asciibit) {
z.keymatrix[ asciibit[i].bit ] = 0;
}
for (i in keycap) {
z.keyheld[i] = 0;
z.keyboard[ keycap[i] ] = 0;
}
// Mark all keys released
for (i = 0x3800; i < 0x3900; i++) {
z.mem[i] = 0;
}
for (i = 0; i < 256; i++) {
z.keybit[i] = 0;
}
// Set up 'debug' key matrix.
// If it already exists, reset keys to it
if (z.dbgkeymatrix) {
for (i = 0; i < z.keymatrix.length; i++) {
z.keymatrix[i] = z.dbgkeymatrix[i]
update_key_bit(z, i);
}
update_key_echo(z);
} else {
z.dbgkeymatrix = [];
for (i = 0; i < z.keymatrix.length; i++) {
z.dbgkeymatrix[i] = 0;
}
}
}
function keypress(z, event)
{
event.preventDefault(); // works for Opera
event.stopPropagation();
return false;
}
function update_key_bit(z, index)
{
var bit, i, addr, base;
base = Math.floor(index / 8);
bit = 0;
for (i = 0; i < 8; i++) {
if (z.keymatrix[base*8 + i]) {
bit |= (1 << i);
}
}
z.keybit[base] = bit;
}
function update_key_echo(z)
{
var i, a, b;
for (i = 0; i < 256; i++) {
z.mem[0x3800 + i] = 0;
}
for (i = 0; i < 8; i++) {
b = z.keybit[1 << i];
for (a = 1; a <= 255; a++) {
if (a & (1 << i)) {
z.mem[0x3800 + a] |= b;
}
}
}
}
function ascii_down(z, ascii)
{
z.keyboard[ascii] += 1;
var action = asciibit[ascii];
if (action) {
z.keymatrix[action.bit] += 1;
update_key_bit(z, action.bit);
if (action.shift) {
z.keymatrix[0x400] += 1;
update_key_bit(z, 0x400);
}
update_key_echo(z);
}
}
function ascii_up(z, ascii)
{
if (z.keyboard[ascii] > 0) z.keyboard[ascii] -= 1;
var action = asciibit[ascii];
if (action) {
if (z.keymatrix[action.bit] > 0) z.keymatrix[action.bit] -= 1;
update_key_bit(z, action.bit);
if (action.shift) {
if (z.keymatrix[0x400] > 0) z.keymatrix[0x400] -= 1;
update_key_bit(z, 0x400);
}
update_key_echo(z);
}
}
function set_key_bit(z, bit, val)
{
bit = (8 << Math.floor(bit / 8)) + bit % 8;
z.keymatrix[bit] = !!val;
z.dbgkeymatrix[bit] = !!val;
update_key_bit(z, bit);
update_key_echo(z);
}
function keydown(z, e)
{
if (e.ctrlKey && e.keyCode == 86) {
_RunStop(z, "stop");
for(var i=0;i<576;i++) { z.mem[15360+i] = glyph[glyph.length - 576 + i]; }
z.TRS80Draw(z);
if (e.preventDefault)
{
e.preventDefault();
e.stopPropagation();
}
return false;
}
if (e.keyCode == 16 || e.keyCode == 17) return false; // ignore shift
// Not sure if 'e.shiftKey' is standard
var ascii = keycap[e.keyCode + (e.shiftKey ? 1024 : 0)];
if (ascii) {
if (!z.keyheld[e.keyCode]) {
z.keyheld[e.keyCode] = 1;
//writeDebug("ascii = '" + ascii + "'");
ascii_down(z, ascii);
z.keyboard[ascii] += 1;
}
if (e.preventDefault)
{
e.preventDefault();
e.stopPropagation();
}
return false;
}
}
function keyup(z, e)
{
if (e.keyCode == 16 || e.keyCode == 17) return false; // ignore shift
var ascii = keycap[e.keyCode];
if (ascii) {
z.keyheld[e.keyCode] = 0;
ascii_up(z, ascii);
var ascii2 = keycap[e.keyCode + 1024];
if (ascii2) {
ascii_up(z, ascii2);
}
}
if (e.preventDefault)
{
e.preventDefault();
e.stopPropagation();
}
return false;
}
var hasCanvas;
var keycap, asciibit;
var trsid = 0;
var currfocus = null;
var m3_png = "tx/m3.png";
var wht_png = "tx/wdot.png";
var red_png = "tx/red.png";
var grn_png = "tx/grn.png";
function initEmulator() {
keyinit();
build_ptable();
build_all();
}
function LoadRom(z)
{
for (i = 0; i < rom.length; i++)
{
z.mem[i] = rom[i];
}
for (; i < 14336; i++)
{
z.mem[i] = 0xe7;
}
}
function createEmulator()
{
var _z80 = new z80cons()
var i
for (i = 0; i < 65536; i++)
{
_z80.mem[i] = 0x76;
}
for (i = 0; i < 2048; i++)
{
_z80.mem[0x3800 + i] = 0;
}
for (i = 0; i < 256; i++)
{
_z80.mem[0x3700 + i] = 0;
}
LoadRom(_z80);
resetz80(_z80);
_z80.z80timer = 1;
_z80.__frameDraw = (function(z) { var lz = z; return function() { frameDraw(lz); } })(_z80);
_z80.__debugFrame = (function(z) { var lz = z; return function() { debugFrame(lz); } })(_z80);
keysetup(_z80);
_z80.PerfDraw = PerfDraw_Empty;
_z80.TRS80Draw = TRS80Draw_Empty;
_z80.doRender = 1;
_z80.doEmu = 1;
_z80.gOffset = 0;
_z80.runButton = { 'value': 'Run'};
_z80.breakpoints = {};
_z80.debugevent = {
'show' : function() { },
'running' : function() { },
'rundebug' : function() { },
'stopped' : function() { }
} ;
// color = rgb for foreground, light foreground, background, light background
_z80._color = [
255, 255, 255,
160, 160, 160,
0, 0, 0,
0, 0, 0 ];
_z80._invert = 0; // indicates fg/bg are swapped.
return _z80;
}
function DebugEvent_show(z)
{
z.debugevent['show']();
}
function DebugEvent_running(z)
{
z.debugevent['running']();
}
function DebugEvent_rundebug(z)
{
z.debugevent['rundebug']();
}
function DebugEvent_stopped(z)
{
z.debugevent['stopped']();
}
function startEmulator(z)
{
stopEmulator(z);
z.z80timer = setInterval(z.__frameDraw, 33);
DebugEvent_running(z);
}
function stopEmulator(z)
{
clearTimeout(z.z80timer);
}
// "macros"
// literal character = type
// | = reset
// {name} = load file name
// [cnt] = run cnt frames
// Other characters typed literally.
function macro(z, str, cont)
{
var err;
z.doRender = 0;
var i;
while (str.length > 0) {
var head = str.substring(0,1);
if (head == "[") {
var lst = str.match(/^\[(\d+)\]/);
if (lst.length == 2) {
str = str.replace(/^\[\d+\]/, "X");
for (i = 0; i < lst[1]; i++) {
frameDraw(z);
}
}
} else if (head == "{") {
var lst = str.match(/^\{([^}]+)\}/);
if (lst.length == 2) {
str = str.replace(/^\{[^}]+\}/, "");
LoadFile(z, lst[1], 0, function (err) {
if (err != null) {
z.doRender = 1;
z.TRS80Draw(z);
cont(err);
}
else {
macro(z, str, cont);
}
});
return;
}
} else if (head == "|") {
z.reg.PC = 0;
frameDraw(z);
} else if (head == "~") {
// ignore
} else {
ascii_down(z, str[0]);
frameDraw(z);
ascii_up(z, str[0]);
frameDraw(z);
}
str = str.substring(1);
}
z.doRender = 1;
z.TRS80Draw(z);
cont(null);
}
function frameDraw(z)
{
var t0, tfield, tdraw, trend;
t0 = CurrTime();
tfield = 0;
if (z.doEmu) {
TRS80Field(z);
TRS80Field(z);
tfield = ElapsedTime(t0);
}
tdraw = 0;
if (z.doRender) {
z.TRS80Draw(z);
tdraw = ElapsedTime(t0) - tfield;
}
var total = ElapsedTime(t0);
z.PerfDraw(z, tfield, tdraw, total);
}
function TRS80Field(z)
{
var frameCyc = 33792;
z.cycles = frameCyc;
var fail = -1;
runz80(z);
if (z.cycles < 0)
{
z.frame_cnt++;
z.cycles += frameCyc;
if (z.beam_IRQ_enabled && z.frame_cnt % 2 == 1)
{
z.beam_IRQ = 1;
if (mode_1_IRQ(z))
{
//tbase = z.tcount;
//paint_trs80_beam(&z, tbase, z.tcount, z.port236output, -1);
}
}
}
}
function TRS80Trace(z)
{
var tcnt;
var rec;
var i, j;
var frameCyc;
var regrec;
var T;
var timer;
z.frame_cnt = 0;
for (tcnt = 0; tcnt < z.trace.length; tcnt++) {
rec = z.trace[tcnt];
switch (rec.kind) {
case TRACE_MEM:
for (i = 0; i < rec.data.length; i++) {
z.mem[rec.addr + i] = rec.data[i];
}
timer = CurrTime();
break;
case TRACE_KBD:
for (i = 0; i < rec.data.length; i++) {
z.mem[0x3800 + (1<= 0) {
T = rec.data[j + regrec];
var sep = ": ";
exp = "";
for (i = 1; i < 9; i++) {
exp += hex4(T[i]) + sep;
sep = " ";
}
exp += T[0].toString();
writeDebug(exp);
}
}
writeDebug("");
dumpreg(z);
return;
}
stepz80(z);
}
while (z.cycles > 0)
z.frame_cnt++;
// z.cycles += frameCyc;
if (z.beam_IRQ_enabled && z.frame_cnt % 2 == 1)
{
z.beam_IRQ = 1;
mode_1_IRQ(z);
}
}
}
var total = ElapsedTime(timer);
writeDebug("Trace OK " + total + " milliseconds");
}
function TraceFrameInit(z)
{
tcnt = 0;
z.frame_cnt = 0;
traceTimer = setInterval("TraceFrame()", 16);
}
function TraceFrame(z)
{
var rec;
var i, j;
var frameCyc;
var regrec;
var T;
if (tcnt >= z.trace.length)
{
clearTimeout(traceTimer);
writeDebug("trace step done tcnt=" + tcnt);
return;
}
for ( ; tcnt < z.trace.length; tcnt++) {
rec = z.trace[tcnt];
switch (rec.kind) {
case TRACE_MEM:
for (i = 0; i < rec.data.length; i++) {
z.mem[rec.addr + i] = rec.data[i];
}
break;
case TRACE_KBD:
for (i = 0; i < rec.data.length; i++) {
z.mem[0x3800 + (1<= 0) {
T = rec.data[j + regrec];
var sep = ": ";
exp = "";
for (i = 1; i < 9; i++) {
exp += hex4(T[i]) + sep;
sep = " ";
}
exp += T[0].toString();
writeDebug(exp);
}
}
writeDebug("");
dumpreg(z);
return;
}
stepz80(z);
}
while (z.cycles > 0)
z.frame_cnt++;
if (z.beam_IRQ_enabled && z.frame_cnt % 2 == 1)
{
z.beam_IRQ = 1;
mode_1_IRQ(z);
}
z.TRS80Draw(z);
tcnt++;
return;
}
}
}
function SpeedRun(z, limit)
{
var timer = CurrTime();
var i;
var ftime = [];
for (i = 0; i < limit; i++) {
var t0 = CurrTime();
TRS80Field(z);
TRS80Field(z);
ftime[i] = ElapsedTime(t0);
}
var total = ElapsedTime(timer);
writeDebug("Speed run " + limit + " frames " + total + " milliseconds");
z.gOffset = 0;
for (i = 0; i < limit; i++) {
z.PerfDraw(z, ftime[i], 0, ftime[i]);
}
z.TRS80Draw(z);
}
function TRS80Draw_Canvas(z)
{
var i, x, y;
var wide = (z.port236output & 4);
var alt = ((z.port236output & 8) == 0);
var pix = alt ? z.gAltGlyphPix : z.gGlyphPix;
var inc = 1;
if (wide) {
inc = 2;
pix = alt ? z.gAltGlyphPixWide : z.gGlyphPixWide;
}
for (i = 0; i < 1024; i += inc) {
x = (i % 64)*8;
y = Math.floor(i/64)*24;
z.ctx.drawImage(pix[z.mem[i + 15360]], x, y);
}
}
function TRS80Draw_Empty(z)
{
}
function TRS80Draw_Css(z)
{
var i, x, y;
var wide = (z.port236output & 4);
var alt = ((z.port236output & 8) == 0);
var pos = alt ? z.gPosAlt : z.gPos;
if (!wide) {
for (i = 0; i < 1024; i++) {
x = (i % 64)*8;
y = Math.floor(i/64)*24;
z.scrn[i].style.backgroundPosition = pos[z.mem[i + 15360]];
}
} else {
pos = alt ? z.gPosAltWide : z.gPosWide;
for (i = 0; i < 1024; i += 2) {
x = (i % 64)*8;
y = Math.floor(i/64)*24;
var ch = 2*z.mem[i + 15360];
z.scrn[i].style.backgroundPosition = pos[ch];
z.scrn[i + 1].style.backgroundPosition = pos[ch + 1];
}
}
}
function SetForeground(z, r, g, b)
{
z._color[0] = r;
z._color[1] = g;
z._color[2] = b;
z._color[3] = Math.floor(r*160/255);
z._color[4] = Math.floor(g*160/255);
z._color[5] = Math.floor(b*160/255);
}
function SetBackground(z, r, g, b)
{
z._color[6] = r;
z._color[7] = g;
z._color[8] = b;
z._color[9] = Math.floor(r*160/255);
z._color[10] = Math.floor(g*160/255);
z._color[11] = Math.floor(b*160/255);
}
function InvertColor(z)
{
z._invert ^= 255;
}
function SetupScreen(z, node)
{
z.TRS80Draw = TRS80Draw_Empty;
if (node == null || node.childElementCount == 0) {
return;
}
var canvas;
var i;
for (i in node.childNodes) {
if (node.childNodes[i].nodeName == "CANVAS") {
canvas = node.childNodes[i];
break;
}
}
hasCanvas = false;
if (canvas != null && canvas.getContext && canvas.getContext("2d").getImageData)
{
z.ctx = canvas.getContext("2d");
loadGlyph(z);
writeDebug("Canvas support 100%");
z.TRS80Draw = TRS80Draw_Canvas
} else {
var table = '';
for (i = 0; i < 1024; i++) {
if (i % 64 == 0) { table += ""; }
table += ' | ';
if (i % 64 == 63) { table += '
'; }
}
table += '
';
node.innerHTML = table;
z.scrn = []
z.gPos = []
z.gPosAlt = [];
z.gPosAltWide = [];
z.gPosWide = [];
var x, y;
for (y = 0; y < 5; y++) {
for (x = 0; x < 64; x++) {
z.gPos[y*64+x] = (-x * 8).toString() + "px " + (-y*24).toString() + "px";
}
}
for (x = 0; x < 256; x++) {
z.gPosAlt[x] = z.gPos[x + (x >= 192 ? 64 : 0)];
}
for (y = 0; y < 10; y++) {
for (x = 0; x < 64; x++) {
z.gPosWide[y*64+x] = (-x * 8).toString() + "px " + (-y*24 - 120).toString() + "px";
}
}
for (x = 0; x < 512; x++) {
z.gPosAltWide[x] = z.gPosWide[x + (x >= 384 ? 128 : 0)];
}
for (i = 0; i < 1024; i++) {
z.scrn[i] = document.getElementById(z.tid + i.toString());
z.scrn[i].style.backgroundImage = "url(" + m3_png + ")";
z.scrn[i].style.height = 24;
z.scrn[i].style.width = 8;
z.scrn[i].style.backgroundPosition = z.gPos[32];
}
for (i = 0; i < 256; i++){
z.scrn[i].style.backgroundPosition = z.gPos[i];
}
z.TRS80Draw = TRS80Draw_Css
}
}
function miniCanvas(width, height) {
var canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
return canvas;
}
function loadGlyph(z)
{
var x, y, i, b, g, inv;
var s1, s2;
s1 = z.ctx.getImageData(0, 0, 8, 24);
s2 = z.ctx.getImageData(0, 0, 16, 24);
z.gGlyphPix = [];
z.gGlyphPixWide = [];
inv = z._invert;
for (g = 0; g < glyph.length; g += 12) {
z.gGlyphPix[g / 12] = miniCanvas(8, 24);
z.gGlyphPixWide[g / 12] = miniCanvas(16, 24);
var pix = s1.data;
var pixw = s2.data;
var w = s1.width;
var h = s1.height;
var ww = s2.width;
for (y = 0; y < h; y++) {
i = Math.floor(y*24/h);
var weight = 0;
var bit = glyph[g + Math.floor(i/2)]^inv;
if (i % 2 == 1) weight = 3;
var offset = (y*w)*4;
var offset2 = (y*ww)*4;
for (x = 0; x < w; x++)
{
b = Math.floor(x*8/w);
if (bit & (1<<(7-b))) {
pix[offset + x*4] = z._color[weight];
pix[offset + x*4 + 1] = z._color[1+weight];
pix[offset + x*4 + 2] = z._color[2+weight];
pix[offset + x*4 + 3] = 255;
pixw[offset2 + x*8] = z._color[weight];
pixw[offset2 + x*8 + 1] = z._color[1+weight];
pixw[offset2 + x*8 + 2] = z._color[2+weight];
pixw[offset2 + x*8 + 3] = 255;
pixw[offset2 + 4 + x*8] = z._color[weight];
pixw[offset2 + 4 + x*8 + 1] = z._color[1+weight];
pixw[offset2 + 4 + x*8 + 2] = z._color[2+weight];
pixw[offset2 + 4 + x*8 + 3] = 255;
} else {
pix[offset + x*4] = z._color[6+weight];
pix[offset + x*4 + 1] = z._color[7+weight];
pix[offset + x*4 + 2] = z._color[8+weight];
pix[offset + x*4 + 3] = 255;
pixw[offset2 + x*8] = z._color[6+weight];
pixw[offset2 + x*8 + 1] = z._color[7+weight];
pixw[offset2 + x*8 + 2] = z._color[8+weight];
pixw[offset2 + x*8 + 3] = 255;
pixw[offset2 + 4 + x*8] = z._color[6+weight];
pixw[offset2 + 4 + x*8 + 1] = z._color[7+weight];
pixw[offset2 + 4 + x*8 + 2] = z._color[8+weight];
pixw[offset2 + 4 + x*8 + 3] = 255;
}
}
}
z.gGlyphPix[g / 12].getContext("2d").putImageData(s1, 0, 0);
z.gGlyphPixWide[g / 12].getContext("2d").putImageData(s2, 0, 0);
}
// Alternate characters for M3.
z.gAltGlyphPix = [];
z.gAltGlyphPixWide = [];
for (g = 0; g < 256; g++) {
var offset = g >= 192 ? 64 : 0;
z.gAltGlyphPix[g] = z.gGlyphPix[g + offset];
z.gAltGlyphPixWide[g] = z.gGlyphPixWide[g + offset];
}
}
function PerfDraw_Empty(z, tfield, tdraw, total)
{
}
function PerfDraw_Canvas(z, tfield, tdraw, total)
{
var w, h, i;
w = 512;
h = 100;
// timing graph. one pixel vertical = one millisecond
// erase
z.gctx.drawImage(erasePix, z.gOffset, 0);
i = 0;
for (; i < tfield; i++ ) {
z.gctx.drawImage(greenPix, z.gOffset, h - 1 - i);
}
for (; i < tdraw + tfield && i < h; i++ ) {
z.gctx.drawImage(redPix, z.gOffset, h - 1 - i);
}
// Real-time marker. (dotted line at 33 ms)
if (z.gOffset % 2 == 0) {
z.gctx.drawImage(whitePix, z.gOffset, h - 1 - 33);
}
z.gOffset = (z.gOffset + 1) % w;
// Zero in front so line is visible.
z.gctx.drawImage(erasePix, z.gOffset, 0);
}
function PerfDraw_Css(z, tfield, tdraw, total)
{
var w;
w = 512;
h = 100;
if (total >= h) { total = h; }
if (total < 0) { total = 0; }
z.rtab[z.gOffset].style.top = (h - total).toString() + "px";
z.rtab[z.gOffset].style.height = total.toString() + "px";
if (tfield >= h) { tfield = h; }
if (tfield < 0) { tfield = 0; }
z.gtab[z.gOffset].style.top = (h - tfield).toString() + "px";
z.gtab[z.gOffset].style.height = tfield.toString() + "px";
z.gOffset = (z.gOffset + 1) % w;
z.rtab[z.gOffset].style.top = "100px";
z.rtab[z.gOffset].style.height = "0px";
z.gtab[z.gOffset].style.top = "100px";
z.gtab[z.gOffset].style.height = "0px";
}
var redPix, greenPix, whitePix, erasePix;
function MakePix(h, r, g, b)
{
var res = miniCanvas(1, h);
var imgData = res.getContext("2d").getImageData(0, 0, 1, h);
var i;
for (i = 0; i < h; i++) {
imgData.data[i*4 + 0] = r;
imgData.data[i*4 + 1] = g;
imgData.data[i*4 + 2] = b;
imgData.data[i*4 + 3] = 255;
}
res.getContext("2d").putImageData(imgData, 0, 0);
return res;
}
function SetupPerf(z, node)
{
var canvas;
var table;
z.PerfDraw = PerfDraw_Empty;
z.gOffset = 0;
if (!node || node.childElementCount == 0) {
return;
}
var i;
for (i in node.childNodes) {
if (node.childNodes[i].nodeName == "CANVAS") {
canvas = node.childNodes[i];
break;
}
}
if (canvas != null && canvas.getContext && canvas.getContext("2d").getImageData) {
z.gctx = canvas.getContext("2d");
z.PerfDraw = PerfDraw_Canvas
redPix = MakePix(1, 255, 0, 0);
greenPix = MakePix(1, 0, 255, 0);
whitePix = MakePix(1, 255, 255, 255);
erasePix = MakePix(100, 0, 0, 0);
// erase old data
for (var q = 0; q < 512; q++) {
z.gctx.drawImage(erasePix, q, 0);
}
} else {
table = '';
table += '';
for (i = 0; i < 512; i += 2) {
table += ' | ';
}
for (i = 0; i < 512; i++) {
table += ' | ';
}
for (i = 0; i < 512; i++) {
table += ' | ';
}
table += ' | ';
table += '
';
node.innerHTML = table;
z.gtab = [];
z.rtab = [];
for (i = 0; i < 512; i++) {
z.gtab[i] = document.getElementById("g" + z.tid + i.toString());
z.rtab[i] = document.getElementById("r" + z.tid + i.toString());
}
z.PerfDraw = PerfDraw_Css
}
}
// debugging.
function writeDebug(message) {
//console.debug(message);
}
function hex4(v)
{
var fmt = "0000" + v.toString(16);
return fmt.substring(fmt.length - 4);
}
function hex8(v)
{
var fmt = "00000000" + v.toString(16);
return fmt.substring(fmt.length - 8);
}
function hex2(v)
{
var fmt = "00" + v.toString(16);
return fmt.substring(fmt.length - 2);
}
function dumpreg(z)
{
var reg = [];
getRegList(z, reg); // order: PC AF BC DE HL SP IX IY SP cycles
writeDebug(
hex4(reg[0]) + ": " +
hex4(reg[1]) + " " +
hex4(reg[2]) + " " +
hex4(reg[3]) + " " +
hex4(reg[4]) + " " +
hex4(reg[5]) + " " +
hex4(reg[6]) + " " +
hex4(reg[7]) + " " + reg[8].toString()
);
}
function CurrTime()
{
return new Date().getTime();
}
function ElapsedTime(d)
{
return CurrTime() - d;
}
function toggleRender(z)
{
z.doRender ^= 1
}
function toggleEmu(z)
{
z.doEmu ^= 1
}
function ShowMessage(z, str, pos)
{
var i;
for (i = 0; i + pos < 1024 && i < str.length; i++) {
z.mem[15360+i+pos] = str.charCodeAt(i) & 0xff;
}
pos += i;
if (pos % 64 != 0) {
pos += 64 - pos % 64;
}
return pos;
}
function DisplayError(z, err) {
var pos, mess, list;
for (pos = 0; pos < 1024; pos++) {
z.mem[15360+pos] = 32;
}
err = err.replace(/\r/g, "");
list = err.split("\n");
pos = 0;
for (mess in list) {
pos = ShowMessage(z, list[mess], pos);
}
z.TRS80Draw(z);
_RunStop(z, "stop");
DebugEvent_show(z);
}
function _RunStop(z, action)
{
RunStop(z, action, true);
}
function _LoadOnly(z, action)
{
RunStop(z, action, false);
}
function ShowError(z, err)
{
if (err != null) {
DisplayError(z, err);
return 1;
}
return 0;
}
function RunStop(z, action, forceRun)
{
var err = null;
if (action == undefined) {
// do nothing--this will force the emulator to run.
} else if (action == "stop") {
forceRun = false;
stopEmulator(z);
if (z.runButton) z.runButton.value = "Run";
DebugEvent_stopped(z);
} else if (action == "toggle") {
forceRun = false;
if (z.runButton && z.runButton.value == "Run") {
startEmulator(z);
z.runButton.value = "Stop";
} else {
stopEmulator(z);
if (z.runButton) z.runButton.value = "Run";
DebugEvent_stopped(z);
}
} else if (action == "reset") {
z.reg.PC = 0;
// Loaders can trash the ROM--fix it.
LoadRom(z);
} else if (action == "debug") {
forceRun = false;
stopEmulator(z);
if (z.runButton) z.runButton.value = "Stop";
startEmulatorDebug(z);
} else if (action.match(/\.bas$/i)) {
// Reset, load, and run basic program
macro(z, "|[1]_\r0\r[1]{" + action + "}RUN\r", function(err) {
ShowError(z, err);
return;
});
} else if (action.match(/[|{}\]\[~]/)) {
macro(z, action, function (err) {
if (err == null && forceRun) {
frameDraw(z); // match older versions, skips 'reset' screens.
frameDraw(z); // match older versions, skips 'reset' screens.
}
ShowError(z, err);
return;
}
);
} else {
err = LoadFile(z, action, 0,
function(err) {
if (!ShowError(z, err)) {
if (forceRun) {
if (z.runButton) z.runButton.value = "Run";
_RunStop(z, "toggle");
}
}
}
);
return;
}
if (err != null) {
DisplayError(z, err);
return;
}
if (forceRun) {
if (z.runButton) z.runButton.value = "Run";
_RunStop(z, "toggle");
}
}
function isbreakpoint(z)
{
return z.reg.PC in z.breakpoints && z.breakpoints[z.reg.PC];
}
// step count instructions
function stepi(z, count)
{
var i;
// Stop the emulator, if running.
_RunStop(z, "stop");
for (i = 0; i < count; i++) {
stepz80(z);
if (isbreakpoint(z)) {
break;
}
if (z.cycles < 0)
{
z.frame_cnt++;
z.cycles += 33792;
if (z.beam_IRQ_enabled && z.frame_cnt % 2 == 1)
{
z.beam_IRQ = 1;
mode_1_IRQ(z);
if (isbreakpoint(z)) {
break;
}
}
}
}
z.TRS80Draw(z);
DebugEvent_show(z);
DebugEvent_stopped(z);
}
// step count tstates.
function stept(z, count)
{
var target = z.cycles - count;
// Stop the emulator, if running.
_RunStop(z, "stop");
while (z.cycles > target) {
stepz80(z);
if (isbreakpoint(z)) {
break;
}
if (z.cycles < 0)
{
z.frame_cnt++;
z.cycles += 33792;
target += 33792;
if (z.beam_IRQ_enabled && z.frame_cnt % 2 == 1)
{
z.beam_IRQ = 1;
mode_1_IRQ(z);
if (isbreakpoint(z)) {
break;
}
}
}
}
z.TRS80Draw(z);
DebugEvent_show(z);
DebugEvent_stopped(z);
}
function startEmulatorDebug(z)
{
stopEmulator(z);
z.z80timer = setInterval(z.__debugFrame, 33);
DebugEvent_rundebug(z);
}
// Callback (from timer) for running continuously in debugger.
// Runs until a new render (1/33 second) or a breakpoint is hit.
function debugFrame(z)
{
var brkhit = 0;
while (!brkhit) {
while (z.cycles >= 0) {
stepz80(z);
if (isbreakpoint(z)) {
brkhit = 1;
_RunStop(z, "stop");
break;
}
}
if (z.cycles < 0)
{
z.frame_cnt++;
z.cycles += 33792;
if (z.frame_cnt % 2 == 1) {
if (z.beam_IRQ_enabled)
{
z.beam_IRQ = 1;
mode_1_IRQ(z);
if (isbreakpoint(z)) {
brkhit = 1;
_RunStop(z, "stop");
}
}
break;
}
}
}
z.TRS80Draw(z);
DebugEvent_show(z);
if (brkhit) {
z.debugevent.stopped();
}
}
function GetState(z)
{
return {
'PC' : z.reg.PC,
'cycles' : z.cycles,
'AF' : getAF(z),
'BC' : z.reg.BC,
'DE' : z.reg.DE,
'HL' : z.reg.HL,
'AFp': z.reg.AFp,
'BCp': z.reg.BCp,
'DEp': z.reg.DEp,
'HLp': z.reg.HLp,
'IX' : z.reg.IX,
'IY' : z.reg.IY,
'SP' : z.reg.SP,
'I' : z.reg.I,
'IFF1' : z.reg.IFF1,
'IFF2' : z.reg.IFF2,
'IM' : z.reg.IM,
'R' : z.reg.R,
'IRQ' : z.beam_IRQ,
'IRQon' : z.beam_IRQ_enabled,
'frame' : z.frame_cnt,
'port236' : z.port236output,
'mem' : z.mem.slice(0)
} ;
}
function SetState(z, state)
{
if ('PC' in state) z.reg.PC = state['PC'];
if ('cycles' in state) z.cycles = state['cycles'];
if ('AF' in state) setAF(z, state['AF']);
if ('BC' in state) z.reg.BC = state['BC'];
if ('DE' in state) z.reg.DE = state['DE'];
if ('HL' in state) z.reg.HL = state['HL'];
if ('AFp' in state) z.reg.AFp = state['AFp'];
if ('BCp' in state) z.reg.BCp = state['BCp'];
if ('DEp' in state) z.reg.DEp = state['DEp'];
if ('HLp' in state) z.reg.HLp = state['HLp'];
if ('IX' in state) z.reg.IX = state['IX'];
if ('IY' in state) z.reg.IY = state['IY'];
if ('SP' in state) z.reg.SP = state['SP'];
if ('I' in state) z.reg.I = state['I'];
if ('IFF1' in state) z.reg.IFF1 = state['IFF1'];
if ('IFF2' in state) z.reg.IFF2 = state['IFF2'];
if ('IM' in state) z.reg.IM = state['IM'];
if ('R' in state) z.reg.R = state['R'];
if ('IRQ' in state) z.beam_IRQ = state['IRQ'];
if ('IRQon' in state) z.beam_IRQ_enabled = state['IRQon'];
if ('frame' in state) z.frame_cnt = state['frame'];
if ('port236' in state) z.port236output = state['port236'];
if ('mem' in state) z.mem = state['mem'].slice(0);
}
/**
* @constructor
*/
function NewEmulator()
{
this.trs80 = createEmulator();
this.trs80.tid = trsid.toString();
trsid++;
return this;
}
initEmulator();
var api = {
'screen': function(name) { SetupScreen(this.trs80, document.getElementById(name)); return this; },
'perf': function(name) { SetupPerf(this.trs80, document.getElementById(name)); return this; },
'button': function(name) { this.trs80.runButton = document.getElementById(name); return this; },
'focus': function() { GrabFocus(this.trs80); return this; },
'blur': function() { LoseFocus(this.trs80); return this; },
'run' : function(action) { _RunStop(this.trs80, action); return this; },
'load' : function(action) { _LoadOnly(this.trs80, action); return this; },
'mknew' : function() { return new NewEmulator(); },
'draw' : function() { this.trs80.TRS80Draw(this.trs80); return this; },
'getmem': function() { return this.trs80.mem; },
'setpng': function(m3,wht,red,grn) { m3_png = m3; wht_png = wht; red_png = red; grn_png = grn; return this; },
'chromebug': function() { this.trs80.allowChromeFix = 0; return this; },
'foreground': function(r,g,b) { SetForeground(this.trs80, r, g, b); return this; },
'background': function(r,g,b) { SetBackground(this.trs80, r, g, b); return this; },
'invert': function() { InvertColor(this.trs80); return this; },
'loaddata' : function(arr) { LoadRawData(this.trs80, arr); return this; },
'get' : function() { return GetState(this.trs80); },
'set' : function(state) { SetState(this.trs80, state); return this; },
'step' : function(num) { stepi(this.trs80, num); return this; },
'stept' : function(num) { stept(this.trs80, num); return this; },
'setbrk' : function(brk) { this.trs80.breakpoints = brk; return this; },
'setdebugger' : function(dbg) { this.trs80.debugevent = dbg; return this; },
'setkey' : function(bit,val) { set_key_bit(this.trs80, bit, val); return this; },
'asciidown' : function(key) { ascii_down(this.trs80, key); return this; },
'asciiup' : function(key) { ascii_up(this.trs80, key); return this; }
};
NewEmulator.prototype = api;
// Create the default emulator
api = api['mknew']();
return api;
}());