summaryrefslogtreecommitdiffstats
path: root/private/ntos/miniport/qlogic
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/miniport/qlogic
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/ntos/miniport/qlogic')
-rw-r--r--private/ntos/miniport/qlogic/isp_fw.c1245
-rw-r--r--private/ntos/miniport/qlogic/makedsk.bat4
-rw-r--r--private/ntos/miniport/qlogic/makefile7
-rw-r--r--private/ntos/miniport/qlogic/oemsetup.inf571
-rw-r--r--private/ntos/miniport/qlogic/qlisp.c3050
-rw-r--r--private/ntos/miniport/qlogic/qlisp.h608
-rw-r--r--private/ntos/miniport/qlogic/qlisp.rc12
-rw-r--r--private/ntos/miniport/qlogic/sources41
-rw-r--r--private/ntos/miniport/qlogic/txtsetup.oem97
9 files changed, 5635 insertions, 0 deletions
diff --git a/private/ntos/miniport/qlogic/isp_fw.c b/private/ntos/miniport/qlogic/isp_fw.c
new file mode 100644
index 000000000..f74347cc4
--- /dev/null
+++ b/private/ntos/miniport/qlogic/isp_fw.c
@@ -0,0 +1,1245 @@
+
+/*
+ * Version 1.27 (18:17 April 18, 1995)
+ */
+
+unsigned short risc_code_version = 1*1024+27;
+
+unsigned short risc_code_addr01 = 0x1000 ;
+
+unsigned short risc_code01[] = {
+ 0x0078, 0x102f, 0x0000, 0x267b, 0x0000, 0x2043, 0x4f50, 0x5952,
+ 0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
+ 0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
+ 0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
+ 0x3130, 0x3230, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
+ 0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3237, 0x2020, 0x20b9,
+ 0x1212, 0x2071, 0x0010, 0x70c3, 0x0004, 0x20c9, 0x41ff, 0x2089,
+ 0x1143, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
+ 0x0001, 0x3f00, 0x70d6, 0x20c1, 0x0008, 0x2009, 0xfeff, 0x2100,
+ 0x2003, 0xa5a5, 0xa084, 0x7fff, 0x2003, 0x0a0a, 0xa084, 0x3fff,
+ 0x2003, 0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x109f, 0x20c1,
+ 0x0000, 0x2100, 0x2003, 0xa5a5, 0xa084, 0x7fff, 0x2003, 0x0a0a,
+ 0xa084, 0x3fff, 0x2003, 0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040,
+ 0x109f, 0x2019, 0x7fff, 0xa392, 0x41ff, 0x0048, 0x109f, 0x20c1,
+ 0x0008, 0x2009, 0x7fff, 0x2100, 0x2003, 0x0a0a, 0xa084, 0x3fff,
+ 0x2003, 0x5050, 0x2114, 0xa286, 0x0a0a, 0x0040, 0x1092, 0x2019,
+ 0x3fff, 0xa392, 0x41ff, 0x0048, 0x1092, 0x20c1, 0x0004, 0x2009,
+ 0x3fff, 0x200b, 0x5050, 0x2114, 0xa286, 0x5050, 0x0040, 0x1092,
+ 0x0078, 0x114b, 0x98c0, 0xa188, 0x1000, 0x200b, 0xa5a5, 0x2114,
+ 0xa286, 0xa5a5, 0x0040, 0x109f, 0xa18a, 0x1000, 0x98c1, 0x2130,
+ 0xa18a, 0x0040, 0x2128, 0xa1a2, 0x3700, 0x8424, 0x8424, 0x8424,
+ 0x8424, 0x8424, 0x8424, 0xa192, 0x4200, 0x2009, 0x0000, 0x2001,
+ 0x002f, 0x1078, 0x19d8, 0x2218, 0x2079, 0x3700, 0x2fa0, 0x2408,
+ 0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x10ba,
+ 0x7eda, 0x7dce, 0x8528, 0x7dca, 0x7cd2, 0x7bd6, 0x2031, 0x0030,
+ 0x78b3, 0x0101, 0x780b, 0x0002, 0x780f, 0x0002, 0x784f, 0x0003,
+ 0x2069, 0x3740, 0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa,
+ 0x680f, 0x0008, 0x6813, 0x0005, 0x681f, 0x0000, 0x6823, 0x0006,
+ 0x6817, 0x0008, 0x6827, 0x0000, 0x2069, 0x3800, 0x2011, 0x0020,
+ 0x2009, 0x0010, 0x680b, 0x0c19, 0x680f, 0x0019, 0x6803, 0xfd00,
+ 0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004,
+ 0x8109, 0x00c0, 0x10ea, 0x2069, 0x3880, 0x20a9, 0x0080, 0x680b,
+ 0x0040, 0x7bd8, 0xa386, 0xfeff, 0x00c0, 0x110c, 0x6817, 0x0100,
+ 0x681f, 0x0064, 0x0078, 0x1110, 0x6817, 0x0064, 0x681f, 0x0002,
+ 0xade8, 0x0010, 0x0070, 0x1116, 0x0078, 0x10ff, 0x1078, 0x1c6a,
+ 0x1078, 0x319f, 0x1078, 0x1818, 0x1078, 0x363d, 0x3200, 0xa085,
+ 0x000d, 0x2090, 0x70c3, 0x0000, 0x0090, 0x112d, 0x70c0, 0xa086,
+ 0x0002, 0x00c0, 0x112d, 0x1078, 0x1262, 0x1078, 0x116e, 0x78b0,
+ 0xa005, 0x00c0, 0x1139, 0x1078, 0x19ff, 0x0068, 0x113d, 0x1078,
+ 0x1bc6, 0x0068, 0x113d, 0x1078, 0x190b, 0x00e0, 0x112d, 0x1078,
+ 0x34db, 0x0078, 0x112d, 0x114b, 0x114d, 0x1e10, 0x1e10, 0x31ff,
+ 0x31ff, 0x1e10, 0x1e10, 0x0078, 0x114b, 0x0078, 0x114d, 0x0078,
+ 0x114f, 0x0078, 0x1151, 0x2009, 0x0022, 0x2104, 0xa086, 0x4000,
+ 0x0040, 0x1169, 0x7008, 0x800b, 0x00c8, 0x1169, 0x7007, 0x0002,
+ 0xa08c, 0x0060, 0x00c0, 0x116a, 0xa084, 0x0008, 0x0040, 0x1169,
+ 0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x1265, 0x2061, 0x0000,
+ 0x6018, 0xa084, 0x0001, 0x00c0, 0x11df, 0x7814, 0xa005, 0x00c0,
+ 0x117d, 0x0010, 0x11e0, 0x0078, 0x11df, 0x2009, 0x3768, 0x2104,
+ 0xa005, 0x00c0, 0x11df, 0x2009, 0x3771, 0x200b, 0x0000, 0x7914,
+ 0xa186, 0x0042, 0x00c0, 0x11a2, 0x7816, 0x2009, 0x376f, 0x2164,
+ 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca, 0x611c, 0xa18c,
+ 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105, 0x70ce, 0x1078, 0x180a,
+ 0x0078, 0x11dd, 0x7814, 0xa086, 0x0018, 0x00c0, 0x11a9, 0x1078,
+ 0x15ba, 0x7817, 0x0000, 0x2009, 0x376f, 0x2104, 0xa065, 0x0040,
+ 0x11cd, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x186a, 0x0c7f, 0x609f,
+ 0x0000, 0x2009, 0x376a, 0x211c, 0x8108, 0x2114, 0x8108, 0x2104,
+ 0xa210, 0xa399, 0x0000, 0x2009, 0x001c, 0x6087, 0x0103, 0x1078,
+ 0x1791, 0x00c0, 0x11d9, 0x1078, 0x180a, 0x2009, 0x376f, 0x200b,
+ 0x0000, 0x2009, 0x3769, 0x2104, 0x200b, 0x0000, 0xa005, 0x0040,
+ 0x11dd, 0x2001, 0x4005, 0x0078, 0x1264, 0x0078, 0x1262, 0x007c,
+ 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000, 0x70cf, 0x0000,
+ 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1230, 0x2038, 0x0079, 0x11f0,
+ 0x1262, 0x12bb, 0x127f, 0x12bb, 0x1324, 0x1324, 0x1276, 0x1695,
+ 0x132f, 0x126e, 0x1283, 0x1285, 0x1287, 0x1289, 0x169a, 0x126e,
+ 0x133f, 0x136a, 0x15d2, 0x168f, 0x128b, 0x1532, 0x1554, 0x156a,
+ 0x1587, 0x14ef, 0x14fd, 0x1511, 0x1525, 0x13dd, 0x126e, 0x138b,
+ 0x1391, 0x1396, 0x139b, 0x13a1, 0x13a6, 0x13ab, 0x13b0, 0x13b5,
+ 0x13b9, 0x13ce, 0x13da, 0x126e, 0x126e, 0x126e, 0x126e, 0x13e9,
+ 0x13f2, 0x1401, 0x1427, 0x1431, 0x1438, 0x145e, 0x146d, 0x147c,
+ 0x148e, 0x14cf, 0x14df, 0x126e, 0x126e, 0x126e, 0x126e, 0x14e4,
+ 0xa0bc, 0xffa0, 0x00c0, 0x126e, 0x2038, 0xa084, 0x001f, 0x0079,
+ 0x1239, 0x16b1, 0x16b4, 0x16c4, 0x1740, 0x1779, 0x126e, 0x126e,
+ 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e,
+ 0x126e, 0x12b1, 0x131a, 0x1335, 0x1360, 0x15c8, 0x126e, 0x126e,
+ 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e,
+ 0x126e, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078, 0x1264, 0x73ce,
+ 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x2061, 0x0000, 0x601b,
+ 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x007c, 0x70c3, 0x4001,
+ 0x0078, 0x1265, 0x70c3, 0x4006, 0x0078, 0x1265, 0x2099, 0x0041,
+ 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078, 0x1262, 0x70c4,
+ 0x70c3, 0x0004, 0x007a, 0x0078, 0x1262, 0x0078, 0x1262, 0x0078,
+ 0x1262, 0x0078, 0x1262, 0x2091, 0x8000, 0x70c3, 0x0000, 0x70c7,
+ 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0001, 0x3f00,
+ 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031, 0x0030, 0x2059,
+ 0x1000, 0x2029, 0x0457, 0x2051, 0x0470, 0x2061, 0x0472, 0x20b9,
+ 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000, 0x2091, 0x4080, 0x0078,
+ 0x0455, 0x1078, 0x1978, 0x00c0, 0x1272, 0x75d8, 0x74dc, 0x75da,
+ 0x74de, 0x0078, 0x12be, 0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8,
+ 0x73cc, 0x70c4, 0x20a0, 0x2098, 0x2031, 0x0030, 0x81ff, 0x0040,
+ 0x1262, 0x7007, 0x0004, 0x731a, 0x721e, 0x7422, 0x7526, 0x2051,
+ 0x0012, 0x2049, 0x12f9, 0x2041, 0x1262, 0x7003, 0x0002, 0xa786,
+ 0x0001, 0x0040, 0x12e1, 0xa786, 0x0050, 0x0040, 0x12e1, 0x0078,
+ 0x12e7, 0x2049, 0x1306, 0x2041, 0x1312, 0x7003, 0x0003, 0x7017,
+ 0x0000, 0x810b, 0x7112, 0x00c8, 0x12ef, 0x7017, 0x0001, 0x7007,
+ 0x0001, 0xa786, 0x0001, 0x0040, 0x1306, 0xa786, 0x0050, 0x0040,
+ 0x1306, 0x700c, 0xa084, 0x007f, 0x2009, 0x0040, 0xa102, 0x8004,
+ 0x094a, 0x20a8, 0x26a0, 0x53a6, 0x0078, 0x1153, 0x700c, 0xa084,
+ 0x007f, 0x0040, 0x1306, 0x80ac, 0x0048, 0x1306, 0x2698, 0x53a5,
+ 0x0078, 0x1153, 0x700c, 0xa084, 0x007f, 0x80ac, 0x2698, 0x53a5,
+ 0x0078, 0x1262, 0x1078, 0x1978, 0x00c0, 0x1272, 0x75d8, 0x74dc,
+ 0x75da, 0x74de, 0x0078, 0x12be, 0x71c4, 0x70c8, 0x2114, 0xa79e,
+ 0x0004, 0x00c0, 0x132c, 0x200a, 0x72ca, 0x0078, 0x1261, 0x70c7,
+ 0x0001, 0x70cb, 0x001b, 0x0078, 0x1262, 0x1078, 0x1978, 0x00c0,
+ 0x1272, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x1342, 0x2029,
+ 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca,
+ 0x73ce, 0x74d2, 0xa005, 0x0040, 0x135a, 0x8001, 0x787a, 0x7a82,
+ 0x7b86, 0x7d8a, 0x7e8e, 0x7c7e, 0x78b0, 0xa084, 0xfffc, 0x78b2,
+ 0x0078, 0x135e, 0x78b0, 0xa085, 0x0001, 0x78b2, 0x0078, 0x1262,
+ 0x1078, 0x1978, 0x00c0, 0x1272, 0x75d8, 0x76dc, 0x75da, 0x76de,
+ 0x0078, 0x136d, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc,
+ 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x1385,
+ 0x8001, 0x7896, 0x7a9e, 0x7ba2, 0x7da6, 0x7eaa, 0x7c9a, 0x78b0,
+ 0xa084, 0xfcff, 0x78b2, 0x0078, 0x1389, 0x78b0, 0xa085, 0x0100,
+ 0x78b2, 0x0078, 0x1262, 0x2009, 0x375b, 0x210c, 0x7ad4, 0x0078,
+ 0x1260, 0x2009, 0x3741, 0x210c, 0x0078, 0x1261, 0x2009, 0x3742,
+ 0x210c, 0x0078, 0x1261, 0x2061, 0x3740, 0x610c, 0x6210, 0x0078,
+ 0x1260, 0x2009, 0x3745, 0x210c, 0x0078, 0x1261, 0x2009, 0x3746,
+ 0x210c, 0x0078, 0x1261, 0x2009, 0x3747, 0x210c, 0x0078, 0x1261,
+ 0x2009, 0x3748, 0x210c, 0x0078, 0x1261, 0x7908, 0x7a0c, 0x0078,
+ 0x1260, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
+ 0xa0e8, 0x3800, 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, 0x13cb,
+ 0x6b08, 0x0078, 0x13cc, 0x6b0c, 0x0078, 0x125f, 0x77c4, 0x1078,
+ 0x1828, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
+ 0x0078, 0x125f, 0x794c, 0x0078, 0x1261, 0x77c4, 0x1078, 0x1828,
+ 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091, 0x8001, 0x0078,
+ 0x125f, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x125a, 0x1078, 0x1cf0,
+ 0x0078, 0x125f, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x125a, 0x2011,
+ 0x3741, 0x2204, 0x007e, 0x2112, 0x1078, 0x1ca9, 0x017f, 0x0078,
+ 0x1261, 0x71c4, 0x2011, 0x141f, 0x20a9, 0x0008, 0x2204, 0xa106,
+ 0x0040, 0x1411, 0x8210, 0x0070, 0x140f, 0x0078, 0x1406, 0x0078,
+ 0x125a, 0xa292, 0x141f, 0x027e, 0x2011, 0x3742, 0x2204, 0x2112,
+ 0x017f, 0x007e, 0x1078, 0x1cb5, 0x017f, 0x0078, 0x1261, 0x03e8,
+ 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032, 0x004b, 0x2061,
+ 0x3740, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8, 0x6012, 0x0078,
+ 0x1260, 0x2061, 0x3740, 0x6114, 0x70c4, 0x6016, 0x0078, 0x1261,
+ 0x71c4, 0x2011, 0x0004, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040,
+ 0x1451, 0x2011, 0x0005, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040,
+ 0x1451, 0x2011, 0x0006, 0x2019, 0x2323, 0xa186, 0x003c, 0x00c0,
+ 0x125a, 0x2061, 0x3740, 0x6018, 0x007e, 0x611a, 0x23b8, 0x1078,
+ 0x1cc6, 0x1078, 0x363d, 0x017f, 0x0078, 0x1261, 0x71c4, 0xa184,
+ 0xffcf, 0x00c0, 0x125a, 0x2011, 0x3747, 0x2204, 0x2112, 0x007e,
+ 0x1078, 0x1ce8, 0x017f, 0x0078, 0x1261, 0x71c4, 0xa182, 0x0010,
+ 0x00c8, 0x125a, 0x2011, 0x3748, 0x2204, 0x007e, 0x2112, 0x1078,
+ 0x1cd7, 0x017f, 0x0078, 0x1261, 0x71c4, 0x72c8, 0xa184, 0xfffd,
+ 0x00c0, 0x1259, 0xa284, 0xfffd, 0x00c0, 0x1259, 0x2100, 0x7908,
+ 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x1260, 0x71c4, 0x8107,
+ 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, 0x3800, 0x2019,
+ 0x0000, 0x72c8, 0x6800, 0x007e, 0xa226, 0x0040, 0x14bd, 0x6a02,
+ 0xa484, 0x2000, 0x0040, 0x14a6, 0xa39d, 0x0010, 0xa484, 0x1000,
+ 0x0040, 0x14ac, 0xa39d, 0x0008, 0xa484, 0x4000, 0x0040, 0x14bd,
+ 0x810f, 0xa284, 0x4000, 0x0040, 0x14b9, 0x1078, 0x1d0a, 0x0078,
+ 0x14bd, 0x1078, 0x1cfc, 0x0078, 0x14bd, 0x72cc, 0x82ff, 0x0040,
+ 0x14c8, 0x6808, 0xa206, 0x0040, 0x14c8, 0x6a0a, 0xa39d, 0x000a,
+ 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x0078, 0x125f, 0x77c4,
+ 0x1078, 0x1828, 0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001,
+ 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708, 0x0078, 0x125f, 0x70c4,
+ 0x794c, 0x784e, 0x0078, 0x1261, 0x71c4, 0x72c8, 0x73cc, 0xa182,
+ 0x0010, 0x00c8, 0x125a, 0x1078, 0x1d18, 0x0078, 0x125f, 0x77c4,
+ 0x1078, 0x1828, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0002, 0x6a0a,
+ 0x2091, 0x8001, 0x2708, 0x0078, 0x1260, 0x77c4, 0x1078, 0x1828,
+ 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005,
+ 0x0040, 0x150c, 0x1078, 0x1c4b, 0x2091, 0x8001, 0x2708, 0x0078,
+ 0x1260, 0x77c4, 0x1078, 0x1828, 0x2091, 0x8000, 0x6a08, 0xa295,
+ 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1520, 0x1078, 0x1c4b,
+ 0x2091, 0x8001, 0x2708, 0x0078, 0x1260, 0x77c4, 0x2041, 0x0001,
+ 0x2049, 0x0005, 0x2051, 0x0020, 0x1078, 0x1835, 0x2708, 0x6a08,
+ 0x0078, 0x1260, 0x77c4, 0x73c8, 0x72cc, 0x77c6, 0x73ca, 0x72ce,
+ 0x1078, 0x18b0, 0x00c0, 0x1550, 0x6818, 0xa005, 0x0040, 0x154a,
+ 0x2708, 0x1078, 0x1d28, 0x00c0, 0x154a, 0x7817, 0x0015, 0x2091,
+ 0x8001, 0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x1264,
+ 0x2091, 0x8001, 0x0078, 0x1262, 0x77c4, 0x77c6, 0x2061, 0x3740,
+ 0x60a3, 0x0003, 0x67b6, 0x60c7, 0x0005, 0x2041, 0x0021, 0x2049,
+ 0x0005, 0x2051, 0x0020, 0x1078, 0x1835, 0x7817, 0x0016, 0x1078,
+ 0x1c4b, 0x007c, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2061, 0x3740,
+ 0x60a3, 0x0002, 0x67b6, 0x60c7, 0x0005, 0x7817, 0x0017, 0x1078,
+ 0x1c4b, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078,
+ 0x1835, 0x8738, 0xa784, 0x0007, 0x00c0, 0x157f, 0x007c, 0x78b0,
+ 0xa084, 0x0003, 0x00c0, 0x15ab, 0x2039, 0x0000, 0x2041, 0x0021,
+ 0x2049, 0x0004, 0x2051, 0x0008, 0x1078, 0x1828, 0x2091, 0x8000,
+ 0x6808, 0xa80d, 0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x0007,
+ 0x00c0, 0x1594, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784,
+ 0x0f00, 0x00c0, 0x1594, 0x7817, 0x0018, 0x2061, 0x3740, 0x60a3,
+ 0x0001, 0x60c7, 0x0005, 0x1078, 0x1c4b, 0x78b0, 0xa085, 0x0002,
+ 0x78b2, 0x007c, 0x78b0, 0xa084, 0xfffd, 0x78b2, 0xa084, 0x0001,
+ 0x00c0, 0x15c4, 0x1078, 0x18f2, 0x71c4, 0x71c6, 0x794a, 0x007c,
+ 0x1078, 0x1978, 0x00c0, 0x1272, 0x75d8, 0x74dc, 0x75da, 0x74de,
+ 0x0078, 0x15d5, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc,
+ 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x3700, 0x1078, 0x1801, 0x0040,
+ 0x167d, 0x20a9, 0x0005, 0x20a1, 0x3716, 0x41a1, 0x2009, 0x0040,
+ 0x1078, 0x17cb, 0x0040, 0x15f0, 0x1078, 0x180a, 0x0078, 0x167d,
+ 0x6004, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x1651, 0x0c7e,
+ 0x2c68, 0x1078, 0x1801, 0x0040, 0x1620, 0x2c00, 0x689e, 0x8109,
+ 0x00c0, 0x15f8, 0x609f, 0x0000, 0x0c7f, 0x0c7e, 0x7218, 0x731c,
+ 0x7420, 0x7524, 0x2c68, 0x689c, 0xa065, 0x0040, 0x1650, 0x2009,
+ 0x0040, 0x1078, 0x17cb, 0x00c0, 0x1639, 0x6004, 0xa084, 0x00ff,
+ 0xa086, 0x0002, 0x00c0, 0x1620, 0x2d00, 0x6002, 0x0078, 0x1606,
+ 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x186a, 0x0c7f, 0x609f,
+ 0x0000, 0x1078, 0x1681, 0x2009, 0x001c, 0x6008, 0xa085, 0x0200,
+ 0x600a, 0x6004, 0x6086, 0x1078, 0x1791, 0x1078, 0x180a, 0x0078,
+ 0x167d, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x186a, 0x0c7f,
+ 0x609f, 0x0000, 0x1078, 0x1681, 0x2009, 0x001c, 0x6087, 0x0103,
+ 0x601b, 0x0003, 0x1078, 0x1791, 0x1078, 0x180a, 0x0078, 0x167d,
+ 0x0c7f, 0x74c4, 0x73c8, 0x72cc, 0x6014, 0x7817, 0x0012, 0x0e7e,
+ 0x2071, 0x3740, 0x70a3, 0x0005, 0x70a7, 0x0000, 0x73aa, 0x72ae,
+ 0x74b2, 0x70b6, 0x70bb, 0x0000, 0x2c00, 0x70be, 0x70c3, 0x0000,
+ 0xa02e, 0x2530, 0x611c, 0xa184, 0x0060, 0x0040, 0x1671, 0x1078,
+ 0x3143, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x669a, 0x60af, 0x0000,
+ 0x60b3, 0x0000, 0x1078, 0x1c4b, 0x007c, 0x70c3, 0x4005, 0x0078,
+ 0x1265, 0x20a9, 0x0005, 0x2099, 0x3716, 0x530a, 0x2100, 0xa210,
+ 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4,
+ 0x70c7, 0x0000, 0x7906, 0x0078, 0x1262, 0x71c4, 0x71c6, 0x2168,
+ 0x0078, 0x169c, 0x2069, 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210,
+ 0x8d68, 0x8109, 0x00c0, 0x169e, 0xa285, 0x0000, 0x00c0, 0x16ac,
+ 0x70c3, 0x4000, 0x0078, 0x16ae, 0x70c3, 0x4003, 0x70ca, 0x0078,
+ 0x1265, 0x79c8, 0x0078, 0x1261, 0x71c4, 0x71c6, 0x2198, 0x20a1,
+ 0x0042, 0x20a9, 0x0004, 0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9,
+ 0x0004, 0x53a3, 0x0078, 0x1262, 0x70c4, 0x2068, 0x2079, 0x3700,
+ 0x1078, 0x1801, 0x0040, 0x173c, 0x6007, 0x0001, 0x600b, 0x0000,
+ 0x602b, 0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x0007, 0xa284,
+ 0x00f0, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016, 0xa284,
+ 0x0800, 0x0040, 0x16e7, 0x601b, 0x000a, 0x0078, 0x16ed, 0xa284,
+ 0x1000, 0x0040, 0x16ed, 0x601b, 0x000c, 0xa284, 0x0300, 0x0040,
+ 0x16f6, 0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085, 0x0001,
+ 0x601e, 0x6023, 0x0000, 0x6027, 0x000a, 0xa284, 0x0400, 0x0040,
+ 0x1703, 0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b, 0x20a0,
+ 0xad80, 0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0, 0x1718,
+ 0x6046, 0x604a, 0x604e, 0x6052, 0x6096, 0x609a, 0x0078, 0x1722,
+ 0x6800, 0x6046, 0x6804, 0x604a, 0x6e08, 0x664e, 0x6d0c, 0x6552,
+ 0x6596, 0x669a, 0x6014, 0x7817, 0x0042, 0x2c08, 0x2061, 0x3740,
+ 0x60a3, 0x0005, 0x60a7, 0x0000, 0x60ab, 0x0000, 0x60af, 0x0000,
+ 0x60b3, 0x0000, 0x60b6, 0x61be, 0xa284, 0x0400, 0x60c2, 0x1078,
+ 0x312e, 0x1078, 0x1c4b, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1265,
+ 0x78e0, 0xa005, 0x0040, 0x126e, 0x2091, 0x8000, 0x70c4, 0x800a,
+ 0x2011, 0x0010, 0x810c, 0x0048, 0x1752, 0x3a00, 0xa084, 0xfff7,
+ 0x0078, 0x1755, 0x3a00, 0xa085, 0x0008, 0x20d0, 0x0005, 0x0005,
+ 0xa084, 0xfffb, 0x20d0, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
+ 0x0005, 0x0005, 0x0005, 0xa085, 0x0004, 0x20d0, 0x0005, 0x0005,
+ 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x8211, 0x00c0,
+ 0x174a, 0x3a00, 0xa085, 0x0008, 0x20d0, 0x2091, 0x8001, 0x0078,
+ 0x1262, 0x2011, 0x04fd, 0x2204, 0xa082, 0x0004, 0x0048, 0x178d,
+ 0x78e3, 0x0001, 0x2009, 0xff01, 0x200a, 0x2001, 0x000c, 0x20d8,
+ 0x2001, 0x000c, 0x20d0, 0x0078, 0x1262, 0x2001, 0x4005, 0x0078,
+ 0x1264, 0x700c, 0xa084, 0x00ff, 0x0040, 0x179d, 0x7007, 0x0004,
+ 0x7004, 0xa084, 0x0004, 0x00c0, 0x1798, 0x7017, 0x0000, 0x7112,
+ 0x721a, 0x731e, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108, 0x810c,
+ 0x81a9, 0x8098, 0x20a1, 0x0030, 0x6084, 0x20a2, 0x53a6, 0x780c,
+ 0xa085, 0x0000, 0x7002, 0x7007, 0x0001, 0x2009, 0x0022, 0x2104,
+ 0xa084, 0x4000, 0x00c0, 0x17b5, 0x7108, 0x8103, 0x00c8, 0x17b5,
+ 0x7014, 0xa005, 0x0040, 0x17b5, 0x7007, 0x0002, 0xa184, 0x0060,
+ 0x7003, 0x0000, 0x007c, 0x700c, 0xa084, 0x00ff, 0x0040, 0x17d7,
+ 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x17d2, 0x7017,
+ 0x0000, 0x7112, 0x721a, 0x7422, 0x7526, 0x731e, 0x2099, 0x0030,
+ 0x8108, 0x81ac, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, 0x0001,
+ 0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x17e8, 0x7008,
+ 0x800b, 0x00c8, 0x17e8, 0x7007, 0x0002, 0xa08c, 0x0060, 0x00c0,
+ 0x17fe, 0xac80, 0x0001, 0x20a0, 0x53a5, 0xa006, 0x7003, 0x0000,
+ 0x007c, 0x7850, 0xa065, 0x0040, 0x1809, 0x2c04, 0x7852, 0x2063,
+ 0x0000, 0x007c, 0x0f7e, 0x2079, 0x3700, 0x7850, 0x2062, 0x2c00,
+ 0xa005, 0x00c0, 0x1815, 0x1078, 0x1e01, 0x7852, 0x0f7f, 0x007c,
+ 0x2011, 0x4200, 0x7a52, 0x7bd4, 0x8319, 0x0040, 0x1825, 0xa280,
+ 0x002f, 0x2012, 0x2010, 0x0078, 0x181c, 0x2013, 0x0000, 0x007c,
+ 0xa784, 0x0f00, 0x800c, 0xa784, 0x0007, 0x8003, 0x8003, 0x8003,
+ 0x8003, 0xa105, 0xa0e8, 0x3880, 0x007c, 0x1078, 0x1828, 0x2900,
+ 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xffef, 0xa80d, 0x690a,
+ 0x2091, 0x8000, 0x2009, 0x374f, 0x210c, 0x6804, 0xa005, 0x0040,
+ 0x1852, 0xa116, 0x00c0, 0x1852, 0x2060, 0x6000, 0x6806, 0x017e,
+ 0x0078, 0x1855, 0x2009, 0x0000, 0x017e, 0x6804, 0xa065, 0x0040,
+ 0x1864, 0x6000, 0x6806, 0x1078, 0x1877, 0x1078, 0x197e, 0x6810,
+ 0x8001, 0x6812, 0x00c0, 0x1855, 0x017f, 0x6902, 0x6906, 0x2091,
+ 0x8001, 0x007c, 0xa065, 0x0040, 0x1876, 0x609c, 0x609f, 0x0000,
+ 0x2008, 0x1078, 0x180a, 0x2100, 0x0078, 0x186a, 0x007c, 0x6007,
+ 0x0103, 0x20a9, 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000,
+ 0x40a4, 0x6828, 0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0x2071,
+ 0x3740, 0x7040, 0xa08c, 0x0080, 0x00c0, 0x1894, 0xa088, 0x3780,
+ 0x2d0a, 0x8000, 0x7042, 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
+ 0x3740, 0x2009, 0x3780, 0x7240, 0x8221, 0x8211, 0x0048, 0x18ae,
+ 0x2104, 0x8108, 0xad06, 0x00c0, 0x189d, 0x8119, 0x211e, 0x8108,
+ 0x8318, 0x8211, 0x00c8, 0x18a6, 0x7442, 0xa006, 0x0e7f, 0x007c,
+ 0x1078, 0x1828, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065, 0x0040,
+ 0x18f1, 0x0078, 0x18c1, 0x2c00, 0x781e, 0x6000, 0xa065, 0x0040,
+ 0x18f1, 0x6010, 0xa306, 0x00c0, 0x18bb, 0x600c, 0xa206, 0x00c0,
+ 0x18bb, 0x2c28, 0x6804, 0xac06, 0x00c0, 0x18d8, 0x6000, 0x2060,
+ 0x6806, 0xa005, 0x00c0, 0x18d8, 0x6803, 0x0000, 0x0078, 0x18e2,
+ 0x6400, 0x781c, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x18e2,
+ 0x2c00, 0x6802, 0x2560, 0x1078, 0x1877, 0x601b, 0x0005, 0x6023,
+ 0x0020, 0x1078, 0x197e, 0x6810, 0x8001, 0x6812, 0x2001, 0xffff,
+ 0xa005, 0x007c, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004,
+ 0x2051, 0x0008, 0x1078, 0x1835, 0x8738, 0xa784, 0x0007, 0x00c0,
+ 0x18fa, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00,
+ 0x00c0, 0x18fa, 0x007c, 0x2061, 0x0000, 0x6018, 0xa084, 0x0001,
+ 0x00c0, 0x191c, 0x2091, 0x8001, 0x78c4, 0x78c7, 0x0000, 0x2091,
+ 0x8001, 0xa005, 0x00c0, 0x191d, 0x007c, 0xa08c, 0xfff0, 0x0040,
+ 0x1923, 0x1078, 0x1e01, 0x0079, 0x1925, 0x1935, 0x1937, 0x193d,
+ 0x1941, 0x1935, 0x1945, 0x1935, 0x194c, 0x1950, 0x1954, 0x1935,
+ 0x1935, 0x1935, 0x1935, 0x1935, 0x1935, 0x1078, 0x1e01, 0x1078,
+ 0x18f2, 0x2001, 0x8001, 0x0078, 0x1264, 0x2001, 0x8003, 0x0078,
+ 0x1264, 0x2001, 0x8004, 0x0078, 0x1264, 0x1078, 0x18f2, 0x2001,
+ 0x8006, 0x007c, 0x0078, 0x1264, 0x2001, 0x8008, 0x0078, 0x1264,
+ 0x2001, 0x8009, 0x0078, 0x1264, 0x2091, 0x8000, 0x2069, 0x3740,
+ 0x6800, 0xa086, 0x0000, 0x0040, 0x1962, 0x2091, 0x8001, 0x78c7,
+ 0x0009, 0x007c, 0x68b4, 0xa0bc, 0xff00, 0x2091, 0x8000, 0x2041,
+ 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078, 0x1835, 0x8738,
+ 0xa784, 0x0007, 0x00c0, 0x196d, 0x2001, 0x800a, 0x0078, 0x1264,
+ 0x2001, 0x04fd, 0x2004, 0xa086, 0x0004, 0x007c, 0x6004, 0x6086,
+ 0x2c08, 0x2063, 0x0000, 0x786c, 0x8000, 0x786e, 0x7870, 0xa005,
+ 0x7972, 0x0040, 0x198e, 0x2c02, 0x0078, 0x198f, 0x7976, 0x007c,
+ 0x0c7e, 0x2061, 0x3700, 0x6887, 0x0103, 0x2d08, 0x206b, 0x0000,
+ 0x606c, 0x8000, 0x606e, 0x6070, 0xa005, 0x6172, 0x0040, 0x19a3,
+ 0x2d02, 0x0078, 0x19a4, 0x6176, 0x0c7f, 0x007c, 0x1078, 0x19b7,
+ 0x0040, 0x19b6, 0x0c7e, 0x609c, 0xa065, 0x0040, 0x19b1, 0x1078,
+ 0x186a, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x180a, 0x007c, 0x7874,
+ 0xa065, 0x0040, 0x19c9, 0x2091, 0x8000, 0x786c, 0x8001, 0x786e,
+ 0x2c04, 0x7876, 0xa005, 0x00c0, 0x19c7, 0x7872, 0x8000, 0x2091,
+ 0x8001, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e,
+ 0x00c8, 0x19d3, 0xa200, 0x00f0, 0x19ce, 0x8086, 0x818e, 0x007c,
+ 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x19f9, 0xa11a, 0x00c8,
+ 0x19f9, 0x8213, 0x818d, 0x0048, 0x19ec, 0xa11a, 0x00c8, 0x19ed,
+ 0x00f0, 0x19e1, 0x0078, 0x19f1, 0xa11a, 0x2308, 0x8210, 0x00f0,
+ 0x19e1, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f,
+ 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x19f5, 0x797c,
+ 0x70d0, 0xa106, 0x0040, 0x1a4d, 0x2091, 0x8000, 0x2071, 0x0020,
+ 0x7004, 0xa005, 0x00c0, 0x1a4d, 0x7008, 0x7208, 0xa206, 0x00c0,
+ 0x1a4d, 0xa084, 0x4000, 0x00c0, 0x1a4d, 0x2071, 0x0010, 0x1078,
+ 0x1801, 0x0040, 0x1a4d, 0x7a84, 0x7b80, 0x7c8c, 0x7d88, 0x8107,
+ 0x8004, 0x8004, 0xa210, 0xa399, 0x0000, 0x2009, 0x0040, 0x1078,
+ 0x17cb, 0x2091, 0x8001, 0x0040, 0x1a44, 0x1078, 0x180a, 0x7890,
+ 0x8000, 0x7892, 0xa086, 0x0002, 0x00c0, 0x1a4d, 0x2091, 0x8000,
+ 0x78c7, 0x0002, 0x7893, 0x0000, 0x78b0, 0xa085, 0x0003, 0x78b2,
+ 0x2091, 0x8001, 0x0078, 0x1a4d, 0x7893, 0x0000, 0x1078, 0x1b8f,
+ 0x6004, 0xa084, 0x000f, 0x0079, 0x1a52, 0x2071, 0x0010, 0x2091,
+ 0x8001, 0x007c, 0x1a62, 0x1a77, 0x1a9d, 0x1a62, 0x1aaf, 0x1a62,
+ 0x1a62, 0x1a62, 0x1a62, 0x1a71, 0x1a97, 0x1a62, 0x1a62, 0x1a62,
+ 0x1a62, 0x1a62, 0x2039, 0x0400, 0x78c0, 0xa705, 0x78c2, 0x6008,
+ 0xa705, 0x600a, 0x1078, 0x1aed, 0x609c, 0x78be, 0x1078, 0x1b77,
+ 0x007c, 0x1078, 0x1978, 0x00c0, 0x1a62, 0x1078, 0x1ba9, 0x78c0,
+ 0xa084, 0x0100, 0x0040, 0x1a7e, 0x0078, 0x1a62, 0x78c3, 0x0000,
+ 0x6004, 0x8007, 0xa084, 0x00ff, 0x78b6, 0x8001, 0x609f, 0x0000,
+ 0x0040, 0x1a94, 0x1078, 0x1aed, 0x0040, 0x1a94, 0x78c0, 0xa085,
+ 0x0100, 0x78c2, 0x0078, 0x1a96, 0x1078, 0x1b11, 0x007c, 0x1078,
+ 0x1978, 0x00c0, 0x1a62, 0x1078, 0x1ba5, 0x78c0, 0xa08c, 0x0e00,
+ 0x00c0, 0x1aa6, 0xa084, 0x0100, 0x00c0, 0x1aa8, 0x0078, 0x1a62,
+ 0x1078, 0x1aed, 0x00c0, 0x1aae, 0x1078, 0x1b11, 0x007c, 0x78c0,
+ 0xa084, 0x0100, 0x0040, 0x1ab6, 0x0078, 0x1a62, 0x78c3, 0x0000,
+ 0x6714, 0x20a9, 0x0001, 0x6018, 0xa005, 0x0040, 0x1ad1, 0xa7bc,
+ 0xff00, 0x20a9, 0x0008, 0xa08e, 0x0001, 0x0040, 0x1ad1, 0x2039,
+ 0x0000, 0x20a9, 0x0080, 0xa08e, 0x0002, 0x0040, 0x1ad1, 0x0078,
+ 0x1aea, 0x1078, 0x1828, 0x2d00, 0xa088, 0x0002, 0x2091, 0x8000,
+ 0x2168, 0x682b, 0x0000, 0x682f, 0x0000, 0x2104, 0xa084, 0xffde,
+ 0x200a, 0x2100, 0xa088, 0x0010, 0x2091, 0x8001, 0x0070, 0x1aea,
+ 0x0078, 0x1ad6, 0x1078, 0x180a, 0x007c, 0x78b8, 0xa06d, 0x00c0,
+ 0x1af8, 0x2c00, 0x78ba, 0x78be, 0x609f, 0x0000, 0x0078, 0x1b04,
+ 0x2c00, 0x689e, 0x609f, 0x0000, 0x78ba, 0x2d00, 0x6002, 0x78bc,
+ 0xad06, 0x00c0, 0x1b04, 0x6002, 0x78b4, 0x8001, 0x78b6, 0x00c0,
+ 0x1b10, 0x78c0, 0xa084, 0x0000, 0x78c2, 0x78bc, 0x2060, 0xa006,
+ 0x007c, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0xf9ff, 0x601e,
+ 0xa184, 0x0060, 0x0040, 0x1b20, 0x0e7e, 0x1078, 0x3143, 0x0e7f,
+ 0x6596, 0x669a, 0x6714, 0x1078, 0x1828, 0x2091, 0x8000, 0x6808,
+ 0xa084, 0x0001, 0x0040, 0x1b3c, 0x2091, 0x8001, 0x1078, 0x1877,
+ 0x2091, 0x8000, 0x1078, 0x197e, 0x2091, 0x8001, 0x78bb, 0x0000,
+ 0x78bf, 0x0000, 0x0078, 0x1b76, 0x6024, 0xa096, 0x0001, 0x00c0,
+ 0x1b43, 0x8000, 0x6026, 0x6a10, 0x6814, 0x2091, 0x8001, 0xa202,
+ 0x0048, 0x1b52, 0x0040, 0x1b52, 0x2039, 0x0200, 0x1078, 0x1b77,
+ 0x0078, 0x1b76, 0x2c08, 0x2091, 0x8000, 0x6800, 0xa065, 0x0040,
+ 0x1b5a, 0x6102, 0x6902, 0x00c0, 0x1b5e, 0x6906, 0x2160, 0x6003,
+ 0x0000, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001, 0x6808, 0xa08c,
+ 0x0040, 0x0040, 0x1b70, 0xa086, 0x0040, 0x680a, 0x1078, 0x1886,
+ 0x1078, 0x1c4b, 0x78bf, 0x0000, 0x78bb, 0x0000, 0x007c, 0x6008,
+ 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x197e, 0x2091, 0x8001,
+ 0x78bc, 0xa065, 0x0040, 0x1b8a, 0x609c, 0x78be, 0x609f, 0x0000,
+ 0x0078, 0x1b7a, 0x78bb, 0x0000, 0x78bf, 0x0000, 0x007c, 0x7978,
+ 0x787c, 0x8000, 0xa10a, 0x00c8, 0x1b96, 0xa006, 0x787e, 0x70d2,
+ 0x7804, 0xa005, 0x0040, 0x1ba4, 0x8001, 0x7806, 0x00c0, 0x1ba4,
+ 0x0068, 0x1ba4, 0x2091, 0x4080, 0x007c, 0x2039, 0x1bbd, 0x0078,
+ 0x1bab, 0x2039, 0x1bc3, 0x2704, 0xa005, 0x0040, 0x1bbc, 0xac00,
+ 0x2068, 0x6b08, 0x6c0c, 0x6910, 0x6a14, 0x690a, 0x6a0e, 0x6b12,
+ 0x6c16, 0x8738, 0x0078, 0x1bab, 0x007c, 0x0003, 0x0009, 0x000f,
+ 0x0015, 0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x0068, 0x1bde,
+ 0x2029, 0x0000, 0x7874, 0xa065, 0x0040, 0x1bd9, 0x1078, 0x1bdf,
+ 0x0040, 0x1bd9, 0x1078, 0x1bee, 0x00c0, 0x1bd9, 0x8528, 0x0078,
+ 0x1bca, 0x85ff, 0x0040, 0x1bde, 0x2091, 0x4080, 0x007c, 0x7b94,
+ 0x7998, 0x70d4, 0xa102, 0x00c0, 0x1be8, 0x2300, 0xa005, 0x007c,
+ 0x0048, 0x1bec, 0xa302, 0x007c, 0x8002, 0x007c, 0x2091, 0x8000,
+ 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1c32, 0x7008, 0x7208,
+ 0xa206, 0x00c0, 0x1c32, 0xa084, 0x4000, 0x00c0, 0x1c32, 0x2071,
+ 0x0010, 0x1078, 0x1c37, 0x2009, 0x001c, 0x6028, 0xa005, 0x0040,
+ 0x1c0b, 0x2009, 0x0040, 0x1078, 0x1791, 0x0040, 0x1c24, 0x78ac,
+ 0x8000, 0x78ae, 0xa086, 0x0002, 0x00c0, 0x1c32, 0x2091, 0x8000,
+ 0x78c7, 0x0003, 0x78af, 0x0000, 0x78b0, 0xa085, 0x0300, 0x78b2,
+ 0x2091, 0x8001, 0x0078, 0x1c32, 0x78af, 0x0000, 0x1078, 0x19a6,
+ 0x7994, 0x7898, 0x8000, 0xa10a, 0x00c8, 0x1c2f, 0xa006, 0x789a,
+ 0x70d6, 0xa006, 0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x8107,
+ 0x8004, 0x8004, 0x7aa0, 0x7b9c, 0x7ca8, 0x7da4, 0xa210, 0xa399,
+ 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x2009, 0x3768,
+ 0x2091, 0x8000, 0x200a, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3740,
+ 0x2091, 0x8000, 0x2104, 0xa086, 0x0000, 0x00c0, 0x1c66, 0x2009,
+ 0x3712, 0x2104, 0xa005, 0x00c0, 0x1c66, 0x7830, 0xa084, 0x00c0,
+ 0x00c0, 0x1c66, 0x0018, 0x1c66, 0x781b, 0x0045, 0x2091, 0x8001,
+ 0x0f7f, 0x007c, 0x127e, 0x2091, 0x2300, 0x2071, 0x3740, 0x2079,
+ 0x0100, 0x784b, 0x000f, 0x2019, 0x3041, 0x20a1, 0x012b, 0x2304,
+ 0xa005, 0x0040, 0x1c84, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398,
+ 0x53a6, 0x3318, 0x0078, 0x1c77, 0x789b, 0x0020, 0x20a9, 0x0010,
+ 0x78af, 0x0000, 0x78af, 0x0020, 0x0070, 0x1c90, 0x0078, 0x1c88,
+ 0x7003, 0x0000, 0x1078, 0x1d95, 0x7004, 0xa084, 0x000f, 0xa085,
+ 0x6280, 0x7806, 0x780f, 0x9200, 0x7843, 0x00d8, 0x7853, 0x0080,
+ 0x780b, 0x0008, 0x7047, 0x377f, 0x7043, 0x0000, 0x127f, 0x2000,
+ 0x007c, 0xa18c, 0x000f, 0x2011, 0x0101, 0x2204, 0xa084, 0xfff0,
+ 0xa105, 0x2012, 0x1078, 0x1d95, 0x007c, 0x2011, 0x0101, 0x20a9,
+ 0x0009, 0x810b, 0x0070, 0x1cbe, 0x0078, 0x1cb9, 0xa18c, 0x0e00,
+ 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2009, 0x0101,
+ 0x20a9, 0x0005, 0x8213, 0x0070, 0x1ccf, 0x0078, 0x1cca, 0xa294,
+ 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x007c, 0x2011,
+ 0x0101, 0x20a9, 0x000c, 0x810b, 0x0070, 0x1ce0, 0x0078, 0x1cdb,
+ 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c,
+ 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c,
+ 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a,
+ 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022,
+ 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae,
+ 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061,
+ 0x0100, 0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c,
+ 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a,
+ 0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c,
+ 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, 0x1d71, 0x2061, 0x4180,
+ 0x1078, 0x1d77, 0x0040, 0x1d5b, 0x20a9, 0x0000, 0x2061, 0x4080,
+ 0x0c7e, 0x1078, 0x1d77, 0x0040, 0x1d45, 0x0c7f, 0x8c60, 0x0070,
+ 0x1d43, 0x0078, 0x1d38, 0x0078, 0x1d71, 0x007f, 0xa082, 0x4080,
+ 0x2071, 0x3740, 0x70ba, 0x6020, 0xa085, 0x0800, 0x6022, 0x2091,
+ 0x8001, 0x71b6, 0x2001, 0x0004, 0x70a2, 0x70c7, 0x0005, 0x1078,
+ 0x1c46, 0x0078, 0x1d6d, 0x2071, 0x3740, 0x6020, 0xa085, 0x0800,
+ 0x6022, 0x2091, 0x8001, 0x71b6, 0x2c00, 0x70be, 0x2001, 0x0006,
+ 0x70a2, 0x70c7, 0x0005, 0x1078, 0x1c46, 0x2001, 0x0000, 0x0078,
+ 0x1d73, 0x2001, 0x0001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2091,
+ 0x8000, 0x2c04, 0xa005, 0x0040, 0x1d90, 0x2060, 0x6010, 0xa306,
+ 0x00c0, 0x1d8d, 0x600c, 0xa206, 0x00c0, 0x1d8d, 0x6014, 0xa106,
+ 0x00c0, 0x1d8d, 0xa006, 0x0078, 0x1d94, 0x6000, 0x0078, 0x1d7a,
+ 0xa085, 0x0001, 0x2091, 0x8001, 0x007c, 0x2011, 0x3741, 0x220c,
+ 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204, 0xa084, 0x0100, 0x0040,
+ 0x1dab, 0x2021, 0xff00, 0x2122, 0x810b, 0x810b, 0x810b, 0x810b,
+ 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e, 0x68e4, 0xa08c, 0x0020,
+ 0x0040, 0x1dff, 0xa084, 0x0006, 0x00c0, 0x1dff, 0x6014, 0x8007,
+ 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0f0, 0x3800, 0x7004,
+ 0xa084, 0x000a, 0x00c0, 0x1dff, 0x7108, 0xa194, 0xff00, 0x0040,
+ 0x1dff, 0xa18c, 0x00ff, 0x2001, 0x000c, 0xa106, 0x0040, 0x1de6,
+ 0x2001, 0x0012, 0xa106, 0x0040, 0x1dea, 0x2001, 0x0014, 0xa106,
+ 0x0040, 0x1dee, 0x2001, 0x0019, 0xa106, 0x0040, 0x1df2, 0x2001,
+ 0x0032, 0xa106, 0x0040, 0x1df6, 0x0078, 0x1dfa, 0x2009, 0x0012,
+ 0x0078, 0x1dfc, 0x2009, 0x0014, 0x0078, 0x1dfc, 0x2009, 0x0019,
+ 0x0078, 0x1dfc, 0x2009, 0x0020, 0x0078, 0x1dfc, 0x2009, 0x003f,
+ 0x0078, 0x1dfc, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x0e7f,
+ 0x007c, 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002,
+ 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x1e0e,
+ 0x107e, 0x007e, 0x127e, 0x2091, 0x2300, 0x7f3c, 0x7e58, 0x7c30,
+ 0x7d38, 0x2009, 0x3774, 0x78a0, 0x200a, 0x8108, 0x250a, 0x8108,
+ 0x240a, 0x8108, 0x260a, 0x8108, 0x270a, 0xa594, 0x003f, 0xa484,
+ 0x4000, 0x0040, 0x1e31, 0xa784, 0x007c, 0x00c0, 0x2fcb, 0x1078,
+ 0x1e01, 0xa49c, 0x000f, 0xa382, 0x0004, 0x0050, 0x1e39, 0x1078,
+ 0x1e01, 0x8507, 0xa084, 0x000f, 0x0079, 0x1e3e, 0x2272, 0x2311,
+ 0x232e, 0x2572, 0x27b6, 0x27f9, 0x2842, 0x28a0, 0x2908, 0x2995,
+ 0x1e66, 0x1e4e, 0x20db, 0x21a0, 0x2795, 0x1e4e, 0x1078, 0x1e01,
+ 0x0018, 0x1e15, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c,
+ 0x7003, 0x0000, 0x703f, 0x0000, 0x7030, 0xa005, 0x0040, 0x1e62,
+ 0x7033, 0x0000, 0x1078, 0x2fa6, 0x0018, 0x1e15, 0x2009, 0x370f,
+ 0x200b, 0x0000, 0x705c, 0xa005, 0x00c0, 0x1f2e, 0x70a0, 0xa084,
+ 0x0007, 0x0079, 0x1e73, 0x1f51, 0x1e7b, 0x1e89, 0x1ea4, 0x1ec4,
+ 0x1f0c, 0x1ee8, 0x1e7b, 0x7808, 0xa084, 0xfffd, 0x780a, 0x2009,
+ 0x0047, 0x1078, 0x269a, 0x00c0, 0x1e87, 0x7003, 0x0004, 0x0078,
+ 0x1e50, 0x1078, 0x2f8d, 0x00c0, 0x1ea2, 0x70b4, 0x8007, 0x7882,
+ 0x789b, 0x0010, 0x78ab, 0x000c, 0x789b, 0x0060, 0x78ab, 0x0001,
+ 0x785b, 0x0004, 0x2009, 0x00f8, 0x1078, 0x2698, 0x00c0, 0x1ea2,
+ 0x7003, 0x0004, 0x0078, 0x1e50, 0x1078, 0x2f8d, 0x00c0, 0x1ec2,
+ 0x71b4, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x0007, 0xa18d,
+ 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002,
+ 0x785b, 0x0004, 0x2009, 0x00f8, 0x1078, 0x2698, 0x00c0, 0x1ec2,
+ 0x7003, 0x0004, 0x0078, 0x1e50, 0x1078, 0x2f8d, 0x00c0, 0x1ee6,
+ 0x71b4, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x0007, 0xa18d,
+ 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x71b8, 0x79aa, 0x78ab, 0x000d,
+ 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009, 0x00f8,
+ 0x1078, 0x2698, 0x00c0, 0x1ee6, 0x7003, 0x0004, 0x0078, 0x1e50,
+ 0x1078, 0x2f8d, 0x00c0, 0x1f0a, 0x71b4, 0x8107, 0x789b, 0x0010,
+ 0xa18c, 0x0007, 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b,
+ 0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009, 0x00f8, 0x1078,
+ 0x2698, 0x00c0, 0x1f0a, 0x70bc, 0x70bf, 0x0000, 0x2068, 0x703e,
+ 0x7003, 0x0002, 0x0078, 0x1e50, 0x1078, 0x2f8d, 0x00c0, 0x1e50,
+ 0x70bc, 0x2068, 0x1078, 0x302f, 0x789b, 0x0010, 0x6814, 0xa084,
+ 0x0007, 0xa085, 0x0080, 0x007e, 0x007f, 0x78aa, 0x6e1c, 0x067e,
+ 0x067f, 0x2041, 0x0001, 0x70c0, 0xa084, 0x0400, 0x2001, 0x0004,
+ 0x0040, 0x1f2c, 0x2001, 0x0006, 0x0078, 0x202d, 0x1078, 0x2f8d,
+ 0x00c0, 0x1e50, 0x789b, 0x0010, 0x705c, 0x2068, 0x1078, 0x302f,
+ 0x6f14, 0x1078, 0x2ed5, 0x6008, 0xa085, 0x0010, 0x600a, 0xad80,
+ 0x0009, 0x2003, 0x0005, 0x6814, 0xa084, 0x0007, 0xa085, 0x0080,
+ 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0078,
+ 0x202d, 0x0018, 0x1e15, 0x7440, 0xa485, 0x0000, 0x0040, 0x1f6b,
+ 0xa080, 0x3780, 0x2030, 0x7144, 0x8108, 0xa12a, 0x0048, 0x1f62,
+ 0x2009, 0x3780, 0x2164, 0x6504, 0x85ff, 0x00c0, 0x1f78, 0x8421,
+ 0x00c0, 0x1f5c, 0x7146, 0x7003, 0x0000, 0x703f, 0x0000, 0x0078,
+ 0x1e50, 0x7640, 0xa6b0, 0x3780, 0x7144, 0x2600, 0x0078, 0x1f67,
+ 0x7146, 0x2568, 0x2558, 0x753e, 0x2c50, 0x6708, 0x7736, 0xa784,
+ 0x013f, 0x0040, 0x1fa5, 0xa784, 0x0021, 0x00c0, 0x1f75, 0xa784,
+ 0x0002, 0x0040, 0x1f92, 0xa784, 0x0004, 0x0040, 0x1f75, 0xa7bc,
+ 0xfffb, 0x670a, 0xa784, 0x0008, 0x00c0, 0x1f75, 0xa784, 0x0010,
+ 0x00c0, 0x1f75, 0xa784, 0x0100, 0x0040, 0x1fa5, 0x6018, 0xa005,
+ 0x00c0, 0x1f75, 0xa7bc, 0xfeff, 0x670a, 0x6823, 0x0000, 0x6e1c,
+ 0xa684, 0x000e, 0x6118, 0x0040, 0x1fb5, 0x601c, 0xa102, 0x0048,
+ 0x1fb8, 0x0040, 0x1fb8, 0x0078, 0x1f71, 0x81ff, 0x00c0, 0x1f71,
+ 0xa784, 0x0080, 0x00c0, 0x1fbe, 0x700c, 0x6022, 0x1078, 0x302f,
+ 0x0018, 0x1e15, 0x789b, 0x0010, 0xa046, 0x1078, 0x2f8d, 0x00c0,
+ 0x1e50, 0x6b14, 0xa39c, 0x0007, 0xa39d, 0x00c0, 0x704c, 0xa084,
+ 0x8000, 0x0040, 0x1fd7, 0xa684, 0x0001, 0x0040, 0x1fd9, 0xa39c,
+ 0xffbf, 0xa684, 0x0010, 0x0040, 0x1fdf, 0xa39d, 0x0020, 0x7baa,
+ 0x8840, 0xa684, 0x000e, 0x00c0, 0x1fea, 0xa7bd, 0x0010, 0x670a,
+ 0x0078, 0x202b, 0x714c, 0xa18c, 0x0800, 0x0040, 0x2b77, 0x2011,
+ 0x0021, 0x8004, 0x8004, 0x0048, 0x2001, 0x2011, 0x0022, 0x8004,
+ 0x0048, 0x2001, 0x2011, 0x0020, 0x8004, 0x0048, 0x2001, 0x0040,
+ 0x202b, 0x7aaa, 0x8840, 0x1078, 0x2fa6, 0x6a14, 0x610c, 0x8108,
+ 0xa18c, 0x00ff, 0xa1e0, 0x4080, 0x2c64, 0x8cff, 0x0040, 0x2022,
+ 0x6014, 0xa206, 0x00c0, 0x200c, 0x60b8, 0x8001, 0x60ba, 0x00c0,
+ 0x2007, 0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f,
+ 0x0078, 0x1f51, 0x1078, 0x2f8d, 0x00c0, 0x1e50, 0x2a60, 0x610e,
+ 0x79aa, 0x8840, 0x712e, 0x2001, 0x0001, 0x007e, 0x7150, 0xa184,
+ 0x0018, 0x0040, 0x2048, 0xa184, 0x0010, 0x0040, 0x203b, 0x1078,
+ 0x2d2d, 0x00c0, 0x2055, 0xa184, 0x0008, 0x0040, 0x2048, 0x69a0,
+ 0xa184, 0x0600, 0x00c0, 0x2048, 0x1078, 0x2c2b, 0x0078, 0x2055,
+ 0x69a0, 0xa184, 0x0200, 0x0040, 0x2051, 0x1078, 0x2c79, 0x0078,
+ 0x2055, 0xa184, 0x0400, 0x00c0, 0x2044, 0x007f, 0x7002, 0xa68c,
+ 0x0060, 0xa684, 0x0060, 0x0040, 0x2063, 0xa086, 0x0060, 0x00c0,
+ 0x2063, 0xa18d, 0x4000, 0x88ff, 0x0040, 0x2068, 0xa18d, 0x0004,
+ 0x795a, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b, 0x0061,
+ 0x6818, 0xa085, 0x8000, 0x681a, 0x78aa, 0x8008, 0x810c, 0x0040,
+ 0x2b82, 0xa18c, 0x00f8, 0x00c0, 0x2b82, 0x157e, 0x137e, 0x147e,
+ 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b,
+ 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814, 0x8007, 0x7882,
+ 0x6d94, 0x7dd6, 0x7dde, 0x6e98, 0x7ed2, 0x7eda, 0x7830, 0xa084,
+ 0x00c0, 0x00c0, 0x209d, 0x0098, 0x20a5, 0x6008, 0xa084, 0xffef,
+ 0x600a, 0x1078, 0x2fa6, 0x0078, 0x1e58, 0x7200, 0xa284, 0x0007,
+ 0xa086, 0x0001, 0x00c0, 0x20b2, 0x781b, 0x004a, 0x1078, 0x2fa6,
+ 0x0078, 0x20c3, 0x6ab4, 0xa295, 0x2000, 0x7a5a, 0x781b, 0x004a,
+ 0x1078, 0x2fa6, 0x7200, 0x2500, 0xa605, 0x0040, 0x20c3, 0xa284,
+ 0x0007, 0x1079, 0x20d1, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0,
+ 0x1e50, 0x6018, 0x8000, 0x601a, 0xad80, 0x0009, 0x7032, 0x0078,
+ 0x1e50, 0x20d9, 0x33b6, 0x33b6, 0x33a5, 0x33b6, 0x20d9, 0x33a5,
+ 0x20d9, 0x1078, 0x1e01, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0f7e,
+ 0x2079, 0x3700, 0x78b0, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x2101,
+ 0x70a0, 0xa086, 0x0001, 0x00c0, 0x20f0, 0x70a2, 0x0078, 0x2184,
+ 0x70a0, 0xa086, 0x0005, 0x00c0, 0x20ff, 0x70bc, 0x2068, 0x681b,
+ 0x0004, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x70a3,
+ 0x0000, 0x157e, 0x2011, 0x0004, 0x71a0, 0xa186, 0x0001, 0x0040,
+ 0x211f, 0xa186, 0x0007, 0x00c0, 0x2113, 0x2009, 0x3731, 0x200b,
+ 0x0005, 0x0078, 0x211f, 0x2009, 0x3713, 0x2104, 0x2009, 0x3712,
+ 0x200a, 0x2009, 0x3731, 0x200b, 0x0001, 0x0078, 0x2121, 0x70a3,
+ 0x0000, 0x1078, 0x312e, 0x20a9, 0x0010, 0x2039, 0x0000, 0x1078,
+ 0x2de4, 0xa7b8, 0x0100, 0x0070, 0x212f, 0x0078, 0x2127, 0x7000,
+ 0x0079, 0x2132, 0x2160, 0x2149, 0x2149, 0x213c, 0x2160, 0x2160,
+ 0x2160, 0x213a, 0x1078, 0x1e01, 0x2021, 0x3757, 0x2404, 0xa005,
+ 0x0040, 0x2160, 0xad06, 0x00c0, 0x2149, 0x6800, 0x2022, 0x0078,
+ 0x2159, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2155, 0x6f14, 0x1078,
+ 0x2ed5, 0x1078, 0x2b44, 0x0078, 0x2159, 0x7054, 0x2060, 0x6800,
+ 0x6002, 0x6a1a, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078, 0x1990,
+ 0x2021, 0x4180, 0x1078, 0x218a, 0x2021, 0x3757, 0x1078, 0x218a,
+ 0x20a9, 0x0000, 0x2021, 0x4080, 0x1078, 0x218a, 0x8420, 0x0070,
+ 0x2173, 0x0078, 0x216c, 0x20a9, 0x0080, 0x2061, 0x3880, 0x6018,
+ 0x6110, 0xa102, 0x6012, 0x601b, 0x0000, 0xace0, 0x0010, 0x0070,
+ 0x2183, 0x0078, 0x2177, 0x157f, 0x7003, 0x0000, 0x703f, 0x0000,
+ 0x0078, 0x1e50, 0x047e, 0x2404, 0xa005, 0x0040, 0x219c, 0x2068,
+ 0x6800, 0x007e, 0x6a1a, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078,
+ 0x1990, 0x007f, 0x0078, 0x218c, 0x047f, 0x2023, 0x0000, 0x007c,
+ 0xa282, 0x0003, 0x0050, 0x21a6, 0x1078, 0x1e01, 0x2300, 0x0079,
+ 0x21a9, 0x21ac, 0x2213, 0x2230, 0xa282, 0x0002, 0x0040, 0x21b2,
+ 0x1078, 0x1e01, 0x70a0, 0x70a3, 0x0000, 0x0079, 0x21b7, 0x21bf,
+ 0x21bf, 0x21c1, 0x21f3, 0x21f1, 0x21bf, 0x21f3, 0x21bf, 0x1078,
+ 0x1e01, 0x77b4, 0x1078, 0x2de4, 0x77b4, 0xa7bc, 0x0f00, 0x1078,
+ 0x2ed5, 0x6018, 0xa005, 0x0040, 0x21ea, 0x2021, 0x4180, 0x1078,
+ 0x224b, 0x0040, 0x21ea, 0x157e, 0x20a9, 0x0000, 0x2021, 0x4080,
+ 0x047e, 0x1078, 0x224b, 0x047f, 0x0040, 0x21e3, 0x8420, 0x0070,
+ 0x21e3, 0x0078, 0x21d8, 0x157f, 0x2021, 0x3757, 0x1078, 0x224b,
+ 0x0040, 0x21ea, 0x8738, 0xa784, 0x0007, 0x00c0, 0x21c7, 0x0078,
+ 0x1e58, 0x0078, 0x1e58, 0x77b4, 0x1078, 0x2ed5, 0x6018, 0xa005,
+ 0x0040, 0x2211, 0x2021, 0x4180, 0x1078, 0x224b, 0x0040, 0x2211,
+ 0x157e, 0x20a9, 0x0000, 0x2021, 0x4080, 0x047e, 0x1078, 0x224b,
+ 0x047f, 0x0040, 0x2210, 0x8420, 0x0070, 0x2210, 0x0078, 0x2205,
+ 0x157f, 0x0078, 0x1e58, 0x2200, 0x0079, 0x2216, 0x2219, 0x221b,
+ 0x221b, 0x1078, 0x1e01, 0x2009, 0x0012, 0x70a0, 0xa086, 0x0002,
+ 0x0040, 0x2224, 0x2009, 0x000e, 0x6818, 0xa084, 0x8000, 0x0040,
+ 0x222a, 0x691a, 0x70a3, 0x0000, 0x70a7, 0x0001, 0x0078, 0x2f58,
+ 0x2200, 0x0079, 0x2233, 0x2238, 0x221b, 0x2236, 0x1078, 0x1e01,
+ 0x1078, 0x26a7, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2b1a, 0x1078,
+ 0x2b5a, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2b0d, 0x0040,
+ 0x2b1a, 0x0078, 0x1f51, 0x2404, 0xa005, 0x0040, 0x226e, 0x2068,
+ 0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x225a, 0x2d20, 0x007f,
+ 0x0078, 0x224c, 0x007f, 0x2022, 0x681b, 0x0004, 0x6820, 0xa085,
+ 0x0010, 0x6822, 0x1078, 0x1990, 0x6010, 0x8001, 0x6012, 0x6008,
+ 0xa084, 0xffef, 0x600a, 0x1078, 0x2b5a, 0x007c, 0xa085, 0x0001,
+ 0x0078, 0x226d, 0x2300, 0x0079, 0x2275, 0x227a, 0x2278, 0x22c6,
+ 0x1078, 0x1e01, 0x78e4, 0xa005, 0x00d0, 0x228e, 0x0018, 0x228e,
+ 0xa084, 0x0007, 0x0079, 0x2284, 0x229f, 0x22ac, 0x2292, 0x228c,
+ 0x2f80, 0x2f80, 0x228c, 0x22b9, 0x1078, 0x1e01, 0x2001, 0x0003,
+ 0x0078, 0x2586, 0x6818, 0xa084, 0x8000, 0x0040, 0x2299, 0x681b,
+ 0x001d, 0x1078, 0x2dc7, 0x781b, 0x0053, 0x0078, 0x1e50, 0x6818,
+ 0xa084, 0x8000, 0x0040, 0x22a6, 0x681b, 0x001d, 0x1078, 0x2dc7,
+ 0x781b, 0x00db, 0x0078, 0x1e50, 0x6818, 0xa084, 0x8000, 0x0040,
+ 0x22b3, 0x681b, 0x001d, 0x1078, 0x2dc7, 0x781b, 0x00e2, 0x0078,
+ 0x1e50, 0x6818, 0xa084, 0x8000, 0x0040, 0x22c0, 0x681b, 0x001d,
+ 0x1078, 0x2dc7, 0x781b, 0x009c, 0x0078, 0x1e50, 0xa584, 0x000f,
+ 0x00c0, 0x22e5, 0x1078, 0x26a7, 0x7000, 0x0079, 0x22cf, 0x22d7,
+ 0x22d9, 0x22d7, 0x2b1a, 0x2b1a, 0x2b1a, 0x2b1a, 0x22d7, 0x1078,
+ 0x1e01, 0x1078, 0x2b5a, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078,
+ 0x2b0d, 0x0040, 0x2b1a, 0x0078, 0x1f51, 0x79e4, 0xa005, 0x00d0,
+ 0x228e, 0x0018, 0x228e, 0xa184, 0x0007, 0x0079, 0x22ef, 0x22ff,
+ 0x2305, 0x22f9, 0x22f7, 0x2f80, 0x2f80, 0x22f7, 0x2f78, 0x1078,
+ 0x1e01, 0x1078, 0x2dcf, 0x781b, 0x0053, 0x0078, 0x1e50, 0x1078,
+ 0x2dcf, 0x781b, 0x00db, 0x0078, 0x1e50, 0x1078, 0x2dcf, 0x781b,
+ 0x00e2, 0x0078, 0x1e50, 0x1078, 0x2dcf, 0x781b, 0x009c, 0x0078,
+ 0x1e50, 0x2300, 0x0079, 0x2314, 0x2319, 0x2317, 0x231b, 0x1078,
+ 0x1e01, 0x0078, 0x28a0, 0x681b, 0x0008, 0x78a3, 0x0000, 0x79e4,
+ 0xa184, 0x0007, 0x0079, 0x2324, 0x232c, 0x2305, 0x2292, 0x2f58,
+ 0x2f80, 0x2f80, 0x232c, 0x2f78, 0x1078, 0x1e01, 0xa282, 0x0005,
+ 0x0050, 0x2334, 0x1078, 0x1e01, 0x2300, 0x0079, 0x2337, 0x233a,
+ 0x2537, 0x2543, 0x2200, 0x0079, 0x233d, 0x2357, 0x2344, 0x2357,
+ 0x2342, 0x251c, 0x1078, 0x1e01, 0x789b, 0x0018, 0x78a8, 0xa084,
+ 0x00ff, 0xa082, 0x0020, 0x0048, 0x2db3, 0xa08a, 0x0004, 0x00c8,
+ 0x2db3, 0x0079, 0x2353, 0x2db3, 0x2db3, 0x2db3, 0x2d6d, 0x789b,
+ 0x0018, 0x79a8, 0xa184, 0x0080, 0x0040, 0x236c, 0xa184, 0x0018,
+ 0x0040, 0x2368, 0x0078, 0x2db3, 0x7000, 0xa005, 0x00c0, 0x2362,
+ 0x2011, 0x0004, 0x0078, 0x29a3, 0xa184, 0x00ff, 0xa08a, 0x0010,
+ 0x00c8, 0x2db3, 0x0079, 0x2374, 0x2386, 0x2384, 0x239e, 0x23a2,
+ 0x2433, 0x2db3, 0x2db3, 0x2435, 0x2db3, 0x2db3, 0x2518, 0x2518,
+ 0x2db3, 0x2db3, 0x2db3, 0x251a, 0x1078, 0x1e01, 0xa684, 0x1000,
+ 0x0040, 0x2393, 0x2001, 0x0300, 0x8000, 0x8000, 0x783a, 0x781b,
+ 0x0099, 0x0078, 0x1e50, 0x6818, 0xa084, 0x8000, 0x0040, 0x239c,
+ 0x681b, 0x001d, 0x0078, 0x238a, 0x0078, 0x2f58, 0x681b, 0x001d,
+ 0x0078, 0x2dbf, 0x6920, 0xa184, 0x8000, 0x00c0, 0x23ae, 0x68af,
+ 0x0000, 0x68b3, 0x0000, 0xa18d, 0x8000, 0x6922, 0xa684, 0x1800,
+ 0x00c0, 0x23c6, 0x6820, 0xa084, 0x0001, 0x00c0, 0x23cc, 0x6818,
+ 0xa086, 0x0008, 0x00c0, 0x23be, 0x681b, 0x0000, 0xa684, 0x0400,
+ 0x0040, 0x242f, 0x781b, 0x0056, 0x0078, 0x1e50, 0xa684, 0x1000,
+ 0x0040, 0x23cc, 0x0078, 0x1e50, 0xa684, 0x0060, 0x0040, 0x242b,
+ 0xa684, 0x0800, 0x0040, 0x242b, 0xa684, 0x8000, 0x00c0, 0x23dc,
+ 0x69b0, 0x6aac, 0x0078, 0x23f6, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6,
+ 0x789b, 0x0074, 0x7aac, 0x79ac, 0x78ac, 0x801b, 0x00c8, 0x23e9,
+ 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100,
+ 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0xa684, 0x4000,
+ 0x0040, 0x23fe, 0xa6b4, 0xbfff, 0x7e5a, 0x6eb6, 0xa006, 0x1078,
+ 0x3474, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040,
+ 0x240d, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x6ba6,
+ 0x7bd6, 0x2300, 0xa405, 0x00c0, 0x241d, 0xa6b5, 0x4000, 0x7e5a,
+ 0x6eb6, 0x781b, 0x0065, 0x0078, 0x1e50, 0x781b, 0x0065, 0x2200,
+ 0xa115, 0x00c0, 0x2427, 0x1078, 0x33b6, 0x0078, 0x1e50, 0x1078,
+ 0x33eb, 0x0078, 0x1e50, 0x781b, 0x0068, 0x0078, 0x1e50, 0x781b,
+ 0x0056, 0x0078, 0x1e50, 0x1078, 0x1e01, 0x0078, 0x248a, 0x6920,
+ 0xa184, 0x0100, 0x0040, 0x2449, 0xa18c, 0xfeff, 0x6922, 0x0c7e,
+ 0x7048, 0x2060, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078,
+ 0x2479, 0xa184, 0x0200, 0x0040, 0x2479, 0xa18c, 0xfdff, 0x6922,
+ 0x0c7e, 0x7048, 0x2060, 0x6004, 0xa084, 0xffef, 0x6006, 0x2008,
+ 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2479, 0x1078, 0x2ed1,
+ 0x1078, 0x2c2b, 0x88ff, 0x0040, 0x2479, 0x789b, 0x0060, 0x2800,
+ 0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
+ 0x2475, 0x781b, 0x0053, 0x0078, 0x1e50, 0x781b, 0x0067, 0x0078,
+ 0x1e50, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2482, 0x781b, 0x0056,
+ 0x0078, 0x1e50, 0x781b, 0x0068, 0x0078, 0x1e50, 0x0078, 0x2db9,
+ 0x0078, 0x2db9, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x0040,
+ 0x2488, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001,
+ 0x00c0, 0x24ad, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040,
+ 0x24a5, 0x0048, 0x24a5, 0x0078, 0x24a7, 0x0078, 0x2437, 0x24a8,
+ 0x7aa8, 0x00f0, 0x24a7, 0x0078, 0x2493, 0xa284, 0x00f0, 0xa086,
+ 0x0020, 0x00c0, 0x2509, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040,
+ 0x24bd, 0x0048, 0x24bd, 0x0078, 0x2506, 0xa286, 0x0023, 0x0040,
+ 0x2488, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1,
+ 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008, 0xa085, 0x0010, 0x600a,
+ 0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184,
+ 0x0010, 0x0040, 0x24e1, 0x1078, 0x2ed1, 0x1078, 0x2d2d, 0x0078,
+ 0x24f0, 0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f,
+ 0xa184, 0x0008, 0x0040, 0x2479, 0x1078, 0x2ed1, 0x1078, 0x2c2b,
+ 0x88ff, 0x0040, 0x2479, 0x789b, 0x0060, 0x2800, 0x78aa, 0xa6b5,
+ 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2502, 0x781b, 0x0053,
+ 0x0078, 0x1e50, 0x781b, 0x0067, 0x0078, 0x1e50, 0x7aa8, 0x0078,
+ 0x2493, 0x8318, 0x2300, 0xa102, 0x0040, 0x2512, 0x0048, 0x2512,
+ 0x0078, 0x2493, 0xa284, 0x0080, 0x00c0, 0x2dbf, 0x0078, 0x2db9,
+ 0x0078, 0x2dbf, 0x0078, 0x2db3, 0x789b, 0x0018, 0x78a8, 0xa084,
+ 0x00ff, 0xa08e, 0x0001, 0x0040, 0x2527, 0x1078, 0x1e01, 0x7aa8,
+ 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8,
+ 0x2db3, 0x0079, 0x2533, 0x2db3, 0x2b9b, 0x2db3, 0x2cc8, 0xa282,
+ 0x0000, 0x00c0, 0x253d, 0x1078, 0x1e01, 0x1078, 0x2dc7, 0x781b,
+ 0x0067, 0x0078, 0x1e50, 0xa282, 0x0003, 0x00c0, 0x2549, 0x1078,
+ 0x1e01, 0xa484, 0x8000, 0x00c0, 0x256c, 0x70a0, 0xa005, 0x0040,
+ 0x2553, 0x1078, 0x1e01, 0x6f14, 0x77b6, 0xa7bc, 0x0f00, 0x1078,
+ 0x2ed5, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x0007,
+ 0x00c0, 0x2557, 0x1078, 0x2dcb, 0x70a3, 0x0002, 0x2009, 0x3731,
+ 0x200b, 0x0009, 0x0078, 0x256e, 0x1078, 0x2dd7, 0x781b, 0x0067,
+ 0x0078, 0x1e50, 0xa282, 0x0004, 0x0050, 0x2578, 0x1078, 0x1e01,
+ 0x2300, 0x0079, 0x257b, 0x257e, 0x265a, 0x2682, 0xa286, 0x0003,
+ 0x0040, 0x2584, 0x1078, 0x1e01, 0x2001, 0x0000, 0x703a, 0x7000,
+ 0xa084, 0x0007, 0x0079, 0x258c, 0x2594, 0x2596, 0x2596, 0x274a,
+ 0x277b, 0x1e58, 0x277b, 0x2594, 0x1078, 0x1e01, 0xa684, 0x1000,
+ 0x00c0, 0x259e, 0x1078, 0x312e, 0x0040, 0x2634, 0x7868, 0xa08c,
+ 0x00ff, 0x0040, 0x25e6, 0xa186, 0x0008, 0x00c0, 0x25b5, 0x1078,
+ 0x2b5a, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2b0d, 0x0040,
+ 0x25e6, 0x1078, 0x312e, 0x0078, 0x25cd, 0xa186, 0x0028, 0x00c0,
+ 0x25e6, 0x1078, 0x312e, 0x6008, 0xa084, 0xffef, 0x600a, 0x6018,
+ 0xa005, 0x0040, 0x25cd, 0x8001, 0x601a, 0xa005, 0x0040, 0x25cd,
+ 0x8001, 0xa005, 0x0040, 0x25cd, 0x601e, 0x6820, 0xa084, 0x0001,
+ 0x0040, 0x1e58, 0x6820, 0xa084, 0xfffe, 0x6822, 0x7054, 0x0c7e,
+ 0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00,
+ 0x00c0, 0x25e3, 0x6002, 0x6006, 0x0078, 0x1e58, 0x017e, 0x1078,
+ 0x26a7, 0x017f, 0xa684, 0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14,
+ 0x81ff, 0x0040, 0x2634, 0xa186, 0x0002, 0x00c0, 0x262c, 0xa684,
+ 0x0800, 0x00c0, 0x2603, 0xa684, 0x0060, 0x0040, 0x2603, 0x78d8,
+ 0x7adc, 0x682e, 0x6a32, 0x6820, 0xa084, 0x0800, 0x00c0, 0x2634,
+ 0x8717, 0xa294, 0x000f, 0x8213, 0x8213, 0x8213, 0xa290, 0x3800,
+ 0xa290, 0x0000, 0x221c, 0x8210, 0x2204, 0xa085, 0x0018, 0x2012,
+ 0x8211, 0xa384, 0x0400, 0x0040, 0x2626, 0x68a0, 0xa084, 0x0100,
+ 0x00c0, 0x2626, 0x1078, 0x2709, 0x0078, 0x1e58, 0x6008, 0xa085,
+ 0x0002, 0x600a, 0x0078, 0x2634, 0xa186, 0x0018, 0x0040, 0x2634,
+ 0xa186, 0x0014, 0x0040, 0x1e58, 0x6916, 0x6818, 0xa084, 0x8000,
+ 0x0040, 0x263c, 0x7038, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x1078,
+ 0x2b4b, 0x1078, 0x2b5a, 0x00c0, 0x2649, 0x6008, 0xa084, 0xffef,
+ 0x600a, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2652, 0x1078, 0x2b44,
+ 0x0078, 0x2656, 0x7054, 0x2060, 0x6800, 0x6002, 0x1078, 0x1990,
+ 0x0078, 0x1e58, 0xa282, 0x0004, 0x0048, 0x2660, 0x1078, 0x1e01,
+ 0x2200, 0x0079, 0x2663, 0x265e, 0x2667, 0x266d, 0x2667, 0x1078,
+ 0x2dc7, 0x781b, 0x0067, 0x0078, 0x1e50, 0x7890, 0x8007, 0x8001,
+ 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff,
+ 0xa186, 0x0003, 0x0040, 0x267e, 0x0078, 0x2db3, 0x781b, 0x0068,
+ 0x0078, 0x1e50, 0x6820, 0xa085, 0x0004, 0x6822, 0x82ff, 0x00c0,
+ 0x268d, 0x1078, 0x2dc7, 0x0078, 0x2694, 0x8211, 0x0040, 0x2692,
+ 0x1078, 0x1e01, 0x1078, 0x2dd7, 0x781b, 0x0067, 0x0078, 0x1e50,
+ 0x1078, 0x2fa6, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x26a4, 0x0018,
+ 0x26a4, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684,
+ 0x0060, 0x00c0, 0x26b1, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
+ 0x2708, 0xa684, 0x0800, 0x00c0, 0x26c1, 0x6998, 0x6a94, 0x692e,
+ 0x6a32, 0x7000, 0xa086, 0x0006, 0x0040, 0x26c0, 0x1078, 0x312e,
+ 0x007c, 0xa684, 0x0020, 0x0040, 0x26db, 0xa684, 0x4000, 0x0040,
+ 0x26cf, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x26b9, 0x7038,
+ 0xa005, 0x00c0, 0x26d5, 0x703b, 0x0015, 0x79d8, 0x7adc, 0x692e,
+ 0x6a32, 0x0078, 0x26b9, 0xa684, 0x4000, 0x0040, 0x26e5, 0x682f,
+ 0x0000, 0x6833, 0x0000, 0x0078, 0x26b9, 0x7038, 0xa005, 0x00c0,
+ 0x26eb, 0x703b, 0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb, 0x00c8,
+ 0x26f2, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x692e,
+ 0x6a32, 0x2100, 0xa205, 0x00c0, 0x26ff, 0x0078, 0x26b9, 0x7000,
+ 0xa086, 0x0006, 0x0040, 0x2708, 0x1078, 0x3474, 0x0078, 0x26b9,
+ 0x007c, 0xa384, 0x0200, 0x0040, 0x2711, 0x6008, 0xa085, 0x0002,
+ 0x600a, 0x681b, 0x0006, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f,
+ 0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b,
+ 0x0020, 0x7000, 0x0079, 0x2724, 0x272c, 0x272e, 0x2737, 0x272c,
+ 0x272c, 0x272c, 0x272c, 0x272c, 0x1078, 0x1e01, 0x6820, 0xa084,
+ 0x0001, 0x00c0, 0x2737, 0x1078, 0x2b44, 0x0078, 0x273d, 0x7054,
+ 0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60, 0x2021, 0x3757, 0x2404,
+ 0xa005, 0x0040, 0x2746, 0x2020, 0x0078, 0x273f, 0x2d22, 0x206b,
+ 0x0000, 0x007c, 0x1078, 0x2b4b, 0x1078, 0x2b5a, 0x682b, 0x0000,
+ 0x789b, 0x000e, 0x6f14, 0x6817, 0x0002, 0x1078, 0x34ac, 0xa684,
+ 0x0800, 0x0040, 0x275f, 0x691c, 0xa18d, 0x2000, 0x691e, 0x6818,
+ 0xa084, 0x8000, 0x0040, 0x276f, 0x7868, 0xa08c, 0x00ff, 0x0040,
+ 0x276d, 0x681b, 0x001e, 0x0078, 0x276f, 0x681b, 0x0000, 0x2021,
+ 0x3757, 0x6800, 0x2022, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x1078,
+ 0x1990, 0x0078, 0x1e58, 0x1078, 0x26a7, 0x682b, 0x0000, 0x789b,
+ 0x000e, 0x6f14, 0x1078, 0x2fab, 0xa08c, 0x00ff, 0x6916, 0x6818,
+ 0xa084, 0x8000, 0x0040, 0x278e, 0x7038, 0x681a, 0xa68c, 0xdf00,
+ 0x691e, 0x70a3, 0x0000, 0x0078, 0x1e58, 0xa006, 0x1078, 0x312e,
+ 0x6817, 0x0000, 0x681b, 0x0001, 0xa68c, 0xdf00, 0x691e, 0x682b,
+ 0x0000, 0x7000, 0x0079, 0x27a4, 0x27ac, 0x27ae, 0x27ae, 0x27b0,
+ 0x27b0, 0x27b0, 0x27b0, 0x27ac, 0x1078, 0x1e01, 0x1078, 0x2b5a,
+ 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x2b25, 0x2300, 0x0079,
+ 0x27b9, 0x27bc, 0x27be, 0x27f7, 0x1078, 0x1e01, 0x7000, 0x0079,
+ 0x27c1, 0x27c9, 0x27cb, 0x27cb, 0x27e6, 0x27cb, 0x27f3, 0x27e6,
+ 0x27c9, 0x1078, 0x1e01, 0xa684, 0x0060, 0xa086, 0x0060, 0x00c0,
+ 0x27e2, 0xa6b4, 0xffdf, 0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a,
+ 0x681c, 0xa084, 0xffdf, 0x681e, 0x1078, 0x312e, 0x1078, 0x33b6,
+ 0x0078, 0x2f58, 0xa684, 0x2000, 0x0040, 0x27d5, 0x6818, 0xa084,
+ 0x8000, 0x0040, 0x27f3, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040,
+ 0x27f3, 0x681b, 0x0007, 0x781b, 0x00dc, 0x0078, 0x1e50, 0x1078,
+ 0x1e01, 0x2300, 0x0079, 0x27fc, 0x27ff, 0x2801, 0x2834, 0x1078,
+ 0x1e01, 0x7000, 0x0079, 0x2804, 0x280c, 0x280e, 0x280e, 0x2829,
+ 0x280e, 0x2830, 0x2829, 0x280c, 0x1078, 0x1e01, 0xa684, 0x0060,
+ 0xa086, 0x0060, 0x00c0, 0x2825, 0xa6b4, 0xffbf, 0xa6b4, 0xbfff,
+ 0xa6b5, 0x2000, 0x7e5a, 0x681c, 0xa084, 0xffbf, 0x681e, 0x1078,
+ 0x312e, 0x1078, 0x33b6, 0x0078, 0x2f58, 0xa684, 0x2000, 0x0040,
+ 0x2818, 0x6818, 0xa084, 0x8000, 0x0040, 0x2830, 0x681b, 0x0007,
+ 0x781b, 0x00e3, 0x0078, 0x1e50, 0x6820, 0xa085, 0x0004, 0x6822,
+ 0x1078, 0x2f23, 0xa6b5, 0x0800, 0x1078, 0x2dc7, 0x781b, 0x0067,
+ 0x0078, 0x1e50, 0x2300, 0x0079, 0x2845, 0x2848, 0x284a, 0x284c,
+ 0x1078, 0x1e01, 0x1078, 0x1e01, 0x782b, 0x3009, 0xa684, 0x0400,
+ 0x00c0, 0x2866, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb,
+ 0x785a, 0x79e4, 0xa184, 0x0020, 0x00c0, 0x2862, 0x2001, 0x0014,
+ 0x0078, 0x2586, 0xa184, 0x0007, 0x0079, 0x2896, 0x7a90, 0xa294,
+ 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff, 0x0040, 0x2894, 0x789b,
+ 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0, 0x288d, 0x7ba8, 0x7ba8,
+ 0xa386, 0x0001, 0x00c0, 0x2880, 0x2009, 0xfff7, 0x0078, 0x2886,
+ 0xa386, 0x0003, 0x00c0, 0x288d, 0x2009, 0xffef, 0x0c7e, 0x7048,
+ 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab,
+ 0x0000, 0xa684, 0xfffb, 0x785a, 0x0078, 0x2f58, 0x229f, 0x22ac,
+ 0x2f60, 0x2f60, 0x289e, 0x289e, 0x289e, 0x2f60, 0x1078, 0x1e01,
+ 0x79e4, 0xa184, 0x0030, 0x00c0, 0x28b6, 0x70a0, 0xa086, 0x0002,
+ 0x00c0, 0x28ae, 0x2011, 0x0002, 0x0078, 0x21a0, 0x6818, 0xa085,
+ 0x8000, 0x681a, 0x2001, 0x0014, 0x0078, 0x2586, 0xa18c, 0x0007,
+ 0xa186, 0x0002, 0x00c0, 0x2f80, 0xa684, 0x0400, 0x00c0, 0x28fd,
+ 0x6820, 0xa084, 0x0001, 0x0040, 0x2f60, 0xa68c, 0x0060, 0xa684,
+ 0x0060, 0x0040, 0x28d1, 0xa086, 0x0060, 0x00c0, 0x28d1, 0xa18d,
+ 0x4000, 0xa18c, 0xfffb, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab,
+ 0x0000, 0x789b, 0x0061, 0x6818, 0xa085, 0x8000, 0x681a, 0x78aa,
+ 0x8008, 0x810c, 0x0040, 0x2b82, 0xa18c, 0x00f8, 0x00c0, 0x2b82,
+ 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000,
+ 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f,
+ 0x6814, 0x8007, 0x7882, 0x0078, 0x2f60, 0x6818, 0xa084, 0x8000,
+ 0x0040, 0x2904, 0x681b, 0x0008, 0x781b, 0x00d7, 0x0078, 0x1e50,
+ 0x2300, 0x0079, 0x290b, 0x2910, 0x2993, 0x290e, 0x1078, 0x1e01,
+ 0x7000, 0xa084, 0x0007, 0x0079, 0x2915, 0x291d, 0x291f, 0x293b,
+ 0x291d, 0x291d, 0x1e58, 0x291d, 0x291d, 0x1078, 0x1e01, 0x6920,
+ 0xa18d, 0x0001, 0x6922, 0x6800, 0x6006, 0xa005, 0x00c0, 0x2929,
+ 0x6002, 0x681c, 0xa084, 0x000e, 0x0040, 0x2935, 0x7014, 0x68ba,
+ 0x712c, 0xa188, 0x4080, 0x0078, 0x2937, 0x2009, 0x4180, 0x2104,
+ 0x6802, 0x2d0a, 0x7156, 0x6920, 0xa184, 0x8000, 0x00c0, 0x2947,
+ 0x68af, 0x0000, 0x68b3, 0x0000, 0xa18d, 0x8000, 0x6922, 0x6eb6,
+ 0xa684, 0x0060, 0x0040, 0x2991, 0xa684, 0x0800, 0x00c0, 0x2958,
+ 0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078, 0x312e, 0x0078, 0x2991,
+ 0xa684, 0x0020, 0x0040, 0x2965, 0xa006, 0x1078, 0x3474, 0x79d8,
+ 0x7adc, 0x69aa, 0x6aa6, 0x0078, 0x296b, 0x1078, 0x2ee2, 0x69aa,
+ 0x6aa6, 0x1078, 0x3474, 0xa684, 0x8000, 0x0040, 0x2991, 0xa684,
+ 0x7fff, 0x68b6, 0x789b, 0x0074, 0x1078, 0x2fab, 0x2010, 0x1078,
+ 0x2fab, 0x2008, 0xa684, 0x0020, 0x00c0, 0x2989, 0x1078, 0x2fab,
+ 0x801b, 0x00c8, 0x2984, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
+ 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303,
+ 0x68ae, 0x0078, 0x1e58, 0x0078, 0x2dbf, 0x7033, 0x0000, 0xa282,
+ 0x0006, 0x0050, 0x299d, 0x1078, 0x1e01, 0x2300, 0x0079, 0x29a0,
+ 0x29a3, 0x29c9, 0x29ed, 0x2200, 0x0079, 0x29a6, 0x29ac, 0x2dbf,
+ 0x29ae, 0x29ac, 0x2a17, 0x2a68, 0x1078, 0x1e01, 0x7003, 0x0005,
+ 0x2001, 0x4190, 0x2068, 0x703e, 0x157e, 0x20a9, 0x002f, 0x2003,
+ 0x0000, 0x8000, 0x0070, 0x29be, 0x0078, 0x29b7, 0x157f, 0x6817,
+ 0x0000, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x0078,
+ 0x2db3, 0x7000, 0xa086, 0x0001, 0x00c0, 0x29d6, 0x1078, 0x2b5a,
+ 0x1078, 0x312e, 0x7034, 0x600a, 0x0078, 0x29db, 0x7000, 0xa086,
+ 0x0003, 0x0040, 0x29d0, 0x7003, 0x0005, 0x2001, 0x4190, 0x2068,
+ 0x703e, 0x7032, 0x2200, 0x0079, 0x29e5, 0x2dbf, 0x29eb, 0x29eb,
+ 0x2a17, 0x29eb, 0x2dbf, 0x1078, 0x1e01, 0x7000, 0xa086, 0x0001,
+ 0x00c0, 0x29fa, 0x1078, 0x2b5a, 0x1078, 0x312e, 0x7034, 0x600a,
+ 0x0078, 0x29ff, 0x7000, 0xa086, 0x0003, 0x0040, 0x29f4, 0x7003,
+ 0x0005, 0x2001, 0x4190, 0x2068, 0x703e, 0x7032, 0x2200, 0x0079,
+ 0x2a09, 0x2a11, 0x2a0f, 0x2a0f, 0x2a11, 0x2a0f, 0x2a11, 0x1078,
+ 0x1e01, 0x1078, 0x2dd7, 0x781b, 0x0067, 0x0078, 0x1e50, 0x7000,
+ 0xa086, 0x0001, 0x00c0, 0x2a24, 0x1078, 0x2b5a, 0x1078, 0x312e,
+ 0x7034, 0x600a, 0x0078, 0x2a29, 0x7000, 0xa086, 0x0003, 0x0040,
+ 0x2a1e, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018,
+ 0x7ca8, 0xa484, 0x0007, 0xa215, 0x2069, 0x4180, 0x2d04, 0x2d08,
+ 0x7156, 0x2068, 0xa005, 0x0040, 0x2a44, 0x6814, 0xa206, 0x0040,
+ 0x2a5d, 0x6800, 0x0078, 0x2a37, 0x7003, 0x0005, 0x2001, 0x4190,
+ 0x2068, 0x703e, 0x7032, 0x157e, 0x20a9, 0x002f, 0x2003, 0x0000,
+ 0x8000, 0x0070, 0x2a55, 0x0078, 0x2a4e, 0x157f, 0x6a16, 0x68b7,
+ 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6820,
+ 0xa084, 0x0c00, 0x0040, 0x2ac6, 0x1078, 0x2dcf, 0x0078, 0x2ac6,
+ 0x7000, 0xa086, 0x0001, 0x00c0, 0x2a75, 0x1078, 0x2b5a, 0x1078,
+ 0x312e, 0x7034, 0x600a, 0x0078, 0x2a7a, 0x7000, 0xa086, 0x0003,
+ 0x0040, 0x2a6f, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b,
+ 0x0018, 0x7ca8, 0xa484, 0x0007, 0xa215, 0x79a8, 0x79a8, 0xa18c,
+ 0x00ff, 0xa1e8, 0x4080, 0x2d04, 0x2d08, 0x7156, 0x2068, 0xa005,
+ 0x0040, 0x2a99, 0x6814, 0xa206, 0x0040, 0x2ab1, 0x6800, 0x0078,
+ 0x2a8c, 0x7003, 0x0005, 0x2001, 0x4190, 0x2068, 0x703e, 0x157e,
+ 0x20a9, 0x002f, 0x2003, 0x0000, 0x8000, 0x0070, 0x2aa9, 0x0078,
+ 0x2aa2, 0x157f, 0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827,
+ 0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x2ac6,
+ 0xa084, 0x0800, 0x0040, 0x2ac0, 0x1078, 0x2dd3, 0x0078, 0x2ac6,
+ 0x1078, 0x2dcf, 0x70bf, 0x0000, 0x0078, 0x2ac6, 0x027e, 0x8207,
+ 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3800, 0x2060,
+ 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0xa684, 0x0060, 0x0040,
+ 0x2adf, 0x68a8, 0x78d2, 0x78da, 0x68a4, 0x78d6, 0x78de, 0x077f,
+ 0x1078, 0x2ed5, 0x2009, 0x0068, 0xa684, 0x0008, 0x0040, 0x2aea,
+ 0x2009, 0x0067, 0xa6b5, 0x2000, 0x7e5a, 0x791a, 0xa684, 0x0060,
+ 0x0040, 0x2b00, 0xa684, 0x0800, 0x00c0, 0x2afa, 0x1078, 0x33b6,
+ 0x0078, 0x2b00, 0xa684, 0x4000, 0x00c0, 0x2b00, 0x1078, 0x3347,
+ 0x2d00, 0x703e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
+ 0xa080, 0x3800, 0x2048, 0x0078, 0x1e50, 0x6020, 0xa005, 0x0040,
+ 0x2b19, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, 0x600a, 0x7010,
+ 0x6026, 0x007c, 0xa006, 0x1078, 0x312e, 0x6817, 0x0000, 0x681b,
+ 0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x0007,
+ 0x0079, 0x2b2a, 0x2b32, 0x2b34, 0x2b34, 0x2b40, 0x2b3c, 0x2b32,
+ 0x2b3c, 0x2b32, 0x1078, 0x1e01, 0x1078, 0x2b4b, 0x1078, 0x2b44,
+ 0x1078, 0x1990, 0x0078, 0x1e58, 0x70a3, 0x0000, 0x0078, 0x1e58,
+ 0x681b, 0x0000, 0x0078, 0x274a, 0x6800, 0xa005, 0x00c0, 0x2b49,
+ 0x6002, 0x6006, 0x007c, 0x6010, 0xa005, 0x0040, 0x2b54, 0x8001,
+ 0x00d0, 0x2b54, 0x1078, 0x1e01, 0x6012, 0x6008, 0xa084, 0xffef,
+ 0x600a, 0x007c, 0x6018, 0xa005, 0x0040, 0x2b60, 0x8001, 0x601a,
+ 0x007c, 0x1078, 0x2fa6, 0x6818, 0xa084, 0x8000, 0x0040, 0x2b6a,
+ 0x681b, 0x0018, 0x0078, 0x2b8f, 0x1078, 0x2fa6, 0x6818, 0xa084,
+ 0x8000, 0x0040, 0x2b75, 0x681b, 0x0019, 0x0078, 0x2b8f, 0x1078,
+ 0x2fa6, 0x6818, 0xa084, 0x8000, 0x0040, 0x2b80, 0x681b, 0x001a,
+ 0x0078, 0x2b8f, 0x1078, 0x2fa6, 0x681b, 0x0003, 0x0078, 0x2b8f,
+ 0x6818, 0xa084, 0x8000, 0x0040, 0x2b8f, 0x681b, 0x0005, 0x681f,
+ 0x0000, 0x6823, 0x0020, 0x1078, 0x2b4b, 0x1078, 0x2b44, 0x1078,
+ 0x1990, 0x0078, 0x1e58, 0xa282, 0x0003, 0x00c0, 0x2db3, 0x7da8,
+ 0xa5ac, 0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x6920, 0xa18d, 0x0080,
+ 0x6922, 0xa184, 0x0100, 0x0040, 0x2bde, 0xa18c, 0xfeff, 0x6922,
+ 0xa6b4, 0x00ff, 0x0040, 0x2bc8, 0xa682, 0x000c, 0x0048, 0x2bbc,
+ 0x0040, 0x2bbc, 0x2031, 0x000c, 0x852b, 0x852b, 0x1078, 0x2e62,
+ 0x0040, 0x2bc6, 0x1078, 0x2c94, 0x0078, 0x2bd1, 0x1078, 0x2e1d,
+ 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x2cb8,
+ 0x0c7f, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2bda, 0x781b, 0x0056,
+ 0x0078, 0x1e50, 0x781b, 0x0068, 0x0078, 0x1e50, 0x0c7e, 0x7048,
+ 0x2060, 0x6100, 0xa18c, 0x1000, 0x0040, 0x2c1e, 0x6208, 0x8217,
+ 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x2bf2, 0x0040, 0x2bf2,
+ 0x2011, 0x000c, 0x2600, 0xa202, 0x00c8, 0x2bf7, 0x2230, 0x6208,
+ 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x2c07, 0xa282,
+ 0x0019, 0x00c8, 0x2c0d, 0x2011, 0x0019, 0x0078, 0x2c0d, 0xa282,
+ 0x000c, 0x00c8, 0x2c0d, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8,
+ 0x2c12, 0x2228, 0x1078, 0x2e21, 0x852b, 0x852b, 0x1078, 0x2e62,
+ 0x0040, 0x2c1e, 0x1078, 0x2c94, 0x0078, 0x2c22, 0x1078, 0x2e1d,
+ 0x1078, 0x2cb8, 0x7858, 0xa085, 0x0004, 0x785a, 0x0c7f, 0x781b,
+ 0x0067, 0x0078, 0x1e50, 0x0c7e, 0x2960, 0x6000, 0xa084, 0x1000,
+ 0x00c0, 0x2c42, 0x6010, 0xa084, 0x000f, 0x00c0, 0x2c3c, 0xa18c,
+ 0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000,
+ 0x0078, 0x2c69, 0x68a0, 0xa084, 0x0200, 0x00c0, 0x2c3c, 0x6208,
+ 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x2c57, 0xa282,
+ 0x0019, 0x00c8, 0x2c5d, 0x2011, 0x0019, 0x0078, 0x2c5d, 0xa282,
+ 0x000c, 0x00c8, 0x2c5d, 0x2011, 0x000c, 0x6308, 0x831f, 0xa39c,
+ 0x00ff, 0xa382, 0x000c, 0x0048, 0x2c69, 0x0040, 0x2c69, 0x2019,
+ 0x000c, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa,
+ 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f,
+ 0x007c, 0x0c7e, 0x2960, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032,
+ 0x2019, 0x0000, 0x0078, 0x2c84, 0x78ab, 0x0001, 0x78ab, 0x0003,
+ 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085,
+ 0x0100, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x7148, 0x2160, 0x2008,
+ 0xa084, 0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612,
+ 0x78a4, 0xa084, 0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6, 0x6016,
+ 0x788a, 0xa6b4, 0x000f, 0x8637, 0x8204, 0x8004, 0xa084, 0x00ff,
+ 0xa605, 0x600e, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c,
+ 0x0c7e, 0x7048, 0x2060, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0,
+ 0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, 0x0c7f, 0x007c,
+ 0xa282, 0x0002, 0x00c0, 0x2db3, 0x7aa8, 0x6920, 0xa18d, 0x0080,
+ 0x6922, 0xa184, 0x0200, 0x0040, 0x2d0d, 0xa18c, 0xfdff, 0x6922,
+ 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8, 0x2db3, 0x1078, 0x2d54,
+ 0x1078, 0x2cb8, 0xa980, 0x0001, 0x200c, 0x1078, 0x2ed1, 0x1078,
+ 0x2c2b, 0x88ff, 0x0040, 0x2d00, 0x789b, 0x0060, 0x2800, 0x78aa,
+ 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2cfc,
+ 0x781b, 0x0053, 0x0078, 0x1e50, 0x781b, 0x0067, 0x0078, 0x1e50,
+ 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2d09, 0x781b, 0x0056, 0x0078,
+ 0x1e50, 0x781b, 0x0068, 0x0078, 0x1e50, 0xa282, 0x0002, 0x00c8,
+ 0x2d15, 0xa284, 0x0001, 0x0040, 0x2d1f, 0x7148, 0xa188, 0x0000,
+ 0x210c, 0xa18c, 0x2000, 0x00c0, 0x2d1f, 0x2011, 0x0000, 0x1078,
+ 0x2e0f, 0x1078, 0x2d54, 0x1078, 0x2cb8, 0x7858, 0xa085, 0x0004,
+ 0x785a, 0x781b, 0x0067, 0x0078, 0x1e50, 0x0c7e, 0x027e, 0x2960,
+ 0x6000, 0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x2d44, 0x6014,
+ 0xa084, 0x0040, 0x00c0, 0x2d42, 0xa18c, 0xffef, 0x6106, 0xa006,
+ 0x0078, 0x2d51, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002,
+ 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x6820, 0xa085, 0x0200,
+ 0x6822, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7048, 0x2060, 0x82ff,
+ 0x0040, 0x2d5c, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a,
+ 0x78a4, 0xa084, 0xffbf, 0xa205, 0x78a6, 0x6016, 0x788a, 0x6004,
+ 0xa084, 0xffef, 0x6006, 0x0c7f, 0x007c, 0xa684, 0x0020, 0x0040,
+ 0x2daf, 0x7888, 0xa084, 0x0040, 0x0040, 0x2daf, 0x7bb8, 0xa384,
+ 0x003f, 0x831b, 0x00c8, 0x2d7d, 0x8000, 0xa005, 0x0040, 0x2d96,
+ 0x831b, 0x00c8, 0x2d86, 0x8001, 0x0040, 0x2dab, 0xa684, 0x4000,
+ 0x0040, 0x2d96, 0x78b8, 0x801b, 0x00c8, 0x2d8f, 0x8000, 0xa084,
+ 0x003f, 0x00c0, 0x2dab, 0xa6b4, 0xbfff, 0x7e5a, 0x79d8, 0x7adc,
+ 0x2001, 0x0001, 0xa108, 0x00c8, 0x2d9f, 0xa291, 0x0000, 0x79d2,
+ 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x3474, 0x781b, 0x0065, 0x1078,
+ 0x3347, 0x0078, 0x1e50, 0x781b, 0x0065, 0x0078, 0x1e50, 0x781b,
+ 0x0068, 0x0078, 0x1e50, 0x1078, 0x2ddb, 0x781b, 0x0067, 0x0078,
+ 0x1e50, 0x1078, 0x2dc7, 0x781b, 0x0067, 0x0078, 0x1e50, 0x6827,
+ 0x0002, 0x1078, 0x2dcf, 0x781b, 0x0067, 0x0078, 0x1e50, 0x2001,
+ 0x0005, 0x0078, 0x2ddd, 0x2001, 0x000c, 0x0078, 0x2ddd, 0x2001,
+ 0x0006, 0x0078, 0x2ddd, 0x2001, 0x000d, 0x0078, 0x2ddd, 0x2001,
+ 0x0009, 0x0078, 0x2ddd, 0x2001, 0x0007, 0x789b, 0x007e, 0x78aa,
+ 0xa6b5, 0x0008, 0x7e5a, 0x007c, 0x077e, 0x873f, 0xa7bc, 0x000f,
+ 0x873b, 0x873b, 0x8703, 0xa0e0, 0x3800, 0xa7b8, 0x0020, 0x7f9a,
+ 0x79a4, 0xa184, 0x000f, 0x0040, 0x2dfd, 0xa184, 0xfff0, 0x78a6,
+ 0x6012, 0x6004, 0xa085, 0x0008, 0x6006, 0x8738, 0x8738, 0x7f9a,
+ 0x79a4, 0xa184, 0x0040, 0x0040, 0x2e0d, 0xa184, 0xffbf, 0x78a6,
+ 0x6016, 0x6004, 0xa085, 0x0010, 0x6006, 0x077f, 0x007c, 0x789b,
+ 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa,
+ 0x789b, 0x0060, 0x78ab, 0x0004, 0x007c, 0x2031, 0x0000, 0x2029,
+ 0x0032, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
+ 0x0001, 0x7daa, 0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x007c,
+ 0x157e, 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020,
+ 0x789a, 0x79a4, 0xa18c, 0xfff0, 0x2001, 0x3746, 0x2004, 0xa082,
+ 0x0028, 0x0040, 0x2e4b, 0x2021, 0x2eb8, 0x2019, 0x0014, 0x20a9,
+ 0x000c, 0x0078, 0x2e51, 0x2021, 0x2ec4, 0x2019, 0x0019, 0x20a9,
+ 0x000d, 0x2011, 0x0064, 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040,
+ 0x2e60, 0x8420, 0x2300, 0xa210, 0x0070, 0x2e60, 0x0078, 0x2e53,
+ 0x157f, 0x007c, 0x157e, 0x2011, 0x3746, 0x2214, 0xa282, 0x0032,
+ 0x0048, 0x2e76, 0x0040, 0x2e7a, 0x2021, 0x2eaa, 0x2019, 0x0011,
+ 0x20a9, 0x000e, 0x2011, 0x0032, 0x0078, 0x2e8c, 0xa282, 0x0028,
+ 0x0040, 0x2e84, 0x2021, 0x2eb8, 0x2019, 0x0014, 0x20a9, 0x000c,
+ 0x2011, 0x0064, 0x0078, 0x2e8c, 0x2021, 0x2ec4, 0x2019, 0x0019,
+ 0x20a9, 0x000d, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x2e9c,
+ 0x0048, 0x2e9c, 0x8420, 0x2300, 0xa210, 0x0070, 0x2e99, 0x0078,
+ 0x2e8c, 0x157f, 0xa006, 0x007c, 0x157f, 0x7a08, 0xa582, 0x00c8,
+ 0x00c8, 0x2ea7, 0xa285, 0x0040, 0x780a, 0x0078, 0x2ea7, 0x2404,
+ 0xa005, 0x007c, 0x2002, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404,
+ 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0a07, 0x0c07, 0x0e07,
+ 0x3202, 0x4202, 0x5202, 0x6202, 0x7202, 0x6605, 0x7605, 0x7805,
+ 0x7a05, 0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202, 0x4202, 0x5202,
+ 0x5404, 0x6404, 0x7404, 0x7604, 0x7804, 0x7a04, 0x7c04, 0x7e04,
+ 0x7f04, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00, 0x800c,
+ 0xa784, 0x0007, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e0,
+ 0x3880, 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b, 0x00c8, 0x2ee9,
+ 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x007c, 0x0f7e,
+ 0x2079, 0x0100, 0x2009, 0x3740, 0x2091, 0x8000, 0x2104, 0x0079,
+ 0x2ef9, 0x2f1f, 0x2f03, 0x2f03, 0x2f03, 0x2f03, 0x2f03, 0x2f03,
+ 0x2f01, 0x1078, 0x1e01, 0x784b, 0x0004, 0x68b4, 0xa085, 0x4000,
+ 0x68b6, 0x7858, 0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080,
+ 0x00c0, 0x2f1f, 0x0018, 0x2f1f, 0x681c, 0xa084, 0x0020, 0x00c0,
+ 0x2f1d, 0x781b, 0x00dc, 0x0078, 0x2f1f, 0x781b, 0x00e3, 0x2091,
+ 0x8001, 0x0f7f, 0x007c, 0x0c7e, 0x6814, 0x8007, 0xa084, 0x000f,
+ 0x8003, 0x8003, 0x8003, 0xa0e0, 0x3800, 0x6004, 0xa084, 0x000a,
+ 0x00c0, 0x2f56, 0x6108, 0xa194, 0xff00, 0x0040, 0x2f56, 0xa18c,
+ 0x00ff, 0x2001, 0x0019, 0xa106, 0x0040, 0x2f45, 0x2001, 0x0032,
+ 0xa106, 0x0040, 0x2f49, 0x0078, 0x2f4d, 0x2009, 0x0020, 0x0078,
+ 0x2f4f, 0x2009, 0x003f, 0x0078, 0x2f4f, 0x2011, 0x0000, 0x2100,
+ 0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x0c7f, 0x007c,
+ 0x781b, 0x0068, 0x0078, 0x1e50, 0x781b, 0x0067, 0x0078, 0x1e50,
+ 0x781b, 0x0056, 0x0078, 0x1e50, 0x781b, 0x0053, 0x0078, 0x1e50,
+ 0x781b, 0x00dc, 0x0078, 0x1e50, 0x781b, 0x00db, 0x0078, 0x1e50,
+ 0x781b, 0x00e3, 0x0078, 0x1e50, 0x781b, 0x00e2, 0x0078, 0x1e50,
+ 0x781b, 0x009d, 0x0078, 0x1e50, 0x781b, 0x009c, 0x0078, 0x1e50,
+ 0x6818, 0xa084, 0x8000, 0x0040, 0x2f87, 0x681b, 0x001d, 0x70a3,
+ 0x0001, 0x781b, 0x0047, 0x0078, 0x1e50, 0x007e, 0x7830, 0xa084,
+ 0x00c0, 0x00c0, 0x2fa4, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005,
+ 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x2fa4,
+ 0x7808, 0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0x7808, 0xa085,
+ 0x0002, 0x780a, 0x007c, 0x7830, 0xa084, 0x0040, 0x00c0, 0x2fab,
+ 0x0098, 0x2fb4, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a,
+ 0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040,
+ 0x2fc3, 0x0098, 0x2fc1, 0x78ac, 0x007e, 0x7808, 0xa085, 0x0002,
+ 0x780a, 0x007f, 0x007c, 0xa784, 0x0070, 0x0040, 0x2fd7, 0x0c7e,
+ 0x2d60, 0x2f68, 0x1078, 0x1dac, 0x2d78, 0x2c68, 0x0c7f, 0xa784,
+ 0x0008, 0x0040, 0x2fe4, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
+ 0x0040, 0x1e58, 0x0078, 0x2f58, 0xa784, 0x0004, 0x0040, 0x3017,
+ 0x78b8, 0xa084, 0x4001, 0x0040, 0x3017, 0x784b, 0x0008, 0x78ec,
+ 0xa084, 0x0003, 0x0040, 0x1e58, 0x78e4, 0xa084, 0x0007, 0xa086,
+ 0x0001, 0x00c0, 0x3017, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a,
+ 0x781b, 0x00e3, 0x0078, 0x1e50, 0x784b, 0x0008, 0x6818, 0xa084,
+ 0x8000, 0x0040, 0x3013, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040,
+ 0x3013, 0x681b, 0x0007, 0x781b, 0x00dc, 0x0078, 0x1e50, 0x681b,
+ 0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f, 0x0000, 0x6833,
+ 0x0000, 0x784b, 0x0008, 0x78e4, 0xa005, 0x00d0, 0x228e, 0xa084,
+ 0x0020, 0x0040, 0x228e, 0x0018, 0x228e, 0x0078, 0x2db9, 0x6b14,
+ 0x8307, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3800,
+ 0x2060, 0x2048, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0x2a60,
+ 0x007c, 0x0020, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
+ 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
+ 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
+ 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
+ 0x0020, 0x0000, 0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9848,
+ 0x0014, 0x0014, 0x98f6, 0x98e6, 0x0014, 0x0014, 0x0080, 0x00bd,
+ 0x0100, 0x0402, 0x2008, 0xf880, 0x0018, 0xa20a, 0x0014, 0x300b,
+ 0xa20c, 0x0014, 0xa200, 0x8838, 0x3806, 0x8839, 0x28c2, 0x9cc2,
+ 0xa805, 0x0864, 0xa83d, 0x3008, 0x28c1, 0x9cc2, 0xa201, 0x300c,
+ 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a, 0xa808,
+ 0x28e2, 0x9c9f, 0xa8f3, 0x0864, 0xa82b, 0x300c, 0xa801, 0x3008,
+ 0x28e1, 0x9c9f, 0x280d, 0xa204, 0x64c0, 0x67a0, 0x6fc0, 0x1814,
+ 0x883b, 0x7023, 0x8576, 0x8677, 0xa80f, 0x786e, 0x883e, 0xa80c,
+ 0x282b, 0xa205, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7023,
+ 0x8576, 0x8677, 0xa801, 0x883e, 0x206b, 0x28c1, 0x9cc2, 0x2044,
+ 0x2103, 0x20a2, 0x2081, 0xa8dc, 0xa207, 0x2901, 0xa80a, 0x0014,
+ 0xa203, 0x8000, 0x85a4, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xf601,
+ 0xa208, 0x856e, 0x866f, 0x0704, 0x3008, 0x9c9f, 0x0014, 0xa202,
+ 0x8000, 0x85a4, 0x3009, 0x84a8, 0x19e2, 0xf848, 0x8174, 0x86eb,
+ 0x85eb, 0x872e, 0x87a9, 0x883f, 0x08e6, 0xa8f1, 0xf861, 0xa8e8,
+ 0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2,
+ 0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0,
+ 0x1fe6, 0x0014, 0xa206, 0x6865, 0x817e, 0x842a, 0x1dc1, 0x8823,
+ 0x0016, 0x6042, 0x8008, 0xa8fa, 0x8000, 0x84a4, 0x8160, 0x842a,
+ 0xf021, 0x3008, 0x84a8, 0x1dc6, 0x20d7, 0x8822, 0x0016, 0x8000,
+ 0x2848, 0x1011, 0xa8fc, 0x3008, 0x8000, 0xa000, 0x2802, 0x1011,
+ 0xa8fd, 0xa886, 0x3008, 0x283d, 0x1011, 0xa8fd, 0xa209, 0x0017,
+ 0x300c, 0x8000, 0x85a4, 0x1de2, 0xdac1, 0x0014, 0xd301, 0x0014,
+ 0x26e0, 0x873a, 0xfaa2, 0x19f2, 0x1fe2, 0x0014, 0xa20b, 0x0014,
+ 0xa20d, 0x3806, 0x0210, 0x9ccc, 0x0704, 0x0000, 0x127e, 0x2091,
+ 0x2200, 0x2049, 0x312e, 0x7000, 0x7204, 0xa205, 0x720c, 0xa215,
+ 0x7008, 0xa084, 0xfff7, 0xa205, 0x0040, 0x3140, 0x1078, 0x31b9,
+ 0x127f, 0x2000, 0x007c, 0x6428, 0x84ff, 0x0040, 0x316f, 0x2c70,
+ 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x317f, 0x273c, 0x87fb, 0x00c0,
+ 0x315d, 0x0048, 0x3155, 0x1078, 0x1e01, 0x609c, 0xa075, 0x0040,
+ 0x316f, 0x0078, 0x3148, 0x2039, 0x3174, 0x2704, 0xae68, 0x6808,
+ 0xa630, 0x680c, 0xa529, 0x8421, 0x0040, 0x316f, 0x8738, 0x2704,
+ 0xa005, 0x00c0, 0x315e, 0x709c, 0xa075, 0x00c0, 0x3148, 0x007c,
+ 0x0000, 0x0005, 0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d,
+ 0x0000, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000,
+ 0x3174, 0x3171, 0x0000, 0x0000, 0x8000, 0x0000, 0x3174, 0x0000,
+ 0x317c, 0x3179, 0x0000, 0x0000, 0x0000, 0x0000, 0x317c, 0x0000,
+ 0x3177, 0x3177, 0x0000, 0x0000, 0x8000, 0x0000, 0x3177, 0x0000,
+ 0x317d, 0x317d, 0x0000, 0x0000, 0x0000, 0x0000, 0x317d, 0x127e,
+ 0x2091, 0x2200, 0x2079, 0x3700, 0x2071, 0x0010, 0x7007, 0x000a,
+ 0x7007, 0x0002, 0x7003, 0x0000, 0x2071, 0x0020, 0x7007, 0x000a,
+ 0x7007, 0x0002, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000,
+ 0x007c, 0x2049, 0x31b9, 0x2019, 0x0000, 0x7004, 0x8004, 0x00c8,
+ 0x31eb, 0x7007, 0x0012, 0x7108, 0x7008, 0xa106, 0x00c0, 0x31c3,
+ 0xa184, 0x01e0, 0x0040, 0x31ce, 0x1078, 0x1e01, 0xa184, 0x4000,
+ 0x00c0, 0x31c3, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0040, 0x31e0,
+ 0xa386, 0x0008, 0x0040, 0x31eb, 0xa386, 0x200c, 0x00c0, 0x31c3,
+ 0x7200, 0x8204, 0x0048, 0x31eb, 0x730c, 0xa384, 0x00ff, 0x0040,
+ 0x31eb, 0x1078, 0x1e01, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004,
+ 0xa084, 0x0008, 0x00c0, 0x31ef, 0x7007, 0x0012, 0x7108, 0x8103,
+ 0x0048, 0x31f4, 0x7003, 0x0000, 0x2049, 0x0000, 0x007c, 0x107e,
+ 0x007e, 0x127e, 0x157e, 0x2091, 0x2200, 0x7108, 0x1078, 0x320f,
+ 0x157f, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7204,
+ 0x7500, 0x730c, 0xa384, 0x0300, 0x00c0, 0x324e, 0xa184, 0x0060,
+ 0x00c0, 0x3287, 0x7008, 0x7108, 0xa106, 0x00c0, 0x321a, 0xa184,
+ 0x01e0, 0x00c0, 0x3287, 0xa184, 0x4000, 0x00c0, 0x321a, 0xa986,
+ 0x3474, 0x00c0, 0x3242, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0040,
+ 0x3239, 0xa386, 0x0008, 0x0040, 0x3242, 0xa386, 0x200c, 0x00c0,
+ 0x321a, 0x7200, 0x8204, 0x0048, 0x3242, 0x730c, 0xa384, 0x00ff,
+ 0x00c0, 0x324e, 0xa184, 0x0007, 0x0079, 0x3246, 0x3250, 0x327b,
+ 0x324e, 0x327b, 0x324e, 0x32d4, 0x324e, 0x32d2, 0x1078, 0x1e01,
+ 0x7007, 0x0002, 0x8aff, 0x00c0, 0x3259, 0x2049, 0x0000, 0x0078,
+ 0x325d, 0x1078, 0x344b, 0x00c0, 0x3259, 0x2704, 0xac00, 0xa088,
+ 0x0002, 0x2104, 0x8108, 0x6892, 0x2104, 0x688e, 0x8a07, 0x077e,
+ 0x007e, 0x6004, 0xa084, 0x0008, 0x0040, 0x3272, 0xa7ba, 0x3179,
+ 0x0078, 0x3274, 0xa7ba, 0x3171, 0x007f, 0xa73d, 0x2c00, 0x6886,
+ 0x6f8a, 0x077f, 0x007c, 0x7007, 0x0002, 0x8aff, 0x00c0, 0x3282,
+ 0x0078, 0x3286, 0x1078, 0x344b, 0x00c0, 0x3282, 0x007c, 0x7108,
+ 0x7008, 0xa106, 0x00c0, 0x3287, 0xa184, 0x4000, 0x00c0, 0x3287,
+ 0x7007, 0x0012, 0x7108, 0x7008, 0xa106, 0x00c0, 0x3292, 0xa184,
+ 0x4000, 0x00c0, 0x3292, 0x00e0, 0x329b, 0x2091, 0x6000, 0x00e0,
+ 0x329f, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004,
+ 0xa084, 0x0008, 0x00c0, 0x32a7, 0x7007, 0x0012, 0x7108, 0x8103,
+ 0x0048, 0x32ac, 0x7003, 0x0000, 0x7000, 0xa005, 0x00c0, 0x32c0,
+ 0x7004, 0xa005, 0x00c0, 0x32c0, 0x700c, 0xa005, 0x0040, 0x32c2,
+ 0x0078, 0x32a3, 0x2049, 0x0000, 0x1078, 0x2eef, 0x6818, 0xa084,
+ 0x8000, 0x0040, 0x32cd, 0x681b, 0x0002, 0x007c, 0x1078, 0x1e01,
+ 0x1078, 0x1e01, 0x1078, 0x3332, 0x7210, 0x7114, 0x700c, 0xa09c,
+ 0x00ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, 0x1078, 0x3332,
+ 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322, 0x630c, 0x2100,
+ 0xa31b, 0x2400, 0xa305, 0x0040, 0x32f7, 0x00c8, 0x32f7, 0x8412,
+ 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, 0x32de, 0x2b60,
+ 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040, 0x3303, 0xa7ba,
+ 0x3179, 0x0078, 0x3305, 0xa7ba, 0x3171, 0x007f, 0xa73d, 0x2c00,
+ 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x1078, 0x31b9, 0x007c, 0x8738,
+ 0x2704, 0xa005, 0x00c0, 0x3322, 0x609c, 0xa005, 0x0040, 0x332f,
+ 0x2060, 0x6004, 0xa084, 0x000f, 0xa080, 0x317f, 0x203c, 0x87fb,
+ 0x1040, 0x1e01, 0x8a51, 0x0040, 0x332e, 0x7008, 0x7508, 0xa52e,
+ 0x00c0, 0x3325, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c, 0x2051,
+ 0x0000, 0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x3346,
+ 0x6000, 0xa064, 0x00c0, 0x333d, 0x2d60, 0x6004, 0xa084, 0x000f,
+ 0xa080, 0x318f, 0x203c, 0x87fb, 0x1040, 0x1e01, 0x007c, 0x127e,
+ 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c,
+ 0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804,
+ 0xa084, 0x0008, 0x007f, 0x0040, 0x3361, 0xa0b8, 0x3179, 0x0078,
+ 0x3363, 0xa0b8, 0x3171, 0x7e08, 0xa6b5, 0x000c, 0x681c, 0xa084,
+ 0x0040, 0x0040, 0x336d, 0xa6b5, 0x0001, 0x7007, 0x0004, 0x7004,
+ 0xa084, 0x0004, 0x00c0, 0x336f, 0x2400, 0xa305, 0x00c0, 0x337a,
+ 0x0078, 0x339e, 0x2c58, 0x2704, 0x6104, 0xac60, 0x6000, 0xa400,
+ 0x701a, 0x6004, 0xa301, 0x701e, 0xa184, 0x0008, 0x0040, 0x338e,
+ 0x6010, 0xa001, 0x7022, 0x6014, 0xa001, 0x7026, 0x6208, 0x2400,
+ 0xa202, 0x7012, 0x620c, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007,
+ 0x0001, 0x2b60, 0x1078, 0x330f, 0x0078, 0x33a0, 0x1078, 0x344b,
+ 0x00c0, 0x339e, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091,
+ 0x2200, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
+ 0x33ac, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e,
+ 0x2091, 0x2200, 0x0d7f, 0x2049, 0x33b6, 0x7007, 0x0004, 0x7004,
+ 0xa084, 0x0004, 0x00c0, 0x33bf, 0x7e08, 0xa6b5, 0x000c, 0x681c,
+ 0xa084, 0x0020, 0x00c0, 0x33ce, 0xa6b5, 0x0001, 0x6828, 0x2050,
+ 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x317f, 0x273c, 0x87fb,
+ 0x00c0, 0x33e4, 0x0048, 0x33de, 0x1078, 0x1e01, 0x689c, 0xa065,
+ 0x0040, 0x33e8, 0x0078, 0x33d1, 0x1078, 0x344b, 0x00c0, 0x33e4,
+ 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e, 0x0d7e, 0x2091,
+ 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5, 0x000c, 0x681c,
+ 0xa084, 0x0040, 0x0040, 0x33fe, 0xa6b5, 0x0001, 0x2049, 0x33eb,
+ 0x6828, 0xa055, 0x0040, 0x3448, 0x2d70, 0x2e60, 0x7004, 0xa0bc,
+ 0x000f, 0xa7b8, 0x317f, 0x273c, 0x87fb, 0x00c0, 0x341a, 0x0048,
+ 0x3413, 0x1078, 0x1e01, 0x709c, 0xa075, 0x2060, 0x0040, 0x3448,
+ 0x0078, 0x3406, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b,
+ 0x0048, 0x3435, 0x8a51, 0x00c0, 0x3427, 0x1078, 0x1e01, 0x8738,
+ 0x2704, 0xa005, 0x00c0, 0x341b, 0x709c, 0xa075, 0x2060, 0x0040,
+ 0x3448, 0x2039, 0x3171, 0x0078, 0x3406, 0x8422, 0x8420, 0x831a,
+ 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b,
+ 0x00c8, 0x3444, 0x1078, 0x1e01, 0x2071, 0x0020, 0x0078, 0x336d,
+ 0x127f, 0x2000, 0x007c, 0x7008, 0x7508, 0xa52e, 0x00c0, 0x344b,
+ 0xa084, 0x0003, 0xa086, 0x0003, 0x0040, 0x3473, 0x2704, 0xac08,
+ 0x2104, 0x701a, 0x8108, 0x2104, 0x701e, 0x8108, 0x2104, 0x7012,
+ 0x8108, 0x2104, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x346e,
+ 0x8108, 0x2104, 0x7022, 0x8108, 0x2104, 0x7026, 0x7602, 0x7007,
+ 0x0001, 0x1078, 0x330f, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091,
+ 0x2200, 0x2049, 0x3474, 0x0d7f, 0x087f, 0x7108, 0x7008, 0xa106,
+ 0x00c0, 0x347d, 0xa184, 0x4000, 0x00c0, 0x347d, 0xa184, 0x0003,
+ 0x00c0, 0x3492, 0x6828, 0xa005, 0x0040, 0x34a0, 0x1078, 0x32d4,
+ 0x0078, 0x34a0, 0x00a0, 0x3499, 0x7108, 0x1078, 0x320f, 0x0078,
+ 0x347d, 0x7007, 0x0010, 0x00a0, 0x349b, 0x7108, 0x1078, 0x320f,
+ 0x7008, 0xa086, 0x0008, 0x00c0, 0x347d, 0x7003, 0x0000, 0x2049,
+ 0x0000, 0x127f, 0x2000, 0x007c, 0x127e, 0x147e, 0x137e, 0x157e,
+ 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049, 0x34ac, 0xad80, 0x0011,
+ 0x20a0, 0x2099, 0x0031, 0x700c, 0xa084, 0x00ff, 0x682a, 0x7007,
+ 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0040, 0x34ca, 0x8000,
+ 0x80ac, 0x53a5, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
+ 0x34cc, 0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f,
+ 0x127f, 0x2000, 0x007c, 0x2091, 0x6000, 0x78b0, 0xa005, 0x0040,
+ 0x34f0, 0x797c, 0x70d0, 0xa106, 0x00c0, 0x34f0, 0x7804, 0xa005,
+ 0x0040, 0x34f0, 0x7807, 0x0000, 0x0068, 0x34f0, 0x2091, 0x4080,
+ 0x7820, 0x8001, 0x7822, 0x00c0, 0x3550, 0x7824, 0x7822, 0x2091,
+ 0x8000, 0x78e0, 0xa005, 0x0040, 0x351d, 0x78c4, 0xa005, 0x00c0,
+ 0x351d, 0x3a10, 0xa284, 0x0002, 0x00c0, 0x350d, 0x78c7, 0x0007,
+ 0x2009, 0xff01, 0x200a, 0x0078, 0x351d, 0xa284, 0x0001, 0x00c0,
+ 0x3515, 0x78df, 0x0000, 0x0078, 0x351d, 0x78dc, 0xa005, 0x00c0,
+ 0x351d, 0x78c7, 0x0008, 0x78df, 0x0001, 0x2069, 0x3740, 0x6800,
+ 0xa084, 0x0007, 0x0040, 0x3534, 0xa086, 0x0002, 0x0040, 0x3534,
+ 0x6830, 0xa00d, 0x0040, 0x3534, 0x2104, 0xa005, 0x0040, 0x3534,
+ 0x8001, 0x200a, 0x0040, 0x35f2, 0x7848, 0xa005, 0x0040, 0x3550,
+ 0x8001, 0x784a, 0x00c0, 0x3550, 0x0f7e, 0x2079, 0x0100, 0x1078,
+ 0x2fa6, 0x0f7f, 0x1078, 0x1c4b, 0x68c4, 0xa005, 0x0040, 0x3550,
+ 0x8001, 0x68c6, 0x00c0, 0x3550, 0x68a3, 0x0000, 0x68a7, 0x0001,
+ 0x1078, 0x3557, 0x1078, 0x357c, 0x2091, 0x8001, 0x007c, 0x7834,
+ 0x8001, 0x7836, 0x00c0, 0x357b, 0x7838, 0x7836, 0x2091, 0x8000,
+ 0x7844, 0xa005, 0x00c0, 0x3566, 0x2001, 0x0101, 0x8001, 0x7846,
+ 0xa080, 0x4080, 0x2040, 0x2004, 0xa065, 0x0040, 0x357b, 0x6024,
+ 0xa005, 0x0040, 0x3577, 0x8001, 0x6026, 0x0040, 0x35ab, 0x6000,
+ 0x2c40, 0x0078, 0x356c, 0x007c, 0x7828, 0x8001, 0x782a, 0x00c0,
+ 0x35aa, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0, 0x3589, 0x2001,
+ 0x0080, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003, 0x8003, 0xa090,
+ 0x3880, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008, 0x0040, 0x35aa,
+ 0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x35a2, 0x8001, 0x2012,
+ 0x00c0, 0x35aa, 0x2304, 0xa084, 0xfff7, 0xa085, 0x0080, 0x201a,
+ 0x1078, 0x1c4b, 0x007c, 0x2069, 0x3740, 0x6800, 0xa005, 0x0040,
+ 0x35b5, 0x683c, 0xac06, 0x0040, 0x35f2, 0x601b, 0x0006, 0x60b4,
+ 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0060,
+ 0x6022, 0x6000, 0x2042, 0x6714, 0x6fb6, 0x1078, 0x1828, 0x6818,
+ 0xa005, 0x0040, 0x35cd, 0x8001, 0x681a, 0x6808, 0xa084, 0xffef,
+ 0x680a, 0x6810, 0x8001, 0x00d0, 0x35d7, 0x1078, 0x1e01, 0x6812,
+ 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078, 0x1990, 0x2069,
+ 0x3740, 0x2001, 0x0006, 0x68a2, 0x7944, 0xa184, 0x0100, 0x00c0,
+ 0x35ed, 0x69ba, 0x2001, 0x0004, 0x68a2, 0x1078, 0x1c46, 0x2091,
+ 0x8001, 0x007c, 0x2009, 0x374f, 0x2164, 0x2069, 0x0100, 0x1078,
+ 0x1dac, 0x601b, 0x0006, 0x6858, 0xa084, 0x3f00, 0x601e, 0x6020,
+ 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033,
+ 0x0000, 0x6830, 0xa084, 0x0040, 0x0040, 0x362e, 0x684b, 0x0004,
+ 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x361b, 0x0070,
+ 0x361b, 0x0078, 0x3612, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848,
+ 0xa084, 0x0001, 0x0040, 0x3628, 0x0070, 0x3628, 0x0078, 0x361f,
+ 0x20a9, 0x00fa, 0x0070, 0x362e, 0x0078, 0x362a, 0x6808, 0xa084,
+ 0xfffd, 0x680a, 0x681b, 0x0047, 0x2009, 0x3768, 0x200b, 0x0007,
+ 0x784c, 0x784a, 0x2091, 0x8001, 0x007c, 0x2079, 0x3700, 0x1078,
+ 0x3668, 0x1078, 0x364c, 0x1078, 0x365a, 0x7833, 0x0000, 0x7847,
+ 0x0000, 0x784b, 0x0000, 0x007c, 0x2019, 0x000c, 0x2011, 0x3746,
+ 0x2204, 0xa086, 0x003c, 0x0040, 0x3657, 0x2019, 0x0008, 0x7b2a,
+ 0x7b2e, 0x007c, 0x2019, 0x0039, 0x2011, 0x3746, 0x2204, 0xa086,
+ 0x003c, 0x0040, 0x3665, 0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c,
+ 0x2019, 0x3971, 0x2011, 0x3746, 0x2204, 0xa086, 0x003c, 0x0040,
+ 0x3673, 0x2019, 0x2626, 0x7b22, 0x7b26, 0x783f, 0x0000, 0x7843,
+ 0x000a, 0x007c, 0x3f42
+};
+unsigned short risc_code_length01 = 0x267b;
+
diff --git a/private/ntos/miniport/qlogic/makedsk.bat b/private/ntos/miniport/qlogic/makedsk.bat
new file mode 100644
index 000000000..900260f9f
--- /dev/null
+++ b/private/ntos/miniport/qlogic/makedsk.bat
@@ -0,0 +1,4 @@
+copy oemsetup.inf a:\
+copy ql10wnt.sys a:\
+copy qlscsi a:\
+copy txtsetup.oem a:\
diff --git a/private/ntos/miniport/qlogic/makefile b/private/ntos/miniport/qlogic/makefile
new file mode 100644
index 000000000..58189757d
--- /dev/null
+++ b/private/ntos/miniport/qlogic/makefile
@@ -0,0 +1,7 @@
+#
+# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
+# file to this component. This file merely indirects to the real make file
+# that is shared by all the driver components of the Windows NT DDK
+#
+
+!INCLUDE $(NTMAKEENV)\makefile.def
diff --git a/private/ntos/miniport/qlogic/oemsetup.inf b/private/ntos/miniport/qlogic/oemsetup.inf
new file mode 100644
index 000000000..8ec7286f1
--- /dev/null
+++ b/private/ntos/miniport/qlogic/oemsetup.inf
@@ -0,0 +1,571 @@
+;-----------------------------------------------------------------------
+; OPTION TYPE
+; -----------
+; This identifies the Option type we are dealing with. The different
+; possible types are:
+;
+; COMPUTER, VIDEO, POINTER, KEYBOARD, LAYOUT, SCSI, TAPE, PRINTER, ...
+;-----------------------------------------------------------------------
+
+[Identification]
+ OptionType = SCSI
+
+;-----------------------------------------------------------------------
+; LANGUAGES SUPPORTED
+; -------------------
+;
+; The languages supported by the INF, For every language supported
+; we need to have a separate text section for every displayable text
+; section.
+;
+;-----------------------------------------------------------------------
+
+[LanguagesSupported]
+ ENG
+
+
+;-----------------------------------------------------------------------
+; OPTION LIST
+; -----------
+; This section lists the Option key names. These keys are locale
+; independent and used to represent the option in a locale independent
+; manner.
+;
+;-----------------------------------------------------------------------
+
+[Options]
+ "QLA100" = ql10wnt
+ "QLA10035" = ql10nt35
+
+;-----------------------------------------------------------------------
+; OPTION TEXT SECTION
+; -------------------
+; These are text strings used to identify the option to the user. There
+; are separate sections for each language supported. The format of the
+; section name is "OptionsText" concatenated with the Language represented
+; by the section.
+;
+;-----------------------------------------------------------------------
+
+[OptionsTextENG]
+ "QLA100" = "QLogic Fast!SCSI/QLA100 (Windows NT V3.1)"
+ "QLA10035" = "QLogic Fast!SCSI/QLA100 (Windows NT V3.5)"
+
+;-----------------------------------------------------------------------------------------
+; SCSI MINIPORT DRIVERS:
+;
+; Order of the information:
+;
+; Class driver = Type, Group, ErrorControl, Tag, EventMessageFile, TypesSupported
+;
+;-----------------------------------------------------------------------------------------
+
+[MiniportDrivers]
+ ql10wnt = !SERVICE_KERNEL_DRIVER, "SCSI Miniport", !SERVICE_ERROR_NORMAL, 31, %SystemRoot%\System32\IoLogMsg.dll , 7
+ ql10nt35 = !SERVICE_KERNEL_DRIVER, "SCSI Miniport", !SERVICE_ERROR_NORMAL, 31, %SystemRoot%\System32\IoLogMsg.dll , 7
+
+;---------------------------------------------------------------------------
+; 1. Identify
+;
+; DESCRIPTION: To verify that this INF deals with the same type of options
+; as we are choosing currently.
+;
+; INPUT: None
+;
+; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL
+; $($R1): Option Type (COMPUTER ...)
+; $($R2): Diskette description
+;---------------------------------------------------------------------------
+
+[Identify]
+ ;
+ ;
+ read-syms Identification
+
+ set Status = STATUS_SUCCESSFUL
+ set Identifier = $(OptionType)
+ set Media = #("Source Media Descriptions", 1, 1)
+
+ Return $(Status) $(Identifier) $(Media)
+
+
+
+;------------------------------------------------------------------------
+; 2. ReturnOptions:
+;
+; DESCRIPTION: To return the option list supported by this INF and the
+; localised text list representing the options.
+;
+;
+; INPUT: $($0): Language used. ( ENG | FRN | ... )
+;
+; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL |
+; STATUS_NOLANGUAGE
+; STATUS_FAILED
+;
+; $($R1): Option List
+; $($R2): Option Text List
+;------------------------------------------------------------------------
+
+[ReturnOptions]
+ ;
+ ;
+ set Status = STATUS_FAILED
+ set OptionList = {}
+ set OptionTextList = {}
+
+ ;
+ ; Check if the language requested is supported
+ ;
+ set LanguageList = ^(LanguagesSupported, 1)
+ Ifcontains(i) $($0) in $(LanguageList)
+ goto returnoptions
+ else
+ set Status = STATUS_NOLANGUAGE
+ goto finish_ReturnOptions
+ endif
+
+ ;
+ ; form a list of all the options and another of the text representing
+ ;
+
+returnoptions = +
+ set OptionList = ^(Options, 0)
+ set OptionTextList = ^(OptionsText$($0), 1)
+ set Status = STATUS_SUCCESSFUL
+
+finish_ReturnOptions = +
+ Return $(Status) $(OptionList) $(OptionTextList)
+
+
+;
+; 3. InstallOption:
+;
+; FUNCTION: To copy files representing Options
+; To configure the installed option
+; To update the registry for the installed option
+;
+; INPUT: $($0): Language to use
+; $($1): OptionID to install
+; $($2): SourceDirectory
+; $($3): AddCopy (YES | NO)
+; $($4): DoCopy (YES | NO)
+; $($5): DoConfig (YES | NO)
+;
+; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL |
+; STATUS_NOLANGUAGE |
+; STATUS_USERCANCEL |
+; STATUS_FAILED
+;
+
+[InstallOption]
+
+ ;
+ ; Set default values for
+ ;
+ set Status = STATUS_FAILED
+ set DrivesToFree = {}
+
+ ;
+ ; extract parameters
+ ;
+ set Option = $($1)
+ set SrcDir = $($2)
+ set AddCopy = $($3)
+ set DoCopy = $($4)
+ set DoConfig = $($5)
+
+ ;
+ ; Check if the language requested is supported
+ ;
+ set LanguageList = ^(LanguagesSupported, 1)
+ Ifcontains(i) $($0) in $(LanguageList)
+ else
+ set Status = STATUS_NOLANGUAGE
+ goto finish_InstallOption
+ endif
+ read-syms Strings$($0)
+
+ ;
+ ; check to see if Option is supported.
+ ;
+
+ set OptionList = ^(Options, 0)
+ ifcontains $(Option) in $(OptionList)
+ else
+ Debug-Output "SCSI.INF: SCSI option is not supported."
+ goto finish_InstallOption
+ endif
+ set OptionList = ""
+
+ ;
+ ; Option has been defined already
+ ;
+
+ set MiniportDriver = #(Options, $(Option), 1)
+ set Type = $(#(MiniportDrivers, $(MiniportDriver), 1))
+ set Group = #(MiniportDrivers, $(MiniportDriver), 2)
+ set ErrorControl = $(#(MiniportDrivers, $(MiniportDriver), 3))
+ set Tag = #(MiniportDrivers, $(MiniportDriver), 4)
+ set EventMessageFile = #(MiniportDrivers, $(MiniportDriver), 5)
+ set TypesSupported = #(MiniportDrivers, $(MiniportDriver), 6)
+
+ set Start = $(!SERVICE_BOOT_START)
+
+installtheoption = +
+
+ ;
+ ; Code to add files to copy list
+ ;
+
+ ifstr(i) $(AddCopy) == "YES"
+ set DoActualCopy = NO
+ set FileToCheck = #(Files-ScsiMiniportDrivers, $(MiniportDriver), 2)
+ LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(!STF_WINDOWSSYSPATH)"\drivers\"$(FileToCheck)
+ ifstr(i) $(STATUS) == NO
+ set DoActualCopy = YES
+ endif
+
+ ifstr(i) $(DoActualCopy) == NO
+ shell "subroutn.inf" DriversExist $($0) $(String1)
+ ifint $($ShellCode) != $(!SHELL_CODE_OK)
+ Debug-Output "SCSI.INF: shelling DriversExist failed"
+ goto finish_InstallOption
+ endif
+
+ ifstr(i) $($R0) == STATUS_CURRENT
+ else-ifstr(i) $($R0) == STATUS_NEW
+ set DoActualCopy = YES
+ else-ifstr(i) $($R0) == STATUS_USERCANCEL
+ Debug-Output "SCSI.INF: User cancelled SCSI installation"
+ goto finish_InstallOption
+ else
+ Debug-Output "SCSI.INF: Error reported in DriversExist routine in SUBROUTN.INF"
+ goto finish_InstallOption
+ endif
+ endif
+
+ ifstr(i) $(DoActualCopy) == YES
+
+ shell "subroutn.inf" DoAskSourceEx $(SrcDir) $(String2)
+ ifint $($ShellCode) != $(!SHELL_CODE_OK)
+ Debug-Output "SCSI.INF: shelling DoAskSourceEx failed"
+ goto finish_InstallOption
+ endif
+
+ ifstr(i) $($R0) == STATUS_SUCCESSFUL
+ set SrcDir = $($R1)
+ ifstr(i) $($R2) != ""
+ set DrivesToFree = >($(DrivesToFree), $($R2))
+ endif
+ else
+ Debug-Output "SCSI.INF: User cancelled asking source."
+ goto finish_InstallOption
+ endif
+
+ install Install-AddCopyOption
+ ifstr(i) $(STF_INSTALL_OUTCOME) != "STF_SUCCESS"
+ Debug-Output "Adding SCSI files to copy list failed"
+ goto finish_InstallOption
+ endif
+ else
+ set DoCopy = NO
+ endif
+
+ endif
+
+ ifstr(i) $(DoCopy) == "YES"
+ read-syms ProgressCopy$($0)
+ install Install-DoCopyOption
+ ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_FAILURE"
+ Debug-Output "Copying files failed"
+ goto finish_InstallOption
+ else-ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_USERQUIT"
+ set Status = STATUS_USERCANCEL
+ goto finish_InstallOption
+ endif
+ endif
+
+ ifstr(i) $(DoConfig) == "YES"
+ ;
+ ; first run a privilege check on modifying the setup node
+ ;
+
+ shell "registry.inf" CheckSetupModify
+ ifint $($ShellCode) != $(!SHELL_CODE_OK)
+ goto finish_InstallOption
+ endif
+
+ ifstr(i) $($R0) != STATUS_SUCCESSFUL
+ goto finish_InstallOption
+ endif
+
+ ;
+ ; then make a new SCSI entry, the entry is created automatically
+ ; enabled
+ ;
+
+ set ServiceNode = $(MiniportDriver)
+ set ServiceBinary = System32\drivers\#(Files-ScsiMiniportDrivers, $(MiniportDriver), 2)
+
+ set ServicesValues = { +
+ {Type, 0, $(!REG_VT_DWORD), $(Type) }, +
+ {Start, 0, $(!REG_VT_DWORD), $(Start) }, +
+ {Group, 0, $(!REG_VT_SZ), $(Group) }, +
+ {ErrorControl, 0, $(!REG_VT_DWORD), $(ErrorControl) }, +
+ {Tag, 0, $(!REG_VT_DWORD), $(Tag) }, +
+ {BinaryPathName, 0, $(!REG_VT_EXPAND_SZ), $(ServiceBinary) } +
+ }
+ set ParametersValues = ""
+ set DeviceValues = {}
+ set EventLogValues = { +
+ {EventMessageFile, 0, $(!REG_VT_EXPAND_SZ), $(EventMessageFile) }, +
+ {TypesSupported, 0, $(!REG_VT_DWORD), $(TypesSupported) } +
+ }
+
+ shell "registry.inf" MakeServicesEntry $(ServiceNode) +
+ $(ServicesValues) +
+ $(ParametersValues) +
+ $(DeviceValues) +
+ $(EventLogValues) +
+ Parameters
+
+
+
+ ifint $($ShellCode) != $(!SHELL_CODE_OK)
+ Debug-Output "Couldn't execute MakeServicesEntry in registry.inf"
+ goto finish_InstallOption
+ endif
+
+ ifstr(i) $($R0) != STATUS_SUCCESSFUL
+ Debug-Output "MakeServicesEntry failed for SCSI"
+ goto finish_InstallOption
+ endif
+
+ endif
+
+ set Status = STATUS_SUCCESSFUL
+finish_InstallOption = +
+ ForListDo $(DrivesToFree)
+ LibraryProcedure STATUS,$(!LIBHANDLE), DeleteNetConnection $($) "TRUE"
+ EndForListDo
+
+ Return $(Status)
+
+
+[Install-AddCopyOption]
+
+ ;
+ ; Add the files to the copy list
+ ;
+ AddSectionKeyFileToCopyList Files-ScsiMiniportDrivers +
+ $(MiniportDriver) +
+ $(SrcDir) +
+ $(!STF_WINDOWSSYSPATH)\drivers
+
+ exit
+
+
+[Install-DoCopyOption]
+
+ ;
+ ; Copy files in the copy list
+ ;
+ CopyFilesInCopyList
+ exit
+
+;-------------------------------------------------------------------------
+; 4. DeInstallOption:
+;
+; FUNCTION: To remove files representing Option
+; To remove the registry entry corresponding to the Option
+;
+; INPUT: $($0): Language to use
+; $($1): OptionID to install
+;
+; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL |
+; STATUS_NOLANGUAGE |
+; STATUS_USERCANCEL |
+; STATUS_FAILED
+;-------------------------------------------------------------------------
+[DeInstallOption]
+ ;
+ ; Set default values for
+ ;
+ set Status = STATUS_FAILED
+ ;
+ ; extract parameters
+ ;
+ set Option = $($1)
+
+ ;
+ ; Check if the language requested is supported
+ ;
+ set LanguageList = ^(LanguagesSupported, 1)
+ Ifcontains(i) $($0) in $(LanguageList)
+ else
+ set Status = STATUS_NOLANGUAGE
+ goto finish_DeInstallOption
+ endif
+ read-syms Strings$($0)
+
+ ;
+ ; check to see if Option is supported.
+ ;
+
+ set OptionList = ^(Options, 0)
+ ifcontains $(Option) in $(OptionList)
+ else
+ goto finish_DeInstallOption
+ endif
+ set OptionList = ""
+
+ ;
+ ; fetch details about option
+ ;
+
+ set MiniportDriver = #(Options, $(Option), 1)
+ set MiniportFile = #(Files-ScsiMiniportDrivers, $(MiniportDriver), 2)
+ set FilePath = $(!STF_WINDOWSSYSPATH)"\drivers\"$(MiniportFile)
+
+ ;
+ ; check to see if file is installed
+ ; if not give success
+ ;
+
+ LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FilePath)
+ ifstr(i) $(STATUS) == "NO"
+ set Status = STATUS_SUCCESSFUL
+ goto finish_DeInstallOption
+ endif
+
+ shell "registry.inf" GetServicesEntryStart $(MiniportDriver)
+ ifstr(i) $($R0) != "STATUS_SUCCESSFUL"
+ ; this could happen if there is no start value or there is no
+ ; key, in which case the option is not installed
+ set Status = STATUS_SUCCESSFUL
+ goto finish_DeInstallOption
+ endif
+
+ ifstr(i) $($R1) == $(!SERVICE_BOOT_START)
+ shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) "WARNING" $(String3)
+ ifstr(i) $($R0) != STATUS_SUCCESSFUL
+ goto do_removal
+ endif
+ ifstr(i) $($R1) == "CANCEL"
+ goto finish_DeInstallOption
+ endif
+ endif
+
+do_removal =+
+ ;
+ ; disable the registry entry
+ ;
+
+ shell "registry.inf" RemoveServicesEntry $(MiniportDriver)
+ ifint $($ShellCode) != $(!SHELL_CODE_OK)
+ Debug-Output "SCSI.INF: Failed to shell RemoveServicesEntry"
+ goto finish_DeInstallOption
+ endif
+
+ ifstr(i) $($R0) != STATUS_SUCCESSFUL
+ Debug-Output "SCSI.INF: Failed to disable services entry"
+ goto finish_DeInstallOption
+ endif
+
+ ;
+ ; we won't remove the file because we can only do so during the next boot.
+ ; if the user chooses to reinstall the same driver during this boot
+ ; he will still end up deleting the driver on next boot. if the file
+ ; should be deleted a warning should be put up saying that the user should
+ ; not try to reinstall the driver during this boot
+ ;
+ ; AddFileToDeleteList $(FilePath)
+
+ set Status = STATUS_SUCCESSFUL
+
+finish_DeInstallOption =+
+ return $(Status)
+
+
+;-------------------------------------------------------------------------
+; 5. GetInstalledOptions:
+;
+; FUNCTION: To find out the list of options which are installed
+;
+; INPUT: $($0): Language to Use
+;
+; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL |
+; STATUS_FAILED
+;
+; $($R1): List of options installed
+; $($R2): Option installed Text List
+;-------------------------------------------------------------------------
+[GetInstalledOptions]
+ set Status = STATUS_FAILED
+ set InstalledOptions = {}
+ set InstalledOptionsText = {}
+
+ ;
+ ; Check if the language requested is supported
+ ;
+ set LanguageList = ^(LanguagesSupported, 1)
+ Ifcontains(i) $($0) in $(LanguageList)
+ else
+ set Status = STATUS_NOLANGUAGE
+ goto finish_GetInstalledOptions
+ endif
+
+ set OptionList = ^(Options, 0)
+ ForListDo $(OptionList)
+ set MiniportDriver = #(Options, $($), 1)
+ set MiniportFile = #(Files-ScsiMiniportDrivers, $(MiniportDriver), 2)
+ set FilePath = $(!STF_WINDOWSSYSPATH)"\drivers\"$(MiniportFile)
+ LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FilePath)
+ ifstr(i) $(STATUS) == "YES"
+ shell "registry.inf" GetServicesEntryStart $(MiniportDriver)
+ ifint $($ShellCode) == $(!SHELL_CODE_OK)
+ ifstr(i) $($R0) == STATUS_SUCCESSFUL
+ ifstr(i) $($R1) != $(!SERVICE_DISABLED)
+
+ set OptionText = #(OptionsText$($0), $($), 1)
+ set InstalledOptions = >($(InstalledOptions), $($))
+ set InstalledOptionsText = >($(InstalledOptionsText), $(OptionText))
+
+ endif
+ endif
+ endif
+ endif
+ EndForListDo
+ set Status = STATUS_SUCCESSFUL
+finish_GetInstalledOptions =+
+ Return $(Status) $(InstalledOptions) $(InstalledOptionsText)
+
+
+;**************************************************************************
+; PROGRESS GUAGE VARIABLES
+;**************************************************************************
+
+[ProgressCopyENG]
+ ProCaption = "Windows NT Setup"
+ ProCancel = "Cancel"
+ ProCancelMsg = "Windows NT is not correcly installed. Are you sure you want "+
+ "to cancel copying files?"
+ ProCancelCap = "Setup Message"
+ ProText1 = "Copying:"
+ ProText2 = "To:"
+
+[StringsENG]
+ String1 = "SCSI Adapter"
+ String2 = "Please enter the full path to the OEM SCSI "+
+ "Adapter files. Then choose Continue."
+ String3 = "The SCSI Adapter has been marked as a boot device. Removing "+
+ "it may cause the system not to boot."$(!LF)$(!LF)"Are you sure "+
+ "you want to remove the Adapter."
+
+[Source Media Descriptions]
+ 1 = "QLogic SCSI Software Diskette" , TAGFILE = qlscsi
+
+[Files-ScsiMiniportDrivers]
+ql10wnt = 1,ql10wnt.sys , SIZE=36864
+ql10nt35 = 1,ql10nt35.sys , SIZE=36864
diff --git a/private/ntos/miniport/qlogic/qlisp.c b/private/ntos/miniport/qlogic/qlisp.c
new file mode 100644
index 000000000..0d3991dfd
--- /dev/null
+++ b/private/ntos/miniport/qlogic/qlisp.c
@@ -0,0 +1,3050 @@
+/************************************************************************/
+/* */
+/* Driver Name: QL10WNT.SYS - NT Miniport Driver for QLogic ISP1020 */
+/* */
+/* Source File Name: QLISP.C */
+/* */
+/* Function: Main driver module containing code for processing I/O */
+/* requests from NT and all code for interfacing to the */
+/* ISP1020 chip. */
+/* */
+/************************************************************************/
+/* */
+/* NOTICE */
+/* */
+/* COPYRIGHT 1994-1995 QLOGIC CORPORATION */
+/* ALL RIGHTS RESERVED */
+/* */
+/* This computer program is CONFIDENTIAL and a TRADE SECRET */
+/* of QLOGIC CORPORATION. The receipt or possesion of this */
+/* program does not convey any rights to reproduce or disclose */
+/* its contents, or to manufacture, use, or sell anything that */
+/* it may describe, in whole or in part, without the specific */
+/* written consent of QLOGIC CORPORATION. Any reproduction of */
+/* this program without the express written consent of QLOGIC */
+/* CORPORATION is a violation of the copyright laws and may */
+/* subject you to criminal prosecution. */
+/* */
+/************************************************************************/
+/* */
+/* Revision history: */
+/* */
+/* 1.00 2/23/94 TWT Initial version for NT Version 3.1 */
+/* */
+/* 1.01 5/2/94 TWT Fix interrupt sharing problem (set */
+/* InterruptMode to LevelSensitive) */
+/* */
+/* 1.02 5/6/94 TWT Force PCI bus master enabled */
+/* */
+/* 1.03 5/23/94 TWT Add conditional assembly for supporting */
+/* new features of NT Version 3.5, set bus */
+/* type to PCI and let SCSI port driver */
+/* get PCI configuration, support SCSI */
+/* IDs up to 15 (NT 3.5 driver only) */
+/* */
+/* 1.10 6/3/94 TWT Modify QLFindAdapter routine for NT 3.5 */
+/* to use NT service calls to access PCI */
+/* config space (this will allow driver to */
+/* operate on all PCI systems supported by */
+/* NT), modify QLFindAdapter routine for */
+/* NT 3.1 to support both methods of */
+/* accessing PCI config space */
+/* */
+/* 1.11 6/8/94 TWT Fix problem with accessing config space */
+/* on Opti chip set (can only read data */
+/* reg one time per write to address reg) */
+/* */
+/* 1.12 7/26/94 TWT Update RISC code to version 1.14 */
+/* */
+/* 1.13 8/17/94 TWT Set only 1 RISC retry and no delay */
+/* (NT 3.5 Disk Administrator problem) */
+/* */
+/* 2.00 8/11/94 TWT Modifications for the Chicago OS, add */
+/* QLAdapterState entry, remove path from */
+/* includes, modify NovramDelay to call */
+/* ScsiPortStallExecution, update NOVRAM */
+/* drive default parameters */
+/* */
+/* 2.01 8/25/94 TWT Replaced QLFindAdapter with code from */
+/* CHC, added support for SRB flag to */
+/* disable auto request sense (requires */
+/* RISC code version 1.15), add code to */
+/* QLAdapterState for returning control to */
+/* ROM BIOS on shutdown, check for passed */
+/* in InitiatorBusId, update RISC code to */
+/* version 1.15, add temporary conditional */
+/* assembly code for Chicago beta versions */
+/* not supporting ConfigInfo->SlotNumber */
+/* */
+/* 2.02 11/17/94 TWT Don't issue error log message for */
+/* selection timeout on Inquiry command, */
+/* restart RISC command queue after check */
+/* condition and auto-sense disabled, add */
+/* support for soft termination, add */
+/* support for 60 MHz adapters, fix bug */
+/* leaving tagged queueing disabled if */
+/* NVRAM not present or not programmed */
+/* */
+/* 2.03 11/28/94 TWT Update RISC code to version 1.16 */
+/* */
+/* 2.04 11/30/94 TWT Remove temporary code for pre-beta 2 */
+/* version of Chicago (SlotNumber is now */
+/* supported) */
+/* */
+/* 2.05 12/19/94 TWT Added reset delays to QLResetIsp to fix */
+/* problem on faster Alpha machines */
+/* */
+/* 2.06 1/4/95 TWT Set MaximumNumberOfTargets to 15 instead*/
+/* of 16 for Chicago Beta 2 (if passed in */
+/* value is 7) */
+/* */
+/* 2.07 1/6/95 TWT Add support for QLVER utility and */
+/* copyright string */
+/* */
+/* 2.08 2/7/95 TWT Update build and install scripts for */
+/* driver name change to match MS release, */
+/* modify init code to skip RISC code load */
+/* if newer version already loaded, update */
+/* RISC code to version 1.18, add driver */
+/* delay to match RISC SCSI reset delay, */
+/* cleanup unneeded test in MailboxCommand */
+/* */
+/* 2.09 3/28/95 TWT Update RISC code to version 1.22 */
+/* */
+/* 2.10 4/14/95 TWT Update RISC code to version 1.25 */
+/* */
+/* 2.11 4/27/95 TWT Update RISC code to version 1.27, add */
+/* software termination modification for */
+/* DEC boards with ISP1020A */
+/* */
+/* 2.12 5/5/95 TWT Fix problem with system hang when RISC */
+/* request queue full and SRB returned to */
+/* port driver with FALSE status (thanks */
+/* to Chao Chen for finding this problem) */
+/* */
+/* 2.13 5/9/95 TWT Renamed subroutine WaitQueueSpace to */
+/* CheckQueueSpace and modified to not wait*/
+/* for space in the RISC request queue, */
+/* modified QLStartIo to throttle back cmds*/
+/* from port driver when request queue is */
+/* nearly full, add delays to QLResetIsp */
+/* */
+/************************************************************************/
+
+
+// #define NT_VERSION_31 1 // If defined, compile for NT Version 3.1
+
+#include "miniport.h"
+#include "scsi.h"
+#include "qlisp.h"
+
+#if DBG
+#define QLPrint(arg) ScsiDebugPrint arg
+#else
+#define QLPrint(arg)
+#endif
+
+// Name and version strings for QLVER utility
+
+CHAR CompanyName[] = "$$QLNAME$$" \
+"QLogic Corporation \0";
+
+CHAR Version[] = "$$QLVER$$ 2.13\0";
+
+// Copyright string
+
+CHAR QLogicCR[] = "Copyright (C) QLogic Corporation 1994-1995. All rights reserved.";
+
+/* External RISC code module definitions */
+
+extern USHORT risc_code_version;
+extern USHORT risc_code_addr01;
+extern USHORT risc_code01[];
+extern USHORT risc_code_length01;
+
+
+/************************************************************************/
+/* Driver SRB extension */
+/************************************************************************/
+
+typedef struct _SRB_EXTENSION
+{
+ ULONG SrbExtensionFlags;
+} SRB_EXTENSION, *PSRB_EXTENSION;
+
+#define SRB_EXT(x) ((PSRB_EXTENSION)(x->SrbExtension))
+
+/* SrbExtensionFlags bit definitions */
+
+
+/************************************************************************/
+/* Driver logical unit extension */
+/************************************************************************/
+
+typedef struct _HW_LUN_EXTENSION
+{
+ ULONG LunFlags;
+} HW_LUN_EXTENSION, *PHW_LUN_EXTENSION;
+
+/* LunFlags bit definitions */
+
+#define LFLG_INIT_COMPLETE 0x00000001 // completed initialization
+
+
+/************************************************************************/
+/* Driver noncached memory extension (for DMA interface to ISP1020) */
+/************************************************************************/
+
+typedef struct _NONCACHED_EXTENSION
+{
+ QUEUE_ENTRY RequestQueue[REQUEST_QUEUE_DEPTH];
+ QUEUE_ENTRY ResponseQueue[RESPONSE_QUEUE_DEPTH];
+} NONCACHED_EXTENSION, *PNONCACHED_EXTENSION;
+
+
+/************************************************************************/
+/* Driver device object extension */
+/************************************************************************/
+
+typedef struct _HW_DEVICE_EXTENSION
+{
+ ULONG AdapterFlags;
+ PISP_REGS Adapter; // Address of the ISP
+
+ // Request and Response queues and pointers
+
+ PNONCACHED_EXTENSION NoncachedExtension;
+ ULONG ppRequestQueue;
+ ULONG ppResponseQueue;
+ PQUEUE_ENTRY pRequestQueue;
+ PQUEUE_ENTRY pResponseQueue;
+ USHORT request_in;
+ USHORT request_out;
+ USHORT response_out;
+ USHORT queue_space;
+ PQUEUE_ENTRY request_ptr;
+ PQUEUE_ENTRY response_ptr;
+
+ // Configuration NOVRAM paramters
+
+ UCHAR Config_Reg;
+ UCHAR Initiator_SCSI_Id :4;
+ UCHAR Host_Adapter_Enable :1;
+ UCHAR DisableLoadRiscCode :1;
+ UCHAR Bus_Reset_Delay;
+ UCHAR Retry_Count;
+ UCHAR Retry_Delay;
+ UCHAR ASync_Data_Setup_Time :4;
+ UCHAR REQ_ACK_Active_Negation :1;
+ UCHAR DATA_Active_Negation :1;
+ UCHAR Data_DMA_Burst_Enable :1;
+ UCHAR Cmd_DMA_Burst_Enable :1;
+ UCHAR Tag_Age_Limit;
+ UCHAR Termination_Low_Enable :1;
+ UCHAR Termination_High_Enable :1;
+ UCHAR PCMC_Burst_Enable :1;
+ UCHAR Sixty_MHz_Enable :1;
+ USHORT Selection_Timeout;
+ USHORT Max_Queue_Depth;
+ struct
+ {
+ UCHAR Capability;
+ UCHAR Execution_Throttle;
+ UCHAR Sync_Period;
+ UCHAR Sync_Offset :4;
+ UCHAR Device_Enable :1;
+ } Id[NUM_SCSI_IDS];
+
+ PSCSI_REQUEST_BLOCK WaitingSrb;
+} HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION;
+
+/* AdapterFlags bit definitions */
+
+#define AFLG_INIT_COMPLETE 0x00000001 // completed initialization
+#define AFLG_TAGGED_QUEUING 0x00000002 // enable tagged queuing
+#define AFLG_SEND_MARKER 0x00000004 // need to send marker to ISP
+#define AFLG_SRB_WAITING 0x00000008 // SRB waiting for room in request Q
+
+/* Target "Capability" bit definitions */
+
+#define CAP_STOP_QUEUE_ON_CHECK 0x02
+#define CAP_AUTO_REQ_SENSE 0x04
+#define CAP_TAGGED_QUEUING 0x08
+#define CAP_SYNC_TRANSFER 0x10
+#define CAP_WIDE_TRANSFER 0x20
+
+
+/* Read and write macros for ISP chip registers */
+
+#define ISP_READ(ChipAddr,Register) ScsiPortReadPortUshort(&((ChipAddr)->Register))
+#define ISP_WRITE(ChipAddr,Register,Value) ScsiPortWritePortUshort(&((ChipAddr)->Register),(Value))
+
+/* Table to map ISP completion status to SRB error status */
+
+UCHAR CmpStsErrorMap[] =
+{
+ SRB_STATUS_SUCCESS, // 00h No error
+ SRB_STATUS_SELECTION_TIMEOUT, // 01h Incomplete transport (selection timeout)
+ SRB_STATUS_ERROR, // 02h DMA direction error
+ SRB_STATUS_ERROR, // 03h Transport error
+ SRB_STATUS_BUS_RESET, // 04h SCSI reset abort
+ SRB_STATUS_ABORTED, // 05h Aborted by system
+ SRB_STATUS_TIMEOUT, // 06h Timeout
+ SRB_STATUS_DATA_OVERRUN, // 07h Data overrun
+ SRB_STATUS_PHASE_SEQUENCE_FAILURE, // 08h Command overrun
+ SRB_STATUS_PHASE_SEQUENCE_FAILURE, // 09h Status overrun
+ SRB_STATUS_PHASE_SEQUENCE_FAILURE, // 0Ah Bad message
+ SRB_STATUS_PHASE_SEQUENCE_FAILURE, // 0Bh No message out
+ SRB_STATUS_MESSAGE_REJECTED, // 0Ch Extended ID failed
+ SRB_STATUS_MESSAGE_REJECTED, // 0Dh IDE message failed
+ SRB_STATUS_MESSAGE_REJECTED, // 0Eh Abort message failed
+ SRB_STATUS_MESSAGE_REJECTED, // 0Fh Reject message failed
+ SRB_STATUS_MESSAGE_REJECTED, // 10h NOP message failed
+ SRB_STATUS_MESSAGE_REJECTED, // 11h Parity error message failed
+ SRB_STATUS_MESSAGE_REJECTED, // 12h Device reset message failed
+ SRB_STATUS_MESSAGE_REJECTED, // 13h ID message failed
+ SRB_STATUS_UNEXPECTED_BUS_FREE, // 14h Unexpected bus free
+ SRB_STATUS_DATA_OVERRUN, // 15h Data underrun
+ SRB_STATUS_ERROR, // 16h
+ SRB_STATUS_ERROR, // 17h
+ SRB_STATUS_ERROR, // 18h Transaction error 1
+ SRB_STATUS_ERROR, // 19h Transaction error 2
+ SRB_STATUS_ERROR // 1Ah Transaction error 3
+};
+
+/* PCI Vendor ID and Device ID strings */
+
+CHAR QLVendorId[4] = "1077"; // QLogic PCI Vendor ID
+CHAR ISP1020DeviceId[4] = "1020"; // ISP1020 PCI Device ID
+
+USHORT findMethod = 1; // Method for scanning PCI config space
+
+
+/* Functions passed to the OS-specific port driver */
+
+ULONG QLFindAdapter(IN PVOID ServiceContext, IN PVOID Context, IN PVOID BusInformation,
+ IN PCHAR ArgumentString, IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+ OUT PBOOLEAN Again);
+
+BOOLEAN QLInitializeAdapter(IN PVOID ServiceContext);
+
+BOOLEAN QLInterruptServiceRoutine(IN PVOID ServiceContext);
+
+BOOLEAN QLResetScsiBus(IN PVOID ServiceContext, IN ULONG PathId);
+
+BOOLEAN QLStartIo(IN PVOID ServiceContext,IN PSCSI_REQUEST_BLOCK pSrb);
+
+BOOLEAN QLAdapterState(IN PVOID ServiceContext,IN PVOID Context,IN BOOLEAN SaveState);
+
+/* Internal mini-port driver functions */
+
+ULONG FindAdapter_M1(IN PVOID ServiceContext, IN OUT PULONG AdapterCount,
+ IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo);
+ULONG FindAdapter_M2(IN PVOID ServiceContext, IN OUT PULONG AdapterCount,
+ IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo);
+
+BOOLEAN QLResetIsp(IN PHW_DEVICE_EXTENSION pDevExt);
+
+BOOLEAN LoadRiscCode(IN PHW_DEVICE_EXTENSION pDevExt);
+
+BOOLEAN InitDeviceParameters(IN PHW_DEVICE_EXTENSION pDevExt,
+ IN PHW_LUN_EXTENSION pLunExt, IN PSCSI_REQUEST_BLOCK pSrb);
+
+BOOLEAN MailboxCommand(IN PHW_DEVICE_EXTENSION pDevExt,
+ USHORT *mbox_sts, UCHAR out_cnt, UCHAR in_cnt,
+ USHORT reg0, USHORT reg1, USHORT reg2,
+ USHORT reg3, USHORT reg4, USHORT reg5);
+
+VOID GetNovramParameters(IN PHW_DEVICE_EXTENSION pDevExt);
+
+BOOLEAN ReadAllNovram(IN PHW_DEVICE_EXTENSION pDevExt, UCHAR* buf);
+
+VOID ReadNovramWord(IN PHW_DEVICE_EXTENSION pDevExt,
+ USHORT addr, USHORT* ptr);
+VOID NovramDelay();
+
+BOOLEAN SendCommandToIsp(PHW_DEVICE_EXTENSION pDevExt, PSCSI_REQUEST_BLOCK pSrb);
+
+VOID SetErrorStatus(PHW_DEVICE_EXTENSION pDevExt, PSCSI_REQUEST_BLOCK pSrb,
+ PSTATUS_ENTRY pStsEntry);
+
+VOID QLLogError(IN PHW_DEVICE_EXTENSION pDevExt, IN PSCSI_REQUEST_BLOCK pSrb,
+ IN ULONG ErrorCode, IN ULONG UniqueId);
+
+BOOLEAN SendMarker(IN PHW_DEVICE_EXTENSION pDevExt);
+
+BOOLEAN CheckQueueSpace(IN PHW_DEVICE_EXTENSION pDevExt, USHORT slotcnt);
+
+VOID QLCleanupAfterReset(IN PHW_DEVICE_EXTENSION pDevExt);
+
+
+
+/************************************************************************/
+/* */
+/* DriverEntry */
+/* */
+/* Initial miniport driver entry routine called by NT. This routine */
+/* builds and returns to NT the HW_INITIALIZATION_DATA structure. */
+/* */
+/* Arguments: */
+/* */
+/* Driver Object is passed to ScsiPortInitialize() */
+/* */
+/* Return Value: */
+/* */
+/* Status from ScsiPortInitialize() */
+/* */
+/************************************************************************/
+
+ULONG DriverEntry(IN PVOID DriverObject, IN PVOID Argument2)
+{
+ HW_INITIALIZATION_DATA hwInitializationData;
+ ULONG adapterCount;
+ ULONG i, status;
+
+ QLPrint((1, "\nDriverEntry: entering\n"));
+
+ // Zero out structure and set size of init data
+
+ for (i=0; i<sizeof(HW_INITIALIZATION_DATA); i++)
+ {
+ ((PUCHAR)&hwInitializationData)[i] = 0;
+ }
+ hwInitializationData.HwInitializationDataSize = sizeof(HW_INITIALIZATION_DATA);
+
+ // Set driver entry points
+
+ hwInitializationData.HwInitialize = QLInitializeAdapter;
+ hwInitializationData.HwStartIo = QLStartIo;
+ hwInitializationData.HwInterrupt = QLInterruptServiceRoutine;
+ hwInitializationData.HwFindAdapter = QLFindAdapter;
+ hwInitializationData.HwResetBus = QLResetScsiBus;
+ hwInitializationData.HwAdapterState = QLAdapterState;
+
+#ifdef NT_VERSION_31
+ // Note: NT Version 3.1 rejects "PCIBus", set AdapterInterfaceType to "Isa"
+
+ hwInitializationData.AdapterInterfaceType = Isa;
+#else
+ hwInitializationData.AdapterInterfaceType = PCIBus;
+ hwInitializationData.VendorIdLength = 4;
+ hwInitializationData.VendorId = (PVOID)&QLVendorId;
+ hwInitializationData.DeviceIdLength = 4;
+ hwInitializationData.DeviceId = (PVOID)&ISP1020DeviceId;
+#endif
+
+ hwInitializationData.NumberOfAccessRanges = 1;
+ hwInitializationData.Reserved = 0;
+ hwInitializationData.MapBuffers = FALSE;
+ hwInitializationData.NeedPhysicalAddresses = TRUE;
+ hwInitializationData.TaggedQueuing = TRUE;
+ hwInitializationData.AutoRequestSense = TRUE;
+ hwInitializationData.MultipleRequestPerLu = TRUE;
+ hwInitializationData.DeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION);
+ hwInitializationData.SpecificLuExtensionSize = sizeof(HW_LUN_EXTENSION);
+ hwInitializationData.SrbExtensionSize = sizeof(SRB_EXTENSION);
+
+ adapterCount = 0;
+ status = ScsiPortInitialize(DriverObject, Argument2, &hwInitializationData,
+ &adapterCount);
+
+ QLPrint((1, "DriverEntry: exiting, status = %lx\n", status));
+
+ return(status);
+}
+
+#ifndef NT_VERSION_31
+
+/************************************************************************/
+/* */
+/* QLFindAdapter NT Version 3.5 and above */
+/* */
+/* This function is called by ScsiPortInitialize to find the next */
+/* adapter and fill in the configuration information structure and */
+/* map the SCSI protocol chip for access. */
+/* */
+/* Arguments: */
+/* */
+/* ServiceContext - Supplies a pointer to the device extension */
+/* AdapterCount - Count of adapter I/O register slots tested */
+/* BusInformation - Unused */
+/* ArgumentString - Unused */
+/* ConfigInfo - Pointer to the configuration information */
+/* structure to be filled in */
+/* Again - Returns a request to call this function again */
+/* */
+/* Return Value: */
+/* */
+/* Returns a status value for the initialization */
+/* */
+/************************************************************************/
+
+ULONG QLFindAdapter(IN PVOID ServiceContext, IN OUT PULONG AdapterCount,
+ IN PVOID BusInformation, IN PCHAR ArgumentString,
+ IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+ OUT PBOOLEAN Again)
+{
+ PHW_DEVICE_EXTENSION pDevExt = ServiceContext;
+ PACCESS_RANGE AccessRange;
+ ULONG retcode;
+ ULONG length;
+
+ QLPrint((1, "QLFindAdapter: entering\n"));
+
+ *Again = FALSE;
+
+ // Get access range.
+
+ AccessRange = &((*(ConfigInfo->AccessRanges))[0]);
+
+ if (AccessRange->RangeLength != 0)
+ {
+ // BUGBUG - Currently, when scsiport scans the PCI bus and finds
+ // a SCSI adapter, it will not automatically enable the
+ // Bus Master bit in the PCI command register. We need
+ // to enable this for the adapter to function properly.
+
+ PCI_COMMON_CONFIG pciBuffer;
+
+ QLPrint((1, "QLFindAdapter: found ISP1020 at address %lx\n", AccessRange->RangeStart));
+ QLPrint((1, "QLFindAdapter: BusInterruptLevel = %lx\n", ConfigInfo->BusInterruptLevel));
+
+ ScsiPortGetBusData(pDevExt,
+ PCIConfiguration,
+ ConfigInfo->SystemIoBusNumber,
+ ConfigInfo->SlotNumber,
+ &pciBuffer,
+ PCI_COMMON_HDR_LENGTH);
+ //
+ // Enable Bus Master bit
+ //
+
+ pciBuffer.Command |= BUS_MASTER_ENABLE;
+
+ //
+ // Zero bit 0 of the ROM address to take the chip
+ // out of the its reset state
+ //
+
+ pciBuffer.u.type0.ROMBaseAddress &= 0xfffffffe;
+
+ ScsiPortSetBusDataByOffset(pDevExt,
+ PCIConfiguration,
+ ConfigInfo->SystemIoBusNumber,
+ ConfigInfo->SlotNumber,
+ &pciBuffer,
+ 0,
+ PCI_COMMON_HDR_LENGTH);
+
+ // Map I/O registers for adapter
+
+ pDevExt->Adapter = ScsiPortGetDeviceBase(pDevExt,
+ ConfigInfo->AdapterInterfaceType,
+ ConfigInfo->SystemIoBusNumber,
+ AccessRange->RangeStart,
+ AccessRange->RangeLength,
+ (BOOLEAN)!AccessRange->RangeInMemory);
+ if (pDevExt->Adapter == NULL)
+ {
+ QLPrint((1, "QLFindAdapter: Failed to map ISP registers\n"));
+ return(SP_RETURN_ERROR);
+ }
+
+ // Reset ISP chip and read in NOVRAM parameters
+
+ if (!QLResetIsp(pDevExt))
+ {
+ ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter);
+ return(SP_RETURN_ERROR);
+ }
+
+ GetNovramParameters(pDevExt);
+
+ // Check for disabled adapter
+
+ if (!pDevExt->Host_Adapter_Enable)
+ {
+ ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter);
+ return(SP_RETURN_ERROR);
+ }
+
+ // Check for passed in SCSI ID and override NVRAM setting
+
+ if (ConfigInfo->InitiatorBusId[0] == (CCHAR)SP_UNINITIALIZED_VALUE)
+ ConfigInfo->InitiatorBusId[0] = pDevExt->Initiator_SCSI_Id;
+ else
+ pDevExt->Initiator_SCSI_Id = ConfigInfo->InitiatorBusId[0];
+
+ // Fill in other port configuration information
+
+ ConfigInfo->MaximumTransferLength = 0xFFFFFFFF; // unlimited
+ ConfigInfo->NumberOfPhysicalBreaks = MAX_SG_SEGMENTS - 1;
+ ConfigInfo->AlignmentMask = 0x00000003;
+ ConfigInfo->DmaWidth = 32;
+ ConfigInfo->NumberOfBuses = 1;
+ ConfigInfo->ScatterGather = TRUE;
+ ConfigInfo->Master = TRUE;
+ ConfigInfo->Dma32BitAddresses = TRUE;
+ if (!(pDevExt->AdapterFlags & AFLG_TAGGED_QUEUING))
+ ConfigInfo->TaggedQueuing = FALSE;
+ ConfigInfo->BufferAccessScsiPortControlled = TRUE;
+
+ // Work around for Chicago Beta 2 bug
+
+ if (ConfigInfo->MaximumNumberOfTargets == 7)
+ ConfigInfo->MaximumNumberOfTargets = 15;
+ else
+ ConfigInfo->MaximumNumberOfTargets = 16;
+
+ // Allocate a Noncached Extension request/response queues
+
+ pDevExt->NoncachedExtension = ScsiPortGetUncachedExtension(pDevExt,
+ ConfigInfo, sizeof(NONCACHED_EXTENSION));
+
+ if (pDevExt->NoncachedExtension == NULL)
+ {
+ QLPrint((1, "QLFindAdapter: Failed to allocate noncached memory\n"));
+ ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter);
+ return(SP_RETURN_ERROR);
+ }
+
+ // Init virtual and physical queue addresses
+
+ pDevExt->pRequestQueue = pDevExt->NoncachedExtension->RequestQueue;
+ pDevExt->pResponseQueue = pDevExt->NoncachedExtension->ResponseQueue;
+ pDevExt->ppRequestQueue = ScsiPortConvertPhysicalAddressToUlong(
+ ScsiPortGetPhysicalAddress(pDevExt, NULL,
+ pDevExt->NoncachedExtension->RequestQueue, &length));
+ pDevExt->ppResponseQueue = ScsiPortConvertPhysicalAddressToUlong(
+ ScsiPortGetPhysicalAddress(pDevExt, NULL,
+ pDevExt->NoncachedExtension->ResponseQueue, &length));
+
+ retcode = SP_RETURN_FOUND;
+ *Again = TRUE;
+ }
+ else
+ {
+ // Stop searching for adapters
+
+ retcode = SP_RETURN_NOT_FOUND;
+ *Again = FALSE;
+ }
+
+ QLPrint((1, "QLFindAdapter: exiting, retcode = %lx\n", retcode));
+
+ return(retcode);
+}
+#endif
+
+#ifdef NT_VERSION_31
+
+/************************************************************************/
+/* */
+/* QLFindAdapter NT Version 3.1 */
+/* */
+/* This function is called by ScsiPortInitialize to find the next */
+/* adapter and fill in the configuration information structure and */
+/* map the SCSI protocol chip for access. */
+/* */
+/* Arguments: */
+/* */
+/* ServiceContext - Supplies a pointer to the device extension */
+/* AdapterCount - Count of adapter I/O register slots tested */
+/* BusInformation - Unused */
+/* ArgumentString - Unused */
+/* ConfigInfo - Pointer to the configuration information */
+/* structure to be filled in */
+/* Again - Returns a request to call this function again */
+/* */
+/* Return Value: */
+/* */
+/* Returns a status value for the initialization */
+/* */
+/************************************************************************/
+
+ULONG QLFindAdapter(IN PVOID ServiceContext, IN OUT PULONG AdapterCount,
+ IN PVOID BusInformation, IN PCHAR ArgumentString,
+ IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+ OUT PBOOLEAN Again)
+{
+ PHW_DEVICE_EXTENSION pDevExt = ServiceContext;
+ ULONG retcode;
+ ULONG length;
+
+ QLPrint((1, "QLFindAdapter: entering\n"));
+
+ *Again = FALSE; // preset no return call
+
+ // Look for adapter, try both methods of accessing PCI config space
+
+find_adapter:
+
+ if (findMethod == 1)
+ {
+ retcode = FindAdapter_M1(ServiceContext, AdapterCount, ConfigInfo);
+ }
+ else
+ {
+ retcode = FindAdapter_M2(ServiceContext, AdapterCount, ConfigInfo);
+ }
+
+ if (retcode != SP_RETURN_FOUND)
+ {
+ if (findMethod == 1 && *AdapterCount == 0)
+ {
+ findMethod = 2; // Switch to method 2
+ goto find_adapter; // Try again
+ }
+ }
+ else
+ {
+ // Found next adapter
+ // Map I/O registers for adapter
+
+ pDevExt->Adapter = ScsiPortGetDeviceBase(
+ pDevExt, // HwDeviceExtension
+ ConfigInfo->AdapterInterfaceType, // AdapterInterfaceType
+ ConfigInfo->SystemIoBusNumber, // SystemIoBusNumber
+ (*ConfigInfo->AccessRanges)[0].RangeStart,
+ (ULONG)(sizeof(ISP_REGS)), // NumberOfBytes
+ TRUE); // InIoSpace
+
+ if (pDevExt->Adapter == NULL)
+ {
+ QLPrint((1, "QLFindAdapter: Failed to map ISP registers.\n"));
+ return(SP_RETURN_ERROR);
+ }
+
+ // Reset ISP chip and read in NOVRAM parameters
+
+ if (!QLResetIsp(pDevExt))
+ {
+ ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter);
+ return(SP_RETURN_ERROR);
+ }
+
+ GetNovramParameters(pDevExt);
+
+ // Check for disabled adapter
+
+ if (!pDevExt->Host_Adapter_Enable)
+ {
+ ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter);
+ (*AdapterCount)++; // skip this adapter
+ goto find_adapter; // Try again
+ }
+
+ // Check for passed in SCSI ID and override NVRAM setting
+
+ if (ConfigInfo->InitiatorBusId[0] == (CCHAR)SP_UNINITIALIZED_VALUE)
+ ConfigInfo->InitiatorBusId[0] = pDevExt->Initiator_SCSI_Id;
+ else
+ pDevExt->Initiator_SCSI_Id = ConfigInfo->InitiatorBusId[0];
+
+ // Fill in other port configuration information
+
+ ConfigInfo->MaximumTransferLength = 0xFFFFFFFF; // unlimited
+ ConfigInfo->NumberOfPhysicalBreaks = MAX_SG_SEGMENTS - 1;
+ ConfigInfo->AlignmentMask = 0x00000003;
+ ConfigInfo->DmaWidth = 32;
+ ConfigInfo->NumberOfBuses = 1;
+ ConfigInfo->ScatterGather = TRUE;
+ ConfigInfo->Master = TRUE;
+ ConfigInfo->Dma32BitAddresses = TRUE;
+ if (!(pDevExt->AdapterFlags & AFLG_TAGGED_QUEUING))
+ ConfigInfo->TaggedQueuing = FALSE;
+ ConfigInfo->InterruptMode = LevelSensitive; // Set this for shared IRQ level
+
+ // Allocate a Noncached Extension request/response queues
+
+ pDevExt->NoncachedExtension = ScsiPortGetUncachedExtension(
+ pDevExt, ConfigInfo, sizeof(NONCACHED_EXTENSION));
+
+ if (pDevExt->NoncachedExtension == NULL)
+ {
+ QLPrint((1, "QLFindAdapter: Failed to allocate noncached memory\n"));
+ ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter);
+ return(SP_RETURN_ERROR);
+ }
+
+ // Init virtual and physical queue addresses
+
+ pDevExt->pRequestQueue = pDevExt->NoncachedExtension->RequestQueue;
+ pDevExt->pResponseQueue = pDevExt->NoncachedExtension->ResponseQueue;
+ pDevExt->ppRequestQueue = ScsiPortConvertPhysicalAddressToUlong(
+ ScsiPortGetPhysicalAddress(pDevExt, NULL,
+ pDevExt->NoncachedExtension->RequestQueue, &length));
+ pDevExt->ppResponseQueue = pDevExt->ppRequestQueue +
+ REQUEST_QUEUE_DEPTH * sizeof(QUEUE_ENTRY);
+
+ (*AdapterCount)++;
+ *Again = TRUE;
+ }
+
+ QLPrint((1, "QLFindAdapter: exiting, retcode = %lx\n", retcode));
+
+ return(retcode);
+}
+
+
+/************************************************************************/
+/* */
+/* FindAdapter_M1 NT Version 3.1 */
+/* */
+/* This function is called by QLFindAdapter to find the next */
+/* adapter using PCI configuration mechanism #1. */
+/* */
+/* Arguments: */
+/* */
+/* ServiceContext - Supplies a pointer to the device extension */
+/* AdapterCount - Count of adapter I/O register slots tested */
+/* ConfigInfo - Pointer to the configuration information */
+/* structure to be filled in */
+/* */
+/* Return Value: */
+/* */
+/* Returns a status value for the initialization */
+/* */
+/************************************************************************/
+
+ULONG FindAdapter_M1(IN PVOID ServiceContext, IN OUT PULONG AdapterCount,
+ IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo)
+{
+ PHW_DEVICE_EXTENSION pDevExt = ServiceContext;
+ PPCI_CHIP_REGISTERS_M1 PciChip;
+ PPCI_REGS PciConfig = 0;
+ ULONG retcode = SP_RETURN_NOT_FOUND;
+ USHORT index, VendorId, DeviceId;
+ ULONG BusNum, DevNum;
+ ULONG ha_base;
+ ULONG RomBase;
+ ULONG cmd_reg;
+ ULONG dataread;
+
+ // Map PCI chip registers
+
+ PciChip = ScsiPortGetDeviceBase(
+ pDevExt, // HwDeviceExtension
+ ConfigInfo->AdapterInterfaceType, // AdapterInterfaceType
+ ConfigInfo->SystemIoBusNumber, // SystemIoBusNumber
+ ScsiPortConvertUlongToPhysicalAddress((ULONG)PCI_CONFIG_ADDRESS),
+ sizeof(PCI_CHIP_REGISTERS_M1), // NumberOfBytes
+ TRUE); // InIoSpace
+
+ if (PciChip == NULL)
+ {
+ QLPrint((1, "FindAdapter_M1: Failed to map PCI chip registers.\n"));
+ return(SP_RETURN_ERROR);
+ }
+
+ // Scan configuration space headers for next adapter
+
+ for (index=0, BusNum=0; BusNum < PCI_MAXBUSNUM; BusNum++)
+ {
+ for (DevNum = 0; DevNum < PCI_MAXDEVNUM; DevNum++)
+ {
+ ScsiPortWritePortUlong(&PciChip->Config_Address,
+ (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 |
+ (ULONG)(&PciConfig->Vendor_Id)));
+
+ dataread = ScsiPortReadPortUlong(&PciChip->Config_Data);
+ VendorId = (USHORT)dataread;
+ DeviceId = (USHORT)(dataread >> 16);
+
+ if (VendorId == QLogic_VENDOR_ID && DeviceId == QLogic_DEVICE_ID)
+ {
+ if (index == *AdapterCount)
+ {
+ // Found next adapter
+ // Get base I/O address and interrupt level
+
+ ScsiPortWritePortUlong(&PciChip->Config_Address,
+ (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 |
+ (ULONG)(&PciConfig->IO_Base_Address)));
+ ha_base = ScsiPortReadPortUlong(&PciChip->Config_Data) & 0xfffffffc;
+
+ ScsiPortWritePortUlong(&PciChip->Config_Address,
+ (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 |
+ (ULONG)(&PciConfig->Interrupt_Line)));
+ ConfigInfo->BusInterruptLevel =
+ ScsiPortReadPortUlong(&PciChip->Config_Data) & 0x000000ff;
+
+ QLPrint((1, "FindAdapter_M1: found ISP1020 at address %lx\n", ha_base));
+
+ // Fill in the access array information
+
+ (*ConfigInfo->AccessRanges)[0].RangeStart =
+ ScsiPortConvertUlongToPhysicalAddress(ha_base);
+ (*ConfigInfo->AccessRanges)[0].RangeLength = sizeof(ISP_REGS);
+ (*ConfigInfo->AccessRanges)[0].RangeInMemory = FALSE;
+
+ // Must clear bit 0 of ROM base address register
+
+ ScsiPortWritePortUlong(&PciChip->Config_Address,
+ (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 |
+ (ULONG)(&PciConfig->ROM_Base_Address)));
+ RomBase = ScsiPortReadPortUlong(&PciChip->Config_Data);
+ ScsiPortWritePortUlong(&PciChip->Config_Address,
+ (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 |
+ (ULONG)(&PciConfig->ROM_Base_Address)));
+ ScsiPortWritePortUlong(&PciChip->Config_Data, (RomBase & 0xfffffffe));
+
+ // Make sure bus master enabled
+
+ ScsiPortWritePortUlong(&PciChip->Config_Address,
+ (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 |
+ (ULONG)(&PciConfig->Command)));
+ cmd_reg = ScsiPortReadPortUlong(&PciChip->Config_Data);
+ ScsiPortWritePortUlong(&PciChip->Config_Address,
+ (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 |
+ (ULONG)(&PciConfig->Command)));
+ ScsiPortWritePortUlong(&PciChip->Config_Data, (cmd_reg | BUS_MASTER_ENABLE));
+
+ retcode = SP_RETURN_FOUND;
+ goto find_exit;
+ }
+ index++;
+ }
+ }
+ }
+
+find_exit:
+
+ // Disable PCI chip registers
+
+ ScsiPortWritePortUlong(&PciChip->Config_Address, PCI_DISABLE_CONFIG);
+ ScsiPortFreeDeviceBase(pDevExt, PciChip);
+
+ return(retcode);
+}
+
+
+/************************************************************************/
+/* */
+/* FindAdapter_M2 NT Version 3.1 */
+/* */
+/* This function is called by QLFindAdapter to find the next */
+/* adapter using PCI configuration mechanism #2. */
+/* */
+/* Arguments: */
+/* */
+/* ServiceContext - Supplies a pointer to the device extension */
+/* AdapterCount - Count of adapter I/O register slots tested */
+/* ConfigInfo - Pointer to the configuration information */
+/* structure to be filled in */
+/* */
+/* Return Value: */
+/* */
+/* Returns a status value for the initialization */
+/* */
+/************************************************************************/
+
+ULONG FindAdapter_M2(IN PVOID ServiceContext, IN OUT PULONG AdapterCount,
+ IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo)
+{
+ PHW_DEVICE_EXTENSION pDevExt = ServiceContext;
+ PPCI_CHIP_REGISTERS PciChip;
+ UCHAR config_reg;
+ ULONG retcode = SP_RETURN_NOT_FOUND;
+ PPCI_REGS PciConfig, PciSlot;
+ USHORT index, slot, VendorId, DeviceId;
+ ULONG ha_base;
+ USHORT RomBase;
+ USHORT cmd_reg;
+
+ // Map PCI chip registers and enable configuration space
+
+ PciChip = ScsiPortGetDeviceBase(
+ pDevExt, // HwDeviceExtension
+ ConfigInfo->AdapterInterfaceType, // AdapterInterfaceType
+ ConfigInfo->SystemIoBusNumber, // SystemIoBusNumber
+ ScsiPortConvertUlongToPhysicalAddress((ULONG)PCI_CONFIG),
+ sizeof(PCI_CHIP_REGISTERS), // NumberOfBytes
+ TRUE); // InIoSpace
+
+ if (PciChip == NULL)
+ {
+ QLPrint((1, "FindAdapter_M2: Failed to map PCI chip registers.\n"));
+ return(SP_RETURN_ERROR);
+ }
+
+ config_reg = ScsiPortReadPortUchar(&PciChip->pci_config);
+ ScsiPortWritePortUchar(&PciChip->pci_config, (UCHAR)(config_reg | PCI_ENABLE));
+
+ // Map PCI configuration space
+
+ PciConfig = ScsiPortGetDeviceBase(
+ pDevExt, // HwDeviceExtension
+ ConfigInfo->AdapterInterfaceType, // AdapterInterfaceType
+ ConfigInfo->SystemIoBusNumber, // SystemIoBusNumber
+ ScsiPortConvertUlongToPhysicalAddress((ULONG)PCI_START),
+ sizeof(PCI_REGS) * PCI_SLOT_CNT, // NumberOfBytes
+ TRUE); // InIoSpace
+
+ if (PciConfig == NULL)
+ {
+ QLPrint((1, "FindAdapter_M2: Failed to map PCI config space.\n"));
+ ScsiPortFreeDeviceBase(pDevExt, PciChip);
+ return(SP_RETURN_ERROR);
+ }
+
+ // Scan configuration space headers for next adapter
+
+ for (index=0, slot=0, PciSlot=PciConfig; slot<PCI_SLOT_CNT; slot++, PciSlot++)
+ {
+ VendorId = ScsiPortReadPortUshort(&PciSlot->Vendor_Id);
+ DeviceId = ScsiPortReadPortUshort(&PciSlot->Device_Id);
+
+ if (VendorId == QLogic_VENDOR_ID && DeviceId == QLogic_DEVICE_ID)
+ {
+ if (index == *AdapterCount)
+ {
+ // Found next adapter
+ // Get base I/O address and interrupt level
+
+ ha_base = ScsiPortReadPortUshort((PUSHORT)&PciSlot->IO_Base_Address) & 0xfffc;
+ ConfigInfo->BusInterruptLevel =
+ ScsiPortReadPortUchar(&PciSlot->Interrupt_Line);
+
+ QLPrint((1, "FindAdapter_M2: found ISP1020 at address %lx\n", ha_base));
+
+ // Fill in the access array information
+
+ (*ConfigInfo->AccessRanges)[0].RangeStart =
+ ScsiPortConvertUlongToPhysicalAddress(ha_base);
+ (*ConfigInfo->AccessRanges)[0].RangeLength = sizeof(ISP_REGS);
+ (*ConfigInfo->AccessRanges)[0].RangeInMemory = FALSE;
+
+ // Must clear bit 0 of ROM base address register
+
+ RomBase = ScsiPortReadPortUshort((PUSHORT)&PciSlot->ROM_Base_Address);
+ ScsiPortWritePortUshort((PUSHORT)&PciSlot->ROM_Base_Address, (USHORT)(RomBase & 0xfffe));
+
+ // Make sure bus master enabled
+
+ cmd_reg = ScsiPortReadPortUshort(&PciSlot->Command);
+ ScsiPortWritePortUshort(&PciSlot->Command, (USHORT)(cmd_reg | BUS_MASTER_ENABLE));
+
+ retcode = SP_RETURN_FOUND;
+ break;
+ }
+ index++;
+ }
+ }
+
+ // Disable configuration space
+
+ ScsiPortWritePortUchar(&PciChip->pci_config, config_reg);
+ ScsiPortFreeDeviceBase(pDevExt, PciChip);
+ ScsiPortFreeDeviceBase(pDevExt, PciConfig);
+
+ return(retcode);
+}
+#endif
+
+
+/************************************************************************/
+/* */
+/* QLInitializeAdapter */
+/* */
+/* This function is called to initialize the adapter after boot or */
+/* after a power failure. */
+/* */
+/* Arguments: */
+/* */
+/* ServiceContext - Supplies a pointer to the device extension */
+/* */
+/* Return Value: */
+/* */
+/* Returns TRUE if initialization is complete */
+/* Returns FALSE if error */
+/* */
+/************************************************************************/
+
+BOOLEAN QLInitializeAdapter(IN PVOID ServiceContext)
+{
+ PHW_DEVICE_EXTENSION pDevExt = ServiceContext;
+ USHORT mbox_sts[6];
+ UCHAR *c_ptr;
+ USHORT i;
+ USHORT scsi_id;
+ USHORT ram_addr, ram_data;
+ USHORT running_version;
+
+ QLPrint((1, "QLInitializeAdapter: entering\n"));
+
+ // Check version of loaded RISC code, don't reload if same or newer version
+ // Must restart RISC firmware first
+
+ if (MailboxCommand(pDevExt, mbox_sts, 2, 0,
+ MBOX_CMD_EXECUTE_FIRMWARE,
+ risc_code_addr01,
+ 0,0,0,0))
+ {
+ // Get running RISC code version
+
+ if (MailboxCommand(pDevExt, mbox_sts, 1, 3,
+ MBOX_CMD_ABOUT_FIRMWARE,
+ 0,0,0,0,0))
+ {
+ // Compare running version to version linked with driver
+
+ running_version = mbox_sts[1] << 10 | mbox_sts[2];
+
+ QLPrint((1, "QLInitializeAdapter: running RISC code version %x\n", running_version));
+ QLPrint((1, "QLInitializeAdapter: driver RISC code version %x\n", risc_code_version));
+
+ if (risc_code_version <= running_version)
+ {
+ pDevExt->DisableLoadRiscCode = 1;
+ }
+ }
+ else
+ {
+ QLPrint((1, "QLInitializeAdapter: ABOUT FIRMWARE command failed\n"));
+ }
+ }
+ else
+ {
+ QLPrint((1, "QLInitializeAdapter: EXECUTE FIRMWARE command failed\n"));
+ }
+
+ if (!pDevExt->DisableLoadRiscCode)
+ {
+ // Reset ISP chip
+
+ if (!QLResetIsp(pDevExt))
+ {
+ return(FALSE);
+ }
+
+ // Must manually clear Burst Enable, chip reset not working correctly
+
+ ISP_WRITE(pDevExt->Adapter, bus_config1, 0);
+
+ // Load RISC code
+
+ if (!LoadRiscCode(pDevExt))
+ {
+ QLPrint((1, "QLInitializeAdapter: Load RISC code failed\n"));
+ return(FALSE);
+ }
+
+ // Start ISP firmware
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 2, 0,
+ MBOX_CMD_EXECUTE_FIRMWARE,
+ risc_code_addr01,
+ 0,0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: EXECUTE FIRMWARE command failed\n"));
+ return(FALSE);
+ }
+
+ QLPrint((1, "QLInitializeAdapter: RISC code loaded and started\n"));
+ }
+ else
+ {
+ QLPrint((1, "QLInitializeAdapter: RISC not reloaded\n"));
+ }
+
+ // Set Bus Control Parameters
+
+ ISP_WRITE(pDevExt->Adapter, bus_config1,
+ (USHORT)pDevExt->Config_Reg);
+ if (!MailboxCommand(pDevExt, mbox_sts, 3, 3,
+ MBOX_CMD_SET_BUS_CONTROL_PARAMETERS,
+ (USHORT)(pDevExt->Data_DMA_Burst_Enable << 1),
+ (USHORT)(pDevExt->Cmd_DMA_Burst_Enable << 1),
+ 0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: SET BUS CONTROL PARAMS cmd failed\n"));
+ return(FALSE);
+ }
+
+ // Set ISP1020 clock rate
+
+ if (pDevExt->Sixty_MHz_Enable)
+ {
+ if (!MailboxCommand(pDevExt, mbox_sts, 2, 2,
+ MBOX_CMD_SET_CLOCK_RATE,
+ (USHORT)60,
+ 0,0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: SET CLOCK RATE cmd failed\n"));
+ return(FALSE);
+ }
+ }
+
+ // Set software controlled SCSI bus termination
+ // Must reset and enable termination PAL first
+
+ for (i = 0, ram_addr = 0xFF00; i < 4; i++, ram_addr += 0x0010)
+ {
+ if (!MailboxCommand(pDevExt, mbox_sts, 3, 3,
+ MBOX_CMD_WRITE_RAM_WORD,
+ ram_addr,
+ (USHORT)0,
+ 0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: WRITE RAM WORD cmd failed\n"));
+ return(FALSE);
+ }
+ }
+
+ if (pDevExt->Termination_High_Enable)
+ {
+ if (pDevExt->Termination_Low_Enable)
+ ram_addr = 0xFF00;
+ else
+ ram_addr = 0xFF40;
+ }
+ else
+ {
+ if (pDevExt->Termination_Low_Enable)
+ ram_addr = 0xFF80;
+ else
+ ram_addr = 0xFFC0;
+ }
+ ram_data = (USHORT)(pDevExt->Termination_High_Enable) << 1 |
+ (USHORT)(pDevExt->Termination_Low_Enable);
+ if (!MailboxCommand(pDevExt, mbox_sts, 3, 3,
+ MBOX_CMD_WRITE_RAM_WORD,
+ ram_addr,
+ ram_data,
+ 0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: WRITE RAM WORD cmd failed\n"));
+ return(FALSE);
+ }
+
+ // Clear request queue area and initialize queue
+
+ c_ptr = (UCHAR *)pDevExt->pRequestQueue;
+ for (i = 0; i < REQUEST_QUEUE_DEPTH * sizeof(QUEUE_ENTRY); i++)
+ *c_ptr++ = 0;
+
+ pDevExt->queue_space = REQUEST_QUEUE_DEPTH - 1;
+ pDevExt->request_in = 0;
+ pDevExt->request_out = 0;
+ pDevExt->request_ptr = pDevExt->pRequestQueue;
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 5, 6,
+ MBOX_CMD_INIT_REQUEST_QUEUE,
+ REQUEST_QUEUE_DEPTH,
+ (USHORT)(pDevExt->ppRequestQueue >> 16),
+ (USHORT)(pDevExt->ppRequestQueue & 0xFFFF),
+ pDevExt->request_in,
+ 0))
+ {
+ QLPrint((1, "QLInitializeAdapter: INIT REQUEST QUEUE cmd failed\n"));
+ return(FALSE);
+ }
+
+ // Clear response queue area and initialize queue
+
+ c_ptr = (UCHAR *)pDevExt->pResponseQueue;
+ for (i = 0; i < RESPONSE_QUEUE_DEPTH * sizeof(QUEUE_ENTRY); i++)
+ *c_ptr++ = 0;
+
+ pDevExt->response_out = 0;
+ pDevExt->response_ptr = pDevExt->pResponseQueue;
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 6, 6,
+ MBOX_CMD_INIT_RESPONSE_QUEUE,
+ RESPONSE_QUEUE_DEPTH,
+ (USHORT)(pDevExt->ppResponseQueue >> 16),
+ (USHORT)(pDevExt->ppResponseQueue & 0xFFFF),
+ 0,
+ pDevExt->response_out))
+ {
+ QLPrint((1, "QLInitializeAdapter: INIT RESPONSE QUEUE cmd failed\n"));
+ return(FALSE);
+ }
+
+ // Set Initiator SCSI ID
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 2, 2,
+ MBOX_CMD_SET_INITIATOR_SCSI_ID,
+ (USHORT)pDevExt->Initiator_SCSI_Id,
+ 0,0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: SET INITIATOR SCSI ID cmd failed\n"));
+ return(FALSE);
+ }
+
+ // Set Selection Timeout
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 2, 2,
+ MBOX_CMD_SET_SELECTION_TIMEOUT,
+ (USHORT)pDevExt->Selection_Timeout,
+ 0,0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: SET SELECTION TIMEOUT cmd failed\n"));
+ return(FALSE);
+ }
+
+ // Disable retrys for autoconfigure
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 3, 3,
+ MBOX_CMD_SET_RETRY_COUNT,
+ 0,0,
+ 0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: SET RETRY COUNT cmd failed\n"));
+ return(FALSE);
+ }
+
+ // Set Active Negation
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 2, 2,
+ MBOX_CMD_SET_ACTIVE_NEGATION_STATE,
+ (USHORT)((pDevExt->REQ_ACK_Active_Negation << 5) +
+ (pDevExt->DATA_Active_Negation << 4)),
+ 0,0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: SET ACTIVE NEGATION STATE cmd failed\n"));
+ return(FALSE);
+ }
+
+ // Set Tag Age Limits
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 2, 2,
+ MBOX_CMD_SET_TAG_AGE_LIMIT,
+ pDevExt->Tag_Age_Limit,
+ 0,0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: SET TAG AGE LIMIT cmd failed\n"));
+ return(FALSE);
+ }
+
+ // Set Async Data Setup Time
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 2, 2,
+ MBOX_CMD_SET_ASYNC_DATA_SETUP_TIME,
+ pDevExt->ASync_Data_Setup_Time,
+ 0,0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: SET ASYNC DATA SETUP TIME cmd failed\n"));
+ return(FALSE);
+ }
+
+ // Set target parameters for doing SCSI autoconfigure
+
+ for (scsi_id = 0; scsi_id < NUM_SCSI_IDS; scsi_id++)
+ {
+ if (!MailboxCommand(pDevExt, mbox_sts, 4, 4,
+ MBOX_CMD_SET_TARGET_PARAMETERS,
+ (USHORT)(scsi_id << 8),
+ (USHORT)(CAP_AUTO_REQ_SENSE << 8),
+ 0,0,0))
+ {
+ QLPrint((1, "QLInitializeAdapter: SET TARGET PARAMETERS cmd failed\n"));
+ return(FALSE);
+ }
+ }
+
+ // Reset SCSI bus
+
+ QLResetScsiBus(pDevExt, 0);
+
+ // Enable ISP interrupts
+
+ ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_CLEAR_RISC_INT);
+ ISP_WRITE(pDevExt->Adapter, bus_sema, 0);
+ ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_ENABLE_ALL_INTS | ICR_ENABLE_RISC_INT);
+
+ QLPrint((1, "QLInitializeAdapter: exiting\n"));
+
+ return( TRUE );
+}
+
+
+/************************************************************************/
+/* */
+/* QLResetIsp */
+/* */
+/* This function is called to reset the ISP chip. */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* */
+/* Return Value: */
+/* */
+/* Returns TRUE if reset completed OK */
+/* Returns FALSE if error */
+/* */
+/************************************************************************/
+
+BOOLEAN QLResetIsp(IN PHW_DEVICE_EXTENSION pDevExt)
+{
+ USHORT i;
+
+ // Reset ISP chip and disable BIOS
+
+ ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_SOFT_RESET);
+
+ // Small delay after reset
+
+ ScsiPortStallExecution(10);
+
+ ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_RESET);
+
+ // Small delay after reset
+
+ ScsiPortStallExecution(10);
+
+ ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_RELEASE);
+
+ // Small delay after reset
+
+ ScsiPortStallExecution(10);
+
+ ISP_WRITE(pDevExt->Adapter, hccr, HCCR_WRITE_BIOS_ENABLE);
+
+ // Small delay after reset
+
+ ScsiPortStallExecution(10);
+
+ // Wait for mailbox 0 to clear
+
+ for (i = 0; i < 1000; i++)
+ {
+ if (ISP_READ(pDevExt->Adapter, mailbox0) == 0)
+ {
+ break;
+ }
+ }
+ if (ISP_READ(pDevExt->Adapter, mailbox0) != 0)
+ {
+ QLPrint((1, "QLResetIsp: Chip reset timeout\n"));
+ return(FALSE);
+ }
+
+ // Check product ID of chip
+
+ if (ISP_READ(pDevExt->Adapter, mailbox1) != PROD_ID_1 ||
+ (ISP_READ(pDevExt->Adapter, mailbox2) != PROD_ID_2 &&
+ ISP_READ(pDevExt->Adapter, mailbox2) != PROD_ID_2a) ||
+ ISP_READ(pDevExt->Adapter, mailbox3) != PROD_ID_3 ||
+ ISP_READ(pDevExt->Adapter, mailbox4) != PROD_ID_4)
+ {
+ QLPrint((1, "QLResetIsp: Failed chip product ID test\n"));
+ return(FALSE);
+ }
+ return(TRUE);
+}
+
+
+/************************************************************************/
+/* */
+/* LoadRiscCode */
+/* */
+/* This function is called to load the RISC firmware. */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* */
+/* Return Value: */
+/* */
+/* Returns TRUE if load completed OK */
+/* Returns FALSE if error */
+/* */
+/************************************************************************/
+
+BOOLEAN LoadRiscCode(IN PHW_DEVICE_EXTENSION pDevExt)
+{
+ USHORT i, j;
+ USHORT RiscCodeAddr;
+ USHORT *pCode, *pBuffer;
+ USHORT mbox_sts[6];
+ USHORT BufSize;
+
+ // Use request/response queues buffer for loading RISC code
+ // (having trouble loading directly from driver code space?)
+
+ BufSize = (REQUEST_QUEUE_DEPTH + RESPONSE_QUEUE_DEPTH) * sizeof(QUEUE_ENTRY);
+ pCode = risc_code01;
+ for (i = 0, RiscCodeAddr = risc_code_addr01;
+ i < risc_code_length01;
+ RiscCodeAddr += BufSize/2)
+ {
+ pBuffer = (USHORT *)pDevExt->pRequestQueue;
+ for (j = 0; j < BufSize/2 && i < risc_code_length01; j++, i++)
+ {
+ *pBuffer++ = *pCode++;
+ }
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 5, 5,
+ MBOX_CMD_LOAD_RAM,
+ RiscCodeAddr,
+ (USHORT)(pDevExt->ppRequestQueue >> 16),
+ (USHORT)(pDevExt->ppRequestQueue & 0xFFFF),
+ (USHORT)(BufSize / 2),
+ 0))
+ {
+ QLPrint((1, "LoadRiscCode: LOAD RAM command failed\n"));
+ return(FALSE);
+ }
+ }
+ return(TRUE);
+}
+
+
+/************************************************************************/
+/* */
+/* InitDeviceParameters */
+/* */
+/* This function is called to set target device parameters after */
+/* autoconfigure Inquiry commands are done */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* pLunExt - Pointer to lun extension */
+/* pSrb - Pointer to SCSI request block */
+/* */
+/* Return Value: */
+/* */
+/* Returns TRUE if completed OK */
+/* Returns FALSE if error */
+/* */
+/************************************************************************/
+
+BOOLEAN InitDeviceParameters(IN PHW_DEVICE_EXTENSION pDevExt,
+ IN PHW_LUN_EXTENSION pLunExt, IN PSCSI_REQUEST_BLOCK pSrb)
+{
+ USHORT scsi_id;
+ USHORT mbox_sts[6];
+
+
+ // If 1st call for this adapter, set retries and target parameters
+
+ if (!(pDevExt->AdapterFlags & AFLG_INIT_COMPLETE))
+ {
+ QLPrint((1, "InitDeviceParameters: set adapter init complete\n"));
+
+ pDevExt->AdapterFlags |= AFLG_INIT_COMPLETE;
+
+ // Reset target parameters from NOVRAM parameters
+
+ for (scsi_id = 0; scsi_id < NUM_SCSI_IDS; scsi_id++)
+ {
+ if (!MailboxCommand(pDevExt, mbox_sts, 4, 4,
+ MBOX_CMD_SET_TARGET_PARAMETERS,
+ (USHORT)(scsi_id << 8),
+ (USHORT)(pDevExt->Id[scsi_id].Capability << 8),
+ (USHORT)((pDevExt->Id[scsi_id].Sync_Offset << 8) |
+ (pDevExt->Id[scsi_id].Sync_Period)),
+ 0,0))
+ {
+ QLPrint((1, "InitDeviceParameters: SET TARGET PARAMS cmd failed\n"));
+ return(FALSE);
+ }
+ }
+
+ // Set RETRY limits
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 3, 3,
+ MBOX_CMD_SET_RETRY_COUNT,
+ pDevExt->Retry_Count,
+ pDevExt->Retry_Delay,
+ 0,0,0))
+ {
+ QLPrint((1, "InitDeviceParameters: SET RETRY COUNT cmd failed\n"));
+ return(FALSE);
+ }
+ }
+
+ QLPrint((1, "InitDeviceParameters: set lun init complete\n"));
+
+ pLunExt->LunFlags |= LFLG_INIT_COMPLETE;
+
+ // Set device queue parameters
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 4, 4,
+ MBOX_CMD_SET_DEVICE_QUEUE_PARAMETERS,
+ (USHORT)(((USHORT)(pSrb->TargetId) << 8) | pSrb->Lun),
+ pDevExt->Max_Queue_Depth,
+ (USHORT)(pDevExt->Id[pSrb->TargetId].Execution_Throttle),
+ 0,0))
+ {
+ QLPrint((1, "InitDeviceParameters: SET QUEUE PARAMS cmd failed\n"));
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+
+/************************************************************************/
+/* */
+/* QLStartIo */
+/* */
+/* This function is called by the port driver to start execution */
+/* of an I/O request. */
+/* */
+/* Arguments: */
+/* */
+/* ServiceContext - Supplies a pointer to the device extension */
+/* pSrb - Supplies the SCSI request block to be started. */
+/* */
+/* Return Value: */
+/* */
+/* TRUE - If the request can be accepted at this time */
+/* FALSE - If the request must be submitted later */
+/* */
+/************************************************************************/
+
+BOOLEAN QLStartIo(IN PVOID ServiceContext, IN PSCSI_REQUEST_BLOCK pSrb)
+{
+ PHW_DEVICE_EXTENSION pDevExt = ServiceContext;
+ PHW_LUN_EXTENSION pLunExt;
+ USHORT mbox_sts[6];
+
+/*
+ QLPrint((1, "QLStartIo: SRB function: %x", pSrb->Function));
+ QLPrint((1, " flags: %lx", pSrb->SrbFlags));
+ QLPrint((1, " cdb: %x\n", (USHORT)(pSrb->Cdb[0])));
+*/
+
+ switch (pSrb->Function)
+ {
+ case SRB_FUNCTION_EXECUTE_SCSI:
+
+ // Get LUN extension pointer
+
+ pLunExt = ScsiPortGetLogicalUnit(pDevExt, pSrb->PathId,
+ pSrb->TargetId, pSrb->Lun);
+
+ // Finish up init stuff on 1st request after Inquiry commands
+
+ if (!(pLunExt->LunFlags & LFLG_INIT_COMPLETE) &&
+ pSrb->Cdb[0] != SCSIOP_INQUIRY)
+ {
+ InitDeviceParameters(pDevExt, pLunExt, pSrb);
+ }
+
+ // Build request and send to ISP
+
+ if (!SendCommandToIsp(pDevExt, pSrb))
+ {
+ pDevExt->WaitingSrb = pSrb;
+ pDevExt->AdapterFlags |= AFLG_SRB_WAITING;
+ return(TRUE); // start command later
+ }
+ break;
+
+ case SRB_FUNCTION_ABORT_COMMAND:
+ case SRB_FUNCTION_TERMINATE_IO:
+
+ QLPrint((1, "QLStartIo: abort command function\n"));
+
+ // Send abort command to ISP
+
+ if (MailboxCommand(pDevExt, mbox_sts, 4, 4,
+ MBOX_CMD_ABORT,
+ (USHORT)(((USHORT)(pSrb->TargetId) << 8) | pSrb->Lun),
+ (USHORT)((ULONG)(pSrb->NextSrb) & 0x0000ffff),
+ (USHORT)((ULONG)(pSrb->NextSrb) >> 16 & 0x0000ffff),
+ 0,0))
+ {
+ pSrb->SrbStatus = SRB_STATUS_SUCCESS;
+ }
+ else
+ {
+ QLPrint((1, "QLStartIo: ABORT cmd failed\n"));
+ pSrb->SrbStatus = SRB_STATUS_ABORT_FAILED;
+ }
+
+ ScsiPortNotification(RequestComplete, pDevExt, pSrb);
+ break;
+
+ case SRB_FUNCTION_RESET_DEVICE:
+
+ QLPrint((1, "QLStartIo: reset device function\n"));
+
+ // Send abort target command to ISP
+
+ if (MailboxCommand(pDevExt, mbox_sts, 3, 3,
+ MBOX_CMD_ABORT_TARGET,
+ (USHORT)((USHORT)pSrb->TargetId << 8),
+ (USHORT)pDevExt->Bus_Reset_Delay,
+ 0,0,0))
+ {
+ pSrb->SrbStatus = SRB_STATUS_SUCCESS;
+ }
+ else
+ {
+ QLPrint((1, "QLStartIo: ABORT TARGET cmd failed\n"));
+ pSrb->SrbStatus = SRB_STATUS_ERROR;
+ }
+
+ // Send marker to unlock queues
+
+ if (!SendMarker(pDevExt))
+ {
+ pDevExt->AdapterFlags |= AFLG_SEND_MARKER;
+ }
+ ScsiPortNotification(RequestComplete, pDevExt, pSrb);
+ break;
+
+ case SRB_FUNCTION_RESET_BUS:
+
+ QLPrint((1, "QLStartIo: reset bus function\n"));
+
+ // Reset SCSI bus and send marker
+
+ if (QLResetScsiBus(pDevExt, 0))
+ {
+ pSrb->SrbStatus = SRB_STATUS_SUCCESS;
+ }
+ else
+ {
+ pSrb->SrbStatus = SRB_STATUS_ERROR;
+ }
+ ScsiPortNotification(RequestComplete, pDevExt, pSrb);
+ break;
+
+ default:
+
+ QLPrint((1, "QLStartIo: unsupported function %x\n", pSrb->Function));
+
+ // Unsupported function code, complete request with error status
+
+ pSrb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
+ ScsiPortNotification(RequestComplete, pDevExt, pSrb);
+ break;
+ }
+
+ // Request next command
+
+ if (pDevExt->queue_space > 5)
+ {
+ ScsiPortNotification(NextLuRequest, pDevExt, pSrb->PathId,
+ pSrb->TargetId, pSrb->Lun);
+ }
+ else
+ {
+ ScsiPortNotification(NextRequest, pDevExt);
+ }
+ return(TRUE);
+}
+
+
+/************************************************************************/
+/* */
+/* SendCommandToIsp */
+/* */
+/* This function is called by QLStartIo to build an ISP command */
+/* entry and pass it to the ISP for execution. */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* pSrb - Supplies the SCSI request block to be started. */
+/* */
+/* Return Value: */
+/* */
+/* TRUE - If command passed to ISP */
+/* FALSE - If no ISP request slot available */
+/* */
+/************************************************************************/
+
+BOOLEAN SendCommandToIsp(PHW_DEVICE_EXTENSION pDevExt, PSCSI_REQUEST_BLOCK pSrb)
+{
+ PCOMMAND_ENTRY pCmdEntry;
+ USHORT i, segmentCnt;
+ USHORT controlFlags = 0;
+ ULONG transferCnt = pSrb->DataTransferLength;
+ PVOID dataPointer = pSrb->DataBuffer;
+ ULONG length;
+
+ // Send a Marker to ISP if needed
+
+ if (pDevExt->AdapterFlags & AFLG_SEND_MARKER)
+ {
+ if (!SendMarker(pDevExt))
+ {
+ return(FALSE); // Error sending marker
+ }
+ }
+
+ // Disable ISP interrupts
+
+ ISP_WRITE(pDevExt->Adapter, bus_icr, 0);
+
+ // Check available request slots
+
+ if (MAX_CONT_ENTRYS + 1 > pDevExt->queue_space)
+ {
+ if (!CheckQueueSpace(pDevExt, MAX_CONT_ENTRYS + 1))
+ {
+ ISP_WRITE(pDevExt->Adapter, bus_icr,
+ ICR_ENABLE_ALL_INTS | ICR_ENABLE_RISC_INT);
+ return(FALSE); // No queue space
+ }
+ }
+
+ // Get pointer to the queue entry for the command
+
+ pCmdEntry = (PCOMMAND_ENTRY)pDevExt->request_ptr;
+
+ // Advance request queue pointer
+
+ if (pDevExt->request_in == (REQUEST_QUEUE_DEPTH - 1))
+ {
+ pDevExt->request_in = 0;
+ pDevExt->request_ptr = pDevExt->pRequestQueue;
+ }
+ else
+ {
+ pDevExt->request_in++;
+ pDevExt->request_ptr++;
+ }
+ pDevExt->queue_space--;
+
+ // Setup request to send to ISP
+
+ pCmdEntry->hdr.entry_type = ET_COMMAND;
+ pCmdEntry->hdr.entry_cnt = 1; // start with 1
+ pCmdEntry->hdr.flags = 0;
+ pCmdEntry->hdr.sys_def_1 = 0;
+
+ pCmdEntry->handle = (ULONG)pSrb;
+ pCmdEntry->target_id = pSrb->TargetId;
+ pCmdEntry->target_lun = pSrb->Lun;
+ pCmdEntry->reserved = 0;
+
+ // Set command timeout value
+
+ if (pSrb->TimeOutValue > 65535 || pSrb->TimeOutValue == 0)
+ {
+ pCmdEntry->time_out = 0;
+ }
+ else
+ {
+ pCmdEntry->time_out = (USHORT)(pSrb->TimeOutValue + 1);
+ }
+
+ // Setup control flags
+
+ if (pSrb->SrbFlags & SRB_FLAGS_DATA_IN)
+ {
+ controlFlags = CF_READ;
+ }
+ if (pSrb->SrbFlags & SRB_FLAGS_DATA_OUT)
+ {
+ controlFlags = CF_WRITE;
+ }
+
+ if (pSrb->SrbFlags & SRB_FLAGS_DISABLE_DISCONNECT)
+ {
+ controlFlags |= CF_NO_DISCONNECTS;
+ }
+
+ if (pSrb->SrbFlags & SRB_FLAGS_DISABLE_AUTOSENSE)
+ {
+ controlFlags |= CF_NO_REQUEST_SENSE;
+ }
+
+ if ((pSrb->SrbFlags & SRB_FLAGS_QUEUE_ACTION_ENABLE) &&
+ (pDevExt->Id[pSrb->TargetId].Capability & CAP_TAGGED_QUEUING))
+ {
+ if (pSrb->QueueAction == SRB_SIMPLE_TAG_REQUEST)
+ controlFlags |= CF_SIMPLE_TAG;
+ else if (pSrb->QueueAction == SRB_HEAD_OF_QUEUE_TAG_REQUEST)
+ controlFlags |= CF_HEAD_TAG;
+ else
+ controlFlags |= CF_ORDERED_TAG;
+ }
+
+ pCmdEntry->control_flags = controlFlags;
+
+ // Move SCSI CDB
+
+ pCmdEntry->cdb_length = pSrb->CdbLength;
+ for (i = 0; i < pCmdEntry->cdb_length; i++)
+ {
+ pCmdEntry->cdb[i] = pSrb->Cdb[i];
+ }
+
+ // Setup data segments
+
+ for (segmentCnt = 0; transferCnt && segmentCnt < 4; segmentCnt++)
+ {
+ pCmdEntry->dseg[segmentCnt].base =
+ ScsiPortConvertPhysicalAddressToUlong(
+ ScsiPortGetPhysicalAddress(pDevExt, pSrb, dataPointer, &length));
+ if (length > transferCnt)
+ {
+ length = transferCnt;
+ }
+ pCmdEntry->dseg[segmentCnt].count = length;
+ transferCnt -= length;
+ dataPointer = (PUCHAR)dataPointer + length;
+ }
+
+ while (transferCnt)
+ {
+ PCONTINUATION_ENTRY pContEntry;
+
+ // Get ptr to next queue entry for command and bump entry count
+
+ pContEntry = (PCONTINUATION_ENTRY)pDevExt->request_ptr;
+
+ pCmdEntry->hdr.entry_cnt++;
+
+ // Advance request queue pointer
+
+ if (pDevExt->request_in == (REQUEST_QUEUE_DEPTH - 1))
+ {
+ pDevExt->request_in = 0;
+ pDevExt->request_ptr = pDevExt->pRequestQueue;
+ }
+ else
+ {
+ pDevExt->request_in++;
+ pDevExt->request_ptr++;
+ }
+ pDevExt->queue_space--;
+
+ // Setup header
+
+ pContEntry->hdr.entry_type = ET_CONTINUATION;
+ pContEntry->hdr.entry_cnt = 1; // hopefully RISC doesn't need total here
+ pContEntry->hdr.flags = EF_CONTINUATION;
+ pContEntry->hdr.sys_def_1 = 0;
+
+ // Fill in data segments
+
+ for (i = 0; transferCnt && i < 7; i++, segmentCnt++)
+ {
+ pContEntry->dseg[i].base =
+ ScsiPortConvertPhysicalAddressToUlong(
+ ScsiPortGetPhysicalAddress(pDevExt, pSrb, dataPointer, &length));
+ if (length > transferCnt)
+ {
+ length = transferCnt;
+ }
+ pContEntry->dseg[i].count = length;
+ transferCnt -= length;
+ dataPointer = (PUCHAR)dataPointer + length;
+ }
+ }
+ pCmdEntry->segment_cnt = segmentCnt;
+
+ // Tell ISP it's got a new I/O request
+
+ ISP_WRITE(pDevExt->Adapter, mailbox4, pDevExt->request_in);
+
+ // Enable ISP interrupts
+
+ ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_ENABLE_ALL_INTS | ICR_ENABLE_RISC_INT);
+
+ return(TRUE);
+}
+
+
+/************************************************************************/
+/* */
+/* QLInterruptServiceRoutine */
+/* */
+/* This routine is the interrupt service routine for the ISP1020. */
+/* The response queue is checked for completed commands. */
+/* */
+/* Arguments: */
+/* */
+/* ServiceContext - Supplies a pointer to the device extension */
+/* */
+/* Return Value: */
+/* */
+/* TRUE - Indicates that an interrupt was found. */
+/* FALSE - Indicates the device was not interrupting. */
+/* */
+/************************************************************************/
+
+BOOLEAN QLInterruptServiceRoutine(PVOID ServiceContext)
+{
+ PHW_DEVICE_EXTENSION pDevExt = ServiceContext;
+ PSCSI_REQUEST_BLOCK pSrb;
+ USHORT response_in;
+ PSTATUS_ENTRY pStsEntry;
+ USHORT status;
+
+
+// QLPrint((1, "ISR: Entering, pDevExt = %lx\n", (ULONG)pDevExt));
+
+ if (!(ISP_READ(pDevExt->Adapter, bus_isr) & BUS_ISR_RISC_INT))
+ {
+ // QLPrint((1, "ISR: spurious interrupt?\n"));
+ return(FALSE); // not my interrupt
+ }
+
+ // Loop to process all responses from ISP
+
+ do
+ {
+ // Check for async mailbox event
+
+ if (ISP_READ(pDevExt->Adapter, bus_sema) & BUS_SEMA_LOCK)
+ {
+ // Check mailbox status
+
+ status = ISP_READ(pDevExt->Adapter, mailbox0);
+ switch (status)
+ {
+ case MBOX_ASTS_SCSI_BUS_RESET:
+ QLPrint((1, "ISR: SCSI bus reset detected\n"));
+ QLCleanupAfterReset(pDevExt);
+ break;
+
+ case MBOX_ASTS_TIMEOUT_RESET:
+ QLPrint((1, "ISR: command timeout reset\n"));
+ QLCleanupAfterReset(pDevExt);
+ break;
+
+ default:
+ QLPrint((1, "ISR: Unexpected MailBox Response: %x", status));
+ QLPrint((1, " %x", ISP_READ(pDevExt->Adapter, mailbox1)));
+ QLPrint((1, " %x", ISP_READ(pDevExt->Adapter, mailbox2)));
+ QLPrint((1, " %x", ISP_READ(pDevExt->Adapter, mailbox3)));
+ QLPrint((1, " %x", ISP_READ(pDevExt->Adapter, mailbox4)));
+ QLPrint((1, " %x\n", ISP_READ(pDevExt->Adapter, mailbox5)));
+ }
+
+ QLLogError(pDevExt, NULL, SP_INTERNAL_ADAPTER_ERROR, (ULONG)status);
+
+ // Clear the semaphore lock
+
+ ISP_WRITE(pDevExt->Adapter, bus_sema, 0);
+ }
+
+ // Get current "response in" pointer
+
+ response_in = ISP_READ(pDevExt->Adapter, mailbox5);
+
+ // Clear risc interrupt
+
+ ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_CLEAR_RISC_INT);
+
+ // Process all responses from response queue
+
+ while (pDevExt->response_out != response_in)
+ {
+ // Get pointer to next response entry
+
+ pStsEntry = (PSTATUS_ENTRY)pDevExt->response_ptr;
+
+ // Advance pointers for next entry
+
+ if (pDevExt->response_out == (RESPONSE_QUEUE_DEPTH - 1))
+ {
+ pDevExt->response_out = 0;
+ pDevExt->response_ptr = pDevExt->pResponseQueue;
+ }
+ else
+ {
+ pDevExt->response_out++;
+ pDevExt->response_ptr++;
+ }
+
+ // Verify we have a valid Status queue entry
+
+ if (pStsEntry->hdr.entry_type != ET_STATUS ||
+ pStsEntry->hdr.flags & EF_ERROR_MASK)
+ {
+ QLPrint((1, "ISR - Invalid Status queue entry\n"));
+ }
+
+ // Set SRB pointer from queue entry handle
+
+ pSrb = (PSCSI_REQUEST_BLOCK)pStsEntry->handle;
+
+ // Check for normal completion
+
+ if (pStsEntry->completion_status == SCS_COMPLETE &&
+ pStsEntry->scsi_status == SCSISTAT_GOOD)
+ {
+ pSrb->SrbStatus = SRB_STATUS_SUCCESS;
+ pSrb->ScsiStatus = SCSISTAT_GOOD;
+ ScsiPortNotification(RequestComplete, pDevExt, pSrb);
+ }
+
+ // Error handling
+
+ else
+ {
+ // Convert ISP/SCSI error status to SRB error status
+
+ SetErrorStatus(pDevExt, pSrb, pStsEntry);
+
+ // Looks like retries are handled at a higher level
+ // Just return the error status (and sense data)
+
+ QLPrint((1, "ISR: Request completed with error = %x\n", pSrb->SrbStatus));
+
+ if (pSrb->SrbStatus == SRB_STATUS_DATA_OVERRUN)
+ {
+ pSrb->DataTransferLength -= pStsEntry->residual;
+ }
+ ScsiPortNotification(RequestComplete, pDevExt, pSrb);
+ }
+ }
+
+ // Done with responses, update the ISP
+
+ ISP_WRITE(pDevExt->Adapter, mailbox5, pDevExt->response_out);
+
+ } while (ISP_READ(pDevExt->Adapter, bus_isr) & BUS_ISR_RISC_INT);
+
+ // Check for waiting SRB and try to start it again
+
+ if (pDevExt->AdapterFlags & AFLG_SRB_WAITING)
+ {
+ pSrb = pDevExt->WaitingSrb;
+ if (SendCommandToIsp(pDevExt, pSrb))
+ {
+ // Command queued OK this time, notify port driver
+
+ pDevExt->AdapterFlags &= ~AFLG_SRB_WAITING;
+ ScsiPortNotification(NextLuRequest, pDevExt, pSrb->PathId,
+ pSrb->TargetId, pSrb->Lun);
+ }
+ }
+ return(TRUE);
+}
+
+
+/************************************************************************/
+/* */
+/* SetErrorStatus */
+/* */
+/* This routine is called by the interrupt service routine to */
+/* convert an error status from the ISP into a SRB error status. */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* pSrb - Pointer to SRB */
+/* pStsEntry - Pointer to status entry from the ISP */
+/* */
+/* Return Value: */
+/* */
+/* None */
+/* */
+/************************************************************************/
+
+VOID SetErrorStatus(PHW_DEVICE_EXTENSION pDevExt, PSCSI_REQUEST_BLOCK pSrb,
+ PSTATUS_ENTRY pStsEntry)
+{
+ ULONG length;
+ USHORT mbox_sts[6];
+
+ QLPrint((1, "ISR: completion sts=%x", pStsEntry->completion_status));
+ QLPrint((1, " SCSI ID=%x", pSrb->TargetId));
+ QLPrint((1, " SCSI sts=%x", pStsEntry->scsi_status));
+ QLPrint((1, " sense key=%x\n", (USHORT)(pStsEntry->req_sense_data[2])));
+
+ // Convert ISP completion status to SRB error code
+
+ if (pStsEntry->completion_status != SCS_COMPLETE)
+ {
+ if (pStsEntry->completion_status < sizeof(CmpStsErrorMap))
+ {
+ pSrb->SrbStatus = CmpStsErrorMap[pStsEntry->completion_status];
+ }
+ else
+ {
+ pSrb->SrbStatus = SRB_STATUS_ERROR;
+ }
+ if (pStsEntry->completion_status == SCS_RESET_OCCURRED ||
+ pStsEntry->completion_status == SCS_TIMEOUT)
+ {
+ QLCleanupAfterReset(pDevExt);
+ }
+
+ // Log error (if not data underrun and not Inquiry selection timeout)
+
+ if (pSrb->SrbStatus != SRB_STATUS_DATA_OVERRUN &&
+ (pStsEntry->completion_status != SCS_INCOMPLETE ||
+ pSrb->Cdb[0] != SCSIOP_INQUIRY))
+ {
+ QLLogError(pDevExt, pSrb, SP_INTERNAL_ADAPTER_ERROR,
+ (ULONG)pStsEntry->completion_status);
+ }
+ }
+
+ // Handle SCSI error status, return sense data
+
+ else
+ {
+ // Return scsi status
+
+ pSrb->ScsiStatus = (UCHAR)pStsEntry->scsi_status;
+ pSrb->SrbStatus = SRB_STATUS_ERROR;
+
+ switch(pStsEntry->scsi_status)
+ {
+ case SCSISTAT_CHECK_CONDITION:
+
+ // Return request sense data
+
+ if ((pStsEntry->state_flags & SS_GOT_SENSE) &&
+ !(pSrb->SrbFlags & SRB_FLAGS_DISABLE_AUTOSENSE) &&
+ pSrb->SenseInfoBufferLength)
+ {
+
+ QLPrint((1, "ISR: Returning sense data\n"));
+
+ if (pStsEntry->req_sense_length > pSrb->SenseInfoBufferLength)
+ length = (ULONG)(pSrb->SenseInfoBufferLength);
+ else
+ length = (ULONG)(pStsEntry->req_sense_length);
+ ScsiPortMoveMemory(pSrb->SenseInfoBuffer,
+ pStsEntry->req_sense_data, length);
+ pSrb->SenseInfoBufferLength = (UCHAR)length;
+ pSrb->SrbStatus |= SRB_STATUS_AUTOSENSE_VALID;
+ }
+
+ // If check condition and autosense disabled, need to
+ // restart command queue
+
+ if (pSrb->SrbFlags & SRB_FLAGS_DISABLE_AUTOSENSE)
+ {
+ // Restart RISC command queue
+
+ QLPrint((1, "ISR: Restart RISC queue\n"));
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 2, 3,
+ MBOX_CMD_START_QUEUE,
+ (USHORT)(((USHORT)(pSrb->TargetId) << 8) | pSrb->Lun),
+ 0,0,0,0))
+ {
+ QLPrint((1, "ISR: START QUEUE command failed\n"));
+ }
+ }
+ break;
+ }
+ }
+}
+
+
+/************************************************************************/
+/* */
+/* QLLogError */
+/* */
+/* This routine is called to log an error to the system. */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* pSrb - Supplies pointer to SRB or NULL if no SRB */
+/* ErrorCode - Supplies the error code to log with the error */
+/* UniqueId - Supplies the unique error identifier */
+/* */
+/* Return Value: */
+/* */
+/* None */
+/* */
+/************************************************************************/
+
+VOID QLLogError(IN PHW_DEVICE_EXTENSION pDevExt, IN PSCSI_REQUEST_BLOCK pSrb,
+ IN ULONG ErrorCode, IN ULONG UniqueId)
+{
+
+ QLPrint((1, "QLLogError called\n"));
+
+ if (pSrb == NULL)
+ {
+ ScsiPortLogError(
+ pDevExt, // HwDeviceExtension
+ NULL, // Srb
+ 0, // PathId
+ 0, // TargetId
+ 0, // Lun
+ ErrorCode, // ErrorCode
+ UniqueId // UniqueId
+ );
+ }
+ else
+ {
+ ScsiPortLogError(
+ pDevExt, // HwDeviceExtension
+ pSrb, // Srb
+ pSrb->PathId, // PathId
+ pSrb->TargetId, // TargetId
+ pSrb->Lun, // Lun
+ ErrorCode, // ErrorCode
+ UniqueId // UniqueId
+ );
+ }
+}
+
+
+/************************************************************************/
+/* */
+/* MailboxCommand */
+/* */
+/* This routine issues a mailbox command and waits for completion */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* */
+/* Return Value: */
+/* */
+/* TRUE if command completed OK */
+/* FALSE if error */
+/* */
+/************************************************************************/
+
+BOOLEAN MailboxCommand(IN PHW_DEVICE_EXTENSION pDevExt,
+ USHORT *mbox_sts, UCHAR out_cnt, UCHAR in_cnt,
+ USHORT reg0, USHORT reg1, USHORT reg2,
+ USHORT reg3, USHORT reg4, USHORT reg5)
+{
+ ULONG waitcnt;
+ USHORT retrycnt;
+ USHORT controlReg;
+
+/*
+ QLPrint((1, " MailboxCommand %x", reg0));
+ QLPrint((1, " %x", reg1));
+ QLPrint((1, " %x", reg2));
+ QLPrint((1, " %x", reg3));
+ QLPrint((1, " %x", reg4));
+ QLPrint((1, " %x\n", reg5));
+*/
+
+ // Disable adapter interrupts
+
+ controlReg = ISP_READ(pDevExt->Adapter, bus_icr);
+ if (controlReg & ICR_ENABLE_ALL_INTS)
+ {
+ ISP_WRITE(pDevExt->Adapter, bus_icr, 0);
+ }
+
+ // Use loop to retry mailbox command if busy status returned
+
+ retrycnt = 16; // retry a few times if busy
+ do
+ {
+ // Make sure host interrupt is clear
+
+ waitcnt = 10000; // wait a little bit if necessary
+ while (ISP_READ(pDevExt->Adapter, hccr) & HCCR_HOST_INT)
+ {
+ if (waitcnt-- == 0)
+ {
+ QLPrint((1, "MailboxCommand: host interrupt timeout\n"));
+ ISP_WRITE(pDevExt->Adapter, bus_icr, controlReg);
+ return(FALSE);
+ }
+ }
+
+ // Load data to the mailbox registers
+
+ switch (out_cnt)
+ {
+ case 6: ISP_WRITE(pDevExt->Adapter, mailbox5, reg5);
+ case 5: if (reg0 != MBOX_CMD_INIT_RESPONSE_QUEUE)
+ ISP_WRITE(pDevExt->Adapter, mailbox4, reg4);
+ case 4: ISP_WRITE(pDevExt->Adapter, mailbox3, reg3);
+ case 3: ISP_WRITE(pDevExt->Adapter, mailbox2, reg2);
+ case 2: ISP_WRITE(pDevExt->Adapter, mailbox1, reg1);
+ case 1: ISP_WRITE(pDevExt->Adapter, mailbox0, reg0);
+ }
+
+ // Wake up the ISP
+
+ ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_SET_HOST_INT);
+
+ // Wait for command to complete
+
+ waitcnt = 100000;
+ while (!(ISP_READ(pDevExt->Adapter, bus_isr) & BUS_ISR_RISC_INT) ||
+ !(ISP_READ(pDevExt->Adapter, bus_sema) & BUS_SEMA_LOCK))
+ {
+ if (waitcnt-- == 0)
+ {
+ QLPrint((1, "MailboxCommand: cmd completion timeout\n"));
+ ISP_WRITE(pDevExt->Adapter, bus_icr, controlReg);
+ return(FALSE);
+ }
+ }
+
+ // Save away status registers
+
+ mbox_sts[0] = ISP_READ(pDevExt->Adapter, mailbox0);
+ switch (in_cnt)
+ {
+ case 6: mbox_sts[5] = ISP_READ(pDevExt->Adapter, mailbox5);
+ case 5: if (reg0 != MBOX_CMD_INIT_RESPONSE_QUEUE)
+ mbox_sts[4] = ISP_READ(pDevExt->Adapter, mailbox4);
+ case 4: mbox_sts[3] = ISP_READ(pDevExt->Adapter, mailbox3);
+ case 3: mbox_sts[2] = ISP_READ(pDevExt->Adapter, mailbox2);
+ case 2: mbox_sts[1] = ISP_READ(pDevExt->Adapter, mailbox1);
+ }
+
+ // Clear the semaphore lock
+
+ ISP_WRITE(pDevExt->Adapter, bus_sema, 0);
+
+ // Clear interrupt
+
+ ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_CLEAR_RISC_INT);
+
+ // Check status from ISP
+
+ switch (mbox_sts[0])
+ {
+ case MBOX_STS_BUSY:
+ QLPrint((1, "MailboxCommand: ISP busy\n"));
+ break; // retry command
+
+ case MBOX_STS_COMMAND_COMPLETE:
+ ISP_WRITE(pDevExt->Adapter, bus_icr, controlReg);
+ return(TRUE); // return good status
+
+ case MBOX_ASTS_SCSI_BUS_RESET:
+ pDevExt->AdapterFlags |= AFLG_SEND_MARKER;
+ QLPrint((1, "MailboxCommand: ISP SCSI bus RESET seen\n"));
+ break; // retry command
+
+ default:
+ QLPrint((1, "MailboxCommand: error status = %lx\n", mbox_sts[0]));
+ ISP_WRITE(pDevExt->Adapter, bus_icr, controlReg);
+ QLLogError(pDevExt, NULL, SP_INTERNAL_ADAPTER_ERROR,
+ (ULONG)mbox_sts[0]);
+ return(FALSE); // return error status
+ }
+ } while (retrycnt--);
+
+ QLPrint((1, "MailboxCommand: busy timeout\n"));
+ ISP_WRITE(pDevExt->Adapter, bus_icr, controlReg);
+ return(FALSE);
+}
+
+
+/************************************************************************/
+/* */
+/* SendMarker */
+/* */
+/* This call sends a Marker packet to the ISP */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* */
+/* Return Value: */
+/* */
+/* TRUE - marker sent */
+/* FALSE - no slot in request queue */
+/* */
+/************************************************************************/
+
+BOOLEAN SendMarker(IN PHW_DEVICE_EXTENSION pDevExt)
+{
+ PMARKER_ENTRY pMarkEntry;
+
+ // Disable ISP interrupts
+
+ ISP_WRITE(pDevExt->Adapter, bus_icr, 0);
+
+ // Check available queue space
+
+ if (!CheckQueueSpace(pDevExt, 1))
+ {
+ ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_ENABLE_ALL_INTS | ICR_ENABLE_RISC_INT);
+ return(FALSE); // No queue space, return error
+ }
+
+ // Reset the flag so we don't send another marker
+
+ pDevExt->AdapterFlags &= ~AFLG_SEND_MARKER;
+
+ // Get pointer to the queue entry for the marker
+
+ pMarkEntry = (PMARKER_ENTRY)pDevExt->request_ptr;
+
+ // Move the internal pointers for the request queue
+
+ if (pDevExt->request_in == (REQUEST_QUEUE_DEPTH - 1))
+ {
+ pDevExt->request_in = 0;
+ pDevExt->request_ptr = pDevExt->pRequestQueue;
+ }
+ else
+ {
+ pDevExt->request_in++;
+ pDevExt->request_ptr++;
+ }
+
+ // Put the marker in the request queue
+
+ pMarkEntry->hdr.entry_type = ET_MARKER;
+ pMarkEntry->hdr.entry_cnt = 1;
+ pMarkEntry->hdr.flags = 0;
+ pMarkEntry->hdr.sys_def_1 = 0;
+ pMarkEntry->reserved0 = 0;
+ pMarkEntry->target_id = 0;
+ pMarkEntry->target_lun = 0;
+ pMarkEntry->reserved1 = 0;
+ pMarkEntry->modifier = 2;
+
+ // Tell ISP it's got a new I/O request
+
+ ISP_WRITE(pDevExt->Adapter, mailbox4, pDevExt->request_in);
+
+ // One less I/O slot
+
+ pDevExt->queue_space--;
+
+ // Enable ISP interrupts
+
+ ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_ENABLE_ALL_INTS | ICR_ENABLE_RISC_INT);
+
+ return(TRUE);
+}
+
+
+/************************************************************************/
+/* */
+/* CheckQueueSpace */
+/* */
+/* This call checks if enough request queue slots are available */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* slotcnt - number of needed slots */
+/* */
+/* Return Value: */
+/* */
+/* TRUE - request slots are available */
+/* FALSE - request slots not available */
+/* */
+/************************************************************************/
+
+BOOLEAN CheckQueueSpace(IN PHW_DEVICE_EXTENSION pDevExt, USHORT slotcnt)
+{
+ USHORT mailbox4;
+
+ // Update available slot count
+
+ mailbox4 = ISP_READ(pDevExt->Adapter, mailbox4);
+ pDevExt->request_out = mailbox4;
+
+ if (pDevExt->request_in == pDevExt->request_out)
+ {
+ pDevExt->queue_space = REQUEST_QUEUE_DEPTH - 1;
+ }
+ else if (pDevExt->request_in > pDevExt->request_out)
+ {
+ pDevExt->queue_space = ((REQUEST_QUEUE_DEPTH - 1) -
+ (pDevExt->request_in - pDevExt->request_out));
+ }
+ else
+ {
+ pDevExt->queue_space = (pDevExt->request_out-pDevExt->request_in)-1;
+ }
+
+ // Check if enough are now available
+
+ if (pDevExt->queue_space >= slotcnt)
+ {
+ return(TRUE); // Queue space available, return
+ }
+ else
+ {
+ QLPrint((1, "CheckQueueSpace: no request queue space\n"));
+ return(FALSE); // No space, return error status
+ }
+}
+
+
+/************************************************************************/
+/* */
+/* QLResetScsiBus */
+/* */
+/* This function resets the SCSI bus and calls the reset cleanup */
+/* function. */
+/* */
+/* Arguments: */
+/* */
+/* ServiceContext - Supplies a pointer to the device extension */
+/* PathId - Supplies the path id of the bus */
+/* */
+/* Return Value: */
+/* */
+/* TRUE - Indicating the reset is complete */
+/* FALSE - if error doing reset */
+/* */
+/************************************************************************/
+
+BOOLEAN QLResetScsiBus(IN PVOID ServiceContext, IN ULONG PathId)
+{
+ PHW_DEVICE_EXTENSION pDevExt = ServiceContext;
+ USHORT mbox_sts[6];
+ USHORT i;
+
+ QLPrint((1, "QLResetScsiBus: Resetting the SCSI bus\n"));
+
+ // Reset SCSI bus
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 2, 2,
+ MBOX_CMD_BUS_RESET,
+ pDevExt->Bus_Reset_Delay,
+ 0,0,0,0))
+ {
+ QLPrint((1, "QLResetScsiBus: SCSI BUS RESET command failed\n"));
+ return(FALSE);
+ }
+
+ // Wait for RISC reset delay
+
+ for (i = 0; i < pDevExt->Bus_Reset_Delay * 1000; i++)
+ ScsiPortStallExecution((ULONG)1000);
+
+ QLCleanupAfterReset(pDevExt);
+
+ return(TRUE);
+}
+
+
+/************************************************************************/
+/* */
+/* QLCleanupAfterReset */
+/* */
+/* This routine is called after a SCSI bus reset occurs. */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* */
+/* Return Value: */
+/* */
+/* None */
+/* */
+/************************************************************************/
+
+VOID QLCleanupAfterReset(IN PHW_DEVICE_EXTENSION pDevExt)
+{
+
+ // Reenable ISP queues
+
+ if (!SendMarker(pDevExt))
+ {
+ QLPrint((1, "QLCleanupAfterReset: Failed to send marker\n"));
+ pDevExt->AdapterFlags |= AFLG_SEND_MARKER;
+ }
+
+ ScsiPortNotification(ResetDetected, pDevExt, NULL);
+
+}
+
+
+/************************************************************************/
+/* */
+/* QLAdapterState */
+/* */
+/* This function is called for switching states between real and */
+/* protected mode drivers. */
+/* */
+/* Arguments: */
+/* */
+/* ServiceContext - Supplies a pointer to the device extension */
+/* Context - */
+/* SaveState - TRUE indicates adapter state should be saved */
+/* FALSE indicates adapter state should be restored */
+/* */
+/* Return Value: */
+/* */
+/* TRUE - Indicating the operation is complete */
+/* FALSE - if error */
+/* */
+/************************************************************************/
+
+BOOLEAN QLAdapterState(IN PVOID ServiceContext,IN PVOID Context,IN BOOLEAN SaveState)
+{
+ PHW_DEVICE_EXTENSION pDevExt = ServiceContext;
+ USHORT mbox_sts[6];
+
+ if (SaveState)
+ {
+ QLPrint((1, "QLAdapterState: save adapter state\n"));
+ }
+ else
+ {
+ QLPrint((1, "QLAdapterState: restore adapter state\n"));
+
+ // Disable ISP interrupts for ROM BIOS
+
+ ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_DISABLE_ALL_INTS);
+
+ // Disable RISC request queue
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 2, 2,
+ MBOX_CMD_INIT_REQUEST_QUEUE,
+ 0,
+ 0,0,0,0))
+ {
+ QLPrint((1, "QLAdapterState: INIT REQUEST QUEUE cmd failed\n"));
+ return(FALSE);
+ }
+
+ // Disable RISC response queue
+
+ if (!MailboxCommand(pDevExt, mbox_sts, 2, 2,
+ MBOX_CMD_INIT_RESPONSE_QUEUE,
+ 0,
+ 0,0,0,0))
+ {
+ QLPrint((1, "QLAdapterState: INIT RESPONSE QUEUE cmd failed\n"));
+ return(FALSE);
+ }
+
+ }
+
+ return(TRUE);
+}
+
+
+/************************************************************************/
+/* */
+/* GetNovramParameters */
+/* */
+/* This routine gets NOVRAM parameters and sets up in host adapter */
+/* block, use default values if NOVRAM data not valid. */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* */
+/* Return Value: */
+/* */
+/* None */
+/* */
+/************************************************************************/
+
+VOID GetNovramParameters(IN PHW_DEVICE_EXTENSION pDevExt)
+{
+ NOVRAM NovramParameters;
+ PNOVRAM nvram_ptr = &NovramParameters;
+ USHORT i;
+
+ // Read in entire NOVRAM and perform checksum to make sure data is valid
+
+ if (ReadAllNovram(pDevExt, (UCHAR*)nvram_ptr))
+ {
+ QLPrint((1, "GetNovramParameters: parameters valid\n"));
+
+ // NOVRAM valid, use paramters
+
+ pDevExt->Config_Reg = nvram_ptr->Fifo_Threshold;
+ pDevExt->Host_Adapter_Enable = nvram_ptr->Host_Adapter_Enable;
+ pDevExt->Initiator_SCSI_Id = nvram_ptr->Initiator_SCSI_Id;
+ pDevExt->Bus_Reset_Delay = nvram_ptr->Bus_Reset_Delay;
+
+ // Only 1 retry and no delay for NT driver (Disk Administrator problem)
+ // pDevExt->Retry_Count = nvram_ptr->Retry_Count;
+ // pDevExt->Retry_Delay = nvram_ptr->Retry_Delay;
+ pDevExt->Retry_Count = NVRAM_DEF_RETRY_COUNT;
+ pDevExt->Retry_Delay = NVRAM_DEF_RETRY_DELAY;
+
+ pDevExt->ASync_Data_Setup_Time = nvram_ptr->ASync_Data_Setup_Time;
+ pDevExt->REQ_ACK_Active_Negation= nvram_ptr->REQ_ACK_Active_Negation;
+ pDevExt->DATA_Active_Negation = nvram_ptr->DATA_Line_Active_Negation;
+ pDevExt->Data_DMA_Burst_Enable = nvram_ptr->Data_DMA_Burst_Enable;
+ pDevExt->Cmd_DMA_Burst_Enable = nvram_ptr->Command_DMA_Burst_Enable;
+ pDevExt->Tag_Age_Limit = nvram_ptr->Tag_Age_Limit;
+ pDevExt->Selection_Timeout = nvram_ptr->Selection_Timeout;
+ pDevExt->Max_Queue_Depth = nvram_ptr->Max_Queue_Depth;
+ pDevExt->Termination_Low_Enable = nvram_ptr->Termination_Low_Enable;
+ pDevExt->Termination_High_Enable= nvram_ptr->Termination_High_Enable;
+ pDevExt->PCMC_Burst_Enable = nvram_ptr->PCMC_Burst_Enable;
+ pDevExt->Sixty_MHz_Enable = nvram_ptr->Sixty_MHz_Enable;
+
+ for (i = 0; i < 16; i++)
+ {
+ UCHAR temp = 0;
+
+ temp |= nvram_ptr->Id[i].Renegotiate_on_Error << 0;
+ temp |= nvram_ptr->Id[i].Stop_Queue_on_Check << 1;
+ temp |= nvram_ptr->Id[i].Auto_Request_Sense << 2;
+ temp |= nvram_ptr->Id[i].Tagged_Queuing << 3;
+ temp |= nvram_ptr->Id[i].Sync_Data_Transfers << 4;
+ temp |= nvram_ptr->Id[i].Wide_Data_Transfers << 5;
+ temp |= nvram_ptr->Id[i].Parity_Checking << 6;
+ temp |= nvram_ptr->Id[i].Disconnect_Allowed << 7;
+
+ pDevExt->Id[i].Capability = temp;
+ pDevExt->Id[i].Execution_Throttle = nvram_ptr->Id[i].Execution_Throttle;
+ pDevExt->Id[i].Sync_Period = nvram_ptr->Id[i].Sync_Period;
+ pDevExt->Id[i].Sync_Offset = nvram_ptr->Id[i].Sync_Offset;
+ pDevExt->Id[i].Device_Enable= nvram_ptr->Id[i].Device_Enable;
+
+ // Force auto request sense ON and stop queue OFF
+
+ pDevExt->Id[i].Capability |= CAP_AUTO_REQ_SENSE;
+ pDevExt->Id[i].Capability &= ~CAP_STOP_QUEUE_ON_CHECK;
+
+ if (pDevExt->Id[i].Capability & CAP_TAGGED_QUEUING)
+ {
+ pDevExt->AdapterFlags |= AFLG_TAGGED_QUEUING;
+ }
+ }
+ }
+ else
+ {
+ QLPrint((1, "GetNovramParameters: parameters NOT valid, using defaults\n"));
+
+ // Use defaults, NOVRAM was not programmed
+
+ pDevExt->Config_Reg = NVRAM_DEF_FIFO_THRESHOLD;
+ pDevExt->Host_Adapter_Enable = NVRAM_DEF_ADAPTER_ENABLE;
+ pDevExt->Initiator_SCSI_Id = NVRAM_DEF_INITIATOR_SCSI_ID;
+ pDevExt->Bus_Reset_Delay = NVRAM_DEF_BUS_RESET_DELAY;
+ pDevExt->Retry_Count = NVRAM_DEF_RETRY_COUNT;
+ pDevExt->Retry_Delay = NVRAM_DEF_RETRY_DELAY;
+ pDevExt->ASync_Data_Setup_Time = NVRAM_DEF_ASYNC_SETUP_TIME;
+ pDevExt->REQ_ACK_Active_Negation= NVRAM_DEF_REQ_ACK_ACTIVE_NEGATION;
+ pDevExt->DATA_Active_Negation = NVRAM_DEF_DATA_ACTIVE_NEGATION;
+ pDevExt->Data_DMA_Burst_Enable = NVRAM_DEF_DATA_DMA_BURST_ENABLE;
+ pDevExt->Cmd_DMA_Burst_Enable = NVRAM_DEF_CMD_DMA_BURST_ENABLE;
+ pDevExt->Tag_Age_Limit = NVRAM_DEF_TAG_AGE_LIMIT;
+ pDevExt->Selection_Timeout = NVRAM_DEF_SELECTION_TIMEOUT;
+ pDevExt->Max_Queue_Depth = NVRAM_DEF_MAX_QUEUE_DEPTH;
+ pDevExt->Termination_Low_Enable = NVRAM_DEF_TERMINATION_LOW_ENABLE;
+ pDevExt->Termination_High_Enable= NVRAM_DEF_TERMINATION_HIGH_ENABLE;
+ pDevExt->PCMC_Burst_Enable = NVRAM_DEF_PCMC_BURST_ENABLE;
+ pDevExt->Sixty_MHz_Enable = NVRAM_DEF_SIXTY_MHZ_ENABLE;
+
+ for (i = 0; i < 16; i++)
+ {
+ UCHAR temp = 0;
+
+ temp |= NVRAM_DEF_RENEGOTIATE_ON_ERROR << 0;
+ temp |= NVRAM_DEF_STOP_QUEUE_ON_CHECK << 1;
+ temp |= NVRAM_DEF_AUTO_REQUEST_SENSE << 2;
+ temp |= NVRAM_DEF_TAGGED_QUEUING << 3;
+ temp |= NVRAM_DEF_SYNC_DATA_TRANSFERS << 4;
+ temp |= NVRAM_DEF_WIDE_DATA_TRANSFERS << 5;
+ temp |= NVRAM_DEF_PARITY_CHECKING << 6;
+ temp |= NVRAM_DEF_DISCONNECT_ALLOWED << 7;
+
+ pDevExt->Id[i].Capability = temp;
+ pDevExt->Id[i].Execution_Throttle = NVRAM_DEF_EXECUTION_THROTTLE;
+ pDevExt->Id[i].Sync_Period = NVRAM_DEF_SYNC_PERIOD;
+ pDevExt->Id[i].Sync_Offset = NVRAM_DEF_SYNC_OFFSET;
+ pDevExt->Id[i].Device_Enable= NVRAM_DEF_DEVICE_ENABLE;
+
+ if (pDevExt->Id[i].Capability & CAP_TAGGED_QUEUING)
+ {
+ pDevExt->AdapterFlags |= AFLG_TAGGED_QUEUING;
+ }
+ }
+ }
+
+ // Enable burst mode
+
+ if (pDevExt->Data_DMA_Burst_Enable || pDevExt->Cmd_DMA_Burst_Enable)
+ {
+ pDevExt->Config_Reg |= NVRAM_CONFIG_BURST_ENABLE;
+ }
+}
+
+
+/************************************************************************/
+/* */
+/* ReadAllNovram */
+/* */
+/* This routine is called to read the entire NOVRAM into buffer */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* buf - pointer to parameter buffer */
+/* */
+/* Return Value: */
+/* */
+/* TRUE if NOVRAM read OK */
+/* FALSE if NOVRAM not valid */
+/* */
+/************************************************************************/
+
+BOOLEAN ReadAllNovram(IN PHW_DEVICE_EXTENSION pDevExt, UCHAR* buf)
+{
+ UCHAR* ptr;
+ UCHAR sum;
+ USHORT index;
+
+ // Loop through the entire NOVRAM (64 words)
+
+ ptr = (UCHAR*)buf;
+ for (index = 0; index < 64; index++, ptr += 2)
+ {
+ // Read next word from NOVRAM
+
+ ReadNovramWord(pDevExt, index, (USHORT*)ptr);
+ }
+
+ // Check for a valid signiture
+
+ if (buf[0] != 'I' ||
+ buf[1] != 'S' ||
+ buf[2] != 'P' ||
+ buf[3] != ' ')
+ {
+ return(FALSE); // invalid signature
+ }
+
+ // Check version number for 2 or above
+
+ if (buf[4] < 2)
+ {
+ QLPrint((1, "NOVRAM wrong version\n"));
+ return(FALSE); // wrong version (old NOVRAM layout)
+ }
+
+ // Verify correct checksum
+
+ ptr = (UCHAR*)buf;
+ for (sum = 0, index = 0; index < 128; index++, ptr++)
+ {
+ sum += *ptr;
+ }
+ if (sum != 0)
+ {
+ return(FALSE); // bad checksum
+ }
+
+ return(TRUE);
+}
+
+
+/************************************************************************/
+/* */
+/* ReadNovramWord */
+/* */
+/* This routine is called to read a word from NOVRAM */
+/* */
+/* Arguments: */
+/* */
+/* pDevExt - Supplies a pointer to the device extension */
+/* addr - NOVRAM word offset to read */
+/* ptr - pointer to parameter buffer */
+/* */
+/* Return Value: */
+/* */
+/* None */
+/* */
+/************************************************************************/
+
+VOID ReadNovramWord(IN PHW_DEVICE_EXTENSION pDevExt,
+ USHORT addr, USHORT* ptr)
+{
+ USHORT word_val;
+ USHORT bit_val;
+ SHORT index;
+
+ // Select the chip
+
+ ISP_WRITE(pDevExt->Adapter, NvRam_reg, NVRAM_SELECT);
+ NovramDelay();
+ ISP_WRITE(pDevExt->Adapter, NvRam_reg, (NVRAM_SELECT | NVRAM_CLOCK));
+ NovramDelay();
+
+ // Setup 9 bit command word: 1 start bit, 2 opcode bits, 6 addr bits
+
+ word_val = (NVRAM_READ_OP << 6) | (addr & 0x3F);
+
+ // Send the request
+
+ for (index = 8; index >= 0; index--)
+ {
+ // determine if we should send a one or a zero
+
+ bit_val = 0;
+ if ((word_val >> index) & 1)
+ {
+ bit_val = NVRAM_DATA_OUT;
+ }
+
+ // send the bit to the NvRam
+ // 1. Select + data bit, delay
+ // 2. Select + data bit + clock, delay
+ // 3. Select + data bit (remove clock), delay
+
+ ISP_WRITE(pDevExt->Adapter, NvRam_reg, (USHORT)(NVRAM_SELECT | bit_val));
+ NovramDelay();
+
+ ISP_WRITE(pDevExt->Adapter, NvRam_reg,
+ (USHORT)(NVRAM_SELECT | bit_val | NVRAM_CLOCK));
+ NovramDelay();
+
+ ISP_WRITE(pDevExt->Adapter, NvRam_reg, (USHORT)(NVRAM_SELECT | bit_val));
+ NovramDelay();
+ }
+
+ // Zap the location we're reading to before starting
+
+ *ptr = 0;
+
+ // read the NvRam data
+
+ for (index = 15; index >= 0; index--)
+ {
+ // move all of bits over (bits are read in MSB manner)
+
+ *ptr <<= 1;
+
+ // cycle the clock
+
+ ISP_WRITE(pDevExt->Adapter, NvRam_reg, (NVRAM_SELECT | NVRAM_CLOCK));
+ NovramDelay();
+
+ // see if the incoming bit should be set or not
+
+ word_val = ISP_READ(pDevExt->Adapter, NvRam_reg);
+ if (word_val & NVRAM_DATA_IN)
+ {
+ *ptr |= 1;
+ }
+
+ // remove the clock
+
+ ISP_WRITE(pDevExt->Adapter, NvRam_reg, NVRAM_SELECT);
+ NovramDelay();
+ }
+
+ // Done with this request, clear the selection
+
+ ISP_WRITE(pDevExt->Adapter, NvRam_reg, NVRAM_DESELECT);
+}
+
+
+/************************************************************************/
+/* */
+/* NovramDelay */
+/* */
+/* This routine waits a little bit to let signals settle */
+/* */
+/* Arguments: */
+/* */
+/* None */
+/* */
+/* Return Value: */
+/* */
+/* None */
+/* */
+/************************************************************************/
+
+VOID NovramDelay()
+{
+
+ ScsiPortStallExecution((ULONG)NVRAM_DELAY_COUNT);
+}
diff --git a/private/ntos/miniport/qlogic/qlisp.h b/private/ntos/miniport/qlogic/qlisp.h
new file mode 100644
index 000000000..2dafdd333
--- /dev/null
+++ b/private/ntos/miniport/qlogic/qlisp.h
@@ -0,0 +1,608 @@
+/************************************************************************/
+/* */
+/* Driver Name: QL10WNT.SYS - NT Miniport Driver for QLogic ISP1020 */
+/* */
+/* Source File Name: QLISP.H */
+/* */
+/* Function: Internal data structures and C macros. */
+/* */
+/************************************************************************/
+/* */
+/* NOTICE */
+/* */
+/* COPYRIGHT 1994-1995 QLOGIC CORPORATION */
+/* ALL RIGHTS RESERVED */
+/* */
+/* This computer program is CONFIDENTIAL and a TRADE SECRET */
+/* of QLOGIC CORPORATION. The receipt or possesion of this */
+/* program does not convey any rights to reproduce or disclose */
+/* its contents, or to manufacture, use, or sell anything that */
+/* it may describe, in whole or in part, without the specific */
+/* written consent of QLOGIC CORPORATION. Any reproduction of */
+/* this program without the express written consent of QLOGIC */
+/* CORPORATION is a violation of the copyright laws and may */
+/* subject you to criminal prosecution. */
+/* */
+/************************************************************************/
+/* */
+/* Revision history: */
+/* */
+/* See QLISP.C module for driver revision history */
+/* */
+/************************************************************************/
+
+
+/**********************************************************************/
+/* Local defines and constants */
+/**********************************************************************/
+
+#define MAX_SUPPORTED_ADAPTERS 3 // maximum # of supported adapters
+#define NUM_SCSI_IDS 16
+#define NUM_SCSI_LUNS 8
+#define REQUEST_QUEUE_DEPTH 32
+#define RESPONSE_QUEUE_DEPTH 32
+#define MAX_SG_SEGMENTS 18 // max s/g segments (cmd entry + 2 cont entrys)
+#define MAX_CONT_ENTRYS 2 // max continuation entrys (2 = 18 s/g segments)
+#define WAIT_QUEUE_RETRY_CNT 1000
+#define CMD_RETRY_CNT 3
+#define DEFTIMEOUT 30 // default timeout (seconds)
+
+
+/************************************************************************/
+/* Macros */
+/************************************************************************/
+
+
+/**********************************************************************/
+/* Forward typedefs */
+/**********************************************************************/
+
+
+/************************************************************************/
+/* NOVRAM definitions */
+/************************************************************************/
+
+/* NOVRAM data structure */
+
+typedef struct _NOVRAM
+{
+ UCHAR id[4]; /* "ISP " */
+ UCHAR version;
+ /* bits */
+ UCHAR Fifo_Threshold :2; /* 0,1 */
+ UCHAR Not_Used0 :1; /* 2 */
+ UCHAR Host_Adapter_Enable :1; /* 3 */
+ UCHAR Initiator_SCSI_Id :4; /* 4,5,6,7 */
+
+ UCHAR Bus_Reset_Delay;
+ UCHAR Retry_Count;
+ UCHAR Retry_Delay;
+ /* bits */
+ UCHAR ASync_Data_Setup_Time :4; /* 0,1,2,3 */
+ UCHAR REQ_ACK_Active_Negation :1; /* 4 */
+ UCHAR DATA_Line_Active_Negation :1; /* 5 */
+ UCHAR Data_DMA_Burst_Enable :1; /* 6 */
+ UCHAR Command_DMA_Burst_Enable :1; /* 7 */
+
+ UCHAR Tag_Age_Limit;
+ /* bits */
+ UCHAR Termination_Low_Enable :1; /* 0 */
+ UCHAR Termination_High_Enable :1; /* 1 */
+ UCHAR PCMC_Burst_Enable :1; /* 3 */
+ UCHAR Sixty_MHz_Enable :1; /* 2 */
+ UCHAR Not_Used1 :4;
+
+ USHORT Selection_Timeout;
+ USHORT Max_Queue_Depth;
+ UCHAR Pad0[12];
+
+ struct
+ { /*bit*/
+ UCHAR Renegotiate_on_Error :1; /* 0 */
+ UCHAR Stop_Queue_on_Check :1; /* 1 */
+ UCHAR Auto_Request_Sense :1; /* 2 */
+ UCHAR Tagged_Queuing :1; /* 3 */
+ UCHAR Sync_Data_Transfers :1; /* 4 */
+ UCHAR Wide_Data_Transfers :1; /* 5 */
+ UCHAR Parity_Checking :1; /* 6 */
+ UCHAR Disconnect_Allowed :1; /* 7 */
+
+ UCHAR Execution_Throttle;
+ UCHAR Sync_Period;
+ /* bits */
+ UCHAR Sync_Offset :4; /* 0,1,2,3 */
+ UCHAR Device_Enable :1; /* 4 */
+ UCHAR Not_Used2 :3; /* 5,6,7 */
+
+ UCHAR Available0;
+ UCHAR Available1;
+ } Id[16];
+
+ UCHAR Pad1[3];
+ UCHAR Check_Sum;
+} NOVRAM, *PNOVRAM;
+
+/* Command values */
+
+#define NVRAM_START_BIT 4
+#define NVRAM_WRITE_OP (NVRAM_START_BIT+1)
+#define NVRAM_READ_OP (NVRAM_START_BIT+2)
+#define NVRAM_ERASE_OP (NVRAM_START_BIT+3)
+#define NVRAM_DELAY_COUNT 10
+
+/* NvRam Register bit values */
+
+#define NVRAM_DESELECT 0x00
+#define NVRAM_CLOCK 0x01
+#define NVRAM_SELECT 0x02
+#define NVRAM_DATA_OUT 0x04
+#define NVRAM_DATA_IN 0x08
+
+/* NvRam Parameter Defaults */
+
+#define OFF 0
+#define ON 1
+
+/* Host Adapter defaults */
+
+#define NVRAM_DEF_FIFO_THRESHOLD 2 /* 32 bytes */
+#define NVRAM_DEF_ADAPTER_ENABLE ON
+#define NVRAM_DEF_INITIATOR_SCSI_ID 7
+#define NVRAM_DEF_BUS_RESET_DELAY 3 /* 3 second */
+// Only 1 retry and no delay for NT driver (problem with NT 3.5 Disk Administrator)
+#define NVRAM_DEF_RETRY_COUNT 1
+#define NVRAM_DEF_RETRY_DELAY 0
+#define NVRAM_DEF_ASYNC_SETUP_TIME 6 /* 4 clock periods */
+#define NVRAM_DEF_REQ_ACK_ACTIVE_NEGATION ON
+#define NVRAM_DEF_DATA_ACTIVE_NEGATION ON
+#define NVRAM_DEF_DATA_DMA_BURST_ENABLE ON
+#define NVRAM_DEF_CMD_DMA_BURST_ENABLE ON
+#define NVRAM_DEF_TAG_AGE_LIMIT 8
+#define NVRAM_DEF_SELECTION_TIMEOUT 250 /* 250 ms */
+#define NVRAM_DEF_TERMINATION_LOW_ENABLE ON
+#define NVRAM_DEF_TERMINATION_HIGH_ENABLE ON
+#define NVRAM_DEF_PCMC_BURST_ENABLE OFF
+#define NVRAM_DEF_SIXTY_MHZ_ENABLE OFF
+
+/* Drive defaults */
+
+#define NVRAM_DEF_RENEGOTIATE_ON_ERROR ON
+#define NVRAM_DEF_STOP_QUEUE_ON_CHECK OFF
+#define NVRAM_DEF_AUTO_REQUEST_SENSE ON
+#define NVRAM_DEF_TAGGED_QUEUING ON
+#define NVRAM_DEF_SYNC_DATA_TRANSFERS ON
+#define NVRAM_DEF_WIDE_DATA_TRANSFERS ON
+#define NVRAM_DEF_PARITY_CHECKING ON
+#define NVRAM_DEF_DISCONNECT_ALLOWED ON
+#define NVRAM_DEF_SYNC_PERIOD 25
+#define NVRAM_DEF_SYNC_OFFSET 12
+#define NVRAM_DEF_DEVICE_ENABLE ON
+#define NVRAM_DEF_EXECUTION_THROTTLE 16
+#define NVRAM_DEF_MAX_QUEUE_DEPTH 256
+
+#define NVRAM_CONFIG_BURST_ENABLE 0x04
+
+
+/************************************************************************/
+/* PCI configuration definitions */
+/************************************************************************/
+
+typedef struct _PCI_CHIP_REGISTERS_M1 // Method 1
+{
+ ULONG Config_Address;
+ ULONG Config_Data;
+} PCI_CHIP_REGISTERS_M1, *PPCI_CHIP_REGISTERS_M1;
+
+#define PCI_MAXBUSNUM 256
+#define PCI_MAXDEVNUM 32
+#define PCI_CONFIG_ADDRESS 0xcf8
+#define PCI_CONFIG_DATA 0xcfc
+#define PCI_ENABLE_CONFIG 0x80000000
+#define PCI_DISABLE_CONFIG 0x00000000
+
+typedef struct _PCI_CHIP_REGISTERS // Method 2
+{
+ UCHAR pci_config;
+} PCI_CHIP_REGISTERS, *PPCI_CHIP_REGISTERS;
+
+#define PCI_CONFIG 0xcf8
+#define PCI_ENABLE 0x80
+#define PCI_START 0xC000
+#define PCI_SLOT_CNT 16
+#define PCI_LAST 0xDFFF
+#define PCI_SIZE 0x100
+
+#define PCI_BEGIN_SEARCH (paddr_t)0xe0000
+#define PCI_END_SEARCH (paddr_t)0xfffff
+
+#define PCI_BIOS_VECT 0x6EFE00F0
+#define PCI_BIOS_INT 0x1A
+
+#define PCI_FUNCTION_ID 0xB100
+
+/* PCI Function List */
+
+#define PCI_BIOS_PRESENT 0xB101
+#define FIND_PCI_DEVICE 0xB102
+#define FIND_PCI_CLASS_CODE 0xB103
+#define GENERATE_SPECIAL_CYCLE 0xB106
+#define READ_CONFIG_BYTE 0xB108
+#define READ_CONFIG_WORD 0xB109
+#define READ_CONFIG_DWORD 0xB10A
+#define WRITE_CONFIG_BYTE 0xB10B
+#define WRITE_CONFIG_WORD 0xB10C
+#define WRITE_CONFIG_DWORD 0xB10D
+
+/* PCI Return Code List */
+
+#define SUCCESSFUL 0x00
+#define FUNC_NOT_SUPPORTED 0x81
+#define BAD_VENDOR_ID 0x83
+#define DEVICE_NOT_FOUND 0x86
+#define BAD_REGISTER_NUMBER 0x87
+
+/* Configuration space register definitions */
+
+typedef struct _PCI_REGS
+{
+ USHORT Vendor_Id;
+#define QLogic_VENDOR_ID 0x1077
+ USHORT Device_Id;
+#define QLogic_DEVICE_ID 0x1020
+ USHORT Command;
+#define BUS_MASTER_ENABLE 0x0004
+ USHORT Status;
+ ULONG Rev_Id_Class_Code;
+ UCHAR Cache_Line_Size;
+ UCHAR Latency_Timer;
+ UCHAR Header_Type;
+ UCHAR BIST;
+ ULONG IO_Base_Address;
+ ULONG Memory_Base_Address;
+ ULONG Base_Address_3;
+ ULONG Base_Address_4;
+ ULONG Base_Address_5;
+ ULONG Base_Address_6;
+ ULONG Reserved_1;
+ ULONG Reserved_2;
+ ULONG ROM_Base_Address;
+ ULONG Reserved_3;
+ ULONG Reserved_4;
+ UCHAR Interrupt_Line;
+ UCHAR Interrupt_Pin;
+ UCHAR Minimum_Grant;
+ UCHAR Maximum_Latency;
+ UCHAR unused[192];
+} PCI_REGS, *PPCI_REGS;
+
+
+/****************************************************************/
+/* ISP firmware interface definitions */
+/****************************************************************/
+
+/*** Queue Entry structure ***/
+
+typedef struct _QueueEntry
+{
+ UCHAR data[64];
+} QUEUE_ENTRY, *PQUEUE_ENTRY;
+
+
+/*** ENTRY HEADER structure ***/
+
+typedef struct
+{
+ UCHAR entry_type;
+ UCHAR entry_cnt;
+ UCHAR sys_def_1;
+ UCHAR flags;
+} ENTRY_HEADER;
+
+/* Entry Header Type Definitions */
+
+#define ET_COMMAND 1
+#define ET_CONTINUATION 2
+#define ET_STATUS 3
+#define ET_MARKER 4
+#define ET_EXTENDED_COMMAND 5
+
+/* Entry Header Flag Definitions */
+
+#define EF_CONTINUATION 0x01
+#define EF_BUSY 0x02
+#define EF_BAD_HEADER 0x04
+#define EF_BAD_PAYLOAD 0x08
+#define EF_ERROR_MASK (EF_BUSY | EF_BAD_HEADER | EF_BAD_PAYLOAD)
+
+
+/*** DATA SEGMENT structure ***/
+
+typedef struct
+{
+ ULONG base;
+ ULONG count;
+} DATA_SEG;
+
+
+/*** COMMAND ENTRY structure ***/
+
+typedef struct _CommandEntry
+{
+ ENTRY_HEADER hdr;
+ ULONG handle;
+ UCHAR target_lun;
+ UCHAR target_id;
+ USHORT cdb_length;
+ USHORT control_flags;
+ USHORT reserved;
+ USHORT time_out;
+ USHORT segment_cnt;
+ UCHAR cdb[12];
+ DATA_SEG dseg[4];
+} COMMAND_ENTRY, *PCOMMAND_ENTRY;
+
+/* Command Entry Control Flag Definitions */
+
+#define CF_NO_DISCONNECTS 0x0001
+#define CF_HEAD_TAG 0x0002
+#define CF_ORDERED_TAG 0x0004
+#define CF_SIMPLE_TAG 0x0008
+#define CF_TARGET_ROUTINE 0x0010
+#define CF_READ 0x0020
+#define CF_WRITE 0x0040
+#define CF_NO_REQUEST_SENSE 0x0100
+
+
+/*** EXTENDED COMMAND ENTRY structure ***/
+
+typedef struct _ExtCommandEntry
+{
+ ENTRY_HEADER hdr;
+ ULONG handle;
+ UCHAR target_lun;
+ UCHAR target_id;
+ USHORT cdb_length;
+ USHORT control_flags;
+ USHORT reserved;
+ USHORT time_out;
+ USHORT segment_cnt;
+ UCHAR cdb[44];
+} EXT_COMMAND_ENTRY, *PEXT_COMMAND_ENTRY;
+
+
+/*** CONTINUATION ENTRY structure ***/
+
+typedef struct _ContinuationEntry
+{
+ ENTRY_HEADER hdr;
+ ULONG reserved;
+ DATA_SEG dseg[7];
+} CONTINUATION_ENTRY, *PCONTINUATION_ENTRY;
+
+
+/*** MARKER ENTRY structure ***/
+
+typedef struct _MarkerEntry
+{
+ ENTRY_HEADER hdr;
+ ULONG reserved0;
+ UCHAR target_lun;
+ UCHAR target_id;
+ UCHAR modifier;
+ UCHAR reserved1;
+ UCHAR reserved2[52];
+} MARKER_ENTRY, *PMARKER_ENTRY;
+
+/* Marker Entry Modifier Definitions */
+
+#define MM_SYNC_DEVICE 0
+#define MM_SYNC_TARGET 1
+#define MM_SYNC_ALL 2
+
+
+/*** STATUS ENTRY structure ***/
+
+typedef struct _StatusEntry
+{
+ ENTRY_HEADER hdr;
+ ULONG handle;
+ USHORT scsi_status;
+ USHORT completion_status;
+ USHORT state_flags;
+ USHORT status_flags;
+ USHORT time;
+ USHORT req_sense_length;
+ ULONG residual;
+ UCHAR reserved[8];
+ UCHAR req_sense_data[32];
+} STATUS_ENTRY, *PSTATUS_ENTRY;
+
+/* Status Entry Completion Status Defintions */
+
+#define SCS_COMPLETE 0
+#define SCS_INCOMPLETE 1
+#define SCS_DMA_ERROR 2
+#define SCS_TRANSPORT_ERROR 3
+#define SCS_RESET_OCCURRED 4
+#define SCS_ABORTED 5
+#define SCS_TIMEOUT 6
+#define SCS_DATA_OVERRUN 7
+#define SCS_COMMAND_OVERRUN 8
+#define SCS_STATUS_OVERRUN 9
+#define SCS_BAD_MESSAGE 10
+#define SCS_NO_MESSAGE_OUT 11
+#define SCS_EXT_ID_FAILED 12
+#define SCS_IDE_MSG_FAILED 13
+#define SCS_ABORT_MSG_FAILED 14
+#define SCS_REJECT_MSG_FAILED 15
+#define SCS_NOP_MSG_FAILED 16
+#define SCS_PARITY_ERROR_MSG_FAILED 17
+#define SCS_DEVICE_RESET_MSG_FAILED 18
+#define SCS_ID_MSG_FAILED 19
+#define SCS_UNEXPECTED_BUS_FREE 20
+
+/* Status Entry State Flag Definitions */
+
+#define SS_GOT_BUS 0x0100
+#define SS_GOT_TARGET 0x0200
+#define SS_SENT_CDB 0x0400
+#define SS_TRANSFERRED_DATA 0x0800
+#define SS_GOT_STATUS 0x1000
+#define SS_GOT_SENSE 0x2000
+#define SS_TRANSFER_COMPLETE 0x4000
+
+/* Status Entry Status Flag Definitions */
+
+#define SST_DISCONNECT 0x0001
+#define SST_SYNCHRONOUS 0x0002
+#define SST_PARITY_ERROR 0x0004
+#define SST_BUS_RESET 0x0008
+#define SST_DEVICE_RESET 0x0010
+#define SST_ABORTED 0x0020
+#define SST_TIMEOUT 0x0040
+#define SST_NEGOTIATION 0x0080
+
+
+/* Mailbox Command Definitions */
+
+#define MBOX_CMD_LOAD_RAM 0x0001
+#define MBOX_CMD_EXECUTE_FIRMWARE 0x0002
+#define MBOX_CMD_WRITE_RAM_WORD 0x0004
+#define MBOX_CMD_READ_RAM_WORD 0x0005
+#define MBOX_CMD_MAILBOX_REGISTER_TEST 0x0006
+#define MBOX_CMD_VERIFY_CHECKSUM 0x0007
+#define MBOX_CMD_ABOUT_FIRMWARE 0x0008
+#define MBOX_CMD_INIT_REQUEST_QUEUE 0x0010
+#define MBOX_CMD_INIT_RESPONSE_QUEUE 0x0011
+#define MBOX_CMD_STOP_FIRMWARE 0x0014
+#define MBOX_CMD_ABORT 0x0015
+#define MBOX_CMD_ABORT_DEVICE 0x0016
+#define MBOX_CMD_ABORT_TARGET 0x0017
+#define MBOX_CMD_BUS_RESET 0x0018
+#define MBOX_CMD_START_QUEUE 0x001A
+
+#define MBOX_CMD_SET_INITIATOR_SCSI_ID 0x0030
+#define MBOX_CMD_SET_SELECTION_TIMEOUT 0x0031
+#define MBOX_CMD_SET_RETRY_COUNT 0x0032
+#define MBOX_CMD_SET_TAG_AGE_LIMIT 0x0033
+#define MBOX_CMD_SET_CLOCK_RATE 0x0034
+#define MBOX_CMD_SET_ACTIVE_NEGATION_STATE 0x0035
+#define MBOX_CMD_SET_ASYNC_DATA_SETUP_TIME 0x0036
+#define MBOX_CMD_SET_BUS_CONTROL_PARAMETERS 0x0037
+#define MBOX_CMD_SET_TARGET_PARAMETERS 0x0038
+#define MBOX_CMD_SET_DEVICE_QUEUE_PARAMETERS 0x0039
+
+#define MBOX_CMD_GET_FIRMWARE_STATUS 0x001F
+#define MBOX_CMD_GET_INITIATOR_SCSI_ID 0x0020
+#define MBOX_CMD_GET_SELECTION_TIMEOUT 0x0021
+#define MBOX_CMD_GET_RETRY_COUNT 0x0022
+#define MBOX_CMD_GET_TAG_AGE_LIMIT 0x0023
+#define MBOX_CMD_GET_CLOCK_RATE 0x0024
+#define MBOX_CMD_GET_ACTIVE_NEGATION_STATE 0x0025
+#define MBOX_CMD_GET_ASYNC_DATA_SETUP_TIME 0x0026
+#define MBOX_CMD_GET_BUS_CONTROL_PARAMETERS 0x0027
+#define MBOX_CMD_GET_TARGET_PARAMETERS 0x0028
+#define MBOX_CMD_GET_DEVICE_QUEUE_PARAMETERS 0x0029
+
+/* Mailbox Status Definitions */
+
+#define MBOX_STS_FIRMWARE_ALIVE 0x0000
+#define MBOX_STS_CHECKSUM_ERROR 0x0001
+#define MBOX_STS_SHADOW_LOAD_ERROR 0x0002
+#define MBOX_STS_BUSY 0x0004
+
+#define MBOX_STS_COMMAND_COMPLETE 0x4000
+#define MBOX_STS_INVALID_COMMAND 0x4001
+#define MBOX_STS_HOST_INTERFACE_ERROR 0x4002
+#define MBOX_STS_TEST_FAILED 0x4003
+#define MBOX_STS_COMMAND_ERROR 0x4005
+#define MBOX_STS_COMMAND_PARAMETER_ERROR 0x4006
+
+#define MBOX_ASTS_SCSI_BUS_RESET 0x8001
+#define MBOX_ASTS_SYSTEM_ERROR 0x8002
+#define MBOX_ASTS_REQUEST_TRANSFER_ERROR 0x8003
+#define MBOX_ASTS_RESPONSE_TRANSFER_ERROR 0x8004
+#define MBOX_ASTS_REQUEST_QUEUE_WAKEUP 0x8005
+#define MBOX_ASTS_TIMEOUT_RESET 0x8006
+
+
+/****************************************************************/
+/* ISP Register Definitions */
+/****************************************************************/
+
+typedef struct _ISP_REGS
+{
+ /* Bus interface registers */
+
+ USHORT bus_id_low; /* 0000 */
+ USHORT bus_id_high; /* 0002 */
+ USHORT bus_config0; /* 0004 */
+ USHORT bus_config1; /* 0006 */
+ USHORT bus_icr; /* 0008 */
+ USHORT bus_isr; /* 000A */
+ USHORT bus_sema; /* 000C */
+ USHORT NvRam_reg; /* 000E */
+
+ /* Skip over DMA Controller registers */
+
+ UCHAR not_used0[0x0060]; /* 0010-006F */
+
+ /* Mailbox registers */
+
+ USHORT mailbox0; /* 0070 */
+ USHORT mailbox1; /* 0072 */
+ USHORT mailbox2; /* 0074 */
+ USHORT mailbox3; /* 0076 */
+ USHORT mailbox4; /* 0078 */
+ USHORT mailbox5; /* 007A */
+
+ /* Skip down to HCCR register */
+
+ UCHAR not_used1[0x44]; /* 007C-00BF */
+
+ /* Host Configuration and Control register */
+
+ USHORT hccr; /* 00C0 */
+
+ UCHAR not_used3[0x3E]; /* 00C2-00FF */
+} ISP_REGS, *PISP_REGS;
+
+/* Bus Control Register Definitions */
+
+#define ICR_SOFT_RESET 0x0001
+#define ICR_ENABLE_ALL_INTS 0x0002
+#define ICR_ENABLE_RISC_INT 0x0004
+#define ICR_DISABLE_ALL_INTS 0x0000
+
+/* Bus Interrupt Status Register Defintions */
+
+#define BUS_ISR_RISC_INT 0x0004
+
+/* Bus Semaphore Register Definitions */
+
+#define BUS_SEMA_LOCK 0x0001
+#define BUS_SEMA_STATUS 0x0002
+
+/* Host Command and Control Register Command Definitions */
+
+#define HCCR_CMD_RESET 0x1000 /* Reset RISC */
+#define HCCR_CMD_PAUSE 0x2000 /* Pause RISC */
+#define HCCR_CMD_RELEASE 0x3000 /* Release Paused RISC */
+#define HCCR_CMD_SET_HOST_INT 0x5000 /* Set Host Interrupt */
+#define HCCR_CMD_CLEAR_RISC_INT 0x7000 /* Clear RISC interrupt */
+#define HCCR_WRITE_BIOS_ENABLE 0x9000 /* Write BIOS enable */
+
+/* Host Command and Control Register Status Definitions */
+
+#define HCCR_HOST_INT 0x0080 /* R: Host interrupt set */
+#define HCCR_RESET 0x0040 /* R: RISC reset in progress */
+#define HCCR_PAUSE 0x0020 /* R: RISC paused */
+
+/* ISP Product ID Definitions */
+
+#define PROD_ID_1 0x4953
+#define PROD_ID_2 0x0000
+#define PROD_ID_2a 0x5020
+#define PROD_ID_3 0x2020
+#define PROD_ID_4 0x0001
+
diff --git a/private/ntos/miniport/qlogic/qlisp.rc b/private/ntos/miniport/qlogic/qlisp.rc
new file mode 100644
index 000000000..0b3dc97e0
--- /dev/null
+++ b/private/ntos/miniport/qlogic/qlisp.rc
@@ -0,0 +1,12 @@
+#include <windows.h>
+
+#include <ntverp.h>
+
+#define VER_FILETYPE VFT_DRV
+#define VER_FILESUBTYPE VFT2_DRV_SYSTEM
+#define VER_FILEDESCRIPTION_STR "QLogic ISP1020 SCSI Driver"
+#define VER_INTERNALNAME_STR "ql10wnt.sys"
+#define VER_ORIGINALFILENAME_STR "ql10wnt.sys"
+
+#include "common.ver"
+
diff --git a/private/ntos/miniport/qlogic/sources b/private/ntos/miniport/qlogic/sources
new file mode 100644
index 000000000..2589a5a48
--- /dev/null
+++ b/private/ntos/miniport/qlogic/sources
@@ -0,0 +1,41 @@
+!IF 0
+
+Copyright (c) 1989 Microsoft Corporation
+
+Module Name:
+
+ sources.
+
+Abstract:
+
+ This file specifies the target component being built and the list of
+ sources files needed to build that component. Also specifies optional
+ compiler switches and libraries that are unique for the component being
+ built.
+
+
+Author:
+
+ Steve Wood (stevewo) 12-Apr-1990
+
+NOTE: Commented description of this file is in \nt\bak\bin\sources.tpl
+
+!ENDIF
+
+MAJORCOMP=ntos
+MINORCOMP=miniport
+
+TARGETNAME=ql10wnt
+TARGETPATH=\nt\public\sdk\lib
+TARGETTYPE=MINIPORT
+
+INCLUDES=..\..\inc
+
+TARGETLIBS=$(BASEDIR)\public\sdk\lib\*\scsiport.lib
+!IF $(ALPHA)
+TARGETLIBS=$(BASEDIR)\public\sdk\lib\*\scsiport.lib $(BASEDIR)\public\sdk\lib\*\libcntpr.lib
+!ENDIF
+
+SOURCES=qlisp.c \
+ isp_fw.c \
+ qlisp.rc
diff --git a/private/ntos/miniport/qlogic/txtsetup.oem b/private/ntos/miniport/qlogic/txtsetup.oem
new file mode 100644
index 000000000..d8a7e7f5d
--- /dev/null
+++ b/private/ntos/miniport/qlogic/txtsetup.oem
@@ -0,0 +1,97 @@
+#
+# format for txtsetup.oem.
+#
+# General format:
+#
+# [section]
+# key = value1,value2,...
+#
+#
+# The hash ('#') introduces a comment.
+# Strings with embedded spaces, commas, or hashes should be double-quoted
+#
+
+
+[Disks]
+
+# This section lists all disks in the disk set.
+#
+# <description> is a descriptive name for a disk, used when
+# prompting for the disk
+# <tagfile> is a file whose presence allows setup to recognize
+# that the disk is inserted.
+# <directory> is where the files are located on the disk.
+#
+
+d1 = "QLogic SCSI Software Diskette", \qlscsi, \nt\
+
+
+[Defaults]
+
+# This section lists the default selection for each 'required'
+# hardware component. If a line is not present for a component,
+# the default defaults to the first item in the [<component_name>]
+# section (see below).
+#
+# <component_name> is one of computer, display, keyboard, mouse, scsi
+# <id> is a unique <within the component> string to be associated
+# with an option.
+
+scsi = OEMSCSI
+
+
+
+[scsi]
+
+# This section lists the options available for a particular component.
+#
+# <id> is the unique string for the option
+# <description> is a text string, presented to the user in a menu
+# <key_name> gives the name of the key to be created for the component in
+# HKEY_LOCAL_MACHINE\ControlSet001\Services
+
+
+OEMSCSI = "QLogic Fast!SCSI/QLA100 (Windows NT V3.1)", ql10wnt
+OEMSCSI2 = "QLogic Fast!SCSI/QLA100 (Windows NT V3.5)", ql10nt35
+
+
+
+[Files.scsi.OEMSCSI]
+
+# This section lists the files that should be copied if the user
+# selects a particular component option.
+#
+# <file_type> is one of driver, port, class, dll, hal, inf, or detect.
+# See below.
+# <source_disk> identifies where the file is to be copied from, and must
+# match en entry in the [Disks] section.
+# <filename> is the name of the file. This will be appended to the
+# directory specified for the disk in the [Disks] section to form the
+# full path of the file on the disk.
+
+driver = d1, ql10wnt.sys, ql10wnt
+inf = d1, oemsetup.inf
+
+[Files.scsi.OEMSCSI2]
+
+driver = d1, ql10nt35.sys, ql10nt35
+inf = d1, oemsetup.inf
+
+
+
+[Config.scsi.OEMSCSI]
+
+# This section specifies values to be set in the registry for
+# particular component options. Required values in the services\xxx
+# key are created automatically -- use this section to specify additional
+# keys to be created in services\xxx and values in services\xxx and
+# services\xxx\yyy.
+#
+# <key_name> is relative to the services node for this device.
+# If it is empty, then it refers to the services node.
+# If specified, the key is created first.
+# <value_name> specifies the value to be set within the key
+# <value_type> is a string like REG_DWORD. See below.
+# <value> specifies the actual value; its format depends on <value_type>
+
+[Config.scsi.OEMSCSI2]